指向特定内存的函数指针

时间:2011-10-29 13:10:47

标签: function memory pointers embedded

我想征求意见。我正在使用小型嵌入式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。

3 个答案:

答案 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>