Differences

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

Link to this comparison view

patr:laboratoare:11 [2021/12/30 17:29]
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. \\
  
 +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ă. \\
  
-Pentru a crea un semafor binar, este utilizată funcția ** xSemaphoreCreateBinary( SemaphoreHandle_t xSemaphore ) **. 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ă. \\ +**Exemplu:​**
- +
-** Exemplu: **+
 <code c> <code c>
 SemaphoreHandle_t xSemaphore; SemaphoreHandle_t xSemaphore;
 void vATask( void * pvParameters ) void vATask( void * pvParameters )
 { {
- /* Încearcă crearea unui semafor. */ + ​xSemaphore = xSemaphoreCreateMutex(); // Apelare funcție creare mutex
- xSemaphore = xSemaphoreCreateBinary();+
  if( xSemaphore == NULL )  if( xSemaphore == NULL )
  {  {
- /​* ​Nu există spațiu suficient în memorie ​pentru a crea semaforul ​*/+ /​* ​Spațiu de memorie ​insuficient ​*/
  }  }
  else  else
  {  {
- /​* ​Semaforul ​poate fi acum utilizat. Apelarea xSemaphoreTake() va eșua până la apelarea xSemaphoreGive(). ​*/+ /​* ​Mutexul ​poate fi utilizat */
  }  }
 } }
 +
 </​code>​ </​code>​
-==== Mutexuri ​==== + 
-<code c++> + 
-class NumeClasa +==== Utilizare ​==== 
-{ + 
-   //cod +Pentru a lucra cu mutexurile, se utilizează același funcții ca în cazul semafoarelor. Funcțiile de interes sunt: 
-   friend TIP_RETURNAT NUME_FUNCTIE(ARGUMENTE); + 
-   //cod +  * **UBaseType_t uxSemaphoreGetCount( SemaphoreHandle_t xSemaphore )** - întoarce valoarea mutexului (0 sau 1) 
-}; +  * **BaseType_t xSemaphoreGiveSemaphoreHandle_t xSemaphore ​)** - eliberează mutexul 
-</code+  * **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 
-==== Semafoare generalizate ====+  * **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
 + 
 + 
patr/laboratoare/11.1640878157.txt.gz · Last modified: 2021/12/30 17:29 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