Baix consum en RTOS

Quan treballem amb un RTOS funcionant en el nostre microcontrolador, hi ha diferents estratègies per aconseguir disminuir el consum energètic.

Bàsicament hi ha dues estratègies:

  • Aprofitar la tasca Idle per posar al microcontrolador en un mode de baix consum.
  • Passar a un sistema sense tick (també dit tickless).

 Tasca Idle per baix consum

L’estratègia més senzilla és la d’activar un mode de baix consum quan s’executa la tasca Idle. Com que aquesta tasca s’executa quan no hi ha cap altra tasca preparada per agafar el microcontrolador, te sentit pensar en aturar el microcontrolador i esperar a que una tasca estigui disponible. Quan succeeixi el proper tick, el microcontrolador sortira del mode d’sleep i tornarà a executar el planificador, que, si segueix sense haver cap tasca disponible (en estat Ready) per executar tornarà a executar la tasca Idle que tornarà a adormir la CPU i es repetirà el cicle.

Cal recordar que quan el core està en algun mode de baix consum, el SysTick també es desactiva. Per tant, per poder tenir un tick quan el core està en un mode de baix consum caldrà fer servir un altre Timer que si que funcioni en aquests modes de baix consum.

Cal pensar que tot i que aquest mètode és molt senzill d’implementar, té la limitació de que a cada tick es treu la CPU del mode de baix consum per comprovar si hi ha alguna tasca en estat Ready. Podem imaginar-nos una aplicació que llegeixi d’un sensor cada 200 ms i processant les dades. Si es té en compte que el tick pot ser de 1000 Hz, és fàcil d’observar que es despertarà molts cops al core per tant sols que el planificador vegi que no hi ha cap tasca Ready i torni a adormir el processador.

Aquesta característica es pot activar a FreeRTOS editant el fitxer “FreeRTOSConfig.h” i fixant a ’0’ la definició configUSE_TICKLESS_IDLE i triant el valor ’1’ per configUSE_SLEEP_MODE_IN_IDLE.

En el cas de Silicon Labs, el microcontrolador es posa en el mode EM2 i deixant en funcionament tant sols el RTC i les IRQ dels GPIOs que l’usuari hagi configurat.

FreeRTOS sense tick

L’altre estratègia per disminuir encara més el consum, és desactivar el tick durant cert temps. En una aplicació on totes les tasques estan bloquejades (i que entraria la tasca Idle) es pot calcular el temps en que alguna tasca es desbloquejarà (per que alguna tasca estigui bloquejada per què ha cridat la funció vTaskDelay()). Es pot desactivar el tick i programar el timer per que generi una interrupció quan arribi al temps calculat. Si mentre està el sistema adormit esperant aquell temps hi ha algun esdeveniment extern (interrupció), es despertarà i es podrà reprendre l’execució normal i tornar a activar el tick.

Amb aquesta estratègia es maximitza el temps en que el core està en algun dels modes de baix consum i per tant es pot reduir dràsticament el consum d’una aplicació.

En el cas de FreeRTOS, el port disponible per Cortex-M ja incorpora aquesta característica, i es pot configurar editant el fitxer “FreeRTOSConfig.h”, concretament fixant el valor ’1’ a la macro configUSE_TICKLESS_IDLE.

En el cas de Silicon Labs, el microcontrolador es posa en el mode EM2 igual que en cas amb ticks i es programa el RTC perquè generi una IRQ en el temps adequat.

En ambdós casos el codi que gestiona el baix consum i els ticks en el port FreeRTOS està al fitxer low_power_tick_management.c a la funció vPortSetupTimerInterrupt().

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.