G
enby!

Чуть больше о коде в прерываниях: варианты архитектуры, рефакторинг, плохие идеи

Немного теории для общего понимания. А потом сломался USB-хаб… В общем, кодить пришлось в Notion строго на глаз. Всё как в старые недобрые времена кодинга по переписке. Но польза есть — пожалуйста, извлекайте. Таймлайн: 00:00 — Вступление: зачем говорить о прерываниях 00:24 — Почему: embedded, детский микроконтроллер micro:bit и «танцы с бубном» 01:27 — Micro:bit: плюсы для новичков и сложность для C 02:48 — Переходим к «дежурному любимчику» (Arduino) 03:07 — Мифы и страшилки про прерывания: что можно и что нельзя 03:46 — Плохой ISR: «антипример» с задержками, делением, malloc, float, rand, printf 07:21 — Почему это плохо: время, деление, динамическая память, тяжёлые типы 09:11 — printf тормозит всё: место ему не в прерывании 09:50 — Консистентность переменных исчезает: между строками всё может поменяться 10:55 — Глобалы и массивы в прерывании: опасные предположения 11:57 — Итог: в ISR «другая физика времени» и атомарность ломается 12:41 — Ресурсы и скорость: в ISR недоступно/дорого то, что обычно «норм» 13:24 — Связь миров: счётчики и флаги как канал между ISR и основным кодом 14:45 — Два пути: читать мануалы или «щупать руками» 15:33 — Идея: мерить длительность ISR осциллографом по пину 16:01 — Поднимаем пин в начале ISR, опускаем в конце — видим длительность 17:14 — Заготовка кода: таймер по переполнению, настройка пина 13 18:35 — Включаем глобальные прерывания, пустой main 19:06 — Сборка/прошивка: внезапные проблемы с USB/портом 24:02 — Показ ранее залитого кода с искусственной задержкой в ISR 24:40 — Осциллограмма: высокий уровень = время работы ISR, низкий — пауза 25:43 — Без задержки картина другая: ISR должен быть коротким 28:07 — Неудачи с USB: диагностика и попытки оживить 28:13 — Полезное: сама методика измерения осциллографом работает 28:50 — Приём №1: сравнение с порогом (Compare Match) вместо переполнения 29:45 — Настройка регистров под Compare Match: получаем «целые тики в секунду» 30:57 — Шаблон ISR-минимализма: только инкремент счётчиков 31:56 — Проверки переносим в main: сброс счётчика вне ISR 32:45 — Деление внутри ISR заменяем на «степени двойки» 33:30 — Остаток по маске: count & 15 для кратности 16 37:11 — Редкие действия от маски: выполняем 1 раз в 16/32/64 и т.д. 38:20 — Быстрые флаги: битовые поля и OR по маске вместо if 39:21 — Трюк: «беззнаковое вычитание устойчиво к переполнению» 40:24 — Применение: измеряем интервалы времени с переполнением таймера 41:06 — Акцент: работает только с беззнаковыми типами 41:20 — Снижаем частоту работы ISR: счётчик+маска вместо тяжёлой логики 42:51 — Идея «счёт назад»: таймеры с релоадом и порогами 44:07 — Беззнаковое переполнение в пороговой логике таймера 45:54 — Оборачивание ISR: временно запрещать/разрешать прерывания 46:25 — Замечание: нюансы включения прерываний внутри ISR 47:04 — Извинения за «железные» накладки, но выводы полезны 47:24 — Главное: ISR — параллельная вселенная с другими законами 47:59 — Ломается привычка «если мы не меняли — никто не менял» Конспект: https://github.com/olgapavlova/lectur...

Смотрите также