- 打卡等级:初来乍到
 
				- 打卡总天数:6
 
				
				
				- 最近打卡:2024-03-20 22:27:30
 
				  
  
注册会员 
 
 
	- 积分
 - 106
 
 
 
 
 | 
 
 
发表于 2024-3-14 15:44:45
|
显示全部楼层
 
 
 
 本帖最后由 dongchengya 于 2024-3-14 16:26 编辑  
 
暂时的解决方案: 
这里拿 USB-CDC 线程来举个例子,具体见下面代码中的粗体字部分,修改后基本正常了, 
保留了 不停电下载功能,不停电下载的程序也可以在上电时不插USB线运行了。 
 
原因可能是  在等待USB完成配置时,如果没有接USB上位机,就会运行   continue;  (原来的 continue语句), 
 continue 的作用是跳过后面的循环语句 ,导致后续的 vTaskDelay(200); (最后的一行代码)   无法得到执行, 
而是回过头去 接着执行 if(DeviceState != DEVSTATE_CONFIGURED); 
所以 如果STC32G12K28 没有连接上位机的USB时,一直没有执行 vTaskDelay(200); (最后的一行代码) ,导致没有出让线程时间 导致其他线程无法运行,这里是关键 
 
此时做出如下的修改后,USB-CDC 线程 每执行一次配置检查后 ,出让100毫秒的时间给其他线程 ,所以其他线程的程序可以正常运行, 
 
如果不是使用的FreeRTOS USB-CDC线程 ,则按照这个原理做出类似的改进。 
 
 
    while(1) 
    { 
        EUSB = 1; 
        if (DeviceState != DEVSTATE_CONFIGURED)  //等待USB完成配置 
 
     //  continue;         //0      这一句是原来的      
 
        {              //1 以下四句是用来替换 原来的 这一句的  (也就是上面的一句) 
              vTaskDelay(100);    // 2 
             continue;       //  3 
        }                                           // 4 
 
 
        if  (bUsbOutReady) 
        { 
            usb_OUT_done();    //接收应答(固定格式) 
             
            printf("OutNumber=0x%X\r\n",OutNumber);  //使用 printf 函数打印接收数据长度 
 
            USB_SendData(UsbOutBuffer,OutNumber);    //发送数据缓冲区,长度 
        } 
 
          printf("cyan,18507132114" ); 
                                 
        vTaskDelay(200); 
    } 
 
 
 
 
 |   
 
 
 
 |