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

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

[复制链接]
  • TA的每日心情
    奋斗
    2024-3-20 22:27
  • 签到天数: 6 天

    [LV.2]偶尔看看I

    2

    主题

    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
    回复 送花

    使用道具 举报

  • TA的每日心情
    奋斗
    2024-3-20 22:27
  • 签到天数: 6 天

    [LV.2]偶尔看看I

    2

    主题

    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);
    }

    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    奋斗
    2024-3-20 22:27
  • 签到天数: 6 天

    [LV.2]偶尔看看I

    2

    主题

    31

    回帖

    106

    积分

    注册会员

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

    使用道具 举报

  • TA的每日心情
    慵懒
    9 小时前
  • 签到天数: 166 天

    [LV.7]常住居民III

    21

    主题

    1247

    回帖

    3027

    积分

    论坛元老

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

    使用道具 举报

  • TA的每日心情
    开心
    2024-3-22 08:53
  • 签到天数: 7 天

    [LV.3]偶尔看看II

    13

    主题

    54

    回帖

    355

    积分

    等待验证会员

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

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

    使用道具 举报

  • TA的每日心情
    奋斗
    2024-3-20 22:27
  • 签到天数: 6 天

    [LV.2]偶尔看看I

    2

    主题

    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
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    奋斗
    2024-3-20 22:27
  • 签到天数: 6 天

    [LV.2]偶尔看看I

    2

    主题

    31

    回帖

    106

    积分

    注册会员

    积分
    106
     楼主| 发表于 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);
    }


    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    奋斗
    11 小时前
  • 签到天数: 151 天

    [LV.7]常住居民III

    29

    主题

    560

    回帖

    2198

    积分

    荣誉版主

    积分
    2198
    发表于 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
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    奋斗
    2024-3-20 22:27
  • 签到天数: 6 天

    [LV.2]偶尔看看I

    2

    主题

    31

    回帖

    106

    积分

    注册会员

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

    优先级的问题可能存在,

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

    使用道具 举报

  • TA的每日心情
    开心
    2024-3-22 08:53
  • 签到天数: 7 天

    [LV.3]偶尔看看II

    13

    主题

    54

    回帖

    355

    积分

    等待验证会员

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

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

    使用道具 举报

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

    本版积分规则

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

    GMT+8, 2024-6-13 19:53 , Processed in 0.090349 second(s), 69 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

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