source: azure_iot_hub/trunk/asp3_dcre/kernel/pridataq.c@ 388

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

Azure IoT Hub Device C SDK を使ったサンプルの追加

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id
  • Property svn:mime-type set to text/x-csrc
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 * 上記著作権者
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 388 2019-05-22 11:25:18Z coas-nagasima $
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 uint_t pdqcnt;
351 PRI maxdpri;
352 PDQMB *p_pdqmb;
353 ER ercd;
354
355 LOG_ACRE_PDQ_ENTER(pk_cpdq);
356 CHECK_TSKCTX_UNL();
357
358 pdqatr = pk_cpdq->pdqatr;
359 pdqcnt = pk_cpdq->pdqcnt;
360 maxdpri = pk_cpdq->maxdpri;
361 p_pdqmb = pk_cpdq->pdqmb;
362
363 CHECK_RSATR(pdqatr, TA_TPRI);
364 CHECK_PAR(VALID_DPRI(maxdpri));
365
366 lock_cpu();
367 if (tnum_pdq == 0 || queue_empty(&free_pdqcb)) {
368 ercd = E_NOID;
369 }
370 else {
371 if (pdqcnt != 0 && p_pdqmb == NULL) {
372 p_pdqmb = kernel_malloc(sizeof(PDQMB) * pdqcnt);
373 pdqatr |= TA_MBALLOC;
374 }
375 if (pdqcnt != 0 && p_pdqmb == NULL) {
376 ercd = E_NOMEM;
377 }
378 else {
379 p_pdqcb = ((PDQCB *) queue_delete_next(&free_pdqcb));
380 p_pdqinib = (PDQINIB *)(p_pdqcb->p_pdqinib);
381 p_pdqinib->pdqatr = pdqatr;
382 p_pdqinib->pdqcnt = pdqcnt;
383 p_pdqinib->maxdpri = maxdpri;
384 p_pdqinib->p_pdqmb = p_pdqmb;
385
386 queue_initialize(&(p_pdqcb->swait_queue));
387 queue_initialize(&(p_pdqcb->rwait_queue));
388 p_pdqcb->count = 0U;
389 p_pdqcb->p_head = NULL;
390 p_pdqcb->unused = 0U;
391 p_pdqcb->p_freelist = NULL;
392 ercd = PDQID(p_pdqcb);
393 }
394 }
395 unlock_cpu();
396
397 error_exit:
398 LOG_ACRE_PDQ_LEAVE(ercd);
399 return(ercd);
400}
401
402#endif /* TOPPERS_acre_pdq */
403
404/*
405 * 優å…
406ˆåº¦ãƒ‡ãƒ¼ã‚¿ã‚­ãƒ¥ãƒ¼ã®å‰Šé™¤
407 */
408#ifdef TOPPERS_del_pdq
409
410ER
411del_pdq(ID pdqid)
412{
413 PDQCB *p_pdqcb;
414 PDQINIB *p_pdqinib;
415 ER ercd;
416
417 LOG_DEL_PDQ_ENTER(pdqid);
418 CHECK_TSKCTX_UNL();
419 CHECK_ID(VALID_PDQID(pdqid));
420 p_pdqcb = get_pdqcb(pdqid);
421
422 lock_cpu();
423 if (p_pdqcb->p_pdqinib->pdqatr == TA_NOEXS) {
424 ercd = E_NOEXS;
425 }
426 else if (pdqid <= tmax_spdqid) {
427 ercd = E_OBJ;
428 }
429 else {
430 init_wait_queue(&(p_pdqcb->swait_queue));
431 init_wait_queue(&(p_pdqcb->rwait_queue));
432 p_pdqinib = (PDQINIB *)(p_pdqcb->p_pdqinib);
433 if ((p_pdqinib->pdqatr & TA_MBALLOC) != 0U) {
434 kernel_free(p_pdqinib->p_pdqmb);
435 }
436 p_pdqinib->pdqatr = TA_NOEXS;
437 queue_insert_prev(&free_pdqcb, &(p_pdqcb->swait_queue));
438 if (p_runtsk != p_schedtsk) {
439 dispatch();
440 }
441 ercd = E_OK;
442 }
443 unlock_cpu();
444
445 error_exit:
446 LOG_DEL_PDQ_LEAVE(ercd);
447 return(ercd);
448}
449
450#endif /* TOPPERS_del_pdq */
451
452/*
453 * 優å…
454ˆåº¦ãƒ‡ãƒ¼ã‚¿ã‚­ãƒ¥ãƒ¼ã¸ã®é€ä¿¡
455 */
456#ifdef TOPPERS_snd_pdq
457
458ER
459snd_pdq(ID pdqid, intptr_t data, PRI datapri)
460{
461 PDQCB *p_pdqcb;
462 WINFO_SPDQ winfo_spdq;
463 ER ercd;
464
465 LOG_SND_PDQ_ENTER(pdqid, data, datapri);
466 CHECK_DISPATCH();
467 CHECK_ID(VALID_PDQID(pdqid));
468 p_pdqcb = get_pdqcb(pdqid);
469 CHECK_PAR(TMIN_DPRI <= datapri);
470
471 lock_cpu_dsp();
472 if (p_pdqcb->p_pdqinib->pdqatr == TA_NOEXS) {
473 ercd = E_NOEXS;
474 }
475 else if (datapri > p_pdqcb->p_pdqinib->maxdpri) {
476 ercd = E_PAR;
477 }
478 else if (p_runtsk->raster) {
479 ercd = E_RASTER;
480 }
481 else if (send_pridata(p_pdqcb, data, datapri)) {
482 if (p_runtsk != p_schedtsk) {
483 dispatch();
484 }
485 ercd = E_OK;
486 }
487 else {
488 winfo_spdq.data = data;
489 winfo_spdq.datapri = datapri;
490 p_runtsk->tstat = TS_WAITING_SPDQ;
491 wobj_make_wait((WOBJCB *) p_pdqcb, (WINFO_WOBJ *) &winfo_spdq);
492 dispatch();
493 ercd = winfo_spdq.winfo.wercd;
494 }
495 unlock_cpu_dsp();
496
497 error_exit:
498 LOG_SND_PDQ_LEAVE(ercd);
499 return(ercd);
500}
501
502#endif /* TOPPERS_snd_pdq */
503
504/*
505 * 優å…
506ˆåº¦ãƒ‡ãƒ¼ã‚¿ã‚­ãƒ¥ãƒ¼ã¸ã®é€ä¿¡ï¼ˆãƒãƒ¼ãƒªãƒ³ã‚°ï¼‰
507 */
508#ifdef TOPPERS_psnd_pdq
509
510ER
511psnd_pdq(ID pdqid, intptr_t data, PRI datapri)
512{
513 PDQCB *p_pdqcb;
514 ER ercd;
515
516 LOG_PSND_PDQ_ENTER(pdqid, data, datapri);
517 CHECK_UNL();
518 CHECK_ID(VALID_PDQID(pdqid));
519 p_pdqcb = get_pdqcb(pdqid);
520 CHECK_PAR(TMIN_DPRI <= datapri);
521
522 lock_cpu();
523 if (p_pdqcb->p_pdqinib->pdqatr == TA_NOEXS) {
524 ercd = E_NOEXS;
525 }
526 else if (datapri > p_pdqcb->p_pdqinib->maxdpri) {
527 ercd = E_PAR;
528 }
529 else if (send_pridata(p_pdqcb, data, datapri)) {
530 if (p_runtsk != p_schedtsk) {
531 if (!sense_context()) {
532 dispatch();
533 }
534 else {
535 request_dispatch();
536 }
537 }
538 ercd = E_OK;
539 }
540 else {
541 ercd = E_TMOUT;
542 }
543 unlock_cpu();
544
545 error_exit:
546 LOG_PSND_PDQ_LEAVE(ercd);
547 return(ercd);
548}
549
550#endif /* TOPPERS_psnd_pdq */
551
552/*
553 * 優å…
554ˆåº¦ãƒ‡ãƒ¼ã‚¿ã‚­ãƒ¥ãƒ¼ã¸ã®é€ä¿¡ï¼ˆã‚¿ã‚¤ãƒ ã‚¢ã‚¦ãƒˆã‚り)
555 */
556#ifdef TOPPERS_tsnd_pdq
557
558ER
559tsnd_pdq(ID pdqid, intptr_t data, PRI datapri, TMO tmout)
560{
561 PDQCB *p_pdqcb;
562 WINFO_SPDQ winfo_spdq;
563 TMEVTB tmevtb;
564 ER ercd;
565
566 LOG_TSND_PDQ_ENTER(pdqid, data, datapri, tmout);
567 CHECK_DISPATCH();
568 CHECK_ID(VALID_PDQID(pdqid));
569 CHECK_PAR(VALID_TMOUT(tmout));
570 p_pdqcb = get_pdqcb(pdqid);
571 CHECK_PAR(TMIN_DPRI <= datapri);
572
573 lock_cpu_dsp();
574 if (p_pdqcb->p_pdqinib->pdqatr == TA_NOEXS) {
575 ercd = E_NOEXS;
576 }
577 else if (datapri > p_pdqcb->p_pdqinib->maxdpri) {
578 ercd = E_PAR;
579 }
580 else if (p_runtsk->raster) {
581 ercd = E_RASTER;
582 }
583 else if (send_pridata(p_pdqcb, data, datapri)) {
584 if (p_runtsk != p_schedtsk) {
585 dispatch();
586 }
587 ercd = E_OK;
588 }
589 else if (tmout == TMO_POL) {
590 ercd = E_TMOUT;
591 }
592 else {
593 winfo_spdq.data = data;
594 winfo_spdq.datapri = datapri;
595 p_runtsk->tstat = TS_WAITING_SPDQ;
596 wobj_make_wait_tmout((WOBJCB *) p_pdqcb, (WINFO_WOBJ *) &winfo_spdq,
597 &tmevtb, tmout);
598 dispatch();
599 ercd = winfo_spdq.winfo.wercd;
600 }
601 unlock_cpu_dsp();
602
603 error_exit:
604 LOG_TSND_PDQ_LEAVE(ercd);
605 return(ercd);
606}
607
608#endif /* TOPPERS_tsnd_pdq */
609
610/*
611 * 優å…
612ˆåº¦ãƒ‡ãƒ¼ã‚¿ã‚­ãƒ¥ãƒ¼ã‹ã‚‰ã®å—ä¿¡
613 */
614#ifdef TOPPERS_rcv_pdq
615
616ER
617rcv_pdq(ID pdqid, intptr_t *p_data, PRI *p_datapri)
618{
619 PDQCB *p_pdqcb;
620 WINFO_RPDQ winfo_rpdq;
621 ER ercd;
622
623 LOG_RCV_PDQ_ENTER(pdqid, p_data, p_datapri);
624 CHECK_DISPATCH();
625 CHECK_ID(VALID_PDQID(pdqid));
626 p_pdqcb = get_pdqcb(pdqid);
627
628 lock_cpu_dsp();
629 if (p_pdqcb->p_pdqinib->pdqatr == TA_NOEXS) {
630 ercd = E_NOEXS;
631 }
632 else if (p_runtsk->raster) {
633 ercd = E_RASTER;
634 }
635 else if (receive_pridata(p_pdqcb, p_data, p_datapri)) {
636 if (p_runtsk != p_schedtsk) {
637 dispatch();
638 }
639 ercd = E_OK;
640 }
641 else {
642 p_runtsk->tstat = TS_WAITING_RPDQ;
643 make_wait(&(winfo_rpdq.winfo));
644 queue_insert_prev(&(p_pdqcb->rwait_queue), &(p_runtsk->task_queue));
645 winfo_rpdq.p_pdqcb = p_pdqcb;
646 LOG_TSKSTAT(p_runtsk);
647 dispatch();
648 ercd = winfo_rpdq.winfo.wercd;
649 if (ercd == E_OK) {
650 *p_data = winfo_rpdq.data;
651 *p_datapri = winfo_rpdq.datapri;
652 }
653 }
654 unlock_cpu_dsp();
655
656 error_exit:
657 LOG_RCV_PDQ_LEAVE(ercd, p_data, p_datapri);
658 return(ercd);
659}
660
661#endif /* TOPPERS_rcv_pdq */
662
663/*
664 * 優å…
665ˆåº¦ãƒ‡ãƒ¼ã‚¿ã‚­ãƒ¥ãƒ¼ã‹ã‚‰ã®å—信(ポーリング)
666 */
667#ifdef TOPPERS_prcv_pdq
668
669ER
670prcv_pdq(ID pdqid, intptr_t *p_data, PRI *p_datapri)
671{
672 PDQCB *p_pdqcb;
673 ER ercd;
674
675 LOG_PRCV_PDQ_ENTER(pdqid, p_data, p_datapri);
676 CHECK_TSKCTX_UNL();
677 CHECK_ID(VALID_PDQID(pdqid));
678 p_pdqcb = get_pdqcb(pdqid);
679
680 lock_cpu();
681 if (p_pdqcb->p_pdqinib->pdqatr == TA_NOEXS) {
682 ercd = E_NOEXS;
683 }
684 else if (receive_pridata(p_pdqcb, p_data, p_datapri)) {
685 if (p_runtsk != p_schedtsk) {
686 dispatch();
687 }
688 ercd = E_OK;
689 }
690 else {
691 ercd = E_TMOUT;
692 }
693 unlock_cpu();
694
695 error_exit:
696 LOG_PRCV_PDQ_LEAVE(ercd, p_data, p_datapri);
697 return(ercd);
698}
699
700#endif /* TOPPERS_prcv_pdq */
701
702/*
703 * 優å…
704ˆåº¦ãƒ‡ãƒ¼ã‚¿ã‚­ãƒ¥ãƒ¼ã‹ã‚‰ã®å—信(タイムアウトあり)
705 */
706#ifdef TOPPERS_trcv_pdq
707
708ER
709trcv_pdq(ID pdqid, intptr_t *p_data, PRI *p_datapri, TMO tmout)
710{
711 PDQCB *p_pdqcb;
712 WINFO_RPDQ winfo_rpdq;
713 TMEVTB tmevtb;
714 ER ercd;
715
716 LOG_TRCV_PDQ_ENTER(pdqid, p_data, p_datapri, tmout);
717 CHECK_DISPATCH();
718 CHECK_ID(VALID_PDQID(pdqid));
719 CHECK_PAR(VALID_TMOUT(tmout));
720 p_pdqcb = get_pdqcb(pdqid);
721
722 lock_cpu_dsp();
723 if (p_pdqcb->p_pdqinib->pdqatr == TA_NOEXS) {
724 ercd = E_NOEXS;
725 }
726 else if (p_runtsk->raster) {
727 ercd = E_RASTER;
728 }
729 else if (receive_pridata(p_pdqcb, p_data, p_datapri)) {
730 if (p_runtsk != p_schedtsk) {
731 dispatch();
732 }
733 ercd = E_OK;
734 }
735 else if (tmout == TMO_POL) {
736 ercd = E_TMOUT;
737 }
738 else {
739 p_runtsk->tstat = TS_WAITING_RPDQ;
740 make_wait_tmout(&(winfo_rpdq.winfo), &tmevtb, tmout);
741 queue_insert_prev(&(p_pdqcb->rwait_queue), &(p_runtsk->task_queue));
742 winfo_rpdq.p_pdqcb = p_pdqcb;
743 LOG_TSKSTAT(p_runtsk);
744 dispatch();
745 ercd = winfo_rpdq.winfo.wercd;
746 if (ercd == E_OK) {
747 *p_data = winfo_rpdq.data;
748 *p_datapri = winfo_rpdq.datapri;
749 }
750 }
751 unlock_cpu_dsp();
752
753 error_exit:
754 LOG_TRCV_PDQ_LEAVE(ercd, p_data, p_datapri);
755 return(ercd);
756}
757
758#endif /* TOPPERS_trcv_pdq */
759
760/*
761 * 優å…
762ˆåº¦ãƒ‡ãƒ¼ã‚¿ã‚­ãƒ¥ãƒ¼ã®å†åˆæœŸåŒ–
763 */
764#ifdef TOPPERS_ini_pdq
765
766ER
767ini_pdq(ID pdqid)
768{
769 PDQCB *p_pdqcb;
770 ER ercd;
771
772 LOG_INI_PDQ_ENTER(pdqid);
773 CHECK_TSKCTX_UNL();
774 CHECK_ID(VALID_PDQID(pdqid));
775 p_pdqcb = get_pdqcb(pdqid);
776
777 lock_cpu();
778 if (p_pdqcb->p_pdqinib->pdqatr == TA_NOEXS) {
779 ercd = E_NOEXS;
780 }
781 else {
782 init_wait_queue(&(p_pdqcb->swait_queue));
783 init_wait_queue(&(p_pdqcb->rwait_queue));
784 p_pdqcb->count = 0U;
785 p_pdqcb->p_head = NULL;
786 p_pdqcb->unused = 0U;
787 p_pdqcb->p_freelist = NULL;
788 if (p_runtsk != p_schedtsk) {
789 dispatch();
790 }
791 ercd = E_OK;
792 }
793 unlock_cpu();
794
795 error_exit:
796 LOG_INI_PDQ_LEAVE(ercd);
797 return(ercd);
798}
799
800#endif /* TOPPERS_ini_pdq */
801
802/*
803 * 優å…
804ˆåº¦ãƒ‡ãƒ¼ã‚¿ã‚­ãƒ¥ãƒ¼ã®çŠ¶æ…
805‹å‚ç…
806§
807 */
808#ifdef TOPPERS_ref_pdq
809
810ER
811ref_pdq(ID pdqid, T_RPDQ *pk_rpdq)
812{
813 PDQCB *p_pdqcb;
814 ER ercd;
815
816 LOG_REF_PDQ_ENTER(pdqid, pk_rpdq);
817 CHECK_TSKCTX_UNL();
818 CHECK_ID(VALID_PDQID(pdqid));
819 p_pdqcb = get_pdqcb(pdqid);
820
821 lock_cpu();
822 if (p_pdqcb->p_pdqinib->pdqatr == TA_NOEXS) {
823 ercd = E_NOEXS;
824 }
825 else {
826 pk_rpdq->stskid = wait_tskid(&(p_pdqcb->swait_queue));
827 pk_rpdq->rtskid = wait_tskid(&(p_pdqcb->rwait_queue));
828 pk_rpdq->spdqcnt = p_pdqcb->count;
829 ercd = E_OK;
830 }
831 unlock_cpu();
832
833 error_exit:
834 LOG_REF_PDQ_LEAVE(ercd, pk_rpdq);
835 return(ercd);
836}
837
838#endif /* TOPPERS_ref_pdq */
Note: See TracBrowser for help on using the repository browser.