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

08-05 00:37