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

 
 
> Некорректная работа загрузчика, Самодельный загрузчик не прыгает по нужному адресу
AlfaStar
сообщение Apr 9 2011, 17:28
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 20
Регистрация: 3-10-10
Пользователь №: 59 900



Всем привет!

Камень: 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++;
    }
}

Данная функция необходима для работы с флеш памятью. Возможно она работает некорректно или что то не так с линкером загрузчика.
Может кто встречался уже с такой проблемой? Какие в принципе могут быть причины такого сброса программы?

P.S. Для написание загрузчика использовал стандартный IAR проект.

Сообщение отредактировал AlfaStar - Apr 9 2011, 17:56
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
AlfaStar
сообщение Apr 13 2011, 14:23
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 20
Регистрация: 3-10-10
Пользователь №: 59 900



Сам загрузчик я записываю SAM-BA. Я тут не совсем понимаю конечно, но думаю что Самба сама выполняет запись функций в RAM. Линкер же просто обозначает что и по какому адресу должно лежать. Если при записи Самбой она сама помещает нужные функции в RAM, то когда загрузчик принимает файл bin он просто его записывает во флеш и ничего более. Ну по крайней мере, программа с функциями записи и чтения флеш памяти, при ее загрузке САмбой работает как надо... Если же эту программу прошить загрузчиком (ну с соответствующими изменениями в линкере), то ничего не работает. Андебаг (мигание светодиодом) показал что программа виснет именно на функции copy_rom_ram. Если ее просто исключить, то программа вообще не работает.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Apr 13 2011, 14:35
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(AlfaStar @ Apr 13 2011, 18:23) *
Сам загрузчик я записываю SAM-BA. Я тут не совсем понимаю конечно, но думаю что Самба сама выполняет запись функций в RAM. Линкер же просто обозначает что и по какому адресу должно лежать.

Нет. Вот тут нужно достичь полного понимания путем изучения документации. Копированием функций и данных в RAM занимаются процедуры библиотечного стартапа в соответствии с созданными линкером таблицами. SAM-BA ничем в данном случае не отличается от вашего загрузчика.
В скрипте линкера, который вы привели, нет ни малейшего намека на выделение той памяти, которую в дальнейшем использует copy_rom_ram. Последняя в результате просто портит задействованную уже подо что-то память.
Go to the top of the page
 
+Quote Post



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

 


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


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