先说明一下 a=a+1这条程序语句的执行步骤:
javascript:;
我在想这种情况:
如果执行到第一步,将a的值读到寄存器R中
执行完这一条后,来了个中断就是 a=a-1 !
等执行完 a=a-1 ,这时候重点来了!
我的CPU会回到 a=a+1 的第二步!
R寄存器里面是不知道 a 已经被改变了,所以他还是按照原先的值 加1!
然后在写回到 a !
这时候就会出现bug了!
这种情况大伙们有考虑过吗? 要怎么避免?
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
另,除一个小常数跟做条件判断哪个快哪个慢是不定的。
因为条件判断要打断流水线,越高频的cpu对这个越敏感。一次跳转预测不中,一二十个周期就没了!
我们可以用10进制的加减进行模拟结果。
例如,91-19,我们先进行个位减,1-9=2,并借了1,这时中断进来。
中断里进行加操作,因为上面的减操作没有完成,所以读取到的值仍然是91,我们加一个15,得到106.
再回到上面被中断的减操作并得到结果72,但是还没有来得及写回去,这时候再写回89.
很明显,这时候掉失了一个中断+15的操作。
而如果把越界问题考虑进来,就不仅仅是掉失一个+操作那么简单了。
而如何去避免这样的问题?好像是无解,只能是作中断标志。操作在中断外进行。
或者在进外部操作数据时,关闭中断。
不过话说回来,如果进行了越界保护,并且变量只作为普通的延时使用,在中断里只+1或-1,这个问题不大。
正解,做过RTOS的对这个体会应该比较深刻。
既然是在sram区域,可以定义在位带操作区然后直接使用位带操作呀,立马变成原子操作...
一周热门 更多>