source: asp_ewarm/asp-1.7.0/extension/pri_level/kernel/task.c@ 61

Last change on this file since 61 was 61, checked in by ertl-honda, 11 years ago

ASP for EWARM のコミット.

File size: 12.0 KB
Line 
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-2010 by Embedded and Real-Time Systems Laboratory
9 * Graduate School of Information Science, Nagoya Univ., JAPAN
10 *
11 * ã‹L’˜ìŒ ŽÒ‚́CˆÈ‰º‚Ì(1)`(4)‚ÌðŒ‚ð–ž‚½‚·ê‡‚ÉŒÀ‚èC–{ƒ\ƒtƒgƒEƒF
12 * ƒAi–{ƒ\ƒtƒgƒEƒFƒA‚ð‰ü•Ï‚µ‚½‚à‚Ì‚ðŠÜ‚ށDˆÈ‰º“¯‚¶j‚ðŽg—pE•¡»E‰ü
13 * •ÏEÄ”z•ziˆÈ‰ºC—˜—p‚ƌĂԁj‚·‚邱‚Ƃ𖳏ž‚Å‹–‘ø‚·‚éD
14 * (1) –{ƒ\ƒtƒgƒEƒFƒA‚ðƒ\[ƒXƒR[ƒh‚ÌŒ`‚Å—˜—p‚·‚éê‡‚ɂ́Cã‹L‚Ì’˜ì
15 * Œ •\Ž¦C‚±‚Ì—˜—pðŒ‚¨‚æ‚щº‹L‚Ì–³•ÛØ‹K’肪C‚»‚Ì‚Ü‚Ü‚ÌŒ`‚Ń\[
16 * ƒXƒR[ƒh’†‚ÉŠÜ‚Ü‚ê‚Ä‚¢‚邱‚ƁD
17 * (2) –{ƒ\ƒtƒgƒEƒFƒA‚ðCƒ‰ƒCƒuƒ‰ƒŠŒ`Ž®‚ȂǁC‘¼‚̃\ƒtƒgƒEƒFƒAŠJ”­‚ÉŽg
18 * —p‚Å‚«‚éŒ`‚ōĔz•z‚·‚éê‡‚ɂ́CÄ”z•z‚É”º‚¤ƒhƒLƒ…
19ƒƒ“ƒgi—˜—p
20 * ŽÒƒ}ƒjƒ…
21ƒAƒ‹‚Ȃǁj‚ɁCã‹L‚Ì’˜ìŒ •\Ž¦C‚±‚Ì—˜—pðŒ‚¨‚æ‚щº‹L
22 * ‚Ì–³•ÛØ‹K’è‚ðŒfÚ‚·‚邱‚ƁD
23 * (3) –{ƒ\ƒtƒgƒEƒFƒA‚ðC‹@Ší‚É‘g‚ݍž‚ނȂǁC‘¼‚̃\ƒtƒgƒEƒFƒAŠJ”­‚ÉŽg
24 * —p‚Å‚«‚È‚¢Œ`‚ōĔz•z‚·‚éê‡‚ɂ́CŽŸ‚Ì‚¢‚¸‚ê‚©‚ÌðŒ‚ð–ž‚½‚·‚±
25 * ‚ƁD
26 * (a) Ä”z•z‚É”º‚¤ƒhƒLƒ…
27ƒƒ“ƒgi—˜—pŽÒƒ}ƒjƒ…
28ƒAƒ‹‚Ȃǁj‚ɁCã‹L‚Ì’˜
29 * ìŒ •\Ž¦C‚±‚Ì—˜—pðŒ‚¨‚æ‚щº‹L‚Ì–³•ÛØ‹K’è‚ðŒfÚ‚·‚邱‚ƁD
30 * (b) Ä”z•z‚ÌŒ`‘Ô‚ðC•Ê‚É’è‚ß‚é•û–@‚É‚æ‚Á‚āCTOPPERSƒvƒƒWƒFƒNƒg‚É
31 * •ñ‚·‚邱‚ƁD
32 * (4) –{ƒ\ƒtƒgƒEƒFƒA‚Ì—˜—p‚É‚æ‚è’¼Ú“I‚Ü‚½‚͊ԐړI‚ɐ¶‚¶‚é‚¢‚©‚Ȃ鑹
33 * ŠQ‚©‚ç‚àCã‹L’˜ìŒ ŽÒ‚¨‚æ‚ÑTOPPERSƒvƒƒWƒFƒNƒg‚ð–Ɛӂ·‚邱‚ƁD
34 * ‚Ü‚½C–{ƒ\ƒtƒgƒEƒFƒA‚̃†[ƒU‚Ü‚½‚̓Gƒ“ƒhƒ†[ƒU‚©‚ç‚Ì‚¢‚©‚Ȃ闝
35 * —R‚ÉŠî‚­¿‹‚©‚ç‚àCã‹L’˜ìŒ ŽÒ‚¨‚æ‚ÑTOPPERSƒvƒƒWƒFƒNƒg‚ð
36 * –Ɛӂ·‚邱‚ƁD
37 *
38 * –{ƒ\ƒtƒgƒEƒFƒA‚́C–³•ÛØ‚Å’ñ‹Ÿ‚³‚ê‚Ä‚¢‚é‚à‚Ì‚Å‚ ‚éDã‹L’˜ìŒ ŽÒ‚¨
39 * ‚æ‚ÑTOPPERSƒvƒƒWƒFƒNƒg‚́C–{ƒ\ƒtƒgƒEƒFƒA‚ÉŠÖ‚µ‚āC“Á’è‚ÌŽg—p–Ú“I
40 * ‚ɑ΂·‚é“K‡«‚àŠÜ‚߂āC‚¢‚©‚È‚é•ÛØ‚às‚í‚È‚¢D‚Ü‚½C–{ƒ\ƒtƒgƒEƒF
41 * ƒA‚Ì—˜—p‚É‚æ‚è’¼Ú“I‚Ü‚½‚͊ԐړI‚ɐ¶‚¶‚½‚¢‚©‚Ȃ鑹ŠQ‚ÉŠÖ‚µ‚Ä‚àC‚»
42 * ‚̐ӔC‚𕉂í‚È‚¢D
43 *
44 * $Id: task.c 2018 2010-12-31 13:43:05Z ertl-hiro $
45 */
46
47/*
48 * ƒ^ƒXƒNŠÇ—ƒ‚ƒWƒ…
49[ƒ‹
50 */
51
52#include "kernel_impl.h"
53#include "wait.h"
54#include "task.h"
55
56/*
57 * ƒgƒŒ[ƒXƒƒOƒ}ƒNƒ‚̃fƒtƒHƒ‹ƒg’è‹`
58 */
59#ifndef LOG_TEX_ENTER
60#define LOG_TEX_ENTER(p_tcb, texptn)
61#endif /* LOG_TEX_ENTER */
62
63#ifndef LOG_TEX_LEAVE
64#define LOG_TEX_LEAVE(p_tcb)
65#endif /* LOG_TEX_LEAVE */
66
67#ifdef TOPPERS_tskini
68
69/*
70 * ŽÀsó‘Ԃ̃^ƒXƒN
71 */
72TCB *p_runtsk;
73
74/*
75 * Å‚—Dæ‡ˆÊ‚̃^ƒXƒN
76 */
77TCB *p_schedtsk;
78
79/*
80 * ƒ^ƒXƒNƒfƒBƒXƒpƒbƒ`^ƒ^ƒXƒN—áŠOˆ—ƒ‹[ƒ`ƒ“‹N“®—v‹ƒtƒ‰ƒO
81 */
82bool_t reqflg;
83
84/*
85 * Š„ž‚Ý—Dæ“xƒ}ƒXƒN‘S‰ðœó‘Ô
86 */
87bool_t ipmflg;
88
89/*
90 * ƒfƒBƒXƒpƒbƒ`‹ÖŽ~ó‘Ô
91 */
92bool_t disdsp;
93
94/*
95 * ƒ^ƒXƒNƒfƒBƒXƒpƒbƒ`‰Â”\ó‘Ô
96 */
97bool_t dspflg;
98
99/*
100 * ƒŒƒfƒBƒLƒ…
101[
102 */
103QUEUE ready_queue[TNUM_TPRI];
104
105/*
106 * ƒŒƒfƒBƒLƒ…
107[ƒT[ƒ`‚Ì‚½‚߂̃rƒbƒgƒ}ƒbƒv
108 */
109#ifdef PRIMAP_LEVEL_1
110uint16_t ready_primap;
111#else /* PRIMAP_LEVEL_1 */
112uint16_t ready_primap1;
113uint16_t ready_primap2[TNUM_PRIMAP2];
114#endif /* PRIMAP_LEVEL_1 */
115
116/*
117 * ƒ^ƒXƒNŠÇ—ƒ‚ƒWƒ…
118[ƒ‹‚̏‰Šú‰»
119 */
120void
121initialize_task(void)
122{
123 uint_t i, j;
124 TCB *p_tcb;
125
126 p_runtsk = p_schedtsk = NULL;
127 reqflg = false;
128 ipmflg = true;
129 disdsp = false;
130 dspflg = true;
131
132 for (i = 0; i < TNUM_TPRI; i++) {
133 queue_initialize(&(ready_queue[i]));
134 }
135#ifdef PRIMAP_LEVEL_1
136 ready_primap = 0U;
137#else /* PRIMAP_LEVEL_1 */
138 ready_primap1 = 0U;
139 for (i = 0; i < TNUM_PRIMAP2; i++) {
140 ready_primap2[i] = 0U;
141 }
142#endif /* PRIMAP_LEVEL_1 */
143
144 for (i = 0; i < tnum_tsk; i++) {
145 j = INDEX_TSK(torder_table[i]);
146 p_tcb = &(tcb_table[j]);
147 p_tcb->p_tinib = &(tinib_table[j]);
148 p_tcb->actque = false;
149 make_dormant(p_tcb);
150 if ((p_tcb->p_tinib->tskatr & TA_ACT) != 0U) {
151 make_active(p_tcb);
152 }
153 }
154}
155
156#endif /* TOPPERS_tskini */
157
158/*
159 * ƒrƒbƒgƒ}ƒbƒvƒT[ƒ`ŠÖ”
160 *
161 * bitmap“à‚Ì1‚̃rƒbƒg‚Ì“àCÅ‚à‰ºˆÊi‰Ej‚Ì‚à‚Ì‚ðƒT[ƒ`‚µC‚»‚̃rƒb
162 * ƒg”ԍ†‚ð•Ô‚·Dƒrƒbƒg”ԍ†‚́CÅ‰ºˆÊƒrƒbƒg‚ð0‚Æ‚·‚éDbitmap‚É0‚ðŽw’è
163 * ‚µ‚Ä‚Í‚È‚ç‚È‚¢D‚±‚̊֐”‚ł́Cbitmap‚ª16ƒrƒbƒg‚Å‚ ‚邱‚Æ‚ð‰¼’è‚µC
164 * uint16_tŒ^‚Æ‚µ‚Ä‚¢‚éD
165 *
166 * ƒrƒbƒgƒT[ƒ`–½—ß‚ðŽ‚ÂƒvƒƒZƒbƒT‚ł́CƒrƒbƒgƒT[ƒ`–½—ß‚ðŽg‚¤‚悤‚É
167 * ‘‚«’¼‚µ‚½•û‚ªŒø—¦‚ª—Ç‚¢ê‡‚ª‚ ‚éD‚±‚̂悤‚ȏꍇ‚ɂ́Cƒ^[ƒQƒbƒg
168 * ˆË‘¶•”‚ŃrƒbƒgƒT[ƒ`–½—ß‚ðŽg‚Á‚½bitmap_search‚ð’è‹`‚µC
169 * OMIT_BITMAP_SEARCH‚ðƒ}ƒNƒ’è‹`‚·‚ê‚΂悢D‚Ü‚½CƒrƒbƒgƒT[ƒ`–½—ß‚Ì
170 * ƒT[ƒ`•ûŒü‚ª‹t‚È‚Ç‚Ì——R‚Å—Dæ“x‚ƃrƒbƒg‚Ƃ̑Ήž‚ð•ÏX‚µ‚½‚¢ê‡‚É
171 * ‚́CPRIMAP_BIT‚ðƒ}ƒNƒ’è‹`‚·‚ê‚΂悢D
172 *
173 * ‚Ü‚½Cƒ‰ƒCƒuƒ‰ƒŠ‚Éffs‚ª‚ ‚é‚È‚çCŽŸ‚̂悤‚É’è‹`‚µ‚ă‰ƒCƒuƒ‰ƒŠŠÖ”‚ð
174 * Žg‚Á‚½•û‚ªŒø—¦‚ª—Ç‚¢‰Â”\«‚à‚ ‚éD
175 * #define bitmap_search(bitmap) (ffs(bitmap) - 1)
176 */
177#ifndef PRIMAP_BIT
178#define PRIMAP_BIT(pri) (1U << (pri))
179#endif /* PRIMAP_BIT */
180
181#ifndef OMIT_BITMAP_SEARCH
182
183static const unsigned char bitmap_search_table[] = { 0, 1, 0, 2, 0, 1, 0,
184 3, 0, 1, 0, 2, 0, 1, 0 };
185
186Inline uint_t
187bitmap_search(uint16_t bitmap)
188{
189 uint_t n = 0U;
190
191 assert(bitmap != 0U);
192 if ((bitmap & 0x00ffU) == 0U) {
193 bitmap >>= 8;
194 n += 8;
195 }
196 if ((bitmap & 0x0fU) == 0U) {
197 bitmap >>= 4;
198 n += 4;
199 }
200 return(n + bitmap_search_table[(bitmap & 0x0fU) - 1]);
201}
202
203#endif /* OMIT_BITMAP_SEARCH */
204
205/*
206 * —Dæ“xƒrƒbƒgƒ}ƒbƒv‚ª‹ó‚©‚̃`ƒFƒbƒN
207 */
208Inline bool_t
209primap_empty(void)
210{
211#ifdef PRIMAP_LEVEL_1
212 return(ready_primap == 0U);
213#else /* PRIMAP_LEVEL_1 */
214 return(ready_primap1 == 0U);
215#endif /* PRIMAP_LEVEL_1 */
216}
217
218/*
219 * —Dæ“xƒrƒbƒgƒ}ƒbƒv‚̃T[ƒ`
220 */
221Inline uint_t
222primap_search(void)
223{
224#ifdef PRIMAP_LEVEL_1
225 return(bitmap_search(ready_primap));
226#else /* PRIMAP_LEVEL_1 */
227 uint_t i;
228
229 i = bitmap_search(ready_primap1);
230 return(i * TBIT_PRIMAP + bitmap_search(ready_primap2[i]));
231#endif /* PRIMAP_LEVEL_1 */
232}
233
234/*
235 * —Dæ“xƒrƒbƒgƒ}ƒbƒv‚̃Zƒbƒg
236 */
237Inline void
238primap_set(uint_t pri)
239{
240#ifdef PRIMAP_LEVEL_1
241 ready_primap |= PRIMAP_BIT(pri);
242#else /* PRIMAP_LEVEL_1 */
243 ready_primap2[pri / TBIT_PRIMAP] |= PRIMAP_BIT(pri % TBIT_PRIMAP);
244 ready_primap1 |= PRIMAP_BIT(pri / TBIT_PRIMAP);
245#endif /* PRIMAP_LEVEL_1 */
246}
247
248/*
249 * —Dæ“xƒrƒbƒgƒ}ƒbƒv‚̃NƒŠƒA
250 */
251Inline void
252primap_clear(uint_t pri)
253{
254#ifdef PRIMAP_LEVEL_1
255 ready_primap &= ~PRIMAP_BIT(pri);
256#else /* PRIMAP_LEVEL_1 */
257 if ((ready_primap2[pri / TBIT_PRIMAP] &= ~PRIMAP_BIT(pri % TBIT_PRIMAP))
258 == 0U) {
259 ready_primap1 &= ~PRIMAP_BIT(pri / TBIT_PRIMAP);
260 }
261#endif /* PRIMAP_LEVEL_1 */
262}
263
264/*
265 * Å‚—Dæ‡ˆÊƒ^ƒXƒN‚̃T[ƒ`
266 */
267#ifdef TOPPERS_tsksched
268
269TCB *
270search_schedtsk(void)
271{
272 uint_t schedpri;
273
274 schedpri = primap_search();
275 return((TCB *)(ready_queue[schedpri].p_next));
276}
277
278#endif /* TOPPERS_tsksched */
279
280/*
281 * ŽÀs‚Å‚«‚éó‘Ô‚Ö‚Ì‘JˆÚ
282 *
283 * Å‚—Dæ‡ˆÊ‚̃^ƒXƒN‚ðXV‚·‚é‚̂́CŽÀs‚Å‚«‚éƒ^ƒXƒN‚ª‚È‚©‚Á‚½ê‡
284 * ‚ƁCp_tcb‚Ì—Dæ“x‚ªÅ‚—Dæ‡ˆÊ‚̃^ƒXƒN‚Ì—Dæ“x‚æ‚è‚à‚‚¢ê‡‚Å‚ 
285 * ‚éD
286 */
287#ifdef TOPPERS_tskrun
288
289bool_t
290make_runnable(TCB *p_tcb)
291{
292 uint_t pri = p_tcb->priority;
293
294 queue_insert_prev(&(ready_queue[pri]), &(p_tcb->task_queue));
295 primap_set(pri);
296
297 if (p_schedtsk == (TCB *) NULL || pri < p_schedtsk->priority) {
298 p_schedtsk = p_tcb;
299 return(dspflg);
300 }
301 return(false);
302}
303
304#endif /* TOPPERS_tskrun */
305
306/*
307 * ŽÀs‚Å‚«‚éó‘Ô‚©‚瑼‚̏ó‘Ô‚Ö‚Ì‘JˆÚ
308 *
309 * Å‚—Dæ‡ˆÊ‚̃^ƒXƒN‚ðXV‚·‚é‚̂́Cp_tcb‚ªÅ‚—Dæ‡ˆÊ‚̃^ƒXƒN‚Å
310 * ‚ ‚Á‚½ê‡‚Å‚ ‚éDp_tcb‚Æ“¯‚¶—Dæ“x‚̃^ƒXƒN‚ª‘¼‚É‚ ‚éê‡‚́Cp_tcb
311 * ‚ÌŽŸ‚̃^ƒXƒN‚ªÅ‚—Dæ‡ˆÊ‚É‚È‚éD‚»‚¤‚Å‚È‚¢ê‡‚́CƒŒƒfƒBƒLƒ…
312[‚ð
313 * ƒT[ƒ`‚·‚é•K—v‚ª‚ ‚éD
314 */
315#ifdef TOPPERS_tsknrun
316
317bool_t
318make_non_runnable(TCB *p_tcb)
319{
320 uint_t pri = p_tcb->priority;
321 QUEUE *p_queue = &(ready_queue[pri]);
322
323 queue_delete(&(p_tcb->task_queue));
324 if (queue_empty(p_queue)) {
325 primap_clear(pri);
326 if (p_schedtsk == p_tcb) {
327 p_schedtsk = primap_empty() ? (TCB *) NULL : search_schedtsk();
328 return(dspflg);
329 }
330 }
331 else {
332 if (p_schedtsk == p_tcb) {
333 p_schedtsk = (TCB *)(p_queue->p_next);
334 return(dspflg);
335 }
336 }
337 return(false);
338}
339
340#endif /* TOPPERS_tsknrun */
341
342/*
343 * ‹xŽ~ó‘Ô‚Ö‚Ì‘JˆÚ
344 */
345#ifdef TOPPERS_tskdmt
346
347void
348make_dormant(TCB *p_tcb)
349{
350 p_tcb->tstat = TS_DORMANT;
351 p_tcb->priority = p_tcb->p_tinib->ipriority;
352 p_tcb->wupque = false;
353 p_tcb->enatex = false;
354 p_tcb->texptn = 0U;
355 LOG_TSKSTAT(p_tcb);
356}
357
358#endif /* TOPPERS_tskdmt */
359
360/*
361 * ‹xŽ~ó‘Ô‚©‚çŽÀs‚Å‚«‚éó‘Ô‚Ö‚Ì‘JˆÚ
362 */
363#ifdef TOPPERS_tskact
364
365bool_t
366make_active(TCB *p_tcb)
367{
368 activate_context(p_tcb);
369 p_tcb->tstat = TS_RUNNABLE;
370 LOG_TSKSTAT(p_tcb);
371 return(make_runnable(p_tcb));
372}
373
374#endif /* TOPPERS_tskact */
375
376/*
377 * ƒ^ƒXƒN‚Ì—Dæ“x‚̕ύX
378 *
379 * ƒ^ƒXƒN‚ªŽÀs‚Å‚«‚éó‘Ԃ̏ꍇ‚ɂ́CƒŒƒfƒBƒLƒ…
380[‚Ì’†‚ł̈ʒu‚ð•ÏX‚·
381 * ‚éDƒIƒuƒWƒFƒNƒg‚Ì‘Ò‚¿ƒLƒ…
382[‚Ì’†‚Å‘Ò‚¿ó‘Ô‚É‚È‚Á‚Ä‚¢‚éê‡‚ɂ́C‘Ò
383 * ‚¿ƒLƒ…
384[‚Ì’†‚ł̈ʒu‚ð•ÏX‚·‚éD
385 *
386 * Å‚—Dæ‡ˆÊ‚̃^ƒXƒN‚ðXV‚·‚é‚̂́C(1) p_tcb‚ªÅ‚—Dæ‡ˆÊ‚̃^ƒX
387 * ƒN‚Å‚ ‚Á‚āC‚»‚Ì—Dæ“x‚ð‰º‚°‚½ê‡C(2) p_tcb‚ªÅ‚—Dæ‡ˆÊ‚̃^ƒX
388 * ƒN‚Å‚Í‚È‚­C•ÏXŒã‚Ì—Dæ“x‚ªÅ‚—Dæ‡ˆÊ‚̃^ƒXƒN‚Ì—Dæ“x‚æ‚è‚à‚‚¢
389 * ê‡‚Å‚ ‚éD(1)‚̏ꍇ‚ɂ́CƒŒƒfƒBƒLƒ…
390[‚ðƒT[ƒ`‚·‚é•K—v‚ª‚ ‚éD
391 */
392#ifdef TOPPERS_tskpri
393
394bool_t
395change_priority(TCB *p_tcb, uint_t newpri)
396{
397 uint_t oldpri;
398
399 oldpri = p_tcb->priority;
400 p_tcb->priority = newpri;
401
402 if (TSTAT_RUNNABLE(p_tcb->tstat)) {
403 /*
404 * ƒ^ƒXƒN‚ªŽÀs‚Å‚«‚éó‘Ԃ̏ꍇ
405 */
406 queue_delete(&(p_tcb->task_queue));
407 if (queue_empty(&(ready_queue[oldpri]))) {
408 primap_clear(oldpri);
409 }
410 queue_insert_prev(&(ready_queue[newpri]), &(p_tcb->task_queue));
411 primap_set(newpri);
412
413 if (p_schedtsk == p_tcb) {
414 if (newpri >= oldpri) {
415 p_schedtsk = search_schedtsk();
416 return(p_schedtsk != p_tcb && dspflg);
417 }
418 }
419 else {
420 if (newpri < p_schedtsk->priority) {
421 p_schedtsk = p_tcb;
422 return(dspflg);
423 }
424 }
425 }
426 else {
427 if (TSTAT_WAIT_WOBJCB(p_tcb->tstat)) {
428 /*
429 * ƒ^ƒXƒN‚ªC“¯ŠúE’ʐMƒIƒuƒWƒFƒNƒg‚ÌŠÇ—ƒuƒƒbƒN‚Ì‹¤’Ê•”
430 * •ªiWOBJCBj‚Ì‘Ò‚¿ƒLƒ…
431[‚ɂ‚Ȃª‚ê‚Ä‚¢‚éê‡
432 */
433 wobj_change_priority(((WINFO_WOBJ *)(p_tcb->p_winfo))->p_wobjcb,
434 p_tcb);
435 }
436 }
437 return(false);
438}
439
440#endif /* TOPPERS_tskpri */
441
442/*
443 * ƒŒƒfƒBƒLƒ…
444[‚̉ñ“]
445 *
446 * Å‚—Dæ‡ˆÊ‚̃^ƒXƒN‚ðXV‚·‚é‚̂́CÅ‚—Dæ‡ˆÊ‚̃^ƒXƒN‚ªƒ^ƒXƒNƒL
447 * ƒ…
448[‚Ì––”ö‚Ɉړ®‚µ‚½ê‡‚Å‚ ‚éD
449 */
450#ifdef TOPPERS_tskrot
451
452bool_t
453rotate_ready_queue(uint_t pri)
454{
455 QUEUE *p_queue = &(ready_queue[pri]);
456 QUEUE *p_entry;
457
458 if (!queue_empty(p_queue) && p_queue->p_next->p_next != p_queue) {
459 p_entry = queue_delete_next(p_queue);
460 queue_insert_prev(p_queue, p_entry);
461 if (p_schedtsk == (TCB *) p_entry) {
462 p_schedtsk = (TCB *)(p_queue->p_next);
463 return(dspflg);
464 }
465 }
466 return(false);
467}
468
469#endif /* TOPPERS_tskrot */
470
471/*
472 * ƒ^ƒXƒN—áŠOˆ—ƒ‹[ƒ`ƒ“‚̌ďo‚µ
473 *
474 * ASPƒJ[ƒlƒ‹‚ł́Cƒ^ƒXƒN—áŠOˆ—ƒ‹[ƒ`ƒ““à‚ÅCPUƒƒbƒNó‘Ô‚É‘JˆÚ‚µC
475 * Œ³‚̏ó‘Ô‚É–ß‚³‚¸‚ɃŠƒ^[ƒ“‚µ‚½ê‡CƒJ[ƒlƒ‹‚ªŒ³‚̏ó‘Ô‚É–ß‚·D
476 */
477#ifdef TOPPERS_tsktex
478
479void
480call_texrtn(void)
481{
482 TEXPTN texptn;
483 bool_t saved_disdsp;
484
485 saved_disdsp = disdsp;
486 p_runtsk->enatex = false;
487 do {
488 texptn = p_runtsk->texptn;
489 p_runtsk->texptn = 0U;
490
491 t_unlock_cpu();
492 LOG_TEX_ENTER(p_runtsk, texptn);
493 (*((TEXRTN)(p_runtsk->p_tinib->texrtn)))(texptn,
494 p_runtsk->p_tinib->exinf);
495 LOG_TEX_LEAVE(p_runtsk);
496 if (!t_sense_lock()) {
497 t_lock_cpu();
498 }
499 if (!ipmflg) {
500 t_set_ipm(TIPM_ENAALL);
501 ipmflg = true;
502 }
503 disdsp = saved_disdsp;
504 dspflg = !disdsp;
505 p_runtsk->enatex = false;
506 if (p_runtsk != p_schedtsk && dspflg) {
507 /*
508 * ‚±‚±‚Ådispatch‚ðŒÄ‚яo‚·ˆ—‚́C‘ŠŒÝÄ‹AŒÄo‚µ‚É‚È‚Á‚Ä
509 * ‚¢‚邪Cdispatch‚ðŒÄ‚Ô‘O‚Ép_runtsk->enatex‚ðfalse‚É‚µ‚Ä
510 * ‚¨‚¯‚ÎŽxá‚ª‚È‚¢D‚»‚Ì——R‚ɂ‚¢‚ẮCuTOPPERS/ASP ƒJ[
511 * ƒlƒ‹ ÝŒvƒƒ‚v‚ðŽQÆ‚Ì‚±‚ƁD
512 */
513 dispatch();
514 }
515 } while (p_runtsk->texptn != 0U);
516 p_runtsk->enatex = true;
517}
518
519/*
520 * ƒ^ƒXƒN—áŠOˆ—ƒ‹[ƒ`ƒ“‚Ì‹N“®
521 */
522#ifndef OMIT_CALLTEX
523
524void
525calltex(void)
526{
527 if (p_runtsk->enatex && p_runtsk->texptn != 0U && ipmflg) {
528 call_texrtn();
529 }
530}
531
532#endif /* OMIT_CALLTEX */
533#endif /* TOPPERS_tsktex */
Note: See TracBrowser for help on using the repository browser.