示例工程代码库地址如下:
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. 总结
问题困扰几天,虽然解决,但不知根本,内心煎熬。后续有时间再来一探究竟!
现已知晓来龙去脉,请看第二回