Я столкнулся с подобными проблемами в своей работе.
На STM32 вы можете просто изменить расположение векторной таблицы во время выполнения, так что это было здорово.
На PIC18 я просто решил не использовать прерывания в загрузчике, поэтому векторы прерываний в 0x08 и 0x18 могут безоговорочно перенаправлять на эквивалентные местоположения в разделе приложения с помощью инструкции GOTO. Вы уверены, что вам нужно использовать прерывания в загрузчике?
Если вам действительно нужны прерывания, я думаю, вам нужно иметь какой-то умный способ сказать во время выполнения, работает ли приложение или запускается загрузчик, чтобы вы могли перенаправить в нужное место. Для простоты вы хотите проверить это, не влияя на регистр STATUS или любую другую часть ОЗУ.
Предлагаю зарезервировать специальный байт ОЗУ, возможно, верхний байт банка доступа. XC8 позволяет расположить переменную абсолютно, поэтому (если он не глючит), вы могли бы сделать это:
unsigned char inBootloader @ 0x5F;
К сожалению, каждое приложение загружается этим загрузчиком должен знать об этой конвенции и определить эту же переменную в такой же место. Или они должны, по крайней мере, избегать записи в это место в памяти и позволить коду загрузчика поддерживать состояние переменной.
Тогда в ваших векторов прерываний в 0x08 и 0x18 положить некоторую простую логику, чтобы перенаправить в нужное место:
btfss inBootloader, 0
goto 0x4008 ; go to application high vector
goto bootloaderHighIsr
ли ваш загрузчик действительно нужно прерывание или в том, что, как вы случилось реализовать? Перед тем, как решить побочный эффект, исследуйте причину. –
На данный момент это не так, я просто удалил любые прерывания в коде загрузчика. – Ammar