C语言 为什么指向 16 位寄存器的指针是 uword


处理器

中有很多 16 位寄存器,定义如下

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

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

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

为您提供一些可读的东西,您可以使用它来写入(和读取)某人创建的这个特殊函数寄存器 (SFR),该寄存器定义允许您像使用一些普通变量一样使用名称CAN_REG01

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

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

最新更新