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