-
Notifications
You must be signed in to change notification settings - Fork 5.3k
Open
Description
RT-Thread Version
5.3.0
Hardware Type/Architectures
stm32f407-atk-explorer
Develop Toolchain
GCC
Describe the bug
🐛 问题摘要
问题标题:STM32F407 SD卡初始化时触发INVSTATE HardFault,PC指向数据区0x20002cb4
软件环境:RT-Thread 5.3.0
📋 问题现象
-
正常初始化:
[I/SDIO] SD card capacity 62367744 KB. [I/SDIO] SD card switch to High Speed / SDR25 mode -
突然崩溃:
hard fault on handler usage fault: SCB_CFSR_UFSR:0x02 INVSTATE pc: 0x20002cb4 -
关键地址:
- PC指向:
0x20002cb4(RAM数据区) - 此地址对应:
rt_scheduler_lock_nest变量 - 错误类型:
INVSTATE(无效指令状态)
- PC指向:
🔍 问题分析
根本原因
SD卡检测线程(mmcsd_detect_thread)栈溢出,导致函数返回地址被破坏。
崩溃链条
栈溢出 → 返回地址被覆盖为0x20002cb4 → 函数返回时PC加载错误地址 →
CPU尝试执行数据 → 触发INVSTATE异常 → HardFault
调试证据
- 崩溃时PC指向RAM数据区,非代码区
- 栈中保存的返回地址被破坏
- 地址0x20002cb4是调度器锁计数变量
- 崩溃发生在高速模式切换时,此时栈使用深度最大
💡 解决方案
- 增大 RT_MMCSD_STACK_SIZE 栈大小
🎯 问题复现
- 插入SD卡
- 系统自动检测并初始化
- 尝试切换到高速模式时崩溃
- 设置不同栈大小(RT_MMCSD_STACK_SIZE)具体跑飞情况不同,该例是其中一种,看上去是不同大小的栈,程序执行到的位置不同进而触发不同的问题。在某些情况下系统能捕捉到栈溢出,某些情况则直接跑飞,调试较为困难
📁 相关文件
components/drivers/sdio/dev_mmcsd_core.c- SD卡检测线程components/drivers/sdio/dev_sd.c- SD卡驱动bsp/stm32/libraries/HAL_Drivers/drivers/drv_sdio.c- 硬件驱动
该 issue 的提出旨在揭示使用 SD 卡功能过程中可能遇到的问题,方便之后的人在移植 BSP 或在没有查看相关使用手册的情况下遇到使用 SD 卡功能系统跑飞时的 debug。当然如果这个潜在问题在未来能够有相关修复是再好不过了。
Other additional context
No response
Metadata
Metadata
Assignees
Labels
No labels