Jump to content

    
Sign in to follow this  
anpilog

Keil STM32F103 USB-CDC вешается

Recommended Posts

Всем привет,

Давненько я ничего не спрашивал 8)

 

Столкнулся тут со странным поведением примеров от Keil.

Если в двух словах, то USBstack на STM32F103RB/C8 виснет под нагрузкой.

 

Предистория длинная и не интересная, так что я постарался упростить все до минимума.

Итак. Берем пример от Keil c:\Keil\ARM\Boards\Keil\MCBSTM32\RL\USB\Device\CDC_ACM\

Берем Nucleo-R103 с STM32F103RB.

Подсоединяем внешний USB разъем:

D- <-> PA11

D+ <-> PA12

Pull-up D+ to VCC, 1.5k resistor.

 

Вырубаем инициализацию LCD. Иначе зависним в ней.

//  lcd_init  ();
//  lcd_clear ();
//  lcd_print ("USB Device Demo ");
//  set_cursor(0, 1);
//  lcd_print ("  www.keil.com  ");

 

Закорачиваем RX и TX для лупбек теста:

PA9-PA10

 

В качестве тестовой апликухи на компьютере написал простенький JS скрипт.

Он просто гонит кучу данный в порт и выводит на экран то что получил.

Проект для Keil и скрипт можно взять тут: https://www.dropbox.com/s/ocbk2c4fenl75eb/CDC_ACM_nucleo.zip

 

Все это работает какое-то время (десятки секунд - несколько минут) а потом затыкается.

Затык выглядит как забытая FIFO на прием или передачу USB.

То есть USBD_CDC_ACM_PutChar или USBD_CDC_ACM_GetChar возвращает -1.

  while (1) {                           /* Loop forever                       */
    NotifyOnStatusChange();             /* Notification handling              */

                                        /* USB -> UART                        */
    if (usb_rx_ch == -1) {
      usb_rx_ch = USBD_CDC_ACM_GetChar ();
    }
    if (usb_rx_ch != -1) {
      if (UART_PutChar (usb_rx_ch) == usb_rx_ch) {
        usb_rx_ch = -1;
      }
    }

                                        /* UART -> USB                        */
    if (usb_tx_ch == -1) {
      usb_tx_ch = UART_GetChar ();
    }
    if (usb_tx_ch != -1) {
      if (USBD_CDC_ACM_PutChar (usb_tx_ch) == usb_tx_ch) {
        usb_tx_ch = -1;
      }
    }
  }

Чаще всего именно USBD_CDC_ACM_PutChar.

Проверил это безобразие на нескольких машинах, парочка Win и один Mac.

И на нескольких процесорах.

 

Кто-то с таким сталкивался?

Сложно в это поверить, так как Keil-овский USB стек популярный.

Что-то мне подсказывает, что наступаю на какие-то давно известные грабли.

 

Regards

Share this post


Link to post
Share on other sites

есть проблемы с дровами CDC под виндой, они иногда подвисают и то ли пропускают то ли не отправляют пакет, то ли подтверждения какого-то не дают. Может это эти грабли?

Share this post


Link to post
Share on other sites
есть проблемы с дровами CDC под виндой, они иногда подвисают и то ли пропускают то ли не отправляют пакет, то ли подтверждения какого-то не дают. Может это эти грабли?

 

Интересно...

Впервые о таком слышу. Есть какие-то пруфлинки для погружения в тему?

Share this post


Link to post
Share on other sites

http://electronix.ru/forum/index.php?showt...FC%ED%FB%E9+COM

 

там я тоже выступал с этим замечанием:)

 

сообщение 11 и дальше.

 

У меня знакомый плотно бился с этой проблемой, у них какая-то система была на виртуальном ком порту и она иногда подвисала в обмене, он долго собирал логи обмена и вердикт был что тупит сторона винды. Они решили проблему таймаутами, увеличили их до каких-то величин это восстановило большую часть обмена, а дальше таймаута сделали ресет шины.

 

Я не претендую на 100% достоверность, знакомый мог все же и ошибиться с вердиктом, но я несколько раз слышал про нарушения обмена в CDC драйверах...

Share this post


Link to post
Share on other sites
http://electronix.ru/forum/index.php?showt...FC%ED%FB%E9+COM

 

там я тоже выступал с этим замечанием:)

 

сообщение 11 и дальше.

 

У меня знакомый плотно бился с этой проблемой, у них какая-то система была на виртуальном ком порту и она иногда подвисала в обмене, он долго собирал логи обмена и вердикт был что тупит сторона винды. Они решили проблему таймаутами, увеличили их до каких-то величин это восстановило большую часть обмена, а дальше таймаута сделали ресет шины.

 

Я не претендую на 100% достоверность, знакомый мог все же и ошибиться с вердиктом, но я несколько раз слышал про нарушения обмена в CDC драйверах...

 

Винда может и тупит, но я проверил это еще и на MacOS.

Результат тот же. 8(

 

Что-то там другое...

Такое впечатление, что где-то что-то сбрасывается.

Сегодня ради интереса поигрался с оптимизацией (О0-О3).

Так вот на О3 зависание происходит гораздо реже.

 

Что-то тут не так.

 

 

Утверждать прям уж так не буду, но встречал информацию, что если размер блока более 8КБ, то usbser.sys начинает колбасить

 

Спасибо.

Ну тут таких размеров просто нету...

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this