gpt4 book ai didi

c - 使用简单预处理器定义的内存映射地址

转载 作者:行者123 更新时间:2023-12-04 09:34:29 26 4
gpt4 key购买 nike

我有一个简单的内存映射接口(interface),我想通过 这个值到两个寄存器,然后读回它们。以下代码 示例工作正常:

  volatile int *reg1 = (int *) 0x80000000;
volatile int *reg2 = (int *) 0x80000004;

*reg1 = 12; *reg2 = 23;
printf("reg1 = %i\n", *reg1);
printf("reg2 = %i\n", *reg2);

而不是“硬编码”地址,我希望地址是 从基地址和偏移量放在一起。使用一些预处理器 语句,我想要一些定义。

开始更新

 #define WriteReg(BaseAddress, RegOffset, Data) \
*((volatile int *)((char*)BaseAddress + RegOffset)) = (unsigned int)(Data)

#define ReadReg(BaseAddress, RegOffset, Data) \
(unsigned int)(Data) = *((volatile int *)((char*)BaseAddress + RegOffset))


WriteReg((int *) 0x80000000, 0, 18);
WriteReg((int *) 0x80000000, 4, 29);

WriteReg((int *) 0x80000000, 4, res);
printf("Reg2 = %i\n", res);

WriteReg((int *) 0x80000000, 0, res);
printf("Reg1 = %i\n", res);

结束更新

现在两种情况下的输出都是 1073804536,而不是分别为 12 和 23。 所以我想我一定对指针做了一些可怕的错误,任何人 评论我如何使用定义语句正确构建此地址?

最佳答案

你看,你是以字节的形式添加偏移量。您要么必须将代码更改为:

*((volatile int *)((char*)BaseAddress + RegOffset)) = (unsigned int)(Data)

或者,您可以根据您的类型添加偏移量:

  WriteReg(base, 0, 12);
WriteReg(base, 1, 23);

关于c - 使用简单预处理器定义的内存映射地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3980365/

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