#include #include #include ID porid; #define ACP_NO 4 #define CAL_NO 7 #define ACP_PTN (0xFFFFFFFF) /* 受付側選択条件 */ #define CAL_PTN (0x00000001) /* 呼出側選択条件 */ #define MSGSZ 16 /* >= "0x12345678\n" */ IMPORT INT hex2str( char *buf, UW val ); void taskSV( INT stacd, void *exinf ) { RNO rdvno; char msg[MSGSZ]; INT sz; while(1){ /* ランデブ受付発行前に必要な処理 */ tk_acp_por( porid, ACP_PTN, &rdvno, msg, TMO_FEVR ); /* ランデブ受付 */ /* クライアントから依頼された処理 */ sz = hex2str( msg, *(UW*)msg ); tk_rpl_rdv( rdvno, msg, sz ); /* ランデブ返答 */ /* ランデブ終了後に必要な処理 */ } tk_ext_tsk(); } void taskCL( INT stacd, void *exinf ) { UW msg[MSGSZ/sizeof(UW)+1]; UW i = 0; while(1){ /* ランデブ呼出発行前に必要な処理 */ msg[0] = i++; /* 呼出メッセージを作成 */ tk_cal_por( porid, CAL_PTN, msg, sizeof(UW), TMO_FEVR );/* ランデブ呼出 */ /* ランデブ終了後に必要な処理 */ tm_putstring( (UB*)msg ); /* 変換結果の出力 */ } tk_ext_tsk(); } EXPORT INT usermain( void ) { T_CPOR cpor = { NULL, TA_TFIFO, sizeof(UW), MSGSZ }; T_CTSK ctskSV = { NULL, TA_HLNG|TA_RNG0, taskSV, 2, 4*1024 }; T_CTSK ctskCL = { NULL, TA_HLNG|TA_RNG0, taskCL, 3, 4*1024 }; ID tskidSV[ACP_NO]; ID tskidCL[CAL_NO]; INT i; tk_chg_pri(TSK_SELF, 1); porid = tk_cre_por( &cpor ); for( i = 0; i < ACP_NO; i++ ){ tskidSV[i] = tk_cre_tsk( &ctskSV ); tk_sta_tsk( tskidSV[i], 0 ); } for( i = 0; i < CAL_NO; i++ ){ tskidCL[i] = tk_cre_tsk( &ctskCL ); tk_sta_tsk( tskidCL[i], 0 ); } tk_slp_tsk(TMO_FEVR); return 1; } /* 数値を16進数の文字列に変換 */ IMPORT INT hex2str( char *buf, UW val ) { INT len; INT i; /* 上位桁にある 0 はスキップ */ for( i = sizeof(UW)*2 - 1; i > 0; i-- ){ if( (val >> 4*i) != 0 ){ break; } } /* 16進数(文字列)に変換 */ *(buf+0) = '0'; *(buf+1) = 'x'; len = 2; do{ *(buf+len) = (val >> 4*i) & 0x0F; *(buf+len) += (*(buf+len) < 10)? '0':'A'-10; len++; }while( i-- > 0 ); *(buf+len++) = '\n'; *(buf+len++) = '\0'; return len; }