Pacifist писал(а):
Загрузчики в идеале так и должны работать.
Например гипотетический примитивный чип всегда стартует с адреса 0х0000 и никаких смещений ни таблиц векторов ни других вариантов старта не имеет. Загрузчик делают приблизительно так:
- само тело загрузчика ложится в последние доступные адреса, а по адресу 0х0000 находится jmp на загрузчик.
- при старте выполняется jmp на загрузчик, тот начинает выполняться и смотрит надо ли входить в режим записи (нажата кнопка и т.д.)
- если режим загрузчика - то принимаем данные и пишем их во флеш. Пишем прошивку один к одному за исключением первой страницы - у неё надо будет первые байты изменить на jmp на загрузчик, а саму страницу дублировать где-то в верхних адресах (к примеру 0х7FC0).
- если при старте контроллера никакие кнопки не нажаты (не режим загрузчика) - то загрузчик делает переход на 0х7FC0 - и программа выполняется, как будто загрузчика и не существует.
В результате имеем одно ограничение - размер программы (чтоб вместилась и основная прошивка и загрузчик). А дальше шьём через загрузчик любое-голубое, прошивка не знает про загрузчик и работает так как будто его нет, загрузчик способен прошить и запустить любую прошивку.
Это самый трудный вариант.
В современных чипах всё проще. У некоторых даже хардварные загрузчики уже есть готовые - только подавай данные
.
Да-да, вот именно это я и хочу сделать, один в один.
Pingvin писал(а):
А зачем делать position-independent ?
Я не делаю - все работает.
А любую прошивку заливать все равно не получится - можно тогда сам бтлоадер затереть.
Или сильно мудреное тогда городить что-то, с переползанием тела бутлоадера или в оперативке его запускать, а после перепрошивки выгружать на свободное место во флеш. Но это очень ненадёжно!
Стоит ли игра свеч, если проект настраивается в два клика под бутлоадер?
Проблема в том, что уже написанную, бинарную прошивку нельзя "сместить" в памяти, если там не position-independent code. И даже если там PIC-code, придётся руками править всю таблицу прерываний, так как в ней всегда абсолютные адреса! Я же хочу, чтобы прошивалась любая прошивка, созданная, как отдельный проект. Отсюда следует, что прошивка с минимальными изменениями должна лежать в начале памяти, как она и ожидает. А загрузчик тогда - в конце. В общем, всё, как описал Pacifist.
Если всё получится (в чем я не сомневаюсь), такой загрузчик я выложу в открытый доступ, поскольку ничего секретного там нет, а применять его можно будет для любого проекта.
А встроенный бутлоадер с UART-а никак не поможет прошиться с карты памяти. А блютуса у меня чаще не будет, чем будет