source: EcnlProtoTool/trunk/asp3_dcre/kernel/dataqueue.c

Last change on this file 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: 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-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 "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_VALIDATR(dtqatr, TA_TPRI);
359 if (p_dtqmb != NULL) {
360 CHECK_PAR(MB_ALIGN(p_dtqmb));
361 }
362
363 lock_cpu();
364 if (tnum_dtq == 0 || queue_empty(&free_dtqcb)) {
365 ercd = E_NOID;
366 }
367 else {
368 if (dtqcnt != 0 && p_dtqmb == NULL) {
369 p_dtqmb = malloc_mpk(sizeof(DTQMB) * dtqcnt);
370 dtqatr |= TA_MBALLOC;
371 }
372 if (dtqcnt != 0 && p_dtqmb == NULL) {
373 ercd = E_NOMEM;
374 }
375 else {
376 p_dtqcb = ((DTQCB *) queue_delete_next(&free_dtqcb));
377 p_dtqinib = (DTQINIB *)(p_dtqcb->p_dtqinib);
378 p_dtqinib->dtqatr = dtqatr;
379 p_dtqinib->dtqcnt = dtqcnt;
380 p_dtqinib->p_dtqmb = p_dtqmb;
381
382 queue_initialize(&(p_dtqcb->swait_queue));
383 queue_initialize(&(p_dtqcb->rwait_queue));
384 p_dtqcb->count = 0U;
385 p_dtqcb->head = 0U;
386 p_dtqcb->tail = 0U;
387 ercd = DTQID(p_dtqcb);
388 }
389 }
390 unlock_cpu();
391
392 error_exit:
393 LOG_ACRE_DTQ_LEAVE(ercd);
394 return(ercd);
395}
396
397#endif /* TOPPERS_acre_dtq */
398
399/*
400 * データキューの削除
401 */
402#ifdef TOPPERS_del_dtq
403
404ER
405del_dtq(ID dtqid)
406{
407 DTQCB *p_dtqcb;
408 DTQINIB *p_dtqinib;
409 ER ercd;
410
411 LOG_DEL_DTQ_ENTER(dtqid);
412 CHECK_TSKCTX_UNL();
413 CHECK_PAR(VALID_DTQID(dtqid));
414 p_dtqcb = get_dtqcb(dtqid);
415
416 lock_cpu();
417 if (p_dtqcb->p_dtqinib->dtqatr == TA_NOEXS) {
418 ercd = E_NOEXS;
419 }
420 else if (dtqid <= tmax_sdtqid) {
421 ercd = E_OBJ;
422 }
423 else {
424 init_wait_queue(&(p_dtqcb->swait_queue));
425 init_wait_queue(&(p_dtqcb->rwait_queue));
426 p_dtqinib = (DTQINIB *)(p_dtqcb->p_dtqinib);
427 if ((p_dtqinib->dtqatr & TA_MBALLOC) != 0U) {
428 free_mpk(p_dtqinib->p_dtqmb);
429 }
430 p_dtqinib->dtqatr = TA_NOEXS;
431 queue_insert_prev(&free_dtqcb, &(p_dtqcb->swait_queue));
432 if (p_runtsk != p_schedtsk) {
433 dispatch();
434 }
435 ercd = E_OK;
436 }
437 unlock_cpu();
438
439 error_exit:
440 LOG_DEL_DTQ_LEAVE(ercd);
441 return(ercd);
442}
443
444#endif /* TOPPERS_del_dtq */
445
446/*
447 * データキューへの送信
448 */
449#ifdef TOPPERS_snd_dtq
450
451ER
452snd_dtq(ID dtqid, intptr_t data)
453{
454 DTQCB *p_dtqcb;
455 WINFO_SDTQ winfo_sdtq;
456 ER ercd;
457
458 LOG_SND_DTQ_ENTER(dtqid, data);
459 CHECK_DISPATCH();
460 CHECK_ID(VALID_DTQID(dtqid));
461 p_dtqcb = get_dtqcb(dtqid);
462
463 lock_cpu_dsp();
464 if (p_dtqcb->p_dtqinib->dtqatr == TA_NOEXS) {
465 ercd = E_NOEXS;
466 }
467 else if (p_runtsk->raster) {
468 ercd = E_RASTER;
469 }
470 else if (send_data(p_dtqcb, data)) {
471 if (p_runtsk != p_schedtsk) {
472 dispatch();
473 }
474 ercd = E_OK;
475 }
476 else {
477 winfo_sdtq.data = data;
478 wobj_make_wait((WOBJCB *) p_dtqcb, TS_WAITING_SDTQ,
479 (WINFO_WOBJ *) &winfo_sdtq);
480 dispatch();
481 ercd = winfo_sdtq.winfo.wercd;
482 }
483 unlock_cpu_dsp();
484
485 error_exit:
486 LOG_SND_DTQ_LEAVE(ercd);
487 return(ercd);
488}
489
490#endif /* TOPPERS_snd_dtq */
491
492/*
493 * データキューへの送信(ポーリング)
494 */
495#ifdef TOPPERS_psnd_dtq
496
497ER
498psnd_dtq(ID dtqid, intptr_t data)
499{
500 DTQCB *p_dtqcb;
501 ER ercd;
502
503 LOG_PSND_DTQ_ENTER(dtqid, data);
504 CHECK_UNL();
505 CHECK_ID(VALID_DTQID(dtqid));
506 p_dtqcb = get_dtqcb(dtqid);
507
508 lock_cpu();
509 if (p_dtqcb->p_dtqinib->dtqatr == TA_NOEXS) {
510 ercd = E_NOEXS;
511 }
512 else if (send_data(p_dtqcb, data)) {
513 if (p_runtsk != p_schedtsk) {
514 if (!sense_context()) {
515 dispatch();
516 }
517 else {
518 request_dispatch_retint();
519 }
520 }
521 ercd = E_OK;
522 }
523 else {
524 ercd = E_TMOUT;
525 }
526 unlock_cpu();
527
528 error_exit:
529 LOG_PSND_DTQ_LEAVE(ercd);
530 return(ercd);
531}
532
533#endif /* TOPPERS_psnd_dtq */
534
535/*
536 * データキューへの送信(タイムアウトあり)
537 */
538#ifdef TOPPERS_tsnd_dtq
539
540ER
541tsnd_dtq(ID dtqid, intptr_t data, TMO tmout)
542{
543 DTQCB *p_dtqcb;
544 WINFO_SDTQ winfo_sdtq;
545 TMEVTB tmevtb;
546 ER ercd;
547
548 LOG_TSND_DTQ_ENTER(dtqid, data, tmout);
549 CHECK_DISPATCH();
550 CHECK_ID(VALID_DTQID(dtqid));
551 CHECK_PAR(VALID_TMOUT(tmout));
552 p_dtqcb = get_dtqcb(dtqid);
553
554 lock_cpu_dsp();
555 if (p_dtqcb->p_dtqinib->dtqatr == TA_NOEXS) {
556 ercd = E_NOEXS;
557 }
558 else if (p_runtsk->raster) {
559 ercd = E_RASTER;
560 }
561 else if (send_data(p_dtqcb, data)) {
562 if (p_runtsk != p_schedtsk) {
563 dispatch();
564 }
565 ercd = E_OK;
566 }
567 else if (tmout == TMO_POL) {
568 ercd = E_TMOUT;
569 }
570 else {
571 winfo_sdtq.data = data;
572 wobj_make_wait_tmout((WOBJCB *) p_dtqcb, TS_WAITING_SDTQ,
573 (WINFO_WOBJ *) &winfo_sdtq, &tmevtb, tmout);
574 dispatch();
575 ercd = winfo_sdtq.winfo.wercd;
576 }
577 unlock_cpu_dsp();
578
579 error_exit:
580 LOG_TSND_DTQ_LEAVE(ercd);
581 return(ercd);
582}
583
584#endif /* TOPPERS_tsnd_dtq */
585
586/*
587 * データキューへの強制送信
588 */
589#ifdef TOPPERS_fsnd_dtq
590
591ER
592fsnd_dtq(ID dtqid, intptr_t data)
593{
594 DTQCB *p_dtqcb;
595 ER ercd;
596
597 LOG_FSND_DTQ_ENTER(dtqid, data);
598 CHECK_UNL();
599 CHECK_ID(VALID_DTQID(dtqid));
600 p_dtqcb = get_dtqcb(dtqid);
601
602 lock_cpu();
603 if (p_dtqcb->p_dtqinib->dtqatr == TA_NOEXS) {
604 ercd = E_NOEXS;
605 }
606 else if (!(p_dtqcb->p_dtqinib->dtqcnt > 0U)) {
607 ercd = E_ILUSE;
608 }
609 else {
610 force_send_data(p_dtqcb, data);
611 if (p_runtsk != p_schedtsk) {
612 if (!sense_context()) {
613 dispatch();
614 }
615 else {
616 request_dispatch_retint();
617 }
618 }
619 ercd = E_OK;
620 }
621 unlock_cpu();
622
623 error_exit:
624 LOG_FSND_DTQ_LEAVE(ercd);
625 return(ercd);
626}
627
628#endif /* TOPPERS_fsnd_dtq */
629
630/*
631 * データキューからの受信
632 */
633#ifdef TOPPERS_rcv_dtq
634
635ER
636rcv_dtq(ID dtqid, intptr_t *p_data)
637{
638 DTQCB *p_dtqcb;
639 WINFO_RDTQ winfo_rdtq;
640 ER ercd;
641
642 LOG_RCV_DTQ_ENTER(dtqid, p_data);
643 CHECK_DISPATCH();
644 CHECK_ID(VALID_DTQID(dtqid));
645 p_dtqcb = get_dtqcb(dtqid);
646
647 lock_cpu_dsp();
648 if (p_dtqcb->p_dtqinib->dtqatr == TA_NOEXS) {
649 ercd = E_NOEXS;
650 }
651 else if (p_runtsk->raster) {
652 ercd = E_RASTER;
653 }
654 else if (receive_data(p_dtqcb, p_data)) {
655 if (p_runtsk != p_schedtsk) {
656 dispatch();
657 }
658 ercd = E_OK;
659 }
660 else {
661 make_wait(TS_WAITING_RDTQ, &(winfo_rdtq.winfo));
662 queue_insert_prev(&(p_dtqcb->rwait_queue), &(p_runtsk->task_queue));
663 winfo_rdtq.p_dtqcb = p_dtqcb;
664 LOG_TSKSTAT(p_runtsk);
665 dispatch();
666 ercd = winfo_rdtq.winfo.wercd;
667 if (ercd == E_OK) {
668 *p_data = winfo_rdtq.data;
669 }
670 }
671 unlock_cpu_dsp();
672
673 error_exit:
674 LOG_RCV_DTQ_LEAVE(ercd, p_data);
675 return(ercd);
676}
677
678#endif /* TOPPERS_rcv_dtq */
679
680/*
681 * データキューからの受信(ポーリング)
682 */
683#ifdef TOPPERS_prcv_dtq
684
685ER
686prcv_dtq(ID dtqid, intptr_t *p_data)
687{
688 DTQCB *p_dtqcb;
689 ER ercd;
690
691 LOG_PRCV_DTQ_ENTER(dtqid, p_data);
692 CHECK_TSKCTX_UNL();
693 CHECK_ID(VALID_DTQID(dtqid));
694 p_dtqcb = get_dtqcb(dtqid);
695
696 lock_cpu();
697 if (p_dtqcb->p_dtqinib->dtqatr == TA_NOEXS) {
698 ercd = E_NOEXS;
699 }
700 else if (receive_data(p_dtqcb, p_data)) {
701 if (p_runtsk != p_schedtsk) {
702 dispatch();
703 }
704 ercd = E_OK;
705 }
706 else {
707 ercd = E_TMOUT;
708 }
709 unlock_cpu();
710
711 error_exit:
712 LOG_PRCV_DTQ_LEAVE(ercd, p_data);
713 return(ercd);
714}
715
716#endif /* TOPPERS_prcv_dtq */
717
718/*
719 * データキューからの受信(タイムアウトあり)
720 */
721#ifdef TOPPERS_trcv_dtq
722
723ER
724trcv_dtq(ID dtqid, intptr_t *p_data, TMO tmout)
725{
726 DTQCB *p_dtqcb;
727 WINFO_RDTQ winfo_rdtq;
728 TMEVTB tmevtb;
729 ER ercd;
730
731 LOG_TRCV_DTQ_ENTER(dtqid, p_data, tmout);
732 CHECK_DISPATCH();
733 CHECK_ID(VALID_DTQID(dtqid));
734 CHECK_PAR(VALID_TMOUT(tmout));
735 p_dtqcb = get_dtqcb(dtqid);
736
737 lock_cpu_dsp();
738 if (p_dtqcb->p_dtqinib->dtqatr == TA_NOEXS) {
739 ercd = E_NOEXS;
740 }
741 else if (p_runtsk->raster) {
742 ercd = E_RASTER;
743 }
744 else if (receive_data(p_dtqcb, p_data)) {
745 if (p_runtsk != p_schedtsk) {
746 dispatch();
747 }
748 ercd = E_OK;
749 }
750 else if (tmout == TMO_POL) {
751 ercd = E_TMOUT;
752 }
753 else {
754 make_wait_tmout(TS_WAITING_RDTQ, &(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.