求助 FreeRtos+Fatfs+u盘,任务会挂掉

2019-07-20 02:13发布

环境F7系列,移植了FreeRtos+Fatfs+u盘。
使用资源中现成资料,创建2个任务,一个用于检测U盘是否插入,一个用于接收命令后读写U盘。
发现问题:
读u盘后task会挂掉,即不再运行。U盘只是初始化,不参与U盘操作情况下,task正常跑。
是否有人碰到过类似问题?
不知道是否移植的问题,谁有能用的环境?
谢谢。
主要代码如下:
u8 USH_User_App(void)
{  
        u8 res=0;

        Show_Str(30,140,200,16," Device connect success.",16,0);         
          f_mount(fs[3],"3:",1);         // 重新挂载U盘
        res=exf_getfree("3:",&diskTotal,&diskFree);
        if(res==0)
        {
                POINT_COLOR=BLUE;// 设置字体为蓝 {MOD}          
                LCD_ShowNum(174,180,diskTotal>>10,5,16);// 显示U盘总容量 MB
                LCD_ShowNum(174,200,diskFree>>10,5,16);       
                usbConnetFlg = 1;
        }
        while(HCD_IsDeviceConnected(&USB_OTG_Core))// 设备连接成功
        {       
                LED1_Toggle;
                vTaskDelay(200);
        }
        f_mount(0,"3:",1);         // 卸载U盘
        usbConnetFlg = 0;
        return res;
}

void start_task(void *pvParameters)
{
    taskENTER_CRITICAL();           //进入临界区
    //创建USB监控任务
        SaveDataTask_Handler=xTaskCreateStatic((TaskFunction_t        )save_data_task,               
                                                                                (const char*         )"save_data_task",               
                                                                                (uint32_t                 )SAVE_DATA_STK_SIZE,       
                                                                                (void*                           )NULL,                               
                                                                                (UBaseType_t         )SAVE_DATA_TASK_PRIO,        
                                                                                (StackType_t*   )SaveDataTaskStack,       
                                                                                (StaticTask_t*  )&SaveDataTaskTCB);
    taskEXIT_CRITICAL();            //退出临界区
        while(1)
        {
                vTaskDelay(2000); //延时10ms,也就是10个时钟节拍
        }
}
void testWrite(u8 * filepath,u8 * datas,u32 length)
{
        fr = f_open(&fileobj, (const TCHAR*)filepath, FA_READ|FA_WRITE);
        f_close(&fileobj);
}
void save_data_task(void *pvParameters)
{
        static u8 count = 0;
       
    while(1)  
    {  
                if(HCD_IsDeviceConnected(&USB_OTG_Core) && usbConnetFlg == 1)// 设备连接成功
                {       
                        if(count < 1)
                        {
                                strcpy(buff, "3:/");
                                // 写文件及显示文件内容
                                testWrite("3:/abc.txt",(u8*)"123456789",strlen("123456789"));
                                count ++;
                        }
                }
                vTaskDelay(1000);
    }
}

int main(void)
{
        // 共通处理
        Cache_Enable();                 // 打开L1-Cache
    HAL_Init();                                        // 初始化HAL库
    Stm32_Clock_Init(432,25,2,9);   // 设置时钟,216Mhz
    delay_init(216);                // 延时初始化

    LED_Init();                     // 初始化LED
    KEY_Init();                     // 初始化按键
    SDRAM_Init();                   // 初始化SDRAM
    LCD_Init();                     // 初始化LCD


        my_mem_init(SRAMIN);                    // 初始化内部内存池
        my_mem_init(SRAMEX);                    // 初始化外部内存池
        my_mem_init(SRAMDTCM);                    // 初始化DTCM内存池
        exfuns_init();                                    // 为fatfs相关变量申请内存
        //初始化USB主机
          USBH_Init(&USB_OTG_Core,USB_OTG_FS_CORE_ID,&USB_Host,&USBH_MSC_cb,&USR_cb);  
    //创建开始任务
        StartTask_Handler=xTaskCreateStatic((TaskFunction_t        )start_task,                //任务函数
                                                                                (const char*         )"start_task",                //任务名称
                                                                                (uint32_t                 )START_STK_SIZE,        //任务堆栈大小
                                                                                (void*                           )NULL,                                //传递给任务函数的参数
                                                                                (UBaseType_t         )START_TASK_PRIO,         //任务优先级
                                                                                (StackType_t*   )StartTaskStack,        //任务堆栈
                                                                                (StaticTask_t*  )&StartTaskTCB);        //任务控制块               
    vTaskStartScheduler();          //开启任务调度
}

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
3条回答
Dzdd
2019-07-20 03:15
HCHDaLeiGe 发表于 2019-4-30 16:58
直接创建USB监控任务就好了,为啥要创建start_task,创建完task还不退出,强行2个task?

多谢多谢,试了下,果然就可以了。
还有不明白的地方,为啥保留starttask就会有这个问题?
使用starttask来创建USB监控task,本意想留着starttask可以少创建一个task做其他用处,
难道starttask和它创建的task有很多不一样的地方么?会影响其他task的运行?

一周热门 更多>