#include #include #include IMPORT void doWorkA( void ); IMPORT void doWorkB( void ); IMPORT void doWorkC( void ); #define FPTNB 0x00000001U #define FPTNC 0x00000002U ID flgid; void taskA( INT stacd, VP exinf ) { while(1){ doWorkA(); /* doWorkB()とdoWorkC()の前に行うべき処理 */ tk_set_flg(flgid, FPTNB|FPTNC); /* doWorkA()の処理完了を通知する */ } tk_ext_tsk(); } void taskB( INT stacd, VP exinf ) { UINT flgptn; while(1){ tk_wai_flg(flgid, FPTNB, TWF_ANDW|TWF_BITCLR, &flgptn, TMO_FEVR); /* doWorkA()の処理完了を待つ */ doWorkB(); /* doWorkA()の後で行うべき処理 */ } tk_ext_tsk(); } void taskC( INT stacd, VP exinf ) { UINT flgptn; while(1){ tk_wai_flg(flgid, FPTNC, TWF_ANDW|TWF_BITCLR, &flgptn, TMO_FEVR); /* doWorkA()の処理完了を待つ */ doWorkC(); /* doWorkA()の後で行うべき別の処理 */ } tk_ext_tsk(); } EXPORT INT usermain( void ) /* 初期タスクから呼ばれる関数 */ { T_CFLG cflg = { NULL, TA_TFIFO|TA_WMUL, 0 }; T_CTSK ctskA = { NULL, TA_HLNG|TA_RNG0, taskA, 1, 4*1024 }; T_CTSK ctskB = { NULL, TA_HLNG|TA_RNG0, taskB, 1, 4*1024 }; T_CTSK ctskC = { NULL, TA_HLNG|TA_RNG0, taskC, 1, 4*1024 }; ID tskIdA; /* タスクAの識別子 */ ID tskIdB; /* タスクBの識別子 */ ID tskIdC; /* タスクCの識別子 */ flgid = tk_cre_flg( &cflg ); /* イベントフラグを生成 */ tskIdB = tk_cre_tsk( &ctskB ); /* タスクBを生成 */ tk_sta_tsk( tskIdB, 0 ); /* タスクBの実行を開始 */ tskIdC = tk_cre_tsk( &ctskC ); /* タスクCを生成 */ tk_sta_tsk( tskIdC, 0 ); /* タスクCの実行を開始 */ tskIdA = tk_cre_tsk( &ctskA ); /* タスクAを生成 */ tk_sta_tsk( tskIdA, 0 ); /* タスクAの実行を開始 */ tk_slp_tsk(TMO_FEVR); /* 起床待ち状態に移行 */ return 0; } void doWorkA( void ) { tm_putstring( (UB*)"> Work A!\n" ); tk_dly_tsk(200); tm_putstring( (UB*)"< Work A!\n" ); } void doWorkB( void ) { tm_putstring( (UB*)"> Work B!\n" ); tk_dly_tsk(50); tm_putstring( (UB*)"< Work B!\n" ); } void doWorkC( void ) { tm_putstring( (UB*)"> Work C!\n" ); tk_dly_tsk(60); tm_putstring( (UB*)"< Work C!\n" ); }