gpt4 book ai didi

c - 在C中,指向需要访问字节指针列表的结构的指针

转载 作者:行者123 更新时间:2023-11-30 16:03:21 24 4
gpt4 key购买 nike

首先,对标题感到抱歉,很难想出一个描述。我正在尝试创建一个结构来访问具有相当少的由 3 个地址线控制的内部寄存器的外设。所以我有以下结构定义:

typedef struct {
union {
unsigned char *reg0aPtr;
unsigned char *reg0bPtr;
} RegsAddrOffset0;

union {
unsigned char *reg1aPtr;
unsigned char *reg1bPtr;
} RegsAddrOffset1;

...

union {
unsigned char *reg7aPtr;
unsigned char *reg7bPtr;
} RegsAddrOffset7;
} DeviceRegMap;

然后如果我这样声明一个变量

DeviceRegMap  *uartRegMap = (DeviceRegMap *)(0xD0000000);

现在,如果我尝试使用 uartRegMap 变量访问内存映射寄存器,我想我会看到 *(uartRegMap->RegsAddrOffset0.reg0aPtr) 将从地址 0xD0000000 读取数据,事实确实如此。如果我使用*(uartRegMap->RegsAddrOffset1.reg1bPtr)我以为我会访问0xD0000001,但实际上它访问的是地址0xD0000004。由于处理器是 32 位的,自然对齐是 4 字节。我在想,由于指针的大小是一个 int,在本例中是 32 位,这就是我访问 4 字节地址范围(例如 0xD0000000、0xD0000004、0xD0000008 等)的原因。

如果我声明了 DeviceRegMap 数据类型的实例,我期望进行以下初始化:

DeviceRegMap uartRegMap = {
(unsigned char *)0xD0000000,
(unsigned char *)0xD0000001,
...
(unsigned char *)0xD0000007,
};

然后如果我想访问地址0xD0000007那么我会使用*(uartRegMap.RegsAddrOffset7.reg7bPtr)

问题是为什么指向 DeviceRegMap 数据类型的指针以 4 字节对齐(例如 0xD0000000、0xD0000004 等)而不是字节对齐(例如 0xD0000000、0xD0000001 等)访问内存。关于工具集,我使用的是 Wind River diab 编译器。谢谢。

标记

编辑:基于 abelenky 的评论

最佳答案

如果您想访问内存映射寄存器的字节大小部分,请执行以下操作:

struct DeviceRegMap {
volatile unsigned char byte0;
volatile unsigned char byte1;
volatile unsigned char byte2;
volatile unsigned char byte3;
};

static struct DeviceRegMap *device = (struct DeviceRegMap *)(0xD0000000);

现在device->byte0指向0xD0000000device->byte3指向0xD00000003。这就是你想要的吗?

关于c - 在C中,指向需要访问字节指针列表的结构的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4230870/

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