wfi

wfi

RISC-V Assembler Referenz

lyszt.net behandelt wfi und andere RISC-V-Befehle ausführlicher.

Beschreibung

wfi hält das Programm an, bis ein Interrupt eintrifft. Die Buchstaben stehen für wait for interrupt (auf Interrupt warten). Ein Programm, das nichts zu tun hat, wartet hier im Leerlauf, anstatt in einer Schleife durch Anweisungen zu rotieren. Sie nimmt keine Operanden.

wfi

Der Prozessor hält bei wfi an und startet wieder, wenn ein Interrupt ansteht und sein Enable-Bit in mie gesetzt ist. In diesem Simulator geschieht das, wenn eine Taste gedrückt wird und der Interrupt der Taste aktiviert ist. Der Simulator zeigt den Zustand des Wartens auf einen Interrupt an und führt während dieser Zeit keine Anweisungen aus.

Was als Nächstes passiert, hängt von mstatus ab. Wenn das globale Interrupt-Enable-Bit gesetzt ist, nimmt der Prozessor den Interrupt an, sobald er aufwacht. Die Trap schreibt die Adresse der Anweisung nach wfi nach mepc, der Handler wird ausgeführt, und mret kehrt zur Anweisung nach wfi zurück. Wenn das globale Enable-Bit gelöscht ist, wacht der Prozessor auf und fährt mit der Anweisung nach wfi fort, ohne einen Handler auszuführen.

Ein Programm, das zwischen Tastendrücken im Leerlauf wartet, konfiguriert mtvec, mie und mstatus und wiederholt dann wfi in einer Schleife.

loop:
wfi
j loop

Ohne aktivierten Interrupt wartet wfi für immer, also aktiviere den Interrupt, bevor du ihn erreichst. csrs schaltet die Enable-Bits ein, und mret kehrt aus dem Handler zurück.

Beispiel

csrsi mstatus, 8   # allow interrupts
wfi                # idles here until the button is pressed