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)").
|