ورود به حساب ثبت نام جدید فراموشی کلمه عبور
برای ورود به حساب کاربری خود، نام کاربری و کلمه عبورتان را در زیر وارد کرده و روی «ورود به سایت» کلیک کنید.





اگر فرم ورود برای شما نمایش داده نمیشود، اینجا را کلیک کنید.









اگر فرم ثبت نام برای شما نمایش داده نمی‌شود، اینجا را کلیک کنید.









اگر فرم بازیابی کلمه عبور برای شما نمایش داده نمی‌شود، اینجا را کلیک کنید.





کاربران برچسب زده شده

نمایش نتایج: از 1 به 5 از 5
  1. #1
    2009/09/27
    1,128
    37

    فرق بین حافظه stack و heap توی میکروکنترلرا چیه ؟

    سلام.
    فرق بین حافظه stack و heap توی میکروکنترلرا چیه ؟
    کمتر یا بیشتر بودنشون نسبت به هم چه مزایا و معایبی برای کد داره ؟
    بر چه اساسی میزان مناسب برای این دو تا انتخاب کنیم ؟
    مرسی.
    ---------
    .
    .
    ...........
  2. #2
    2011/02/03
    172
    9

    پاسخ : فرق بین حافظه stack و heap توی میکروکنترلرا چیه ؟

    نقل قول نوشته اصلی توسط ajapyy
    سلام.
    فرق بین حافظه stack و heap توی میکروکنترلرا چیه ؟
    کمتر یا بیشتر بودنشون نسبت به هم چه مزایا و معایبی برای کد داره ؟
    بر چه اساسی میزان مناسب برای این دو تا انتخاب کنیم ؟
    مرسی.
    سلام

    برای پاسخ دادن به سوالتون اول باید تعریف درستی از هر دو تا رو داشته باشیم.
    اول از همه به سراغ stack میریم.
    stack یک بخش خاصی از حافظه هست که برای ذخیره متغییر های محلی هر تابع(از جمله تابع main) و محل برگشت از تابع استفاده میشه. معمولا طراحی stack به صورت First In Last Out هست یا همون FILO. خوبی stack این هست که توسط CPU مدیریت میشه و کاربر نیاز نداره که به صورت دستی حافظه رو Allocate کنه و بعد از پایان استفاده اون رو deallocate کنه. در CPU مکانیزمی وجود داره که به صورت اتوماتیک متغییر های محلی آدرس دهی میشن و درنهایت هم deallocate میشن. از اونجا که این کار توسط CPU انجام میشه خیلی سرعت بالایی داره و تقریبا هیچ گونه Memory Leakage رخ نمیده (به این معنا که حافظه ایی به اشتباه پر فرض بشه). همونطور که گفتم خوبی استفاده از stack این هست که حافظه برای شما به صورت اتوماتیک مدیریت میشه. نکته مهم در فهم کار stack دانستن این نکته هست که وقتی از یک تابع خارج میشویم تمام متغییر های محلی این تابع از داخل stack خارج میشن یا همون pop میشن و کلا از بین میروند. نکته مهم دیگه این هست که حافظه stack محدود هست. این در مقایسه با حافظه heap هست. به صورت کلی stack:

    1- حافظه stack به صورت اتوماتیک با توجه به سایز متغیر های محلی pop , یا push میشه.
    ۲- هیچ نیازی به مدیریت حافظه از طرف کاربر نیست و متغییر ها به صورت اتوماتیک allocate و deallocate میشن.
    ۳- stack داری محدودیت اندازه هست.
    ۴- متغییر های توابع که داخل stack ذخیره شدن تا وقتی که cpu داخل اون تابع هست قابل دسترسی هستند و وقتی که cpu از اون تابع بیرون میره تمام متغییر های اون تابع پاک میشن
    این هم یک مثال از استفاده از حافظه stack:
    [code=c]
    #include <stdio.h>

    double multiplyByTwo (double input) {
    double twice = input * 2.0;
    return twice;
    }

    int main (int argc, char *argv[])
    {
    int age = 30;
    double salary = 12345.67;
    double myList[3] = {1.2, 2.3, 3.4};

    printf("double your salary is %.3f\n", multiplyByTwo(salary));

    return 0;
    }
    [/code]

    حالا حافظه heap چی هست؟؟؟
    حافظه heap قسمتی از حافظه هست که به صورت اتوماتیک مدیریت نمیشه بنابراین کاربر باید بعد از اختصاص دادن حافظه heap به یک متغییر حواسش باشه که اون متغییر رو از حافظه پاک کنه. اگر این اتفاق به هر دلیلی نیفته میگن memory leakage اتفاق افتاده و به این معنا هست که ما یک قسمت از حافظه رو از دست دادیم چون cpu فکر میکنه متغییر داخل اون قسمت وجود داده و نمیتونه جای اون متغییر چیزه دیگه ایی بگذاره. اختصاص دادن حافظه heap به متغییر توسط دستور alloc() انجام میشه که یک تابع داخلی C هست. وظیفه پاک کردن متغییر از حافظه heap به عهده کاربر هست و باید اون متغییر رو با دستور free() از حافظه پاک کنه. برخلاف stack حافظه heap ظرفیت بیشتری داره و همچنین محدودیت روی ساز متغییر ها هم وجود نداره. از اونجا که مدیریت heap توسط کاربر انجام میشه سرعت کار کردن باهاش کمتر از stack خواهد بود. از ظرف دیگه متغییر های ذخیره شده در heap به صورت global هستند و همه توابع میتونن به اون متغییر ها دسترسی داشته باشند. به طور خلاصه, در حافظه heap:

    ۱- متغییر ها به صورت global قابل دسترسی هستند.
    ۲- میشه سرعت دسترسی کمتر از stack خواهد بود.
    ۳- احتمال memory leakage وجود داره.
    ۴- متغییر ها به صورت داینامیک هستند و میتونن با استفاده از دستور realloc() تغییر سایز بدهند.

    حالا همون کد بالا با استفاده از heap:
    [code=c]
    #include <stdio.h>
    #include <stdlib.h>

    double *multiplyByTwo (double *input) {
    double *twice = malloc(sizeof(double));
    *twice = *input * 2.0;
    return twice;
    }

    int main (int argc, char *argv[])
    {
    int *age = malloc(sizeof(int));
    *age = 30;
    double *salary = malloc(sizeof(double));
    *salary = 12345.67;
    double *myList = malloc(3 * sizeof(double));
    myList[0] = 1.2;
    myList[1] = 2.3;
    myList[2] = 3.4;

    double *twiceSalary = multiplyByTwo(salary);

    printf("double your salary is %.3f\n", *twiceSalary);

    free(age);
    free(salary);
    free(myList);
    free(twiceSalary);

    return 0;
    }
    [/code]

    حالا این سوال پیش میاد که کی از heap استفاده کنیم و کی از stack؟؟؟

    اگر قرار هست به مقدار بزرگی از دیتا برای مدت زمان زیاد دسترسی داشته باشید, باید از heap استفاده کنید. اگر قرار هست که متغییر ها رو به صورت محلی در توابع استفاده کنید باید از stack استفاده کنید.
  3. #3
    2009/09/27
    1,128
    37

    پاسخ : فرق بین حافظه stack و heap توی میکروکنترلرا چیه ؟

    ممنون از توضیحتون.
    من کدی نوشته بودم و حافظه heap براش نزاشته بودم. داخل کد چند تا تابع بود که هر کدوم متغیرهای محلی برای خودشون داشتند. حافظه stack اما تعریف شده بود. اتفاقی که می افتاد این بود که تا یک جای برنامه درست اجرا می شد اما بقیه دیگه اجرا نمی شد.
    مثلا تو یکی از توابع دو تا حلقه for داشتم. وقتی یکی رو حذف می کردم اون یکی کار می کرد و بقیه توابع که فراخونی کرده بودم اجرا می شدند اما اگر یکی از for ها رو پاک نمی کردم و هر دو باقی می موندند دیگه بقیه توابع اجرا نمی شدند مثل این می موند که داخل یک حلقه وایل گیر کرده باشه، اومدم و حافظه heap رو زیاد کردم و برنامه درست اجرا شد.
    ---------
    .
    .
    ...........
  4. #4
    2014/08/28
    210
    4

    پاسخ : فرق بين حافظه stack و heap توي ميکروکنترلرا چيه ؟

    نقل قول نوشته اصلی توسط ajapyy
    ممنون از توضيحتون.
    من کدي نوشته بودم و حافظه heap براش نزاشته بودم. داخل کد چند تا تابع بود که هر کدوم متغيرهاي محلي براي خودشون داشتند. حافظه stack اما تعريف شده بود. اتفاقي که مي افتاد اين بود که تا يک جاي برنامه درست اجرا مي شد اما بقيه ديگه اجرا نمي شد.
    مثلا تو يکي از توابع دو تا حلقه for داشتم. وقتي يکي رو حذف مي کردم اون يکي کار مي کرد و بقيه توابع که فراخوني کرده بودم اجرا مي شدند اما اگر يکي از for ها رو پاک نمي کردم و هر دو باقي مي موندند ديگه بقيه توابع اجرا نمي شدند مثل اين مي موند که داخل يک حلقه وايل گير کرده باشه، اومدم و حافظه heap رو زياد کردم و برنامه درست اجرا شد.
    خب سوالي که ايجاد ميشه اينه که ، شما هيچ متغيري از نوع heap تعريف نکرده بودين که بخاد از اين نوع حافظه استفاده کنه و با کمبود حافظه روبرو بشه !!! بنظرتون واقعا مشکل از حافظه heap ميتونسته باشه ؟؟
    اينکه شما ميگين با زياد کردن حافظه heap مشکل رفع شده يکم عجيبه. در codevision اگه دقت کنين ، بصورت پيش فرض ميزان فضايي که به اين نوع از حافظه در نظر گرفته شده ، 0 هستش .
    اون چيزي که بنظرم ميرسه اينه که نميتونه مشکل از حافظه heap بوده باشه .
    اگه دوستان چيزي بنظرشون ميرسه ، قرار بدن .
    ياعلي مدد
    در کشور هاي غربي انتقال تجربيات و دانش به افراد مبتدي يک پيشرفت محسوب شده و به آن مديريت دانش مي گويند. ولي متاسفانه اين فرهنگ هنوز در کشور ايران رايج نشده است !!!
  5. #5
    2009/09/27
    1,128
    37

    پاسخ : فرق بین حافظه stack و heap توی میکروکنترلرا چیه ؟

    من متغیرهامو رو عادی تعریف کرده بودم. یعنی یک سری محلی و یک سری سراسری. در تعریفشون هم اصطلاح مربوط به malloc رو هم به کار نبرده بودم.
    توی کیل داشتم برنامه می نوشتم و برای آرم. میگم من تغییری توی کد ندادم و فقط حافظه heap رو از تنظیمات زیاد کردم که برنامه درست شد.
    ---------
    .
    .
    ...........
نمایش نتایج: از 1 به 5 از 5

موضوعات مشابه

  1. حافظه heape و stack ؟
    توسط sejil در انجمن میکروکنترلرهای AVR
    پاسخ: 24
    آخرين نوشته: 2015/01/10, 19:38
  2. افزايش حافظه stack در mega32
    توسط electro_fuzzy در انجمن میکروکنترلرهای AVR
    پاسخ: 1
    آخرين نوشته: 2013/03/28, 14:31
  3. حافظه stack میکرو
    توسط چرا ؟ در انجمن میکروکنترلرهای AVR
    پاسخ: 2
    آخرين نوشته: 2010/10/13, 23:24
  4. بحث در مورد Heap &Stack
    توسط shahinbahari در انجمن میکروکنترلرهای AVR
    پاسخ: 12
    آخرين نوشته: 2010/08/21, 22:16
  5. HW Stack & Data Stack (Soft Stack) on AVR
    توسط mhheydarchi در انجمن میکروکنترلرهای AVR
    پاسخ: 8
    آخرين نوشته: 2009/08/20, 14:59

کلمات کلیدی این موضوع

علاقه مندي ها (Bookmarks)

علاقه مندي ها (Bookmarks)

مجوز های ارسال و ویرایش

  • شما نمیتوانید موضوع جدیدی ارسال کنید
  • شما امکان ارسال پاسخ را ندارید
  • شما نمیتوانید فایل پیوست کنید.
  • شما نمیتوانید پست های خود را ویرایش کنید
  •