source: extension/pri_level/kernel/task.c

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

TOPPERS/ASP 1.9.1

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