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: pridataq.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 "pridataq.h" 00052 00053 /* 00054 * トレースログマクロのデフォルト定義 00055 */ 00056 #ifndef LOG_SND_PDQ_ENTER 00057 #define LOG_SND_PDQ_ENTER(pdqid, data, datapri) 00058 #endif /* LOG_SND_PDQ_ENTER */ 00059 00060 #ifndef LOG_SND_PDQ_LEAVE 00061 #define LOG_SND_PDQ_LEAVE(ercd) 00062 #endif /* LOG_SND_PDQ_LEAVE */ 00063 00064 #ifndef LOG_PSND_PDQ_ENTER 00065 #define LOG_PSND_PDQ_ENTER(pdqid, data, datapri) 00066 #endif /* LOG_PSND_PDQ_ENTER */ 00067 00068 #ifndef LOG_PSND_PDQ_LEAVE 00069 #define LOG_PSND_PDQ_LEAVE(ercd) 00070 #endif /* LOG_PSND_PDQ_LEAVE */ 00071 00072 #ifndef LOG_IPSND_PDQ_ENTER 00073 #define LOG_IPSND_PDQ_ENTER(pdqid, data, datapri) 00074 #endif /* LOG_IPSND_PDQ_ENTER */ 00075 00076 #ifndef LOG_IPSND_PDQ_LEAVE 00077 #define LOG_IPSND_PDQ_LEAVE(ercd) 00078 #endif /* LOG_IPSND_PDQ_LEAVE */ 00079 00080 #ifndef LOG_TSND_PDQ_ENTER 00081 #define LOG_TSND_PDQ_ENTER(pdqid, data, datapri, tmout) 00082 #endif /* LOG_TSND_PDQ_ENTER */ 00083 00084 #ifndef LOG_TSND_PDQ_LEAVE 00085 #define LOG_TSND_PDQ_LEAVE(ercd) 00086 #endif /* LOG_TSND_PDQ_LEAVE */ 00087 00088 #ifndef LOG_RCV_PDQ_ENTER 00089 #define LOG_RCV_PDQ_ENTER(pdqid, p_data, p_datapri) 00090 #endif /* LOG_RCV_PDQ_ENTER */ 00091 00092 #ifndef LOG_RCV_PDQ_LEAVE 00093 #define LOG_RCV_PDQ_LEAVE(ercd, data, datapri) 00094 #endif /* LOG_RCV_PDQ_LEAVE */ 00095 00096 #ifndef LOG_PRCV_PDQ_ENTER 00097 #define LOG_PRCV_PDQ_ENTER(pdqid, p_data, p_datapri) 00098 #endif /* LOG_PRCV_PDQ_ENTER */ 00099 00100 #ifndef LOG_PRCV_PDQ_LEAVE 00101 #define LOG_PRCV_PDQ_LEAVE(ercd, data, datapri) 00102 #endif /* LOG_PRCV_PDQ_LEAVE */ 00103 00104 #ifndef LOG_TRCV_PDQ_ENTER 00105 #define LOG_TRCV_PDQ_ENTER(pdqid, p_data, p_datapri, tmout) 00106 #endif /* LOG_TRCV_PDQ_ENTER */ 00107 00108 #ifndef LOG_TRCV_PDQ_LEAVE 00109 #define LOG_TRCV_PDQ_LEAVE(ercd, data, datapri) 00110 #endif /* LOG_TRCV_PDQ_LEAVE */ 00111 00112 #ifndef LOG_INI_PDQ_ENTER 00113 #define LOG_INI_PDQ_ENTER(pdqid) 00114 #endif /* LOG_INI_PDQ_ENTER */ 00115 00116 #ifndef LOG_INI_PDQ_LEAVE 00117 #define LOG_INI_PDQ_LEAVE(ercd) 00118 #endif /* LOG_INI_PDQ_LEAVE */ 00119 00120 #ifndef LOG_REF_PDQ_ENTER 00121 #define LOG_REF_PDQ_ENTER(pdqid, pk_rpdq) 00122 #endif /* LOG_REF_PDQ_ENTER */ 00123 00124 #ifndef LOG_REF_PDQ_LEAVE 00125 #define LOG_REF_PDQ_LEAVE(ercd, pk_rpdq) 00126 #endif /* LOG_REF_PDQ_LEAVE */ 00127 00128 /* 00129 * 優先度データキューの数 00130 */ 00131 #define tnum_pdq ((uint_t)(tmax_pdqid - TMIN_PDQID + 1)) 00132 00133 /* 00134 * 優先度データキューIDから優先度データキュー管理ブロックを取り出すた 00135 * めのマクロ 00136 */ 00137 #define INDEX_PDQ(pdqid) ((uint_t)((pdqid) - TMIN_PDQID)) 00138 #define get_pdqcb(pdqid) (&(pdqcb_table[INDEX_PDQ(pdqid)])) 00139 00140 /* 00141 * 優先度データキュー機能の初期化 00142 */ 00143 #ifdef TOPPERS_pdqini 00144 00145 void 00146 initialize_pridataq(void) 00147 { 00148 uint_t i; 00149 PDQCB *p_pdqcb; 00150 00151 for (p_pdqcb = pdqcb_table, i = 0; i < tnum_pdq; p_pdqcb++, i++) { 00152 queue_initialize(&(p_pdqcb->swait_queue)); 00153 p_pdqcb->p_pdqinib = &(pdqinib_table[i]); 00154 queue_initialize(&(p_pdqcb->rwait_queue)); 00155 p_pdqcb->count = 0U; 00156 p_pdqcb->p_head = NULL; 00157 p_pdqcb->unused = 0U; 00158 p_pdqcb->p_freelist = NULL; 00159 } 00160 } 00161 00162 #endif /* TOPPERS_pdqini */ 00163 00164 /* 00165 * 優先度データキュー管理領域へのデータの格納 00166 */ 00167 #ifdef TOPPERS_pdqenq 00168 00169 void 00170 enqueue_pridata(PDQCB *p_pdqcb, intptr_t data, PRI datapri) 00171 { 00172 PDQMB *p_pdqmb; 00173 PDQMB **pp_prev_next, *p_next; 00174 00175 if (p_pdqcb->p_freelist != NULL) { 00176 p_pdqmb = p_pdqcb->p_freelist; 00177 p_pdqcb->p_freelist = p_pdqmb->p_next; 00178 } 00179 else { 00180 p_pdqmb = p_pdqcb->p_pdqinib->p_pdqmb + p_pdqcb->unused; 00181 p_pdqcb->unused++; 00182 } 00183 00184 p_pdqmb->data = data; 00185 p_pdqmb->datapri = datapri; 00186 00187 pp_prev_next = &(p_pdqcb->p_head); 00188 while ((p_next = *pp_prev_next) != NULL) { 00189 if (p_next->datapri > datapri) { 00190 break; 00191 } 00192 pp_prev_next = &(p_next->p_next); 00193 } 00194 p_pdqmb->p_next = p_next; 00195 *pp_prev_next = p_pdqmb; 00196 p_pdqcb->count++; 00197 } 00198 00199 #endif /* TOPPERS_pdqenq */ 00200 00201 /* 00202 * 優先度データキュー管理領域からのデータの取出し 00203 */ 00204 #ifdef TOPPERS_pdqdeq 00205 00206 void 00207 dequeue_pridata(PDQCB *p_pdqcb, intptr_t *p_data, PRI *p_datapri) 00208 { 00209 PDQMB *p_pdqmb; 00210 00211 p_pdqmb = p_pdqcb->p_head; 00212 p_pdqcb->p_head = p_pdqmb->p_next; 00213 p_pdqcb->count--; 00214 00215 *p_data = p_pdqmb->data; 00216 *p_datapri = p_pdqmb->datapri; 00217 00218 p_pdqmb->p_next = p_pdqcb->p_freelist; 00219 p_pdqcb->p_freelist = p_pdqmb; 00220 } 00221 00222 #endif /* TOPPERS_pdqdeq */ 00223 00224 /* 00225 * 優先度データキューへのデータ送信 00226 */ 00227 #ifdef TOPPERS_pdqsnd 00228 00229 bool_t 00230 send_pridata(PDQCB *p_pdqcb, intptr_t data, PRI datapri, bool_t *p_reqdsp) 00231 { 00232 TCB *p_tcb; 00233 00234 if (!queue_empty(&(p_pdqcb->rwait_queue))) { 00235 p_tcb = (TCB *) queue_delete_next(&(p_pdqcb->rwait_queue)); 00236 ((WINFO_PDQ *)(p_tcb->p_winfo))->data = data; 00237 ((WINFO_PDQ *)(p_tcb->p_winfo))->datapri = datapri; 00238 *p_reqdsp = wait_complete(p_tcb); 00239 return(true); 00240 } 00241 else if (p_pdqcb->count < p_pdqcb->p_pdqinib->pdqcnt) { 00242 enqueue_pridata(p_pdqcb, data, datapri); 00243 *p_reqdsp = false; 00244 return(true); 00245 } 00246 else { 00247 return(false); 00248 } 00249 } 00250 00251 #endif /* TOPPERS_pdqsnd */ 00252 00253 /* 00254 * 優先度データキューからのデータ受信 00255 */ 00256 #ifdef TOPPERS_pdqrcv 00257 00258 bool_t 00259 receive_pridata(PDQCB *p_pdqcb, intptr_t *p_data, 00260 PRI *p_datapri, bool_t *p_reqdsp) 00261 { 00262 TCB *p_tcb; 00263 intptr_t data; 00264 PRI datapri; 00265 00266 if (p_pdqcb->count > 0U) { 00267 dequeue_pridata(p_pdqcb, p_data, p_datapri); 00268 if (!queue_empty(&(p_pdqcb->swait_queue))) { 00269 p_tcb = (TCB *) queue_delete_next(&(p_pdqcb->swait_queue)); 00270 data = ((WINFO_PDQ *)(p_tcb->p_winfo))->data; 00271 datapri = ((WINFO_PDQ *)(p_tcb->p_winfo))->datapri; 00272 enqueue_pridata(p_pdqcb, data, datapri); 00273 *p_reqdsp = wait_complete(p_tcb); 00274 } 00275 else { 00276 *p_reqdsp = false; 00277 } 00278 return(true); 00279 } 00280 else if (!queue_empty(&(p_pdqcb->swait_queue))) { 00281 p_tcb = (TCB *) queue_delete_next(&(p_pdqcb->swait_queue)); 00282 *p_data = ((WINFO_PDQ *)(p_tcb->p_winfo))->data; 00283 *p_datapri = ((WINFO_PDQ *)(p_tcb->p_winfo))->datapri; 00284 *p_reqdsp = wait_complete(p_tcb); 00285 return(true); 00286 } 00287 else { 00288 return(false); 00289 } 00290 } 00291 00292 #endif /* TOPPERS_pdqrcv */ 00293 00294 /* 00295 * 優先度データキューへの送信 00296 */ 00297 #ifdef TOPPERS_snd_pdq 00298 00299 ER 00300 snd_pdq(ID pdqid, intptr_t data, PRI datapri) 00301 { 00302 PDQCB *p_pdqcb; 00303 WINFO_PDQ winfo_pdq; 00304 bool_t reqdsp; 00305 ER ercd; 00306 00307 LOG_SND_PDQ_ENTER(pdqid, data, datapri); 00308 CHECK_DISPATCH(); 00309 CHECK_PDQID(pdqid); 00310 p_pdqcb = get_pdqcb(pdqid); 00311 CHECK_PAR(TMIN_DPRI <= datapri && datapri <= p_pdqcb->p_pdqinib->maxdpri); 00312 00313 t_lock_cpu(); 00314 if (send_pridata(p_pdqcb, data, datapri, &reqdsp)) { 00315 if (reqdsp) { 00316 dispatch(); 00317 } 00318 ercd = E_OK; 00319 } 00320 else { 00321 winfo_pdq.data = data; 00322 winfo_pdq.datapri = datapri; 00323 p_runtsk->tstat = (TS_WAITING | TS_WAIT_SPDQ); 00324 wobj_make_wait((WOBJCB *) p_pdqcb, (WINFO_WOBJ *) &winfo_pdq); 00325 dispatch(); 00326 ercd = winfo_pdq.winfo.wercd; 00327 } 00328 t_unlock_cpu(); 00329 00330 error_exit: 00331 LOG_SND_PDQ_LEAVE(ercd); 00332 return(ercd); 00333 } 00334 00335 #endif /* TOPPERS_snd_pdq */ 00336 00337 /* 00338 * 優先度データキューへの送信(ポーリング) 00339 */ 00340 #ifdef TOPPERS_psnd_pdq 00341 00342 ER 00343 psnd_pdq(ID pdqid, intptr_t data, PRI datapri) 00344 { 00345 PDQCB *p_pdqcb; 00346 bool_t reqdsp; 00347 ER ercd; 00348 00349 LOG_PSND_PDQ_ENTER(pdqid, data, datapri); 00350 CHECK_TSKCTX_UNL(); 00351 CHECK_PDQID(pdqid); 00352 p_pdqcb = get_pdqcb(pdqid); 00353 CHECK_PAR(TMIN_DPRI <= datapri && datapri <= p_pdqcb->p_pdqinib->maxdpri); 00354 00355 t_lock_cpu(); 00356 if (send_pridata(p_pdqcb, data, datapri, &reqdsp)) { 00357 if (reqdsp) { 00358 dispatch(); 00359 } 00360 ercd = E_OK; 00361 } 00362 else { 00363 ercd = E_TMOUT; 00364 } 00365 t_unlock_cpu(); 00366 00367 error_exit: 00368 LOG_PSND_PDQ_LEAVE(ercd); 00369 return(ercd); 00370 } 00371 00372 #endif /* TOPPERS_psnd_pdq */ 00373 00374 /* 00375 * 優先度データキューへの送信(ポーリング,非タスクコンテキスト用) 00376 */ 00377 #ifdef TOPPERS_ipsnd_pdq 00378 00379 ER 00380 ipsnd_pdq(ID pdqid, intptr_t data, PRI datapri) 00381 { 00382 PDQCB *p_pdqcb; 00383 bool_t reqdsp; 00384 ER ercd; 00385 00386 LOG_IPSND_PDQ_ENTER(pdqid, data, datapri); 00387 CHECK_INTCTX_UNL(); 00388 CHECK_PDQID(pdqid); 00389 p_pdqcb = get_pdqcb(pdqid); 00390 CHECK_PAR(TMIN_DPRI <= datapri && datapri <= p_pdqcb->p_pdqinib->maxdpri); 00391 00392 i_lock_cpu(); 00393 if (send_pridata(p_pdqcb, data, datapri, &reqdsp)) { 00394 if (reqdsp) { 00395 reqflg = true; 00396 } 00397 ercd = E_OK; 00398 } 00399 else { 00400 ercd = E_TMOUT; 00401 } 00402 i_unlock_cpu(); 00403 00404 error_exit: 00405 LOG_IPSND_PDQ_LEAVE(ercd); 00406 return(ercd); 00407 } 00408 00409 #endif /* TOPPERS_ipsnd_pdq */ 00410 00411 /* 00412 * 優先度データキューへの送信(タイムアウトあり) 00413 */ 00414 #ifdef TOPPERS_tsnd_pdq 00415 00416 ER 00417 tsnd_pdq(ID pdqid, intptr_t data, PRI datapri, TMO tmout) 00418 { 00419 PDQCB *p_pdqcb; 00420 WINFO_PDQ winfo_pdq; 00421 TMEVTB tmevtb; 00422 bool_t reqdsp; 00423 ER ercd; 00424 00425 LOG_TSND_PDQ_ENTER(pdqid, data, datapri, tmout); 00426 CHECK_DISPATCH(); 00427 CHECK_PDQID(pdqid); 00428 CHECK_TMOUT(tmout); 00429 p_pdqcb = get_pdqcb(pdqid); 00430 CHECK_PAR(TMIN_DPRI <= datapri && datapri <= p_pdqcb->p_pdqinib->maxdpri); 00431 00432 t_lock_cpu(); 00433 if (send_pridata(p_pdqcb, data, datapri, &reqdsp)) { 00434 if (reqdsp) { 00435 dispatch(); 00436 } 00437 ercd = E_OK; 00438 } 00439 else if (tmout == TMO_POL) { 00440 ercd = E_TMOUT; 00441 } 00442 else { 00443 winfo_pdq.data = data; 00444 winfo_pdq.datapri = datapri; 00445 p_runtsk->tstat = (TS_WAITING | TS_WAIT_SPDQ); 00446 wobj_make_wait_tmout((WOBJCB *) p_pdqcb, (WINFO_WOBJ *) &winfo_pdq, 00447 &tmevtb, tmout); 00448 dispatch(); 00449 ercd = winfo_pdq.winfo.wercd; 00450 } 00451 t_unlock_cpu(); 00452 00453 error_exit: 00454 LOG_TSND_PDQ_LEAVE(ercd); 00455 return(ercd); 00456 } 00457 00458 #endif /* TOPPERS_tsnd_pdq */ 00459 00460 /* 00461 * 優先度データキューからの受信 00462 */ 00463 #ifdef TOPPERS_rcv_pdq 00464 00465 ER 00466 rcv_pdq(ID pdqid, intptr_t *p_data, PRI *p_datapri) 00467 { 00468 PDQCB *p_pdqcb; 00469 WINFO_PDQ winfo_pdq; 00470 bool_t reqdsp; 00471 ER ercd; 00472 00473 LOG_RCV_PDQ_ENTER(pdqid, p_data, p_datapri); 00474 CHECK_DISPATCH(); 00475 CHECK_PDQID(pdqid); 00476 p_pdqcb = get_pdqcb(pdqid); 00477 00478 t_lock_cpu(); 00479 if (receive_pridata(p_pdqcb, p_data, p_datapri, &reqdsp)) { 00480 if (reqdsp) { 00481 dispatch(); 00482 } 00483 ercd = E_OK; 00484 } 00485 else { 00486 p_runtsk->tstat = (TS_WAITING | TS_WAIT_RPDQ); 00487 make_wait((WINFO *) &winfo_pdq); 00488 queue_insert_prev(&(p_pdqcb->rwait_queue), &(p_runtsk->task_queue)); 00489 winfo_pdq.p_pdqcb = p_pdqcb; 00490 LOG_TSKSTAT(p_runtsk); 00491 dispatch(); 00492 ercd = winfo_pdq.winfo.wercd; 00493 if (ercd == E_OK) { 00494 *p_data = winfo_pdq.data; 00495 *p_datapri = winfo_pdq.datapri; 00496 } 00497 } 00498 t_unlock_cpu(); 00499 00500 error_exit: 00501 LOG_RCV_PDQ_LEAVE(ercd, *p_data, *p_datapri); 00502 return(ercd); 00503 } 00504 00505 #endif /* TOPPERS_rcv_pdq */ 00506 00507 /* 00508 * 優先度データキューからの受信(ポーリング) 00509 */ 00510 #ifdef TOPPERS_prcv_pdq 00511 00512 ER 00513 prcv_pdq(ID pdqid, intptr_t *p_data, PRI *p_datapri) 00514 { 00515 PDQCB *p_pdqcb; 00516 bool_t reqdsp; 00517 ER ercd; 00518 00519 LOG_PRCV_PDQ_ENTER(pdqid, p_data, p_datapri); 00520 CHECK_TSKCTX_UNL(); 00521 CHECK_PDQID(pdqid); 00522 p_pdqcb = get_pdqcb(pdqid); 00523 00524 t_lock_cpu(); 00525 if (receive_pridata(p_pdqcb, p_data, p_datapri, &reqdsp)) { 00526 if (reqdsp) { 00527 dispatch(); 00528 } 00529 ercd = E_OK; 00530 } 00531 else { 00532 ercd = E_TMOUT; 00533 } 00534 t_unlock_cpu(); 00535 00536 error_exit: 00537 LOG_PRCV_PDQ_LEAVE(ercd, *p_data, *p_datapri); 00538 return(ercd); 00539 } 00540 00541 #endif /* TOPPERS_prcv_pdq */ 00542 00543 /* 00544 * 優先度データキューからの受信(タイムアウトあり) 00545 */ 00546 #ifdef TOPPERS_trcv_pdq 00547 00548 ER 00549 trcv_pdq(ID pdqid, intptr_t *p_data, PRI *p_datapri, TMO tmout) 00550 { 00551 PDQCB *p_pdqcb; 00552 WINFO_PDQ winfo_pdq; 00553 TMEVTB tmevtb; 00554 bool_t reqdsp; 00555 ER ercd; 00556 00557 LOG_TRCV_PDQ_ENTER(pdqid, p_data, p_datapri, tmout); 00558 CHECK_DISPATCH(); 00559 CHECK_PDQID(pdqid); 00560 CHECK_TMOUT(tmout); 00561 p_pdqcb = get_pdqcb(pdqid); 00562 00563 t_lock_cpu(); 00564 if (receive_pridata(p_pdqcb, p_data, p_datapri, &reqdsp)) { 00565 if (reqdsp) { 00566 dispatch(); 00567 } 00568 ercd = E_OK; 00569 } 00570 else if (tmout == TMO_POL) { 00571 ercd = E_TMOUT; 00572 } 00573 else { 00574 p_runtsk->tstat = (TS_WAITING | TS_WAIT_RPDQ); 00575 make_wait_tmout((WINFO *) &winfo_pdq, &tmevtb, tmout); 00576 queue_insert_prev(&(p_pdqcb->rwait_queue), &(p_runtsk->task_queue)); 00577 winfo_pdq.p_pdqcb = p_pdqcb; 00578 LOG_TSKSTAT(p_runtsk); 00579 dispatch(); 00580 ercd = winfo_pdq.winfo.wercd; 00581 if (ercd == E_OK) { 00582 *p_data = winfo_pdq.data; 00583 *p_datapri = winfo_pdq.datapri; 00584 } 00585 } 00586 t_unlock_cpu(); 00587 00588 error_exit: 00589 LOG_TRCV_PDQ_LEAVE(ercd, *p_data, *p_datapri); 00590 return(ercd); 00591 } 00592 00593 #endif /* TOPPERS_trcv_pdq */ 00594 00595 /* 00596 * 優先度データキューの再初期化 00597 */ 00598 #ifdef TOPPERS_ini_pdq 00599 00600 ER 00601 ini_pdq(ID pdqid) 00602 { 00603 PDQCB *p_pdqcb; 00604 bool_t dspreq; 00605 ER ercd; 00606 00607 LOG_INI_PDQ_ENTER(pdqid); 00608 CHECK_TSKCTX_UNL(); 00609 CHECK_PDQID(pdqid); 00610 p_pdqcb = get_pdqcb(pdqid); 00611 00612 t_lock_cpu(); 00613 dspreq = init_wait_queue(&(p_pdqcb->swait_queue)); 00614 if (init_wait_queue(&(p_pdqcb->rwait_queue))) { 00615 dspreq = true; 00616 } 00617 p_pdqcb->count = 0U; 00618 p_pdqcb->p_head = NULL; 00619 p_pdqcb->unused = 0U; 00620 p_pdqcb->p_freelist = NULL; 00621 if (dspreq) { 00622 dispatch(); 00623 } 00624 ercd = E_OK; 00625 t_unlock_cpu(); 00626 00627 error_exit: 00628 LOG_INI_PDQ_LEAVE(ercd); 00629 return(ercd); 00630 } 00631 00632 #endif /* TOPPERS_ini_pdq */ 00633 00634 /* 00635 * 優先度データキューの状態参照 00636 */ 00637 #ifdef TOPPERS_ref_pdq 00638 00639 ER 00640 ref_pdq(ID pdqid, T_RPDQ *pk_rpdq) 00641 { 00642 PDQCB *p_pdqcb; 00643 ER ercd; 00644 00645 LOG_REF_PDQ_ENTER(pdqid, pk_rpdq); 00646 CHECK_TSKCTX_UNL(); 00647 CHECK_PDQID(pdqid); 00648 p_pdqcb = get_pdqcb(pdqid); 00649 00650 t_lock_cpu(); 00651 pk_rpdq->stskid = wait_tskid(&(p_pdqcb->swait_queue)); 00652 pk_rpdq->rtskid = wait_tskid(&(p_pdqcb->rwait_queue)); 00653 pk_rpdq->spdqcnt = p_pdqcb->count; 00654 ercd = E_OK; 00655 t_unlock_cpu(); 00656 00657 error_exit: 00658 LOG_REF_PDQ_LEAVE(ercd, pk_rpdq); 00659 return(ercd); 00660 } 00661 00662 #endif /* TOPPERS_ref_pdq */
Copyright © 2008 by Kijineko Inc.