Mål Datorteknik Föreläsning 5 Att du ska förstå hur avbrott används för - Mätning - Styrning - Stöd för körning av fle processer Att du ska förstå begreppet tråd Att du ska veta hur odelba resurser kan hantes Att du ska känna till funktionen hos en realtidskärna Realtidssystem och realtidrogmmering Innehåll Repetition av avbrott Avbrott - repetition Vad är ett realtidssystem? Microgvityugnen Hur får man en processor att utfö fle uppgifter? Trådar - Vad, när och hur? Hur funger en realtidskärna? Vad är ömsesidig uteslutning och hur implementes det? Exempel på en realtidskärna för MIPS Avbrott: En yttre (eller inre) händelse kan kopplas till en subrutin Avbrottsrutinen körs automatiskt när avbrottet kommer Avbrottsrutinen måste a undan alla register som den använder Avbrott och MIPS: Sex externa användar-definiede avbrott Ett antal maskindefiniede avbrott finns Alla avbrott leder till att exekvering på adress 0x80000080 Efter avbrottet innehåller Causeregistret orsaken till avbrottet Datorer för mätning och styrning Mätning och styrning Datorer används i många sammanhang för att mäta och sty olika processer - Pappersmaskiner - Autopiloter för flygplan - Styrsystem för truckar - Övervakningssystem på sjukhus Analog insignal Analog styrsignal timer avbrottsingång A/D D/A in ut Datorsystem Datorsystemets progm läser insignalen med jämna tidsmellanrum och beräknar utifrån dessa styrsignaler Särskilda enheter omvandlar mellan analoga och digitala signaler 1
Vad är ett realtidssystem? Microgvity-experimentugn Datorsystem med tidskv Fle insignaler och fle utsignaler, möjligen med olika tidskonstanter Exempel: Bränsleinrutningssystem för bilar (100 varv/s) Kftverk Tvättmaskiner Switch/router för Internet Prov 1 gång/s: Styrsignaler till lamporna (värmer provet) 2 ggr/s: Mätsignaler från termoelement Huvudprogm: Beräkna styrsignaler, sänd telemetri till ketbasen (temp, status, ) Halogenlampor Ihålig kolcylinder Termoelement Microgvity-experimentugn Tre olika uppgifter för processorn Två av dessa är tidskritiska Mätningen och styrningen utformades i en avbrottsrutin Avbrotten generedes som externa med en timer En processor - fle olika uppgifter Hur kan en processor utfö fle uppgifter samtidigt? Nyckeln: Avbrottsmekanismen Kan användas för att realise ett system som klar fle olika processer Trådar Trådar tråd 2 tråd 1 tråd 0 styrning mätning beräkning tid Trådar är progm som gör olika saker, och tus om att kö på en och samma processor Olika sttegier finns: Alla trådarna kan kös i turordning Trådarna kan ha proritet och kös i prioritetsordning För vi har ju en enda processor! tid/100 tidsavbrott 2
En tråds olika tillstånd Kan vi hind tråden att bli avbruten? Exekvende Tidsavbrott Redo Ibland vill vi att tråden ska kö 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 Tex Systemanrop Väntan på händelser Blocked Händelse som vi väntat på Hur kan vi ordna det? Ledning: Vad gör att vi byter tråd? Skapa tråd 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 resulte 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? Tråd 1: lock(); printf( Detta är tråd 1!\n ); unlock(); Ömsesidig uteslutning Tråd 2: lock(); printf( Detta är tråd 2!\n ); unlock(); Hela utskriften kan skrivas ut utan att den and tråden kommer in Detta är tråd 1! Detta är tråd 2! lock() hindr and trådar att kö, unlock() tillåter det igen. Ömsesidig uteslutning - en lösning Vi vill inte att någon ann tråd ska kö Lösning: stäng av avbrotten. Ingen annan tråd kommer då att kunna kö. Lite för dstiskt ibland - det kan ju finnas and, viktiga avbrott som vi då inte tillåter... Struktur för ömsesidig uteslutning Semaforer - en struktur för detta Två opetioner, wait() och signal() Semaforen inities 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. 3
Semaforer - wait() och signal() Vad är en realtidskärna? 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 and */ signal(sem) { sem = sem+1; } /* Tråden låser upp semaforen */ Med en enda processor kan ju ba en enda tråd exekve å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,, Status, Cause, HI och LO Vi måste kunna välja vilken tråd som ska kö efter nästa tidsavbrott - det gör SCHEDULERN Vad gör en scheduler? Statusbyte När en tråd avbryts (av tex ett tidsavbrott) gör schedulern följande: - Spar status för den aktuella tråden ( i minnet) - Väljer en ny tråd av dem som är kla att kö - Laddar status för denna tråd från minnet - Statusen: Registren, HI, LO,, Status, Cause - Återhopp sker till nya trådens. Varför? TCB1 (minne) Tråd 1 avbryts TCB2 (minne) TCB3 (minne) Tråd 1 ska kös Processorns register Statusbytet Varje tråd har sin egen stackpekare. Varje tråd måste ha sin egen stack - måste ecifices då tråden inities! Realtidskärnan En realtidskärna måste gö 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ö en scheduler som byter mellan de olika trådarna 4
Exempel: ITS Utvecklad av Mats Brorsson Skriven i C och assembler Ba det nödvändigaste är skrivet i assembler: - avbrottsrutinen - ande 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) Initiering ITS_init() Sätter upp och initier datastrukturer En tråd sätts igång Avbrottsrutinen inities 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 Initier någ register i TCB:,a0, osv Ömsesidig uteslutning ITS_enter_critical() Vill hind and trådar att kö - stänger av avbrotten! Kan användas för att implemente semaforer Ömsesidig uteslutning ITS_leave_critical() Tillåter avbrott igen när tråden passet den kritiska regionen 5
Om man inte vill exekve ITS_yield() Om en tråd inte kan eller vill kö vidare Vill släppa exekveringen till någon annan tråd Generer ett mjukvaruavbrott (genom att skriva i Causeregistret) Vad händer i avbrottsrutinen? Vid avbrott avbryts den könde trådens exekvering Avbrottsrutinen måste a trådens status i dess TCB - detta måste skrivas i assembler Värdet i trådens ä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ös, skickar dess TCB-adress i register k0 Hur väljer schedulern en ny tråd? Tråden måste va redo för körning Man skulle sedan kunna välja efter prioritet Enkel sttegi: 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 ) - vi återställer den status som tråden hade senast Kopie trådens till register k1 Hoppa tillbaka med jr k1 Återställ med rfe 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 implemente prioriteter vid trådbyte, och möjlighet till systemanrop. Windows Unix Läennor Telefoner mm Var hittar vi realtidskärnor? 6
Sammanfattning Realtidssystem används flitigt övellt En processor kan utfö många uppgifter samtidigt Trådar och trådbyte Avbrott är nyckeln till system med fle 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 7