У программы на микроконтроллере была очень низкая скорость обмена данными с компьютером по USB. Конкретно -- на отправку в компьютер. Отправка производилось чушками по 256 байт. Скорость итоговая составляла около 2.5 KiB/s.

Долго грешил на тактовую частоту USB-модуля, но любые игрища с ней приводили либо к УМЕНЬШЕНИЮ скорости, либо микроконтроллер превращался в тыкву.

Тогда я стал проводить что-то вроде профилирования, чтобы определить, где же теряется время. Обнаружилось, что первый пакет из контроллера приходит в разное время после первого запроса. А все остальные приходят почти точно через 110 мс. Очевидно, проблема в самом контроллере. Такая скорость слишком низка даже для самого младшего стандарта USB.

Я стал думать, нет ли у меня где-нибудь паузы в главном бесконечном цикле прошивки? (на самом деле думал я об этом и раньше, но ничего не нашёл) Прошерстил всё, нашёл в итоге паузу. Но на 10 мс только. После этого пакеты стали приходить ровно через 100 мс.

Явно остальные 100 мс делаю тоже я. Число круглое. Но где? Почему я этого не вижу?

ОКАЗАЛОСЬ, что дело было в команде Pause(delay). А delay была переменной и имела по-умолчанию значение как раз 100. Бинго!

А я-то искал Pause(100) или хотя бы Pause(ЧИСЛО). И глаз за Pause(delay) не зацеплялся -- даже в окне поиска.

После убирания этой задержки скорость обмена выросла в тысячу (!) раз.

Что же делала задержка в главном цикле? Она выполняла роль таймера. Задержки МЕЖДУ измерениями, которые должен был производить контроллер. Но потом я перешёл на вызов измерения по прерыванию и прямая задержка оказалась не нужна. Но убрана не была. Измерениям она не мешала, т.к. они проводились в прерывании. А вот на обмен данными влияла.