Я разрабатываю для STM32F429 с CLion и пытаюсь создать объединенный .elf-файл из трех .elf-файлов. Макет объединенного .elf-файла должен выглядеть следующим образом:
- Bootloader.elf (максимум 256 КБ, но может различаться по размеру)
- FirmwareImage.elf (всегда 384 КБ, заполняется выделенное пространство для 1-го образа прошивки)
- FirmwareImage.elf (всегда 384 КБ, заполняет выделенное пространство для 2-го образа прошивки)
Это составляет в общей сложности 1 МБ.
Я пытался преобразовать файлы .elf в .bin (с помощью arm-none-eabi-objcopy) и создать файл размером 1M .bin с помощью специального инструмента, который я написал. Я могу подтвердить, что расположение .bin это создает правильно. Затем я преобразую сгенерированный файл .bin обратно в .elf с помощью:
arm-none-eabi-objcopy -I binary -O elf32-little --change-section-address .data=0x08000000 in.bin out.elf
Изменение адреса раздела данных должно отражать начало памяти fla sh в STM32F429.
Когда Я пытаюсь набрать sh этот файл с помощью openocd, он завершается с:
Error: invalid ELF file, no program headers
Есть ли способ пропустить преобразование .elfs -> .bin -> .elf и go непосредственно из. elfs -> .elf? Или иначе вставить заголовки программы? Я сомневаюсь, что они на самом деле используются во время перепрошивки.
Я знаю, что могу сказать openocd использовать сгенерированный файл .bin напрямую, указав адрес fla sh. Но CLion не позволяет файлам openocd fla sh .bin из встроенного в руку плагина только файлы .elf.
Edit : В данный момент я использую эти скрипты компоновщика, адаптированные из официального скрипта ST. В них много чего происходит. Я мог бы просто использовать один скрипт компоновщика для достижения этой цели. Я мог бы иметь следующий код:
extern "C" __attribute__((__section__(".bootloader"))) void runBootloader()
{
Platform platform;
DFUBootloader bootloader(platform);
}
extern "C" __attribute__((__section__(".image1"))) void runApplication1()
{
Platform platform;
Application application(platform);
}
extern "C" __attribute__((__section__(".image2"))) void runApplication2()
{
Platform platform;
Application application(platform);
}
Если эти линкеры разместят эти символы в нужных местах, будут ли символы, используемые ими, также оказаться в правильном месте? Образ прошивки должен быть продублирован, чтобы заполнить обе страницы прошивки, поэтому все символы, используемые приложением, также должны быть продублированы.