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