مدیریت و بهینه سازی رم و مموری در ESP۳۲

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

نکته بعدی که می تواند به ما کمک کند این است که با مدیریت خودکار این پردازنده ها آشنا شویم. به طور کلی توابع و متغیر ها و پردازش های ما در 2 مدل حافظه RAM در میکرو ها ذخیره می شوند:

 

حافظه STACK :

متغیرهای غیر استاتیک، پارامتر های ارسالی به توابع و آدرس های مربوط به return توابع در این حافظه ذخیره می شوند. اندازه حافظه stack ثابت است به همین دلیل به آن static memory گفته می شود.

در این حافظه اطلاعات پشت سر هم و به ترتیب قرار می گیرند به این صورت که آخرین داده ذخیره شده در بالای stack قرار می گیرد و به اصطلاح push می شود، حال اگر قصد برداشتن اطلاعات یا به اصطلاح pop کردن اطلاعات را داشته باشیم آخرین اطلاعات وارد شده در stack را در اختیار داریم.از آنجا که در حافظه stack نیازی به پیدا کردن فضای خالی در حافظه نیست و محل قرارگیری اطلاعات مشخص است (بالای حافظه) بنابراین این حافظه سریع تر از حافظه heap است.

مثال پر کاربرد در توضیح stack خشاب اسلحه (آخرین گلوله ای که در خشاب قرار داده می شود اولین گلوله ای است که شلیک می شود) و یا بشقاب های روی هم چیده شده (آخرین بشقابی که روی سایر بشقاب ها قرار داده می شود اولین بشقابی است که برداشته می شود) است.

حافظه HEAP :

حافظه Heap به صورت دستی توسط برنامه نویس مدیریت می شود. Heap مربوط به زمان اجرا (runtime) است و فضای اشغال شده در heap با اتمام کار تابع آزاد نمی شوند و تا زمانی که Garbage Collector این فضا را آزاد کند یا توسط برنامه نویس داده ها از حافظه heap پاک نشوند در این فضا باقی می ماند. اندازه حافظه heap متغیر است به همین دلیل به آن dynamic memory گفته می شود.

در این نوع از حافظه برای ذخیره مقادیر ابتدا محاسبه ای توسط سیستم عامل صورت می گیرد تا اولین فضای حافظه ای که اندازه آن متناسب با اندازه ای که مورد نیاز ماست را پیدا کند، در صورت وجود این میزان از حافظه درخواستی آن را به صورت رزرو شده درمی آورد تا بقیه برنامه ها به این فضا دسترسی نداشته باشند، سپس آدرس ابتدای این فضای محاسبه شده به صورت یک اشاره گر (pointer) در اختیارمان قرار می دهد.

به دلیل محاسبات برای یافتن آدرس شروع حافظه و در اختیار گرفتن pointer حافظه heap نسبت به stack کندتر است. همچنین اگر داده ها به صورت پشت سر هم در block های حافظه قرار نگرفته باشند (این احتمال بسیار زیاد است) موجب کندی در بازیابی اصلاعات خواهد شد.

حال می دانیم که حافظه ای که بسیار حساس تر است حافظه Heap می باشد و باید برای مدیریت آن در هر پروژه ای وقت بگزاریم و به این توجه داشته باشیم که همیشه باید مقدار خالی این فضا از مقدار استانداردی که برای آن پردازنده تعریف شده است کمتر نشود و متغیر ها و توابع خودرا مدیریت کنیم تا باعث پر شدن این حافظه نشود.

اما برای اینکه این حافظه را مدیریت کنیم باید میزان فضای خالی حافظه را بدانیم . در بیشتر پردازنده ها به دلیل اینکه این موضوع مهم است حتما برای آن یک سری توابع برای فهمیدن یک رجیستر در حافظه که این مقدار را نگه می دارد را تعریف می کنند تا کاربر بتواند این موضوع را بفهمد.

در کامپایلر Arduino IDE حافظه Stack بلافاصله بعد از انتخاب گزینه پروگرام یا کامپایل میزان استفاده از حافظه های ثابت(مانند Flash) را به ما نشان می دهد. اما مقدار حافظه Heap در طول برنامه مدام تغییر می کند و خالی بودن آن بستگی به کلاس ها و توابع و پردازش های دائم در حال تغییر می باشد . اما به عنوان مثال در برد Esp32 یک تابع در کد های خود این برد موجود است که هنگام نصب برد از بخش Board manager همراه توابع دیگر این میکرو (مانند WIFI) قابل استفاده است. این تابع کاربردی میزان حافظه خالی Heap را به صورت یک عدد برمیگرداند که به واحد bit می باشد و می توانیم آن را بررسی کنیم:

Code

void setup(){

Serial.begin(115200);

Serial.println( ESP.getfreeHeap() );

}

void loop(){

//nothing

}

در واقع تابعی که بهش اشاره می کردیم ()ESP.getFreeHeap هستش که ما مقدار خروجی آنرا روی پورت سریال نمایش می دهیم که می توانید نتیجه آن را ببینید:

ESP32-Heap

همانطور که مشاهده می کنید در ایتدای برنامه خالی ما مقدار تقریبا 200KB فضای خالی Heap داریم.

 

منابع:

https://docs.arduino.cc/learn/programming/memory-guide

https://virgool.io/@mehdinazari/%D8%AD%D8%A7%D9%81%D8%B8%D9%87-heap-%D9%88-stack-kg9fzklzrhwb

https://techtutorialsx.com/2017/12/17/esp32-arduino-geting-the-free-heap

 

 

 

 

 

 

نوشته های مشابه

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

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

− one = 8

بستن