如何在C99中指定函数/变量的内存位置(快/慢)?

时间:2015-09-24 18:24:59

标签: c memory c99

在许多嵌入式架构中,可以运行代码或将数据存储到内部RAM(快速访问)或外部SDRAM(慢速访问)。

在像SHARC处理器这样的体系结构上,可以定义函数将链接到的内存区域。

segment("seg_ext_dm32") void foo( void ); // External memory 32-bit location

不幸的是,说明符segment("seg_ext_dm32")实际上不是ANSI,我不能在我的通用库上省略它,这些库可以在不同的架构上进行单元测试(例如x86)。

所以我正在寻找一种更通用的解决方案来将我的函数/变量分类为存储在慢速或快速存储器段中。这是一个例子:

___slow void fft_configure( int parameter );
___fast void fft_tick();

最常见的方法是什么?

当然,一种简单的方法是向我的特定编译器添加一个通用头文件,以定义__slow或__fast:

在我的主文件中:

#ifndef __slow
   #define __slow /* nothing */
#endif
#ifndef __fast
   #define __fast /* nothing */
#endif

在我的编译器中:

cc -D__slow=segment("seg_ext_dm32") -D__fast=segment("seg_dm32")

但我认为这不是最佳解决方案。

2 个答案:

答案 0 :(得分:1)

有很多方法可以使这只猫皮肤,有些方法比其他人更便携。

最便携的方法可能是将您的功能分离为快速'的单独源文件。或者'慢' (或者甚至通过在每个文件中放置一个函数组来获得更精细的粒度),然后让链接描述符文件处理将段放在你想要的位置。这会将所有非标准内容保留在源文件中,并将其放在一个位置。

链接描述符文件必须由使用该库的人管理,但他们必须这样做以正确地将任何段定位到' fast&#39 ;并且“慢”'记忆。使用这种方法,他们只需要在他们已经在正确位置定义的加载段中指定正确的.o文件,而不是依靠编译器发出您选择的catchall名称。

答案 1 :(得分:0)

这就是我的工作。 我创建了一个属性,可以根据编译器进行更改。 对于我的嵌入式应用程序,我使用以下

#ifdef IS_EMBEDDED
  #define FAST_DATA  __attribute__ ((section ("fast_data")))
#else
  #define FAST_DATA /* DO NOTHING */
#endif

然后,当我创建需要在快速数据部分中的全局数据时,请按如下所述应用该部分的位置。

char fastStack[1024*5] FAST_DATA;

最后在我的链接描述文件中。

MEMORY
{
   fastMemory : ORIGIN = 0x00000050, LENGTH = 0x0000ffff
   DDR3 : ORIGIN = 0x60000000, LENGTH = 0x8000000
   FLASH : ORIGIN = 0xC0000000, LENGTH = 0x02000000
}

...

.fast_data : {
    __fast_data_start = .;
    . = ALIGN(8);
    *(fast_data)
    . = ALIGN(8);   
    __fast_data_end = .;
} > fastMemory
...