source: asp_ewarm/asp-1.7.0/extension/rstr_task/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.4 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-2010 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 1887 2010-08-06 06:15:19Z 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 CHECK_NONRSTR(p_tcb);
230
231 t_lock_cpu();
232 if (TSTAT_DORMANT(p_tcb->tstat)) {
233 ercd = E_OBJ;
234 }
235 else if (TSTAT_WAIT_SLP(p_tcb->tstat)) {
236 if (wait_complete(p_tcb)) {
237 dispatch();
238 }
239 ercd = E_OK;
240 }
241 else if (!(p_tcb->wupque)) {
242 p_tcb->wupque = true;
243 ercd = E_OK;
244 }
245 else {
246 ercd = E_QOVR;
247 }
248 t_unlock_cpu();
249
250 error_exit:
251 LOG_WUP_TSK_LEAVE(ercd);
252 return(ercd);
253}
254
255#endif /* TOPPERS_wup_tsk */
256
257/*
258 * ƒ^ƒXƒN‚Ì‹N°i”ñƒ^ƒXƒNƒRƒ“ƒeƒLƒXƒg—pj
259 */
260#ifdef TOPPERS_iwup_tsk
261
262ER
263iwup_tsk(ID tskid)
264{
265 TCB *p_tcb;
266 ER ercd;
267
268 LOG_IWUP_TSK_ENTER(tskid);
269 CHECK_INTCTX_UNL();
270 CHECK_TSKID(tskid);
271 p_tcb = get_tcb(tskid);
272 CHECK_NONRSTR(p_tcb);
273
274 i_lock_cpu();
275 if (TSTAT_DORMANT(p_tcb->tstat)) {
276 ercd = E_OBJ;
277 }
278 else if (TSTAT_WAIT_SLP(p_tcb->tstat)) {
279 if (wait_complete(p_tcb)) {
280 reqflg = true;
281 }
282 ercd = E_OK;
283 }
284 else if (!(p_tcb->wupque)) {
285 p_tcb->wupque = true;
286 ercd = E_OK;
287 }
288 else {
289 ercd = E_QOVR;
290 }
291 i_unlock_cpu();
292
293 error_exit:
294 LOG_IWUP_TSK_LEAVE(ercd);
295 return(ercd);
296}
297
298#endif /* TOPPERS_iwup_tsk */
299
300/*
301 * ƒ^ƒXƒN‹N°—v‹‚̃Lƒƒƒ“ƒZƒ‹
302 */
303#ifdef TOPPERS_can_wup
304
305ER_UINT
306can_wup(ID tskid)
307{
308 TCB *p_tcb;
309 ER_UINT ercd;
310
311 LOG_CAN_WUP_ENTER(tskid);
312 CHECK_TSKCTX_UNL();
313 CHECK_TSKID_SELF(tskid);
314 p_tcb = get_tcb_self(tskid);
315 CHECK_NONRSTR(p_tcb);
316
317 t_lock_cpu();
318 if (TSTAT_DORMANT(p_tcb->tstat)) {
319 ercd = E_OBJ;
320 }
321 else {
322 ercd = p_tcb->wupque ? 1 : 0;
323 p_tcb->wupque = false;
324 }
325 t_unlock_cpu();
326
327 error_exit:
328 LOG_CAN_WUP_LEAVE(ercd);
329 return(ercd);
330}
331
332#endif /* TOPPERS_can_wup */
333
334/*
335 * ‘Ò‚¿ó‘Ô‚Ì‹­§‰ðœ
336 */
337#ifdef TOPPERS_rel_wai
338
339ER
340rel_wai(ID tskid)
341{
342 TCB *p_tcb;
343 ER ercd;
344
345 LOG_REL_WAI_ENTER(tskid);
346 CHECK_TSKCTX_UNL();
347 CHECK_TSKID(tskid);
348 p_tcb = get_tcb(tskid);
349 CHECK_NONRSTR(p_tcb);
350
351 t_lock_cpu();
352 if (!TSTAT_WAITING(p_tcb->tstat)) {
353 ercd = E_OBJ;
354 }
355 else {
356 if (wait_release(p_tcb)) {
357 dispatch();
358 }
359 ercd = E_OK;
360 }
361 t_unlock_cpu();
362
363 error_exit:
364 LOG_REL_WAI_LEAVE(ercd);
365 return(ercd);
366}
367
368#endif /* TOPPERS_rel_wai */
369
370/*
371 * ‘Ò‚¿ó‘Ô‚Ì‹­§‰ðœi”ñƒ^ƒXƒNƒRƒ“ƒeƒLƒXƒg—pj
372 */
373#ifdef TOPPERS_irel_wai
374
375ER
376irel_wai(ID tskid)
377{
378 TCB *p_tcb;
379 ER ercd;
380
381 LOG_IREL_WAI_ENTER(tskid);
382 CHECK_INTCTX_UNL();
383 CHECK_TSKID(tskid);
384 p_tcb = get_tcb(tskid);
385 CHECK_NONRSTR(p_tcb);
386
387 i_lock_cpu();
388 if (!TSTAT_WAITING(p_tcb->tstat)) {
389 ercd = E_OBJ;
390 }
391 else {
392 if (wait_release(p_tcb)) {
393 reqflg = true;
394 }
395 ercd = E_OK;
396 }
397 i_unlock_cpu();
398
399 error_exit:
400 LOG_IREL_WAI_LEAVE(ercd);
401 return(ercd);
402}
403
404#endif /* TOPPERS_irel_wai */
405
406/*
407 * ‹­§‘Ò‚¿ó‘Ԃւ̈ڍs
408 */
409#ifdef TOPPERS_sus_tsk
410
411ER
412sus_tsk(ID tskid)
413{
414 TCB *p_tcb;
415 ER ercd;
416
417 LOG_SUS_TSK_ENTER(tskid);
418 CHECK_TSKCTX_UNL();
419 CHECK_TSKID_SELF(tskid);
420 p_tcb = get_tcb_self(tskid);
421 CHECK_NONRSTR(p_tcb);
422
423 t_lock_cpu();
424 if (p_tcb == p_runtsk && !dspflg) {
425 ercd = E_CTX;
426 }
427 else if (TSTAT_DORMANT(p_tcb->tstat)) {
428 ercd = E_OBJ;
429 }
430 else if (TSTAT_RUNNABLE(p_tcb->tstat)) {
431 /*
432 * ŽÀs‚Å‚«‚éó‘Ô‚©‚ç‹­§‘Ò‚¿ó‘Ô‚Ö‚Ì‘JˆÚ
433 */
434 p_tcb->tstat = TS_SUSPENDED;
435 LOG_TSKSTAT(p_tcb);
436 if (make_non_runnable(p_tcb)) {
437 dispatch();
438 }
439 ercd = E_OK;
440 }
441 else if (TSTAT_SUSPENDED(p_tcb->tstat)) {
442 ercd = E_QOVR;
443 }
444 else {
445 /*
446 * ‘Ò‚¿ó‘Ô‚©‚ç“ñd‘Ò‚¿ó‘Ô‚Ö‚Ì‘JˆÚ
447 */
448 p_tcb->tstat |= TS_SUSPENDED;
449 LOG_TSKSTAT(p_tcb);
450 ercd = E_OK;
451 }
452 t_unlock_cpu();
453
454 error_exit:
455 LOG_SUS_TSK_LEAVE(ercd);
456 return(ercd);
457}
458
459#endif /* TOPPERS_sus_tsk */
460
461/*
462 * ‹­§‘Ò‚¿ó‘Ô‚©‚ç‚̍ĊJ
463 */
464#ifdef TOPPERS_rsm_tsk
465
466ER
467rsm_tsk(ID tskid)
468{
469 TCB *p_tcb;
470 ER ercd;
471
472 LOG_RSM_TSK_ENTER(tskid);
473 CHECK_TSKCTX_UNL();
474 CHECK_TSKID(tskid);
475 p_tcb = get_tcb(tskid);
476 CHECK_NONRSTR(p_tcb);
477
478 t_lock_cpu();
479 if (!TSTAT_SUSPENDED(p_tcb->tstat)) {
480 ercd = E_OBJ;
481 }
482 else if (!TSTAT_WAITING(p_tcb->tstat)) {
483 /*
484 * ‹­§‘Ò‚¿ó‘Ô‚©‚çŽÀs‚Å‚«‚éó‘Ô‚Ö‚Ì‘JˆÚ
485 */
486 p_tcb->tstat = TS_RUNNABLE;
487 LOG_TSKSTAT(p_tcb);
488 if (make_runnable(p_tcb)) {
489 dispatch();
490 }
491 ercd = E_OK;
492 }
493 else {
494 /*
495 * “ñd‘Ò‚¿ó‘Ô‚©‚ç‘Ò‚¿ó‘Ô‚Ö‚Ì‘JˆÚ
496 */
497 p_tcb->tstat &= ~TS_SUSPENDED;
498 LOG_TSKSTAT(p_tcb);
499 ercd = E_OK;
500 }
501 t_unlock_cpu();
502
503 error_exit:
504 LOG_RSM_TSK_LEAVE(ercd);
505 return(ercd);
506}
507
508#endif /* TOPPERS_rsm_tsk */
509
510/*
511 * Ž©ƒ^ƒXƒN‚Ì’x‰„
512 */
513#ifdef TOPPERS_dly_tsk
514
515ER
516dly_tsk(RELTIM dlytim)
517{
518 WINFO winfo;
519 TMEVTB tmevtb;
520 ER ercd;
521
522 LOG_DLY_TSK_ENTER(dlytim);
523 CHECK_DISPATCH();
524 CHECK_PAR(dlytim <= TMAX_RELTIM);
525
526 t_lock_cpu();
527 p_runtsk->tstat = (TS_WAITING | TS_WAIT_DLY);
528 (void) make_non_runnable(p_runtsk);
529 p_runtsk->p_winfo = &winfo;
530 winfo.p_tmevtb = &tmevtb;
531 tmevtb_enqueue(&tmevtb, dlytim, (CBACK) wait_tmout_ok, (void *) p_runtsk);
532 LOG_TSKSTAT(p_runtsk);
533 dispatch();
534 ercd = winfo.wercd;
535 t_unlock_cpu();
536
537 error_exit:
538 LOG_DLY_TSK_LEAVE(ercd);
539 return(ercd);
540}
541
542#endif /* TOPPERS_dly_tsk */
Note: See TracBrowser for help on using the repository browser.