| 
 | 
 
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中,由于组件的状态是完全私有的,使用静态变量不利于命名空间的使用,也就是说可能和别的组件中变量的定义冲突,因此应注意静态变量变为局部变量。 
 |   
 
 
 
 |