解决ucosIII在stm32F429上移植后FPU使用问题
5星 · 超过95%的资源 需积分: 10 89 浏览量
更新于2024-09-10
1
收藏 729KB DOCX 举报
本文档主要介绍了如何在STM32F429微控制器上移植并优化uCosIII操作系统以支持浮点运算单元(FPU)。在移植过程中遇到了使用printf函数处理浮点数时导致系统死机的问题,通过检查和修改官方工程中的相关代码,成功解决了该问题。
在STM32F4系列微控制器中,浮点运算单元(FPU)可以显著提高浮点计算性能。为了启用FPU,我们需要在编译时添加特定的宏定义。首先,确认`__FPU_PRESENT`宏定义为1,这表示微控制器包含FPU硬件。对于涉及浮点运算的库,如ARM的数学库,需要添加`ARM_MATH_CM4`宏定义,表明我们正在使用的是针对Cortex-M4处理器的库。
在MDK(Keil uVision)的项目设置中,需要确保这些宏定义被正确地添加到预处理器选项中。这样,编译器会生成使用FPU的指令,并且链接器会链接相应的库。
在uCosIII移植过程中,关键的修改在于`os_cpu_c.c`的`OSTaskStkInit`函数和汇编语言文件`os_cpu_a.asm`中的`OS_CPU_PendSVHandler`函数。`OSTaskStkInit`函数负责任务栈的初始化,当启用FPU时,需要为FPU寄存器分配栈空间。在修改后的代码中,增加了一段条件编译,只有当`OS_CPU_ARM_FP_EN`宏定义为`DEF_ENABLED`时,才会在栈中预留空间给FPU的S16-S31寄存器。
`OS_CPU_PendSVHandler`函数是用于上下文切换的关键部分。在处理浮点上下文切换时,需要保存和恢复FPU寄存器。在修改后的`OS_CPU_PendSVHandler`中,增加了对FPU寄存器的保存和恢复操作。如果处理器状态指示FPU被激活,那么就会执行相应的VSTMDB和VLDMIA指令来保存和恢复浮点寄存器。
`OS_CPU_PendSVHandler_nosave`函数则是在没有FPU上下文切换时调用的,它只执行基本的任务切换操作。在这个函数中,没有涉及到FPU寄存器的处理,因为不涉及浮点上下文的切换。
通过以上修改,uCosIII就能正确地处理浮点数,并在任务切换时正确管理FPU寄存器,从而避免了使用printf函数处理浮点数时出现的死机问题。这使得STM32F429在运行uCosIII时能够充分利用其硬件FPU的优势,提高了浮点运算的效率。
2019-04-04 上传
2021-07-26 上传
2022-11-28 上传
2017-09-27 上传
2021-09-11 上传
2017-08-18 上传
2022-12-15 上传
linxiaobo110
- 粉丝: 123
- 资源: 9
最新资源
- 探索AVL树算法:以Faculdade Senac Porto Alegre实践为例
- 小学语文教学新工具:创新黑板设计解析
- Minecraft服务器管理新插件ServerForms发布
- MATLAB基因网络模型代码实现及开源分享
- 全方位技术项目源码合集:***报名系统
- Phalcon框架实战案例分析
- MATLAB与Python结合实现短期电力负荷预测的DAT300项目解析
- 市场营销教学专用查询装置设计方案
- 随身WiFi高通210 MS8909设备的Root引导文件破解攻略
- 实现服务器端级联:modella与leveldb适配器的应用
- Oracle Linux安装必备依赖包清单与步骤
- Shyer项目:寻找喜欢的聊天伙伴
- MEAN堆栈入门项目: postings-app
- 在线WPS办公功能全接触及应用示例
- 新型带储订盒订书机设计文档
- VB多媒体教学演示系统源代码及技术项目资源大全