为什么指向16位寄存器的指针是uword?

时间:2014-11-25 09:36:56

标签: c pointers microcontroller

处理器中有许多16位寄存器,定义类似

#define CAN_REG01              (*((uword volatile far *) 0x200000))

如果寄存器及其值仍然是16位,为什么我们需要(uword *)指针?

1 个答案:

答案 0 :(得分:1)

如果您查看数据表,您会发现CAN_REG01的地址是0x200000

为了向您提供可读的东西,您可以使用这些特殊功能寄存器(SFR)来创建定义的特殊功能寄存器(SFR),让您像使用普通变量一样使用名称CAN_REG01

您必须告诉编译器您要在地址0x200000处写入,因此您必须将其视为指针。此外,您必须告诉编译器有关此指针后面的数据的大小。显然,CAN_REG01寄存器的大小为uword(无论您在特定平台上的含义是什么)。必须添加volatile以强制编译器不优化对该地址的访问,因为某些处理器内部或中断可能会独立于您的代码更改它。另外,编译器可能会删除该寄存器的连续赋值,因为他认为只有最后一个才重要。

以这种方式定义SFR在嵌入式平台裸机编译器中非常常见。