source: asp3_tinet_ecnl_rx/trunk/asp3_dcre/kernel/dataqueue.c@ 337

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

ASP3版ECNLを追加

  • Property svn:eol-style set to native
  • Property svn:mime-type set to text/x-csrc;charset=UTF-8
File size: 17.9 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-2017 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 "dataqueue.h"
52
53/*
54 * トレースログマクロのデフォルト定義
55 */
56#ifndef LOG_ACRE_DTQ_ENTER
57#define LOG_ACRE_DTQ_ENTER(pk_cdtq)
58#endif /* LOG_ACRE_DTQ_ENTER */
59
60#ifndef LOG_ACRE_DTQ_LEAVE
61#define LOG_ACRE_DTQ_LEAVE(ercd)
62#endif /* LOG_ACRE_DTQ_LEAVE */
63
64#ifndef LOG_DEL_DTQ_ENTER
65#define LOG_DEL_DTQ_ENTER(dtqid)
66#endif /* LOG_DEL_DTQ_ENTER */
67
68#ifndef LOG_DEL_DTQ_LEAVE
69#define LOG_DEL_DTQ_LEAVE(ercd)
70#endif /* LOG_DEL_DTQ_LEAVE */
71
72#ifndef LOG_SND_DTQ_ENTER
73#define LOG_SND_DTQ_ENTER(dtqid, data)
74#endif /* LOG_SND_DTQ_ENTER */
75
76#ifndef LOG_SND_DTQ_LEAVE
77#define LOG_SND_DTQ_LEAVE(ercd)
78#endif /* LOG_SND_DTQ_LEAVE */
79
80#ifndef LOG_PSND_DTQ_ENTER
81#define LOG_PSND_DTQ_ENTER(dtqid, data)
82#endif /* LOG_PSND_DTQ_ENTER */
83
84#ifndef LOG_PSND_DTQ_LEAVE
85#define LOG_PSND_DTQ_LEAVE(ercd)
86#endif /* LOG_PSND_DTQ_LEAVE */
87
88#ifndef LOG_TSND_DTQ_ENTER
89#define LOG_TSND_DTQ_ENTER(dtqid, data, tmout)
90#endif /* LOG_TSND_DTQ_ENTER */
91
92#ifndef LOG_TSND_DTQ_LEAVE
93#define LOG_TSND_DTQ_LEAVE(ercd)
94#endif /* LOG_TSND_DTQ_LEAVE */
95
96#ifndef LOG_FSND_DTQ_ENTER
97#define LOG_FSND_DTQ_ENTER(dtqid, data)
98#endif /* LOG_FSND_DTQ_ENTER */
99
100#ifndef LOG_FSND_DTQ_LEAVE
101#define LOG_FSND_DTQ_LEAVE(ercd)
102#endif /* LOG_FSND_DTQ_LEAVE */
103
104#ifndef LOG_RCV_DTQ_ENTER
105#define LOG_RCV_DTQ_ENTER(dtqid, p_data)
106#endif /* LOG_RCV_DTQ_ENTER */
107
108#ifndef LOG_RCV_DTQ_LEAVE
109#define LOG_RCV_DTQ_LEAVE(ercd, p_data)
110#endif /* LOG_RCV_DTQ_LEAVE */
111
112#ifndef LOG_PRCV_DTQ_ENTER
113#define LOG_PRCV_DTQ_ENTER(dtqid, p_data)
114#endif /* LOG_PRCV_DTQ_ENTER */
115
116#ifndef LOG_PRCV_DTQ_LEAVE
117#define LOG_PRCV_DTQ_LEAVE(ercd, p_data)
118#endif /* LOG_PRCV_DTQ_LEAVE */
119
120#ifndef LOG_TRCV_DTQ_ENTER
121#define LOG_TRCV_DTQ_ENTER(dtqid, p_data, tmout)
122#endif /* LOG_TRCV_DTQ_ENTER */
123
124#ifndef LOG_TRCV_DTQ_LEAVE
125#define LOG_TRCV_DTQ_LEAVE(ercd, p_data)
126#endif /* LOG_TRCV_DTQ_LEAVE */
127
128#ifndef LOG_INI_DTQ_ENTER
129#define LOG_INI_DTQ_ENTER(dtqid)
130#endif /* LOG_INI_DTQ_ENTER */
131
132#ifndef LOG_INI_DTQ_LEAVE
133#define LOG_INI_DTQ_LEAVE(ercd)
134#endif /* LOG_INI_DTQ_LEAVE */
135
136#ifndef LOG_REF_DTQ_ENTER
137#define LOG_REF_DTQ_ENTER(dtqid, pk_rdtq)
138#endif /* LOG_REF_DTQ_ENTER */
139
140#ifndef LOG_REF_DTQ_LEAVE
141#define LOG_REF_DTQ_LEAVE(ercd, pk_rdtq)
142#endif /* LOG_REF_DTQ_LEAVE */
143
144/*
145 * データキューの数
146 */
147#define tnum_dtq ((uint_t)(tmax_dtqid - TMIN_DTQID + 1))
148#define tnum_sdtq ((uint_t)(tmax_sdtqid - TMIN_DTQID + 1))
149
150/*
151 * データキューIDからデータキュー管理ブロックを取り出すためのマクロ
152 */
153#define INDEX_DTQ(dtqid) ((uint_t)((dtqid) - TMIN_DTQID))
154#define get_dtqcb(dtqid) (&(dtqcb_table[INDEX_DTQ(dtqid)]))
155
156#ifdef TOPPERS_dtqini
157
158/*
159 * 使用していないデータキュー管理ブロックのリスト
160 */
161QUEUE free_dtqcb;
162
163/*
164 * データキュー機能の初期化
165 */
166void
167initialize_dataqueue(void)
168{
169 uint_t i, j;
170 DTQCB *p_dtqcb;
171 DTQINIB *p_dtqinib;
172
173 for (i = 0; i < tnum_sdtq; i++) {
174 p_dtqcb = &(dtqcb_table[i]);
175 queue_initialize(&(p_dtqcb->swait_queue));
176 p_dtqcb->p_dtqinib = &(dtqinib_table[i]);
177 queue_initialize(&(p_dtqcb->rwait_queue));
178 p_dtqcb->count = 0U;
179 p_dtqcb->head = 0U;
180 p_dtqcb->tail = 0U;
181 }
182 queue_initialize(&free_dtqcb);
183 for (j = 0; i < tnum_dtq; i++, j++) {
184 p_dtqcb = &(dtqcb_table[i]);
185 p_dtqinib = &(adtqinib_table[j]);
186 p_dtqinib->dtqatr = TA_NOEXS;
187 p_dtqcb->p_dtqinib = ((const DTQINIB *) p_dtqinib);
188 queue_insert_prev(&free_dtqcb, &(p_dtqcb->swait_queue));
189 }
190}
191
192#endif /* TOPPERS_dtqini */
193
194/*
195 * データキュー管理領域へのデータの格納
196 */
197#ifdef TOPPERS_dtqenq
198
199void
200enqueue_data(DTQCB *p_dtqcb, intptr_t data)
201{
202 (p_dtqcb->p_dtqinib->p_dtqmb + p_dtqcb->tail)->data = data;
203 p_dtqcb->count++;
204 p_dtqcb->tail++;
205 if (p_dtqcb->tail >= p_dtqcb->p_dtqinib->dtqcnt) {
206 p_dtqcb->tail = 0U;
207 }
208}
209
210#endif /* TOPPERS_dtqenq */
211
212/*
213 * データキュー管理領域へのデータの強制格納
214 */
215#ifdef TOPPERS_dtqfenq
216
217void
218force_enqueue_data(DTQCB *p_dtqcb, intptr_t data)
219{
220 (p_dtqcb->p_dtqinib->p_dtqmb + p_dtqcb->tail)->data = data;
221 p_dtqcb->tail++;
222 if (p_dtqcb->tail >= p_dtqcb->p_dtqinib->dtqcnt) {
223 p_dtqcb->tail = 0U;
224 }
225 if (p_dtqcb->count < p_dtqcb->p_dtqinib->dtqcnt) {
226 p_dtqcb->count++;
227 }
228 else {
229 p_dtqcb->head = p_dtqcb->tail;
230 }
231}
232
233#endif /* TOPPERS_dtqfenq */
234
235/*
236 * データキュー管理領域からのデータの取出し
237 */
238#ifdef TOPPERS_dtqdeq
239
240void
241dequeue_data(DTQCB *p_dtqcb, intptr_t *p_data)
242{
243 *p_data = (p_dtqcb->p_dtqinib->p_dtqmb + p_dtqcb->head)->data;
244 p_dtqcb->count--;
245 p_dtqcb->head++;
246 if (p_dtqcb->head >= p_dtqcb->p_dtqinib->dtqcnt) {
247 p_dtqcb->head = 0U;
248 }
249}
250
251#endif /* TOPPERS_dtqdeq */
252
253/*
254 * データキューへのデータ送信
255 */
256#ifdef TOPPERS_dtqsnd
257
258bool_t
259send_data(DTQCB *p_dtqcb, intptr_t data)
260{
261 TCB *p_tcb;
262
263 if (!queue_empty(&(p_dtqcb->rwait_queue))) {
264 p_tcb = (TCB *) queue_delete_next(&(p_dtqcb->rwait_queue));
265 ((WINFO_RDTQ *)(p_tcb->p_winfo))->data = data;
266 wait_complete(p_tcb);
267 return(true);
268 }
269 else if (p_dtqcb->count < p_dtqcb->p_dtqinib->dtqcnt) {
270 enqueue_data(p_dtqcb, data);
271 return(true);
272 }
273 else {
274 return(false);
275 }
276}
277
278#endif /* TOPPERS_dtqsnd */
279
280/*
281 * データキューへのデータ強制送信
282 */
283#ifdef TOPPERS_dtqfsnd
284
285void
286force_send_data(DTQCB *p_dtqcb, intptr_t data)
287{
288 TCB *p_tcb;
289
290 if (!queue_empty(&(p_dtqcb->rwait_queue))) {
291 p_tcb = (TCB *) queue_delete_next(&(p_dtqcb->rwait_queue));
292 ((WINFO_RDTQ *)(p_tcb->p_winfo))->data = data;
293 wait_complete(p_tcb);
294 }
295 else {
296 force_enqueue_data(p_dtqcb, data);
297 }
298}
299
300#endif /* TOPPERS_dtqfsnd */
301
302/*
303 * データキューからのデータ受信
304 */
305#ifdef TOPPERS_dtqrcv
306
307bool_t
308receive_data(DTQCB *p_dtqcb, intptr_t *p_data)
309{
310 TCB *p_tcb;
311 intptr_t data;
312
313 if (p_dtqcb->count > 0U) {
314 dequeue_data(p_dtqcb, p_data);
315 if (!queue_empty(&(p_dtqcb->swait_queue))) {
316 p_tcb = (TCB *) queue_delete_next(&(p_dtqcb->swait_queue));
317 data = ((WINFO_SDTQ *)(p_tcb->p_winfo))->data;
318 enqueue_data(p_dtqcb, data);
319 wait_complete(p_tcb);
320 }
321 return(true);
322 }
323 else if (!queue_empty(&(p_dtqcb->swait_queue))) {
324 p_tcb = (TCB *) queue_delete_next(&(p_dtqcb->swait_queue));
325 *p_data = ((WINFO_SDTQ *)(p_tcb->p_winfo))->data;
326 wait_complete(p_tcb);
327 return(true);
328 }
329 else {
330 return(false);
331 }
332}
333
334#endif /* TOPPERS_dtqrcv */
335
336/*
337 * データキューの生成
338 */
339#ifdef TOPPERS_acre_dtq
340
341ER_UINT
342acre_dtq(const T_CDTQ *pk_cdtq)
343{
344 DTQCB *p_dtqcb;
345 DTQINIB *p_dtqinib;
346 ATR dtqatr;
347 uint_t dtqcnt;
348 DTQMB *p_dtqmb;
349 ER ercd;
350
351 LOG_ACRE_DTQ_ENTER(pk_cdtq);
352 CHECK_TSKCTX_UNL();
353
354 dtqatr = pk_cdtq->dtqatr;
355 dtqcnt = pk_cdtq->dtqcnt;
356 p_dtqmb = pk_cdtq->dtqmb;
357
358 CHECK_RSATR(dtqatr, TA_TPRI);
359
360 lock_cpu();
361 if (tnum_dtq == 0 || queue_empty(&free_dtqcb)) {
362 ercd = E_NOID;
363 }
364 else {
365 if (dtqcnt != 0 && p_dtqmb == NULL) {
366 p_dtqmb = kernel_malloc(sizeof(DTQMB) * dtqcnt);
367 dtqatr |= TA_MBALLOC;
368 }
369 if (dtqcnt != 0 && p_dtqmb == NULL) {
370 ercd = E_NOMEM;
371 }
372 else {
373 p_dtqcb = ((DTQCB *) queue_delete_next(&free_dtqcb));
374 p_dtqinib = (DTQINIB *)(p_dtqcb->p_dtqinib);
375 p_dtqinib->dtqatr = dtqatr;
376 p_dtqinib->dtqcnt = dtqcnt;
377 p_dtqinib->p_dtqmb = p_dtqmb;
378
379 queue_initialize(&(p_dtqcb->swait_queue));
380 queue_initialize(&(p_dtqcb->rwait_queue));
381 p_dtqcb->count = 0U;
382 p_dtqcb->head = 0U;
383 p_dtqcb->tail = 0U;
384 ercd = DTQID(p_dtqcb);
385 }
386 }
387 unlock_cpu();
388
389 error_exit:
390 LOG_ACRE_DTQ_LEAVE(ercd);
391 return(ercd);
392}
393
394#endif /* TOPPERS_acre_dtq */
395
396/*
397 * データキューの削除
398 */
399#ifdef TOPPERS_del_dtq
400
401ER
402del_dtq(ID dtqid)
403{
404 DTQCB *p_dtqcb;
405 DTQINIB *p_dtqinib;
406 ER ercd;
407
408 LOG_DEL_DTQ_ENTER(dtqid);
409 CHECK_TSKCTX_UNL();
410 CHECK_PAR(VALID_DTQID(dtqid));
411 p_dtqcb = get_dtqcb(dtqid);
412
413 lock_cpu();
414 if (p_dtqcb->p_dtqinib->dtqatr == TA_NOEXS) {
415 ercd = E_NOEXS;
416 }
417 else if (dtqid <= tmax_sdtqid) {
418 ercd = E_OBJ;
419 }
420 else {
421 init_wait_queue(&(p_dtqcb->swait_queue));
422 init_wait_queue(&(p_dtqcb->rwait_queue));
423 p_dtqinib = (DTQINIB *)(p_dtqcb->p_dtqinib);
424 if ((p_dtqinib->dtqatr & TA_MBALLOC) != 0U) {
425 kernel_free(p_dtqinib->p_dtqmb);
426 }
427 p_dtqinib->dtqatr = TA_NOEXS;
428 queue_insert_prev(&free_dtqcb, &(p_dtqcb->swait_queue));
429 if (p_runtsk != p_schedtsk) {
430 dispatch();
431 }
432 ercd = E_OK;
433 }
434 unlock_cpu();
435
436 error_exit:
437 LOG_DEL_DTQ_LEAVE(ercd);
438 return(ercd);
439}
440
441#endif /* TOPPERS_del_dtq */
442
443/*
444 * データキューへの送信
445 */
446#ifdef TOPPERS_snd_dtq
447
448ER
449snd_dtq(ID dtqid, intptr_t data)
450{
451 DTQCB *p_dtqcb;
452 WINFO_SDTQ winfo_sdtq;
453 ER ercd;
454
455 LOG_SND_DTQ_ENTER(dtqid, data);
456 CHECK_DISPATCH();
457 CHECK_ID(VALID_DTQID(dtqid));
458 p_dtqcb = get_dtqcb(dtqid);
459
460 lock_cpu_dsp();
461 if (p_dtqcb->p_dtqinib->dtqatr == TA_NOEXS) {
462 ercd = E_NOEXS;
463 }
464 else if (p_runtsk->raster) {
465 ercd = E_RASTER;
466 }
467 else if (send_data(p_dtqcb, data)) {
468 if (p_runtsk != p_schedtsk) {
469 dispatch();
470 }
471 ercd = E_OK;
472 }
473 else {
474 winfo_sdtq.data = data;
475 p_runtsk->tstat = TS_WAITING_SDTQ;
476 wobj_make_wait((WOBJCB *) p_dtqcb, (WINFO_WOBJ *) &winfo_sdtq);
477 dispatch();
478 ercd = winfo_sdtq.winfo.wercd;
479 }
480 unlock_cpu_dsp();
481
482 error_exit:
483 LOG_SND_DTQ_LEAVE(ercd);
484 return(ercd);
485}
486
487#endif /* TOPPERS_snd_dtq */
488
489/*
490 * データキューへの送信(ポーリング)
491 */
492#ifdef TOPPERS_psnd_dtq
493
494ER
495psnd_dtq(ID dtqid, intptr_t data)
496{
497 DTQCB *p_dtqcb;
498 ER ercd;
499
500 LOG_PSND_DTQ_ENTER(dtqid, data);
501 CHECK_UNL();
502 CHECK_ID(VALID_DTQID(dtqid));
503 p_dtqcb = get_dtqcb(dtqid);
504
505 lock_cpu();
506 if (p_dtqcb->p_dtqinib->dtqatr == TA_NOEXS) {
507 ercd = E_NOEXS;
508 }
509 else if (send_data(p_dtqcb, data)) {
510 if (p_runtsk != p_schedtsk) {
511 if (!sense_context()) {
512 dispatch();
513 }
514 else {
515 request_dispatch();
516 }
517 }
518 ercd = E_OK;
519 }
520 else {
521 ercd = E_TMOUT;
522 }
523 unlock_cpu();
524
525 error_exit:
526 LOG_PSND_DTQ_LEAVE(ercd);
527 return(ercd);
528}
529
530#endif /* TOPPERS_psnd_dtq */
531
532/*
533 * データキューへの送信(タイムアウトあり)
534 */
535#ifdef TOPPERS_tsnd_dtq
536
537ER
538tsnd_dtq(ID dtqid, intptr_t data, TMO tmout)
539{
540 DTQCB *p_dtqcb;
541 WINFO_SDTQ winfo_sdtq;
542 TMEVTB tmevtb;
543 ER ercd;
544
545 LOG_TSND_DTQ_ENTER(dtqid, data, tmout);
546 CHECK_DISPATCH();
547 CHECK_ID(VALID_DTQID(dtqid));
548 CHECK_PAR(VALID_TMOUT(tmout));
549 p_dtqcb = get_dtqcb(dtqid);
550
551 lock_cpu_dsp();
552 if (p_dtqcb->p_dtqinib->dtqatr == TA_NOEXS) {
553 ercd = E_NOEXS;
554 }
555 else if (p_runtsk->raster) {
556 ercd = E_RASTER;
557 }
558 else if (send_data(p_dtqcb, data)) {
559 if (p_runtsk != p_schedtsk) {
560 dispatch();
561 }
562 ercd = E_OK;
563 }
564 else if (tmout == TMO_POL) {
565 ercd = E_TMOUT;
566 }
567 else {
568 winfo_sdtq.data = data;
569 p_runtsk->tstat = TS_WAITING_SDTQ;
570 wobj_make_wait_tmout((WOBJCB *) p_dtqcb, (WINFO_WOBJ *) &winfo_sdtq,
571 &tmevtb, tmout);
572 dispatch();
573 ercd = winfo_sdtq.winfo.wercd;
574 }
575 unlock_cpu_dsp();
576
577 error_exit:
578 LOG_TSND_DTQ_LEAVE(ercd);
579 return(ercd);
580}
581
582#endif /* TOPPERS_tsnd_dtq */
583
584/*
585 * データキューへの強制送信
586 */
587#ifdef TOPPERS_fsnd_dtq
588
589ER
590fsnd_dtq(ID dtqid, intptr_t data)
591{
592 DTQCB *p_dtqcb;
593 ER ercd;
594
595 LOG_FSND_DTQ_ENTER(dtqid, data);
596 CHECK_UNL();
597 CHECK_ID(VALID_DTQID(dtqid));
598 p_dtqcb = get_dtqcb(dtqid);
599
600 lock_cpu();
601 if (p_dtqcb->p_dtqinib->dtqatr == TA_NOEXS) {
602 ercd = E_NOEXS;
603 }
604 else if (!(p_dtqcb->p_dtqinib->dtqcnt > 0U)) {
605 ercd = E_ILUSE;
606 }
607 else {
608 force_send_data(p_dtqcb, data);
609 if (p_runtsk != p_schedtsk) {
610 if (!sense_context()) {
611 dispatch();
612 }
613 else {
614 request_dispatch();
615 }
616 }
617 ercd = E_OK;
618 }
619 unlock_cpu();
620
621 error_exit:
622 LOG_FSND_DTQ_LEAVE(ercd);
623 return(ercd);
624}
625
626#endif /* TOPPERS_fsnd_dtq */
627
628/*
629 * データキューからの受信
630 */
631#ifdef TOPPERS_rcv_dtq
632
633ER
634rcv_dtq(ID dtqid, intptr_t *p_data)
635{
636 DTQCB *p_dtqcb;
637 WINFO_RDTQ winfo_rdtq;
638 ER ercd;
639
640 LOG_RCV_DTQ_ENTER(dtqid, p_data);
641 CHECK_DISPATCH();
642 CHECK_ID(VALID_DTQID(dtqid));
643 p_dtqcb = get_dtqcb(dtqid);
644
645 lock_cpu_dsp();
646 if (p_dtqcb->p_dtqinib->dtqatr == TA_NOEXS) {
647 ercd = E_NOEXS;
648 }
649 else if (p_runtsk->raster) {
650 ercd = E_RASTER;
651 }
652 else if (receive_data(p_dtqcb, p_data)) {
653 if (p_runtsk != p_schedtsk) {
654 dispatch();
655 }
656 ercd = E_OK;
657 }
658 else {
659 p_runtsk->tstat = TS_WAITING_RDTQ;
660 make_wait(&(winfo_rdtq.winfo));
661 queue_insert_prev(&(p_dtqcb->rwait_queue), &(p_runtsk->task_queue));
662 winfo_rdtq.p_dtqcb = p_dtqcb;
663 LOG_TSKSTAT(p_runtsk);
664 dispatch();
665 ercd = winfo_rdtq.winfo.wercd;
666 if (ercd == E_OK) {
667 *p_data = winfo_rdtq.data;
668 }
669 }
670 unlock_cpu_dsp();
671
672 error_exit:
673 LOG_RCV_DTQ_LEAVE(ercd, p_data);
674 return(ercd);
675}
676
677#endif /* TOPPERS_rcv_dtq */
678
679/*
680 * データキューからの受信(ポーリング)
681 */
682#ifdef TOPPERS_prcv_dtq
683
684ER
685prcv_dtq(ID dtqid, intptr_t *p_data)
686{
687 DTQCB *p_dtqcb;
688 ER ercd;
689
690 LOG_PRCV_DTQ_ENTER(dtqid, p_data);
691 CHECK_TSKCTX_UNL();
692 CHECK_ID(VALID_DTQID(dtqid));
693 p_dtqcb = get_dtqcb(dtqid);
694
695 lock_cpu();
696 if (p_dtqcb->p_dtqinib->dtqatr == TA_NOEXS) {
697 ercd = E_NOEXS;
698 }
699 else if (receive_data(p_dtqcb, p_data)) {
700 if (p_runtsk != p_schedtsk) {
701 dispatch();
702 }
703 ercd = E_OK;
704 }
705 else {
706 ercd = E_TMOUT;
707 }
708 unlock_cpu();
709
710 error_exit:
711 LOG_PRCV_DTQ_LEAVE(ercd, p_data);
712 return(ercd);
713}
714
715#endif /* TOPPERS_prcv_dtq */
716
717/*
718 * データキューからの受信(タイムアウトあり)
719 */
720#ifdef TOPPERS_trcv_dtq
721
722ER
723trcv_dtq(ID dtqid, intptr_t *p_data, TMO tmout)
724{
725 DTQCB *p_dtqcb;
726 WINFO_RDTQ winfo_rdtq;
727 TMEVTB tmevtb;
728 ER ercd;
729
730 LOG_TRCV_DTQ_ENTER(dtqid, p_data, tmout);
731 CHECK_DISPATCH();
732 CHECK_ID(VALID_DTQID(dtqid));
733 CHECK_PAR(VALID_TMOUT(tmout));
734 p_dtqcb = get_dtqcb(dtqid);
735
736 lock_cpu_dsp();
737 if (p_dtqcb->p_dtqinib->dtqatr == TA_NOEXS) {
738 ercd = E_NOEXS;
739 }
740 else if (p_runtsk->raster) {
741 ercd = E_RASTER;
742 }
743 else if (receive_data(p_dtqcb, p_data)) {
744 if (p_runtsk != p_schedtsk) {
745 dispatch();
746 }
747 ercd = E_OK;
748 }
749 else if (tmout == TMO_POL) {
750 ercd = E_TMOUT;
751 }
752 else {
753 p_runtsk->tstat = TS_WAITING_RDTQ;
754 make_wait_tmout(&(winfo_rdtq.winfo), &tmevtb, tmout);
755 queue_insert_prev(&(p_dtqcb->rwait_queue), &(p_runtsk->task_queue));
756 winfo_rdtq.p_dtqcb = p_dtqcb;
757 LOG_TSKSTAT(p_runtsk);
758 dispatch();
759 ercd = winfo_rdtq.winfo.wercd;
760 if (ercd == E_OK) {
761 *p_data = winfo_rdtq.data;
762 }
763 }
764 unlock_cpu_dsp();
765
766 error_exit:
767 LOG_TRCV_DTQ_LEAVE(ercd, p_data);
768 return(ercd);
769}
770
771#endif /* TOPPERS_trcv_dtq */
772
773/*
774 * データキューの再初期化
775 */
776#ifdef TOPPERS_ini_dtq
777
778ER
779ini_dtq(ID dtqid)
780{
781 DTQCB *p_dtqcb;
782 ER ercd;
783
784 LOG_INI_DTQ_ENTER(dtqid);
785 CHECK_TSKCTX_UNL();
786 CHECK_ID(VALID_DTQID(dtqid));
787 p_dtqcb = get_dtqcb(dtqid);
788
789 lock_cpu();
790 if (p_dtqcb->p_dtqinib->dtqatr == TA_NOEXS) {
791 ercd = E_NOEXS;
792 }
793 else {
794 init_wait_queue(&(p_dtqcb->swait_queue));
795 init_wait_queue(&(p_dtqcb->rwait_queue));
796 p_dtqcb->count = 0U;
797 p_dtqcb->head = 0U;
798 p_dtqcb->tail = 0U;
799 if (p_runtsk != p_schedtsk) {
800 dispatch();
801 }
802 ercd = E_OK;
803 }
804 unlock_cpu();
805
806 error_exit:
807 LOG_INI_DTQ_LEAVE(ercd);
808 return(ercd);
809}
810
811#endif /* TOPPERS_ini_dtq */
812
813/*
814 * データキューの状態参照
815 */
816#ifdef TOPPERS_ref_dtq
817
818ER
819ref_dtq(ID dtqid, T_RDTQ *pk_rdtq)
820{
821 DTQCB *p_dtqcb;
822 ER ercd;
823
824 LOG_REF_DTQ_ENTER(dtqid, pk_rdtq);
825 CHECK_TSKCTX_UNL();
826 CHECK_ID(VALID_DTQID(dtqid));
827 p_dtqcb = get_dtqcb(dtqid);
828
829 lock_cpu();
830 if (p_dtqcb->p_dtqinib->dtqatr == TA_NOEXS) {
831 ercd = E_NOEXS;
832 }
833 else {
834 pk_rdtq->stskid = wait_tskid(&(p_dtqcb->swait_queue));
835 pk_rdtq->rtskid = wait_tskid(&(p_dtqcb->rwait_queue));
836 pk_rdtq->sdtqcnt = p_dtqcb->count;
837 ercd = E_OK;
838 }
839 unlock_cpu();
840
841 error_exit:
842 LOG_REF_DTQ_LEAVE(ercd, pk_rdtq);
843 return(ercd);
844}
845
846#endif /* TOPPERS_ref_dtq */
Note: See TracBrowser for help on using the repository browser.