1

我的处理内存映射设备的 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));
}   

非常感谢

4

2 回答 2

1

您的代码存在很多问题:

  1. 我假设你的意思void是你写的地方function
  2. 您应该使函数内部的指针volatile也一样。
  3. 您应该在写入数据之前取消引用指针。*应该在函数内部,而不是现在的调用站点 ( ) *write_REG- 这将是一个编译错误。
  4. 您应该将偏移量添加到指针,而不是地址。这是因为偏移量 1 意味着下一个偏移量int可能是 4 个字节,但将它添加到地址只会增加 1 个字节。

您更正后的函数应如下所示:

void write_REG(unsigned int address, int offset, int data)
{
    *((volatile unsigned int*)address + offset) = data;
}

你会这样称呼它:

write_REG(0x40000000, 0, 0x01234567);
于 2010-11-12T15:42:43.473 回答
0

恕我直言,那很好。我有时会使用如下宏:

#define WR_REG     *(volatile unsigned int*)0x40000000

这允许寄存器使用类似的变量:

WR_REG = 0x12345678;
于 2010-11-12T15:43:08.730 回答