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

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

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

编译没有错误,下载程序卡在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 中断,需要将它们放到中断向量表中(放到启动文件中的中断向量表),或者进行宏定义

FreeRTOS 中,当系统发生硬件故障(如访问无效的内存地址或执行非法指令)时,会触发 HardFault_HandlerHardFault_Handler 是一个特殊的异常处理函数,用于处理硬件故障。 进入 HardFault_Handler 的过程如下: 1. 当发生硬件故障时,处理器会将当前的上下文信息(寄存器状态、堆栈等)保存到特定的存储区域。 2. 处理器会跳转到预定义的 HardFault_Handler 函数。 3. 在 HardFault_Handler 中,你可以根据需要进行一些处理,例如记录日志、重启系统等。 要进入 HardFault_Handler,你可以在 FreeRTOS 中通过以下步骤进行设置: 1. 在你的代码中包含 CMSIS(Cortex Microcontroller Software Interface Standard)头文件,通常是 "core_cm3.h"、"core_cm4.h" 或类似的。 2. 实现 HardFault_Handler 函数,并在其中添加你的处理逻辑。例如,你可以通过读取相应的寄存器状态来分析故障原因,并采取适当的措施。 3. 使用 CMSIS 提供的宏将 HardFault_Handler 函数注册为 HardFault 异常处理函数。例如,在 ARM Cortex-M 系列处理器中,你可以使用以下代码进行注册: ```c void HardFault_Handler(void) { // 处理逻辑 } __attribute__((naked)) void HardFault_Handler(void) { __asm volatile ( "tst lr, #4\n" "ite eq\n" "mrseq r0, msp\n" "mrsne r0, psp\n" "ldr r1, [r0, #24]\n" "ldr r2, handler_address_const\n" "bx r2\n" "handler_address_const: .word HardFault_Handler_C\n" ); } ``` 这段代码将 HardFault_Handler 注册为 HardFault 异常处理函数,并将其与 HardFault_Handler_C 函数关联起来。 请注意,以上代码是针对 ARM Cortex-M 系列处理器的示例,如果你使用的是其他类型的处理器,请参考相应的文档和头文件来进行配置。此外,根据你的需求,你可能还需要对 HardFault_Handler 函数进行适当的修改和扩展。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Aurora Smith

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

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

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

打赏作者

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

抵扣说明:

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

余额充值