00001 /* 00002 * TOPPERS/ASP Kernel 00003 * Toyohashi Open Platform for Embedded Real-Time Systems/ 00004 * Advanced Standard Profile Kernel 00005 * 00006 * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory 00007 * Toyohashi Univ. of Technology, JAPAN 00008 * Copyright (C) 2005-2008 by Embedded and Real-Time Systems Laboratory 00009 * Graduate School of Information Science, Nagoya Univ., JAPAN 00010 * 00011 * 上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ 00012 * ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改 00013 * 変・再配布(以下,利用と呼ぶ)することを無償で許諾する. 00014 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 00015 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー 00016 * スコード中に含まれていること. 00017 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 00018 * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 00019 * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 00020 * の無保証規定を掲載すること. 00021 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 00022 * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ 00023 * と. 00024 * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 00025 * 作権表示,この利用条件および下記の無保証規定を掲載すること. 00026 * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに 00027 * 報告すること. 00028 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 00029 * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. 00030 * また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理 00031 * 由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを 00032 * 免責すること. 00033 * 00034 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お 00035 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的 00036 * に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ 00037 * アの利用により直接的または間接的に生じたいかなる損害に関しても,そ 00038 * の責任を負わない. 00039 * 00040 * @(#) $Id: dataqueue.c 748 2008-03-07 17:18:06Z hiro $ 00041 */ 00042 00043 /* 00044 * データキュー機能 00045 */ 00046 00047 #include "kernel_impl.h" 00048 #include "check.h" 00049 #include "task.h" 00050 #include "wait.h" 00051 #include "dataqueue.h" 00052 00053 /* 00054 * トレースログマクロのデフォルト定義 00055 */ 00056 #ifndef LOG_SND_DTQ_ENTER 00057 #define LOG_SND_DTQ_ENTER(dtqid, data) 00058 #endif /* LOG_SND_DTQ_ENTER */ 00059 00060 #ifndef LOG_SND_DTQ_LEAVE 00061 #define LOG_SND_DTQ_LEAVE(ercd) 00062 #endif /* LOG_SND_DTQ_LEAVE */ 00063 00064 #ifndef LOG_PSND_DTQ_ENTER 00065 #define LOG_PSND_DTQ_ENTER(dtqid, data) 00066 #endif /* LOG_PSND_DTQ_ENTER */ 00067 00068 #ifndef LOG_PSND_DTQ_LEAVE 00069 #define LOG_PSND_DTQ_LEAVE(ercd) 00070 #endif /* LOG_PSND_DTQ_LEAVE */ 00071 00072 #ifndef LOG_IPSND_DTQ_ENTER 00073 #define LOG_IPSND_DTQ_ENTER(dtqid, data) 00074 #endif /* LOG_IPSND_DTQ_ENTER */ 00075 00076 #ifndef LOG_IPSND_DTQ_LEAVE 00077 #define LOG_IPSND_DTQ_LEAVE(ercd) 00078 #endif /* LOG_IPSND_DTQ_LEAVE */ 00079 00080 #ifndef LOG_TSND_DTQ_ENTER 00081 #define LOG_TSND_DTQ_ENTER(dtqid, data, tmout) 00082 #endif /* LOG_TSND_DTQ_ENTER */ 00083 00084 #ifndef LOG_TSND_DTQ_LEAVE 00085 #define LOG_TSND_DTQ_LEAVE(ercd) 00086 #endif /* LOG_TSND_DTQ_LEAVE */ 00087 00088 #ifndef LOG_FSND_DTQ_ENTER 00089 #define LOG_FSND_DTQ_ENTER(dtqid, data) 00090 #endif /* LOG_FSND_DTQ_ENTER */ 00091 00092 #ifndef LOG_FSND_DTQ_LEAVE 00093 #define LOG_FSND_DTQ_LEAVE(ercd) 00094 #endif /* LOG_FSND_DTQ_LEAVE */ 00095 00096 #ifndef LOG_IFSND_DTQ_ENTER 00097 #define LOG_IFSND_DTQ_ENTER(dtqid, data) 00098 #endif /* LOG_IFSND_DTQ_ENTER */ 00099 00100 #ifndef LOG_IFSND_DTQ_LEAVE 00101 #define LOG_IFSND_DTQ_LEAVE(ercd) 00102 #endif /* LOG_IFSND_DTQ_LEAVE */ 00103 00104 #ifndef LOG_RCV_DTQ_ENTER 00105 #define LOG_RCV_DTQ_ENTER(dtqid, p_data) 00106 #endif /* LOG_RCV_DTQ_ENTER */ 00107 00108 #ifndef LOG_RCV_DTQ_LEAVE 00109 #define LOG_RCV_DTQ_LEAVE(ercd, data) 00110 #endif /* LOG_RCV_DTQ_LEAVE */ 00111 00112 #ifndef LOG_PRCV_DTQ_ENTER 00113 #define LOG_PRCV_DTQ_ENTER(dtqid, p_data) 00114 #endif /* LOG_PRCV_DTQ_ENTER */ 00115 00116 #ifndef LOG_PRCV_DTQ_LEAVE 00117 #define LOG_PRCV_DTQ_LEAVE(ercd, data) 00118 #endif /* LOG_PRCV_DTQ_LEAVE */ 00119 00120 #ifndef LOG_TRCV_DTQ_ENTER 00121 #define LOG_TRCV_DTQ_ENTER(dtqid, p_data, tmout) 00122 #endif /* LOG_TRCV_DTQ_ENTER */ 00123 00124 #ifndef LOG_TRCV_DTQ_LEAVE 00125 #define LOG_TRCV_DTQ_LEAVE(ercd, data) 00126 #endif /* LOG_TRCV_DTQ_LEAVE */ 00127 00128 #ifndef LOG_INI_DTQ_ENTER 00129 #define LOG_INI_DTQ_ENTER(dtqid) 00130 #endif /* LOG_INI_DTQ_ENTER */ 00131 00132 #ifndef LOG_INI_DTQ_LEAVE 00133 #define LOG_INI_DTQ_LEAVE(ercd) 00134 #endif /* LOG_INI_DTQ_LEAVE */ 00135 00136 #ifndef LOG_REF_DTQ_ENTER 00137 #define LOG_REF_DTQ_ENTER(dtqid, pk_rdtq) 00138 #endif /* LOG_REF_DTQ_ENTER */ 00139 00140 #ifndef LOG_REF_DTQ_LEAVE 00141 #define LOG_REF_DTQ_LEAVE(ercd, pk_rdtq) 00142 #endif /* LOG_REF_DTQ_LEAVE */ 00143 00144 /* 00145 * データキューの数 00146 */ 00147 #define tnum_dtq ((uint_t)(tmax_dtqid - TMIN_DTQID + 1)) 00148 00149 /* 00150 * データキューIDからデータキュー管理ブロックを取り出すためのマクロ 00151 */ 00152 #define INDEX_DTQ(dtqid) ((uint_t)((dtqid) - TMIN_DTQID)) 00153 #define get_dtqcb(dtqid) (&(dtqcb_table[INDEX_DTQ(dtqid)])) 00154 00155 /* 00156 * データキュー機能の初期化 00157 */ 00158 #ifdef TOPPERS_dtqini 00159 00160 void 00161 initialize_dataqueue(void) 00162 { 00163 uint_t i; 00164 DTQCB *p_dtqcb; 00165 00166 for (p_dtqcb = dtqcb_table, i = 0; i < tnum_dtq; p_dtqcb++, i++) { 00167 queue_initialize(&(p_dtqcb->swait_queue)); 00168 p_dtqcb->p_dtqinib = &(dtqinib_table[i]); 00169 queue_initialize(&(p_dtqcb->rwait_queue)); 00170 p_dtqcb->count = 0U; 00171 p_dtqcb->head = 0U; 00172 p_dtqcb->tail = 0U; 00173 } 00174 } 00175 00176 #endif /* TOPPERS_dtqini */ 00177 00178 /* 00179 * データキュー管理領域へのデータの格納 00180 */ 00181 #ifdef TOPPERS_dtqenq 00182 00183 void 00184 enqueue_data(DTQCB *p_dtqcb, intptr_t data) 00185 { 00186 *(p_dtqcb->p_dtqinib->p_dtqmb + p_dtqcb->tail) = data; 00187 p_dtqcb->count++; 00188 p_dtqcb->tail++; 00189 if (p_dtqcb->tail >= p_dtqcb->p_dtqinib->dtqcnt) { 00190 p_dtqcb->tail = 0U; 00191 } 00192 } 00193 00194 #endif /* TOPPERS_dtqenq */ 00195 00196 /* 00197 * データキュー管理領域へのデータの強制格納 00198 */ 00199 #ifdef TOPPERS_dtqfenq 00200 00201 void 00202 force_enqueue_data(DTQCB *p_dtqcb, intptr_t data) 00203 { 00204 *(p_dtqcb->p_dtqinib->p_dtqmb + p_dtqcb->tail) = data; 00205 p_dtqcb->tail++; 00206 if (p_dtqcb->tail >= p_dtqcb->p_dtqinib->dtqcnt) { 00207 p_dtqcb->tail = 0U; 00208 } 00209 if (p_dtqcb->count < p_dtqcb->p_dtqinib->dtqcnt) { 00210 p_dtqcb->count++; 00211 } 00212 else { 00213 p_dtqcb->head = p_dtqcb->tail; 00214 } 00215 } 00216 00217 #endif /* TOPPERS_dtqfenq */ 00218 00219 /* 00220 * データキュー管理領域からのデータの取出し 00221 */ 00222 #ifdef TOPPERS_dtqdeq 00223 00224 void 00225 dequeue_data(DTQCB *p_dtqcb, intptr_t *p_data) 00226 { 00227 *p_data = *(p_dtqcb->p_dtqinib->p_dtqmb + p_dtqcb->head); 00228 p_dtqcb->count--; 00229 p_dtqcb->head++; 00230 if (p_dtqcb->head >= p_dtqcb->p_dtqinib->dtqcnt) { 00231 p_dtqcb->head = 0U; 00232 } 00233 } 00234 00235 #endif /* TOPPERS_dtqdeq */ 00236 00237 /* 00238 * データキューへのデータ送信 00239 */ 00240 #ifdef TOPPERS_dtqsnd 00241 00242 bool_t 00243 send_data(DTQCB *p_dtqcb, intptr_t data, bool_t *p_reqdsp) 00244 { 00245 TCB *p_tcb; 00246 00247 if (!queue_empty(&(p_dtqcb->rwait_queue))) { 00248 p_tcb = (TCB *) queue_delete_next(&(p_dtqcb->rwait_queue)); 00249 ((WINFO_DTQ *)(p_tcb->p_winfo))->data = data; 00250 *p_reqdsp = wait_complete(p_tcb); 00251 return(true); 00252 } 00253 else if (p_dtqcb->count < p_dtqcb->p_dtqinib->dtqcnt) { 00254 enqueue_data(p_dtqcb, data); 00255 *p_reqdsp = false; 00256 return(true); 00257 } 00258 else { 00259 return(false); 00260 } 00261 } 00262 00263 #endif /* TOPPERS_dtqsnd */ 00264 00265 /* 00266 * データキューへのデータ強制送信 00267 */ 00268 #ifdef TOPPERS_dtqfsnd 00269 00270 bool_t 00271 force_send_data(DTQCB *p_dtqcb, intptr_t data) 00272 { 00273 TCB *p_tcb; 00274 00275 if (!queue_empty(&(p_dtqcb->rwait_queue))) { 00276 p_tcb = (TCB *) queue_delete_next(&(p_dtqcb->rwait_queue)); 00277 ((WINFO_DTQ *)(p_tcb->p_winfo))->data = data; 00278 return(wait_complete(p_tcb)); 00279 } 00280 else { 00281 force_enqueue_data(p_dtqcb, data); 00282 return(false); 00283 } 00284 } 00285 00286 #endif /* TOPPERS_dtqfsnd */ 00287 00288 /* 00289 * 送信待ちキューの先頭タスクからのデータ受信 00290 */ 00291 #ifdef TOPPERS_dtqrcv 00292 00293 bool_t 00294 receive_data(DTQCB *p_dtqcb, intptr_t *p_data, bool_t *p_reqdsp) 00295 { 00296 TCB *p_tcb; 00297 intptr_t data; 00298 00299 if (p_dtqcb->count > 0U) { 00300 dequeue_data(p_dtqcb, p_data); 00301 if (!queue_empty(&(p_dtqcb->swait_queue))) { 00302 p_tcb = (TCB *) queue_delete_next(&(p_dtqcb->swait_queue)); 00303 data = ((WINFO_DTQ *)(p_tcb->p_winfo))->data; 00304 enqueue_data(p_dtqcb, data); 00305 *p_reqdsp = wait_complete(p_tcb); 00306 } 00307 else { 00308 *p_reqdsp = false; 00309 } 00310 return(true); 00311 } 00312 else if (!queue_empty(&(p_dtqcb->swait_queue))) { 00313 p_tcb = (TCB *) queue_delete_next(&(p_dtqcb->swait_queue)); 00314 *p_data = ((WINFO_DTQ *)(p_tcb->p_winfo))->data; 00315 *p_reqdsp = wait_complete(p_tcb); 00316 return(true); 00317 } 00318 else { 00319 return(false); 00320 } 00321 } 00322 00323 #endif /* TOPPERS_dtqrcv */ 00324 00325 /* 00326 * データキューへの送信 00327 */ 00328 #ifdef TOPPERS_snd_dtq 00329 00330 ER 00331 snd_dtq(ID dtqid, intptr_t data) 00332 { 00333 DTQCB *p_dtqcb; 00334 WINFO_DTQ winfo_dtq; 00335 bool_t reqdsp; 00336 ER ercd; 00337 00338 LOG_SND_DTQ_ENTER(dtqid, data); 00339 CHECK_DISPATCH(); 00340 CHECK_DTQID(dtqid); 00341 p_dtqcb = get_dtqcb(dtqid); 00342 00343 t_lock_cpu(); 00344 if (send_data(p_dtqcb, data, &reqdsp)) { 00345 if (reqdsp) { 00346 dispatch(); 00347 } 00348 ercd = E_OK; 00349 } 00350 else { 00351 winfo_dtq.data = data; 00352 p_runtsk->tstat = (TS_WAITING | TS_WAIT_SDTQ); 00353 wobj_make_wait((WOBJCB *) p_dtqcb, (WINFO_WOBJ *) &winfo_dtq); 00354 dispatch(); 00355 ercd = winfo_dtq.winfo.wercd; 00356 } 00357 t_unlock_cpu(); 00358 00359 error_exit: 00360 LOG_SND_DTQ_LEAVE(ercd); 00361 return(ercd); 00362 } 00363 00364 #endif /* TOPPERS_snd_dtq */ 00365 00366 /* 00367 * データキューへの送信(ポーリング) 00368 */ 00369 #ifdef TOPPERS_psnd_dtq 00370 00371 ER 00372 psnd_dtq(ID dtqid, intptr_t data) 00373 { 00374 DTQCB *p_dtqcb; 00375 bool_t reqdsp; 00376 ER ercd; 00377 00378 LOG_PSND_DTQ_ENTER(dtqid, data); 00379 CHECK_TSKCTX_UNL(); 00380 CHECK_DTQID(dtqid); 00381 p_dtqcb = get_dtqcb(dtqid); 00382 00383 t_lock_cpu(); 00384 if (send_data(p_dtqcb, data, &reqdsp)) { 00385 if (reqdsp) { 00386 dispatch(); 00387 } 00388 ercd = E_OK; 00389 } 00390 else { 00391 ercd = E_TMOUT; 00392 } 00393 t_unlock_cpu(); 00394 00395 error_exit: 00396 LOG_PSND_DTQ_LEAVE(ercd); 00397 return(ercd); 00398 } 00399 00400 #endif /* TOPPERS_psnd_dtq */ 00401 00402 /* 00403 * データキューへの送信(ポーリング,非タスクコンテキスト用) 00404 */ 00405 #ifdef TOPPERS_ipsnd_dtq 00406 00407 ER 00408 ipsnd_dtq(ID dtqid, intptr_t data) 00409 { 00410 DTQCB *p_dtqcb; 00411 bool_t reqdsp; 00412 ER ercd; 00413 00414 LOG_IPSND_DTQ_ENTER(dtqid, data); 00415 CHECK_INTCTX_UNL(); 00416 CHECK_DTQID(dtqid); 00417 p_dtqcb = get_dtqcb(dtqid); 00418 00419 i_lock_cpu(); 00420 if (send_data(p_dtqcb, data, &reqdsp)) { 00421 if (reqdsp) { 00422 reqflg = true; 00423 } 00424 ercd = E_OK; 00425 } 00426 else { 00427 ercd = E_TMOUT; 00428 } 00429 i_unlock_cpu(); 00430 00431 error_exit: 00432 LOG_IPSND_DTQ_LEAVE(ercd); 00433 return(ercd); 00434 } 00435 00436 #endif /* TOPPERS_ipsnd_dtq */ 00437 00438 /* 00439 * データキューへの送信(タイムアウトあり) 00440 */ 00441 #ifdef TOPPERS_tsnd_dtq 00442 00443 ER 00444 tsnd_dtq(ID dtqid, intptr_t data, TMO tmout) 00445 { 00446 DTQCB *p_dtqcb; 00447 WINFO_DTQ winfo_dtq; 00448 TMEVTB tmevtb; 00449 bool_t reqdsp; 00450 ER ercd; 00451 00452 LOG_TSND_DTQ_ENTER(dtqid, data, tmout); 00453 CHECK_DISPATCH(); 00454 CHECK_DTQID(dtqid); 00455 CHECK_TMOUT(tmout); 00456 p_dtqcb = get_dtqcb(dtqid); 00457 00458 t_lock_cpu(); 00459 if (send_data(p_dtqcb, data, &reqdsp)) { 00460 if (reqdsp) { 00461 dispatch(); 00462 } 00463 ercd = E_OK; 00464 } 00465 else if (tmout == TMO_POL) { 00466 ercd = E_TMOUT; 00467 } 00468 else { 00469 winfo_dtq.data = data; 00470 p_runtsk->tstat = (TS_WAITING | TS_WAIT_SDTQ); 00471 wobj_make_wait_tmout((WOBJCB *) p_dtqcb, (WINFO_WOBJ *) &winfo_dtq, 00472 &tmevtb, tmout); 00473 dispatch(); 00474 ercd = winfo_dtq.winfo.wercd; 00475 } 00476 t_unlock_cpu(); 00477 00478 error_exit: 00479 LOG_TSND_DTQ_LEAVE(ercd); 00480 return(ercd); 00481 } 00482 00483 #endif /* TOPPERS_tsnd_dtq */ 00484 00485 /* 00486 * データキューへの強制送信 00487 */ 00488 #ifdef TOPPERS_fsnd_dtq 00489 00490 ER 00491 fsnd_dtq(ID dtqid, intptr_t data) 00492 { 00493 DTQCB *p_dtqcb; 00494 ER ercd; 00495 00496 LOG_FSND_DTQ_ENTER(dtqid, data); 00497 CHECK_TSKCTX_UNL(); 00498 CHECK_DTQID(dtqid); 00499 p_dtqcb = get_dtqcb(dtqid); 00500 CHECK_ILUSE(p_dtqcb->p_dtqinib->dtqcnt > 0U); 00501 00502 t_lock_cpu(); 00503 if (force_send_data(p_dtqcb, data)) { 00504 dispatch(); 00505 } 00506 ercd = E_OK; 00507 t_unlock_cpu(); 00508 00509 error_exit: 00510 LOG_FSND_DTQ_LEAVE(ercd); 00511 return(ercd); 00512 } 00513 00514 #endif /* TOPPERS_fsnd_dtq */ 00515 00516 /* 00517 * データキューへの強制送信(非タスクコンテキスト用) 00518 */ 00519 #ifdef TOPPERS_ifsnd_dtq 00520 00521 ER 00522 ifsnd_dtq(ID dtqid, intptr_t data) 00523 { 00524 DTQCB *p_dtqcb; 00525 ER ercd; 00526 00527 LOG_IFSND_DTQ_ENTER(dtqid, data); 00528 CHECK_INTCTX_UNL(); 00529 CHECK_DTQID(dtqid); 00530 p_dtqcb = get_dtqcb(dtqid); 00531 CHECK_ILUSE(p_dtqcb->p_dtqinib->dtqcnt > 0U); 00532 00533 i_lock_cpu(); 00534 if (force_send_data(p_dtqcb, data)) { 00535 reqflg = true; 00536 } 00537 ercd = E_OK; 00538 i_unlock_cpu(); 00539 00540 error_exit: 00541 LOG_IFSND_DTQ_LEAVE(ercd); 00542 return(ercd); 00543 } 00544 00545 #endif /* TOPPERS_ifsnd_dtq */ 00546 00547 /* 00548 * データキューからの受信 00549 */ 00550 #ifdef TOPPERS_rcv_dtq 00551 00552 ER 00553 rcv_dtq(ID dtqid, intptr_t *p_data) 00554 { 00555 DTQCB *p_dtqcb; 00556 WINFO_DTQ winfo_dtq; 00557 bool_t reqdsp; 00558 ER ercd; 00559 00560 LOG_RCV_DTQ_ENTER(dtqid, p_data); 00561 CHECK_DISPATCH(); 00562 CHECK_DTQID(dtqid); 00563 p_dtqcb = get_dtqcb(dtqid); 00564 00565 t_lock_cpu(); 00566 if (receive_data(p_dtqcb, p_data, &reqdsp)) { 00567 if (reqdsp) { 00568 dispatch(); 00569 } 00570 ercd = E_OK; 00571 } 00572 else { 00573 p_runtsk->tstat = (TS_WAITING | TS_WAIT_RDTQ); 00574 make_wait((WINFO *) &winfo_dtq); 00575 queue_insert_prev(&(p_dtqcb->rwait_queue), &(p_runtsk->task_queue)); 00576 winfo_dtq.p_dtqcb = p_dtqcb; 00577 LOG_TSKSTAT(p_runtsk); 00578 dispatch(); 00579 ercd = winfo_dtq.winfo.wercd; 00580 if (ercd == E_OK) { 00581 *p_data = winfo_dtq.data; 00582 } 00583 } 00584 t_unlock_cpu(); 00585 00586 error_exit: 00587 LOG_RCV_DTQ_LEAVE(ercd, *p_data); 00588 return(ercd); 00589 } 00590 00591 #endif /* TOPPERS_rcv_dtq */ 00592 00593 /* 00594 * データキューからの受信(ポーリング) 00595 */ 00596 #ifdef TOPPERS_prcv_dtq 00597 00598 ER 00599 prcv_dtq(ID dtqid, intptr_t *p_data) 00600 { 00601 DTQCB *p_dtqcb; 00602 bool_t reqdsp; 00603 ER ercd; 00604 00605 LOG_PRCV_DTQ_ENTER(dtqid, p_data); 00606 CHECK_TSKCTX_UNL(); 00607 CHECK_DTQID(dtqid); 00608 p_dtqcb = get_dtqcb(dtqid); 00609 00610 t_lock_cpu(); 00611 if (receive_data(p_dtqcb, p_data, &reqdsp)) { 00612 if (reqdsp) { 00613 dispatch(); 00614 } 00615 ercd = E_OK; 00616 } 00617 else { 00618 ercd = E_TMOUT; 00619 } 00620 t_unlock_cpu(); 00621 00622 error_exit: 00623 LOG_PRCV_DTQ_LEAVE(ercd, *p_data); 00624 return(ercd); 00625 } 00626 00627 #endif /* TOPPERS_prcv_dtq */ 00628 00629 /* 00630 * データキューからの受信(タイムアウトあり) 00631 */ 00632 #ifdef TOPPERS_trcv_dtq 00633 00634 ER 00635 trcv_dtq(ID dtqid, intptr_t *p_data, TMO tmout) 00636 { 00637 DTQCB *p_dtqcb; 00638 WINFO_DTQ winfo_dtq; 00639 TMEVTB tmevtb; 00640 bool_t reqdsp; 00641 ER ercd; 00642 00643 LOG_TRCV_DTQ_ENTER(dtqid, p_data, tmout); 00644 CHECK_DISPATCH(); 00645 CHECK_DTQID(dtqid); 00646 CHECK_TMOUT(tmout); 00647 p_dtqcb = get_dtqcb(dtqid); 00648 00649 t_lock_cpu(); 00650 if (receive_data(p_dtqcb, p_data, &reqdsp)) { 00651 if (reqdsp) { 00652 dispatch(); 00653 } 00654 ercd = E_OK; 00655 } 00656 else if (tmout == TMO_POL) { 00657 ercd = E_TMOUT; 00658 } 00659 else { 00660 p_runtsk->tstat = (TS_WAITING | TS_WAIT_RDTQ); 00661 make_wait_tmout((WINFO *) &winfo_dtq, &tmevtb, tmout); 00662 queue_insert_prev(&(p_dtqcb->rwait_queue), &(p_runtsk->task_queue)); 00663 winfo_dtq.p_dtqcb = p_dtqcb; 00664 LOG_TSKSTAT(p_runtsk); 00665 dispatch(); 00666 ercd = winfo_dtq.winfo.wercd; 00667 if (ercd == E_OK) { 00668 *p_data = winfo_dtq.data; 00669 } 00670 } 00671 t_unlock_cpu(); 00672 00673 error_exit: 00674 LOG_TRCV_DTQ_LEAVE(ercd, *p_data); 00675 return(ercd); 00676 } 00677 00678 #endif /* TOPPERS_trcv_dtq */ 00679 00680 /* 00681 * データキューの再初期化 00682 */ 00683 #ifdef TOPPERS_ini_dtq 00684 00685 ER 00686 ini_dtq(ID dtqid) 00687 { 00688 DTQCB *p_dtqcb; 00689 bool_t dspreq; 00690 ER ercd; 00691 00692 LOG_INI_DTQ_ENTER(dtqid); 00693 CHECK_TSKCTX_UNL(); 00694 CHECK_DTQID(dtqid); 00695 p_dtqcb = get_dtqcb(dtqid); 00696 00697 t_lock_cpu(); 00698 dspreq = init_wait_queue(&(p_dtqcb->swait_queue)); 00699 if (init_wait_queue(&(p_dtqcb->rwait_queue))) { 00700 dspreq = true; 00701 }; 00702 p_dtqcb->count = 0U; 00703 p_dtqcb->head = 0U; 00704 p_dtqcb->tail = 0U; 00705 if (dspreq) { 00706 dispatch(); 00707 } 00708 ercd = E_OK; 00709 t_unlock_cpu(); 00710 00711 error_exit: 00712 LOG_INI_DTQ_LEAVE(ercd); 00713 return(ercd); 00714 } 00715 00716 #endif /* TOPPERS_ini_dtq */ 00717 00718 /* 00719 * データキューの状態参照 00720 */ 00721 #ifdef TOPPERS_ref_dtq 00722 00723 ER 00724 ref_dtq(ID dtqid, T_RDTQ *pk_rdtq) 00725 { 00726 DTQCB *p_dtqcb; 00727 ER ercd; 00728 00729 LOG_REF_DTQ_ENTER(dtqid, pk_rdtq); 00730 CHECK_TSKCTX_UNL(); 00731 CHECK_DTQID(dtqid); 00732 p_dtqcb = get_dtqcb(dtqid); 00733 00734 t_lock_cpu(); 00735 pk_rdtq->stskid = wait_tskid(&(p_dtqcb->swait_queue)); 00736 pk_rdtq->rtskid = wait_tskid(&(p_dtqcb->rwait_queue)); 00737 pk_rdtq->sdtqcnt = p_dtqcb->count; 00738 ercd = E_OK; 00739 t_unlock_cpu(); 00740 00741 error_exit: 00742 LOG_REF_DTQ_LEAVE(ercd, pk_rdtq); 00743 return(ercd); 00744 } 00745 00746 #endif /* TOPPERS_ref_dtq */
Copyright © 2008 by Kijineko Inc.