Avr bootloader в питаннях і відповідях

Як завантажувачу переконатися що в додатку немає змін?

Після скидання завантажувач, як правило, здійснює перехід до додатка. Але як він може бути впевнений, що додаток є допустимим, чи немає пошкоджень програма, яка повинна почати виконуватися? Що робити, якщо попередня спроба оновити програму аварійно завершилася на середині завантаження? В такому випадку є багато можливих запобіжних заходів, які ви можете зробити. Ось деякі з них:

Чи може код завантажувача виконувати код, вбудований в додаток?

Кажуть: «Ні, ні і 100% точно ні».
Хоч технічно це можливо, але відповідь все одно - «Ні». Ваш завантажувач буде набагато більш надійним, якщо він має нульову залежність від програми. Основна мета завантажувача - стерти і перепрограмувати додаток. Ви ж не хочете телефонувати за офіційним номером ділянок коду програми в той час як перете його вміст.
Поганою практикою також вважається зберігати код, що відноситься до завантажувача в розділі RWW. Не існує повного докази або способу захисту від випадкового стирання і перепрограмування цій галузі. Одне повне стирання RWW і завантажувач потенційно стає марним.

Чи може код додатка виконувати код, вбудований в завантажувач?

Так, зробити це досить легко. Особливо якщо код для спільного використання не має доступу до глобальних змінних. Тільки не намагайтеся досягти загального коду шляхом створення завантажувача і додатки в якості одного двійкового файлу. Найкраще будувати їх окремо і використовувати покажчики на функції загального коду.

Є кілька способів поставити таблицю переходів. Зручніше це уявити у вигляді окремого маленького файлу збірки:

Вам може знадобитися ще один прапор, щоб запобігти спробам компоновщика викидати вашу таблицю переходів у випадках, коли вона виявиться не затребуваною. Це можливо при використанні прапора компілятора -ffunction-sections спільно з прапорами лінковщік --gc-sections і --relax. Тому якщо ви не впевнені, то в будь-якому випадку це не завадить додати:

Чому глобальні змінні не доступні із загальних функції?

Так як у вас два абсолютно різних двійкових файлу, то кожен буде мати своє власне розподіл пам'яті. Позиції глобальних змінних в додатку ніяк не пов'язані з позиціями глобальних змінних в
завантажувач.
Припустимо, загальна функція завантажувача помилково виробляє читання і запис в глобальну змінну безпосередньо.
Коли завантажувач був отлінкован, простір глобальних змінних по суті було жорстко запрограмовано в його виконуваний код. Коли завантажувач виконується, то його позиція правильна, і все працює нормально. Але коли запускається додаток, яке викликає ті ж функції, то жорстко задані позиції глобального простору вже зовсім не ті. Створюється неправильна ситуація, тому що коли додаток виконується, то її розподіл пам'яті відрізняється від розподілу пам'яті завантажувача. Таким чином, ви не можете отримати безпосередній доступ до глобальних змінних із загальних функцій без потенційної загрози знищення даних в додатку.

Якщо з якихось причин ви не можете передати параметр в загальну функцію см. Питання № 17 нижче.

Чи може додаток використовувати IRS вбудований в завантажувач?

Потім необхідно додати обрабочік переривання в вашому додатку. Даний обробник сам по собі нічого не робить - він здійснює безумовний перехід на функцію - обробник переривання завантажувача. наприклад:

Як організувати доступ до глобальних даних усередині загальних оброблювачів ISR?

Чи можна заощадити місце в засобі завантаження на використанні обробників ISR?

Так, найчастіше таким чином можна заощадити 100 і більше байт завантажувача. Ця також ставитися і до звичайних додатків, але така економія для завантажувача більш істотна ніж до додатка. Деякі архітектури AVR мають 40 або більше переривань, кожен з яких в таблиці векторів переривань приймає по 4 байта. Ви можете не тільки незначно заощадити, але і перевизначати невикористовувані вектора як переходи на загальні функції (обговорюється в питанні № 14).

Перший запис в таблиці переривань - це вектор скидання. Завантажники і додатки часто користуються вектором скидання, тому що виконуваний код ніколи не починається з початку прошивки. Навіть якщо вектор скидання в даний час не потрібно, він може знадобитися в майбутньому, наприклад, після того, як хтось додасть нову змінну PROGMEM. Тому замість того щоб, повністю видаляти таблицю переривань з завантажувача, краще просто його зменшити. Мінімальна таблиця переривань може бути записати таким чином:

Ця таблиця містить тільки вектор скидання, який веде на функцію __init середовища виконання С (це те, що робить вектор скидання за замовчуванням). Припускаючи, що JMP можна замінити на RJMP, ми маємо вектор переривань розміром в 2 байта. Додайте цей .S файл в рядок ASRC вашого Makefile.

Більш правильний спосіб заміни таблиці векторів за замовчуванням полягає в використанні спеціального сценарію линкера. Спочатку необхідно дізнатися з якого місця бере скрипти компоновщик AVR. Теоретично сценарії компоновщика повинен бути названий ім'ям архітектури AVR. Але виявляється, що іноді це не так, тому виявити скрипт можна перейменуванням папки, в якій він міститься (найчастіше це C: \ WinAVR \ avr \ lib \ ldscripts на Windows, і / usr / local / avr / lib / ldscripts на Unix -подібних ОС), і подальшої перекомпиляцией. Компоновщик буде скаржитися «Не вдається відкрити файл сценарію лінковщік ldscripts / avr3.x». Це підкаже вам правильне ім'я файлу сценарію. Відновіть заводські імена тек і скопіюйте знайдений файл в каталог проекту. Потім додайте наступний рядок в Makefile в місце, де прописуються Флакі компоновщика:

Додайте рядок DISCARD і замініть «vectors», на ваше ім'я секції:

Схожі статті