source: mypx/extension/messagebuf/kernel/task_manage.c

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

TOPPERS/ASP 1.9.1

ファイルサイズ: 8.5 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-2014 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_ACT_TSK_ENTER
56#define LOG_ACT_TSK_ENTER(tskid)
57#endif /* LOG_ACT_TSK_ENTER */
58
59#ifndef LOG_ACT_TSK_LEAVE
60#define LOG_ACT_TSK_LEAVE(ercd)
61#endif /* LOG_ACT_TSK_LEAVE */
62
63#ifndef LOG_IACT_TSK_ENTER
64#define LOG_IACT_TSK_ENTER(tskid)
65#endif /* LOG_IACT_TSK_ENTER */
66
67#ifndef LOG_IACT_TSK_LEAVE
68#define LOG_IACT_TSK_LEAVE(ercd)
69#endif /* LOG_IACT_TSK_LEAVE */
70
71#ifndef LOG_CAN_ACT_ENTER
72#define LOG_CAN_ACT_ENTER(tskid)
73#endif /* LOG_CAN_ACT_ENTER */
74
75#ifndef LOG_CAN_ACT_LEAVE
76#define LOG_CAN_ACT_LEAVE(ercd)
77#endif /* LOG_CAN_ACT_LEAVE */
78
79#ifndef LOG_EXT_TSK_ENTER
80#define LOG_EXT_TSK_ENTER()
81#endif /* LOG_EXT_TSK_ENTER */
82
83#ifndef LOG_EXT_TSK_LEAVE
84#define LOG_EXT_TSK_LEAVE(ercd)
85#endif /* LOG_EXT_TSK_LEAVE */
86
87#ifndef LOG_TER_TSK_ENTER
88#define LOG_TER_TSK_ENTER(tskid)
89#endif /* LOG_TER_TSK_ENTER */
90
91#ifndef LOG_TER_TSK_LEAVE
92#define LOG_TER_TSK_LEAVE(ercd)
93#endif /* LOG_TER_TSK_LEAVE */
94
95#ifndef LOG_CHG_PRI_ENTER
96#define LOG_CHG_PRI_ENTER(tskid, tskpri)
97#endif /* LOG_CHG_PRI_ENTER */
98
99#ifndef LOG_CHG_PRI_LEAVE
100#define LOG_CHG_PRI_LEAVE(ercd)
101#endif /* LOG_CHG_PRI_LEAVE */
102
103#ifndef LOG_GET_PRI_ENTER
104#define LOG_GET_PRI_ENTER(tskid, p_tskpri)
105#endif /* LOG_GET_PRI_ENTER */
106
107#ifndef LOG_GET_PRI_LEAVE
108#define LOG_GET_PRI_LEAVE(ercd, tskpri)
109#endif /* LOG_GET_PRI_LEAVE */
110
111#ifndef LOG_GET_INF_ENTER
112#define LOG_GET_INF_ENTER(p_exinf)
113#endif /* LOG_GET_INF_ENTER */
114
115#ifndef LOG_GET_INF_LEAVE
116#define LOG_GET_INF_LEAVE(ercd, exinf)
117#endif /* LOG_GET_INF_LEAVE */
118
119/*
120 *  ¥¿¥¹¥¯€Îµ¯Æ°
121 */
122#ifdef TOPPERS_act_tsk
123
124ER
125act_tsk(ID tskid)
126{
127        TCB             *p_tcb;
128        ER              ercd;
129
130        LOG_ACT_TSK_ENTER(tskid);
131        CHECK_TSKCTX_UNL();
132        CHECK_TSKID_SELF(tskid);
133        p_tcb = get_tcb_self(tskid);
134
135        t_lock_cpu();
136        if (TSTAT_DORMANT(p_tcb->tstat)) {
137                if (make_active(p_tcb)) {
138                        dispatch();
139                }
140                ercd = E_OK;
141        }
142        else if (!(p_tcb->actque)) {
143                p_tcb->actque = true;
144                ercd = E_OK;
145        }
146        else {
147                ercd = E_QOVR;
148        }
149        t_unlock_cpu();
150
151  error_exit:
152        LOG_ACT_TSK_LEAVE(ercd);
153        return(ercd);
154}
155
156#endif /* TOPPERS_act_tsk */
157
158/*
159 *  ¥¿¥¹¥¯€Îµ¯Æ°¡ÊÈ󥿥¹¥¯¥³¥ó¥Æ¥­¥¹¥ÈÍÑ¡Ë
160 */
161#ifdef TOPPERS_iact_tsk
162
163ER
164iact_tsk(ID tskid)
165{
166        TCB             *p_tcb;
167        ER              ercd;
168
169        LOG_IACT_TSK_ENTER(tskid);
170        CHECK_INTCTX_UNL();
171        CHECK_TSKID(tskid);
172        p_tcb = get_tcb(tskid);
173
174        i_lock_cpu();
175        if (TSTAT_DORMANT(p_tcb->tstat)) {
176                if (make_active(p_tcb)) {
177                        reqflg = true;
178                }
179                ercd = E_OK;
180        }
181        else if (!(p_tcb->actque)) {
182                p_tcb->actque = true;
183                ercd = E_OK;
184        }
185        else {
186                ercd = E_QOVR;
187        }
188        i_unlock_cpu();
189
190  error_exit:
191        LOG_IACT_TSK_LEAVE(ercd);
192        return(ercd);
193}
194
195#endif /* TOPPERS_iact_tsk */
196
197/*
198 *  ¥¿¥¹¥¯µ¯Æ°Í×µá€Î¥­¥ã¥ó¥»¥ë
199 */
200#ifdef TOPPERS_can_act
201
202ER_UINT
203can_act(ID tskid)
204{
205        TCB             *p_tcb;
206        ER_UINT ercd;
207
208        LOG_CAN_ACT_ENTER(tskid);
209        CHECK_TSKCTX_UNL();
210        CHECK_TSKID_SELF(tskid);
211        p_tcb = get_tcb_self(tskid);
212
213        t_lock_cpu();
214        ercd = p_tcb->actque ? 1 : 0;
215        p_tcb->actque = false;
216        t_unlock_cpu();
217
218  error_exit:
219        LOG_CAN_ACT_LEAVE(ercd);
220        return(ercd);
221}
222
223#endif /* TOPPERS_can_act */
224
225/*
226 *  Œ«¥¿¥¹¥¯€ÎœªÎ»
227 */
228#ifdef TOPPERS_ext_tsk
229
230ER
231ext_tsk(void)
232{
233        ER              ercd;
234
235        LOG_EXT_TSK_ENTER();
236        CHECK_TSKCTX();
237
238        if (t_sense_lock()) {
239                /*
240                 *  CPU¥í¥Ã¥¯ŸõÂÖ€Çext_tsk€¬žÆ€Ð€ì€¿Ÿì¹ç€Ï¡€CPU¥í¥Ã¥¯€ò²òœü€·
241                 *  €Æ€«€é¥¿¥¹¥¯€òœªÎ»€¹€ë¡¥ŒÂÁõŸå€Ï¡€¥µ¡Œ¥Ó¥¹¥³¡Œ¥ëÆâ€Ç€ÎCPU
242                 *  ¥í¥Ã¥¯€òŸÊά€¹€ì€Ð€è€€€À€±¡¥
243                 */
244        }
245        else {
246                t_lock_cpu();
247        }
248        if (disdsp) {
249                /*
250                 *  ¥Ç¥£¥¹¥Ñ¥Ã¥Á¶Ø»ßŸõÂÖ€Çext_tsk€¬žÆ€Ð€ì€¿Ÿì¹ç€Ï¡€¥Ç¥£¥¹¥Ñ¥Ã
251                 *  ¥Áµö²ÄŸõÂրˀ·€Æ€«€é¥¿¥¹¥¯€òœªÎ»€¹€ë¡¥
252                 */
253                disdsp = false;
254        }
255        if (!ipmflg) {
256                /*
257                 *  ³ä¹þ€ßÍ¥ÀèÅÙ¥Þ¥¹¥¯¡ÊIPM¡Ë€¬TIPM_ENAALL°Ê³°€ÎŸõÂÖ€Çext_tsk
258                 *  €¬žÆ€Ð€ì€¿Ÿì¹ç€Ï¡€IPM€òTIPM_ENAALL€Ë€·€Æ€«€é¥¿¥¹¥¯€òœªÎ»€¹
259                 *  €ë¡¥
260                 */
261                t_set_ipm(TIPM_ENAALL);
262                ipmflg = true;
263        }
264        dspflg = true;
265
266        (void) make_non_runnable(p_runtsk);
267        make_dormant(p_runtsk);
268        if (p_runtsk->actque) {
269                p_runtsk->actque = false;
270                (void) make_active(p_runtsk);
271        }
272        exit_and_dispatch();
273        ercd = E_SYS;
274
275  error_exit:
276        LOG_EXT_TSK_LEAVE(ercd);
277        return(ercd);
278}
279
280#endif /* TOPPERS_ext_tsk */
281
282/*
283 *  ¥¿¥¹¥¯€Î¶¯À©œªÎ»
284 */
285#ifdef TOPPERS_ter_tsk
286
287ER
288ter_tsk(ID tskid)
289{
290        TCB             *p_tcb;
291        bool_t  dspreq = false;
292        ER              ercd;
293
294        LOG_TER_TSK_ENTER(tskid);
295        CHECK_TSKCTX_UNL();
296        CHECK_TSKID(tskid);
297        p_tcb = get_tcb(tskid);
298        CHECK_NONSELF(p_tcb);
299
300        t_lock_cpu();
301        if (TSTAT_DORMANT(p_tcb->tstat)) {
302                ercd = E_OBJ;
303        }
304        else {
305                if (TSTAT_RUNNABLE(p_tcb->tstat)) {
306                        /*
307                         *  p_tcb€ÏŒ«¥¿¥¹¥¯€Ç€Ê€€€¿€á¡€¡Ê¥·¥ó¥°¥ë¥×¥í¥»¥Ã¥µ€Ç€Ï¡ËŒÂ
308                         *  ¹ÔŸõÂրǀʀ¯¡€make_non_runnable(p_tcb)€Ç¥¿¥¹¥¯¥Ç¥£¥¹¥Ñ¥Ã
309                         *  ¥Á€¬É¬Í׀ˀʀ뀳€È€Ï€Ê€€¡¥
310                         */
311                        (void) make_non_runnable(p_tcb);
312                }
313                else if (TSTAT_WAITING(p_tcb->tstat)) {
314                        if (wait_dequeue_wobj(p_tcb)) {
315                                dspreq = true;
316                        }
317                        wait_dequeue_tmevtb(p_tcb);
318                }
319                make_dormant(p_tcb);
320                if (p_tcb->actque) {
321                        p_tcb->actque = false;
322                        if (make_active(p_tcb)) {
323                                dspreq = true;
324                        }
325                }
326                if (dspreq) {
327                        dispatch();
328                }
329                ercd = E_OK;
330        }
331        t_unlock_cpu();
332
333  error_exit:
334        LOG_TER_TSK_LEAVE(ercd);
335        return(ercd);
336}
337
338#endif /* TOPPERS_ter_tsk */
339
340/*
341 *  ¥¿¥¹¥¯€Î¥Ù¡Œ¥¹Í¥ÀèÅÙ€ÎÊѹ¹
342 */
343#ifdef TOPPERS_chg_pri
344
345ER
346chg_pri(ID tskid, PRI tskpri)
347{
348        TCB             *p_tcb;
349        uint_t  newpri;
350        ER              ercd;
351
352        LOG_CHG_PRI_ENTER(tskid, tskpri);
353        CHECK_TSKCTX_UNL();
354        CHECK_TSKID_SELF(tskid);
355        CHECK_TPRI_INI(tskpri);
356        p_tcb = get_tcb_self(tskid);
357        newpri = (tskpri == TPRI_INI) ? p_tcb->p_tinib->ipriority
358                                                                                : INT_PRIORITY(tskpri);
359
360        t_lock_cpu();
361        if (TSTAT_DORMANT(p_tcb->tstat)) {
362                ercd = E_OBJ;
363        }
364        else {
365                if (change_priority(p_tcb, newpri)) {
366                        dispatch();
367                }
368                ercd = E_OK;
369        }
370        t_unlock_cpu();
371
372  error_exit:
373        LOG_CHG_PRI_LEAVE(ercd);
374        return(ercd);
375}
376
377#endif /* TOPPERS_chg_pri */
378
379/*
380 *  ¥¿¥¹¥¯Í¥ÀèÅـλ²ŸÈ
381 */
382#ifdef TOPPERS_get_pri
383
384ER
385get_pri(ID tskid, PRI *p_tskpri)
386{
387        TCB             *p_tcb;
388        ER              ercd;
389
390        LOG_GET_PRI_ENTER(tskid, p_tskpri);
391        CHECK_TSKCTX_UNL();
392        CHECK_TSKID_SELF(tskid);
393        p_tcb = get_tcb_self(tskid);
394
395        t_lock_cpu();
396        if (TSTAT_DORMANT(p_tcb->tstat)) {
397                ercd = E_OBJ;
398        }
399        else {
400                *p_tskpri = EXT_TSKPRI(p_tcb->priority);
401                ercd = E_OK;
402        }
403        t_unlock_cpu();
404
405  error_exit:
406        LOG_GET_PRI_LEAVE(ercd, *p_tskpri);
407        return(ercd);
408}
409
410#endif /* TOPPERS_get_pri */
411
412/*
413 *  Œ«¥¿¥¹¥¯€Î³ÈÄ¥ŸðÊó€Î»²ŸÈ
414 */
415#ifdef TOPPERS_get_inf
416
417ER
418get_inf(intptr_t *p_exinf)
419{
420        ER              ercd;
421
422        LOG_GET_INF_ENTER(p_exinf);
423        CHECK_TSKCTX_UNL();
424
425        t_lock_cpu();
426        *p_exinf = p_runtsk->p_tinib->exinf;
427        ercd = E_OK;
428        t_unlock_cpu();
429
430  error_exit:
431        LOG_GET_INF_LEAVE(ercd, *p_exinf);
432        return(ercd);
433}
434
435#endif /* TOPPERS_get_inf */
詳しい使い方は TracBrowser を参照してください。