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