【问题标题】:Further question with memory mapped interface内存映射接口的进一步问题
【发布时间】:2010-11-12 15:34:00
【问题描述】:

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

}

说实话,我还没有尝试过,但我想知道是否有人可以 告诉我这是否正确?

编辑:也许它对其他人有用,在这里我有我的功能,他们似乎工作。非常感谢提供帮助的 cmets!

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

非常感谢

【问题讨论】:

  • 我认为你在函数调用之前有多余的'*'。另外,我认为您打算在函数调用中使用变量“地址”而不是硬编码。

标签: c memory-mapping


【解决方案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);

【讨论】:

  • 是的,我的意思是 void 而不是函数 ;)。确保我将偏移量添加到指针而不是地址本身是非常好的一点!非常感谢!
【解决方案2】:

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

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

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

WR_REG = 0x12345678;

【讨论】:

  • 它们是变量。 Poster的原始代码几乎是正确的做事方式,我不知道她为什么要让它变得更复杂。
猜你喜欢
  • 2015-08-09
  • 2016-01-14
  • 1970-01-01
  • 2017-05-27
  • 1970-01-01
  • 2010-10-12
  • 1970-01-01
  • 2014-10-09
  • 2014-06-30
相关资源
最近更新 更多