在中断程序内 变量的加加,这种情况是否会出现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条回答
helislayer
1楼-- · 2020-01-01 03:22
 精彩回答 2  元偷偷看……
helislayer
2楼-- · 2020-01-01 05:28
redroof 发表于 2016-12-3 09:41
被打断后只要能知道,主动重试也是可以的。从语义上,这也是原子操作。不管你怎么实现,是锁总线还是打断 ...

ARM 上面用的原子操作的机制和 X86 不一样。X86 用锁总线。
ARM 是用 ldrex 和 strex 不是锁总线是重试。
这两个都是原子操作的其中一种实现方式。
redroof
3楼-- · 2020-01-01 10:36
helislayer 发表于 2016-12-3 09:59
ARM 上面用的原子操作的机制和 X86 不一样。X86 用锁总线。
ARM 是用 ldrex 和 strex 不是锁总线是重试。 ...

没错,就是这样。
实际上对多CPU来说,重试比锁总线要先进一些。
因为锁总线的指令始终是真正的锁了总线,这一条指令之内别的CPU都不能访问内存,不管想访问什么地址(99%以上的情况别的CPU并不是要访问这个冲突的地址)
而失败重试通常情况下是没有开销的,你只是独占了这个地址。别的CPU只要不去读写这个地址,读写别的地方都不会造成任何冲突重试。
qzh
4楼-- · 2020-01-01 15:26
长知识了,不同CPU和编译器处理方式不一样
823032003
5楼-- · 2020-01-01 18:01
a++这种运算在有些单片机确实可以单指令完成。
helislayer
6楼-- · 2020-01-01 19:24
 精彩回答 2  元偷偷看……

一周热门 更多>