内存映射接口的进一步问题

我的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)); } 

非常感谢

你的代码有很多问题:

  1. 我假设你在写function地方意味着void
  2. 你应该使函数内的指针也是volatile
  3. 您应该在写入数据之前取消引用指针。 *应该在函数内部,而不是现在的调用站点( *write_REG ) – 这将是一个编译错误。
  4. 您应该将偏移量添加到指针,而不是地址。 这是因为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;