קלט/פלט – רמה נמוכה

הפונקציה kbdgetc() קוראת ומחזירה את התו הבא מה-BIOS Keyboard buffer. אם אין תו זמין, היא מחזירה את הערך NOCH.

מימוש הפונקציה: הפונקציה בודקת אם יש תו בחוצץ בעזרת קריאת BIOS בשם KBDPEND. אם לא קיים תו בחוצץ, kbdgetc() מחזירה NOCH.

אם קיים תו בחוצץ, הפונקציה קוראת לשגרת BIOS נוספת על מנת לקבל את התו.

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

כדי למנוע ממצב זה לקרות, הפונקציה מנקה את pcxflag לפני הקריאות לשגרות BIOS, ומונעת בדרך זו מתהליכים אחרים לרוץ באותו זמן. ערך pcxflag משוחזר לפני החזרה מהפונקציה.

הפונקציה kgetc() מחזירה את התו הבא מהמקלדת. אם אין כזה, היא מחכה עד שיגיע תו.

נביט במימוש של הפונקציה:

int kgetc(d)

int d;                            /* dummy parameter         */

{

       int    ch;

       while ( (ch=kbdgetc()) == NOCH );

       return ( (ch==RETURN) ? NEWLINE : ch );

}

נשים לב שבפונקציה זו ממומש busy-wait.

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

תגיות המסמך:

מאת: באסל

תודה

הסברתם את זה, כמו שאר הנושאים, באופן הכי ברור שיש.
שיתוף:
| עוד