Table of Contents

Laboratorul 11 - Mutexuri FreeRTOS

Introducere

Dacă laboratorul trecut a fost destinat semafoarelor, cel de astăzi este dedicat mutexurilor.

Semafoarele binare și mutexurile sunt similare, dar prezintă două diferențe principale:

În schimb, semafoarele binare blocate pot fi deblocate de orice alt task și nu există un mecanism de prioritizare.

Similar cu semafoarele, mutexurile sunt referite cu ajutorul handle-urilor. De asemenea, pentru a le utiliza, este necesară declararea bibliotecii semphr.h.

// Include biblioteca FreeRTOS
#include <Arduino_FreeRTOS.h>
 
// Include biblioteca pentru semafoare
#include <semphr.h>
 
// Declară o variabilă globală de tipul SemaphoreHandle_t
SemaphoreHandle_t mutex;

În Documentația oficială FreeRTOS, API-ul corespunzător este prezentat începând cu pagina 208, împreună cu exemple de utilizare pentru fiecare funcție.

Declarare

După cum am specificat anterior, există câteva diferențe între semafoarele binare și mutexuri. Întrucât pot fi deblocate de orice task, semafoarele binare sunt mai potrivite atunci când avem nevoie de o sincronizare a două taskuri.

Pe de altă parte, mutexurile sunt utilizate în principal pentru gestionarea accesului la o resursă partajată și sunt create cu ajutorul funcției xSemaphoreCreateMutex(), care alocă spațiu în heap. Dacă valoarea întoarsă este NULL, nu există suficientă memorie disponibilă.

Exemplu:

SemaphoreHandle_t xSemaphore;
void vATask( void * pvParameters )
{
 xSemaphore = xSemaphoreCreateMutex(); // Apelare funcție creare mutex
 if( xSemaphore == NULL )
 {
 /* Spațiu de memorie insuficient */
 }
 else
 {
 /* Mutexul poate fi utilizat */
 }
}

Utilizare

Pentru a lucra cu mutexurile, se utilizează același funcții ca în cazul semafoarelor. Funcțiile de interes sunt:

Funcțiile Give și Take întorc două valori posibile: pdPASS dacă operația a fost realizată cu succes sau pdFAIL dacă nu.