bootloader скачек в начало основной программы

Обсуждаем контроллеры компании Atmel.
Ответить
Вымогатель припоя
Аватара пользователя
Сообщения: 672
Зарегистрирован: Ср фев 29, 2012 01:58:32
Откуда: Харьков, Украина

Сообщение eess9 »

Привет всем!
Делаю bootloader. Пишет flash правильно, т.е. считываю программатором флеш память, сравниваю с исходным файлом, все идентично и по содержанию, и по адресации. Но программа не стартует, т.е. флеш записалась и все, ничего не происходит. Грешу на уход по 0 адресу. Делаю так:

Код: Выделить всё

static void (*jump_to_app)(void)=0x0000;
int main(void)
{
        // write flash
        jump_to_app(); // Jump to Reset vector 0x0000 in Application Section.
	return 0;
}
У кого мысли есть по этому поводу. Что не так?
Реклама
Родился
Сообщения: 7
Зарегистрирован: Пн июл 28, 2014 12:26:37

Сообщение Durumka »

Проверь фьюз BOOTRST, и еще: про вектора прерываний: "Все верно, только следует помнить, что у контроллеров с объемом памяти программ больше 16 килобайт на каждый вектор отводится не одно слово, а два.
Поэтому у неиспользуемых прерываний нужно писать не просто RETI, а
NOP
RETI
на каждый вектор прерывания" - http://radiokot.ru/forum/viewtopic.php?f=57&t=72364
Реклама
Вымогатель припоя
Аватара пользователя
Сообщения: 672
Зарегистрирован: Ср фев 29, 2012 01:58:32
Откуда: Харьков, Украина

Сообщение eess9 »

А причем здесь прерывания? :shock:

Уже подсказали здесь http://www.avrfreaks.net/index.php?name ... c&t=144995. Причина состояла в том, что у меня atmega256rfr2 с 256 кбайт флеша. А обычный адрес для менее чем 64кбайт. Для расширенного адреса используется еще байт RAMPZ. Я об этой особенности не знал и этот байт не сбрасывал. Соответственно, скачек был на начало этой конкретной страницы из 64 кбайт. А это где-то в средине флеша, а там основная программа уже кончилась, а бут секция еще не началась, т.е. одни 0xFF кругом. Естественно, ничего не работало.
Мудрый кот
Аватара пользователя
Сообщения: 1810
Зарегистрирован: Чт июн 10, 2010 08:55:35
Откуда: Сибирские Афины

Сообщение Kavka »

Посмотрите асемблеровский листинг откомпилированного загрузчика, как компилятор вызов jump_to_app() реализовал. У маленьких avr-ок указатели 16 битные, у больших они 24 битные и переход в нужное место делается или с помощью "трамплина", так как обычный переход делается не дальше 64 кило слов, или с помощью спец. адресации через EIND.
На мой взгляд, вам проще сделать ассемблерную вставку с явным и правильным переходом с помощью EIJMP, т.к. загрузчик сидит в конце, а "прыгнуть" надо в начало памяти.
Как вариант, можно зайти в обход, сделать переход на первый байт после конца памяти.
Когда уже ничего не помогает - прочтите, наконец, инструкцию.
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
Реклама
Эиком - электронные компоненты и радиодетали
Ответить

Вернуться в «AVR»