اطلاعیه

Collapse
No announcement yet.

فرق پشته با رم میکرو چیه

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

    فرق پشته با رم میکرو چیه

    میدونم تو AVR پشته قسمتی از رم است
    و میدونم متغییر های محلی تو پشته میره
    اما میخوام بدونم چرا تو پشته میره
    و یا اصلا چرا پشته ایجاد شده
    رم نمی تونی متغییر های محلی رو جایبده
    و در اخر من برنامه ای نوشتم تو مگا 32و متغییر محلیم زیاد بود کدویژن پیغام مبنی بر افزایش داده و من از config زیاد کردم
    و حال برنامه رو میخوام روی یک مگا 8 پورت کنم دیگه نمی تونم پشته رو زیاد کنم و خطا میده
    و در نهایت چاره؟
    هرچه سعی کنیم لایه های نرم افزاری زیاد کرده و از سخت افزار دور کنیم مشکلات(باگ ها) کمتر خواهد شد(امنیت بیشتری خواهید داشت)
    بهترین جواب دهنده برای سوال شما، خود شما هستید البته بعد تلاش،پشتکار و مطالعه بیشتر
    میدونی مشکل ما کجاست؟سرمایه و مغز ها رو نمیتونیم یکجا جمع کنیم...

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

    #2
    پاسخ : فرق پشته با رم میکرو چیه

    اول خوندم پشه! :biggrin:

    ببین پشته سریع ترین و منظم ترین حالتیه که میشه ramآ‌رو آدرس دهی کرد! در واقع یه فرمته یه استاندارده نه یه مکان

    دیدگاه


      #3
      پاسخ : فرق پشته با رم میکرو چیه

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

      دیدگاه


        #4
        پاسخ : فرق پشته با رم میکرو چیه

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

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

        دیدگاه


          #5
          پاسخ : فرق پشته با رم میکرو چیه

          در میکروهای avr یک باگ وجود داره که معمولا باهاش برخورد نمیکنیم. این باگ باعث میشه وقتی که وقفه ای رخ میده اگه رم بیرونی استفاده شده باشه و آدرس پشته روی اون رم بیرونی قرار گرفته باشه میکرو در حین برگشت از روال وقفه آدرسش رو گم کنه. برای رفع این مشکل بعضی کامپایلر ها مثل codevision اومدن و دو فضای پشته تعریف کردن. یکی برای ذخیره مقادیر واسطه و متغیر های محلی که خیلی زیاد هم هست و بهش پشته نرم افزاری میگن. و یکی هم که عمدتا احتیاج نیست حجم بالایی داشته باشه و بهش پشته سخت افزاری میگن. این پشته آدرس های برگشت رو نگهداری میکنه و آدرس اش هم در SP نگهداری میشه ولی نرم افزاری در ثبات Y نگهداری میشه.

          این یه نمونه کده که توسط codevision تولید شده:


          ; 53
          ; 54 void main(void)
          ; 55 {
          _main:
          ; 56 ushort amount;
          ; 57 byte state;
          ; 58 char s[10];
          ; 59 int n;
          ; 60
          ; 61 hw_init();
          00006d 972a SBIW R28,10
          ; amount -> R16,R17
          ; state -> R18
          ; s -> Y+0
          ; n -> R19,R20


          در ورود به تابع با دستور sbiw 10 بایت از پشته نرم افزاری برای ذخیره آرایه s گرفته شده. ولی طبق معمول آدرس برگشت در پشته سخت افزاری ذخیره شده.

          یا مثلا اینو میدونین که در ابتدا و انتهای روال وقفه رجیستر های مورد استفاده بایستی ذخیره و در آخر بازیابی بشن. در codevision دو کد زیر استفاده شده:


          __SAVEISR:
          0004b7 920a ST -Y,R0
          0004b8 921a ST -Y,R1
          0004b9 92fa ST -Y,R15
          0004ba 936a ST -Y,R22
          0004bb 937a ST -Y,R23
          0004bc 938a ST -Y,R24
          0004bd 939a ST -Y,R25
          0004be 93aa ST -Y,R26
          0004bf 93ba ST -Y,R27
          0004c0 93ea ST -Y,R30
          0004c1 93fa ST -Y,R31
          0004c2 b60f IN R0,SREG
          0004c3 920a ST -Y,R0
          0004c4 9508 RET

          __LOADISR:
          0004c5 9009 LD R0,Y+
          0004c6 be0f OUT SREG,R0
          0004c7 91f9 LD R31,Y+
          0004c8 91e9 LD R30,Y+
          0004c9 91b9 LD R27,Y+
          0004ca 91a9 LD R26,Y+
          0004cb 9199 LD R25,Y+
          0004cc 9189 LD R24,Y+
          0004cd 9179 LD R23,Y+
          0004ce 9169 LD R22,Y+
          0004cf 90f9 LD R15,Y+
          0004d0 9019 LD R1,Y+
          0004d1 9009 LD R0,Y+
          0004d2 9508 RET


          اگه دقت کنین میبینین که مقادیر رجیستر ها در محدوده ای از حافظه که توسط ثبات Y بهشون دسترسی پیدا میشه ذخیره و از اونجا هم بازیابی میشن. و طبق معمول از دستورات push و pop استفاده نشده.
          این هم ابتدای روال وقفه:


          ; 144 // Timer 0 overflow interrupt service routine
          ; 145 interrupt [TIM0_OVF] void timer0_ovf_isr(void)
          ; 146 {
          _timer0_ovf_isr:
          000115 d3a1 RCALL __SAVEISR
          ; 147 byte c;
          ; 148
          ; 149 TCNT0=0xFE; // Reinitialize Timer 0 value
          000116 930a ST -Y,R16
          ; c -> R16

          دیدگاه

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