Pamäť a programovanie

Čo je to pamäť?

Pamäťové bloky sú nevyhnutnou súčasťou moderných vstavaných systémov, najmä tých na báze mikrokontrolérov. Pamäťové bloky sú polovodičové zariadenia, ktoré ukladajú a získavajú informácie alebo údaje; mikrokontrolérová centrálna procesorová jednotka (CPU) využíva a spracováva dáta uložené v pamäťových blokoch na vykonávanie špecifických úloh.

Pamäťové bloky v mikrokontroléroch sú zvyčajne opísané ako polia. Pamäťové polia sú rozdelené do buniek, ktoré môžu uchovávať údaje a pristupovať k nim pomocou jedinečného identifikátora reprezentujúceho ich adresu alebo polohu vzhľadom na pamäťové pole.

Informácie v pamäťových bunkách sú uložené pomocou binárnych číslic (bitov), ​​zvyčajne organizovaných v bajtoch (8 bitov).

V prvých dňoch výpočtovej techniky sa objavili dve počítačové architektúry, t. j. organizácia komponentov vo vnútri výpočtového systému: von Neumannová a Harvardská.

Architektúra von Neumanna, pomenovaná po matematikovi, fyzikovi a počítačovom vedcovi Johnovi von Neumannovi, bola prvýkrát predstavená v polovici 40. rokov. Známa je aj ako Princetonská architektúra. Táto architektúra ukladá programové dáta a inštrukcie do rovnakej pamäťovej jednotky.Von Neumannova architektúra je základná, pretože takmer všetky návrhy digitálnych počítačov boli založené na tejto architektúre.

Harvardská architektúra, pomenovaná podľa reléového počítača Harvard Mark I, bola prvýkrát predstavená v polovici 40. rokov. Hlavnou charakteristikou tejto architektúry je, že používa dve samostatné pamäťové jednotky, jednu na ukladanie programových inštrukcií a jednu na ukladanie programových dát. K obom pamäťovým jednotkám v architektúre Harvard pristupuje CPU pomocou rôznych komunikačných zberníc.

Moderné výpočtové systémy využívajú modely hybridnej architektúry, ktoré maximalizujú výkon pomocou toho najlepšieho z oboch, von Neumannovho a Harvardského modelu. Mikrokontroléry sa zvyčajne používajú vo vstavaných aplikáciách. Musia vykonávať definované úlohy spoľahlivo a efektívne, s nízkymi alebo obmedzenými zdrojmi; to je dôvod, prečo sa model Harvardskej architektúry používa hlavne v mikrokontroléroch: mikrokontroléry majú malú programovú a dátovú pamäť, ku ktorej je potrebné pristupovať súčasne. Harvardská architektúra sa však v mikrokontroléroch vždy nepoužíva; niektoré rodiny mikrokontrolérov používajú hybridné modely alebo modely architektúry Von Neumann.

Dosky Arduino sú založené hlavne na dvoch rodinách mikrokontrolérov: AVR a ARM. Zatiaľ čo mikrokontroléry rodiny AVR sú založené na modeli architektúry Harvard, mikrokontroléry rodiny ARM môžu byť založené na modeloch architektúry von Neumana alebo Harvardu.

Nasledujúca tabuľka sumarizuje architektúry mikrokontrolérov dosiek Arduino:

DoskaMikrokontrolérRodinaArchitektúra
Mega 2560 Rev3ATmega2560AVRHarvard
UNO MiniATmega328PAVRHarvard
UNO Rev3ATmega328PAVRHarvard
UNO WiFi Rev2ATmega4809AVRHarvard
UNO Rev3 SMDATmega328PAVRHarvard
LeonardoATmega32u4AVRHarvard
MicroATmega32u4AVRHarvard
ZeroATSAMD21G18Arm Cortex-M0+Von Neumann
Portenta H7STM32H747Arm Cortex-M4/M7Harvard
Nicla Sense MEnRF52832Arm Cortex-M4Harvard
Nano RP2040 RP2040Arm Cortex-M0+Von Neumann
MKR FOX 1200ATSAMD21G18Arm Cortex-M0+Von Neumann
MKR NB 1500ATSAMD21G18Arm Cortex-M0+Von Neumann
MKR Vidor 4000ATSAMD21G18Arm Cortex-M0+Von Neumann
MKR WiFi 1010ATSAMD21G18Arm Cortex-M0+Von Neumann
MKR ZeroATSAMD21G18Arm Cortex-M0+Von Neumann
MKR1000 WIFIATSAMW25H18Arm Cortex-M0+Von Neumann
MKR WAN 1300ATSAMD21G18Arm Cortex-M0+Von Neumann
MKR WAN 1310ATSAMD21G18Arm Cortex-M0+Von Neumann
NanoATmega328PAVRHarvard
Nano EveryATmega4809AVRHarvard
Nano 33 IoTATSAMD21G18Arm Cortex-M0+Von Neumann
Nano 33 BLEnRF52840Arm Cortex-M4Harvard
Nano 33 BLE SensenRF52840Arm Cortex-M4Harvard

Pamäťové jednotky vo vnútri mikrokontroléra možno rozdeliť do dvoch hlavných typov:

RAM a ROM.

RAM v systémoch založených na mikrokontroléroch je volatilná pamäť používaná na ukladanie dočasných údajov, ako sú premenné firmvéru systému.

ROM v systémoch založených na mikrokontroléroch je energeticky nezávislá pamäť používaná na ukladanie trvalých údajov, ako je firmvér systému.

RAM a ROM v systémoch založených na mikrokontroléroch sú usporiadané do troch hlavných kategórií:

  • Flash
  • RAM
  • EEPROM

Flash pamäť je miesto, kde je uložený firmvér systému, ktorý sa má spustiť. Keď napr. zostavíme skicu, vytvoríme binárny súbor, ktorý sa uloží do flash pamäte dosky Arduino. Náčrt sa potom vykoná, keď je doska zapnutá.

RAM v systémoch založených na mikrokontroléroch je miesto, kde sú uložené dočasné údaje systému alebo údaje za chodu; napríklad premenné vytvorené funkciami programu. RAM v mikrokontroléroch je zvyčajne SRAM; ide o typ pamäte RAM, ktorá používa klopný obvod na uloženie jedného bitu údajov. Existuje aj ďalší typ pamäte RAM, ktorý možno nájsť v mikrokontroléroch: napr. DRAM.

V systémoch založených na mikrokontroléroch je súčasťou ich pamäte ROM aj vymazateľná programovateľná pamäť len na čítanie alebo EEPROM; Flash pamäť je vlastne typ EEPROM. Hlavným rozdielom medzi pamäťou Flash a EEPROM je spôsob ich správy; EEPROM je možné spravovať na úrovni bajtov (zápis alebo vymazanie), zatiaľ čo Flash možno spravovať na úrovni bloku.

Ako už bolo uvedené, dosky Arduino sú založené hlavne na dvoch rodinách mikrokontrolérov, AVR a ARM; je dôležité vedieť, že alokácia pamäte sa v oboch architektúrach líši.

Nasledujúca tabuľka sumarizuje pridelenie pamäte konkrétnej dosky Arduino:

DoskaFlashSRAMEEPROM
Mega 2560 Rev3256kB8kB4kB
UNO Mini32kB2kB1kB
UNO Rev332kB2kB1kB
UNO WiFi Rev248kB6kB256B
UNO Rev3 SMD32kB2kB1kB
Leonardo32kB2.5kB1kB
Micro32kB2.5kB1kB
Zero256kB32kB
Portenta H7 (zákl. konfigurácia)16MB8MB
Nicla Sense ME512kB64kB
Nano RP2040 264kB
MKR FOX 1200256kB32kB
MKR NB 1500256kB32kB
MKR Vidor 4000256kB32kB
MKR WiFi 1010256kB32kB
MKR Zero256kB32kB
MKR1000 WIFI256kB32kB
MKR WAN 1300256kB32kB
MKR WAN 1310256kB32kB
Nano32kB2kB1kB
Nano Every48kB6kB256B
Nano 33 IoT256kB32kB
Nano 33 BLE1MB256kB
Nano 33 BLE Sense1MB256kB

Zaťaženie pamäte je jedna štatistika, ktorá vám poskytne prehľad o tom, ako efektívne je kód navrhnutý. Je to kľúčový prvok na zváženie vývoja, pretože zdroje sú v systéme založenom na mikrokontroléri obmedzené; softvér by mal vždy fungovať bez dosiahnutia maximálnej kapacity zaťaženia, aby sa predišlo problémom.

Flash pamäť na doskách Arduino je možné merať pomocou Arduino IDE. Ako už bolo uvedené, v pamäti Flash je uložený aplikačný kód; Arduino IDE hlási využitie pamäte Flash prostredníctvom výstupnej konzoly kompilátora, aby vývojári vedeli, koľko zdrojov pamäte Flash sa používa.

Niekedy existujú situácie, keď aj keď je kód skompilovaný a úspešne nahraný IDE do dosky, trpí náhlymi zastaveniami. Tieto problémy sú pravdepodobne spôsobené preťažením pamäťových prostriedkov alebo nedostatočnou pamäťou na pridelenie. Na vyriešenie tohto problému je potrebné pochopiť, v ktorom sektore kódu presahuje dopyt po pamäti dostupné zdroje. Na meranie možno použiť nasledujúci príklad kódu:

Nasledujúci príklad kódu možno použiť na meranie využitia SRAM v doskách Arduino založených na ARM:

Správu pamäte EEPROM je možné vykonať jednoducho pomocou natívnych knižníc už nainštalovaných v Arduino IDE. Knižnica EEPROM môže byť použitá na čítanie, zápis a mazanie pamäte EEPROM. Nasledujúci kód ukazuje, ako možno bajt informácií uložiť do pamäte EEPROM a potom čítať pomocou funkcií zápisu a čítania:

Je tiež možné vymazať celú pamäť EEPROM jej nastavením na 0, ako je znázornené v kóde nižšie:

Vedieť, ako kód využíva pamäťové prostriedky systému, je len prvou odporúčanou úlohou v procese vývoja; úplne inou úlohou je optimalizácia využitia pamäte. Proces optimalizácie využitia pamäte tiež znamená zníženie výpočtovej zložitosti, skrátenie času navyše potrebného na spracovanie úloh pri použití menšieho množstva pamäťových zdrojov na vykonanie rovnakých úloh.

Flash pamäť je miesto, kde sa kapacita používaná kompilovaným kódom môže výrazne znížiť zvážením niektorých detailov.

Odpojte nepoužívané zdroje

Zvyšky kódu môžu byť zložené z už nepoužívaných funkcií a plávajúcich premenných, ktoré zaberajú zbytočné miesto v pamäti. To výrazne zlepší veľkosť kompilovaného kódu a sprehľadní proces kompilácie.

Modulárne úlohy

Modulárne úlohy znamenajú funkcie, ktoré zabaľujú kód, ktorý sa bude používať opakovane alebo nepretržite prijímaním rôznych parametrov. Je to skvelý spôsob, ako zachovať čistú štruktúru kódu a výkon a zároveň znížiť pamäťový priestor potrebný na dodatočné úlohy, ktoré možno bude potrebné implementovať.

Pamäť SRAM je pravdepodobne najdôležitejšou pamäťovou jednotkou v systéme založenom na mikrokontroléri; optimalizácia využitia SRAM je nevyhnutná pre navrhovanie spoľahlivých systémov na báze mikrokontrolérov. Nedostatok pamäte SRAM je zvyčajne najbežnejším problémom s pamäťou.

Serial.print() alebo Serial.println() tieto inštrukcie využívajú priestor SRAM, čo môže byť pohodlné, ale nie žiaduce. Ideálny spôsob použitia inštrukcii je s použitím F()

príklad:

Presuniete tak reťazce iba do pamäte Flash namiesto použitia priestoru SRAM.

Flash pamäť je oveľa priestrannejšia ako SRAM, takže je lepšie použiť pamäť Flash ako SRAM.

PROGMEM, čo je skratka pre Program Memory, je možné použiť na ukladanie premenných dát do priestoru Flash pamäte, rovnako ako ( F() wrapper ) opísaný vyššie, ale použitie PROGMEM predstavuje jednu nevýhodu: rýchlosť čítania dát. Používanie pamäte RAM poskytne oveľa vyššiu rýchlosť čítania údajov, ale PROGMEM, keďže používa pamäť Flash, bude pri rovnakej veľkosti údajov pomalší ako RAM. Preto je nevyhnutné navrhnúť kód s vedomím, ktoré premenné sú kľúčové a ktoré nie alebo majú nižšiu prioritu.

Použitie PROGMEM na doske Arduino založenej na AVR

príklad kódu:

TypDĺžka bajtuRozsah
boolean1logika (pravda – nepravda)
char1-128 to 127
unsigned char10 to 255
byte10 to 255
int2-32,768 do 32,767
unsigned int20 do 65,535
word20 do 65,535
long4-2,147,483,648 do 2,147,483,647
unsigned long40 do 4,294,967,295
float4-3.4028235E+38 do 3.4028235E+38
double4-3.4028235E+38 do 3.4028235E+38

Optimalizácia pamäte EEPROM sa zvyčajne nevyžaduje; dáta, ktoré má využiť priestor EEPROM, nepotrebujú ako zdroj ukladania Flash pamäť.

Pri EEPROM je dôležité vedieť, že operácia zápisu je obmedzená. Operácia čítania je pre EEPROM neobmedzená; operácia zápisu je však konečná a zvyčajne obmedzená na 100 000 cyklov. Preto je nevyhnutné uložiť len nevyhnutné parametre, aby snímače alebo moduly mohli pracovať s primárne nemennými údajmi.

Keďže EEPROM je obmedzená cyklom operácie zápisu, platí to aj pre pamäť Flash. Oba sú vystavené strate uchovávania údajov po výrobcom definovanom životnom cykle. EEPROM je založená na pamäti typu NOR, zatiaľ čo pamäť Flash je typu NAND, vďaka čomu je EEPROM drahšia ako pamäť Flash. EEPROM funguje tak, že pristupuje k údajom po bajtoch, zatiaľ čo pamäť Flash pristupuje blok po bloku.


Pridaj komentár

Vaša e-mailová adresa nebude zverejnená. Vyžadované polia sú označené *

Nemôžete kopírovať obsah tejto stránky