2014-11-25 112 views
0

有大量的16位寄存器的处理器都像为什么指向16位寄存器的指针是uword?

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

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

+1

我不明白这个问题。这个定义简单的命令允许你写'CAN_REG01 = ...'或其他方式,'uword regvalue = CAN_REG01'。你有什么不明白? – 2014-11-25 09:40:08

+1

你想知道为什么你必须将它转换为指针吗?或者“uword”是什么(我们也很好奇,因为它不是标准类型)?你能否详细解释一下你的问题? – 2014-11-25 09:40:43

+0

'0x200000'的类型是'unsigned int',如果没有强制转换为指针,则无法将其解除引用。 – mch 2014-11-25 09:41:33

回答

1

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

为了给您提供一些可读的东西,您可以使用它来写入(和读取)这个特殊功能寄存器(SFR),这个特殊功能寄存器定义了一个名称CAN_REG01,就像一些普通变量一样。

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

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

+0

谢谢。我的描述不清楚。 uword表示32位,但寄存器是16位。这就是我想知道的:为什么不(*((字volatile far *)0x200000)),其中word == 16位? – elusive 2014-11-25 10:46:39

+2

如果'word'是16位,我敢打赌'uword'也是16位。唯一的区别是签名 – 2014-11-25 10:51:51

相关问题