无线电爱好网

 找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

无线电爱好网 首页 技术应用 初学入门 查看内容

单片机编程关键字之volatile

2025-4-17 09:04| 发布者: 闪电| 查看: 1| 评论: 0

摘要: volatile 修饰的变量是说这变量可能会被意想不到地改变。通常对于程序员而言,单片机中用的就算常见了volatile 是易变的,不稳定的意思。其实对于很多人来说,根本没见过这个关键字,不 知道它的存在。也有很多人知 ...

volatile 修饰的变量是说这变量可能会被意想不到地改变。通常对于程序员而言,单片机 中用的就算常见了

volatile 是易变的,不稳定的意思。其实对于很多人来说,根本没见过这个关键字,不 知道它的存在。也有很多人知道它的存在,根本没用过,我对它有种“杨家有女初长成, 养在深闺无人识”的感觉

volatile 关键字到底是什么意思呢,怎么用呢

1、volatile 其实和 const 一样是一种类型修饰符,用它修饰的变量表示可以被某些编译 器未知的因素而改变,比如操作系统、硬件或者其他线程等等。遇到这个关键字声明的 变量,编译器对访问该变量的代码就不再进行优化,从而可以提供对特殊地址的稳定访 问

①、我们举个例子

int i=10;

int j=i; //①语句

int k=i; //②语句

此时编译器对代码进行优化,这是因为在①、②两条语句中,i 没有被用作左值(没有 被赋值),这时候编译器认为是 i 的值没有发生改变,所以在①语句时从内存中取出 i 的 值赋给 j 之后,这个值并没有被丢掉,而是在②语句时继续用这个值给 k 赋值。编译器 不会生成出汇编代码重新从内存里取 i 的值(不会编译生成装在内存的汇编指令,比如 ARM 的 LDM 指令),这样提高了效率。但要注意①和②语句之间确认 i 没有被用作左值 才行

②、再看一个例子:

volatile int i=10;

int j=i; //③语句

int k = i; //④语句

volatile 关键字告诉编译器,i 是随时可能发生改变的。每次使用它的时候必须从内存中 取出 i 的值,因而编译器生成的汇编代码会重新从 i 的地址处读取数据放在 k 中。 这样看来,如果 i 是一个寄存器变量,表示一个端口数据或者是多个线程的共享数据就容易出错,所以说,volatile 可以保证对特殊地址的稳定访问

2、我们知道做电子方面技术工作的一般面试的时候都有笔试,比如单片机软件方面, 考题基本都会有对这个关键字的考察,可想在单片机中这个关键字的重要性,一般题目 会有对这个关键字的定义是什么,就是你得知道它的概念,然后就是举例说明这个关键 字使用的例子,这个时候就能考察出大家对这个关键字的具体理解了。 一般我们知道的是:

1、并行设备的硬件寄存器(比如状态寄存器)

2、一个中断服务子程序中会访问到的非自动变量

3、多线程应用中被几个任务共享的变量

当我们回答出这些时基本可以知道你对这个关键字是懂的,如果做嵌入式的话,程序员 经常和硬件、中断、RTOS 等等打交道,所以这个关键字必须要懂

3、那么我们再延伸一下,一个参数既可以是 const 也可以是 volatile,那么举个例子就 是只读的状态寄存器,那么只读就是 const,并且要确定程序不能试图去修改它,再有就是 volatile 代表状态寄存器,可能被意想不到的改变

4、那么指针是不是可以用到这个 volatile 关键字吗,是可以的

这个我们只要了解即可,用的不多。但是得知道。举个例子就是当一个中断服务子程序 修改一个指向一个 buffer 的指针的时候。修饰也和 const 类似,const 有常量指针和指针 常量的说法,volatile 也可以这样认为

比如修饰由指针指向的对象或数据是 const 或 volatile 的

例如:

volatile char *p1;

比如指针自身的值---一个代表地址的整数变量是 const 或 volatile 的


路过

雷人

握手

鲜花

鸡蛋

QQ|关于本站|小黑屋|Archiver|手机版|无线电爱好网 ( 粤ICP备15040352号 ) 无线电爱好技术交流5 无线电爱好技术交流1无线电爱好技术交流9开关电源讨论群LED照明应用、电源无线电爱好技术交流4无线电爱好技术交流8无线电爱好技术交流10无线电爱好技术交流11

粤公网安备 44030702001224号

GMT+8, 2025-4-17 09:04 , Processed in 0.109200 second(s), 18 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2020, Tencent Cloud.

返回顶部