#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) しておけばよい。