Чи можете мені хтось пояснити, як працює завантажувач Arduino ? Я не шукаю тут відповіді високого рівня, я прочитав код і отримую суть його. Я також читав цей інший пост (я навіть був одним із відповідей на нього).
Існує купа взаємодії протоколу, що відбувається між ID-кодом Arduino і кодом завантажувача, в кінцевому рахунку виходить ряд інструкцій з монтажу вбудованих даних, які самостійно програмують спалах, передаючи програму через послідовний інтерфейс.
Що мені незрозуміло - це лінія 270:
void (*app_start)(void) = 0x0000;
... яку я визнаю як декларацію та ініціалізацію до NULL, покажчика функції. Наступні дзвінки до app_start в місцях, де завантажувач призначений для делегування для виконання завантаженого користувачем коду.
Безумовно, якось app_start
потрібно отримати не-NULL значення в якийсь момент, щоб все це зійшло разом. Я не бачу цього в коді завантажувача ... чи це магічно пов'язана програма, яка завантажується завантажувачем? Я припускаю, що головним завантажувачем є точка входу в програмне забезпечення після скидання чіпа.
Загорнутий у 70 або більше рядків складання повинен бути секретним кільцем декодера, який повідомляє головній програмі, де насправді є app_start? Або, можливо, це якийсь неявний ноудж, яким користується IDE Arduino? Все, що я знаю, це те, що якщо хтось не змінить app_start на інший, ніж 0, код завантажувача просто повернеться назавжди ... так у чому фокус?
В окремому записі, чи може код завантажувача покладатися на переривання або це ні-ні?
Редагувати
Мені цікаво спробувати перенести завантажувач до Tiny AVR (зокрема ATTiny44A), який не має окремого місця для пам'яті для коду завантажувача. Оскільки мені стає очевидним, що код завантажувача покладається на певні настройки запобіжника та підтримку мікросхем, я думаю, що мені дуже цікаво знати, що потрібно для того, щоб перенести завантажувач до мікросхеми, яка не має цих запобіжників та обладнання підтримка (але все ще має можливість самопрограмування)?
Я думав, що міг би реалізувати реалізацію AVR307 для використання USI як напівдуплексного UART (використовує переривання Timer0 та переривання pin pin). Чи може хтось запропонувати вказівки щодо того, як піти про написання / перенесення коду завантажувача для мікросхеми, яка не має апаратної підтримки завантажувачів?
Я припускаю, що я ставлю свій код завантажувача у звичайне місце для адреси main (наприклад, 0x029e або там, де компілятор ставить основний). Тоді я зробив би так, щоб "адреса" у коді завантажувача додала зміщення, яке поставило мене лише в кінці основного, і встановило "app_start" на цю адресу. Я правильно думаю про це чи мені зовсім щось не вистачає? Спасибі!
EDIT 2
FWIW, я знайшов документально підтверджений процес, як завантажити ескізи Arduino на ATTiny85 , саме там я спочатку збирався з цим питанням ... досить акуратно, я думаю