Форум Микро-Чип
Поиск и заказ электронных компонентов
 

Вернуться   Форум Микро-Чип > Продукция MICROCHIP

Продукция MICROCHIP Технические вопросы по всей продукции Microchip

Ответ
 
Опции темы Опции просмотра
Старый 09.03.2017, 18:25   #1
Sergey K
Senior Member
 
Регистрация: 23.10.2008
Адрес: Киев
Возраст: 34
Сообщений: 229
Вес репутации: 422/38
Sergey K is just really niceSergey K is just really niceSergey K is just really niceSergey K is just really niceSergey K is just really nice
По умолчанию PIC24: remaping IVT

Пытаюсь написать Bootloader для PIC24 и застрял на переадресации таблицы прерываний.
Компилятор: ССS.
МК: PIC24FJ256GB206, у него таблица прерываний размещена по адресу от 0x4 до 0x1FE.
Я хочу сделать переадресацию на 0x204, но столкнулся со следующей непоняткой: у PIC24 оператор goto занимает два слова, тогда как в таблице прерываний каждому слову назначено свое прерывание.
К примеру:
0x06 - Oscillator failure
0x08 - Address Error
0x0A - Stack Error
Если я размещу по адресу 0x06 оператор goto 0x206, то после компиляции он займет два слова, и по адресу 0x08 будет часть адреса оператора goto, поэтому по адресу 0x08 я уже не могу разместить следующий оператор goto, а только 0x0A, а это уже вектор от Stack Error, а "Address Error" я уже пропустил.

Как же правильно строится выход из этой таблицы одной командой? Или я не могу одновременно обрабатывать два вектора рядом, а должен выполнить переход из последнего а там дальше самому разобраться, который из двух вызвал прерывание?

В интернете нашел эту тему, но там они строили код, который по адресу 0x06 записывает число 0x206, а в машинных кодах это операторnop а не goto. Там я совсем не понял, как переход из таблицы выполняется. Правда, и у них это не работало, насколько я понял.

На скриншоте хорошо видно "наложение" операторов goto в строках 7 и 8.
Миниатюры
ivr.png  
Sergey K вне форума   Ответить с цитированием
Старый 09.03.2017, 21:25   #2
besogon
Senior Member
 
Регистрация: 12.07.2012
Возраст: 30
Сообщений: 1,314
Вес репутации: 2626/57
besogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond repute
По умолчанию Re: PIC24: remaping IVT

The value programmed into each interrupt vector location is the starting address of the associated Interrupt Service Routine.
besogon вне форума   Ответить с цитированием
Старый 09.03.2017, 22:32   #3
Sergey K
Senior Member
 
Регистрация: 23.10.2008
Адрес: Киев
Возраст: 34
Сообщений: 229
Вес репутации: 422/38
Sergey K is just really niceSergey K is just really niceSergey K is just really niceSergey K is just really niceSergey K is just really nice
По умолчанию Re: PIC24: remaping IVT

Посмотрел, что штатно генерирует компилятор ХС16 для этого микроконтроллера и теперь еще в большем ступоре от того, как это работает
В таблице прерываний указывается не команда, а только адрес перехода?
Миниатюры
qqq.png  
Sergey K вне форума   Ответить с цитированием
Старый 10.03.2017, 07:41   #4
besogon
Senior Member
 
Регистрация: 12.07.2012
Возраст: 30
Сообщений: 1,314
Вес репутации: 2626/57
besogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond repute
По умолчанию Re: PIC24: remaping IVT

Sergey K
да.
besogon вне форума   Ответить с цитированием
Старый 10.03.2017, 10:11   #5
Sergey K
Senior Member
 
Регистрация: 23.10.2008
Адрес: Киев
Возраст: 34
Сообщений: 229
Вес репутации: 422/38
Sergey K is just really niceSergey K is just really niceSergey K is just really niceSergey K is just really niceSergey K is just really nice
По умолчанию Re: PIC24: remaping IVT

Спасибо, с этим моментом прояснилось, но теперь появилась згавоздка далее.
Компилятор ХС16.
В файле .gld можно указать новое расположение вектора прерывания. Кусок Микрочиповского примера:
Код:
SECTIONS
{

/*
** Interrupt Vector Table
*/
.ivt __IVT_BASE :
  {
....
    /* Int Vector Remap Method 1 – point to application’s ISR location */
    LONG( ABSOLUTE(0x1800)); /*T1 interrupt - location of T1Interrupt ISR*/
....
    /* Int Vector Remap Method 2 –point to a location in a jump table */
    LONG(ABSOLUTE(0x2004)); /*T2 Interrupt - location of jump table goto instruction*/
....
  } >ivt
Здесь они предлагают два варианта: 1. Перенос вектора в пользовательскую область, где будет новая таблица и 2. это сразу указывается адрес обработчика.
Как работает второй вариант - мне понятно, но он подходит только для отлаженной программы, где эти адреса не меняются или заданы жестко, но когда программа многократно дорабатывается предусмотреть все эти адреса очень сложно.
А вот как работает первый вариант? Ведь компилятор по этим адресам разместит не команду goto isr_vector, а только адрес. При возникновении прерывания МК прочитает адрес по штатному вектору прерывания и прыгнет туда, куда было указанно в программе бутлоадера, а по новому адресу будет только еще один адрес, без команды перехода.
Получается, что пользователь должен сам написать функцию, которая будет размещаться уже в основной программе, в следующей ячейке за новым адресом вектора прерывания в пользовательской области и будет считывать этот самый адрес и делать переход?
В этой теме проглядывается нечто похожее на это, в виде функции:
Код:
/*************************** BOOTLOAD USE ISR JUMP TABLE *******************/ 
void __attribute__ ((address(0x10000))) ISRTable(){ 
 asm("reset"); //reset instruction to prevent runaway code 
 asm("goto %0"::"i"(&_T2Interrupt));  //T2Interrupt's address  //10004 
 asm("goto %0"::"i"(&_T3Interrupt));  //T2Interrupt's address  //10006 
 asm("goto %0"::"i"(&_T1Interrupt));  //T2Interrupt's address  //10008
...
хотя в примере от Микрочипа ничего похожего не вижу.

Посмотрел пример от ССS, так там они сделали гораздо проще: бутлоадер находится в конце памяти программ и вызывается из пользовательской прошивки, причем, после запуска он стирает всю флеш (кроме себя) и если не загрузить новую правильную прошивку после запуска бутлоадера, то МК уже не запустится без перепрошивки программатором.
Sergey K вне форума   Ответить с цитированием
Старый 10.03.2017, 10:40   #6
besogon
Senior Member
 
Регистрация: 12.07.2012
Возраст: 30
Сообщений: 1,314
Вес репутации: 2626/57
besogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond repute
По умолчанию Re: PIC24: remaping IVT

Sergey K
что конкретно Вам непонятно?
что в таблице лежат адреса в которые прыгнет, когда будет прерывание?
besogon вне форума   Ответить с цитированием
Старый 10.03.2017, 12:29   #7
Sergey K
Senior Member
 
Регистрация: 23.10.2008
Адрес: Киев
Возраст: 34
Сообщений: 229
Вес репутации: 422/38
Sergey K is just really niceSergey K is just really niceSergey K is just really niceSergey K is just really niceSergey K is just really nice
По умолчанию Re: PIC24: remaping IVT

С таблицей я разобрался.

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

Вопрос в том, то по вектору прерывания указывается адрес куда переходить. В нем я указываю адрес, где я размещу таблицу прерываний основной программы.
Далее, уже в основной программе в файле .gld (компилятор ХС16) указываю новые адреса для прерываний. Но т.к. компилятор не знает, что это уже не таблица прерываний, а другое место, то он по этим адресам разместит не "goto _адрес_обработчика_конкретного_прерывания_", а только сам адрес, а так это уже не основания таблица прерываний, то микроконтроллер уже не будет повторно делать прыжок, а будет выполнять команду по этому адресу. Если я правильно понял, то нужно самому как-то заменять "_эти_просто_адреса_" на "goto _эти_просто_адреса_". Вот здесь и не понятно, как это сделать средствами компилятора, а не самому выискивать эти адреса и править в HEX-файле.
Sergey K вне форума   Ответить с цитированием
Ответ


Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 
Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
bootloader pic24 open your soul Продукция MICROCHIP 11 27.02.2013 10:16
PIC24 и CCD-матрица gontharov Продукция MICROCHIP 23 30.10.2008 09:19
CCS для PIC24 Alexey Belodvortsev Продукция MICROCHIP 2 10.02.2008 10:32
pic24 не пойму как подключaется ICD2 pic18 Продукция MICROCHIP 2 26.04.2007 17:49
dsPICC для PIC24 PVV Продукция MICROCHIP 10 27.03.2007 19:20


Часовой пояс GMT +3, время: 23:10.


Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd. Перевод: zCarot