نمایش/عدم نمایش سایدبار
رفتن به بالای صفحه

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

بـــه نـــام خــدا : حافظه و مدیریت حافظه میکروکنترلر
متغییرها رو به 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 تعریف شده است.
حافظه و مدیریت حافظه میکروکنترلر

پسورد فایل های سایت :
www.dmf313.ir
قسمتی از کلام ا... (سوره سبأ) : بگو هر مزدى كه از شما خواستم آن از خودتان مزد من جز بر خدا نيست و او بر هر چيزى گواه است (۴۷) بگو بى‏ گمان پروردگارم حقيقت را القا مى ‏كند [اوست] داناى نهانها (۴۸) بگو حق آمد و [ديگر] باطل از سر نمى‏ گيرد و برنمى‏ گردد (۴۹) بگو اگر گمراه شوم فقط به زيان خود گمراه شده‏ ام و اگر هدايت‏ يابم [اين از بركت] چيزى است كه پروردگارم به سويم وحى مى ‏كند كه اوست‏ شنواى نزديك (۵۰)
ارسال دیدگاه
2

1) تعداد حروف غیر فارسی از حروف فارسی بیشتر باشه دیدگاه به صورت خودکار حذف میشه.

2) به موارد درخواست پروژه/کد آماده و سوالاتی که بلد نباشم پاسخ داده نمیشه.

3) برای گزاشتن کدهاتون از این سایت استفاده کنید : debian

  1. مدیر سایت

    مهدی دمرچیلو

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

    1395/07/06
    01:00
  2. مهمان

    keivanjan

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

    1395/06/29
    08:46