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