Dal*_*und 19
你可以像其他人建议的那样,声明一个合适的指针,即
volatile uint32_t *reg = (volatile uint32_t *)0xc000;
Run Code Online (Sandbox Code Playgroud)
请注意,我添加了volatile限定符.在读取或写入硬件寄存器时,这总是一个好主意,因为它确保您在C代码中执行的每次访问实际上都显示在生成的代码中.
但是,我通常喜欢写这样的宏
#define READ_LCDCW1() ...
#define WRITE_LCDCW1(value) ...
Run Code Online (Sandbox Code Playgroud)
然后用适当的gcc asms填充它们.我喜欢这些比直接使用指针更好,因为:
asms,我确切地知道我是如何访问寄存器的.有时需要特殊指令或地址空间才能到达寄存器,这通常不能由C编译器生成.在您的情况下,最简单的定义应该是:
#define LCDCW1_ADDR 0xc000
#define READ_LCDCW1() (*(volatile uint32_t *)LCDCW1_ADDR)
#define WRITE_LCDCW1(val) ((*(volatile uint32_t *)LCDCW1_ADDR) = (val))
Run Code Online (Sandbox Code Playgroud)
我相信有关使用关键字 volatile 的一个注意事项是正确的。
有时(通常)编译器认为 volatile 的意思不是程序员的意图(反之亦然)。使用 volatile 关键字时始终检查生成的机器代码是一种很好的做法,以避免出现意外。
如需进一步参考,请参见例如http://www.cs.utah.edu/~regehr/papers/emsoft08-preprint.pdf
| 归档时间: |
|
| 查看次数: |
19646 次 |
| 最近记录: |