【问题标题】:Does my code for writing into a register need any corrections?我写入寄存器的代码是否需要更正?
【发布时间】:2013-03-23 04:23:28
【问题描述】:

我的问题是通用的,与任何特定的微控制器无关。 下面是写入硬件寄存器地址的代码。在这段代码中,我试图写几个值,一个接一个。

unsigned int *p;  //declare a pointer

p = (int *) 0x200;  //point to hardware register address

*p = 0x12;  // write to hardware register address

*p = 0xA5;  // write to hardware register address

*p = 0xff;  // write to hardware register address

以上内容需要更正吗?

【问题讨论】:

标签: c embedded


【解决方案1】:

如果您要写入硬件寄存器,通常需要使用 volatile 关键字:

volatile unsigned int *p;

如果没有volatile,优化编译器可能会断定前两次写入是不必要的(因为值会立即被覆盖)并将它们优化掉。

这个Wikipedia article 有更多关于volatile 的信息。

【讨论】:

  • Embedded.com 上还有 this
  • 另一种方法是使用Memory barriers。我们没有寄存器的语义(只写等)。如果这是一个中断屏蔽寄存器,内存屏障可能会更好。如果寄存器由 non-CPU 硬件异步更新或者写入是有状态的,volatile 是最好的。也许 stateful 是错误的术语,write 1 to clear 就是我所想的一个例子。
猜你喜欢
  • 1970-01-01
  • 2020-10-14
  • 2022-11-10
  • 1970-01-01
  • 1970-01-01
  • 2018-02-07
  • 1970-01-01
  • 1970-01-01
  • 2013-04-14
相关资源
最近更新 更多