LinkedIn YouTube Facebook
Szukaj

Newsletter

Proszę czekać.

Dziękujemy za zgłoszenie!

Wstecz
Artykuły

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

Tworzenie wątków w systemie ISIX odbywa się za pomocą funkcji task_t* isix_task_create(task_func_ptr_t task_func, void *func_param, unsigned long stack_depth, prio_t priority); jako pierwszy argument task_func przyjmuje wskaźnik do funkcji tworzącej wątek. Drugi argument func_param określa argument przekazany do funkcji zadania/wątku, który można odczytać z tej funkcji za pomocą argumentu arg. Argument stack_depth określa wielkości stosu dla danego zadania (wątku). Minimalną dopuszczalną wielkość pamięci określa stała ISIX_MIN_STACK_DEPTH. Argument priority określa priorytet przydzielony dla tworzonego zadania. Funkcja zwraca wskaźnik na strukturę kontrolną zadania task* lub NULL w przypadku wystąpienia błędu. Najpierw tworzony jest wątek blinking_task migający diodą LED. Jako argument dodatkowy przekazujemy mu wartość NULL, ponieważ nie wykorzystujemy żadnych dodatkowych danych, oraz nie komunikujemy się z innymi wątkami. Wielkość stosu ustalono na wartość minimalną, ponieważ, funkcja wątku praktycznie nie wykorzystuje żadnych zmiennych lokalnych. Kolejną czynnością jest utworzenie kolejki FIFO, za pomocą której będziemy przekazywać kody wciśniętych klawiszy do wątku wyświetlania. Tworzenie nowej kolejki FIFO odbywa się za pomocą funkcji fifo_t* isix_fifo_create(int n_elem, size_t elem_size). Jako pierwszy argument podajemy ilość elementów kolejki FIFO, natomiast jako drugi argument przekazujemy wielkość pojedynczego elementu w kolejce. W przypadku pomyślnego utworzenia kolejki FIFO jest zwracany wskaźnik do nowo utworzonej kolejki. W naszym przypadku kolejka składa się z 10 elementów o wielkości sizeof(key_t). Jeżeli kolejka została utworzona pomyślnie (wskaźnik do kolejki fifo_t jest różny od NULL), tworzony jest wątek display_srv_task odpowiedzialny za odbieranie komunikatów z kodami wciśniętych klawiszy oraz keyboard_srv_task odpowiedzialny za odczytywanie stanu klawiszy i wysyłanie kodów. Po utworzeniu wszystkich wątków jako ostatnia wywoływana jest funkcja isix_start_scheduler(), co powoduje uruchomienie planisty zadań (schedulera) systemu ISIX. Za odczytywanie stanu joysticka odpowiedzialny jest wątek keyboard_srv_task (list. 3).

 

List. 3. Wątek odpowiedzialny za odczyt stanu styków joysticka

/** Keyboyard server task */
static ISIX_TASK_FUNC(keyboard_srv_task,entry_params)
{
        //Enable PE in APB2
        RCC->APB2ENR |= RCC_APB2Periph_GPIOE;
        //Set GPIO as inputs
        io_config(KEY_PORT, KEY_OK_BIT, GPIO_MODE_INPUT, GPIO_CNF_IN_FLOAT);
        io_config(KEY_PORT, KEY_UP_BIT, GPIO_MODE_INPUT, GPIO_CNF_IN_FLOAT);
        io_config(KEY_PORT, KEY_DOWN_BIT, GPIO_MODE_INPUT, GPIO_CNF_IN_FLOAT);
        io_config(KEY_PORT, KEY_LEFT_BIT, GPIO_MODE_INPUT, GPIO_CNF_IN_FLOAT);
        io_config(KEY_PORT, KEY_RIGHT_BIT, GPIO_MODE_INPUT, GPIO_CNF_IN_FLOAT);
        fifo_t *kbd_fifo = (fifo_t*)entry_params;
        //Previous key variable
        static key_t p_key = -1;
        for(;;)
        {
            //Get key
            key_t key = get_key();
            //Check if any key is pressed
            if(key!=0 && p_key==0)
            {
               isix_fifo_write( kbd_fifo, &key, ISIX_TIME_INFINITE );
            }
            //Previous key assignement
            p_key = key;
            //Wait short time
            isix_wait_ms( KBD_DELAY_TIME );
        }
}
Tagi: GPIO, ISIX, LED, RTOS, STM32