PROGMEM در آردوینو

PROGMEM در آردوینو

PROGMEM در آردوینو
PROGMEM در آردوینو

PROGMEM در آردوینو داده‌ها را به‌جای SRAM، در حافظه‌ی (برنامه) flash ذخیره می‌کند. برای توضیحات بیشتر راجع به انواع حافظه‌های موجود در برد آردوینو به اینجا مراجعه کنید.

کلمه‌ی کلیدی PROGMEM یک توصیف‌کننده‌ی متغیر است و باید فقط با نوع‌داده‌هایی که در pgmspace تعریف شده‌اند استفاده شود. PROGMEM به کامپایلر می‌گوید: “این داده را در حافظه‌ی فلش قرار بده.” (به‌جای قرار دادن در SRAM که معمولاً داده‌ها به این حافظه می‌روند.)

PROGMEM بخشی از کتاب‌خانه‌ی pgmspace.h است که فقط در معماری AVR قابل‌دسترس است. پس اول باید این کتاب‌خانه را به بالای کد اضافه (include) کنید؛ مثل کد زیر:

سینتکس (نحو)

  • dataType: هر نوع از انواع متغیر
  • variableName: نامی برای آرایه‌ای از داده‌هایتان

توجه کنید که از آن‌جایی که PROGMEM یک توصیف‌کننده‌ی متغیر است، قانون واضحی که کجا باید قرار بگیرد وجود ندارد؛ پس کامپایلر آردوینو همه‌ی تعاریف زیر (که مترادف و مشابه هم هستند) را می‌پذیرد. اما تجربه نشان داده است که PROGMEM در ورژن‌های متفاوت آردوینو (مربوط به ورژن GCC)، ممکن است در جایی کار کند و در جایی دیگر نه. مثال “string table” (جدول رشته) زیر برای کار با آردوینو 13 تست شده است. در ورژن‌های قدیمی‌ترِ IDE، اگر PROGMEM بعد از نام متغیر بیاید، ممکن است بهتر کار کنند.

درست است که از PROGMEM می‌توان برای یک متغیر هم استفاده کرد، اما فقط هنگامی ارزش دارد که شما بلاک بزرگ‌تری از داده را دارید و نیاز به ذخیره‌ی آن دارید که معمولاً آرایه ساده‌ترین روش ذخیره است. (یا یک ساختمان داده‌ی دیگر C که فراتر از بحث ماست.)

استفاده از PROGMEM هم رویه‌ای دو مرحله‌ای است. بعد از گذاشتن داده در حافظه‌ی فلش، برای خواندن داده از حافظه‌ی برنامه و قرار دادن در SRAM، نیاز به متد (فانکشن‌هایی) خاص است که آن‌ها هم در کتاب‌خانه‌ی pgmspace.h تعریف شده‌اند تا بتوانیم با آن کارهای مفید انجام دهیم.

مثال

قطعه کد زیر، نحوه‌ی خواندن و نوشتن char (بایت) و ints (دو بایت) به PROGMEM را نشان می‌دهد:

آرایه‌ای از رشته‌ها

هنگامی‌که مشغول کار کردن با حجم زیادی از متن هستید (مثل پروژه‌هایی با نمایشگر LCD) معمولاً راحت‌تر است که آرایه‌ای از رشته‌ها را ایجاد کنید. از آن‌جایی که رشته‌ها خود آرایه هستند، این کار مثالی از رشته‌های دو بعدی است.

این‌ها احتمالاً‌ ساختارهای بزرگی هستند پس معمولاً قرار دادنشان در حافظه‌ی برنامه (program memory) مطلوب است. کد زیر این ایده را نشان می‌دهد:

 

نکته

توجه کنید که برای کار با PROGMEM، متغیرها یا باید به‌صورت global و یا با کلمه‌ی کلیدی static تعریف شده باشند.

کد زیر کار نخواهد کرد هنگامی‌که درون یک تابع تعریف شده باشد:

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

ماکروی ()F

هنگامی‌که دستوری شبیه به دستور زیر استفاده می‌‌شود:

رشته‌ای که قرار است چاپ شود معمولاً در RAM ذخیره می‌شود. اگر کد شما چیزهای زیادی را روی مانیتور سریال چاپ می‌کند، شما RAM را پر خواهید کرد. اگر فضای خالی در حافظه‌ی FLASH  دارید، می‌توانید به‌راحتی و با کد زیر مشخص کنید که رشته باید در حافظه‌ی فلش ذخیره شود:

 

 

منبع

حمایت از Yalda

خوشحال میشیم برای تداوم و کیفیت ما رو حمایت کنید.

0 نفر

پــــســنــدیـده انـد

توجه

Yalda
Yalda

علاقه‌مند به یادگیری چیزهای جدید!

دیدگاه ها

4 دیدگاه

  • مهدی
    ۱۸ اردیبهشت ۱۴۰۰

    سلام واقعا خدا خیرتان دهد. اجرتون با اقا. کارم به شدت راه افتاد.

    • Yalda Shirazi
      Yalda
      ۲۰ اردیبهشت ۱۴۰۰

      سلام. خوشحالیم مفید بوده. امیدوارم از بقیه مطالب هم استفاده کنید و سیسوگ رو به دوستاتون هم معرفی کنید.

  • علی
    ۵ مرداد ۱۳۹۸

    سلام .لطفا کتابخانه avr/pgmspace.h فایل zip رو میشه لطفا ایمیل کنید.لطفا

پر بحث ترین ها

مسابقه دوم : چالش برنامه نویسی به زبان C

مسابقه اول سیسوگ (مسابقه اول: درک سخت افزار) انتقادهای زیادی رو در پی داشت تا جایی که حتی خودمم به نتیجه مسابقه...

Zeus ‌ Zeus ‌
  • 2 سال پیش

راه اندازی LCD گرافیکی Nokia 1661 و دانلود کتابخانه آن

LCD گرافیکی یکی از مهم ترین پارامترهای موجود در طراحی انواع مدارات الکترونیکی پیچیده و حتی ساده است ، نمایش وضعیت و...

Zeus ‌ Zeus ‌
  • 4 سال پیش

ریموت کدلرن و چکونگی دکد کردن آن به همراه سورس برنامه

ریموت کنترل امروزه کاربرد زیادی پیدا کرده است؛ از ریموت‌های درب بازکن تا ریموت‌های دزدگیر و کنترل روشنایی همه از یک اصول اولیه پیروی می‌کنند و آن‌هم ارسال اطلاعات به‌صورت بی‌سیم است....

Zeus ‌ Zeus ‌
  • 5 سال پیش

همه چیز درباره ریموت کنترل‌های هاپینگ

امنیت همیشه و در همه‌ی اعصار، مقوله‌ی مهم و قابل‌توجه‌ ای بوده و همیشه نوع بشر به دنبال امنیت بیشتر، دست به ابداعات و اختراعات گوناگونی زده است. ریموت کنترل یکی از این اختراعات است. در این مقاله، به بررسی امنیت انواع ریموت‌های کنترل خواهیم پرداخت....

Zeus ‌ Zeus ‌
  • 5 سال پیش

مسابقه سوم: استخراج داده از رشته ها در زبان C

نزدیک به 5 ماه از مسابقه دوم سیسوگ می‌گذره و فکر کردم که بد نیست یک چالش جدید داشته باشیم! البته چالش‌ها...

Zeus ‌ Zeus ‌
  • 2 سال پیش

مسابقه ششم: بزن میکروکنترلر را بسوزون!

بزنم میکروکنترلر را بسوزونم اونم تو  این شرایط!، طراحی مسابقه از اون چیزی که به نظر می‌رسه سخت‌تر است، باید حواست باشه...

Zeus ‌ Zeus ‌
  • 11 ماه پیش

آموزش قدم به قدم راه اندازی +NRF24L01

آموزش قدم به قدم راه اندازی +NRF24L01  با کتابخانه سازگار با انواع میکروکنترلرها و کامپایلرها قبل از اینکه قسمت بشه با ماژول...

رسول خواجوی بجستانی رسول خواجوی بجستانی
  • 3 سال پیش

ساخت ماینر با FPGA و ARM

چند ماهی هست که تب بیت کوین و ارزهای دیجیتال خیلی بالا رفته! چه شد که این پست را نوشتم همانطور که...

Zeus ‌ Zeus ‌
  • 3 سال پیش

کار با ماژول تمام عیار mc60 – قسمت دوم – راه اندازی OpenCPU

در قسمت اول به یکسری اطلاعات کلی ماژول mc60 پرداختیم، با نرم افزار QNavigator کار کردیم و یک هدربرد هم برای کار...

Mahdi.h   Mahdi.h  
  • 3 سال پیش

مسابقه چهارم: کدام حلقه سریع‌تر است؟

حدود ۷ ماه پیش، مسابقه سوم سیسوگ رو برگزار کردیم و کلی نکته در مورد خواندن رشته‌های ورودی را بررسی کردیم. فکر...

Zeus ‌ Zeus ‌
  • 1 سال پیش
سیـــســـوگ

مرجع متن باز آموزش الکترونیک