source: extension/rstr_task/kernel/task_manage.c @ 7

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

TOPPERS/ASP 1.9.1

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