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

标签 c pointers microcontroller

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

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

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

最佳答案

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

为您提供一些可读的内容,您可以使用它来写入(和读取)这个特殊功能寄存器(SFR),有人创建了该定义,让您可以像使用普通变量一样使用名称CAN_REG01 .

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

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

关于c - 为什么指向 16 位寄存器的指针是 uword?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27123135/

相关文章:

python - 除了显示之外,打印功能实际上做了什么?

在 C 中将 UTC 转换为天、小时、分钟等

c - C 中的左值、右值和数组初始化

pointers - 在函数中匹配时是否返回相同的 Empty?

c - 在 AVR 微 Controller 上使用结构

java - 如何从 C 中运行/控制 Java 程序?

Calloc() 错误强制关闭程序,对调试器不可见

c - Learning C Pointers - 赋值是打印出三个不同数组的地址和变量大小

8051微 Controller 的C++?

c - 在 MSP430 代码中使用全局变量