环境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);
usbConnet** = 1;
}
while(HCD_IsDeviceConnected(&USB_OTG_Core))// 设备连接成功
{
LED1_Toggle;
vTaskDelay(200);
}
f_mount(0,"3:",1); // 卸载U盘
usbConnet** = 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) && usbConnet** == 1)// 设备连接成功
{
if(count < 1)
{
strcpy(buff, &quot;3:/&quot;);
// 写文件及显示文件内容
testWrite(&quot;3:/abc.txt&quot;,(u8*)&quot;123456789&quot;,strlen(&quot;123456789&quot;));
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* )&quot;start_task&quot;, //任务名称
(uint32_t )START_STK_SIZE, //任务堆栈大小
(void* )NULL, //传递给任务函数的参数
(UBaseType_t )START_TASK_PRIO, //任务优先级
(StackType_t* )StartTaskStack, //任务堆栈
(StaticTask_t* )&StartTaskTCB); //任务控制块
vTaskStartScheduler(); //开启任务调度
} |