1、volatile关键字简介volatile是 C/C/Java 等语言中的一个类型修饰符它的核心作用是告诉编译器被修饰的变量的值可能会在程序控制范围之外被改变因此每次使用时都必须重新从内存读取不能进行优化优化可减小bin文件大小。2、主要用途①硬件寄存器映射变量的值可能由硬件如外设状态寄存器自动更新编译器不能假设它不变。②中断服务程序ISR中修改的全局变量主程序和中断都会访问该变量防止编译器优化掉看似多余的读取。③RTOS多线程共享的变量在没有锁机制时一个线程修改另一个线程读取避免因优化导致读取不到最新值。3、案例分析将优化等级改为3级经过对比发现有差异的代码如下分析汇编代码①未开优化前②开启优化后原因分析开了编译器优化后编译器优化代码时没有识别出主流程和中断流程是并发执行所以没有修改全局变量。加入volatile修饰
volatile关键字的使用
1、volatile关键字简介volatile是 C/C/Java 等语言中的一个类型修饰符它的核心作用是告诉编译器被修饰的变量的值可能会在程序控制范围之外被改变因此每次使用时都必须重新从内存读取不能进行优化优化可减小bin文件大小。2、主要用途①硬件寄存器映射变量的值可能由硬件如外设状态寄存器自动更新编译器不能假设它不变。②中断服务程序ISR中修改的全局变量主程序和中断都会访问该变量防止编译器优化掉看似多余的读取。③RTOS多线程共享的变量在没有锁机制时一个线程修改另一个线程读取避免因优化导致读取不到最新值。3、案例分析将优化等级改为3级经过对比发现有差异的代码如下分析汇编代码①未开优化前②开启优化后原因分析开了编译器优化后编译器优化代码时没有识别出主流程和中断流程是并发执行所以没有修改全局变量。加入volatile修饰