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

时间:2010-11-12 15:34:01

标签: c memory-mapping

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

非常感谢

2 个答案:

答案 0 :(得分:1)

您的代码存在很多问题:

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

    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;