Недавно делал загрузчик для LPC1778. Основные положения из своего опыта могу написать такие: 1. Бутлоадер и пользовательская программа пишутся независимо и расположены в разных местах флеш-памяти. Начало программы бутлоадера должно располагаться по адресу 0x0000, т.к. после рестарта контроллер начинает свою работу именно с этого адреса. Пользовательская программа может находиться по любому адресу, но не должна затирать код бутлоадера. Если бутлоадер не выходит за пределы области 0x0000 - 0x1000, то пользовательская программа должна начинаться с адреса 0x1000. 2. Компилятор не может знать, что в памяти есть ещё и загрузчик, но в его силах скомпилировать HEX для записи по конкретному адресу, например 0x1000 вместо 0x0000, используемого по умолчанию. Адрес для компиляции где-то в настройках указывается. 3. После аппаратного рестарта контроллер начинает выполнять программу с адреса 0x0000, но у нас начало программы сидит в адресе 0x1000, поэтому контроллер будет в недоумении и дальнейшее его поведение будет непредсказуемым. 4. Запускать пользовательский HEX должен именно бутлоадер (в общем случае командой JMP 0x1000, в моём случае пришлось помнить про указатель на таблицу векторов и про указатель стека) 5. Один из возможных алгоритмов работы бутлоадера: - проверка некоего условия при включении питания (уровень на одной из ног МК или условие таймаута - если в течение какого-то времени после включения данные не начали поступать, то запустить пользовательскую программу; можно предварительно проверить наличие пользовательской программы в памяти по какому-либо критерию) - приём данных по любому доступному интерфейсу с использованием любого алгоритма - проверка правильности принятых данных с помощью пересчёта всяких контрольных сумм - запись полученных данных во флеш - запуск записанной программы с адреса 0x1000.
Запись пользовательской программы посредством бутлоадера выполняется с помощью такой же самопальной программы, которая имеет с ним общий язык, т.е. стандартная скачанная заливалка с самопальным загрузчиком работать не будет.
Сообщение отредактировал ДЕЙЛ - Nov 19 2014, 13:02
|