Указатель функции на конкретную память - PullRequest
0 голосов
/ 29 октября 2011

Я хотел бы попросить совета.Я работаю с небольшим встроенным uP.

Я бы хотел назначить свои различные функции структуре myfunctions.Как это сделать правильно?Затем я хочу разместить эти myfunctions (структура указателей на функции) по конкретному адресу памяти (например, 0x1000).Какова наилучшая процедура для достижения этой цели?

typedef void (*fptr)(void);

typedef struct FCN_IMAGE
{
    fptr fcn1;
    fptr fcn2;
    fptr fcn3;
} FUNC_T;

FUNC_T myfunctions;

На самом деле это должна быть таблица переходов.


Во-вторых, я хочу прочитать указатели этой функции из другой программы - напрямуюиз указанного местоположения адреса (например, 0x1000).

Это означает, что первый код должен назначить структуру указателей функций определенной ячейке памяти, а другой независимый код должен прочитать эту таблицу из определенной памяти.Взаимосвязь между этими двумя программами должна быть

#define FCN_BASE_ADDRESS (0x1000)

Любые идеи, каков наилучший способ достичь этого?

PS Это будет работать на встроенном процессоре, а не на ПК.

Ответы [ 3 ]

3 голосов
/ 29 октября 2011

Нахождение объектов в определенных местах обычно легче всего выполнить с помощью расширения, специфичного для компилятора;не существует стандартного метода, определенного языком.Также может быть возможно найти глобальный объект в определенном месте, изменив скрипт компоновщика, но это будет характерно для вашей конкретной цепочки инструментов

Какой компилятор / цепочку инструментов вы используете?Обратитесь к его документации.

0 голосов
/ 01 ноября 2011

Это лучший способ решить это портативным способом:

typedef void (*fptr)(void);

#define FCN_BASE_ADDRESS ((volatile fptr*)0x1000)

/* Make myfunctions an array, not a struct. 
   Structs can have padding and aren't portable.
   It doesn't look like you need a struct in this case.
*/
fptr myfunctions [N] =
{    
  fptr fcn1;
  fptr fcn2;
  fptr fcn3;
};

memcpy(&FCN_BASE_ADDRESS, myfunctions, sizeof(myfunctions));

Хотя, если вы используете Codewarrior, вы, вероятно, могли бы использовать #pragma, чтобы разместить их там, где вы хотите. Вот пример, предполагающий, что они хранятся в ОЗУ для чтения / записи и 32-битной адресной шине.

// .prm file
SECTIONS
  MEM_FCN_BASE_ADDRESS = READ_WRITE 0x2000 TO 0x200C; 
END

PLACEMENT
  FCN_BASE_ADDRESS INTO MEM_FCN_BASE_ADDRESS;
END

// .c file
#pragma DATA_SEG FCN_BASE_ADDRESS
fptr myfunctions[N] = ...;
#pragma DATA_SEG DEFAULT

Если они должны храниться в ПЗУ / флэш-памяти, например, в векторной таблице, то это должно быть сделано по-другому с разделами READ_ONLY, #pragma CONST_SEG и const fptr. (Обратите внимание, что ключевое слово const в C ведет себя иррациональным образом в сочетании с указателями typedef: ed. В этом случае я считаю, что оно даст постоянный указатель на непостоянную функцию и, таким образом, должно получиться в NVM по желанию.)

0 голосов
/ 29 октября 2011

Может быть, вам поможет следующее:

// assign my various functions to myfunctions struct
myfunctions.fcn1 = &YourFunction1;
myfunctions.fcn2 = &YourFunction2;
myfunctions.fcn3 = &YourFunction3;

// assign the struct of function pointers to specific memory location
memcpy((void*)FCN_BASE_ADDRESS, &myfunctions, sizeof(myfunctions));

// read this table from specific memory
memcpy(&myfunctions, (void*)FCN_BASE_ADDRESS, sizeof(myfunctions));

Это основано на моем предположении о том, что вы на самом деле хотите сделать.

...