我正在阅读所遇到的一个微控制器的编程手册,并且其预处理器定义如下:
#define SCICTL1A (volatile unsigned int *)0x7051
和源文件中的语句,如下所示:
*SCICTL1A = 0X0003;
我的问题是,这里的指针变量是什么,它指向什么((自从我是C编程的初学者以来,我从未遇到过预处理器指令中的指针定义),赋值语句有什么作用?
答案 0 :(得分:3)
这里没有变量。宏会随文本扩展,因此第二个摘录变为
*(volatile unsigned int *)0x7051 = 0X0003;
它将无符号整数0x7051
转换为指向易失性无符号整数的指针,然后在赋值中引用它。从本质上讲,它将0x0003
存储到unsigned integer
宽的一块内存中,该内存从地址0x7051
开始(或者,整数到指针的转换恰好在您的目标平台上起作用)>
volatile
是必需的,这样编译器不仅会优化分配,还必须严格评估并考虑其副作用(请参见as-if rule)。
作为执行此操作的实际原因-可能是某些内存映射的设备,请查看微控制器数据表以获取更多信息。
答案 1 :(得分:0)
那里没有变量。只有指针。
*SCICTL1A = 0X0003;
被预处理器替换为:
*(volatile unsigned int *)0x7051 = 0x0003;
您只需使用0x07051的地址写入位置。那是否意味着取决于您的实现
答案 2 :(得分:0)
我假设您使用的是TMS320F2803x Piccolo微控制器:http://www.ti.com/lit/ds/sprs584l/sprs584l.pdf
根据本文档,地址0x7051
是串行通信接口(SCI)模块的控制寄存器1。
根据本文档https://www.swarthmore.edu/NatSci/echeeve1/Ref/embedRes/DL/28069TechRefManual_spruh18d.pdf,您可以使用此寄存器执行以下操作:
SCICTL1控制接收器/发送器使能,TXWAKE和SLEEP 功能,并重置SCI软件。