Eclipse CDT & STM32: форсировать предопределенную память программ - PullRequest
0 голосов
/ 19 октября 2019

У меня необычный, но, на мой взгляд, разумный вариант использования: мне нужно создать два образа прошивки STM32: загрузчик и приложение (используя новейшую интегрированную среду разработки Eclipse CDT от ST Microelectronics, которая называется: «STM32CubeIDE»).

Поскольку мои ограничения в основном низкое энергопотребление, а не безопасность, поэтому у меня есть только требование целостности данных для сценария DFU (Обновление прошивки устройства), и для этого я реализовал проверку CRC32 для полных образов FW. Сложность состоит в том, что сама прошивка содержит свой фактический размер в C-структуре с фиксированным адресом смещения 0x200 в памяти кода (преимущество этой конструкции состоит в том, что должна передаваться не вся память кода, а FWвсегда защищен CRC32):

Компоновка прошивки выглядит примерно так:

<ISR Table> <FW-Header@FixedAddress0x200> <RestFWCode> " + CRC32
  1. Заголовок FW содержит размер FW
  2. Полный FWРазмер, который используется загрузчиком для прошивки приложения, - это сохраненный размер FW (см. 1.) + 4 байта добавленного CRC32

Для моей реализации мне нужно заменить область памяти внутри "FW Header "область с фактическим размером FW (который доступен только после процесса сборки).

Для этого я сделал скрипт на python, который исправляет двоичный файл" * .bin ", но похоже, что Eclipse/ GDB использует для отладки ELF-файл, который для меня выглядит гораздо сложнее для пользовательского патча по сравнению с бинарным образом, так как я не нашел простого способа сделать этоФактический размер FW и добавьте 4 байта CRC32).

Поэтому я подумал, что самым простым способом будет исправить память кода сразу после того, как прошивка получит загрузчик из отладчика. Я успешно протестировал инструмент командной строки из ST, который может манипулировать произвольной памятью даже в памяти кода (моя память кода начинается с 0x08000000 + приложение со смещением 0x4000 и заголовок FW с öffset 0x200 -> 0x08004200):

ST-LINK_CLI.exe -c SWD -w32 0x08004200 0xAABBCCDD

(см .: https://www.st.com/resource/en/user_manual/cd00262073.pdf)

Моя проблема в том, что я не знаю, как инициировать этот простой вызов EXE прямо перед подключением отладчика к MCU ... Я попробовал "Конфигурацию отладки" -> «Запуск» -> «Выполнить команды», но безуспешно ...

Кто-нибудь знает, как этого добиться?

Ответы [ 2 ]

1 голос
/ 20 октября 2019

Я собираюсь порекомендовать другой рабочий процесс для достижения того же формата изображения:

<ISR Table> <FW-Header@FixedAddress0x200> <RestFWCode> " + CRC32

После установки процесс сборки будет:

  1. Построить образ FW длясоздать необработанный двоичный файл без значения CRC-32
  2. Вычислить CRC-32 на необработанном двоичном изображении, сторонний инструмент
  3. Вставить вычисленный CRC-32 в скрипт компоновщика, перестроить образ FW

Примечание. Для STM32CubeIDE вам потребуется собственный проект *.elf, включающий проект STM32CubeMX в качестве статической библиотеки. В противном случае, STM32CubeMX будет перезаписывать ваш скрипт компоновщика каждый раз, когда генерирует новый код.

Поскольку каждый проект имеет свой скрипт компоновщика, который немного отличается, я собираюсь продемонстрировать использование сектора .test_crc. Вставьте следующее в ваш скрипт компоновщика *.ld:

  .test_crc :
  {
    _image_start = .;
    BYTE( 0x31)
    BYTE( 0x32)
    BYTE( 0x33)
    BYTE( 0x34)
    BYTE( 0x35)
    BYTE( 0x36)
    BYTE( 0x37)
    BYTE( 0x38)
    BYTE( 0x39)

    /* FW Image Header */ 
    LONG( _image_end - _image_start ) /* Size of FW image */
    LONG( _image_start ) /* Base address to load FW image */

    /* Place this at the end of the FW image */
    _image_end = .;
    _IMAGE_CRC = ABSOLUTE(0x0); /* Using CRC-32C (aka zip checksum) */  
    /*LONG( (-_IMAGE_CRC) - 1 ) /* Uncomment to append value, comment to calculate new value  */
  } >FLASH

Добавьте следующее как шаг после сборки в STM32CubeIDE (генерирует необработанное двоичное изображение):

arm-none-eabi-objcopy -S -O binary -j .test_crc ${ProjName}.elf ${ProjName}.bin

Теперь вашготов протестировать / оценить процесс:

  1. Перестройте проект, чтобы сгенерировать файл *.bin.
  2. Используя сторонний инструмент, рассчитайте контрольную сумму CRC-32. Я использую интерфейс командной строки 7-Zip для генерации значения CRC-32C для *.bin файла
  3. Добавьте вычисленный CRC-32C. В сценарии компоновщика установите 0x0 в следующем _IMAGE_CRC = ABSOLUTE(0x0), чтобы оно соответствовало вашему вычисленному значению. Раскомментируйте следующее:

LONG( (-_IMAGE_CRC) - 1 ) /* Uncomment to append value, comment to calculate new value */

Перестройте ваш образ и запустите стороннюю утилиту CRC, теперь она должна сообщить 0xFFFFFFFF для значения CRC-32C.

Когда вы будете готовы применить это к вашему реальному образу FW, выполните следующие действия:

  1. Измените шаг после сборки, чтобы сбросить полный двоичный файл: arm-none-eabi-objcopy -S -O binary ${ProjName}.elf ${ProjName}.bin
  2. Переместите _image_start = .; перед таблицей векторов.
  3. Переместите следующее после таблицы векторов:

/* FW Image Header */ LONG( _image_end - _image_start ) /* Size of FW image */ LONG( _image_start ) /* Base address to load FW image */

Переместите следующее в конец последнего сектора:

/* Place this at the end of the FW image */ _image_end = .; _IMAGE_CRC = ABSOLUTE(0x0); /* Using CRC-32C (aka zip checksum) */<br> /*LONG( (-_IMAGE_CRC) - 1 ) /* Uncomment to append value, comment to calculate new value */

Вы можете обнаружить, что на самом деле вам не нужно значение CRC, встроенное в изображение, и можетепросто добавьте значение CRC к *.bin. Затем предоставьте *.bin вашему загрузчику. *.bin будет по-прежнему содержать адрес загрузки и размер изображения FW, +4 байта для добавленного значения CRC.

1 голос
/ 19 октября 2019

Запуск программы перед началом сеанса отладки можно выполнить с помощью «Группы запуска» Eclipse, расположенной в разделе «Конфигурации отладки», например, верхнее меню -> «Выполнить» -> «Конфигурации отладки».

enter image description here

Однако, прежде чем сделать это, вам нужно перейти в свойства проекта -> Builders и добавить туда вызов вашей программы - путь к исполняемому файлу плюс его аргументы. Убедитесь, что он НЕ установлен, чтобы он не запускался при сборке проекта. Затем вы можете перейти к Launch Groups, описанному выше, и создать группу, содержащую программу, которую вы определили в разделе Builders проекта, а затем после этого ваш обычный сеанс отладки, который у вас уже должен быть доступен в списке.

...