source: mypx/extension/dcre/kernel/task.c @ 7

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

TOPPERS/ASP 1.9.1

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