וקטור פסיקות/קפיצות

yair24

Member
וקטור פסיקות/קפיצות

כבר מזמן שכחתי מה זה אני רק זוכר שזה וקטור שמארגן את הפסיקות הקיצר מישהו זוכר מה זה ואיך זה עובד תודה יאיר
 

תמר,

New member
מה זה הקפיצות האלו?

כידוע לך בודאי, ישנם כמה סוגים של פסיקות: פסיקת חומרה - זו פסיקה המגיעה למעבד ע"י רכיב חומרה פסיקת תוכנה - זו תוכנית שרות בד"כ שתוכנה קוראת לה (למשל ב-DOS יש את פסיקה 21 עבור ביצוע קלט/פלט) פסיקה חריגה (exeption) - פסיקה שנוצרת כתוצאה משגיאה (למשל: חילוק ב-0) כל פסיקה כזאת גורמת למעבד להפסיק מפעולתו הנוכחית, ולעבור לתוכנית השרות שהפסיקה דורשת. כיצד יודע המעבד לאיזו תוכנית שרות לקרוא, והיכן היא נמצאת? נכון! בעזרת וקטור הפסיקות. וקטור הפסיקות הוא מערך אסוציטיבי הנמצא במקום מסויים בזיכרון המחשב. המעבד מקבל את קוד הפסיקה, ובעזרתו הוא מוצא את כתובת תוכנית הפסיקה. לאחר ביצוע הפסיקה המעבד מחזיר את אוגרים מסויימים למצבם הקודם לפני הכניסה לפסיקה (לא זוכרת בדיוק אילו) והתוכנית המקורית ממשיכה לרוץ, אלא אם כן הפסיקה עוצרת את פעולת המעבד. ניתן להשתמש בפסיקות עבור תיזמון להדמיית "זמן אמת" בעזרת פסיקת השעון שהיא פסיקת חומרה וקורת 18 פעמים בשניה (אם אני לא טועה). יש המחלקים את סוגי הפסיקות רק לשתיים - חומרה ותוכנה. מקווה שההסבר ברור.
 

yair24

Member
את יכולה בבקשה...

להרחיב קצת בנושא של המערך האסוציאטיבי? מה בדיוק יש במערך הזה? יאיר
 

תמר,

New member
מערך אסוציטיבי

זה מערך עם שני חלקים לכל איבר במערך: חלק אחד הוא ה"מפתח" של המערך, והחלק השני הוא הערך המבוקש. אם מדובר בוקטור הפסיקות - חלק אחד של המערך הוא מספר הפסיקה, והחלק השני הוא הכתובת שבה תוכנית הפסיקה נמצאת. למען האמת, אני לא בטוחה במאה אחוז שאכן וקטור הפסיקות בנוי כך. יכול להיות שזה פשוט וקטור (מערך חד-מימדי) שכל כניסה היא כתובת, והכתובת מחושבת מהתחלת המערך + (מספר הפסיקה * מספר הבתים שתופסת הכתובת).
 

shed

New member
וקטור פסיקות - הרחבה

אכן אמרה תמר וצדקה - מטרתו של וקטור הפסיקות להגיד למעבד איפה לחפש את תוכנית שירות הפסיקה עבור פסיקה מסויימת. במחשבי pc הביתיים, וקטור הפסיקות יושב בכתובות 0-1024. (כלומר בתחילת הזכרון). מכיוון שצריך 4 בתים כדי לתאר כתובת פיזית בזכרון הרי שכל פסיקה "לוקחת" 4 בתים בוקטור הנ"ל. כאשר המחשב רוצה לדעת איפה למצוא את תוכנית השרות לפסיקה מס 7, הוא הולך לכתובת 7*4 ושם מוצא את הכתובת שבה יש את הכתובת של תוכנית השרות. (מע´ ההפעלה מעדכנת את הכתובת הזו - כך שהיא לא חייבת להיות קבועה ויכולה להשתנות בין הפעלה להפעלה של המחשב -אולם מה שתמיד נשאר קבוע - זה איפה למצוא אותה). עוד קצת הערות: במעבר לפסיקה המעבד דוחף את pc למחסנית. בתחילת תוכנית השרות דוחפים את כל שאר הרגיסטרים למחסנית ודואגים למשוך אותם בסוף התוכנית - כדי לא להפריע למהלך התוכנית הראשית שרצה כאשר התרחשה הפסיקה. בעקרון - המעבד לא מבדיל בין פסיקות חומרה ותוכנה. יש מספר פסיקות (נקראות nmi - או משהו כזה - לא זוכר בדיוק) אשר אי אפשר למסך אותן. (לדוגמא - חילוק באפס). וחומר קריאה בנושא (שוב) אפשר למצוא ב- www.ee.bgu.ac.il/~dcs
 

תמר,

New member
תיקון קטן

פסיקות שאינן ניתנות למיסוך נקראות (כמה מפתיע) non-maskable. בעניין ה-NMI זוהי דוגמה לפסיקה שאיננה ניתנת למיסוך: "דוגמה לפסיקה כזאת [שאינה ניתנת למיסוך] היא הדק NMI במעבד" (ציטוט מ"המחשב האישי למשתמש המקצועי" של משה קליג´ ועידו שרון בהוצאת הוד עמי) (זה ציטוט כי אין לי מושג מה ההדק הזה עושה.) פסיקות שאינן ניתנות למיסוך הן פסיקות שאי אפשר לבטל את פעולתן. אני חושבת שאפשר להחליף אותן. ויאיר: בעניין הספר שציטטתי ממנו: אם תרכוש אותו - לא תצטרך להוסיף שאלות בחומרה לפורום. מומלץ!
 

yair24

Member
רגע רגע...

אם ניקח 1024 ונחלק ל4 נקבל 256 זאת אומרת שיש 256 פסיקות אבל עד כמה שאני יודע יש רק 15 או 16 פסיקות בPC לא? יאיר
 

תמר,

New member
בלי בדיקה מעמיקה

יש לזה כמה תשובות: א. יש הרבה פסיקות. אולי לא כולן מלאות, אבל אם נקח את הדוגמה שנתתי לך על פסיקה 21, מדובר ב-21 ב-hex, ולא דצימלי, אז כבר זו דוגמה למספר גבוהה. ב. גם אם לא כל הפסיקות מלאות, יכול להיות שדווקא האחרונה כן ג. ומה אתה משאיר לפיתוח עתידי? כלום?
 

תמר,

New member
שוב - בלי בדיקה מעמיקה

נשמע מאוד הגיוני, כי מיספור הפסיקות נעשה בעזרת שתי ספרות הקסה-דצימליות, שה"גבול" שלהן הוא 256 (או יותר נכון: מ-0 עד 255)
 

yair24

Member
אצלי יש כזאת פקודה:

תסתכלי בקובץ המצורף: אני צריך הסבר מה קורה שם בדיוק מובן שאני מנסה גם להבין לבד אבל עוד הסבר תמיד עוזר תודה מראש יאיר
 

shed

New member
מה שעושה הפונקציה

זה פשוט מעדכנת את וקטור הפסיקות. הפרמטר הראשון שהיא מקבלת זה מספר פסיקה -במקרה שלך - oxB = 12. הפרמטר השני - כתובת של תוכנית השרות במקרה הנ"ל - כתובת לפונ´ timerb_isr כך אתה יכול לכתוב בעצמך תוכניות שירות לפסיקות שונות. שים לב: רצוי (מאוד) לשמור את וקטור הפסיקות לפני השנוי שעשית, ובסוף התוכנית שלך לשחזר אותו לערכו המקורי.
 

yair24

Member
אם אני עושה ריסט

לקונטרולר וצורב בו תוכנית אחרת הכל חוזר להיות כמו בהתחלה לא? יאיר
 

תמר,

New member
ריסט

ריסט מחזיר את המצב, לא צריך לצרוב. מדובר בזיכרון שנמחק בכיבוי המחשב. אבל תיכנות נכון של תוכניות פסיקה הוא: א. לשרשר את הפונקציה שלך ולא להחליף ב. להחזיר את המצב לקדמותו לאחר סיום התוכנית שירשור - בשביל לא למנוע מתוכניות אחרות שצריכות את הפסיקה שימוש בה (אם הפסיקה מעבירה פרמטרים לתוכניות אחרות או מבצעת שינויים זה יכול לקרות) החזרת המצב לקדמותו - מפני שלאחר סיום התוכנית, המקום בזיכרון בו שמת את הפסיקה שלך מתפנה לדברים אחרים, והמידע שיהיה בכתובת הזאת הוא מה שאוהבים לקרוא "אקראי לגמרי". למען הדיוק זה לא אקראי, אבל זה תלוי בתוכניות אחרות שרצות ובשרותי מערכת ההפעלה, כך שלגביך זה אקראי ובטח בלי משמעות.
 

yair24

Member
איזה יופי!!!

וואלההההההה... כשאני שןלח שם של פונקציה וקולט אותו כ*VOID אז זה בעצם קולט את הכתובת של הפונקציה נכון? לזה אתה מתכוון? יאיר
 
למעלה