source: rtos_arduino/trunk/asp_1.9.2/kernel/dataqueue.c@ 136

Last change on this file since 136 was 136, checked in by ertl-honda, 8 years ago

ライブラリとOS及びベーシックなサンプルの追加.

File size: 15.7 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-2013 by Embedded and Real-Time Systems Laboratory
9 * Graduate School of Information Science, Nagoya Univ., JAPAN
10 *
11 * 上記著作権者
12は,以下の(1)~(4)の条件を満たす場合に限り,本ソフトウェ
13 * ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
14 * 変・再é…
15å¸ƒï¼ˆä»¥ä¸‹ï¼Œåˆ©ç”¨ã¨å‘¼ã¶ï¼‰ã™ã‚‹ã“とを無償で許諾する.
16 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
17 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
18 * スコード中に含まれていること.
19 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
20 * 用できる形で再é…
21å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œå†é…
22å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨
23 * 者
24マニュアルなど)に,上記の著作権表示,この利用条件および下記
25 * の無保証規定を掲載すること.
26 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
27 * 用できない形で再é…
28å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œæ¬¡ã®ã„ずれかの条件を満たすこ
29 * と.
30 * (a) 再é…
31å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨è€…
32マニュアルなど)に,上記の著
33 * 作権表示,この利用条件および下記の無保証規定を掲載すること.
34 * (b) 再é…
35å¸ƒã®å½¢æ…
36‹ã‚’,別に定める方法によって,TOPPERSプロジェクトに
37 * 報告すること.
38 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
39 * 害からも,上記著作権者
40およびTOPPERSプロジェクトをå…
41è²¬ã™ã‚‹ã“と.
42 * また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
43 * 由に基づく請求からも,上記著作権者
44およびTOPPERSプロジェクトを
45 * å…
46è²¬ã™ã‚‹ã“と.
47 *
48 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者
49お
50 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
51 * に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
52 * アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
53 * の責任を負わない.
54 *
55 * @(#) $Id: dataqueue.c 2629 2014-04-13 09:38:28Z ertl-hiro $
56 */
57
58/*
59 * データキュー機能
60 */
61
62#include "kernel_impl.h"
63#include "check.h"
64#include "task.h"
65#include "wait.h"
66#include "dataqueue.h"
67
68/*
69 * トレースログマクロのデフォルト定義
70 */
71#ifndef LOG_SND_DTQ_ENTER
72#define LOG_SND_DTQ_ENTER(dtqid, data)
73#endif /* LOG_SND_DTQ_ENTER */
74
75#ifndef LOG_SND_DTQ_LEAVE
76#define LOG_SND_DTQ_LEAVE(ercd)
77#endif /* LOG_SND_DTQ_LEAVE */
78
79#ifndef LOG_PSND_DTQ_ENTER
80#define LOG_PSND_DTQ_ENTER(dtqid, data)
81#endif /* LOG_PSND_DTQ_ENTER */
82
83#ifndef LOG_PSND_DTQ_LEAVE
84#define LOG_PSND_DTQ_LEAVE(ercd)
85#endif /* LOG_PSND_DTQ_LEAVE */
86
87#ifndef LOG_IPSND_DTQ_ENTER
88#define LOG_IPSND_DTQ_ENTER(dtqid, data)
89#endif /* LOG_IPSND_DTQ_ENTER */
90
91#ifndef LOG_IPSND_DTQ_LEAVE
92#define LOG_IPSND_DTQ_LEAVE(ercd)
93#endif /* LOG_IPSND_DTQ_LEAVE */
94
95#ifndef LOG_TSND_DTQ_ENTER
96#define LOG_TSND_DTQ_ENTER(dtqid, data, tmout)
97#endif /* LOG_TSND_DTQ_ENTER */
98
99#ifndef LOG_TSND_DTQ_LEAVE
100#define LOG_TSND_DTQ_LEAVE(ercd)
101#endif /* LOG_TSND_DTQ_LEAVE */
102
103#ifndef LOG_FSND_DTQ_ENTER
104#define LOG_FSND_DTQ_ENTER(dtqid, data)
105#endif /* LOG_FSND_DTQ_ENTER */
106
107#ifndef LOG_FSND_DTQ_LEAVE
108#define LOG_FSND_DTQ_LEAVE(ercd)
109#endif /* LOG_FSND_DTQ_LEAVE */
110
111#ifndef LOG_IFSND_DTQ_ENTER
112#define LOG_IFSND_DTQ_ENTER(dtqid, data)
113#endif /* LOG_IFSND_DTQ_ENTER */
114
115#ifndef LOG_IFSND_DTQ_LEAVE
116#define LOG_IFSND_DTQ_LEAVE(ercd)
117#endif /* LOG_IFSND_DTQ_LEAVE */
118
119#ifndef LOG_RCV_DTQ_ENTER
120#define LOG_RCV_DTQ_ENTER(dtqid, p_data)
121#endif /* LOG_RCV_DTQ_ENTER */
122
123#ifndef LOG_RCV_DTQ_LEAVE
124#define LOG_RCV_DTQ_LEAVE(ercd, data)
125#endif /* LOG_RCV_DTQ_LEAVE */
126
127#ifndef LOG_PRCV_DTQ_ENTER
128#define LOG_PRCV_DTQ_ENTER(dtqid, p_data)
129#endif /* LOG_PRCV_DTQ_ENTER */
130
131#ifndef LOG_PRCV_DTQ_LEAVE
132#define LOG_PRCV_DTQ_LEAVE(ercd, data)
133#endif /* LOG_PRCV_DTQ_LEAVE */
134
135#ifndef LOG_TRCV_DTQ_ENTER
136#define LOG_TRCV_DTQ_ENTER(dtqid, p_data, tmout)
137#endif /* LOG_TRCV_DTQ_ENTER */
138
139#ifndef LOG_TRCV_DTQ_LEAVE
140#define LOG_TRCV_DTQ_LEAVE(ercd, data)
141#endif /* LOG_TRCV_DTQ_LEAVE */
142
143#ifndef LOG_INI_DTQ_ENTER
144#define LOG_INI_DTQ_ENTER(dtqid)
145#endif /* LOG_INI_DTQ_ENTER */
146
147#ifndef LOG_INI_DTQ_LEAVE
148#define LOG_INI_DTQ_LEAVE(ercd)
149#endif /* LOG_INI_DTQ_LEAVE */
150
151#ifndef LOG_REF_DTQ_ENTER
152#define LOG_REF_DTQ_ENTER(dtqid, pk_rdtq)
153#endif /* LOG_REF_DTQ_ENTER */
154
155#ifndef LOG_REF_DTQ_LEAVE
156#define LOG_REF_DTQ_LEAVE(ercd, pk_rdtq)
157#endif /* LOG_REF_DTQ_LEAVE */
158
159/*
160 * データキューの数
161 */
162#define tnum_dtq ((uint_t)(tmax_dtqid - TMIN_DTQID + 1))
163
164/*
165 * データキューIDからデータキュー管理ブロックを取り出すためのマクロ
166 */
167#define INDEX_DTQ(dtqid) ((uint_t)((dtqid) - TMIN_DTQID))
168#define get_dtqcb(dtqid) (&(dtqcb_table[INDEX_DTQ(dtqid)]))
169
170/*
171 * データキュー機能の初期化
172 */
173#ifdef TOPPERS_dtqini
174
175void
176initialize_dataqueue(void)
177{
178 uint_t i;
179 DTQCB *p_dtqcb;
180
181 for (i = 0; i < tnum_dtq; i++) {
182 p_dtqcb = &(dtqcb_table[i]);
183 queue_initialize(&(p_dtqcb->swait_queue));
184 p_dtqcb->p_dtqinib = &(dtqinib_table[i]);
185 queue_initialize(&(p_dtqcb->rwait_queue));
186 p_dtqcb->count = 0U;
187 p_dtqcb->head = 0U;
188 p_dtqcb->tail = 0U;
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, bool_t *p_dspreq)
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_DTQ *)(p_tcb->p_winfo))->data = data;
266 *p_dspreq = 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 *p_dspreq = false;
272 return(true);
273 }
274 else {
275 return(false);
276 }
277}
278
279#endif /* TOPPERS_dtqsnd */
280
281/*
282 * データキューへのデータ強制送信
283 */
284#ifdef TOPPERS_dtqfsnd
285
286bool_t
287force_send_data(DTQCB *p_dtqcb, intptr_t data)
288{
289 TCB *p_tcb;
290
291 if (!queue_empty(&(p_dtqcb->rwait_queue))) {
292 p_tcb = (TCB *) queue_delete_next(&(p_dtqcb->rwait_queue));
293 ((WINFO_DTQ *)(p_tcb->p_winfo))->data = data;
294 return(wait_complete(p_tcb));
295 }
296 else {
297 force_enqueue_data(p_dtqcb, data);
298 return(false);
299 }
300}
301
302#endif /* TOPPERS_dtqfsnd */
303
304/*
305 * データキューからのデータ受信
306 */
307#ifdef TOPPERS_dtqrcv
308
309bool_t
310receive_data(DTQCB *p_dtqcb, intptr_t *p_data, bool_t *p_dspreq)
311{
312 TCB *p_tcb;
313 intptr_t data;
314
315 if (p_dtqcb->count > 0U) {
316 dequeue_data(p_dtqcb, p_data);
317 if (!queue_empty(&(p_dtqcb->swait_queue))) {
318 p_tcb = (TCB *) queue_delete_next(&(p_dtqcb->swait_queue));
319 data = ((WINFO_DTQ *)(p_tcb->p_winfo))->data;
320 enqueue_data(p_dtqcb, data);
321 *p_dspreq = wait_complete(p_tcb);
322 }
323 else {
324 *p_dspreq = false;
325 }
326 return(true);
327 }
328 else if (!queue_empty(&(p_dtqcb->swait_queue))) {
329 p_tcb = (TCB *) queue_delete_next(&(p_dtqcb->swait_queue));
330 *p_data = ((WINFO_DTQ *)(p_tcb->p_winfo))->data;
331 *p_dspreq = wait_complete(p_tcb);
332 return(true);
333 }
334 else {
335 return(false);
336 }
337}
338
339#endif /* TOPPERS_dtqrcv */
340
341/*
342 * データキューへの送信
343 */
344#ifdef TOPPERS_snd_dtq
345
346ER
347snd_dtq(ID dtqid, intptr_t data)
348{
349 DTQCB *p_dtqcb;
350 WINFO_DTQ winfo_dtq;
351 bool_t dspreq;
352 ER ercd;
353
354 LOG_SND_DTQ_ENTER(dtqid, data);
355 CHECK_DISPATCH();
356 CHECK_DTQID(dtqid);
357 p_dtqcb = get_dtqcb(dtqid);
358
359 t_lock_cpu();
360 if (send_data(p_dtqcb, data, &dspreq)) {
361 if (dspreq) {
362 dispatch();
363 }
364 ercd = E_OK;
365 }
366 else {
367 winfo_dtq.data = data;
368 p_runtsk->tstat = (TS_WAITING | TS_WAIT_SDTQ);
369 wobj_make_wait((WOBJCB *) p_dtqcb, (WINFO_WOBJ *) &winfo_dtq);
370 dispatch();
371 ercd = winfo_dtq.winfo.wercd;
372 }
373 t_unlock_cpu();
374
375 error_exit:
376 LOG_SND_DTQ_LEAVE(ercd);
377 return(ercd);
378}
379
380#endif /* TOPPERS_snd_dtq */
381
382/*
383 * データキューへの送信(ポーリング)
384 */
385#ifdef TOPPERS_psnd_dtq
386
387ER
388psnd_dtq(ID dtqid, intptr_t data)
389{
390 DTQCB *p_dtqcb;
391 bool_t dspreq;
392 ER ercd;
393
394 LOG_PSND_DTQ_ENTER(dtqid, data);
395 CHECK_TSKCTX_UNL();
396 CHECK_DTQID(dtqid);
397 p_dtqcb = get_dtqcb(dtqid);
398
399 t_lock_cpu();
400 if (send_data(p_dtqcb, data, &dspreq)) {
401 if (dspreq) {
402 dispatch();
403 }
404 ercd = E_OK;
405 }
406 else {
407 ercd = E_TMOUT;
408 }
409 t_unlock_cpu();
410
411 error_exit:
412 LOG_PSND_DTQ_LEAVE(ercd);
413 return(ercd);
414}
415
416#endif /* TOPPERS_psnd_dtq */
417
418/*
419 * データキューへの送信(ポーリング,非タスクコンテキスト用)
420 */
421#ifdef TOPPERS_ipsnd_dtq
422
423ER
424ipsnd_dtq(ID dtqid, intptr_t data)
425{
426 DTQCB *p_dtqcb;
427 bool_t dspreq;
428 ER ercd;
429
430 LOG_IPSND_DTQ_ENTER(dtqid, data);
431 CHECK_INTCTX_UNL();
432 CHECK_DTQID(dtqid);
433 p_dtqcb = get_dtqcb(dtqid);
434
435 i_lock_cpu();
436 if (send_data(p_dtqcb, data, &dspreq)) {
437 if (dspreq) {
438 reqflg = true;
439 }
440 ercd = E_OK;
441 }
442 else {
443 ercd = E_TMOUT;
444 }
445 i_unlock_cpu();
446
447 error_exit:
448 LOG_IPSND_DTQ_LEAVE(ercd);
449 return(ercd);
450}
451
452#endif /* TOPPERS_ipsnd_dtq */
453
454/*
455 * データキューへの送信(タイムアウトあり)
456 */
457#ifdef TOPPERS_tsnd_dtq
458
459ER
460tsnd_dtq(ID dtqid, intptr_t data, TMO tmout)
461{
462 DTQCB *p_dtqcb;
463 WINFO_DTQ winfo_dtq;
464 TMEVTB tmevtb;
465 bool_t dspreq;
466 ER ercd;
467
468 LOG_TSND_DTQ_ENTER(dtqid, data, tmout);
469 CHECK_DISPATCH();
470 CHECK_DTQID(dtqid);
471 CHECK_TMOUT(tmout);
472 p_dtqcb = get_dtqcb(dtqid);
473
474 t_lock_cpu();
475 if (send_data(p_dtqcb, data, &dspreq)) {
476 if (dspreq) {
477 dispatch();
478 }
479 ercd = E_OK;
480 }
481 else if (tmout == TMO_POL) {
482 ercd = E_TMOUT;
483 }
484 else {
485 winfo_dtq.data = data;
486 p_runtsk->tstat = (TS_WAITING | TS_WAIT_SDTQ);
487 wobj_make_wait_tmout((WOBJCB *) p_dtqcb, (WINFO_WOBJ *) &winfo_dtq,
488 &tmevtb, tmout);
489 dispatch();
490 ercd = winfo_dtq.winfo.wercd;
491 }
492 t_unlock_cpu();
493
494 error_exit:
495 LOG_TSND_DTQ_LEAVE(ercd);
496 return(ercd);
497}
498
499#endif /* TOPPERS_tsnd_dtq */
500
501/*
502 * データキューへの強制送信
503 */
504#ifdef TOPPERS_fsnd_dtq
505
506ER
507fsnd_dtq(ID dtqid, intptr_t data)
508{
509 DTQCB *p_dtqcb;
510 ER ercd;
511
512 LOG_FSND_DTQ_ENTER(dtqid, data);
513 CHECK_TSKCTX_UNL();
514 CHECK_DTQID(dtqid);
515 p_dtqcb = get_dtqcb(dtqid);
516 CHECK_ILUSE(p_dtqcb->p_dtqinib->dtqcnt > 0U);
517
518 t_lock_cpu();
519 if (force_send_data(p_dtqcb, data)) {
520 dispatch();
521 }
522 ercd = E_OK;
523 t_unlock_cpu();
524
525 error_exit:
526 LOG_FSND_DTQ_LEAVE(ercd);
527 return(ercd);
528}
529
530#endif /* TOPPERS_fsnd_dtq */
531
532/*
533 * データキューへの強制送信(非タスクコンテキスト用)
534 */
535#ifdef TOPPERS_ifsnd_dtq
536
537ER
538ifsnd_dtq(ID dtqid, intptr_t data)
539{
540 DTQCB *p_dtqcb;
541 ER ercd;
542
543 LOG_IFSND_DTQ_ENTER(dtqid, data);
544 CHECK_INTCTX_UNL();
545 CHECK_DTQID(dtqid);
546 p_dtqcb = get_dtqcb(dtqid);
547 CHECK_ILUSE(p_dtqcb->p_dtqinib->dtqcnt > 0U);
548
549 i_lock_cpu();
550 if (force_send_data(p_dtqcb, data)) {
551 reqflg = true;
552 }
553 ercd = E_OK;
554 i_unlock_cpu();
555
556 error_exit:
557 LOG_IFSND_DTQ_LEAVE(ercd);
558 return(ercd);
559}
560
561#endif /* TOPPERS_ifsnd_dtq */
562
563/*
564 * データキューからの受信
565 */
566#ifdef TOPPERS_rcv_dtq
567
568ER
569rcv_dtq(ID dtqid, intptr_t *p_data)
570{
571 DTQCB *p_dtqcb;
572 WINFO_DTQ winfo_dtq;
573 bool_t dspreq;
574 ER ercd;
575
576 LOG_RCV_DTQ_ENTER(dtqid, p_data);
577 CHECK_DISPATCH();
578 CHECK_DTQID(dtqid);
579 p_dtqcb = get_dtqcb(dtqid);
580
581 t_lock_cpu();
582 if (receive_data(p_dtqcb, p_data, &dspreq)) {
583 if (dspreq) {
584 dispatch();
585 }
586 ercd = E_OK;
587 }
588 else {
589 p_runtsk->tstat = (TS_WAITING | TS_WAIT_RDTQ);
590 make_wait(&(winfo_dtq.winfo));
591 queue_insert_prev(&(p_dtqcb->rwait_queue), &(p_runtsk->task_queue));
592 winfo_dtq.p_dtqcb = p_dtqcb;
593 LOG_TSKSTAT(p_runtsk);
594 dispatch();
595 ercd = winfo_dtq.winfo.wercd;
596 if (ercd == E_OK) {
597 *p_data = winfo_dtq.data;
598 }
599 }
600 t_unlock_cpu();
601
602 error_exit:
603 LOG_RCV_DTQ_LEAVE(ercd, *p_data);
604 return(ercd);
605}
606
607#endif /* TOPPERS_rcv_dtq */
608
609/*
610 * データキューからの受信(ポーリング)
611 */
612#ifdef TOPPERS_prcv_dtq
613
614ER
615prcv_dtq(ID dtqid, intptr_t *p_data)
616{
617 DTQCB *p_dtqcb;
618 bool_t dspreq;
619 ER ercd;
620
621 LOG_PRCV_DTQ_ENTER(dtqid, p_data);
622 CHECK_TSKCTX_UNL();
623 CHECK_DTQID(dtqid);
624 p_dtqcb = get_dtqcb(dtqid);
625
626 t_lock_cpu();
627 if (receive_data(p_dtqcb, p_data, &dspreq)) {
628 if (dspreq) {
629 dispatch();
630 }
631 ercd = E_OK;
632 }
633 else {
634 ercd = E_TMOUT;
635 }
636 t_unlock_cpu();
637
638 error_exit:
639 LOG_PRCV_DTQ_LEAVE(ercd, *p_data);
640 return(ercd);
641}
642
643#endif /* TOPPERS_prcv_dtq */
644
645/*
646 * データキューからの受信(タイムアウトあり)
647 */
648#ifdef TOPPERS_trcv_dtq
649
650ER
651trcv_dtq(ID dtqid, intptr_t *p_data, TMO tmout)
652{
653 DTQCB *p_dtqcb;
654 WINFO_DTQ winfo_dtq;
655 TMEVTB tmevtb;
656 bool_t dspreq;
657 ER ercd;
658
659 LOG_TRCV_DTQ_ENTER(dtqid, p_data, tmout);
660 CHECK_DISPATCH();
661 CHECK_DTQID(dtqid);
662 CHECK_TMOUT(tmout);
663 p_dtqcb = get_dtqcb(dtqid);
664
665 t_lock_cpu();
666 if (receive_data(p_dtqcb, p_data, &dspreq)) {
667 if (dspreq) {
668 dispatch();
669 }
670 ercd = E_OK;
671 }
672 else if (tmout == TMO_POL) {
673 ercd = E_TMOUT;
674 }
675 else {
676 p_runtsk->tstat = (TS_WAITING | TS_WAIT_RDTQ);
677 make_wait_tmout(&(winfo_dtq.winfo), &tmevtb, tmout);
678 queue_insert_prev(&(p_dtqcb->rwait_queue), &(p_runtsk->task_queue));
679 winfo_dtq.p_dtqcb = p_dtqcb;
680 LOG_TSKSTAT(p_runtsk);
681 dispatch();
682 ercd = winfo_dtq.winfo.wercd;
683 if (ercd == E_OK) {
684 *p_data = winfo_dtq.data;
685 }
686 }
687 t_unlock_cpu();
688
689 error_exit:
690 LOG_TRCV_DTQ_LEAVE(ercd, *p_data);
691 return(ercd);
692}
693
694#endif /* TOPPERS_trcv_dtq */
695
696/*
697 * データキューの再初期化
698 */
699#ifdef TOPPERS_ini_dtq
700
701ER
702ini_dtq(ID dtqid)
703{
704 DTQCB *p_dtqcb;
705 bool_t dspreq;
706 ER ercd;
707
708 LOG_INI_DTQ_ENTER(dtqid);
709 CHECK_TSKCTX_UNL();
710 CHECK_DTQID(dtqid);
711 p_dtqcb = get_dtqcb(dtqid);
712
713 t_lock_cpu();
714 dspreq = init_wait_queue(&(p_dtqcb->swait_queue));
715 if (init_wait_queue(&(p_dtqcb->rwait_queue))) {
716 dspreq = true;
717 }
718 p_dtqcb->count = 0U;
719 p_dtqcb->head = 0U;
720 p_dtqcb->tail = 0U;
721 if (dspreq) {
722 dispatch();
723 }
724 ercd = E_OK;
725 t_unlock_cpu();
726
727 error_exit:
728 LOG_INI_DTQ_LEAVE(ercd);
729 return(ercd);
730}
731
732#endif /* TOPPERS_ini_dtq */
733
734/*
735 * データキューの状æ…
736‹å‚ç…
737§
738 */
739#ifdef TOPPERS_ref_dtq
740
741ER
742ref_dtq(ID dtqid, T_RDTQ *pk_rdtq)
743{
744 DTQCB *p_dtqcb;
745 ER ercd;
746
747 LOG_REF_DTQ_ENTER(dtqid, pk_rdtq);
748 CHECK_TSKCTX_UNL();
749 CHECK_DTQID(dtqid);
750 p_dtqcb = get_dtqcb(dtqid);
751
752 t_lock_cpu();
753 pk_rdtq->stskid = wait_tskid(&(p_dtqcb->swait_queue));
754 pk_rdtq->rtskid = wait_tskid(&(p_dtqcb->rwait_queue));
755 pk_rdtq->sdtqcnt = p_dtqcb->count;
756 ercd = E_OK;
757 t_unlock_cpu();
758
759 error_exit:
760 LOG_REF_DTQ_LEAVE(ercd, pk_rdtq);
761 return(ercd);
762}
763
764#endif /* TOPPERS_ref_dtq */
Note: See TracBrowser for help on using the repository browser.