source: extension/rstr_task/kernel/task_sync.c

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

TOPPERS/ASP 1.9.1

ファイルサイズ: 9.9 KB
 
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        CHECK_NONRSTR(p_tcb);
226
227        t_lock_cpu();
228        if (TSTAT_DORMANT(p_tcb->tstat)) {
229                ercd = E_OBJ;
230        }
231        else if (TSTAT_WAIT_SLP(p_tcb->tstat)) {
232                if (wait_complete(p_tcb)) {
233                        dispatch();
234                }
235                ercd = E_OK;
236        }
237        else if (!(p_tcb->wupque)) {
238                p_tcb->wupque = true;
239                ercd = E_OK;
240        }
241        else {
242                ercd = E_QOVR;
243        }
244        t_unlock_cpu();
245
246  error_exit:
247        LOG_WUP_TSK_LEAVE(ercd);
248        return(ercd);
249}
250
251#endif /* TOPPERS_wup_tsk */
252
253/*
254 *  ¥¿¥¹¥¯€Îµ¯Ÿ²¡ÊÈ󥿥¹¥¯¥³¥ó¥Æ¥­¥¹¥ÈÍÑ¡Ë
255 */
256#ifdef TOPPERS_iwup_tsk
257
258ER
259iwup_tsk(ID tskid)
260{
261        TCB             *p_tcb;
262        ER              ercd;
263
264        LOG_IWUP_TSK_ENTER(tskid);
265        CHECK_INTCTX_UNL();
266        CHECK_TSKID(tskid);
267        p_tcb = get_tcb(tskid);
268        CHECK_NONRSTR(p_tcb);
269
270        i_lock_cpu();
271        if (TSTAT_DORMANT(p_tcb->tstat)) {
272                ercd = E_OBJ;
273        }
274        else if (TSTAT_WAIT_SLP(p_tcb->tstat)) {
275                if (wait_complete(p_tcb)) {
276                        reqflg = true;
277                }
278                ercd = E_OK;
279        }
280        else if (!(p_tcb->wupque)) {
281                p_tcb->wupque = true;
282                ercd = E_OK;
283        }
284        else {
285                ercd = E_QOVR;
286        }
287        i_unlock_cpu();
288
289  error_exit:
290        LOG_IWUP_TSK_LEAVE(ercd);
291        return(ercd);
292}
293
294#endif /* TOPPERS_iwup_tsk */
295
296/*
297 *  ¥¿¥¹¥¯µ¯Ÿ²Í×µá€Î¥­¥ã¥ó¥»¥ë
298 */
299#ifdef TOPPERS_can_wup
300
301ER_UINT
302can_wup(ID tskid)
303{
304        TCB             *p_tcb;
305        ER_UINT ercd;
306
307        LOG_CAN_WUP_ENTER(tskid);
308        CHECK_TSKCTX_UNL();
309        CHECK_TSKID_SELF(tskid);
310        p_tcb = get_tcb_self(tskid);
311        CHECK_NONRSTR(p_tcb);
312
313        t_lock_cpu();
314        if (TSTAT_DORMANT(p_tcb->tstat)) {
315                ercd = E_OBJ;
316        }
317        else {
318                ercd = p_tcb->wupque ? 1 : 0;
319                p_tcb->wupque = false;
320        }
321        t_unlock_cpu();
322
323  error_exit:
324        LOG_CAN_WUP_LEAVE(ercd);
325        return(ercd);
326}
327
328#endif /* TOPPERS_can_wup */
329
330/*
331 *  ÂÔ€ÁŸõÂրζ¯À©²òœü
332 */
333#ifdef TOPPERS_rel_wai
334
335ER
336rel_wai(ID tskid)
337{
338        TCB             *p_tcb;
339        ER              ercd;
340
341        LOG_REL_WAI_ENTER(tskid);
342        CHECK_TSKCTX_UNL();
343        CHECK_TSKID(tskid);
344        p_tcb = get_tcb(tskid);
345        CHECK_NONRSTR(p_tcb);
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 *  ÂÔ€ÁŸõÂրζ¯À©²òœü¡ÊÈ󥿥¹¥¯¥³¥ó¥Æ¥­¥¹¥ÈÍÑ¡Ë
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        CHECK_NONRSTR(p_tcb);
382
383        i_lock_cpu();
384        if (!TSTAT_WAITING(p_tcb->tstat)) {
385                ercd = E_OBJ;
386        }
387        else {
388                if (wait_release(p_tcb)) {
389                        reqflg = true;
390                }
391                ercd = E_OK;
392        }
393        i_unlock_cpu();
394
395  error_exit:
396        LOG_IREL_WAI_LEAVE(ercd);
397        return(ercd);
398}
399
400#endif /* TOPPERS_irel_wai */
401
402/*
403 *  ¶¯À©ÂÔ€ÁŸõÂր؀ΰܹÔ
404 */
405#ifdef TOPPERS_sus_tsk
406
407ER
408sus_tsk(ID tskid)
409{
410        TCB             *p_tcb;
411        ER              ercd;
412
413        LOG_SUS_TSK_ENTER(tskid);
414        CHECK_TSKCTX_UNL();
415        CHECK_TSKID_SELF(tskid);
416        p_tcb = get_tcb_self(tskid);
417        CHECK_NONRSTR(p_tcb);
418
419        t_lock_cpu();
420        if (p_tcb == p_runtsk && !dspflg) {
421                ercd = E_CTX;
422        }
423        else if (TSTAT_DORMANT(p_tcb->tstat)) {
424                ercd = E_OBJ;
425        }
426        else if (TSTAT_RUNNABLE(p_tcb->tstat)) {
427                /*
428                 *  ŒÂ¹Ô€Ç€­€ëŸõÂÖ€«€é¶¯À©ÂÔ€ÁŸõÂր؀ÎÁ«°Ü
429                 */
430                p_tcb->tstat = TS_SUSPENDED;
431                LOG_TSKSTAT(p_tcb);
432                if (make_non_runnable(p_tcb)) {
433                        dispatch();
434                }
435                ercd = E_OK;
436        }
437        else if (TSTAT_SUSPENDED(p_tcb->tstat)) {
438                ercd = E_QOVR;
439        }
440        else {
441                /*
442                 *  ÂÔ€ÁŸõÂÖ€«€éÆóœÅÂÔ€ÁŸõÂր؀ÎÁ«°Ü
443                 */
444                p_tcb->tstat |= TS_SUSPENDED;
445                LOG_TSKSTAT(p_tcb);
446                ercd = E_OK;
447        }
448        t_unlock_cpu();
449
450  error_exit:
451        LOG_SUS_TSK_LEAVE(ercd);
452        return(ercd);
453}
454
455#endif /* TOPPERS_sus_tsk */
456
457/*
458 *  ¶¯À©ÂÔ€ÁŸõÂÖ€«€é€ÎºÆ³«
459 */
460#ifdef TOPPERS_rsm_tsk
461
462ER
463rsm_tsk(ID tskid)
464{
465        TCB             *p_tcb;
466        ER              ercd;
467
468        LOG_RSM_TSK_ENTER(tskid);
469        CHECK_TSKCTX_UNL();
470        CHECK_TSKID(tskid);
471        p_tcb = get_tcb(tskid);
472        CHECK_NONRSTR(p_tcb);
473
474        t_lock_cpu();
475        if (!TSTAT_SUSPENDED(p_tcb->tstat)) {
476                ercd = E_OBJ;
477        }
478        else if (!TSTAT_WAITING(p_tcb->tstat)) {
479                /*
480                 *  ¶¯À©ÂÔ€ÁŸõÂÖ€«€éŒÂ¹Ô€Ç€­€ëŸõÂր؀ÎÁ«°Ü
481                 */
482                p_tcb->tstat = TS_RUNNABLE;
483                LOG_TSKSTAT(p_tcb);
484                if (make_runnable(p_tcb)) {
485                        dispatch();
486                }
487                ercd = E_OK;
488        }
489        else {
490                /*
491                 *  ÆóœÅÂÔ€ÁŸõÂÖ€«€éÂÔ€ÁŸõÂր؀ÎÁ«°Ü
492                 */
493                p_tcb->tstat &= ~TS_SUSPENDED;
494                LOG_TSKSTAT(p_tcb);
495                ercd = E_OK;
496        }
497        t_unlock_cpu();
498
499  error_exit:
500        LOG_RSM_TSK_LEAVE(ercd);
501        return(ercd);
502}
503
504#endif /* TOPPERS_rsm_tsk */
505
506/*
507 *  Œ«¥¿¥¹¥¯€ÎÃÙ±ä
508 */
509#ifdef TOPPERS_dly_tsk
510
511ER
512dly_tsk(RELTIM dlytim)
513{
514        WINFO   winfo;
515        TMEVTB  tmevtb;
516        ER              ercd;
517
518        LOG_DLY_TSK_ENTER(dlytim);
519        CHECK_DISPATCH();
520        CHECK_PAR(dlytim <= TMAX_RELTIM);
521
522        t_lock_cpu();
523        p_runtsk->tstat = (TS_WAITING | TS_WAIT_DLY);
524        (void) make_non_runnable(p_runtsk);
525        p_runtsk->p_winfo = &winfo;
526        winfo.p_tmevtb = &tmevtb;
527        tmevtb_enqueue(&tmevtb, dlytim, (CBACK) wait_tmout_ok, (void *) p_runtsk);
528        LOG_TSKSTAT(p_runtsk);
529        dispatch();
530        ercd = winfo.wercd;
531        t_unlock_cpu();
532
533  error_exit:
534        LOG_DLY_TSK_LEAVE(ercd);
535        return(ercd);
536}
537
538#endif /* TOPPERS_dly_tsk */
詳しい使い方は TracBrowser を参照してください。