论坛元老
 
- 积分
- 4106
- 金钱
- 4106
- 注册时间
- 2018-8-14
- 在线时间
- 696 小时
|
发表于 2021-2-1 16:20:36
|
显示全部楼层
__IO 的下一层是 volatile
vu8 == volatile unsigned char
ARM的特性是在寄存器上运算, 而不是直接拿内存的数据来运算,在一个稍复杂的运算过程中, 变量会在最开始时, 从内存加载到寄存器, 当完成整个运算后再把结果放回内存去, 这是ARM运行的最优策略, 所以编译器通常都会作下面的优化
A=(A>>3)+B; // 当执行完这一条后, 结果是应该放回A的, 但实际上是不会的。
A=C+23*A; // 只有最后这一运算的结果才会存回内存里的A。
如果说A是一般的变量时这种优化是没问题的, 但如果A是一个IO, 又或者A是一个变量用于两个线程之间的通信, 这样的优化就会有问题, 这时候就可以用volatile 去告诉编译器, 别给这变量做优化。
比如 A是被定义为
vu8 A;
A=(A>>3)+B; // 当执行完这一条后, 结果会放到A在内存的位置, 不管后面的运算还有没有对A的值变更。
|
|