最近在学习实时操作系统,以下是我对学习实时操作系统过程中做的一些笔记。
一、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 的这个特性将会极大的提高任务切换的速度。