source: EcnlProtoTool/trunk/asp3_dcre/kernel/pridataq.c@ 429

Last change on this file since 429 was 429, checked in by coas-nagasima, 4 years ago

ASP3, TINET, mbed を更新

  • Property svn:eol-style set to native
  • Property svn:mime-type set to text/x-csrc;charset=UTF-8
File size: 18.1 KB
Line 
1/*
2 * TOPPERS/ASP Kernel
3 * Toyohashi Open Platform for Embedded Real-Time Systems/
4 * Advanced Standard Profile Kernel
5 *
6 * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
7 * Toyohashi Univ. of Technology, JAPAN
8 * Copyright (C) 2005-2018 by Embedded and Real-Time Systems Laboratory
9 * Graduate School of Information Science, Nagoya Univ., JAPAN
10 *
11 * 上記著作権者は,以下の(1)~(4)の条件を満たす場合に限り,本ソフトウェ
12 * ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
13 * 変・再配布(以下,利用と呼ぶ)することを無償で許諾する.
14 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
15 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
16 * スコード中に含まれていること.
17 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
18 * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用
19 * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記
20 * の無保証規定を掲載すること.
21 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
22 * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ
23 * と.
24 * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
25 * 作権表示,この利用条件および下記の無保証規定を掲載すること.
26 * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
27 * 報告すること.
28 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
29 * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
30 * また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
31 * 由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを
32 * 免責すること.
33 *
34 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お
35 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
36 * に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
37 * アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
38 * の責任を負わない.
39 *
40 * $Id$
41 */
42
43/*
44 * 優先度データキュー機能
45 */
46
47#include "kernel_impl.h"
48#include "check.h"
49#include "task.h"
50#include "wait.h"
51#include "pridataq.h"
52
53/*
54 * トレースログマクロのデフォルト定義
55 */
56#ifndef LOG_ACRE_PDQ_ENTER
57#define LOG_ACRE_PDQ_ENTER(pk_cpdq)
58#endif /* LOG_ACRE_PDQ_ENTER */
59
60#ifndef LOG_ACRE_PDQ_LEAVE
61#define LOG_ACRE_PDQ_LEAVE(ercd)
62#endif /* LOG_ACRE_PDQ_LEAVE */
63
64#ifndef LOG_DEL_PDQ_ENTER
65#define LOG_DEL_PDQ_ENTER(pdqid)
66#endif /* LOG_DEL_PDQ_ENTER */
67
68#ifndef LOG_DEL_PDQ_LEAVE
69#define LOG_DEL_PDQ_LEAVE(ercd)
70#endif /* LOG_DEL_PDQ_LEAVE */
71
72#ifndef LOG_SND_PDQ_ENTER
73#define LOG_SND_PDQ_ENTER(pdqid, data, datapri)
74#endif /* LOG_SND_PDQ_ENTER */
75
76#ifndef LOG_SND_PDQ_LEAVE
77#define LOG_SND_PDQ_LEAVE(ercd)
78#endif /* LOG_SND_PDQ_LEAVE */
79
80#ifndef LOG_PSND_PDQ_ENTER
81#define LOG_PSND_PDQ_ENTER(pdqid, data, datapri)
82#endif /* LOG_PSND_PDQ_ENTER */
83
84#ifndef LOG_PSND_PDQ_LEAVE
85#define LOG_PSND_PDQ_LEAVE(ercd)
86#endif /* LOG_PSND_PDQ_LEAVE */
87
88#ifndef LOG_TSND_PDQ_ENTER
89#define LOG_TSND_PDQ_ENTER(pdqid, data, datapri, tmout)
90#endif /* LOG_TSND_PDQ_ENTER */
91
92#ifndef LOG_TSND_PDQ_LEAVE
93#define LOG_TSND_PDQ_LEAVE(ercd)
94#endif /* LOG_TSND_PDQ_LEAVE */
95
96#ifndef LOG_RCV_PDQ_ENTER
97#define LOG_RCV_PDQ_ENTER(pdqid, p_data, p_datapri)
98#endif /* LOG_RCV_PDQ_ENTER */
99
100#ifndef LOG_RCV_PDQ_LEAVE
101#define LOG_RCV_PDQ_LEAVE(ercd, p_data, p_datapri)
102#endif /* LOG_RCV_PDQ_LEAVE */
103
104#ifndef LOG_PRCV_PDQ_ENTER
105#define LOG_PRCV_PDQ_ENTER(pdqid, p_data, p_datapri)
106#endif /* LOG_PRCV_PDQ_ENTER */
107
108#ifndef LOG_PRCV_PDQ_LEAVE
109#define LOG_PRCV_PDQ_LEAVE(ercd, p_data, p_datapri)
110#endif /* LOG_PRCV_PDQ_LEAVE */
111
112#ifndef LOG_TRCV_PDQ_ENTER
113#define LOG_TRCV_PDQ_ENTER(pdqid, p_data, p_datapri, tmout)
114#endif /* LOG_TRCV_PDQ_ENTER */
115
116#ifndef LOG_TRCV_PDQ_LEAVE
117#define LOG_TRCV_PDQ_LEAVE(ercd, p_data, p_datapri)
118#endif /* LOG_TRCV_PDQ_LEAVE */
119
120#ifndef LOG_INI_PDQ_ENTER
121#define LOG_INI_PDQ_ENTER(pdqid)
122#endif /* LOG_INI_PDQ_ENTER */
123
124#ifndef LOG_INI_PDQ_LEAVE
125#define LOG_INI_PDQ_LEAVE(ercd)
126#endif /* LOG_INI_PDQ_LEAVE */
127
128#ifndef LOG_REF_PDQ_ENTER
129#define LOG_REF_PDQ_ENTER(pdqid, pk_rpdq)
130#endif /* LOG_REF_PDQ_ENTER */
131
132#ifndef LOG_REF_PDQ_LEAVE
133#define LOG_REF_PDQ_LEAVE(ercd, pk_rpdq)
134#endif /* LOG_REF_PDQ_LEAVE */
135
136/*
137 * 優先度データキューの数
138 */
139#define tnum_pdq ((uint_t)(tmax_pdqid - TMIN_PDQID + 1))
140#define tnum_spdq ((uint_t)(tmax_spdqid - TMIN_PDQID + 1))
141
142/*
143 * 優先度データキューIDから優先度データキュー管理ブロックを取り出すた
144 * めのマクロ
145 */
146#define INDEX_PDQ(pdqid) ((uint_t)((pdqid) - TMIN_PDQID))
147#define get_pdqcb(pdqid) (&(pdqcb_table[INDEX_PDQ(pdqid)]))
148
149#ifdef TOPPERS_pdqini
150
151/*
152 * 使用していない優先度データキュー管理ブロックのリスト
153 */
154QUEUE free_pdqcb;
155
156/*
157 * 優先度データキュー機能の初期化
158 */
159void
160initialize_pridataq(void)
161{
162 uint_t i, j;
163 PDQCB *p_pdqcb;
164 PDQINIB *p_pdqinib;
165
166 for (i = 0; i < tnum_spdq; i++) {
167 p_pdqcb = &(pdqcb_table[i]);
168 queue_initialize(&(p_pdqcb->swait_queue));
169 p_pdqcb->p_pdqinib = &(pdqinib_table[i]);
170 queue_initialize(&(p_pdqcb->rwait_queue));
171 p_pdqcb->count = 0U;
172 p_pdqcb->p_head = NULL;
173 p_pdqcb->unused = 0U;
174 p_pdqcb->p_freelist = NULL;
175 }
176 queue_initialize(&free_pdqcb);
177 for (j = 0; i < tnum_pdq; i++, j++) {
178 p_pdqcb = &(pdqcb_table[i]);
179 p_pdqinib = &(apdqinib_table[j]);
180 p_pdqinib->pdqatr = TA_NOEXS;
181 p_pdqcb->p_pdqinib = ((const PDQINIB *) p_pdqinib);
182 queue_insert_prev(&free_pdqcb, &(p_pdqcb->swait_queue));
183 }
184}
185
186#endif /* TOPPERS_pdqini */
187
188/*
189 * 優先度データキュー管理領域へのデータの格納
190 */
191#ifdef TOPPERS_pdqenq
192
193void
194enqueue_pridata(PDQCB *p_pdqcb, intptr_t data, PRI datapri)
195{
196 PDQMB *p_pdqmb;
197 PDQMB **pp_prev_next, *p_next;
198
199 if (p_pdqcb->p_freelist != NULL) {
200 p_pdqmb = p_pdqcb->p_freelist;
201 p_pdqcb->p_freelist = p_pdqmb->p_next;
202 }
203 else {
204 p_pdqmb = p_pdqcb->p_pdqinib->p_pdqmb + p_pdqcb->unused;
205 p_pdqcb->unused++;
206 }
207
208 p_pdqmb->data = data;
209 p_pdqmb->datapri = datapri;
210
211 pp_prev_next = &(p_pdqcb->p_head);
212 while ((p_next = *pp_prev_next) != NULL) {
213 if (p_next->datapri > datapri) {
214 break;
215 }
216 pp_prev_next = &(p_next->p_next);
217 }
218 p_pdqmb->p_next = p_next;
219 *pp_prev_next = p_pdqmb;
220 p_pdqcb->count++;
221}
222
223#endif /* TOPPERS_pdqenq */
224
225/*
226 * 優先度データキュー管理領域からのデータの取出し
227 */
228#ifdef TOPPERS_pdqdeq
229
230void
231dequeue_pridata(PDQCB *p_pdqcb, intptr_t *p_data, PRI *p_datapri)
232{
233 PDQMB *p_pdqmb;
234
235 p_pdqmb = p_pdqcb->p_head;
236 p_pdqcb->p_head = p_pdqmb->p_next;
237 p_pdqcb->count--;
238
239 *p_data = p_pdqmb->data;
240 *p_datapri = p_pdqmb->datapri;
241
242 p_pdqmb->p_next = p_pdqcb->p_freelist;
243 p_pdqcb->p_freelist = p_pdqmb;
244}
245
246#endif /* TOPPERS_pdqdeq */
247
248/*
249 * 優先度データキューへのデータ送信
250 */
251#ifdef TOPPERS_pdqsnd
252
253bool_t
254send_pridata(PDQCB *p_pdqcb, intptr_t data, PRI datapri)
255{
256 TCB *p_tcb;
257
258 if (!queue_empty(&(p_pdqcb->rwait_queue))) {
259 p_tcb = (TCB *) queue_delete_next(&(p_pdqcb->rwait_queue));
260 ((WINFO_RPDQ *)(p_tcb->p_winfo))->data = data;
261 ((WINFO_RPDQ *)(p_tcb->p_winfo))->datapri = datapri;
262 wait_complete(p_tcb);
263 return(true);
264 }
265 else if (p_pdqcb->count < p_pdqcb->p_pdqinib->pdqcnt) {
266 enqueue_pridata(p_pdqcb, data, datapri);
267 return(true);
268 }
269 else {
270 return(false);
271 }
272}
273
274#endif /* TOPPERS_pdqsnd */
275
276/*
277 * 優先度データキューからのデータ受信
278 */
279#ifdef TOPPERS_pdqrcv
280
281bool_t
282receive_pridata(PDQCB *p_pdqcb, intptr_t *p_data, PRI *p_datapri)
283{
284 TCB *p_tcb;
285 intptr_t data;
286 PRI datapri;
287
288 if (p_pdqcb->count > 0U) {
289 dequeue_pridata(p_pdqcb, p_data, p_datapri);
290 if (!queue_empty(&(p_pdqcb->swait_queue))) {
291 p_tcb = (TCB *) queue_delete_next(&(p_pdqcb->swait_queue));
292 data = ((WINFO_SPDQ *)(p_tcb->p_winfo))->data;
293 datapri = ((WINFO_SPDQ *)(p_tcb->p_winfo))->datapri;
294 enqueue_pridata(p_pdqcb, data, datapri);
295 wait_complete(p_tcb);
296 }
297 return(true);
298 }
299 else if (!queue_empty(&(p_pdqcb->swait_queue))) {
300 p_tcb = (TCB *) queue_delete_next(&(p_pdqcb->swait_queue));
301 *p_data = ((WINFO_SPDQ *)(p_tcb->p_winfo))->data;
302 *p_datapri = ((WINFO_SPDQ *)(p_tcb->p_winfo))->datapri;
303 wait_complete(p_tcb);
304 return(true);
305 }
306 else {
307 return(false);
308 }
309}
310
311#endif /* TOPPERS_pdqrcv */
312
313/*
314 * 優先度データキューの生成
315 */
316#ifdef TOPPERS_acre_pdq
317
318ER_UINT
319acre_pdq(const T_CPDQ *pk_cpdq)
320{
321 PDQCB *p_pdqcb;
322 PDQINIB *p_pdqinib;
323 ATR pdqatr;
324 uint_t pdqcnt;
325 PRI maxdpri;
326 PDQMB *p_pdqmb;
327 ER ercd;
328
329 LOG_ACRE_PDQ_ENTER(pk_cpdq);
330 CHECK_TSKCTX_UNL();
331
332 pdqatr = pk_cpdq->pdqatr;
333 pdqcnt = pk_cpdq->pdqcnt;
334 maxdpri = pk_cpdq->maxdpri;
335 p_pdqmb = pk_cpdq->pdqmb;
336
337 CHECK_VALIDATR(pdqatr, TA_TPRI);
338 CHECK_PAR(VALID_DPRI(maxdpri));
339 if (p_pdqmb != NULL) {
340 CHECK_PAR(MB_ALIGN(p_pdqmb));
341 }
342
343 lock_cpu();
344 if (tnum_pdq == 0 || queue_empty(&free_pdqcb)) {
345 ercd = E_NOID;
346 }
347 else {
348 if (pdqcnt != 0 && p_pdqmb == NULL) {
349 p_pdqmb = malloc_mpk(sizeof(PDQMB) * pdqcnt);
350 pdqatr |= TA_MBALLOC;
351 }
352 if (pdqcnt != 0 && p_pdqmb == NULL) {
353 ercd = E_NOMEM;
354 }
355 else {
356 p_pdqcb = ((PDQCB *) queue_delete_next(&free_pdqcb));
357 p_pdqinib = (PDQINIB *)(p_pdqcb->p_pdqinib);
358 p_pdqinib->pdqatr = pdqatr;
359 p_pdqinib->pdqcnt = pdqcnt;
360 p_pdqinib->maxdpri = maxdpri;
361 p_pdqinib->p_pdqmb = p_pdqmb;
362
363 queue_initialize(&(p_pdqcb->swait_queue));
364 queue_initialize(&(p_pdqcb->rwait_queue));
365 p_pdqcb->count = 0U;
366 p_pdqcb->p_head = NULL;
367 p_pdqcb->unused = 0U;
368 p_pdqcb->p_freelist = NULL;
369 ercd = PDQID(p_pdqcb);
370 }
371 }
372 unlock_cpu();
373
374 error_exit:
375 LOG_ACRE_PDQ_LEAVE(ercd);
376 return(ercd);
377}
378
379#endif /* TOPPERS_acre_pdq */
380
381/*
382 * 優先度データキューの削除
383 */
384#ifdef TOPPERS_del_pdq
385
386ER
387del_pdq(ID pdqid)
388{
389 PDQCB *p_pdqcb;
390 PDQINIB *p_pdqinib;
391 ER ercd;
392
393 LOG_DEL_PDQ_ENTER(pdqid);
394 CHECK_TSKCTX_UNL();
395 CHECK_ID(VALID_PDQID(pdqid));
396 p_pdqcb = get_pdqcb(pdqid);
397
398 lock_cpu();
399 if (p_pdqcb->p_pdqinib->pdqatr == TA_NOEXS) {
400 ercd = E_NOEXS;
401 }
402 else if (pdqid <= tmax_spdqid) {
403 ercd = E_OBJ;
404 }
405 else {
406 init_wait_queue(&(p_pdqcb->swait_queue));
407 init_wait_queue(&(p_pdqcb->rwait_queue));
408 p_pdqinib = (PDQINIB *)(p_pdqcb->p_pdqinib);
409 if ((p_pdqinib->pdqatr & TA_MBALLOC) != 0U) {
410 free_mpk(p_pdqinib->p_pdqmb);
411 }
412 p_pdqinib->pdqatr = TA_NOEXS;
413 queue_insert_prev(&free_pdqcb, &(p_pdqcb->swait_queue));
414 if (p_runtsk != p_schedtsk) {
415 dispatch();
416 }
417 ercd = E_OK;
418 }
419 unlock_cpu();
420
421 error_exit:
422 LOG_DEL_PDQ_LEAVE(ercd);
423 return(ercd);
424}
425
426#endif /* TOPPERS_del_pdq */
427
428/*
429 * 優先度データキューへの送信
430 */
431#ifdef TOPPERS_snd_pdq
432
433ER
434snd_pdq(ID pdqid, intptr_t data, PRI datapri)
435{
436 PDQCB *p_pdqcb;
437 WINFO_SPDQ winfo_spdq;
438 ER ercd;
439
440 LOG_SND_PDQ_ENTER(pdqid, data, datapri);
441 CHECK_DISPATCH();
442 CHECK_ID(VALID_PDQID(pdqid));
443 p_pdqcb = get_pdqcb(pdqid);
444 CHECK_PAR(TMIN_DPRI <= datapri);
445
446 lock_cpu_dsp();
447 if (p_pdqcb->p_pdqinib->pdqatr == TA_NOEXS) {
448 ercd = E_NOEXS;
449 }
450 else if (datapri > p_pdqcb->p_pdqinib->maxdpri) {
451 ercd = E_PAR;
452 }
453 else if (p_runtsk->raster) {
454 ercd = E_RASTER;
455 }
456 else if (send_pridata(p_pdqcb, data, datapri)) {
457 if (p_runtsk != p_schedtsk) {
458 dispatch();
459 }
460 ercd = E_OK;
461 }
462 else {
463 winfo_spdq.data = data;
464 winfo_spdq.datapri = datapri;
465 wobj_make_wait((WOBJCB *) p_pdqcb, TS_WAITING_SPDQ,
466 (WINFO_WOBJ *) &winfo_spdq);
467 dispatch();
468 ercd = winfo_spdq.winfo.wercd;
469 }
470 unlock_cpu_dsp();
471
472 error_exit:
473 LOG_SND_PDQ_LEAVE(ercd);
474 return(ercd);
475}
476
477#endif /* TOPPERS_snd_pdq */
478
479/*
480 * 優先度データキューへの送信(ポーリング)
481 */
482#ifdef TOPPERS_psnd_pdq
483
484ER
485psnd_pdq(ID pdqid, intptr_t data, PRI datapri)
486{
487 PDQCB *p_pdqcb;
488 ER ercd;
489
490 LOG_PSND_PDQ_ENTER(pdqid, data, datapri);
491 CHECK_UNL();
492 CHECK_ID(VALID_PDQID(pdqid));
493 p_pdqcb = get_pdqcb(pdqid);
494 CHECK_PAR(TMIN_DPRI <= datapri);
495
496 lock_cpu();
497 if (p_pdqcb->p_pdqinib->pdqatr == TA_NOEXS) {
498 ercd = E_NOEXS;
499 }
500 else if (datapri > p_pdqcb->p_pdqinib->maxdpri) {
501 ercd = E_PAR;
502 }
503 else if (send_pridata(p_pdqcb, data, datapri)) {
504 if (p_runtsk != p_schedtsk) {
505 if (!sense_context()) {
506 dispatch();
507 }
508 else {
509 request_dispatch_retint();
510 }
511 }
512 ercd = E_OK;
513 }
514 else {
515 ercd = E_TMOUT;
516 }
517 unlock_cpu();
518
519 error_exit:
520 LOG_PSND_PDQ_LEAVE(ercd);
521 return(ercd);
522}
523
524#endif /* TOPPERS_psnd_pdq */
525
526/*
527 * 優先度データキューへの送信(タイムアウトあり)
528 */
529#ifdef TOPPERS_tsnd_pdq
530
531ER
532tsnd_pdq(ID pdqid, intptr_t data, PRI datapri, TMO tmout)
533{
534 PDQCB *p_pdqcb;
535 WINFO_SPDQ winfo_spdq;
536 TMEVTB tmevtb;
537 ER ercd;
538
539 LOG_TSND_PDQ_ENTER(pdqid, data, datapri, tmout);
540 CHECK_DISPATCH();
541 CHECK_ID(VALID_PDQID(pdqid));
542 CHECK_PAR(VALID_TMOUT(tmout));
543 p_pdqcb = get_pdqcb(pdqid);
544 CHECK_PAR(TMIN_DPRI <= datapri);
545
546 lock_cpu_dsp();
547 if (p_pdqcb->p_pdqinib->pdqatr == TA_NOEXS) {
548 ercd = E_NOEXS;
549 }
550 else if (datapri > p_pdqcb->p_pdqinib->maxdpri) {
551 ercd = E_PAR;
552 }
553 else if (p_runtsk->raster) {
554 ercd = E_RASTER;
555 }
556 else if (send_pridata(p_pdqcb, data, datapri)) {
557 if (p_runtsk != p_schedtsk) {
558 dispatch();
559 }
560 ercd = E_OK;
561 }
562 else if (tmout == TMO_POL) {
563 ercd = E_TMOUT;
564 }
565 else {
566 winfo_spdq.data = data;
567 winfo_spdq.datapri = datapri;
568 wobj_make_wait_tmout((WOBJCB *) p_pdqcb, TS_WAITING_SPDQ,
569 (WINFO_WOBJ *) &winfo_spdq, &tmevtb, tmout);
570 dispatch();
571 ercd = winfo_spdq.winfo.wercd;
572 }
573 unlock_cpu_dsp();
574
575 error_exit:
576 LOG_TSND_PDQ_LEAVE(ercd);
577 return(ercd);
578}
579
580#endif /* TOPPERS_tsnd_pdq */
581
582/*
583 * 優先度データキューからの受信
584 */
585#ifdef TOPPERS_rcv_pdq
586
587ER
588rcv_pdq(ID pdqid, intptr_t *p_data, PRI *p_datapri)
589{
590 PDQCB *p_pdqcb;
591 WINFO_RPDQ winfo_rpdq;
592 ER ercd;
593
594 LOG_RCV_PDQ_ENTER(pdqid, p_data, p_datapri);
595 CHECK_DISPATCH();
596 CHECK_ID(VALID_PDQID(pdqid));
597 p_pdqcb = get_pdqcb(pdqid);
598
599 lock_cpu_dsp();
600 if (p_pdqcb->p_pdqinib->pdqatr == TA_NOEXS) {
601 ercd = E_NOEXS;
602 }
603 else if (p_runtsk->raster) {
604 ercd = E_RASTER;
605 }
606 else if (receive_pridata(p_pdqcb, p_data, p_datapri)) {
607 if (p_runtsk != p_schedtsk) {
608 dispatch();
609 }
610 ercd = E_OK;
611 }
612 else {
613 make_wait(TS_WAITING_RPDQ, &(winfo_rpdq.winfo));
614 queue_insert_prev(&(p_pdqcb->rwait_queue), &(p_runtsk->task_queue));
615 winfo_rpdq.p_pdqcb = p_pdqcb;
616 LOG_TSKSTAT(p_runtsk);
617 dispatch();
618 ercd = winfo_rpdq.winfo.wercd;
619 if (ercd == E_OK) {
620 *p_data = winfo_rpdq.data;
621 *p_datapri = winfo_rpdq.datapri;
622 }
623 }
624 unlock_cpu_dsp();
625
626 error_exit:
627 LOG_RCV_PDQ_LEAVE(ercd, p_data, p_datapri);
628 return(ercd);
629}
630
631#endif /* TOPPERS_rcv_pdq */
632
633/*
634 * 優先度データキューからの受信(ポーリング)
635 */
636#ifdef TOPPERS_prcv_pdq
637
638ER
639prcv_pdq(ID pdqid, intptr_t *p_data, PRI *p_datapri)
640{
641 PDQCB *p_pdqcb;
642 ER ercd;
643
644 LOG_PRCV_PDQ_ENTER(pdqid, p_data, p_datapri);
645 CHECK_TSKCTX_UNL();
646 CHECK_ID(VALID_PDQID(pdqid));
647 p_pdqcb = get_pdqcb(pdqid);
648
649 lock_cpu();
650 if (p_pdqcb->p_pdqinib->pdqatr == TA_NOEXS) {
651 ercd = E_NOEXS;
652 }
653 else if (receive_pridata(p_pdqcb, p_data, p_datapri)) {
654 if (p_runtsk != p_schedtsk) {
655 dispatch();
656 }
657 ercd = E_OK;
658 }
659 else {
660 ercd = E_TMOUT;
661 }
662 unlock_cpu();
663
664 error_exit:
665 LOG_PRCV_PDQ_LEAVE(ercd, p_data, p_datapri);
666 return(ercd);
667}
668
669#endif /* TOPPERS_prcv_pdq */
670
671/*
672 * 優先度データキューからの受信(タイムアウトあり)
673 */
674#ifdef TOPPERS_trcv_pdq
675
676ER
677trcv_pdq(ID pdqid, intptr_t *p_data, PRI *p_datapri, TMO tmout)
678{
679 PDQCB *p_pdqcb;
680 WINFO_RPDQ winfo_rpdq;
681 TMEVTB tmevtb;
682 ER ercd;
683
684 LOG_TRCV_PDQ_ENTER(pdqid, p_data, p_datapri, tmout);
685 CHECK_DISPATCH();
686 CHECK_ID(VALID_PDQID(pdqid));
687 CHECK_PAR(VALID_TMOUT(tmout));
688 p_pdqcb = get_pdqcb(pdqid);
689
690 lock_cpu_dsp();
691 if (p_pdqcb->p_pdqinib->pdqatr == TA_NOEXS) {
692 ercd = E_NOEXS;
693 }
694 else if (p_runtsk->raster) {
695 ercd = E_RASTER;
696 }
697 else if (receive_pridata(p_pdqcb, p_data, p_datapri)) {
698 if (p_runtsk != p_schedtsk) {
699 dispatch();
700 }
701 ercd = E_OK;
702 }
703 else if (tmout == TMO_POL) {
704 ercd = E_TMOUT;
705 }
706 else {
707 make_wait_tmout(TS_WAITING_RPDQ, &(winfo_rpdq.winfo), &tmevtb, tmout);
708 queue_insert_prev(&(p_pdqcb->rwait_queue), &(p_runtsk->task_queue));
709 winfo_rpdq.p_pdqcb = p_pdqcb;
710 LOG_TSKSTAT(p_runtsk);
711 dispatch();
712 ercd = winfo_rpdq.winfo.wercd;
713 if (ercd == E_OK) {
714 *p_data = winfo_rpdq.data;
715 *p_datapri = winfo_rpdq.datapri;
716 }
717 }
718 unlock_cpu_dsp();
719
720 error_exit:
721 LOG_TRCV_PDQ_LEAVE(ercd, p_data, p_datapri);
722 return(ercd);
723}
724
725#endif /* TOPPERS_trcv_pdq */
726
727/*
728 * 優先度データキューの再初期化
729 */
730#ifdef TOPPERS_ini_pdq
731
732ER
733ini_pdq(ID pdqid)
734{
735 PDQCB *p_pdqcb;
736 ER ercd;
737
738 LOG_INI_PDQ_ENTER(pdqid);
739 CHECK_TSKCTX_UNL();
740 CHECK_ID(VALID_PDQID(pdqid));
741 p_pdqcb = get_pdqcb(pdqid);
742
743 lock_cpu();
744 if (p_pdqcb->p_pdqinib->pdqatr == TA_NOEXS) {
745 ercd = E_NOEXS;
746 }
747 else {
748 init_wait_queue(&(p_pdqcb->swait_queue));
749 init_wait_queue(&(p_pdqcb->rwait_queue));
750 p_pdqcb->count = 0U;
751 p_pdqcb->p_head = NULL;
752 p_pdqcb->unused = 0U;
753 p_pdqcb->p_freelist = NULL;
754 if (p_runtsk != p_schedtsk) {
755 dispatch();
756 }
757 ercd = E_OK;
758 }
759 unlock_cpu();
760
761 error_exit:
762 LOG_INI_PDQ_LEAVE(ercd);
763 return(ercd);
764}
765
766#endif /* TOPPERS_ini_pdq */
767
768/*
769 * 優先度データキューの状態参照
770 */
771#ifdef TOPPERS_ref_pdq
772
773ER
774ref_pdq(ID pdqid, T_RPDQ *pk_rpdq)
775{
776 PDQCB *p_pdqcb;
777 ER ercd;
778
779 LOG_REF_PDQ_ENTER(pdqid, pk_rpdq);
780 CHECK_TSKCTX_UNL();
781 CHECK_ID(VALID_PDQID(pdqid));
782 p_pdqcb = get_pdqcb(pdqid);
783
784 lock_cpu();
785 if (p_pdqcb->p_pdqinib->pdqatr == TA_NOEXS) {
786 ercd = E_NOEXS;
787 }
788 else {
789 pk_rpdq->stskid = wait_tskid(&(p_pdqcb->swait_queue));
790 pk_rpdq->rtskid = wait_tskid(&(p_pdqcb->rwait_queue));
791 pk_rpdq->spdqcnt = p_pdqcb->count;
792 ercd = E_OK;
793 }
794 unlock_cpu();
795
796 error_exit:
797 LOG_REF_PDQ_LEAVE(ercd, pk_rpdq);
798 return(ercd);
799}
800
801#endif /* TOPPERS_ref_pdq */
Note: See TracBrowser for help on using the repository browser.