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压入堆栈。






审核编辑:刘清

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

    关注

    31

    文章

    5388

    浏览量

    121751
  • SCR
    SCR
    +关注

    关注

    2

    文章

    150

    浏览量

    44418
  • 中断处理
    +关注

    关注

    0

    文章

    94

    浏览量

    11047
  • FPU
    FPU
    +关注

    关注

    0

    文章

    42

    浏览量

    21444
  • Cortex-M
    +关注

    关注

    2

    文章

    229

    浏览量

    29918

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

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

收藏 人收藏

    相关推荐

    为什么说Cortex-M是低功耗应用的首选

    虽然Cortex-M处理器家族目标瞄准效能光谱较低端的区域,但是和大多数微控制器(MCU)采用的其他典型处理器相比,Cortex-M的效能依然算相当强悍。举例来说,像是许多高效能微控制器所采用的Cortex-M4与
    发表于 07-28 09:44 3551次阅读
    为什么说<b class='flag-5'>Cortex-M</b>是低功耗应用的首选

    你总得知道你为什么要用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

    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

    Atmel Studio 6软件中如何调试ARM Cortex-M

    Atmel Studio 6软件中如何调试ARM Cortex-M
    的头像 发表于 07-04 10:49 4315次阅读

    关于STM32和Cortex-M内核系列介绍(1)

    Cortex-M内核系列和STM32-讲座
    的头像 发表于 07-05 01:07 8165次阅读

    关于STM32与Cortex-M内核系列的介绍(2)

    Cortex-M内核系列和STM32-讲座3
    的头像 发表于 07-05 00:45 4619次阅读

    关于Cortex-M 调试应用的介绍

    Cortex-M 调试应用
    的头像 发表于 07-10 00:56 2688次阅读

    米尔科技Cortex-M Prototyping System +介绍

    ARM® Cortex®-M原型系统 MPS2+,为Cortex-M 系列微处理器设计的原型验证评估系统,包含最新的Cortex-M7 及Corte
    的头像 发表于 11-14 10:45 2023次阅读
    米尔科技<b class='flag-5'>Cortex-M</b> Prototyping System +介绍

    Cortex-M内核的MPU内存保护单元

    讲讲Cortex-M内核的MPU内存保护单元
    的头像 发表于 03-04 11:17 3788次阅读
    <b class='flag-5'>Cortex-M</b>内核的MPU内存保护单元

    Cortex-M可以跑Linux操作系统吗?

    Cortex-M可以跑Linux操作系统吗?
    发表于 12-01 11:36 2次下载
    <b class='flag-5'>Cortex-M</b>可以跑Linux操作系统吗?

    no cortex-m sw device found 问题解决【转】

    no cortex-m sw device found 问题解决【转】
    发表于 12-02 17:36 33次下载
    no <b class='flag-5'>cortex-m</b> sw device found 问题解决【转】

    Cortex-M位带操作的原理

    Cortex-M位带操作的原理
    的头像 发表于 10-24 15:27 964次阅读
    <b class='flag-5'>Cortex-M</b>位带操作的原理

    如何使用Keil打开GD32 FPU及使用ARM DSP库 ?

    GD32目前支持ARM Cortex-M和RISC-V两种内核系列芯片,其中Cortex-M内核已经支持的有M3、M4、M23、
    的头像 发表于 01-13 09:42 4082次阅读
    如何使用Keil打开GD32 <b class='flag-5'>FPU</b>及使用ARM DSP库 ?