source: asp3_wo_tecs/trunk/extension/dcre/kernel/pridataq.c@ 302

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

TECSレスのASP3の開発のため以下のtrunkからコピー
http://dev.toppers.jp/svn/asp3/branches/WO_TECS-3.C.0

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-2015 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 471 2015-12-30 10:03:16Z 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_ACRE_PDQ_ENTER
73#define LOG_ACRE_PDQ_ENTER(pk_cpdq)
74#endif /* LOG_ACRE_PDQ_ENTER */
75
76#ifndef LOG_ACRE_PDQ_LEAVE
77#define LOG_ACRE_PDQ_LEAVE(ercd)
78#endif /* LOG_ACRE_PDQ_LEAVE */
79
80#ifndef LOG_DEL_PDQ_ENTER
81#define LOG_DEL_PDQ_ENTER(pdqid)
82#endif /* LOG_DEL_PDQ_ENTER */
83
84#ifndef LOG_DEL_PDQ_LEAVE
85#define LOG_DEL_PDQ_LEAVE(ercd)
86#endif /* LOG_DEL_PDQ_LEAVE */
87
88#ifndef LOG_SND_PDQ_ENTER
89#define LOG_SND_PDQ_ENTER(pdqid, data, datapri)
90#endif /* LOG_SND_PDQ_ENTER */
91
92#ifndef LOG_SND_PDQ_LEAVE
93#define LOG_SND_PDQ_LEAVE(ercd)
94#endif /* LOG_SND_PDQ_LEAVE */
95
96#ifndef LOG_PSND_PDQ_ENTER
97#define LOG_PSND_PDQ_ENTER(pdqid, data, datapri)
98#endif /* LOG_PSND_PDQ_ENTER */
99
100#ifndef LOG_PSND_PDQ_LEAVE
101#define LOG_PSND_PDQ_LEAVE(ercd)
102#endif /* LOG_PSND_PDQ_LEAVE */
103
104#ifndef LOG_TSND_PDQ_ENTER
105#define LOG_TSND_PDQ_ENTER(pdqid, data, datapri, tmout)
106#endif /* LOG_TSND_PDQ_ENTER */
107
108#ifndef LOG_TSND_PDQ_LEAVE
109#define LOG_TSND_PDQ_LEAVE(ercd)
110#endif /* LOG_TSND_PDQ_LEAVE */
111
112#ifndef LOG_RCV_PDQ_ENTER
113#define LOG_RCV_PDQ_ENTER(pdqid, p_data, p_datapri)
114#endif /* LOG_RCV_PDQ_ENTER */
115
116#ifndef LOG_RCV_PDQ_LEAVE
117#define LOG_RCV_PDQ_LEAVE(ercd, p_data, p_datapri)
118#endif /* LOG_RCV_PDQ_LEAVE */
119
120#ifndef LOG_PRCV_PDQ_ENTER
121#define LOG_PRCV_PDQ_ENTER(pdqid, p_data, p_datapri)
122#endif /* LOG_PRCV_PDQ_ENTER */
123
124#ifndef LOG_PRCV_PDQ_LEAVE
125#define LOG_PRCV_PDQ_LEAVE(ercd, p_data, p_datapri)
126#endif /* LOG_PRCV_PDQ_LEAVE */
127
128#ifndef LOG_TRCV_PDQ_ENTER
129#define LOG_TRCV_PDQ_ENTER(pdqid, p_data, p_datapri, tmout)
130#endif /* LOG_TRCV_PDQ_ENTER */
131
132#ifndef LOG_TRCV_PDQ_LEAVE
133#define LOG_TRCV_PDQ_LEAVE(ercd, p_data, p_datapri)
134#endif /* LOG_TRCV_PDQ_LEAVE */
135
136#ifndef LOG_INI_PDQ_ENTER
137#define LOG_INI_PDQ_ENTER(pdqid)
138#endif /* LOG_INI_PDQ_ENTER */
139
140#ifndef LOG_INI_PDQ_LEAVE
141#define LOG_INI_PDQ_LEAVE(ercd)
142#endif /* LOG_INI_PDQ_LEAVE */
143
144#ifndef LOG_REF_PDQ_ENTER
145#define LOG_REF_PDQ_ENTER(pdqid, pk_rpdq)
146#endif /* LOG_REF_PDQ_ENTER */
147
148#ifndef LOG_REF_PDQ_LEAVE
149#define LOG_REF_PDQ_LEAVE(ercd, pk_rpdq)
150#endif /* LOG_REF_PDQ_LEAVE */
151
152/*
153 * 優å…
154ˆåº¦ãƒ‡ãƒ¼ã‚¿ã‚­ãƒ¥ãƒ¼ã®æ•°
155 */
156#define tnum_pdq ((uint_t)(tmax_pdqid - TMIN_PDQID + 1))
157#define tnum_spdq ((uint_t)(tmax_spdqid - TMIN_PDQID + 1))
158
159/*
160 * 優å…
161ˆåº¦ãƒ‡ãƒ¼ã‚¿ã‚­ãƒ¥ãƒ¼IDから優å…
162ˆåº¦ãƒ‡ãƒ¼ã‚¿ã‚­ãƒ¥ãƒ¼ç®¡ç†ãƒ–ロックを取り出すた
163 * めのマクロ
164 */
165#define INDEX_PDQ(pdqid) ((uint_t)((pdqid) - TMIN_PDQID))
166#define get_pdqcb(pdqid) (&(pdqcb_table[INDEX_PDQ(pdqid)]))
167
168#ifdef TOPPERS_pdqini
169
170/*
171 * 使用していない優å…
172ˆåº¦ãƒ‡ãƒ¼ã‚¿ã‚­ãƒ¥ãƒ¼ç®¡ç†ãƒ–ロックのリスト
173 */
174QUEUE free_pdqcb;
175
176/*
177 * 優å…
178ˆåº¦ãƒ‡ãƒ¼ã‚¿ã‚­ãƒ¥ãƒ¼æ©Ÿèƒ½ã®åˆæœŸåŒ–
179 */
180void
181initialize_pridataq(void)
182{
183 uint_t i, j;
184 PDQCB *p_pdqcb;
185 PDQINIB *p_pdqinib;
186
187 for (i = 0; i < tnum_spdq; i++) {
188 p_pdqcb = &(pdqcb_table[i]);
189 queue_initialize(&(p_pdqcb->swait_queue));
190 p_pdqcb->p_pdqinib = &(pdqinib_table[i]);
191 queue_initialize(&(p_pdqcb->rwait_queue));
192 p_pdqcb->count = 0U;
193 p_pdqcb->p_head = NULL;
194 p_pdqcb->unused = 0U;
195 p_pdqcb->p_freelist = NULL;
196 }
197 queue_initialize(&free_pdqcb);
198 for (j = 0; i < tnum_pdq; i++, j++) {
199 p_pdqcb = &(pdqcb_table[i]);
200 p_pdqinib = &(apdqinib_table[j]);
201 p_pdqinib->pdqatr = TA_NOEXS;
202 p_pdqcb->p_pdqinib = ((const PDQINIB *) p_pdqinib);
203 queue_insert_prev(&free_pdqcb, &(p_pdqcb->swait_queue));
204 }
205}
206
207#endif /* TOPPERS_pdqini */
208
209/*
210 * 優å…
211ˆåº¦ãƒ‡ãƒ¼ã‚¿ã‚­ãƒ¥ãƒ¼ç®¡ç†é ˜åŸŸã¸ã®ãƒ‡ãƒ¼ã‚¿ã®æ ¼ç´
212 */
213#ifdef TOPPERS_pdqenq
214
215void
216enqueue_pridata(PDQCB *p_pdqcb, intptr_t data, PRI datapri)
217{
218 PDQMB *p_pdqmb;
219 PDQMB **pp_prev_next, *p_next;
220
221 if (p_pdqcb->p_freelist != NULL) {
222 p_pdqmb = p_pdqcb->p_freelist;
223 p_pdqcb->p_freelist = p_pdqmb->p_next;
224 }
225 else {
226 p_pdqmb = p_pdqcb->p_pdqinib->p_pdqmb + p_pdqcb->unused;
227 p_pdqcb->unused++;
228 }
229
230 p_pdqmb->data = data;
231 p_pdqmb->datapri = datapri;
232
233 pp_prev_next = &(p_pdqcb->p_head);
234 while ((p_next = *pp_prev_next) != NULL) {
235 if (p_next->datapri > datapri) {
236 break;
237 }
238 pp_prev_next = &(p_next->p_next);
239 }
240 p_pdqmb->p_next = p_next;
241 *pp_prev_next = p_pdqmb;
242 p_pdqcb->count++;
243}
244
245#endif /* TOPPERS_pdqenq */
246
247/*
248 * 優å…
249ˆåº¦ãƒ‡ãƒ¼ã‚¿ã‚­ãƒ¥ãƒ¼ç®¡ç†é ˜åŸŸã‹ã‚‰ã®ãƒ‡ãƒ¼ã‚¿ã®å–出し
250 */
251#ifdef TOPPERS_pdqdeq
252
253void
254dequeue_pridata(PDQCB *p_pdqcb, intptr_t *p_data, PRI *p_datapri)
255{
256 PDQMB *p_pdqmb;
257
258 p_pdqmb = p_pdqcb->p_head;
259 p_pdqcb->p_head = p_pdqmb->p_next;
260 p_pdqcb->count--;
261
262 *p_data = p_pdqmb->data;
263 *p_datapri = p_pdqmb->datapri;
264
265 p_pdqmb->p_next = p_pdqcb->p_freelist;
266 p_pdqcb->p_freelist = p_pdqmb;
267}
268
269#endif /* TOPPERS_pdqdeq */
270
271/*
272 * 優å…
273ˆåº¦ãƒ‡ãƒ¼ã‚¿ã‚­ãƒ¥ãƒ¼ã¸ã®ãƒ‡ãƒ¼ã‚¿é€ä¿¡
274 */
275#ifdef TOPPERS_pdqsnd
276
277bool_t
278send_pridata(PDQCB *p_pdqcb, intptr_t data, PRI datapri)
279{
280 TCB *p_tcb;
281
282 if (!queue_empty(&(p_pdqcb->rwait_queue))) {
283 p_tcb = (TCB *) queue_delete_next(&(p_pdqcb->rwait_queue));
284 ((WINFO_RPDQ *)(p_tcb->p_winfo))->data = data;
285 ((WINFO_RPDQ *)(p_tcb->p_winfo))->datapri = datapri;
286 wait_complete(p_tcb);
287 return(true);
288 }
289 else if (p_pdqcb->count < p_pdqcb->p_pdqinib->pdqcnt) {
290 enqueue_pridata(p_pdqcb, data, datapri);
291 return(true);
292 }
293 else {
294 return(false);
295 }
296}
297
298#endif /* TOPPERS_pdqsnd */
299
300/*
301 * 優å…
302ˆåº¦ãƒ‡ãƒ¼ã‚¿ã‚­ãƒ¥ãƒ¼ã‹ã‚‰ã®ãƒ‡ãƒ¼ã‚¿å—ä¿¡
303 */
304#ifdef TOPPERS_pdqrcv
305
306bool_t
307receive_pridata(PDQCB *p_pdqcb, intptr_t *p_data, PRI *p_datapri)
308{
309 TCB *p_tcb;
310 intptr_t data;
311 PRI datapri;
312
313 if (p_pdqcb->count > 0U) {
314 dequeue_pridata(p_pdqcb, p_data, p_datapri);
315 if (!queue_empty(&(p_pdqcb->swait_queue))) {
316 p_tcb = (TCB *) queue_delete_next(&(p_pdqcb->swait_queue));
317 data = ((WINFO_SPDQ *)(p_tcb->p_winfo))->data;
318 datapri = ((WINFO_SPDQ *)(p_tcb->p_winfo))->datapri;
319 enqueue_pridata(p_pdqcb, data, datapri);
320 wait_complete(p_tcb);
321 }
322 return(true);
323 }
324 else if (!queue_empty(&(p_pdqcb->swait_queue))) {
325 p_tcb = (TCB *) queue_delete_next(&(p_pdqcb->swait_queue));
326 *p_data = ((WINFO_SPDQ *)(p_tcb->p_winfo))->data;
327 *p_datapri = ((WINFO_SPDQ *)(p_tcb->p_winfo))->datapri;
328 wait_complete(p_tcb);
329 return(true);
330 }
331 else {
332 return(false);
333 }
334}
335
336#endif /* TOPPERS_pdqrcv */
337
338/*
339 * 優å…
340ˆåº¦ãƒ‡ãƒ¼ã‚¿ã‚­ãƒ¥ãƒ¼ã®ç”Ÿæˆ
341 */
342#ifdef TOPPERS_acre_pdq
343
344ER_UINT
345acre_pdq(const T_CPDQ *pk_cpdq)
346{
347 PDQCB *p_pdqcb;
348 PDQINIB *p_pdqinib;
349 ATR pdqatr;
350 PDQMB *p_pdqmb;
351 ER ercd;
352
353 LOG_ACRE_PDQ_ENTER(pk_cpdq);
354 CHECK_TSKCTX_UNL();
355 CHECK_RSATR(pk_cpdq->pdqatr, TA_TPRI);
356 CHECK_PAR(VALID_DPRI(pk_cpdq->maxdpri));
357 pdqatr = pk_cpdq->pdqatr;
358 p_pdqmb = pk_cpdq->pdqmb;
359
360 lock_cpu();
361 if (tnum_pdq == 0 || queue_empty(&free_pdqcb)) {
362 ercd = E_NOID;
363 }
364 else {
365 if (pk_cpdq->pdqcnt != 0 && p_pdqmb == NULL) {
366 p_pdqmb = kernel_malloc(sizeof(PDQMB) * pk_cpdq->pdqcnt);
367 pdqatr |= TA_MBALLOC;
368 }
369 if (pk_cpdq->pdqcnt != 0 && p_pdqmb == NULL) {
370 ercd = E_NOMEM;
371 }
372 else {
373 p_pdqcb = ((PDQCB *) queue_delete_next(&free_pdqcb));
374 p_pdqinib = (PDQINIB *)(p_pdqcb->p_pdqinib);
375 p_pdqinib->pdqatr = pdqatr;
376 p_pdqinib->pdqcnt = pk_cpdq->pdqcnt;
377 p_pdqinib->maxdpri = pk_cpdq->maxdpri;
378 p_pdqinib->p_pdqmb = p_pdqmb;
379
380 queue_initialize(&(p_pdqcb->swait_queue));
381 queue_initialize(&(p_pdqcb->rwait_queue));
382 p_pdqcb->count = 0U;
383 p_pdqcb->p_head = NULL;
384 p_pdqcb->unused = 0U;
385 p_pdqcb->p_freelist = NULL;
386 ercd = PDQID(p_pdqcb);
387 }
388 }
389 unlock_cpu();
390
391 error_exit:
392 LOG_ACRE_PDQ_LEAVE(ercd);
393 return(ercd);
394}
395
396#endif /* TOPPERS_acre_pdq */
397
398/*
399 * 優å…
400ˆåº¦ãƒ‡ãƒ¼ã‚¿ã‚­ãƒ¥ãƒ¼ã®å‰Šé™¤
401 */
402#ifdef TOPPERS_del_pdq
403
404ER
405del_pdq(ID pdqid)
406{
407 PDQCB *p_pdqcb;
408 PDQINIB *p_pdqinib;
409 ER ercd;
410
411 LOG_DEL_PDQ_ENTER(pdqid);
412 CHECK_TSKCTX_UNL();
413 CHECK_ID(VALID_PDQID(pdqid));
414 p_pdqcb = get_pdqcb(pdqid);
415
416 lock_cpu();
417 if (p_pdqcb->p_pdqinib->pdqatr == TA_NOEXS) {
418 ercd = E_NOEXS;
419 }
420 else if (pdqid <= tmax_spdqid) {
421 ercd = E_OBJ;
422 }
423 else {
424 init_wait_queue(&(p_pdqcb->swait_queue));
425 init_wait_queue(&(p_pdqcb->rwait_queue));
426 p_pdqinib = (PDQINIB *)(p_pdqcb->p_pdqinib);
427 if ((p_pdqinib->pdqatr & TA_MBALLOC) != 0U) {
428 kernel_free(p_pdqinib->p_pdqmb);
429 }
430 p_pdqinib->pdqatr = TA_NOEXS;
431 queue_insert_prev(&free_pdqcb, &(p_pdqcb->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_PDQ_LEAVE(ercd);
441 return(ercd);
442}
443
444#endif /* TOPPERS_del_pdq */
445
446/*
447 * 優å…
448ˆåº¦ãƒ‡ãƒ¼ã‚¿ã‚­ãƒ¥ãƒ¼ã¸ã®é€ä¿¡
449 */
450#ifdef TOPPERS_snd_pdq
451
452ER
453snd_pdq(ID pdqid, intptr_t data, PRI datapri)
454{
455 PDQCB *p_pdqcb;
456 WINFO_SPDQ winfo_spdq;
457 ER ercd;
458
459 LOG_SND_PDQ_ENTER(pdqid, data, datapri);
460 CHECK_DISPATCH();
461 CHECK_ID(VALID_PDQID(pdqid));
462 p_pdqcb = get_pdqcb(pdqid);
463 CHECK_PAR(TMIN_DPRI <= datapri);
464
465 lock_cpu_dsp();
466 if (p_pdqcb->p_pdqinib->pdqatr == TA_NOEXS) {
467 ercd = E_NOEXS;
468 }
469 else if (datapri > p_pdqcb->p_pdqinib->maxdpri) {
470 ercd = E_PAR;
471 }
472 else if (p_runtsk->raster) {
473 ercd = E_RASTER;
474 }
475 else if (send_pridata(p_pdqcb, data, datapri)) {
476 if (p_runtsk != p_schedtsk) {
477 dispatch();
478 }
479 ercd = E_OK;
480 }
481 else {
482 winfo_spdq.data = data;
483 winfo_spdq.datapri = datapri;
484 p_runtsk->tstat = TS_WAITING_SPDQ;
485 wobj_make_wait((WOBJCB *) p_pdqcb, (WINFO_WOBJ *) &winfo_spdq);
486 dispatch();
487 ercd = winfo_spdq.winfo.wercd;
488 }
489 unlock_cpu_dsp();
490
491 error_exit:
492 LOG_SND_PDQ_LEAVE(ercd);
493 return(ercd);
494}
495
496#endif /* TOPPERS_snd_pdq */
497
498/*
499 * 優å…
500ˆåº¦ãƒ‡ãƒ¼ã‚¿ã‚­ãƒ¥ãƒ¼ã¸ã®é€ä¿¡ï¼ˆãƒãƒ¼ãƒªãƒ³ã‚°ï¼‰
501 */
502#ifdef TOPPERS_psnd_pdq
503
504ER
505psnd_pdq(ID pdqid, intptr_t data, PRI datapri)
506{
507 PDQCB *p_pdqcb;
508 ER ercd;
509
510 LOG_PSND_PDQ_ENTER(pdqid, data, datapri);
511 CHECK_UNL();
512 CHECK_ID(VALID_PDQID(pdqid));
513 p_pdqcb = get_pdqcb(pdqid);
514 CHECK_PAR(TMIN_DPRI <= datapri);
515
516 lock_cpu();
517 if (p_pdqcb->p_pdqinib->pdqatr == TA_NOEXS) {
518 ercd = E_NOEXS;
519 }
520 else if (datapri > p_pdqcb->p_pdqinib->maxdpri) {
521 ercd = E_PAR;
522 }
523 else if (send_pridata(p_pdqcb, data, datapri)) {
524 if (p_runtsk != p_schedtsk) {
525 if (!sense_context()) {
526 dispatch();
527 }
528 else {
529 request_dispatch();
530 }
531 }
532 ercd = E_OK;
533 }
534 else {
535 ercd = E_TMOUT;
536 }
537 unlock_cpu();
538
539 error_exit:
540 LOG_PSND_PDQ_LEAVE(ercd);
541 return(ercd);
542}
543
544#endif /* TOPPERS_psnd_pdq */
545
546/*
547 * 優å…
548ˆåº¦ãƒ‡ãƒ¼ã‚¿ã‚­ãƒ¥ãƒ¼ã¸ã®é€ä¿¡ï¼ˆã‚¿ã‚¤ãƒ ã‚¢ã‚¦ãƒˆã‚り)
549 */
550#ifdef TOPPERS_tsnd_pdq
551
552ER
553tsnd_pdq(ID pdqid, intptr_t data, PRI datapri, TMO tmout)
554{
555 PDQCB *p_pdqcb;
556 WINFO_SPDQ winfo_spdq;
557 TMEVTB tmevtb;
558 ER ercd;
559
560 LOG_TSND_PDQ_ENTER(pdqid, data, datapri, tmout);
561 CHECK_DISPATCH();
562 CHECK_ID(VALID_PDQID(pdqid));
563 CHECK_PAR(VALID_TMOUT(tmout));
564 p_pdqcb = get_pdqcb(pdqid);
565 CHECK_PAR(TMIN_DPRI <= datapri);
566
567 lock_cpu_dsp();
568 if (p_pdqcb->p_pdqinib->pdqatr == TA_NOEXS) {
569 ercd = E_NOEXS;
570 }
571 else if (datapri > p_pdqcb->p_pdqinib->maxdpri) {
572 ercd = E_PAR;
573 }
574 else if (p_runtsk->raster) {
575 ercd = E_RASTER;
576 }
577 else if (send_pridata(p_pdqcb, data, datapri)) {
578 if (p_runtsk != p_schedtsk) {
579 dispatch();
580 }
581 ercd = E_OK;
582 }
583 else if (tmout == TMO_POL) {
584 ercd = E_TMOUT;
585 }
586 else {
587 winfo_spdq.data = data;
588 winfo_spdq.datapri = datapri;
589 p_runtsk->tstat = TS_WAITING_SPDQ;
590 wobj_make_wait_tmout((WOBJCB *) p_pdqcb, (WINFO_WOBJ *) &winfo_spdq,
591 &tmevtb, tmout);
592 dispatch();
593 ercd = winfo_spdq.winfo.wercd;
594 }
595 unlock_cpu_dsp();
596
597 error_exit:
598 LOG_TSND_PDQ_LEAVE(ercd);
599 return(ercd);
600}
601
602#endif /* TOPPERS_tsnd_pdq */
603
604/*
605 * 優å…
606ˆåº¦ãƒ‡ãƒ¼ã‚¿ã‚­ãƒ¥ãƒ¼ã‹ã‚‰ã®å—ä¿¡
607 */
608#ifdef TOPPERS_rcv_pdq
609
610ER
611rcv_pdq(ID pdqid, intptr_t *p_data, PRI *p_datapri)
612{
613 PDQCB *p_pdqcb;
614 WINFO_RPDQ winfo_rpdq;
615 ER ercd;
616
617 LOG_RCV_PDQ_ENTER(pdqid, p_data, p_datapri);
618 CHECK_DISPATCH();
619 CHECK_ID(VALID_PDQID(pdqid));
620 p_pdqcb = get_pdqcb(pdqid);
621
622 lock_cpu_dsp();
623 if (p_pdqcb->p_pdqinib->pdqatr == TA_NOEXS) {
624 ercd = E_NOEXS;
625 }
626 else if (p_runtsk->raster) {
627 ercd = E_RASTER;
628 }
629 else if (receive_pridata(p_pdqcb, p_data, p_datapri)) {
630 if (p_runtsk != p_schedtsk) {
631 dispatch();
632 }
633 ercd = E_OK;
634 }
635 else {
636 p_runtsk->tstat = TS_WAITING_RPDQ;
637 make_wait(&(winfo_rpdq.winfo));
638 queue_insert_prev(&(p_pdqcb->rwait_queue), &(p_runtsk->task_queue));
639 winfo_rpdq.p_pdqcb = p_pdqcb;
640 LOG_TSKSTAT(p_runtsk);
641 dispatch();
642 ercd = winfo_rpdq.winfo.wercd;
643 if (ercd == E_OK) {
644 *p_data = winfo_rpdq.data;
645 *p_datapri = winfo_rpdq.datapri;
646 }
647 }
648 unlock_cpu_dsp();
649
650 error_exit:
651 LOG_RCV_PDQ_LEAVE(ercd, p_data, p_datapri);
652 return(ercd);
653}
654
655#endif /* TOPPERS_rcv_pdq */
656
657/*
658 * 優å…
659ˆåº¦ãƒ‡ãƒ¼ã‚¿ã‚­ãƒ¥ãƒ¼ã‹ã‚‰ã®å—信(ポーリング)
660 */
661#ifdef TOPPERS_prcv_pdq
662
663ER
664prcv_pdq(ID pdqid, intptr_t *p_data, PRI *p_datapri)
665{
666 PDQCB *p_pdqcb;
667 ER ercd;
668
669 LOG_PRCV_PDQ_ENTER(pdqid, p_data, p_datapri);
670 CHECK_TSKCTX_UNL();
671 CHECK_ID(VALID_PDQID(pdqid));
672 p_pdqcb = get_pdqcb(pdqid);
673
674 lock_cpu();
675 if (p_pdqcb->p_pdqinib->pdqatr == TA_NOEXS) {
676 ercd = E_NOEXS;
677 }
678 else if (receive_pridata(p_pdqcb, p_data, p_datapri)) {
679 if (p_runtsk != p_schedtsk) {
680 dispatch();
681 }
682 ercd = E_OK;
683 }
684 else {
685 ercd = E_TMOUT;
686 }
687 unlock_cpu();
688
689 error_exit:
690 LOG_PRCV_PDQ_LEAVE(ercd, p_data, p_datapri);
691 return(ercd);
692}
693
694#endif /* TOPPERS_prcv_pdq */
695
696/*
697 * 優å…
698ˆåº¦ãƒ‡ãƒ¼ã‚¿ã‚­ãƒ¥ãƒ¼ã‹ã‚‰ã®å—信(タイムアウトあり)
699 */
700#ifdef TOPPERS_trcv_pdq
701
702ER
703trcv_pdq(ID pdqid, intptr_t *p_data, PRI *p_datapri, TMO tmout)
704{
705 PDQCB *p_pdqcb;
706 WINFO_RPDQ winfo_rpdq;
707 TMEVTB tmevtb;
708 ER ercd;
709
710 LOG_TRCV_PDQ_ENTER(pdqid, p_data, p_datapri, tmout);
711 CHECK_DISPATCH();
712 CHECK_ID(VALID_PDQID(pdqid));
713 CHECK_PAR(VALID_TMOUT(tmout));
714 p_pdqcb = get_pdqcb(pdqid);
715
716 lock_cpu_dsp();
717 if (p_pdqcb->p_pdqinib->pdqatr == TA_NOEXS) {
718 ercd = E_NOEXS;
719 }
720 else if (p_runtsk->raster) {
721 ercd = E_RASTER;
722 }
723 else if (receive_pridata(p_pdqcb, p_data, p_datapri)) {
724 if (p_runtsk != p_schedtsk) {
725 dispatch();
726 }
727 ercd = E_OK;
728 }
729 else if (tmout == TMO_POL) {
730 ercd = E_TMOUT;
731 }
732 else {
733 p_runtsk->tstat = TS_WAITING_RPDQ;
734 make_wait_tmout(&(winfo_rpdq.winfo), &tmevtb, tmout);
735 queue_insert_prev(&(p_pdqcb->rwait_queue), &(p_runtsk->task_queue));
736 winfo_rpdq.p_pdqcb = p_pdqcb;
737 LOG_TSKSTAT(p_runtsk);
738 dispatch();
739 ercd = winfo_rpdq.winfo.wercd;
740 if (ercd == E_OK) {
741 *p_data = winfo_rpdq.data;
742 *p_datapri = winfo_rpdq.datapri;
743 }
744 }
745 unlock_cpu_dsp();
746
747 error_exit:
748 LOG_TRCV_PDQ_LEAVE(ercd, p_data, p_datapri);
749 return(ercd);
750}
751
752#endif /* TOPPERS_trcv_pdq */
753
754/*
755 * 優å…
756ˆåº¦ãƒ‡ãƒ¼ã‚¿ã‚­ãƒ¥ãƒ¼ã®å†åˆæœŸåŒ–
757 */
758#ifdef TOPPERS_ini_pdq
759
760ER
761ini_pdq(ID pdqid)
762{
763 PDQCB *p_pdqcb;
764 ER ercd;
765
766 LOG_INI_PDQ_ENTER(pdqid);
767 CHECK_TSKCTX_UNL();
768 CHECK_ID(VALID_PDQID(pdqid));
769 p_pdqcb = get_pdqcb(pdqid);
770
771 lock_cpu();
772 if (p_pdqcb->p_pdqinib->pdqatr == TA_NOEXS) {
773 ercd = E_NOEXS;
774 }
775 else {
776 init_wait_queue(&(p_pdqcb->swait_queue));
777 init_wait_queue(&(p_pdqcb->rwait_queue));
778 p_pdqcb->count = 0U;
779 p_pdqcb->p_head = NULL;
780 p_pdqcb->unused = 0U;
781 p_pdqcb->p_freelist = NULL;
782 if (p_runtsk != p_schedtsk) {
783 dispatch();
784 }
785 ercd = E_OK;
786 }
787 unlock_cpu();
788
789 error_exit:
790 LOG_INI_PDQ_LEAVE(ercd);
791 return(ercd);
792}
793
794#endif /* TOPPERS_ini_pdq */
795
796/*
797 * 優å…
798ˆåº¦ãƒ‡ãƒ¼ã‚¿ã‚­ãƒ¥ãƒ¼ã®çŠ¶æ…
799‹å‚ç…
800§
801 */
802#ifdef TOPPERS_ref_pdq
803
804ER
805ref_pdq(ID pdqid, T_RPDQ *pk_rpdq)
806{
807 PDQCB *p_pdqcb;
808 ER ercd;
809
810 LOG_REF_PDQ_ENTER(pdqid, pk_rpdq);
811 CHECK_TSKCTX_UNL();
812 CHECK_ID(VALID_PDQID(pdqid));
813 p_pdqcb = get_pdqcb(pdqid);
814
815 lock_cpu();
816 if (p_pdqcb->p_pdqinib->pdqatr == TA_NOEXS) {
817 ercd = E_NOEXS;
818 }
819 else {
820 pk_rpdq->stskid = wait_tskid(&(p_pdqcb->swait_queue));
821 pk_rpdq->rtskid = wait_tskid(&(p_pdqcb->rwait_queue));
822 pk_rpdq->spdqcnt = p_pdqcb->count;
823 ercd = E_OK;
824 }
825 unlock_cpu();
826
827 error_exit:
828 LOG_REF_PDQ_LEAVE(ercd, pk_rpdq);
829 return(ercd);
830}
831
832#endif /* TOPPERS_ref_pdq */
Note: See TracBrowser for help on using the repository browser.