トップ «前の日記(2014-09-16) 最新 次の日記(2014-09-18)» 編集

ヨタの日々

2001|08|09|10|11|12|
2002|01|02|03|04|05|06|07|08|09|10|11|12|
2003|01|02|03|04|05|06|07|08|09|10|11|12|
2004|01|02|03|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|09|10|11|12|
2011|01|02|03|04|05|06|07|08|09|10|11|12|
2012|01|02|03|04|05|06|07|08|09|10|11|12|
2013|01|02|03|04|05|06|07|08|09|10|11|12|
2014|01|02|03|04|05|06|07|08|09|10|11|12|
2015|01|02|03|04|05|06|07|08|09|10|11|12|
2016|01|02|03|04|05|06|07|08|09|10|11|12|
2017|01|02|03|04|05|06|07|08|09|10|11|12|
2018|01|02|03|04|05|06|07|08|09|10|11|12|
2019|01|02|03|04|05|06|07|08|09|10|11|12|
2020|01|02|03|04|05|06|07|08|09|10|11|12|
2021|01|02|03|04|05|06|07|08|09|10|11|12|
2022|01|02|03|04|05|06|07|08|09|10|11|12|
2023|01|02|03|04|05|06|07|08|12|
2024|01|02|03|

2014-09-17 :-(

_ 午前

0530 起床

0700 食堂

0800 労働

_ 午後

1615 退勤

_

1800 支度

2130 飯

_ [メールボックス][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		/* メッセージバッファからの受信待ち */