Fö 5+6 TSEA81. Real-time kernel + Real-time OS

Relevanta dokument
Fö 5+6 TSEA81. Reflektion av Lab 2. clock.c (module) Real-time kernel + Real-time OS

Tentamen Datorteknik och realtidssystem, TSEA81 Datum Lokal

Institutionen för elektro- och informationsteknologi, LTH

Datorteknik. Föreläsning 5. Realtidssystem och realtidsprogrammering. Institutionen för elektro- och informationsteknologi, LTH.

Tentamen. Datorteknik och realtidssystem

Tentamen Datorteknik och realtidssystem, TSEA81 Datum Lokal

TDDIU81. Processer och trådar. Andreas Dahlberg, Jonathan Doherty, Tony Magnusson, Patrik Ottosson, Rasmus Siljedahl

Mål. Datorteknik. Repetition av avbrott. Innehåll. Mätning och styrning. Datorer för mätning och styrning. timer. Datorsystem A/D. Analog insignal D/A

Fö 7 TSEA81. Scheduling

Tentamen. Datorteknik och realtidssystem

Digital- och datorteknik

Datorteknik ERIK LARSSON

F8: Undantagshantering

Datorsystemteknik Föreläsning 7DAVA14

Maskinorienterad programmering

Tentamen. Datorteknik och realtidssystem

Outline. Datorsystemtekni. Kravspecifikation. Kravspecifikation (forts.)

Programräknaren visar alltid på nästa instruktion som skall utföras. Så fort en instruktion har hämtats så visar programräknaren på nästa instruktion.

CPU. Carry/Borrow IX. Programräknare

Programmering av inbyggda system. Kodningskonventioner. Viktor Kämpe

Polling (cyklisk avfrågning) Avbrott

F4: Assemblerprogrammering

Lösningar till tentamen i EIT070 Datorteknik

Maskinorienterad programmering

Kontrollskrivning Mikrodatorteknik CDT S2-704

TSEA28 Datorteknik Y (och U)

Digital- och datorteknik

F5: Högnivåprogrammering

Dataminne I/O Stack 0x005D 0x3D SP low byte 0x005E 0x3E SP high byte

F5: Högnivåprogrammering

TSEA28 Datorteknik Y (och U)

En Von Neumann-arkitektur ( Von Neumann-principen i föreläsning 1) innebär:

Föreläsningsanteckningar 3. Mikroprogrammering II

Programexempel för FLEX

Operativsystem ID2200 Tentamen TEN1 3.8 hp :00-18:00

TSEA28 Datorteknik Y (och U)

Lösningsförslag till Tenta i Mikrodator

Tentamen Lösningar EDA698 Realtidssystem

Lösningar till tentamen i EIT070 Datorteknik

Mål. Datorteknik. Introduktion. Innehåll. Verklig situation - pappaledighet. Introduktion (forts)

Institutionen för elektro- och informationsteknologi, LTH

Stack och subrutiner Programmeringskonventionen

Per Holm Lågnivåprogrammering 2014/15 24 / 177. int och double = = 2, 147, 483, 647

Svar till tentamen den 16 december 2013 Datorarkitekturer med operativsystem, EDT621, 7,5 poäng

Mål. Datorteknik. Innehåll. Innehåll (forts) Hur ser ett program ut? Hur skapas maskinkoden?

Operativsystem - Processer I

Datorteknik. Föreläsning 3. Assembler, stack och subrutiner, programmeringskonventionen. Institutionen för elektro- och informationsteknologi, LTH

Institutionen för elektro- och informationsteknologi, LTH

Datorsystem Laboration 2: Minnesmappade bussar

Digital- och datorteknik

Lågnivåprogrammering. Föreläsning 2 Lågnivåprogrammering. Binära tal. En enkel modell av datorns inre

Fö 8 TSEA81. Real-time Linux

Exam Concurrent and Real-Time Programming

Maskinorienterad programmering

Hur delas CPU? Processormodell. Vårt produk9onsbolag igen. Produkt 2. Produkt Vinster med aa göra saker sam9digt.

Fö 7+8 TSEA81. Scheduling + Real-time Linux. wait. } else { sem->wait_list, WAIT_LIST_SIZE, pid); // semaphore waiting list

Lösningsförslag till Tenta i Mikrodator

Fö 7: Operativsystem. Vad är ett operativsystem? Målsättning med operativsystem. Styr operativsystemet datorn?

Processprogrammering och operativsystem Introduktion. Kursinformation. Varför operativsystem?

TDIU01 - Programmering i C++, grundkurs

Digital- och datorteknik

F2: Motorola Arkitektur. Assembler vs. Maskinkod Exekvering av instruktioner i Instruktionsformat MOVE instruktionen

Operativsystem ID1200/06 (ID2200/06 6hp) Tentamen :00-18:00

Synkronisering - Semaforen. Om att vänta men inte i onödan

Lösningar till tentamen i EIT070 Datorteknik

3. Mikroprogrammering II

Fö 2 TSEA81 Datorteknik och realtidssystem

Dagens OS. Unix, Linux och Windows. Unix. Unix. En översikt av dagens OS Titt på hur de gör. Många varianter Mycket gemensamt. En del som skiljer

Datorteknik. Föreläsning 4. Polling och avbrott. Institutionen för elektro- och informationsteknologi, LTH. Mål

(Lösningsförslag finns sist i denna fil.)

Concurrency Saker händer samtidigt. Process En instans av ett program

Realtidsstöd i Minix. En laborationrapport. Oktober 2012

Avbrottshantering. Övningsuppgifter

AVR 3 - datorteknik. Avbrott. Digitala system 15 hp. Förberedelser

Föreläsning 15: Parallella subrutiner. Parallellitet. Varför parallella underprogram?

Lösningsförslag tenta

Datorteknik ERIK LARSSON

Fö 1 TSEA81 Datorteknik och realtidssystem

Klassdeklaration. Metoddeklaration. Parameteröverföring

Tentamen i EIT070 Datorteknik

Operativsystem. Innehåll. Operativsystemets funktion. Vad är ett OS? Vart hittar men ett OS? OS hanterar processorns resurser

Ext-13 (Ver ) Exempel på RTN-beskrivning av FLEX-instruktioner

Datorteknik. Tomas Nordström. Föreläsning 6. För utveckling av verksamhet, produkter och livskvalitet.

Processer och trådar. Rasmus Cronstrand Per Jonsson Ante Wall Fabian Åberg

Översikt. Datorarkitekturer med operativsystem. Inledning. Inledning

Föreläsning 2. Operativsystem och programmering

Minnet. Minne. Minns Man Minnet? Aktivera Kursens mål: LV3 Fo7. RAM-minnen: ROM PROM FLASH RWM. Primärminnen Sekundärminne Blockminne. Ext 15.

Datastrukturer och algoritmer

TSEA28 Datorteknik Y (och U)

Program. Datorteknik. Semantiskt gap. C - Inledning. Abstraktionsnivå: Högnivåspråk. Assemblyspråk. Maskinspråk

Datorteknik ERIK LARSSON

Deluppgift 10 Starta den första processen (3.5h förarbete, 30min kodning)

Datastrukturer och algoritmer

Lösningsförslag till tentamen i IS1500 Datorteknik

Tentamen i TDIU16 Process- och operativsystemprogrammering

Synkronisering. Ordning och reda

Tentamen i Algoritmer & Datastrukturer i Java

Assemblerprogrammering - fördjupning

Timervirtualisering för hypervisors JONAS HAGLUND

Transkript:

Fö 5+6 TSEA81 Real-time kernel + Real-time OS

Stackens användningsområde * JSR / RTS : returadress * Temporärdata (push / pop) void myfunc(void) { int i; // hamnar nog i register int test[10]; // hamnar på stacken for (i=0; i<10; i++) { test[i]=42; } } Stackens innehåll: Odefinierat SP-> test[9] SP+4 test[8]... SP+32 test[1] SP+36 test[0] SP+40 Retur-adr. ------------- * Stacken är en mycket viktig del av tillståndet för en task

Stackens användningsområde En processor lagrar sitt tillstånd på följande ställen (förenklat): * Register (flera stycken) * PC * Stackpekare En process lagrar sitt tillstånd i: * En egen stack * Ett TCB Task Control Block -SP: stackpekare -Time: tid att vänta -Prio: processens prioritet

TCB : datastruktur TCB i ett mycket enkelt OS: * Plats för att spara SP (vid processbyte) - Ingen plats behövs i TCB för PC och register, då dessa sparas på stacken * Plats för timervärde (för usleep t ex) * Prioritet (för att avgöra vilken process som ska få köra) * I SimpleOS, två fält till: - Task ID - valid-flagga * I Linux, nästan 6 kilobyte stor!

Tasks / Processer * En process kan implementeras som en C-funktion * Processen har ett eget stackutrymme * Vid ett processbyte (task switch) inaktiveras en process och en annan återupptas (eller startas för första gången) * En process sparar in sin kontext när den inaktiveras, och återställer kontexten när körning av processen återupptas * Kontexten (processorns register och programräknare PC, för körande process) sparas på processens stack enligt en given konvention (ordning) En icke körande process:

Processer : skapa * Skapa ett TCB, fyll i värden för prioritet och tid (typiskt 0) * Skapa ett stackutrymme för processen I minnet * Skriv värdet för PC, vilket är startadressen för den funktion som utgör processen, i stacken * Skriv värden för önskat starttillstånd hos registeruppsättningen, i stacken * SP pekar nu på toppen av stacken, så spara SP i TCB * Processen är nu redo att starta, lägg in TCB i en ReadyList Två processer, redo att köra:

Processer : starta * I SimpleOS finns en ReadyList, som innehåller ID för alla processer som vill köra * Den av dessa processer som har högst prioritet markeras som Running och kommer att få köra genom att en assemblerrutin: -Läser SP från TCB till processorns stackpekare -Läser in register från processens stack till processorn -Läser in PC från processens stack till processorn, och därmed hoppar till processens adress och processen startar * Processens kontext har återställts till CPU:n Två processer, den ena startar:

Processer : växla/byta : orsak * När byter man process? -En ny process skapas med högst prioritet -Körande process anropar wait, på en semafor -Körande process anropar wait, på en timer (si_wait_n_ms()) -En process har väntat tillräckligt länge, på en timer -En process gör signal/post på en semafor som tillhör en process med högre prioritet -Processbyte kan även initieras av något avbrott, t ex då körande process kört tillräckligt länge och det är dags för nästa process att köra enligt någon prioritetsregel * Anrop av si_wait_n_ms() (motsv. usleep()) -Uppdatera TCB med fördröjningsvärdet -Spara ner register/sp/pc -Ta bort processen från ReadyList[] -Lägg in processen i TimeList[] -Växla till högst prioriterad process i ReadyList[] (dvs anropa Schedule) * Med jämna mellanrum ifrån ett klockavbrott: -Räkna ned fördröjningsvärdet för alla processer i TimeList[] -Om värdet nått noll, flytta tillbaka processen till ReadyList[] -Växla till högst prioriterad process i ReadyList[] (dvs anropa Schedule)

Processer : växla/byta : förberedelse * Justera fälten i TCB för körande process, om det behövs: -si_wait_n_ms() har anropats -prioriteten för processen har ändrats * Processbytet förbereds: Observera att (Reg) och (PC) på stacken för körande process nu betraktas som inaktuella då de kan ha skrivits över av temporärdata under tiden processen har kört. SP i TCB för körande process pekar just nu fel, men kommer snart att uppdateras under själva bytet.

Processer : växla/byta : förberedelse * Flytta TCB för körande process från ReadyList till en annan lista: -TimeList, om si_wait_n_ms() anropats -Någon annan WaitList, beroende vad man väntar på * Körande process nu i TimeList:

Processer : växla/byta * Leta upp nästa process, den med högst prioritet i ReadyList, och markera den med Next * Markera körande process med Current * Markera den process som ska bli körande, dvs Next, med Running * Kopiera PC i CPU till stacken för körande process [%] * Kopiera Reg i CPU till stacken för Körande process [%] * Kontext för körande process på stacken: Vi Har ännu inte bytt process, men flyttad körande process till TimeList och sparat processens kontext på stacken. (PC) på stacken upptas av temporärdata för körande process. [%] Dessa steg kan åstadkommas med ett mjukvaruavbrott.

Processer : växla/byta * Sätt SP i TCB för körande process till samma som SP i CPU * Sätt SP i CPU till SP i TCB för den process som ska starta, dvs Next * Stackbytet är genomfört: Nu har vi bytt stack i CPU:n från nuvarande process (Current) till nästa process (Next).

Processer : växla/byta * Kopiera Reg från stacken för den process som ska starta, dvs Next, till Reg i CPU:n * Kopiera PC från samma stack till PC i CPU:n * Processbytet är genomfört: I och med att PC i CPU:n får ett nytt värde så fortsätter exekveringen vid den adressen, dvs vid den nya processen som nu är körande (Running) Stegen ovan att återta Reg och PC till CPU:n kan typiskt (beroende på processorarkitektur) göras med ett återhopp från ett avbrott, dvs den assemblerinstruktion som gör det.

Processer : växla/byta : avbrott * Funktionaliteten för kontext-bytet måste skrivas i assembler, eftersom operationerna är arkitekturberoende och går inte att styra via ett högnivåspråk som C. * Funktionen si_wait_n_ms() måste köras med avbrott avslagna! Detta bl a för att Schedule anropas och ett avbrott kan initiera ett nytt processbyte, men nytt anrop av Schedule (under pågående Schedule), vilket kan ge oanade konsekvenser. * Även andra kritiska funktioner i reatidssystemets kärna, såsom Wait och Signal, måste köras med avbrott avslagna! * Princip för si_wait_n_ms(): void WaitTime (int time) { DISBLE_INTERRUPTS; Update_TCB(time); Save_Regs(); int id=remove_from_readylist(); Add_to_TimeList(id); Schedule(); ENABLE_INTERRUPTS(); } Schedule ovan (kanske) anropar ny process som ska köra. -När returnerar man från Schedule()? -När kommer vi tillbaka till ENABLE_INTERRUPTS()?

Processer : växla/byta : avbrott * Princip för si_sem_wait(): * Princip för si_sem_signal(): void si_sem_wait(struct sem *s) { DISABLE_INTERRUPTS; if (s->counter>0) { s->counter--; } else { // flytta oss från ReadyList[] int id=remove_from_readylist(); // till semaforens WaitList[] Add_to_WaitList(s->wait_list,id); // byt till process med högst prio Schedule(); } ENABLE_INTERRUPTS; } Void si_sem_signal(struct sem *s) { DISABLE_INTERRUPTS; if (!empty(s->wait_list)) { // hitta process som väntar med högst prio int id=remove_highest_prio(s->wait_list); // lägg till i ReadyList[] Add_to_ReadyList(id); // byt till process med högst prio Schedule(); } else { s->counter++; } ENABLE_INTERRUPTS; } Funktionerna för await och cause är uppbyggda på liknande sätt. Se läroboken.

Processer : stark/svag semafor P1 (hög prio) P2 (låg prio) current counter wait_list ready_list P1 1 P1,P2 1) si_sem_wait().. 0... 2) si_sem_wait()... P2 P1 3) si_sem_signal()... P1,P2 4)...... 5) si_sem_wait() P2. P1 P2 6) si_sem_signal() P1. P1,P2 7) si_sem_signal().. 1... 8) 1) P1 är körande 2) P1 gör wait, counter-- 3) P2 gör wait, P2 flyttas till wait_list då counter=0 4) P1 gör signal, P2 finns i wait_list och flyttas till ready_list, OBS counter=0! 5) P1 har högst prio i ready_list och får fortsätta köra 6) P1 gör wait (igen), counter=0 så P1 flyttas till wait_list och P2 får köra 7) P2 gör signal, P1 finns i wait_list, flyttas till ready_list och får köra 8) P1 gör signal, ingen i wait_list så counter++, P1 fortsätter köra Exemplet ovan kommer ur läroboken, men här i tabellform.

Processer : stark/svag semafor Vad hände? -Trots att P1 har högre prioritet får P2 köra (rad 6) -En högprioriterad process kan inte göra anspråk på en resurs två gånger i följd då en lågprioriterad process gör anspråk på resursen under tiden resursen är reserverad första gången av den högprioriterade processen. -Detta är egenskapen hos en stark semafor, där man garanterar att den process som aktiveras av signal kommer att få köra (kanske inte direkt, men nån gång). -Fördel: Förebygger svält då en lågprioriterad process inte kan stängas ute. -Funktionaliteten hos semaforen kan förstås ändras, till att tillåta svält och där en högprioriterad process alltid garanteras att få köra. Det är egenskapen hos en svag semafor. Principiell struktur för en svag semafor finns i läroboken.

Processer : semafor med time-out Man kan implementera en semafor med utökad funktionalitet, time-out: -Wait: Om resursen är ledig minska count med ett och returnera 0 annars flytta till WaitList och TimeList och vänta en viss maximal tid och returnera 1, eller tills någon gör signal på semaforen och returnera 0. Om 0 returneras har resursen reserverats Om 1 returneras har resursen inte reserverats -Signal: Om WaitList är tom öka count med ett annars ta bort från WaitList och TimeList, placera i ReadyList kör Schedule Principiell struktur för semafor med time-out finns i läroboken.

Funderingar * Kan ReadyList[] vara tom, dvs ingen process är redo att köra? -Ja, antag att vi har bara två processer och både ligger i si_wait_n_ms() Då låter man operativsystemet köra en idle-process, t ex: void idle_task(void) { while(1) { enable_low_power_mode(); } } Man kan alltså lägga idle-processen som en vanlig process i ReadyList[], vilket förstås innebär att även idle-processen under vissa förutsättningar kan flyttas till t ex WaitList[]. Semaforer i avbrottsrutiner är av det skälet en dålig ide.

Funderingar * Vad händer om en programmerare använder stackpekaren i sitt program till något annat än en stack? -Inbyggt system: Programmeraren får skylla sig själv -Generellt OS: För att undvika att programmeraren kraschar hela datorn, utan bara sitt eget program, har man en stack för användare och en annan stack för operativsystemet. T ex i 68000: SSP (Supervisor Stack Pointer) USP (User Stack Pointer) ARM/x86/etc har motsvarande funktioner