2014-09-17 :-(
_ 午後
1615 退勤
_ [メールボックス][ITRON][TOPPERS/JSP][コードリーディング]ITRON 実装 TOPPERS/JSP を読む - メールボックス
データへのポインタの線形リスト。受信前に再送信すると以前のデータは上書きされる。
データそのものではなく、データへのポインタをやりとりする。
doc\user.txt で機能を眺めてみる。
3.4.4 メールボックス T_MSG型は下記のように定義されている.T_MSG型のサイズは,ターゲットプロ セッサ/コンパイラのポインタのサイズに一致する. typedef struct t_msg { struct t_msg *next; } T_MSG; JSPカーネルでは,優先度別メッセージキューヘッダ領域は用いていない. TSZ_MPRIHD は定義していないが,定義するとしたら 0 となる. (1) CRE_MBX メールボックスの生成(静的API) mprihd に NULL 以外が指定された場合の機能(優先度別メッセージキューヘッ ダ領域の先頭番地を指定する)はサポートしていない. (2) snd_mbx メールボックスへの送信 (3) rcv_mbx メールボックスからの受信 (4) prcv_mbx メールボックスからの受信(ポーリング) (5) trcv_mbx メールボックスからの受信(タイムアウトあり)
コードはここ kernel\mailbox.c
メールボックス送信
SYSCALL ER snd_mbx(ID mbxid, T_MSG *pk_msg) { MBXCB *mbxcb; TCB *tcb; ER ercd; LOG_SND_MBX_ENTER(mbxid, pk_msg); CHECK_TSKCTX_UNL(); CHECK_MBXID(mbxid); mbxcb = get_mbxcb(mbxid); CHECK_PAR((mbxcb->mbxinib->mbxatr & TA_MPRI) == 0 || (TMIN_MPRI <= MSGPRI(pk_msg) && MSGPRI(pk_msg) <= mbxcb->mbxinib->maxmpri)); // リリカル不可分操作 始まります t_lock_cpu(); // タスクキューが空っぽじゃない場合 if (!(queue_empty(&(mbxcb->wait_queue)))) { // タスクをタスクキューへ追加 tcb = (TCB *) queue_delete_next(&(mbxcb->wait_queue)); ((WINFO_MBX *)(tcb->winfo))->pk_msg = pk_msg; if (wait_complete(tcb)) { // 起きろ dispatch(); } ercd = E_OK; } // 優先度付きキューならこっち else if ((mbxcb->mbxinib->mbxatr & TA_MPRI) != 0) { enqueue_msg_pri(&(mbxcb->head), pk_msg); ercd = E_OK; } else { // メッセージへのポインタをリストの末尾へ追加など pk_msg->next = NULL; if (mbxcb->head != NULL) { mbxcb->last->next = pk_msg; } else { mbxcb->head = pk_msg; } mbxcb->last = pk_msg; ercd = E_OK; } t_unlock_cpu(); exit: LOG_SND_MBX_LEAVE(ercd); return(ercd); }
メールボックス受信
SYSCALL ER rcv_mbx(ID mbxid, T_MSG **ppk_msg) { MBXCB *mbxcb; WINFO_MBX winfo; ER ercd; LOG_RCV_MBX_ENTER(mbxid, ppk_msg); CHECK_DISPATCH(); CHECK_MBXID(mbxid); mbxcb = get_mbxcb(mbxid); // CPU不可分しまっせ t_lock_cpu(); // メッセージボックスが空っぽじゃない場合 if (mbxcb->head != NULL) { // リストの先頭のメッセージへのポインタを取得 *ppk_msg = mbxcb->head; mbxcb->head = (*ppk_msg)->next; ercd = E_OK; } // メッセージボックスが空っぽの場合 else { // タスクを待機状態へ移行 wobj_make_wait((WOBJCB *) mbxcb, (WINFO_WOBJ *) &winfo); dispatch(); ercd = winfo.winfo.wercd; if (ercd == E_OK) { *ppk_msg = winfo.pk_msg; } } t_unlock_cpu(); exit: LOG_RCV_MBX_LEAVE(ercd, *ppk_msg); return(ercd); }
_ [メッセージバッファ][ITRON][TOPPERS/JSP][コードリーディング]ITRON 実装 TOPPERS/JSP を読む - メッセージバッファ
メールボックスとは異なり、データのコピーを線形リストに繋げる。コピーするぶん遅いが上書きの心配はない。
しかしTOPPERS/JSP に実装が見当たらん。
include\kernel_debug.h にタスク状態の定数はあるんだが使っている箇所がない。うーん。
#define TTW_SMBF 0x0100u /* メッセージバッファへの送信待ち */ #define TTW_RMBF 0x0200u /* メッセージバッファからの受信待ち */