source: kernel/task_manage.c

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

TOPPERS/ASP 1.9.1

ファイルサイズ: 8.4 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_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        ER              ercd;
292
293        LOG_TER_TSK_ENTER(tskid);
294        CHECK_TSKCTX_UNL();
295        CHECK_TSKID(tskid);
296        p_tcb = get_tcb(tskid);
297        CHECK_NONSELF(p_tcb);
298
299        t_lock_cpu();
300        if (TSTAT_DORMANT(p_tcb->tstat)) {
301                ercd = E_OBJ;
302        }
303        else {
304                if (TSTAT_RUNNABLE(p_tcb->tstat)) {
305                        /*
306                         *  p_tcb€ÏŒ«¥¿¥¹¥¯€Ç€Ê€€€¿€á¡€¡Ê¥·¥ó¥°¥ë¥×¥í¥»¥Ã¥µ€Ç€Ï¡ËŒÂ
307                         *  ¹ÔŸõÂրǀʀ¯¡€make_non_runnable(p_tcb)€Ç¥¿¥¹¥¯¥Ç¥£¥¹¥Ñ¥Ã
308                         *  ¥Á€¬É¬Í׀ˀʀ뀳€È€Ï€Ê€€¡¥
309                         */
310                        (void) make_non_runnable(p_tcb);
311                }
312                else if (TSTAT_WAITING(p_tcb->tstat)) {
313                        wait_dequeue_wobj(p_tcb);
314                        wait_dequeue_tmevtb(p_tcb);
315                }
316                make_dormant(p_tcb);
317                if (p_tcb->actque) {
318                        p_tcb->actque = false;
319                        if (make_active(p_tcb)) {
320                                dispatch();
321                        }
322                }
323                ercd = E_OK;
324        }
325        t_unlock_cpu();
326
327  error_exit:
328        LOG_TER_TSK_LEAVE(ercd);
329        return(ercd);
330}
331
332#endif /* TOPPERS_ter_tsk */
333
334/*
335 *  ¥¿¥¹¥¯€Î¥Ù¡Œ¥¹Í¥ÀèÅÙ€ÎÊѹ¹
336 */
337#ifdef TOPPERS_chg_pri
338
339ER
340chg_pri(ID tskid, PRI tskpri)
341{
342        TCB             *p_tcb;
343        uint_t  newpri;
344        ER              ercd;
345
346        LOG_CHG_PRI_ENTER(tskid, tskpri);
347        CHECK_TSKCTX_UNL();
348        CHECK_TSKID_SELF(tskid);
349        CHECK_TPRI_INI(tskpri);
350        p_tcb = get_tcb_self(tskid);
351        newpri = (tskpri == TPRI_INI) ? p_tcb->p_tinib->ipriority
352                                                                                : INT_PRIORITY(tskpri);
353
354        t_lock_cpu();
355        if (TSTAT_DORMANT(p_tcb->tstat)) {
356                ercd = E_OBJ;
357        }
358        else {
359                if (change_priority(p_tcb, newpri)) {
360                        dispatch();
361                }
362                ercd = E_OK;
363        }
364        t_unlock_cpu();
365
366  error_exit:
367        LOG_CHG_PRI_LEAVE(ercd);
368        return(ercd);
369}
370
371#endif /* TOPPERS_chg_pri */
372
373/*
374 *  ¥¿¥¹¥¯Í¥ÀèÅـλ²ŸÈ
375 */
376#ifdef TOPPERS_get_pri
377
378ER
379get_pri(ID tskid, PRI *p_tskpri)
380{
381        TCB             *p_tcb;
382        ER              ercd;
383
384        LOG_GET_PRI_ENTER(tskid, p_tskpri);
385        CHECK_TSKCTX_UNL();
386        CHECK_TSKID_SELF(tskid);
387        p_tcb = get_tcb_self(tskid);
388
389        t_lock_cpu();
390        if (TSTAT_DORMANT(p_tcb->tstat)) {
391                ercd = E_OBJ;
392        }
393        else {
394                *p_tskpri = EXT_TSKPRI(p_tcb->priority);
395                ercd = E_OK;
396        }
397        t_unlock_cpu();
398
399  error_exit:
400        LOG_GET_PRI_LEAVE(ercd, *p_tskpri);
401        return(ercd);
402}
403
404#endif /* TOPPERS_get_pri */
405
406/*
407 *  Œ«¥¿¥¹¥¯€Î³ÈÄ¥ŸðÊó€Î»²ŸÈ
408 */
409#ifdef TOPPERS_get_inf
410
411ER
412get_inf(intptr_t *p_exinf)
413{
414        ER              ercd;
415
416        LOG_GET_INF_ENTER(p_exinf);
417        CHECK_TSKCTX_UNL();
418
419        t_lock_cpu();
420        *p_exinf = p_runtsk->p_tinib->exinf;
421        ercd = E_OK;
422        t_unlock_cpu();
423
424  error_exit:
425        LOG_GET_INF_LEAVE(ercd, *p_exinf);
426        return(ercd);
427}
428
429#endif /* TOPPERS_get_inf */
詳しい使い方は TracBrowser を参照してください。