找回密码
 立即注册
查看: 2126|回复: 14

已解决:FreeeRTOS内的USB-CDC库存在的问题,另外新的USB库 与 FreeeRTOS 不兼容的问

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:6
  • 最近打卡:2024-03-20 22:27:30

3

主题

31

回帖

106

积分

注册会员

积分
106
发表于 2024-3-8 10:39:22 | 显示全部楼层 |阅读模式
本帖最后由 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 不兼容
何故?何解?




新建位图图像.bmp
回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:6
  • 最近打卡:2024-03-20 22:27:30

3

主题

31

回帖

106

积分

注册会员

积分
106
发表于 2024-3-8 10:58:20 | 显示全部楼层
本帖最后由 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);
}

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:6
  • 最近打卡:2024-03-20 22:27:30

3

主题

31

回帖

106

积分

注册会员

积分
106
发表于 2024-3-8 11:11:46 | 显示全部楼层
在线等,有点急不可耐
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:435
  • 最近打卡:2025-04-30 08:43:23

33

主题

2351

回帖

4860

积分

论坛元老

积分
4860
发表于 2024-3-8 11:20:34 | 显示全部楼层
帮顶一下, 顺便蹲个结果
参考例程并不是对技术参 考手册的补充,而是对技术参 考手册的解释。
技术参 考手册不应该需要参考例程作为补充,而是解释成了参考例程的样子
回复 支持 1 反对 0

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:9
  • 最近打卡:2025-04-23 15:28:46

19

主题

65

回帖

223

积分

等待验证会员

积分
223
发表于 2024-3-8 11:23:30 | 显示全部楼层
dongch*** 发表于 2024-3-8 11:11
在线等,有点急不可耐

这个不是CDC的问题,是printf的问题。也就是putchar()重置的问题
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:6
  • 最近打卡:2024-03-20 22:27:30

3

主题

31

回帖

106

积分

注册会员

积分
106
发表于 2024-3-8 11:31:16 | 显示全部楼层
本帖最后由 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
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:6
  • 最近打卡:2024-03-20 22:27:30

3

主题

31

回帖

106

积分

注册会员

积分
106
发表于 2024-3-8 11:34:39 | 显示全部楼层
本帖最后由 dongchengya 于 2024-3-8 11:48 编辑
5533*** 发表于 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);
}


回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:217
  • 最近打卡:2024-11-15 09:12:27

29

主题

722

回帖

2790

积分

荣誉版主

积分
2790
发表于 2024-3-8 11:49:21 | 显示全部楼层
关于2楼的问题


由于 usb-cdc任务 的优先级最高
该任务不进入阻塞状态,其他低优先级的任务不会运行


可以吧 闪灯(其他)任务 的优先级调高一点
修改 优先级为configDEFAULT_PRIORITIES  +3


xTaskCreate(vBlink,"Blink",configDEFAULT_STACK_SIZE,NULL,configDEFAULT_PRIORITIES + 3,NULL);   //开启Blink任务






截图202403081145591912.jpg
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:6
  • 最近打卡:2024-03-20 22:27:30

3

主题

31

回帖

106

积分

注册会员

积分
106
发表于 2024-3-8 11:51:59 | 显示全部楼层
本帖最后由 dongchengya 于 2024-3-8 11:53 编辑

优先级的问题可能存在,

7楼的问题要怎么办呢?
上位机的串口 是否打开,居然会造成STC32G2K128 单片机的 FreeRTOS  堵塞,这个问题太严重了
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:9
  • 最近打卡:2025-04-23 15:28:46

19

主题

65

回帖

223

积分

等待验证会员

积分
223
发表于 2024-3-8 12:01:01 | 显示全部楼层
dongch*** 发表于 2024-3-8 11:34
把    printf();      换成      USB_SendData();       (具体如下代码 )                     
  结果 ...

使用printf时试一下在初始化之后加一行
TI=1;
回复 支持 反对

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-2 20:41 , Processed in 0.140234 second(s), 112 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表