针对STM32F429中USB MSC(大容量存储)与FATFS文件上传操作冲突的问题,以下是分步解决方案:
通过状态标志位 + 原子操作 + 任务调度实现优先级控制,确保同一时刻仅有一个任务访问SDIO接口的eMMC硬件资源。
volatile uint8_t usb_activity = 0; // USB读写活动标志(原子操作)
volatile uint8_t upload_request = 0; // 文件上传请求标志在USB读写回调函数中更新状态:
// USB读开始回调
void USB_Read_Start_Callback(void) {
__disable_irq(); // 关中断保证原子性
usb_activity = 1;
__enable_irq();
}
// USB读完成回调
void USB_Read_Complete_Callback(void) {
__disable_irq();
usb_activity = 0;
__enable_irq();
}
// 同理实现USB_Write_Start/Complete_Callbackvoid FileUpload_Task(void) {
if (upload_request && !usb_activity) {
// 原子检查并抢占资源
__disable_irq();
if (!usb_activity) {
usb_activity = 2; // 标记为文件上传占用
__enable_irq();
// 执行文件上传操作
if (FATFS_UploadFiles() == FR_OK) {
upload_request = 0; // 上传成功清除请求
}
__disable_irq();
usb_activity = 0; // 释放资源
}
__enable_irq();
}
}// 在需要上传时设置标志(如定时器/按钮事件)
void Trigger_Upload(void) {
if (!upload_request) {
upload_request = 1;
}
}while(1) {
// 优先处理USB事件
USB_Process(); // 内置USB状态机轮询
// 非阻塞式处理上传
FileUpload_Task();
// 其他低优先级任务
Idle_Task();
}原子操作保证:
__disable_irq()/__enable_irq()确保标志位操作的原子性。#include
atomic_uint_fast8_t usb_activity = ATOMIC_VAR_INIT(0);优先级策略:
错误恢复机制:
if (FATFS_UploadFiles() != FR_OK) {
// 记录错误次数,超阈值后复位SDIO
if (++error_count > 3) {
SDIO_Reinit();
error_count = 0;
}
}SDIO驱动增强:
SDIO_CLEAR_FLAG()清除残留状态。通过上述方法,可在无OS环境下安全协调USB与FATFS对eMMC的访问,确保系统稳定性和实时性。实际调试时需结合逻辑分析仪抓取SDIO波形,确认时序无冲突。
举报
更多回帖