wfi
lyszt.net охватывает wfi и другие инструкции RISC-V более подробно.
Описание
wfi останавливает программу до прихода прерывания. Буквы означают wait for interrupt (ожидание прерывания). Программа, которой нечего делать, простаивает здесь, а не крутится в цикле, выполняя инструкции. Она не принимает операндов.
wfi
Процессор останавливается на wfi и возобновляет работу, когда прерывание ожидает обработки и его бит разрешения в mie установлен. В этом симуляторе это происходит при нажатии кнопки, если прерывание кнопки разрешено. Симулятор отображает состояние ожидания прерывания и не выполняет в это время никаких инструкций.
Что произойдёт дальше, зависит от mstatus. Если глобальный бит разрешения прерываний установлен, процессор принимает прерывание сразу после пробуждения. Ловушка записывает адрес инструкции после wfi в mepc, запускается обработчик, а mret возвращает управление на инструкцию после wfi. Если глобальный бит разрешения сброшен, процессор просыпается и переходит к инструкции после wfi, не запуская обработчик.
Программа, которая простаивает между нажатиями кнопки, настраивает mtvec, mie и mstatus, а затем повторяет wfi в цикле.
loop: wfi j loop
Если ни одно прерывание не разрешено, wfi ждёт вечно, поэтому разрешите прерывание до достижения этой инструкции. csrs включает биты разрешения, а mret возвращает управление из обработчика.
Пример
csrsi mstatus, 8 # allow interrupts wfi # idles here until the button is pressed
