اطلاعیه

Collapse
No announcement yet.

حافظه heape و stack ؟

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

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

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

    دیدگاه


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

      این مشکل ظاهرا مشکل معروفی هست و فقط مربوط به اتمل نیست - علت هم پایین اومدن ولتاژ میکرو هست و به استک مربوط نیست ظاهرا - چون خیلی ها در حالت اسلیپ و مد rtc این مشکل رو داشتن
      پاک کردن استک به صورت کلی بعید میدونم بشه ولی همونطوری که میدونی لایفو هست یعنی فقط به اخرین مقدار دسترسی داریو بعد به قبلی! البته دقیق نمیدونم چی میشه اگر این کار هم بکنید :smile:

      دیدگاه


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

        نوشته اصلی توسط voyager2020
        این مشکل ظاهرا مشکل معروفی هست و فقط مربوط به اتمل نیست - علت هم پایین اومدن ولتاژ میکرو هست و به استک مربوط نیست ظاهرا - چون خیلی ها در حالت اسلیپ و مد rtc این مشکل رو داشتن
        پاک کردن استک به صورت کلی بعید میدونم بشه ولی همونطوری که میدونی لایفو هست یعنی فقط به اخرین مقدار دسترسی داریو بعد به قبلی!
        موقعی که برنامه را به این صورت بنویسی
        کد:
        interrupt [TIM2_OVF] void timer2_ovf_isr(void)
        {  
          if(++S == 60)
          {
            S=0;
            if(++M == 60)
            {
              M=0;
              if(++H == 24)H=0;
            }    
          }
          powersave();
        }
        خوب مسلما موقعی که داره زیر برنامه را اجرا میکنه و در حین کار بره توی مد خواب و دوباره از مد خواب بیاد بیرون و دوباره این زیر برنامه اجرا میشه ... باید به طور قانونی از زیر برنامه خارج بشی بعدا بری توی مد خواب ... ولی از اونجایی که من برنامه را اینطوری نوشته بودم حافظه استک پر میشد و به اصطلاح سر ریز میشه ...
        ولتاژ میکرو هم کاملا ثابت بوده و دقیقا همین برنامه را توی پروتئوس هم امتحان کردم و دقیقا در عمل هیچ تفاوتی نداشت ...
        پس نتیجه میگیریم که حافظه استک از حد خودش بیشتر شده که در این صورت میکروکنترلر مجبور هست خودش را ریست کنه ...
        [b]چگونه همه پایه های میکروکنترلر AVR را PWM کنیم؟
        معرفی نرم افزارEasy 7segment (برای راه اندازی آسانتر 7segment )
        معرفی نرم افزار Codewizard PWM
        با من بیشتر آشنا شوید

        دیدگاه


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

          این قضیه فکر نکنم به سرریز شدن استک ربط داشته باشه
          اصلا استک چیزی نیست که سرریز بشه
          شما باید ببینی تو مد خواب چه جاهایی از میکرو برقش قطع میشه که بعد از روشن شدن مقدارش صفر است
          و یا به احتمال زیاد مشکل از پروگرم کانتر است که مقداری ناخواسته براش پیش اومده که بعد از بیداری میکرو اجبارا رست میشود
          اگر تمام موارد بالارو به دقت بررسی کردی و به نتیجه نرسیدی میتونی به عنوان ی باگ در AT مگا محسوبش کنی
          در ضمن دوستان در جریان باشند توابعی مانند puts رم اشغال شده رو از استک استفاده میکنه و جایگزین کردنش با putsf میتونه به کم کردن میزان استفاده از رم کمک کند
          در ضمن فکر نمیکنم متغییر های درون استک دوباره بازیابی بشوند برای کارهای دیگر، چون دقیقا محاسبه شده توسط کامپایلر و فضا اشغال میکنند از استک
          هرچه سعی کنیم لایه های نرم افزاری زیاد کرده و از سخت افزار دور کنیم مشکلات(باگ ها) کمتر خواهد شد(امنیت بیشتری خواهید داشت)
          بهترین جواب دهنده برای سوال شما، خود شما هستید البته بعد تلاش،پشتکار و مطالعه بیشتر
          میدونی مشکل ما کجاست؟سرمایه و مغز ها رو نمیتونیم یکجا جمع کنیم...

          تعدادی ماژول GPS GP5MX1513F1 با بالاتریت حساسیت -170db به قیمت خرید بفروش میرسد

          دیدگاه


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

            تو نت دیده بودم همین مشکل در استفاده از rtc در مد اسلیپ وجود داشته و گفته بودن علتش ممکنه از براون اوت باشه! یعنی با فعال کردنش حل شده و با این مشکل درگیر نبودم البته میگفت چند پیج از حافظه ی فلش هم میپریده!

            دیدگاه


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

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

              دیدگاه


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

                در صورتی که با نگاه کردن به کد اسمبلی حاصل از کامپایلرتون ( صرفنظر از اینکه bascom باشه یا codevision یا هر کامپایلر دیگری و به شرطی که کد اسمبلی نهایی رو در اختیار شما قرار بده ) بتونید متوجه بشید که در کدام قسمت برنامه مقادیری در حافظه پشته قرار داده میشه و در کدام قسمت از اون برداشته میشه میتونید در قسمت مربوطه از برنامتون با استفاده از رهنمون های استفاده از کد اسمبلی در بین برنامه زبان سطح بالا مستقیما اون قسمت تنها با چند خط کد اسمبلی تغییر بدید یا حذف کنید اما باید با گاهی قبلی اینکار انجام بشه چون عواقبش گردن خودتون هست و کامپایلر دخالتی در کد اسمبلی ای که شما نوشتید نداره.
                جناب اسدی عزیز همونطور که میدونید کامپایلر زمان ورود به روتین وقفه پرچم سراسری رو غیر فعال میکنه به همین خاطر همیشه توصیه میشه که روتین وقفه رو خیلی کوتاه نوشته بشه و حتی الامکان در روتین وقفه کمتر توابع و سابروتین استفاده بشه. حالا با توجه به اینکه این موارد مهم هست طبیعی هست که زمانی که توی روتین وقفه ای میکرو رو به حالت استندبای ببرید در هر کامپایلری مشکلاتی ممکن هست پیش بیاد. متاسفانه چند سال هست که AVR ها رو با اسمبلی برنامه ریزی نکردم و آمادگی نوشتن نمونه برنامه ترکیبی ندارم اما دوستانی که در حال حاضر همزمان به زبان اسمبلی و یکی از زبان های سطح بالا مسلط هستند خیلی راحت میتونند برنامه ای بنویسند که نشون بده چطور میشه با استفاده از زبان اسمبلی در بین زبان بیسیک یا سی کنترل مسیر اجرای برنامه و مقادیر متغییرها رو تحت تاثیر قرار داد.
                از آنجا که گاهی فرصت بازخوانی پست نیست، بابت غلط های املایی و نگارشی احتمالی معذرت میخوام.
                هیچیک از پاسخ هایی که میدم را کاملا تایید نمیکنم و ممکن هست اشتباه کرده باشم، اگر من به نوشته ام مطمئن هستم شما مشکوک باشید.
                اگر در حل مشکل من کمک کردید و دکمه تشکر رو نزدم حتما فراموش کردم کوچکترین کمک شما برایم ارزشمند است!
                اگر به هر طریقی از من ناراحت شدید حتما با یک پیام خصوصی تذکر بدهید تا مشکل رو حل کنیم و رابطه ی صمیمانه، پایدار بماند.
                شاد و موفق باشید

                دیدگاه


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

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

                  دیدگاه


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

                    با عرض معذرت همونطور که گفتم متاسفانه مدت زیادی هست که برنامه به زبان اسمبلی ننوشتم و باهاش سر و کار نداشتم اما تا اونجا که بتونم چشم، امیدوارم اطلاعات اشتباه ندم و از دوستانی که در این زمینه واقعا اطلاع دارند و در حال حاضر تسلط کافی دارند میخوام اگر ایرادی هست اصلاح کنند، مخصوصا جناب کی نژاد عزیز که فکر می کنم همچنان به اسمبلی AVR تسلط دارند و مدیر بخش هم هستند.
                    در برنامه های اسمبلی شما کدهایی مثل این رو میبینید:
                    کد:
                    .INCLUDE	"M8DEF.INC"
                    .ORG			$0
                    START:
                    		LDI		R16,HIGH(RAMEND)		;\
                    		OUT		SPH,R16					;\\
                    		LDI		R16,LOW(RAMEND)			;\\\
                    		OUT		SPL,R16					;\\\\-
                    		SER		R16						;////- TANZIME POSHTE
                    		OUT		DDRB,R16				;///
                    بعد از start کدهایی که نوشته شده مربوط به تنظیم پشته هست ( به زبان اسمبلی ) واژه RAMEND به این موضوع اشاره داره که آدرسی که در حال حاضر داره درون پشته قرار میگیره آخرین آدرس از حافظه داده میکرو مگا 8 هست، یعنی مقادیر پشته در این فضاها قرار میگیرند، طبیعتا این قسمت از حافظه با دستورات معمول قابل دسترسی نیستند اما شما میتوانید با دستورات اسمبلی مثل STS و LDS که آدرس دهی 16 بیتی دارند مستقیما در این فضاها مقادیر رو بنویسید و بخوانید. متاسفانه در حال حاضر اونقدر حضور ذهن ندارم که بتونم نمونه برنامه مطمئنی براتون بنویسم و همینی هم که نوشتم ممکنه یکسری قواعد زیر پا گذاشته باشه، اگر دوستان دیگه در این مورد فرصت نکردند و توضیحات تکمیلی و روشنی ارایه ندادند من برنامه های قدیم رو مرور میکنم و میام بیشتر توضیح میدم.
                    از آنجا که گاهی فرصت بازخوانی پست نیست، بابت غلط های املایی و نگارشی احتمالی معذرت میخوام.
                    هیچیک از پاسخ هایی که میدم را کاملا تایید نمیکنم و ممکن هست اشتباه کرده باشم، اگر من به نوشته ام مطمئن هستم شما مشکوک باشید.
                    اگر در حل مشکل من کمک کردید و دکمه تشکر رو نزدم حتما فراموش کردم کوچکترین کمک شما برایم ارزشمند است!
                    اگر به هر طریقی از من ناراحت شدید حتما با یک پیام خصوصی تذکر بدهید تا مشکل رو حل کنیم و رابطه ی صمیمانه، پایدار بماند.
                    شاد و موفق باشید

                    دیدگاه


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

                      وقت بخیر

                      همان طور که دوست عزیز آقای study فرمودند با ترکیب کد اسمبلی و سی میتوان این کارو کرد !!
                      روش اون هم اینه که یک فانکشن به زبان سی مینویسیم و در اون با کد اسمبلی اول مقدار اولیه stack pointer رو میدیم .سپس به جایی که میخواهیم بعد از بازگشت از زیر برنامه پروسسور بره رو داخل stack pointer , دستور pop رو انجام میدیم !!
                      خوب اینطوری استک پوینتر مقدار اولیه رو گرفته و آدرس برگشتشم داخلی استک پاپ شده ! و با اولین دستور return به آدرسمون رفته و دستورو اجرا میکنه !!

                      دیدگاه

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