RTOS Timer

A fejezet tartalma:
Az RtosTimer objektumosztály segítségével virtuális időzítőket hozhatunk létre. A virtuális időzítők mindegyike beállítható egyszeri vagy periodikusan ismétlődő időzítésre és visszahívási függvényt rendelhetünk hozzájuk. A fő különbség az mbed API Ticker és Timeout objektumosztályához képest az, hogy az RtosTimer példányosításnál megadott visszahívási függvények nem megszakítási szinten futnak, hanem az osTimerThread programszál alatt.

Az RtosTimer osztályú virtuális időzítők indithatók, újraindíthatók, leállíthatók, s túlcsorduláskor visszahívási függvényt hívhatnak meg, amelyek CMSIS RTOS API hívásokat is végezhetnek.

1. ábra: RtosTimer időzítők funkciói

Megjegyzés: Az RtosTimer használatakor a main() függvény mellett egy második implicit programszállal is számolnunk kell (osTimerTread), így ebben az esetben már csak 4 db. további programszálat hozhatunk létre.

Virtuális időzítő létrehozása


A virtuális időzítők létrehozása az RtosTimer objektum példányosításával végezhető:
RtosTimer    name  (  void(*)(void const *argument) task,
                  os_timer_type      type = osTimerPeriodic,
                                                  void * argument = NULL  )        
Paraméterek:

task - a visszahívási függvény, ami void fuggveny(void const * args) típusú.

type
- a virtuális időzítő típusa (osTimerOnce: egyszeri, osTimerPeriodic: periodikus), alapértelmezetten periodikus.

argument - a visszahívási függvénynek átadott, a hívást egyedivé tevő mutató (alapértelmezetten NULL).


Virtuális időzítő indítása/újraindítása

Az előzőleg létrehozott virtuális időzítő indítása az RtosTimer objektumpéldány start() metódusával végezhető:
osStatus start ( uint32_t  time_delay )     
Paraméterek:

time_delay - a késleltetési idő ezredmásodpercekben megadva.

Visszatérési érték:

A függvény visszatérési értéke az alábbi státusz, vagy hibakódok valamelyike lehet:
  • osOK: a megadott idejű késleltetés elindult (vagy újraindult)
  • osErrorISR: a függvény megszakítási szinten nem hívható meg
  • osErrorParameter: érvénytelen paraméter
Megjegyzés: Ez a függvény megszakításból nem hívható.

Virtuális időzítő leállítása

Az előzőleg létrehozott és elindított virtuális időzítő leállítása az RtosTimer objektumpéldány stop() metódusával végezhető:
osStatus stop ( void)     
Paraméterek:

a függvénynek nincs paramétere

Visszatérési érték:

A függvény visszatérési értéke az alábbi státusz, vagy hibakódok valamelyike lehet:
  • osOK: az időzítő leállítása sikeresen megtörtént
  • osErrorISR: a függvény megszakítási szinten nem hívható meg
  • osErrorParameter: hibás vagy érvénytelen paraméter
  • osErrorResource: a leállítani kívánt időzítőt előtte nem indítottuk el
Megjegyzés: Ez a függvény megszakításból nem hívható.

Mintapélda: Virtuális időzítők használata

Az alábbi programban négy időzítővel négy LED-et villogtatunk, különböző időzítésekkel. A főprogramnak az inicializálás és az időzítők elindítása után nincs mit tennie, ezért végtelen ciklus helyett végtelen várakozásba helyezzük.

Hardver követelmények:

1. lista: A 12_rtos_timer/main.cpp program listája
#include "mbed.h"
#include "rtos.h"

DigitalOut LEDs[4] = {DigitalOut(D4), DigitalOut(D5), DigitalOut(D6), DigitalOut(D7)};

void blink(void const *n) {
LEDs[(int)n] = !LEDs[(int)n];
}

int main(void) {
RtosTimer led_1_timer(blink, osTimerPeriodic, (void *)0);
RtosTimer led_2_timer(blink, osTimerPeriodic, (void *)1);
RtosTimer led_3_timer(blink, osTimerPeriodic, (void *)2);
RtosTimer led_4_timer(blink, osTimerPeriodic, (void *)3);

led_1_timer.start(2000);
led_2_timer.start(1000);
led_3_timer.start(500);
led_4_timer.start(250);

Thread::wait(osWaitForever);
}