一、问题描述
- 将代码移植完毕后,试着运行一下程序,发现直接在运行svc 0这条语句后直接进入HardFault_Handler
二、解决
- 上一个项目也用过gd32f303re本不应该会出现用浮点HardFault_Handler才对,后来仔细检查发现,由于直接是从demo建立的工程,而没有使用老项目的工程,一些设置会不一样。经仔细对比之后,发现开启了fpu,上一个项目依旧遇到过开启fpu导致硬件错误的情况。尝试关闭fpu,问题解决
三、为什么一开fpu就进HardFault_Handler,但是裸机运行浮点没有一点问题?
- 查看fpu的代码地址:0XE000ED88,结果是0x0f000000,fpu开着。
- 查看fault查看器:
- ???我也很迷。
四、延申问题
1、注释gd32f30x_it.o里面的SysTick_Handler()函数导致在还没运行freeRTOS前的硬件初始化函数进入hardfault_Hamdler,而且是在初始化外设写的一个延时函数的时候进的hardfault_Hamdler。
- 查找问题,发现是在gd32f30x_it.o顺手把SysTick_Handler()函数给注释了。在FreeRTOS.h文件把SysTick_Handler()宏定义成了xPortSysTickHandler()。错误起因找到了,但是为什么?系统的滴答定时器如何影响代码的运行?
- 解释:在裸机状态还没运行系统开了滴答定时器中断systick_config();
而由于系统还没启动,本不应该处理系统心跳。但是由于在FreeRTOS.h文件把SysTick_Handler()宏定义成了xPortSysTickHandler()使得当滴答定时器中断触发会调用xPortSysTickHandler(),freeRTOS对心跳的处理被启动了,系统心跳是要进行调度等操作的,这也导致我在等待外设初始化而死等的时候,系统开始任务调度,然后出事了。
- 正常的滴答中断
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)