реклама на сайте
подробности

 
 
> Keil STM32F103 USB-CDC вешается
anpilog
сообщение Aug 13 2014, 12:17
Сообщение #1


Частый гость
**

Группа: Свой
Сообщений: 145
Регистрация: 11-12-06
Пользователь №: 23 382



Всем привет,
Давненько я ничего не спрашивал 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


--------------------
---
human traffic - всегда 8)
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 5)
Golikov A.
сообщение Aug 13 2014, 12:52
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



есть проблемы с дровами CDC под виндой, они иногда подвисают и то ли пропускают то ли не отправляют пакет, то ли подтверждения какого-то не дают. Может это эти грабли?
Go to the top of the page
 
+Quote Post
anpilog
сообщение Aug 13 2014, 12:53
Сообщение #3


Частый гость
**

Группа: Свой
Сообщений: 145
Регистрация: 11-12-06
Пользователь №: 23 382



Цитата(Golikov A. @ Aug 13 2014, 15:52) *
есть проблемы с дровами CDC под виндой, они иногда подвисают и то ли пропускают то ли не отправляют пакет, то ли подтверждения какого-то не дают. Может это эти грабли?


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


--------------------
---
human traffic - всегда 8)
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Aug 13 2014, 18:10
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



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

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

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

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

Я не претендую на 100% достоверность, знакомый мог все же и ошибиться с вердиктом, но я несколько раз слышал про нарушения обмена в CDC драйверах...
Go to the top of the page
 
+Quote Post
toweroff
сообщение Aug 13 2014, 18:24
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 2 957
Регистрация: 19-09-06
Из: Москва
Пользователь №: 20 514



Утверждать прям уж так не буду, но встречал информацию, что если размер блока более 8КБ, то usbser.sys начинает колбасить
Go to the top of the page
 
+Quote Post
anpilog
сообщение Aug 14 2014, 09:32
Сообщение #6


Частый гость
**

Группа: Свой
Сообщений: 145
Регистрация: 11-12-06
Пользователь №: 23 382



Цитата(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 начинает колбасить


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


--------------------
---
human traffic - всегда 8)
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 22:06
Рейтинг@Mail.ru


Страница сгенерированна за 0.01409 секунд с 7
ELECTRONIX ©2004-2016