Differences

This shows you the differences between two versions of the page.

Link to this comparison view

patr:laboratoare:11 [2021/12/30 17:22]
alexandru.ionita99 [Semafoare binare]
patr:laboratoare:11 [2022/01/13 14:04] (current)
alexandru.ionita99 [Utilizare]
Line 1: Line 1:
-===== Laboratorul 11 - Semafoare și Mutexuri =====+===== Laboratorul 11 - Mutexuri ​FreeRTOS ​=====
  
 ==== Introducere ==== ==== Introducere ====
-FreeRTOS conține un API specializat în crearea și apelarea semafoarelor,​ denumit **Semaphore API**. După cum ați observat în cadrul laboratorului de C POSIX cu același subiectsemafoarele și mutexurile pot fi utilizate pentru sincronizarea task-urilor,​ accesul la resurse partajate, dar și alte tipuri ​de semnalizări (similar cu rolul semafoarelor fizice :) )\\ +Dacă laboratorul trecut ​fost destinat semafoarelorcel de astăzi este dedicat mutexurilor
- +
-FreeRTOS utilizează următoarele tipuri de semafoare, pe care le vom detalia în continuare:​ +
-  * Semafoare binare +
-  * Mutexuri +
-  * Semafoare generalizate+
  
 Semafoarele binare și mutexurile sunt similare, dar prezintă două diferențe principale: Semafoarele binare și mutexurile sunt similare, dar prezintă două diferențe principale:
Line 18: Line 13:
 În schimb, semafoarele binare blocate pot fi deblocate de orice alt task și nu există un mecanism de prioritizare. ​ În schimb, semafoarele binare blocate pot fi deblocate de orice alt task și nu există un mecanism de prioritizare. ​
  
-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**. +Similar cu semafoarelemutexurile ​sunt referite cu ajutorul **handle-urilor**. ​De asemenea, pentru a le utiliza, este necesară declararea ​bibliotecii ​**semphr.h**. ​ 
  
 <code c> <code c>
Line 28: Line 23:
  
 // Declară o variabilă globală de tipul SemaphoreHandle_t // Declară o variabilă globală de tipul SemaphoreHandle_t
- +SemaphoreHandle_t ​mutex;
-SemaphoreHandle_t ​semafor;+
 </​code>​ </​code>​
  
 În [[https://​www.freertos.org/​fr-content-src/​uploads/​2018/​07/​FreeRTOS_Reference_Manual_V10.0.0.pdf|Documentația oficială FreeRTOS]], API-ul corespunzător este prezentat începând cu pagina 208, împreună cu exemple de utilizare pentru fiecare funcție. În [[https://​www.freertos.org/​fr-content-src/​uploads/​2018/​07/​FreeRTOS_Reference_Manual_V10.0.0.pdf|Documentația oficială FreeRTOS]], API-ul corespunzător este prezentat începând cu pagina 208, împreună cu exemple de utilizare pentru fiecare funcție.
  
-==== Semafoare binare ​====+==== 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. \\
  
-Funcțiile utilizate ​de către semafoarele binare ​sunt:+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:**
 <code c> <code c>
-class NumeClasa+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>​ 
 + 
 + 
 +==== Utilizare ==== 
 + 
 +Pentru a lucra cu mutexurile, se utilizează același funcții ca în cazul semafoarelor. Funcțiile de interes sunt: 
 + 
 +  * **UBaseType_t uxSemaphoreGetCount( SemaphoreHandle_t xSemaphore )** - întoarce valoarea mutexului (0 sau 1) 
 +  * **BaseType_t xSemaphoreGive( SemaphoreHandle_t xSemaphore )** - eliberează mutexul 
 +  * **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>​
  
-xSemaphoreCreateBinary( SemaphoreHandle_t xSemaphore ); // Alocă spațiu în heap pentru semaforul binar și îl creează. Starea inițială este "​blocat"​. Dacă valoarea întoarsă este NULL, nu există suficientă memorie disponibilă. 
  
  
-</​code>​ 
-==== Mutexuri ==== 
-<code c++> 
-class NumeClasa 
-{ 
-   //cod 
-   ​friend TIP_RETURNAT NUME_FUNCTIE(ARGUMENTE);​ 
-   //cod 
-}; 
-</​code>​ 
-==== Semafoare generalizate ==== 
patr/laboratoare/11.1640877740.txt.gz · Last modified: 2021/12/30 17:22 by alexandru.ionita99
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0