Как скомпилировать без добавления загрузчика?

Я использую автономный процессор atmega328p с кристаллом 16 МГц.

Я программирую его через avrdude на Raspberry Pi, используя контакты SPI и RESET.

Когда я компилирую свою программу , вот что я вижу в конце вывода:

----------------
Device: atmega328p

Program:    4152 bytes (12.7% Full)
(.text + .data + .bootloader)

Data:        253 bytes (12.4% Full)
(.data + .bss + .noinit)

Насколько я понимаю, для программирования чипа используется загрузчик через UART, который мне не нужен(?). Я предполагаю, что загрузчик все еще компилируется, поскольку приведенный выше вывод содержит .bootloader в программной части.

Моя программа скомпилирована с использованием SDK arduino со следующим Makefile

ARDUINO_DIR = /usr/share/arduino
BOARD_TAG = uno

include /usr/share/arduino/Arduino.mk

Я просмотрел Arduino.mk и нашел это в строке 1626:

ifndef AVRDUDE_ISP_BURN_BOOTLOADER
    ifneq ($(strip $(BOOTLOADER_FILE)),)
        AVRDUDE_ISP_BURN_BOOTLOADER += -U flash:w:$(BOOTLOADER_PARENT)/$(BOOTLOADER_PATH)/$(BOOTLOADER_FILE):i
    endif
endif

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

ifndef AVRDUDE_ISP_BURN_BOOTLOADER
    ifneq ($(strip $(BOOTLOADER_FILE)),)
        # AVRDUDE_ISP_BURN_BOOTLOADER += -U flash:w:$(BOOTLOADER_PARENT)/$(BOOTLOADER_PATH)/$(BOOTLOADER_FILE):i
    endif
endif

Но тем не менее, после компиляции я вижу часть .bootloader, а размер программы остается прежним.

Можно ли заставить его пропустить добавление загрузчика?

И да, для моего приложения это совершенно ненужно, я просто этого хочу, очень хочу.

, 👍4


3 ответа


4

Наблюдение раздела .bootloader в выводе размера не означает, что он действительно присутствует. Это просто означает, что сумма всех трех составляет 4152 байта.

Вы можете проверить шестнадцатеричный файл, если он содержит большой блок данных в адресном пространстве загрузчика. Основная программа начинается с младших адресов, затем должен быть большой пробел и в конце больший кусок данных с адресами в разделе загрузчика (но только если у вас действительно есть загрузчик).

Но если вы не запрограммируете также предохранитель BOOTRST, он все равно не запустится в загрузчике.

Использование AVRDUDE_ISP_BURN_BOOTLOADER является обычной переменной среды (также может быть установлено внутри Makefile), и поскольку она проверена на отсутствие, вы можете просто проверить, не установлена ли она где-нибудь в Makefile

>
,

Есть ли какой-нибудь инструмент, который позволяет упростить предварительный просмотр всего адресного пространства?, @php_nub_qq


2

Я нашел этот вопрос, который показывает, что адресное пространство загрузчика < от кода>7800 до 7FF0. Я также подтвердил это, взглянув на шестнадцатеричный файл загрузчика atmega328p, хранящийся в /usr/share/arduino/hardware/arduino/bootloaders/atmega/ATmegaBOOT_168_atmega328.hex и действительно, первая строка такая:

:107800000C94343C0C94513C0C94513C0C94513CE1

Здесь объясняется формат шестнадцатеричного файла.

Поэтому я вернулся к своему скомпилированному шестнадцатеричному файлу и проверил, есть ли что-нибудь по этому адресу и нет.

По всей видимости, моя программа не содержит загрузчика.

Я добавляю это как отдельный ответ со всеми подробностями, потому что мне потребовалось некоторое время, чтобы понять это после прочтения Ответ КИЕВ, заслуга принадлежит ему.

,

2

Я сильно сомневаюсь, что компилятор добавляет загрузчик. Вероятно, это сообщение пытается вам сказать, что загрузчик включен в предполагаемое адресное пространство.

Существуют разные загрузчики, Optiboot занимает всего 512 байт. Если вы программируете напрямую (не через загрузчик), то загрузчик, конечно, не требуется .

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

В вашем случае это вряд ли имеет значение, поскольку заявленные 4152 байта намного меньше 32 КБ.

,