tinyos中的signal和event

来源:互联网 发布:男生百搭衣服 知乎 编辑:程序博客网 时间:2024/06/08 04:37
       在基于tinyos程序设计中,signal和event语句很常见。这两个关键字主要是为了实现分阶段作业的目的。和分阶段作业对应的是阻塞作业,下面举例子说明:
阻塞作业:
if(send()==SUCESS){
    sendCount++;
}

分阶段作业:
//调用阶段
send();
//完成阶段
void sendDone(error_t err){
    if(err==SUCESS){
        SendCount++;
    }
}

       分阶段调用的一个好处是,当send()操作发出后,系统无需等待,可以转而执行其他的任务(task),这样使得系统资源得以有效的利用,但假设send()函数中的具体实现为:
send(){
    int i;
    for(i=0;i++;i<10000);
}

       这样当send()操作发出后,系统必须执行send()中的内容,系统处于忙碌状态。这时候分阶段作业和阻塞作业是基本没有区别的;如果假设send()函数的具体实现是:
send(){
    //DMA控制设置
}

       这样当DMA控制命令设置结束后,系统便处于空闲状态,DMA控制器自主完成数据搬移,等到数据搬移结束后,DMA控制器通过中断通知控制器,进而完成sendDone()指令。在这种情况下,分阶段作业确实比阻塞作业有很大优势。
       总结一下:基于signal、event关键字的分阶段作业模式主要针对于独立于控制器处理的任务,在执行该任务是不需要控制器直接参与,这样控制器只需要做短暂的任务分配或相关配置,然后进入空闲状态,从而可以处理其他任务;如果用分阶段模式来处理像数据计算这样一直需要控制器全程参与的任务,分阶段作业和阻塞作业效果基本一致。


ps:以上内容为自己推测,并没有基于具体的源代码分析,所以仅供参考。

原创粉丝点击