/********************* * * Programa exemplo para utilizacao * do kernel ReTMik (Real-Time Micro-mouse Kernel) * * Usa 4 tarefas, uma para piscar cada led * a um ritmo independente * * (Luís Almeida - 03/10/03) * * Log: * 2005.09.26, Paulo Pedreiras * - Update of base address due to change on PCS block, * moved from 0x2000 to 0xFC00. * * **************************/ /*** 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 led1 0x10 #define led2 0x20 #define led3 0x40 #define led4 0x80 #define p_port_add 0xFD00 /* address of parallel port in the I/O card */ unsigned char leds; /**************************** * * Tarefas * *****************************/ void pisca1(void) { /* pisca led1 */ if ((leds&led1)==0) {/* led1=0 -> set */ leds|=led1; } else /* led1=1 -> reset */ leds&=~led1; outportb(p_port_add,leds); } /***************************************/ void pisca2(void) { /* pisca led2 */ if ((leds&led2)==0) {/* led2=0 -> set */ leds|=led2; } else /* led2=1 -> reset */ leds&=~led2; outportb(p_port_add,leds); } /***************************************/ void pisca3(void) { /* pisca led3 */ if ((leds&led3)==0) {/* led3=0 -> set */ leds|=led3; } else /* led3=1 -> reset */ leds&=~led3; outportb(p_port_add,leds); } /***************************************/ void pisca4(void) { /* pisca led4 */ if ((leds&led4)==0) {/* led4=0 -> set */ leds|=led4; } else /* led4=1 -> reset */ leds&=~led4; outportb(p_port_add,leds); } /*************************** * * 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 = 200ms (20ticks), primeira vez =2 s (200tick) */ t_descriptor.period=20; t_descriptor.first=200; t_descriptor.func_entry=pisca1; 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 = 330ms (33ticks), primeira vez =2s (200ticks) */ t_descriptor.period=33; t_descriptor.first=200; t_descriptor.func_entry=pisca2; 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 = 910ms (91ticks), primeira vez =2s (200ticks) */ t_descriptor.period=91; t_descriptor.first=200; t_descriptor.func_entry=pisca3; 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 pisca4 */ /* periodo = 1.79s (179ticks), primeira vez =2s (200ticks) */ t_descriptor.period=179; t_descriptor.first=200; t_descriptor.func_entry=pisca4; 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); }