Arduino Bootloader Подробнее


11

Может кто-нибудь объяснить, как работает загрузчик Arduino ? Я не ищу высокоуровневого ответа, я прочитал код и понял его суть. Я также прочитал этот другой пост (я даже был одним из ответчиков на него).

Между IDE Arduino и кодом загрузчика происходит множество протокольных взаимодействий, что в конечном итоге приводит к ряду встроенных инструкций по сборке, которые самостоятельно программируют флэш-память вместе с программой, передаваемой через последовательный интерфейс.

То, что мне не ясно, находится на линии 270:

void (*app_start)(void) = 0x0000; 

... который я распознаю как объявление и инициализация в NULL указателя функции. Последующие вызовы app_start выполняются в тех местах, где загрузчик предназначен для делегирования выполнения загруженного пользователем кода.

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

Примерно в 70 или около того линиях сборки должно быть секретное кольцо декодера, которое сообщает главной программе, где действительно находится app_start? Или, может быть, в Arduino IDE используются неявные знания? Все, что я знаю, это то, что если кто-то не изменит app_start, чтобы он указывал на что-либо, отличное от 0, код загрузчика будет крутиться навсегда ... так в чем же дело?

С другой стороны, возможно ли, чтобы код загрузчика основывался на прерываниях или нет-нет?

редактировать

Я заинтересован в попытке портировать загрузчик на Tiny AVR (в частности, ATTiny44A), который не имеет отдельного пространства памяти для кода загрузчика. Поскольку для меня становится очевидным, что код загрузчика опирается на определенные настройки предохранителей и поддержку микросхем, я думаю, что мне действительно интересно знать, что нужно для переноса загрузчика на чип, который не имеет этих предохранителей и оборудования поддержка (но все еще имеет возможность самостоятельного программирования)?

Я думал, что мог бы использовать реализацию AVR307 для использования USI в качестве полудуплексного UART (использует прерывание Timer0 и прерывание смены штырька). Может ли кто-нибудь предложить руководство по написанию / переносу кода загрузчика для чипа, который не имеет аппаратной поддержки для загрузчиков?

Я предполагаю, что я поместил бы свой код загрузчика в обычное место для адреса main (например, 0x029e или где компилятор помещает main). Затем я сделал бы так, чтобы «address» в коде загрузчика добавлял смещение, которое ставило меня после конца main, и для app_start был установлен этот адрес. Я правильно об этом думаю или я что-то упускаю? Спасибо!

РЕДАКТИРОВАТЬ 2

FWIW, я нашел документированный процесс загрузки эскизов Arduino в ATTiny85 , куда я изначально и шел с этим вопросом ... я думаю, что это довольно изящно


1
stackoverflow.com/questions/3652233/arduino-bootloader/… Интересно, куда пошел мой ответ ...
Ник Т

Ответы:


12
void (*app_start)(void) = 0x0000; 

Это не пустой указатель. Это действительно адрес начала кода приложения, к которому переходит загрузчик. Компоновщик организует запуск кода вашего приложения по адресу 0. См. Таблицу 26-6 в спецификации ATMEGA168.

Код загрузчика начинается выше во флэш-памяти. Именно там, где от предохранителя загрузчика зависит.


где же находится основной код загрузчика ...
vicatcu

1
@ Joby, ну ладно ... см. Обновление на мой вопрос - я заинтересован в попытке портировать загрузчик на Tiny AVR, у которого нет отдельного пространства памяти для кода загрузчика.
Викатку

1
@ Joby, поэтому код загрузчика основан на "... предохранитель перезагрузки может быть запрограммирован так, чтобы вектор сброса указывал на начальный адрес загрузочной флэш-памяти после сброса. В этом случае загрузчик запускается после сброса. "
Викацу

3
Вы специально хотели загрузчик Arduino? Он эмулирует программист STK500 и поэтому является довольно громоздким. В каталоге загрузчиков есть версия atmega8, которая компилируется до 1 Кбайт с помощью gcc-3, но даже это оставит вам довольно мало доступной флэш-памяти.
Питер Гибсон

3
Вы бы вообще хотели загрузчик? несомненно, для ATTiny, скорее всего, стоит ваших усилий запрограммировать устройство с помощью программатора ICSP (такого как usbTinyISP)
SingleNegationElimination
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.