hast du dazu einen aktualisierten code ?
hast du dazu einen aktualisierten code ?
Es gibt 10 Sorten von Menschen: Die einen können binär zählen, die anderen
nicht.
ist immer noch der von #7 !
- - - Aktualisiert - - -
gerade getestet:
thread_local uint32_t counter = 0;
macht hier auch keinen Unterschied
ja ... sorry ... hab ich nicht gesehen
interessante ausgabe, gebe ich zu ... es wäre mal interessant zu erfahren wie der zeitliche ablauf bei der ausgabe aussieht! ich vermute hier das problem!
benutze mal irgend einen timer mit einer auflösung im wenigstens 100tel Sekunden bereich und speichere vor und nach jedem sleep jeweils einmal die zeit und gib die zeiten plus die aktuelle zeit auch als print aus
also quasi print("Jetzt: %d Vorher: %d Nachher %d",timer.now(), beforesleep, aftersleep)
so kann man erstmal prüfen ob der sleep vernünftig funktioniert und dann ob der print hier irgendwelche delays verursacht
ich denke dass die ausgaben bei dir nicht chronologisch korrekt ausgegeben werden
Es gibt 10 Sorten von Menschen: Die einen können binär zählen, die anderen
nicht.
hmmm... könnte vlt...
andererseits wird in den blinker_thread zwischen dem ON/OFF-Paar gar nicht inkrementiert, also egal, wann das ausgegeben wird, es müsste 1 ON/OFF-Paar IMO erwartungsgemäß IMMER mit demselben gemeinsamen counter-Wert erscheinen...
...oder?
nicht zwingend, deswegen meinte ich ja ich vermute hier eine sogenannte race condition, ich würde gerne ausschließen dass der print hier dazwischen funkt und daher wollte ich auch dass du in einer print funktion gleichzeitig variablen und einen funktionsaufruf nutzt um mal einen einblick auf den ablauf zu bekommen und das sleep gleichzeitg zu testen (zwei sleeps in einem thread können je nach architektur lustige effekte haben)
und mit architektur meine ich das thread handling und den "sheduler"
Es gibt 10 Sorten von Menschen: Die einen können binär zählen, die anderen
nicht.
ok, aber ich verstehe deinen code-Vorschlag noch nicht exakt.
Könntest du das bitte mal in den ino-Code genau hineinschreiben, fertig compilierbar?
sorry, da müsste ich erstmal selber was probieren, hab keinen plan wie man auf die schnelle bei arduino nen timer hinbastelt
Es gibt 10 Sorten von Menschen: Die einen können binär zählen, die anderen
nicht.
update:
mutex ist doch drin, braucht nur zusätzlich
was ich nicht wusste,Code:#include <mutex>
dann klappt jetzt auch
Code:std::mutex print_mutex; void myPrint(String str) // String: Arduino API // C++: std::string { print_mutex.lock(); Serial.println(str); print_mutex.unlock(); }
es gibt hier noch einen Bug oder Issue, wie man thread prios richtig setzt - bisher brachten alle Vorschläge noch keine Lösung.
Man muss nämlich die thread prios der main loop prio angleichen, wenn beide ohne delays parallel laufen sollen
(std::threads laufen nämlich per prio=5 per default, main loop nur bei default prio=1!!):
funktioniert nicht, weil anfangs cfg noch keine Werte enthält und daher einen Fehler zurückgibt,Code:esp_pthread_cfg_t cfg; esp_pthread_get_cfg(&cfg); cfg.prio=1; esp_pthread_set_cfg(&cfg);
und
funktioniert auch nicht, weil die hier verwendete FunktionCode:esp_pthread_cfg_t cfg; if (esp_pthread_get_cfg(&cfg) != ESP_OK) { cfg = esp_pthread_get_default_config(); } cfg.prio=1; if (esp_pthread_set_cfg(&cfg) != ESP_OK) { printf("esp_pthread_set_cfg failed\n"); abort(); };
esp_pthread_get_default_config();
nicht gefunden wird.
siehe Topic-Posts u.a.
https://github.com/espressif/ESP8266...SDK/issues/609
https://github.com/espressif/esp-idf...ment-496157019
und folgende...
betroffene libs am ehesten wohl
https://github.com/espressif/ESP8266...ts/pthread/src
Hat jemand eine idee, wie es richtig geht?
Geändert von HaWe (29.05.2019 um 08:02 Uhr)
update:
der ESP32 scheduler arbeitet tatsächlich nur eingeschränkt preemptiv, u.a. da er vom FreeRTOS und seinem Watchdog abhängig ist, der nur begrenzt ausgeblendet/resetted werden kann,sobad ein Thread "stalled", und dann das gesamte System sich aufhängt.
Außerdem scheint es dann auch Probleme mit threads zu geben, die auf den 2 cores laufen und dann (IIUC) ebenfalls zu Konflikten führen.
update:
trotz hoffnungsvoller Nachrichten in ESP32 github repo: noch immer nicht gelöst
Geändert von HaWe (30.07.2019 um 10:17 Uhr)
Lesezeichen