Lok*_*wda -1 c c++ microcontroller volatile
该volatile关键字告诉编译器不要优化带前缀的变量.变量可能在运行时由未知源(编译器不知道)可能由外部中断等改变.
还有其他优点volatile吗?是否volatile适用于从文件中读取?
volatile关键字表示编译器不优化前缀的变量,变量可能在运行时由未知源(编译器不知道)改变,可能是外部中断等.
不.该volatile关键字不会告诉编译器禁用或不优化变量; 的volatile关键字告诉变量(或者说,该变量表示存储器)可以从外部修饰以程序的编译器.
这会导致编译器不再能够进行必要的分析以确定各种优化是否安全(在功能上是等效的),因此编译器不会执行这些优化.这是必要的副作用,但不是关键字存在的主要目的.
的使用volatile作为像个了几分或略便携式黑客pragma禁用编译器的优化是一个相当普遍的模式.在嵌入式编程之外,这可能是应用程序员最常遇到的用法.
编译器知道该控制器的所有中断.那么在这种情况下
volatile关键字如何帮助?
的volatile关键字表示存储器的内容可以在程序的控制之外进行修改,或者在另一个进程,线程或由外部信号,例如一个硬件中断.
编译器不"了解"中断,可能存在与编译器一起分发的系统头文件,这些文件定义了中断的符号名称,但这并不意味着编译器理解它们.
还有其他优点
volatile吗?
除了这里描述的内容之外,这不是我能想到的.
[app]
volatile[y]从文件中读取?
除了用作进程间通信(IPC)或信号量的形式之外,文件的内容通常由单个进程控制,因此volatile不必使用.
volatile实际上告诉编译器可以在其控制流之外更改变量的值.最流行的是中断或中断处理程序或硬件寄存器.对于后者,编译器确实不知道其值何时发生变化.它也不适用于中断,因为它只发生在运行时.
请注意,C假定单线程程序流程; 编译器不知道并发进程.它对底层硬件的假设更少.
对于所有其他变量,编译器可能(例如gcc实际上将)假设它完全了解系统状态.
对volatile变量的访问也可能不会相互重新排序.当例如UART要求首先读取状态寄存器然后可以将新的字符存储到发送数据寄存器时,这是重要的.对于大多数MCU,只有这个序列才能正确清除标志.非常重要:非vloatile变量可以像编译器一样重新排序(当然,只要它不改变程序逻辑).
请注意,这volatile并不能保证多核系统的原子性和正确行为,也不能防止硬件(内存控制器等)对访问的重新排序(好吧,AVR对所有这些都有点不利;-).这就是锁定的一个原因,以及为什么内存映射中的硬件区域被硬件特殊处理(有序,非共享).
编辑:
这里详细介绍了gcc如何处理volatile对象.众所周知,gcc严格遵守优化标准.任何不被禁止的东西都可能被利用来进行优化.像IAR这样的经典嵌入式编译器通常更为保守.
| 归档时间: |
|
| 查看次数: |
1522 次 |
| 最近记录: |