gpt4 book ai didi

c - 在 'C' 中的结构元素之间手动插入填充字节

转载 作者:太空宇宙 更新时间:2023-11-03 23:27:44 26 4
gpt4 key购买 nike

我有一组用于嵌入式应用程序(ARM 裸机)中外围设备的 32 位寄存器,具有以下字节地址。

CTL 0x0;
统计 0x4
TXR 0x8 <-- 不连续地址
RXR 0x20
DAT1 0x30 <-- 不连续地址
DAT2 0x40 <-- 不连续地址
等等

我想将所有这些寄存器组合成一个 C 结构(它是一个压缩结构)

struct my_peri {
uint32_t CTL;
uint32_t STAT;
uint32_t TXR;
uint32_t RXR;
uint32_t DAT1;
uint32_t DAT2;
};

struct my_peri* pPeri0 = (uint32_t*) (BASE_ADDRESS_OF_MY_PERI_0);

现在如果我访问

pPeri->RXR;  // This will point to (BASE_ADDRESS + 0x10)
// But the actual address i want to refer is (BASE_ADDRESS + 0x20)

为了获得正确的地址,我手动添加了一些元素

struct my_peri {
uint32_t CTL;
uint32_t STAT;
uint32_t TXR;
uint32_t RESERVED[4]; // 0x10 to 0x1c
uint32_t RXR;
uint32_t RESERVED_1[3]; // 0x24-0x2c
uint32_t DAT1;
uint32_t RESERVED_2[3]; // 0x34-0x3c
uint32_t DAT2;
};

但根据外设规范,任何对 RESERVED、RESERVED_1 和 RESERVED_2 的访问都会出错。

Is there a way to add address spacing between the struct elements?
Without adding RESERVED elements

If not, is there a way to group these registers into a single data structure?.
With each register pointing to the right address.

我正在使用 ARM-GCC 工具链。

最佳答案

是的,您可以使用“位域”在结构中创建未命名的域:

struct my_peri {
uint32_t CTL;
uint32_t STAT;
uint32_t TXR;
uint32_t : 32;
uint32_t RXR;
uint32_t : 32;
uint32_t : 32;
uint32_t : 32;
uint32_t DAT1;
uint32_t : 32;
uint32_t : 32;
uint32_t : 32;
uint32_t DAT2;
};

不幸的是没有数组语法;如果您愿意,可以通过将类型更改为 uint64_t 将成对的 :32 折叠为 :64

另一种方法是,如果您的字段都与本例中的类型相同,则将整个事物视为一个整数数组并使用 enum { CTL = 0, STAT = 1, TXR = 2,RXR = 4,...

关于c - 在 'C' 中的结构元素之间手动插入填充字节,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22876227/

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