Скрипи загрузчика .ld размещает секции в бинарном файле по определенным адресам. Табличка векторов тоже может быть помещена не в самом начале флеша, а где-нить в другом месте, о чем нужно дополнительно сообщить микроконтроллеру в коде программы, изменив VTOR (там, где он есть).
Именно скрипт .ld будет ответственнен за то, что куда кладется на этапе компиляции
В зависимости от конкретной IDE и кмопилятора, состав и синтаксис файлов запуска может отличаться.
Спасибо.
Т.е. по адресу 0x08000000 во флеш записывается наша прошивка,
в начале нашей прошивки расположена таблица векторов (адресов), фактически смещений относительно начала прошивки (которую собрал компоновщик). Встроенный загрузчик stm32 при старте копирует таблицу векторов из флеша в ОЗУ на начальный адрес 0x00000000.
После чего встроенный загрузчик пробегает по таблице, активирует прерывания и прочее согласно данных таблицы, после читает адрес во второй строке таблицы, где расположен адрес начальной функции (reset Vector), в моём случае эта функция _start :
Код: Выделить всё
void __attribute__ ((section(".after_vectors"),noreturn,weak))
_start (void) {...}В компоновщике указана как ENTRY (_start), функция _start производит инициализацию и секций памяти, а также устройств (в том числе внешних).
Я правильно понимаю?
