强制编译器/链接器按照定义

时间:2018-04-27 17:15:17

标签: c gcc

如何强制编译器(我假设选项开关)按照定义的顺序将变量组合在物理连续的RAM位置?我并不关心它的起始位置(也就是它放在MinWaitTime的位置。但是,FaultCode必须紧跟在MinWaitTime之后的RAM中。它不能放在其他地方。< / p>

我想过创建一个部分,但这只能保证它们被放在一起,而不一定按照它们的定义顺序。

我知道我可以创建和阵列来强制解决问题,但我想避免它。

有什么建议吗?

例如,如果MinWaitTime位于地址0x20000000,我希望{0x}在0x20000002处定义,并且每个其他变量都按此顺序定义。

FaultCode

编制者是GCC。

1 个答案:

答案 0 :(得分:1)

有几种方法可以解决这个问题。

struct + macros

最简单的方法就是使用一个结构,可能还有宏:

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和汇编文件链接在一起。

注释

请注意,我们在这里明确不关心可移植性。