source: asp_ewarm/asp-1.7.0/kernel/mailbox.c@ 61

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

ASP for EWARM のコミット.

File size: 9.0 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-2008 by Embedded and Real-Time Systems Laboratory
9 * Graduate School of Information Science, Nagoya Univ., JAPAN
10 *
11 * ã‹L’˜ìŒ ŽÒ‚́CˆÈ‰º‚Ì(1)`(4)‚ÌðŒ‚ð–ž‚½‚·ê‡‚ÉŒÀ‚èC–{ƒ\ƒtƒgƒEƒF
12 * ƒAi–{ƒ\ƒtƒgƒEƒFƒA‚ð‰ü•Ï‚µ‚½‚à‚Ì‚ðŠÜ‚ށDˆÈ‰º“¯‚¶j‚ðŽg—pE•¡»E‰ü
13 * •ÏEÄ”z•ziˆÈ‰ºC—˜—p‚ƌĂԁj‚·‚邱‚Ƃ𖳏ž‚Å‹–‘ø‚·‚éD
14 * (1) –{ƒ\ƒtƒgƒEƒFƒA‚ðƒ\[ƒXƒR[ƒh‚ÌŒ`‚Å—˜—p‚·‚éê‡‚ɂ́Cã‹L‚Ì’˜ì
15 * Œ •\Ž¦C‚±‚Ì—˜—pðŒ‚¨‚æ‚щº‹L‚Ì–³•ÛØ‹K’肪C‚»‚Ì‚Ü‚Ü‚ÌŒ`‚Ń\[
16 * ƒXƒR[ƒh’†‚ÉŠÜ‚Ü‚ê‚Ä‚¢‚邱‚ƁD
17 * (2) –{ƒ\ƒtƒgƒEƒFƒA‚ðCƒ‰ƒCƒuƒ‰ƒŠŒ`Ž®‚ȂǁC‘¼‚̃\ƒtƒgƒEƒFƒAŠJ”­‚ÉŽg
18 * —p‚Å‚«‚éŒ`‚ōĔz•z‚·‚éê‡‚ɂ́CÄ”z•z‚É”º‚¤ƒhƒLƒ…
19ƒƒ“ƒgi—˜—p
20 * ŽÒƒ}ƒjƒ…
21ƒAƒ‹‚Ȃǁj‚ɁCã‹L‚Ì’˜ìŒ •\Ž¦C‚±‚Ì—˜—pðŒ‚¨‚æ‚щº‹L
22 * ‚Ì–³•ÛØ‹K’è‚ðŒfÚ‚·‚邱‚ƁD
23 * (3) –{ƒ\ƒtƒgƒEƒFƒA‚ðC‹@Ší‚É‘g‚ݍž‚ނȂǁC‘¼‚̃\ƒtƒgƒEƒFƒAŠJ”­‚ÉŽg
24 * —p‚Å‚«‚È‚¢Œ`‚ōĔz•z‚·‚éê‡‚ɂ́CŽŸ‚Ì‚¢‚¸‚ê‚©‚ÌðŒ‚ð–ž‚½‚·‚±
25 * ‚ƁD
26 * (a) Ä”z•z‚É”º‚¤ƒhƒLƒ…
27ƒƒ“ƒgi—˜—pŽÒƒ}ƒjƒ…
28ƒAƒ‹‚Ȃǁj‚ɁCã‹L‚Ì’˜
29 * ìŒ •\Ž¦C‚±‚Ì—˜—pðŒ‚¨‚æ‚щº‹L‚Ì–³•ÛØ‹K’è‚ðŒfÚ‚·‚邱‚ƁD
30 * (b) Ä”z•z‚ÌŒ`‘Ô‚ðC•Ê‚É’è‚ß‚é•û–@‚É‚æ‚Á‚āCTOPPERSƒvƒƒWƒFƒNƒg‚É
31 * •ñ‚·‚邱‚ƁD
32 * (4) –{ƒ\ƒtƒgƒEƒFƒA‚Ì—˜—p‚É‚æ‚è’¼Ú“I‚Ü‚½‚͊ԐړI‚ɐ¶‚¶‚é‚¢‚©‚Ȃ鑹
33 * ŠQ‚©‚ç‚àCã‹L’˜ìŒ ŽÒ‚¨‚æ‚ÑTOPPERSƒvƒƒWƒFƒNƒg‚ð–Ɛӂ·‚邱‚ƁD
34 * ‚Ü‚½C–{ƒ\ƒtƒgƒEƒFƒA‚̃†[ƒU‚Ü‚½‚̓Gƒ“ƒhƒ†[ƒU‚©‚ç‚Ì‚¢‚©‚Ȃ闝
35 * —R‚ÉŠî‚­¿‹‚©‚ç‚àCã‹L’˜ìŒ ŽÒ‚¨‚æ‚ÑTOPPERSƒvƒƒWƒFƒNƒg‚ð
36 * –Ɛӂ·‚邱‚ƁD
37 *
38 * –{ƒ\ƒtƒgƒEƒFƒA‚́C–³•ÛØ‚Å’ñ‹Ÿ‚³‚ê‚Ä‚¢‚é‚à‚Ì‚Å‚ ‚éDã‹L’˜ìŒ ŽÒ‚¨
39 * ‚æ‚ÑTOPPERSƒvƒƒWƒFƒNƒg‚́C–{ƒ\ƒtƒgƒEƒFƒA‚ÉŠÖ‚µ‚āC“Á’è‚ÌŽg—p–Ú“I
40 * ‚ɑ΂·‚é“K‡«‚àŠÜ‚߂āC‚¢‚©‚È‚é•ÛØ‚às‚í‚È‚¢D‚Ü‚½C–{ƒ\ƒtƒgƒEƒF
41 * ƒA‚Ì—˜—p‚É‚æ‚è’¼Ú“I‚Ü‚½‚͊ԐړI‚ɐ¶‚¶‚½‚¢‚©‚Ȃ鑹ŠQ‚ÉŠÖ‚µ‚Ä‚àC‚»
42 * ‚̐ӔC‚𕉂í‚È‚¢D
43 *
44 * @(#) $Id: mailbox.c 748 2008-03-07 17:18:06Z hiro $
45 */
46
47/*
48 * ƒ[ƒ‹ƒ{ƒbƒNƒX‹@”\
49 */
50
51#include "kernel_impl.h"
52#include "check.h"
53#include "task.h"
54#include "wait.h"
55#include "mailbox.h"
56
57/*
58 * ƒgƒŒ[ƒXƒƒOƒ}ƒNƒ‚̃fƒtƒHƒ‹ƒg’è‹`
59 */
60#ifndef LOG_SND_MBX_ENTER
61#define LOG_SND_MBX_ENTER(mbxid, pk_msg)
62#endif /* LOG_SND_MBX_ENTER */
63
64#ifndef LOG_SND_MBX_LEAVE
65#define LOG_SND_MBX_LEAVE(ercd)
66#endif /* LOG_SND_MBX_LEAVE */
67
68#ifndef LOG_RCV_MBX_ENTER
69#define LOG_RCV_MBX_ENTER(mbxid, ppk_msg)
70#endif /* LOG_RCV_MBX_ENTER */
71
72#ifndef LOG_RCV_MBX_LEAVE
73#define LOG_RCV_MBX_LEAVE(ercd, pk_msg)
74#endif /* LOG_RCV_MBX_LEAVE */
75
76#ifndef LOG_PRCV_MBX_ENTER
77#define LOG_PRCV_MBX_ENTER(mbxid, ppk_msg)
78#endif /* LOG_PRCV_MBX_ENTER */
79
80#ifndef LOG_PRCV_MBX_LEAVE
81#define LOG_PRCV_MBX_LEAVE(ercd, pk_msg)
82#endif /* LOG_PRCV_MBX_LEAVE */
83
84#ifndef LOG_TRCV_MBX_ENTER
85#define LOG_TRCV_MBX_ENTER(mbxid, ppk_msg, tmout)
86#endif /* LOG_TRCV_MBX_ENTER */
87
88#ifndef LOG_TRCV_MBX_LEAVE
89#define LOG_TRCV_MBX_LEAVE(ercd, pk_msg)
90#endif /* LOG_TRCV_MBX_LEAVE */
91
92#ifndef LOG_INI_MBX_ENTER
93#define LOG_INI_MBX_ENTER(mbxid)
94#endif /* LOG_INI_MBX_ENTER */
95
96#ifndef LOG_INI_MBX_LEAVE
97#define LOG_INI_MBX_LEAVE(ercd)
98#endif /* LOG_INI_MBX_LEAVE */
99
100#ifndef LOG_REF_MBX_ENTER
101#define LOG_REF_MBX_ENTER(mbxid, pk_rmbx)
102#endif /* LOG_REF_MBX_ENTER */
103
104#ifndef LOG_REF_MBX_LEAVE
105#define LOG_REF_MBX_LEAVE(ercd, pk_rmbx)
106#endif /* LOG_REF_MBX_LEAVE */
107
108/*
109 * ƒ[ƒ‹ƒ{ƒbƒNƒX‚̐”
110 */
111#define tnum_mbx ((uint_t)(tmax_mbxid - TMIN_MBXID + 1))
112
113/*
114 * ƒ[ƒ‹ƒ{ƒbƒNƒXID‚©‚烁[ƒ‹ƒ{ƒbƒNƒXŠÇ—ƒuƒƒbƒN‚ðŽæ‚èo‚·‚½‚߂̃}ƒNƒ
115 */
116#define INDEX_MBX(mbxid) ((uint_t)((mbxid) - TMIN_MBXID))
117#define get_mbxcb(mbxid) (&(mbxcb_table[INDEX_MBX(mbxid)]))
118
119/*
120 * ƒ[ƒ‹ƒ{ƒbƒNƒX‹@”\‚̏‰Šú‰»
121 */
122#ifdef TOPPERS_mbxini
123
124void
125initialize_mailbox(void)
126{
127 uint_t i;
128 MBXCB *p_mbxcb;
129
130 for (p_mbxcb = mbxcb_table, i = 0; i < tnum_mbx; p_mbxcb++, i++) {
131 queue_initialize(&(p_mbxcb->wait_queue));
132 p_mbxcb->p_mbxinib = &(mbxinib_table[i]);
133 p_mbxcb->pk_head = NULL;
134 }
135}
136
137#endif /* TOPPERS_mbxini */
138
139/*
140 * ƒƒbƒZ[ƒW—Dæ“x‚ÌŽæo‚µ
141 */
142#define MSGPRI(pk_msg) (((T_MSG_PRI *) pk_msg)->msgpri)
143
144/*
145 * —Dæ“x‡ƒƒbƒZ[ƒWƒLƒ…
146[‚Ö‚Ì‘}“ü
147 */
148Inline void
149enqueue_msg_pri(T_MSG **ppk_prevmsg_next, T_MSG *pk_msg)
150{
151 T_MSG *pk_nextmsg;
152
153 while ((pk_nextmsg = *ppk_prevmsg_next) != NULL) {
154 if (MSGPRI(pk_nextmsg) > MSGPRI(pk_msg)) {
155 break;
156 }
157 ppk_prevmsg_next = &(pk_nextmsg->pk_next);
158 }
159 pk_msg->pk_next = pk_nextmsg;
160 *ppk_prevmsg_next = pk_msg;
161}
162
163/*
164 * ƒ[ƒ‹ƒ{ƒbƒNƒX‚Ö‚Ì‘—M
165 */
166#ifdef TOPPERS_snd_mbx
167
168ER
169snd_mbx(ID mbxid, T_MSG *pk_msg)
170{
171 MBXCB *p_mbxcb;
172 TCB *p_tcb;
173 ER ercd;
174
175 LOG_SND_MBX_ENTER(mbxid, pk_msg);
176 CHECK_TSKCTX_UNL();
177 CHECK_MBXID(mbxid);
178 p_mbxcb = get_mbxcb(mbxid);
179 CHECK_PAR((p_mbxcb->p_mbxinib->mbxatr & TA_MPRI) == 0U
180 || (TMIN_MPRI <= MSGPRI(pk_msg)
181 && MSGPRI(pk_msg) <= p_mbxcb->p_mbxinib->maxmpri));
182
183 t_lock_cpu();
184 if (!queue_empty(&(p_mbxcb->wait_queue))) {
185 p_tcb = (TCB *) queue_delete_next(&(p_mbxcb->wait_queue));
186 ((WINFO_MBX *)(p_tcb->p_winfo))->pk_msg = pk_msg;
187 if (wait_complete(p_tcb)) {
188 dispatch();
189 }
190 ercd = E_OK;
191 }
192 else if ((p_mbxcb->p_mbxinib->mbxatr & TA_MPRI) != 0U) {
193 enqueue_msg_pri(&(p_mbxcb->pk_head), pk_msg);
194 ercd = E_OK;
195 }
196 else {
197 pk_msg->pk_next = NULL;
198 if (p_mbxcb->pk_head != NULL) {
199 p_mbxcb->pk_last->pk_next = pk_msg;
200 }
201 else {
202 p_mbxcb->pk_head = pk_msg;
203 }
204 p_mbxcb->pk_last = pk_msg;
205 ercd = E_OK;
206 }
207 t_unlock_cpu();
208
209 error_exit:
210 LOG_SND_MBX_LEAVE(ercd);
211 return(ercd);
212}
213
214#endif /* TOPPERS_snd_mbx */
215
216/*
217 * ƒ[ƒ‹ƒ{ƒbƒNƒX‚©‚ç‚ÌŽóM
218 */
219#ifdef TOPPERS_rcv_mbx
220
221ER
222rcv_mbx(ID mbxid, T_MSG **ppk_msg)
223{
224 MBXCB *p_mbxcb;
225 WINFO_MBX winfo_mbx;
226 ER ercd;
227
228 LOG_RCV_MBX_ENTER(mbxid, ppk_msg);
229 CHECK_DISPATCH();
230 CHECK_MBXID(mbxid);
231 p_mbxcb = get_mbxcb(mbxid);
232
233 t_lock_cpu();
234 if (p_mbxcb->pk_head != NULL) {
235 *ppk_msg = p_mbxcb->pk_head;
236 p_mbxcb->pk_head = (*ppk_msg)->pk_next;
237 ercd = E_OK;
238 }
239 else {
240 p_runtsk->tstat = (TS_WAITING | TS_WAIT_MBX);
241 wobj_make_wait((WOBJCB *) p_mbxcb, (WINFO_WOBJ *) &winfo_mbx);
242 dispatch();
243 ercd = winfo_mbx.winfo.wercd;
244 if (ercd == E_OK) {
245 *ppk_msg = winfo_mbx.pk_msg;
246 }
247 }
248 t_unlock_cpu();
249
250 error_exit:
251 LOG_RCV_MBX_LEAVE(ercd, *ppk_msg);
252 return(ercd);
253}
254
255#endif /* TOPPERS_rcv_mbx */
256
257/*
258 * ƒ[ƒ‹ƒ{ƒbƒNƒX‚©‚ç‚ÌŽóMiƒ|[ƒŠƒ“ƒOj
259 */
260#ifdef TOPPERS_prcv_mbx
261
262ER
263prcv_mbx(ID mbxid, T_MSG **ppk_msg)
264{
265 MBXCB *p_mbxcb;
266 ER ercd;
267
268 LOG_PRCV_MBX_ENTER(mbxid, ppk_msg);
269 CHECK_TSKCTX_UNL();
270 CHECK_MBXID(mbxid);
271 p_mbxcb = get_mbxcb(mbxid);
272
273 t_lock_cpu();
274 if (p_mbxcb->pk_head != NULL) {
275 *ppk_msg = p_mbxcb->pk_head;
276 p_mbxcb->pk_head = (*ppk_msg)->pk_next;
277 ercd = E_OK;
278 }
279 else {
280 ercd = E_TMOUT;
281 }
282 t_unlock_cpu();
283
284 error_exit:
285 LOG_PRCV_MBX_LEAVE(ercd, *ppk_msg);
286 return(ercd);
287}
288
289#endif /* TOPPERS_prcv_mbx */
290
291/*
292 * ƒ[ƒ‹ƒ{ƒbƒNƒX‚©‚ç‚ÌŽóMiƒ^ƒCƒ€ƒAƒEƒg‚ ‚èj
293 */
294#ifdef TOPPERS_trcv_mbx
295
296ER
297trcv_mbx(ID mbxid, T_MSG **ppk_msg, TMO tmout)
298{
299 MBXCB *p_mbxcb;
300 WINFO_MBX winfo_mbx;
301 TMEVTB tmevtb;
302 ER ercd;
303
304 LOG_TRCV_MBX_ENTER(mbxid, ppk_msg, tmout);
305 CHECK_DISPATCH();
306 CHECK_MBXID(mbxid);
307 CHECK_TMOUT(tmout);
308 p_mbxcb = get_mbxcb(mbxid);
309
310 t_lock_cpu();
311 if (p_mbxcb->pk_head != NULL) {
312 *ppk_msg = p_mbxcb->pk_head;
313 p_mbxcb->pk_head = (*ppk_msg)->pk_next;
314 ercd = E_OK;
315 }
316 else if (tmout == TMO_POL) {
317 ercd = E_TMOUT;
318 }
319 else {
320 p_runtsk->tstat = (TS_WAITING | TS_WAIT_MBX);
321 wobj_make_wait_tmout((WOBJCB *) p_mbxcb, (WINFO_WOBJ *) &winfo_mbx,
322 &tmevtb, tmout);
323 dispatch();
324 ercd = winfo_mbx.winfo.wercd;
325 if (ercd == E_OK) {
326 *ppk_msg = winfo_mbx.pk_msg;
327 }
328 }
329 t_unlock_cpu();
330
331 error_exit:
332 LOG_TRCV_MBX_LEAVE(ercd, *ppk_msg);
333 return(ercd);
334}
335
336#endif /* TOPPERS_trcv_mbx */
337
338/*
339 * ƒ[ƒ‹ƒ{ƒbƒNƒX‚̍ú‰»
340 */
341#ifdef TOPPERS_ini_mbx
342
343ER
344ini_mbx(ID mbxid)
345{
346 MBXCB *p_mbxcb;
347 bool_t dspreq;
348 ER ercd;
349
350 LOG_INI_MBX_ENTER(mbxid);
351 CHECK_TSKCTX_UNL();
352 CHECK_MBXID(mbxid);
353 p_mbxcb = get_mbxcb(mbxid);
354
355 t_lock_cpu();
356 dspreq = init_wait_queue(&(p_mbxcb->wait_queue));
357 p_mbxcb->pk_head = NULL;
358 if (dspreq) {
359 dispatch();
360 }
361 ercd = E_OK;
362 t_unlock_cpu();
363
364 error_exit:
365 LOG_INI_MBX_LEAVE(ercd);
366 return(ercd);
367}
368
369#endif /* TOPPERS_ini_mbx */
370
371/*
372 * ƒ[ƒ‹ƒ{ƒbƒNƒX‚̏ó‘ÔŽQÆ
373 */
374#ifdef TOPPERS_ref_mbx
375
376ER
377ref_mbx(ID mbxid, T_RMBX *pk_rmbx)
378{
379 MBXCB *p_mbxcb;
380 ER ercd;
381
382 LOG_REF_MBX_ENTER(mbxid, pk_rmbx);
383 CHECK_TSKCTX_UNL();
384 CHECK_MBXID(mbxid);
385 p_mbxcb = get_mbxcb(mbxid);
386
387 t_lock_cpu();
388 pk_rmbx->wtskid = wait_tskid(&(p_mbxcb->wait_queue));
389 pk_rmbx->pk_msg = p_mbxcb->pk_head;
390 ercd = E_OK;
391 t_unlock_cpu();
392
393 error_exit:
394 LOG_REF_MBX_LEAVE(ercd, pk_rmbx);
395 return(ercd);
396}
397
398#endif /* TOPPERS_ref_mbx */
Note: See TracBrowser for help on using the repository browser.