Hi,
ich setz mich grad mit dem Thema FreeRTOS auseinander und hab ein paar Verständnisfragen.
Folgendes Beispiel-Szenario (rein fiktiv):
// Dieser Task soll alle x Sekunden prüfen, ob ein WiFi-Verbindung besteht und falls nein, diese neu aufbauen
xTaskCreatePinnedToCore(
keepWiFiAlive,
"Keep Wifi Alive",
5000,
NULL,
2,
NULL,
CONFIG_ARDUINO_RUNNING_CORE
);
void keepWifiAlive {
for (;;) {
if (WiFi.status() == WL_CONNECTED) {
vTaskDelay(10000 / portTICK_PERIOD_MS);
continue;
}
WiFi.begin(ssid, password);
unsigned long startAttemptTime=millis();
while (WiFi.status() != WL_CONNECTED && millis() - startAttemptTime < WIFI_TIMEOUT_MS) {
}
if (WiFi.status() != WL_CONNECTED) {
vTaskDelay(300000 / portTICK_PERIOD_MS);
continue;
}
} else {
vTaskDelay(10000 / portTICK_PERIOD_MS);
continue;
}
}
}
// Dieser hier soll alle x Sekunden prüfen, ob der ESP mit dem MQTT-Server verbunden ist, und falls nein, die Verbindung herstellen
xTaskCreatePinnedToCore(
keepMQTTAlive,
"Keep MQTTAlive",
5000,
NULL,
2,
NULL,
CONFIG_ARDUINO_RUNNING_CORE
);
void keepMQTTAlive(void * parameters) {
for (;;) {
// usw.
}
}
Wie geht der ESP damit um, wenn zwei Tasks sich zeitlich überschneiden?
Regelt er das über die Prio, oder ? Oder wäre es besser, z.B. aus den oberen zwei Tasks einen zu machen, der zuerst prüft, ob die WiFi-Verbindung steht und falls ja danach dann direkt ob die MQTT-Verbindung besteht?
Oben habe ich xTaskCreatePinnedToCore() verwendet, weil ich das aus einem Beispiel so übernommen habe. Wäre es grundsätzlich besser, xTaskCreate() zu verwenden und somit dem ESP selber entscheiden zu lassen, welchen Core er nimmt? Denn woher weiß ich denn, welcher Core die bessere Wahl ist? Und man kann als Parameter statt dem Core ja auch tskNO_AFFINITY übergeben --> Ist das dann das gleiche Resultat wie xTaskCreate()?
Wie kann ich "berechnen", wie groß die Stacksize sein soll?
Von was macht man das Abhängig? z.B. im oberen "keepWiFiAlive" - Task? Wie kommt der Autor dieser Funktion (hab ich aus einem Tutorial) gerade auf die 5000? Warum nicht 4000 oder 6000?
Was passiert, wenn ich hier einen zu großen Wert nehme?
Viele Grüße und n guten Start in die Woche!