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:
|
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:
|
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:
- FRDM-KL25Z kártya
- 4 db LED az Arduino kompatibilis D4, D5, D6, D7 digitális kimenetekre kötve (az áramkorlátozó ellenállásokról ne feledkezzünk meg!)
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);
}