Iar 4

A szoftverminterrupciós vektortáblázatok táblázata.

A szegmensek a memóriában tárolódnak, amikor linker irányelveket használnak a szekvenciális és a kötegelt elhelyezésre tervezett -Z és -P szegmensek allokálására. Egyes szegmensek nem használhatnak kötegelt elhelyezést, mert tartalma folyamatosnak kell lennie. Az egyes leírásokban a szegmens memória típusa - CODE, CONST vagy DATA - jelzi, hogy a szegmenst ROM-ra vagy RAM-ra kell helyezni.

KÓD Futtatható kód esetén.
CONST A ROM-ban tárolt adatok esetében.
ADATOK A RAM-ban tárolt adatokhoz.

A -Z és -P irányelvekről további információt az IAR Linker és a Library Tools Reference Guide című dokumentumban talál. A linker parancsfájlban található szegmensek meghatározásához tekintse meg a "Linker kezelése a parancsfájl segítségével" című részt. A speciális kiterjesztett IAR (kiterjesztett kulcsszavak) szintaxisáról további információt a "Kibővített kulcsszavak" szakaszban talál.

KÓD. Ez a szegmens tartalmazza a programkódot, kivéve a rendszerinicializáló kódot és a funkciókódot, amelyeket az __ramfunc attribútummal definiálnak. Ezt a kódot ROM-ból (általában FLASH) hajtják végre.
Szegment memória típusa: CODE
Memóriaelosztás: ez a szegmens bárhová elhelyezhető a memóriában.
Hozzáférés típusa: csak olvasható.

CODE_I. Ez a szegmens tartalmazza az __ramfunc attribútummal definiált funkciókódot. Ezt a kódot RAM-ból hajtják végre (általában ez a fajta memória növeli a végrehajtás sebességét). A kód átmásolódik a RAM-ba a CODE_ID szegmensből az inicializálási folyamat során.
Szegment memória típusa: CODE
Memóriaelosztás: Ez a szegmens bárhol elhelyezhető a memóriában.
Hozzáférés típusa: olvasás és írás.

CODE_ID. Ebben a szegmensben van egy kódbolt, amelyet az __ramfunc attribútum határoz meg. Ezt a kódot a RAM-ból a CODE_I szegmensbe másolás után kell végrehajtani.
Szegment memória típusa: CODE
Memóriaelosztás: ez a szegmens bárhová elhelyezhető a memóriában.
Hozzáférés típusa: csak olvasható.

CSTACK. A verem belső adatait tartalmazza.
Szegmens memória típusa: DATA
Memóriaelosztás: ez a szegmens bárhová elhelyezhető a memóriában.
Hozzáférés típusa: olvasás és írás.

Alapértelmezés szerint a linker konfigurációs fájl elején egy állandó van beállítva, amely meghatározza a köteg méretét:

Ezután a linker konfigurációs fájlban a tényleges szegmenseket a veremhez rendelt memóriaterületnek megfelelően definiáljuk:

DATA_AC. Az inicializált konstansok adatait tartalmazza.

DATA_AN. Az __no_init attribútummal definiált adatokat tartalmaz. Mindaz, amit a DATA_AC szegmens leírásában található adatokra vonatkozóan mondtak, a DATA_AN szegmensre vonatkozik.

DATA_C. Konstansok adatait tartalmazza (a kulcsszavakkal definiált objektumok).
Szegmentum memória típusa: CONST
Memóriaelosztás: ez a szegmens bárhová elhelyezhető a memóriában.
Hozzáférés típusa: csak olvasható.

DATA_I. Tartalmaz statikus és globális inicializálható változókat, amelyeket az alkalmazás indításakor (indításkor) a DATA_ID szegmensből történő másolással iniciálnak. Ez a szegmens nem helyezhető el a memóriában a -P csomag allokációs irányelvvel, mivel a szegmens tartalma folyamatosnak kell lennie. Ehelyett használja a -Z direktívát, amikor megadja ezt a szegmenst a linker parancs konfigurációs fájljában.
Szegmens memória típusa: DATA
Memóriaelosztás: ez a szegmens bárhová elhelyezhető a memóriában.
Hozzáférés típusa: olvasás és írás.

DATA_ID. A DATA_I szegmens statikus és globális változóinak értéktartománya. Ezek az értékek az alkalmazás indításakor (indítás) a DATA_ID-ről DATA_I-re kerülnek. Ez a szegmens nem helyezhető el a memóriában a -P csomag allokációs irányelvvel, mivel a szegmens tartalma folyamatosnak kell lennie. Ehelyett használja a -Z direktívát, amikor megadja ezt a szegmenst a linker parancs konfigurációs fájljában.
Szegmentum memória típusa: CONST
Memóriaelosztás: ez a szegmens bárhová elhelyezhető a memóriában.
Hozzáférés típusa: csak olvasható.

DATA_N. Statikus és globális változókat tartalmaz, amelyeket a __no_init attribútummal definiálnak.
Szegmens memória típusa: DATA
Memóriaelosztás: ez a szegmens bárhová elhelyezhető a memóriában.
Hozzáférés típusa: olvasás és írás.

DATA_Z. Statikus és globális változókat tartalmaz, amelyek nullával vannak inicializálva. Ez a szegmens nem helyezhető el a memóriában a -P csomag allokációs irányelvvel, mivel a szegmens tartalma folyamatosnak kell lennie. Ehelyett használja a -Z direktívát, amikor megadja ezt a szegmenst a linker parancs konfigurációs fájljában.
Szegmens memória típusa: DATA
Memóriaelosztás: ez a szegmens bárhová elhelyezhető a memóriában.
Hozzáférés típusa: olvasás és írás.

DIFUNCT. A C ++ által használt dinamikus inicializáló vektort tartalmazza.
Szegment memória típusa: CODE
Memóriaelosztás: ez a szegmens bárhová elhelyezhető a memóriában.
Hozzáférés típusa: csak olvasható.

Kupac. Dinamikusan allokált adatokhoz használt kupacot tartalmaz, más szóval a malloc és az ingyenes hívások, valamint a C ++, az új és a törölni kívánt adatok számára.
Szegmens memória típusa: DATA
Memóriaelosztás: ez a szegmens bárhová elhelyezhető a memóriában.
Hozzáférés típusa: olvasás és írás.

A heap szegmens csak akkor használható az alkalmazásban, ha a memória dinamikus elosztását ténylegesen használják. A heap méretét és a memóriában való elosztását a linker parancsok fájlja határozza meg - pontosan ugyanúgy, mint a köteg szegmens definíciójában. például:

ICODE. Speciális indítási kódot tartalmaz; ezeknek a funkcióknak az INTVEC szegmens ági utasításainak elérhetőségén belül kell lenniük.
Szegment memória típusa: CODE
Memóriaelosztás: ez a szegmens az alsó 32 MB-os memóriaterületen bárhová elhelyezhető, hogy az INBECE-szegmensből származó összeszerelési ág utasítások átvihetik az irányítást az ICODE-ba.
Hozzáférés típusa: csak olvasható.

IRQ_STACK. Tartalmazza az IRQ kivételek kezelésekor használt köteget. Ha más FOQ, SVC, ABT és UND kivételekre is szükség van, akkor más kötegeket is hozzáadhat. A cstartup.s79 indítófájlt módosítani kell a használt kivételkészlet-mutatók inicializálására.
Szegmens memória típusa: DATA
Memóriaelosztás: ez a szegmens bárhová elhelyezhető a memóriában.
Hozzáférés típusa: olvasás és írás.

Az ARM architektúra 5 kivételes módot támogat, amelyek magukban foglalják a processzorokat a különböző kivételes eseményekhez. Mindegyik kivételezési módnak saját verem van, annak érdekében, hogy elkerülje a felhasználói / rendszertároló verem eltorzulását. A táblázat a különböző kivételkészletek javasolt nevét mutatja, de bármilyen más nevet is fel lehet használni.

Ajánlott köteg szegmens neve

Egy zsetonmegszakító kezelő a hibás utasítások letöltéséhez és az adatokhoz való nem megengedhető hozzáféréshez.

Minden egyes processzor üzemmódra, amelyhez egy köteg szükséges, egy külön stack pointeret kell inicializálnia az indítási kódban, és a szegmens helyét meg kell adni a linker parancsfájlban. A mellékelt cstartup.s79 és lnkarm.xcl fájlok csak az IRQ veremét konfigurálják, de könnyen hozzáadhat más kivételeket.

SWITAB. A megszakítási vektorvektorok táblázata.
Szegment memória típusa: CODE
Memóriaelosztás: ez a szegmens bárhová elhelyezhető a memóriában.
Hozzáférés típusa: csak olvasható.

[A linker kezelése a parancsfájllal]

A linker beállítási fájlt módosítani kell, ha meg kell adni a célrendszer memória térképét. Tegyük fel, hogy a célrendszernek ilyen memóriakártyát kell használnia:

0x000000-0x00003F ROM vagy RAM
0x008000-0x0FFFFF ROM (FLASH) vagy más nem felejtő memória
0x100000-0x7FFFFF RAM vagy más memória olvasásra és írásra

ROM memóriakártya tárolására használható, amely a CONST és a CODE típusú. A RAM memória tartalmazhat DATA típusú szegmenseket. A linker parancsfájl módosításának fő célja annak ellenőrzése, hogy az alkalmazás kódja és adata nem lép-e át a memóriaterületek határain (a memóriaterületek technológiai szempontból korlátozottak a processzor típusától függően) - ennek elmulasztása az alkalmazás meghibásodásához vezethet.

A linker parancsfájl többek között három különböző típusú XLINK parancssori paramétert tartalmaz:

• A használt CPU típusa (-carm), meghatározza a célkernel típusát.
• A konstansok meghatározása, amelyeket az alábbi fájlban fogok használni. A konstansokat a -D opció határozza meg.
• Elhelyezési irányelvek (ez a linker parancsfájl legnagyobb része). A szegmensek elhelyezhetők a -Z és a -P opciók használatával. A -Z opció (szekvenciális elhelyezés) a szegmensrészeket sorrendbe helyezi, és a -P opció (batch elhelyezés) miatt a linker megpróbálja újból felépíteni a részét, hogy jobb legyen a memória használata. Azonban a -P csak akkor hasznos, ha nem szükséges biztosítani a szegmensek helyének folytonosságát. További információt az IAR Linker és a Library Tools Reference Guide című dokumentumban talál.

A szekvenciális elhelyezéshez használja a -Z parancsot. Használja a -Z parancsot, amikor az egész szegmenst folyamatos memóriaképként kell megadnia, amikor meg kell őriznie a szegmensben a részek sorrendjét, vagy ha ritkábban használják, a szegmenseket egy bizonyos sorrendbe helyezze.

Két különböző típusú szegmens helyezhető el ugyanazon a memóriaterületen, de nem kell megadnia a második szegmens tartományát. A következő példában a MYSEGMENTA szegmens kerül először a memóriába. Ezután a memória többi részét a MYCODE fogja használni.

Két memória tartomány átfedi egymást. Ez lehetővé teszi a megosztott megosztott tárterületek használatához szükséges különféle követelményeknek megfelelő szegmenseket, például:

Bár nincs szigorú ajánlás az egyes memóriatartományok végeinek meghatározásához, még mindig ajánlott ezt megtenni. Amikor megadja a memória tartomány végét, az IAR XLINK Linker figyelmezteti Önt, ha a szegmenseid nem illeszkednek a memóriába.

Használja a -P parancsot a kötegelt elhelyezéshez. A -P parancs különbözik attól a -Z-ből, hogy a -P használatakor nem kell szegmenseket (vagy szegmenseket) sorba rendezni. A -P használatával lehetõség nyílik arra, hogy a szegmens szegmenseit a többi szegmens korábbi elhelyezésébõl elhagyott "lyukakba" helyezzük.

Az alábbi példa azt mutatja meg, hogyan alkalmazhatja az XLINK-P opciót a memória hatékonyabb felhasználására. A parancs a DATA memóriában (azaz RAM-ban) tárolja a MYDATA adat szegmenst a dummy memória tartományban:

Ha alkalmazásában van egy további RAM terület a 0x10F000-0x10F7FF memória tartományban, akkor egyszerűen add hozzá az eredeti definícióhoz: