#include "kernel_impl.h"
#include "check.h"
#include "task.h"
#include "wait.h"
#include "mailbox.h"
マクロ定義 | |
#define | LOG_SND_MBX_ENTER(mbxid, pk_msg) |
#define | LOG_SND_MBX_LEAVE(ercd) |
#define | LOG_RCV_MBX_ENTER(mbxid, ppk_msg) |
#define | LOG_RCV_MBX_LEAVE(ercd, pk_msg) |
#define | LOG_PRCV_MBX_ENTER(mbxid, ppk_msg) |
#define | LOG_PRCV_MBX_LEAVE(ercd, pk_msg) |
#define | LOG_TRCV_MBX_ENTER(mbxid, ppk_msg, tmout) |
#define | LOG_TRCV_MBX_LEAVE(ercd, pk_msg) |
#define | LOG_INI_MBX_ENTER(mbxid) |
#define | LOG_INI_MBX_LEAVE(ercd) |
#define | LOG_REF_MBX_ENTER(mbxid, pk_rmbx) |
#define | LOG_REF_MBX_LEAVE(ercd, pk_rmbx) |
#define | tnum_mbx ((uint_t)(tmax_mbxid - TMIN_MBXID + 1)) |
#define | INDEX_MBX(mbxid) ((uint_t)((mbxid) - TMIN_MBXID)) |
#define | get_mbxcb(mbxid) (&(mbxcb_table[INDEX_MBX(mbxid)])) |
#define | MSGPRI(pk_msg) (((T_MSG_PRI *) pk_msg)->msgpri) |
関数 | |
void | initialize_mailbox (void) |
Inline void | enqueue_msg_pri (T_MSG **ppk_prevmsg_next, T_MSG *pk_msg) |
ER | snd_mbx (ID mbxid, T_MSG *pk_msg) |
ER | rcv_mbx (ID mbxid, T_MSG **ppk_msg) |
ER | prcv_mbx (ID mbxid, T_MSG **ppk_msg) |
ER | trcv_mbx (ID mbxid, T_MSG **ppk_msg, TMO tmout) |
ER | ini_mbx (ID mbxid) |
ER | ref_mbx (ID mbxid, T_RMBX *pk_rmbx) |
#define get_mbxcb | ( | mbxid | ) | (&(mbxcb_table[INDEX_MBX(mbxid)])) |
参照元 ini_mbx(), prcv_mbx(), rcv_mbx(), ref_mbx(), snd_mbx(), と trcv_mbx().
#define LOG_PRCV_MBX_ENTER | ( | mbxid, | |||
ppk_msg | ) |
#define LOG_PRCV_MBX_LEAVE | ( | ercd, | |||
pk_msg | ) |
#define LOG_TRCV_MBX_ENTER | ( | mbxid, | |||
ppk_msg, | |||||
tmout | ) |
#define LOG_TRCV_MBX_LEAVE | ( | ercd, | |||
pk_msg | ) |
#define MSGPRI | ( | pk_msg | ) | (((T_MSG_PRI *) pk_msg)->msgpri) |
#define tnum_mbx ((uint_t)(tmax_mbxid - TMIN_MBXID + 1)) |
参照先 MSGPRI, NULL, と t_msg::pk_next.
参照元 snd_mbx().
00145 { 00146 T_MSG *pk_nextmsg; 00147 00148 while ((pk_nextmsg = *ppk_prevmsg_next) != NULL) { 00149 if (MSGPRI(pk_nextmsg) > MSGPRI(pk_msg)) { 00150 break; 00151 } 00152 ppk_prevmsg_next = &(pk_nextmsg->pk_next); 00153 } 00154 pk_msg->pk_next = pk_nextmsg; 00155 *ppk_prevmsg_next = pk_msg; 00156 }
参照先 CHECK_MBXID, CHECK_TSKCTX_UNL, dispatch, E_OK, get_mbxcb, init_wait_queue, LOG_INI_MBX_ENTER, LOG_INI_MBX_LEAVE, NULL, mailbox_control_block::pk_head, t_lock_cpu, t_unlock_cpu, と mailbox_control_block::wait_queue.
00340 { 00341 MBXCB *p_mbxcb; 00342 bool_t dspreq; 00343 ER ercd; 00344 00345 LOG_INI_MBX_ENTER(mbxid); 00346 CHECK_TSKCTX_UNL(); 00347 CHECK_MBXID(mbxid); 00348 p_mbxcb = get_mbxcb(mbxid); 00349 00350 t_lock_cpu(); 00351 dspreq = init_wait_queue(&(p_mbxcb->wait_queue)); 00352 p_mbxcb->pk_head = NULL; 00353 if (dspreq) { 00354 dispatch(); 00355 } 00356 ercd = E_OK; 00357 t_unlock_cpu(); 00358 00359 error_exit: 00360 LOG_INI_MBX_LEAVE(ercd); 00361 return(ercd); 00362 }
void initialize_mailbox | ( | void | ) |
参照先 mbxcb_table, mbxinib_table, NULL, mailbox_control_block::p_mbxinib, mailbox_control_block::pk_head, queue_initialize(), tnum_mbx, と mailbox_control_block::wait_queue.
00122 { 00123 uint_t i; 00124 MBXCB *p_mbxcb; 00125 00126 for (p_mbxcb = mbxcb_table, i = 0; i < tnum_mbx; p_mbxcb++, i++) { 00127 queue_initialize(&(p_mbxcb->wait_queue)); 00128 p_mbxcb->p_mbxinib = &(mbxinib_table[i]); 00129 p_mbxcb->pk_head = NULL; 00130 } 00131 }
参照先 CHECK_MBXID, CHECK_TSKCTX_UNL, E_OK, E_TMOUT, get_mbxcb, LOG_PRCV_MBX_ENTER, LOG_PRCV_MBX_LEAVE, NULL, mailbox_control_block::pk_head, t_msg::pk_next, t_lock_cpu, と t_unlock_cpu.
00259 { 00260 MBXCB *p_mbxcb; 00261 ER ercd; 00262 00263 LOG_PRCV_MBX_ENTER(mbxid, ppk_msg); 00264 CHECK_TSKCTX_UNL(); 00265 CHECK_MBXID(mbxid); 00266 p_mbxcb = get_mbxcb(mbxid); 00267 00268 t_lock_cpu(); 00269 if (p_mbxcb->pk_head != NULL) { 00270 *ppk_msg = p_mbxcb->pk_head; 00271 p_mbxcb->pk_head = (*ppk_msg)->pk_next; 00272 ercd = E_OK; 00273 } 00274 else { 00275 ercd = E_TMOUT; 00276 } 00277 t_unlock_cpu(); 00278 00279 error_exit: 00280 LOG_PRCV_MBX_LEAVE(ercd, *ppk_msg); 00281 return(ercd); 00282 }
参照先 CHECK_DISPATCH, CHECK_MBXID, dispatch, E_OK, get_mbxcb, LOG_RCV_MBX_ENTER, LOG_RCV_MBX_LEAVE, NULL, p_runtsk, mailbox_control_block::pk_head, t_msg::pk_next, t_lock_cpu, t_unlock_cpu, TS_WAIT_MBX, TS_WAITING, waiting_information::wercd, wait_object_waiting_information::winfo, と wobj_make_wait.
00218 { 00219 MBXCB *p_mbxcb; 00220 WINFO_MBX winfo_mbx; 00221 ER ercd; 00222 00223 LOG_RCV_MBX_ENTER(mbxid, ppk_msg); 00224 CHECK_DISPATCH(); 00225 CHECK_MBXID(mbxid); 00226 p_mbxcb = get_mbxcb(mbxid); 00227 00228 t_lock_cpu(); 00229 if (p_mbxcb->pk_head != NULL) { 00230 *ppk_msg = p_mbxcb->pk_head; 00231 p_mbxcb->pk_head = (*ppk_msg)->pk_next; 00232 ercd = E_OK; 00233 } 00234 else { 00235 p_runtsk->tstat = (TS_WAITING | TS_WAIT_MBX); 00236 wobj_make_wait((WOBJCB *) p_mbxcb, (WINFO_WOBJ *) &winfo_mbx); 00237 dispatch(); 00238 ercd = winfo_mbx.winfo.wercd; 00239 if (ercd == E_OK) { 00240 *ppk_msg = winfo_mbx.pk_msg; 00241 } 00242 } 00243 t_unlock_cpu(); 00244 00245 error_exit: 00246 LOG_RCV_MBX_LEAVE(ercd, *ppk_msg); 00247 return(ercd); 00248 }
参照先 CHECK_MBXID, CHECK_TSKCTX_UNL, E_OK, get_mbxcb, LOG_REF_MBX_ENTER, LOG_REF_MBX_LEAVE, mailbox_control_block::pk_head, t_rmbx::pk_msg, t_lock_cpu, t_unlock_cpu, mailbox_control_block::wait_queue, wait_tskid(), と t_rmbx::wtskid.
00373 { 00374 MBXCB *p_mbxcb; 00375 ER ercd; 00376 00377 LOG_REF_MBX_ENTER(mbxid, pk_rmbx); 00378 CHECK_TSKCTX_UNL(); 00379 CHECK_MBXID(mbxid); 00380 p_mbxcb = get_mbxcb(mbxid); 00381 00382 t_lock_cpu(); 00383 pk_rmbx->wtskid = wait_tskid(&(p_mbxcb->wait_queue)); 00384 pk_rmbx->pk_msg = p_mbxcb->pk_head; 00385 ercd = E_OK; 00386 t_unlock_cpu(); 00387 00388 error_exit: 00389 LOG_REF_MBX_LEAVE(ercd, pk_rmbx); 00390 return(ercd); 00391 }
参照先 CHECK_MBXID, CHECK_PAR, CHECK_TSKCTX_UNL, dispatch, E_OK, enqueue_msg_pri(), get_mbxcb, LOG_SND_MBX_ENTER, LOG_SND_MBX_LEAVE, mailbox_initialization_block::maxmpri, mailbox_initialization_block::mbxatr, MSGPRI, NULL, mailbox_control_block::p_mbxinib, task_control_block::p_winfo, mailbox_control_block::pk_head, mailbox_control_block::pk_last, t_msg::pk_next, queue_delete_next(), queue_empty(), t_lock_cpu, t_unlock_cpu, TA_MPRI, TMIN_MPRI, wait_complete, と mailbox_control_block::wait_queue.
00165 { 00166 MBXCB *p_mbxcb; 00167 TCB *p_tcb; 00168 ER ercd; 00169 00170 LOG_SND_MBX_ENTER(mbxid, pk_msg); 00171 CHECK_TSKCTX_UNL(); 00172 CHECK_MBXID(mbxid); 00173 p_mbxcb = get_mbxcb(mbxid); 00174 CHECK_PAR((p_mbxcb->p_mbxinib->mbxatr & TA_MPRI) == 0U 00175 || (TMIN_MPRI <= MSGPRI(pk_msg) 00176 && MSGPRI(pk_msg) <= p_mbxcb->p_mbxinib->maxmpri)); 00177 00178 t_lock_cpu(); 00179 if (!queue_empty(&(p_mbxcb->wait_queue))) { 00180 p_tcb = (TCB *) queue_delete_next(&(p_mbxcb->wait_queue)); 00181 ((WINFO_MBX *)(p_tcb->p_winfo))->pk_msg = pk_msg; 00182 if (wait_complete(p_tcb)) { 00183 dispatch(); 00184 } 00185 ercd = E_OK; 00186 } 00187 else if ((p_mbxcb->p_mbxinib->mbxatr & TA_MPRI) != 0U) { 00188 enqueue_msg_pri(&(p_mbxcb->pk_head), pk_msg); 00189 ercd = E_OK; 00190 } 00191 else { 00192 pk_msg->pk_next = NULL; 00193 if (p_mbxcb->pk_head != NULL) { 00194 p_mbxcb->pk_last->pk_next = pk_msg; 00195 } 00196 else { 00197 p_mbxcb->pk_head = pk_msg; 00198 } 00199 p_mbxcb->pk_last = pk_msg; 00200 ercd = E_OK; 00201 } 00202 t_unlock_cpu(); 00203 00204 error_exit: 00205 LOG_SND_MBX_LEAVE(ercd); 00206 return(ercd); 00207 }
参照先 CHECK_DISPATCH, CHECK_MBXID, CHECK_TMOUT, dispatch, E_OK, E_TMOUT, get_mbxcb, LOG_TRCV_MBX_ENTER, LOG_TRCV_MBX_LEAVE, NULL, p_runtsk, mailbox_control_block::pk_head, t_msg::pk_next, t_lock_cpu, t_unlock_cpu, TMO_POL, TS_WAIT_MBX, TS_WAITING, waiting_information::wercd, wait_object_waiting_information::winfo, と wobj_make_wait_tmout.
00293 { 00294 MBXCB *p_mbxcb; 00295 WINFO_MBX winfo_mbx; 00296 TMEVTB tmevtb; 00297 ER ercd; 00298 00299 LOG_TRCV_MBX_ENTER(mbxid, ppk_msg, tmout); 00300 CHECK_DISPATCH(); 00301 CHECK_MBXID(mbxid); 00302 CHECK_TMOUT(tmout); 00303 p_mbxcb = get_mbxcb(mbxid); 00304 00305 t_lock_cpu(); 00306 if (p_mbxcb->pk_head != NULL) { 00307 *ppk_msg = p_mbxcb->pk_head; 00308 p_mbxcb->pk_head = (*ppk_msg)->pk_next; 00309 ercd = E_OK; 00310 } 00311 else if (tmout == TMO_POL) { 00312 ercd = E_TMOUT; 00313 } 00314 else { 00315 p_runtsk->tstat = (TS_WAITING | TS_WAIT_MBX); 00316 wobj_make_wait_tmout((WOBJCB *) p_mbxcb, (WINFO_WOBJ *) &winfo_mbx, 00317 &tmevtb, tmout); 00318 dispatch(); 00319 ercd = winfo_mbx.winfo.wercd; 00320 if (ercd == E_OK) { 00321 *ppk_msg = winfo_mbx.pk_msg; 00322 } 00323 } 00324 t_unlock_cpu(); 00325 00326 error_exit: 00327 LOG_TRCV_MBX_LEAVE(ercd, *ppk_msg); 00328 return(ercd); 00329 }
Copyright © 2008 by Kijineko Inc.