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).
Pamäťové architektúry 101
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
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
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é architektúry: Hybridy
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.
Architektúra dosiek Arduino
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:
Doska | Mikrokontrolér | Rodina | Architektúra |
---|---|---|---|
Mega 2560 Rev3 | ATmega2560 | AVR | Harvard |
UNO Mini | ATmega328P | AVR | Harvard |
UNO Rev3 | ATmega328P | AVR | Harvard |
UNO WiFi Rev2 | ATmega4809 | AVR | Harvard |
UNO Rev3 SMD | ATmega328P | AVR | Harvard |
Leonardo | ATmega32u4 | AVR | Harvard |
Micro | ATmega32u4 | AVR | Harvard |
Zero | ATSAMD21G18 | Arm Cortex-M0+ | Von Neumann |
Portenta H7 | STM32H747 | Arm Cortex-M4/M7 | Harvard |
Nicla Sense ME | nRF52832 | Arm Cortex-M4 | Harvard |
Nano RP2040 | RP2040 | Arm Cortex-M0+ | Von Neumann |
MKR FOX 1200 | ATSAMD21G18 | Arm Cortex-M0+ | Von Neumann |
MKR NB 1500 | ATSAMD21G18 | Arm Cortex-M0+ | Von Neumann |
MKR Vidor 4000 | ATSAMD21G18 | Arm Cortex-M0+ | Von Neumann |
MKR WiFi 1010 | ATSAMD21G18 | Arm Cortex-M0+ | Von Neumann |
MKR Zero | ATSAMD21G18 | Arm Cortex-M0+ | Von Neumann |
MKR1000 WIFI | ATSAMW25H18 | Arm Cortex-M0+ | Von Neumann |
MKR WAN 1300 | ATSAMD21G18 | Arm Cortex-M0+ | Von Neumann |
MKR WAN 1310 | ATSAMD21G18 | Arm Cortex-M0+ | Von Neumann |
Nano | ATmega328P | AVR | Harvard |
Nano Every | ATmega4809 | AVR | Harvard |
Nano 33 IoT | ATSAMD21G18 | Arm Cortex-M0+ | Von Neumann |
Nano 33 BLE | nRF52840 | Arm Cortex-M4 | Harvard |
Nano 33 BLE Sense | nRF52840 | Arm Cortex-M4 | Harvard |
Typy pamäte:
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
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
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.
EEPROM
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:
Doska | Flash | SRAM | EEPROM |
---|---|---|---|
Mega 2560 Rev3 | 256kB | 8kB | 4kB |
UNO Mini | 32kB | 2kB | 1kB |
UNO Rev3 | 32kB | 2kB | 1kB |
UNO WiFi Rev2 | 48kB | 6kB | 256B |
UNO Rev3 SMD | 32kB | 2kB | 1kB |
Leonardo | 32kB | 2.5kB | 1kB |
Micro | 32kB | 2.5kB | 1kB |
Zero | 256kB | 32kB | – |
Portenta H7 (zákl. konfigurácia) | 16MB | 8MB | – |
Nicla Sense ME | 512kB | 64kB | – |
Nano RP2040 | – | 264kB | – |
MKR FOX 1200 | 256kB | 32kB | – |
MKR NB 1500 | 256kB | 32kB | – |
MKR Vidor 4000 | 256kB | 32kB | – |
MKR WiFi 1010 | 256kB | 32kB | – |
MKR Zero | 256kB | 32kB | – |
MKR1000 WIFI | 256kB | 32kB | – |
MKR WAN 1300 | 256kB | 32kB | – |
MKR WAN 1310 | 256kB | 32kB | – |
Nano | 32kB | 2kB | 1kB |
Nano Every | 48kB | 6kB | 256B |
Nano 33 IoT | 256kB | 32kB | – |
Nano 33 BLE | 1MB | 256kB | – |
Nano 33 BLE Sense | 1MB | 256kB | – |
Meranie využitia pamäte v Arduino doskách
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.
Meranie pamäte Flash
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.
Meranie pamäte SRAM
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:
void display_freeram() {
Serial.print(F("- SRAM left: "));
Serial.println(freeRam());
}
int freeRam() {
extern int __heap_start,*__brkval;
int v;
return (int)&v - (__brkval == 0
? (int)&__heap_start : (int) __brkval);
}
Nasledujúci príklad kódu možno použiť na meranie využitia SRAM v doskách Arduino založených na ARM:
extern "C" char* sbrk(int incr);
void display_freeram(){
Serial.print(F("- SRAM left: "));
Serial.println(freeRam());
}
int freeRam() {
char top;
return &top - reinterpret_cast<char*>(sbrk(0));
}
Meranie pamäte EEPROM
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:
#include <EEPROM.h>
void setup() {
}
void loop {
//Zápis údajov na špecifickú adresu pamäte EEPROM
EEPROM.write(address, value);
//Čítanie údajov špecifickej adresy pamäte EEPROM
EEPROM.read(address);
}
Je tiež možné vymazať celú pamäť EEPROM jej nastavením na 0, ako je znázornené v kóde nižšie:
#include <EEPROM.h>
void setup() {
}
void loop {
for (int i = 0 ; i < EEPROM.length() ; i++) {
// Vymazať pamäť EEPROM
EEPROM.write(i, 0);
}
Optimalizácia využitia pamäte v systémoch založených na Arduino
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.
Optimalizácia pamäte Flash
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ť.
Optimalizácia pamäte SRAM
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:
Serial.println(F("Something"));
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
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:
#include <avr/pgmspace.h>
//Základná štruktúra PROGMEM
const PROGMEM DataType Variable_Name[] = {var0, var1, var2 ...};
// Uloženie unsigned, 16-bit, integer
const PROGMEM uint16_t NumSet[] = {0, 1, 1, 2, 3, 5, 8 ...};
// Uloženie a char in PROGMEM
const char greetMessage[] PROGMEM = {"Niečo"};
Implementácia adekvátneho dátového typu
Typ | Dĺžka bajtu | Rozsah |
---|---|---|
boolean | 1 | logika (pravda – nepravda) |
char | 1 | -128 to 127 |
unsigned char | 1 | 0 to 255 |
byte | 1 | 0 to 255 |
int | 2 | -32,768 do 32,767 |
unsigned int | 2 | 0 do 65,535 |
word | 2 | 0 do 65,535 |
long | 4 | -2,147,483,648 do 2,147,483,647 |
unsigned long | 4 | 0 do 4,294,967,295 |
float | 4 | -3.4028235E+38 do 3.4028235E+38 |
double | 4 | -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