Создание ISR сборки MIPS под XC32 для MPLABX приводит к сбою процессора
Этот вопрос касается написания ISR на сборке MIPS для проекта, скомпилированного XC32 в MPLABX.
Мой основной проект написан на C, и с этим я успешно перехожу к прерыванию Timer1, написанному так:
void __ISR (_TIMER_1_VECTOR, IPL7SRS) mISR {
// do stuff
}
Однако, когда я пытаюсь заставить работать сборочную версию этого ISR, используя этот формат:
.global TheRealISR
.section .vector_17,code # Note : Timer1 is IRQ 17
.align 2
.set nomips16
.global __vector_dispatch
.ent __vector_dispatch
__vector_dispatch:
j TheRealISR
nop
.end __vector_dispatch
.size __vector_dispatch,.-__vector_dispatch
Я никогда не смогу остановить выполнение программы с помощью точки останова. После включения таймера у меня есть код, находящийся в бесконечном цикле, но (предположительно) после того, как таймер отключается, вместо того, чтобы переходить в ISR, программа переходит к другой части кода.
Некоторые вещи, на которые стоит обратить внимание: версия C ISR также давала сбой, пока я не установил интервал между векторами в 8 байтов в управляющем регистре (по умолчанию он равен нулю при включении питания). Версия MIPS вообще не скомпилировалась бы, если бы я также не установил интервал между векторами равным 8 в файле компоновщика (обратите внимание, версия C и без этого работала правильно!). Мне пришлось установить интервал между векторами равным 16, чтобы MIPS ISR не выдавал исключение, даже несмотря на то, что когда я проверяю сгенерированный файл lst, он занимает не больше места, чем любой из обработчиков исключений по умолчанию. При интервале между векторами 8 процессор немедленно выдает исключение, как только срабатывает таймер, и я даже не могу ничего перехватить в точке останова. Я использую PIC32, и значение в регистре причины сопроцессора 0 равно 0x801c10,должен сказать мне, что источник приравнивается к «зарезервированному»).
В другом ответе на форуме (https://www.microchip.com/forums/m306645.aspx) комментатор сказал, что постер должен посмотреть, как компилятор переводит C-версию ISR, но я не знаю, как это сделать. что. В файле lst я могу смотреть только на окончательные команды сборки, а не на то, как это может быть написано со всеми .section и т. Д., Окружающими его вещами, хотя подразумевалось, что это можно сделать с помощью приведенных ими примеров. Также отмечу, что ISR для таймера Core, приведенного в качестве примера для XC32, выглядит так:
.section .vector_0, code
j CoreTimerIntHandler
nop
... так что я не уверен, как бы я это испортил (примечание: я также пробовал этот простой стиль, но безрезультатно. Этот пример проекта даже не включает собственный скрипт компоновщика, поэтому я не Не знаю, как они избегают проблемы с расстоянием между векторами.Любая помощь здесь будет оценена.