@cheblin -
Далее второй урок, про USB.
USB Host управляет транзакциями по шине. Без его запроса выводить что-то на шину незя.
Контролер USB имеет Endpoint с Descriptor-ами, к которым обращается host.
Endpoint – это типа блока в памяти или аппаратным FIFO с определенным номером. Descriptor-ы описания USB устройства описывают как с ними работать. При запросе Host-а данные из этого блока передаются на шину или с шины в такой блок. Влезть в прерывание USB и остановить всё?
В программе, в которой вы не разобрались, после приема блока по прерыванию выставляется флаг, что в приемной Endpoint есть данные. Но обработка их производится только тогда, когда блок Endpoint передачи пуст, т.к. он один, на его занятость так-же указывает специальный флаг. Какой тут нужен калбасник?
Пока данные из приемного Endpoint не выедены, host не может запихать в него новые. На пришедшую команду в приемной Endpoint необходимо ответить. Для этого принятый фрейм, когда передающий Endpoint свободен, декодируется и формируется ответ в него – в Endpoint передачи. Процедура передачи всего-навсего заполняет FIFO или участок RAM Endpoint передачи и ставит флаг занято. Когда host обратиться к нему – тогда он и будет передан аппаратно. Какой тут нужен калбасник? Влезть в прерывание USB и остановить всё?
У самого устройства основная задача – это стабильно, с минимальным джиттером, по прерыванию таймера опрашивать датчик и складывать данные в буфер.
Когда рабочий буфер заполнен, он перекладывается в буфер передачи фрейма значений и ставится флаг готовности этих данных или счетчик пропуска, если USB не успевает, при достижении определенного кол-ва пропусков отключает это прерывание и основной цикл системы передает ошибку. Это всё в прерывании таймера. Другая метода = непозволительная роскошь.
В итоге основной цикл опрашивает 3 флага и отрабатывает все необходимые задачи – передача в один буфер Endpoint ответов на запросы или блока потока данных. Остальное, включая всю обработку USB, крутиться по прерываниям.
Может накрутить цельный RTOS с семафорами и кучей очередей(QUEUE)?
Приезжайте и вставьте сотню кило и разгоните CPU в имеющихся у меня STM32F103C8T6. Можно проще – дайте бабла на более мощные MCU всем желающим, тогда они встроят в них ваши калбаски.
@cheblin - Где получать от вас бабло или куда писать на поставку надом бесплатных мощных MCU всем желающим встроить в них калбаски?