Čeština / English
Login

Aplikace / FreeRTOS (ovládání svítidla pomocí RT aplikace)

Autoři: Josef Strnadel (); Zdenek Vasicek ()

Abstrakt: Ovládání svítidla pomocí RT aplikace

Update: 20100321

Více o FreeRTOS je možno nalézt na www.freertos.org

free_rtos.png

Obrázek 1.1:

1. Popis aplikace

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á

  1. tlačítkem (pro jednoduchost je využito tlačítko A z maticové klávesnice FITkitu),

  2. řídicí částí (implementovanou v MSP430 pomocí prostředků FreeRTOS) reagující na stisk tlačítka a

  3. ří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ů:

  1. OFF (zhasnuto),

  2. LOW (svítí slabě),

  3. 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).

lamp_small.png

Obrázek 1.1:

.

Práci s TA lze vyzkoušet např. pomocí volně dostupného nástroje UPPAAL - viz. www.uppaal.com

2. Realizace aplikace pomocí prostředků RT jádra FreeRTOS

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 */
}

3. Příkazová řádka aplikace

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 */
  }
}

4. Inicializace a spuštění aplikace

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;
}

5. Zdrojové kódy

Kompletní zdrojové kódy je možné nalézt v souboru mcu/main.c.

6. Zprovoznění aplikace

  1. přeložte aplikaci

  2. 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.

Zobrazeno: 5589x Naposledy: 30.9.2023 01:32:36