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

C 为什么指向16位寄存器的指针是uword?,c,pointers,microcontroller,C,Pointers,Microcontroller,在处理器中有许多16位寄存器,其定义如下 #define CAN_REG01 (*((uword volatile far *) 0x200000)) 如果寄存器及其值仍然为16位,为什么需要(uword*)指针?如果查看数据表,您会发现CAN_REG01的地址为0x200000 为了向您提供可读的东西,您可以使用它来写入(和读取)这个特殊函数寄存器(SFR),有人创建了一个定义,它允许您像一些普通变量一样使用名称can_REG01 您必须告诉编译器要在地址0x200

在处理器中有许多16位寄存器,其定义如下

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

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

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

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

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


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

我不理解这个问题。这个定义很简单,允许您编写类似于
CAN\u REG01=…
的内容,或者反过来写,
uword regvalue=CAN\u REG01
。你不明白什么?你想知道为什么你必须把它丢给一个指针吗?或者什么是
uword
(我们也很好奇,因为它不是标准类型)?请您详细说明一下您的问题好吗?
0x200000
属于
无符号int
类型,如果不将其转换为指针,您就不能取消引用它。@mch甚至不
无符号int
,只要
int
。如果您想读取uword,显然必须将地址声明为指针,谢谢。我的描述不清楚。uword表示32位,但寄存器为16位。这就是我想知道的:为什么不(*(word volatile far*)0x200000)),其中word==16位?如果
word
是16位,我打赌
uword
也是16位。唯一的区别是符号性