Fix: Add sdcard detect before mount in case auto mount failed#11134
Fix: Add sdcard detect before mount in case auto mount failed#11134Rbb666 merged 1 commit intoRT-Thread:masterfrom
Conversation
|
👋 感谢您对 RT-Thread 的贡献!Thank you for your contribution to RT-Thread! 为确保代码符合 RT-Thread 的编码规范,请在你的仓库中执行以下步骤运行代码格式化工作流(如果格式化CI运行失败)。 🛠 操作步骤 | Steps
完成后,提交将自动更新至 如有问题欢迎联系我们,再次感谢您的贡献!💐 |
📌 Code Review Assignment🏷️ Tag: bsp_stm32Reviewers: Liang1795 hamburger-os wdfk-prog Changed Files (Click to expand)
📊 Current Review Status (Last Updated: 2026-01-13 22:41 CST)
📝 Review Instructions
|
|
大家好, 我注意到 Static code analysis(cppcheck)在 job #60071615567 失败,原因是在板级文件 bsp/stm32/stm32f407-atk-explorer/board/ports/drv_filesystem.c 中触发了预处理器错误: #error "Please define DFS_FILESYSTEMS_MAX more than 4" 文件位置(触发该错误的提交):https://github.com/RT-Thread/rt-thread/blob/14e64b3fd2a1f901fab2cfa751288edcb737d4a8/bsp/stm32/stm32f407-atk-explorer/board/ports/drv_filesystem.c (ref: 14e64b3) 看起来这是由板级/配置差异导致的,会使 cppcheck 把检查视为致命错误并中断 CI��本人仍希望对本次变更开展功能和实现方面的审查,不希望该静态检查阻碍审查流程。 若大家同意,我可以提交一个小修复(例如将 #error 改为 #warning,或在 CI 中对 preprocessorErrorDirective 做 suppress),以避免 CI 因单板配置差异而阻断静态检查;如果你们希望由维护者来处理也没问题,请告知偏好方案。 感谢审查与指点! |
static void _sdcard_mount(void)
{
rt_device_t device;
device = rt_device_find("sd0");
if (device == NULL)
{
mmcsd_wait_cd_changed(0);
stm32_mmcsd_change();
mmcsd_wait_cd_changed(RT_WAITING_FOREVER);
device = rt_device_find("sd0");
}
if (device != RT_NULL)
{
rt_err_t ret = RT_EOK;
if (dfs_mount("sd0", "/sdcard", "elm", 0, 0) == RT_EOK)
{
LOG_I("sd card mount to '/sdcard'");
}
else
{
dfs_mkfs("elm", "sd0");
if (dfs_mount("sd0", "/sdcard", "elm", 0, 0) == RT_EOK)
{
LOG_I("sd card mkfs to '/sdcard'");
}
else
{
LOG_W("sd card mount to '/sdcard' failed!");
ret = -RT_ERROR;
}
}
#if (OUT_FILE_ENABLE == 1)
if(ret == RT_EOK)
{
sdcard_sys_log_file_backend_init();
}
#endif /*(OUT_FILE_ENABLE == 1)*/
}
else
{
LOG_E("find 'sd0' failed!");
}
}
static void _sdcard_unmount(void)
{
rt_thread_mdelay(200);
dfs_unmount("/sdcard");
LOG_I("Unmount \"/sdcard\"");
mmcsd_wait_cd_changed(0);
stm32_mmcsd_change();
mmcsd_wait_cd_changed(RT_WAITING_FOREVER);
}
static void sd_mount(void *parameter)
{
rt_uint8_t re_sd_check_pin = 1;
rt_thread_mdelay(200);
if (rt_pin_read(SD_CHECK_PIN))
{
_sdcard_mount();
}
while (1)
{
rt_thread_mdelay(200);
if (!re_sd_check_pin && (re_sd_check_pin = rt_pin_read(SD_CHECK_PIN)) != 0)
{
_sdcard_mount();
}
if (re_sd_check_pin && (re_sd_check_pin = rt_pin_read(SD_CHECK_PIN)) == 0)
{
_sdcard_unmount();
}
}
} |
我也赞同这种挂载方式,支持动态热插拔,如果硬件不支持CD引脚检测可以不添加热插拔线程 |
|
已按照示例修改代码。 改进说明
测试结果
|
|
还请压缩成一个 commit 提交谢谢 |
Add sdcard detect before mount in case auto mount failed.
已压缩 |
Add sdcard mount retries in case SDIO init done after mount.
拉取/合并请求描述:(PR description)
[
为什么提交这份PR (why to submit this PR)
修复 stm32f407-atk-explorer BSP 中 SD 卡挂载失败的问题。由于 SDIO 初始化(特别是高速模式切换)耗时较长,导致文件系统挂载时 SD 卡设备尚未就绪。
你的解决方案是什么 (what is your solution)
在文件系统挂载函数中添加延迟重试机制:
此方案不修改 RT-Thread 框架初始化顺序,保持向后兼容。
请提供验证的bsp和config (provide the config and bsp)
]
当前拉取/合并请求的状态 Intent for your PR
必须选择一项 Choose one (Mandatory):
代码质量 Code Quality:
我在这个拉取/合并请求中已经考虑了 As part of this pull request, I've considered the following:
#if 0代码,不包含已经被注释了的代码 All redundant code is removed and cleaned up