PDA

توجه ! این یک نسخه آرشیو شده میباشد و در این حالت شما عکسی را مشاهده نمیکنید برای مشاهده کامل متن و عکسها بر روی لینک مقابل کلیک کنید : حلقه بی نهایت برنامه در استارت آپ keil



gangi
23-03-2011, 11:40
با سلام
ضمن تبريک سال نو.

برای برد مبتنی بر at91sam7x256

در keil ک.ر.ک شده ورژن 402 و 412 و الان 420 برنامه هاي تست چشمکزن و پالس مربعي روي پايه ها کار مي کنند.
در ديباگ نيز شبيه سازي درست انجام مي شود.(بدون اينکه در کد sam7.s گير کند ، وارد برنامه اصلي کد C و main مي شود.)

اما حجم برنامه من به بيش از 80 کيلو بايت رسيده ، و برنامه روي سخت افزار اجرا نمي شود،
در شبيه ساز (ديباگ) مشاهده مي شود که برنامه در اين قسمت از startup :
sam7.s
گرفتار شده است(در خط سوم اين کدها - با اجرا توسط کليد تک پله اي : F11):



IMPORT __main
LDR R0, =__main
BX R0


دوستان گرامي، آيا به اين مسئله برخورد داشته ايد؟

اين دو پاسخ هم در سايت keil کمکي نکرد!

You can see links before reply




Vectors LDR PC,Reset_Addr
LDR PC,Undef_Addr
LDR PC,SWI_Addr
LDR PC,PAbt_Addr
LDR PC,DAbt_Addr
NOP ; Reserved Vector
; LDR PC,IRQ_Addr
LDR PC,[PC,#-0xF20] ; Vector From AIC_IVR
; LDR PC,FIQ_Addr
LDR PC,[PC,#-0xF20] ; Vector From AIC_FVR


Reset_Addr DCD Reset_Handler
Undef_Addr DCD Undef_Handler
SWI_Addr DCD SWI_Handler
PAbt_Addr DCD PAbt_Handler
DAbt_Addr DCD DAbt_Handler
DCD 0 ; Reserved Address
IRQ_Addr DCD IRQ_Handler
FIQ_Addr DCD FIQ_Handler

Undef_Handler B Undef_Handler

SWI_Handler B SWI_Handler اين خط هم موقع استاپ (ديباگ) : محلي است که توقف نشان داده مي شود.

PAbt_Handler B PAbt_Handler
DAbt_Handler B DAbt_Handler
IRQ_Handler B IRQ_Handler
FIQ_Handler B FIQ_Handler



در کدهای بالا ، لوپهای بی نهایت برای handler ها تشکیل شده،
سئوال دیگر: برنامه به چه دلایلی به کدهای فوق پرش می کند؟

با سپاس

پ.ن: این پست در سایت همسایه هم ارسال شده ، به دلیل گرفتاری احتمالی دوستان در startup
در اینجا هم ارایه شده تا پاسخ ها به عنوان راهنمایی به هر دو جا منتقل شود .

kavir
23-03-2011, 13:31
سلام
لطفا برنامه ای که میگید مشکل داره به صورت کامل اینجا بذارید تا بررسی بشه

gangi
25-03-2011, 22:11
سلام
لطفا برنامه ای که میگید مشکل داره به صورت کامل اینجا بذارید تا بررسی بشه

با سلام
برنامه متعلق به یک سازمان است و با عرض پوزش مجاز به ارایه آن نیستم.

فروم هاي سايت keil را دارم مطالعه مي کنم براي بررسي و رفع مشکل.
فعلا با تيک زدن use micro lib در options برنامه از مشکل فوق عبور کرده و وارد main شده.

حالا با Periodic Interval Timer : PIT :
که براي تايمينگ کلي برنامه استفاده مي کنم مشکل ايجاد شده.

مدارک اتمل نوشته که با رسيدن شمارش کانتر به عدد هدف ، بيت PITS فعال شده و نيز اينتراپت ايجاد مي شود.
حالا براي پاک کردن PITS براي آماده سازي اينتراپت بعدي ،
لازم است که هر بار که اينتراپت رخ داد ، رجيستر PIT_SR را بخوانيم، اين خواندن ضمنا باعث پاک شدن PITS مي شود.

ولي خوب مي خوانيم ، ولي PITS پاک نمي شود.( در شبيه ساز روييت مي شود.)

در نتيجه پشت سرهم ، پس از خروج از روتين سرويس به اين اينتراپت ، بدون فاصله زماني طراحي شده ، اينتراپت ايجاد مي شود و الي آخر.....

با سپاس

1nafar
29-03-2011, 15:18
سلام

اما حجم برنامه من به بيش از 80 کيلو بايت رسيده ، و برنامه روي سخت افزار اجرا نمي شود
مشكل از نرم افزار نيست ، البته به اين نكته هم بايد توجه داشت كه حجم 80 كيلو بايت يه مقدار زياد هست ، شما حجم كد هگز رو در پنجره ي propertis مشاهده كرديد ؟
بعضي وقت ها عدم مقدار دهي درست متغير ها ، استفاده از توابع تو در تو و دست كاري هاي غير ضروري در ويزارد نرم افزار باعث بوجود اومدن چنين مشكلاتي ميشه .
ما در داخل sam7.s يه سري كد ها و توابع داريم كه در اونا مقدار دهي رجيتسر هاي مخصوص واحد pll و مديريت ريست و تايمر wotch dog انجام ميشه . در هنگام ايجاد شدن پروژه كامپايلر در مورد افزودن اين فايل از شما سوال ميكنه ( بعد از انتخاب ميكرو ) و شما ميتونيد با انتخاب گزينه ي no كاري كنيد كه اين فايل به پروژه افزوده نشه .
در اين حالت بايد تنظيمات تايمر واچ داگ و pll و... به صورت دستي و با مقدار دهي رجيستر ها در داخل خود برنامه انجام بديد كه ميتونيد براي دريافت اطلاعات بيشتر به مجله ي pmm4 ( ويرايش دوم ) مراجعه كنيد .

در اخر بهتره به شبيه ساز نرم افزار اعتماد نكنيد و برنامه رو با پروگرامر جيلينك ديباك كنيد و نتيجه رو در عمل ببينيد .

gangi
31-03-2011, 23:50
سلام

مشكل از نرم افزار نيست ، البته به اين نكته هم بايد توجه داشت كه حجم 80 كيلو بايت يه مقدار زياد هست ، شما حجم كد هگز رو در پنجره ي propertis مشاهده كرديد ؟
بعضي وقت ها عدم مقدار دهي درست متغير ها ، استفاده از توابع تو در تو و دست كاري هاي غير ضروري در ويزارد نرم افزار باعث بوجود اومدن چنين مشكلاتي ميشه .
ما در داخل sam7.s يه سري كد ها و توابع داريم كه در اونا مقدار دهي رجيتسر هاي مخصوص واحد pll و مديريت ريست و تايمر wotch dog انجام ميشه . در هنگام ايجاد شدن پروژه كامپايلر در مورد افزودن اين فايل از شما سوال ميكنه ( بعد از انتخاب ميكرو ) و شما ميتونيد با انتخاب گزينه ي no كاري كنيد كه اين فايل به پروژه افزوده نشه .
در اين حالت بايد تنظيمات تايمر واچ داگ و pll و... به صورت دستي و با مقدار دهي رجيستر ها در داخل خود برنامه انجام بديد كه ميتونيد براي دريافت اطلاعات بيشتر به مجله ي pmm4 ( ويرايش دوم ) مراجعه كنيد .

در اخر بهتره به شبيه ساز نرم افزار اعتماد نكنيد و برنامه رو با پروگرامر جيلينك ديباك كنيد و نتيجه رو در عمل ببينيد .

با سلام
ضمن تشکر از جناب هاشمی،

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

از طرفی ، کیل در حالت دمو محدودیت تا 32 کیلو را برای حجم برنامه در نظر گرفته ، لذا احتمال اینکه ک.ر.ک نتواند
بعضی کنترل داخلی کیل را بی اثر کند ، وجود دارد ،
مثلا برای برنامه های حجیم ، در نسخه های دموی ک.ر.ک شده ، کدهای موذی ایجاد کنند.

دو روز تلاش نمودم و برنامه را به کمپایلر IAR منتقل نمودم ( مقدار محدودی تغییرات نیاز داشت)
لیکن آنجا هم رفتارهای غیر منتظره از برنامه رخ داد که زمان زیادی برای حل کردن می طلبید.
و نیز دیباگر آن USER FRIENDLY نیست،
و چون تجربه قدیمی در کیل داشتم ، دوباره برگشتم و با KEIL کلنجار می روم.

علت گرفتاری برنامه ، به دلیل کدهای پنهان keil بین این خطوط از sam7.s



IMPORT __main
LDR R0, =__main
BX R0



و ابتدای تابع main میباشد.

که در سایت خود keil هم اشاراتی دیده می شود.

You can see links before reply

You can see links before reply


کدهایی با لیبل __scatterload هم درون این کدها در دیبگر دیده می شود.

با رجوع به این بخش:
You can see links before reply

You can see links before reply


و تغییر اندازه Heap به 12 کیلو بایت :


Heap_Size EQU 0x00003000


برنامه عملا روی برد از استارت آپ عبور کرد و وارد main شد.

حالا برنامه روی برد وارد مرحله main شده و تا مراحل مختلف قبل از فعال سازی اینتراپت پیش میرود،

و پس از فعال سازی اینتراپت سیستم(که به چند واحد pit_irq,rtt_irq,wdt_irq,dbgu_irq,pmc_irq,rstc_irq, efc_irq مرتبط است)
AT91F_AIC_EnableIt(AT91C_BASE_AIC, AT91C_ID_SYS);
، برنامه وارد حلقه بی نهایت یا یک اشکال دیگر می شود.

احتمال دارد که : یعنی یک کدی در همان بخشهای پنهان keil میرود و دستوری را اجرا می کند و
می پرد به:


Undef_Handler B Undef_Handler

SWI_Handler B SWI_Handler

PAbt_Handler B PAbt_Handler
DAbt_Handler B DAbt_Handler
IRQ_Handler B IRQ_Handler
FIQ_Handler B


از sam7.s و گرفتار حلقه بی نهایت می شود. و پس از حدود 10 ثانیه برنامه مجددا ریست شده و از اول تکرار می شود.

قعلا مشغول بررسی جزییات اینتراپتها هستم ، تا این اشکال را نیز رفع کنم.

.................................................. ...


البته قسمت PIT با راهنمایی آقای حامد91 در سایت همسایه حل شد.
( برای پاک کردن PITS باید رجیستر PIT_PIVR را بخوانیم.)
گرچه برنامه به اجرای آن اینتراپت نمی رسد.


با سپاس

kavir
01-04-2011, 13:14
سلام
توی سایت کیل یک جایی نوشته بود در صورتیکه شما میخواین از دیباگ استفاده کنید باید واچ داگ رو غیر فعال کنید

sutech
27-03-2014, 06:38
من هم دقیقا همین مشکل رو دارم، بعد از فعال شدن اینتراپت adc ،برنامه هنگ میکنه و به SWI میره،البته تو شبیه سازی، از سخت افزار که مطمئن نیستم،بنابراین اول میخوام از شبیه سازییه جواب معقول بگیرم.
ضمنا برای نوشتن برنامه از مثال های keil استفاده کردم.

sadeghbakhshi
27-03-2014, 16:54
من هم دقیقا همین مشکل رو دارم، بعد از فعال شدن اینتراپت adc ،برنامه هنگ میکنه و به SWI میره،البته تو شبیه سازی، از سخت افزار که مطمئن نیستم،بنابراین اول میخوام از شبیه سازییه جواب معقول بگیرم.
ضمنا برای نوشتن برنامه از مثال های keil استفاده کردم.
سلام
لطفا در اینده برای بیان سوالاتتون یک تاپیک جداگانه با نام مناسب ایجاد کنید
برای راهنمایی بهتر سعی کنید که برنامه رو این جا آپلود کنید

Mehrdad201
09-05-2014, 15:15
عرض سلام

دوستان من هم این مشکل رو دارم. یه برنامه ساده نوشتم. اما وقتی میخوام دیباگش کنم میره توی حلقه بینهایت فایل startup و اصلا تو فایل main نمیره.

کسی میدونه چطور باید این مشکل رو حل کنم ؟