С бутлоадером разобрался после ещё пары дней втыкания. Пока ничего не прошивает, но в принципе - работает. Пришлось изучить, как устроены скрипты компоновщика ld (я юзаю arm-gcc, тут тремя кликам по меню отделаться не получится). Сейчас делаю так: в Eclipse-е два проекта. Основной и загрузчик в виде статической библиотеки. Загрузчик имеет свою копию стандартной библиотеки. Чтобы при линковке не возникло совпадений имён, все символы статической либы переименовываются при помощи objcopy:
Код:
arm-none-eabi-objcopy --prefix-symbols=bootloader_ libbootloader-stm32f103ret6.a
Также, в скрипте компоновщика основного проекта (скрипт, к слову, не маленький: ~250 строк) нужно явно сказать, что мы хотим.
Сначала определяется дополнительный регион памяти для загрузчика. Регион основной памяти сдвигается.
Потом прописывается, куда класть .text, .data и особливо таблицу прерываний для библиотеки загрузчика. Делается это путем копипасты и исправления
И добавляются символы для кода, инициализирующего .data и .bss загрузчика.
Кусок всего это выглядит как-то так:
Код:
...
.loader_text :
{
. = ALIGN(4);
*libbootloader-stm32f103ret6.a:(.text .text*)
. = ALIGN(4);
} >LOADER
...
/* Initialized data sections goes into RAM, load LMA copy after code */
.loader_data :
{
. = ALIGN(4);
bootloader__sdata = .; /* create a global symbol at data start */
*libbootloader-stm32f103ret6.a: (.data) /* .data sections */
*libbootloader-stm32f103ret6.a: (.data*) /* .data* sections */
. = ALIGN(4);
bootloader__edata = .; /* define a global symbol at data end */
} >RAM AT> LOADER
...
В общем, после такой "несложной" процедуры, у нас появляется загрузчик. Всё делается вручную, зато - полный контроль, Unix way.
Остались мелочи: написать сам код. В коде можно использовать всё, что угодно. Думаю, скоро будет готово