360 likes | 456 Views
Real Time Systems. VxWorks. VxWorks. מערכות הפעלה windows , unix אידיאליות לפיתוח אפליקציות רגילות אולם אינן מתאימות לפיתוח אפליקציות RT מערכות הפעלה סטנדרטיות לזמן אמת אינן מתאימות לפיתוח מתקדם של יישומים רגילים, לדוגמא אין תמיכה ב- GUI
E N D
Real Time Systems VxWorks
VxWorks • מערכות הפעלה windows, unix אידיאליות לפיתוח אפליקציות רגילות אולם אינן מתאימות לפיתוח אפליקציות RT • מערכות הפעלה סטנדרטיות לזמן אמת אינן מתאימות לפיתוח מתקדם של יישומים רגילים, לדוגמא אין תמיכה ב- GUI • הגישה של VxWorks הינה שילוב של שתי המערכות. VxWorks עבור החלקים הקריטיים ו- windows או unix עבור החלקים האחרים
מערכת דינאמית • ניתן להכליל רק את המרכיבים שצריך לפיתוח אפליקציה וכך לחסוך מקום לדוגמא תמיכה ברשת. • ניתן לפתח את המערכת על מחשב ה- host ולהריץ אותה על ה- target • ניתן גם לשלב את המערכות כך שה- target ישמש כשרת ל- host ויספק נתונים מהמערכת
מבנה כללי Target Host Tornado Tools: compiler debugger shell VxWorks RTOS Memory VxSim TEXT Target Server DATA File.o Project.out File.c File.cpp
Ethernet RS-232 Development Host VxWorks Target שלבי העבודה • אתחול target • חיבור Target Server • כתיבה והידור 4. Download 5. בדיקה
Wind - The OS Kernel Supports: • multitasking with preemptive priority scheduling • intertask synchronization and communication • Interrupt handling • Timers • memory management.
Drivers Support • Network driver – for network devices (Ethernet, shared memory) • Pipe driver – for intertask communication • RAM “disk” driver – for memory-resident files • SCSI driver – for SCSI hard disks, diskettes, tape drives • Keyboard driver – for PC x86 keyboards • Display driver – for PC x86 VGA displays • Disk driver – for IDE and floppy disk drives • Parallel port driver – for PC-style target hardware
תכונות נוספות • תמיכה במערכות קבצים מותאמות ל- RT כולל מערכת הקבצים של DOS • גישה "שקופה" למערכות VxWorks אחרות • תמיכה ב- TCP/IP • Remote Procedure Calls • Remote File Access • Virtual Memory
יכולת שיתוף אובייקטים כגון semaphores בין תהליכים שרצים על מעבדים שונים • ספריות C++ מיוחדות, תמיכה ב- Ansi C, ספריות פונקציות לטיפול בפסיקות, הקצאת זיכרון, מחרוזות ומבני נתונים • כלים לבדיקת ביצועים וניצול המעבד • Remote Debugging • תמיכה בסוגי לוחות שונים ואוסף פונקציות לטיפול בחומרה, מיפוי התקנים בזיכרון וכד'
Multitasking and Intertask Communications • Interrupt-driven, priority-based task scheduling. • ניתן ליצור כל שגרה/פונקציה כתהליך נפרד עם מחסנית פרטית • ניתן לחסום, לשחרר, להשהות ולשנות עדיפות של כל תהליך באמצעות קריאות מערכת • VxWorks מספקת סמפורים מסוגים שונים לסינכרון בין תהליכים
Portable Operating System Interface (POSIX) • אוסף תקנים עבור קריאות מערכת • משמש לתאימות בין מערכות ויכולת העברת קוד ממערכת למערכת • VxWorks תומכת בתקן זה עבור: • asynchronous I/O • Semaphores, message queues • memory management • queued signals • Scheduling, clocks and timers
I/O System • תמיכה בהתקנים רבים דרך פונקציות סטנדרטיות כגון : open(), close(), read() • תמיכה ב- ANSI-C (printf, scanf) • ק/פ באמצעות חוצצים ע"י: fopen, fclose, fread, fwrite, putc, getc • תמיכה בתקשורת טורית, התקני ק/פ מכניים
File Systems • תמיכה במערכת הקבצים של DOS , הכוללת ארגון היררכי, יכולת חלוקת קובץ למספר חלקים, ויכולת לעבוד במצב של case sen. • תמיכה ב- rt11fs (ללא היררכיה) • תמיכה ב- rawfs – הדיסק מוגדר כקובץ אחד גדול. ביצועים טובים יותר • יכולת עבודה עם מספר מערכות קבצים בו זמנית
Network Support • תקשורת קלה ומהירה עם מחשב ה- host מאפשרת פיתוח התוכנה עליו, איתור שגיאות מרוחק ושימוש ברכיבי תוכנה שאינם RT וממוקמים ב- host • תמיכה ב- TCP/IP • שימוש במשאבים מרוחקים • יכולת איתחול דינאמי של המערכת מה- host
Tasks • תהליכים ב- VxWorks רצים כיחידות עצמאיות עם אוגרים נפרדים ומשאבים נפרדים • לכל תהליך יש עדיפות, באמצעות העדיפות נקבע זמן הריצה של התהליך • כל התהליכים משתפים את אותו מרחב זיכרון • לתהליך יש 4 מצבים: • ready – מוכן לריצה • delayed – מושהה • suspended – חסום • pended – ממתין למשאב • התהליך בעדיפות הגבוהה ביותר במצב ready יורץ
שליטה על תהליכים • ב- VxWorks יש אפשרות לשנות את אופן החלפת התהליכים: • kernelTimeSlice() – שינוי Round-Robin • taskPrioritySet() – שינוי עדיפות תהליך • taskLock() – נעילת תהליך • taskUnlock() – שחרור תהליך
Preemptive Multitasking • בשיטה זו התהליך בעדיפות הגבוהה ביותר במצב ready ירוץ עד שיכנס תהליך בעדיפות גבוהה יותר או עד שיסתיים • ב- VxWorks יש 256 רמות של עדיפות • 0 – העדיפות הגבוהה ביותר • 255 – העדיפות הנמוכה ביותר • תהליך מקבל עדיפות כאשר נוצר אולם ניתן לשנות עדיפות זו בזמן הריצה
Round-Robin Scheduling • הבעיה של preemptive multitasking היא שאם יש מספר תהליכים בעלי עדיפות זהה רק אחד מהם ירוץ • בשיטת round-robin מחלקים את הזמן לפרוסות וכל תהליך מקבל פרוסת זמן • החלוקה היא תמיד בין התהליכים בעדיפות הגבוהה ביותר • הפונקציה kernelTimeSlice() מאפשרת שינוי מרווח הזמן בין כל שתי החלפות
יצירת תהליכים • taskSpawn() – יצירה ואתחול של תהליך • taskInit() – יצירת תהליך במצב suspend • taskActivate()– אתחול תהליך • דוגמא: • id=taskSpawn(name, priority, options, stacksize, func_add,arg1,…,arg10); • שם התהליך חייב להיות ייחודי (ניתן לרשום מחרוזת ריקה ואז השם ינתן ע"י המערכת
פונקציות • taskName()– מחזירה את שם התהליך לפי id • taskNameToId()– מחזירה את ה – id לפי השם • taskIdSelf()– מחזירה את המזהה של התהליך הנוכחי • taskIdVerify()– מחזירה האם קיים תהליך מסויים( לפי מזהה)
דוגמא • tid = taskSpawn ("tMyTask", 90, VX_FP_TASK, 20000, myFunc, 2387, 0, 0, 0, 0, 0, 0, 0, 0, 0); • המאפיין VX_FP_TASK מציין שהתהליך יעשה שימוש במספרים ממשיים
#include "vxworks.h" #include "stdio.h" #include "taskLib.h" int taskOne(void) { for(int i=0;i<10;i++){ printf("task 1\n"); taskDelay(50); } return 0; } int taskTwo(void) { for(int i=0;i<10;i++){ printf("task 2\n"); taskDelay(50); } return 0; }
פונקצית ההפעלה void start(void) { taskSpawn("task1",100,0,1000,taskOne,0,0,0,0,0,0,0,0,0,0); taskSpawn("task2",100,0,1000,taskTwo,0,0,0,0,0,0,0,0,0,0); }
Task Information • taskIdListGet()– מאתחלת מערך בכל מספרי התהליכים הפעילים • taskPriorityGet()– מחזירה את העדיפות • taskRegsGet()– מחזירה את הרגיסטרים של התהליך • taskRegsSet()– קובעת את הרגיסטרים • taskIsSuspended() • taskIsReady()
Task-Deletion • exit()– סיום התהליך הנוכחי • taskDelete()– סיום תהליך לפי מזהה • taskSafe()– הגנה על תהליך שלא יסגר • taskUnsafe()– שחרור ההגנה • זיכרון דינאמי אינו משתחרר אוטומטית כאשר התהליך נסגר
הגנה על תהליך taskSafe (); semTake (semId, WAIT_FOREVER); /* Block until semaphore available */ . . critical region . semGive (semId); /* Release semaphore */ taskUnsafe (); אסור לסגור תהליך שמחזיק משאב
Task Control • taskSuspend() • taskResume() • taskRestart() • taskDelay() • nonosleep() • שימוש ב-delay • taskDelay(sysClkRateGet()/2); //500ms
Semaphores • אובייקטים המשמשים לחסימה/שחרור תהליכים לצורך סינכרון ותקשורת • 3 סוגים: • binary • counting • mutex
Binary Semaphores • תהליך שרוצה להמתין לארוע משתמש באובייקט זה. • התהליך יחסם עד שיתקבל הארוע • יצירה: semBCreate() • המתנה: semTake() • שחרור: semGive()
Counting Semaphores • Binary semaphore משמש לקבלת ארוע יחיד • כאשר רוצים לדעת גם כמה ארועים התקבלו משתמשים באובייקט זה • יצירה: semCCreate()
Mutex • משמש לשיתוף משאבים (חומרה, קבצים וכו') בין תהליכים • יצירה: semMCreate() • מחיקת sem מכל סוג: semDelete()
Message Queues • חוצץ FIFO להעברת הודעות בין תהליכים • תהליך שמנסה לקרוא מחוצץ ריק או לכתוב לחוצץ מלא ייחסם (ניתן לקבוע timeout) • יצירה: msgQCreate() • שליחת הודעה: msgQSend() • קבלת הודעה: msgQReceive() • מחיקה: msgQDelete()
Watchdogs • משמשים לתזמון פעולות. הפעלת פונקציה אחרי זמן מסויים wd=wdCreate(); wdStart(wd,sysClkRateGet()*3,funcPtr,arg); • ביטול: wdCancel() • מחיקה: wdDelete()
Deadline-Miss Detection • בדיקה שקטע קוד מתבצע בזמן נתון אחרת טיפול בשגיאה wd=wdCreate(); wdStart(wd,deadline,panic,arg); doWork(); wdCancel(wd); : void panic(…){…..}
Signals • שליחת ארוע אסינכרוני לתהליך אחר • טיפול ב- exceptions • אם בתהליך מסויים התרחשה שגיאה ונקבעה פונקצית טיפול היא תופעל, אחרת התהליך יחסם • פונקצית הטיפול יכולה לאתחל את התהליך או לחזור לנקודה מסויימת שנקבעה ע"י setjmp() • חזרה לנקודה שנקבעה: longjmp()