Это лучший способ решить это портативным способом:
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 по желанию.)