一、学习感悟
1、2022.12.12
- volatile标识符的作用
- 声明一个寄存器类型的变量
- 实质:声明一个编译器禁止优化的的变量。对一个会自动实时反应类似寄存器的变量。两次读取寄存器若在这其中发生变化,本该读出来的的值不一样,但是由于编译器优化,情况可能超乎想象。读出两个一模一样的值。不只是寄存器,在多线程系统中也会出现这个问题。
//下面是b站某up的代码 //两个连续c语言代码,取值同一个地址的寄存器,由于编译器认为该地址没有用户指令修改它,汇编时编译器会把部分代码优化掉 int a = *((unsigned int *)0xc001c020); ldr r0, =&a ldr r1, =0xc001c020 ldr r2, [r1] str r2, [r0] int b = *((unsigned int *)0xc001c020); ldr r0, =&b @ldr r1, =0xc001c020 @会被编译器优化 @ldr r2, [r1] @会被编译器优化 str r2, [r0] //但这是有问题的,只是软件上没有程序员写指令修改它,不代表硬件底层不去修改它,尤其是读io的输入寄存器时,错误就这样出现了 //volatile关键字就是为了解决这种情况的,该关键字声明了该地址是寄存器而非常规内存的数据,禁止编译器优化