gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 14:49:02 25 4
gpt4 key购买 nike

如何强制编译器(使用我假设的选项开关)将变量按照定义的顺序分组到物理、连续的 RAM 位置?我并不关心它从哪里开始(即它放置 MinWaitTime 的位置)。但是,FaultCode 必须紧接在 RAM 中的 MinWaitTime 之后.它不能把它放在其他地方。

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

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

有什么建议吗?

例如,如果 MinWaitTime 位于地址 0x20000000,我希望将 FaultCode 定义在 0x20000002,并按此顺序定义所有其他变量。

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)
...

这很好,因为这正是结构的设计目的,但宏不是很好。

理论上,“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 即可:

extern unsigned short MinWaitTime;
extern unsigned short FaultCode;
extern unsigned short FaultReg1;
extern unsigned short FaultReg2;

extern 只是必要的,这样您就不会得到重复的定义。

然后,编译 C 和汇编文件并将其链接在一起。

注释

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

关于c - 强制编译器/链接器按定义对变量进行分组(物理上位于连续的 RAM 位置),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50067308/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com