处理器中有很多 16 位寄存器,其定义如下
#define CAN_REG01 (*((uword volatile far *) 0x200000))
如果寄存器及其值仍然是 16 位,为什么我们需要 (uword*) 指针?
最佳答案
如果您查看数据表,您会发现 CAN_REG01 的地址是 0x200000
。
为您提供一些可读的内容,您可以使用它来写入(和读取)这个特殊功能寄存器(SFR),有人创建了该定义,让您可以像使用普通变量一样使用名称CAN_REG01
.
您必须告诉编译器您要在地址0x200000
处写入,因此您必须将其视为指针。此外,您还必须告诉编译器该指针后面的数据的大小。显然,CAN_REG01 寄存器的大小为 uword(无论这在您的特定平台上意味着什么)。必须添加 volatile
以强制编译器不优化对此地址的访问,因为某些处理器内部或中断可能会独立于您的代码而更改它。另外,否则编译器可能会删除对此寄存器的连续赋值,因为他认为只有最后一个才是重要的..
以这种方式定义 SFR 在嵌入式平台裸机编译器上非常常见。
关于c - 为什么指向 16 位寄存器的指针是 uword?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27123135/