Analyse og design af Indlejrede Systemer v/ Jens Dalsgaard Nielsen Henrik Schiøler Mads Dore alle Afdeling for Proceskontrol 1
kursusindhold... Del 1: 5 mm Parallelitet, multiprogrammering, OS services Del 2: ca 2 mm Realtidskerner, konstruktion,... Del 3: ca 4 mm Modellering af omgivelser Skeduleringsteori Del 4: ca 2 mm Analyse- og designmetoder til RT systemer Del 5: ca 2 mm Test af indlejrede systemer 2
kursusindhold Del 1: 5 mm (JDN) Parallelitet, multiprogrammering, OS services Del 2: ca 2 mm (JDN) Realtidskerner, konstruktion,... Del 3: ca 4 mm Modellering af omgivelser Skeduleringsteori Del 4: ca 2 mm Analyse- og designmetoder til RT systemer Del 5: ca 2 mm Test af indlejrede systemer 3
Realtidssystemer Definition af realtidssystemer En række eksempler herpå Parallellitet og multiprogrammering Proces- model og tilstande Købegreber inden i et operativsystem Skedulering (manipulation af køer) Dagens opgaver 4
Definition af realtidsystemer At der er tidskrav på løsning af opgaver Samplede systemer: Reguleringssløjfe: samlingsfrekvens, max jitter,... Hændelsesstyrede systemer Max reaktionstid på eks positionsdetektering 5
Realtidsdefinition II Overskreden deadline = ubrugeligt/dårligt resultat Trafiklys, elevator, stinger,...! ABS, dvd/divx afspiller Mobiltelefon, GPS,... Ju name id! system Kontrol system Sætter krav Følger krav 6
Kontrol system Opgavens sætter krav til kontrollerende system Pris, pålidelighed,... sætter andre krav til... Det kontrollerende system kan være PIC 16F74 ingen kerne, m/u interrupt 8051 m/u kerne 68xxx m/u kerne ARM, powerpc,... m linux,windows,qnx,windriver,...... 7
Kontrol system Opgavens sætter krav til kontrollerende system Pris, pålidelighed,... sætter andre krav til... Det kontrollerende system kan være PIC 16F74 ingen kerne, m/u interrupt 8051 m/u kerne 68xxx m/u kerne ARM, powerpc,... m linux,windows,qnx,windriver,... System er egentlig uinteressant når det opfylder de ønskede krav... Hvem interesserer sig for inside i en Danfoss ventil??? 8
Nogle RT krav til kontrollerende system Hændelser min,max reaktionstid på hændelser(interrupt) Og set i sammenhæng med andre hændelser (prioritering) afvikling kan blive forsinket Eksterne hændelser bliver registreret ved: Interrupts Polling Periodiske timere/ure Relative timere Andre hændelses interrupts (sensorer) Man undgår interrupt latens :-) Under eksekvering af kode mistet verdensovervågning 9
Uden kerner Mange systemer behøver ikke multiprogrammering Man kan groft dele dem op i Rene polling systemer Systemer med et eller flere interrupts (fattigmandsmultiprogrammering Vil ofte være valg hvor Lav kompleksitet af opgave Lille størrelse af kode Evt krav om meget høj hastighed 10
No kernel please int endestop, motorcontrol, blinklys, controllerstate, resetfraoperator; void main(void) { controllerstate=endestop=motorcontrol=blinklys=controllerstate=0; while (1) { endestop = inport(yyy); resetfraoperator = inport(zz); switch (controllerstate) { case 0: if (endestop) controllerstate = 1; else if (resetfraoperator) controllerstate=2; break; case 1:... break; } } MEGET ENKEL EFFEKTIV HURTIGT GENNEMSKUELIG(?) KODE 11
No kernel please Meget enkel arkitektur Enkel overskuelig kode Billig implementation (PIC,...) Kan eks genereres udfra PLC kode: http://www.opencontroller.org 12
PLCer Billigste mest high performance digital kodemaskiner. Cyklustider på 1 msec som max... bare en industriel PEEL ;-)... eller en PIC Traditionel PlC kode while (1) { laes alle inputs(); beregn all algoritmer(); udlaes alle beregnede outputs(); evt sleep until tid er(); } Man skal bemærke at I/O kun læses/skrives een gang pr runde... 13
En PLC Standard er ren digital I/O Analog I/O findes i større PLCer Indgår som PEEL-alike komponent i styringer af feks:... 14
... 15
Den interrupt drevne Start af en hændelsessekvens trigges af interrupt Flere interruptindgange flere uafhængige hændelsessekvenser... i modsætning til før... Har man mulighed for umiddelbart at løse delmål der hver især har forskellig varighed IDLE mode (hovedprogram) når der ikke er interrupts under behandling 16
Interrupt system I Interrupts løser tidskritisk opgave Hovedprogram forbruger overskydende tid MMI (excl nødstop) Statistik Setpunkt kommunikation,... 17
Interrupt II... I: 3 2 2 1 3 1 1 2 3 18
Interrupt II Interrupthyppighed kan variere over tid Svært at prediktere adfærd Starvation er en mulighed... man bør kende interruptmønstre og varighed af associeret kode effektivt! I: 3 2 2 1 3 1 1 2 3 19
Interrupt koden void interrupt nr1(...) { do_critical_code(); access_shared_vars(); UNLOCK_INTR(); do_your_code(); Oplåsning af interrupt giver mulighed for interleaving af interrupt (kaskading) Worst case analyse af tidsafvikling er et must } LOCK_INTR(); access_shared_vars(); UNLOCK_INTR(); 20
Parallellitet... For hver interrupt kend/mål/beregn varighed af kode Sæt en prioritet på opgaven Vent til skeduleringsdel af dette kursus (hint: RMA) 21
Parallellitet... Fattigmandsmultiprogrammering er ok Nemt, effektivt Kodevarighedsbegrænsninger = min tid imellem ISR Antal tråde == antal interrupts Kun et lag i processer (ISR's + eet hovedprogram) Testing by interrupting Hvor mange tråde er der brug for? (min knoppix lige nu har 59 programmer kørende...) Så 59 er nok et overkill i mange situationer 10 interrupts er nåeligt på megen HW 22
SPT 1 linie C bliver til 10 asm instruktioner i snit 1 asm instr pr 4 klokcykler 1000 interrupt pr sek koster ca 30000 usec ekstra 970000 usec tilbage 20 Mhz = 50 nsec = 0.2usec/asm instruktion 5.000.000 asm/sec = 0.5 mio linier C/sec???!!! 20 Mhz arkitektur Gå hjem og test det :-) 23
Parallellitet resume Selv små maskiner kan lave en hel del PCere er ofte et overkill Men er billige Er stabile...??? Alle kan finde ud af at bruge dem Med 500.000 linier C/sec er der nok mulighed for at bruge en del af dette til organisering af afvikling... læs kerne/parallelt operativsystem 24
TODO 2day Parallellitetsbegreb procesbegreb 25
Procesbegreb I Interrupt model - stak håndtering Prolog: prg status gemmes (ofte på stak) Epilog. Prg status reetableres (ofte fra stak) ISR rutine < 5 usec < 5 usec Main Main fort 26
ISR void interrupt jens(evt register reference) { /* PROLOG push af registre paa stak ofte af compiler */ din_kode_under_diablet_run(); evt_enable_en_del_af_isr_system(); din_enablede_kode_del(); } /* EPILOG: modsat af prolog */ 27
ISR tilstand: Inaktiv Intet ISR lige nu 28
ISR tilstand: Inaktiv Intet ISR lige nu Running ISR som kører på CPU lige nu 29
ISR tilstand: Inaktiv Intet ISR lige nu Running ISR som kører på CPU lige nu Ready ISR som ikke er på CPU da andet højere prio ISR kører 30
ISR tilstand: Inaktiv Intet ISR lige nu Running ISR som kører på CPU lige nu Ready ISR som ikke er på CPU da andet højere prio ISR kører Running & ready ISR kører og der er registreret endnu af samme prio 31
ISR tilstand: Inaktiv Intet ISR lige nu Running ISR som kører på CPU lige nu Ready ISR som ikke er på CPU da andet højere prio ISR kører Running & ready ISR kører og der er registreret endnu af samme prio Ready & ready Som ovenstående blot er først vrs ikke kørende pga prio problem 32
Parallellitet man vel egentligt:... Kunne afvikle kode/funktionalitet/tasks/threads/... Have flere instanser uhængig af hinanden Mulighed for at prioriterer hvis der i situationer er resourcemangel: (CPU,RAM,...) Trigge task fra Eksterne hændelser (ISR) Interne hændelser (andre task's) Være så uafhængig af HW som muligt Ikke bundet af antal CPU'er... 33
procesbegreb Kode, data, stak Tilstande Running - jeg kører lige NU Ready - jeg vil gerne køre lige NU Blocked - jeg vil ikke køre lige nu Inaktiv Ligner meget ISR Intet ISR lige nu Running ISR som kører på CPU lige nu Ready ISR som ikke er på CPU da andet højere prio ISR kø Running & ready ISR kører og der er registreret endnu af samme prio Ready & ready Som ovenstående blot er først vrs ikke kørende 34pga
Proces tilstande Running fordi Ready CPU resource ej tilgængelig Blocked Task venter på hændelse Ekstern ( ISR, timer/ur ISR) Intern (synk fra anden task) Running Ready Blocked 35
En proces Running: i = 3; for (j=0; j<44; j++) skriv_brev_til_dronningen(); Ready står frossen i og venter på at få CPU Blocked: i = 3; for (j=0; j<44; j++) skriv_brev_til_dronningen(); sleep(1000); 36
Peudo parallellitet tasks tiden 37
tidsdeling Når der er færre CPUer end tasks Kaldes pseudoparallel afvikling, idet der rent teknisk set ikke er noget parallelt. Ægte parallel afvikling ses sjældent Kernens opgave er at sørge for en smidig afvikling under optimering af de parametre man har valgt Valg af parametre er ofte det svære Statisk prioritering min far er stærkest! Dynamisk hvemses far er stærkest lige nu? Andre applikationsorienterede Hvad er FAIRNESS i den sammenhæng 38
Kernens datastrukturer Procesbeskrivelsen Indeholder den information der beskriver et kørende program/tasks set fra OS synspunkt Interrupt håndtering har næsten det samme problem Prolog: gemmer nødv status for program/task/... Epilog: reetablerer derudfra 39
Procesbeskrivelse typedef struct procesbeskrivelse_tp { int cpuregs[nr_regs]; int prioritet; aabne_filer,devices,... } procesbeskrivelses_tp; 40
Kernen II Skeduler Algoritme der udpeger hvem der skal være running Aktiveres af Task selv HW (interrupt) inkl timer Cyklisk tildeling af CPU tid: round robbin 41
Køer Aktiv kø Tasks der er i running og ready tilstand Andre køer (sleep kø, semafor kø,...) Tasks der venter på at blive gjort running/ready af hændelse som kan være Ekstern hændelse (interrupt) Intern hændelse (anden tasks der synker ) Aktiv kø 1 2 3 4 5 9 42
procebeskrivelse Lister en måde at gøre det på Statiske arrays en anden måde... Osv Egentlig uinteressant pånær Det skal være effektivt at flytte imellem køer... typedef struct procesbeskrivelse_tp { int cpuregs[nr_regs]; int prioritet; struct procesbeskrivelse_tp *next, *pred; int prioritet; aabne_filer,devices,... } procesbeskrivelses_tp; 43
Round robbin forreste er running Tick 1 1 2 3 4 5 9 Tick 2 2 3 4 5 9 1 Tick 3 3 4 5 9 1 2 Tick 4 4 5 9 1 2 3 running Ready'er 44
Er der mere i parallellitet???? Prioritet Statisk, dynamisk Og nok en hel masse mere 45
void *crt_task (void (*code) (void), char *stk, unsigned int stk_size) { /** * by hw flags 22 11 * cs 20 10 * ip 18 9 * push ax 16 8 * push bx 15 7 * push cx 12 6 * push dx 10 5 * push es 8 4 * push ds 6 3 * push si 4 2 * push di 2 1 * push bp 0 0 * int offset * byte offset */ int *stkk; stkk = (int *) stk; stkk += (stk_size / 2) 1; /* now point at top */ stkk = 13; /* make space for the register } /* the only registers to be preset are... */ *(stkk + 11) = 0x0200; /* flags */ *(stkk + 10) = FP_SEG (code); /* cs */ *(stkk + 9) = FP_OFF (code); /* ip */ *(stkk + 3) = _DS; /* ds */ return stkk; 46
Resten kan findes som http://www.control.aau.dk/~jdn/kernels/kelm/k3.c 47