在中断程序内 变量的加加,这种情况是否会出现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条回答
lcofjp
1楼-- · 2020-01-03 07:38
楼主说的情况是存在的,这种情况很常见,楼上有些不懂的B瞎BB,楼主别信他们的,在中断外面写变量的时候,一定要保证不要进中断。或许其他高级处理器没问题,但是STM32肯定存在这样的问题。
yoursnemo
2楼-- · 2020-01-03 07:49
长期用8位的低档MCU,看到这帖子,涨了好多知识。
saccapanna
3楼-- · 2020-01-03 08:22
 精彩回答 2  元偷偷看……
laoshuhunya
4楼-- · 2020-01-03 13:29
lixin91985 发表于 2016-12-3 08:57
LZ想多了。。
中断来的时候 R会 入栈

可能你理解错了,楼主位的意思是:中断所做的修改丢失了。
                                                                              
laoshuhunya
5楼-- · 2020-01-03 18:31
yoursnemo 发表于 2016-12-5 10:17
长期用8位的低档MCU,看到这帖子,涨了好多知识。

8位机也是一样的问题。
这个帖子生动地说明了搞嵌入式不了解汇编是行不通的
                                       
redroof
6楼-- · 2020-01-03 22:29
laoshuhunya 发表于 2016-12-6 22:45
8位机也是一样的问题。
这个帖子生动地说明了搞嵌入式不了解汇编是行不通的
                 ...

8位机才更严重。
如果是32位arm,至少所有的整数读和写无需保护,每次总能完整的完成。对8位机,就算主程序只写中断只读,对大于8位的数据都是不行的。有可能见到一半新一半旧!

一周热门 更多>