| 
				打卡等级:初来乍到打卡总天数: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);
 }
 
 
 
 
 
 | 
 |