-
Notifications
You must be signed in to change notification settings - Fork 5.3k
Fix: Add sdcard detect before mount in case auto mount failed #11134
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: master
Are you sure you want to change the base?
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