wfi
lyszt.net aborda wfi e outras instruções RISC-V com mais detalhes.
Descrição
wfi interrompe o programa até que uma interrupção chegue. As letras significam wait for interrupt (esperar por interrupção). Um programa que não tem nada a fazer fica ocioso aqui em vez de girar por instruções em um loop. Ela não recebe operandos.
wfi
O processador para em wfi e recomeça quando uma interrupção está pendente e seu bit de habilitação em mie está definido. Neste simulador, isso ocorre quando um botão é pressionado e a interrupção do botão está habilitada. O simulador exibe o estado de espera por interrupção e não executa nenhuma instrução durante esse tempo.
O que acontece em seguida depende de mstatus. Se o bit de habilitação global de interrupções estiver definido, o processador aceita a interrupção assim que acorda. O trap escreve o endereço da instrução após wfi em mepc, o handler é executado, e mret retorna para a instrução após wfi. Se o bit de habilitação global estiver limpo, o processador acorda e prossegue para a instrução após wfi sem executar um handler.
Um programa que fica ocioso entre pressionamentos de botão configura mtvec, mie e mstatus, depois repete wfi em um loop.
loop: wfi j loop
Sem nenhuma interrupção habilitada, wfi espera para sempre, então habilite a interrupção antes de alcançá-la. csrs liga os bits de habilitação, e mret retorna do handler.
Exemplo
csrsi mstatus, 8 # allow interrupts wfi # idles here until the button is pressed
