您的位置:首页 > 其它

TinyOS 同步与异步处理学习心得

2014-01-21 09:55 190 查看
TinyOS中的同步处理是指同步代码从运行开始一直占用CPU直到运行完毕,同步的缺点在于在此期间其他代码没有任何运行的机会,若一段代码长期占用CPU,则相当于是“死循环”,如在例子程序BlinkTask中,有下面这段代码:

event void Timer0.fired(){

  unit32_t i;

  for(i=0; i<400001; i++)

    call Leds.led0Toggle();

}

该例子程序所要实现的效果是红绿蓝三个灯按自己的循环周期进行闪烁,但由于上面的代码中,for循环了400000次,从而大量占据了CPU,使得led1和led2被阻塞,则最后实现的效果是红灯长亮,绿蓝两个灯无反应。具体的CPU相关参数,可以查询TI公司的msp430说明。

解决阻塞的办法之一是可以使用Task,Task使用post来调用,有些类似于单片机的delay()。post 操作把任务放置到一个以先进先出为处理方式的内部任务队列中去,当一个任务开始执行的时候,只有它运行结束,下一个任务才能开始运行。因此,一个任务不应该占用或阻塞太长时间。例子代码如下:

implementation{



  task void computeTask() {

    uint32_t i;

    for (i = 0; i < 400001; i++) {}

  }

  event void Timer0.fired() {

    call Leds.led0Toggle();

    post computeTask();

}

...

实现效果是红灯闪烁,绿灯蓝灯仍不会亮。原因还是因为40000次循环占用了太多的CPU。

更好地解决办法是split-phase操作。在阻塞系统中,当一个调用长时间运行的操作时,只有操作完成时调用才会返回;而在split-phase系统中,调用会立即返回,当操作完成会发出一个回调函数告知运算完毕。例子代码如下:

uint32_t i;

task void computeTask() {

  uint32_t start = i;

  for (;i < start + 10000 && i < 400001; i++) {}

  if (i >= 400000) {

  i = 0;

  }

  else {

    post computeTask();

  }

}

实现效果是各灯都正常闪烁。split-phase操作将400001次计算分片成若干个片,让每一片分别执行post操作,使得一个大任务分割成各个小任务,从而解决了因为大量的计算而造成的阻塞问题。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: