ESP32 Tasks portENTER_CRITICAL

Gast #6151892
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;
#6151968
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.
Gast #6152183
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?
Gast #6152721
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...
Gast #6153215
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren