Verwendung der POSIX-Library für Threads unter Linux
(EN google-translate)
(PL google-translate)
Teil 1 - Musterlösung zum Nachweis der Echtzeitfähigkeit
//Kompilieren: //cc echtzeit.c -o echtzeit //./echtzeit // chrt 1 ./echtzeit #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <signal.h> #include <time.h> #include <sys/time.h> #define ANZAHL 10000 int main(int argc, char *argv[]) { struct timeval now; unsigned long zeit[ANZAHL]; unsigned long zusatz = 0; unsigned long startzeit = 0; unsigned long mindist = 10000; unsigned long dist = 0; unsigned long t = 0; FILE* datei; unsigned long i=0; unsigned long k; for(i=0;i<ANZAHL;i++) { gettimeofday(&now, NULL); zeit[i] = now.tv_usec; } //Überläufe behandeln for(i=1;i<ANZAHL;i++) { if(zeit[i]<zeit[i-1]) zusatz+=1000000; zeit[i]+=zusatz; } //Startzeit abziehen startzeit = zeit[0]; for(i=0;i<ANZAHL;i++) zeit[i]-=startzeit; //Minimalen Abstand finden for(i=1;i<ANZAHL;i++) if(zeit[i+1]-zeit[i]<mindist) mindist=zeit[i+1]-zeit[i]; printf("mindist=%u\n",mindist); datei = fopen("./verlauf1.txt","w"); fprintf(datei,"startzeit=%u;\n",startzeit); fprintf(datei,"matrix=["); for(i=0;i<ANZAHL-1;i++) { dist = zeit[i+1]-zeit[i]; if(dist<=2*mindist) { for(k=0;k<dist;k++) { fprintf(datei,"%u 1\n",t); t++; } } else { for(k=0;k<dist;k++) { fprintf(datei,"%u 0\n",t); t++; } } } fprintf(datei,"];\n"); fclose(datei); }
Code 0-1: Quelltext echtzeit.c (vergl. Vorlesung).
Bild 0-1: Beispiel für die Prozeßaktivität bei einer 2-Kern-CPU OHNE andersweitige Last und OHNE besondere Priorisierung.
Bild 0-2: Beispiel für die Prozeßaktivität bei einer 1-Kern-CPU mit hoher anderweitiger Prozeßlast und ohne besondere Priorisierung mit Echtzeit-Linux, Zeit in Mikrosekunden (Millionstel-Sekunden).
Bei Echtzeit-Priorisierung des Testprozesses auf 1-Kern-CPU mit hoher anderweitiger Prozeßlast mit Echtzeit-Linux sinkt die Zyklusdauer durchgehend auf unter eine Mikrosekunde.
Im Unterricht werden die Möglichkeiten der pthread-library behandelt.
Aufgabe
|