PROGMEM



Açıklama

Verileri SRAM yerine flash (program) belleğinde saklayın. Bir Arduino kartında çeşitli bellek türlerinin bir açıklaması vardır.

PROGMEM anahtar sözcüğü bir değişken değiştiricidir, yalnızca pgmspace.h dosyasında tanımlanan veri türleriyle kullanılmalıdır. Derleyiciye SRAM yerine normalde bu bilgiyi flash belleğe koymasını söyler.

PROGMEM, pgmspace.h kütüphanesinin bir parçasıdır. IDE'nin modern sürümlerine otomatik olarak dahil edilir. Bununla birlikte, 1.0 (2011) 'in altında bir IDE sürümü kullanıyorsanız, öncelikle kütüphanenizi çiziminizin en üstüne şu şekilde eklemeniz gerekir:

#include <avr/pgmspace.h> PROGMEM tek bir değişken üzerinde kullanılabilse de, genellikle bir dizide genellikle en kolay olan daha büyük bir veri bloğuna sahipseniz (veya mevcut tartışmamızın ötesinde başka bir C ++ veri yapısı).

PROGMEM kullanımı iki aşamalı bir prosedürdür. Verileri Flash belleğe aldıktan sonra, program belleğindeki verileri tekrar SRAM'a okumak için pgmspace.h kütüphanesinde de tanımlanan özel yöntemler (işlevler) gerekir, böylece onunla yararlı bir şey yapabiliriz.

Sözdizimi

const dataType variableName[] PROGMEM = {data0, data1, data3…​};

PROGMEM değişken bir değiştirici olduğundan, nereye gitmesi gerektiği konusunda zor ve hızlı bir kural olmadığına dikkat edin, bu nedenle Arduino derleyicisi aynı zamanda eşanlamlı olan aşağıdaki tanımların tümünü kabul eder. Bununla birlikte, deneyler, Arduino'nun çeşitli versiyonlarında (GCC versiyonuyla ilgili), PROGMEM'in başka bir yerde değil, bir yerde çalışabileceğini göstermiştir. Aşağıdaki "string table" örneği Arduino 13 ile çalışacak şekilde test edilmiştir. Değişken adından sonra PROGMEM eklenirse IDE'nin önceki sürümleri daha iyi çalışabilir.

const dataType variableName[] PROGMEM = {}; // use this form
const PROGMEM dataType variableName[] = {}; // or this one
const dataType PROGMEM variableName[] = {}; // not this one

Parametreler

dataType : İzin verilen veri türleri: herhangi bir değişken türü.
variableName : veri dizinizin adı.

Örnek Kod

Aşağıdaki kod parçaları imzasız karakterlerin (bayt) ve int'lerin (2 bayt) PROGMEM'e nasıl okunacağını ve yazılacağını göstermektedir.

// save some unsigned ints
const PROGMEM uint16_t charSet[] = { 65000, 32796, 16843, 10, 11234};

// save some 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

  // put your setup code here, to run once:
  // read back a 2-byte int
  for (byte k = 0; k < 5; k++) {
    displayInt = pgm_read_word_near(charSet + k);
    Serial.println(displayInt);
  }
  Serial.println();

  // read back a char
  for (byte k = 0; k < strlen_P(signMessage); k++) {
    myChar = pgm_read_byte_near(signMessage + k);
    Serial.print(myChar);
  }

  Serial.println();
}

void loop() {
  // put your main code here, to run repeatedly:
}

Dize dizileri

Bir dizi dizeyi ayarlamak için LCD'li bir proje gibi büyük miktarlarda metinle çalışırken genellikle kullanışlıdır. Dizelerin kendileri diziler olduğundan, bu aslında iki boyutlu dizinin bir örneğidir.

Bunlar büyük yapılar olma eğilimindedir, bu yüzden onları program belleğine koymak genellikle istenir. Aşağıdaki kod fikri göstermektedir.

 /* PROGMEM string demo How to store a table of strings in program memory (flash), and retrieve them. Information summarized from: http://www.nongnu.org/avr-libc/user-manual/pgmspace.html Setting up a table (array) of strings in program memory is slightly complicated, but here is a good template to follow. Setting up the strings is a two-step process. First, define the strings. */ #include <avr/pgmspace.h> const char string_0[] PROGMEM = "String 0"; // "String 0" etc are strings to store - change to suit. const char string_1[] PROGMEM = "String 1"; const char string_2[] PROGMEM = "String 2"; const char string_3[] PROGMEM = "String 3"; const char string_4[] PROGMEM = "String 4"; const char string_5[] PROGMEM = "String 5"; // Then set up a table to refer to your strings. const char *const string_table[] PROGMEM = {string_0, string_1, string_2, string_3, string_4, string_5}; char buffer[30]; // make sure this is large enough for the largest string it must hold void setup() { Serial.begin(9600); while (!Serial); // wait for serial port to connect. Needed for native USB Serial.println("OK"); } void loop() { /* Using the string table in program memory requires the use of special functions to retrieve the data. The strcpy_P function copies a string from program space to a string in RAM ("buffer"). Make sure your receiving string in RAM is large enough to hold whatever you are retrieving from program space. */ for (int i = 0; i < 6; i++) { strcpy_P(buffer, (char *)pgm_read_word(&(string_table[i]))); // Necessary casts and dereferencing, just copy. Serial.println(buffer); delay(500); } } 

Notlar ve Uyarılar

PROGMEM ile çalışmak için değişkenlerin ya global olarak tanımlanması ya da statik anahtar kelimeyle tanımlanması gerektiğini lütfen unutmayın.

Bir fonksiyonun içindeyken aşağıdaki kod ÇALIŞMAZ:

 const char long_str[] PROGMEM = "Hi, I would like to tell you a bit about myself.\n"; 

Aşağıdaki kod, bir işlev içinde yerel olarak tanımlansa bile çalışır:

 const static char long_str[] PROGMEM = "Hi, I would like to tell you a bit about myself.\n" 

F() makrosu

Ne zaman bir talimat gibi:

 Serial.print("Write something on the Serial Monitor"); 

kullanıldığında, yazdırılacak dize normalde RAM belleğine kaydedilir. Çiziminiz Seri Monitörde çok fazla şey yazdırıyorsa, RAM'i kolayca doldurabilirsiniz. Boş FLASH bellek alanınız varsa, dizenin sözdizimi kullanılarak FLASH'a kaydedilmesi gerektiğini kolayca belirtebilirsiniz:

 Serial.print(F("Write something on the Serial Monitor that is stored in FLASH")); 

Ayrıca Bakınız

DEFINITION array

DEFINITION string