|
Bootloader. Не работают прерывания. |
|
|
|
Sep 9 2010, 14:09
|
Участник

Группа: Участник
Сообщений: 65
Регистрация: 12-11-08
Пользователь №: 41 579

|
Здравствуйте, уважаемые форумчание! Пишу загрузчик в IAR 5.5. Загрузчик, как положено, отдельным проектом. Вектора и код переместил в загрузочную область: Файл lnkusb647s.xclКод . . . /* Code (flash) segments */ -D_..X_INTVEC_SIZE=F098 /* 4 bytes * 38 vectors */ . . . /* Code memory */ -Z(CODE)INTVEC=F000-(_..X_INTVEC_SIZE-1)
/* Fill unused interrupt vector's with RETI */ -H1895 -h(CODE)F000-_..X_INTVEC_SIZE . . . Код и вектора переместились, это видно из чтения памяти программ. Начало векторов расположено с адреса 0хF000, следом идет код. Код программы: Код . . . int main(void) { __enable_interrupt(); // разрешение прерываний (sei) DDRD |= (1 << PD7); // управление светодиодом EIMSK |= (1 << INT0); // разрешение прерывания MCUCR |= (1 << IVCE); // для записи IVSEL MCUCR = (1 << IVSEL); // вектора в загрузочной области
for(;;) {
} return 0; } #pragma vector = INT0_vect __interrupt void INT0_interrupt() { for(;;) { PORTD |= (1 << PD7); __delay_cycles(4000000);
PORTD &= ~(1 << PD7); __delay_cycles(4000000); } } Когда код идет с нулевого адреса, все нормально прерывание проходит, светодиод мигает. При переносе кода в загрузчик, выполнение программы "сваливается" куда-то непонятно куда. Что я делаю не так? Спасибо
|
|
|
|
|
 |
Ответов
|
Sep 9 2010, 15:07
|
практикующий тех. волшебник
    
Группа: Участник
Сообщений: 1 190
Регистрация: 9-09-05
Пользователь №: 8 417

|
Цитата(Jhohn @ Sep 9 2010, 18:09)  Вектора и код переместил в загрузочную область...Когда код идет с нулевого адреса, все нормально...При переносе кода в загрузчик, выполнение программы "сваливается"... тупой вопрос: при программировании кристалла фьюзы выставляете правильно? адресс RESET вектора совпадает с вашим значением в .org ? (круглый)
|
|
|
|
|
Sep 10 2010, 09:48
|
Участник

Группа: Участник
Сообщений: 65
Регистрация: 12-11-08
Пользователь №: 41 579

|
Цитата(kolobok0 @ Sep 9 2010, 19:07)  тупой вопрос: при программировании кристалла фьюзы выставляете правильно? адресс RESET вектора совпадает с вашим значением в .org ? Микроконтроллер at90usb. Вне зависимости от значения fuses bit BOOTRST программа стартует в main(), я это проверял с помощью следующего кода: Код int main(void) { __enable_interrupt(); // разрешение прерываний (sei) DDRD |= (1 << PD7); // управление светодиодом EIMSK |= (1 << INT0); // разрешение прерывания MCUCR |= (1 << IVCE); // для записи IVSEL MCUCR = (1 << IVSEL); // вектора в загрузочной области
for(;;) { PORTD |= (1 << PD7); __delay_cycles(400000);
PORTD &= ~(1 << PD7); __delay_cycles(400000); } return 0; } Не важно выставлен или сброшен бит BOOTRST программа стартует с адекватно с загрузочной области - светодиод мигает, когда запрещены все прерывания, при разрешении прерываний (sei) программа "сваливается".
|
|
|
|
|
Sep 10 2010, 13:19
|

Местный
  
Группа: Свой
Сообщений: 370
Регистрация: 7-11-06
Пользователь №: 22 035

|
Стартовый адрес линкерного скрипта для бутлоадера совпадает с физическим адресом, который получается с установлением фьюзами размера бутлоадера? Код MCUCR |= (1 << IVCE); // для записи IVSEL MCUCR = (1 << IVSEL); // вектора в загрузочной области И ещё есть большое подозрение, что проблема здесь. Вы смотрели дизасмом после установки IVCE вы успеваете за 4 такта установить IVSEL?
|
|
|
|
|
Sep 10 2010, 14:12
|

Гуру
     
Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954

|
Цитата(xelax @ Sep 10 2010, 17:19)  И ещё есть большое подозрение, что проблема здесь. Вы смотрели дизасмом после установки IVCE вы успеваете за 4 такта установить IVSEL? Скорее всего, проблема не в этом... Наверное, программа прошита не в области бута, а с нулевого адреса. Поэтому она (программа) и стартует при любом BOOTRST: в одном случае - и должна, в другом - пытаются выполниться команды FFFF до тех пор, пока указатель не сбросится в ноль. При выполнении программы перемещаются вектора (изменяется IVSEL) в бут, но поскольку бут пуст, то по прерыванию опять выполняются команды FFFF до сброса указателя в ноль - на начало программы; программа начинает выполняться - и всё заново по кругу...
|
|
|
|
Сообщений в этой теме
Jhohn Bootloader. Не работают прерывания. Sep 9 2010, 14:09  Палыч Почему это BOOTRST не влияет на выполнение Вашей п... Sep 10 2010, 11:59    Jhohn Чтение памяти Flash - см. ПРИКРЕПЛЕННЫЙ ФАЙЛ Sep 14 2010, 12:07     IJAR Цитата(Jhohn @ Sep 14 2010, 16:07) Чтение... Sep 14 2010, 13:21      Jhohn Цитата(IJAR @ Sep 14 2010, 17:21) >:10... Sep 14 2010, 13:28       IJAR Цитата(Jhohn @ Sep 14 2010, 17:28) Хм, ка... Sep 14 2010, 13:39        Jhohn Цитата(IJAR @ Sep 14 2010, 17:39) А Вы мо... Sep 14 2010, 13:44         Jhohn Попробовал исправить на 1Е000 комилятор ругается.
... Sep 14 2010, 13:50          IJAR Цитата(Jhohn @ Sep 14 2010, 17:50) Попроб... Sep 14 2010, 14:09           Jhohn Цитата(IJAR @ Sep 14 2010, 18:09) Так, я ... Sep 14 2010, 14:21            IJAR Цитата(Jhohn @ Sep 14 2010, 18:21) Извиня... Sep 14 2010, 14:33             Jhohn Цитата(IJAR @ Sep 14 2010, 18:33) Только ... Sep 14 2010, 14:46             Jhohn Цитата(IJAR @ Sep 14 2010, 18:33) У Вас т... Sep 16 2010, 13:53        IJAR И еще
/* Code (flash) segments */
-D_..X_INTVEC_SI... Sep 14 2010, 13:47   Jhohn Цитата(xelax @ Sep 10 2010, 17:19) Старто... Sep 14 2010, 06:59 xelax Потому что в линкере адресация байтовая, а при уст... Sep 16 2010, 14:37 mdmitry Цитата(xelax @ Sep 16 2010, 18:37) Потому... Sep 16 2010, 18:10 Jhohn Цитата(xelax @ Sep 16 2010, 18:37) Потому... Sep 17 2010, 06:01  Jhohn Цитата(Jhohn @ Sep 17 2010, 10:01) Мне не... Oct 4 2010, 09:40
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|