ПредишенСледващото

Както товарач за да сте сигурни, че заявлението не се променя?

След рестартиране, зареждане, обикновено прави преход към заявлението. Но как може да бъдете сигурни, че когато жалбата е допустима, дали програмата е повреден, която трябва да бъде изпълнена, за да започнете? Какво става, ако при предишния опит за ъпгрейд на програмата да се блъсне в средата на мишката? В този случай, има много възможни предпазни мерки, които можете да предприемете. Ето някои от тях:

Може ли код буутлоудъра да изпълни код вградена в приложението?

Те казват: "Не, не, със сигурност не на 100%."
Въпреки, че това е технически възможно, но отговорът е все още - "Не". Вашият буутлоудъра ще бъде много по-надежден, ако има нула в зависимост от приложението. Основната цел на товарача - изтрива и препрограмира на заявлението. Вие не искате да осъществявате повиквания код на приложението области, докато изтриете съдържанието му.
Bad практика се счита също така да се запази кода, свързани с товарач в раздела RWW. Не е пълна метод доказателство, или защита срещу случайно изтриване и препрограмиране тази област. Едно пълно изтриване RWW и товарач потенциално станат безполезни.

Може ли кода на приложението да изпълнява код, вграден в буутлоудъра?

Да, това е доста лесно да се направи. Особено, ако кодът за споделяне не разполага с достъп до глобални променливи. Само не се опитвайте да се постигне общо код, чрез създаване на буутлоудъра и приложението като двоичен файл. Най-добре е да ги изгради отделно и се използват указатели към цялостната функция код.

Има няколко начина да настроите масата за скок. Тя е по-удобно да го представят като отделен малък монтаж файл:

Може да се наложи друг флаг, за да се предотврати опитите свързващи да хвърли своя скок на маса, когато тя не би продаваеми. Това е възможно, когато се използва -ffunction сечения компилатор флаг заедно с флагове линкерни --gc сечения и --relax. Ето защо, ако не сте сигурни, във всеки случай, това не боли да се добави:

Защо световната променливи не са достъпни от обща функция?

Тъй като имате две напълно различни двоичен файл, а след това всеки ще има своя собствена памет разпределяне. Позиция на глобални променливи в заявлението по никакъв начин не е свързан с позициите на глобалните променливи
товарач.
Да предположим, че цялостната функция на зареждане погрешно чете и записва в глобална променлива директно.
Когато зареждането на ОС е otlinkovan пространство на глобални променливи в действителност това е трудно кодирани в изпълним своя код. Когато товарача се изпълнява, правилно, вече и всичко работи добре. Но, когато приложението се стартира, която е една и съща функция, тъй като твърдо кодирана позиция като глобален пространство е съвсем наред. Той създава погрешна ситуация, тъй като когато приложението се изпълнява, неговото разпределение на паметта се различава от разпределението на паметта товарач. По този начин, вие не можете да имат директен достъп до глобалните променливи на общите функции, без да е потенциална заплаха от унищожаване на данните в заявлението.

Ако по някаква причина не можете да подадете параметър на цялостната функция, вижте. Въпрос номер 17 по-долу.

Може ли IRS да използвате вградения в изтегляне на приложението?

След това трябва да добавите obrabochik прекъсване на вашата кандидатура. Това се манипулатор не прави нищо - тя изпълнява безусловно скок към функция - прекъсване манипулатор товарач. Например:

Как да се организира достъп до глобални данни в споделена манипулатор ISR?

Възможно ли е да се спести място в зареждането на системата да се използва манипулатор ISR?

Да, често, така че можете да спестите 100 или повече байта буутлоудъра. Това важи и за обичайните приложения, но тези икономии за зареждане е по-значителни, отколкото на заявлението. Някои архитектури AVR имат 40 или повече прекъсвания, всеки от които получава прекъсване вектор масата на 4 байта. Вие не можете да само значително спестят пари, но също така и да се предефинира неизползван вектор като преходи към основните функции (обсъдени въпросния номер 14).

Първият запис в таблицата с прекъсване - нулиране вектор. Товарачи и приложения често използват вектора нулиране като изпълним никога не започва от началото на фърмуера. Дори ако в момента не се изисква вектор за нулиране, може да се наложи в бъдеще, например, след като някой добави ново променлива PROGMEM. Така че, вместо да се отстранят всички прекъсване маса на зареждане, по-добре е просто да го намали. Минимална маса прекъсване може да се запише по следния начин:

Тази таблица съдържа само вектора нулиране, което е __init среда функция с изпълнението (това е това, което прави нулиране вектор по подразбиране). Ако приемем, че JMP може да бъде заменен от RJMP, ние се прекъсне вектор в 2-байт. Добави тази .s файл в низ ASRC си Makefile.

По-добър начин да се замени таблицата с вектор по подразбиране е да се използва специален скрипт, свързваща. Първо, трябва да се учат от това, което се случва свързващи скриптове AVR. На теория, свързваща скрипт трябва да бъде кръстен на архитектурата AVR. Но се оказва, че понякога не е, следователно, да намерите скрипта можете да преименувате папката, в която се съдържа (най-често C: \ WINAVR \ AVR \ ИЪ \ ldscripts на Windows и / ЮЕсАр / местни / AVR / ИЪ / ldscripts на Unix -подобен OS), и след това компилирате. Свръзката ще се оплакват "Не мога да отворя файла свързваща скрипт ldscripts / avr3.x». Той ще ви каже правилното име на скрипт файл. Възстановете оригиналните имена на директориите и копирайте намерена в директорията на проекта файла. После добавете следния ред в Makefile на мястото, където през цялото Flake Линкер:

Изхвърлете добавите един ред и да се замени «вектори», на името си в:

Свързани статии

Подкрепете проекта - споделете линка, благодаря!