#include<conio.h>
#include<unistd.h> // execi function is included
tid_t t_task1,t_task2,t_task3;
int task1(){ // task1 function
int roop;
for(roop=0;roop<500;roop++){
cputs("task1");
}
return 0;
}
int task2(){ // task2 fanction
int roop;
for(roop=0;roop<500;roop++){
cputs("task2");
}
return 0;
}
int task3(){// task3 fanction
int roop;
for(roop=0;roop<500;roop++){
cputs("task3");
}
return 0;
}
int main(int argc, char **argv) {
t_task1=execi(&task1,0,NULL,10,DEFAULT_STACK_SIZE); // make task1
t_task2=execi(&task2,0,NULL,15,DEFAULT_STACK_SIZE); // make task2
t_task3=execi(&task3,0,NULL,20,DEFAULT_STACK_SIZE); // make task3
return 0;
} |


#include<conio.h>
#include<unistd.h> // execi function is included
tid_t t_task1,t_task2;
int task1(){ // task1 function
cputs("task1");
sleep(5);
cputs("task1");
return 0;
}
int task2(){ // task2 fanction
cputs("task2");
sleep(1);
cputs("task2");
return 0;
}
int main(int argc, char **argv) {
t_task1=execi(&task1,0,NULL,20,DEFAULT_STACK_SIZE); // make task1
t_task2=execi(&task2,0,NULL,10,DEFAULT_STACK_SIZE); // make task2
return 0;
} |

では、task2がsleepするとどうなるのでしょうか?実はbrickOSkernelは無条件にアイドルタスク(tm_idle_task)というものを生成していて、それに実行権が移ります。アイドルタスクとは優先度0(最低)で、他に実行条件を満たすタスクが存在しない場合に実行権が与えられて、無駄な電力を消費しないようにするタスクです。
プログラムを起動した時点で、execi()で生成したタスク以外に、main 関数の実行にあたって、優先度 10 の main タスクが生成されています。この例では、main はタスク生成を生成するだけでその実行を終えるため、上記の様な場合にアイドルタスクへと処理が移ります。
#include<conio.h>
#include<dsensor.h>
#include<unistd.h> // wait_event function is included
wakeup_t sensor_press_wakeup(wakeup_t data); // wakeup_function
tid_t t_task1,t_task2;
int task1(){ // task1 function
cputs("task1");
wait_event(&sensor_press_wakeup,0);
cputs("ts on");
return 0;
}
int task2(){ // task2 fanction
cputs("task2");
sleep(2);
cputs("task2");
return 0;
}
int main(int argc, char **argv) {
t_task1=execi(&task1,0,NULL,20,DEFAULT_STACK_SIZE); // make task1
t_task2=execi(&task2,0,NULL,10,DEFAULT_STACK_SIZE); // make task2
return 0;
}
wakeup_t sensor_press_wakeup(wakeup_t data) { // wakeup_function
return SENSOR_1<0xf000;
} |

ライントレースするタスクと、タッチセンサの反応を待ち障害物回避行動をするタスクを生成する。 このとき、どちらの優先度を高くすべきかを考慮すること。また、回避行動で sleep 関数を呼んだ ときに、ライントレースタスクが動いているとそちらが実行されてしまう。それを回避するには、 sleep を呼ぶ前にライトレースタスクを kill(タスクID) しておけばよい。