OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3329|回复: 4

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

[复制链接]

1

主题

2

帖子

0

精华

新手上路

积分
21
金钱
21
注册时间
2019-4-1
在线时间
4 小时
发表于 2019-4-30 16:53:41 | 显示全部楼层 |阅读模式
环境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;// 设置字体为蓝色          
                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();          //开启任务调度
}

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

14

主题

204

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2443
金钱
2443
注册时间
2017-9-13
在线时间
559 小时
发表于 2019-4-30 16:58:16 | 显示全部楼层
直接创建USB监控任务就好了,为啥要创建start_task,创建完task还不退出,强行2个task?
回复 支持 反对

使用道具 举报

1

主题

2

帖子

0

精华

新手上路

积分
21
金钱
21
注册时间
2019-4-1
在线时间
4 小时
 楼主| 发表于 2019-4-30 17:38:38 | 显示全部楼层
HCHDaLeiGe 发表于 2019-4-30 16:58
直接创建USB监控任务就好了,为啥要创建start_task,创建完task还不退出,强行2个task?

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

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2019-5-1 11:26:35 | 显示全部楼层
Dzdd 发表于 2019-4-30 17:38
多谢多谢,试了下,果然就可以了。
还有不明白的地方,为啥保留starttask就会有这个问题?
使用startta ...

start task创建完其他任务后直接刮起即可,这个task就是一个开场,完了就没用了
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

1

主题

3

帖子

0

精华

新手上路

积分
26
金钱
26
注册时间
2019-8-18
在线时间
4 小时
发表于 2019-9-17 07:16:48 | 显示全部楼层
Dzdd 发表于 2019-4-30 17:38
多谢多谢,试了下,果然就可以了。
还有不明白的地方,为啥保留starttask就会有这个问题?
使用startta ...

同问。StartTask有什么特别的地方吗?为什么保留它就会出问题?
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-16 10:34

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表