#include #include #include IMPORT void doWorkA( void ); IMPORT void doWorkB( void ); IMPORT void doWorkC( void ); INT i; /* タスクAとタスクCで共有 */ ID mtxid; /* ミューテックスID */ void taskA( INT stacd, VP exinf ) { while(1){ tm_putstring( (UB*)"A enters critical section!\n" ); tk_loc_mtx(mtxid, TMO_FEVR); doWorkA(); /* タスクA用の処理 */ tm_putstring( (UB*)"A exits critical section!\n" ); tk_unl_mtx(mtxid); tk_dly_tsk(5000); } tk_ext_tsk(); } void taskB( INT stacd, VP exinf ) { while(1){ doWorkB(); /* タスクB用の処理 */ tk_dly_tsk(5000); } tk_ext_tsk(); } void taskC( INT stacd, VP exinf ) { while(1){ tm_putstring( (UB*)"C enters critical section!\n" ); tk_loc_mtx(mtxid, TMO_FEVR); doWorkC(); /* タスクC用の処理 */ tm_putstring( (UB*)"C exits critical section!\n" ); tk_unl_mtx(mtxid); } tk_ext_tsk(); } EXPORT INT usermain( void ) /* 初期タスクから呼ばれる関数 */ { T_CMTX cmtx = { NULL, TA_INHERIT, 1 }; T_CTSK ctskA = { NULL, TA_HLNG|TA_RNG0, taskA, 1, 4*1024 }; T_CTSK ctskB = { NULL, TA_HLNG|TA_RNG0, taskB, 2, 4*1024 }; T_CTSK ctskC = { NULL, TA_HLNG|TA_RNG0, taskC, 3, 4*1024 }; ID tskIdA; /* タスクAの識別子 */ ID tskIdB; /* タスクBの識別子 */ ID tskIdC; /* タスクCの識別子 */ tk_chg_pri(TSK_SELF,1); mtxid = tk_cre_mtx( &cmtx ); /* ミューテックスを生成 */ tskIdA = tk_cre_tsk( &ctskA ); /* タスクAを生成 */ tk_sta_tsk( tskIdA, 0 ); /* タスクAの実行を開始 */ tskIdB = tk_cre_tsk( &ctskB ); /* タスクBを生成 */ tk_sta_tsk( tskIdB, 0 ); /* タスクBの実行を開始 */ tskIdC = tk_cre_tsk( &ctskC ); /* タスクCを生成 */ tk_sta_tsk( tskIdC, 0 ); /* タスクCの実行を開始 */ tk_slp_tsk(TMO_FEVR); /* 起床待ち状態に移行 */ return 0; } void doWorkA( void ) { for (i = 0; i < 50; i++) { tm_putstring( (UB*)"A is working!\n" ); WaitUsec(100000); /* 100 ms のビジーループ */ } } void doWorkB( void ) { INT j; for (j = 0; j < 230; j++) { tm_putstring( (UB*)"B is working!\n" ); WaitUsec(100000); /* 100 ms のビジーループ */ } } void doWorkC( void ) { for (i = 0; i < 50; i++) { tm_putstring( (UB*)"C is working!\n" ); WaitUsec(100000); /* 100 ms のビジーループ */ } }