【问题标题】:How to specify a memory location at which function will get stored?如何指定存储函数的内存位置?
【发布时间】:2013-09-13 04:28:09
【问题描述】:

谁能告诉我有哪些可能的方法可以将函数(在 C 中)存储在固定的内存位置。

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

【问题讨论】:

  • 这取决于工具链,但这似乎是一个非常……奇怪的……请求。你为什么认为你需要这个,只是出于兴趣?
  • 一种常见的情况是引导加载程序在内存中的预定义位置启动主程序。您必须将主程序的入口点固定在该精确地址。
  • @paxdiablo External 引导加载程序(或任何 ROM)中使用的函数地址需要固定位置,以供其他程序一致使用。函数表的固定索引是一种替代方法。
  • 实际上,对于任何不位置独立的代码,你基本上都必须这样做——唯一的区别是,如果你有一个设备,这可能已经配置好了——特定的工具链安装,并且您通常只需要指定您的代码在合适的内存区域内开始(并且作为检查结束),而不是特定功能所在的位置。对于许多工具链,指定特定函数的位置只需为其指定区域即可。

标签: c embedded microcontroller


【解决方案1】:

IAR 手册“IAR C/C++ 开发指南”的“控制数据和函数在内存中的放置”部分描述了如何将函数和数据放置在内存中。

我看到将特定函数放置在特定地址的唯一方法是在内存中定义一个部分来放置这个并且只有这个函数。 示例:

void MyFunction( void ) @ "MyFunctionsSection"
{
...
}

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

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

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

【讨论】:

  • 为了帮助您进行设置,请使用记事本打开 .icf 文件并定义类似的区域 -> 行后 -> 定义内存 mem 大小 = put define region MY_FUNC = mem:[from 0x7FD00000 size 0x2000] ;然后在 -> 放在地址 mem.. 之后放在 MY_FUNC { readonly MyFunctionsSection};这对我有用,希望它有所帮助。 (使用你自己的地址和大小,我只是从我的文件中复制的)
  • @Habi:我认为你不需要知道函数的大小。我在链接器配置文件中使用了place at address 指令,链接器已经解决了这个问题。虽然它是用于数据的,但我认为功能没有什么不同。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-03
  • 1970-01-01
  • 2015-08-06
  • 2020-09-15
  • 1970-01-01
  • 2020-02-03
相关资源
最近更新 更多