реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> таблица векторов прерываний, перенос в область boot..
Legotron
сообщение Mar 10 2009, 10:43
Сообщение #1


инопланетянин
***

Группа: Свой
Сообщений: 236
Регистрация: 24-12-06
Из: Питер
Пользователь №: 23 832



Доброго времени суток!

ATMega644, WinAVR 20081124rc3

Возникла проблема: не удается перенести таблицу векторов прерываний в область загрузчика sad.gif
Необходимо изменить IVSEL в течении 4 машинных циклов, пока активен IVCE?

Цитата(ATMega644 Datasheet)
To avoid unintentional changes of Interrupt Vector tables, a special write procedure must
be followed to change the IVSEL bit:
a. Write the Interrupt Vector Change Enable (IVCE) bit to one.
b. Within four cycles, write the desired value to IVSEL while writing a zero to IVCE.


Делаю следующее:
Код
MCUCR |= (1 << IVCE);
MCUCR |= (1 << IVSEL);
MCUCR &= ~(1 << IVCE);


Оптимизация -Os:
Код
MCUCR |= (1 << IVCE);
                           e000:    85 b7           in    r24, 0x35   ; 53
                           e002:    81 60           ori    r24, 0x01   ; 1
                           e004:    85 bf           out    0x35, r24   ; 53
MCUCR |= (1 << IVSEL);
                           e006:    85 b7           in    r24, 0x35   ; 53
                           e008:    82 60           ori    r24, 0x02   ; 2
                           e00a:    85 bf           out    0x35, r24   ; 53
MCUCR &= ~(1 << IVCE);
                           e00c:    85 b7           in    r24, 0x35   ; 53
                           e00e:    8e 7f           andi    r24, 0xFE   ; 254
                           e010:    85 bf           out    0x35, r24   ; 53


По результатам проверки на практике, таблица осталась в области приложения..
Что я делаю неверно, как нужно правильно делать?

Спасибо!
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Mar 10 2009, 10:59
Сообщение #2


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(Legotron @ Mar 10 2009, 12:43) *
Что я делаю неверно, как нужно правильно делать?
Вот для меги8, делайте аналогично: 
Код
GICR = (1<<IVCE);
 GICR = (1<<IVSEL);


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Legotron
сообщение Mar 10 2009, 11:20
Сообщение #3


инопланетянин
***

Группа: Свой
Сообщений: 236
Регистрация: 24-12-06
Из: Питер
Пользователь №: 23 832



Цитата(Сергей Борщ @ Mar 10 2009, 13:59) *
Вот для меги8, делайте аналогично:
Код
GICR = (1<<IVCE);
  GICR = (1<<IVSEL);

То, что я делаю для ATmega64x анологично вашему, только биты в другом регистре находятся..
Сам понимаю, что должно работать, но не работает почему-то sad.gif
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Mar 10 2009, 12:03
Сообщение #4


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(Legotron @ Mar 10 2009, 13:20) *
То, что я делаю для ATmega64x анологично вашему, только биты в другом регистре находятся..
Нет, не аналогично. Смотрите внимательнее.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Legotron
сообщение Mar 10 2009, 13:04
Сообщение #5


инопланетянин
***

Группа: Свой
Сообщений: 236
Регистрация: 24-12-06
Из: Питер
Пользователь №: 23 832



Цитата(Сергей Борщ @ Mar 10 2009, 15:03) *
Нет, не аналогично. Смотрите внимательнее.

Спасибо!
Действительно я был невнимателен smile.gif
Go to the top of the page
 
+Quote Post
Екклесиаст
сообщение Feb 17 2010, 09:41
Сообщение #6





Группа: Новичок
Сообщений: 1
Регистрация: 17-02-10
Из: Барнаул
Пользователь №: 55 529



Цитата(Сергей Борщ @ Mar 10 2009, 16:59) *
Вот для меги8, делайте аналогично: 
Код
GICR = (1<<IVCE);
 GICR = (1<<IVSEL);

Не могли бы вы прислать рабочий код с переносом таблицы векторов. В своём проекте пытался перенести таблицу векторов в загрузочную область - нехотит переноситься. Проблема в том, что иногда затирается начальная область программной памяти и поэтому хотел перенести программу повыше. Но без переноса векторов это невозможно сделать.


--------------------
Всему своё время и время всякой вещи под небом...
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Feb 17 2010, 18:13
Сообщение #7


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(Екклесиаст @ Feb 17 2010, 11:41) *
Не могли бы вы прислать рабочий код с переносом таблицы векторов.
Это код не переноса векторов, а переключения таблиц. У AVR есть вторая таблица - в начале секции загрузчика. Этот код переключает ядро на работу с этой второй таблицей. Чтобы таблица не затиралась вам надо сделать загрузчик полностью отдельным проектом, уместить его полностью в секции загрузчика (средствами скрипта линкера), конфигурационным битом BOOTRST заставить процессор стартовать с вектора RESET этой таблицы и битами BLB запретить запись в секцию загрузчика. А уже загрузчик после старта при необходимости переключит ядро на эту свою таблицу векторов указанным выше кодом.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 9th July 2025 - 17:40
Рейтинг@Mail.ru


Страница сгенерированна за 0.01397 секунд с 7
ELECTRONIX ©2004-2016