Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何指定存储函数的内存位置?_C_Embedded_Microcontroller - Fatal编程技术网

C 如何指定存储函数的内存位置?

C 如何指定存储函数的内存位置?,c,embedded,microcontroller,C,Embedded,Microcontroller,任何人都可以让我知道什么是可能的方式,我们可以存储一个函数(在C)在一个固定的内存位置 我正在为ARM cortex m3核心使用IAR IDE IAR手册“IAR C/C++开发指南”中的“控制内存中的数据和函数放置”一节介绍了如何将函数和数据放置在内存中 我所看到的将特定函数放置在特定地址的唯一方法是在内存中定义一个部分,在其中放置该函数,并且仅放置该函数。 例如: 在链接器文件中,必须定义“MyFunctionsSection”部分。在那里,您可以定义此节应放置的位置。然后,您的函数将放置

任何人都可以让我知道什么是可能的方式,我们可以存储一个函数(在C)在一个固定的内存位置


我正在为ARM cortex m3核心使用IAR IDE

IAR手册“IAR C/C++开发指南”中的“控制内存中的数据和函数放置”一节介绍了如何将函数和数据放置在内存中

我所看到的将特定函数放置在特定地址的唯一方法是在内存中定义一个部分,在其中放置该函数,并且仅放置该函数。 例如:

在链接器文件中,必须定义“MyFunctionsSection”部分。在那里,您可以定义此节应放置的位置。然后,您的函数将放置在那里

此方法的缺点是必须为该函数保留内存。因此,您必须知道函数的大小,如果函数的大小增加并且大于保留内存,则必须调整此内存部分。另一个缺点是,您只能在此部分中放置一个函数,以确保您的函数位于所需的地址


但除此之外:在特定地址放置函数的想法通常是奇怪的。更好的做法是定义一个指向该函数的指针,并像在中断向量表中那样将指针放在一个固定地址。如果你有更多的函数指针,列表可以很容易地扩展。

这取决于工具链,但它似乎是一个非常有用的工具。。。古怪的要求你为什么认为你需要这个,只是出于兴趣?一个常见的场景是引导加载程序在内存中预定义的位置启动主程序。您必须将主程序的入口点固定在该精确地址。@paxdiablo引导加载程序(或任何ROM)中使用的外部函数地址需要固定位置,以便其他程序一致使用。函数表的固定索引是另一种选择。实际上,对于任何不独立于位置的代码,您基本上都必须这样做-唯一的区别是,如果您安装了特定于设备的工具链,则可能已经配置了该索引,并且您通常只需要指定代码启动(作为支票,结束)在适当的内存区域内,而不是特定函数所在的区域内。对于许多工具链,指定特定函数的位置只需为其指定自己的区域即可。要帮助您进行设置,请使用记事本打开.icf文件并定义区域,如->行后->定义内存mem with size=put define region MY_FUNC=mem:[from 0x7FD00000 size 0x2000];然后在->place at address mem.之后放入MY_FUNC{readonly MyFunctionsSection};这对我有用,希望有帮助。(使用您自己的地址和大小,我刚从我的文件中复制)@哈比:我认为你不需要知道函数的大小。我在链接器配置文件中使用了
placeat address
指令,链接器已经解决了这个问题。虽然是为了数据,但我认为函数没有什么不同。
void MyFunction( void ) @ "MyFunctionsSection"
{
...
}