已解决:FreeeRTOS内的USB-CDC库存在的问题,另外新的USB库 与 FreeeRTOS 不兼容的问
本帖最后由 dongchengya 于 2024-3-14 15:59 编辑解决方案 见13楼
这里有两个USB库,
旧一点的这个USB库 ,文件名stc_usb_cdc_32g.LIB 是在 FressRTOS-USB-CDC 中提供的,下载地址: https://www.stcai.com/xtrj
新一点的这个USB库 , 文件名stc_usb_cdc_32.LIB 是在USB库文件 中提供的 , 下载地址: https://www.stcai.com/khs
旧一点的这个USB库在 FressRTOS 中勉强可以使用,但是会对其他线程有影响,这个 问题很严重!!(具体问题见二楼)
新一点的这个USB库 ,又不能在FreeRTOS编译通过,(编译错误见六楼)
感觉就是 新USB库文件 和 FreeRTOS 不兼容 。
何故?何解?
本帖最后由 dongchengya 于 2024-3-8 12:19 编辑
官方提供的FressRTOS-USB-CDC例子 下载地址: https://www.stcai.com/xtrj
有个 USB主动发送数据到上位机的异常现象:
简单一点来说,就是:在官方代码里,增加下面的这一行 printf("问题就在这一行,增加这一行就无法正常运行"); 会导致另外的线程停止运行,这里指的是单纯的 LED灯闪烁线程,
具体表现为:
1、上位机串口工具打开串口连接后,增加下面的这一行 printf()是可以通过USB发送数据到上位机,
2、 一旦关闭上位机的串口工具,STC32G12K128 就会停止运行,我有另外的独立线程控制的板子上的一个LED灯,
打开串口工具并打开串口连接,这个灯就能正常闪烁,但是关闭上位机的串口连接,这个灯就不闪烁了,这是不正常的。
3、另外发现,只要增加这行printf() ,在关闭上位机串口软件后,USB-CDC线程也会停止工作,同时独立的LED线程停止工作,感觉这个USB-CDC库存在致命缺陷!
while(1)
{
EUSB = 1;
if(DeviceState != DEVSTATE_CONFIGURED)//等待USB完成配置
continue;
if (bUsbOutReady)
{
usb_OUT_done(); //接收应答(固定格式)
printf("OutNumber=0x%X\r\n",OutNumber);//使用 printf 函数打印接收数据长度
USB_SendData(UsbOutBuffer,OutNumber); //发送数据缓冲区,长度
}
printf("问题就在这一行,增加这一行就无法正常运行");
vTaskDelay(1);
}
vTaskDelete(NULL);
}
在线等,有点急不可耐{:shy:} 帮顶一下, 顺便蹲个结果{:4_171:} dongchengya 发表于 2024-3-8 11:11
在线等,有点急不可耐
这个不是CDC的问题,是printf的问题。也就是putchar()重置的问题 本帖最后由 dongchengya 于 2024-3-8 12:22 编辑
stc_usb_cdc_32.LIB这个新的USB-CDC库是 官方提供的新版本 USB库文件,下载地址为:https://www.stcai.com/khs
stc_usb_cdc_32g.LIB这个早一点的USB-CDC库是在 FreeRTOS-USB-CDC 中提供的,下载地址为: https://www.stcai.com/xtrj
-----------------------------------------------------------------------------------------------------------------------------------------------------------------
现在需要在 FreeRTOS-库函数版本 中使用 USB-CDC 库文件, 如果使用FreeRTOS-USB-CDC 中提供的stc_usb_cdc_32g.LIB 这个库文件 就会出现问题(见二楼),具体如下:
stc_usb_cdc_32g.LIB 在使用的时候会出现上述 LED灯线程不工作的情况 ,尝试使用新一点的stc_usb_cdc_32.LIB ,
但是编译无法通过,提示如下:
linking...
*** ERROR L127: UNRESOLVED EXTERNAL SYMBOL
SYMBOL:usb_OUT_done?_
MODULE:.\Objects\usb_cdc.obj (usb_cdc)
*** ERROR L127: UNRESOLVED EXTERNAL SYMBOL
SYMBOL:USB_SendData?_
MODULE:.\Objects\usb_cdc.obj (usb_cdc)
*** ERROR L127: UNRESOLVED EXTERNAL SYMBOL
SYMBOL:usb_init?_
MODULE:.\Objects\usb_cdc.obj (usb_cdc)
*** ERROR L128: REFERENCE MADE TO UNRESOLVED EXTERNAL
SYMBOL:usb_init?_
MODULE:.\Objects\usb_cdc.obj (usb_cdc)
ADDRESS: FF54C2H
*** ERROR L128: REFERENCE MADE TO UNRESOLVED EXTERNAL
SYMBOL:USB_SendData?_
MODULE:.\Objects\usb_cdc.obj (usb_cdc)
ADDRESS: FF54FDH
*** ERROR L128: REFERENCE MADE TO UNRESOLVED EXTERNAL
SYMBOL:usb_OUT_done?_
MODULE:.\Objects\usb_cdc.obj (usb_cdc)
ADDRESS: FF5510H
*** ERROR L128: REFERENCE MADE TO UNRESOLVED EXTERNAL
SYMBOL:USB_SendData?_
MODULE:.\Objects\usb_cdc.obj (usb_cdc)
ADDRESS: FF432AH
*** ERROR L128: REFERENCE MADE TO UNRESOLVED EXTERNAL
SYMBOL:USB_SendData?_
MODULE:.\Objects\usb_cdc.obj (usb_cdc)
ADDRESS: FF4369H
*** ERROR L128: REFERENCE MADE TO UNRESOLVED EXTERNAL
SYMBOL:USB_SendData?_
MODULE:.\Objects\usb_cdc.obj (usb_cdc)
ADDRESS: FF43CEH
*** ERROR L128: REFERENCE MADE TO UNRESOLVED EXTERNAL
SYMBOL:USB_SendData?_
MODULE:.\Objects\usb_cdc.obj (usb_cdc)
ADDRESS: FF440BH 本帖最后由 dongchengya 于 2024-3-8 11:48 编辑
55337575 发表于 2024-3-8 11:23
这个不是CDC的问题,是printf的问题。也就是putchar()重置的问题
把 printf(); 换成 USB_SendData(); (具体如下代码 )
结果是一样的问题 ,仍然对其他的线程有严重的影响 ,
1、 打开上位机串口软件就能正常发送数据,LED闪烁线程能正常闪烁,
2、关闭上位机串口软件后,LED线程停止工作,LED灯不再闪烁,
3、重新打开上位机串口软件,LED灯再次闪烁 ,
这是不正常的
while(1)
{
EUSB = 1;
if(DeviceState != DEVSTATE_CONFIGURED)//等待USB完成配置
continue;
if (bUsbOutReady)
{
usb_OUT_done(); //接收应答(固定格式)
printf("OutNumber=0x%X\r\n",OutNumber);//使用 printf 函数打印接收数据长度
USB_SendData(UsbOutBuffer,OutNumber); //发送数据缓冲区,长度
}
sprintf(UsbInBuffer, "error");
USB_SendData(UsbInBuffer,strlen(UsbInBuffer));
vTaskDelay(1);
}
vTaskDelete(NULL);
}
关于2楼的问题
由于 usb-cdc任务 的优先级最高
该任务不进入阻塞状态,其他低优先级的任务不会运行
可以吧 闪灯(其他)任务 的优先级调高一点
修改 优先级为configDEFAULT_PRIORITIES+3
xTaskCreate(vBlink,"Blink",configDEFAULT_STACK_SIZE,NULL,configDEFAULT_PRIORITIES + 3,NULL); //开启Blink任务
本帖最后由 dongchengya 于 2024-3-8 11:53 编辑
gentleman 发表于 2024-3-8 11:49
关于2楼的问题
优先级的问题可能存在,
7楼的问题要怎么办呢?
上位机的串口 是否打开,居然会造成STC32G2K128 单片机的 FreeRTOS堵塞,这个问题太严重了
dongchengya 发表于 2024-3-8 11:34
把 printf(); 换成 USB_SendData(); (具体如下代码 )
结果 ...
使用printf时试一下在初始化之后加一行
TI=1;
页:
[1]
2