This shows you the differences between two versions of the page.
|
patr:laboratoare:10 [2022/01/12 15:21] alexandru.ionita99 |
patr:laboratoare:10 [2022/01/13 14:00] (current) alexandru.ionita99 |
||
|---|---|---|---|
| Line 7: | Line 7: | ||
| FreeRTOS utilizează următoarele tipuri de semafoare, pe care le vom detalia în continuare: | FreeRTOS utilizează următoarele tipuri de semafoare, pe care le vom detalia în continuare: | ||
| * Semafoare binare | * Semafoare binare | ||
| + | * Semafoare generalizate | ||
| * Mutexuri | * Mutexuri | ||
| - | * Semafoare generalizate | ||
| - | |||
| - | Semafoarele binare și mutexurile sunt similare, dar prezintă două diferențe principale: | ||
| - | * Task-ul care a blocat mutexul trebuie obligatoriu să îl și deblocheze pentru a permite accesul altor task-uri la mutex | ||
| - | * Mutexul oferă un mecanism de prioritizare: | ||
| - | * Dacă un task cu prioritate mai mare vrea să blocheze un mutex deja folosit, task-ul care utilizează în prezent mutexul va avea crescută temporar prioritatea | ||
| - | * Este implementată o coadă cu priorități pentru task-urile care vor să blocheze un mutex | ||
| - | |||
| - | În schimb, semafoarele binare blocate pot fi deblocate de orice alt task și nu există un mecanism de prioritizare. | + | În cadrul acestui laborator, vom discuta despre semafoarele binare și cele generalizate, urmând ca în următorul să fie prezentate mutexurile. |
| Toate tipurile de semafore, similar altor elemente din FreeRTOS, sunt referite cu ajutorul **handle-urilor**. În plus, pentru a le utiliza, este necesară declararea bilbiotecii **semphr.h**, alături de clasica **Arduino_FreeRTOS.h**. | Toate tipurile de semafore, similar altor elemente din FreeRTOS, sunt referite cu ajutorul **handle-urilor**. În plus, pentru a le utiliza, este necesară declararea bilbiotecii **semphr.h**, alături de clasica **Arduino_FreeRTOS.h**. | ||
| Line 38: | Line 31: | ||
| === Semafoare binare === | === Semafoare binare === | ||
| - | 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ă. \\ | + | O situație în care semafoarele binare se pretează este sincronizarea a două task-uri. 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ă. \\ |
| + | Diferențele dintre mutexuri și semafoarele binare vor fi prezentate în cadrul laboratorului viitor. Momentan, ne vom orienta atenția către crearea semafoarelor binare. | ||
| Pentru a crea un semafor binar, este utilizată funcția ** xSemaphoreCreateBinary() **. Aceasta alocă spațiu în heap pentru semaforul binar și îl creează, cu starea inițială este "blocat". Dacă valoarea întoarsă este NULL, nu există suficientă memorie disponibilă. \\ | Pentru a crea un semafor binar, este utilizată funcția ** xSemaphoreCreateBinary() **. Aceasta alocă spațiu în heap pentru semaforul binar și îl creează, cu starea inițială este "blocat". Dacă valoarea întoarsă este NULL, nu există suficientă memorie disponibilă. \\ | ||
| Line 79: | Line 73: | ||
| În exemplul de mai sus, handle-ul a fost declarat în interiorul unui task și nu sub formă de variabilă globală. | În exemplul de mai sus, handle-ul a fost declarat în interiorul unui task și nu sub formă de variabilă globală. | ||
| - | === Mutexuri === | ||
| - | Utilizate în principal pentru gestionarea accesului la o resursă partajată, mutexurile sunt create cu ajutorul funcției ** xSemaphoreCreateMutex()**. | ||
| - | |||
| - | **Exemplu:** | ||
| - | <code c> | ||
| - | 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 */ | ||
| - | } | ||
| - | } | ||
| - | |||
| - | </code> | ||