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

 
 
> Не выходит одолеть прерывания в Bootloader'е
Sirko
сообщение Apr 11 2011, 00:06
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 245
Регистрация: 15-08-07
Пользователь №: 29 795



За основу было взято вот Это. Вернее хочу использовать Makefile от сюда.
CODE
#include <stdint.h>
#include <avr/io.h>
#include <avr/wdt.h>
#include <avr/boot.h>
#include <avr/pgmspace.h>
#include <avr/eeprom.h>
#include <avr/interrupt.h>
#include <util/delay.h>

#if defined(BOOTLOADERHASNOVECTORS)
#warning "This Bootloader does not link interrupt vectors - see makefile"
/* make the linker happy - it wants to see __vector_default */
// void __vector_default(void) { ; }

void __vector_default(void) { ; }
#endif

volatile unsigned char b = 0;

ISR(TIMER0_COMP_vect){
b = 1;
}

ISR(TIMER0_OVF_vect){
b = 1;
}

int main(void){

TCCR0 = _BV(CS02) | _BV(CS00);
OCR0 = 100;
TIMSK |= _BV(OCIE0) | _BV(TOIE0);
MCUCR |= (1<<IVCE); // Enable change of Interrupt Vectors
MCUCR |= (1<<IVSEL); // Move interrupts to Boot Flash section


DDRE |= _BV(PE7);
unsigned long x = 0;
while(1){
asm("sei");
x = (cool.gif ? (1UL<<15) : (1UL<<18);
while(--x){asm("nop");}
PORTE ^= _BV(PE7);
}
return 0;
}
Тест не мудреный, Если прерывания запретить, то лампа моргает редко. Если разрешить, - то почащще. А в моем случае, при разрешении прерывания она не горит вовсе. Вероятно при наступлении прерывания происходит улет в ???.
Проц - Mega128, компилятор - WinAVR-20100110.
LDFLAGS += -Wl,--section-start=.text=0x1E000, наверное
НЕХ на выходе начинается вот так:
:020000021000EC
:10E0000011241FBECFEFD0E1DEBFCDBF11E0A0E0F5
Фьюзы настроены на 4кБ, addr-$F000

Что где править, ума не приложу.
А проект, если понадобится прилагаю.
Прикрепленный файл  Bootloader.zip ( 31.25 килобайт ) Кол-во скачиваний: 112


Сообщение отредактировал Sirko - Apr 11 2011, 22:02
Причина редактирования: [codebox]
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Sirko
сообщение Apr 14 2011, 22:20
Сообщение #2


Местный
***

Группа: Участник
Сообщений: 245
Регистрация: 15-08-07
Пользователь №: 29 795



Добрался - таки я до загрузчика и, пользуясь случаем, решил немного расписать последовательность.
Думаю кому-нибудь вроде меня пригодится для пинка.

Значит так, лезем сюда, забираем вот это.
Кстати, спасибо DI HALT за то, что "озвучил" этот bootloader на родном языке.

Так вот, из всего этого мне понадобились makefile и папка со скриптами. В makefile необходимо: выбрать тип проца, выбрать размер загрузчика, разрешить прерывания, ну и вроде бы все. Дальше - творческая работа.
Чуть не забыл, после правки makefile необходимо выполнить Rebild All, иначе изменения не производятся.

Для примера приведу исходник демо-моргалки, которая при включении моргает десять раз с частотой 1Гц, затем прошивает основную программу, после чего передает ей управление. В задачу основной программы входит моргание сигнала "SOS".

CODE
#include <avr/io.h>
#include <avr/boot.h>
#include <avr/interrupt.h>

uint8_t Data[816] = { // Это бинарник основной (демо) программы, которую необходимо прошить
0x0C, 0x94, 0x46, 0x00, 0x0C, 0x94, 0x65, 0x00, 0x0C, 0x94, 0x65, 0x00, 0x0C, 0x94, 0x65, 0x00,
0x0C, 0x94, 0x65, 0x00, 0x0C, 0x94, 0x65, 0x00, 0x0C, 0x94, 0x65, 0x00, 0x0C, 0x94, 0x65, 0x00,
0x0C, 0x94, 0x65, 0x00, 0x0C, 0x94, 0x65, 0x00, 0x0C, 0x94, 0x65, 0x00, 0x0C, 0x94, 0x65, 0x00,
0x0C, 0x94, 0x65, 0x00, 0x0C, 0x94, 0x65, 0x00, 0x0C, 0x94, 0x67, 0x00, 0x0C, 0x94, 0x65, 0x00,
0x0C, 0x94, 0x65, 0x00, 0x0C, 0x94, 0x65, 0x00, 0x0C, 0x94, 0x65, 0x00, 0x0C, 0x94, 0x65, 0x00,
0x0C, 0x94, 0x65, 0x00, 0x0C, 0x94, 0x65, 0x00, 0x0C, 0x94, 0x65, 0x00, 0x0C, 0x94, 0x65, 0x00,
0x0C, 0x94, 0x65, 0x00, 0x0C, 0x94, 0x65, 0x00, 0x0C, 0x94, 0x65, 0x00, 0x0C, 0x94, 0x65, 0x00,
0x0C, 0x94, 0x65, 0x00, 0x0C, 0x94, 0x65, 0x00, 0x0C, 0x94, 0x65, 0x00, 0x0C, 0x94, 0x65, 0x00,

0x0C, 0x94, 0x65, 0x00, 0x0C, 0x94, 0x65, 0x00, 0x0C, 0x94, 0x65, 0x00, 0x11, 0x24, 0x1F, 0xBE,
0xCF, 0xEF, 0xD0, 0xE1, 0xDE, 0xBF, 0xCD, 0xBF, 0x11, 0xE0, 0xA0, 0xE0, 0xB1, 0xE0, 0xE0, 0xE3,
0xF3, 0xE0, 0x00, 0xE0, 0x0B, 0xBF, 0x02, 0xC0, 0x07, 0x90, 0x0D, 0x92, 0xA0, 0x30, 0xB1, 0x07,
0xD9, 0xF7, 0x11, 0xE0, 0xA0, 0xE0, 0xB1, 0xE0, 0x01, 0xC0, 0x1D, 0x92, 0xA1, 0x30, 0xB1, 0x07,
0xE1, 0xF7, 0x0E, 0x94, 0x82, 0x00, 0x0C, 0x94, 0x96, 0x01, 0x0C, 0x94, 0x00, 0x00, 0x1F, 0x92,
0x0F, 0x92, 0x0F, 0xB6, 0x0F, 0x92, 0x11, 0x24, 0x8F, 0x93, 0xDF, 0x93, 0xCF, 0x93, 0xCD, 0xB7,
0xDE, 0xB7, 0x80, 0x91, 0x00, 0x01, 0x88, 0x23, 0x29, 0xF0, 0x80, 0x91, 0x00, 0x01, 0x81, 0x50,
0x80, 0x93, 0x00, 0x01, 0xCF, 0x91, 0xDF, 0x91, 0x8F, 0x91, 0x0F, 0x90, 0x0F, 0xBE, 0x0F, 0x90,

0x1F, 0x90, 0x18, 0x95, 0xDF, 0x93, 0xCF, 0x93, 0xCD, 0xB7, 0xDE, 0xB7, 0xEE, 0xE4, 0xF0, 0xE0,
0x81, 0xE0, 0x80, 0x83, 0xA7, 0xE5, 0xB0, 0xE0, 0xE7, 0xE5, 0xF0, 0xE0, 0x80, 0x81, 0x84, 0x60,
0x8C, 0x93, 0xA2, 0xE2, 0xB0, 0xE0, 0xE2, 0xE2, 0xF0, 0xE0, 0x80, 0x81, 0x80, 0x68, 0x8C, 0x93,
0x78, 0x94, 0xA3, 0xE2, 0xB0, 0xE0, 0xE3, 0xE2, 0xF0, 0xE0, 0x80, 0x81, 0x80, 0x68, 0x8C, 0x93,
0x84, 0xE1, 0x80, 0x93, 0x00, 0x01, 0x80, 0x91, 0x00, 0x01, 0x88, 0x23, 0xE1, 0xF7, 0xA3, 0xE2,
0xB0, 0xE0, 0xE3, 0xE2, 0xF0, 0xE0, 0x80, 0x81, 0x8F, 0x77, 0x8C, 0x93, 0x82, 0xE3, 0x80, 0x93,
0x00, 0x01, 0x80, 0x91, 0x00, 0x01, 0x88, 0x23, 0xE1, 0xF7, 0xA3, 0xE2, 0xB0, 0xE0, 0xE3, 0xE2,
0xF0, 0xE0, 0x80, 0x81, 0x80, 0x68, 0x8C, 0x93, 0x84, 0xE1, 0x80, 0x93, 0x00, 0x01, 0x80, 0x91,

0x00, 0x01, 0x88, 0x23, 0xE1, 0xF7, 0xA3, 0xE2, 0xB0, 0xE0, 0xE3, 0xE2, 0xF0, 0xE0, 0x80, 0x81,
0x8F, 0x77, 0x8C, 0x93, 0x82, 0xE3, 0x80, 0x93, 0x00, 0x01, 0x80, 0x91, 0x00, 0x01, 0x88, 0x23,
0xE1, 0xF7, 0xA3, 0xE2, 0xB0, 0xE0, 0xE3, 0xE2, 0xF0, 0xE0, 0x80, 0x81, 0x80, 0x68, 0x8C, 0x93,
0x84, 0xE1, 0x80, 0x93, 0x00, 0x01, 0x80, 0x91, 0x00, 0x01, 0x88, 0x23, 0xE1, 0xF7, 0xA3, 0xE2,
0xB0, 0xE0, 0xE3, 0xE2, 0xF0, 0xE0, 0x80, 0x81, 0x8F, 0x77, 0x8C, 0x93, 0x84, 0xE6, 0x80, 0x93,
0x00, 0x01, 0x80, 0x91, 0x00, 0x01, 0x88, 0x23, 0xE1, 0xF7, 0xA3, 0xE2, 0xB0, 0xE0, 0xE3, 0xE2,
0xF0, 0xE0, 0x80, 0x81, 0x80, 0x68, 0x8C, 0x93, 0x86, 0xE4, 0x80, 0x93, 0x00, 0x01, 0x80, 0x91,
0x00, 0x01, 0x88, 0x23, 0xE1, 0xF7, 0xA3, 0xE2, 0xB0, 0xE0, 0xE3, 0xE2, 0xF0, 0xE0, 0x80, 0x81,

0x8F, 0x77, 0x8C, 0x93, 0x88, 0xE2, 0x80, 0x93, 0x00, 0x01, 0x80, 0x91, 0x00, 0x01, 0x88, 0x23,
0xE1, 0xF7, 0xA3, 0xE2, 0xB0, 0xE0, 0xE3, 0xE2, 0xF0, 0xE0, 0x80, 0x81, 0x80, 0x68, 0x8C, 0x93,
0x86, 0xE4, 0x80, 0x93, 0x00, 0x01, 0x80, 0x91, 0x00, 0x01, 0x88, 0x23, 0xE1, 0xF7, 0xA3, 0xE2,
0xB0, 0xE0, 0xE3, 0xE2, 0xF0, 0xE0, 0x80, 0x81, 0x8F, 0x77, 0x8C, 0x93, 0x88, 0xE2, 0x80, 0x93,
0x00, 0x01, 0x80, 0x91, 0x00, 0x01, 0x88, 0x23, 0xE1, 0xF7, 0xA3, 0xE2, 0xB0, 0xE0, 0xE3, 0xE2,
0xF0, 0xE0, 0x80, 0x81, 0x80, 0x68, 0x8C, 0x93, 0x86, 0xE4, 0x80, 0x93, 0x00, 0x01, 0x80, 0x91,
0x00, 0x01, 0x88, 0x23, 0xE1, 0xF7, 0xA3, 0xE2, 0xB0, 0xE0, 0xE3, 0xE2, 0xF0, 0xE0, 0x80, 0x81,
0x8F, 0x77, 0x8C, 0x93, 0x84, 0xE6, 0x80, 0x93, 0x00, 0x01, 0x80, 0x91, 0x00, 0x01, 0x88, 0x23,

0xE1, 0xF7, 0xA3, 0xE2, 0xB0, 0xE0, 0xE3, 0xE2, 0xF0, 0xE0, 0x80, 0x81, 0x80, 0x68, 0x8C, 0x93,
0x84, 0xE1, 0x80, 0x93, 0x00, 0x01, 0x80, 0x91, 0x00, 0x01, 0x88, 0x23, 0xE1, 0xF7, 0xA3, 0xE2,
0xB0, 0xE0, 0xE3, 0xE2, 0xF0, 0xE0, 0x80, 0x81, 0x8F, 0x77, 0x8C, 0x93, 0x82, 0xE3, 0x80, 0x93,
0x00, 0x01, 0x80, 0x91, 0x00, 0x01, 0x88, 0x23, 0xE1, 0xF7, 0xA3, 0xE2, 0xB0, 0xE0, 0xE3, 0xE2,
0xF0, 0xE0, 0x80, 0x81, 0x80, 0x68, 0x8C, 0x93, 0x84, 0xE1, 0x80, 0x93, 0x00, 0x01, 0x80, 0x91,
0x00, 0x01, 0x88, 0x23, 0xE1, 0xF7, 0xA3, 0xE2, 0xB0, 0xE0, 0xE3, 0xE2, 0xF0, 0xE0, 0x80, 0x81,
0x8F, 0x77, 0x8C, 0x93, 0x82, 0xE3, 0x80, 0x93, 0x00, 0x01, 0x80, 0x91, 0x00, 0x01, 0x88, 0x23,
0xE1, 0xF7, 0xA3, 0xE2, 0xB0, 0xE0, 0xE3, 0xE2, 0xF0, 0xE0, 0x80, 0x81, 0x80, 0x68, 0x8C, 0x93,

0x84, 0xE1, 0x80, 0x93, 0x00, 0x01, 0x80, 0x91, 0x00, 0x01, 0x88, 0x23, 0xE1, 0xF7, 0xA3, 0xE2,
0xB0, 0xE0, 0xE3, 0xE2, 0xF0, 0xE0, 0x80, 0x81, 0x8F, 0x77, 0x8C, 0x93, 0x8A, 0xEF, 0x80, 0x93,
0x00, 0x01, 0x80, 0x91, 0x00, 0x01, 0x88, 0x23, 0xE1, 0xF7, 0x03, 0xCF, 0xF8, 0x94, 0xFF, 0xCF
};


// Функция writeFlashPage записывает одну страницу флэш,
// принимает: номер записываемой страницы
// размер записываемых данных (в байтах)
// адрес, откуда брать данные для записи

void writeFlashPage(uint8_t number, uint16_t size, uint8_t* pData){
uint32_t pagestart = number * SPM_PAGESIZE;
uint32_t baddr = pagestart;
uint16_t data;
uint8_t *tmp = pData;

do{
data = *tmp++;
data |= *tmp++ << 8;
boot_page_fill(baddr, data); // Заполнить буфер СЛОВАМИ данных

baddr += 2; // Перейти к следующему слову в памяти
size -= 2; //
}while(size); // Выполнять, пока не достигнут конец буфера

boot_page_write(pagestart); // Записать заполненный буфер во флеш
boot_spm_busy_wait(); // Дождаться окончания выполнения этой операции
boot_rww_enable(); // Разрешить доступ к секции RWW

return;
}

volatile uint8_t time = 0;

ISR(TIMER1_OVF_vect){ // Обработчик прерывания таймера
if(time)
--time;
}

void main(void){

TCCR1B = _BV(CS10); // clk
TIMSK |= _BV(TOIE1); // Разрешить прерывание по переполнению
MCUCR = (1<<IVCE); // Разрешить изменение положения таблицы прерываний
MCUCR = (1<<IVSEL); // Изменить положение таблицы
DDRE |= _BV(PE7); // Эта нога будет "дергаться"
asm("sei");

for(uint8_t i=0; i<20; ++i){ // Поморгать лампой десять раз
PORTE ^= _BV(PE7);
time = 100; // Задать время паузы
while(time); // Дождаться, пока таймер T1 обнулит time
}

// Далее начинается непосредственно перепрошивка контроллера
// В данном случае используется Mega128, размер страницы которой 256 байт, т.е SPM_PAGESIZE = 256

writeFlashPage(0, SPM_PAGESIZE, &Data[SPM_PAGESIZE*0]);
writeFlashPage(1, SPM_PAGESIZE, &Data[SPM_PAGESIZE*1]);
writeFlashPage(2, SPM_PAGESIZE, &Data[SPM_PAGESIZE*2]);
writeFlashPage(3, sizeof(Data) - 768, &Data[SPM_PAGESIZE*3]);

asm("cli");
MCUCR |= _BV(IVCE); // Вернуть положение таблицы прерываний на начало
MCUCR &= ~(_BV(IVSEL) | _BV(IVCE));

void (*funcptr)(void) = 0x0000; // Указатель на функцию с адресом 0x0000
funcptr(); // Запустить выполнение основной программы

return;
}


Прикрепленный файл  Bootloader.zip ( 15.56 килобайт ) Кол-во скачиваний: 110


Спасибо всем тем, кто пнул меня в правильном направлении. cheers.gif

з.ы. будут сложности, буду ныть дальше.

Сообщение отредактировал IgorKossak - Apr 15 2011, 06:46
Причина редактирования: [codebox] !!!
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Sirko   Не выходит одолеть прерывания в Bootloader'е   Apr 11 2011, 00:06
- - Vetal-Soft   Скорее всего заморочка с измерением памяти програм...   Apr 11 2011, 02:41
- - Sirko   ЦитатаСкорее всего... Скорее всего. Кто бы носом т...   Apr 11 2011, 21:57
|- - Vetal-Soft   У Вас в makefile: Код#/* Select Boot Size in Words...   Apr 12 2011, 08:36
- - defunct   Цитата(Sirko @ Apr 11 2011, 03:06) LDFLAG...   Apr 12 2011, 13:00
- - alag57   Попробуйте так: Код //MCUCR = (1<<IVCE...   Apr 12 2011, 15:01
- - Sirko   ЦитатаПохоже вы не укладываетесь в... Попробуйте ...   Apr 12 2011, 18:29
- - SysRq   Цитата(Sirko @ Apr 12 2011, 22:29) Лампа ...   Apr 12 2011, 20:10
- - Sirko   Спасибо, не видел. Исправил. К сожалению пока-что ...   Apr 12 2011, 21:18
- - SysRq   Цитата1. Write the Interrupt Vector Change Enable ...   Apr 12 2011, 21:23
- - Sirko   Цитата1. Write the Interrupt Vector Change Enable ...   Apr 12 2011, 21:52
- - alag57   Цитатапростите, беру свои слова обратно. Да все но...   Apr 13 2011, 06:22
|- - SysRq   Цитата(Sirko @ Apr 15 2011, 02:20) буду н...   Apr 15 2011, 07:55
- - Sirko   ЦитатаРаньше вас ныть начнёт МК Безусловно, но это...   Apr 15 2011, 11:11


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

 


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


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