source: extension/dcre/kernel/task_sync.c @ 7

このファイルの 7 以降における最終更新内容7 で kominami が 2015/09/12 9:22:12 に更新しました

TOPPERS/ASP 1.9.1

ファイルサイズ: 10.2 KB
Rev 
[7]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 *  Ÿåµ­Ãøºîž¢ŒÔ€Ï¡€°Ê²Œ€Î(1)¡Á(4)€ÎŸò·ï€òËþ€¿€¹Ÿì¹ç€ËžÂ€ê¡€ËÜ¥œ¥Õ¥È¥Š¥§
12 *  ¥¢¡ÊËÜ¥œ¥Õ¥È¥Š¥§¥¢€ò²þÊÑ€·€¿€â€Î€òŽÞ€à¡¥°Ê²ŒÆ±€ž¡Ë€ò»ÈÍÑ¡ŠÊ£Àœ¡Š²þ
13 *  ÊÑ¡ŠºÆÇÛÉۡʰʲŒ¡€ÍøÍрȞƀ֡ˀ¹€ë€³€È€ò̵œþ€ÇµöÂú€¹€ë¡¥
14 *  (1) ËÜ¥œ¥Õ¥È¥Š¥§¥¢€ò¥œ¡Œ¥¹¥³¡Œ¥É€Î·Á€ÇÍøÍÑ€¹€ëŸì¹ç€Ë€Ï¡€Ÿåµ­€ÎÃøºî
15 *      ž¢ÉœŒš¡€€³€ÎÍøÍÑŸò·ï€ª€è€Ó²Œµ­€Î̵ÊÝŸÚµ¬Äꀬ¡€€œ€Î€Þ€Þ€Î·Á€Ç¥œ¡Œ
16 *      ¥¹¥³¡Œ¥ÉÃæ€ËŽÞ€Þ€ì€Æ€€€ë€³€È¡¥
17 *  (2) ËÜ¥œ¥Õ¥È¥Š¥§¥¢€ò¡€¥é¥€¥Ö¥é¥ê·ÁŒ°€Ê€É¡€ÂŸ€Î¥œ¥Õ¥È¥Š¥§¥¢³«È¯€Ë»È
18 *      Íрǀ­€ë·Á€ÇºÆÇÛÉÛ€¹€ëŸì¹ç€Ë€Ï¡€ºÆÇÛÉÛ€ËÈŒ€Š¥É¥­¥å¥á¥ó¥È¡ÊÍøÍÑ
19 *      ŒÔ¥Þ¥Ë¥å¥¢¥ë€Ê€É¡Ë€Ë¡€Ÿåµ­€ÎÃøºîž¢ÉœŒš¡€€³€ÎÍøÍÑŸò·ï€ª€è€Ó²Œµ­
20 *      €Î̵ÊÝŸÚµ¬Äê€ò·ÇºÜ€¹€ë€³€È¡¥
21 *  (3) ËÜ¥œ¥Õ¥È¥Š¥§¥¢€ò¡€µ¡Žï€ËÁȀ߹þ€à€Ê€É¡€ÂŸ€Î¥œ¥Õ¥È¥Š¥§¥¢³«È¯€Ë»È
22 *      Íрǀ­€Ê€€·Á€ÇºÆÇÛÉÛ€¹€ëŸì¹ç€Ë€Ï¡€Œ¡€Î€€€º€ì€«€ÎŸò·ï€òËþ€¿€¹€³
23 *      €È¡¥
24 *    (a) ºÆÇÛÉÛ€ËÈŒ€Š¥É¥­¥å¥á¥ó¥È¡ÊÍøÍьԥޥ˥奢¥ë€Ê€É¡Ë€Ë¡€Ÿåµ­€ÎÃø
25 *        ºîž¢ÉœŒš¡€€³€ÎÍøÍÑŸò·ï€ª€è€Ó²Œµ­€Î̵ÊÝŸÚµ¬Äê€ò·ÇºÜ€¹€ë€³€È¡¥
26 *    (b) ºÆÇÛÉۀηÁÂÖ€ò¡€ÊÌ€ËÄê€á€ëÊýË¡€Ë€è€Ã€Æ¡€TOPPERS¥×¥í¥ž¥§¥¯¥È€Ë
27 *        Êó¹ð€¹€ë€³€È¡¥
28 *  (4) ËÜ¥œ¥Õ¥È¥Š¥§¥¢€ÎÍøÍрˀè€êÄŸÀÜŪ€Þ€¿€ÏŽÖÀÜŪ€ËÀž€ž€ë€€€«€Ê€ë»
29 *      ³²€«€é€â¡€Ÿåµ­Ãøºîž¢ŒÔ€ª€è€ÓTOPPERS¥×¥í¥ž¥§¥¯¥È€òÌÈÀÕ€¹€ë€³€È¡¥
30 *      €Þ€¿¡€ËÜ¥œ¥Õ¥È¥Š¥§¥¢€Î¥æ¡Œ¥¶€Þ€¿€Ï¥š¥ó¥É¥æ¡Œ¥¶€«€é€Î€€€«€Ê€ëÍý
31 *      ͳ€ËŽð€Å€¯ÀÁµá€«€é€â¡€Ÿåµ­Ãøºîž¢ŒÔ€ª€è€ÓTOPPERS¥×¥í¥ž¥§¥¯¥È€ò
32 *      ÌÈÀÕ€¹€ë€³€È¡¥
33 *
34 *  ËÜ¥œ¥Õ¥È¥Š¥§¥¢€Ï¡€ÌµÊÝŸÚ€ÇÄó¶¡€µ€ì€Æ€€€ë€â€Î€Ç€¢€ë¡¥Ÿåµ­Ãøºîž¢ŒÔ€ª
35 *  €è€ÓTOPPERS¥×¥í¥ž¥§¥¯¥È€Ï¡€ËÜ¥œ¥Õ¥È¥Š¥§¥¢€ËŽØ€·€Æ¡€ÆÃÄê€Î»ÈÍÑÌÜŪ
36 *  €ËÂЀ¹€ëŬ¹çÀ­€âŽÞ€á€Æ¡€€€€«€Ê€ëÊÝŸÚ€â¹Ô€ï€Ê€€¡¥€Þ€¿¡€ËÜ¥œ¥Õ¥È¥Š¥§
37 *  ¥¢€ÎÍøÍрˀè€êÄŸÀÜŪ€Þ€¿€ÏŽÖÀÜŪ€ËÀž€ž€¿€€€«€Ê€ë»³²€ËŽØ€·€Æ€â¡€€œ
38 *  €ÎÀÕÇ€€òÉé€ï€Ê€€¡¥
39 *
40 *  @(#) $Id$
41 */
42
43/*
44 *              ¥¿¥¹¥¯ÉÕ°ƱŽüµ¡Çœ
45 */
46
47#include "kernel_impl.h"
48#include "check.h"
49#include "task.h"
50#include "wait.h"
51
52/*
53 *  ¥È¥ì¡Œ¥¹¥í¥°¥Þ¥¯¥í€Î¥Ç¥Õ¥©¥ë¥ÈÄêµÁ
54 */
55#ifndef LOG_SLP_TSK_ENTER
56#define LOG_SLP_TSK_ENTER()
57#endif /* LOG_SLP_TSK_ENTER */
58
59#ifndef LOG_SLP_TSK_LEAVE
60#define LOG_SLP_TSK_LEAVE(ercd)
61#endif /* LOG_SLP_TSK_LEAVE */
62
63#ifndef LOG_TSLP_TSK_ENTER
64#define LOG_TSLP_TSK_ENTER(tmout)
65#endif /* LOG_TSLP_TSK_ENTER */
66
67#ifndef LOG_TSLP_TSK_LEAVE
68#define LOG_TSLP_TSK_LEAVE(ercd)
69#endif /* LOG_TSLP_TSK_LEAVE */
70
71#ifndef LOG_WUP_TSK_ENTER
72#define LOG_WUP_TSK_ENTER(tskid)
73#endif /* LOG_WUP_TSK_ENTER */
74
75#ifndef LOG_WUP_TSK_LEAVE
76#define LOG_WUP_TSK_LEAVE(ercd)
77#endif /* LOG_WUP_TSK_LEAVE */
78
79#ifndef LOG_IWUP_TSK_ENTER
80#define LOG_IWUP_TSK_ENTER(tskid)
81#endif /* LOG_IWUP_TSK_ENTER */
82
83#ifndef LOG_IWUP_TSK_LEAVE
84#define LOG_IWUP_TSK_LEAVE(ercd)
85#endif /* LOG_IWUP_TSK_LEAVE */
86
87#ifndef LOG_CAN_WUP_ENTER
88#define LOG_CAN_WUP_ENTER(tskid)
89#endif /* LOG_CAN_WUP_ENTER */
90
91#ifndef LOG_CAN_WUP_LEAVE
92#define LOG_CAN_WUP_LEAVE(ercd)
93#endif /* LOG_CAN_WUP_LEAVE */
94
95#ifndef LOG_REL_WAI_ENTER
96#define LOG_REL_WAI_ENTER(tskid)
97#endif /* LOG_REL_WAI_ENTER */
98
99#ifndef LOG_REL_WAI_LEAVE
100#define LOG_REL_WAI_LEAVE(ercd)
101#endif /* LOG_REL_WAI_LEAVE */
102
103#ifndef LOG_IREL_WAI_ENTER
104#define LOG_IREL_WAI_ENTER(tskid)
105#endif /* LOG_IREL_WAI_ENTER */
106
107#ifndef LOG_IREL_WAI_LEAVE
108#define LOG_IREL_WAI_LEAVE(ercd)
109#endif /* LOG_IREL_WAI_LEAVE */
110
111#ifndef LOG_SUS_TSK_ENTER
112#define LOG_SUS_TSK_ENTER(tskid)
113#endif /* LOG_SUS_TSK_ENTER */
114
115#ifndef LOG_SUS_TSK_LEAVE
116#define LOG_SUS_TSK_LEAVE(ercd)
117#endif /* LOG_SUS_TSK_LEAVE */
118
119#ifndef LOG_RSM_TSK_ENTER
120#define LOG_RSM_TSK_ENTER(tskid)
121#endif /* LOG_RSM_TSK_ENTER */
122
123#ifndef LOG_RSM_TSK_LEAVE
124#define LOG_RSM_TSK_LEAVE(ercd)
125#endif /* LOG_RSM_TSK_LEAVE */
126
127#ifndef LOG_DLY_TSK_ENTER
128#define LOG_DLY_TSK_ENTER(dlytim)
129#endif /* LOG_DLY_TSK_ENTER */
130
131#ifndef LOG_DLY_TSK_LEAVE
132#define LOG_DLY_TSK_LEAVE(ercd)
133#endif /* LOG_DLY_TSK_LEAVE */
134
135/*
136 *  µ¯Ÿ²ÂÔ€Á
137 */
138#ifdef TOPPERS_slp_tsk
139
140ER
141slp_tsk(void)
142{
143        WINFO   winfo;
144        ER              ercd;
145
146        LOG_SLP_TSK_ENTER();
147        CHECK_DISPATCH();
148
149        t_lock_cpu();
150        if (p_runtsk->wupque) {
151                p_runtsk->wupque = false;
152                ercd = E_OK;
153        }
154        else {
155                p_runtsk->tstat = (TS_WAITING | TS_WAIT_SLP);
156                make_wait(&winfo);
157                LOG_TSKSTAT(p_runtsk);
158                dispatch();
159                ercd = winfo.wercd;
160        }
161        t_unlock_cpu();
162
163  error_exit:
164        LOG_SLP_TSK_LEAVE(ercd);
165        return(ercd);
166}
167
168#endif /* TOPPERS_slp_tsk */
169
170/*
171 *  µ¯Ÿ²ÂÔ€Á¡Ê¥¿¥€¥à¥¢¥Š¥È€¢€ê¡Ë
172 */
173#ifdef TOPPERS_tslp_tsk
174
175ER
176tslp_tsk(TMO tmout)
177{
178        WINFO   winfo;
179        TMEVTB  tmevtb;
180        ER              ercd;
181
182        LOG_TSLP_TSK_ENTER(tmout);
183        CHECK_DISPATCH();
184        CHECK_TMOUT(tmout);
185
186        t_lock_cpu();
187        if (p_runtsk->wupque) {
188                p_runtsk->wupque = false;
189                ercd = E_OK;
190        }
191        else if (tmout == TMO_POL) {
192                ercd = E_TMOUT;
193        }
194        else {
195                p_runtsk->tstat = (TS_WAITING | TS_WAIT_SLP);
196                make_wait_tmout(&winfo, &tmevtb, tmout);
197                LOG_TSKSTAT(p_runtsk);
198                dispatch();
199                ercd = winfo.wercd;
200        }
201        t_unlock_cpu();
202
203  error_exit:
204        LOG_TSLP_TSK_LEAVE(ercd);
205        return(ercd);
206}
207
208#endif /* TOPPERS_tslp_tsk */
209
210/*
211 *  ¥¿¥¹¥¯€Îµ¯Ÿ²
212 */
213#ifdef TOPPERS_wup_tsk
214
215ER
216wup_tsk(ID tskid)
217{
218        TCB             *p_tcb;
219        ER              ercd;
220
221        LOG_WUP_TSK_ENTER(tskid);
222        CHECK_TSKCTX_UNL();
223        CHECK_TSKID_SELF(tskid);
224        p_tcb = get_tcb_self(tskid);
225
226        t_lock_cpu();
227        if (p_tcb->p_tinib->tskatr == TA_NOEXS) {
228                ercd = E_NOEXS;
229        }
230        else if (TSTAT_DORMANT(p_tcb->tstat)) {
231                ercd = E_OBJ;
232        }
233        else if (TSTAT_WAIT_SLP(p_tcb->tstat)) {
234                if (wait_complete(p_tcb)) {
235                        dispatch();
236                }
237                ercd = E_OK;
238        }
239        else if (!(p_tcb->wupque)) {
240                p_tcb->wupque = true;
241                ercd = E_OK;
242        }
243        else {
244                ercd = E_QOVR;
245        }
246        t_unlock_cpu();
247
248  error_exit:
249        LOG_WUP_TSK_LEAVE(ercd);
250        return(ercd);
251}
252
253#endif /* TOPPERS_wup_tsk */
254
255/*
256 *  ¥¿¥¹¥¯€Îµ¯Ÿ²¡ÊÈ󥿥¹¥¯¥³¥ó¥Æ¥­¥¹¥ÈÍÑ¡Ë
257 */
258#ifdef TOPPERS_iwup_tsk
259
260ER
261iwup_tsk(ID tskid)
262{
263        TCB             *p_tcb;
264        ER              ercd;
265
266        LOG_IWUP_TSK_ENTER(tskid);
267        CHECK_INTCTX_UNL();
268        CHECK_TSKID(tskid);
269        p_tcb = get_tcb(tskid);
270
271        i_lock_cpu();
272        if (p_tcb->p_tinib->tskatr == TA_NOEXS) {
273                ercd = E_NOEXS;
274        }
275        else 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 *  ¥¿¥¹¥¯µ¯Ÿ²Í×µá€Î¥­¥ã¥ó¥»¥ë
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
316        t_lock_cpu();
317        if (p_tcb->p_tinib->tskatr == TA_NOEXS) {
318                ercd = E_NOEXS;
319        }
320        else if (TSTAT_DORMANT(p_tcb->tstat)) {
321                ercd = E_OBJ;
322        }
323        else {
324                ercd = p_tcb->wupque ? 1 : 0;
325                p_tcb->wupque = false;
326        }
327        t_unlock_cpu();
328
329  error_exit:
330        LOG_CAN_WUP_LEAVE(ercd);
331        return(ercd);
332}
333
334#endif /* TOPPERS_can_wup */
335
336/*
337 *  ÂÔ€ÁŸõÂրζ¯À©²òœü
338 */
339#ifdef TOPPERS_rel_wai
340
341ER
342rel_wai(ID tskid)
343{
344        TCB             *p_tcb;
345        ER              ercd;
346
347        LOG_REL_WAI_ENTER(tskid);
348        CHECK_TSKCTX_UNL();
349        CHECK_TSKID(tskid);
350        p_tcb = get_tcb(tskid);
351
352        t_lock_cpu();
353        if (p_tcb->p_tinib->tskatr == TA_NOEXS) {
354                ercd = E_NOEXS;
355        }
356        else if (!TSTAT_WAITING(p_tcb->tstat)) {
357                ercd = E_OBJ;
358        }
359        else {
360                if (wait_release(p_tcb)) {
361                        dispatch();
362                }
363                ercd = E_OK;
364        }
365        t_unlock_cpu();
366
367  error_exit:
368        LOG_REL_WAI_LEAVE(ercd);
369        return(ercd);
370}
371
372#endif /* TOPPERS_rel_wai */
373
374/*
375 *  ÂÔ€ÁŸõÂրζ¯À©²òœü¡ÊÈ󥿥¹¥¯¥³¥ó¥Æ¥­¥¹¥ÈÍÑ¡Ë
376 */
377#ifdef TOPPERS_irel_wai
378
379ER
380irel_wai(ID tskid)
381{
382        TCB             *p_tcb;
383        ER              ercd;
384
385        LOG_IREL_WAI_ENTER(tskid);
386        CHECK_INTCTX_UNL();
387        CHECK_TSKID(tskid);
388        p_tcb = get_tcb(tskid);
389
390        i_lock_cpu();
391        if (p_tcb->p_tinib->tskatr == TA_NOEXS) {
392                ercd = E_NOEXS;
393        }
394        else if (!TSTAT_WAITING(p_tcb->tstat)) {
395                ercd = E_OBJ;
396        }
397        else {
398                if (wait_release(p_tcb)) {
399                        reqflg = true;
400                }
401                ercd = E_OK;
402        }
403        i_unlock_cpu();
404
405  error_exit:
406        LOG_IREL_WAI_LEAVE(ercd);
407        return(ercd);
408}
409
410#endif /* TOPPERS_irel_wai */
411
412/*
413 *  ¶¯À©ÂÔ€ÁŸõÂր؀ΰܹÔ
414 */
415#ifdef TOPPERS_sus_tsk
416
417ER
418sus_tsk(ID tskid)
419{
420        TCB             *p_tcb;
421        ER              ercd;
422
423        LOG_SUS_TSK_ENTER(tskid);
424        CHECK_TSKCTX_UNL();
425        CHECK_TSKID_SELF(tskid);
426        p_tcb = get_tcb_self(tskid);
427
428        t_lock_cpu();
429        if (p_tcb == p_runtsk && !dspflg) {
430                ercd = E_CTX;
431        }
432        else if (p_tcb->p_tinib->tskatr == TA_NOEXS) {
433                ercd = E_NOEXS;
434        }
435        else if (TSTAT_DORMANT(p_tcb->tstat)) {
436                ercd = E_OBJ;
437        }
438        else if (TSTAT_RUNNABLE(p_tcb->tstat)) {
439                /*
440                 *  ŒÂ¹Ô€Ç€­€ëŸõÂÖ€«€é¶¯À©ÂÔ€ÁŸõÂր؀ÎÁ«°Ü
441                 */
442                p_tcb->tstat = TS_SUSPENDED;
443                LOG_TSKSTAT(p_tcb);
444                if (make_non_runnable(p_tcb)) {
445                        dispatch();
446                }
447                ercd = E_OK;
448        }
449        else if (TSTAT_SUSPENDED(p_tcb->tstat)) {
450                ercd = E_QOVR;
451        }
452        else {
453                /*
454                 *  ÂÔ€ÁŸõÂÖ€«€éÆóœÅÂÔ€ÁŸõÂր؀ÎÁ«°Ü
455                 */
456                p_tcb->tstat |= TS_SUSPENDED;
457                LOG_TSKSTAT(p_tcb);
458                ercd = E_OK;
459        }
460        t_unlock_cpu();
461
462  error_exit:
463        LOG_SUS_TSK_LEAVE(ercd);
464        return(ercd);
465}
466
467#endif /* TOPPERS_sus_tsk */
468
469/*
470 *  ¶¯À©ÂÔ€ÁŸõÂÖ€«€é€ÎºÆ³«
471 */
472#ifdef TOPPERS_rsm_tsk
473
474ER
475rsm_tsk(ID tskid)
476{
477        TCB             *p_tcb;
478        ER              ercd;
479
480        LOG_RSM_TSK_ENTER(tskid);
481        CHECK_TSKCTX_UNL();
482        CHECK_TSKID(tskid);
483        p_tcb = get_tcb(tskid);
484
485        t_lock_cpu();
486        if (p_tcb->p_tinib->tskatr == TA_NOEXS) {
487                ercd = E_NOEXS;
488        }
489        else if (!TSTAT_SUSPENDED(p_tcb->tstat)) {
490                ercd = E_OBJ;
491        }
492        else if (!TSTAT_WAITING(p_tcb->tstat)) {
493                /*
494                 *  ¶¯À©ÂÔ€ÁŸõÂÖ€«€éŒÂ¹Ô€Ç€­€ëŸõÂր؀ÎÁ«°Ü
495                 */
496                p_tcb->tstat = TS_RUNNABLE;
497                LOG_TSKSTAT(p_tcb);
498                if (make_runnable(p_tcb)) {
499                        dispatch();
500                }
501                ercd = E_OK;
502        }
503        else {
504                /*
505                 *  ÆóœÅÂÔ€ÁŸõÂÖ€«€éÂÔ€ÁŸõÂր؀ÎÁ«°Ü
506                 */
507                p_tcb->tstat &= ~TS_SUSPENDED;
508                LOG_TSKSTAT(p_tcb);
509                ercd = E_OK;
510        }
511        t_unlock_cpu();
512
513  error_exit:
514        LOG_RSM_TSK_LEAVE(ercd);
515        return(ercd);
516}
517
518#endif /* TOPPERS_rsm_tsk */
519
520/*
521 *  Œ«¥¿¥¹¥¯€ÎÃÙ±ä
522 */
523#ifdef TOPPERS_dly_tsk
524
525ER
526dly_tsk(RELTIM dlytim)
527{
528        WINFO   winfo;
529        TMEVTB  tmevtb;
530        ER              ercd;
531
532        LOG_DLY_TSK_ENTER(dlytim);
533        CHECK_DISPATCH();
534        CHECK_PAR(dlytim <= TMAX_RELTIM);
535
536        t_lock_cpu();
537        p_runtsk->tstat = (TS_WAITING | TS_WAIT_DLY);
538        (void) make_non_runnable(p_runtsk);
539        p_runtsk->p_winfo = &winfo;
540        winfo.p_tmevtb = &tmevtb;
541        tmevtb_enqueue(&tmevtb, dlytim, (CBACK) wait_tmout_ok, (void *) p_runtsk);
542        LOG_TSKSTAT(p_runtsk);
543        dispatch();
544        ercd = winfo.wercd;
545        t_unlock_cpu();
546
547  error_exit:
548        LOG_DLY_TSK_LEAVE(ercd);
549        return(ercd);
550}
551
552#endif /* TOPPERS_dly_tsk */
詳しい使い方は TracBrowser を参照してください。