我的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
),这将是一个编译错误。
您应该将偏移量添加到指针,而不是地址。这是因为偏移量1意味着下一个*
可以是,比如说,4字节之外,但是将它添加到地址中只会增加1字节。
修正后的函数应如下所示:
void write_REG(unsigned int address, int offset, int data)
{
*((volatile unsigned int*)address + offset) = data;
}
你可以这样称呼它:
write_REG(0x40000000, 0, 0x01234567);