(arm-none-eabi-g cc) создание двоичного файла .elf из загрузчика + 2 x образа прошивки - PullRequest
0 голосов
/ 01 апреля 2020

Я разрабатываю для 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);
}

Если эти линкеры разместят эти символы в нужных местах, будут ли символы, используемые ими, также оказаться в правильном месте? Образ прошивки должен быть продублирован, чтобы заполнить обе страницы прошивки, поэтому все символы, используемые приложением, также должны быть продублированы.

1 Ответ

0 голосов
/ 02 апреля 2020

Похоже, объединение нескольких файлов .elf описанным мною способом невозможно или, по крайней мере, не очень тривиально.

Я нашел обходной путь для своей проблемы. Хотя CLion не может открыть openocd для файлов fla sh .bin (его встроенная команда запуска openocd использует .elf), легко создать настраиваемую цель CMake, которая мигает объединенным .bin следующей командой:

openocd -f board/stm32f429discovery.cfg -c "program merged_image.bin exit 0x08000000"
...