【发布时间】:2015-09-24 18:24:58
【问题描述】:
在许多嵌入式架构上,可以运行代码或将数据存储到内部 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")
但我认为这不是最好的解决方案。
【问题讨论】:
-
你想要实现的解决方案还不错,但你不应该将这些限定符称为
__fast和__slow,因为以下划线开头的名称被C 语言保留。 -
一般来说,你无法避免定义这样的宏,因为 C 标准既没有提供将变量标记为某个段中的方法,也没有完全是一个“段”。
-
@FUZxxl 你说的
__错位的名字是由 C 语言保留的。_或___是怎么回事?我正在寻找一个在我的代码或 C 库中都找不到的前缀。 -
这取决于编译器,对于一个全面的答案来说太宽泛了。
-
@nowox:请自己做一些研究。已经有足够的关于保留的前缀和后缀的信息。从标准开始。请注意,
___(三个下划线)确实以两个下划线开头,所以......好吧,我将把它作为一个小作业。