Как скомпилировать без добавления загрузчика?
Я использую автономный процессор 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
, а размер программы остается прежним.
Можно ли заставить его пропустить добавление загрузчика?
И да, для моего приложения это совершенно ненужно, я просто этого хочу, очень хочу.
@php_nub_qq, 👍4
3 ответа
Наблюдение раздела .bootloader в выводе размера не означает, что он действительно присутствует. Это просто означает, что сумма всех трех составляет 4152 байта.
Вы можете проверить шестнадцатеричный файл, если он содержит большой блок данных в адресном пространстве загрузчика. Основная программа начинается с младших адресов, затем должен быть большой пробел и в конце больший кусок данных с адресами в разделе загрузчика (но только если у вас действительно есть загрузчик).
Но если вы не запрограммируете также предохранитель BOOTRST, он все равно не запустится в загрузчике.
Использование AVRDUDE_ISP_BURN_BOOTLOADER
является обычной переменной среды (также может быть установлено внутри Makefile), и поскольку она проверена на отсутствие, вы можете просто проверить, не установлена ли она где-нибудь в Makefile
Я нашел этот вопрос, который показывает, что адресное пространство загрузчика < от кода>7800 до 7FF0
. Я также подтвердил это, взглянув на шестнадцатеричный файл загрузчика atmega328p
, хранящийся в /usr/share/arduino/hardware/arduino/bootloaders/atmega/ATmegaBOOT_168_atmega328.hex
и действительно, первая строка такая:
:107800000C94343C0C94513C0C94513C0C94513CE1
Здесь объясняется формат шестнадцатеричного файла.
Поэтому я вернулся к своему скомпилированному шестнадцатеричному файлу и проверил, есть ли что-нибудь по этому адресу и нет.
По всей видимости, моя программа не содержит загрузчика.
Я добавляю это как отдельный ответ со всеми подробностями, потому что мне потребовалось некоторое время, чтобы понять это после прочтения Ответ КИЕВ, заслуга принадлежит ему.
Я сильно сомневаюсь, что компилятор добавляет загрузчик. Вероятно, это сообщение пытается вам сказать, что загрузчик включен в предполагаемое адресное пространство.
Существуют разные загрузчики, Optiboot занимает всего 512 байт. Если вы программируете напрямую (не через загрузчик), то загрузчик, конечно, не требуется .
Если вы программируете через SPI и соответствующим образом устанавливаете флаг BOOTRST, процессор будет загружаться непосредственно в ваш код, что сэкономит небольшое количество времени, поскольку загрузчик ожидает, есть ли какой-либо последовательный вход для перепрограммирования. Плюс вы получаете еще 512 байт для вашего кода.
В вашем случае это вряд ли имеет значение, поскольку заявленные 4152 байта намного меньше 32 КБ.
- Не удается снова загрузиться после смены платы
- Экран LCD 16*02 I2C показывает только первый напечатанный символ
- Что происходит, когда код загружается с помощью загрузчика?
- Ошибка при записи загрузчика
- Что означает avrdude: Device signature = 0x000000? Неисправная проводка? Проблема с программным обеспечением? Неправильная инструкция?
- Digispark Atinny85 не распознан (проблема с загрузчиком)
- Ошибка проверки Avrdude
- Atmega328p — переход на низкое энергопотребление 1,8 В с использованием генератора 4 МГц — прошивка загрузчика
Есть ли какой-нибудь инструмент, который позволяет упростить предварительный просмотр всего адресного пространства?, @php_nub_qq