我想征求意见。我正在使用小型嵌入式uP。
我想将各种函数分配给myfunctions struct。如何正确地做到这一点? 然后我想把这个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)
任何想法是什么是实现它的最佳方式?
P.S。这将在嵌入式处理器上运行 - 而不是PC。
答案 0 :(得分:3)
通过使用特定于编译器的扩展,通常最容易执行在特定位置定位对象;没有语言定义的标准方法。也可以通过修改链接描述文件在特定位置定位全局对象,但这将特定于您的特定工具链
您使用的是什么编译器/工具链?请参阅其文档。
答案 1 :(得分:0)
以下可能会对您有所帮助:
// 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));
这是基于我对你实际想做的事情的猜测。
答案 2 :(得分:0)
这是以便携方式解决问题的最佳方式:
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将它们分配到您想要的位置。这是一个例子,假设它们存储在读/写RAM和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
如果它们应存储在ROM / flash中,例如矢量表,则必须使用READ_ONLY部分#pragma CONST_SEG和const fptr
进行不同的处理。 (注意,当与typedef:ed指针结合使用时,C中的const关键字会以不合理的方式运行。在这种情况下,我相信它会给出一个指向非常量函数的常量指针,因此它应该根据需要在NVM中结束。)< / p>