c - STM8 ASM 安全执行 WFE

标签 c assembly embedded stm8

我在 低功耗运行 模式下从 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 页,它的内容很漂亮:

example code execution from RAM

有 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/

相关文章:

无法加载我的操作系统内核

assembly - 使用 MS-DOS int 21h 系统调用以汇编语言打印新行

linux - 访问 GPIO 时出现段错误

c - 为什么使用 elm chan fatfs f_chdir 更改目录不会影响目录结构?

C 中整数到字符数组的转换

c++ - 使用 Divide and Conquer 在 char 数组中搜索字符串

c - Flex 和 Bison 段错误

c - 执行结束时修改文件内容

c++ - 函数返回的增量指针

visual-studio - 运行 "armasm.exe"失败 : "The application was unable to start correctly (0xc000007b)