.text
.text-segmentti sisältää todellisen koodin, ja se on ohjelmoitu mikrokontrollereiden Flash-muistiin. Tekstisegmenttejä voi olla useampi kuin yksi, kun Flash-muistia on useita, ei yhtenäisiä lohkoja; esim. aloitusvektorin ja keskeytysvektorit, jotka sijaitsevat muistin yläosassa, ja koodin, joka alkaa 0: sta; tai erilliset osiot käynnistyshihnalle ja pääohjelmalle.
.bss ja .data
Funktiolle tai menettelylle voidaan jakaa kolmentyyppisiä tietoja; ensimmäinen on alustamaton data (jota kutsutaan historiallisesti .bss: ksi, joka sisältää myös 0 alustettua dataa) ja toinen on alustettu (ei-bss) tai .data. Nimi "bss" tulee historiallisesti nimellä "Symbolin aloittama lohko", jota kokoonpanija käytti noin 60 vuotta sitten. Molemmat alueet sijaitsevat RAM-muistissa.
Ohjelmaa laadittaessa muuttujat varataan yhdelle näistä kahdesta yleisestä alueesta. Linkittämisvaiheen aikana kaikki tietoerät kerätään yhdessä. Kaikilla muuttujilla, jotka on alustettava, on osa ohjelmamuistista, joka on varattu alkuarvojen pitämiseen, ja juuri ennen kuin main () kutsutaan, muuttujat alustetaan, tyypillisesti moduulilla nimeltä crt0. Bss-osa alustetaan kaikille nollille samalla käynnistyskoodilla.
Muutamilla mikro-ohjaimilla on lyhyempiä ohjeita, jotka sallivat pääsyn RAM-muistin ensimmäiselle sivulle (ensimmäiset 256 sijaintia, joskus kutsutaan sivuksi 0). Näiden prosessorien kääntäjä voi varata avainsanan, kuten lähellä
, määrittelemään siellä olevat muuttujat. Vastaavasti on myös mikro-ohjaimia, jotka voivat viitata tiettyihin alueisiin vain osoitinrekisterin kautta (vaatii lisäohjeita), ja tällaiset muuttujat nimetään far
. Lopuksi jotkut prosessorit voivat osoittaa osan muistista bitti kerrallaan, ja kääntäjällä on tapa määrittää se (kuten avainsana bit
).
Joten saattaa olla muita segmenttejä, kuten .nearbss ja .neardata, jne., joihin nämä muuttujat kerätään.
.rodata
Kolmas funktion ulkopuolinen tietotyyppi tai menettely on kuin alustetut muuttujat, paitsi että se on vain luku -ohjelma eikä ohjelma voi muokata sitä. C-kielellä nämä muuttujat merkitään const
-avainsanalla. Ne tallennetaan yleensä osana ohjelman flash-muistia. Joskus ne tunnistetaan osana .rodata (vain luku -tietoja) -segmenttiä. Mikrokontrollereissa, joissa käytetään Harvard-arkkitehtuuria, kääntäjän on käytettävä erityisiä ohjeita näiden muuttujien käyttämiseen.
pino ja kasa
Sekä pino että kasa sijoitetaan RAM. Prosessorin arkkitehtuurista riippuen pino voi kasvaa tai kasvaa. Jos se kasvaa, se sijoitetaan RAM-muistin alaosaan. Jos se kasvaa alas, se sijoitetaan RAM-muistin loppuun. Kasa käyttää jäljellä olevaa RAM-muistia, jota ei ole varattu muuttujille, ja kasvaa pinon vastakkaiseen suuntaan. Pinon ja kasan enimmäiskoko voidaan yleensä määrittää linkkiparametreina.
Pinoon asetetut muuttujat ovat mitä tahansa muuttujia, jotka on määritelty toiminnossa tai menettelyssä ilman avainsanaa static
. Niitä kutsuttiin aikoinaan automaattisiksi muuttujiksi ( auto
keyword), mutta kyseistä avainsanaa ei tarvita. Historiallisesti auto
on olemassa, koska se oli osa C: tä edeltävää B-kieltä, ja siellä sitä tarvittiin. Toimintaparametrit sijoitetaan myös pinoon.
Tässä on tyypillinen RAM-asettelut (olettaen, että ei ole erityistä sivu 0 -osaa):
EEPROM, ROM ja NVRAM
Ennen kuin Flash-muisti tuli, EEPROMia (sähköisesti pyyhittävä ohjelmoitava vain luku -muisti) käytettiin ohjelman ja const-tietojen (.text ja .rodata-segmenttien) tallentamiseen. Nyt käytettävissä on vain pieni määrä (esim. 2 kt - 8 kt tavua) EEPROMia, jos sellaista on ollenkaan, ja sitä käytetään tyypillisesti kokoonpanotietojen tai muiden pienten tietomäärien tallentamiseen, jotka on säilytettävä virrankatkaisun aikana sykli. Näitä ei ilmoiteta muuttujina ohjelmassa, vaan ne kirjoitetaan mikrokontrollerin erityisrekistereihin. EEPROM voidaan myös toteuttaa erillisenä siruna ja käyttää sitä SPI- tai IC-väylän kautta.
ROM on olennaisesti sama kuin Flash, paitsi että se on ohjelmoitu tehtaalla (käyttäjä ei voi ohjelmoida sitä). Sitä käytetään vain erittäin suuren äänenvoimakkuuden omaaville laitteille.
NVRAM (haihtumaton RAM) on vaihtoehto EEPROMille, ja se toteutetaan yleensä ulkoisena IC: nä. Säännöllistä RAM-muistia voidaan pitää haihtumattomana, jos se on varmuuskopioitu paristolla; siinä tapauksessa ei tarvita erityisiä käyttömenetelmiä.
Vaikka tietoja voidaan tallentaa Flashiin, Flash-muistilla on rajallinen määrä pyyhkäisy- / ohjelmakierroksia (1000–10 000), joten sitä ei ole todella suunniteltu siihen. Se vaatii myös muistilohkojen poistamisen kerralla, joten vain muutaman tavun päivittäminen on hankalaa. Se on tarkoitettu koodille ja vain luku -muuttujille.
EEPROMilla on paljon korkeammat poisto- / ohjelmasyklit (100 000 - 1 000 000), joten se on paljon parempi tähän tarkoitukseen. Jos mikro-ohjaimessa on käytettävissä EEPROM ja se on riittävän suuri, sinne haluat tallentaa haihtumattoman datan. Sinun on kuitenkin ensin myös tyhjennettävä lohkoina (yleensä 4 kt) ennen kirjoittamista.
Jos EEPROMia ei ole tai se on liian pieni, tarvitaan ulkoinen siru. 32 kt: n EEPROM on vain 66 ¢ ja se voidaan poistaa / kirjoittaa 1 000 000 kertaa. NVRAM, jolla on sama määrä poisto- / ohjelmatoimintoja, on paljon kalliimpaa (x10) NVRAM-muistia on tyypillisesti nopeampi lukea kuin EEPROM-tiedostoja, mutta hitaammin kirjoitettaessa. Ne voidaan kirjoittaa tavuun kerrallaan tai lohkoina.
Parempi vaihtoehto molemmille on FRAM (ferrosähköinen RAM), jolla on olennaisesti ääretön kirjoitusjakso (100 biljoonaa) eikä kirjoitusviiveitä. . Se on suunnilleen sama hinta kuin NVRAM, noin 5 dollaria 32 kt: lla.