我的处理内存映射设备的 C 代码仍然存在一些问题。目前我声明我写的寄存器的地址空间是易失的指针,我将数据写入它们,如下所示:
volatile unsigned int *wr_register = (int *) 0x40000000;
volatile unsigned int *c_register = (int *) 0x40000100;
...
main{
*wr_register = 0x01234567;
*c_register = 0x01234567;
*(c_register+1) = 0x89abcdef;
}
这或多或少可以正常工作。但是,我想具体阅读和编写与内存映射寄存器交互的函数。所以理想情况下,它看起来像这样:
const unsigned int wr_register = 0x40000000;
const unsigned int c_register = 0x40000100;
function write_REG(unsigned int address, int offset, int data)
{
(unsigned int*) (address + offset) = data;
}
main{
*write_REG(0x40000000, 0, 0x01234567);
*write_REG(0x40000100, 0, 0x01234567);
*write_REG(0x40000100, 1, 0x89abcdef);
}
老实说,我还没有尝试过,但我想知道是否有人可以告诉我这是否是正确的方法?
编辑:也许它对其他人有用,这里我有我的功能,它们似乎可以工作。非常感谢有用的评论!
void reg_write(unsigned int address, int offset, int data)
{
*((volatile unsigned int*)address + offset) = data;
}
int reg_read(unsigned int address, int offset)
{
return(*((volatile unsigned int*)address + offset));
}
非常感谢
你的代码有很多问题:
- 我假设您的意思是
void
,您在其中编写了 function
。
- 您还应该使函数内部的指针成为
volatile
。
- 您应该在写入数据之前取消对指针的引用。
*
应该在函数内部,而不是像现在这样在调用站点 (*write_REG
) - 这将是一个编译错误。
- 您应该将偏移量添加到指针,而不是地址。这是因为偏移量 1 意味着下一个
int
可能相距 4 个字节,但将其添加到地址只会增加 1 个字节。
您更正后的函数应如下所示:
void write_REG(unsigned int address, int offset, int data)
{
*((volatile unsigned int*)address + offset) = data;
}
你会这样调用它:
write_REG(0x40000000, 0, 0x01234567);
我是一名优秀的程序员,十分优秀!