ايران ويج

نسخه‌ی کامل: KEIL UVISION + STACK SIZE
شما در حال مشاهده‌ی نسخه‌ی متنی این صفحه می‌باشید. مشاهده‌ی نسخه‌ی کامل با قالب بندی مناسب.
سلام
سعی کردم عنوان تاپیک مبهم نباشه

1. استک سایز چیه؟
زبان های c و ++C هر دو از stack استفاده میکنن
برای مثال کاربرد stack این چنینه:

* آدرس بازگشت از تابع
*متغیر های محلی و آرایه ها و structure و union ها و در ++C کلاس ها


2.فرق Heap و Stack چیه؟
بطور خیلی خلاصه، heap به اصطلاح به محدوده ای گفته میشه که آرایه های با ابعاد متغیر که با توابعی مثل mAlloc ، تولید میشن، درش ذخیره میشه.
اگه در برنامه تون، آرایه ی دینامیکی ندارین، میتونید Heap Size رو صفر در نظر بگیرید.

3.چه لزومی داره در مورد Stack و سایزش، دقت کرد؟Biggrin

اگه پروژه ای که نوشتین، با گذشت زمان، حجیم تر شه و متغیر و آرایه و توابع تو در توی زیادی داشته باشه، و همچنین از وقفه ها و توابع کنترل کننده ی وقفه ؛ متغیر های static زیادی استفاده کرده باشید؛ کم کم مشکل سایز استک، نمایان میشه.

4. از کجا بدونیم مشکل برنامه مون، مربوط به سایز stack هستش؟

طبق تجربه ای که داشتم:
1. اگه آرایه های خیلی بزرگ تعریف کنید که sram جا نشه، خود کامپایلر بهتون error میده
2. اگه توابع تو در توی خیلی زیادی داشته باشید، و سایز stack کم باشه، کامپایلر اخطار و error نمیده؛ و حین اجرای برنامه(روی میکرو)، میکرو هنگ میکنه و به یکی از handler هایی که توی فایل startup (مثلا فایل های استاندارد استارت آپ keil مثل startup_sam7x.s ) تعریف شده، پرش میکنه.
این مشکل رو با دیباگ کردن برنامه روی خود میکرو به کمک jlink و ... میشه تشخیص داد
3. اگه از وقفه استفاده میکنید و تابع کنترل کننده ی وقفه، خیلی حجیم باشه و به زیر تابع های زیادی ارجاع داشته باشه، موقع رخ دادن وقفه، برنامه هنگ میکنه. تشخیص دادن این بستگی به برنامه و نوع وقفه تون داره. و یجورایی شاید بشه از همون دیباگ کردن فهمید.
4-....

5.چطوری میشه سایز مناسبی رو برای stack تعریف کرد و کجا باید تغییرش داد؟

با اتمل sam7s و sam7x که تست کردم، توی keil، همون فایل startup.s به GUI اش برید و اونجا بالا، stack size رو انتخاب کنید تا باز بشه

برای پیشبینی سایز استک، به project options برید، تب Linker، اینو اون پایین در قسمت تنظیمات تایپ کنید:
کد php:
--info=summarystack 
بعد یه بار کامپایل کنید، برید به فولدر پروژه، دنبال فایلی با پسوند map.* باشید.

فایل رو با نوت پد++ یا هربرنامه ای باز کنید.

توی متن، دنبال کلمه ی stack بگردید،
سایز Stack مصرفی هر تابع رو اونجا درج کرده
حدس زدن سایز مورد نیاز کار سختیه
چون شدیدا به ساختار برنامه بستگی داره
ولی اگه برنامه از تابع main شروع بشه و وقفه اینا نداشته باشه، سایز مصرفی (بایت) تابع main مینونه راهنمای خوبی برای تصمیم گیری در مورد stack size باشه.