PROGMEM

Popis :

PROGMEM je modifikátor premennej, mal by sa používať len s dátovými typmi definovanými v pgmspace.h. Povie kompilátoru “uchovávajte tieto informácie iba vo flash pamäti”, namiesto toho, aby ich skopíroval do SRAM pri spustení, ako by to bolo normálne. PROGMEM je súčasťou knižnice pgmspace.h. Je zahrnutý automaticky v Arduino IDE.

Použitie PROGMEM je dvojkrokový postup. Akonáhle je premenná definovaná pomocou PROGMEM, nemožno ju čítať ako bežnú premennú založenú na SRAM: musíte ju prečítať pomocou špecifických funkcií, ktoré sú tiež definované v pgmspace.h.

PROGMEM je užitočný iba pri práci s doskami AVR (Uno Rev3, Leonardo atď.). Novšie dosky (Due, MKR WiFi 1010, GIGA R1 WiFi atď.) automaticky využívajú programový priestor, keď je premenná deklarovaná ako const.

Syntax :

Všimnite si, že pretože PROGMEM je modifikátor premenných, neexistuje žiadne pevné a rýchle pravidlo o tom, kam by mal smerovať, takže kompilátor Arduino akceptuje všetky definície uvedené nižšie, ktoré sú tiež synonymom.

Experimenty však ukázali, že v rôznych verziách Arduina (v súvislosti s verziou GCC) môže PROGMEM fungovať na jednom mieste a na inom nie.. Staršie verzie IDE môžu fungovať lepšie, ak je PROGMEM zahrnutý za názvom premennej.

const dataType variableName[] PROGMEM = {};
const PROGMEM dataType variableName[] = {};

Parametre :

dataType: Povolené typy údajov: akýkoľvek typ premennej.

variableName: názov poľa

Príklad kódu :

Nasledujúce kód ilustruje, ako čítať a zapisovať unsigned znaky (bajty) a ints (2 bajty) v PROGMEM.

// uložiť nejaké unsigned inty
const PROGMEM uint16_t charSet[] = { 65000, 32796, 16843, 10, 11234};

// uložiť nejaké chars
const char signMessage[] PROGMEM = {"I AM PREDATOR,  UNSEEN COMBATANT. CREATED BY THE UNITED STATES DEPART"};

unsigned int displayInt;
char myChar;


void setup() {
  Serial.begin(9600);
  while (!Serial);  // wait for serial port to connect. Needed for native USB

  //vložte svoj kód sem, aby sa spustil raz:
  //prečítať späť 2-bajtový int
  for (byte k = 0; k < 5; k++) {
    displayInt = pgm_read_word_near(charSet + k);
    Serial.println(displayInt);
  }
  Serial.println();

// prečítať znak späť 
  int signMessageLength = strlen_P(signMessage);
  for (byte k = 0; k < signMessageLength; k++) {
    myChar = pgm_read_byte_near(signMessage + k);
    Serial.print(myChar);
  }

  Serial.println();
}

void loop() {
  // vložte sem svoj hlavný kód, aby sa spustil opakovane:
}

Pole reťazcov

Pri práci s veľkým množstvom textu, ako je napríklad projekt s LCD, je často vhodné nastaviť pole reťazcov. Pretože samotné reťazce sú polia, toto je vlastne príklad dvojrozmerného poľa.

/*
 Ukážka reťazcov PROGMEM
 Ako uložiť tabuľku reťazcov do pamäte programu (flash),
 a potom ich získať.

  Nastavenie reťazcov je dvojkrokový proces. Najprv definujte reťazce.
*/

#include <avr/pgmspace.h>
const char string_0[] PROGMEM = "String 0"; // "String 0" atď. sú reťazce na uloženie - zmeňte ich podľa potreby.
const char string_1[] PROGMEM = "String 1";
const char string_2[] PROGMEM = "String 2";
const char string_3[] PROGMEM = "String 3";

// Potom vytvorte tabuľku, ktorá bude odkazovať na vaše reťazce.

const char *const string_table[] PROGMEM = {string_0, string_1, string_2, string_3,};

char buffer[30];  // uistite sa, že je dostatočne veľká

void setup() {
  Serial.begin(9600);
  while (!Serial);  //počkajte na pripojenie sériového portu. Potrebné pre natívne USB
  Serial.println("OK");
}


void loop() {
  /* Použitie tabuľky reťazcov v pamäti programu vyžaduje použitie špeciálnych funkcií na získanie údajov.
 Funkcia strcpy_P skopíruje reťazec z programového priestoru do reťazca v RAM ("buffer").
 Uistite sa, že váš prijímací reťazec v RAM je dostatočne veľký na to, aby pojal čokoľvek */


  for (int i = 0; i < 6; i++) {
    strcpy_P(buffer, (char *)pgm_read_ptr(&(string_table[i])));
    Serial.println(buffer);
    delay(500);
  }
}

Poznámky :

Premenné musia byť buď globálne definované, ALEBO definované pomocou statického kľúčového slova, aby mohli pracovať s PROGMEM.

Makro F()

Serial.print("Napíšte niečo");

Ak sa používa, reťazec, ktorý sa má zobraziť, ten sa normálne uloží do pamäte RAM. Ak program zobrazí veľa vecí na sériovom monitore, môžete jednoducho zaplniť pamäť RAM. Tomu sa dá predísť nenačítaním reťazcov z pamäťového priestoru FLASH, Pomocou syntaxe môžete ľahko určiť, že reťazec sa nemá pri spustení skopírovať do pamäte RAM:

Serial.print(F("Napíšte niečo na sériový monitor, ktorý je uložený vo FLASH"));

Pridaj komentár

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

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