/********************* * * Programa exemplo para utilizacao * do kernel ReTMik (Real-Time Micro-mouse Kernel) * * Usa 4 tarefas, uma para piscar cada led * a um ritmo independente * *** usa reentrancia *** * * (Luís Almeida - 03/10/03) * **************************/ /*** Atencao a estas flags de configuracao do TC: - Test Stack Overflow - Off - Standard Stack Frame - On - Use Register Variables - Off - Compile in Tiny or Small model ************************************/ #include "retmik.h" #include "det188.h" /************* * * Definicoes e Variaveis globais * para comunicacao entre tarefas * *****************/ #define p_port_add 0x2100 /* address of parallel port in the I/O card */ unsigned char leds; /**************************** * * Tarefas * *****************************/ void pisca_led(void) { unsigned char led_i; int i; /* get task id number */ led_i=(unsigned char) get_id(); /* build led mask with task id */ led_i=0x08< set */ leds|=led_i; } else /* led_i=1 -> reset */ leds&=~led_i; outportb(p_port_add,leds); for(i=0;i<8000;i++); } /*************************** * * MAIN * ***************************/ void main(void) { int i, tick, n_tasks; TASK_DESC t_descriptor; /* inicia leds a piscar */ leds=0xaa; outportb(p_port_add,leds); for(i=0;i<10000;i++); leds^=0xff; outportb(p_port_add,leds); for(i=0;i<10000;i++); leds^=0xff; outportb(p_port_add,leds); for(i=0;i<10000;i++); leds^=0xff; outportb(p_port_add,leds); /* fixa leds acesos */ for(i=0;i<10000;i++); leds=0; outportb(p_port_add,leds); /* inicializa sistema (tick de 10ms e 4 tarefas)*/ tick=10; n_tasks=4; init_system(tick,n_tasks); /***********************************/ /* prepara criacao da tarefa pisca1 */ /* periodo = 1s (100ticks), primeira vez =2 s (200tick) */ t_descriptor.period=100; t_descriptor.first=200; t_descriptor.func_entry=pisca_led; t_descriptor.stack_size=64; if(create_task(&t_descriptor) <0) { /* sinaliza erro com leds=0xaa */ leds=0xaa; outportb(p_port_add,leds); } /***********************************/ /* prepara criacao da tarefa pisca2 */ /* periodo = 2s (200ticks), primeira vez =2s (200ticks) */ t_descriptor.period=200; t_descriptor.first=200; t_descriptor.func_entry=pisca_led; t_descriptor.stack_size=64; if(create_task(&t_descriptor) <0) { /* sinaliza erro com leds=0xaa */ leds=0xaa; outportb(p_port_add,leds); } /***********************************/ /* prepara criacao da tarefa pisca3 */ /* periodo = 5s (500ticks), primeira vez =2s (200ticks) */ t_descriptor.period=500; t_descriptor.first=200; t_descriptor.func_entry=pisca_led; t_descriptor.stack_size=64; if(create_task(&t_descriptor) <0) { /* sinaliza erro com leds=0xaa */ leds=0xaa; outportb(p_port_add,leds); } /* inicia actividade periodica das tarefas */ start_all(); /* ciclo infinito para manter o sistema em funcionamento */ /* este ciclo e' interrompido automaticamente para execucao das tarefas */ /* o que se fizer aqui dentro e' executado em background */ while(1) { /* pisca led4 */ if ((leds&0x80)==0) {/* led4=0 -> set */ leds|=0x80; } else /* led4=1 -> reset */ leds&=~(0x80); outportb(p_port_add,leds); for(i=0;i<7000;i++); } }