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

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

initial

File size: 7.6 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: sys_manage.c,v 1.8 2003/07/01 13:30:35 hiro Exp $
51 */
52
53/*
54 * システム状æ…
55‹ç®¡ç†æ©Ÿèƒ½
56 */
57
58#include "jsp_kernel.h"
59#include "check.h"
60#include "task.h"
61
62/*
63 * タスクの優å…
64ˆé †ä½ã®å›žè»¢
65 */
66#ifdef __rot_rdq
67
68SYSCALL ER
69rot_rdq(PRI tskpri)
70{
71 UINT pri;
72 ER ercd;
73
74 LOG_ROT_RDQ_ENTER(tskpri);
75 CHECK_TSKCTX_UNL();
76 CHECK_TPRI_SELF(tskpri);
77
78 t_lock_cpu();
79 pri = (tskpri == TPRI_SELF) ? runtsk->priority : INT_PRIORITY(tskpri);
80 if (rotate_ready_queue(pri)) {
81 dispatch();
82 }
83 ercd = E_OK;
84 t_unlock_cpu();
85
86 exit:
87 LOG_ROT_RDQ_LEAVE(ercd);
88 return(ercd);
89}
90
91#endif /* __rot_rdq */
92
93/*
94 * タスクの優å…
95ˆé †ä½ã®å›žè»¢ï¼ˆéžã‚¿ã‚¹ã‚¯ã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆç”¨ï¼‰
96 */
97#ifdef __irot_rdq
98
99SYSCALL ER
100irot_rdq(PRI tskpri)
101{
102 ER ercd;
103
104 LOG_IROT_RDQ_ENTER(tskpri);
105 CHECK_INTCTX_UNL();
106 CHECK_TPRI(tskpri);
107
108 i_lock_cpu();
109 if (rotate_ready_queue(INT_PRIORITY(tskpri))) {
110 reqflg = TRUE;
111 }
112 ercd = E_OK;
113 i_unlock_cpu();
114
115 exit:
116 LOG_IROT_RDQ_LEAVE(ercd);
117 return(ercd);
118}
119
120#endif /* __irot_rdq */
121
122/*
123 * 実行状æ…
124‹ã®ã‚¿ã‚¹ã‚¯IDの参ç…
125§
126 */
127#ifdef __get_tid
128
129SYSCALL ER
130get_tid(ID *p_tskid)
131{
132 ER ercd;
133
134 LOG_GET_TID_ENTER(p_tskid);
135 CHECK_TSKCTX_UNL();
136
137 t_lock_cpu();
138 *p_tskid = TSKID(runtsk);
139 ercd = E_OK;
140 t_unlock_cpu();
141
142 exit:
143 LOG_GET_TID_LEAVE(ercd, *p_tskid);
144 return(ercd);
145}
146
147#endif /* __get_tid */
148
149/*
150 * 実行状æ…
151‹ã®ã‚¿ã‚¹ã‚¯IDの参ç…
152§ï¼ˆéžã‚¿ã‚¹ã‚¯ã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆç”¨ï¼‰
153 */
154#ifdef __iget_tid
155
156SYSCALL ER
157iget_tid(ID *p_tskid)
158{
159 ER ercd;
160
161 LOG_IGET_TID_ENTER(p_tskid);
162 CHECK_INTCTX_UNL();
163
164 i_lock_cpu();
165 *p_tskid = (runtsk == NULL) ? TSK_NONE : TSKID(runtsk);
166 ercd = E_OK;
167 i_unlock_cpu();
168
169 exit:
170 LOG_IGET_TID_LEAVE(ercd, *p_tskid);
171 return(ercd);
172}
173
174#endif /* __iget_tid */
175
176/*
177 * CPUロック状æ…
178‹ã¸ã®ç§»è¡Œ
179 */
180#ifdef __loc_cpu
181
182SYSCALL ER
183loc_cpu(void)
184{
185 ER ercd;
186
187 LOG_LOC_CPU_ENTER();
188 CHECK_TSKCTX();
189
190 if (!(t_sense_lock())) {
191 t_lock_cpu();
192 }
193 ercd = E_OK;
194
195 exit:
196 LOG_LOC_CPU_LEAVE(ercd);
197 return(ercd);
198}
199
200#endif /* __loc_cpu */
201
202/*
203 * CPUロック状æ…
204‹ã¸ã®ç§»è¡Œï¼ˆéžã‚¿ã‚¹ã‚¯ã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆç”¨ï¼‰
205 */
206#ifdef __iloc_cpu
207
208SYSCALL ER
209iloc_cpu(void)
210{
211 ER ercd;
212
213 LOG_ILOC_CPU_ENTER();
214 CHECK_INTCTX();
215
216 if (!(i_sense_lock())) {
217 i_lock_cpu();
218 }
219 ercd = E_OK;
220
221 exit:
222 LOG_ILOC_CPU_LEAVE(ercd);
223 return(ercd);
224}
225
226#endif /* __iloc_cpu */
227
228/*
229 * CPUロック状æ…
230‹ã®è§£é™¤
231 *
232 * CPUロック中は,ディスパッチが必
233要となるサービスコールを呼び出すこ
234 * とはできないため,CPUロック状æ…
235‹ã®è§£é™¤æ™‚にディスパッチャを起動する
236 * 必
237要はない.
238 */
239#ifdef __unl_cpu
240
241SYSCALL ER
242unl_cpu(void)
243{
244 ER ercd;
245
246 LOG_UNL_CPU_ENTER();
247 CHECK_TSKCTX();
248
249 if (t_sense_lock()) {
250 t_unlock_cpu();
251 }
252 ercd = E_OK;
253
254 exit:
255 LOG_UNL_CPU_LEAVE(ercd);
256 return(ercd);
257}
258
259#endif /* __unl_cpu */
260
261/*
262 * CPUロック状æ…
263‹ã®è§£é™¤ï¼ˆéžã‚¿ã‚¹ã‚¯ã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆç”¨ï¼‰
264 *
265 * CPUロック中は,ディスパッチが必
266要となるサービスコールを呼び出すこ
267 * とはできないため,CPUロック状æ…
268‹ã®è§£é™¤æ™‚にディスパッチャの起動を要
269 * 求する必
270要はない.
271 */
272#ifdef __iunl_cpu
273
274SYSCALL ER
275iunl_cpu(void)
276{
277 ER ercd;
278
279 LOG_IUNL_CPU_ENTER();
280 CHECK_INTCTX();
281
282 if (i_sense_lock()) {
283 i_unlock_cpu();
284 }
285 ercd = E_OK;
286
287 exit:
288 LOG_IUNL_CPU_LEAVE(ercd);
289 return(ercd);
290}
291
292#endif /* __iunl_cpu */
293
294/*
295 * ディスパッチの禁止
296 */
297#ifdef __dis_dsp
298
299SYSCALL ER
300dis_dsp(void)
301{
302 ER ercd;
303
304 LOG_DIS_DSP_ENTER();
305 CHECK_TSKCTX_UNL();
306
307 t_lock_cpu();
308 enadsp = FALSE;
309 ercd = E_OK;
310 t_unlock_cpu();
311
312 exit:
313 LOG_DIS_DSP_LEAVE(ercd);
314 return(ercd);
315}
316
317#endif /* __dis_dsp */
318
319/*
320 * ディスパッチの許可
321 */
322#ifdef __ena_dsp
323
324SYSCALL ER
325ena_dsp(void)
326{
327 ER ercd;
328
329 LOG_ENA_DSP_ENTER();
330 CHECK_TSKCTX_UNL();
331
332 t_lock_cpu();
333 enadsp = TRUE;
334 if (runtsk != schedtsk) {
335 dispatch();
336 }
337 ercd = E_OK;
338 t_unlock_cpu();
339
340 exit:
341 LOG_ENA_DSP_LEAVE(ercd);
342 return(ercd);
343}
344
345#endif /* __ena_dsp */
346
347/*
348 * コンテキストの参ç…
349§
350 */
351#ifdef __sns_ctx
352
353SYSCALL BOOL
354sns_ctx(void)
355{
356 BOOL state;
357
358 LOG_SNS_CTX_ENTER();
359 state = sense_context() ? TRUE : FALSE;
360 LOG_SNS_CTX_LEAVE(state);
361 return(state);
362}
363
364#endif /* __sns_ctx */
365
366/*
367 * CPUロック状æ…
368‹ã®å‚ç…
369§
370 */
371#ifdef __sns_loc
372
373SYSCALL BOOL
374sns_loc(void)
375{
376 BOOL state;
377
378 LOG_SNS_LOC_ENTER();
379 state = sense_lock() ? TRUE : FALSE;
380 LOG_SNS_LOC_LEAVE(state);
381 return(state);
382}
383
384#endif /* __sns_loc */
385
386/*
387 * ディスパッチ禁止状æ…
388‹ã®å‚ç…
389§
390 */
391#ifdef __sns_dsp
392
393SYSCALL BOOL
394sns_dsp(void)
395{
396 BOOL state;
397
398 LOG_SNS_DSP_ENTER();
399 state = !(enadsp) ? TRUE : FALSE;
400 LOG_SNS_DSP_LEAVE(state);
401 return(state);
402}
403
404#endif /* __sns_dsp */
405
406/*
407 * ディスパッチ保留状æ…
408‹ã®å‚ç…
409§
410 */
411#ifdef __sns_dpn
412
413SYSCALL BOOL
414sns_dpn(void)
415{
416 BOOL state;
417
418 LOG_SNS_DPN_ENTER();
419 state = (sense_context() || sense_lock() || !(enadsp)) ? TRUE : FALSE;
420 LOG_SNS_DPN_LEAVE(state);
421 return(state);
422}
423
424#endif /* __sns_dpn */
425
426/*
427 * カーネル動作状æ…
428‹ã®å‚ç…
429§
430 */
431#ifdef __vsns_ini
432
433SYSCALL BOOL
434vsns_ini(void)
435{
436 BOOL state;
437
438 LOG_VSNS_INI_ENTER();
439 state = !(iniflg) ? TRUE : FALSE;
440 LOG_VSNS_INI_LEAVE(state);
441 return(state);
442}
443
444#endif /* __vsns_ini */
Note: See TracBrowser for help on using the repository browser.