查看: 1418|回复: 0
打印 上一主题 下一主题

示例代码:

[复制链接]
跳转到指定楼层
沙发
发表于 2015-9-23 16:11:13 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
示例代码:

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();//结束任务.
}转载

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 加入因仑

本版积分规则

快速回复 返回顶部 返回列表