论坛元老
 
- 积分
- 4106
- 金钱
- 4106
- 注册时间
- 2018-8-14
- 在线时间
- 696 小时
|
发表于 2020-12-9 14:51:09
|
显示全部楼层
上锁当然是个办法, 但很多应用是用不起锁的, 这所谓多线程, 可以简单到中断服务函数与主程序的共享数据, 比如所有中断都是通过某一全局变量通知主函数所发生的中断, 而这个全局变量就有安全性的问题, 能轻易上锁?主程序上锁了后发生中断, 要改这变量, 在中断等主程序解锁?
volatile其实很简单, 但解释起来特别麻烦, 因为它需要你理解ARM的机理, ARM的其一特性就是, 所有运算, 加减乘除与或....都只能在寄存器里运算, 简单如A++; 都不都能直接的对内存+1, 必须是先加载到寄存器才可以加1, 之后再把寄存器的内容存回内存。
正正是这个特性, ARM的编译器都会进行优化, 一通运算中多次用到的同一变量, 只在最开始时从内存加载到寄存器, 在运算的最后才把它更新到内存去。
但如果运算是被包含在while(1){ }内, 那编译器大多只会在进while(1)之前, 从内存加载到寄存器, 只后就不再加载, 这时候就需要用volatile告诉编译器在哪儿给我从新把内存的内容加载寄存器。
u32 ShareVar;
while(1) {
if ((volatile u32)ShareVar) {
if (ShareVar & 1) ......
if (ShareVar & 2) ......
ShareVar=0;
}
} |
|