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
|