source: rtos_arduino/trunk/asp_1.9.2/kernel/task_manage.c@ 136

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

ライブラリとOS及びベーシックなサンプルの追加.

File size: 9.4 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 * 上記著作権者
12は,以下の(1)~(4)の条件を満たす場合に限り,本ソフトウェ
13 * ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
14 * 変・再é…
15å¸ƒï¼ˆä»¥ä¸‹ï¼Œåˆ©ç”¨ã¨å‘¼ã¶ï¼‰ã™ã‚‹ã“とを無償で許諾する.
16 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
17 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
18 * スコード中に含まれていること.
19 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
20 * 用できる形で再é…
21å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œå†é…
22å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨
23 * 者
24マニュアルなど)に,上記の著作権表示,この利用条件および下記
25 * の無保証規定を掲載すること.
26 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
27 * 用できない形で再é…
28å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œæ¬¡ã®ã„ずれかの条件を満たすこ
29 * と.
30 * (a) 再é…
31å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨è€…
32マニュアルなど)に,上記の著
33 * 作権表示,この利用条件および下記の無保証規定を掲載すること.
34 * (b) 再é…
35å¸ƒã®å½¢æ…
36‹ã‚’,別に定める方法によって,TOPPERSプロジェクトに
37 * 報告すること.
38 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
39 * 害からも,上記著作権者
40およびTOPPERSプロジェクトをå…
41è²¬ã™ã‚‹ã“と.
42 * また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
43 * 由に基づく請求からも,上記著作権者
44およびTOPPERSプロジェクトを
45 * å…
46è²¬ã™ã‚‹ã“と.
47 *
48 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者
49お
50 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
51 * に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
52 * アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
53 * の責任を負わない.
54 *
55 * @(#) $Id: task_manage.c 2008 2010-12-31 12:41:42Z ertl-hiro $
56 */
57
58/*
59 * タスク管理機能
60 */
61
62#include "kernel_impl.h"
63#include "check.h"
64#include "task.h"
65#include "wait.h"
66
67/*
68 * トレースログマクロのデフォルト定義
69 */
70#ifndef LOG_ACT_TSK_ENTER
71#define LOG_ACT_TSK_ENTER(tskid)
72#endif /* LOG_ACT_TSK_ENTER */
73
74#ifndef LOG_ACT_TSK_LEAVE
75#define LOG_ACT_TSK_LEAVE(ercd)
76#endif /* LOG_ACT_TSK_LEAVE */
77
78#ifndef LOG_IACT_TSK_ENTER
79#define LOG_IACT_TSK_ENTER(tskid)
80#endif /* LOG_IACT_TSK_ENTER */
81
82#ifndef LOG_IACT_TSK_LEAVE
83#define LOG_IACT_TSK_LEAVE(ercd)
84#endif /* LOG_IACT_TSK_LEAVE */
85
86#ifndef LOG_CAN_ACT_ENTER
87#define LOG_CAN_ACT_ENTER(tskid)
88#endif /* LOG_CAN_ACT_ENTER */
89
90#ifndef LOG_CAN_ACT_LEAVE
91#define LOG_CAN_ACT_LEAVE(ercd)
92#endif /* LOG_CAN_ACT_LEAVE */
93
94#ifndef LOG_EXT_TSK_ENTER
95#define LOG_EXT_TSK_ENTER()
96#endif /* LOG_EXT_TSK_ENTER */
97
98#ifndef LOG_EXT_TSK_LEAVE
99#define LOG_EXT_TSK_LEAVE(ercd)
100#endif /* LOG_EXT_TSK_LEAVE */
101
102#ifndef LOG_TER_TSK_ENTER
103#define LOG_TER_TSK_ENTER(tskid)
104#endif /* LOG_TER_TSK_ENTER */
105
106#ifndef LOG_TER_TSK_LEAVE
107#define LOG_TER_TSK_LEAVE(ercd)
108#endif /* LOG_TER_TSK_LEAVE */
109
110#ifndef LOG_CHG_PRI_ENTER
111#define LOG_CHG_PRI_ENTER(tskid, tskpri)
112#endif /* LOG_CHG_PRI_ENTER */
113
114#ifndef LOG_CHG_PRI_LEAVE
115#define LOG_CHG_PRI_LEAVE(ercd)
116#endif /* LOG_CHG_PRI_LEAVE */
117
118#ifndef LOG_GET_PRI_ENTER
119#define LOG_GET_PRI_ENTER(tskid, p_tskpri)
120#endif /* LOG_GET_PRI_ENTER */
121
122#ifndef LOG_GET_PRI_LEAVE
123#define LOG_GET_PRI_LEAVE(ercd, tskpri)
124#endif /* LOG_GET_PRI_LEAVE */
125
126#ifndef LOG_GET_INF_ENTER
127#define LOG_GET_INF_ENTER(p_exinf)
128#endif /* LOG_GET_INF_ENTER */
129
130#ifndef LOG_GET_INF_LEAVE
131#define LOG_GET_INF_LEAVE(ercd, exinf)
132#endif /* LOG_GET_INF_LEAVE */
133
134/*
135 * タスクの起動
136 */
137#ifdef TOPPERS_act_tsk
138
139ER
140act_tsk(ID tskid)
141{
142 TCB *p_tcb;
143 ER ercd;
144
145 LOG_ACT_TSK_ENTER(tskid);
146 CHECK_TSKCTX_UNL();
147 CHECK_TSKID_SELF(tskid);
148 p_tcb = get_tcb_self(tskid);
149
150 t_lock_cpu();
151 if (TSTAT_DORMANT(p_tcb->tstat)) {
152 if (make_active(p_tcb)) {
153 dispatch();
154 }
155 ercd = E_OK;
156 }
157 else if (!(p_tcb->actque)) {
158 p_tcb->actque = true;
159 ercd = E_OK;
160 }
161 else {
162 ercd = E_QOVR;
163 }
164 t_unlock_cpu();
165
166 error_exit:
167 LOG_ACT_TSK_LEAVE(ercd);
168 return(ercd);
169}
170
171#endif /* TOPPERS_act_tsk */
172
173/*
174 * タスクの起動(非タスクコンテキスト用)
175 */
176#ifdef TOPPERS_iact_tsk
177
178ER
179iact_tsk(ID tskid)
180{
181 TCB *p_tcb;
182 ER ercd;
183
184 LOG_IACT_TSK_ENTER(tskid);
185 CHECK_INTCTX_UNL();
186 CHECK_TSKID(tskid);
187 p_tcb = get_tcb(tskid);
188
189 i_lock_cpu();
190 if (TSTAT_DORMANT(p_tcb->tstat)) {
191 if (make_active(p_tcb)) {
192 reqflg = true;
193 }
194 ercd = E_OK;
195 }
196 else if (!(p_tcb->actque)) {
197 p_tcb->actque = true;
198 ercd = E_OK;
199 }
200 else {
201 ercd = E_QOVR;
202 }
203 i_unlock_cpu();
204
205 error_exit:
206 LOG_IACT_TSK_LEAVE(ercd);
207 return(ercd);
208}
209
210#endif /* TOPPERS_iact_tsk */
211
212/*
213 * タスク起動要求のキャンセル
214 */
215#ifdef TOPPERS_can_act
216
217ER_UINT
218can_act(ID tskid)
219{
220 TCB *p_tcb;
221 ER_UINT ercd;
222
223 LOG_CAN_ACT_ENTER(tskid);
224 CHECK_TSKCTX_UNL();
225 CHECK_TSKID_SELF(tskid);
226 p_tcb = get_tcb_self(tskid);
227
228 t_lock_cpu();
229 ercd = p_tcb->actque ? 1 : 0;
230 p_tcb->actque = false;
231 t_unlock_cpu();
232
233 error_exit:
234 LOG_CAN_ACT_LEAVE(ercd);
235 return(ercd);
236}
237
238#endif /* TOPPERS_can_act */
239
240/*
241 * 自タスクの終了
242 */
243#ifdef TOPPERS_ext_tsk
244
245ER
246ext_tsk(void)
247{
248 ER ercd;
249
250 LOG_EXT_TSK_ENTER();
251 CHECK_TSKCTX();
252
253 if (t_sense_lock()) {
254 /*
255 * CPUロック状æ…
256‹ã§ext_tskが呼ばれた場合は,CPUロックを解除し
257 * てからタスクを終了する.実装
258上は,サービスコール内
259でのCPU
260 * ロックを省略すればよいだけ.
261 */
262 }
263 else {
264 t_lock_cpu();
265 }
266 if (disdsp) {
267 /*
268 * ディスパッチ禁止状æ…
269‹ã§ext_tskが呼ばれた場合は,ディスパッ
270 * チ許可状æ…
271‹ã«ã—てからタスクを終了する.
272 */
273 disdsp = false;
274 }
275 if (!ipmflg) {
276 /*
277 * 割込み優å…
278ˆåº¦ãƒžã‚¹ã‚¯ï¼ˆIPM)がTIPM_ENAALL以外の状æ…
279‹ã§ext_tsk
280 * が呼ばれた場合は,IPMをTIPM_ENAALLにしてからタスクを終了す
281 * る.
282 */
283 t_set_ipm(TIPM_ENAALL);
284 ipmflg = true;
285 }
286 dspflg = true;
287
288 (void) make_non_runnable(p_runtsk);
289 make_dormant(p_runtsk);
290 if (p_runtsk->actque) {
291 p_runtsk->actque = false;
292 (void) make_active(p_runtsk);
293 }
294 exit_and_dispatch();
295 ercd = E_SYS;
296
297 error_exit:
298 LOG_EXT_TSK_LEAVE(ercd);
299 return(ercd);
300}
301
302#endif /* TOPPERS_ext_tsk */
303
304/*
305 * タスクの強制終了
306 */
307#ifdef TOPPERS_ter_tsk
308
309ER
310ter_tsk(ID tskid)
311{
312 TCB *p_tcb;
313 ER ercd;
314
315 LOG_TER_TSK_ENTER(tskid);
316 CHECK_TSKCTX_UNL();
317 CHECK_TSKID(tskid);
318 p_tcb = get_tcb(tskid);
319 CHECK_NONSELF(p_tcb);
320
321 t_lock_cpu();
322 if (TSTAT_DORMANT(p_tcb->tstat)) {
323 ercd = E_OBJ;
324 }
325 else {
326 if (TSTAT_RUNNABLE(p_tcb->tstat)) {
327 /*
328 * p_tcbは自タスクでないため,(シングルプロセッサでは)実
329 * 行状æ…
330‹ã§ãªãï¼Œmake_non_runnable(p_tcb)でタスクディスパッ
331 * チが必
332要になることはない.
333 */
334 (void) make_non_runnable(p_tcb);
335 }
336 else if (TSTAT_WAITING(p_tcb->tstat)) {
337 wait_dequeue_wobj(p_tcb);
338 wait_dequeue_tmevtb(p_tcb);
339 }
340 make_dormant(p_tcb);
341 if (p_tcb->actque) {
342 p_tcb->actque = false;
343 if (make_active(p_tcb)) {
344 dispatch();
345 }
346 }
347 ercd = E_OK;
348 }
349 t_unlock_cpu();
350
351 error_exit:
352 LOG_TER_TSK_LEAVE(ercd);
353 return(ercd);
354}
355
356#endif /* TOPPERS_ter_tsk */
357
358/*
359 * タスクのベース優å…
360ˆåº¦ã®å¤‰æ›´
361 */
362#ifdef TOPPERS_chg_pri
363
364ER
365chg_pri(ID tskid, PRI tskpri)
366{
367 TCB *p_tcb;
368 uint_t newpri;
369 ER ercd;
370
371 LOG_CHG_PRI_ENTER(tskid, tskpri);
372 CHECK_TSKCTX_UNL();
373 CHECK_TSKID_SELF(tskid);
374 CHECK_TPRI_INI(tskpri);
375 p_tcb = get_tcb_self(tskid);
376 newpri = (tskpri == TPRI_INI) ? p_tcb->p_tinib->ipriority
377 : INT_PRIORITY(tskpri);
378
379 t_lock_cpu();
380 if (TSTAT_DORMANT(p_tcb->tstat)) {
381 ercd = E_OBJ;
382 }
383 else {
384 if (change_priority(p_tcb, newpri)) {
385 dispatch();
386 }
387 ercd = E_OK;
388 }
389 t_unlock_cpu();
390
391 error_exit:
392 LOG_CHG_PRI_LEAVE(ercd);
393 return(ercd);
394}
395
396#endif /* TOPPERS_chg_pri */
397
398/*
399 * タスク優å…
400ˆåº¦ã®å‚ç…
401§
402 */
403#ifdef TOPPERS_get_pri
404
405ER
406get_pri(ID tskid, PRI *p_tskpri)
407{
408 TCB *p_tcb;
409 ER ercd;
410
411 LOG_GET_PRI_ENTER(tskid, p_tskpri);
412 CHECK_TSKCTX_UNL();
413 CHECK_TSKID_SELF(tskid);
414 p_tcb = get_tcb_self(tskid);
415
416 t_lock_cpu();
417 if (TSTAT_DORMANT(p_tcb->tstat)) {
418 ercd = E_OBJ;
419 }
420 else {
421 *p_tskpri = EXT_TSKPRI(p_tcb->priority);
422 ercd = E_OK;
423 }
424 t_unlock_cpu();
425
426 error_exit:
427 LOG_GET_PRI_LEAVE(ercd, *p_tskpri);
428 return(ercd);
429}
430
431#endif /* TOPPERS_get_pri */
432
433/*
434 * 自タスクの拡張情
435報の参ç…
436§
437 */
438#ifdef TOPPERS_get_inf
439
440ER
441get_inf(intptr_t *p_exinf)
442{
443 ER ercd;
444
445 LOG_GET_INF_ENTER(p_exinf);
446 CHECK_TSKCTX_UNL();
447
448 t_lock_cpu();
449 *p_exinf = p_runtsk->p_tinib->exinf;
450 ercd = E_OK;
451 t_unlock_cpu();
452
453 error_exit:
454 LOG_GET_INF_LEAVE(ercd, *p_exinf);
455 return(ercd);
456}
457
458#endif /* TOPPERS_get_inf */
Note: See TracBrowser for help on using the repository browser.