0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

浅析Cortex-M FPU的Lazy Stacking机制

嵌入式那些事 来源:嵌入式那些事 2023-10-16 09:58 次阅读

1.浮点运算指令

浮点运算指令用于FPU单元的单精度浮点运算。浮点运算指令都是用V开头的汇编指令。

只有在FPU开启的状态下,才能运行这些指令。

如果在FPU没有开启的状态下,执行了浮点运算指令,系统会产生一个硬fault异常。

2.为什么FPU需要Lazy Stacking

当Cortex-M系列的芯片多了对浮点运算的支持之后,在中断响应和退出时会增加对FPU扩展寄存器的保护。

入栈浮点寄存器组所带来的影响有如下几方面:

a.增加stack frame所占的存储区域;

b.增加中断响应延迟;

c.在OS环境下,增加上下文切换时间;

为了减少中断响应延迟和OS环境下的上下文切换时间,引入了FPU的Lazy Stacking机制。

3.FPU Lazy Stacking简述

Lazy Stacking机制在下面的情况下,会跳过对浮点寄存器组的入栈操作(仅预留浮点寄存器组S0~S15和FPSCR的存储空间),以避免中断延迟的增加:

a.中断处理函数不使用FPU;

b.被中断的程序未曾用到FPU;

被中断函数使用了FPU,如果在执行中断处理函数时也用到了FPU,在执行到中断函数的第一条浮点指令时,内核会暂停,然后硬件自动将先前的浮点寄存器内容(S0~S15,FPSCR)压入预留的存储空间中。

Lazy Stacking是可以通过软件使能和关闭的,如下述操作:

a.使能Lazy Stacking必须同时置位FPCCR寄存器的LSPEN位和ASPEN位;

b.清除FPCCR寄存器的LSPEN位可以关闭Lazy Stacking;

关于FPCCR寄存器的LSPEN位和ASPEN位的组合情况有如下说明:

FPCCR.ASPEN FPCCR.LSPEN 说明
0 0 取消自动状态保存。中断响应时不入栈FPU寄存器。
应用场景:
1. 应用中没有用到OS或者多任务调度,如果没有任何中断异常用到FPU。
2. 在应用程序代码中只有一个中断用到FPU。如果有多个中断用到FPU,那么中断嵌套必须被禁止。可以通过把所有的中断优先级设置位相同优先级实现。
1 0 关闭Lazy Stacking,仅打开自动状态保存。
如果用到FPU,CONTROL.FPCA位自动置1。中断响应时,硬件自动入栈S0~S15和FPSCR寄存器。
1 1 打开Lazy Stacking,打开自动状态保存。
如果用到FPU,CONTROL.FPCA位自动置1。如果响应中断时,CONTROL.FPCA为1,处理器在堆栈中预留FPU寄存器的空间,同时将FPCCR.LSPACT位置1。但是PFU寄存器并没有马上入栈,直到在中断处理函数中用到FPU时再入栈。
0 1 非法配置

4.FPU Lazy Stacking用到的几个重要标志

浮点寄存器入栈和出栈过程中用到的标志位:

标志位 说明
CONTROL.FPCA 0 = 当前上下文中没有用到FPU
1 = 当前上下文中用到FPU
这里的上下文,即表示普通的任务上下文,也表示中断上下文。
FPCCR.LSPACT 0 = 退出Lazy状态(实际入栈后被硬件清零或者中断返回时硬件清零)
1 = 进入Lazy状态(栈帧中预留了FPU寄存器的空间,但没有实际入栈)
EXC_RETURN[4] 0 = 栈帧中包括了FPU寄存器空间
1 = 栈帧中不包括FPU寄存器空间

5.FPU Lazy Stacking使用实例

下面的例子都是在使能了FPU的Lazy Stacking机制下进行说明的。

(1).被中断的程序和中断程序中都没有使用到FPU,其示意图如下所示:

7f2ac6e6-6a67-11ee-939d-92fbcf53809c.png

Snipaste_2020-04-10_11-46-40

(2).被中断的程序用到了FPU,中断程序中没有使用到FPU,其示意图如下所示:

7f438bf4-6a67-11ee-939d-92fbcf53809c.png

Snipaste_2020-04-10_12-38-54

(3).被中断的程序和中断程序中都用到了FPU,其示意图如下所示:

7f5a885e-6a67-11ee-939d-92fbcf53809c.png

Snipaste_2020-04-10_14-05-19

6.RTOS使用Lazy Stacking

首先肯定是要使能FPU的Lazy Stacking,然后在PendSV切换任务的时候做下面的处理:

(1).上文保存阶段:检测 EXC_RETURN 的 bit4(通过LR访问),如果该位为零,就入栈剩下的S16-S31 即可;如果该位为 1,则无需保存 FPU 寄存器,因为该任务未曾使用过 FPU。当然了这里有一个标志数据,表示当前任务是否使用了FPU,便于下次任务恢复时,确定是否需要从堆栈弹出内容到S16-S31。标志数据也压入当前任务的堆栈进行保存。

(2).下文恢复阶段:从堆栈中弹出标志数据,判断待恢复的任务是否使用了FPU,如果使用了FPU,那么从堆栈中弹出内容到S16-S31;如果没有使用FPU,则不需要恢复FPU寄存器。接下来需要修改当前LR寄存器的内容,如果使用了FPU,LR(EXC_RETURN)的bit4需要清零,来保证在退出PendSV时将先前压入该任务堆栈的S0-S15和FPSCR寄存器出栈;如果没有使用FPU,LR(EXC_RETURN)的bit4需要置1,来告诉CPU该任务栈帧中不包括FPU寄存器内容,不需要进行出栈操作。

对于S0-S15和FPSCR寄存器,如果任务使用了FPU,在进入到PendSV之前,就在任务堆栈中预留了存储空间,当执行上文保存阶段的S16-S31的入栈操作时,会首先将S0-S15和FPSCR寄存器压入先前堆栈预留的存储空间中,接着再将S16-S31压入堆栈。






审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 寄存器
    +关注

    关注

    30

    文章

    5028

    浏览量

    117723
  • SCR
    SCR
    +关注

    关注

    2

    文章

    131

    浏览量

    43682
  • 中断处理
    +关注

    关注

    0

    文章

    92

    浏览量

    10890
  • FPU
    FPU
    +关注

    关注

    0

    文章

    38

    浏览量

    20993
  • Cortex-M
    +关注

    关注

    2

    文章

    224

    浏览量

    29574

原文标题:Cortex-M FPU的Lazy Stacking机制

文章出处:【微信号:嵌入式那些事,微信公众号:嵌入式那些事】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    请问有谁知道CORTEX-M4的FPU单元应用有哪些吗?

    之一就是M4带一个单精度浮点运算单元(PFU)。本文就FPU单元进行一个简单介绍,帮助工程师更快的理解FPU单元。Cortext-M系列内核的指令集从ARM公司发布的白皮书看,
    发表于 06-07 08:22

    你总得知道你为什么要用Cortex-M

    你总得知道你为什么要用Cortex-M无论您是资深嵌入式工程师,还是怀着满满好奇的嵌入式小白,总会有这样的一些疑惑:Cortx-A、R、M到底什么区别呢?M0、M0+、
    发表于 06-09 16:50

    PIC32MK FPU与上下文切换

    with the Cortex M4F, which gives three options: never, always, and lazy (where lazy means
    发表于 08-27 15:03

    如何选择正确的Cortex-M处理器?

    本文将通过比较Cortex-M系列处理器之间的产品特性,告诉你如何根据产品应用选择正确的Cortex-M处理器。同时也会详细地进行Cortex-M系列处理器的指令集和高级中断处理能力,以及 SoC
    发表于 10-22 08:16

    基于Cortex-M原型系统建立的Cortex-M3 DesignStart原型

    采用Cortex-M原型系统建立Cortex-M3 DesignStart原型为什么选择Cortex-M原型系统?
    发表于 02-01 06:56

    Cortex-M入门资料和书籍分享

    Cortex-M入门在网上看博客逛论坛也是能学到些东西的,但通常是知识点,不能构成知识面。书籍通常会系统性地讲述,通过书籍可以建立起知识面,只有建立起了知识面才算是掌握。推荐两本书:《ARM
    发表于 07-01 09:38

    ARM Cortex-M处理器详解 精选资料分享

    ARM Cortex-M处理器家族现在有8款处理器成员。在本文中,我们会比较Cortex-M系列处理器之间的产品特性,重点讲述如何根据产品应用选择正确的Cortex-M处理器。本文中会详细的对照
    发表于 07-16 07:57

    cortex-m系列正式发布的版本是

    cortex-m系列正式发布的版本是,一 Cortex-M0到Cortex-M0+TODO: ARM处理器家族Cortex-M0处理器于2009年发布,是一款具有开创性的产品,因其实第
    发表于 07-22 09:54

    cortex-m下各种微架构的区别是什么?

    cortex-m单片机在arm产品中的位置是哪里?cortex-m 单片机的类别有哪些?cortex-m下各种微架构的区别是什么?
    发表于 11-04 06:00

    Cortex-M处理器优化的代码

    生成针对Cortex-M处理器优化的代码。嵌入式编码®Support Package的ARM®的Cortex®-M处理器可以生成使用CMSIS库数学运算的优化代码。将此生成的代码用于ARM
    发表于 12-14 09:10

    ARM Cortex-M堆栈机制介绍

      大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家介绍的是ARM Cortex-M堆栈机制。  今天给大家分享的这篇依旧是2016年之前痞子衡写的技术文档,花了点时间重新编排了一下
    发表于 12-16 06:26

    ARM Cortex-M内核的相关资料推荐

      大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家介绍的是ARM Cortex-M功能模块,不过侧重点是三款安全特性处理器。  ARM Cortex-M处理器家族发展至今(2020),已有
    发表于 12-27 07:21

    Arm Cortex-M处理器—Cortex-M85介绍

    Arm发布了新一代的Cortex-M处理器,Cortex-M85。简单粗暴的打个比方:Cortex-M85 ≈ Cortex-M7TrustZoneHelium(
    发表于 07-15 14:59

    求助,是否有实现从Cortex-A到Cortex-M传输的示例源代码?

    我想通过DDR在Cortex-A7和Cortex-M4上实现相互交换大数据的程序。感谢以下 wiki 页面,我了解了使用 DDR 将大数据从 Cortex-M4 交换到 Cortex-
    发表于 01-17 08:32

    ARM Cortex-M处理器对比表

    Cortex-M处理器系列针对低成本、高能效的微控制器进行了优化。 这些处理器可以在各种应用中找到,包括物联网、工业和日常消费设备。 该处理器系列基于M-Profile架构,可为深度嵌入式系统提供低
    发表于 08-29 07:00