source: asp_ewarm/asp-1.7.0/extension/mutex/kernel/task_manage.c@ 61

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

ASP for EWARM のコミット.

File size: 9.5 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-2009 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_manage.c 2018 2010-12-31 13:43:05Z ertl-hiro $
45 */
46
47/*
48 * ƒ^ƒXƒNŠÇ—‹@”\
49 */
50
51#include "kernel_impl.h"
52#include "check.h"
53#include "task.h"
54#include "wait.h"
55#include "mutex.h"
56
57/*
58 * ƒgƒŒ[ƒXƒƒOƒ}ƒNƒ‚̃fƒtƒHƒ‹ƒg’è‹`
59 */
60#ifndef LOG_ACT_TSK_ENTER
61#define LOG_ACT_TSK_ENTER(tskid)
62#endif /* LOG_ACT_TSK_ENTER */
63
64#ifndef LOG_ACT_TSK_LEAVE
65#define LOG_ACT_TSK_LEAVE(ercd)
66#endif /* LOG_ACT_TSK_LEAVE */
67
68#ifndef LOG_IACT_TSK_ENTER
69#define LOG_IACT_TSK_ENTER(tskid)
70#endif /* LOG_IACT_TSK_ENTER */
71
72#ifndef LOG_IACT_TSK_LEAVE
73#define LOG_IACT_TSK_LEAVE(ercd)
74#endif /* LOG_IACT_TSK_LEAVE */
75
76#ifndef LOG_CAN_ACT_ENTER
77#define LOG_CAN_ACT_ENTER(tskid)
78#endif /* LOG_CAN_ACT_ENTER */
79
80#ifndef LOG_CAN_ACT_LEAVE
81#define LOG_CAN_ACT_LEAVE(ercd)
82#endif /* LOG_CAN_ACT_LEAVE */
83
84#ifndef LOG_EXT_TSK_ENTER
85#define LOG_EXT_TSK_ENTER()
86#endif /* LOG_EXT_TSK_ENTER */
87
88#ifndef LOG_EXT_TSK_LEAVE
89#define LOG_EXT_TSK_LEAVE(ercd)
90#endif /* LOG_EXT_TSK_LEAVE */
91
92#ifndef LOG_TER_TSK_ENTER
93#define LOG_TER_TSK_ENTER(tskid)
94#endif /* LOG_TER_TSK_ENTER */
95
96#ifndef LOG_TER_TSK_LEAVE
97#define LOG_TER_TSK_LEAVE(ercd)
98#endif /* LOG_TER_TSK_LEAVE */
99
100#ifndef LOG_CHG_PRI_ENTER
101#define LOG_CHG_PRI_ENTER(tskid, tskpri)
102#endif /* LOG_CHG_PRI_ENTER */
103
104#ifndef LOG_CHG_PRI_LEAVE
105#define LOG_CHG_PRI_LEAVE(ercd)
106#endif /* LOG_CHG_PRI_LEAVE */
107
108#ifndef LOG_GET_PRI_ENTER
109#define LOG_GET_PRI_ENTER(tskid, p_tskpri)
110#endif /* LOG_GET_PRI_ENTER */
111
112#ifndef LOG_GET_PRI_LEAVE
113#define LOG_GET_PRI_LEAVE(ercd, tskpri)
114#endif /* LOG_GET_PRI_LEAVE */
115
116#ifndef LOG_GET_INF_ENTER
117#define LOG_GET_INF_ENTER(p_exinf)
118#endif /* LOG_GET_INF_ENTER */
119
120#ifndef LOG_GET_INF_LEAVE
121#define LOG_GET_INF_LEAVE(ercd, exinf)
122#endif /* LOG_GET_INF_LEAVE */
123
124/*
125 * ƒ^ƒXƒN‚Ì‹N“®
126 */
127#ifdef TOPPERS_act_tsk
128
129ER
130act_tsk(ID tskid)
131{
132 TCB *p_tcb;
133 ER ercd;
134
135 LOG_ACT_TSK_ENTER(tskid);
136 CHECK_TSKCTX_UNL();
137 CHECK_TSKID_SELF(tskid);
138 p_tcb = get_tcb_self(tskid);
139
140 t_lock_cpu();
141 if (TSTAT_DORMANT(p_tcb->tstat)) {
142 if (make_active(p_tcb)) {
143 dispatch();
144 }
145 ercd = E_OK;
146 }
147 else if (!(p_tcb->actque)) {
148 p_tcb->actque = true;
149 ercd = E_OK;
150 }
151 else {
152 ercd = E_QOVR;
153 }
154 t_unlock_cpu();
155
156 error_exit:
157 LOG_ACT_TSK_LEAVE(ercd);
158 return(ercd);
159}
160
161#endif /* TOPPERS_act_tsk */
162
163/*
164 * ƒ^ƒXƒN‚Ì‹N“®i”ñƒ^ƒXƒNƒRƒ“ƒeƒLƒXƒg—pj
165 */
166#ifdef TOPPERS_iact_tsk
167
168ER
169iact_tsk(ID tskid)
170{
171 TCB *p_tcb;
172 ER ercd;
173
174 LOG_IACT_TSK_ENTER(tskid);
175 CHECK_INTCTX_UNL();
176 CHECK_TSKID(tskid);
177 p_tcb = get_tcb(tskid);
178
179 i_lock_cpu();
180 if (TSTAT_DORMANT(p_tcb->tstat)) {
181 if (make_active(p_tcb)) {
182 reqflg = true;
183 }
184 ercd = E_OK;
185 }
186 else if (!(p_tcb->actque)) {
187 p_tcb->actque = true;
188 ercd = E_OK;
189 }
190 else {
191 ercd = E_QOVR;
192 }
193 i_unlock_cpu();
194
195 error_exit:
196 LOG_IACT_TSK_LEAVE(ercd);
197 return(ercd);
198}
199
200#endif /* TOPPERS_iact_tsk */
201
202/*
203 * ƒ^ƒXƒN‹N“®—v‹‚̃Lƒƒƒ“ƒZƒ‹
204 */
205#ifdef TOPPERS_can_act
206
207ER_UINT
208can_act(ID tskid)
209{
210 TCB *p_tcb;
211 ER_UINT ercd;
212
213 LOG_CAN_ACT_ENTER(tskid);
214 CHECK_TSKCTX_UNL();
215 CHECK_TSKID_SELF(tskid);
216 p_tcb = get_tcb_self(tskid);
217
218 t_lock_cpu();
219 ercd = p_tcb->actque ? 1 : 0;
220 p_tcb->actque = false;
221 t_unlock_cpu();
222
223 error_exit:
224 LOG_CAN_ACT_LEAVE(ercd);
225 return(ercd);
226}
227
228#endif /* TOPPERS_can_act */
229
230/*
231 * Ž©ƒ^ƒXƒN‚̏I—¹
232 */
233#ifdef TOPPERS_ext_tsk
234
235ER
236ext_tsk(void)
237{
238 ER ercd;
239
240 LOG_EXT_TSK_ENTER();
241 CHECK_TSKCTX();
242
243 if (t_sense_lock()) {
244 /*
245 * CPUƒƒbƒNó‘Ô‚Åext_tsk‚ªŒÄ‚΂ꂽê‡‚́CCPUƒƒbƒN‚ð‰ðœ‚µ
246 * ‚Ä‚©‚çƒ^ƒXƒN‚ðI—¹‚·‚éDŽÀ‘•ã‚́CƒT[ƒrƒXƒR[ƒ‹“à‚Å‚ÌCPU
247 * ƒƒbƒN‚ðÈ—ª‚·‚ê‚΂悢‚¾‚¯D
248 */
249 }
250 else {
251 t_lock_cpu();
252 }
253 if (disdsp) {
254 /*
255 * ƒfƒBƒXƒpƒbƒ`‹ÖŽ~ó‘Ô‚Åext_tsk‚ªŒÄ‚΂ꂽê‡‚́CƒfƒBƒXƒpƒb
256 * ƒ`‹–‰Âó‘Ô‚É‚µ‚Ä‚©‚çƒ^ƒXƒN‚ðI—¹‚·‚éD
257 */
258 disdsp = false;
259 }
260 if (!ipmflg) {
261 /*
262 * Š„ž‚Ý—Dæ“xƒ}ƒXƒNiIPMj‚ªTIPM_ENAALLˆÈŠO‚̏ó‘Ô‚Åext_tsk
263 * ‚ªŒÄ‚΂ꂽê‡‚́CIPM‚ðTIPM_ENAALL‚É‚µ‚Ä‚©‚çƒ^ƒXƒN‚ðI—¹‚·
264 * ‚éD
265 */
266 t_set_ipm(TIPM_ENAALL);
267 ipmflg = true;
268 }
269 dspflg = true;
270
271 (void) make_non_runnable(p_runtsk);
272 if (!queue_empty(&(p_runtsk->mutex_queue))) {
273 (void) (*mtxhook_release_all)(p_runtsk);
274 }
275 make_dormant(p_runtsk);
276 if (p_runtsk->actque) {
277 p_runtsk->actque = false;
278 (void) make_active(p_runtsk);
279 }
280 exit_and_dispatch();
281 ercd = E_SYS;
282
283 error_exit:
284 LOG_EXT_TSK_LEAVE(ercd);
285 return(ercd);
286}
287
288#endif /* TOPPERS_ext_tsk */
289
290/*
291 * ƒ^ƒXƒN‚Ì‹­§I—¹
292 */
293#ifdef TOPPERS_ter_tsk
294
295ER
296ter_tsk(ID tskid)
297{
298 TCB *p_tcb;
299 bool_t dspreq = false;
300 ER ercd;
301
302 LOG_TER_TSK_ENTER(tskid);
303 CHECK_TSKCTX_UNL();
304 CHECK_TSKID(tskid);
305 p_tcb = get_tcb(tskid);
306 CHECK_NONSELF(p_tcb);
307
308 t_lock_cpu();
309 if (TSTAT_DORMANT(p_tcb->tstat)) {
310 ercd = E_OBJ;
311 }
312 else {
313 if (TSTAT_RUNNABLE(p_tcb->tstat)) {
314 /*
315 * p_tcb‚ÍŽ©ƒ^ƒXƒN‚Å‚È‚¢‚½‚߁CiƒVƒ“ƒOƒ‹ƒvƒƒZƒbƒT‚ł́jŽÀ
316 * só‘Ô‚Å‚È‚­Cmake_non_runnable(p_tcb)‚Ń^ƒXƒNƒfƒBƒXƒpƒb
317 * ƒ`‚ª•K—v‚ɂȂ邱‚Æ‚Í‚È‚¢D
318 */
319 (void) make_non_runnable(p_tcb);
320 }
321 else if (TSTAT_WAITING(p_tcb->tstat)) {
322 wait_dequeue_wobj(p_tcb);
323 wait_dequeue_tmevtb(p_tcb);
324 }
325 if (!queue_empty(&(p_tcb->mutex_queue))) {
326 if ((*mtxhook_release_all)(p_tcb)) {
327 dspreq = true;
328 }
329 }
330 make_dormant(p_tcb);
331 if (p_tcb->actque) {
332 p_tcb->actque = false;
333 if (make_active(p_tcb)) {
334 dspreq = true;
335 }
336 }
337 if (dspreq) {
338 dispatch();
339 }
340 ercd = E_OK;
341 }
342 t_unlock_cpu();
343
344 error_exit:
345 LOG_TER_TSK_LEAVE(ercd);
346 return(ercd);
347}
348
349#endif /* TOPPERS_ter_tsk */
350
351/*
352 * ƒ^ƒXƒN‚̃x[ƒX—Dæ“x‚̕ύX
353 */
354#ifdef TOPPERS_chg_pri
355
356ER
357chg_pri(ID tskid, PRI tskpri)
358{
359 TCB *p_tcb;
360 uint_t newbpri;
361 ER ercd;
362
363 LOG_CHG_PRI_ENTER(tskid, tskpri);
364 CHECK_TSKCTX_UNL();
365 CHECK_TSKID_SELF(tskid);
366 CHECK_TPRI_INI(tskpri);
367 p_tcb = get_tcb_self(tskid);
368 newbpri = (tskpri == TPRI_INI) ? p_tcb->p_tinib->ipriority
369 : INT_PRIORITY(tskpri);
370
371 t_lock_cpu();
372 if (TSTAT_DORMANT(p_tcb->tstat)) {
373 ercd = E_OBJ;
374 }
375 else if ((!queue_empty(&(p_tcb->mutex_queue))
376 || TSTAT_WAIT_MTX(p_tcb->tstat))
377 && !((*mtxhook_check_ceilpri)(p_tcb, newbpri))) {
378 ercd = E_ILUSE;
379 }
380 else {
381 p_tcb->bpriority = newbpri;
382 if (queue_empty(&(p_tcb->mutex_queue))
383 || !((*mtxhook_scan_ceilmtx)(p_tcb))) {
384 if (change_priority(p_tcb, newbpri, false)) {
385 dispatch();
386 }
387 }
388 ercd = E_OK;
389 }
390 t_unlock_cpu();
391
392 error_exit:
393 LOG_CHG_PRI_LEAVE(ercd);
394 return(ercd);
395}
396
397#endif /* TOPPERS_chg_pri */
398
399/*
400 * ƒ^ƒXƒN—Dæ“x‚ÌŽQÆ
401 */
402#ifdef TOPPERS_get_pri
403
404ER
405get_pri(ID tskid, PRI *p_tskpri)
406{
407 TCB *p_tcb;
408 ER ercd;
409
410 LOG_GET_PRI_ENTER(tskid, p_tskpri);
411 CHECK_TSKCTX_UNL();
412 CHECK_TSKID_SELF(tskid);
413 p_tcb = get_tcb_self(tskid);
414
415 t_lock_cpu();
416 if (TSTAT_DORMANT(p_tcb->tstat)) {
417 ercd = E_OBJ;
418 }
419 else {
420 *p_tskpri = EXT_TSKPRI(p_tcb->priority);
421 ercd = E_OK;
422 }
423 t_unlock_cpu();
424
425 error_exit:
426 LOG_GET_PRI_LEAVE(ercd, *p_tskpri);
427 return(ercd);
428}
429
430#endif /* TOPPERS_get_pri */
431
432/*
433 * Ž©ƒ^ƒXƒN‚ÌŠg’£î•ñ‚ÌŽQÆ
434 */
435#ifdef TOPPERS_get_inf
436
437ER
438get_inf(intptr_t *p_exinf)
439{
440 ER ercd;
441
442 LOG_GET_INF_ENTER(p_exinf);
443 CHECK_TSKCTX_UNL();
444
445 t_lock_cpu();
446 *p_exinf = p_runtsk->p_tinib->exinf;
447 ercd = E_OK;
448 t_unlock_cpu();
449
450 error_exit:
451 LOG_GET_INF_LEAVE(ercd, *p_exinf);
452 return(ercd);
453}
454
455#endif /* TOPPERS_get_inf */
Note: See TracBrowser for help on using the repository browser.