中科因仑“3+1”工程特种兵精英论坛

标题: 示例代码: [打印本页]

作者: 张衍波    时间: 2015-9-23 16:11
标题: 示例代码:
示例代码:

1.调用子任务,并等待子任务完成后发送消息.类似于调用函数.与调用函数相比好处在于,可以启动多个子任务同时执行,而调用函数只能一个一个执行.
void task2(){
        static unsigned char i;

        i = sizeof(stra);

        do{
                stra[i-1] = strb[i-1];
                task_switch();
        }while(--i);

        event_push(EVENT_RF_PULS_SENT);//发送消息(其实质是唤醒监听该消息的进程)

        task_exit();//结束任务.
}

void task3(){
        static unsigned char event_backup;//用于保存信号EVENT_RF_PULS_SENT原来的值.在这个例子里实际上是不需要保存的,因为EVENT_RF_PULS_SENT未被其它进程监听.但在真实应用中则不一定能预知.

        event_reg(EVENT_RF_PULS_SENT, event_backup);//注册消息,原值保存在event_backup中(该变量必须申明为静态)

        //如果等待的消息产生于另一任务进程中,则使用task_suspend()就可以了.
        strb[0] = 3, strb[1] = 2, strb[2] = 1;//填写缓冲区
        task_load(task2);//装载子任务
        task_suspend();

        event_unreg(EVENT_RF_PULS_SENT, event_backup);//退出前必须还原消息中原来的值

        task_exit();//结束任务.
}



2.等待中断处理并发送消息:
void clock_timer(void) interrupt 1 using 1
{
        if(strb[0] != 0 && strb[1] != 0 && strb[2] != 0){
                P0 =  strb[0];
                P1 =  strb[1];
                P2 =  strb[2];
                push_event(EVENT_RF_PULS_SENT);
        }
}

void task3(){
        static unsigned char event_backup;//用于保存信号EVENT_RF_PULS_SENT原来的值.在这个例子里实际上是不需要保存的,因为EVENT_RF_PULS_SENT未被其它进程监听.但在真实应用中则不一定能预知.

        event_reg(EVENT_RF_PULS_SENT, event_backup);//注册消息,原值保存在event_backup中(该变量必须申明为静态)

        //如果等待的消息产生于另一任务进程中,则使用task_suspend()就可以了.

        task_wait_interrupt(
                        strb[0] = 3, strb[1] = 2, strb[2] = 1;
                )//填写缓冲区
        //如果写成以下形式:
        //strb[0] = 3, strb[0] = 2, strb[0] = 1;
        //task_suspend();
        //如果在执行完第一行语句后正好发生中断,则从中断返回后,任务调用task_suspend()后将永远不会醒.

        event_unreg(EVENT_RF_PULS_SENT, event_backup);//退出前必须还原消息中原来的值

        task_exit();//结束任务.
}转载






欢迎光临 中科因仑“3+1”工程特种兵精英论坛 (http://bbs.enlern.com/) Powered by Discuz! X3.4