OSDN Git Service

ddf8714d358542757adbf739465ed2947aeb3fe6
[trx-305dsp/dsp.git] / trx305 / kernel / kernel / sys_manage.c
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  *  上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation 
10  *  によって公表されている GNU General Public License の Version 2 に記
11  *  述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア
12  *  を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下,
13  *  利用と呼ぶ)することを無償で許諾する.
14  *  (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
15  *      権表示,この利用条件および下記の無保証規定が,そのままの形でソー
16  *      スコード中に含まれていること.
17  *  (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
18  *      用できる形で再配布する場合には,再配布に伴うドキュメント(利用
19  *      者マニュアルなど)に,上記の著作権表示,この利用条件および下記
20  *      の無保証規定を掲載すること.
21  *  (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
22  *      用できない形で再配布する場合には,次のいずれかの条件を満たすこ
23  *      と.
24  *    (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
25  *        作権表示,この利用条件および下記の無保証規定を掲載すること.
26  *    (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
27  *        報告すること.
28  *  (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
29  *      害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
30  * 
31  *  本ソフトウェアは,無保証で提供されているものである.上記著作権者お
32  *  よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も
33  *  含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直
34  *  接的または間接的に生じたいかなる損害に関しても,その責任を負わない.
35  * 
36  *  @(#) $Id: sys_manage.c,v 1.1 2009/01/31 05:27:37 suikan Exp $
37  */
38
39 /*
40  *  システム状態管理機能
41  */
42
43 #include "jsp_kernel.h"
44 #include "check.h"
45 #include "task.h"
46
47 /*
48  *  タスクの優先順位の回転
49  */
50 #ifdef __rot_rdq
51
52 SYSCALL ER
53 rot_rdq(PRI tskpri)
54 {
55     UINT    pri;
56     ER  ercd;
57
58     LOG_ROT_RDQ_ENTER(tskpri);
59     CHECK_TSKCTX_UNL();
60     CHECK_TPRI_SELF(tskpri);
61
62     t_lock_cpu();
63     pri = (tskpri == TPRI_SELF) ? runtsk->priority : INT_PRIORITY(tskpri);
64     if (rotate_ready_queue(pri)) {
65         dispatch();
66     }
67     ercd = E_OK;
68     t_unlock_cpu();
69
70     exit:
71     LOG_ROT_RDQ_LEAVE(ercd);
72     return(ercd);
73 }
74
75 #endif /* __rot_rdq */
76
77 /*
78  *  タスクの優先順位の回転(非タスクコンテキスト用)
79  */
80 #ifdef __irot_rdq
81
82 SYSCALL ER
83 irot_rdq(PRI tskpri)
84 {
85     ER  ercd;
86
87     LOG_IROT_RDQ_ENTER(tskpri);
88     CHECK_INTCTX_UNL();
89     CHECK_TPRI(tskpri);
90
91     i_lock_cpu();
92     if (rotate_ready_queue(INT_PRIORITY(tskpri))) {
93         reqflg = TRUE;
94     }
95     ercd = E_OK;
96     i_unlock_cpu();
97
98     exit:
99     LOG_IROT_RDQ_LEAVE(ercd);
100     return(ercd);
101 }
102
103 #endif /* __irot_rdq */
104
105 /*
106  *  実行状態のタスクIDの参照
107  */
108 #ifdef __get_tid
109
110 SYSCALL ER
111 get_tid(ID *p_tskid)
112 {
113     ER  ercd;
114
115     LOG_GET_TID_ENTER(p_tskid);
116     CHECK_TSKCTX_UNL();
117
118     t_lock_cpu();
119     *p_tskid = TSKID(runtsk);
120     ercd = E_OK;
121     t_unlock_cpu();
122
123     exit:
124     LOG_GET_TID_LEAVE(ercd, *p_tskid);
125     return(ercd);
126 }
127
128 #endif /* __get_tid */
129
130 /*
131  *  実行状態のタスクIDの参照(非タスクコンテキスト用)
132  */
133 #ifdef __iget_tid
134
135 SYSCALL ER
136 iget_tid(ID *p_tskid)
137 {
138     ER  ercd;
139
140     LOG_IGET_TID_ENTER(p_tskid);
141     CHECK_INTCTX_UNL();
142
143     i_lock_cpu();
144     *p_tskid = (runtsk == NULL) ? TSK_NONE : TSKID(runtsk);
145     ercd = E_OK;
146     i_unlock_cpu();
147
148     exit:
149     LOG_IGET_TID_LEAVE(ercd, *p_tskid);
150     return(ercd);
151 }
152
153 #endif /* __iget_tid */
154
155 /*
156  *  CPUロック状態への移行
157  */
158 #ifdef __loc_cpu
159
160 SYSCALL ER
161 loc_cpu(void)
162 {
163     ER  ercd;
164
165     LOG_LOC_CPU_ENTER();
166     CHECK_TSKCTX();
167
168     if (!(t_sense_lock())) {
169         t_lock_cpu();
170     }
171     ercd = E_OK;
172
173     exit:
174     LOG_LOC_CPU_LEAVE(ercd);
175     return(ercd);
176 }
177
178 #endif /* __loc_cpu */
179
180 /*
181  *  CPUロック状態への移行(非タスクコンテキスト用)
182  */
183 #ifdef __iloc_cpu
184
185 SYSCALL ER
186 iloc_cpu(void)
187 {
188     ER  ercd;
189
190     LOG_ILOC_CPU_ENTER();
191     CHECK_INTCTX();
192
193     if (!(i_sense_lock())) {
194         i_lock_cpu();
195     }
196     ercd = E_OK;
197
198     exit:
199     LOG_ILOC_CPU_LEAVE(ercd);
200     return(ercd);
201 }
202
203 #endif /* __iloc_cpu */
204
205 /*
206  *  CPUロック状態の解除
207  *
208  *  CPUロック中は,ディスパッチが必要となるサービスコールを呼び出すこ
209  *  とはできないため,CPUロック状態の解除時にディスパッチャを起動する
210  *  必要はない.
211  */
212 #ifdef __unl_cpu
213
214 SYSCALL ER
215 unl_cpu(void)
216 {
217     ER  ercd;
218
219     LOG_UNL_CPU_ENTER();
220     CHECK_TSKCTX();
221
222     if (t_sense_lock()) {
223         t_unlock_cpu();
224     }
225     ercd = E_OK;
226
227     exit:
228     LOG_UNL_CPU_LEAVE(ercd);
229     return(ercd);
230 }
231
232 #endif /* __unl_cpu */
233
234 /*
235  *  CPUロック状態の解除(非タスクコンテキスト用)
236  *
237  *  CPUロック中は,ディスパッチが必要となるサービスコールを呼び出すこ
238  *  とはできないため,CPUロック状態の解除時にディスパッチャの起動を要
239  *  求する必要はない.
240  */
241 #ifdef __iunl_cpu
242
243 SYSCALL ER
244 iunl_cpu(void)
245 {
246     ER  ercd;
247
248     LOG_IUNL_CPU_ENTER();
249     CHECK_INTCTX();
250
251     if (i_sense_lock()) {
252         i_unlock_cpu();
253     }
254     ercd = E_OK;
255
256     exit:
257     LOG_IUNL_CPU_LEAVE(ercd);
258     return(ercd);
259 }
260
261 #endif /* __iunl_cpu */
262
263 /*
264  *  ディスパッチの禁止
265  */
266 #ifdef __dis_dsp
267
268 SYSCALL ER
269 dis_dsp(void)
270 {
271     ER  ercd;
272
273     LOG_DIS_DSP_ENTER();
274     CHECK_TSKCTX_UNL();
275
276     t_lock_cpu();
277     enadsp = FALSE;
278     ercd = E_OK;
279     t_unlock_cpu();
280
281     exit:
282     LOG_DIS_DSP_LEAVE(ercd);
283     return(ercd);
284 }
285
286 #endif /* __dis_dsp */
287
288 /*
289  *  ディスパッチの許可
290  */
291 #ifdef __ena_dsp
292
293 SYSCALL ER
294 ena_dsp(void)
295 {
296     ER  ercd;
297
298     LOG_ENA_DSP_ENTER();
299     CHECK_TSKCTX_UNL();
300
301     t_lock_cpu();
302     enadsp = TRUE;
303     if (runtsk != schedtsk) {
304         dispatch();
305     }
306     ercd = E_OK;
307     t_unlock_cpu();
308
309     exit:
310     LOG_ENA_DSP_LEAVE(ercd);
311     return(ercd);
312 }
313
314 #endif /* __ena_dsp */
315
316 /*
317  *  コンテキストの参照
318  */
319 #ifdef __sns_ctx
320
321 SYSCALL BOOL
322 sns_ctx(void)
323 {
324     BOOL    state;
325
326     LOG_SNS_CTX_ENTER();
327     state = sense_context() ? TRUE : FALSE;
328     LOG_SNS_CTX_LEAVE(state);
329     return(state);
330 }
331
332 #endif /* __sns_ctx */
333
334 /*
335  *  CPUロック状態の参照
336  */
337 #ifdef __sns_loc
338
339 SYSCALL BOOL
340 sns_loc(void)
341 {
342     BOOL    state;
343
344     LOG_SNS_LOC_ENTER();
345     state = sense_lock() ? TRUE : FALSE;
346     LOG_SNS_LOC_LEAVE(state);
347     return(state);
348 }
349
350 #endif /* __sns_loc */
351
352 /*
353  *  ディスパッチ禁止状態の参照
354  */
355 #ifdef __sns_dsp
356
357 SYSCALL BOOL
358 sns_dsp(void)
359 {
360     BOOL    state;
361
362     LOG_SNS_DSP_ENTER();
363     state = !(enadsp) ? TRUE : FALSE;
364     LOG_SNS_DSP_LEAVE(state);
365     return(state);
366 }
367
368 #endif /* __sns_dsp */
369
370 /*
371  *  ディスパッチ保留状態の参照
372  */
373 #ifdef __sns_dpn
374
375 SYSCALL BOOL
376 sns_dpn(void)
377 {
378     BOOL    state;
379
380     LOG_SNS_DPN_ENTER();
381     state = (sense_context() || sense_lock() || !(enadsp)) ? TRUE : FALSE;
382     LOG_SNS_DPN_LEAVE(state);
383     return(state);
384 }
385
386 #endif /* __sns_dpn */
387
388 /*
389  *  カーネル動作状態の参照
390  */
391 #ifdef __vsns_ini
392
393 SYSCALL BOOL
394 vsns_ini(void)
395 {
396     BOOL    state;
397
398     LOG_VSNS_INI_ENTER();
399     state = !(iniflg) ? TRUE : FALSE;
400     LOG_VSNS_INI_LEAVE(state);
401     return(state);
402 }
403
404 #endif /* __vsns_ini */