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

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

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

File size: 15.2 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: pridataq.c 2515 2013-06-12 11:56:59Z ertl-hiro $
56 */
57
58/*
59 * 優å…
60ˆåº¦ãƒ‡ãƒ¼ã‚¿ã‚­ãƒ¥ãƒ¼æ©Ÿèƒ½
61 */
62
63#include "kernel_impl.h"
64#include "check.h"
65#include "task.h"
66#include "wait.h"
67#include "pridataq.h"
68
69/*
70 * トレースログマクロのデフォルト定義
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_IPSND_PDQ_ENTER
89#define LOG_IPSND_PDQ_ENTER(pdqid, data, datapri)
90#endif /* LOG_IPSND_PDQ_ENTER */
91
92#ifndef LOG_IPSND_PDQ_LEAVE
93#define LOG_IPSND_PDQ_LEAVE(ercd)
94#endif /* LOG_IPSND_PDQ_LEAVE */
95
96#ifndef LOG_TSND_PDQ_ENTER
97#define LOG_TSND_PDQ_ENTER(pdqid, data, datapri, tmout)
98#endif /* LOG_TSND_PDQ_ENTER */
99
100#ifndef LOG_TSND_PDQ_LEAVE
101#define LOG_TSND_PDQ_LEAVE(ercd)
102#endif /* LOG_TSND_PDQ_LEAVE */
103
104#ifndef LOG_RCV_PDQ_ENTER
105#define LOG_RCV_PDQ_ENTER(pdqid, p_data, p_datapri)
106#endif /* LOG_RCV_PDQ_ENTER */
107
108#ifndef LOG_RCV_PDQ_LEAVE
109#define LOG_RCV_PDQ_LEAVE(ercd, data, datapri)
110#endif /* LOG_RCV_PDQ_LEAVE */
111
112#ifndef LOG_PRCV_PDQ_ENTER
113#define LOG_PRCV_PDQ_ENTER(pdqid, p_data, p_datapri)
114#endif /* LOG_PRCV_PDQ_ENTER */
115
116#ifndef LOG_PRCV_PDQ_LEAVE
117#define LOG_PRCV_PDQ_LEAVE(ercd, data, datapri)
118#endif /* LOG_PRCV_PDQ_LEAVE */
119
120#ifndef LOG_TRCV_PDQ_ENTER
121#define LOG_TRCV_PDQ_ENTER(pdqid, p_data, p_datapri, tmout)
122#endif /* LOG_TRCV_PDQ_ENTER */
123
124#ifndef LOG_TRCV_PDQ_LEAVE
125#define LOG_TRCV_PDQ_LEAVE(ercd, data, datapri)
126#endif /* LOG_TRCV_PDQ_LEAVE */
127
128#ifndef LOG_INI_PDQ_ENTER
129#define LOG_INI_PDQ_ENTER(pdqid)
130#endif /* LOG_INI_PDQ_ENTER */
131
132#ifndef LOG_INI_PDQ_LEAVE
133#define LOG_INI_PDQ_LEAVE(ercd)
134#endif /* LOG_INI_PDQ_LEAVE */
135
136#ifndef LOG_REF_PDQ_ENTER
137#define LOG_REF_PDQ_ENTER(pdqid, pk_rpdq)
138#endif /* LOG_REF_PDQ_ENTER */
139
140#ifndef LOG_REF_PDQ_LEAVE
141#define LOG_REF_PDQ_LEAVE(ercd, pk_rpdq)
142#endif /* LOG_REF_PDQ_LEAVE */
143
144/*
145 * 優å…
146ˆåº¦ãƒ‡ãƒ¼ã‚¿ã‚­ãƒ¥ãƒ¼ã®æ•°
147 */
148#define tnum_pdq ((uint_t)(tmax_pdqid - TMIN_PDQID + 1))
149
150/*
151 * 優å…
152ˆåº¦ãƒ‡ãƒ¼ã‚¿ã‚­ãƒ¥ãƒ¼IDから優å…
153ˆåº¦ãƒ‡ãƒ¼ã‚¿ã‚­ãƒ¥ãƒ¼ç®¡ç†ãƒ–ロックを取り出すた
154 * めのマクロ
155 */
156#define INDEX_PDQ(pdqid) ((uint_t)((pdqid) - TMIN_PDQID))
157#define get_pdqcb(pdqid) (&(pdqcb_table[INDEX_PDQ(pdqid)]))
158
159/*
160 * 優å…
161ˆåº¦ãƒ‡ãƒ¼ã‚¿ã‚­ãƒ¥ãƒ¼æ©Ÿèƒ½ã®åˆæœŸåŒ–
162 */
163#ifdef TOPPERS_pdqini
164
165void
166initialize_pridataq(void)
167{
168 uint_t i;
169 PDQCB *p_pdqcb;
170
171 for (i = 0; i < tnum_pdq; i++) {
172 p_pdqcb = &(pdqcb_table[i]);
173 queue_initialize(&(p_pdqcb->swait_queue));
174 p_pdqcb->p_pdqinib = &(pdqinib_table[i]);
175 queue_initialize(&(p_pdqcb->rwait_queue));
176 p_pdqcb->count = 0U;
177 p_pdqcb->p_head = NULL;
178 p_pdqcb->unused = 0U;
179 p_pdqcb->p_freelist = NULL;
180 }
181}
182
183#endif /* TOPPERS_pdqini */
184
185/*
186 * 優å…
187ˆåº¦ãƒ‡ãƒ¼ã‚¿ã‚­ãƒ¥ãƒ¼ç®¡ç†é ˜åŸŸã¸ã®ãƒ‡ãƒ¼ã‚¿ã®æ ¼ç´
188 */
189#ifdef TOPPERS_pdqenq
190
191void
192enqueue_pridata(PDQCB *p_pdqcb, intptr_t data, PRI datapri)
193{
194 PDQMB *p_pdqmb;
195 PDQMB **pp_prev_next, *p_next;
196
197 if (p_pdqcb->p_freelist != NULL) {
198 p_pdqmb = p_pdqcb->p_freelist;
199 p_pdqcb->p_freelist = p_pdqmb->p_next;
200 }
201 else {
202 p_pdqmb = p_pdqcb->p_pdqinib->p_pdqmb + p_pdqcb->unused;
203 p_pdqcb->unused++;
204 }
205
206 p_pdqmb->data = data;
207 p_pdqmb->datapri = datapri;
208
209 pp_prev_next = &(p_pdqcb->p_head);
210 while ((p_next = *pp_prev_next) != NULL) {
211 if (p_next->datapri > datapri) {
212 break;
213 }
214 pp_prev_next = &(p_next->p_next);
215 }
216 p_pdqmb->p_next = p_next;
217 *pp_prev_next = p_pdqmb;
218 p_pdqcb->count++;
219}
220
221#endif /* TOPPERS_pdqenq */
222
223/*
224 * 優å…
225ˆåº¦ãƒ‡ãƒ¼ã‚¿ã‚­ãƒ¥ãƒ¼ç®¡ç†é ˜åŸŸã‹ã‚‰ã®ãƒ‡ãƒ¼ã‚¿ã®å–出し
226 */
227#ifdef TOPPERS_pdqdeq
228
229void
230dequeue_pridata(PDQCB *p_pdqcb, intptr_t *p_data, PRI *p_datapri)
231{
232 PDQMB *p_pdqmb;
233
234 p_pdqmb = p_pdqcb->p_head;
235 p_pdqcb->p_head = p_pdqmb->p_next;
236 p_pdqcb->count--;
237
238 *p_data = p_pdqmb->data;
239 *p_datapri = p_pdqmb->datapri;
240
241 p_pdqmb->p_next = p_pdqcb->p_freelist;
242 p_pdqcb->p_freelist = p_pdqmb;
243}
244
245#endif /* TOPPERS_pdqdeq */
246
247/*
248 * 優å…
249ˆåº¦ãƒ‡ãƒ¼ã‚¿ã‚­ãƒ¥ãƒ¼ã¸ã®ãƒ‡ãƒ¼ã‚¿é€ä¿¡
250 */
251#ifdef TOPPERS_pdqsnd
252
253bool_t
254send_pridata(PDQCB *p_pdqcb, intptr_t data, PRI datapri, bool_t *p_dspreq)
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_PDQ *)(p_tcb->p_winfo))->data = data;
261 ((WINFO_PDQ *)(p_tcb->p_winfo))->datapri = datapri;
262 *p_dspreq = 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 *p_dspreq = false;
268 return(true);
269 }
270 else {
271 return(false);
272 }
273}
274
275#endif /* TOPPERS_pdqsnd */
276
277/*
278 * 優å…
279ˆåº¦ãƒ‡ãƒ¼ã‚¿ã‚­ãƒ¥ãƒ¼ã‹ã‚‰ã®ãƒ‡ãƒ¼ã‚¿å—ä¿¡
280 */
281#ifdef TOPPERS_pdqrcv
282
283bool_t
284receive_pridata(PDQCB *p_pdqcb, intptr_t *p_data,
285 PRI *p_datapri, bool_t *p_dspreq)
286{
287 TCB *p_tcb;
288 intptr_t data;
289 PRI datapri;
290
291 if (p_pdqcb->count > 0U) {
292 dequeue_pridata(p_pdqcb, p_data, p_datapri);
293 if (!queue_empty(&(p_pdqcb->swait_queue))) {
294 p_tcb = (TCB *) queue_delete_next(&(p_pdqcb->swait_queue));
295 data = ((WINFO_PDQ *)(p_tcb->p_winfo))->data;
296 datapri = ((WINFO_PDQ *)(p_tcb->p_winfo))->datapri;
297 enqueue_pridata(p_pdqcb, data, datapri);
298 *p_dspreq = wait_complete(p_tcb);
299 }
300 else {
301 *p_dspreq = false;
302 }
303 return(true);
304 }
305 else if (!queue_empty(&(p_pdqcb->swait_queue))) {
306 p_tcb = (TCB *) queue_delete_next(&(p_pdqcb->swait_queue));
307 *p_data = ((WINFO_PDQ *)(p_tcb->p_winfo))->data;
308 *p_datapri = ((WINFO_PDQ *)(p_tcb->p_winfo))->datapri;
309 *p_dspreq = wait_complete(p_tcb);
310 return(true);
311 }
312 else {
313 return(false);
314 }
315}
316
317#endif /* TOPPERS_pdqrcv */
318
319/*
320 * 優å…
321ˆåº¦ãƒ‡ãƒ¼ã‚¿ã‚­ãƒ¥ãƒ¼ã¸ã®é€ä¿¡
322 */
323#ifdef TOPPERS_snd_pdq
324
325ER
326snd_pdq(ID pdqid, intptr_t data, PRI datapri)
327{
328 PDQCB *p_pdqcb;
329 WINFO_PDQ winfo_pdq;
330 bool_t dspreq;
331 ER ercd;
332
333 LOG_SND_PDQ_ENTER(pdqid, data, datapri);
334 CHECK_DISPATCH();
335 CHECK_PDQID(pdqid);
336 p_pdqcb = get_pdqcb(pdqid);
337 CHECK_PAR(TMIN_DPRI <= datapri && datapri <= p_pdqcb->p_pdqinib->maxdpri);
338
339 t_lock_cpu();
340 if (send_pridata(p_pdqcb, data, datapri, &dspreq)) {
341 if (dspreq) {
342 dispatch();
343 }
344 ercd = E_OK;
345 }
346 else {
347 winfo_pdq.data = data;
348 winfo_pdq.datapri = datapri;
349 p_runtsk->tstat = (TS_WAITING | TS_WAIT_SPDQ);
350 wobj_make_wait((WOBJCB *) p_pdqcb, (WINFO_WOBJ *) &winfo_pdq);
351 dispatch();
352 ercd = winfo_pdq.winfo.wercd;
353 }
354 t_unlock_cpu();
355
356 error_exit:
357 LOG_SND_PDQ_LEAVE(ercd);
358 return(ercd);
359}
360
361#endif /* TOPPERS_snd_pdq */
362
363/*
364 * 優å…
365ˆåº¦ãƒ‡ãƒ¼ã‚¿ã‚­ãƒ¥ãƒ¼ã¸ã®é€ä¿¡ï¼ˆãƒãƒ¼ãƒªãƒ³ã‚°ï¼‰
366 */
367#ifdef TOPPERS_psnd_pdq
368
369ER
370psnd_pdq(ID pdqid, intptr_t data, PRI datapri)
371{
372 PDQCB *p_pdqcb;
373 bool_t dspreq;
374 ER ercd;
375
376 LOG_PSND_PDQ_ENTER(pdqid, data, datapri);
377 CHECK_TSKCTX_UNL();
378 CHECK_PDQID(pdqid);
379 p_pdqcb = get_pdqcb(pdqid);
380 CHECK_PAR(TMIN_DPRI <= datapri && datapri <= p_pdqcb->p_pdqinib->maxdpri);
381
382 t_lock_cpu();
383 if (send_pridata(p_pdqcb, data, datapri, &dspreq)) {
384 if (dspreq) {
385 dispatch();
386 }
387 ercd = E_OK;
388 }
389 else {
390 ercd = E_TMOUT;
391 }
392 t_unlock_cpu();
393
394 error_exit:
395 LOG_PSND_PDQ_LEAVE(ercd);
396 return(ercd);
397}
398
399#endif /* TOPPERS_psnd_pdq */
400
401/*
402 * 優å…
403ˆåº¦ãƒ‡ãƒ¼ã‚¿ã‚­ãƒ¥ãƒ¼ã¸ã®é€ä¿¡ï¼ˆãƒãƒ¼ãƒªãƒ³ã‚°ï¼Œéžã‚¿ã‚¹ã‚¯ã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆç”¨ï¼‰
404 */
405#ifdef TOPPERS_ipsnd_pdq
406
407ER
408ipsnd_pdq(ID pdqid, intptr_t data, PRI datapri)
409{
410 PDQCB *p_pdqcb;
411 bool_t dspreq;
412 ER ercd;
413
414 LOG_IPSND_PDQ_ENTER(pdqid, data, datapri);
415 CHECK_INTCTX_UNL();
416 CHECK_PDQID(pdqid);
417 p_pdqcb = get_pdqcb(pdqid);
418 CHECK_PAR(TMIN_DPRI <= datapri && datapri <= p_pdqcb->p_pdqinib->maxdpri);
419
420 i_lock_cpu();
421 if (send_pridata(p_pdqcb, data, datapri, &dspreq)) {
422 if (dspreq) {
423 reqflg = true;
424 }
425 ercd = E_OK;
426 }
427 else {
428 ercd = E_TMOUT;
429 }
430 i_unlock_cpu();
431
432 error_exit:
433 LOG_IPSND_PDQ_LEAVE(ercd);
434 return(ercd);
435}
436
437#endif /* TOPPERS_ipsnd_pdq */
438
439/*
440 * 優å…
441ˆåº¦ãƒ‡ãƒ¼ã‚¿ã‚­ãƒ¥ãƒ¼ã¸ã®é€ä¿¡ï¼ˆã‚¿ã‚¤ãƒ ã‚¢ã‚¦ãƒˆã‚り)
442 */
443#ifdef TOPPERS_tsnd_pdq
444
445ER
446tsnd_pdq(ID pdqid, intptr_t data, PRI datapri, TMO tmout)
447{
448 PDQCB *p_pdqcb;
449 WINFO_PDQ winfo_pdq;
450 TMEVTB tmevtb;
451 bool_t dspreq;
452 ER ercd;
453
454 LOG_TSND_PDQ_ENTER(pdqid, data, datapri, tmout);
455 CHECK_DISPATCH();
456 CHECK_PDQID(pdqid);
457 CHECK_TMOUT(tmout);
458 p_pdqcb = get_pdqcb(pdqid);
459 CHECK_PAR(TMIN_DPRI <= datapri && datapri <= p_pdqcb->p_pdqinib->maxdpri);
460
461 t_lock_cpu();
462 if (send_pridata(p_pdqcb, data, datapri, &dspreq)) {
463 if (dspreq) {
464 dispatch();
465 }
466 ercd = E_OK;
467 }
468 else if (tmout == TMO_POL) {
469 ercd = E_TMOUT;
470 }
471 else {
472 winfo_pdq.data = data;
473 winfo_pdq.datapri = datapri;
474 p_runtsk->tstat = (TS_WAITING | TS_WAIT_SPDQ);
475 wobj_make_wait_tmout((WOBJCB *) p_pdqcb, (WINFO_WOBJ *) &winfo_pdq,
476 &tmevtb, tmout);
477 dispatch();
478 ercd = winfo_pdq.winfo.wercd;
479 }
480 t_unlock_cpu();
481
482 error_exit:
483 LOG_TSND_PDQ_LEAVE(ercd);
484 return(ercd);
485}
486
487#endif /* TOPPERS_tsnd_pdq */
488
489/*
490 * 優å…
491ˆåº¦ãƒ‡ãƒ¼ã‚¿ã‚­ãƒ¥ãƒ¼ã‹ã‚‰ã®å—ä¿¡
492 */
493#ifdef TOPPERS_rcv_pdq
494
495ER
496rcv_pdq(ID pdqid, intptr_t *p_data, PRI *p_datapri)
497{
498 PDQCB *p_pdqcb;
499 WINFO_PDQ winfo_pdq;
500 bool_t dspreq;
501 ER ercd;
502
503 LOG_RCV_PDQ_ENTER(pdqid, p_data, p_datapri);
504 CHECK_DISPATCH();
505 CHECK_PDQID(pdqid);
506 p_pdqcb = get_pdqcb(pdqid);
507
508 t_lock_cpu();
509 if (receive_pridata(p_pdqcb, p_data, p_datapri, &dspreq)) {
510 if (dspreq) {
511 dispatch();
512 }
513 ercd = E_OK;
514 }
515 else {
516 p_runtsk->tstat = (TS_WAITING | TS_WAIT_RPDQ);
517 make_wait(&(winfo_pdq.winfo));
518 queue_insert_prev(&(p_pdqcb->rwait_queue), &(p_runtsk->task_queue));
519 winfo_pdq.p_pdqcb = p_pdqcb;
520 LOG_TSKSTAT(p_runtsk);
521 dispatch();
522 ercd = winfo_pdq.winfo.wercd;
523 if (ercd == E_OK) {
524 *p_data = winfo_pdq.data;
525 *p_datapri = winfo_pdq.datapri;
526 }
527 }
528 t_unlock_cpu();
529
530 error_exit:
531 LOG_RCV_PDQ_LEAVE(ercd, *p_data, *p_datapri);
532 return(ercd);
533}
534
535#endif /* TOPPERS_rcv_pdq */
536
537/*
538 * 優å…
539ˆåº¦ãƒ‡ãƒ¼ã‚¿ã‚­ãƒ¥ãƒ¼ã‹ã‚‰ã®å—信(ポーリング)
540 */
541#ifdef TOPPERS_prcv_pdq
542
543ER
544prcv_pdq(ID pdqid, intptr_t *p_data, PRI *p_datapri)
545{
546 PDQCB *p_pdqcb;
547 bool_t dspreq;
548 ER ercd;
549
550 LOG_PRCV_PDQ_ENTER(pdqid, p_data, p_datapri);
551 CHECK_TSKCTX_UNL();
552 CHECK_PDQID(pdqid);
553 p_pdqcb = get_pdqcb(pdqid);
554
555 t_lock_cpu();
556 if (receive_pridata(p_pdqcb, p_data, p_datapri, &dspreq)) {
557 if (dspreq) {
558 dispatch();
559 }
560 ercd = E_OK;
561 }
562 else {
563 ercd = E_TMOUT;
564 }
565 t_unlock_cpu();
566
567 error_exit:
568 LOG_PRCV_PDQ_LEAVE(ercd, *p_data, *p_datapri);
569 return(ercd);
570}
571
572#endif /* TOPPERS_prcv_pdq */
573
574/*
575 * 優å…
576ˆåº¦ãƒ‡ãƒ¼ã‚¿ã‚­ãƒ¥ãƒ¼ã‹ã‚‰ã®å—信(タイムアウトあり)
577 */
578#ifdef TOPPERS_trcv_pdq
579
580ER
581trcv_pdq(ID pdqid, intptr_t *p_data, PRI *p_datapri, TMO tmout)
582{
583 PDQCB *p_pdqcb;
584 WINFO_PDQ winfo_pdq;
585 TMEVTB tmevtb;
586 bool_t dspreq;
587 ER ercd;
588
589 LOG_TRCV_PDQ_ENTER(pdqid, p_data, p_datapri, tmout);
590 CHECK_DISPATCH();
591 CHECK_PDQID(pdqid);
592 CHECK_TMOUT(tmout);
593 p_pdqcb = get_pdqcb(pdqid);
594
595 t_lock_cpu();
596 if (receive_pridata(p_pdqcb, p_data, p_datapri, &dspreq)) {
597 if (dspreq) {
598 dispatch();
599 }
600 ercd = E_OK;
601 }
602 else if (tmout == TMO_POL) {
603 ercd = E_TMOUT;
604 }
605 else {
606 p_runtsk->tstat = (TS_WAITING | TS_WAIT_RPDQ);
607 make_wait_tmout(&(winfo_pdq.winfo), &tmevtb, tmout);
608 queue_insert_prev(&(p_pdqcb->rwait_queue), &(p_runtsk->task_queue));
609 winfo_pdq.p_pdqcb = p_pdqcb;
610 LOG_TSKSTAT(p_runtsk);
611 dispatch();
612 ercd = winfo_pdq.winfo.wercd;
613 if (ercd == E_OK) {
614 *p_data = winfo_pdq.data;
615 *p_datapri = winfo_pdq.datapri;
616 }
617 }
618 t_unlock_cpu();
619
620 error_exit:
621 LOG_TRCV_PDQ_LEAVE(ercd, *p_data, *p_datapri);
622 return(ercd);
623}
624
625#endif /* TOPPERS_trcv_pdq */
626
627/*
628 * 優å…
629ˆåº¦ãƒ‡ãƒ¼ã‚¿ã‚­ãƒ¥ãƒ¼ã®å†åˆæœŸåŒ–
630 */
631#ifdef TOPPERS_ini_pdq
632
633ER
634ini_pdq(ID pdqid)
635{
636 PDQCB *p_pdqcb;
637 bool_t dspreq;
638 ER ercd;
639
640 LOG_INI_PDQ_ENTER(pdqid);
641 CHECK_TSKCTX_UNL();
642 CHECK_PDQID(pdqid);
643 p_pdqcb = get_pdqcb(pdqid);
644
645 t_lock_cpu();
646 dspreq = init_wait_queue(&(p_pdqcb->swait_queue));
647 if (init_wait_queue(&(p_pdqcb->rwait_queue))) {
648 dspreq = true;
649 }
650 p_pdqcb->count = 0U;
651 p_pdqcb->p_head = NULL;
652 p_pdqcb->unused = 0U;
653 p_pdqcb->p_freelist = NULL;
654 if (dspreq) {
655 dispatch();
656 }
657 ercd = E_OK;
658 t_unlock_cpu();
659
660 error_exit:
661 LOG_INI_PDQ_LEAVE(ercd);
662 return(ercd);
663}
664
665#endif /* TOPPERS_ini_pdq */
666
667/*
668 * 優å…
669ˆåº¦ãƒ‡ãƒ¼ã‚¿ã‚­ãƒ¥ãƒ¼ã®çŠ¶æ…
670‹å‚ç…
671§
672 */
673#ifdef TOPPERS_ref_pdq
674
675ER
676ref_pdq(ID pdqid, T_RPDQ *pk_rpdq)
677{
678 PDQCB *p_pdqcb;
679 ER ercd;
680
681 LOG_REF_PDQ_ENTER(pdqid, pk_rpdq);
682 CHECK_TSKCTX_UNL();
683 CHECK_PDQID(pdqid);
684 p_pdqcb = get_pdqcb(pdqid);
685
686 t_lock_cpu();
687 pk_rpdq->stskid = wait_tskid(&(p_pdqcb->swait_queue));
688 pk_rpdq->rtskid = wait_tskid(&(p_pdqcb->rwait_queue));
689 pk_rpdq->spdqcnt = p_pdqcb->count;
690 ercd = E_OK;
691 t_unlock_cpu();
692
693 error_exit:
694 LOG_REF_PDQ_LEAVE(ercd, pk_rpdq);
695 return(ercd);
696}
697
698#endif /* TOPPERS_ref_pdq */
Note: See TracBrowser for help on using the repository browser.