source: anotherchoice/tags/jsp-1.4.4-full-UTF8/kernel/task_sync.c@ 26

Last change on this file since 26 was 26, checked in by ykominami, 12 years ago

initial

File size: 9.1 KB
Line 
1/*
2 * TOPPERS/JSP Kernel
3 * Toyohashi Open Platform for Embedded Real-Time Systems/
4 * Just Standard Profile Kernel
5 *
6 * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
7 * Toyohashi Univ. of Technology, JAPAN
8 *
9 * 上記著作権者
10は,以下の (1)〜(4) の条件か,Free Software Foundation
11 * によってå…
12¬è¡¨ã•ã‚Œã¦ã„ã‚‹ GNU General Public License の Version 2 に記
13 * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア
14 * を改変したものを含む.以下同じ)を使用・複製・改変・再é…
15å¸ƒï¼ˆä»¥ä¸‹ï¼Œ
16 * 利用と呼ぶ)することを無償で許諾する.
17 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
18 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
19 * スコード中に含まれていること.
20 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
21 * 用できる形で再é…
22å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œå†é…
23å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨
24 * 者
25マニュアルなど)に,上記の著作権表示,この利用条件および下記
26 * の無保証規定を掲載すること.
27 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
28 * 用できない形で再é…
29å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œæ¬¡ã®ã„ずれかの条件を満たすこ
30 * と.
31 * (a) 再é…
32å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨è€…
33マニュアルなど)に,上記の著
34 * 作権表示,この利用条件および下記の無保証規定を掲載すること.
35 * (b) 再é…
36å¸ƒã®å½¢æ…
37‹ã‚’,別に定める方法によって,TOPPERSプロジェクトに
38 * 報告すること.
39 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
40 * 害からも,上記著作権者
41およびTOPPERSプロジェクトをå…
42è²¬ã™ã‚‹ã“と.
43 *
44 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者
45お
46 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も
47 * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直
48 * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない.
49 *
50 * @(#) $Id: task_sync.c,v 1.7 2003/12/20 08:12:24 hiro Exp $
51 */
52
53/*
54 * タスク付属同期機能
55 */
56
57#include "jsp_kernel.h"
58#include "check.h"
59#include "task.h"
60#include "wait.h"
61
62/*
63 * 起床待
64ち
65 */
66#ifdef __slp_tsk
67
68SYSCALL ER
69slp_tsk()
70{
71 WINFO winfo;
72 ER ercd;
73
74 LOG_SLP_TSK_ENTER();
75 CHECK_DISPATCH();
76
77 t_lock_cpu();
78 if (runtsk->wupcnt) {
79 runtsk->wupcnt = FALSE;
80 ercd = E_OK;
81 }
82 else {
83 runtsk->tstat = (TS_WAITING | TS_WAIT_SLEEP);
84 make_wait(&winfo);
85 LOG_TSKSTAT(runtsk);
86 dispatch();
87 ercd = winfo.wercd;
88 }
89 t_unlock_cpu();
90
91 exit:
92 LOG_SLP_TSK_LEAVE(ercd);
93 return(ercd);
94}
95
96#endif /* __slp_tsk */
97
98/*
99 * 起床待
100ち(タイムアウトあり)
101 */
102#ifdef __tslp_tsk
103
104SYSCALL ER
105tslp_tsk(TMO tmout)
106{
107 WINFO winfo;
108 TMEVTB tmevtb;
109 ER ercd;
110
111 LOG_TSLP_TSK_ENTER(tmout);
112 CHECK_DISPATCH();
113 CHECK_TMOUT(tmout);
114
115 t_lock_cpu();
116 if (runtsk->wupcnt) {
117 runtsk->wupcnt = FALSE;
118 ercd = E_OK;
119 }
120 else if (tmout == TMO_POL) {
121 ercd = E_TMOUT;
122 }
123 else {
124 runtsk->tstat = (TS_WAITING | TS_WAIT_SLEEP);
125 make_wait_tmout(&winfo, &tmevtb, tmout);
126 LOG_TSKSTAT(runtsk);
127 dispatch();
128 ercd = winfo.wercd;
129 }
130 t_unlock_cpu();
131
132 exit:
133 LOG_TSLP_TSK_LEAVE(ercd);
134 return(ercd);
135}
136
137#endif /* __tslp_tsk */
138
139/*
140 * タスクの起床
141 */
142#ifdef __wup_tsk
143
144SYSCALL ER
145wup_tsk(ID tskid)
146{
147 TCB *tcb;
148 UINT tstat;
149 ER ercd;
150
151 LOG_WUP_TSK_ENTER(tskid);
152 CHECK_TSKCTX_UNL();
153 CHECK_TSKID_SELF(tskid);
154 tcb = get_tcb_self(tskid);
155
156 t_lock_cpu();
157 if (TSTAT_DORMANT(tstat = tcb->tstat)) {
158 ercd = E_OBJ;
159 }
160 else if ((tstat & TS_WAIT_SLEEP) != 0) {
161 if (wait_complete(tcb)) {
162 dispatch();
163 }
164 ercd = E_OK;
165 }
166 else if (!(tcb->wupcnt)) {
167 tcb->wupcnt = TRUE;
168 ercd = E_OK;
169 }
170 else {
171 ercd = E_QOVR;
172 }
173 t_unlock_cpu();
174
175 exit:
176 LOG_WUP_TSK_LEAVE(ercd);
177 return(ercd);
178}
179
180#endif /* __wup_tsk */
181
182/*
183 * タスクの起床(非タスクコンテキスト用)
184 */
185#ifdef __iwup_tsk
186
187SYSCALL ER
188iwup_tsk(ID tskid)
189{
190 TCB *tcb;
191 UINT tstat;
192 ER ercd;
193
194 LOG_IWUP_TSK_ENTER(tskid);
195 CHECK_INTCTX_UNL();
196 CHECK_TSKID(tskid);
197 tcb = get_tcb(tskid);
198
199 i_lock_cpu();
200 if (TSTAT_DORMANT(tstat = tcb->tstat)) {
201 ercd = E_OBJ;
202 }
203 else if ((tstat & TS_WAIT_SLEEP) != 0) {
204 if (wait_complete(tcb)) {
205 reqflg = TRUE;
206 }
207 ercd = E_OK;
208 }
209 else if (!(tcb->wupcnt)) {
210 tcb->wupcnt = TRUE;
211 ercd = E_OK;
212 }
213 else {
214 ercd = E_QOVR;
215 }
216 i_unlock_cpu();
217
218 exit:
219 LOG_IWUP_TSK_LEAVE(ercd);
220 return(ercd);
221}
222
223#endif /* __iwup_tsk */
224
225/*
226 * タスク起床要求のキャンセル
227 */
228#ifdef __can_wup
229
230SYSCALL ER_UINT
231can_wup(ID tskid)
232{
233 TCB *tcb;
234 ER_UINT ercd;
235
236 LOG_CAN_WUP_ENTER(tskid);
237 CHECK_TSKCTX_UNL();
238 CHECK_TSKID_SELF(tskid);
239 tcb = get_tcb_self(tskid);
240
241 t_lock_cpu();
242 if (TSTAT_DORMANT(tcb->tstat)) {
243 ercd = E_OBJ;
244 }
245 else {
246 ercd = tcb->wupcnt ? 1 : 0;
247 tcb->wupcnt = FALSE;
248 }
249 t_unlock_cpu();
250
251 exit:
252 LOG_CAN_WUP_LEAVE(ercd);
253 return(ercd);
254}
255
256#endif /* __can_wup */
257
258/*
259 * 待
260ち状æ…
261‹ã®å¼·åˆ¶è§£é™¤
262 */
263#ifdef __rel_wai
264
265SYSCALL ER
266rel_wai(ID tskid)
267{
268 TCB *tcb;
269 ER ercd;
270
271 LOG_REL_WAI_ENTER(tskid);
272 CHECK_TSKCTX_UNL();
273 CHECK_TSKID(tskid);
274 tcb = get_tcb(tskid);
275
276 t_lock_cpu();
277 if (!(TSTAT_WAITING(tcb->tstat))) {
278 ercd = E_OBJ;
279 }
280 else {
281 if (wait_release(tcb)) {
282 dispatch();
283 }
284 ercd = E_OK;
285 }
286 t_unlock_cpu();
287
288 exit:
289 LOG_REL_WAI_LEAVE(ercd);
290 return(ercd);
291}
292
293#endif /* __rel_wai */
294
295/*
296 * 待
297ち状æ…
298‹ã®å¼·åˆ¶è§£é™¤ï¼ˆéžã‚¿ã‚¹ã‚¯ã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆç”¨ï¼‰
299 */
300#ifdef __irel_wai
301
302SYSCALL ER
303irel_wai(ID tskid)
304{
305 TCB *tcb;
306 ER ercd;
307
308 LOG_IREL_WAI_ENTER(tskid);
309 CHECK_INTCTX_UNL();
310 CHECK_TSKID(tskid);
311 tcb = get_tcb(tskid);
312
313 i_lock_cpu();
314 if (!(TSTAT_WAITING(tcb->tstat))) {
315 ercd = E_OBJ;
316 }
317 else {
318 if (wait_release(tcb)) {
319 reqflg = TRUE;
320 }
321 ercd = E_OK;
322 }
323 i_unlock_cpu();
324
325 exit:
326 LOG_IREL_WAI_LEAVE(ercd);
327 return(ercd);
328}
329
330#endif /* __irel_wai */
331
332/*
333 * 強制待
334ち状æ…
335‹ã¸ã®ç§»è¡Œ
336 */
337#ifdef __sus_tsk
338
339SYSCALL ER
340sus_tsk(ID tskid)
341{
342 TCB *tcb;
343 UINT tstat;
344 ER ercd;
345
346 LOG_SUS_TSK_ENTER(tskid);
347 CHECK_TSKCTX_UNL();
348 CHECK_TSKID_SELF(tskid);
349 tcb = get_tcb_self(tskid);
350
351 t_lock_cpu();
352 if (tcb == runtsk && !(enadsp)) {
353 ercd = E_CTX;
354 }
355 else if (TSTAT_DORMANT(tstat = tcb->tstat)) {
356 ercd = E_OBJ;
357 }
358 else if (TSTAT_RUNNABLE(tstat)) {
359 /*
360 * 実行できる状æ…
361‹ã‹ã‚‰å¼·åˆ¶å¾…
362ち状æ…
363‹ã¸ã®é·ç§»
364 */
365 tcb->tstat = TS_SUSPENDED;
366 LOG_TSKSTAT(tcb);
367 if (make_non_runnable(tcb)) {
368 dispatch();
369 }
370 ercd = E_OK;
371 }
372 else if (TSTAT_SUSPENDED(tstat)) {
373 ercd = E_QOVR;
374 }
375 else {
376 /*
377 * 待
378ち状æ…
379‹ã‹ã‚‰äºŒé‡å¾…
380ち状æ…
381‹ã¸ã®é·ç§»
382 */
383 tcb->tstat |= TS_SUSPENDED;
384 LOG_TSKSTAT(tcb);
385 ercd = E_OK;
386 }
387 t_unlock_cpu();
388
389 exit:
390 LOG_SUS_TSK_LEAVE(ercd);
391 return(ercd);
392}
393
394#endif /* __sus_tsk */
395
396/*
397 * 強制待
398ち状æ…
399‹ã‹ã‚‰ã®å†é–‹
400 */
401#ifdef __rsm_tsk
402
403SYSCALL ER
404rsm_tsk(ID tskid)
405{
406 TCB *tcb;
407 UINT tstat;
408 ER ercd;
409
410 LOG_RSM_TSK_ENTER(tskid);
411 CHECK_TSKCTX_UNL();
412 CHECK_TSKID(tskid);
413 tcb = get_tcb(tskid);
414
415 t_lock_cpu();
416 if (!(TSTAT_SUSPENDED(tstat = tcb->tstat))) {
417 ercd = E_OBJ;
418 }
419 else if (!(TSTAT_WAITING(tstat))) {
420 /*
421 * 強制待
422ち状æ…
423‹ã‹ã‚‰å®Ÿè¡Œã§ãã‚‹çŠ¶æ…
424‹ã¸ã®é·ç§»
425 */
426 if (make_runnable(tcb)) {
427 dispatch();
428 }
429 ercd = E_OK;
430 }
431 else {
432 /*
433 * 二重待
434ち状æ…
435‹ã‹ã‚‰å¾…
436ち状æ…
437‹ã¸ã®é·ç§»
438 */
439 tcb->tstat &= ~TS_SUSPENDED;
440 LOG_TSKSTAT(tcb);
441 ercd = E_OK;
442 }
443 t_unlock_cpu();
444
445 exit:
446 LOG_RSM_TSK_LEAVE(ercd);
447 return(ercd);
448}
449
450#endif /* __rsm_tsk */
451
452/*
453 * 強制待
454ち状æ…
455‹ã‹ã‚‰ã®å¼·åˆ¶å†é–‹
456 *
457 * JSPカーネルでは,frsm_tsk と rsm_tsk は同一の処理となる.frsm_tsk
458 * が呼ばれると,frsm_tsk と rsm_tsk の両方のサービスコールのトレース
459 * ログが出力される.ログ取得後に rsm_tsk のトレースログを削除するこ
460 * とが必
461要である.rsm_tsk のトレースログを正しく削除するためには,タ
462 * スクディスパッチのログと,タスク例外処理のログも取得することが必
463要
464 * となるので,注意が必
465要である.
466 */
467#ifdef __frsm_tsk
468
469SYSCALL ER
470frsm_tsk(ID tskid)
471{
472 ER ercd;
473
474 LOG_FRSM_TSK_ENTER(tskid);
475 ercd = rsm_tsk(tskid);
476 LOG_FRSM_TSK_LEAVE(ercd);
477 return(ercd);
478}
479
480#endif /* __frsm_tsk */
481
482/*
483 * 自タスクの遅
484延
485 */
486#ifdef __dly_tsk
487
488SYSCALL ER
489dly_tsk(RELTIM dlytim)
490{
491 WINFO winfo;
492 TMEVTB tmevtb;
493 ER ercd;
494
495 LOG_DLY_TSK_ENTER(dlytim);
496 CHECK_DISPATCH();
497 CHECK_PAR(dlytim <= TMAX_RELTIM);
498
499 t_lock_cpu();
500 runtsk->tstat = TS_WAITING;
501 make_non_runnable(runtsk);
502 runtsk->winfo = &winfo;
503 winfo.tmevtb = &tmevtb;
504 tmevtb_enqueue(&tmevtb, dlytim, (CBACK) wait_tmout_ok, (VP) runtsk);
505 LOG_TSKSTAT(runtsk);
506 dispatch();
507 ercd = winfo.wercd;
508 t_unlock_cpu();
509
510 exit:
511 LOG_DLY_TSK_LEAVE(ercd);
512 return(ercd);
513}
514
515#endif /* __dly_tsk */
Note: See TracBrowser for help on using the repository browser.