ISIX-RTOS – przykład 4 – wątkowa obsługa portu szeregowego RS232
Klasa zawiera referencję do obiektu sterownika portu szeregowego usart_buffered. Realizacja zadania odbywa się w metodzie wirtualnej main(), stanowiącą odrębny wątek systemowy – list. 11.
List. 11. Implementacja metody main klasy led_receiver
//Main task/thread function void led_receiver::main() { while(true) { unsigned char c; //Receive data from serial if(serial.getchar(c)==isix::ISIX_EOK) { //Check for received char switch(c) { //On led 1 case 'a': case 'A': io_clr( LED_PORT, LED1_PIN ); break; //Off led 1 case 'b': case 'B': io_set( LED_PORT, LED1_PIN ); break; //On led 2 case 'c': case 'C': io_clr( LED_PORT, LED2_PIN ); break; //Off led 2 case 'd': case 'D': io_set( LED_PORT, LED2_PIN ); break; } } } }
Działanie metody jest proste, sprowadza się do wywołania metody getchar() obiektu sterownika portu szeregowego, która blokuje się do momentu odebrania znaku. W przypadku odebrania prawidłowego kodu znaku, odpowiednie diody LED są włączane lub wyłączane.
Klasa key_transmiter (list. 12) odpowiedzialna jest za odczyt stanu joysticka oraz – w przypadku wykrycia zwarcia jego styków – wysłaniu informacji do portu szeregowego.
List. 12. Deklaracja klasy led_transmitter
class key_transmitter: public isix::task_base { public: //Constructor key_transmitter(dev::usart_buffered &_serial); protected: //Main thread method virtual void main(); private: //Stack and prio cfgs static const unsigned STACK_SIZE = 256; static const unsigned TASK_PRIO = 3; //The usart obj ref dev::usart_buffered &serial; };