Ах, микроконтроллеры — эти маленькие электронные шутники, которые делают нашу жизнь проще, хотя сами порой ведут себя как капризные дети! Помните, как в детстве пытались понять, почему часы на стене идут не так быстро, как хочется?
Так вот, внутри процессоров всё примерно так же: время — понятие относительное и весьма многогранное. Сегодня поговорим о том, что происходит с тактами и циклами в микроконтроллерах — да-да, тех самых крошках, которые управляют практически всем вокруг.
Начну с небольшого признания: когда я впервые столкнулся с понятием «такты» и «машинные циклы», мне казалось, что это какая-то тайная магия. Помню даже анекдот: инженер объясняет своему другу-программисту про тактирование процессора.
Тот в ответ: «Тактовая частота? А у меня дома такой нет!» Но если серьезно, то разобраться в этих загадочных сигналах — значит понять, как именно наш маленький электронный друг успевает выполнять команды. И тут начинается самое интересное!
В комментариях к одной из моих статей по микроконтроллерам возникла дискуссия о схемах тактирования. Сначала я думал: «Ну кому это надо?» Но потом понял — народ горит!
Значит будем копать глубже. Представьте себе 8-битный микроконтроллер PIC — он как старый добрый дедушка среди современных гаджетов. Ему уже далеко не вчерашний день рождения праздновали, но он всё ещё бодр и весел.
Его машинный цикл состоит из четырёх тактов — словно четыре шага танца под названием Fosc/4 (а вы думали Fosc это просто звук? Нет-нет!). Это значит, что процессор работает на одной частоте, а остальные его блоки, такие как таймеры или АЦП, пляшут медленнее — ровно в четыре раза.
Но вот забавный момент: в документации пишут, что большинство команд выполняется за один машинный цикл. Звучит круто!
Однако на деле выходит смешно: любая команда занимает минимум два цикла! Это всё равно что сказать человеку: «Ты можешь пробежать километр за 5 минут», а он отвечает: «Да я сначала надеваю кроссовки и завязываю шнурки!» Вот эти подготовительные этапы — выборка и декодирование команды — никто не учитывает в рекламе быстродействия.
Как говорил мой знакомый программист: «Процессор работает быстро? Да ну!
Он просто умеет хорошо притворяться!» На самом деле выполнение команды проходит через несколько этапов — выборка (F), декодирование (D) и выполнение (E). Иногда эти этапы можно объединить или пропустить лишние шаги (если операнды уже лежат под рукой), но принцип остаётся тем же.
Если взглянуть на примеры других микроконтроллеров вроде AVR или STM8, то увидим похожую картину. Производители любят выделять отдельные этапы выполнения команд для внутреннего пользования и обычно не афишируют их при описании скорости работы устройства.
Это напоминает ситуацию из жизни: официант приносит вам блюдо за 10 минут после заказа и говорит «Мы очень быстрые», забывая упомянуть время приготовления на кухне.
А теперь представьте себе конвейер на заводе по производству бутербродов. Каждый сотрудник выполняет свою задачу параллельно с другими — один намазывает масло, другой кладёт колбасу, третий нарезает огурцы… В микроконтроллерах тоже есть подобный конвейер команд. Благодаря ему кажется, что всё происходит мгновенно и одновременно. Но если снять розовые очки рекламных буклетов производителей и заглянуть внутрь схемы синхронизации работы узлов процессора… Тут начинается настоящее веселье!