310 likes | 479 Views
Real Time Systems. Chapter 6 Low level Programming. System Programming. 2 סוגים של מערכות: Embedded - רכיבי חומרה הכוללים מעבד, זיכרון לקוד ולנתונים וקלט/פלט ספציפיים לדרישות. דוגמאות: מיקרוגל, טלפון סלולרי, מכונת כביסה
E N D
Real Time Systems Chapter 6 Low level Programming
System Programming • 2 סוגים של מערכות: • Embedded - רכיבי חומרה הכוללים מעבד, זיכרון לקוד ולנתונים וקלט/פלט ספציפיים לדרישות.דוגמאות: מיקרוגל, טלפון סלולרי, מכונת כביסה • מערכות משולבות מחשב – במערכת קיים מחשב עם כרטיס מיוחד ששולט על התקני החומרה. התוכנה רצה במחשב וקוראת/כותבת מידע לכרטיסדוגמאות: רמזור, וידאומט
מערכות משובצות • 99% ממערכות המחשוב בעולם • מערכת כזו צריכה: • חומרה: micro controller, זיכרון, I/O • מערכת הפעלה RT • ROM מסוג מסוים עבור הקוד
סוגי מעבדים למערכות RT • Mips, Power PC, 68xxx • MPC8xx, x86, TMS320 • 8051,80251,8051XA • ARM,SH,H8 • ועוד מאות סוגים אחרים
מערכות הפעלה RT • VxWorks, Nucleus, DriveWay, e/BSD • RTLinux, TargetOS, CMX-RTX, • CCOS, DSPios, RTPX, MCX-08 • ThreadX, PDOS, INTEGRITY • ועוד מאות מעה"פ נוספות.
מערכות הפעלה RT • התאמה בין המערכת למוצר הסופי והדרישות לדוגמא: למכונת כביסה ולטלפון סלולרי אין אותן דרישות • לרוב המערכות תמיכה בשפות C/C++ • לחלקן תמיכה גם ב-java • למערכות יש דרישות שונות מבחינת זיכרון • לכל המערכות יש תמיכה ב- multitasking
מערכות משולבות מחשב • החומרה הדרושה • כרטיס ייעודי במחשב • תוכנה שכתובה ב- C , C++ • מערכת הפעלה סטנדרטית (dos, windows, linux) • מערכות מסוג זה מפותחות במקביל (תוכנה, חומרה)
RealMode • יישום יחיד • משתמש יחיד • מגבלת זיכרון MB1 כולל שטח עבור התקנים • היישום יכול לבצע כל דבר במערכת
Protected Mode • ריבוי משימות • אין מגבלת זיכרון • היישום מוגן ע"י המעבד מיישומים אחרים • היישום מוגבל בביצוע פעולות מסוימות • זיכרון וירטואלי
Rings • ל – Protected Mode 4 מצבי עבודה • Ring 0 – Kernel mode • Ring 1 • Ring 2 • Ring 3 – User mode • תהליך יכול לרוץ במצב אחד בלבד
תכנות מערכת • מערכת הפעלה RT חייבת לתמוך בגישה ישירה לחומרה כדי לחסוך זמן. • במערכות ההפעלה Windows אין תמיכה בכתיבת תוכנות ב- Kernel mode ולכן השימוש בהן לצורכי RT אינו נפוץ • מערכת הפעלה DOS עובדת ב- real mode ולכן התוכניתן יכול לבצע כל דבר בגרעין. הבעיה העיקרית היא שאין אפשרות להריץ תהליכים במקביל. בעיה זו יכולה להיפתר ברמת התוכנה.
גישה ישירה לחומרה • כל התקן חומרה במחשב ממופה בזיכרון מיוחד • מרחב זיכרון זה נקרא מרחב ק/פ • גודלו 64KB • מרבית השטח פנוי כך שניתן להוסיף חומרה כמעט ללא הגבלה • כדי לגשת למרחב זה קיימות קריאות מערכת מיוחדות.
גישה למרחב ק/פ • פונקציות: • unsigned inp(int port) • unsigned inpw(int port) • void outp(int port,char byte) • void outpw(int port,int val)
דוגמא – בקר המקלדת • קיימים 2 בקרי 8042 , אחד בתוך המקלדת ואחד על הלוח הראשי. • הבקר ניתן לתכנות ומקבל פקודות שונות הקשורות למקלדת. • פקודה 0xed מציינת לבקר להדליק את נורות המקלדת. • הפרמטר מתקבל בשלוש סיביות במבנה CNS 2 1 0
דוגמת קוד void main(void) { outp(0x60,0xed); delay(10); outp(0x60,5) }
דוגמא נוספת if(kbhit()) x=inp(0x60); • הערך שנקבל אינו קוד Ascii של התו שנלחץ • המרת קוד הסריקה לקוד Ascii הינה באחריות ה- Bios ומבוצעת ע"י פסיקת תוכנה • למקלדת מנוהל buffer שמחזיק עד 16 תווים שלחצו. בשל גודלו הוא אינו ממופה במרחב ק/פ אלא במרחב הזיכרון הרגיל.
מבנה הזיכרון • 1024 בתים ראשונים – וקטורי פסיקות • 256 בתים עוקבים – משתני Bios • החל מכתובת 0040:0000 מצויים משתני Bios המכילים מידע על אמצעי החומרה השונים. • חוצץ המקלדת ממופה לכתובות: 0040:001E עד 0040:003D. ב- offset001A נמצאת הכתובת (offset) של התו הבא בתור ובכתובת 0040:001C הכתובת של סוף התור. • בכל תא בתור נמצאים קוד סריקה (high) וקוד Ascii
דוגמא #include <conio.h> #include<dos.h> void main(void) { int far *s=(int far *)0x0040001a; char far *x; cprintf("Press any key to continue:"); while (!kbhit()); x=(char far *)MK_FP(0x0040,*s); cprintf("%d\n\r",*x); }
Real Time Clock • ניתן לגשת ישירות לשעון שנמצא ב- CMOS ולקבל בכל זמן את התאריך והשעה. • ממופה לכתובות 70, 71 • הפקודה נשלחת לכתובת 70 • התשובה מוחזרת דרך כתובת 71 • השעון מחזיר את השעה בדיוק של שניה, ניתן לקבל דיוק טוב יותר ע"י מיפוי פסיקת השעון
Time • outp(0x70,4); • hour=inp(0x71); • outp(0x70,2); • minute=inp(0x71); • outp(0x70,0); • second=inp(0x71);
Date • outp(0x70,7); • day=inp(0x71); • outp(0x70,8); • month=inp(0x71); • outp(0x70,9); • year=inp(0x71); • printf(“%x/%x/%x”,day,month,year);
מדידת זמנים • בכתובת 0040:006C קיים מונה שסופר את מספר פסיקות השעון שהתקבלו. long far *p=(long far *)0x0040006c; start=*p; //do something end=*p; time=(end-start)/18.2;
Keyboard Status Byte • נמצא בכתובת 0040:0017, ניתן לדגימה ומיסוך פשוט Ins on Caps on Num on Scrl on L Shift R Shift Alt Ctrl
Reset void ((far *fp)())=(void (far *)())0xffff0000; *(int far *)0x00400072=0; //0x1234 for warm fp();
Memory Mapped Devices • התקני חומרה שצריכים שטחי זיכרון גדולים מקבלים שטח בתוך מרחב הזיכרון הרגיל. • כרטיס המסך מקבל 128KB עבור מצב גרפי ומצב טקסט. • טקסט: חצי ראשון של סגמנט B – מונוכרום, חצי שני עבור CGA ומעלה • גרפי: סגמנט A
int get_video(void) { int seg; if (*(char far *)0x00400049==7) seg=0xb000; //MDA else seg=0xb800; //CGA or better return seg; }
void cls(char ch,char attr,int page) { int count, seg; char far *video; seg=get_video(); video=(char far *)MK_FP(seg,page*4096); for (count=0;count<2000;count++) { *video++=ch; *video++=attr; } }
void wrt_chr(char chr,int attr,int row,int col,int page) { register int a=attr; char far *video; int seg,off; seg=get_video(); off=row*160+col*2+page*4096; video=(char far *)MK_FP(seg,off); *video++=chr; *video++=a; }
void wrt_msg(char *str,int attr,int row,int col,int page) { register int a=attr; char far *video; int seg,off; seg=get_video(); off=row*160 + col*2 +page*4096; video=(char far *)MK_FP(seg,off); while(*str) { *video++=*str++; *video++=a; } }
void scr_attr(int attr,int row1,int col1,int row2,int col2,int page) { register int r,c; int seg,charperrow,delta; char far *video; seg=get_video(); video=(char far *)MK_FP(seg,(row1*160+col1*2+page*4096)+1); charperrow=col2-col1+1; delta=160-(col2-col1)*2; for(r=1;r<=row2-row1+1;++r) { for (c=1;c<charperrow;++c) { *video=attr; video+=2; } video+=delta; } }
שימוש בפסיקת תוכנה void setpage(int page) { _AH=0x05; _AL=page; geninterrupt(0x10); }