硬汉嵌入式论坛

 找回密码
 立即注册
查看: 6470|回复: 5
收起左侧

[FreeRTOS] H7使用freertos,configENABLE_FPU的意义

[复制链接]

59

主题

90

回帖

267

积分

高级会员

积分
267
发表于 2021-3-6 14:43:10 | 显示全部楼层 |阅读模式
大家好:
在H7中使用freertos时,有2个选项:
#define configENABLE_FPU                         1
#define configENABLE_MPU                         0


具体是指硬件FPU(MPU)还是软的呢?打开不打开有什么区别呢?

谢谢!

回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117512
QQ
发表于 2021-3-6 14:58:33 | 显示全部楼层
H7用不到configENABLE_FPU和configENABLE_MPU  

是给 ARMv8M架构新版准备的。

详情看此贴:https://www.freertos.org/2020/04 ... crocontrollers.html
回复

使用道具 举报

59

主题

90

回帖

267

积分

高级会员

积分
267
 楼主| 发表于 2021-3-8 16:53:05 | 显示全部楼层
eric2013 发表于 2021-3-6 14:58
H7用不到configENABLE_FPU和configENABLE_MPU  

是给 ARMv8M架构新版准备的。

硬汉见多识广,佩服
回复

使用道具 举报

10

主题

111

回帖

141

积分

初级会员

积分
141
发表于 2023-11-10 18:32:23 | 显示全部楼层
eric2013 发表于 2021-3-6 14:58
H7用不到configENABLE_FPU和configENABLE_MPU  

是给 ARMv8M架构新版准备的。

版主 我H7开启了浮点运算功能(编译器和单片机都开启了)移植FreeRTOS 也不需要把configENABLE_FPU设置为1吗?
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117512
QQ
发表于 2023-11-11 09:03:33 | 显示全部楼层
xy201207 发表于 2023-11-10 18:32
版主 我H7开启了浮点运算功能(编译器和单片机都开启了)移植FreeRTOS 也不需要把configENABLE_FPU设置为 ...

H7的那个port文件里面已经处理了。

不用设置,你可以多任务打印浮点运算结果,看看正常不。
回复

使用道具 举报

0

主题

1

回帖

1

积分

新手上路

积分
1
发表于 2025-7-28 02:17:56 | 显示全部楼层
xy201207 发表于 2023-11-10 18:32
版主 我H7开启了浮点运算功能(编译器和单片机都开启了)移植FreeRTOS 也不需要把configENABLE_FPU设置为 ...

惰性栈保存(Lazy Stacking)是 ARM Cortex-M 处理器(尤其是带 FPU 的 M4/M7)用于优化浮点寄存器保存和恢复的一种硬件特性,主要应用于中断或任务切换时的上下文保存。FreeRTOS 利用这一机制减少不必要的浮点寄存器操作,提升性能。

1. 核心思想
延迟保存:只有当任务真正使用 FPU 时,才保存其浮点寄存器(S0-S31),避免每次上下文切换都保存/恢复所有 FPU 寄存器。

硬件自动检测:通过检查 EXC_RETURN 和 FPCCR(浮点上下文控制寄存器)的 ASPEN/LSPEN 位,决定是否保存浮点状态。

2. 关键硬件机制
(1) EXC_RETURN 值
当异常(如 PendSV)退出时,处理器根据 EXC_RETURN 的值决定行为:

0xFFFFFFFD:返回线程模式并使用 PSP(进程栈指针),且不自动保存 FPU 寄存器(惰性保存)。

0xFFFFFFF1:返回 Handler 模式并使用 MSP(主栈指针)。

其他值可能触发自动 FPU 保存。

(2) FPCCR 寄存器
FPCCR(地址 0xE000EF34)控制浮点上下文的保存行为:

ASPEN (bit 31):自动状态保存使能。

LSPEN (bit 30):惰性保存使能。

FreeRTOS 默认设置 ASPEN=1 和 LSPEN=1,启用惰性保存。

3. FreeRTOS 中的实现
(1) 任务栈初始化
在 pxPortInitialiseStack 中,任务的初始 EXC_RETURN 被设为 0xFFFFFFFD,表示:

使用 PSP。

不自动保存 FPU 寄存器(除非任务实际使用 FPU)。

(2) 上下文切换(PendSV)
在 xPortPendSVHandler 中:

检查 LR(即 EXC_RETURN)的 bit 4:

若为 0,表示任务使用了 FPU,需手动保存 S16-S31(高部分寄存器)。

若为 1,跳过 FPU 保存。

恢复新任务时:

同样检查 EXC_RETURN,决定是否恢复 FPU 寄存器。

assembly
// PendSV 处理函数片段
tst r14, #0x10       // 检查 EXC_RETURN 的 bit4
it eq                // 如果为 0(使用了 FPU)
vstmdbeq r0!, {s16-s31} // 保存高 FPU 寄存器
(3) 首次使用 FPU 的陷阱
若任务首次使用 FPU 指令,但之前未保存 FPU 上下文,会触发 UsageFault。

FreeRTOS 的解决方案:

在任务创建时,默认不初始化 FPU 寄存器。

当任务首次使用 FPU 时,硬件自动保存必要寄存器到栈中。

4. 性能优势
减少不必要的保存/恢复:
如果任务未使用 FPU,则完全跳过 FPU 寄存器操作(节省时间和栈空间)。

动态适应:
只有实际使用 FPU 的任务才会触发保存,适合混合使用浮点和非浮点任务的场景。

5. 配置与注意事项
(1) 启用条件
需在编译时启用 FPU(如 -mfloat-abi=hard -mfpu=fpv4-sp-d16)。

FreeRTOS 中通过 portFPCCR 设置 ASPEN 和 LSPEN 位:

c
*(portFPCCR) |= portASPEN_AND_LSPEN_BITS; // 0x3 << 30
(2) 常见问题
栈溢出风险:
惰性保存可能导致任务栈需求动态增加,需确保栈足够大(尤其对浮点密集型任务)。

调试干扰:
某些调试器可能无法正确处理惰性保存,建议在调试时暂时禁用该特性。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-8-11 23:55 , Processed in 0.061325 second(s), 24 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表