dongchengya 发表于 2024-3-8 10:39:22

已解决: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 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);
}

dongchengya 发表于 2024-3-8 11:11:46

在线等,有点急不可耐{:shy:}

_奶咖君_ 发表于 2024-3-8 11:20:34

帮顶一下, 顺便蹲个结果{:4_171:}

55337575 发表于 2024-3-8 11:23:30

dongchengya 发表于 2024-3-8 11:11
在线等,有点急不可耐

这个不是CDC的问题,是printf的问题。也就是putchar()重置的问题

dongchengya 发表于 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

dongchengya 发表于 2024-3-8 11:34:39

本帖最后由 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);
}


gentleman 发表于 2024-3-8 11:49:21

关于2楼的问题


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


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


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






dongchengya 发表于 2024-3-8 11:51:59

本帖最后由 dongchengya 于 2024-3-8 11:53 编辑

gentleman 发表于 2024-3-8 11:49
关于2楼的问题



优先级的问题可能存在,

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

55337575 发表于 2024-3-8 12:01:01

dongchengya 发表于 2024-3-8 11:34
把    printf();      换成      USB_SendData();       (具体如下代码 )                     
结果 ...

使用printf时试一下在初始化之后加一行
TI=1;
页: [1] 2
查看完整版本: 已解决:FreeeRTOS内的USB-CDC库存在的问题,另外新的USB库 与 FreeeRTOS 不兼容的问