预处理程序指令中的指针定义

时间:2018-09-11 17:03:12

标签: c

我正在阅读所遇到的一个微控制器的编程手册,并且其预处理器定义如下:

#define SCICTL1A (volatile unsigned int *)0x7051

和源文件中的语句,如下所示:

*SCICTL1A = 0X0003;

我的问题是,这里的指针变量是什么,它指向什么((自从我是C编程的初学者以来,我从未遇到过预处理器指令中的指针定义),赋值语句有什么作用?

3 个答案:

答案 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软件。