wfi

wfi

RISC-V Ассемблер Ссылка

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