[STM32F4] Freertos任务堆栈溢出无预警

[复制链接]
695|16
 楼主| CarterERO 发表于 2025-4-24 10:00 | 显示全部楼层 |阅读模式
在STM32F429上运行FreeRTOS,某个任务偶尔卡死但uxTaskGetStackHighWaterMark显示剩余充足。开启内存保护后触发HardFault,难道堆栈检测API在MPU启用时失效?
cr315 发表于 2025-4-24 11:42 | 显示全部楼层
MPU 配置不当可能导致任务访问未授权的内存区域,从而触发 HardFault。
elephant00 发表于 2025-4-24 11:42 | 显示全部楼层
FreeRTOS 配置与 MPU可能 不兼容。
两只袜子 发表于 2025-4-24 13:00 | 显示全部楼层
中断服务例程中访问了未授权的内存区域,或者未正确调用 portYIELD_FROM_ISR,导致任务调度异常。
jcky001 发表于 2025-4-24 15:20 | 显示全部楼层
FreeRTOS 的某些配置选项可能与 MPU 配置冲突,导致系统不稳定。
duo点 发表于 2025-4-24 15:20 | 显示全部楼层
电源不稳定、时钟配置错误可能导致 MPU 或 FreeRTOS 工作异常。
onlycook 发表于 2025-4-24 16:00 | 显示全部楼层
uxTaskGetStackHighWaterMark 显示堆栈充足,但任务卡死并触发 HardFault,更可能是由于 MPU 配置错误、非法内存访问或中断问题,而非堆栈检测 API 失效。建议从 MPU 配置、中断处理和硬件配置等方面进行排查。
公羊子丹 发表于 2025-4-25 07:37 | 显示全部楼层
堆栈溢出确实在启用MPU后不太好检测,uxTaskGetStackHighWaterMark只能看到静态分析结果,动态越界它是看不到的。
周半梅 发表于 2025-4-25 07:38 | 显示全部楼层
我之前也遇到这个问题,MPU一开,某些任务只要指针一出界就直接HardFault,堆栈API完全检测不到。
帛灿灿 发表于 2025-4-25 07:38 | 显示全部楼层
FreeRTOS原生的溢出检测是靠填充magic word的,MPU触发的是访问越界,所以属于不同的机制。
童雨竹 发表于 2025-4-25 07:39 | 显示全部楼层
你开启了configCHECK_FOR_STACK_OVERFLOW吗?要设成2才会对堆栈边界做运行时检查。
万图 发表于 2025-4-25 07:40 | 显示全部楼层
有没有可能是ISR里用了太多栈?系统中断栈和任务栈是分开的,MPU拦的是实际访问,跟任务无关也可能触发。
Wordsworth 发表于 2025-4-25 07:41 | 显示全部楼层
你HardFault的时候有看stack frame吗?能定位是哪个任务跑飞的吗?
Bblythe 发表于 2025-4-25 07:42 | 显示全部楼层
我建议你试着用更大的堆栈,哪怕HighWaterMark显示还够,有时候local array太大也会瞬间冲破保护区。
Pulitzer 发表于 2025-4-25 07:43 | 显示全部楼层
有没有在MPU配置里给任务栈区域做WRONLY限制?有些FreeRTOS API需要读堆栈内容,可能被你挡住了。
Uriah 发表于 2025-4-25 07:44 | 显示全部楼层
建议加上FreeRTOS的vApplicationStackOverflowHook(),即便是MPU触发的,也方便你记录哪个任务崩了。
Clyde011 发表于 2025-4-25 07:45 | 显示全部楼层
F429用MPU的时候建议统一用heap_4或heap_5,能更灵活地分配任务栈和堆空间,避免地址空间冲突。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

27

主题

249

帖子

0

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