Cortex-M4之FPU单元

最近在学习实时操作系统,以下是我对学习实时操作系统过程中做的一些笔记。

一、FPU单元

在 Coretex-M4 处理器中有一个可选的单精度 FPU 单元,一般 STM32F429 就有 FPU 单元, 如果使能了 FPU 单元的话就可以使用它来对单精度浮点数进行计算, 双精度浮点数的计算仍然要使用到 C 运行库。

二、FPU寄存器

FPU 单元包含一系列的寄存器:
1、 CPACR 寄存器,在 SCB 块中
2、 浮点寄存器块, S0-S31
3、FPU 状态和控制寄存器: FPSCR
4、 其他的一些 FPU 寄存器

(1)CPACR寄存器

可以使能 FPU, CPACR 寄存器的地址为 0XE000ED88,我们也可以通过“SCB->CPACR”来访问 CPACR 寄存器, CPACR 寄存器的 bit0-bit19 和 bit24-bit31 不允许使用,为保留位,其中[20:21]为 CP10, [22:23]为 CP11。 我们通过设置 CP10 和 CP11 来开启 FPU,CP10 和 CP11 设置情况如表 2.2.1 所示,注意 CP10 和 CP11 都为 2bit

 默认情况下 CP10 和 CP11 都为 00,如果要使用 FPU 的话需要软件设置 CPACR 来开启FPU,通过设置 CP10 和 CP11 都为 11 来开启,实例代码如下:

SCB->CPACR|=0X00F00000; //使能 FPU

 (2)浮点寄存器块

浮点寄存器快包含 32 个 32 位的寄存器,这 32 个寄存器可以两两组合成一个 64 位的双精度寄存器,如图 所示。

说明:S0-S15 是 caller-saved 寄存器,如果一个应用 A 调用了另外一个应用 B,那么应用 A 在调
用 B 之前一定要保存这些寄存器
,因为在调用的时候这些寄存器会被改变。

S16-S31 被称callee-saved 寄存器,如果一个应用 A 调用应用 B,而且 B 需要大于 16 个寄存器来做计算,那么应用 B 就需要保存这些寄存器。并且在返回应用 A 的时候必须恢复这些寄存器。

三、Lazy Stacking 

对于 Cortex-M4 来说 Lazy Stacking 是一个重要的特性, 在使用 FPU 的情况下,不使用这个特性会在异常处理的时候消耗 29 个时钟周期, 因为要将 25 个寄存器压栈,以前只需要将 8个压栈。

如果使用 Lazy Stacking 这个特性的话,那么在异常处理的时候只需要消耗 12 个时钟周期, 默认情况下 Lazy Stacking 是使能的。 可以看出如果在任务切换中使用 Cortex-M4 的这个特性将会极大的提高任务切换的速度

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

小小_扫地僧

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

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

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

打赏作者

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

抵扣说明:

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

余额充值