关于嵌入式系统的"易变"关键字有什么意义?

706*_*tor 7 c embedded

我最近一直在努力学习嵌入式系统编程.volatile在声明变量时,我观察到关键字限定符的使用率相当高?

volatile在嵌入式系统编程中声明变量时有什么意义?

基本上应该使用关键词.我确实读过有关编译器优化和关键字使用的内容.还有与内存映射寄存器有关的东西.

例如,我读了这篇StackOverflow帖子,但我不明白它是如何在嵌入式环境中应用的.更具体地说,我不明白何时应该使用关键词.我确实读过有关编译器优化和关键字使用的内容.还有一些与内存映射寄存器相关的东西,但我不明白何时使用它.

小智 10

我们来看一个例子吧.当您查看PIC微控制器的C头文件时,您将看到声明了许多元素volatile:

extern volatile unsigned char           PORTB               @ 0x006;
Run Code Online (Sandbox Code Playgroud)

如您所读,volatile关键字禁用编译器优化.假设您编写了执行以下操作的程序:

PORTB = 0x00;            // set all of port B low
while (PORTB == 0x00);   // wait for any pin to get high
// do something else
Run Code Online (Sandbox Code Playgroud)

当编译器优化此代码时,它会将第二行识别为无限循环:条件为true且在其体内永远不会出现错误.因此,无限循环之后的所有内容都不需要编译,因为它永远不会被运行.因此,编译器可以决定不在生成的汇编代码中包括该部分代码.

但是,这PORTB实际上与物理端口相关联.它是一个硬件端口,其值可能会被外部电路改变.这意味着尽管循环似乎是无限的,但它并非必须如此.编译器不可能知道这一点.

这就是volatile进来的地方.当PORTB声明时volatile,编译器不会根据推理进行任何优化PORTB.它将假设其值可能随时由外部因素改变.


小智 6

在嵌入式系统领域,关键字的一个关键方面volatile是它表示可能随时改变的变量(例如外部/硬件数据输入 - 例如ADC),因此编译器不得优化使用.

但具体来说,当与控制寄存器一起使用时,它表明读访问实际上可能会改变数据!

作为一般经验法则,我建议volatile在以下所有方面使用限定符:

  • 所有硬件寄存器访问(读写)
  • 可在多个线程中访问的所有变量(尤其是中断处理程序)

注意:访问a volatile不一定是原子的,因此必须知道您的硬件和代码结构.