Как компилятор/ассемблер работает с загрузчиком?

Я понял, что на платах atmega загрузчик запрограммирован в чип.

Интересно, при компиляции скетча чем отличается компилятор/ассемблер от компиляции стандартной программы на Си для чипа без загрузчика?

Есть ли еще основной? Помещает ли компоновщик код запуска в другую область? Очевидно, что с загрузчиком вы больше не компилируете программу, которая размещает код по адресу сброса.

, 👍2

Обсуждение

https://stackoverflow.com/questions/919781/how-can-i-get-an-assembly-language-listing-of-my-arduino-sketches-on-windows#930855, @jsotola


1 ответ


Лучший ответ:

5

На Uno и подобных платах на базе AVR компилятор и ассемблер не знает загрузчика. Скомпилированная программа начинается по адресу нуль. Там у вас есть таблица векторов прерываний, начиная со сброса вектор. Этот вектор является переходом к коду запуска среды выполнения C, который делает некоторая низкоуровневая инициализация, затем вызывается main() из ядра Arduino библиотека, которая вызывает setup() и loop() из вашего скетча.

Загрузчик находится в конце прошивки. Чип AVR имеет несколько байтов энергонезависимой памяти конфигурации, называемой «предохранителями». Эти байты настроены производителем платы Arduino, чтобы посвятить последнюю 512 байт флэш-памяти в загрузчик, и чтобы начать выполнение код при запуске загрузчика при включении питания и при сбросе событий. Это тогда загрузчик обязан перейти к нулевому адресу, чтобы для запуска программы пользователя.

,

То есть я могу писать стандартные программы с помощью avr studio и ничего не менять и загружать их?, @FourierFlux

@FourierFlux: я никогда не использовал AVR Studio, но иногда пишу обычные программы AVR с помощью avr-libc, компилирую их с помощью avr-gcc и загружаю в Uno с помощью avrdude., @Edgar Bonet

Хорошо, но дело в том, что вы просто компилируете стандартную программу на C., @FourierFlux

предупреждение для будущих читателей. ответ на самом деле относится только к архитектуре AVR. он не распространяется на другие архитектуры, @Juraj