GD32F30x Keil 环境下在 FreeRTOS 任务中使用浮点运算报 HardFault 异常的问题(一)

示例工程代码库地址如下:

1. 问题描述

1. 1 环境

类别版本
系统WIN10
KeilKeil MDK 5.15.0
开发板星空派GD32F303开发板
GD32F30x 固件库V2.1.2
GD32F30x Keil 5 支持包V2.1.0
FreeRTOSV10.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. 总结

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

现已知晓来龙去脉,请看第二回

GD32F30x Keil 环境下在 FreeRTOS 任务中使用浮点运算报 HardFault 异常的问题(二)

  • 8
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值