我在 低功耗运行 模式下从 RAM 运行了 c 代码(因此不处理中断)。此模式由代码序列启用:
- 跳转到内存
- SIM 卡
- 关闭内部闪存和电源调节器,切换到低速时钟源(LSE)
- 使用 WFE 模式(低功耗等待模式)做一些工作
- 打开电源调节器和闪光灯,恢复时钟源
- 边缘
- 跳转到闪光灯
因此勘误表中描述的 WFE 指令没有问题。这种结构的问题,可能是 CPU 永远锁定在低功耗等待模式的原因:
while nbit(TIM1_SR1,CC3IF) asm("wfe");
反汇编为:
000035 720252B602 BTJT TIM1_SR1, #1, 0xB6
00003A 728F WFE
来自定时器的事件具有概率性质,这段代码不保证它会在执行 WFE 指令后发生:
- BTJT指令执行2个周期,长度为5;
- 从 RAM 执行的代码可能不连续,因为“获取”状态会在几个周期内暂停执行
我使用手册 PM0044,在第 26 页,它的内容很漂亮:
有 2 种情况代码执行停滞在 3 个周期。所以我不确定我的异步唤醒事件不会发生在 BTJT 和 WFE 指令之间。
有没有办法保证严格的逻辑顺序(检查条件 > wfe > 唤醒事件)?
最佳答案
如果您的锁定问题是由我提到的 WFE 勘误表引起的,那么应该有比尝试实现“正确的应用程序计时”更简单的解决方案。
errata provided by STMicroelectronics阅读:
Two types of failures can occur:
Case 1:
In case WFE instruction is placed in the two MSB of the 32-bit word within the memory, an event which occurs during the WFE execution cycle or re-execution cycle (when returning from ISR handler) will cause an incorrect code execution.Case 2:
An interrupt request, which occurs during the WFE execution cycle will lead to incorrect code execution. This is also valid for the WFE re-execution cycle, while returning from an ISR handler
情况 2 不适用于您的情况,因为您说“由于我使用低功耗运行模式,因此未处理中断”。如果在 WFE 指令期间不会发生中断,则只有第一种情况中描述的故障可能会导致您的锁定。
情况 1 仅适用于 WFE 指令在内存中的 32 位字内处于特定对齐方式的情况。因此,如果您可以确保 WFE 指令永远不会出现在以这种方式对齐的代码中,那么您就不会遇到这种故障。如果您的汇编器支持 align 指令,您可以使用它实现此目的,如果汇编器不插入 NOP,则可能连同标签和跳转。然而,更简单的解决方案在勘误表中作为“专用解决方法”给出:
Replace the WFE instruction with
WFE JRA next next:
这似乎通过在 WFE 指令后放置相当于 2 字节 NOP 的内容来解决故障。我的猜测是失败导致 CPU 没有立即执行 WFE 指令之后的指令,而是向前跳到下一个 32 位世界开始处的指令(如果有的话)的两个字节。在跳过的空间中放置一个2字节的NOP意味着是否发生故障无关紧要。
关于c - STM8 ASM 安全执行 WFE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36377047/