我的c代码仍然存在一些问题,涉及内存映射设备。 目前,我声明了我写为volatile的寄存器的地址空间 指针,我将数据写入它们,如下所示:
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));
}
非常感谢
答案 0 :(得分:1)
您的代码存在很多问题:
void
,你写的是function
。volatile
。*
应该在函数内部,而不是现在的调用站点(*write_REG
) - 这将是一个编译错误。int
,可能是4个字节,但将其添加到地址只会增加1个字节。您的更正功能应如下所示:
void write_REG(unsigned int address, int offset, int data)
{
*((volatile unsigned int*)address + offset) = data;
}
你会称之为:
write_REG(0x40000000, 0, 0x01234567);
答案 1 :(得分:0)
那就好了恕我直言。我有时会使用像:
这样的宏#define WR_REG *(volatile unsigned int*)0x40000000
这允许使用类似变量的寄存器:
WR_REG = 0x12345678;