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

 
 
> Bootloader. Не работают прерывания.
Jhohn
сообщение Sep 9 2010, 14:09
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 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);
    }
}


Когда код идет с нулевого адреса, все нормально прерывание проходит, светодиод мигает. При переносе кода в загрузчик, выполнение программы "сваливается" куда-то непонятно куда.

Что я делаю не так?

Спасибо
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
xelax
сообщение Sep 16 2010, 14:37
Сообщение #2


Местный
***

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



Потому что в линкере адресация байтовая, а при установке фьюзов адресация пословная указывается.
для avr 1 word = 2 bytes.

отсюда адрес из линкерного скрипта делите пополам и получаете адрес который предлагает AVRStudio при установки фьюзов.
Go to the top of the page
 
+Quote Post
Jhohn
сообщение Sep 17 2010, 06:01
Сообщение #3


Участник
*

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



Цитата(xelax @ Sep 16 2010, 18:37) *
Потому что в линкере адресация байтовая, а при установке фьюзов адресация пословная указывается.
для avr 1 word = 2 bytes.

отсюда адрес из линкерного скрипта делите пополам и получаете адрес который предлагает AVRStudio при установки фьюзов.


Все верно, об этом писал arttab в "bootloader_IAR.pdf" см. тему ( http://electronix.ru/forum/index.php?showt...8301&st=45)

Проделаю, вышесказанное xelax:

"адрес из линкерного скрипта делите пополам"
0xF000 / 2 = 0x7800

"получаете адрес который предлагает AVRStudio при установки фьюзов"
т.е. выставлять должен "boot Flash size=4096 words start address=$7800" при адресе в линкере 0xF000.

Именно так как вы описали я и выставлял fuses, и при этом прерывания не проходили.

Мне не понятно следующее (выставив fuses как описано ниже прерывания стали проходить нормально) :

Fuses:
"boot Flash size=512 words start address=$7F00" адрес в линкере (бут должен начинаться с) $FC00 = 2*$7E00
"boot Flash size=1024 words start address=$7E00" адрес в линкере (бут должен начинаться с) $F800 = 2*$7С00
"boot Flash size=2048 words start address=$7C00" адрес в линкере (бут должен начинаться с) $F000 = 2*$7800
"boot Flash size=4096 words start address=$7800"


AVRStudio 4.18 build 700
IAR C/C++ Compiler for AVR 5.50.0 (5.50.0.50277)

Сообщение отредактировал Jhohn - Sep 17 2010, 09:45
Go to the top of the page
 
+Quote Post
Jhohn
сообщение Oct 4 2010, 09:40
Сообщение #4


Участник
*

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



Цитата(Jhohn @ Sep 17 2010, 10:01) *
Мне не понятно следующее (выставив fuses как описано ниже прерывания стали проходить нормально) :

Fuses:
"boot Flash size=512 words start address=$7F00" адрес в линкере (бут должен начинаться с) $FC00 = 2*$7E00
"boot Flash size=1024 words start address=$7E00" адрес в линкере (бут должен начинаться с) $F800 = 2*$7С00
"boot Flash size=2048 words start address=$7C00" адрес в линкере (бут должен начинаться с) $F000 = 2*$7800
"boot Flash size=4096 words start address=$7800"

AVRStudio 4.18 build 700
IAR C/C++ Compiler for AVR 5.50.0 (5.50.0.50277)


После решения более насущных проблем в другом проекте, взявшись с новыми силами, решил-таки в чем был косяк.
Посылка: вышеописанная цитата не укладывается в логику - значит есть ошибка.
Решение: сравнил биты размера (BOOTSZ1, BOOTSZ0) как их отображает (расшифровывает) AvrStudio, c тем как расшифровывает datasheet T90usb647.pdf и прозрел разницу: 1111493779.gif

AvrStudio: [BOOTSZ1, BOOTSZ0] - [1, 1] - "boot Flash size=512 words start address=$7F00"
datasheet: [BOOTSZ1, BOOTSZ0] - [1, 1] - "Boot Size = 512", "Boot Reset Address (Start Boot Loader Section) = 0x7E00"
и т.д.

AVRStudio 4.18 build 700
AVRStudio 4.18 build 716


В общем, размер указывается правильно (это видно выше: boot Flash size=512) от него и нужно отталкиваться:

Размер_лоадера = 512 words = 1024 byte
Вся_флеш = 65536 byte
Стартовый_адрес_лоадера = Вся_флеш - Размер_лоадера = 65536 - 1024 = 64512 byte = 0xFC00 = 2 * 0x7E00

Сообщение отредактировал Jhohn - Oct 4 2010, 09:43
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Jhohn   Bootloader. Не работают прерывания.   Sep 9 2010, 14:09
- - kolobok0   Цитата(Jhohn @ Sep 9 2010, 18:09) Вектора...   Sep 9 2010, 15:07
|- - Jhohn   Цитата(kolobok0 @ Sep 9 2010, 19:07) тупо...   Sep 10 2010, 09:48
|- - Палыч   Почему это BOOTRST не влияет на выполнение Вашей п...   Sep 10 2010, 11:59
|- - xelax   Стартовый адрес линкерного скрипта для бутлоадера ...   Sep 10 2010, 13:19
|- - Палыч   Цитата(xelax @ Sep 10 2010, 17:19) И ещё ...   Sep 10 2010, 14:12
||- - 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
- - mdmitry   Цитата(xelax @ Sep 16 2010, 18:37) Потому...   Sep 16 2010, 18:10


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

 


RSS Текстовая версия Сейчас: 22nd June 2025 - 08:49
Рейтинг@Mail.ru


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