[STM32F7] 通过UART_Transmit中断时触发HardFault_Handler

[复制链接]
2025|39
石榴大王 发表于 2025-9-19 08:51 | 显示全部楼层 |阅读模式
, , , ,
本帖最后由 石榴大王 于 2025-10-2 18:22 编辑

在STM32F767ZI中跑FreeRTOS。在任务中创建交互式菜单,同时另设一个使用HAL_GPIO_TogglePin的任务来验证双任务协同工作。菜单文本本身可以正常发送到终端,当我发送对应选项的字符后,字符能被正确识别,但仅能发送出前2-3个字符就会触发HardFault_Handler。

我已试过一些解决方案,例如将TIM6更改为Systick作为时基源。下图展示了我开始使用FreeRTOS之前所有程序中一直使用的Transmit_Callback。

6546868cc1d2fc57be.png
这些是我在任务中调用于发送消息的函数

1603368cc1d42d20cc.png
5841368cc1d506d8ec.png
7642068cc1d59c9a6d.png

set_rx 函数的作用是将 Rx 标志设置为 1,以便让 rx_callback 接收来自用户的字符。

usysm 发表于 2025-10-6 22:19 | 显示全部楼层
任务使用的栈空间太小,当函数调用层级过深或局部变量过大时,栈被破坏,导致返回地址或寄存器被覆盖,最终触发HardFault。
pixhw 发表于 2025-10-8 09:34 | 显示全部楼层
在HardFault触发时,检查MSP寄存器指向的堆栈指针,分析调用栈。
rosemoore 发表于 2025-10-8 11:35 | 显示全部楼层
HardFault首先应检查栈大小。
mollylawrence 发表于 2025-10-8 12:23 | 显示全部楼层
任务堆栈大小设置过小,或中断嵌套导致堆栈深度超过配置值。
pl202 发表于 2025-10-8 13:03 | 显示全部楼层
在任务中,优先使用HAL_UART_Transmit、HAL_I2C_Master_Transmit等阻塞式函数,它们能很好地与RTOS调度器配合。
jonas222 发表于 2025-10-8 17:43 | 显示全部楼层
可能存在缓冲区越界写入,或未正确处理任务间同步
bartonalfred 发表于 2025-10-8 18:23 | 显示全部楼层
堆栈溢出后,可能会破坏 FreeRTOS 内部数据结构、中断向量表、甚至返回地址,最终触发 ​​HardFault​
primojones 发表于 2025-10-8 19:17 | 显示全部楼层
不要在 ​​中断回调里直接调用复杂发送逻辑​​,尤其是涉及字符串的。
uiint 发表于 2025-10-8 20:42 | 显示全部楼层
使用Keil/IAR的内存填充工具检查关键变量 是否越界。
jonas222 发表于 2025-10-8 21:42 | 显示全部楼层
堆栈溢出是导致HardFault的一个常见原因。
uptown 发表于 2025-10-8 22:10 | 显示全部楼层
避免高优先级中断抢占低优先级中断导致的问题。
qiufengsd 发表于 2025-10-10 14:02 | 显示全部楼层
访问了无效的内存地址              
tabmone 发表于 2025-10-10 14:20 | 显示全部楼层
堆栈溢出              
i1mcu 发表于 2025-10-10 16:00 | 显示全部楼层
增大任务堆栈大小​              
sdlls 发表于 2025-10-11 10:24 | 显示全部楼层
调试FreeRTOS问题的利器,务必开启。
minzisc 发表于 2025-10-11 11:13 | 显示全部楼层
在FreeRTOS配置中启用configCHECK_FOR_STACK_OVERFLOW(设为2),并检查堆栈溢出钩子函数触发情况。
plsbackup 发表于 2025-10-11 11:40 | 显示全部楼层
在 FreeRTOS 创建任务时,检查并增大堆栈
1988020566 发表于 2025-10-11 13:35 | 显示全部楼层
FreeRTOS任务同时访问同一缓冲区,导致数据竞争或堆栈破坏。
mattlincoln 发表于 2025-10-11 15:00 | 显示全部楼层
检查字符串操作是否溢出              
您需要登录后才可以回帖 登录 | 注册

本版积分规则

62

主题

62

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部