在中断程序内 变量的加加,这种情况是否会出现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条回答
redroof
1楼-- · 2020-01-07 03:31
helislayer 发表于 2016-12-8 22:12
这个首先是不太应该用 C++ template,特别是在中断里面。
C++ class 里面很容易有隐含的 malloc,在中断 ...

另,除一个小常数跟做条件判断哪个快哪个慢是不定的。
因为条件判断要打断流水线,越高频的cpu对这个越敏感。一次跳转预测不中,一二十个周期就没了!
lianglee
2楼-- · 2020-01-07 05:16

我们可以用10进制的加减进行模拟结果。

例如,91-19,我们先进行个位减,1-9=2,并借了1,这时中断进来。
中断里进行加操作,因为上面的减操作没有完成,所以读取到的值仍然是91,我们加一个15,得到106.
再回到上面被中断的减操作并得到结果72,但是还没有来得及写回去,这时候再写回89.
很明显,这时候掉失了一个中断+15的操作。
而如果把越界问题考虑进来,就不仅仅是掉失一个+操作那么简单了。

而如何去避免这样的问题?好像是无解,只能是作中断标志。操作在中断外进行。
或者在进外部操作数据时,关闭中断。


不过话说回来,如果进行了越界保护,并且变量只作为普通的延时使用,在中断里只+1或-1,这个问题不大。

Ray______
3楼-- · 2020-01-07 08:44
 精彩回答 2  元偷偷看……
szxszx
4楼-- · 2020-01-07 12:12
中断中只设标志位,主循环根据标志位状态做运算,避免前后台对同一个变量进行写操作
654705188
5楼-- · 2020-01-07 13:06
saccapanna 发表于 2016-12-3 07:31
中断用到的寄存器入栈,与楼主的问题没关系。楼主说的是全局变量在前后台都被访问,如果前台访问不是原子 ...

正解,做过RTOS的对这个体会应该比较深刻。
擦鞋匠
6楼-- · 2020-01-07 13:52
额,为什么大家纠结于此...
既然是在sram区域,可以定义在位带操作区然后直接使用位带操作呀,立马变成原子操作...

一周热门 更多>