نمایش/عدم نمایش سایدبار
رفتن به بالای صفحه
أَللّهُمَّ ارْزُقْنی شَفاعَةَ الْحُسَیْنِ یَومَ الْوُرُودِ
میلاد رسولی بیدختی

حافظه و مدیریت حافظه میکروکنترلر

265

بـــه نـــام خــدا : حافظه و مدیریت حافظه میکروکنترلر
متغییرها رو به 2 دسته کلی تقسیم بندی میکنیم : 1-متغییرهای محلی 2-متغییر های سراسری
متغییرهای محلی : فقط در همان تابعی که ساخته میشود شناخته شده است .
متغییر های سراسر : در بالای همه توابع تعریف میشود و در همه توابع میتوان از ان استفاده کرد.

سعی کنید از متغییر های سراسری توی برنامه تون کمتر استفاده کنید، این متغییرها حافظه بیشتر رو اشغال میکنند. به طور مثال یه متغییر سراسری توی php حدود 140 برابر بیشتر حافظه اشغال میکند نسبت به متغییر محلی اش.
توجه : برای این مورد زیر میتویند مطلب مقابل رو بخویند : روش های ارسال متغییر به تابع در C
اگر بخواهیم مقادیری رو از یک تابع برگردونیم میتونیم از روش های زیر استفاده کنیم:

  1. پوینترها
  2. برگردوندن استراکچر (stract)
  3. متغییر های سراسری

این سری از توابع را برای اجرا بایست صدا بزنیم تا مقدار را به محلی که صداش زدیم برگردوند که دراین باره این توابع بحث نمیکنیم.( stract )
ولی یک سری توابع اند که در صورت فعال شدن پرچم فراخوانی میشوند و اگر بخواهیم مقداری رو از این توابع برگردونیم نمیتونیم از Return استفاده کنیم و در اینجاست که اغلب از متغییرهای سراسری استفاده میکنیم. ولی این کار رو میتونیم با پوینترها انجام دهیم  به نوعی پوینترها بهترین جایگزین برای متغییر های سراسری اند.به کد زیر دقت کنید.
استفاده از متغییر سراسری :

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

اطلاعات برنامه بعد از کامپایل :
مدیریت حافظه میکروکنترلر
نتیجه هر دو پروژه :
برنامه نویسی AVR
توی یک پروژه ساده مثل هم اینقد نتایج با هم فرق دارد !!
برنامه یک ساعت با استفاده از پوینتر ها
عدد 0x60h از قسمت project > configure > c compiler > Advanced در بخش On-chip RAM قابل مشاهده و تنظیم است. از جدول زیرهم میتوانید محل قرار گیری داده ها را در RAM مشاهده کنید.
چون میکرو های AVR 8 بیتی هستند و char هم 8 بیت فضا اشغال میکند ادرس داده اول(sec) را 60 و 61 (min)و 62(hour) هگز قرار دادیم، در تابع main سه پوینتر ساختیم و ان ها را با ادرس های بالا مقدار دهی کردیم.
برنامه نویسی میکروکنترلر
 
برنامه نویسی میکروکنترلر
 
بعد از کامپایل برنامه بالا یک Warning مشاهد خواهید کرد
Warning: C:\Users\Milad-Pc\Documents\a\a.c(8): @ RAM location address is in the Data Stack area
که شما میگه محل آدرس متغییری که ایجاد کردید مالData Stack هست.
اگر به جدول ادرس های حافظه RAM نگاه کنید متوجه حافظه Heap میشوید این همان حافظه ای است که هنگام
اجرا برنامه اختصاص داده میشود و مقدار ان را خودمان میتوانیم تعیین کنیم از قسمت
project > configure > c compiler > Code Generation در قسمت RAM مقدار آن را تعیین کنیم . با این حافظه میتوان در حین کار میکرو متغییر ایجاد کرد و پس از اتمام کار با آن فضای گرفته شده توسط ان را آزاد کرد. با کد نمونه توجه کنید .

در این برنامه بافری که برای lcd  بکار میرود را به صورت دینامیک ساخته ایم  ابتدا پوینتری از نوع char ساختیم و سپس توسط تابع (void *malloc(unsigned int size به مقدار متغییر n ارایه 16 تایی ایجاد کردیم و بعد از اتمام کار مقدار حافظه گرفته شده را آزاد کردیم توسط تابع (void free(void *ptr که این توابع در کتاب خانه stdio.h تعریف شده است.
حافظه و مدیریت حافظه میکروکنترلر

تعداد مطالب : 3 تا
برنامه نویس
بقیه جلسات :
این مطلب هیچ طبقه بندی یی ندارد!
ارسال دیدگاه
3
نظرات این مطلب بسته شده است.
  1. دادگر

    مهمان

    دادگر

    اون پوینتر ها اصلا فرقی تو حافظه شما ایجاد نکرد. شما تو برنامه اول متغیر هاتو به صورت گلوبال تعریف کردی و بخشی از رم که مربوط به متغیر های گلوبال هست رو اشغال کردی اما تو برنامه دوم رفتی تو تابع main اون ها رو تعریف کردی و بخشی از حافظه stack رو اشغال کردی! اگه دقت هم کنی حافظه استک رو بایت بیشتر شده

  2. مهدی دمرچیلو

    مدیر سایت

    مهدی دمرچیلو

    تو خط 12-14 یه متغییر از نوع آرایه با اندازه مد نظر ایجاد میکردی و بعد آدرسش رو میدادی به اشاره گر بهتر نبود؟

  3. keivanjan

    مهمان

    keivanjan

    سلام عالی بود و خیلی حرفه ایی و ارزشمند اان شاء الله موفق و پیروز باشید