首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么在Cortex-M FreeRTOS中WFI之后需要一个ISB?

为什么在Cortex-M FreeRTOS中WFI之后需要一个ISB?
EN

Stack Overflow用户
提问于 2017-10-30 19:00:07
回答 3查看 2.1K关注 0票数 3

当使用依赖WFI指令的无痒空闲功能时,我在FreeRTOS的Cortex-M端口中看到了以下行

代码语言:javascript
复制
__asm volatile( "dsb" );
__asm volatile( "wfi" );
__asm volatile( "isb" );

请参阅CM3/port.c#L530

我看到,根据ARM Cortex-M编程指南的内存障碍指令文件:“DSB应用于确保在执行WFI或WFE指令之前没有未完成的内存事务。”

但我很好奇为什么在这里有必要设立ISB?也许这可以确保从WFI中唤醒芯片的中断在可能处于流水线中的任何进一步指令之前立即执行?这是我最好的猜测,但我想听听其他的想法或确认。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-11-01 09:53:17

我相信ISB的目的是确保wfi指令的执行是“有条不紊的”,并且在它醒来之前没有任何指令被执行。尽管如此,我认为这并不是ARM文件所要求的。我怀疑这是皮带和支架的方法。

票数 3
EN

Stack Overflow用户

发布于 2020-01-24 20:40:47

ISB是在WFI之后添加的,因为程序员希望确保WFI应该在WFI之后的任何指令之前执行。ARM还具有A级核心,支持无序执行.如果我们运行以上的代码,删除ISB在无序的核心,那么下面的指令,WFI可能执行之前的WFI。

票数 0
EN

Stack Overflow用户

发布于 2017-10-31 13:40:05

ISB指令刷新管道并确保在执行新指令之前完成所有以前的指令。

从手臂皮层-M3指南。

DSB和ISB指令对于自修改代码非常重要.例如,如果一个程序更改了自己的程序代码,那么下一个执行的指令应该基于更新的程序。但是,由于处理器是流水线的,修改后的指令位置可能已经被获取。使用DSB和ISB可以确保再次获取修改后的程序代码。在结构上,应该在更新控制寄存器的值之后使用ISB指令。在Cortex-M3处理器中,这不是严格要求的。但是,如果您想确保您的应用程序是可移植的,您应该确保在更新后使用ISB指令来控制寄存器。

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

https://stackoverflow.com/questions/47022456

复制
相关文章

相似问题

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