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

标签 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")

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

最佳答案

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

可能最可移植的方法是将您的函数隔离到“快”或“慢”的单独源文件中(或者通过为每个文件放置一个函数组来获得更精细的粒度),然后拥有链接器描述 rune 件处理将片段粘贴到你想要的地方。这会将所有非标准内容排除在源文件之外并将其放在一个位置。

链接描述 rune 件必须由使用该库的人管理,但无论如何他们都必须这样做以将任何段正确定位到“快”和“慢”内存中。使用这种方法,他们只需在他们在正确位置定义的加载段中指定正确的 .o 文件,而不是依赖编译器发出您选择的包罗万象的名称。

关于c - 如何在 C99 中指定函数/变量的内存位置(快/慢)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32768366/

相关文章:

c - 数组初始化中的三元运算符

c - sizeof() 具有零长度数组成员的结构

c - 允许用户编辑已经在 C 语言中打印在屏幕上的文本

c - 如何使该代码工作 (isdigit)

c - 为什么基址索引为 1 的 C 程序可以正常工作?

c - 应用程序内存优化

c - "realloc(): invalid next size"多次成功运行后

Docker 容器的内存消耗从不减少(或者是吗?)

c - 在终止的线程上调用 pthread_cancel() 是否安全?

c - 水的状态(温度程序)- C 编程