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

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

TOPPERS/ASP 1.9.1

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