source: azure_iot_hub_mbedtls/trunk/asp3_dcre/kernel/pridataq.c@ 398

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

mbedTLS版Azure IoT Hub接続サンプルのソースコードを追加

  • 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-2016 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_RSATR(pdqatr, TA_TPRI);
338 CHECK_PAR(VALID_DPRI(maxdpri));
339
340 lock_cpu();
341 if (tnum_pdq == 0 || queue_empty(&free_pdqcb)) {
342 ercd = E_NOID;
343 }
344 else {
345 if (pdqcnt != 0 && p_pdqmb == NULL) {
346 p_pdqmb = kernel_malloc(sizeof(PDQMB) * pdqcnt);
347 pdqatr |= TA_MBALLOC;
348 }
349 if (pdqcnt != 0 && p_pdqmb == NULL) {
350 ercd = E_NOMEM;
351 }
352 else {
353 p_pdqcb = ((PDQCB *) queue_delete_next(&free_pdqcb));
354 p_pdqinib = (PDQINIB *)(p_pdqcb->p_pdqinib);
355 p_pdqinib->pdqatr = pdqatr;
356 p_pdqinib->pdqcnt = pdqcnt;
357 p_pdqinib->maxdpri = maxdpri;
358 p_pdqinib->p_pdqmb = p_pdqmb;
359
360 queue_initialize(&(p_pdqcb->swait_queue));
361 queue_initialize(&(p_pdqcb->rwait_queue));
362 p_pdqcb->count = 0U;
363 p_pdqcb->p_head = NULL;
364 p_pdqcb->unused = 0U;
365 p_pdqcb->p_freelist = NULL;
366 ercd = PDQID(p_pdqcb);
367 }
368 }
369 unlock_cpu();
370
371 error_exit:
372 LOG_ACRE_PDQ_LEAVE(ercd);
373 return(ercd);
374}
375
376#endif /* TOPPERS_acre_pdq */
377
378/*
379 * 優先度データキューの削除
380 */
381#ifdef TOPPERS_del_pdq
382
383ER
384del_pdq(ID pdqid)
385{
386 PDQCB *p_pdqcb;
387 PDQINIB *p_pdqinib;
388 ER ercd;
389
390 LOG_DEL_PDQ_ENTER(pdqid);
391 CHECK_TSKCTX_UNL();
392 CHECK_ID(VALID_PDQID(pdqid));
393 p_pdqcb = get_pdqcb(pdqid);
394
395 lock_cpu();
396 if (p_pdqcb->p_pdqinib->pdqatr == TA_NOEXS) {
397 ercd = E_NOEXS;
398 }
399 else if (pdqid <= tmax_spdqid) {
400 ercd = E_OBJ;
401 }
402 else {
403 init_wait_queue(&(p_pdqcb->swait_queue));
404 init_wait_queue(&(p_pdqcb->rwait_queue));
405 p_pdqinib = (PDQINIB *)(p_pdqcb->p_pdqinib);
406 if ((p_pdqinib->pdqatr & TA_MBALLOC) != 0U) {
407 kernel_free(p_pdqinib->p_pdqmb);
408 }
409 p_pdqinib->pdqatr = TA_NOEXS;
410 queue_insert_prev(&free_pdqcb, &(p_pdqcb->swait_queue));
411 if (p_runtsk != p_schedtsk) {
412 dispatch();
413 }
414 ercd = E_OK;
415 }
416 unlock_cpu();
417
418 error_exit:
419 LOG_DEL_PDQ_LEAVE(ercd);
420 return(ercd);
421}
422
423#endif /* TOPPERS_del_pdq */
424
425/*
426 * 優先度データキューへの送信
427 */
428#ifdef TOPPERS_snd_pdq
429
430ER
431snd_pdq(ID pdqid, intptr_t data, PRI datapri)
432{
433 PDQCB *p_pdqcb;
434 WINFO_SPDQ winfo_spdq;
435 ER ercd;
436
437 LOG_SND_PDQ_ENTER(pdqid, data, datapri);
438 CHECK_DISPATCH();
439 CHECK_ID(VALID_PDQID(pdqid));
440 p_pdqcb = get_pdqcb(pdqid);
441 CHECK_PAR(TMIN_DPRI <= datapri);
442
443 lock_cpu_dsp();
444 if (p_pdqcb->p_pdqinib->pdqatr == TA_NOEXS) {
445 ercd = E_NOEXS;
446 }
447 else if (datapri > p_pdqcb->p_pdqinib->maxdpri) {
448 ercd = E_PAR;
449 }
450 else if (p_runtsk->raster) {
451 ercd = E_RASTER;
452 }
453 else if (send_pridata(p_pdqcb, data, datapri)) {
454 if (p_runtsk != p_schedtsk) {
455 dispatch();
456 }
457 ercd = E_OK;
458 }
459 else {
460 winfo_spdq.data = data;
461 winfo_spdq.datapri = datapri;
462 p_runtsk->tstat = TS_WAITING_SPDQ;
463 wobj_make_wait((WOBJCB *) p_pdqcb, (WINFO_WOBJ *) &winfo_spdq);
464 dispatch();
465 ercd = winfo_spdq.winfo.wercd;
466 }
467 unlock_cpu_dsp();
468
469 error_exit:
470 LOG_SND_PDQ_LEAVE(ercd);
471 return(ercd);
472}
473
474#endif /* TOPPERS_snd_pdq */
475
476/*
477 * 優先度データキューへの送信(ポーリング)
478 */
479#ifdef TOPPERS_psnd_pdq
480
481ER
482psnd_pdq(ID pdqid, intptr_t data, PRI datapri)
483{
484 PDQCB *p_pdqcb;
485 ER ercd;
486
487 LOG_PSND_PDQ_ENTER(pdqid, data, datapri);
488 CHECK_UNL();
489 CHECK_ID(VALID_PDQID(pdqid));
490 p_pdqcb = get_pdqcb(pdqid);
491 CHECK_PAR(TMIN_DPRI <= datapri);
492
493 lock_cpu();
494 if (p_pdqcb->p_pdqinib->pdqatr == TA_NOEXS) {
495 ercd = E_NOEXS;
496 }
497 else if (datapri > p_pdqcb->p_pdqinib->maxdpri) {
498 ercd = E_PAR;
499 }
500 else if (send_pridata(p_pdqcb, data, datapri)) {
501 if (p_runtsk != p_schedtsk) {
502 if (!sense_context()) {
503 dispatch();
504 }
505 else {
506 request_dispatch();
507 }
508 }
509 ercd = E_OK;
510 }
511 else {
512 ercd = E_TMOUT;
513 }
514 unlock_cpu();
515
516 error_exit:
517 LOG_PSND_PDQ_LEAVE(ercd);
518 return(ercd);
519}
520
521#endif /* TOPPERS_psnd_pdq */
522
523/*
524 * 優先度データキューへの送信(タイムアウトあり)
525 */
526#ifdef TOPPERS_tsnd_pdq
527
528ER
529tsnd_pdq(ID pdqid, intptr_t data, PRI datapri, TMO tmout)
530{
531 PDQCB *p_pdqcb;
532 WINFO_SPDQ winfo_spdq;
533 TMEVTB tmevtb;
534 ER ercd;
535
536 LOG_TSND_PDQ_ENTER(pdqid, data, datapri, tmout);
537 CHECK_DISPATCH();
538 CHECK_ID(VALID_PDQID(pdqid));
539 CHECK_PAR(VALID_TMOUT(tmout));
540 p_pdqcb = get_pdqcb(pdqid);
541 CHECK_PAR(TMIN_DPRI <= datapri);
542
543 lock_cpu_dsp();
544 if (p_pdqcb->p_pdqinib->pdqatr == TA_NOEXS) {
545 ercd = E_NOEXS;
546 }
547 else if (datapri > p_pdqcb->p_pdqinib->maxdpri) {
548 ercd = E_PAR;
549 }
550 else if (p_runtsk->raster) {
551 ercd = E_RASTER;
552 }
553 else if (send_pridata(p_pdqcb, data, datapri)) {
554 if (p_runtsk != p_schedtsk) {
555 dispatch();
556 }
557 ercd = E_OK;
558 }
559 else if (tmout == TMO_POL) {
560 ercd = E_TMOUT;
561 }
562 else {
563 winfo_spdq.data = data;
564 winfo_spdq.datapri = datapri;
565 p_runtsk->tstat = TS_WAITING_SPDQ;
566 wobj_make_wait_tmout((WOBJCB *) p_pdqcb, (WINFO_WOBJ *) &winfo_spdq,
567 &tmevtb, tmout);
568 dispatch();
569 ercd = winfo_spdq.winfo.wercd;
570 }
571 unlock_cpu_dsp();
572
573 error_exit:
574 LOG_TSND_PDQ_LEAVE(ercd);
575 return(ercd);
576}
577
578#endif /* TOPPERS_tsnd_pdq */
579
580/*
581 * 優先度データキューからの受信
582 */
583#ifdef TOPPERS_rcv_pdq
584
585ER
586rcv_pdq(ID pdqid, intptr_t *p_data, PRI *p_datapri)
587{
588 PDQCB *p_pdqcb;
589 WINFO_RPDQ winfo_rpdq;
590 ER ercd;
591
592 LOG_RCV_PDQ_ENTER(pdqid, p_data, p_datapri);
593 CHECK_DISPATCH();
594 CHECK_ID(VALID_PDQID(pdqid));
595 p_pdqcb = get_pdqcb(pdqid);
596
597 lock_cpu_dsp();
598 if (p_pdqcb->p_pdqinib->pdqatr == TA_NOEXS) {
599 ercd = E_NOEXS;
600 }
601 else if (p_runtsk->raster) {
602 ercd = E_RASTER;
603 }
604 else if (receive_pridata(p_pdqcb, p_data, p_datapri)) {
605 if (p_runtsk != p_schedtsk) {
606 dispatch();
607 }
608 ercd = E_OK;
609 }
610 else {
611 p_runtsk->tstat = TS_WAITING_RPDQ;
612 make_wait(&(winfo_rpdq.winfo));
613 queue_insert_prev(&(p_pdqcb->rwait_queue), &(p_runtsk->task_queue));
614 winfo_rpdq.p_pdqcb = p_pdqcb;
615 LOG_TSKSTAT(p_runtsk);
616 dispatch();
617 ercd = winfo_rpdq.winfo.wercd;
618 if (ercd == E_OK) {
619 *p_data = winfo_rpdq.data;
620 *p_datapri = winfo_rpdq.datapri;
621 }
622 }
623 unlock_cpu_dsp();
624
625 error_exit:
626 LOG_RCV_PDQ_LEAVE(ercd, p_data, p_datapri);
627 return(ercd);
628}
629
630#endif /* TOPPERS_rcv_pdq */
631
632/*
633 * 優先度データキューからの受信(ポーリング)
634 */
635#ifdef TOPPERS_prcv_pdq
636
637ER
638prcv_pdq(ID pdqid, intptr_t *p_data, PRI *p_datapri)
639{
640 PDQCB *p_pdqcb;
641 ER ercd;
642
643 LOG_PRCV_PDQ_ENTER(pdqid, p_data, p_datapri);
644 CHECK_TSKCTX_UNL();
645 CHECK_ID(VALID_PDQID(pdqid));
646 p_pdqcb = get_pdqcb(pdqid);
647
648 lock_cpu();
649 if (p_pdqcb->p_pdqinib->pdqatr == TA_NOEXS) {
650 ercd = E_NOEXS;
651 }
652 else if (receive_pridata(p_pdqcb, p_data, p_datapri)) {
653 if (p_runtsk != p_schedtsk) {
654 dispatch();
655 }
656 ercd = E_OK;
657 }
658 else {
659 ercd = E_TMOUT;
660 }
661 unlock_cpu();
662
663 error_exit:
664 LOG_PRCV_PDQ_LEAVE(ercd, p_data, p_datapri);
665 return(ercd);
666}
667
668#endif /* TOPPERS_prcv_pdq */
669
670/*
671 * 優先度データキューからの受信(タイムアウトあり)
672 */
673#ifdef TOPPERS_trcv_pdq
674
675ER
676trcv_pdq(ID pdqid, intptr_t *p_data, PRI *p_datapri, TMO tmout)
677{
678 PDQCB *p_pdqcb;
679 WINFO_RPDQ winfo_rpdq;
680 TMEVTB tmevtb;
681 ER ercd;
682
683 LOG_TRCV_PDQ_ENTER(pdqid, p_data, p_datapri, tmout);
684 CHECK_DISPATCH();
685 CHECK_ID(VALID_PDQID(pdqid));
686 CHECK_PAR(VALID_TMOUT(tmout));
687 p_pdqcb = get_pdqcb(pdqid);
688
689 lock_cpu_dsp();
690 if (p_pdqcb->p_pdqinib->pdqatr == TA_NOEXS) {
691 ercd = E_NOEXS;
692 }
693 else if (p_runtsk->raster) {
694 ercd = E_RASTER;
695 }
696 else if (receive_pridata(p_pdqcb, p_data, p_datapri)) {
697 if (p_runtsk != p_schedtsk) {
698 dispatch();
699 }
700 ercd = E_OK;
701 }
702 else if (tmout == TMO_POL) {
703 ercd = E_TMOUT;
704 }
705 else {
706 p_runtsk->tstat = TS_WAITING_RPDQ;
707 make_wait_tmout(&(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.