Și 4

Conține o tabelă de vectori de vector vectori de întrerupere a vectorului.

Segmentele sunt stocate în memorie atunci când se folosesc directivele linker pentru a controla plasarea segmentelor -Z și -P, care sunt proiectate pentru plasare secvențială și lot, respectiv. Unele segmente nu pot utiliza destinația de plasare lot, deoarece conținutul lor trebuie să fie continuu. În fiecare descriere, tipul de memorie segment - CODE, CONST sau DATA - indică dacă segmentul ar trebui să fie plasat în ROM sau RAM.







CODE Pentru codul executabil.
CONST Pentru datele care sunt plasate în ROM.
DATE Pentru datele introduse în memoria RAM.

Pentru mai multe informații despre directivele -Z și -P, consultați Ghidul de referință IAR Linker and Tools Tools. Pentru a afla cum să specificați segmente în fișierul de comandă linker, consultați secțiunea "Gestionarea linkerului utilizând fișierul de comandă". Pentru mai multe informații despre sintaxa specială extinsă IAR (cuvintele cheie extinsă), consultați secțiunea "Cuvinte cheie extinsă".

COD. Acest segment conține codul programului, cu excepția codului de inițializare a sistemului și a codului funcției, care sunt definite cu atributul __ramfunc. Acest cod este executat din ROM (de obicei FLASH).
Segmente de memorie tip: CODE
Alocarea memoriei: acest segment poate fi plasat oriunde în memorie.
Tip de acces: numai pentru citire.

CODE_I. Acest segment conține codul funcției definit cu atributul __ramfunc. Acest cod este executat din memoria RAM (de obicei acest tip de memorie dă o creștere suplimentară a vitezei de execuție). Codul este copiat în RAM din segmentul CODE_ID în timpul procesului de inițializare.
Segmente de memorie tip: CODE
Alocarea memoriei: Acest segment poate fi plasat oriunde în memorie.
Tip de acces: citiți și scrieți.

CODE_ID. În acest segment, există un stoc de cod care este definit cu atributul __ramfunc. Acest cod este executat din memoria RAM după ce este copiat pe segmentul CODE_I.
Segmente de memorie tip: CODE
Alocarea memoriei: acest segment poate fi plasat oriunde în memorie.
Tip de acces: numai pentru citire.

CSTACK. Conține datele interne ale stivei.
Segment de memorie segmentată: DATA
Alocarea memoriei: acest segment poate fi plasat oriunde în memorie.
Tip de acces: citiți și scrieți.

În mod implicit, la începutul fișierului de configurare a linkerului, este stabilită o constantă care determină dimensiunea stivei:

Apoi, în fișierul de configurare a linkerului, segmentele reale sunt definite în funcție de zona de memorie alocată stivei:

DATA_AC. Conține date despre constantele inițializate.

DATA_AN. Conține date care sunt definite cu atributul __no_init. Tot ceea ce se spune despre datele localizate din descrierea segmentului DATA_AC se aplică segmentului DATA_AN.

DATA_C. Conține date despre constante (obiecte definite cu cuvântul cheie const).
Tip de memorie segmentată: CONST
Alocarea memoriei: acest segment poate fi plasat oriunde în memorie.
Tip de acces: numai pentru citire.

DATA_I. Conține variabile inițializabile statice și globale care sunt inițializate prin copierea de pe segmentul DATA_ID la pornirea aplicației (pornire). Acest segment nu poate fi plasat în memorie prin directiva de alocare a pachetelor -P, deoarece conținutul segmentului trebuie să fie continuu. În schimb, utilizați directiva -Z când specificați acest segment în fișierul de configurare al comenzii linker.
Segment de memorie segmentată: DATA
Alocarea memoriei: acest segment poate fi plasat oriunde în memorie.
Tip de acces: citiți și scrieți.

DATA_ID. Stocul de valori pentru variabilele statice și globale ale segmentului DATA_I. Aceste valori sunt copiate de la DATA_ID la DATA_I la pornirea aplicației (pornire). Acest segment nu poate fi plasat în memorie prin directiva de alocare a pachetelor -P, deoarece conținutul segmentului trebuie să fie continuu. În schimb, utilizați directiva -Z când specificați acest segment în fișierul de configurare al comenzii linker.
Tip de memorie segmentată: CONST
Alocarea memoriei: acest segment poate fi plasat oriunde în memorie.
Tip de acces: numai pentru citire.

DATA_N. Conține variabile statice și globale care sunt definite cu atributul __no_init.
Segment de memorie segmentată: DATA
Alocarea memoriei: acest segment poate fi plasat oriunde în memorie.
Tip de acces: citiți și scrieți.







DATA_Z. Conține variabile statice și globale inițializate cu zero. Acest segment nu poate fi plasat în memorie prin directiva de alocare a pachetelor -P, deoarece conținutul segmentului trebuie să fie continuu. În schimb, utilizați directiva -Z când specificați acest segment în fișierul de configurare al comenzii linker.
Segment de memorie segmentată: DATA
Alocarea memoriei: acest segment poate fi plasat oriunde în memorie.
Tip de acces: citiți și scrieți.

DIFUNCT. Conține vectorul de inițializare dinamic utilizat de C ++.
Segmente de memorie tip: CODE
Alocarea memoriei: acest segment poate fi plasat oriunde în memorie.
Tip de acces: numai pentru citire.

HEAP. Conține o grămadă folosită pentru date dinamice alocate, cu alte cuvinte pentru datele alocate de malloc și apeluri gratuite, precum și în C ++, noi și șterse.
Segment de memorie segmentată: DATA
Alocarea memoriei: acest segment poate fi plasat oriunde în memorie.
Tip de acces: citiți și scrieți.

Segmentul de heap va fi folosit în aplicație numai când alocarea dinamică a memoriei este efectiv utilizată. Dimensiunea haldei și alocarea acesteia în memorie sunt determinate de fișierul comenzilor linker - exact ca în definiția segmentului de stivă. exemplu:

ICODE. Conține un cod de pornire special; aceste funcții ar trebui să se încadreze în sfera disponibilității instrucțiunilor de ramură din segmentul INTVEC.
Segmente de memorie tip: CODE
Alocarea memoriei: acest segment poate fi plasat oriunde în zona de memorie inferioară de 32 MB, astfel încât instrucțiunile din ramura de asamblare din segmentul INTVEC să poată transfera controlul la ICODE.
Tip de acces: numai pentru citire.

IRQ_STACK. Conține teancul utilizat la manipularea excepțiilor IRQ. Alte stive pot fi adăugate dacă este necesar pentru a trata alte tipuri de excepții FOQ, SVC, ABT și UND. Fișierul de pornire cstartup.s79 trebuie modificat pentru a inițializa indicatorii de stivă excepționali utilizați.
Segment de memorie segmentată: DATA
Alocarea memoriei: acest segment poate fi plasat oriunde în memorie.
Tip de acces: citiți și scrieți.

Arhitectura ARM acceptă 5 moduri excepționale, care includ procesorul pentru diferite evenimente de excepție. Fiecare mod de excepție are un stack propriu, pentru a evita stricarea stack-ului de utilizator / sistem. Tabelul prezintă numele propuse pentru diferitele stive de excepții, dar pot fi folosite orice alte nume.

Numele segmentului de stivă recomandat

Un teanc de operatori de întrerupere pentru evenimente de incitare incorectă a instrucțiunilor și acces inadmisibil la date.

Pentru fiecare mod de procesor care are nevoie de o stivă, în codul de pornire trebuie să fie inițializat un pointer separat de stack, iar locația segmentului trebuie să fie specificată în fișierul de comandă linker. Fișierele cstartup.s79 și lnkarm.xcl furnizate preconfigurează numai stiva IRQ, dar puteți adăuga cu ușurință alte stive de excepție.

SWITAB. Conține un tabel de vectori vectori de întrerupere.
Segmente de memorie tip: CODE
Alocarea memoriei: acest segment poate fi plasat oriunde în memorie.
Tip de acces: numai pentru citire.

[Gestionarea linkerului folosind fișierul de comandă]

Fișierul de setări pentru linker trebuie modificat când trebuie să configurați harta țintă a memoriei de sistem. Să presupunem că sistemul țintă ar trebui să utilizeze o astfel de carte de memorie:

0x000000-0x00003F ROM sau RAM
0x008000-0x0FFFFF ROM (FLASH) sau altă memorie nevolatilă
0x100000-0x7FFFFF RAM sau altă memorie disponibilă pentru citire și scriere

ROM-ul poate fi folosit pentru stocarea segmentelor de memorie care sunt de tip CONST și CODE. Memoria RAM poate conține segmente de tip DATA. Scopul principal al modificării fișierului de comandă linker este de a verifica dacă codul și datele aplicației dvs. nu depășesc limitele zonelor de memorie (zonele de memorie sunt limitate din punct de vedere tehnologic, în funcție de tipul de procesor) - nereușita va duce la o defecțiune a aplicației.

Printre altele, fișierul de comandă pentru linker conține trei tipuri diferite de parametri ai liniei de comandă XLINK:

• Tipul de CPU utilizat (-carm), specifică tipul de kernel-țintă.
• Definirea constantelor pe care le voi folosi in fisierul de mai jos. Constantele sunt specificate de opțiunea -D.
• Direcții de plasare (aceasta este cea mai mare parte a fișierului de comandă a linkerului). Segmentele pot fi plasate folosind opțiunile -Z și -P. Opțiunea -Z (plasarea secvențială) va plasa piesele segmentului în ordinea în care apar și opțiunea -P (plasarea lotului) va determina linkerul să încerce să reconstruiască partea, astfel încât să fie mai bine să folosiți memoria. Totuși, -P este utilă numai atunci când nu este nevoie să se asigure continuitatea localizării segmentelor. Pentru mai multe informații, consultați Ghidul de Referință IAR Linker și Instrumente de Bibliotecă.

Utilizați comanda -Z pentru plasarea secvențială. Utilizați comanda -Z când trebuie să furnizați întregul segment ca o bucată continuă de memorie când trebuie să păstrați ordinea părților din segment sau, care este folosit mai rar, pentru a plasa segmentele într-o anumită ordine.

Două segmente de diferite tipuri pot fi plasate în aceeași zonă de memorie, dar nu este necesar să specificați domeniul celui de-al doilea segment. În exemplul următor, segmentul MYSEGMENTA va fi plasat primul în memorie. Apoi, restul memoriei va fi folosit de MYCODE.

Două intervale de memorie se pot suprapune reciproc. Acest lucru permite segmentelor cu cerințe diferite de alocare să utilizeze un spațiu de memorie partajat partajat, de exemplu:

Deși nu există recomandări stricte pentru specificarea sfârșitului fiecărui interval de memorie, este recomandat să faceți acest lucru. Când specificați sfârșitul intervalului de memorie, link-ul IAR XLINK vă va avertiza dacă segmentele dvs. nu se încadrează în memorie.

Utilizați comanda -P pentru plasarea lotului. Comanda -P diferă de -Z prin faptul că, atunci când utilizați -P, nu este necesar să plasați secvențe (sau segmente) secvențial. Cu ajutorul lui -P devine posibilă plasarea segmentelor segmentului în "gaurile" lăsate de destinațiile de plasare anterioare ale altor segmente.

Următorul exemplu arată modul în care puteți aplica opțiunea XLINK -P pentru utilizarea mai eficientă a memoriei. Comanda va plasa segmentul de date MYDATA în memoria DATA (adică RAM) în gama de memorie inactivă:

Dacă aplicația dvs. are o zonă RAM suplimentară în intervalul de memorie 0x10F000-0x10F7FF, atunci pur și simplu adăugați la definiția originală:







Trimiteți-le prietenilor: