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
  |