2014-01-15 2 views
2

Мой загрузчик должен использовать вектор прерывания, но также и моя прикладная программа. Высокий вектор начинается по адресу 0x08, а нижний вектор начинается по адресу 0x18.Как вы обрабатываете прерывания в загрузчике?

Как можно делиться векторами прерываний, чтобы у меня была отдельная функция прерывания в загрузчике и в загруженном приложении? Я использую компилятор PIC18F87J11 и MPLAB XC8.

+2

ли ваш загрузчик действительно нужно прерывание или в том, что, как вы случилось реализовать? Перед тем, как решить побочный эффект, исследуйте причину. –

+0

На данный момент это не так, я просто удалил любые прерывания в коде загрузчика. – Ammar

ответ

3

Я столкнулся с подобными проблемами в своей работе.

На 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 
+0

Я просто избегу использовать прерывания в загрузчике, но я понимаю ваш ответ, если мне нужно взять другой маршрут. – Ammar

+2

Обратите внимание, что перемещение векторной таблицы на STM32 является особенностью всех основных устройств ARM Cortex-M3/4, а не только STM32. – Clifford

+0

Справа, Клиффорд, я должен был только сказать Cortex-M3 в своем ответе. –

Смежные вопросы