source: UsbWattMeter/trunk/asp_dcre/kernel/dataqueue.c@ 473

Last change on this file since 473 was 167, checked in by coas-nagasima, 8 years ago

MIMEにSJISを設定

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