RTOS: Semàfors

En aquesta entrada parlarem de què son i com fer servir semàfors en un RTOS.

Un semàfor és un dels mecanismes de comunicació entre tasques que ofereix un OS. . Així, una tasca prova d’agafar el semàfor i es quedarà esperant que una altra tasca doni el semàfor o ho tornarà a provar més endavant.

Habitualment es fan servir per sincronitzar almenys dues tasques que comparteixen el semàfor o per protegir una secció crítica.

Semàfors a FreeRTOS

A FreeRTOS tenim diferents tipus de semàfors:

  • Binary: pot tenir només estat ‘agafat’ o ‘donat’. Es fan servir per sincronitzar tasques.
  • Counting: s’emmagatzema un número, que s’incrementa en ‘donar’ el semàfor i es redueix en ‘agafar’ el semàfor. Sempre que tingui un valor positiu es podrà ‘agafar’ el semàfor. Serveix per portar un compte del nombre de recursos disponibles.
  • Mutex: son una variant dels semàfors binaris que inclouen mecanismes d’herència de prioritats. Es fan servir per implementar una exclusió mútua. Aquest tipus de semàfors implementen un mecanisme d’herència de prioritats de tal manera que si una tasca d’alta prioritat està esperant un Mutex que te una tasca de baixa prioritat, aquesta última veu augmentada la seva prioritat a la mateixa prioritat que la Tasca d’alta prioritat mentre te el Mutex per tal que tingui més oportunitat d’alliberar -lo.

Exemple

A l’exemple hi ha una tasca que es queda esperant a agafar un semàfor, quan aconsegueix el semàfor fa un Toggle del LED.

També es registra una ISR pel botó 0, que ‘dona’ el semàfor en quan es prem el botó 0.

A la funció main() es crea primer el semàfor que compartiran la tasca i la ISR i tot seguit es crea la tasca com ja hem vist.

Per últim s’engega el kernel del RTOS.

Cal notar que les funcions per agafar o donar semàfor son diferents segons estiguem a una tasca o a una ISR.

En el cas de la ISR, la funció de donar al semàfor ens indica si hi ha alguna tasca que cal desbloquejar per que l’està esperant. En cas que sigui cert, cal fer un ‘yield‘ des de la ISR per a que el planificador (scheduler) del RTOS pugui actuar immediatament.

ISR() {
 ...
 /* Toggle semaphore */ 
 xSemaphoreGiveFromISR(semaphore_button_1, &xHigherPriorityTaskWoken);
 portYIELD_FROM_ISR(xHigherPriorityTaskWoken);
}

Acabant

Tant aquest exemple com l’anterior fan servir un BSP que va creixent en complexitat, dona-li un cop d’ull!

Pots provar d’implementar un codi que blinki el LED tantes vegades com vegades s’ha premut el botó 0. És pot fer amb un semàfor tipus ‘counting semaphore’, t’animes?

Anuncis

3 pensaments sobre “RTOS: Semàfors

Deixa un comentari

Fill in your details below or click an icon to log in:

WordPress.com Logo

Esteu comentant fent servir el compte WordPress.com. Log Out /  Canvia )

Google photo

Esteu comentant fent servir el compte Google. Log Out /  Canvia )

Twitter picture

Esteu comentant fent servir el compte Twitter. Log Out /  Canvia )

Facebook photo

Esteu comentant fent servir el compte Facebook. Log Out /  Canvia )

S'està connectant a %s

Aquest lloc utilitza Akismet per reduir els comentaris brossa. Apreneu com es processen les dades dels comentaris.