内存映射接口的进一步问题
我的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); }
我还没有尝试过但说实话,但我想知道是否有人可以告诉我这是否是一种正确的方法呢?
编辑:也许它对其他人有用,在这里我有我的function,他们似乎工作。 非常感谢有用的评论!
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)); }
非常感谢
你的代码有很多问题:
- 我假设你在写
function
地方意味着void
。 - 你应该使函数内的指针也是
volatile
。 - 您应该在写入数据之前取消引用指针。
*
应该在函数内部,而不是现在的调用站点(*write_REG
) – 这将是一个编译错误。 - 您应该将偏移量添加到指针,而不是地址。 这是因为1的偏移量意味着下一个
int
,可能是4个字节,但是将它添加到地址只会增加1个字节。
您更正的function应如下所示:
void write_REG(unsigned int address, int offset, int data) { *((volatile unsigned int*)address + offset) = data; }
你会称之为:
write_REG(0x40000000, 0, 0x01234567);
那就好了恕我直言。 我有时会使用像:
#define WR_REG *(volatile unsigned int*)0x40000000
这允许寄存器使用类似的变量:
WR_REG = 0x12345678;