Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Keil STM32F103 USB-CDC вешается
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
anpilog
Всем привет,
Давненько я ничего не спрашивал 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
Golikov A.
есть проблемы с дровами CDC под виндой, они иногда подвисают и то ли пропускают то ли не отправляют пакет, то ли подтверждения какого-то не дают. Может это эти грабли?
anpilog
Цитата(Golikov A. @ Aug 13 2014, 15:52) *
есть проблемы с дровами CDC под виндой, они иногда подвисают и то ли пропускают то ли не отправляют пакет, то ли подтверждения какого-то не дают. Может это эти грабли?


Интересно...
Впервые о таком слышу. Есть какие-то пруфлинки для погружения в тему?
Golikov A.
http://electronix.ru/forum/index.php?showt...FC%ED%FB%E9+COM

там я тоже выступал с этим замечаниемsm.gif

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

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

Я не претендую на 100% достоверность, знакомый мог все же и ошибиться с вердиктом, но я несколько раз слышал про нарушения обмена в CDC драйверах...
toweroff
Утверждать прям уж так не буду, но встречал информацию, что если размер блока более 8КБ, то usbser.sys начинает колбасить
anpilog
Цитата(Golikov A. @ Aug 13 2014, 21:10) *
http://electronix.ru/forum/index.php?showt...FC%ED%FB%E9+COM

там я тоже выступал с этим замечаниемsm.gif

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

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

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


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

Что-то там другое...
Такое впечатление, что где-то что-то сбрасывается.
Сегодня ради интереса поигрался с оптимизацией (О0-О3).
Так вот на О3 зависание происходит гораздо реже.

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


Цитата(toweroff @ Aug 13 2014, 21:24) *
Утверждать прям уж так не буду, но встречал информацию, что если размер блока более 8КБ, то usbser.sys начинает колбасить


Спасибо.
Ну тут таких размеров просто нету...
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.