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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.