首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >STM8 ASM安全执行WFE

STM8 ASM安全执行WFE
EN

Stack Overflow用户
提问于 2016-04-02 18:12:38
回答 2查看 977关注 0票数 4

我在低功耗运行模式下从RAM运行c代码(所以中断没有处理)。此模式由代码序列启用:

  • 跳转到RAM
  • SIM
  • 关闭内部闪光灯和电源调节器,切换到低速时钟源(LSE)。
  • 使用WFE模式(低功耗等待模式)做一些工作
  • 打开电源调节器和闪光灯,恢复时钟源
  • 轮辋
  • 跳到闪光灯

因此,没有问题,WFE指令,描述在勘误表。这种结构的问题,可能永远是CPU在低功耗等待模式下锁定的原因:

代码语言:javascript
复制
while nbit(TIM1_SR1,CC3IF) asm("wfe");

即拆卸为:

代码语言:javascript
复制
000035    720252B602     BTJT      TIM1_SR1, #1, 0xB6
00003A    728F           WFE

事件具有概率性质,此代码不保证在执行WFE指令之后会发生这种情况:

  • BTJT教学周期2个周期,长5;
  • 从RAM执行的代码可能不是连续的,因为“获取”状态会在几个周期内暂停执行。

我使用手动PM0044,在第26页,它包含了漂亮的表:

有2种情况下,代码执行停滞在3个周期。因此,我不确定我的异步唤醒事件不会发生在BTJT和WFE指令之间。

是否有办法确保严格的逻辑顺序(检查条件> wfe >唤醒事件)?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-04-04 07:49:06

OP找到的解决方案:

我读过几次勘误表(感谢罗斯·里奇),这是我的主要想法: 一般的解决方案是确保在WFE指令执行或重新执行周期中,通过适当的应用程序定时来确保没有中断请求或事件发生。

票数 1
EN

Stack Overflow用户

发布于 2016-04-04 21:26:06

如果您的锁问题是由我提到的WFE勘误表引起的,那么应该有一个比尝试实现“适当的应用程序时间”更容易的解决方案。

STMicroelectronics提供的errata的内容如下:

可能会发生两种类型的故障: 案例1: 如果将WFE指令放置在内存中32位字的两个MSB中,则在WFE执行周期或重新执行周期(从ISR处理程序返回时)发生的事件将导致不正确的代码执行。 案例2: 在WFE执行周期中发生的中断请求将导致不正确的代码执行。这对于WFE重新执行周期也是有效的,同时从ISR处理程序返回。

案例2不适用于您的情况,因为您说“中断不被处理,因为我使用低功耗运行模式”。如果在WFE指令期间不能发生中断,则只有第一种情况中描述的故障才可能导致您的锁定。

案例1只适用于WFE指令在内存中32位字内的某种对齐方式。因此,如果您能够确保WFE指令不会以这种方式出现在代码中,那么您就不会遇到此失败。如果您的汇编程序支持一个对齐指令,您可以使用它来实现这一点,如果汇编程序没有插入NOPs,则可能与标签和跳转一起使用。然而,在勘误表中,作为一种“专门的解决办法”,提供了一个更简单的解决方案:

将WFE指令替换为 下一个是WFE JRA:

这似乎是通过在WFE指令之后放置相当于2字节NOP的值来解决故障。我的猜测是,失败导致CPU没有立即执行WFE指令,而是在下一个32位世界的开始跳过两个字节到指令(如果有的话)。在跳过的空格中放置一个2字节的NOP意味着故障是否发生并不重要。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36377047

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档