source: extension/mutex/kernel/task_manage.c

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

TOPPERS/ASP 1.9.1

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