在许多嵌入式架构中,可以将代码运行或将数据存储到内部 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")
但我认为这不是最佳解决方案。
最佳答案
有很多方法可以给这只猫剥皮,有些方法比其他方法更便携。
可能最可移植的方法是将您的函数隔离到“快”或“慢”的单独源文件中(或者通过为每个文件放置一个函数组来获得更精细的粒度),然后拥有链接器描述 rune 件处理将片段粘贴到你想要的地方。这会将所有非标准内容排除在源文件之外并将其放在一个位置。
链接描述 rune 件必须由使用该库的人管理,但无论如何他们都必须这样做以将任何段正确定位到“快”和“慢”内存中。使用这种方法,他们只需在他们在正确位置定义的加载段中指定正确的 .o 文件,而不是依赖编译器发出您选择的包罗万象的名称。
关于c - 如何在 C99 中指定函数/变量的内存位置(快/慢)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32768366/