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,其示意图如下所示:
snipaste_2020-04-10_11-46-40
(2).被中断的程序用到了fpu,中断程序中没有使用到fpu,其示意图如下所示:
snipaste_2020-04-10_12-38-54
(3).被中断的程序和中断程序中都用到了fpu,其示意图如下所示:
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压入堆栈。
索尼宣布收购游戏公司Insomniac,将接管多款AR/VR游戏
爱立信预测到2024年底全球增强型移动宽带用户将增加4亿
单相正弦波脉宽调制变频调速原理框图
安富利推出带IBM Watson IoT连接的MicroZed IIoT入门级套件,仅售$299
中国晶圆厂步入调整期 紫光集团股权转移调整
浅析Cortex-M FPU的Lazy Stacking机制
NI LabVIEW2010 优化编译器,加速代码执行
使用外测液位计测量球罐石油液化气液位
基于TMS320LF2407A数字信号处理器实现逆变器并联运行控制器的设计
物联网有哪些操作系统?物联网操作系统汇总
特朗普打击中国技术投资,半导体遭殃!
力士乐二通流量阀的技术特征是怎样的
分析电子火折子的电路原理
准同步的功率集成电路ICE2QR0665的性能特点及应用
砷化镓+ Si混合可编程线性霍尔IC-GS302SA-3产品说明
LED制造的难处
小米秋季新品发布会上的新品有哪些亮点
智能MEMS麦克风市场快速崛起
小米6强势狙击,小米5C背后补刀,苹果、华为要做好准备了
欧司朗正在开发第二代Eviyos 用户可以将多个Eviyos组合应用