Деталі завантажувача Arduino


11

Чи можете мені хтось пояснити, як працює завантажувач 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 , саме там я спочатку збирався з цим питанням ... досить акуратно, я думаю


1
stackoverflow.com/questions/3652233/arduino-bootloader/… Цікаво було, куди пішла моя відповідь…
Nick T

Відповіді:


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

Це не NULL покажчик. Це дійсно адреса початку коду програми, на який завантажується завантажувач. Лінкер організовує початок коду вашої програми за адресою 0. Див. Таблицю 26-6 у таблиці даних ATMEGA168.

Код завантажувача завантажується спалахом вище. Саме там, де залежить від запобіжників завантажувача.


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

1
@Joby, ага гаразд ... див. Оновлення до мого питання - мені цікаво намагатися перенести завантажувач до крихітного AVR, який не має окремого місця для пам’яті для коду завантажувача.
vicatcu

1
@Joby, тому код завантажувача покладається на "... запобіжник скидання завантажувача може бути запрограмований таким чином, щоб вектор скидання вказував на початкову адресу завантажувальної спалаху після скидання. У цьому випадку завантажувач завантажувача запускається після скидання. "
vicatcu

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

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