C 强制编译器/链接器按定义对变量进行分组(物理上位于连续的RAM位置)
如何强制编译器(我假设带有选项开关)按照定义的顺序将物理、连续RAM位置中的变量分组在一起?我真的不在乎它从哪里开始(也就是说-它把C 强制编译器/链接器按定义对变量进行分组(物理上位于连续的RAM位置),c,gcc,C,Gcc,如何强制编译器(我假设带有选项开关)按照定义的顺序将物理、连续RAM位置中的变量分组在一起?我真的不在乎它从哪里开始(也就是说-它把MinWaitTime放在哪里。但是,FaultCode必须紧跟在RAM中MinWaitTime之后。它不能把它放在其他地方 我曾想过创建一个部分,但这只能保证它们放在一起,而不一定是按照定义的顺序 我知道我可以创建和数组来强制解决这个问题,但我想避免它 有什么建议吗 例如,如果MinWaitTime位于地址0x20000000,我希望FaultCode定义为0x2
MinWaitTime
放在哪里。但是,FaultCode
必须紧跟在RAM中MinWaitTime
之后。它不能把它放在其他地方
我曾想过创建一个部分,但这只能保证它们放在一起,而不一定是按照定义的顺序
我知道我可以创建和数组来强制解决这个问题,但我想避免它
有什么建议吗
例如,如果MinWaitTime
位于地址0x20000000,我希望FaultCode
定义为0x2000002,并按该顺序定义其他所有变量
unsigned short MinWaitTime; // reg 450
unsigned short FaultCode; // reg 451
unsigned short FaultReg1; // reg 452
unsigned short FaultReg2; // reg 453
unsigned short Reserved2; // reg 454
unsigned short Reserved3; // reg 455
unsigned short SystemStatusReg1; // reg 456
unsigned short SystemStatusReg2; // reg 457
编译器是GCC。有几种方法可以实现这一点 结构+宏 最简单的方法就是使用结构,可能与宏一起使用:
struct {
unsigned short MinWaitTime;
unsigned short FaultCode;
...
} vars;
#define MinWaitTime (vars.MinWaitTime)
#define FaultCode (vars.FaultCode)
...
这很好,因为这正是结构设计的目的,但宏并不伟大
从理论上讲,一个“”将使您可以在没有宏的情况下执行此操作,但这并不存在
观点:我会使用struct,但不使用宏
装配
另一种方法是在程序集的帮助下完成。您可以使用以下代码创建单独的程序集源文件:
.data
.align 2
.globl MinWaitTime
MinWaitTime:
.zero 2
.globl FaultCode
FaultCode:
.zero 2
.globl FaultReg1
FaultReg1:
.zero 2
.globl FaultReg2
FaultReg2:
.zero 2
这定义了连续地址处的变量。然后您可以从C访问它们,只需在C源代码中的某个外部声明它们:
extern unsigned short MinWaitTime;
extern unsigned short FaultCode;
extern unsigned short FaultReg1;
extern unsigned short FaultReg2;
extern
仅在不获取重复定义的情况下才是必需的
然后,编译并链接C和汇编文件
笔记
请注意,我们在这里明确不关心可移植性。您需要一个数组。数组和一系列无符号短字符的并集如何?通常一个结构会满足您的需要。为了确保添加断言,可能是静态断言。这几乎是在尖叫您试图解决什么问题?@ArndtJonasson:编译器不是需要按照声明的相同顺序排列变量-事实上,不这样做可能有很好的理由(例如,最小化对齐限制造成的空间损失)。如果要保证内存中的顺序,必须使用数组或结构(或某些特定于实现的魔术)