Связывание загрузчика Arduino В Atmel Studio

Я пытался заставить загрузчик Arduino скомпилироваться в мой двоичный файл прошивки в Atmel Studio. Я получил проект загрузчика для связи и компиляции. Я использую ArduinoCore и загрузчик в качестве зависимостей к моему основному коду. Дерево зависимостей выглядит следующим образом:

  1. ArduinoCore
  2. загрузчик
  3. Основная прошивка

Загрузчик

Мне потребовалось немного времени, чтобы заставить загрузчик принять остальную часть ArduinoCore в качестве зависимости, но он компилируется в статическую библиотеку. Я использую компоновщик загрузчика, чтобы указать место в памяти двоичного файла загрузчика. Он должен начинаться с 0x0 и обеспечивать переход к основной прошивке, расположенной на 0x2000.

Флаги компоновщика загрузчика:

-Tbootloader_samd21x18.ld -Wl

И вот содержание сценария компоновщика:

  FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 0x2000 /* Первые 8 КБ, используемые загрузчиком */
  RAM (rwx) : ORIGIN = 0x20000000, LENGTH = 0x00008000-0x0004 /* 4 байта, используемые загрузчиком для хранения данных между сбросами */

Это основано на файле .cProj, который поставляется с компоновщиком. Он скомпилирован как статическая библиотека, поэтому я могу включить его в свой окончательный двоичный файл.

Основная прошивка

Мой код имеет статические библиотеки ArduinoCore и bootloader в качестве зависимостей:

libm
libArduinoCore
libbootloader

И я использую эти флаги компоновщика:

-Tflash_with_bootloader.ld -Wl,--cref -Os -Wl,--check-sections -Wl,--unresolved-symbols=report-all -Wl,--warn-common -Wl,--warn-section-align

Содержимое этого сценария компоновщика перемещается на 8 КБ для размещения загрузчика в начале двоичного файла:

    FLASH (rx) : ORIGIN = 0x00000000+0x2000, LENGTH = 0x00040000-0x2000  /* Первые 8 КБ, используемые загрузчиком */
    RAM (rwx) : ORIGIN = 0x20000000, LENGTH = 0x00008000

И все же, моя точка входа, похоже, никогда не попадала в загрузчик. Он прыгает прямо к "main.cpp-из АрдуиноКора. Прошивка работает так, как и ожидалось, но загрузчик, похоже, не был включен.

Это какая-то проблема зависимости? Не злоупотребляю ли я линкерами?

Любая помощь в том, чтобы заставить это скомпилироваться в один двоичный файл, была бы очень признательна. Большое спасибо!

, 👍1

Обсуждение

это не совсем вопрос Arduino, @Juraj

".cProj файл, который поставляется с компоновщиком." Я предполагаю, что вы имели в виду "с загрузчиком." Это цель просто получить один двоичный файл, в котором есть как код скетча, так и загрузчик, потому что IDE и arduino-cli делают это. Или вы действительно хотите использовать ATMEL Studio по какой-то причине?, @timemage

Весь мой проект находится в студии Atmel. Сделать это в Arduino IDE на данный момент невозможно, особенно после изменения некоторых основных файлов. Я думаю, что на данный момент я решил эту проблему с помощью srec_cat., @Andrew


1 ответ


1

Это не совсем 100% ответ, который я искал, потому что я все еще хочу знать, как я могу использовать сборку статической библиотеки, как я уже упоминал в своем посте, и скомпилировать все как один двоичный файл. Этот метод, по сути, склеивает два двоичных файла вместе.

Я нашел здесь этот замечательный и информативный пост: https://www.avrfreaks.net/forum/can-you-combine-appbootloader-using-as7

Он использует srec_cat для объединения двух двоичных файлов после их сборки: https://www.keil.com/support/docs/2666.htm

Я использую смещение, указанное в файле '.ld', используя

srec_cat <firmware1.bin> -Binary <firmware2.bin> -Binary -offset 0x2000 -o <firmwareOut.bin>

Как следует из сообщения, я настроил это как событие после сборки и соответствующим образом настроил свои зависимости сборки, чтобы полная очистка и make произвели консолидированный двоичный файл, включая загрузчик.

Если кто-то попытается это сделать, убедитесь, что вы используете только двоичный файл без загрузчика, сгенерированный вашей основной сборкой проекта. Загрузчик помещает новую прошивку в местоположение 0x2000, и ваша прошивка сломается, если она найдет загрузчик в том месте, где должна быть прошивка. При загрузке прошивки в загрузчик она не перезаписывает загрузчик.

,