在许多嵌入式架构中,可以运行代码或将数据存储到内部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")
但我认为这不是最佳解决方案。
答案 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
...