STM32移植FreeRTOS硬件错误HardFault_Handler的处理方法

当程序在HardFault_Handler中卡住,检查R14寄存器值,并确保在startup_stm32f10x_md.s中正确修改中断向量,指向RTOSport.c的中断向量名。如果文件只读,可以通过复制内容到新文件并替换,或者在FreeRTOSConfig.h中定义中断宏。多重定义的链接错误可通过注释stm32f10x_it.c中相关函数解决。调整FreeRTOSConfig.h的堆大小可能也有助于问题解决。

编译没有错误,下载程序卡在HardFault_Handler,R14寄存器值为0xfffffff9,如图所示

这时候可以考虑下是否是startup_stm32f10x_md.s中修改中断向量指向RTOS port.c文件中定义的中断向量名,如果没有修改,修改成如图所示线程就可以正常启动并切换。

如果startup_stm32f10x_md.s是只读文件,可采用下面这两种方法

  • 方法一:

将startup_stm32f10x_md.s中的内容进行复制,然后自己新建一个".s"结尾的文件,将内容复制到里面,然后进行上述操作(修改中断向量指向RTOS port.c文件中定义的中断向量名),最后把工程里面的startup_stm32f10x_md.s进行替换就行了。

  • 方法二

在FreeRTOSConfig.h中进行宏定义

#define xPortPendSVHandler     PendSV_Handler
#define vPortSVCHandler     SVC_Handler
#define    xPortSysTickHandler    SysTick_Handler

进行编译

在链接时报错,发现多重定义了,我们只要把stm32f10x_it.c文件中的那三个函数进行注释即可解决问题

再编译,运行

已经没有出现硬件错误了

如果还没解决那你就看看FreeRTOSConfig.h文件中,将堆(Heap)大小设置小一点

为什么修改这些内容?

原因:在FreeRTOS中断管理中的内部中断中(内部中断:即任务与内核之间进行的),有这三个内部中断:SysTick 中断、 SVC 中断和 PendSV 中断,需要将它们放到中断向量表中(放到启动文件中的中断向量表),或者进行宏定义

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Aurora Smith

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值