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

TinyOS学习笔记4-task操作分析

[复制链接]
跳转到指定楼层
沙发
发表于 2015-3-25 17:21:05 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
task操作分析
1.task操作的含义
  正如基本的c语言一样,所有的代码是同步的,cup的资源是没有充分利用的。进一步而言,如果一段代码运行的时间过长,会影响其他代码的运行。任务的含义就是使任务中的代码在后台运行,也就是说过一会儿运行,类似于中断操作。
例如:
task void computeTask() {
  uint32_t i;
  for (i = 0; i < 400001; i++){}
}

event void Timer0.fired() {
  call Leds.led0Toggle();
  post computeTask();
}

task为任务的代码部分,而task利用post来调用。本段代码的含义就是在灯亮过之后进行一个400,001次的循环。task的作用就是在进行循环时不影响Timer.fired()的结束。
实验如下:
event void Timer0.fired()
  {
     uint32_t i;
    for (i = 0; i < 400001; i++) {
      call Leds.led0Toggle();
    }
}
此段代码的含义:循环400,001次,灯进行反转400,001次,由于是奇数,最后的结果是红灯。
实验的结果:红灯长亮,并没有进行闪烁,将数值变小后进行闪烁。
原因:计算干扰了Timer的操作。‘
利用task的实验:
task void computeTask() {
  uint32_t i;
  for (i = 0; i < 400001; i++){}
}

event void Timer0.fired() {
  call Leds.led0Toggle();
  post computeTask();
}
此段代码的含义:灯反转,再循环400,001次。
实验的结果:灯不断进行闪烁。
原因:task将计算与Timer的操作分开,由一个任务来执行计算。post操作将task放入一个任务序列,利用FIFO(先进先出)原则,完成一个任务继续执行下一个任务,不影响当前的操作。
进一步优化task操作:
uint32_t i;

task void computeTask() {
  uint32_t start = i;
  for (;i < start + 10000&& i < 400001; i++){}
  if (i >= 400000) {
    i = 0;
  }
  else {
    postcomputeTask();
  }
}


event void Timer0.fired() {
  call Leds.led0Toggle();
  post computeTask();
}
此段代码的含义:将计算分为10000次的多个小任务。实验的结果:红灯闪烁的频率变快。可见代码的效率提高了。
修改优化代码:
task void computeTask() {
  static uint32_t i;
  uint32_t start = i;
  for (;i < start + 10000&& i < 400001; i++){}
  if (i >= 400000) {
    i = 0;
  }
  else {
    postcomputeTask();
  }
}
在此段代码中将静态变量i设置为局部变量。在nesC中,由于组件的状态是完全私有的,使用静态变量不利于命名空间的使用,也就是说可能和别的组件中变量的定义冲突,因此应注意静态变量变为局部变量。
回复

使用道具 举报

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

本版积分规则

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