source: extension/ovrhdr/kernel/task_manage.c

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

TOPPERS/ASP 1.9.1

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