#include #include #include IMPORT void doWorkA( W ); IMPORT W doWorkB( void ); ID mbfid; void taskA( INT stacd, VP exinf ) { INT msgsz; W rcv_msg; while(1){ msgsz = tk_rcv_mbf( mbfid, &rcv_msg, TMO_FEVR ); /* doWorkB() の処理完了を待ち、その処理結果を受信する */ if( msgsz > 0 ) { doWorkA( rcv_msg ); /* 受信した結果を利用 */ } } tk_ext_tsk(); } void taskB( INT stacd, VP exinf ) { W snd_msg; while(1){ snd_msg = doWorkB(); /* doWorkA() の前に行うべき処理 */ tk_snd_mbf( mbfid, &snd_msg, sizeof(snd_msg), TMO_FEVR ); /* doWorkB() の処理結果をタスクAに通知する */ } tk_ext_tsk(); } EXPORT INT usermain( void ) /* 初期タスクから呼ばれる関数 */ { T_CMBF cmbf = { NULL, TA_TFIFO, 0x10, 0x4 }; T_CTSK ctskA = { NULL, TA_HLNG|TA_RNG0, taskA, 1, 4*1024 }; T_CTSK ctskB = { NULL, TA_HLNG|TA_RNG0, taskB, 2, 4*1024 }; ID tskIdA; /* タスクAの識別子 */ ID tskIdB; /* タスクBの識別子 */ mbfid = tk_cre_mbf( &cmbf ); /* メッセージバッファを生成 */ tskIdA = tk_cre_tsk( &ctskA ); /* タスクAを生成 */ tk_sta_tsk( tskIdA, 0 ); /* タスクAの実行を開始 */ tskIdB = tk_cre_tsk( &ctskB ); /* タスクBを生成 */ tk_sta_tsk( tskIdB, 0 ); /* タスクBの実行を開始 */ tk_slp_tsk( TMO_FEVR ); /* 起床待ち状態に移行 */ return 0; }