MIPS: почему ISR окружен rdpgpr $sp, $sp; wrpgpr $sp, инструкции $sp?

Я работаю с микроконтроллерами 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 также мало помогает в этих темах. Есть ли действительно хорошая книга, которая охватывает все возможные директивы сборки и так далее?


person Dmitry Frank    schedule 21.07.2014    source источник


Ответы (1)


Когда ядро ​​MIPS входит в ISR, оно может поменять местами активный набор регистров прерванного кода с новым (может быть несколько разных наборов теневых регистров), характерных для этого приоритета прерывания.

Обычно подпрограммы обработки прерываний не имеют собственного стека, и поскольку набор только что включенных теневых регистров определенно имеет свой регистр sp со значением, отличным от регистра прерванного кода, ISR копирует значение sp из только что переключенного кода. теневой регистр установлен в собственный, чтобы иметь возможность использовать стек прерванного кода.

Если хотите, вы можете установить стек вашего ISR на ранее выделенный собственный стек, но обычно это бесполезно.

person user32828    schedule 10.10.2014