Hallo, ich möchte mit meinem esp32 mehrere Tasks verwenden. Um globale Variablen mit beiden Tasks zu verwenden wird in den Beispielcodes die ich gefunden habe ein Lock beim Schreiben verwendet. Aber nur beim Schreiben oder?. Jedoch bin ich mir jetzt nicht sicher was der lesende Task bekommt während der schreibende gerade im Lock schreibt. Beispiel: #pragma pack(1) union MY_DATA{ u_char data[4]; struct{ u_int val; }; }; #pragma pack() MY_DATA my_data = {}; //=========================================================== //Task1 schreibt: portENTER_CRITICAL(&myMux); my_data.data[0] = 0xFF; my_data.data[1] = 0xFF; // <------ Hier liest zB der andere Task my_data.data[2] = 0xFF; my_data.data[4] = 0xFF; portEXIT_CRITICAL(&myMux); //=========================================================== //Task 2 liest zu markiertem Zeitpunkt.... val = my_data.val;
Wenn ich die Beschreibung vom ESP richtig verstehe, sollte auch ein anderer Task an der Stelle nicht lesen können, da der Zugriff auf den Speicher durch das portENTER_CRITICAL() geschützt ist. Edit: Das der Lock nur beim schreiben verwendet wird liegt daran, dass parallels lesen erlaubt ist. Nur wenn EINER schreibt, wird der Speicher für alle anderen gesperrt.
:
Bearbeitet durch User
Danke, also ist das sicher und in meinem Beispiel kann das nicht vorkommen, dass zB.: val 0x0000FFFF statt 0xFFFFFFFF gelesen wird (Wenn vor dem Lock das union Null war.) Also wird das ganze union von ENTER bis EXIT für den Lesezugriff gesperrt, bzw der Task der lesen will muss warten bis EXIT und ist kurz geblockt?
Zuerstmal solltest Du taskENTER_CRITICAL benutzen. Letztlich ruft das nur portENTER_CRITICAL auf, ist aber Teil des APIs. https://www.freertos.org/taskENTER_CRITICAL_taskEXIT_CRITICAL.html taskENTER_CRITICAL sperrt die Interrupts, es können also im kritischen Abschnitt keine Task-Wechsel vorkommen. Dein Szenario mit dem lesenden Task ist daher nicht möglich.
John Doe schrieb: > taskENTER_CRITICAL sperrt die Interrupts, es können also im kritischen > Abschnitt keine Task-Wechsel vorkommen. Dein Szenario mit dem lesenden > Task ist daher nicht möglich. Bei mir laufen aber die 2 Kerne somit ist das Szenario meiner Meinung nach möglich. Bin mir aber immer noch nicht sicher ob der Lesende Task geblockt wird wenn ein anderer zwischen ENTER und EXIT schreibt...
mx schrieb: > John Doe schrieb: >> taskENTER_CRITICAL sperrt die Interrupts, es können also im kritischen >> Abschnitt keine Task-Wechsel vorkommen. Dein Szenario mit dem lesenden >> Task ist daher nicht möglich. > > Bei mir laufen aber die 2 Kerne somit ist das Szenario meiner Meinung > nach möglich. > Bin mir aber immer noch nicht sicher ob der Lesende Task geblockt wird > wenn ein anderer zwischen ENTER und EXIT schreibt... Warum schaust Du nicht einfach in die Doku? Da steht es nämlich drin: https://docs.espressif.com/projects/esp-idf/en/latest/api-guides/freertos-smp.html
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.