source: asp3_wo_tecs/trunk/extension/messagebuf/kernel/messagebuf.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: 15.9 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: messagebuf.c 471 2015-12-30 10:03:16Z ertl-hiro $
56 */
57
58/*
59 * メッセージバッファ機能
60 */
61
62#include "kernel_impl.h"
63#include "check.h"
64#include "task.h"
65#include "taskhook.h"
66#include "wait.h"
67#include "messagebuf.h"
68#include <string.h>
69
70/*
71 * トレースログマクロのデフォルト定義
72 */
73#ifndef LOG_SND_MBF_ENTER
74#define LOG_SND_MBF_ENTER(mbfid, msg, msgsz)
75#endif /* LOG_SND_MBF_ENTER */
76
77#ifndef LOG_SND_MBF_LEAVE
78#define LOG_SND_MBF_LEAVE(ercd)
79#endif /* LOG_SND_MBF_LEAVE */
80
81#ifndef LOG_PSND_MBF_ENTER
82#define LOG_PSND_MBF_ENTER(mbfid, msg, msgsz)
83#endif /* LOG_PSND_MBF_ENTER */
84
85#ifndef LOG_PSND_MBF_LEAVE
86#define LOG_PSND_MBF_LEAVE(ercd)
87#endif /* LOG_PSND_MBF_LEAVE */
88
89#ifndef LOG_TSND_MBF_ENTER
90#define LOG_TSND_MBF_ENTER(mbfid, msg, msgsz, tmout)
91#endif /* LOG_TSND_MBF_ENTER */
92
93#ifndef LOG_TSND_MBF_LEAVE
94#define LOG_TSND_MBF_LEAVE(ercd)
95#endif /* LOG_TSND_MBF_LEAVE */
96
97#ifndef LOG_RCV_MBF_ENTER
98#define LOG_RCV_MBF_ENTER(mbfid, msg)
99#endif /* LOG_RCV_MBF_ENTER */
100
101#ifndef LOG_RCV_MBF_LEAVE
102#define LOG_RCV_MBF_LEAVE(msgsz, msg)
103#endif /* LOG_RCV_MBF_LEAVE */
104
105#ifndef LOG_PRCV_MBF_ENTER
106#define LOG_PRCV_MBF_ENTER(mbfid, msg)
107#endif /* LOG_PRCV_MBF_ENTER */
108
109#ifndef LOG_PRCV_MBF_LEAVE
110#define LOG_PRCV_MBF_LEAVE(msgsz, msg)
111#endif /* LOG_PRCV_MBF_LEAVE */
112
113#ifndef LOG_TRCV_MBF_ENTER
114#define LOG_TRCV_MBF_ENTER(mbfid, msg, tmout)
115#endif /* LOG_TRCV_MBF_ENTER */
116
117#ifndef LOG_TRCV_MBF_LEAVE
118#define LOG_TRCV_MBF_LEAVE(msgsz, msg)
119#endif /* LOG_TRCV_MBF_LEAVE */
120
121#ifndef LOG_INI_MBF_ENTER
122#define LOG_INI_MBF_ENTER(mbfid)
123#endif /* LOG_INI_MBF_ENTER */
124
125#ifndef LOG_INI_MBF_LEAVE
126#define LOG_INI_MBF_LEAVE(ercd)
127#endif /* LOG_INI_MBF_LEAVE */
128
129#ifndef LOG_REF_MBF_ENTER
130#define LOG_REF_MBF_ENTER(mbfid, pk_rmbf)
131#endif /* LOG_REF_MBF_ENTER */
132
133#ifndef LOG_REF_MBF_LEAVE
134#define LOG_REF_MBF_LEAVE(ercd, pk_rmbf)
135#endif /* LOG_REF_MBF_LEAVE */
136
137/*
138 * メッセージバッファの数
139 */
140#define tnum_mbf ((uint_t)(tmax_mbfid - TMIN_MBFID + 1))
141
142/*
143 * メッセージバッファIDからメッセージバッファ管理ブロックを取り出すた
144 * めのマクロ
145 */
146#define INDEX_MBF(mbfid) ((uint_t)((mbfid) - TMIN_MBFID))
147#define get_mbfcb(mbfid) (&(mbfcb_table[INDEX_MBF(mbfid)]))
148
149/*
150 * メッセージバッファ機能の初期化
151 */
152#ifdef TOPPERS_mbfini
153
154void
155initialize_messagebuf(void)
156{
157 uint_t i;
158 MBFCB *p_mbfcb;
159
160 mbfhook_dequeue_wobj = messagebuf_dequeue_wobj;
161
162 for (i = 0; i < tnum_mbf; i++) {
163 p_mbfcb = &(mbfcb_table[i]);
164 queue_initialize(&(p_mbfcb->swait_queue));
165 p_mbfcb->p_mbfinib = &(mbfinib_table[i]);
166 queue_initialize(&(p_mbfcb->rwait_queue));
167 p_mbfcb->fmbfsz = p_mbfcb->p_mbfinib->mbfsz;
168 p_mbfcb->head = 0U;
169 p_mbfcb->tail = 0U;
170 p_mbfcb->smbfcnt = 0U;
171 }
172}
173
174#endif /* TOPPERS_mbfini */
175
176/*
177 * メッセージバッファ管理領域へのメッセージの格納
178 */
179#ifdef TOPPERS_mbfenq
180
181bool_t
182enqueue_message(MBFCB *p_mbfcb, const void *msg, uint_t msgsz)
183{
184 const MBFINIB *p_mbfinib = p_mbfcb->p_mbfinib;
185 char *mbuffer = (char *)(p_mbfinib->mbfmb);
186 uint_t allocsz;
187 size_t remsz;
188
189 allocsz = sizeof(uint_t) + TOPPERS_ROUND_SZ(msgsz, sizeof(uint_t));
190 if (allocsz <= p_mbfcb->fmbfsz) {
191 *((uint_t *) &(mbuffer[p_mbfcb->tail])) = msgsz;
192 p_mbfcb->tail += sizeof(uint_t);
193 if (p_mbfcb->tail >= p_mbfinib->mbfsz) {
194 p_mbfcb->tail = 0U;
195 }
196
197 remsz = p_mbfinib->mbfsz - p_mbfcb->tail;
198 if (remsz < msgsz) {
199 memcpy(&(mbuffer[p_mbfcb->tail]), msg, remsz);
200 msg = ((char *) msg) + remsz;
201 msgsz -= remsz;
202 p_mbfcb->tail = 0U;
203 }
204 memcpy(&(mbuffer[p_mbfcb->tail]), msg, msgsz);
205 p_mbfcb->tail += TOPPERS_ROUND_SZ(msgsz, sizeof(uint_t));
206 if (p_mbfcb->tail >= p_mbfinib->mbfsz) {
207 p_mbfcb->tail = 0U;
208 }
209
210 p_mbfcb->fmbfsz -= allocsz;
211 p_mbfcb->smbfcnt++;
212 return(true);
213 }
214 return(false);
215}
216
217#endif /* TOPPERS_mbfenq */
218
219/*
220 * メッセージバッファ管理領域からのメッセージの取出し
221 */
222#ifdef TOPPERS_mbfdeq
223
224uint_t
225dequeue_message(MBFCB *p_mbfcb, void *msg)
226{
227 const MBFINIB *p_mbfinib = p_mbfcb->p_mbfinib;
228 char *mbuffer = (char *)(p_mbfinib->mbfmb);
229 uint_t msgsz, copysz;
230 size_t remsz;
231
232 assert(p_mbfcb->smbfcnt > 0);
233 msgsz = *((uint_t *) &(mbuffer[p_mbfcb->head]));
234 p_mbfcb->head += sizeof(uint_t);
235 if (p_mbfcb->head >= p_mbfcb->p_mbfinib->mbfsz) {
236 p_mbfcb->head = 0U;
237 }
238
239 remsz = p_mbfcb->p_mbfinib->mbfsz - p_mbfcb->head;
240 copysz = msgsz;
241 if (remsz < copysz) {
242 memcpy(msg, &(mbuffer[p_mbfcb->head]), remsz);
243 msg = ((char *) msg) + remsz;
244 copysz -= remsz;
245 p_mbfcb->head = 0U;
246 }
247 memcpy(msg, &(mbuffer[p_mbfcb->head]), copysz);
248 p_mbfcb->head += TOPPERS_ROUND_SZ(copysz, sizeof(uint_t));
249 if (p_mbfcb->head >= p_mbfcb->p_mbfinib->mbfsz) {
250 p_mbfcb->head = 0U;
251 }
252
253 p_mbfcb->fmbfsz += sizeof(uint_t) + TOPPERS_ROUND_SZ(msgsz, sizeof(uint_t));
254 p_mbfcb->smbfcnt--;
255 return(msgsz);
256}
257
258#endif /* TOPPERS_mbfdeq */
259
260/*
261 * メッセージバッファへのメッセージ送信
262 */
263#ifdef TOPPERS_mbfsnd
264
265bool_t
266send_message(MBFCB *p_mbfcb, const void *msg, uint_t msgsz)
267{
268 TCB *p_tcb;
269
270 if (!queue_empty(&(p_mbfcb->rwait_queue))) {
271 p_tcb = (TCB *) queue_delete_next(&(p_mbfcb->rwait_queue));
272 memcpy(((WINFO_RMBF *)(p_tcb->p_winfo))->msg, msg, msgsz);
273 wait_complete(p_tcb);
274 p_tcb->p_winfo->wercd = (ER_UINT)(msgsz);
275 return(true);
276 }
277 else if (queue_empty(&(p_mbfcb->swait_queue))
278 && enqueue_message(p_mbfcb, msg, msgsz)) {
279 return(true);
280 }
281 else {
282 return(false);
283 }
284}
285
286#endif /* TOPPERS_mbfsnd */
287
288/*
289 * メッセージバッファ送信待
290ちタスクのチェック
291 *
292 * メッセージバッファ送信待
293ちキューのå…
294ˆé ­ã®ã‚¿ã‚¹ã‚¯ã®é€ä¿¡ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãŒï¼Œ
295 * メッセージバッファ管理領域に格納することできれば格納し,待
296ち解除す
297 * る.この処理を,å…
298ˆé ­ã®ã‚¿ã‚¹ã‚¯ã®é€ä¿¡ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãŒæ ¼ç´ã§ããªããªã‚‹ã¾ã§
299 * 繰り返す.
300 */
301#ifdef TOPPERS_mbfsig
302
303void
304messagebuf_signal(MBFCB *p_mbfcb)
305{
306 TCB *p_tcb;
307
308 while (!queue_empty(&(p_mbfcb->swait_queue))) {
309 p_tcb = (TCB *)(p_mbfcb->swait_queue.p_next);
310 if (enqueue_message(p_mbfcb, ((WINFO_SMBF *)(p_tcb->p_winfo))->msg,
311 ((WINFO_SMBF *)(p_tcb->p_winfo))->msgsz)) {
312 queue_delete(&(p_tcb->task_queue));
313 wait_complete(p_tcb);
314 }
315 else {
316 break;
317 }
318 }
319}
320
321#endif /* TOPPERS_mbfsig */
322
323/*
324 * メッセージバッファからのメッセージ受信
325 */
326#ifdef TOPPERS_mbfrcv
327
328uint_t
329receive_message(MBFCB *p_mbfcb, void *msg)
330{
331 TCB *p_tcb;
332 uint_t msgsz;
333
334 if (p_mbfcb->smbfcnt > 0) {
335 msgsz = dequeue_message(p_mbfcb, msg);
336 messagebuf_signal(p_mbfcb);
337 return(msgsz);
338 }
339 else if (!queue_empty(&(p_mbfcb->swait_queue))) {
340 p_tcb = (TCB *) queue_delete_next(&(p_mbfcb->swait_queue));
341 msgsz = ((WINFO_SMBF *)(p_tcb->p_winfo))->msgsz;
342 memcpy(msg, ((WINFO_SMBF *)(p_tcb->p_winfo))->msg, msgsz);
343 wait_complete(p_tcb);
344 return(msgsz);
345 }
346 else {
347 return(0U);
348 }
349}
350
351#endif /* TOPPERS_mbfrcv */
352
353/*
354 * メッセージバッファ送信待
355ちタスクの待
356ち解除時処理
357 */
358#ifdef TOPPERS_mbfwobj
359
360void
361messagebuf_dequeue_wobj(TCB *p_tcb)
362{
363 messagebuf_signal(((WINFO_SMBF *)(p_tcb->p_winfo))->p_mbfcb);
364}
365
366#endif /* TOPPERS_mbfwobj */
367
368/*
369 * メッセージバッファへの送信
370 */
371#ifdef TOPPERS_snd_mbf
372
373ER
374snd_mbf(ID mbfid, const void *msg, uint_t msgsz)
375{
376 MBFCB *p_mbfcb;
377 WINFO_SMBF winfo_smbf;
378 ER ercd;
379
380 LOG_SND_MBF_ENTER(mbfid, msg, msgsz);
381 CHECK_DISPATCH();
382 CHECK_ID(VALID_MBFID(mbfid));
383 p_mbfcb = get_mbfcb(mbfid);
384 CHECK_PAR(0 < msgsz && msgsz <= p_mbfcb->p_mbfinib->maxmsz);
385
386 lock_cpu_dsp();
387 if (p_runtsk->raster) {
388 ercd = E_RASTER;
389 }
390 else if (send_message(p_mbfcb, msg, msgsz)) {
391 if (p_runtsk != p_schedtsk) {
392 dispatch();
393 }
394 ercd = E_OK;
395 }
396 else {
397 winfo_smbf.msg = msg;
398 winfo_smbf.msgsz = msgsz;
399 p_runtsk->tstat = TS_WAITING_SMBF;
400 wobj_make_wait((WOBJCB *) p_mbfcb, (WINFO_WOBJ *) &winfo_smbf);
401 dispatch();
402 ercd = winfo_smbf.winfo.wercd;
403 }
404 unlock_cpu_dsp();
405
406 error_exit:
407 LOG_SND_MBF_LEAVE(ercd);
408 return(ercd);
409}
410
411#endif /* TOPPERS_snd_mbf */
412
413/*
414 * メッセージバッファへの送信(ポーリング)
415 */
416#ifdef TOPPERS_psnd_mbf
417
418ER
419psnd_mbf(ID mbfid, const void *msg, uint_t msgsz)
420{
421 MBFCB *p_mbfcb;
422 ER ercd;
423
424 LOG_PSND_MBF_ENTER(mbfid, msg, msgsz);
425 CHECK_TSKCTX_UNL();
426 CHECK_ID(VALID_MBFID(mbfid));
427 p_mbfcb = get_mbfcb(mbfid);
428 CHECK_PAR(0 < msgsz && msgsz <= p_mbfcb->p_mbfinib->maxmsz);
429
430 lock_cpu();
431 if (send_message(p_mbfcb, msg, msgsz)) {
432 if (p_runtsk != p_schedtsk) {
433 dispatch();
434 }
435 ercd = E_OK;
436 }
437 else {
438 ercd = E_TMOUT;
439 }
440 unlock_cpu();
441
442 error_exit:
443 LOG_PSND_MBF_LEAVE(ercd);
444 return(ercd);
445}
446
447#endif /* TOPPERS_psnd_mbf */
448
449/*
450 * メッセージバッファへの送信(タイムアウトあり)
451 */
452#ifdef TOPPERS_tsnd_mbf
453
454ER
455tsnd_mbf(ID mbfid, const void *msg, uint_t msgsz, TMO tmout)
456{
457 MBFCB *p_mbfcb;
458 WINFO_SMBF winfo_smbf;
459 TMEVTB tmevtb;
460 ER ercd;
461
462 LOG_TSND_MBF_ENTER(mbfid, msg, msgsz, tmout);
463 CHECK_DISPATCH();
464 CHECK_ID(VALID_MBFID(mbfid));
465 CHECK_PAR(VALID_TMOUT(tmout));
466 p_mbfcb = get_mbfcb(mbfid);
467 CHECK_PAR(0 < msgsz && msgsz <= p_mbfcb->p_mbfinib->maxmsz);
468
469 lock_cpu_dsp();
470 if (p_runtsk->raster) {
471 ercd = E_RASTER;
472 }
473 else if (send_message(p_mbfcb, msg, msgsz)) {
474 if (p_runtsk != p_schedtsk) {
475 dispatch();
476 }
477 ercd = E_OK;
478 }
479 else if (tmout == TMO_POL) {
480 ercd = E_TMOUT;
481 }
482 else {
483 winfo_smbf.msg = msg;
484 winfo_smbf.msgsz = msgsz;
485 p_runtsk->tstat = TS_WAITING_SMBF;
486 wobj_make_wait_tmout((WOBJCB *) p_mbfcb, (WINFO_WOBJ *) &winfo_smbf,
487 &tmevtb, tmout);
488 dispatch();
489 ercd = winfo_smbf.winfo.wercd;
490 }
491 unlock_cpu_dsp();
492
493 error_exit:
494 LOG_TSND_MBF_LEAVE(ercd);
495 return(ercd);
496}
497
498#endif /* TOPPERS_tsnd_mbf */
499
500/*
501 * メッセージバッファからの受信
502 */
503#ifdef TOPPERS_rcv_mbf
504
505ER_UINT
506rcv_mbf(ID mbfid, void *msg)
507{
508 MBFCB *p_mbfcb;
509 WINFO_RMBF winfo_rmbf;
510 uint_t msgsz;
511 ER_UINT ercd;
512
513 LOG_RCV_MBF_ENTER(mbfid, msg);
514 CHECK_DISPATCH();
515 CHECK_ID(VALID_MBFID(mbfid));
516 p_mbfcb = get_mbfcb(mbfid);
517
518 lock_cpu_dsp();
519 if (p_runtsk->raster) {
520 ercd = E_RASTER;
521 }
522 else if ((msgsz = receive_message(p_mbfcb, msg)) > 0U) {
523 if (p_runtsk != p_schedtsk) {
524 dispatch();
525 }
526 ercd = (ER_UINT) msgsz;
527 }
528 else {
529 p_runtsk->tstat = TS_WAITING_RMBF;
530 make_wait(&(winfo_rmbf.winfo));
531 queue_insert_prev(&(p_mbfcb->rwait_queue), &(p_runtsk->task_queue));
532 winfo_rmbf.p_mbfcb = p_mbfcb;
533 winfo_rmbf.msg = msg;
534 LOG_TSKSTAT(p_runtsk);
535 dispatch();
536 ercd = winfo_rmbf.winfo.wercd;
537 }
538 unlock_cpu_dsp();
539
540 error_exit:
541 LOG_RCV_MBF_LEAVE(ercd, msg);
542 return(ercd);
543}
544
545#endif /* TOPPERS_rcv_mbf */
546
547/*
548 * メッセージバッファからの受信(ポーリング)
549 */
550#ifdef TOPPERS_prcv_mbf
551
552ER
553prcv_mbf(ID mbfid, void *msg)
554{
555 MBFCB *p_mbfcb;
556 uint_t msgsz;
557 ER_UINT ercd;
558
559 LOG_PRCV_MBF_ENTER(mbfid, msg);
560 CHECK_TSKCTX_UNL();
561 CHECK_ID(VALID_MBFID(mbfid));
562 p_mbfcb = get_mbfcb(mbfid);
563
564 lock_cpu();
565 if ((msgsz = receive_message(p_mbfcb, msg)) > 0U) {
566 if (p_runtsk != p_schedtsk) {
567 dispatch();
568 }
569 ercd = (ER_UINT) msgsz;
570 }
571 else {
572 ercd = E_TMOUT;
573 }
574 unlock_cpu();
575
576 error_exit:
577 LOG_PRCV_MBF_LEAVE(ercd, msg);
578 return(ercd);
579}
580
581#endif /* TOPPERS_prcv_mbf */
582
583/*
584 * メッセージバッファからの受信(タイムアウトあり)
585 */
586#ifdef TOPPERS_trcv_mbf
587
588ER
589trcv_mbf(ID mbfid, void *msg, TMO tmout)
590{
591 MBFCB *p_mbfcb;
592 WINFO_RMBF winfo_rmbf;
593 TMEVTB tmevtb;
594 uint_t msgsz;
595 ER_UINT ercd;
596
597 LOG_TRCV_MBF_ENTER(mbfid, msg, tmout);
598 CHECK_DISPATCH();
599 CHECK_ID(VALID_MBFID(mbfid));
600 CHECK_PAR(VALID_TMOUT(tmout));
601 p_mbfcb = get_mbfcb(mbfid);
602
603 lock_cpu_dsp();
604 if (p_runtsk->raster) {
605 ercd = E_RASTER;
606 }
607 else if ((msgsz = receive_message(p_mbfcb, msg)) > 0U) {
608 if (p_runtsk != p_schedtsk) {
609 dispatch();
610 }
611 ercd = (ER_UINT) msgsz;
612 }
613 else if (tmout == TMO_POL) {
614 ercd = E_TMOUT;
615 }
616 else {
617 p_runtsk->tstat = TS_WAITING_RMBF;
618 make_wait_tmout(&(winfo_rmbf.winfo), &tmevtb, tmout);
619 queue_insert_prev(&(p_mbfcb->rwait_queue), &(p_runtsk->task_queue));
620 winfo_rmbf.p_mbfcb = p_mbfcb;
621 winfo_rmbf.msg = msg;
622 LOG_TSKSTAT(p_runtsk);
623 dispatch();
624 ercd = winfo_rmbf.winfo.wercd;
625 }
626 unlock_cpu_dsp();
627
628 error_exit:
629 LOG_TRCV_MBF_LEAVE(ercd, msg);
630 return(ercd);
631}
632
633#endif /* TOPPERS_trcv_mbf */
634
635/*
636 * メッセージバッファの再初期化
637 */
638#ifdef TOPPERS_ini_mbf
639
640ER
641ini_mbf(ID mbfid)
642{
643 MBFCB *p_mbfcb;
644 ER ercd;
645
646 LOG_INI_MBF_ENTER(mbfid);
647 CHECK_TSKCTX_UNL();
648 CHECK_ID(VALID_MBFID(mbfid));
649 p_mbfcb = get_mbfcb(mbfid);
650
651 lock_cpu();
652 init_wait_queue(&(p_mbfcb->swait_queue));
653 init_wait_queue(&(p_mbfcb->rwait_queue));
654 p_mbfcb->fmbfsz = p_mbfcb->p_mbfinib->mbfsz;
655 p_mbfcb->head = 0U;
656 p_mbfcb->tail = 0U;
657 p_mbfcb->smbfcnt = 0U;
658 if (p_runtsk != p_schedtsk) {
659 dispatch();
660 }
661 ercd = E_OK;
662 unlock_cpu();
663
664 error_exit:
665 LOG_INI_MBF_LEAVE(ercd);
666 return(ercd);
667}
668
669#endif /* TOPPERS_ini_mbf */
670
671/*
672 * メッセージバッファの状æ…
673‹å‚ç…
674§
675 */
676#ifdef TOPPERS_ref_mbf
677
678ER
679ref_mbf(ID mbfid, T_RMBF *pk_rmbf)
680{
681 MBFCB *p_mbfcb;
682 ER ercd;
683
684 LOG_REF_MBF_ENTER(mbfid, pk_rmbf);
685 CHECK_TSKCTX_UNL();
686 CHECK_ID(VALID_MBFID(mbfid));
687 p_mbfcb = get_mbfcb(mbfid);
688
689 lock_cpu();
690 pk_rmbf->stskid = wait_tskid(&(p_mbfcb->swait_queue));
691 pk_rmbf->rtskid = wait_tskid(&(p_mbfcb->rwait_queue));
692 pk_rmbf->smbfcnt = p_mbfcb->smbfcnt;
693 pk_rmbf->fmbfsz = p_mbfcb->fmbfsz;
694 ercd = E_OK;
695 unlock_cpu();
696
697 error_exit:
698 LOG_REF_MBF_LEAVE(ercd, pk_rmbf);
699 return(ercd);
700}
701
702#endif /* TOPPERS_ref_mbf */
Note: See TracBrowser for help on using the repository browser.