FreeRTOS,程序进入 HardFault_Handler循环

在使用STM32和FreeRTOS操作系统进行开发时,遇到HardFault_Handler循环问题。原因在于任务堆栈定义过小,随着代码增加导致堆栈溢出。解决方法是增大任务堆栈大小。

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

我用STM32搭载FreeRTOS操作系统实现一些功能。程序调试过程中进入了HardFault_Handler循环。后来发现这是一个很低级的错误。就是任务的堆栈定义的太小了,不够用。但是之前的时候没有问题,是因为我后来在这个任务中添加了很多代码,导致堆栈空间不够用了。

解决办法自然就是把这个任务的堆栈改大一点。由于很长时间不用FreeRTOS了,有些东西忘了,导致了这么低级的错误。

/* * CK803S 启动代码 * 平头哥CK803S芯片启动汇编代码 */ .syntax unified .cpu ck803s .arch ck803s .section .vectors, "a", %progbits .type g_vectors, %object .size g_vectors, .-g_vectors g_vectors: .long __stack /* 0: 栈顶指针 */ .long Reset_Handler /* 1: 复位处理函数 */ .long Default_Handler /* 2: NMI处理函数 */ .long Default_Handler /* 3: 硬错误处理函数 */ .long Default_Handler /* 4: 保留 */ .long Default_Handler /* 5: 保留 */ .long Default_Handler /* 6: 保留 */ .long Default_Handler /* 7: 保留 */ .long Default_Handler /* 8: 保留 */ .long Default_Handler /* 9: 保留 */ .long Default_Handler /* 10: 保留 */ .long Default_Handler /* 11: SVC处理函数 */ .long Default_Handler /* 12: 保留 */ .long Default_Handler /* 13: 保留 */ .long xPortPendSVHandler /* 14: PendSV处理函数 (FreeRTOS) */ .long xPortSysTickHandler /* 15: SysTick处理函数 (FreeRTOS) */ /* 外部中断向量 */ .long Default_Handler /* 16: 外部中断0 */ .long Default_Handler /* 17: 外部中断1 */ .long Default_Handler /* 18: 外部中断2 */ .long Default_Handler /* 19: 外部中断3 */ .long Default_Handler /* 20: 外部中断4 */ .long Default_Handler /* 21: 外部中断5 */ .long Default_Handler /* 22: 外部中断6 */ .long Default_Handler /* 23: 外部中断7 */ .long Default_Handler /* 24: 外部中断8 */ .long Default_Handler /* 25: 外部中断9 */ .long Default_Handler /* 26: 外部中断10 */ .long Default_Handler /* 27: 外部中断11 */ .long Default_Handler /* 28: 外部中断12 */ .long Default_Handler /* 29: 外部中断13 */ .long Default_Handler /* 30: 外部中断14 */ .long Default_Handler /* 31: 外部中断15 */ .text .thumb /* 复位处理函数 */ .type Reset_Handler, %function .global Reset_Handler Reset_Handler: /* 设置栈指针 */ lrw r0, __stack mov sp, r0 /* 禁用中断 */ psrclr ie /* 初始化系统 */ bl SystemInit /* 复制数据段到RAM */ lrw r0, _data_load_start /* 源地址 */ lrw r1, _data_start /* 目标地址 */ lrw r2, _data_end /* 结束地址 */ cmphs r1, r2 bt 2f 1: ldw r3, (r0) stw r3, (r1) addi r0, 4 addi r1, 4 cmphs r1, r2 bf 1b 2: /* 清零BSS段 */ lrw r0, _bss_start lrw r1, _bss_end movi r2, 0 cmphs r0, r1 bt 4f 3: stw r2, (r0) addi r0, 4 cmphs r0, r1 bf 3b 4: /* 调用C构造函数 */ bl __libc_init_array /* 跳转到main函数 */ bl main /* 如果main返回,进入循环 */ 5: br 5b .size Reset_Handler, . - Reset_Handler /* 默认中断处理函数 */ .type Default_Handler, %function .weak Default_Handler Default_Handler: br Default_Handler .size Default_Handler, . - Default_Handler /* 系统初始化函数 */ .type SystemInit, %function .weak SystemInit SystemInit: /* 在这里添加芯片特定的初始化代码 */ /* 例如:时钟配置、PLL设置等 */ rts .size SystemInit, . - SystemInit /* C库初始化函数 */ .type __libc_init_array, %function .weak __libc_init_array __libc_init_array: /* 调用全局构造函数 */ lrw r0, __ctors_start__ lrw r1, __ctors_end__ cmphs r0, r1 bt 2f 1: ldw r2, (r0) jsr r2 addi r0, 4 cmphs r0, r1 bf 1b 2: rts .size __libc_init_array, . - __libc_init_array /* 弱符号别名 */ .weak NMI_Handler .thumb_set NMI_Handler, Default_Handler .weak HardFault_Handler .thumb_set HardFault_Handler, Default_Handler .weak SVC_Handler .thumb_set SVC_Handler, Default_Handler .weak PendSV_Handler .thumb_set PendSV_Handler, xPortPendSVHandler .weak SysTick_Handler .thumb_set SysTick_Handler, xPortSysTickHandler /* 外部中断弱符号别名 */ .weak IRQ0_Handler .thumb_set IRQ0_Handler, Default_Handler .weak IRQ1_Handler .thumb_set IRQ1_Handler, Default_Handler .weak IRQ2_Handler .thumb_set IRQ2_Handler, Default_Handler .weak IRQ3_Handler .thumb_set IRQ3_Handler, Default_Handler .weak IRQ4_Handler .thumb_set IRQ4_Handler, Default_Handler .weak IRQ5_Handler .thumb_set IRQ5_Handler, Default_Handler .weak IRQ6_Handler .thumb_set IRQ6_Handler, Default_Handler .weak IRQ7_Handler .thumb_set IRQ7_Handler, Default_Handler .weak IRQ8_Handler .thumb_set IRQ8_Handler, Default_Handler .weak IRQ9_Handler .thumb_set IRQ9_Handler, Default_Handler .weak IRQ10_Handler .thumb_set IRQ10_Handler, Default_Handler .weak IRQ11_Handler .thumb_set IRQ11_Handler, Default_Handler .weak IRQ12_Handler .thumb_set IRQ12_Handler, Default_Handler .weak IRQ13_Handler .thumb_set IRQ13_Handler, Default_Handler .weak IRQ14_Handler .thumb_set IRQ14_Handler, Default_Handler .weak IRQ15_Handler .thumb_set IRQ15_Handler, Default_Handler .end
最新发布
07-02
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值