勘误表 CPU27指出:
当在已启用的中断服务例程内进入低功耗模式时
嵌套中断(通过设置 GIE 位)以及设置低功耗的指令
MODE 后面紧跟 RETI 指令、推至错误的 PC + 2值
在上下文保存期间运行堆栈。 因此、RETI 指令不会在返回时执行
并且 PC 会损坏。
我看到 此代码出现了类似的行为(有时!) 破坏程序计数器:
/*
* We cannot use the __bis_SR_register intrinsic here, as the readback
* from latched_flags into a general purpose register and writing to the
* SR register is not necessarily atomic.
* __bis_SR_register(latched_flags);
*/
__asm__ __volatile__
(
"bis.w lpm_latched_flags, SR\n"
"ret\n"
:
:
: "cc", "memory"
);
其中"lpm_LATCH_flags"是一个16位整数、包含一些睡眠标志(例如 LPM3 + GIE 或 LPM0 + GIE)。
在"bis.w"和"ret"指令之间添加"nop"后、我没有观察到任何进一步的崩溃。
在我看来、就像 Errata CPU27不是嵌套中断所独有的、而是使用"ret"和"reti"指令。
到目前为止、这是供参考的。
我有第二个问题。 在这种情况下、我尚未观察到它崩溃、但您能确认序列
eint ret
安全吗? (显然、在这种情况下、任何 LPM 标志都不会被置位)