Проблема с векторной таблицей в коде приложения и загрузчика - PullRequest
0 голосов
/ 20 ноября 2010

У меня проблема с векторными таблицами (таблицами прерываний), которые находятся в коде загрузчика и не могут быть доступны для моего кода приложения.Что ж, главная проблема заключается в том, что адрес ISR отличается в загрузчике и коде приложения.Итак, мое приложение не запускается.Любое предложение о том, как я могу сделать мой код приложения, чтобы найти правильные адреса рутины ISR из моей таблицы Vector ??

Я использую HCS08 и Code warrior.Это загрузчик USB, который загружается во флэш-память программистом и дополнительно загружает файл S19 через USB.Итак, на моей FLASH есть две программы.

Ответы [ 3 ]

1 голос
/ 20 ноября 2010

HCS08 поддерживает перенаправление векторов, но не несколько таблиц векторов ( см. Цитату в конце моего ответа ). В этой теме представлено интересное обсуждение.Из того, что я прочитал, нет прямого способа использовать несколько векторных таблиц во FLASH на HCS08.Это оставляет вам только несколько вариантов:

  1. Таблица векторов ОЗУ
  2. В вашем загрузчике нет прерываний
  3. Переместите векторы в незащищенную флэш-память и получите как загрузочную, так и загрузочнуюприложение использует эту таблицу

Таблица векторов RAM

Вы можете заставить векторы прерываний искать их адреса в RAM.Для этого вы должны использовать первичную таблицу векторов.Каждый вектор будет установлен на функцию, которая переходит на адрес ОЗУ.Адрес RAM будет местом вашего кода прерывания.

С помощью этой стратегии код вашего приложения и загрузчика может определять разные функции прерывания.Может быть рискованно использовать оперативную память для ваших векторов.

Нет прерываний в загрузчике

Другой вариант - реализовать загрузчик без прерываний.Затем вы можете защитить память загрузчика, перенаправить местоположение вектора и сделать так, чтобы ваша прикладная программа векторной таблицы.

Переместить векторы в незащищенную флэш-память

См. AN2140 для обсужденияэтот метод.

Из таблицы для MC9S08EL / SL следует следующее:

4.5.8 Перенаправление вектора

Всякий раз, когда мигает FLASHзащищен блоком, векторы сброса и прерывания будут защищены.Перенаправление вектора позволяет пользователям изменять информацию вектора прерывания без снятия защиты с загрузчика и сброса векторного пространства.Перенаправление вектора включается путем программирования бита FNORED в регистре NVOPT, расположенного по адресу 0xFFBF, в 0. Чтобы произошло перенаправление, по крайней мере, некоторая часть флэш-памяти должна быть защищена блоком путем программирования регистра NVPROT, расположенного по адресу 0xFFBD.Все векторы прерываний (ячейки памяти 0xFFC0–0xFFFD) перенаправляются, хотя вектор сброса (0xFFFE: 0xFFFF) отсутствует.

Например, если защищено 1024 байта FLASH, область защищенных адресов составляет от 0xFC00 до0xFFFF.Векторы прерываний (0xFFC0–0xFFFD) перенаправляются в местоположения 0xFBC0–0xFBFD.Если перенаправление вектора включено и происходит прерывание, значения в местоположениях 0xFBE0: 0xFBE1 используются для вектора вместо значений в местоположениях 0xFFE0: 0xFFE1.Это позволяет пользователю перепрограммировать незащищенную часть FLASH новым программным кодом, включая новые значения вектора прерывания, оставляя при этом защищенную область, которая включает в себя расположение векторов по умолчанию, без изменений.

См. Также примечание к приложению (AN2295) о реализации серийного загрузчика для этого семейства микросхем.

0 голосов
/ 22 ноября 2010

Я нашел здесь, что кажется правильным, однако это не работает:

*** Bootloader Vector.c: *******

ISR (AS1_InterruptTx) { как м { pshh ldhx # $ DFD4 pshx jmp DO_ISR } } ....... Аналогично для других векторов с другим адресом ...........

............................................... ...................

void DO_ISR () { как м { pulx лдхх, х
cphx # $ FFFF
beq DI1
JSR, х

ЦВЕ 1: pulh Rti } }

************ В заявке Vector.c ******************

Я изменил:

ISR (AS1_InterruptTx)

{

...........

...........

}

Кому:

void AS1_InterruptTx () {

..........

..........

}


Кроме того, я сохранил Векторы на месте по умолчанию в Bootloader, то есть 0xFFC4, и перенаправил таблицу Векторов в коде приложения на 0xDFC4.

Значение NVPROT_INIT равно 0xDE, а NVOPT_INIT равно 0x7E. Хотя это противоречит тому, что должно быть для кода приложения (NVOPT = 0x3E для перенаправления), но мы не можем перезаписать этот регистр, поскольку они защищены. Однако всякий раз, когда возникает прерывание, оно отправляется в таблицу векторов, расположенную в 0xFFC4, которая затем отправляет его в 0xDFC4.

Это хороший способ справиться с этой проблемой?

0 голосов
/ 20 ноября 2010

Я не эксперт HCS08, но часто существуют механизмы для переназначения или перенаправления векторов, чтобы вы могли загружать программное обеспечение и использовать новые векторы прерываний, не мешая загрузчику.Я не знаю, какой именно чип вы используете, но попробуйте найти «Перенаправление вектора» в справочном руководстве по вашему чипу.

...