This is an old revision of the document!


Laboratorul 11 - Semafoare și Mutexuri

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 subiect, semafoarele ș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 :) ).

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:

  • 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.

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.

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

Î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.

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ă.

Funcțiile utilizate de către semafoarele binare sunt:

Mutexuri

class NumeClasa
{
   //cod
   friend TIP_RETURNAT NUME_FUNCTIE(ARGUMENTE);
   //cod
};

Semafoare generalizate

patr/laboratoare/11.1640877569.txt.gz · Last modified: 2021/12/30 17:19 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