在中断程序内 变量的加加,这种情况是否会出现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-29 14:09
amigenius说的是正确的,如果是c语言,进出中断时,编译器会自动加上保护寄存器的代码,一般要求显示声明某函数是中断函数。
声明int a,如果单片机是16位,你的a也是16位长,如果单片机是32位,你的a也是32位长,a=a+1,就是一条指令执行完,不会被打断。
但如果a为32位,单片机16位,a=a+1,就需要多条语句完成,如果此时中断发生,a值就会被破坏。
还是让188089942多思考吧
188089942
2楼-- · 2019-12-29 17:03
15802770321 发表于 2016-12-2 21:03
amigenius说的是正确的,如果是c语言,进出中断时,编译器会自动加上保护寄存器的代码,一般要求显示声明某 ...

这种情况我也知道 这种情况是另外一种bug 现在我们一起先讨论这个bug
188089942
3楼-- · 2019-12-29 22:01
15802770321 发表于 2016-12-2 21:03
amigenius说的是正确的,如果是c语言,进出中断时,编译器会自动加上保护寄存器的代码,一般要求显示声明某 ...

保护不了吧 从cpu 指令来看 他怎么保护的呢  难道让cpu一定要执行完3条语句才响应中断吗
188089942
4楼-- · 2019-12-30 01:03
 精彩回答 2  元偷偷看……
saccapanna
5楼-- · 2019-12-30 06:56
我的哥,全局变量属于临界资源,访问要做临界保护。
saccapanna
6楼-- · 2019-12-30 09:35
amigenius 发表于 2016-12-2 19:02
放心,编译器会处理好,如果自己写汇编,中断内程序用到的寄存器都得先入栈,这是常识基础 ...

这个不能指望编译器!

一周热门 更多>