Descrierea arduino a procesului de asamblare a schițelor, avr, programare

Înainte ca programul Arduino (schița) să intre în memoria microcontrolerului și să înceapă să funcționeze, ar trebui să apară mai multe procese ascunse de ochiul utilizatorului.





Primul mediu de dezvoltare Arduino IDE efectuează cod mic de conversie schiță, pentru a face text, pe deplin compatibil cu C sau standard limbajul C ++ (cele două limbajul cel mai bine cunoscut în lumea de microcontrolere). Apoi, textul rezultat este transmis programul avr-gcc compilator, care se traduce cod de program citibil în opcodes obiect adecvat (după o nouă transformare - legarea) pentru a realiza nucleul microcontroler utilizat (de obicei, Atmel AVR ATmega328). Apoi, obiectul de cod mașină schiță este combinat (acest proces este denumit erori de legătură) cu funcțiile de cod din bibliotecile standard de Arduino (aceste biblioteci oferă o varietate de funcții, cum ar fi baze digitalWrite () sau Serial.print ()). Rezultatul este un fișier în formatul Intel HEX [2], care trebuie scris în memoria microcontrolerului plăcii de prototipuri Arduino. De obicei, funcția de programare cod în memoria microcontrolerului presupune un standard Arduino UART-bootloader: cod este transmis încărcătorului prin USB conectarea la un calculator (prin intermediul cip USB-UART, de obicei, compania FTDI). UART-bootloader Arduino a fost inițial înregistrată în card de memorie microcontroler special de ISP-programator (de altfel, de multe carte chineză Ardiuno compatibil ieftine pe care le puteți cumpăra de pe eBay, suferă de o lipsă cusută boot loader).







[Pregătirea fișierului principal de schiță]

[Fișier principal de schițe pentru transformări]

După cum sa menționat deja, Arduino IDE face unele de transformare peste fișierul principal schiță (acest lucru poate fi ca un singur fișier de pe o filă, și încă unit cu fiecare alte fișiere fără extensii pe mai multe file) înainte de a trimite codul de la compilator AVR-GCC.

În primul rând, la începutul principal schiță de fișier ascuns #include adăugat „Arduino.h“ sau pentru versiunile mai vechi (mai puțin de 1,0) #include „WProgram.h“. Acest fișier antet (este în% ARDUINO% / hardware / core //, unde CORE este numele kernel-ului de microcontroler folosit) conectează toate definițiile necesare kernelului standard Arduino.

Preprocesorul este primul pas în procesul de procesare a codului sursă (schiță), a compilatorului. Preprocesorul compilatorului caută cuvinte cheie speciale în cod care încep cu semnul #, care indică începutul directivei compilatorului.

Probabil că ați întâlnit cuvintele cheie #include atunci când utilizați bibliotecile. Directiva #include indică preprocesorului compilatorului să introducă codul din fișierul antet al bibliotecii în această locație.

Există și alte directive preprocesor (#define, #if, #else, #error, #pragma etc.), informații despre acestea pot fi găsite în manualul compilatorului [5]. Uneori, un preprocesor este singura modalitate de a rezolva o problemă, însă sintaxa de preprocesor este diferită de C și C ++, iar utilizarea nepăsătoare a directivelor preprocesor poate duce la greșeli greu de capturat.

Diferite constante (obținute din fișierul descriptions boards.txt și legate de placa selectată) sunt adăugate în fișier. Aceste constante sunt legate de tipul de microcontroler utilizat. În cele din urmă, conținutul fișierului țintă curent (țintă) main.cxx se adaugă la sfârșitul schiței. După toate aceste conversii, fișierul este compilat de compilatorul AVR-GCC.

Prin țintă, aici se înțelege placa Arduino, pentru care este compilat codul mașinii binare. Mediul de dezvoltare Arduino suportă mai multe plăci cu microcontrolere diferite (în prezent există doar microcontrolere din aceeași familie - AVR), viteze de ceas (viteză CPU) sau încărcătoare. Toate aceste setări ale platformelor sunt specificate în fișierul de setări (preferences.txt).

Unele setări pot fi modificate în dialogul Preferințe direct din mediul de dezvoltare Arduino. Pe platformele Windows sau Linux, acesta este meniul Fișier, pe platforma Mac este meniul Arduino. Alte setări ar trebui modificate prin editarea fișierului preferences.txt. Locația acestui fișier este afișată în dialogul Setări. Acest loc ar trebui să fie:

Editați acest fișier numai în cazul în care Arduino IDE nu se execută, în caz contrar toate modificările vor fi suprascrise și a pierdut atunci când ați terminat folosind Arduino IDE.

Definițiile care definesc conținutul meniului Board pot fi găsite în fișierul boards.txt situat într-un director de aplicație hardware subdirector / Arduino IDE. Definițiile pentru meniul Burn Bootloader sunt localizate în fișierul programmers.txt din același director. Pentru a crea un nou card, sau definirea programării, face o copie a unuia existent, și de a schimba prefixul folosit în proprietatea cheie (tastele de preferință, cum ar fi „diecimila.“ Sau „avrisp.“), Și modificați valorile pentru a se potrivi cu hardware-ul. Rețineți că sunt acceptate numai anumite configurații de carduri.

Variabilele corespunzătoare pentru setări includ:

.nume. Numele plăcii care va fi afișată în meniul Boards.
.build.mcu. microcontroler pe bord ("atmega8" sau "atmega168", mai des este "atmega328").
.f_cpu. Viteza ceasului (viteza ceasului) pe care funcționează microcontrolerul (de obicei "16000000L" sau pentru cazul în care ATmega168 funcționează pe ceasul său intern, apoi "8000000L").
.core. un subdirector al directorului hardware / core / pentru legarea schițelor (de obicei "arduino").

Următoarea setare este de asemenea utilă în preferences main.txt:

build.verbose. dacă este sau nu să trimiteți mesaje de depanare (detaliate) care descriu procesul de compilare a schiței (de exemplu, "false"). Dacă este adevărat, linia de comandă pentru fiecare comandă externă executabilă ca parte a procesului de construire va fi afișată în întregime și în linia de comandă.

Notă: dacă mesaje false, detaliate despre procesul de compilare nu vor fi afișate, cu toate acestea, puteți anula acest comportament pentru procedura viitoare de compilare sau descărcare dacă țineți apăsată tasta Shift când faceți clic pe comanda Compilare sau Upload.

Notă: în versiunile Arduino 0004 și mai târziu, build.extension nu este utilizat - fișierul principal de schiță este întotdeauna tratat ca un fișier .cpp.

Schițele sunt compilate de compilator avr-gcc și avr-g ++ în conformitate cu fișierul boards.txt variabil pentru platforma selectată (board selectat Arduino).

Căile de căutare pentru conectarea căii include include directorul de schiță, directorul țintă (% ARDUINO% / hardware / core //) Bord variantă Directory (subdirectoare hardware / Arduino / variante, specificate în fișierul board.txt) includ fișiere și AVR director (% ARDUINO% / hardware / unelte / avr / avr / include /), precum și toate orice cataloage de bibliotecă ( în directorul%% ARDUINO / biblioteci /) care conține fișierele antet care sunt atașate fișierului principal de schiță.

Când verificați (verificați) sau încărcați (încărcare) o schiță, acesta este compilat într-un director de sistem temporar (de exemplu, pe un Mac sau Linux este directorul / tmp). Când încărcați (încărcați), ansamblul are loc în sub-directorul applet / directorul de schiță (pe care o puteți accesa făcând clic pe „Afișare Schița Folder“, T. E. „dosarul Arată schița“ meniul „Schiță“, „Schiță“) .

Vizați fișierele .c și Cpp compilate în fișierele de ieșire cu extensia .o, și se încadrează în acest dosar ca fișierul principal al schiței, precum și orice alte fișiere .c sau .cpp în schiță, sau orice fișiere .c sau .cpp de orice bibliotecă, #include directiva schiței.

Înainte de a încerca să compilați fiecare .c sau .cpp, se face o încercare de reutilizare a fișierului compilat anterior. - Această încercare accelerează procesul de construire. Un fișier .d special (din dependența de cuvânt, o dependență) oferă o listă a tuturor celorlalte fișiere incluse în fișierul sursă. Pasul de compilare este ignorat dacă există fișiere .o și .d și au o marcă de timp mai nouă decât fișierul sursă și toate fișierele de listă de dependență. Dacă fișierul sursă sau orice fișier din lista de dependență a fost modificat sau sa produs o eroare la verificarea fișierelor, compilatorul rulează ca de obicei și scrie fișiere noi .o și .d. După ce noua placă a fost selectată în meniul Instrumente, toate fișierele .c și .cpp vor fi recompilate la următoarea pornire a compilației.

Apoi, aceste fișiere .o se leagă reciproc într-o bibliotecă statică, care apoi leagă la fișierul obiect primite din fișierul principal de schiță. Și în fișierul .hex de ieșire va primi doar codul acelor părți ale bibliotecilor și fișierelor obiect care sunt cu adevărat utilizate în schiță, decât dimensiunea fișierului de ieșire scade.

Fișierul .hex este rezultatul final al compilației, care este descărcat la bord. În timpul testului Verify, fișierul .hex este scris în / tmp (pe platformele Mac și Linux) sau \ Documents and Settings \ username \ Local Settings \ Temp (pe platforma Windows). În timpul descărcării, fișierul HEX este scris în subdirectorul de aplicații al directorului de schiță.

Instrumente utilizate pentru punerea în aplicare a procesului de compilare (inclusiv compilatorul AVR-GCC), sunt situate în% ARDUINO% / hardware / unelte / avr.

Pentru programatorii avansați, utilitarul avr-objdump poate fi util. care este, de asemenea, în directorul instrumente. Vă permite să vedeți cum compilatorul a transformat codul de schiță într-un program pe care microcontrolerul plăcii îl execută. Instrumentul avr-objdump generează o listă pentru dezasamblarea schiței dvs., care va afișa codul obiect amestecat cu liniile corespunzătoare ale codului sursă. Afișarea arată, de asemenea, o hartă de memorie pentru toate variabilele utilizate în schița dvs. Pentru a utiliza avr-objdump, mai întâi compilați schița și apoi mergeți la directorul directorului de instalare Arduino. Apoi găsiți dosarul care conține toate fișierele intermediare utilizate în procesul de construire (după cum sa explicat mai devreme). Fișierul intermediar utilizat de utilitarul avr-objdump are extensia .elf. De exemplu, dacă ați compilat schița Blink, puteți vedea ieșirea de compilare (codurile mașinilor) executând următoarea comandă din linia de comandă:

Următoarea versiune a comenzii va adăuga o listă de anteturi la ieșire (ajută la determinarea consumului de memorie):

De asemenea, puteți crea un fișier batch (un fișier cu o extensie .bat) care va afișa înregistrarea într-un fișier. Adăugați calea spre directorul de instalare Arduino la următoarea linie și salvați-o ca fișier batch:

[Procesul de încărcare]

Codul binar compilat al schiței (reprezentat de fișierul de ieșire în format Intel HEX) intră, de obicei, în memoria plăcii microcontrolerului cu încărcătorul și utilitarul de tip avrdude.

Procesul de descărcare este, de asemenea, controlat de variabilele din setările cardului și setările de bază. Aceste setări includ:

.upload.protocol. Protocolul pe care ar trebui să îl utilizeze pentru a comunica cu încărcătorul plăcii (de obicei protocolul "stk500").
.upload.speed. Rata baud care ar trebui să utilizeze avrdude la descărcarea schițelor (de obicei "19200").
.upload.maximum_size. Dimensiunea maximă a schiței pentru placă (depinde de modelul cipului și de mărimea codului încărcătorului încărcat).

De asemenea, fișierul cu preferințe principale afectează procesul de descărcare:

upload.verbose. dacă este sau nu să se furnizeze mesaje de depanare (detaliate) care descriu procesul de încărcare, adică trimiterea codului la încărcătorul de bord (implicit este "fals", adică mesajele detaliate nu vor fi transmise).

Notă: dacă mesaje false, detaliate despre procesul de descărcare nu vor fi afișate, cu toate acestea, puteți anula acest comportament pentru procedura viitoare de compilare sau descărcare dacă țineți apăsată tasta Shift când faceți clic pe comanda Compilare sau Upload.







Articole similare

Trimiteți-le prietenilor: