记录.freeRTOS在gd32f303RE的固件中启动线程进入svc 0后进入HardFault_Handler

文章描述了在移植代码到GD32F303RE芯片后,遇到开启FPU引发HardFault_Handler的问题,关闭FPU后问题得到解决。作者还探讨了在FreeRTOS环境下,注释SysTick_Handler函数导致硬件初始化时进入HardFault_Handler的原因,解释了系统滴答定时器中断与FreeRTOS调度的关系。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、问题描述

        - 将代码移植完毕后,试着运行一下程序,发现直接在运行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对心跳的处理被启动了,系统心跳是要进行调度等操作的,这也导致我在等待外设初始化而死等的时候,系统开始任务调度,然后出事了。

                - 正常的滴答中断

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值