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