C 为什么指向16位寄存器的指针是uword?
在处理器中有许多16位寄存器,其定义如下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
#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位。唯一的区别是符号性