اطلاعیه

Collapse
No announcement yet.

حافظه heape و stack ؟

Collapse
X
 
  • فیلتر
  • زمان
  • Show
Clear All
new posts

    حافظه heape و stack ؟

    سلام
    دوستان میشه بگین به کدوم قسمت از حافظه ی RAM ، حافظه ی heape و به کدوم قسمتش حافظه ی stack گفته میشه؟
    این دو قسمت چه تفاوتی با هم دارن ؟
    میزان حافظه ی هر کدوم چقدره و اینکه میشه میزان حافظه هایی که بهشون اختصاص داده میشه رو تغییر داد؟
    اگه ممکنه با ذکر یه مثال ساده توضیح بدین
    ممنون
    در کشور هاي غربي انتقال تجربيات و دانش به افراد مبتدي يک پيشرفت محسوب شده و به آن مديريت دانش مي گويند. ولي متاسفانه اين فرهنگ هنوز در کشور ايران رايج نشده است !!!

    #2
    پاسخ : حافظه heape و stack ؟

    دوستان کسی نیست جواب بده؟
    در کشور هاي غربي انتقال تجربيات و دانش به افراد مبتدي يک پيشرفت محسوب شده و به آن مديريت دانش مي گويند. ولي متاسفانه اين فرهنگ هنوز در کشور ايران رايج نشده است !!!

    دیدگاه


      #3
      پاسخ : حافظه heape و stack ؟

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

      دیدگاه


        #4
        پاسخ : حافظه heape و stack ؟

        نوشته اصلی توسط esisafa
        حافظه stack به قسمتی میگن که متغیرهای توابع فراخوانی شده در اونجا ایجاد میشن و بعد از اتمام تابع پاک میشن.
        حافظه heap هم همیشه کاربرد نداره و البته دقیقا یادم نیست. فکر کنم در مواقعی که با دستورات تخصیص حافظه کار میکنیم کاربرد پیدا میکنه.
        مهندس اون چیزایی که من فهمیدم اینه :
        اقا ما یه حافظه RAM داریم (1)
        وقتی تو برنامه متغیرهایی رو تعریف میکنیم ، هنگام کامپایل اون فضاهایی رو که نیاز دارن رو بر میدارن (2)
        heap همونطور که گفتی زمانی که با استفاده از دستورات تخصیص فضا کار میکنیم میتونیم بهش دسترسی پیدا کنیم(3)
        :question: خب این فضا دقیقه چند بایته رو میکرو و چجوری میشه فهمید؟ وچجوری میشه مقدارشو تغییر داد؟ :arrow:
        stack رو خب همه میگن فضا و هنوز درک درستی ازش ندارم و . stack ینی مابقی فضای RAM?
        دوستان کمک کنن
        در کشور هاي غربي انتقال تجربيات و دانش به افراد مبتدي يک پيشرفت محسوب شده و به آن مديريت دانش مي گويند. ولي متاسفانه اين فرهنگ هنوز در کشور ايران رايج نشده است !!!

        دیدگاه


          #5
          پاسخ : حافظه heape و stack ؟

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

          دیدگاه


            #6
            پاسخ : حافظه heape و stack ؟

            حافظه stack از انتها و آخرین آدرس رم شروع میشه و به سمت آدرس پایین تر رشد میکنه...تمام اطلاعات موقتی که در وسط برنامه قرار هست دخیره بشه در حافظه stack قرار میگیره...برای کار کردن با استک در زبان اسمبلی از دستورات push و pull استفاده میشه...یک رجیستر به نام stack pointer مسئول نگه داری آخرین مکان استفاده شده در استک(که البته استک هم قسمتی از Sram هست)هست...
            در واقع وقتی میکروکنترلر شروع به کار میکنه خط به خط برنامه رو اجرا میکنه و با هر بار پرش به خط بعد برنامه آدرس اون خط ار برنامه در رجیستر Program Counter دخیره میشه...حالا تصور کنید در وسط برنامه قراره که یک متد فراخوانی بشه...مقدار فعلی Program Counter به stack کپی میشه و میکرو کنترلر میره سراغ متد و دستورات داخل اون رو اجرا میکنه ...در این بین هرجا که قرار باشه متغیری از نوع غیر static تعریف بشه ، اون متغیر جاش توی stack هست...
            با هر بار قرار گیری یک دیتای جدید در استک مقدار رجیستر stack pointerهم تغییر میکنه...در واقع با push و pull کردن دیتای جدید در استک قرار میدیدم یا دیتای آخری رو از اون میخونیم...پس از خونده شدن از استک دوباره رجیستر program counter یک واحد کم میشه و فضای اشغال شده آزاد میشه...
            در واقع میتونید استک رو به صورت تعدادی بشقاب که روی هم قرا میگیرند تصور کنید...بشقاب ها یکی یکی برداشته و یا اضافه میشه و امکان برداشتن بشقاب از ردیف های پایین تر ممکن نیست...
            مواردی که گفتم رو میتونید با simulator نرم افزار atmel studio بررسی کنید
            موفق باشید
            تولید کننده تجهیزات برنامه پذیر اتوماسیون صنعتی

            www.intelart.ir


            ساخت کنترلر دما PID فازي با AVR [آموزشی]

            دیدگاه


              #7
              پاسخ : حافظه heape و stack ؟

              نوشته اصلی توسط punisher.x64
              حافظه stack از انتها و آخرین آدرس رم شروع میشه و به سمت آدرس پایین تر رشد میکنه...تمام اطلاعات موقتی که در وسط برنامه قرار هست دخیره بشه در حافظه stack قرار میگیره...برای کار کردن با استک در زبان اسمبلی از دستورات push و pull استفاده میشه...یک رجیستر به نام stack pointer مسئول نگه داری آخرین مکان استفاده شده در استک(که البته استک هم قسمتی از Sram هست)هست...
              در واقع وقتی میکروکنترلر شروع به کار میکنه خط به خط برنامه رو اجرا میکنه و با هر بار پرش به خط بعد برنامه آدرس اون خط ار برنامه در رجیستر Program Counter دخیره میشه...حالا تصور کنید در وسط برنامه قراره که یک متد فراخوانی بشه...مقدار فعلی Program Counter به stack کپی میشه و میکرو کنترلر میره سراغ متد و دستورات داخل اون رو اجرا میکنه ...در این بین هرجا که قرار باشه متغیری از نوع غیر static تعریف بشه ، اون متغیر جاش توی stack هست...
              با هر بار قرار گیری یک دیتای جدید در استک مقدار رجیستر stack pointerهم تغییر میکنه...در واقع با push و pull کردن دیتای جدید در استک قرار میدیدم یا دیتای آخری رو از اون میخونیم...پس از خونده شدن از استک دوباره رجیستر program counter یک واحد کم میشه و فضای اشغال شده آزاد میشه...
              در واقع میتونید استک رو به صورت تعدادی بشقاب که روی هم قرا میگیرند تصور کنید...بشقاب ها یکی یکی برداشته و یا اضافه میشه و امکان برداشتن بشقاب از ردیف های پایین تر ممکن نیست...
              مواردی که گفتم رو میتونید با simulator نرم افزار atmel studio بررسی کنید
              موفق باشید
              با این حساب تکلیف حافظه ی heap چی میشه؟
              در کشور هاي غربي انتقال تجربيات و دانش به افراد مبتدي يک پيشرفت محسوب شده و به آن مديريت دانش مي گويند. ولي متاسفانه اين فرهنگ هنوز در کشور ايران رايج نشده است !!!

              دیدگاه


                #8
                پاسخ : حافظه heape و stack ؟

                متاسفانه در مورد heap اطلاعاتم کامل نیست...تا به حال بهش نیاز پیدا نکردم....
                تولید کننده تجهیزات برنامه پذیر اتوماسیون صنعتی

                www.intelart.ir


                ساخت کنترلر دما PID فازي با AVR [آموزشی]

                دیدگاه


                  #9
                  پاسخ : حافظه heape و stack ؟

                  حافظه ی استک قسمتی از رم هست که متغیر های موقت و متغیر هایی که در حین اجرای توابع و خود توابع و اشیاء ایجاد میشن رو نگه میداره و با خارج شدن از تابع اتوماتیک اون حافظه هم از استک ازاد میشه ! ولی حافظه ی هیپ حافظه ای هست که این مدیریت ازاد سازی اوتوماتیک رو نداره و اگر هر متغیری در این قسمت ایجاد کنید (برنامه نویس) باید توجه کنه که در انتها حافظه رو آزاد کنه چون اگر آزاد نکنه رم سیستم اشغال میشه چون اتوماتیک مثل خروج از توابع حافظه ی متغیر ها آزاد نمیشه و رم کم بیاد!
                  در واقع استک بسته به سیستم و کامپایلر و زبان متفاوت هست ولی هیپ رو میتونید کل قسمت آزاد رم رو منهای فضای استک در نظر بگیرید

                  دیدگاه


                    #10
                    پاسخ : حافظه heape و stack ؟

                    نوشته اصلی توسط voyager2020
                    حافظه ی استک قسمتی از رم هست که متغیر های موقت و متغیر هایی که در حین اجرای توابع و خود توابع و اشیاء ایجاد میشن رو نگه میداره و با خارج شدن از تابع اتوماتیک اون حافظه هم از استک ازاد میشه ! ولی حافظه ی هیپ حافظه ای هست که این مدیریت ازاد سازی اوتوماتیک رو نداره و اگر هر متغیری در این قسمت ایجاد کنید (برنامه نویس) باید توجه کنه که در انتها حافظه رو آزاد کنه چون اگر آزاد نکنه رم سیستم اشغال میشه چون اتوماتیک مثل خروج از توابع حافظه ی متغیر ها آزاد نمیشه و رم کم بیاد!
                    در واقع استک بسته به سیستم و کامپایلر و زبان متفاوت هست ولی هیپ رو میتونید کل قسمت آزاد رم رو منهای فضای استک در نظر بگیرید
                    او چیزی که متوجه شدم اینه متغیرهایی که در برنامه تعریف میشن یه فضایی رو اشغال میکنن .
                    اون چیزی که باقی میمونه یه قسمتش حافظه ی استک که همیشه یه مقدار ثابتیه و مابقی در اختیار حافظه ی هیپه . درسته؟
                    مهندس امکانش هست این فضاها را برای avr مثلا atmega8 و برای arm مثلا lpc1768 بگین چجوریه و چجوری تنظیم میشه
                    زبان C برای هر دو و کامپایلرم codevisin و keil باشه
                    لطف میکنین جواب بدین
                    یاعلی مدد
                    در کشور هاي غربي انتقال تجربيات و دانش به افراد مبتدي يک پيشرفت محسوب شده و به آن مديريت دانش مي گويند. ولي متاسفانه اين فرهنگ هنوز در کشور ايران رايج نشده است !!!

                    دیدگاه


                      #11
                      پاسخ : حافظه heape و stack ؟

                      تقریبا درسته
                      متغیر هایی که با کلمه ی new تخصیص داده میشه از هیپ حافظه میگیره که "فضای ازاد رم منهای استک" هست!
                      حافظه ی استک لایفو هست یعنی لست این فرست اوت!
                      در این لینک در مورد ای وی ار توضیح داده -برای اطلاعات بیشتر به فایلهای مموری مپ هر میکرو نگاه بنداز
                      http://www.avr-tutorials.com/general/avr-microcontroller-stack-operation-and-stack-pointer
                      و در مورد 1769
                      http://svnmios.midibox.org/filedetails.php?repname=svn.mios32&path=%2Ftru nk%2Fetc%2Fld%2FLPC17xx%2FLPC1769.ld&rev=1185

                      دیدگاه


                        #12
                        پاسخ : حافظه heape و stack ؟

                        من یه بار با RTC خود میکرو کار کردم و توی خود زیر برنامه می بردمش توی مد خواب !!!
                        مدار خوب کار میکرد تا اینکه بعد از یه 20 ثانیه ای مدار ریست میشد !!!
                        گفتم خدایا چرا اینجوری شده ... رفتم حافظه استک رو بیشتر کردم دیدم زمانش بیشتر شد ولی باز هم ریست میکنه ...
                        فهمیدم که حافظه استک سر ریز میشه و میکرو ریست میکنه ...
                        یه سوال
                        اگر بخواهیم با این روش میکرو را ببریم توی مد خواب باید چیکار کنیم که حافظه استک مربوط به زیر برنامه (روتین سر ریز تایمر 2 )پاک بشه ؟؟
                        [b]چگونه همه پایه های میکروکنترلر AVR را PWM کنیم؟
                        معرفی نرم افزارEasy 7segment (برای راه اندازی آسانتر 7segment )
                        معرفی نرم افزار Codewizard PWM
                        با من بیشتر آشنا شوید

                        دیدگاه


                          #13
                          پاسخ : حافظه heape و stack ؟

                          براون اوت رو هم غیر فعال کرده بودید؟

                          دیدگاه


                            #14
                            پاسخ : حافظه heape و stack ؟

                            نوشته اصلی توسط voyager2020
                            براون اوت رو هم غیر فعال کرده بودید؟
                            فیوزبیتها همگی به صورت پیشفرض کارخانه ای بوده ...
                            که در این صورت غیر فعال بوده ...
                            رفتم یه حلقه while نوشتم و بردمش توی مد خواب و مشکل بر طرف شد ولی من میخواستم جهت اطلاعات بیشتر بدونم باید چیکار کنم که خودم به صورت دستی حافظه استک اون قسمت را پاک کنم ...
                            [b]چگونه همه پایه های میکروکنترلر AVR را PWM کنیم؟
                            معرفی نرم افزارEasy 7segment (برای راه اندازی آسانتر 7segment )
                            معرفی نرم افزار Codewizard PWM
                            با من بیشتر آشنا شوید

                            دیدگاه


                              #15
                              پاسخ : حافظه heape و stack ؟

                              نوشته اصلی توسط سامان اسدی
                              رفتم حافظه استک رو بیشتر کردم دیدم زمانش بیشتر شد ولی باز هم ریست میکنه ...
                              مهندس مگه حافظه استک مقدار حافظه ثابتی نیست؟
                              در کشور هاي غربي انتقال تجربيات و دانش به افراد مبتدي يک پيشرفت محسوب شده و به آن مديريت دانش مي گويند. ولي متاسفانه اين فرهنگ هنوز در کشور ايران رايج نشده است !!!

                              دیدگاه

                              لطفا صبر کنید...
                              X