source: mypx/extension/mutex/kernel/task.c

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

TOPPERS/ASP 1.9.1

ファイルサイズ: 10.7 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-2011 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 "wait.h"
49#include "task.h"
50
51/*
52 *  ¥È¥ì¡Œ¥¹¥í¥°¥Þ¥¯¥í€Î¥Ç¥Õ¥©¥ë¥ÈÄêµÁ
53 */
54#ifndef LOG_TEX_ENTER
55#define LOG_TEX_ENTER(p_tcb, texptn)
56#endif /* LOG_TEX_ENTER */
57
58#ifndef LOG_TEX_LEAVE
59#define LOG_TEX_LEAVE(p_tcb)
60#endif /* LOG_TEX_LEAVE */
61
62#ifdef TOPPERS_tskini
63
64/*
65 *  ŒÂ¹ÔŸõÂրΥ¿¥¹¥¯
66 */
67TCB             *p_runtsk;
68
69/*
70 *  ºÇ¹âÍ¥Àèœç°Ì€Î¥¿¥¹¥¯
71 */
72TCB             *p_schedtsk;
73
74/*
75 *  ¥¿¥¹¥¯¥Ç¥£¥¹¥Ñ¥Ã¥Á¡¿¥¿¥¹¥¯Îã³°œèÍý¥ë¡Œ¥Á¥óµ¯Æ°Í×µá¥Õ¥é¥°
76 */
77bool_t  reqflg;
78
79/*
80 *  ³ä¹þ€ßÍ¥ÀèÅÙ¥Þ¥¹¥¯Á޲òœüŸõÂÖ
81 */
82bool_t  ipmflg;
83
84/*
85 *  ¥Ç¥£¥¹¥Ñ¥Ã¥Á¶Ø»ßŸõÂÖ
86 */
87bool_t  disdsp;
88
89/*
90 *  ¥¿¥¹¥¯¥Ç¥£¥¹¥Ñ¥Ã¥Á²ÄÇœŸõÂÖ
91 */
92bool_t  dspflg;
93
94/*
95 *  ¥ì¥Ç¥£¥­¥å¡Œ
96 */
97QUEUE   ready_queue[TNUM_TPRI];
98
99/*
100 *  ¥ì¥Ç¥£¥­¥å¡Œ¥µ¡Œ¥Á€Î€¿€á€Î¥Ó¥Ã¥È¥Þ¥Ã¥×
101 */
102uint16_t        ready_primap;
103
104/*
105 *  ¥¿¥¹¥¯ŽÉÍý¥â¥ž¥å¡Œ¥ë€ÎœéŽü²œ
106 */
107void
108initialize_task(void)
109{
110        uint_t  i, j;
111        TCB             *p_tcb;
112
113        p_runtsk = NULL;
114        p_schedtsk = NULL;
115        reqflg = false;
116        ipmflg = true;
117        disdsp = false;
118        dspflg = true;
119
120        for (i = 0; i < TNUM_TPRI; i++) {
121                queue_initialize(&(ready_queue[i]));
122        }
123        ready_primap = 0U;
124
125        for (i = 0; i < tnum_tsk; i++) {
126                j = INDEX_TSK(torder_table[i]);
127                p_tcb = &(tcb_table[j]);
128                p_tcb->p_tinib = &(tinib_table[j]);
129                p_tcb->actque = false;
130                make_dormant(p_tcb);
131                queue_initialize(&(p_tcb->mutex_queue));
132                if ((p_tcb->p_tinib->tskatr & TA_ACT) != 0U) {
133                        (void) make_active(p_tcb);
134                }
135        }
136}
137
138#endif /* TOPPERS_tskini */
139
140/*
141 *  ¥Ó¥Ã¥È¥Þ¥Ã¥×¥µ¡Œ¥ÁŽØ¿ô
142 *
143 *  bitmapÆâ€Î1€Î¥Ó¥Ã¥È€ÎÆâ¡€ºÇ€â²Œ°Ì¡Ê±Š¡Ë€Î€â€Î€ò¥µ¡Œ¥Á€·¡€€œ€Î¥Ó¥Ã
144 *  ¥ÈÈÖ¹æ€òÊÖ€¹¡¥¥Ó¥Ã¥ÈÈÖ¹æ€Ï¡€ºÇ²Œ°Ì¥Ó¥Ã¥È€ò0€È€¹€ë¡¥bitmap€Ë0€ò»ØÄê
145 *  €·€Æ€Ï€Ê€é€Ê€€¡¥€³€ÎŽØ¿ô€Ç€Ï¡€bitmap€¬16¥Ó¥Ã¥È€Ç€¢€ë€³€È€ò²ŸÄꀷ¡€
146 *  uint16_t·¿€È€·€Æ€€€ë¡¥
147 *
148 *  ¥Ó¥Ã¥È¥µ¡Œ¥ÁÌ¿Îá€ò»ý€Ä¥×¥í¥»¥Ã¥µ€Ç€Ï¡€¥Ó¥Ã¥È¥µ¡Œ¥ÁÌ¿Îá€ò»È€Š€è€Š€Ë
149 *  œñ€­ÄŸ€·€¿Êý€¬žúΚ€¬ÎÉ€€Ÿì¹ç€¬€¢€ë¡¥€³€Î€è€Š€ÊŸì¹ç€Ë€Ï¡€¥¿¡Œ¥²¥Ã¥È
150 *  °ÍžÉô€Ç¥Ó¥Ã¥È¥µ¡Œ¥ÁÌ¿Îá€ò»È€Ã€¿bitmap_search€òÄêµÁ€·¡€
151 *  OMIT_BITMAP_SEARCH€ò¥Þ¥¯¥íÄêµÁ€¹€ì€Ð€è€€¡¥€Þ€¿¡€¥Ó¥Ã¥È¥µ¡Œ¥ÁÌ¿Îá€Î
152 *  ¥µ¡Œ¥ÁÊýžþ€¬µÕ€Ê€É€ÎÍýͳ€ÇÍ¥ÀèÅـȥӥåȀȀÎÂбþ€òÊѹ¹€·€¿€€Ÿì¹ç€Ë
153 *  €Ï¡€PRIMAP_BIT€ò¥Þ¥¯¥íÄêµÁ€¹€ì€Ð€è€€¡¥
154 *
155 *  €Þ€¿¡€¥é¥€¥Ö¥é¥ê€Ëffs€¬€¢€ë€Ê€é¡€Œ¡€Î€è€Š€ËÄêµÁ€·€Æ¥é¥€¥Ö¥é¥êŽØ¿ô€ò
156 *  »È€Ã€¿Êý€¬žúΚ€¬ÎÉ€€²ÄÇœÀ­€â€¢€ë¡¥
157 *              #define bitmap_search(bitmap) (ffs(bitmap) - 1)
158 */
159#ifndef PRIMAP_BIT
160#define PRIMAP_BIT(pri)         (1U << (pri))
161#endif /* PRIMAP_BIT */
162
163#ifndef OMIT_BITMAP_SEARCH
164
165static const unsigned char bitmap_search_table[] = { 0, 1, 0, 2, 0, 1, 0,
166                                                                                                3, 0, 1, 0, 2, 0, 1, 0 };
167
168Inline uint_t
169bitmap_search(uint16_t bitmap)
170{
171        uint_t  n = 0U;
172
173        assert(bitmap != 0U);
174        if ((bitmap & 0x00ffU) == 0U) {
175                bitmap >>= 8;
176                n += 8;
177        }
178        if ((bitmap & 0x0fU) == 0U) {
179                bitmap >>= 4;
180                n += 4;
181        }
182        return(n + bitmap_search_table[(bitmap & 0x0fU) - 1]);
183}
184
185#endif /* OMIT_BITMAP_SEARCH */
186
187/*
188 *  Í¥ÀèÅ٥ӥåȥޥå׀¬¶õ€«€Î¥Á¥§¥Ã¥¯
189 */
190Inline bool_t
191primap_empty(void)
192{
193        return(ready_primap == 0U);
194}
195
196/*
197 *  Í¥ÀèÅ٥ӥåȥޥå׀Υµ¡Œ¥Á
198 */
199Inline uint_t
200primap_search(void)
201{
202        return(bitmap_search(ready_primap));
203}
204
205/*
206 *  Í¥ÀèÅ٥ӥåȥޥå׀Υ»¥Ã¥È
207 */
208Inline void
209primap_set(uint_t pri)
210{
211        ready_primap |= PRIMAP_BIT(pri);
212}
213
214/*
215 *  Í¥ÀèÅ٥ӥåȥޥå׀Υ¯¥ê¥¢
216 */
217Inline void
218primap_clear(uint_t pri)
219{
220        ready_primap &= ~PRIMAP_BIT(pri);
221}
222
223/*
224 *  ºÇ¹âÍ¥Àèœç°Ì¥¿¥¹¥¯€Î¥µ¡Œ¥Á
225 */
226#ifdef TOPPERS_tsksched
227
228TCB *
229search_schedtsk(void)
230{
231        uint_t  schedpri;
232
233        schedpri = primap_search();
234        return((TCB *)(ready_queue[schedpri].p_next));
235}
236
237#endif /* TOPPERS_tsksched */
238
239/*
240 *  ŒÂ¹Ô€Ç€­€ëŸõÂր؀ÎÁ«°Ü
241 *
242 *  ºÇ¹âÍ¥Àèœç°Ì€Î¥¿¥¹¥¯€ò¹¹¿·€¹€ë€Î€Ï¡€ŒÂ¹Ô€Ç€­€ë¥¿¥¹¥¯€¬€Ê€«€Ã€¿Ÿì¹ç
243 *  €È¡€p_tcb€ÎÍ¥ÀèÅÙ€¬ºÇ¹âÍ¥Àèœç°Ì€Î¥¿¥¹¥¯€ÎÍ¥ÀèÅÙ€è€ê€â¹â€€Ÿì¹ç€Ç€¢
244 *  €ë¡¥
245 */
246#ifdef TOPPERS_tskrun
247
248bool_t
249make_runnable(TCB *p_tcb)
250{
251        uint_t  pri = p_tcb->priority;
252
253        queue_insert_prev(&(ready_queue[pri]), &(p_tcb->task_queue));
254        primap_set(pri);
255
256        if (p_schedtsk == (TCB *) NULL || pri < p_schedtsk->priority) {
257                p_schedtsk = p_tcb;
258                return(dspflg);
259        }
260        return(false);
261}
262
263#endif /* TOPPERS_tskrun */
264
265/*
266 *  ŒÂ¹Ô€Ç€­€ëŸõÂÖ€«€éŸ€ÎŸõÂր؀ÎÁ«°Ü
267 *
268 *  ºÇ¹âÍ¥Àèœç°Ì€Î¥¿¥¹¥¯€ò¹¹¿·€¹€ë€Î€Ï¡€p_tcb€¬ºÇ¹âÍ¥Àèœç°Ì€Î¥¿¥¹¥¯€Ç
269 *  €¢€Ã€¿Ÿì¹ç€Ç€¢€ë¡¥p_tcb€ÈƱ€žÍ¥ÀèÅـΥ¿¥¹¥¯€¬ÂŸ€Ë€¢€ëŸì¹ç€Ï¡€p_tcb
270 *  €ÎŒ¡€Î¥¿¥¹¥¯€¬ºÇ¹âÍ¥Àèœç°Ì€Ë€Ê€ë¡¥€œ€Š€Ç€Ê€€Ÿì¹ç€Ï¡€¥ì¥Ç¥£¥­¥å¡Œ€ò
271 *  ¥µ¡Œ¥Á€¹€ëɬÍ×€¬€¢€ë¡¥
272 */
273#ifdef TOPPERS_tsknrun
274
275bool_t
276make_non_runnable(TCB *p_tcb)
277{
278        uint_t  pri = p_tcb->priority;
279        QUEUE   *p_queue = &(ready_queue[pri]);
280
281        queue_delete(&(p_tcb->task_queue));
282        if (queue_empty(p_queue)) {
283                primap_clear(pri);
284                if (p_schedtsk == p_tcb) {
285                        p_schedtsk = primap_empty() ? (TCB *) NULL : search_schedtsk();
286                        return(dspflg);
287                }
288        }
289        else {
290                if (p_schedtsk == p_tcb) {
291                        p_schedtsk = (TCB *)(p_queue->p_next);
292                        return(dspflg);
293                }
294        }
295        return(false);
296}
297
298#endif /* TOPPERS_tsknrun */
299
300/*
301 *  µÙ»ßŸõÂր؀ÎÁ«°Ü
302 */
303#ifdef TOPPERS_tskdmt
304
305void
306make_dormant(TCB *p_tcb)
307{
308        p_tcb->tstat = TS_DORMANT;
309        p_tcb->bpriority = p_tcb->p_tinib->ipriority;
310        p_tcb->priority = p_tcb->p_tinib->ipriority;
311        p_tcb->wupque = false;
312        p_tcb->enatex = false;
313        p_tcb->texptn = 0U;
314        LOG_TSKSTAT(p_tcb);
315}
316
317#endif /* TOPPERS_tskdmt */
318
319/*
320 *  µÙ»ßŸõÂÖ€«€éŒÂ¹Ô€Ç€­€ëŸõÂր؀ÎÁ«°Ü
321 */
322#ifdef TOPPERS_tskact
323
324bool_t
325make_active(TCB *p_tcb)
326{
327        activate_context(p_tcb);
328        p_tcb->tstat = TS_RUNNABLE;
329        LOG_TSKSTAT(p_tcb);
330        return(make_runnable(p_tcb));
331}
332
333#endif /* TOPPERS_tskact */
334
335/*
336 *  ¥¿¥¹¥¯€ÎÍ¥ÀèÅÙ€ÎÊѹ¹
337 *
338 *  ¥¿¥¹¥¯€¬ŒÂ¹Ô€Ç€­€ëŸõÂրΟì¹ç€Ë€Ï¡€¥ì¥Ç¥£¥­¥å¡Œ€ÎÃæ€Ç€Î°ÌÃÖ€òÊѹ¹€¹
339 *  €ë¡¥¥ª¥Ö¥ž¥§¥¯¥È€ÎÂÔ€Á¥­¥å¡Œ€ÎÃæ€ÇÂÔ€ÁŸõÂրˀʀÀƀ€€ëŸì¹ç€Ë€Ï¡€ÂÔ
340 *  €Á¥­¥å¡Œ€ÎÃæ€Ç€Î°ÌÃÖ€òÊѹ¹€¹€ë¡¥
341 *
342 *  ºÇ¹âÍ¥Àèœç°Ì€Î¥¿¥¹¥¯€ò¹¹¿·€¹€ë€Î€Ï¡€(1) p_tcb€¬ºÇ¹âÍ¥Àèœç°Ì€Î¥¿¥¹
343 *  ¥¯€Ç€¢€Ã€Æ¡€€œ€ÎÍ¥ÀèÅÙ€ò²Œ€²€¿Ÿì¹ç¡€(2) p_tcb€¬ºÇ¹âÍ¥Àèœç°Ì€Î¥¿¥¹
344 *  ¥¯€Ç€Ï€Ê€¯¡€Êѹ¹žå€ÎÍ¥ÀèÅÙ€¬ºÇ¹âÍ¥Àèœç°Ì€Î¥¿¥¹¥¯€ÎÍ¥ÀèÅÙ€è€ê€â¹â€€
345 *  Ÿì¹ç€Ç€¢€ë¡¥(1)€ÎŸì¹ç€Ë€Ï¡€¥ì¥Ç¥£¥­¥å¡Œ€ò¥µ¡Œ¥Á€¹€ëɬÍ×€¬€¢€ë¡¥
346 */
347#ifdef TOPPERS_tskpri
348
349bool_t
350change_priority(TCB *p_tcb, uint_t newpri, bool_t mtxmode)
351{
352        uint_t  oldpri;
353
354        oldpri = p_tcb->priority;
355        p_tcb->priority = newpri;
356
357        if (TSTAT_RUNNABLE(p_tcb->tstat)) {
358                /*
359                 *  ¥¿¥¹¥¯€¬ŒÂ¹Ô€Ç€­€ëŸõÂրΟì¹ç
360                 */
361                queue_delete(&(p_tcb->task_queue));
362                if (queue_empty(&(ready_queue[oldpri]))) {
363                        primap_clear(oldpri);
364                }
365                if (mtxmode) {
366                        queue_insert_next(&(ready_queue[newpri]), &(p_tcb->task_queue));
367                }
368                else {
369                        queue_insert_prev(&(ready_queue[newpri]), &(p_tcb->task_queue));
370                }
371                primap_set(newpri);
372
373                if (p_schedtsk == p_tcb) {
374                        if (newpri >= oldpri) {
375                                p_schedtsk = search_schedtsk();
376                                return(p_schedtsk != p_tcb && dspflg);
377                        }
378                }
379                else {
380                        if (mtxmode ? newpri <= p_schedtsk->priority
381                                                : newpri < p_schedtsk->priority) {
382                                p_schedtsk = p_tcb;
383                                return(dspflg);
384                        }
385                }
386        }
387        else {
388                if (TSTAT_WAIT_WOBJCB(p_tcb->tstat)) {
389                        /*
390                         *  ¥¿¥¹¥¯€¬¡€Æ±Žü¡ŠÄÌ¿®¥ª¥Ö¥ž¥§¥¯¥È€ÎŽÉÍý¥Ö¥í¥Ã¥¯€Î¶ŠÄÌÉô
391                         *  ʬ¡ÊWOBJCB¡Ë€ÎÂÔ€Á¥­¥å¡Œ€Ë€Ä€Ê€¬€ì€Æ€€€ëŸì¹ç
392                         */
393                        wobj_change_priority(((WINFO_WOBJ *)(p_tcb->p_winfo))->p_wobjcb,
394                                                                                                                                        p_tcb);
395                }
396        }
397        return(false);
398}
399
400#endif /* TOPPERS_tskpri */
401
402/*
403 *  ¥ì¥Ç¥£¥­¥å¡Œ€Î²óÅŸ
404 *
405 *  ºÇ¹âÍ¥Àèœç°Ì€Î¥¿¥¹¥¯€ò¹¹¿·€¹€ë€Î€Ï¡€ºÇ¹âÍ¥Àèœç°Ì€Î¥¿¥¹¥¯€¬¥¿¥¹¥¯¥­
406 *  ¥å¡Œ€ÎËöÈø€Ë°Üư€·€¿Ÿì¹ç€Ç€¢€ë¡¥
407 */
408#ifdef TOPPERS_tskrot
409
410bool_t
411rotate_ready_queue(uint_t pri)
412{
413        QUEUE   *p_queue = &(ready_queue[pri]);
414        QUEUE   *p_entry;
415
416        if (!queue_empty(p_queue) && p_queue->p_next->p_next != p_queue) {
417                p_entry = queue_delete_next(p_queue);
418                queue_insert_prev(p_queue, p_entry);
419                if (p_schedtsk == (TCB *) p_entry) {
420                        p_schedtsk = (TCB *)(p_queue->p_next);
421                        return(dspflg);
422                }
423        }
424        return(false);
425}
426
427#endif /* TOPPERS_tskrot */
428
429/*
430 *  ¥¿¥¹¥¯Îã³°œèÍý¥ë¡Œ¥Á¥ó€ÎžÆœÐ€·
431 *
432 *  ASP¥«¡Œ¥Í¥ë€Ç€Ï¡€¥¿¥¹¥¯Îã³°œèÍý¥ë¡Œ¥Á¥óÆâ€ÇCPU¥í¥Ã¥¯ŸõÂÖ€ËÁ«°Ü€·¡€
433 *  žµ€ÎŸõÂÖ€ËÌဵ€º€Ë¥ê¥¿¡Œ¥ó€·€¿Ÿì¹ç¡€¥«¡Œ¥Í¥ë€¬žµ€ÎŸõÂÖ€ËÌ္¡¥
434 */
435#ifdef TOPPERS_tsktex
436
437void
438call_texrtn(void)
439{
440        TEXPTN  texptn;
441        bool_t  saved_disdsp;
442
443        saved_disdsp = disdsp;
444        p_runtsk->enatex = false;
445        do {
446                texptn = p_runtsk->texptn;
447                p_runtsk->texptn = 0U;
448
449                t_unlock_cpu();
450                LOG_TEX_ENTER(p_runtsk, texptn);
451                (*((TEXRTN)(p_runtsk->p_tinib->texrtn)))(texptn,
452                                                                                                p_runtsk->p_tinib->exinf);
453                LOG_TEX_LEAVE(p_runtsk);
454                if (!t_sense_lock()) {
455                        t_lock_cpu();
456                }
457                if (!ipmflg) {
458                        t_set_ipm(TIPM_ENAALL);
459                        ipmflg = true;
460                }
461                disdsp = saved_disdsp;
462                dspflg = !disdsp;
463                p_runtsk->enatex = false;
464                if (p_runtsk != p_schedtsk && dspflg) {
465                        /*
466                         *  €³€³€Çdispatch€òžÆ€ÓœÐ€¹œèÍý€Ï¡€ÁêžßºÆµ¢žÆœÐ€·€Ë€Ê€Ã€Æ
467                         *  €€€ë€¬¡€dispatch€òžÆ€ÖÁ°€Ëp_runtsk->enatex€òfalse€Ë€·€Æ
468                         *  €ª€±€Ð»ÙŸã€¬€Ê€€¡¥€œ€ÎÍýͳ€Ë€Ä€€€Æ€Ï¡€¡ÖTOPPERS/ASP ¥«¡Œ
469                         *  ¥Í¥ë Àß·×¥á¥â¡×€ò»²ŸÈ€Î€³€È¡¥
470                         */
471                        dispatch();
472                }
473        } while (p_runtsk->texptn != 0U);
474        p_runtsk->enatex = true;
475}
476
477/*
478 *  ¥¿¥¹¥¯Îã³°œèÍý¥ë¡Œ¥Á¥ó€Îµ¯Æ°
479 */
480#ifndef OMIT_CALLTEX
481
482void
483calltex(void)
484{
485        if (p_runtsk->enatex && p_runtsk->texptn != 0U && ipmflg) {
486                call_texrtn();
487        }
488}
489
490#endif /* OMIT_CALLTEX */
491#endif /* TOPPERS_tsktex */
詳しい使い方は TracBrowser を参照してください。