Перепрошивка файла ELF с помощью OpenOcd приводит к записи заголовка ELF во Flash.

Я использую OpenOcd для прошивки образа Elf проекта STM32 ARM Cmake.

В сценарии mem.ld исходный адрес сектора FLASH назначается со смещением адреса на 0x08020200.

Если файл Elf записывается во флэш-память с использованием OpenOCD и команды write_image, кажется, что заголовок ELF записывается во флэш-память по адресу 0x08020000.

введите описание изображения здесь

Двоичный файл приложения правильно записан во флеш-память по адресу 0x08020200 (первые четыре байта по адресу 0x08020200 отражают значение указателя стека)

Поскольку 0x08020200 - это адрес в секторе 5 флеш-памяти (0x08020000 - 0x0803FFFF), я ожидаю, что функция автоматического стирания команды OpenOcd write_image сотрет весь сектор 5 (потому что можно стереть только полные сектора)

Что могло привести к тому, что заголовок ELF будет записан во флэш-память по адресу 0x08020000?

Я выполнил следующие шаги:

  • Вручную стерли всю флеш-память
  • Выгрузил весь флеш-контент командой OpenOcd dump_image
  • Проверено, что выгруженное изображение представляет собой чистую вспышку (все байты 0xFF)
  • Прошил файл test.elf командой OpenOcd write_image
  • Снова сбросил весь флеш-контент командой OpenOcd dump_image
  • Проверено, что первые четыре байта по адресу 0x08020200 отражают значение указателя стека.
  • Проверено содержимое флеш-памяти по адресу 0x08020000 - ›Заголовок ELF был записан во флеш-память

person Y. Wilkening    schedule 20.08.2020    source источник
comment
Я отредактировал ваш вопрос, чтобы прояснить, что это проблема конфигурации / использования CLion - я обнаружил, что первоначальная формулировка «Мигание файла ELF приводит к записи заголовка ELF во Flash» немного сбивает с толку. Кстати, а во флешке можно увидеть только заголовок ELF или весь файл ELF?   -  person Frant    schedule 20.08.2020
comment
openocd умеет правильно читать и использовать файлы elf, как вы используете этот инструмент?   -  person old_timer    schedule 20.08.2020
comment
@old_timer: я не понимаю, что он использует openocd не напрямую, а через CLion IDE Jetbrain. Вероятно, это проблема конфигурации Clion, а не openocd, поскольку, как вы указывали, openocd действительно говорит на ELF.   -  person Frant    schedule 20.08.2020
comment
Сегодня я провел дополнительное тестирование, и во многих случаях мой вопрос был неправильным. Поэтому я отредактировал исходный вопрос. Я также удалил тему CLion, потому что я смог воспроизвести проблему, просто используя OpenOcd напрямую.   -  person Y. Wilkening    schedule 21.08.2020
comment
Как именно вы используете команду write_image? Вы используете аргумент type?   -  person domen    schedule 21.08.2020
comment
Я использовал write_image без аргумента типа. Но я также попробовал следующую команду с тем же результатом: -c "program test.elf verify reset exit"   -  person Y. Wilkening    schedule 21.08.2020
comment
Это очень странно. Я думаю, вы могли бы попробовать преобразовать elf в другой формат и перепрограммировать его. Это обходной путь, но, возможно, он дает некоторое представление о том, что происходит.   -  person domen    schedule 21.08.2020
comment
Какие dump_image команды используются? Возможно ли, что он выгружается в файл .elf, а не в двоичный файл?   -  person Tom    schedule 10.09.2020
comment
Вероятно, это проблема скрипта компоновщика.   -  person 0___________    schedule 12.12.2020


Ответы (1)


У меня такая же проблема, когда заголовок ELF программируется в начале flash, но у меня эта проблема с CLI программиста stm32 (не openOCD), и я исправил ее с помощью HEX. Если я использую шестнадцатеричный файл вместо ELF, начало флэш-памяти не будет повреждено.

person Сергей Плетнев    schedule 11.12.2020
comment
он не отвечает на вопрос. OP не спрашивает how to flash the image? - person 0___________; 12.12.2020
comment
Я имею в виду, что эта ошибка не связана с openOCD. Потому что для загрузки изображения вам нужно использовать какой-то драйвер, и когда я использую CLI программиста stm32, я вижу ту же проблему. А для проверки я использую программатор stm32 для загрузки прошивки (без openOCD) и воспроизводю этот баг для версий 2.5 и 2.6. - person Сергей Плетнев; 15.12.2020