Камень: AT91SAM7S256
Проблема в следующем: написал загрузчик, который принимает bin файл и записывает его во флеш по нужному адресу ( к примеру 0x00108000). После записи выполняется прыжок на начальный адрес записи. Соответственно у программы которую я записываю через этот загрузчик я подправляю линкер, что бы функция main записывалась на нужный адрес (к примеру на 0x00108000). Перед прыжком включаю/отключаю подтягивающий резисор - все как надо. Если записывать программы работающие только с ЮЗБ (к примеру программа, которая по нажатию кнопки выводит слово hallo в терминал) то никаких проблем нет, все работает как надо. Но если записывать программу, работающую не только с ЮЗБ, но и с флешем (например считывает и записывает что то во флеш память), то прыжка никакого не происходит. Вместо этого загрузчик начинает свою программу загрузки заново ( выводит меню интерфейса, которое появляется в самом начале при запуске загрузчика). Мои подозрения падают на функцию, которая используется в записываемой программе(хотя я могу и ошибаться):
Код
extern unsigned int edata,etext,__bss_start,__bss_end__,_data;
void copy_rom_ram(void)
{
unsigned int* p_rom, *p_ram;
//--------------------
p_rom=&etext;
p_ram=(unsigned int*)0x200000;
while(p_ram<&edata)
{
*p_ram=*p_rom;
p_ram++;
p_rom++;
}
//---------------------------
p_ram=&__bss_start;
while(p_ram<&__bss_end__)
{
*p_ram=0;
p_ram++;
}
}
void copy_rom_ram(void)
{
unsigned int* p_rom, *p_ram;
//--------------------
p_rom=&etext;
p_ram=(unsigned int*)0x200000;
while(p_ram<&edata)
{
*p_ram=*p_rom;
p_ram++;
p_rom++;
}
//---------------------------
p_ram=&__bss_start;
while(p_ram<&__bss_end__)
{
*p_ram=0;
p_ram++;
}
}
Данная функция необходима для работы с флеш памятью. Возможно она работает некорректно или что то не так с линкером загрузчика.
Может кто встречался уже с такой проблемой? Какие в принципе могут быть причины такого сброса программы?
P.S. Для написание загрузчика использовал стандартный IAR проект.