Инструкции

Справочный раздел

В этом разделе Вы найдетё инструкции, справочники, и всевозможные хелпы по использованию программного обеспечения.

Разделы инструкций

В сети

Пользователей: 78
Из них просматривают:
Аналоги: 50. Видео: 1. Даташиты: 5. Инструкции: 3. Новости: 5. Остальное: 1. Партнёры: 1. Программы: 1. Производители: 1. Профиль пользователя: 1. Форум: 8. Чат: 1.
Участников: 3
Гостей: 75

an , Google , Яндекс , далее...
Рекорд 2375 человек онлайн установлен 26.12.2015.

Партнёры


Партнёры

Новые объявления

Оглавление

PROGMEM

Описание
Храните данные во флэш-памяти вместо SRAM. Есть описание различных типов памяти, доступных на плате Arduino.

Ключевое слово PROGMEM - это модификатор переменной, его следует использовать только с типами данных, определенными в pgmspace.h. Он сообщает компилятору: «Поместите эту информацию во флэш-память», а не в SRAM, куда она обычно помещается.

PROGMEM является частью библиотеки pgmspace.h. Он автоматически включается в современные версии IDE. Однако, если вы используете версию IDE ниже 1.0 (2011 г.), вам сначала нужно включить библиотеку в верхней части скетча, например:

#include <avr/pgmspace.h>

Хотя PROGMEM можно использовать с одной переменной, на самом деле это стоит суеты только в том случае, если у вас есть большой блок данных, который необходимо сохранить, что обычно проще всего в массиве (или другой структуре данных C++, выходящей за рамки нашего настоящего обсуждения).

Использование PROGMEM также представляет собой двухэтапную процедуру. После загрузки данных во флэш-память требуются специальные методы (функции), также определенные в библиотеке pgmspace.h, для чтения данных из программной памяти обратно в SRAM, чтобы мы могли сделать с ними что-нибудь полезное.

Синтаксис
const dataType variableName[] PROGMEM = {data0, data1, data3…​};

Обратите внимание, что, поскольку PROGMEM является модификатором переменной, нет жесткого и быстрого правила о том, куда он должен разместиться, поэтому компилятор Arduino принимает все определения ниже, которые также являются синонимами. Однако эксперименты показали, что в различных версиях Arduino (связанных с версией GCC) PROGMEM может работать в одном месте, а не в другом. Приведенный ниже пример «таблицы строк» ​​был протестирован для работы с Arduino 13. Более ранние версии IDE могут работать лучше, если PROGMEM будет добавлен после имени переменной.

const dataType variableName[] PROGMEM = {}; // используйте эту форму
const PROGMEM dataType variableName[] = {}; // или эту
const dataType PROGMEM variableName[] = {}; // но не эту

Пример
Следующие фрагменты кода показывают, как читать и записывать беззнаковые символы (байты) и целые числа (2 байта) в PROGMEM.

const PROGMEM uint16_t charSet[] = { 65000, 32796, 16843, 10, 11234};

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:
}


Массивы строк
При работе с большими объемами текста, например проектом с ЖК-дисплеем, часто бывает удобно настроить массив строк. Поскольку сами строки являются массивами, это фактически пример двумерного массива.

Это, как правило, большие оператора, поэтому часто желательно поместить их в программную память. Код ниже иллюстрирует пример.

/*Демонстрация PROGMEM
Как сохранить таблицу строк в флеш память,
и получить их.

Информация взята из:
http://www.nongnu.org/avr-libc/user-manual/pgmspace.html

Настройка таблицы (массива) строк в памяти программы немного сложна, но
вот хороший шаблон для повторения.

Настройка строк - это двухэтапный процесс. Сначала определите строки.
*/

#include
const char string_0[] PROGMEM = "String 0"; // "String 0" и т.д. - строки для текста.
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";

// Затем создайте таблицу, чтобы ссылаться на ваши строки.

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

char buffer[30]; // убедитесь, что достаточно для самой большой строки

void setup() {
Serial.begin(9600);
while (!Serial); // дождитесь подключения последовательного порта
Serial.println("OK");
}


void loop() {
/* Использование таблицы строк в флеш памятим требует использования специальных функций для извлечения данных.
Функция strcpy_P копирует строку из области программы в строку в ОЗУ («буфер»).
Убедитесь, что ваша строка в ОЗУ достаточно велика, чтобы вместить все,
что вы получаете из памяти. */


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

Примечания и предупреждения
Обратите внимание, что для работы с PROGMEM переменные должны быть определены либо глобально, либо с помощью ключевого слова static. Следующий код НЕ будет работать внутри функции:

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

Следующий код БУДЕТ работать, даже если он определен локально в функции:

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


Макрос F()
Инструкция типа:

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

Печатаемая строка обычно сохраняется в ОЗУ. Если ваш скетч печатает много чего чарез последовательный порт, вы можете легко заполнить оперативную память. Если у вас есть свободное место во флэш-памяти, вы можете легко указать, что строка должна быть сохранена во флэш-памяти, используя синтаксис:

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

Комментарии принадлежат их авторам. Мы не несем ответственности за их содержание.

Разное

Интересно

При замене электролитических конденсаторов, кроме соблюдения полярности, не следует значительно превышать допустимое рабочее напряжение.
Например, если конденсатор рассчитан на рабочее напряжение 16 В, то при установке нового той же емкости, но рассчитанного на напряжение 300 В после непродолжительной эксплуатации произойдет его расформовка, и емкость его значительно уменьшится.

Похожие инструкции