This shows you the differences between two versions of the page.
patr:laboratoare:11 [2022/01/13 13:57] alexandru.ionita99 |
patr:laboratoare:11 [2022/01/13 14:04] (current) alexandru.ionita99 [Utilizare] |
||
---|---|---|---|
Line 30: | Line 30: | ||
==== Declarare ==== | ==== 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. De exemplu, un task mai rapid poate fi blocat la un semafor până când un task mai lent ajunge într-un punct în care îl deblochează. \\ | + | 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ă. \\ | + | 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:** | **Exemplu:** | ||
Line 55: | Line 55: | ||
==== Utilizare ==== | ==== Utilizare ==== | ||
- | Următoarele funcții sunt de interes: | + | Pentru a lucra cu mutexurile, se utilizează același funcții ca în cazul semafoarelor. Funcțiile de interes sunt: |
- | * Pentru a afla valoarea unui semafor, este utilizată funcția **UBaseType_t uxSemaphoreGetCount( SemaphoreHandle_t xSemaphore )** | + | |
- | * Pentru a crește valoarea unui semafor, este utilizată funcția **BaseType_t xSemaphoreGive( SemaphoreHandle_t xSemaphore )** | + | * **UBaseType_t uxSemaphoreGetCount( SemaphoreHandle_t xSemaphore )** - întoarce valoarea mutexului (0 sau 1) |
- | * Pentru a scădea valoarea unui semafor, este utilizată funcția **BaseType_t xSemaphoreTake( SemaphoreHandle_t xSemaphore, TickType_t xTicksToWait)**. Al doilea parametru specifică timpul maxim pe care un task îl poate petrece așteptând deblocarea semaforului. După depășirea acestui timp, taksul își continuă execuția | + | * **BaseType_t xSemaphoreGive( SemaphoreHandle_t xSemaphore )** - eliberează mutexul |
- | * Pentru a șterge un semafor, este utilizată funcția **void vSemaphoreDelete( SemaphoreHandle_t xSemaphore )** | + | * **BaseType_t xSemaphoreTake( SemaphoreHandle_t xSemaphore, TickType_t xTicksToWait)** - blochează mutexul. Al doilea parametru specifică timpul maxim pe care un task îl poate petrece așteptând deblocarea mutexului, dacă este deja blocat de un alt task. După depășirea acestui timp, taksul își continuă execuția |
+ | * **void vSemaphoreDelete( SemaphoreHandle_t xSemaphore )** - șterge mutexul referit prin handle | ||
<note tip>Funcțiile **Give** și **Take** întorc două valori posibile: **pdPASS** dacă operația a fost realizată cu succes sau **pdFAIL** dacă nu.</note> | <note tip>Funcțiile **Give** și **Take** întorc două valori posibile: **pdPASS** dacă operația a fost realizată cu succes sau **pdFAIL** dacă nu.</note> |