Interrupcions a FreeRTOS

FreeRTOS deixa el maneig de les interrupcions a mans del desenvolupador, demanant unes certes condicions.

Cal tenir en compte que les interrupcions són esdeveniments totalment asíncrons i imprevisibles i que prenen el control de forma automàtica. Això fa que mentre està funcionant una ISR el kernel del Sistema Operatiu no es pot executar i que, quan acabi d’executar la ISR, si no fem res, tornarà el control cap a la tasca que s’estava executant. Això pot provocar que una ISR alliberi un recurs o posi disponible una dada i que una tasca d’alta prioritat passi a l’estat Ready, però el kernel com que no s’executa, no pugui passar-li l’execució i se segueixi executant la taca menys prioritària que ja s’estava executant.

Per això les funcions per accedir a recursos com semàfors o cues des d’una ISR tenen un paràmetre extra, que informa si s’ha despertat una tasca més prioritària. Si és el cas, cal que el codi de la ISR cridi a la funció portYIELD_FROM_ISR() per cridar al kernel del Sistema Operatiu:

void any_IRQHandler(void) {
  BaseType_t xHigherPriorityTaskWoken = pdFALSE;

  ...
  /* Toggle semaphore */
  xSemaphoreGiveFromISR(semaphore_button_0, &xHigherPriorityTaskWoken);

  portYIELD_FROM_ISR(xHigherPriorityTaskWoken);
}

Aquesta funció de yield retorna de la ISR i executa el kernel si la variable passada té un valor diferent a pdFALSE.

Sempre es diu que les ISR han de ser el més curtes possibles, això és pels següents motius:

  • Mentre s’està executant una ISR no es pot executar cap tasca, per molt prioritària que sigui.
  • Depenent de l’arquitectura, mentre s’està executant una ISR la resta d’IRQ estan desactivades.
  • Algunes arquitectures poden permetre anidar interrupcions, cosa que augmenta la complexitat i la incertesa de tot el sistema. Quan més curta sigui la ISR més improbable que això passi.

És per això que les bones pràctiques diuen que el codi dins una ISR hi hagi poc codi i es facin servir semàfors o cues per notificar tasques on s’executin les operacions pertinents amb les prioritats adequades.

Anuncis

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.