3 * Toyohashi Open Platform for Embedded Real-Time Systems/
4 * Advanced Standard Profile Kernel
6 * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
7 * Toyohashi Univ. of Technology, JAPAN
8 * Copyright (C) 2005-2008 by Embedded and Real-Time Systems Laboratory
9 * Graduate School of Information Science, Nagoya Univ., JAPAN
11 * 上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
12 * ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
13 * 変・再配布(以下,利用と呼ぶ)することを無償で許諾する.
14 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
15 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
17 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
18 * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用
19 * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記
21 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
22 * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ
24 * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
25 * 作権表示,この利用条件および下記の無保証規定を掲載すること.
26 * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
28 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
29 * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
30 * また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
31 * 由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを
34 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お
35 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
36 * に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
37 * アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
40 * @(#) $Id: mailbox.c 748 2008-03-07 17:18:06Z hiro $
47 #include "kernel_impl.h"
56 #ifndef LOG_SND_MBX_ENTER
57 #define LOG_SND_MBX_ENTER(mbxid, pk_msg)
58 #endif /* LOG_SND_MBX_ENTER */
60 #ifndef LOG_SND_MBX_LEAVE
61 #define LOG_SND_MBX_LEAVE(ercd)
62 #endif /* LOG_SND_MBX_LEAVE */
64 #ifndef LOG_RCV_MBX_ENTER
65 #define LOG_RCV_MBX_ENTER(mbxid, ppk_msg)
66 #endif /* LOG_RCV_MBX_ENTER */
68 #ifndef LOG_RCV_MBX_LEAVE
69 #define LOG_RCV_MBX_LEAVE(ercd, pk_msg)
70 #endif /* LOG_RCV_MBX_LEAVE */
72 #ifndef LOG_PRCV_MBX_ENTER
73 #define LOG_PRCV_MBX_ENTER(mbxid, ppk_msg)
74 #endif /* LOG_PRCV_MBX_ENTER */
76 #ifndef LOG_PRCV_MBX_LEAVE
77 #define LOG_PRCV_MBX_LEAVE(ercd, pk_msg)
78 #endif /* LOG_PRCV_MBX_LEAVE */
80 #ifndef LOG_TRCV_MBX_ENTER
81 #define LOG_TRCV_MBX_ENTER(mbxid, ppk_msg, tmout)
82 #endif /* LOG_TRCV_MBX_ENTER */
84 #ifndef LOG_TRCV_MBX_LEAVE
85 #define LOG_TRCV_MBX_LEAVE(ercd, pk_msg)
86 #endif /* LOG_TRCV_MBX_LEAVE */
88 #ifndef LOG_INI_MBX_ENTER
89 #define LOG_INI_MBX_ENTER(mbxid)
90 #endif /* LOG_INI_MBX_ENTER */
92 #ifndef LOG_INI_MBX_LEAVE
93 #define LOG_INI_MBX_LEAVE(ercd)
94 #endif /* LOG_INI_MBX_LEAVE */
96 #ifndef LOG_REF_MBX_ENTER
97 #define LOG_REF_MBX_ENTER(mbxid, pk_rmbx)
98 #endif /* LOG_REF_MBX_ENTER */
100 #ifndef LOG_REF_MBX_LEAVE
101 #define LOG_REF_MBX_LEAVE(ercd, pk_rmbx)
102 #endif /* LOG_REF_MBX_LEAVE */
107 #define tnum_mbx ((uint_t)(tmax_mbxid - TMIN_MBXID + 1))
110 * メールボックスIDからメールボックス管理ブロックを取り出すためのマクロ
112 #define INDEX_MBX(mbxid) ((uint_t)((mbxid) - TMIN_MBXID))
113 #define get_mbxcb(mbxid) (&(mbxcb_table[INDEX_MBX(mbxid)]))
118 #ifdef TOPPERS_mbxini
121 initialize_mailbox(void)
126 for (p_mbxcb = mbxcb_table, i = 0; i < tnum_mbx; p_mbxcb++, i++) {
127 queue_initialize(&(p_mbxcb->wait_queue));
128 p_mbxcb->p_mbxinib = &(mbxinib_table[i]);
129 p_mbxcb->pk_head = NULL;
133 #endif /* TOPPERS_mbxini */
138 #define MSGPRI(pk_msg) (((T_MSG_PRI *) pk_msg)->msgpri)
144 enqueue_msg_pri(T_MSG **ppk_prevmsg_next, T_MSG *pk_msg)
148 while ((pk_nextmsg = *ppk_prevmsg_next) != NULL) {
149 if (MSGPRI(pk_nextmsg) > MSGPRI(pk_msg)) {
152 ppk_prevmsg_next = &(pk_nextmsg->pk_next);
154 pk_msg->pk_next = pk_nextmsg;
155 *ppk_prevmsg_next = pk_msg;
161 #ifdef TOPPERS_snd_mbx
164 snd_mbx(ID mbxid, T_MSG *pk_msg)
170 LOG_SND_MBX_ENTER(mbxid, pk_msg);
173 p_mbxcb = get_mbxcb(mbxid);
174 CHECK_PAR((p_mbxcb->p_mbxinib->mbxatr & TA_MPRI) == 0U
175 || (TMIN_MPRI <= MSGPRI(pk_msg)
176 && MSGPRI(pk_msg) <= p_mbxcb->p_mbxinib->maxmpri));
179 if (!queue_empty(&(p_mbxcb->wait_queue))) {
180 p_tcb = (TCB *) queue_delete_next(&(p_mbxcb->wait_queue));
181 ((WINFO_MBX *)(p_tcb->p_winfo))->pk_msg = pk_msg;
182 if (wait_complete(p_tcb)) {
187 else if ((p_mbxcb->p_mbxinib->mbxatr & TA_MPRI) != 0U) {
188 enqueue_msg_pri(&(p_mbxcb->pk_head), pk_msg);
192 pk_msg->pk_next = NULL;
193 if (p_mbxcb->pk_head != NULL) {
194 p_mbxcb->pk_last->pk_next = pk_msg;
197 p_mbxcb->pk_head = pk_msg;
199 p_mbxcb->pk_last = pk_msg;
205 LOG_SND_MBX_LEAVE(ercd);
209 #endif /* TOPPERS_snd_mbx */
214 #ifdef TOPPERS_rcv_mbx
217 rcv_mbx(ID mbxid, T_MSG **ppk_msg)
223 LOG_RCV_MBX_ENTER(mbxid, ppk_msg);
226 p_mbxcb = get_mbxcb(mbxid);
229 if (p_mbxcb->pk_head != NULL) {
230 *ppk_msg = p_mbxcb->pk_head;
231 p_mbxcb->pk_head = (*ppk_msg)->pk_next;
235 p_runtsk->tstat = (TS_WAITING | TS_WAIT_MBX);
236 wobj_make_wait((WOBJCB *) p_mbxcb, (WINFO_WOBJ *) &winfo_mbx);
238 ercd = winfo_mbx.winfo.wercd;
240 *ppk_msg = winfo_mbx.pk_msg;
246 LOG_RCV_MBX_LEAVE(ercd, *ppk_msg);
250 #endif /* TOPPERS_rcv_mbx */
253 * メールボックスからの受信(ポーリング)
255 #ifdef TOPPERS_prcv_mbx
258 prcv_mbx(ID mbxid, T_MSG **ppk_msg)
263 LOG_PRCV_MBX_ENTER(mbxid, ppk_msg);
266 p_mbxcb = get_mbxcb(mbxid);
269 if (p_mbxcb->pk_head != NULL) {
270 *ppk_msg = p_mbxcb->pk_head;
271 p_mbxcb->pk_head = (*ppk_msg)->pk_next;
280 LOG_PRCV_MBX_LEAVE(ercd, *ppk_msg);
284 #endif /* TOPPERS_prcv_mbx */
287 * メールボックスからの受信(タイムアウトあり)
289 #ifdef TOPPERS_trcv_mbx
292 trcv_mbx(ID mbxid, T_MSG **ppk_msg, TMO tmout)
299 LOG_TRCV_MBX_ENTER(mbxid, ppk_msg, tmout);
303 p_mbxcb = get_mbxcb(mbxid);
306 if (p_mbxcb->pk_head != NULL) {
307 *ppk_msg = p_mbxcb->pk_head;
308 p_mbxcb->pk_head = (*ppk_msg)->pk_next;
311 else if (tmout == TMO_POL) {
315 p_runtsk->tstat = (TS_WAITING | TS_WAIT_MBX);
316 wobj_make_wait_tmout((WOBJCB *) p_mbxcb, (WINFO_WOBJ *) &winfo_mbx,
319 ercd = winfo_mbx.winfo.wercd;
321 *ppk_msg = winfo_mbx.pk_msg;
327 LOG_TRCV_MBX_LEAVE(ercd, *ppk_msg);
331 #endif /* TOPPERS_trcv_mbx */
336 #ifdef TOPPERS_ini_mbx
345 LOG_INI_MBX_ENTER(mbxid);
348 p_mbxcb = get_mbxcb(mbxid);
351 dspreq = init_wait_queue(&(p_mbxcb->wait_queue));
352 p_mbxcb->pk_head = NULL;
360 LOG_INI_MBX_LEAVE(ercd);
364 #endif /* TOPPERS_ini_mbx */
369 #ifdef TOPPERS_ref_mbx
372 ref_mbx(ID mbxid, T_RMBX *pk_rmbx)
377 LOG_REF_MBX_ENTER(mbxid, pk_rmbx);
380 p_mbxcb = get_mbxcb(mbxid);
383 pk_rmbx->wtskid = wait_tskid(&(p_mbxcb->wait_queue));
384 pk_rmbx->pk_msg = p_mbxcb->pk_head;
389 LOG_REF_MBX_LEAVE(ercd, pk_rmbx);
393 #endif /* TOPPERS_ref_mbx */