anpilog 0 Posted August 13, 2014 · Report post Всем привет, Давненько я ничего не спрашивал 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 Quote Ответить с цитированием Share this post Link to post Share on other sites
Golikov 0 Posted August 13, 2014 · Report post есть проблемы с дровами CDC под виндой, они иногда подвисают и то ли пропускают то ли не отправляют пакет, то ли подтверждения какого-то не дают. Может это эти грабли? Quote Ответить с цитированием Share this post Link to post Share on other sites
anpilog 0 Posted August 13, 2014 · Report post есть проблемы с дровами CDC под виндой, они иногда подвисают и то ли пропускают то ли не отправляют пакет, то ли подтверждения какого-то не дают. Может это эти грабли? Интересно... Впервые о таком слышу. Есть какие-то пруфлинки для погружения в тему? Quote Ответить с цитированием Share this post Link to post Share on other sites
Golikov 0 Posted August 13, 2014 · Report post http://electronix.ru/forum/index.php?showt...FC%ED%FB%E9+COM там я тоже выступал с этим замечанием:) сообщение 11 и дальше. У меня знакомый плотно бился с этой проблемой, у них какая-то система была на виртуальном ком порту и она иногда подвисала в обмене, он долго собирал логи обмена и вердикт был что тупит сторона винды. Они решили проблему таймаутами, увеличили их до каких-то величин это восстановило большую часть обмена, а дальше таймаута сделали ресет шины. Я не претендую на 100% достоверность, знакомый мог все же и ошибиться с вердиктом, но я несколько раз слышал про нарушения обмена в CDC драйверах... Quote Ответить с цитированием Share this post Link to post Share on other sites
toweroff 0 Posted August 13, 2014 · Report post Утверждать прям уж так не буду, но встречал информацию, что если размер блока более 8КБ, то usbser.sys начинает колбасить Quote Ответить с цитированием Share this post Link to post Share on other sites
anpilog 0 Posted August 14, 2014 · Report post http://electronix.ru/forum/index.php?showt...FC%ED%FB%E9+COM там я тоже выступал с этим замечанием:) сообщение 11 и дальше. У меня знакомый плотно бился с этой проблемой, у них какая-то система была на виртуальном ком порту и она иногда подвисала в обмене, он долго собирал логи обмена и вердикт был что тупит сторона винды. Они решили проблему таймаутами, увеличили их до каких-то величин это восстановило большую часть обмена, а дальше таймаута сделали ресет шины. Я не претендую на 100% достоверность, знакомый мог все же и ошибиться с вердиктом, но я несколько раз слышал про нарушения обмена в CDC драйверах... Винда может и тупит, но я проверил это еще и на MacOS. Результат тот же. 8( Что-то там другое... Такое впечатление, что где-то что-то сбрасывается. Сегодня ради интереса поигрался с оптимизацией (О0-О3). Так вот на О3 зависание происходит гораздо реже. Что-то тут не так. Утверждать прям уж так не буду, но встречал информацию, что если размер блока более 8КБ, то usbser.sys начинает колбасить Спасибо. Ну тут таких размеров просто нету... Quote Ответить с цитированием Share this post Link to post Share on other sites