Datorteknik Föreläsning 5 Realtidssystem och realtidsprogrammering Mål Att du ska förstå hur avbrott används för - Mätning - Styrning - Stöd för körning av flera processer Att du ska förstå begreppet tråd Att du ska veta hur odelbara resurser kan hanteras Att du ska känna till funktionen hos en realtidskärna 1
Innehåll Avbrott - repetition Vad är ett realtidssystem? Microgravityugnen Hur får man en processor att utföra flera uppgifter? Trådar - Vad, när och hur? Hur fungerar en realtidskärna? Vad är ömsesidig uteslutning och hur implementeras det? Exempel på en realtidskärna för MIPS Repetition av avbrott Avbrott: En yttre (eller inre) händelse kan kopplas till en subrutin Avbrottsrutinen körs automatiskt när avbrottet kommer Avbrottsrutinen måste spara undan alla register som den använder Avbrott och MIPS: Sex externa användar-definierade avbrott Ett antal maskindefinierade avbrott finns Alla avbrott leder till att exekvering på adress 0x80000080 Efter avbrottet innehåller Causeregistret orsaken till avbrottet 2
Datorer för mätning och styrning Datorer används i många sammanhang för att mäta och styra olika processer - Pappersmaskiner - Autopiloter för flygplan - Styrsystem för truckar - Övervakningssystem på sjukhus Mätning och styrning timer avbrottsingång Analog insignal Analog styrsignal A/D D/A in ut Datorsystem Datorsystemets program läser insignalen med jämna tidsmellanrum och beräknar utifrån dessa styrsignaler Särskilda enheter omvandlar mellan analoga och digitala signaler 3
Vad är ett realtidssystem? Datorsystem med tidskrav Flera insignaler och flera utsignaler, möjligen med olika tidskonstanter Exempel: Bränsleinsprutningssystem för bilar (100 varv/s) Kraftverk Tvättmaskiner Switch/router för Internet Microgravity-experimentugn Halogenlampor Prov Ihålig kolcylinder Termoelement 1 gång/s: Styrsignaler till lamporna (värmer provet) 2 ggr/s: Mätsignaler från termoelement Huvudprogram: Beräkna styrsignaler, sänd telemetri till raketbasen (temp, status, ) 4
Microgravity-experimentugn Tre olika uppgifter för processorn Två av dessa är tidskritiska Mätningen och styrningen utformades i en avbrottsrutin Avbrotten genererades som externa med en timer En processor - flera olika uppgifter Hur kan en processor utföra flera uppgifter samtidigt? Nyckeln: Avbrottsmekanismen Kan användas för att realisera ett system som klarar flera olika processer 5
Trådar tråd 2 tråd 1 tråd 0 styrning mätning beräkning tid För vi har ju en enda processor! tid/100 tidsavbrott Trådar Trådar är program som gör olika saker, och turas om att köra på en och samma processor Olika strategier finns: Alla trådarna kan köras i turordning Trådarna kan ha proritet och köras i prioritetsordning 6
En tråds olika tillstånd Tidsavbrott Exekverande Redo Tex Systemanrop Väntan på händelser Blockerad Händelse som vi väntat på Skapa tråd Kan vi hindra tråden att bli avbruten? Ibland vill vi att tråden ska köra färdigt något kritiskt Ex: Utskrift, ställa om styrvärden, läsa av en givare Då får ingen annan tråd gå in och ta över processorn Kallas ömsesidig uteslutning - mutual exclusion Hur kan vi ordna det? Ledning: Vad gör att vi byter tråd? 7
Problem med gemensam resurs Tråd 1: printf( Detta är tråd 1!\n ); Tråd 2: printf( Detta är tråd 2!\n ); Ovanstående kod kan resultera i en utskrift som liknar: DeDtettat a äär r tråtd 1!r åd 2! Varför? Texten skrivs ut tecken för tecken Hur löser man det här? Ömsesidig uteslutning Tråd 1: lock(); printf( Detta är tråd 1!\n ); unlock(); Tråd 2: lock(); printf( Detta är tråd 2!\n ); unlock(); Hela utskriften kan skrivas ut utan att den andra tråden kommer in Detta är tråd 1! Detta är tråd 2! lock() hindrar andra trådar att köra, unlock() tillåter det igen. 8
Ömsesidig uteslutning - en lösning Vi vill inte att någon ann tråd ska köra Lösning: stäng av avbrotten. Ingen annan tråd kommer då att kunna köra. Lite för drastiskt ibland - det kan ju finnas andra, viktiga avbrott som vi då inte tillåter... Struktur för ömsesidig uteslutning Semaforer - en struktur för detta Två operationer, wait() och signal() Semaforen initieras till ett värde, oftast 1. Den tråd som vill komma åt en resurs gör wait() på semaforen som hör till resursen Den tråd som släpper resursen gör signal() på semaforen. 9
Semaforer - wait() och signal() wait(sem) { while (sem<=0) { /* Vänta - Gör inget */ } sem = sem-1; } /* Tråden väntar tills värdet blir större än 0, låser sedan för andra */ signal(sem) { sem = sem+1; } /* Tråden låser upp semaforen */ Vad är en realtidskärna? Med en enda processor kan ju bara en enda tråd exekvera åt gången För varje tråd måste vi hålla reda på hur processorns status var för den tråden Statusen är innehållet i de vanliga registren, EPC, Status, Cause, HI och LO Vi måste kunna välja vilken tråd som ska köra efter nästa tidsavbrott - det gör SCHEDULERN 10
Vad gör en scheduler? När en tråd avbryts (av tex ett tidsavbrott) gör schedulern följande: - Sparar status för den aktuella tråden ( i minnet) - Väljer en ny tråd av dem som är klara att köra - Laddar status för denna tråd från minnet - Statusen: Registren, HI, LO, EPC, Status, Cause - Återhopp sker till nya trådens EPC. Varför? Statusbyte sp sp sp ra TCB1 (minne) ra TCB2 (minne) ra TCB3 (minne) EPC EPC EPC Tråd 1 avbryts Tråd 1 ska köras sp ra Processorns register EPC 11
Statusbytet Varje tråd har sin egen stackpekare. Varje tråd måste ha sin egen stack - måste specificeras då tråden initieras! Realtidskärnan En realtidskärna måste göra följande: Initiering av trådhantering, avbrottsrutin, etc Sätta upp strukturer då en tråd skapas Tillhandahålla primitiver för ömsesidig uteslutning Köra en scheduler som byter mellan de olika trådarna 12
Exempel: ITS Utvecklad av Mats Brorsson Skriven i C och assembler Bara det nödvändigaste är skrivet i assembler: - avbrottsrutinen - sparande av status (TCB) - skrivande av register (TCB) - hantering av avbrottsregister Grundfunktionerna i ITS ITS_init(): Initiering ITS_create_thread(routine,&arg,&stack) : Skapa tråd ITS_enter_critical(): Primitiv för ömsesidig uteslutning ITS_leave_critical() ITS_yield(): För trådar som vill släppa sin exekvering (om de t.ex. väntar) 13
Initiering ITS_init() Sätter upp och initierar datastrukturer En tråd sätts igång Avbrottsrutinen initieras Avbrott tillåts Skapa ny tråd ITS_create_thread(routine,&arg,&stack) Skapar och förbereder för ny tråd Subrutinens namn i routine Argument till subrutinen i arg Stackutrymme för tråden i stack Initierar några register i TCB: sp,a0,epc osv 14
Ömsesidig uteslutning ITS_enter_critical() Vill hindra andra trådar att köra - stänger av avbrotten! Kan användas för att implementera semaforer Ömsesidig uteslutning ITS_leave_critical() Tillåter avbrott igen när tråden passerat den kritiska regionen 15
Om man inte vill exekvera ITS_yield() Om en tråd inte kan eller vill köra vidare Vill släppa exekveringen till någon annan tråd Genererar ett mjukvaruavbrott (genom att skriva i Causeregistret) Vad händer i avbrottsrutinen? Vid avbrott avbryts den körande trådens exekvering Avbrottsrutinen måste spara trådens status i dess TCB - detta måste skrivas i assembler Värdet i trådens EPC är den adress där exekveringen ska återupptas (den blev ju avbruten!) ITS_scheduler anropas. Den väljer en ny tråd som ska köras, skickar dess TCB-adress i register k0 16
Hur väljer schedulern en ny tråd? Tråden måste vara redo för körning Man skulle sedan kunna välja efter prioritet Enkel strategi: turordning - round robin Schedulern behöver inte skrivas i assembler, och är det heller inte i ITS Hur startas nästa tråd i ordningen? Den nya trådens TCB skrivs till registren (utom EPC) - vi återställer den status som tråden hade senast Kopiera trådens EPC till register k1 Hoppa tillbaka med jr k1 Återställ med rfe 17
ITS ITS är en relativt enkel realtidskärna, som trots det kan användas till mycket. Den visar på de viktigaste principerna. Naturliga utvidgningar av kärnan vore att implementera prioriteter vid trådbyte, och möjlighet till systemanrop. Var hittar vi realtidskärnor? Windows Unix Läspennor Telefoner mm 18
Sammanfattning Realtidssystem används flitigt överallt En processor kan utföra många uppgifter samtidigt Trådar och trådbyte Avbrott är nyckeln till system med flera trådar Realtidskärnan - vad gör den? Schedulern - vad har den för roll och funktion? Ömsesidig uteslutning ITS - en enkel, pedagogisk, realtidskärna 19