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 /* メッセージバッファからの受信待ち */
[ツッコミを入れる]



