在中断程序内 变量的加加,这种情况是否会出现BUG!

2019-12-27 19:02发布

先说明一下   a=a+1这条程序语句的执行步骤:
javascript:;

我在想这种情况:
如果执行到第一步,将a的值读到寄存器R中

执行完这一条后,来了个中断就是 a=a-1 !
等执行完 a=a-1 ,这时候重点来了!

我的CPU会回到 a=a+1 的第二步!
R寄存器里面是不知道 a 已经被改变了,所以他还是按照原先的值 加1!
然后在写回到 a !
  
这时候就会出现bug了!
这种情况大伙们有考虑过吗?  要怎么避免?
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
84条回答
15802770321
1楼-- · 2019-12-30 14:03
188089942 发表于 2016-12-2 21:19
保护不了吧 从cpu 指令来看 他怎么保护的呢  难道让cpu一定要执行完3条语句才响应中断吗 ...

_interrupt void isr(void)
{
    你的代码;
}


asm:
isr
{

关中断
寄存器入栈

你的代码

寄存器出栈
开中断
}
hefq
2楼-- · 2019-12-30 16:29
但是我觉得直接赋值前关串口中断不就好了
yuntian
3楼-- · 2019-12-30 19:34
 精彩回答 2  元偷偷看……
myxiaonia
4楼-- · 2019-12-31 00:59
redroof 发表于 2016-12-2 20:41
这种情况互斥没用。中断又不能阻塞自己。如果没有原子加指令就只能关中断了 ...

确实可以有互斥访问,cortex的ldrex和strex就是专为解决这个问题提供的指令
saccapanna
5楼-- · 2019-12-31 03:57
amigenius 发表于 2016-12-2 19:02
放心,编译器会处理好,如果自己写汇编,中断内程序用到的寄存器都得先入栈,这是常识基础 ...

中断用到的寄存器入栈,与楼主的问题没关系。楼主说的是全局变量在前后台都被访问,如果前台访问不是原子操作,而是读改写,则可能存在问题。楼主的担心是对的,并且也是很多嵌入式程序员不重视的地方。Volatile 关键字,只是告诉编译器,变量是“易挥发”的,要求每次使用都从RAM中取值,而不是从MCU的寄存器中取上次操作的值。Volatile 可以解决部分问题,比如只读访问,但是像楼主这样,前后台都运算赋值的,那么前后台的赋值可能会与预期相冲突。
mcu5i51
6楼-- · 2019-12-31 08:38
如果不想关中断就用临时变量验算一下就知道正确不了

一周热门 更多>