Prof. J. Walter - Informationstechnik, Mikrocomputertechnik, Digitale Medien Softwaredoku
Hochschule Karlsruhe Logo Informationstechnik
LED-App
Wintersemester 2020
pran1015@hs-karlsruhe.de
lore1013@hs-karlsruhe.de

Software Dokumentation

An dieser Stelle wird die Funktionsweise des Programms zur Messung der 3 Bibliotheken beschrieben.


Das Programm muss folgende leisten:
1. Ansteuerung des LED-Rings.
2. Abfragen der Zeit und Prozessorauslastung (in Prozent) von den laufenden Aufgaben.

1.  Ansterung des LED-Rings.
Beim ESP32 wird jede Millisekunde eine zusätzliche Verzögerung von etwa 5 Mikrosekunden in den Signalausgang eingefügt. Dies liegt weit außerhalb der Neopixel-Timing-Toleranz von 150 ns, sodass es in einigen Pixeln zu falschen Werten kommt. Damit der LED_Ring die gewünschte Farbe korrekt anzeigt, es gibt eine Sache die wir ändern müssen und zwar wir sollen in jeder Bibliothek als GRBW schicken.

Der Quellcode wurde so geschrieben, dass er lessbar ist und wenn möglich die eingebauten Bibliothekensfunktionen verwenden. In diesem Versuch haben wir 2 LEDs-Rings zwar 16 LEDs und 12 LEDs angesteuert. Die Funktion zur Ansteuerung wurde es direkt mit einer for-Schleife und selbst geschriebene Funktion gemacht, hier verglichen wir die Zeit, wenn direkt alle LEDs angemacht werden und wenn einzelne LED bis alle LEDs angemacht wird. Unten steht das Beispiel mit dem Bibliothek Adafruit_Neopixel.
void TurnOn( void )
{
    // For a set of NeoPixels the first NeoPixel is 0, second is 1, all the way up to the count of pixels minus one.
    // pixels.Color takes RGB values, from 0,0,0 up to 255,255,255
    for(i=0; i<NUMPIXELS; i++){
        pixels.setPixelColor(i, Blue);
        pixels.show();
    }
    delay(1000);
}

Der Unterschied liegt an der Position der Delay-Function, das obige Beispiel macht alle LEDs an.


2. Abfragen der Ausführungszeit und Prozessorauslastung (in Prozent) von den laufenden Tasks/Threads.
Die Messung lassen wir in einem anderem Thread laufen, sodass jede Task seine eigene Aufgabe hat.

char buffer[1024];   //ein Buffer für die Rückgabe von Funktion "vTaskGetRunTime"

unsigned int delayTime;    // Variable für die Intervall der Ausgabe von Prozessorauslast(runtimestats)
void time_stats(void* pvparam){
    int j = 1;
    while(1)
    {
        printf("\nMessung :%d\n", j);
        vTaskGetRunTimeStats(buffer);
        printf("| Task | Run Time | Percentage\n");
        printf("\n%s",buffer);
        j++;
        //printf("pvparam: %d",(*(int*)pvparam));
        vTaskDelay((*(int*)pvparam)/portTICK_PERIOD_MS);   //delay mit eingegebene Parameter(in ms)
    }
    vTaskDelete(NULL);
}

void get_CPU(int pms){
    delayTime = pms;
    //printf("delay:%d",delay);
    xTaskCreatePinnedToCore(time_stats,"get_CPU",4096,(void*)&delayTime,3,NULL,0);  //Neue Task für runtimestats erstellen
}


Die Interval für die Ausgabe der Prozessorauslast ist einstellbar("get_CPU(delay_in_ms)").





  Mit Unterstützung von Prof. J. Walter Wintersemester 2020