mret
lyszt.net obejmuje mret i inne instrukcje RISC-V w większych szczegółach.
Opis
mret powraca z procedury obsługi pułapki. Pułapka występuje, gdy procesor zatrzymuje wykonywany program, aby procedura obsługi mogła przejąć kontrolę. Procedura obsługi to rutyna pod stałym adresem. Urządzenie zgłasza przerwanie, takie jak przycisk na płytce GPIO, i to rozpoczyna pułapkę. Nazwa oznacza powrót w trybie maszynowym.
mret
Gdy rozpoczyna się pułapka, procesor zapisuje adres przerwanej instrukcji w mepc, zapisuje przyczynę w mcause, czyści globalny bit zezwolenia na przerwania w mstatus i skacze do adresu procedury obsługi przechowywanego w mtvec. mret to odwraca. Ładuje licznik programu adresem z mepc i przywraca bit zezwolenia na przerwania, który mstatus zapisał na początku pułapki. Przerwany program wznawia wtedy działanie od instrukcji, którą miał wykonać.
mret nie przyjmuje operandów. Bez niego procesor kontynuuje poza końcem procedury obsługi do kodu, który następuje.
Przerwanie może nadejść między dowolnymi dwiema instrukcjami, a przerwany program nie przygotował się na nie. Dlatego procedura obsługi zapisuje każdy rejestr, który zmienia, i przywraca je przed mret.
Procedura obsługi przycisku również czyści bit oczekiwania przycisku przed mret. Jeśli ten bit pozostanie ustawiony, to samo przerwanie zostanie zgłoszone ponownie, gdy tylko mret ponownie włączy przerwania.
Przykład zapisuje adres target w mepc i wykonuje mret, który tam skacze. Poza prawdziwą pułapką pokazuje to sam skok. Zobacz csrw, aby zapisać CSR.
Przykład
la t0, target csrw mepc, t0 mret # pc = mepc, so execution continues at target target: nop
