STM32F4使用ucosii时操作浮点数卡死的问题 |
您所在的位置:网站首页 › stm32浮点运算设置 › STM32F4使用ucosii时操作浮点数卡死的问题 |
文章目录
一、BUG二、解决方案2.1方案一、字节对齐(M3)2.2方案二、暴力解决2.3方案三、FPU
一、BUG
之前使用STM32F401的单片机移植了ucosii操作系统后。在编写任务函数时,在循环中调用sprintf函数时莫名卡死。后来,查找bug后发现在操作浮点数时会莫名卡死,换成printf函数也是一样。最后得出一个结论:只要在任务主循环中使用浮点数就会出现卡死的bug。 二、解决方案 2.1方案一、字节对齐(M3) 遇到这个bug之后,第一时间去百度了。后来在网上找到了这篇文章 UCOS-II之字节对齐问题。虽然文章里面说的是M3的,但是试过之后也是一样,没有办法消除BUG。这个方法对M4没用,但对M3有用,如果M3移植ucosii遇到这种问题可以使用文章中更改字节对齐的办法。具体细节网上有很多,可以自行百度。 可以参考这个博客:https://blog.csdn.net/weixin_43548213/article/details/90449336 2.2方案二、暴力解决 在Floating Point Hardware的选项选择Not Used 当选择Not Used之后,编译器对浮点的处理用的是普通的MOV指令和Rn的寄存器来处理浮点数(R开头的据寄存器是内核的寄存器),选择这个是强行用CPU算。 如果选择Single Precision,编译器对浮点的处理会使用V指令和FPU浮点寄存器(S),由于OS未设置和操作FPU的浮点寄存器(没有在上下文切换的时候保存FPU寄存器),所以在运行OS时STM32进入硬件错误中断(HardFault_Handle)。但是在裸机的时候也使用了FPU寄存器来处理浮点数,并没有任何错误。 解决办法就是方案三,使用FPU。 方案三的办法是开启F4的FPU,如果不知道什么是FPU,可以自行百度。FPU简介-CSDN博客转载 可以参考这篇博客-STM32F4之FPU设置 使能OS_CPU_ARM_FP_EN这个宏 //在os_cpu.h中 #ifndef __TARGET_FPU_SOFTVFP #define OS_CPU_ARM_FP_EN DEF_ENABLED #else #define OS_CPU_ARM_FP_EN DEF_DISABLED #endifC/C++的define里面,定义DEF_ENABLED=1,定义__TARGET_FPU_VFP,定义__FPU_PRESENT=1,定义__CC_ARM 操作成功后如下图: **这时候发现system_stm32f4xx.c的函数SystmInit里的421行条件编译判断成功(如果还是暗的意味着上面的步骤做错),此时FPU打开成功。**如下图: 在stm32F4的startup… .s启动文件中,找到Reset_Handler函数 添加如下代码: 测试:在任务函数中定义一个浮点数后,在for(;;)里使用浮点数变量,如float a; a++; 参考网站: 网站一 网站二 如果还是不能解决,请在评论区留言。 t.none-task-blog-baidujs_title-1&spm=1001.2101.3001.4242) 网站二 如果还是不能解决,请在评论区留言。 |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |