Ожидание прерывания
Возможно, вам было интересно, почему в основном цикле мы использовали asm::wfi() (wait for interrupt, «ждать прерывания»), а не что-то вроде asm::nop().
Как говорилось раньше, asm::nop() означает no-operation, «нет операции», и это инструкция, которую процессор выполняет, ничего не делая. Мы вполне могли бы использовать asm::nop() в основном цикле, и программа вела бы себя так же. А вот микроконтроллер вёл бы себя по-другому.
Вызов asm::wfi() переводит процессор в режим «Wait For Interrupt» (WFI). Когда процессор в режиме WFI, он спит, пока не разбудит его прерывание. Во время сна процессор перестаёт выбирать инструкции, отключает некоторые тактовые сигналы и периферию и переходит в состояние низкого энергопотребления, но ядро при этом продолжает оставаться включённым. Когда происходит прерывание, процессор просыпается и продолжает работать как обычно.
Главное различие между asm::wfi() и asm::nop() в том, что инструкция NOP выполняется мгновенно, поэтому в цикле она будет выполняться снова и снова. NOP всё равно нужно выбрать из памяти программы и выполнить, хотя ничего не происходит. У большинства микроконтроллеров, которые вы найдёте, есть режим низкого энергопотребления (у некоторых даже несколько режимов, в каждом из которых включены разные части и потребление различается), который можно (и во многих случаях нужно) использовать для экономии энергии. Инструкция WFI останавливает выполнение в режиме низкого энергопотребления, пока не придёт прерывание.
Некоторые программы, управляемые прерываниями, состоят из одного лишь asm::wfi() в основном цикле, а вся логика программы реализована в обработчиках прерываний.