我最近一直在学习嵌入式系统编程。在声明变量时,我注意到关键字volatile限定符的用法相当高吗?
在嵌入式系统编程中声明变量时,volatile的意义是什么?
基本上当应该使用关键词的时候。我确实读过一些关于编译器优化和关键字的使用的文章。还有一些与内存映射寄存器有关的内容。
例如,我读了这个StackOverflow邮政,但是我不明白它是如何在嵌入式环境中应用的。更具体地说,我不明白什么时候应该使用关键词。我确实读过一些关于编译器优化和关键字的使用的文章。还有一些与内存映射寄存器有关的内容,但我不知道什么时候使用它。
发布于 2015-08-11 06:01:05
在嵌入式系统世界中,volatile关键字的一个关键方面是它表示在任何时候都可能发生变化的变量(例如外部/硬件数据输入--例如ADC),因此编译器绝不能优化使用。
但具体来说,当与控制寄存器一起使用时,它表明读取访问实际上可能会更改数据!
作为一个普遍的经验规则,我建议在以下所有内容中使用volatile限定符:
注意:访问volatile不一定是原子性的,因此您必须了解硬件和代码结构。
发布于 2015-08-07 20:47:24
让我们来看看一个例子。当您查看PIC微控制器的C头文件时,您将看到许多元素被声明为volatile
extern volatile unsigned char PORTB @ 0x006;正如您所阅读的,volatile关键字禁用编译器优化。假设您编写了一个执行以下操作的程序:
PORTB = 0x00; // set all of port B low
while (PORTB == 0x00); // wait for any pin to get high
// do something else当编译器优化这段代码时,它会将第二行识别为一个无限循环:条件为真,并且在其体内永远不会出错。因此,无限循环之后的所有内容都不需要编译,因为它永远不会被运行。因此,编译器可能决定不将代码的这一部分包含在生成的程序集代码中。
但是,这个PORTB实际上是链接到物理端口的。它是一个硬件端口,其值可能被外部电路改变。这意味着,尽管循环似乎是无限的,但它并不一定是无限的。编译器不可能知道这一点。
这就是volatile进来的原因。当PORTB被声明为volatile时,编译器不会根据PORTB的推理进行任何优化。它将假定它的价值在任何时候都可能因外部因素而改变。
发布于 2015-08-07 21:11:06
主要使用易失性关键字,告诉编译器变量的值可以随时更改。它还告诉编译器不要对变量应用优化。我在这方面不是专家,但下面是我过去提到的很好的参考资料。
易失性是在声明变量时应用于变量的限定符。它告诉编译器,变量的值在任何时候都可能发生变化-编译器在附近找到的代码没有采取任何操作。这方面的影响相当严重。然而,在我们检查它们之前,让我们先看一下语法。
参考:
https://stackoverflow.com/questions/32018942
复制相似问题