Может кто-нибудь объяснить, как работает загрузчик 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 , куда я изначально и шел с этим вопросом ... я думаю, что это довольно изящно