Эффективный строковый цикл в ESP8266 с использованием массивов PROGMEM

При программировании для микроконтроллера ESP8266 эффективное управление памятью имеет решающее значение из-за ее ограниченных ресурсов. Одним из распространенных сценариев является работа с массивами строк, которая может потреблять значительный объем драгоценной оперативной памяти. В этой статье мы рассмотрим различные методы циклического перебора строковых массивов, хранящихся в PROGMEM (программной памяти) ESP8266, оптимизируя использование памяти и повышая производительность. Мы предоставим примеры кода для каждого метода, что позволит вам реализовать их в ваших проектах ESP8266.

Методы:

  1. Метод: использование макроса F()
    Пример кода:

    const char stringArray[][10] PROGMEM = {
     "String 1",
     "String 2",
     "String 3"
    };
    void loop() {
     for (uint8_t i = 0; i < sizeof(stringArray) / sizeof(stringArray[0]); i++) {
       Serial.println(FPSTR((const char*)pgm_read_word(&(stringArray[i]))));
       delay(1000);
     }
    }
  2. Метод: использование функции PSTR()
    Пример кода:

    const char stringArray[][10] PROGMEM = {
     PSTR("String 1"),
     PSTR("String 2"),
     PSTR("String 3")
    };
    void loop() {
     for (uint8_t i = 0; i < sizeof(stringArray) / sizeof(stringArray[0]); i++) {
       char buffer[10];
       strcpy_P(buffer, (const char*)pgm_read_word(&(stringArray[i])));
       Serial.println(buffer);
       delay(1000);
     }
    }
  3. Метод: использование модификатора PROGMEM
    Пример кода:

    const char stringArray[][10] PROGMEM = {
     "String 1",
     "String 2",
     "String 3"
    };
    void loop() {
     for (uint8_t i = 0; i < sizeof(stringArray) / sizeof(stringArray[0]); i++) {
       char buffer[10];
       strcpy_P(buffer, (const char*)pgm_read_word(&(stringArray[i])));
       Serial.println(buffer);
       delay(1000);
     }
    }
  4. Метод: использование атрибута PROGMEM
    Пример кода:

    const char stringArray[][10] __attribute__((section(".progmem"))) = {
     "String 1",
     "String 2",
     "String 3"
    };
    void loop() {
     for (uint8_t i = 0; i < sizeof(stringArray) / sizeof(stringArray[0]); i++) {
       char buffer[10];
       strcpy_P(buffer, (const char*)pgm_read_word(&(stringArray[i])));
       Serial.println(buffer);
       delay(1000);
     }
    }

Используя массивы PROGMEM и соответствующие методы, вы можете эффективно перебирать строковые массивы в проектах ESP8266, оптимизируя использование памяти и улучшая общую производительность. Методы, обсуждаемые в этой статье, предлагают различные подходы к достижению этой цели. Поэкспериментируйте с этими методами и выберите тот, который лучше всего соответствует требованиям вашего конкретного проекта.