LinkedIn YouTube Facebook
Szukaj

Wstecz
Artykuły

ISIX-RTOS – przykłady w języku C: LCD+joystick+LED

Wątek rozpoczyna swoje działanie od skonfigurowania linii PE8…PE12, do których podłączono styki joysticka zamontowanego na płytce STM32Butterfly. Parametr entry_param przekazany podczas tworzenia zadania/wątku zawiera wskaźnik na kolejkę FIFO, do której przekazywane będą kody klawiszy, a zatem musi być rzutowany na typ fifo_t. Następnie wątek wchodzi do pętli głównej, w której cyklicznie odczytywany jest stan linii portów i w przypadku wykrycia wciśnięcia klawisza, jego kod jest wpisywany do kolejki FIFO za pomocą funkcji isix_fifo_write(). Funkcja ta jako pierwszy argument przyjmuje wskaźnik do kolejki, jako drugi argument wskaźnik do elementu, który ma zostać wpisany do kolejki, natomiast jako ostatni przekazujemy czas oczekiwania na zapisanie elementu do kolejki. W przypadku gdy kolejka jest zapełniona, wykonywanie wątku zostanie wstrzymane do momentu zwolnienia miejsca w kolejce, lub przekroczenia czasu oczekiwania. W naszym przypadku wystąpienia timeout ustawiono na wartość ISIX_TIME_INFINITE, co oznacza że nie jest ograniczony czas oczekiwania. Po zapisaniu danych do kolejki, wątek jest usypiany na czas około 25 ms, co pozwala na wyeliminowanie drgań zestyków. Kody wciśniętych przycisków odbierane są przez wątek wyświetlacza (list. 4).

 

List. 4. Wątek odpowiadający za odbiór kodów wciśniętych przycisków

/** Display server task */
static ISIX_TASK_FUNC(display_srv_task, entry_params)
{
   fifo_t *kbd_fifo = (fifo_t*)entry_params;
   //Initialize LCD
   nlcd_init();
   //Put welcome string
   nlcd_put_string("www.boff.pl",0,0);
   nlcd_put_string("Joy state:",0,1);
   //Key variable read from
   key_t key;
   for(;;)
   {
           //Read data from fifo
           if(isix_fifo_read( kbd_fifo, & key, ISIX_TIME_INFINITE )==ISIX_EOK)
           {
              //Display text based on the key
              switch(key)
              {
              case KEY_LEFT:
                      nlcd_put_string("** KEY LEFT **",0,2);
                      break;
              case KEY_RIGHT:
                      nlcd_put_string("** KEY RIGHT *",0,2);
                      break;
              case KEY_UP:
                      nlcd_put_string("** KEY UP **  ",0,2);
                      break;
              case KEY_DOWN:
                      nlcd_put_string("** KEY DOWN **",0,2);
                      break;
              case KEY_OK:
                      nlcd_put_string("** KEY OK **  ",0,2);
                      break;
                   }
           }
   }
}

Zadanie/wątek wyświetlacza rozpoczyna swoją pracę od inicjalizacji kontrolera wyświetlacza z telefonu Nokia 3310, wypisania w dwóch pierwszych liniach tekstu informacyjnego. Następnie przechodzi do pętli nieskończonej, w której za pomocą funkcji isix_fifo_read() jest odczytywany kod klawisza przesłanego przez wątek klawiatury. Funkcja ta jako argumenty przyjmuje wskaźnik do kolejki FIFO, gdzie ma zostać skopiowany odebrany element oraz czas oczekiwania na odebranie tego elementu. W naszym przypadku za ostatni argument podstawiono wartość ISIX_TIMEOUT_INFINITE, co umożliwia wstrzymanie zadania do momentu otrzymania kodu wciśniętego klawisza. Podobnie jak poprzednio wartość liczbowa pozwala określić maksymalny czas oczekiwania na komunikat, po przekroczeniu którego wątek jest „wybudzany”, a funkcja isix_fifo_read() wychodzi z kodem błędu ISIX_ETIMEOUT.

Tagi: GPIO, ISIX, LED, RTOS, STM32