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

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

ASP for EWARM のコミット.

File size: 10.3 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-2009 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: task_sync.c 1453 2009-02-18 09:09:34Z ertl-hiro $
45 */
46
47/*
48 * ƒ^ƒXƒN•t‘®“¯Šú‹@”\
49 */
50
51#include "kernel_impl.h"
52#include "check.h"
53#include "task.h"
54#include "wait.h"
55
56/*
57 * ƒgƒŒ[ƒXƒƒOƒ}ƒNƒ‚̃fƒtƒHƒ‹ƒg’è‹`
58 */
59#ifndef LOG_SLP_TSK_ENTER
60#define LOG_SLP_TSK_ENTER()
61#endif /* LOG_SLP_TSK_ENTER */
62
63#ifndef LOG_SLP_TSK_LEAVE
64#define LOG_SLP_TSK_LEAVE(ercd)
65#endif /* LOG_SLP_TSK_LEAVE */
66
67#ifndef LOG_TSLP_TSK_ENTER
68#define LOG_TSLP_TSK_ENTER(tmout)
69#endif /* LOG_TSLP_TSK_ENTER */
70
71#ifndef LOG_TSLP_TSK_LEAVE
72#define LOG_TSLP_TSK_LEAVE(ercd)
73#endif /* LOG_TSLP_TSK_LEAVE */
74
75#ifndef LOG_WUP_TSK_ENTER
76#define LOG_WUP_TSK_ENTER(tskid)
77#endif /* LOG_WUP_TSK_ENTER */
78
79#ifndef LOG_WUP_TSK_LEAVE
80#define LOG_WUP_TSK_LEAVE(ercd)
81#endif /* LOG_WUP_TSK_LEAVE */
82
83#ifndef LOG_IWUP_TSK_ENTER
84#define LOG_IWUP_TSK_ENTER(tskid)
85#endif /* LOG_IWUP_TSK_ENTER */
86
87#ifndef LOG_IWUP_TSK_LEAVE
88#define LOG_IWUP_TSK_LEAVE(ercd)
89#endif /* LOG_IWUP_TSK_LEAVE */
90
91#ifndef LOG_CAN_WUP_ENTER
92#define LOG_CAN_WUP_ENTER(tskid)
93#endif /* LOG_CAN_WUP_ENTER */
94
95#ifndef LOG_CAN_WUP_LEAVE
96#define LOG_CAN_WUP_LEAVE(ercd)
97#endif /* LOG_CAN_WUP_LEAVE */
98
99#ifndef LOG_REL_WAI_ENTER
100#define LOG_REL_WAI_ENTER(tskid)
101#endif /* LOG_REL_WAI_ENTER */
102
103#ifndef LOG_REL_WAI_LEAVE
104#define LOG_REL_WAI_LEAVE(ercd)
105#endif /* LOG_REL_WAI_LEAVE */
106
107#ifndef LOG_IREL_WAI_ENTER
108#define LOG_IREL_WAI_ENTER(tskid)
109#endif /* LOG_IREL_WAI_ENTER */
110
111#ifndef LOG_IREL_WAI_LEAVE
112#define LOG_IREL_WAI_LEAVE(ercd)
113#endif /* LOG_IREL_WAI_LEAVE */
114
115#ifndef LOG_SUS_TSK_ENTER
116#define LOG_SUS_TSK_ENTER(tskid)
117#endif /* LOG_SUS_TSK_ENTER */
118
119#ifndef LOG_SUS_TSK_LEAVE
120#define LOG_SUS_TSK_LEAVE(ercd)
121#endif /* LOG_SUS_TSK_LEAVE */
122
123#ifndef LOG_RSM_TSK_ENTER
124#define LOG_RSM_TSK_ENTER(tskid)
125#endif /* LOG_RSM_TSK_ENTER */
126
127#ifndef LOG_RSM_TSK_LEAVE
128#define LOG_RSM_TSK_LEAVE(ercd)
129#endif /* LOG_RSM_TSK_LEAVE */
130
131#ifndef LOG_DLY_TSK_ENTER
132#define LOG_DLY_TSK_ENTER(dlytim)
133#endif /* LOG_DLY_TSK_ENTER */
134
135#ifndef LOG_DLY_TSK_LEAVE
136#define LOG_DLY_TSK_LEAVE(ercd)
137#endif /* LOG_DLY_TSK_LEAVE */
138
139/*
140 * ‹N°‘Ò‚¿
141 */
142#ifdef TOPPERS_slp_tsk
143
144ER
145slp_tsk(void)
146{
147 WINFO winfo;
148 ER ercd;
149
150 LOG_SLP_TSK_ENTER();
151 CHECK_DISPATCH();
152
153 t_lock_cpu();
154 if (p_runtsk->wupque) {
155 p_runtsk->wupque = false;
156 ercd = E_OK;
157 }
158 else {
159 p_runtsk->tstat = (TS_WAITING | TS_WAIT_SLP);
160 make_wait(&winfo);
161 LOG_TSKSTAT(p_runtsk);
162 dispatch();
163 ercd = winfo.wercd;
164 }
165 t_unlock_cpu();
166
167 error_exit:
168 LOG_SLP_TSK_LEAVE(ercd);
169 return(ercd);
170}
171
172#endif /* TOPPERS_slp_tsk */
173
174/*
175 * ‹N°‘Ò‚¿iƒ^ƒCƒ€ƒAƒEƒg‚ ‚èj
176 */
177#ifdef TOPPERS_tslp_tsk
178
179ER
180tslp_tsk(TMO tmout)
181{
182 WINFO winfo;
183 TMEVTB tmevtb;
184 ER ercd;
185
186 LOG_TSLP_TSK_ENTER(tmout);
187 CHECK_DISPATCH();
188 CHECK_TMOUT(tmout);
189
190 t_lock_cpu();
191 if (p_runtsk->wupque) {
192 p_runtsk->wupque = false;
193 ercd = E_OK;
194 }
195 else if (tmout == TMO_POL) {
196 ercd = E_TMOUT;
197 }
198 else {
199 p_runtsk->tstat = (TS_WAITING | TS_WAIT_SLP);
200 make_wait_tmout(&winfo, &tmevtb, tmout);
201 LOG_TSKSTAT(p_runtsk);
202 dispatch();
203 ercd = winfo.wercd;
204 }
205 t_unlock_cpu();
206
207 error_exit:
208 LOG_TSLP_TSK_LEAVE(ercd);
209 return(ercd);
210}
211
212#endif /* TOPPERS_tslp_tsk */
213
214/*
215 * ƒ^ƒXƒN‚Ì‹N°
216 */
217#ifdef TOPPERS_wup_tsk
218
219ER
220wup_tsk(ID tskid)
221{
222 TCB *p_tcb;
223 ER ercd;
224
225 LOG_WUP_TSK_ENTER(tskid);
226 CHECK_TSKCTX_UNL();
227 CHECK_TSKID_SELF(tskid);
228 p_tcb = get_tcb_self(tskid);
229
230 t_lock_cpu();
231 if (TSTAT_DORMANT(p_tcb->tstat)) {
232 ercd = E_OBJ;
233 }
234 else if (TSTAT_WAIT_SLP(p_tcb->tstat)) {
235 if (wait_complete(p_tcb)) {
236 dispatch();
237 }
238 ercd = E_OK;
239 }
240 else if (!(p_tcb->wupque)) {
241 p_tcb->wupque = true;
242 ercd = E_OK;
243 }
244 else {
245 ercd = E_QOVR;
246 }
247 t_unlock_cpu();
248
249 error_exit:
250 LOG_WUP_TSK_LEAVE(ercd);
251 return(ercd);
252}
253
254#endif /* TOPPERS_wup_tsk */
255
256/*
257 * ƒ^ƒXƒN‚Ì‹N°i”ñƒ^ƒXƒNƒRƒ“ƒeƒLƒXƒg—pj
258 */
259#ifdef TOPPERS_iwup_tsk
260
261ER
262iwup_tsk(ID tskid)
263{
264 TCB *p_tcb;
265 ER ercd;
266
267 LOG_IWUP_TSK_ENTER(tskid);
268 CHECK_INTCTX_UNL();
269 CHECK_TSKID(tskid);
270 p_tcb = get_tcb(tskid);
271
272 i_lock_cpu();
273 if (TSTAT_DORMANT(p_tcb->tstat)) {
274 ercd = E_OBJ;
275 }
276 else if (TSTAT_WAIT_SLP(p_tcb->tstat)) {
277 if (wait_complete(p_tcb)) {
278 reqflg = true;
279 }
280 ercd = E_OK;
281 }
282 else if (!(p_tcb->wupque)) {
283 p_tcb->wupque = true;
284 ercd = E_OK;
285 }
286 else {
287 ercd = E_QOVR;
288 }
289 i_unlock_cpu();
290
291 error_exit:
292 LOG_IWUP_TSK_LEAVE(ercd);
293 return(ercd);
294}
295
296#endif /* TOPPERS_iwup_tsk */
297
298/*
299 * ƒ^ƒXƒN‹N°—v‹‚̃Lƒƒƒ“ƒZƒ‹
300 */
301#ifdef TOPPERS_can_wup
302
303ER_UINT
304can_wup(ID tskid)
305{
306 TCB *p_tcb;
307 ER_UINT ercd;
308
309 LOG_CAN_WUP_ENTER(tskid);
310 CHECK_TSKCTX_UNL();
311 CHECK_TSKID_SELF(tskid);
312 p_tcb = get_tcb_self(tskid);
313
314 t_lock_cpu();
315 if (TSTAT_DORMANT(p_tcb->tstat)) {
316 ercd = E_OBJ;
317 }
318 else {
319 ercd = p_tcb->wupque ? 1 : 0;
320 p_tcb->wupque = false;
321 }
322 t_unlock_cpu();
323
324 error_exit:
325 LOG_CAN_WUP_LEAVE(ercd);
326 return(ercd);
327}
328
329#endif /* TOPPERS_can_wup */
330
331/*
332 * ‘Ò‚¿ó‘Ô‚Ì‹­§‰ðœ
333 */
334#ifdef TOPPERS_rel_wai
335
336ER
337rel_wai(ID tskid)
338{
339 TCB *p_tcb;
340 ER ercd;
341
342 LOG_REL_WAI_ENTER(tskid);
343 CHECK_TSKCTX_UNL();
344 CHECK_TSKID(tskid);
345 p_tcb = get_tcb(tskid);
346
347 t_lock_cpu();
348 if (!TSTAT_WAITING(p_tcb->tstat)) {
349 ercd = E_OBJ;
350 }
351 else {
352 if (wait_release(p_tcb)) {
353 dispatch();
354 }
355 ercd = E_OK;
356 }
357 t_unlock_cpu();
358
359 error_exit:
360 LOG_REL_WAI_LEAVE(ercd);
361 return(ercd);
362}
363
364#endif /* TOPPERS_rel_wai */
365
366/*
367 * ‘Ò‚¿ó‘Ô‚Ì‹­§‰ðœi”ñƒ^ƒXƒNƒRƒ“ƒeƒLƒXƒg—pj
368 */
369#ifdef TOPPERS_irel_wai
370
371ER
372irel_wai(ID tskid)
373{
374 TCB *p_tcb;
375 ER ercd;
376
377 LOG_IREL_WAI_ENTER(tskid);
378 CHECK_INTCTX_UNL();
379 CHECK_TSKID(tskid);
380 p_tcb = get_tcb(tskid);
381
382 i_lock_cpu();
383 if (!TSTAT_WAITING(p_tcb->tstat)) {
384 ercd = E_OBJ;
385 }
386 else {
387 if (wait_release(p_tcb)) {
388 reqflg = true;
389 }
390 ercd = E_OK;
391 }
392 i_unlock_cpu();
393
394 error_exit:
395 LOG_IREL_WAI_LEAVE(ercd);
396 return(ercd);
397}
398
399#endif /* TOPPERS_irel_wai */
400
401/*
402 * ‹­§‘Ò‚¿ó‘Ԃւ̈ڍs
403 */
404#ifdef TOPPERS_sus_tsk
405
406ER
407sus_tsk(ID tskid)
408{
409 TCB *p_tcb;
410 ER ercd;
411
412 LOG_SUS_TSK_ENTER(tskid);
413 CHECK_TSKCTX_UNL();
414 CHECK_TSKID_SELF(tskid);
415 p_tcb = get_tcb_self(tskid);
416
417 t_lock_cpu();
418 if (p_tcb == p_runtsk && !dspflg) {
419 ercd = E_CTX;
420 }
421 else if (TSTAT_DORMANT(p_tcb->tstat)) {
422 ercd = E_OBJ;
423 }
424 else if (TSTAT_RUNNABLE(p_tcb->tstat)) {
425 /*
426 * ŽÀs‚Å‚«‚éó‘Ô‚©‚ç‹­§‘Ò‚¿ó‘Ô‚Ö‚Ì‘JˆÚ
427 */
428 p_tcb->tstat = TS_SUSPENDED;
429 LOG_TSKSTAT(p_tcb);
430 if (make_non_runnable(p_tcb)) {
431 dispatch();
432 }
433 ercd = E_OK;
434 }
435 else if (TSTAT_SUSPENDED(p_tcb->tstat)) {
436 ercd = E_QOVR;
437 }
438 else {
439 /*
440 * ‘Ò‚¿ó‘Ô‚©‚ç“ñd‘Ò‚¿ó‘Ô‚Ö‚Ì‘JˆÚ
441 */
442 p_tcb->tstat |= TS_SUSPENDED;
443 LOG_TSKSTAT(p_tcb);
444 ercd = E_OK;
445 }
446 t_unlock_cpu();
447
448 error_exit:
449 LOG_SUS_TSK_LEAVE(ercd);
450 return(ercd);
451}
452
453#endif /* TOPPERS_sus_tsk */
454
455/*
456 * ‹­§‘Ò‚¿ó‘Ô‚©‚ç‚̍ĊJ
457 */
458#ifdef TOPPERS_rsm_tsk
459
460ER
461rsm_tsk(ID tskid)
462{
463 TCB *p_tcb;
464 ER ercd;
465
466 LOG_RSM_TSK_ENTER(tskid);
467 CHECK_TSKCTX_UNL();
468 CHECK_TSKID(tskid);
469 p_tcb = get_tcb(tskid);
470
471 t_lock_cpu();
472 if (!TSTAT_SUSPENDED(p_tcb->tstat)) {
473 ercd = E_OBJ;
474 }
475 else if (!TSTAT_WAITING(p_tcb->tstat)) {
476 /*
477 * ‹­§‘Ò‚¿ó‘Ô‚©‚çŽÀs‚Å‚«‚éó‘Ô‚Ö‚Ì‘JˆÚ
478 */
479 p_tcb->tstat = TS_RUNNABLE;
480 LOG_TSKSTAT(p_tcb);
481 if (make_runnable(p_tcb)) {
482 dispatch();
483 }
484 ercd = E_OK;
485 }
486 else {
487 /*
488 * “ñd‘Ò‚¿ó‘Ô‚©‚ç‘Ò‚¿ó‘Ô‚Ö‚Ì‘JˆÚ
489 */
490 p_tcb->tstat &= ~TS_SUSPENDED;
491 LOG_TSKSTAT(p_tcb);
492 ercd = E_OK;
493 }
494 t_unlock_cpu();
495
496 error_exit:
497 LOG_RSM_TSK_LEAVE(ercd);
498 return(ercd);
499}
500
501#endif /* TOPPERS_rsm_tsk */
502
503/*
504 * Ž©ƒ^ƒXƒN‚Ì’x‰„
505 */
506#ifdef TOPPERS_dly_tsk
507
508ER
509dly_tsk(RELTIM dlytim)
510{
511 WINFO winfo;
512 TMEVTB tmevtb;
513 ER ercd;
514
515 LOG_DLY_TSK_ENTER(dlytim);
516 CHECK_DISPATCH();
517 CHECK_PAR(dlytim <= TMAX_RELTIM);
518
519 t_lock_cpu();
520 p_runtsk->tstat = (TS_WAITING | TS_WAIT_DLY);
521 (void) make_non_runnable(p_runtsk);
522 p_runtsk->p_winfo = &winfo;
523 winfo.p_tmevtb = &tmevtb;
524 tmevtb_enqueue(&tmevtb, dlytim, (CBACK) wait_tmout_ok, (void *) p_runtsk);
525 LOG_TSKSTAT(p_runtsk);
526 dispatch();
527 ercd = winfo.wercd;
528 t_unlock_cpu();
529
530 error_exit:
531 LOG_DLY_TSK_LEAVE(ercd);
532 return(ercd);
533}
534
535#endif /* TOPPERS_dly_tsk */
Note: See TracBrowser for help on using the repository browser.