Dima1060 0 13 апреля, 2017 Опубликовано 13 апреля, 2017 · Жалоба Добрый день! Использую проект Virtual COM port сгенерированный в CubeMX для STM32F429. Немного преобразовал проект, у меня работает один Bulk-out endpoint и один Interrupt-in. Проблема в том, что если я периодически передаю сообщения по Interrupt, используя стандартную функцию CDC_Transmit_HS(uint8_t* Buf, uint16_t Len) и одновременно принимаю данные по Bulk CDC_Receive_HS (uint8_t* Buf, uint32_t *Len) , то иногда зависает посылка по Bulk. Видимо проблема в том, что иногда я в основном цикле вызываю CDC_Transmit_HS и в это время в прерывании вызывается CDC_Receive_HS. Я засунул вызов CDC_Transmit_HS в прерывание USB SOF (по сути разделил эти две функции по времени) и зависания Bulk прекратились. Хотелось бы прояснить, почему так происходит? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SapegoAL 0 13 апреля, 2017 Опубликовано 13 апреля, 2017 · Жалоба Ну, скорее всего, идёт одновременное обращение к одному и тому же аппаратному регистру USB. То есть в голове или задаче у вас читается регистр, и в это время поступает прерывание где этот регистр модифицируется. Далее идёт возврат в основную прогу (или задачу) которые начинают работу с неверным (изменённым) значением регистра. Чтобы этого не происходило, необходимо работать с регистрами в одной задаче либо делать "захват ресурсов". Короче вы должны обеспечить монопольное использование ресурсов. Без коллизий. Типичным примером является флэш память. Например необходимо писать туда сообщения из разных задач. Понятно, что до момента завершения текущей операции, она не должна быть прервана. Осмыслите это и поймёте. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Dima1060 0 20 апреля, 2017 Опубликовано 20 апреля, 2017 · Жалоба Видимо так и есть https://community.st.com/thread/39921-usb-c...ils-on-transmit Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться