Cortex-M FPU的Lazy Stacking机制

14 篇文章 3 订阅
订阅专栏

By: Ailson Jack
Date: 2020.08.15
个人博客:http://www.only2fire.com/
本文在我博客的地址是: http://www.only2fire.com/archives/121.html,排版更好,便于学习,也可以去我博客逛逛,兴许有你想要的内容呢。

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~S15FPSCR)压入预留的存储空间中。

    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,打开自动状态保存。

如果用到FPUCONTROL.FPCA位自动置1。如果响应中断时,CONTROL.FPCA1,处理器在堆栈中预留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,其示意图如下所示:

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

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

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

如果这篇文章对你有帮助,记得点赞和关注博主就行了^_^。

排版更好的内容见我博客的地址: http://www.only2fire.com/archives/121.html
注:转载请注明出处,谢谢!^_^

第3章第5节:使用LazyVStack惰性加载垂直堆栈 [SwiftUI快速入门到实战]
互动教程网[www.hdjc8.com]
09-04 544
VStack和HStack会预先加载所有内容, 如果要延迟加载内容,也就是仅当滚动到视图时,才显示相应的内容,则应当使用LazyVStackLazyHStack。 首先定义一个结构体,作为LazyVStack里的元素的类型,它拥有一个整型属性,作为元素的标识符。 接着添加一个初始化方法。 当该视图被初始化时,在控制台输出视图的标识符。 然后实现视图的主体属性,用来显示一行文字内容。 继续定义一个结构体,作为LazyVStack里的section的header。 实现..
基于STM32F767的UCOSIII移植学习
weixin_44366217的博客
11-04 1620
(一)移植前的准备 1.HAL库基本工程模板 新建一个工程模块,其中包含LED驱动和串口驱动程序即可,用于验证UCOS-III系统能够正常工作。 2.UCOS-III源码准备
LazyStackLazyStack
02-13
LazyStack是一个由几个书呆子组成的激情项目。 我们喜欢生成的代码,但不喜欢现有低代码平台的定价模型(或被锁定在其生态系统中)。 这使我们问:“如果仅使用云提供商的“自由层”来部署整个应用程序该怎么办?”。 这样,您可以在投入大量资金之前向投资者证明收入。 幸运的是,Microsoft .Net和C#几乎提供了我们所需要的一切……如果只有一种方法可以将其连接到无可争议的云之王:AWS。 输入“ LazyStack”,这是我们的一站式C#前端/ AWS后端解决方案商店。 只需单击一下,即可安装我们的免费Visual Studio扩展和跨越月的开发。 LazyStack库 此存储库包含许多MIT开源许可的库和工具,这些库和工具支持LazyStack生成的堆栈。 但是,我们的目的是确保即使您没有使用LazyStack生成堆栈,这些库也很有用。 LazyStackAuth-支持AWS Co
Cortex-M4 异常模型(Exception Model)与NVIC(Nested Vectored Interrupt Controller)杂记
Frankenstien_的博客
12-20 2344
NVIC与CPU的关系: NVIC嵌入Cortex-M处理器内,两者可以并行处理很多异常响应任务。 “异常”类型: 复位(Reset)、不可屏蔽中断(NonMaskable Interrupt, NMI)、硬件故障(Hard Fault)、存储管理故障(Memory Management Fault)、总线故障(Bus Fault)、使用故障(Usage Fault)、监管者...
STM32F407使用浮点数进入hardfault
zhanlve2的博客
12-28 1784
STM32F407使用浮点数进入hardfault
第二章 CortexM3/M4基础
weixin_42215853的博客
02-18 2912
第二章 CortexM3/M4基础前言2.1 Cortex-M3/M4通用寄存器2.1.1 通用寄存器1. 通用目的寄存器 R0-R121. 功能寄存器 R13-R152.1.2 特殊功能寄存器组1 状态字寄存器S(三合一)(xPSR):2 中断屏蔽寄存器S3 控制寄存器(CONTROL)2.2操作模式和特权级别2.3 FPU单元2.3.1 FPU寄存器2.3.2 Lazy Stacking2.4 堆栈2.4.1 Cortex-M3/M4堆栈操作2.4.2 双堆栈机制2.4.3 Stack frame
如何在 arm 官网上找到合适的手册
weixin_30364147的博客
07-31 3958
http://infocenter.arm.com/help/advanced/help.jsp 在这里输入合适的版号即可 这样就可以不用去 CSDN 了 100000_0000_00_EN - ARM CoreLink DMC-520 Dynamic Memory Controller Technical Reference Manual100000_...
基于STM32的简易RT0S分析-任务切换实例分析
单片机开发
03-05 1090
手上没有使用Cortex-M3内核的芯片,只有一个STM32F407VG的Discovery开发版,这款芯片使用的是Cortex-M4F的内核,这个内核是基于ARMV7E-M架构的与Cortex-M3十分类似,只是多了一个FPU(浮点运算单元)以及浮点运算需要的相关寄存器。也因为这个FPU导致进入中断的时候保存的寄存器有些差别,不过这些堆栈都是硬件自动保存的,对编写任务切换代码没有影响,在文章的最后来简单分析下浮点寄存器如何入栈。这篇文章的思路参考了《一步步写STM32 OS【三】PendSV与堆栈操作》
STM32F4 UCOS开发手册
05-10
2.3.2 **Lazy Stacking**:这是一种优化技术,当进入中断时,FPU的状态可能延迟保存,直到真正需要时才执行,以提高效率。 2.4 **堆栈**:Cortex-M3/M4使用堆栈来存储函数调用的返回地址和局部变量。 2.4.1 **...
STM32F4 UCOS开发手册V3.0最新版
12-23
- 包括FPU寄存器和Lazy Stacking机制。 4. **堆栈**: - 堆栈是内存区域,用于保存临时数据和函数调用时的上下文信息。 - Cortex-M4支持双堆栈机制,可以在不同模式下使用不同的堆栈。 5. **SVC和PendSV异常**...
GD32F30x Keil 环境下在 FreeRTOS 任务中使用浮点运算报 HardFault 异常的问题(二)
专注于 IOT 物联网的嵌入式研发
02-09 5655
示例工程代码库地址如下: Gitee Git 1 问题描述 1. 1 环境 类别 版本 系统 WIN10 Keil Keil MDK 5.15.0 开发板 星空派GD32F303开发板 GD32F30x 固件库 V2.1.2 GD32F30x Keil 5 支持包 V2.1.0 FreeRTOS V10.4.3-LTS-Patch-2 1. 2 问题 书接上回《FreeRTOS 任务中使用浮点运算报 HardFault 异常的问题(一)》 上回只描述了问题的表象,
FreeRTOS 任务创建和调度器开启
最新发布
Calmer_的博客
02-29 1026
答案是为了隔离OS和应用程序,程序的运行少不了堆栈,因为我们CPU只有少量的通用寄存器,当我们使用的临时变量比较多得时候,就需要将这些临时变量存储到堆栈里,而堆栈的push和pop都是通过SP来实现的,所以通过MSP和PSP就能实现OS内核与应用程序的隔离,应用程序task用PSP,而OS用MSP,这样会非常安全。现在来看(1)、(2)、(3)这三步起始就是为了获取MSP的初始值。(7)和(8)、数据同步和指令同步屏障,这两个指令的详细内容请参考《权威指南》的“第 5章 指令集”的 5.6.13 小节。
Cortex-M系列处理器偶发死机定位方法
fedorayang的专栏
11-06 3459
处理器偶发死机时有发生,让人头疼,不知道如何下手,因为没有打印,不知道如何定位。现在介绍一种方法,不管使用什么开发环境keil,iar,gcc等,不管使用什么系列的处理器M1,M4,M7等,原理上都是一样的。现在用STM32F407处理器,keil开发环境为例介绍。主要方法是:使用Jlink命令行工具对发生死机的设备读取寄存器和内存,根据反汇编定位问题。
揭秘被Arm编译器所隐藏的浮点运算~
06-04 998
引言笔者接触嵌入式领域软件开发以来,几乎用的都是 ARM Cortex-M 内核系列的微控制器。感谢C语言编译器的存在,让我不用接触汇编即可进行开发,但是彷佛也错过了一些风景,没有领域到编...
ARM Cortex-M 系列 1 -- Cortex-M0, M3, M4, M7, M33, M35P 差异】
热门推荐
CodingCos的博客
07-18 2万+
Cortex-M0 是 ARM 公司推出的一款微控制器(MCU)核心。这个核心是基于ARMv6-M架构设计的,只支持 56 条指令的小指令集,大部分指令是 16 位指令, 是 ARM Cortex-M 系列中的入门级产品。Cortex-M0 的设计目标是提供一种低成本、低功耗的解决方案,适用于简单的微控制器应用。它的特点包括:小型和低功耗:Cortex-M0 的硬件设计非常紧凑,消耗的功率也非常低,这使得它非常适合在功率和空间受限的应用中使用。简单的指令集:Cortex-M0 使用的是。
STM32F103C8T6移植uCOS基于HAL库
qq_53329531的博客
11-29 380
文章目录1,下载uCOSIII源码2,使用CubeMX建立HAL库3,文件设置4,实验结果5,总结6,参考 1,下载uCOSIII源码 两种途径 1,官网下载 2,百度网盘提取,提取码1234 2,使用CubeMX建立HAL库 老规矩,还是先配置RCC和SYS 设置PC13为GPIO_Output用于点亮LED灯 再设置USART 然后保存就OK了 3,文件设置 1,先在uC-BSP文件夹新建bsp.c和bsp.h文件 然后给文件夹uC-CONFIG复制以下文件 再将这五个文件复制到我们的项目目录
keil+stm32cubemx创建STM32F767芯片的uCOSIII工程
Ningjianwen的专栏
05-15 3266
使用该种方式,能够去除繁琐的添加库文件与添加头文件路径,大大简化了ucos的移植。 1.在keil安装ucos-iii:点击pack Installer按钮,在弹出的 窗口中找到Pack页面下的Micrium::RTOS,如下图所示 2. 使用Project->new uVision Project创建工程,设置工程名字,保存工程路径后选择芯片型号。 3.接下来在Manag...
NRF52832 SDK15.3 FPU功能配置
mygod2008ok的专栏
04-05 1181
keil中配置 在sdk_config.h中配置 // <q> NRF_PWR_MGMT_CONFIG_FPU_SUPPORT_ENABLED - Enables FPU event cleaning. #ifndef NRF_PWR_MGMT_CONFIG_FPU_SUPPORT_ENABLED #define NRF_PWR_MGMT_CONFIG_F...
ARM Cortex-M23与Cortex-M33处理器技术介绍
"本文档是关于ARM Cortex-M23和Cortex-M33处理器的技术介绍,涵盖了它们在ARMv8-M架构中的TrustZone技术。文档由ARMLimited或其关联公司于2016年发布,主要作者包括Tim Menasveta、Diya Soubra和Joseph Yiu。本文档...
写文章

热门文章

  • PDF文档无法注释或高亮的解决办法 59951
  • Linux命令-查看用户的UID和GID 53403
  • IIC 时钟频率与数据传输速率的理解 40011
  • Sublime Text3解决There are no packages available for installation问题 39181
  • Vs Code使用 - 搭建python运行调试环境 30118

分类专栏

  • ARM
  • ARMv7-A 那些事 7篇
  • ARM11 3篇
  • ARM汇编 2篇
  • Linux内核与驱动
  • Linux MMC子系统 6篇
  • Linux驱动 5篇
  • C/C++ 9篇
  • 嵌入式学习 14篇
  • 嵌入式驱动 3篇
  • Zephyr 3篇
  • git 2篇
  • Linux 21篇
  • Linux内核完全注释 阅读笔记 11篇
  • 实用技巧 30篇
  • 8086汇编 2篇

最新评论

  • JLink V9掉固件修复(灯不亮)

    ID7729: 确实有用,帮公司省了一百块

  • 嵌入式开发利器 - 寄存器查看器(RegisterMaster)

    轩逸: 64位寄存器查看小工具

  • C语言-const char*,char const*,char *const理解

    2301_80934069: 谢谢!让我理解的很清楚表情包

  • JLink V9掉固件修复(灯不亮)

    小菜电子: 感谢 有用

  • Windows - ARP 项添加失败 拒绝访问

    月球挖掘机: 好用,我用完后没有注意,此后每次开机都要手动arp -d * 才能上网。

大家在看

  • java计算机毕业设计资产管理(开题+程序+论文)
  • Linux操作基础
  • 最新必应Bing开户条件、流程及注意事项介绍
  • java计算机毕业设计智慧城市水表计量控制系统定制(开题+程序+论文)
  • 常用的10款文件加密软件分享|2024办公文件怎么加密?赶快码住!

最新文章

  • Linux MMC子系统 - 6.eMMC 5.1工作模式-设备识别模式
  • Linux MMC子系统 - 5.eMMC 5.1工作模式-引导模式
  • Linux MMC子系统 - 4.eMMC 5.1常用命令说明(2)
2023年15篇
2022年8篇
2021年15篇
2020年16篇
2019年19篇
2018年26篇
2016年31篇
2014年6篇

目录

目录

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

jackailson

你的鼓励是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或 充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

玻璃钢生产厂家山东济南玻璃钢卡通雕塑制作玻璃钢农耕人物雕塑玻璃钢动物雕塑维护透明玻璃钢雕塑制作方法玻璃钢雕塑厂家价格湖南玻璃钢卡通雕塑设计及定制苏州玻璃钢花盆研发公司江西景区玻璃钢雕塑销售厂家广东商业商场美陈哪家好三门峡玻璃钢雕塑雕刻厂家电话大熊猫商场美陈枣庄玻璃钢花盆动物玻璃钢雕塑制造商主题公园玻璃钢美陈雕塑深圳中庭商场美陈销售玻璃钢蓝精灵雕塑直销小丑商场美陈商场气球美陈 行业前景扬州玻璃钢雕塑厂询问报价普洱玻璃钢雕塑设计多少钱淮南佛像玻璃钢雕塑市场六安个性化玻璃钢雕塑销售厂家高品质的玻璃钢雕塑造型商城玻璃钢雕塑费用石家庄农耕文化玻璃钢人物雕塑商场做美陈的目的邢台南瓜玻璃钢雕塑中秋商场橱窗美陈彩色玻璃钢花盆造型云南抽象玻璃钢雕塑供应商香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声单亲妈妈陷入热恋 14岁儿子报警汪小菲曝离婚始末遭遇山火的松茸之乡雅江山火三名扑火人员牺牲系谣言何赛飞追着代拍打萧美琴窜访捷克 外交部回应卫健委通报少年有偿捐血浆16次猝死手机成瘾是影响睡眠质量重要因素高校汽车撞人致3死16伤 司机系学生315晚会后胖东来又人满为患了小米汽车超级工厂正式揭幕中国拥有亿元资产的家庭达13.3万户周杰伦一审败诉网易男孩8年未见母亲被告知被遗忘许家印被限制高消费饲养员用铁锨驱打大熊猫被辞退男子被猫抓伤后确诊“猫抓病”特朗普无法缴纳4.54亿美元罚金倪萍分享减重40斤方法联合利华开始重组张家界的山上“长”满了韩国人?张立群任西安交通大学校长杨倩无缘巴黎奥运“重生之我在北大当嫡校长”黑马情侣提车了专访95后高颜值猪保姆考生莫言也上北大硕士复试名单了网友洛杉矶偶遇贾玲专家建议不必谈骨泥色变沉迷短剧的人就像掉进了杀猪盘奥巴马现身唐宁街 黑色着装引猜测七年后宇文玥被薅头发捞上岸事业单位女子向同事水杯投不明物质凯特王妃现身!外出购物视频曝光河南驻马店通报西平中学跳楼事件王树国卸任西安交大校长 师生送别恒大被罚41.75亿到底怎么缴男子被流浪猫绊倒 投喂者赔24万房客欠租失踪 房东直发愁西双版纳热带植物园回应蜉蝣大爆发钱人豪晒法院裁定实锤抄袭外国人感慨凌晨的中国很安全胖东来员工每周单休无小长假白宫:哈马斯三号人物被杀测试车高速逃费 小米:已补缴老人退休金被冒领16年 金额超20万

玻璃钢生产厂家 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化