如何强制编译器(我假设选项开关)按照定义的顺序将变量组合在物理连续的RAM位置?我并不关心它的起始位置(也就是它放在MinWaitTime
的位置。但是,FaultCode
必须紧跟在MinWaitTime
之后的RAM中。它不能放在其他地方。< / p>
我想过创建一个部分,但这只能保证它们被放在一起,而不一定按照它们的定义顺序。
我知道我可以创建和阵列来强制解决问题,但我想避免它。
有什么建议吗?
例如,如果MinWaitTime
位于地址0x20000000,我希望{0x}在0x20000002处定义,并且每个其他变量都按此顺序定义。
FaultCode
编制者是GCC。
答案 0 :(得分:1)
有几种方法可以解决这个问题。
最简单的方法就是使用一个结构,可能还有宏:
struct {
unsigned short MinWaitTime;
unsigned short FaultCode;
...
} vars;
#define MinWaitTime (vars.MinWaitTime)
#define FaultCode (vars.FaultCode)
...
这很好,因为这正是一个结构体的设计目标,但宏并不是很好。
从理论上讲,“global anonymous 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和汇编文件链接在一起。
请注意,我们在这里明确不关心可移植性。