Я работаю с микроконтроллерами PIC32 (ядро MIPS M4K), я пытаюсь понять, как прерывания работают в MIPS; У меня есть книга «See MIPS Run», официальный справочник MIPS и Google. Никто из них не может помочь мне понять следующее:
Я объявил прерывание следующим образом:
void __ISR(_CORE_TIMER_VECTOR) my_int_handler(void)
Я смотрю на дизассемблирование и вижу, что RDPGPR SP, SP
вызывается в прологе ISR (собственно первая инструкция); и инструкция балансировки WRPGPR SR, SR
вызывается в эпилоге ISR (перед записью ранее сохраненного регистра Status
в CP0 и вызовом ERET
). Я вижу, что эти инструкции предназначены для чтения и сохранения в предыдущем наборе теневых регистров, поэтому RDPGPR SP, SP
читает $sp
из набора теневых регистров, а WRPGPR SR, SR
записывает его обратно, но я не могу понять причину этого. Этот ISR предназначен для того, чтобы не использовать набор теневых регистров, и на самом деле при дизассемблировании я вижу, что контекст сохраняется в стеке. Но по какой-то причине $sp
читается и записывается в тень $sp
. Почему это?
И связанный с этим вопрос: есть ли какой-нибудь действительно всеобъемлющий ресурс (книга или что-то еще) по языку ассемблера MIPS? «See MIPS Run» кажется действительно хорошим, это отличная отправная точка для меня, чтобы копаться в архитектуре MIPS, но она недостаточно хорошо охватывает несколько тем, несколько вещей, которые приходят мне в голову:
- Очень мало информации о режиме EIC (внешний контроллер прерываний): там есть схема с регистром
Cause
, из которой видно, что в режиме EIC у насRIPL
вместоIP7-2
, но нет ничего о том, как это работает (мол, прерывание вызывается, если толькоCause->RIPL
больше, чемStatus->IPL
. Нет даже объяснения, что означаетRIPL
("Запрошенный уровень приоритета прерывания", ну, Google помог). Я понимаю, что EIC зависит от реализации, но вещи, которые я только что упомянул, являются общими. - Язык ассемблера раскрыт недостаточно полно: скажем, ничего о макросах (директивы
.macro
,.endm
), я не нашел ничего о некоторых директивах ассемблера, которые я видел в существующем коде, скажем,.set mips32r2
и так далее. - Я не могу найти ничего об использовании
rdpgpr
/wrpgpr
в ISR, он очень кратко описывает эти инструкции (и вообще наборы теневых регистров).
Официальный справочник MIPS также мало помогает в этих темах. Есть ли действительно хорошая книга, которая охватывает все возможные директивы сборки и так далее?