Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 强制编译器/链接器按定义对变量进行分组(物理上位于连续的RAM位置)_C_Gcc - Fatal编程技术网

C 强制编译器/链接器按定义对变量进行分组(物理上位于连续的RAM位置)

C 强制编译器/链接器按定义对变量进行分组(物理上位于连续的RAM位置),c,gcc,C,Gcc,如何强制编译器(我假设带有选项开关)按照定义的顺序将物理、连续RAM位置中的变量分组在一起?我真的不在乎它从哪里开始(也就是说-它把MinWaitTime放在哪里。但是,FaultCode必须紧跟在RAM中MinWaitTime之后。它不能把它放在其他地方 我曾想过创建一个部分,但这只能保证它们放在一起,而不一定是按照定义的顺序 我知道我可以创建和数组来强制解决这个问题,但我想避免它 有什么建议吗 例如,如果MinWaitTime位于地址0x20000000,我希望FaultCode定义为0x2

如何强制编译器(我假设带有选项开关)按照定义的顺序将物理、连续RAM位置中的变量分组在一起?我真的不在乎它从哪里开始(也就是说-它把
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:编译器不是需要按照声明的相同顺序排列变量-事实上,不这样做可能有很好的理由(例如,最小化对齐限制造成的空间损失)。如果要保证内存中的顺序,必须使用数组或结构(或某些特定于实现的魔术)