wfi

wfi

Assembly RISC-V Referência

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