27-08-2009, 23:15
|
מנהל
|
|
חבר מתאריך: 26.07.08
הודעות: 6,473
|
|
הפסיקה היא של הזמנן שנקרא PIT (ר"ת Periodic Interval Timer).
כתבתי את התוכנה בצורה כזו שהפסיקות של PIT לא יכולות להתערבב אחת עם השניה, כלומר שיהיה אפשר להתעסק עם ה-PIT רק בשביל מטרה אחת בזמן אחד. והפסיקה של ה-UART אינה מתרחשת (אלא אם אני כותב מידע לרגל RX של UART, ולא עשיתי זאת)
ה-AIC (מנגון טיפול בפסיקות) כולל stack חומרתי בגודל 8words (מילה אחת = 4 בתים), אז גם אם באה פסיקה ברמה גבוהה יותר אני מניח שזה לא אמור לגרום לבעיה... יש אוגר שנקרא AIC_IVR והוא מכיל את הכתובת של הפסיקה הנוכחית המבוצעת.
כיוון שה-AIC תומך בפסיקות מקוננות אז אני חושב שזה לא אמור להיות הבעיה... כמו כן האפליקציה והקוד לא בנויים בצורה כזו שיהיו 2 פסיקות מקוננות, אלא אם נכתב מידע לרגל RX של UART, אבל זה לא קרה..
לגבי ה-stack החומרתי:
ציטוט:
When an interrupt of a higher priority happens during an already occurring interrupt service rou-
tine, the nIRQ line is re-asserted. If the interrupt is enabled at the core level, the current
execution is interrupted and the new interrupt service routine should read the AIC_IVR. At this
time, the current interrupt number and its priority level are pushed into an embedded hardware
stack, so that they are saved and restored when the higher priority interrupt servicing is finished
and the AIC_EOICR is written.
The AIC is equipped with an 8-level wide hardware stack in order to support up to eight interrupt
nestings pursuant to having eight priority levels.
|
המנגון של ה-AIC פועל בצורה כזו שפסיקה ברמה מסוימת לא יכולה להפסיק פסיקה עם אותה הרמה, אלא ממתינה עד שתסיים (וכך גם המעבד עושה):
ציטוט:
The nIRQ line can be asserted only if an interrupt condition occurs on an interrupt source with a
higher priority. If an interrupt condition happens (or is pending) during the interrupt treatment in
progress, it is delayed until the software indicates to the AIC the end of the current service by
writing the AIC_EOICR (End of Interrupt Command Register). The write of AIC_EOICR is the
exit point of the interrupt handling.
|
עשיתי pause דרך JTAG לריצת הקוד כאשר הצריבה הייתה לא טובה, וראיתי את אוגרי ה-AIC תקינים. כמו כן אוגרי ה-PIT היו תקינים. בע"ה בקרוב אביא תמונה של האוגרים והערכים שלהם.
ציטוט:
אתה יכול לנסות ביצוע של הפסיקות ללא קריאה לפונקציות - במקום זה, תדליק ביט סמפור בפסיקה, וב IDLE TASK (או בלולאה ראשית) תבדוק את מצב הביט ואם הוא מופעל - נקה אותו וקרא לפונקציה.
|
למה לעשות set interrupt ומיד אח"כ (אחרי בדיקה) לנקות בלולאה הראשית? אם אעשה set אז הפסיקה תופעל והקוד יקפוץ לכתובת ה-handler... לא..?
ציטוט:
עריכה - לפני ביצוע השינוי - אתה יכול לבדוק אם זו הבעיה ע"י כך שבלולאה הראשית תבדוק את מצב איפשור הפסיקות ואת ה MASK ואם הפסיקות חסומות - תפעיל I/O או לד.
|
בדקתי עם JTAG אך האוגרים מראים שהפסיקות מאופשרות, ואפילו פסיקת ה-PIT (שזה למעשה פסיקת SYS כלומר system) במצב pending, אבל המעבד לא נכנס ל-handler. אאל"ט באוגר AIC_IVR (האוגר שמציין את כתובת handler הפסיקה שמתבצעת כרגע) הייתה הכתובת של הפסיקה, אבל המעבד לא נכנס ל-handler שהקצתי באוגר המתאים (שמתי breakpoint ב-handler וגם שמתי לב שהאפליקציה לא מתעדכנת). בדקתי גם את כתובות ה-ISR שהקצתי לכל מקור פסיקה - וזה תקין, הכתובות נכונות (נבדק לאחר ביצוע disassembly).
אני חושב שאני לא נכנס למצב deadlock כיוון שאין לי 2 פסיקות באותו הזמן, וכמו כן לא הפנתי 2 פסיקות שונות לאותו ה-handler.
ד"א, לפני כן כאשר כתבתי שהמעבד נכנס למצב abort, הכוונה היא ל- Prefetch Abort (ולא ל-Data Abort).
|