Fö 8 TSEA81. Real-time Linux

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

Tentamen. Datorteknik och realtidssystem

Dynamiskt minne. Vad är dynamiskt minne Motivering Hur gör man i C Övningar

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

Övning från förra gången: readword

Tentamen Datorteknik och realtidssystem, TSEA81 Datum Lokal

En kort text om programmering i C.

Raspberry Pi och Tellstick, ett program i C.

Objektorienterad Programmering (TDDC77)

I Skapa Hej.java och skriv programmet. I Kompilera med javac Hej.java. I Rätta fel och repetera tills du lyckas kompilera ditt program

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

Fortsä'ning Pekare. Ulf Assarsson. Originalslides av Viktor Kämpe

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

Och!efter!ca!20!omgångar!hamnade!den!på!en!stabil!konfiguration!enligt!nedan! där!den!stannar!kvar.!

Operativsystem (ID2200/06) XX XX:00-XX:00

Vad händer när man kör ett program? Program och processer. Funktionsanrop. Avsluta programmet

Programmeringsteknik med C och Matlab

Programmering av inbyggda system. Pekare och Arrayer. Viktor Kämpe

2 Pekare och dynamiska variabler.

Objektorienterad Programmering (TDDC77)

GU / Chalmers Campus Lindholmen Tentamen Programutveckling LEU 482 / TIG167

Programmering av inbyggda system. Kodningskonventioner. Viktor Kämpe

Föreläsning 10. Pekare (Pointers)

Fö 4 TSEA81. Monitors and Message passing. Condition variables - händelsevariabler

Programmeringsteknik med C och Matlab

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

Föreläsning 13. In- och utmatning

Pekare och arrayer. Indexering och avreferering

Fö 4 TSEA81. Monitors and Message passing

Lösningar till tentauppgifterna sätts ut på kurssidan på nätet idag kl 19. Omtentamen i Programmering C, 5p, fristående, kväll,

Ulf Assarsson. Grundläggande C-programmering del 2 Pekare och Arrayer. Läromoment:

Objektorienterad Programmering (TDDC77)

Exam Concurrent and Real-Time Programming

Laboration 3, uppgift En klass för en räknare

Programmering med Java. Grunderna. Programspråket Java. Programmering med Java. Källkodsexempel. Java API-exempel In- och utmatning.

KTH STH TENTAMEN. HI1024:TEN2 - Praktisk tentamen Tid: 8-13, den 18 februari 2012

Tentamen i EIT070 Datorteknik

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

Datatyper och kontrollstrukturer. Skansholm: Kapitel 2) De åtta primitiva typerna. Typ Innehåll Defaultvärde Storlek

Lösningar till uppgifterna sätts ut på kurssidan på nätet i dag kl Omtentamen i Programmering C, Fri, Kväll,

Grundläggande C-programmering del 2 Pekare och Arrayer. Ulf Assarsson

Schemaläggning Unix. Minneshantering etc. Linux. Schemaläggning av trådar (kernel threads) Detaljer. Operativsystem - Lektion 7

Det finns många flaggor till g++,

Lösningar till uppgifterna sätts ut på kurssidan på nätet i dag kl Tentamen i Programmering C, Fri, Kväll,

Objektorienterad programmering i Java Undantag Sven-Olof Nyström Uppsala Universitet Skansholm: Kapitel 11

Systemnära programmering Tentamen. Systemnära programmering, 7.5hp 5 november 2012

Grundläggande C-programmering del 2 Pekare och Arrayer. Ulf Assarsson

... Funktionsanrop. Vad händer när man kör ett program?

Föreläsning 3. Programmering, C och programmeringsmiljö

Avancerad SSL-programmering I

Utkast. Programmering. Signals. Olika typer av program. Sommarkurs Avbrott i mjukvara.

Tentamen i TDP004 Objektorienterad Programmering Lösningsförslag

Tentamen *:58/ID100V Programmering i C Exempel 3

DAT043 Objektorienterad Programmering

Operativsystem Lektion 1. Lärare. Schema. Kurssajten Finns på adressen. Jan Erik Moström. Set Norman

Möte 7: Uppföljning av föreläsningen med Peer Instruction - (PI)

Lösningar till uppgifterna sätts ut på kurssidan och på WebCT (Gamla Tentor) i dag kl 19. Tentamen i Programmering C, 5p, Distans, övriga,

const och pekare Output: char *unsafe(char *s) { // Returnerar pekare till det andra tecknet i s printf("%s \n", s);

Tellstick-15.c. Kompilering av programmet: gcc -o tellstick-15 -Wall -ltelldus-core -W -O2 -s -pipe -lm tellstick-15.c

Enkla datatyper minne

printenv sort pager printenv grep args sort pager

SP:PROG3 HT12 Tenta

TDIU01 - Programmering i C++, grundkurs

BINÄRA TRÄD. (X = pekarvärdet NULL): struct int_bt_node *pivot, *ny; X X X 12 X X 12 X X -3 X X

Exempelsamling Assemblerprogrammering

Tommy Färnqvist, IDA, Linköpings universitet

Deklarera en struct som kan användas för att representera en rät linje

Institutionen för elektro- och informationsteknologi, LTH

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

Tentamen i. för D1 m fl, även distanskursen. lördag 28 maj 2011

Programmering B med Visual C

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

Tentamen i Grundläggande programmering STS, åk 1 fredag

Realtidsstöd i Minix. En laborationrapport. Oktober 2012

Code-Lite tutorial ( /RoJ)

Programmering i C. Christer Sandberg, Gunilla Eken, Stefan Bygde Olof Andersson Linus Källberg Caroline Uppsäll Johan Hägg

GU / Chalmers Campus Lindholmen Tentamen Programutveckling LEU 482 / TIG167

Realtidsprogrammering. En introduktion Implementering (med exempel från PIC)

Länkade listor kan ingå som en del av språket, dock ej i C Länkade listor är ett alternativ till:

Objektorienterad programmering. Fält som funktionsresultat. Mer om fält: att uppdatera ett parameterfält. Kontrast: Parametrar av primitiv typ

Lösningar till uppgifterna sätts ut på kurssidan på nätet i dag kl 13. Omtentamen i Programmering C, 5p, A1, D1, PA1, Fri,

Det finns en referensbok (Java) hos vakten som du får gå fram och läsa men inte ta tillbaka till bänken.

Systemkonstruktion LABORATION REALTIDSPROGRAMMERING

Symboliska konstanter const

Tentamen. Datorteknik och realtidssystem

Lite om felhantering och Exceptions Mer om variabler och parametrar Fält (eng array) och klassen ArrayList.

Operativsystem ID1200/06 och ID2200/06 Tentamen TENA 6 hp :00-18:00

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

Programmering för språkteknologer II, HT2011. Rum

TDIU01 - Programmering i C++, grundkurs

Planering Programmering grundkurs HI1024 HT 2014

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

Föreläsning 6: Introduktion av listor

Agenda. Arrayer deklaration, åtkomst Makron Flerdimensionella arrayer Initiering Strängar Funktioner och arrayer. Övningar nu och då

Lösningar till tentamen i EIT070 Datorteknik

ÖREBRO UNIVERSITET. Lösningarna till tentamensuppgifterna sätts ut på kurssidan på nätet i dag kl 13.

Lösningar till tentamen i EIT070 Datorteknik

Ett enkelt program i C++, hello.cpp. #include <iostream> int main() { std::cout << "Hello World\n"; return 0; } C++, Övning 1

Laboration 3 HI1024, Programmering, grundkurs, 8.0 hp

Objektorienterad Programkonstruktion. Föreläsning 11 6 dec 2016

Transkript:

Fö 8 TSEA81 Real-time Linux

Real-time Linux Olika sätt att åstadkomma Real-time Linux: * Linux 2.6 har CONFIG_PREEMPT option, dvs även processer som gör systemanrop kan preemptas. * Linux 2.6 kan köras med O(1)-scheduler, dvs schemaläggning kan göras på konstant tid, och CFS (Completely Fair Scheduler) som maximerar CPU-utnyttjande och interaktivitet. * Patch : CONFIG_PREEMPT_RT, gör så att hela Linux-kärnan kan preemptas. * Thin kernel : Kör Linux som en lågprioriterad process i en s k thin kernel, vilken kör som ett RTOS.

Stegmotor-demo : uppkoppling +12V Raspberry Pi 2 PIN0 PIN1 PIN2 PIN3 GND Drivsteg o N S N S N S Stegmotor

Stegmotor-demo : styrsignaler PIN3 PIN2 PIN1 PIN0 0 t

Stegmotor-demo : Linux GPIO // Export the pin to the GPIO directory FILE *fp=open("/sys/class/gpio/export","w"); fprintf(fp,"%d",gpioport); fclose(fp); // Set the pin as an output char filename[256]; sprintf(filename,"/sys/class/gpio/gpio%d/direction",gpioport); fp = fopen(filename,"w"); if(!fp){ panic("could not open gpio file"); fprintf(fp,"out"); fclose(fp);

Stegmotor-demo : Linux GPIO // Open the value file and return a pointer to it. sprintf(filename,"/sys/class/gpio/gpio%d/value",gpioport); fp = fopen(filename,"w"); if (!fp) { panic("could not open gpio file"); return fp; // Set the I/O pin to the specified value. void setiopin(file *fp, int val) { fprintf(fp,"%d\n",val); fflush(fp);

Stegmotor-demo : stepper0.c main()... { FILE *pin0 = init_gpio(14); FILE *pin1 = init_gpio(15); FILE *pin2 = init_gpio(17); FILE *pin3 = init_gpio(18); signal(sigint, dumptimestamps); while(1){ usleep(delay); logtimestamp(); setiopin(pin0,1); usleep(delay); logtimestamp(); setiopin(pin3,0); usleep(delay); logtimestamp(); setiopin(pin1,1); usleep(delay); logtimestamp(); setiopin(pin0,0); usleep(delay); logtimestamp(); setiopin(pin2,1); usleep(delay); logtimestamp(); setiopin(pin1,0); usleep(delay); logtimestamp(); setiopin(pin3,1); usleep(delay); logtimestamp(); setiopin(pin2,0);

Stegmotor-demo : stepper0.c Problem med stepper0.c: * Vi väntar en relativ tid med usleep() * Tiden mellan varje händelse på utsignalerna blir delay+x, där X beror på körtiden för logtimestamp() och setiopin() Lösning: * Använd clock_nanosleep

Stegmotor-demo : stepper1.c void sleep_until(struct timespec *ts, int delay) { ts->tv_nsec += delay; if(ts->tv_nsec > 1000*1000*1000){ ts->tv_nsec -= 1000*1000*1000; ts->tv_sec++; clock_nanosleep(clock_monotonic, TIMER_ABSTIME, ts, NULL); struct timespec { time_t tv_sec; // seconds long tv_nsec; // nanoseconds [0.. 999999999] ;

Stegmotor-demo : stepper1.c main()... { FILE *pin0 = init_gpio(14); FILE *pin1 = init_gpio(15); FILE *pin2 = init_gpio(17); FILE *pin3 = init_gpio(18); signal(sigint, dumptimestamps); clock_gettime(clock_monotonic, &ts); while(1){ sleep_until(&ts, delay); logtimestamp(); setiopin(pin0,1); sleep_until(&ts, delay); logtimestamp(); setiopin(pin3,0); sleep_until(&ts, delay); logtimestamp(); setiopin(pin1,1); sleep_until(&ts, delay); logtimestamp(); setiopin(pin0,0); sleep_until(&ts, delay); logtimestamp(); setiopin(pin2,1); sleep_until(&ts, delay); logtimestamp(); setiopin(pin1,0); sleep_until(&ts, delay); logtimestamp(); setiopin(pin3,1); sleep_until(&ts, delay); logtimestamp(); setiopin(pin2,0);

Stegmotor-demo : stepper1.c Problem med stepper1.c: * Utsignalerna kommer även nu att uppvisa jitter (fasbrus) på grund av övrig aktivitet i systemet, särkilt vid hög belastning. Lösning: * Sätt realtidsprioritet

Stegmotor-demo : stepper2.c main()... {... // SCHED_FIFO: Processen kör tills en högre prioriterad process // vill köra. Finns även med SCHED_RR. // Kräver oftast root! struct sched_param sp; sp.sched_priority = 30; pthread_setschedparam(pthread_self(), SCHED_FIFO, &sp); While(1) { // samma som i stepper1.c

Stegmotor-demo : stepper2.c Problem med stepper2.c: * Andra saker kan påverka realtidsprestandan: -Minnesanvändning hos andra processer kan störa realtidsprocesser. -Processen får inte bli utswappad, dvs dess använda minne får inte läggas ut i swap-minnet (swap space) som har lång access-tid. * Linux använder overcommit vid minnesanvändning: -malloc() garanterar inte att det minne som allokeras faktiskt existerar. Man får ett virtuellt minne tilldelat, och minnet allokeras fysiskt egentligen först när det används. Lösning: * Lås minnet till processen med mlockall()

Stegmotor-demo : stepper3.c main()... {... // CURRENT: Nuvarande sidor låses // FUTURE: Framtida allokeringar låses // Kräver oftast root! if (mlockall(mcl_future MCL_CURRENT)) { fprintf(stderr, WARNING: Failed to lock memory\n );... While(1) { // samma som i stepper2.c

Stegmotor-demo : användarinmatning Problem: * Hur matar vi in data till programmet utan att blockera? Vi kan ju självklart inte göra så här: while(1) { sleep_until(&ts, delay); logtimestamp(); setiopin(pin0,1);... sleep_until(&ts, delay); logtimestamp(); setiopin(pin2,0); printf( Enter new delay value: ); scanf( %d, &delay); Lösning: * Använd non-blocking I/O (stökigt!) eller ännu bättre, gör inmatning av data i en annan tråd och kommunicera med realtidstråden via symmetrisk synkronisering, dock ej blockerande sådan!

Stegmotor-demo : stepper.c struct stepper { sem_t sem; sem_t rt_sem; int delay;... ; void *user_thread(void *arg) { struct stepper *step = (struct stepper *) arg; while(1) { // get_delay läser indata step->delay = get_delay(); sem_post(&step->sem); // invänta stepper_thread sem_wait(&step->rt_sem); void *stepper_thread(...) { int delay; // lokal kopia av step->delay while(1) {... // om vi inte kan låsa fortsätter vi if (!sem_trywait(&step->sem)) { delay = step->delay; // Acknowledge sem_post(&step->rt_sem);...

Stegmotor-demo : stepper.c Problem: Hur hämtar vi data från stepper_thread? Lösning: Inför fler fält och flaggor i structen: struct stepper { sem_t sem; sem_t rt_sem; int delay; int get_steps; // flagga 0/1 int num_steps; // antal steg... ; void *stepper_thread(...) { int num_steps;... if (!sem_trywait(&step->sem)) { delay = step->delay; if (step->get_steps) { step->get_steps = 0; step->num_steps = num_steps; // Acknowledge sem_post(&step->rt_sem);

Lab6 : Real-time Linux void *maintask(void) { for (i=0; i<2048; i++) { sleep(1 ms); read_sample(channel); if (i==256,512,768...) { do_work(sample_buffer);

Tips till tentan -Är man ovan vid C-programmering, öva på det! -Senare tentor har programskal som kan användas för att testköra lösningar -Motivera svaren -Kommentera programkoden -Är man osäker på det exakta namnet för en funktion, skriv vad ni tror och kommentera vad den gör så att vi förstår vad ni menar. -Syntaxen är inte superviktig. Om programkoden kan tolkas entydigt så är det okej. -Skriv läsbart! Oläsbar text kan inte bedömas. -Lycka till!