This discussion has been locked.
You can no longer post new replies to this discussion. If you have a question you can start a new discussion

RTOS task swtiching faliure

I have a bunch of tasks running in Round robin fashion. They perform the task of reading from four serial ports and polling a push button state plus one more task to print data on serial port. The problem I am facing is that if I try to initialize peripheral modules using "C1_init()" in the "task_init" task, the scheduler does not pass to the main task. But if I remove those functions the scheduler then cycles through all the tasks perfectly. I wonder if anyone can help me out here.

__task void task_uart0(void) {

        for(;;)
        {
                                read_uart0();
                        os_evt_set(0x0004,id0);
        }
}

__task void task_uart1(void) {

        for(;;) {
                                //read_uart1();
                                os_evt_set(0x0004,id0);
        }
}

__task void task_usart0(void) {
        for(;;) {
                                        read_usart0();
                                os_evt_set(0x0004,id0);

        }
}

__task void task_usart1(void) {
        for(;;) {
                                        read_usart1();
                                os_evt_set(0x0004,id0);
        }
}

__task void task_swdbutton(void) {

        for(;;) {
                                if ((button_get() != 0) && (buttonState !=1)) {
                                        buttonState = 1;
                                        LED_on(0);
                                } else if ((button_get() == 0) && (buttonState ==1)){
                                        printf("Button press and release\n\r");
                                        LED_blink(3);
                                        //LED_off(0);
                                        ser_print(C1,"stop\r\n");
                                        ser_print(C2,"stop\r\n");
                                        ser_print(C3,"stop\r\n");
                                        buttonState = 0;
                                }
                                os_evt_set(0x0004,id0);
        }
}

__task void task_other(void) {

        for(;;){
        printf("RA0: %d",REG_TC0_RA0);
        printf("RB0: %d",REG_TC0_RB0);
        printf("RC0: %d",REG_TC0_RC0);
        printf("CV0: %d",REG_TC0_CV0);

        os_evt_set(0x0004,id0);

        }
}

__task void task_main(void) {
        id2 = os_tsk_create(task_usart1,0);
        id3 = os_tsk_create(task_uart0,0);
        id4 = os_tsk_create(task_usart0,0);
        id5 = os_tsk_create(task_uart1,0);
        id6 = os_tsk_create(task_swdbutton,0);
        id7 = os_tsk_create(task_other,0);
        printf("Initialized\r\n");
        for(;;) {
                // UARTS & USARTS
                os_evt_set(0x0004,id2);
                os_evt_wait_or(0x0004,0xFFFF);
                os_evt_set(0x0004,id3);
                os_evt_wait_or(0x0004,0xFFFF);
                os_evt_set(0x0004,id4);
                os_evt_wait_or(0x0004,0xFFFF);

                os_evt_set(0x0004,id5);
                os_evt_wait_or(0x0004,0xFFFF);

                os_evt_set(0x0004,id6);
                os_evt_wait_or(0x0004,0xFFFF);

                os_evt_set(0x0004,id7);
                os_evt_wait_or(0x0004,0xFFFF);

        }
}

__task void task_init(void) {

        for(;;){

                id1 = os_tsk_self();
                if(init_flg==0){

                        C1_init(); // functions to initialize peripheral modules
                        C2_init();
                        C3_init();
                        Cn_start();
                        init_flg=1;
                }
                id0 = os_tsk_create(task_main,0);
                os_dly_wait(5);
                os_tsk_delete_self();
        }
}