mret
lyszt.net охоплює mret та інші інструкції RISC-V більш детально.
Опис
mret виконує повернення з обробника пастки. Пастка виникає, коли процесор зупиняє програму, яку виконує, щоб обробник міг перебрати керування. Обробник — це підпрограма за фіксованою адресою. Пристрій спричиняє переривання, наприклад кнопка на платі GPIO, і це запускає пастку. Назва означає повернення в машинному режимі.
mret
Коли починається пастка, процесор зберігає адресу перерваної інструкції в mepc, записує причину в mcause, скидає глобальний біт дозволу переривань у mstatus і переходить за адресою обробника, що зберігається в mtvec. mret скасовує це. Він завантажує лічильник команд адресою з mepc і відновлює біт дозволу переривань, який mstatus зберіг на початку пастки. Перервана програма потім відновлюється з інструкції, яку збиралася виконати.
mret не приймає операндів. Без нього процесор продовжує за кінцем обробника в код, що йде далі.
Переривання може надійти між будь-якими двома інструкціями, і перервана програма не підготувалася до нього. Тому обробник зберігає кожен регістр, який змінює, і відновлює їх перед mret.
Обробник кнопки також скидає біт очікування кнопки перед mret. Якщо цей біт залишиться встановленим, те саме переривання спрацює знову, щойно mret знову увімкне переривання.
Приклад записує адресу target у mepc і виконує mret, який переходить туди. Поза справжньою пасткою це показує сам перехід. Див. csrw для запису CSR.
Приклад
la t0, target csrw mepc, t0 mret # pc = mepc, so execution continues at target target: nop
