آموزش آردوینودستورات آردوینو

کلیدواژه PROGMEM در آردوینو (انتقال به حافظه FLASH)

در هنگام ایجاد یک داده اگر از کلیدواژه PROGMEM استفاده کنیم، مکان ذخیره سازی حافظه FLASH تعیین میشود. برد های آردوینو دارای حافظه های مختلفی هستند. در حالت عادی داده ها در حافظه SRAM ذخیره میشوند. با توجه به اینکه حافظه SRAM بسیار کمتر از حافظه FLASH است، در بعضی از موارد که اندازه داده زیاد است میتوانیم از حافظه FLASH استفاده کنیم.

PROGMEM بخشی از کتابخانه pgmspace.h است. این کتابخانه به طور خودکار در نسخه های جدید IDE آردوینو قرار شده است. با این حال ، اگر از نسخه زیر 1.0 (2011) استفاده می کنید ، ابتدا باید کتابخانه را در بالای کد خود فراخوانی کنید.

استفاده از PROGMEM یک روش دو مرحله ای است. پس از وارد کردن داده ها به حافظه Flash ، برای خواندن مجدد داده ها از حافظه برنامه به SRAM ، به روشهای ویژه ای (توابع) که در کتابخانه pgmspace.h تعریف شده اند نیاز است.

داده های PROGMEM

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

برای یادگیری آردوینو (برنامه نویسی، ساخت ربات، ارتباط با اندروید) روی دوره آموزش آردوینو کلیک کنید.
برای یادگیری کامل الکترونیک روی دوره آموزش الکترونیک کلیک کنید.

توجه داشته باشید که چون PROGMEM اصلاح کننده متغیر است ، میتوان از انواع روش های ایجاد متغیر استفاده کنید. با این حال ، آزمایشات نشان داده اند که ، در نسخه های مختلف آردوینو (که با GCC ارتباط دارند) ، PROGMEM ممکن است در یکبار کار کند و در یکبار کار نکند.

به مثال های زیر دقت کنید:

const dataType variableName[] PROGMEM = {}; // درست
const PROGMEM dataType variableName[] = {}; // درست
const dataType PROGMEM variableName[] = {}; // غلط

کد نمونه با داده PROGMEM

قطعات کد زیر نحوه خواندن و نوشتن کاراکترهای بدون علامت (1 بایت) و ints (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);  // انتظار برای برقراری ارتباط سریال

  // خواندن داده و نمایش در سریال مانیتور
  for (byte k = 0; k < 5; k++) {
    displayInt = pgm_read_word_near(charSet + k);
    Serial.println(displayInt);
  }
  Serial.println();

  // خواندن داده
  for (byte k = 0; k < strlen_P(signMessage); k++) {
    myChar = pgm_read_byte_near(signMessage + k);
    Serial.print(myChar);
  }

  Serial.println();
}

void loop() {
}

آرایه ها و رشته ها

در هنگام کار با متن های طولانی مثلا پروژه های مرتبط با نمایشگر، میتوان مجموعه از رشته ها را تنظیم کرد. از آنجا که رشته ها خود یک نوع آرایه هستند در واقع نمونه ای از آرایه دو بعدی ساخته میشود. پیشنهاد میکنم مقاله رشته در آردوینو و آرایه در آردوینو را بخوانید.

#include <avr/pgmspace.h>
const char string_0[] PROGMEM = "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() {
  for (int i = 0; i < 6; i++) {
    strcpy_P(buffer, (char *)pgm_read_word(&(string_table[i])));
    Serial.println(buffer);
    delay(500);
  }
}

نکات

لطفاً توجه داشته باشید که برای کار با PROGMEM ، متغیرها باید به صورت Global تعریف شوند یا با کلمه کلیدی Static تعریف شوند.

کد زیر هنگام قرارگیری در یک تابع کار نمی کند:

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

کد زیر کار خواهد کرد ، حتی اگر به صورت local در یک تابع تعریف شده باشد:

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");

استفاده می شود ، رشته ای که چاپ می شود به طور معمول در RAM ذخیره می شود. اگر کد شما در Serial Monitor چیزهای زیادی را چاپ می کند ، RAM به راحتی پر میشود. اگر فضای حافظه FLASH زیادی در دسترس دارید ، به راحتی می توانید داده را در حافظه فلش ذخیره کنید.

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

همچنین اگر در مورد این مطلب سوالی داشتید در انتهای صفحه در قسمت نظرات بپرسید

میخواهید برنامه نویسی STM32 را یاد بگیرید؟

دوره آموزش STM32

میخواهید الکترونیک را یاد بگیرید؟

دوره آموزش الکترونیک
دوره آموزش آردوینو

میخواهید آردوینو را به صورت پروژه محور یاد بگیرید؟ برای مشاهده توضیحات روی دوره مورد نظر کلیک کنید

برای دریافت مطالب جدید در کانال تلگرام یا پیج اینستاگرام آیرنکس عضو شوید.

محمد رحیمی

محمد رحیمی

محمد رحیمی هستم. سعی میکنم در آیرنکس مطالب مفید را قرار دهم. (در خصوص سوال در مورد این مطلب از قسمت نظرات همین مطلب اقدام کنید) سعی میکنم تمام نظرات را پاسخ دهم.

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *