Keil MDK5 环境下 GD32F303 在 FreeRTOS 任务中使用浮点运算报 HardFault 异常的问题

1. 问题描述

1. 1 环境

类别 版本
系统 WIN10
Keil Keil MDK 5.15.0
开发板 星空派GD32F303开发板
GD32F30x 固件库 V2.1.2
GD32F30x Keil 5 支持包 V2.1.0
FreeRTOS V10.4.3-LTS-Patch-2

1. 2 问题

继上一篇博文《GD32F303 移植 FreeRTOS》之后,以为可以愉快的玩 FreeRTOS 了,没想到接下来遇到了一个大坑。

博主在任务中使用了浮点型运算,测试任务如下:

static void test_task(void *para)
{
    
    
    float f = 0.3f;
    while(1)
    {
    
    
        LOGD("task: %s, freestack: %d, proi: %d\n", OS_TaskGetName(NULL), OS_TaskGetFreeStackSpace(NULL), OS_TaskGetPriority(NULL));

        f *= 3.0f;

        OS_MsDelay(1000);
    }
}

编译下载运行串口输出如下信息:
在这里插入图片描述
只要运行了浮点型运算,就进入了 HardFault 异常中断。

2. 探索过程

2.1 HardFault 异常方向排查问题,分析出现的问题

出现 HardFault 硬件错误的原因主要有两个方面:

  • 内存溢出或者访问越界
  • 堆栈溢出

但是从配置角度而言,任务栈空间是足够的,就算加了浮点运算,需要的空间大,我创建任务直接加大栈空间到 2048 问题依旧存在,根据 JLINK 仿真调试也是一头雾水,无果。

修改启动文件 startup_gd32f30x_hd.s 的堆栈空间,增加堆栈空间问题依旧。

参考博文《STM32硬件错误HardFault_Handler的处理方法》

2.2 浮点运算方向排查问题,检查是否启用了 FPU 功能

在这里插入图片描述
如上图增加了 __FPU_PRESENT 宏定义,启用 FPU 后,编译运行仍旧如此,并同时尝试了裸机使用浮点型运算是没有问题的,证明问题还是出在 FreeRTOS 内核相关上。

2.3 字节对齐问题

参考博文

但其实查看过 startup_gd32f30x_hd.s 启动文件,已经设置的是 8 直接对齐
在这里插入图片描述
其实参考博文的参考意义不大,博主的情况与参考博文的情况不一致,但也不失为一种解决思路。

3. 解决方法

探索了几天,尝试了多种办法,奈何博主的知识贮备不够,无法更深层次去探索问题的根源。

无意之间浏览到博文《STM32 Printf 打印浮点数乱码的问题》
该博主提到修改编译优先级设置成默认的解决思路,即:
将Options -> C/C++ -> Optimization 设置为 default。
在这里插入图片描述
修改成默认后,运行程序,问题便解决了。但其实不知根本。
其实只要不是 Level 0 等级都是可以的。
查看了编译优化相关博文,还是未果。相关博文如下:

4. 总结

问题困扰几天,虽然解决,但不知根本。后续有时间再来一探究竟!

猜你喜欢

转载自blog.csdn.net/QQ1452008/article/details/121758899
今日推荐