Abstrakt: Ovládání svítidla pomocí RT aplikace
Více o FreeRTOS je možno nalézt na www.freertos.org
S využitím prostředků RT jádra FreeRTOS je pro MSP430 na FITkitu v jazyce C implementována jednoduchá RT aplikace (Svítidlo
- CZ, Lamp
- EN) tvořená
tlačítkem
(pro jednoduchost je využito tlačítko A
z maticové klávesnice FITkitu),
řídicí částí
(implementovanou v MSP430 pomocí prostředků FreeRTOS) reagující na stisk tlačítka a
řízenou částí
reprezentovanou pro jednoduchost LED diodou D5
(zelená LED umístěná v levém dolním rohu FITkitu).
Aplikaci je možno slovně specifikovat
následovně. Svítidlo se může nacházet v jednom ze 3 stavů:
OFF
(zhasnuto),
LOW
(svítí slabě),
BRIGHT
(svítí silně).
Počáteční stav svítidla je stav OFF
. Po (prvním) stisku tlačítka začne svítidlo svítit slabě (tj. přejde do stavu LOW
). Bude-li tlačítko stisknuto do 500 ms po přechodu do stavu LOW
, pak začne svítidlo svítit silně (tj. přejde do stavu BRIGHT
). Svítidlo zhasne (tj. přejde do stavu OFF
) bude-li tlačítko stisknuto a) za více než 500 ms od přechodu do stavu LOW
nebo b) při silném svitu svítidla (tj. ve stavu BRIGHT
).
Práci s TA lze vyzkoušet např. pomocí volně dostupného nástroje UPPAAL
- viz. www.uppaal.com
RT jádro
se často označuje pojmem real-time operační systém
, popř. operační systém pro práci v reálném čase
apod., obvyklá zkratka je RTOS
Aby bylo možné realizovat danou aplikaci pomocí prostředků RT jádra, je nutné zamyslet se nad rozvržením dílčích částí aplikace do množiny tzv. RT úloh
. Konkrétní realizace, tedy pomocí FreeRTOS, může mít tuto podobu:
1. stav tlačítka 'A' je testován úlohou keyboardTask
, která je volána s periodou 1 ms
. Stisk tlačítka je signalizován nastavením globální proměnné press
na hodnotu 1. Toto řešení má své nevýhody (např. aktivní čekání úlohy na příkazu while(!pressed);
), ale je jednoduché a pro naše účely postačuje. Kostra úlohy:
static void keyboardTask(void *param) { ... keyboard_init(); for (;;) { ... ch = key_decode(read_word_keyboard_4x4()); ... if (ch != 0) { switch (ch) { case 'A': pressed = 1; ... } } } /* sleep task for 1 ms (= btn-press sampling period) */ vTaskDelay( 1 / portTICK_RATE_MS); } }
2. reakci na stisk tlačítka 'A' v závislosti na stavu aplikace zajišťuje úloha lampTask
. V jednotlivých stavech úlohy se mění hodnota proměnné lightIntensity
určující intenzitu svitu svítidla. Kostra úlohy je níže:
static void lampTask(void *param) { pressed = 0; for(;;) { /*--- OFF ---*/ lightIntensity = lightOFF; while(!pressed); pressed = 0; /*--- LOW ---*/ lightIntensity = lightLOW; vTaskDelay( 500 / portTICK_RATE_MS); /* wait for 500 ms */ if(pressed) { /*--- BRIGHT ---*/ pressed = 0; lightIntensity = lightBRIGHT; } while(!pressed); pressed = 0; } }
3. svit svítidla je řešen v obsluze přerušení od časovače B (TIMERB). Podle aktuální hodnoty proměnné lightIntensity
zajistí časovač odpovídající svit LED diody D5
:
interrupt (TIMERB0_VECTOR) Timer_B (void) { cnt++; if((cnt>0) && (cnt<=lightIntensity)) { set_led_d5(1); } /* D5 on-time */ else { set_led_d5(0);} /* D5 off-time */ if(cnt>=(MAX_LIGHT_LEVELS)) cnt=0; TBCCR0 = 0x1000; /* interrupt each x ticks of clk source */ }
O případnou obsluhu příkazové řádky se stará úloha terminalTask
, která je volána s periodou 1 s:
static void terminalTask(void *param) { for (;;) { terminal_idle(); vTaskDelay( 1000 / portTICK_RATE_MS); /* delay for 1000 ms */ } }
Viz main.c
(kostra):
int main( void ) { initialize_hardware(); TBCCTL0 = CCIE; /* TIMER B interrupts enable */ /*--- install FreeRTOS tasks ---*/ term_send_str_crlf("init FreeRTOS tasks..."); xTaskCreate(terminalTask /* code */, "TERM" /* name */, 100 /* stack size */, NULL /* params */, 1 /* prio */, NULL /* handle */); xTaskCreate(keyboardTask, "KBD", 32, NULL, 1, NULL); xTaskCreate(lampTask, "LAMP", 32, NULL, 1, NULL); /*--- start FreeRTOS kernel ---*/ term_send_str_crlf("starting FreeRTOS scheduler...\n"); return 0; }
Kompletní zdrojové kódy je možné nalézt v souboru mcu/main.c.
přeložte aplikaci
naprogramujte MCU a FPGA a spusťte terminálový program.
Aplikace nevyžaduje ke své činnosti nastavit kromě propojek umožňujících programování další propojky.