TinyOS 学习笔记4

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 {
    post computeTask();
  }
}


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 {
    post computeTask();
  }
}
在此段代码中将静态变量i设置为局部变量。在nesC中,由于组件的状态是完全私有的,使用静态变量不利于命名空间的使用,也就是说可能和别的组件中变量的定义冲突,因此应注意静态变量变为局部变量。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值