Forum: Mikrocontroller und Digitale Elektronik ESP32 Tasks portENTER_CRITICAL


von mx (Gast)


Lesenswert?

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;

von Mike R. (thesealion)


Lesenswert?

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
von mx (Gast)


Lesenswert?

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?

von John Doe (Gast)


Lesenswert?

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.

von mx (Gast)


Lesenswert?

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

von John Doe (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.