Страница 1 из 1
bootloader скачек в начало основной программы
Добавлено: Вт июл 29, 2014 09:26: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;
}
У кого мысли есть по этому поводу. Что не так?
Re: bootloader скачек в начало основной программы
Добавлено: Вт июл 29, 2014 13:29:31
Durumka
Проверь фьюз BOOTRST, и еще: про вектора прерываний: "Все верно, только следует помнить, что у контроллеров с объемом памяти программ больше 16 килобайт на каждый вектор отводится не одно слово, а два.
Поэтому у неиспользуемых прерываний нужно писать не просто RETI, а
NOP
RETI
на каждый вектор прерывания" -
http://radiokot.ru/forum/viewtopic.php?f=57&t=72364
Re: bootloader скачек в начало основной программы
Добавлено: Вт июл 29, 2014 13:46:54
eess9
А причем здесь прерывания?
Уже подсказали здесь
http://www.avrfreaks.net/index.php?name ... c&t=144995. Причина состояла в том, что у меня atmega256rfr2 с 256 кбайт флеша. А обычный адрес для менее чем 64кбайт. Для расширенного адреса используется еще байт RAMPZ. Я об этой особенности не знал и этот байт не сбрасывал. Соответственно, скачек был на начало этой конкретной страницы из 64 кбайт. А это где-то в средине флеша, а там основная программа уже кончилась, а бут секция еще не началась, т.е. одни 0xFF кругом. Естественно, ничего не работало.
Re: bootloader скачек в начало основной программы
Добавлено: Ср июл 30, 2014 06:39:21
Kavka
Посмотрите асемблеровский листинг откомпилированного загрузчика, как компилятор вызов jump_to_app() реализовал. У маленьких avr-ок указатели 16 битные, у больших они 24 битные и переход в нужное место делается или с помощью "трамплина", так как обычный переход делается не дальше 64 кило слов, или с помощью спец. адресации через EIND.
На мой взгляд, вам проще сделать ассемблерную вставку с явным и правильным переходом с помощью EIJMP, т.к. загрузчик сидит в конце, а "прыгнуть" надо в начало памяти.
Как вариант, можно зайти в обход, сделать переход на первый байт после конца памяти.