OK

Při poskytování služeb nám pomáhají soubory cookie. Používáním našich služeb vyjadřujete souhlas s naším používáním souborů cookie. Více informací

Úvodní stránka » Arduino » Arduino v příkladech - III.díl - Jak pracovat s pamětí poprvé

Arduino v příkladech - III.díl - Jak pracovat s pamětí poprvé

Každý čip, v našem případě arduino má několik druhů pamětí. Každá z nich má specifický účel a každé arduino má každou paměť jinak velikou. Jak velikou a kolik které jste využili o tom Vás informuje Arduino IDE ve kterém píšete program. Výjimkou je paměť EEPROM, kterou nemají všechny čipy a její využití si řídíte sami. Souhrnné informace velikostech a typech pamětí jednotlivých Arduino najdete na www.arduino.cc/en/Products/Compare

S tomto seriálu se podíváme na jednotlivé typy pamětí a v následujících dílech jak s nimi pracovat a optimalizovat jejich využití.

Dokud budete blikat diodou a psát jednoduché programy, další informace celkem k ničemu nejsou, ale až budete psát rozsáhlejší projekt, bez dovedností zde uvedených se neobejdete.

Pojďme si popsat jednotlivé typy:

  • FLASH: je část paměti, kde je zavaděč a kam se nahrává program. Uložené údaje zde zůstávají i po vypnutí proudu. Představte si to jako BIOS v počítači.
  • SRAM: je část paměti, kam se ukládají proměnné a kam si Arduino odkládá výpočty při svém běhu. Při přerušení napájení se data vymažou. Představte si to jako RAM v počítači.
  • EEPROM: je část paměti, kam si můžeme odkládat data při běhu programu a znovu je využívat. Oproti SRAM se data po přerušení napájení nevymažou, má však mnoho nevýhod, na které je potřeba myslet. Představte si to jako pevný disk s velmi omezeným počtem zápisů.

Paměť FLASH a EEPROM je vyrobena stejnou technologií, liší se pouze velikostí a využitou šířkou pásma (vysvětlení tohoto pojmu vynecháme, pro naši praxi to k ničemu není). Hlavní společná vlastnost je omezený počet zápisů, který je výrobcem udáván na hodnotě min. 100.000 zápisů. U paměti FLASH provést tolik zápisů, to se roky nadřete, ale u paměti EEPROM je zapotřebí si na to dát pozor. Špatně postavený program a teoreticky je do 5 minut je hotovo. Jak moc se teorie liší od praxe uvidíte dále.

Paměť SRAM se od FLASH a EEPROM liší především v tom, že počet zápisů není nijak omezen a je velmi rychlá. Nicméně jak jsme si řekli, po přerušení napájení se všechna data vymažou.

Chcete-li změřit kolik zápisů do EEPROM vydrží Vaše Arduino, nahrajte níže uvedený program. Zapisovat budeme pouze do jedné poslední buňky paměti EEPROM, aby jsme pak Arduino nemuseli vyhazovat a každých 1.000 zápisů si zobrazíme na LCD. Jakmile se zapsaná hodnota bude lišit od čtené, to nastane první chyba, program zastavíme a zobrazíme si konečný počet zápisů. Zapojte si na Arduino LCD tak jako v minulých dílech nahrajte program a vydržte. A to opravdu velmi dlouho. Počítejte s tím, že pak ta buňka nebude použitelná.

Tak hloupý nápad jsem ještě neviděl. Je to na Vás.

//------------------------------------------------------------------
// inicializace zakladnich knihoven
#include <Wire.h>               // knihovna pro komunikaci I2C
#include <LiquidCrystal_I2C.h>  // knihovna pro komunikaci s diplejem
#include <EEPROM.h> // knihovna pro zapis do pameti eeprom
//------------------------------------------------------------------
// promenne
const unsigned long maxPocetZapisu = 1000000; // maximalni pocet zapisu
unsigned long aktualPocetZapisu = 0; // aktualni pocet zapisu
unsigned long zapisovanaBunka; // bunka do ktere budeme zapisovat
byte hodnota = 0; // zapisovana hodnota
int pocitadlo = 1; // pocitadlo pro zobrazeni na LCD
const int maxPocitadlo = 1000; // maximalni hodnota pocitadla
//------------------------------------------------------------------
//nastaveni nazvu, adresy a typu displeje
LiquidCrystal_I2C LCD(0x27, 16, 2); // nazev, adresa, pocet znaku na radku, pocet radku
//------------------------------------------------------------------
// inicializace programu
void setup() {
  LCD.init(); // inicializujeme displej
  LCD.backlight(); // rozsvitime pozadi
  LCD.setCursor (0, 0); // nastavime pozici kurzoru na 1 misto 1 radku
  LCD.print("Pocet:"); // na displeji zobrazime text
  zapisovanaBunka = EEPROM.length() - 1; // nastavime zapisovanou bunku na poslední bunku pameti EEPROM
  zapisovanaBunka = 1021;
  EEPROM.write(zapisovanaBunka, hodnota); //zapiseme vychozi hodnotu EEPROM
  // a jdeme zapisovat
  while (hodnota == EEPROM.read(zapisovanaBunka)) { // dáme nekonečnou smycku
    if (hodnota == 255) hodnota = 0; // osetrime preteni a nastavime novou hodnotu pro zapis
    else hodnota++; // jinak zvysime hodnotu o 1
    EEPROM.write(zapisovanaBunka, hodnota); // zapiseme novou hodnotu
    aktualPocetZapisu++; // nastavime aktualni cislo zapisu
    delay(1);
    if (pocitadlo == maxPocitadlo) {
      pocitadlo = 1; // osetrime preteni a nastavime novou hodnotu pro pocitadlo
      LCD.setCursor (6, 0); // nastavime pozici kurzoru na 7 misto 1 radku
      LCD.print("          "); // vymazeme displej
      LCD.setCursor (6, 0); // nastavime pozici kurzoru na 7 misto 1 radku
      LCD.print(aktualPocetZapisu); // zobrazime aktualni podec zapisu
    }
    else pocitadlo++; // jinak zvysime pocitadlo o 1
  }
       LCD.clear();
      LCD.print("Zapisu:" + (String)aktualPocetZapisu); // zobrazime konecny pocet zapisu
}
//------------------------------------------------------------------
// hlavni smycka programu
void loop() {
}

Počítadlo mého Arduina UNO skončilo na 12.421.920 zápisech. To přišla první chyba. Evidentně vadný kus. Kolik vydrží to vaše?

Podrobný popis jednotlivých typů pamětí

FLASH a zavaděč. Když pořídíte nové Arduino, zavaděč je nahraný z výroby a nemusíte se tím nijak zabývat. Pokud koupíte samostatný čip, je zapotřebí zavaděč nahrát. Jak, to si můžeme někdy ukázat.

FLASH a program. Sem se nahrává ta část kterou napíšete. Převaděč zajistí správný formát a strukturu. Vše co jste napsali, prostě najdete tady. Viděl jsem dotaz, jak do této části zapisovat bez programátoru při běhu programu. Jde to, ale neřeknu jak, je to jako vyměňovat motor společně s kolem za jízdy. Prostě na to zapomeňte, neznám jediný rozumný příklad proč to dělat.

SRAM při spuštění programu jsou do této části nahrány všechny proměnné, které máte uvedeny v hlavičce programu. Máme je tedy dvakrát – jednou ve FLASH a jednou v SRAM. Potom při běhu programu jsou sem ukládány proměnné deklarované v samostatných funkcích mimo setup a loop. Po skončení funkce se prostor opět uvolní. SRAM je poměrně malá a budete překvapeni jak rychle volné paměti ubývá. Hlavně při práci s textem to jde rychleji, než píšete. U tuto část paměti se nemusíte v podstatě nijak starat, Arduino si samo řídí její využití. Na co je potřeba dávat pozor je na přetečení paměti. Tedy když se tam pokusíte zapsat více dat, než je. Nejčastěji se to stává, když se dostanete na hranici velikosti paměti a pak začnete vytvářet texty co potřebujete odeslat třeba na internet. Nebo když čtete data ze Serial portu, teče jich pořád více a vy je zpracujete a včas nezahazujete. Další problém je fragmentace paměti. Ale to vše se dá uřídit.

EEPROM je samostatná kapitola. Sem si ukládáme data, o která nechceme přijít, když náhodou dojde k výpadku napájení, chceme se k nim vrátit a proměnné nám zaberou mnoho místa a ještě k tomu budou mít složitou strukturu, např. log. Do každé buňky můžeme uložit číslo v rozsahu 0-255. Pokud chceme větší číslo, je potřeba použít bitového posunu. Zapisování do této paměti si neřídí Arduino samo, vy určujete do které buňky co a kdy zapíšete. Přitom je potřeba dbát na to, abychom nepřekročili počet buněk a omezit počet zápisů za určitou dobu, abychom pamět EEPROM neznehodnotili. Pokud bude buňka poškozená, nijak na to nepřijde. Chcete zapsat – Arduino zapíše, jenom pak nedostanete to co jste zapsali. Jedinou možností jak toto ošetřit je, napsat si funkci, která bude kontrolovat zapsaná data a na to adekvátně reagovat. Knihovna EEPROM toto všechno umí.

V příštím díle si projdeme použití SRAM, tvorbu a distribuci proměnných i s ohledem na fragmentaci paměti. V podstatě jde o standardní návyky programátora, které jsem na žádném fóru nikdy nenašel. A v tom dalším díle se podíváme na práci s EEPROM, a na konkrétním příkladu si ukážeme k čemu je to dobré.

JB

jaroslav.bohac@arduinotech.cz

Přidat komentář

Zvýrazněné položky jsou povinné.

Přehled komentářů

  1. Tabulka v pameti FLASH (Martin Lexa, 5.7.2017 7:47:00) Odpovědět

    Dobry den, potreboval bych mit v kodu tabulku hodnot ktere jsou predem dane a program hodnoty jen vyuziva. Chtel bych aby se stat nekopirovaly pri startu do RAM, ale program pri behu si data cetl z FLASH. Jakym zpusobem se to zapise do kodu programu Arduina. Diky, Martin Lexa.


TOP produkty

Arduino DUE

Arduino DUE
696 Kč s DPH

NodeMCU s ESP8266

NodeMCU s ESP8266
350 Kč s DPH

Kontakt

Ing. Petr Foltýn
Kunčice pod Ondřejníkem 814, 73913
TOPlist