source: uKadecot/trunk/ssp/kernel/sys_manage.c@ 108

Last change on this file since 108 was 108, checked in by coas-nagasima, 9 years ago

MIMEプロパティの変更

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id
  • Property svn:mime-type set to text/x-chdr; charset=SHIFT_JIS
File size: 7.3 KB
Line 
1/*
2 * TOPPERS/SSP Kernel
3 * Smallest Set Profile Kernel
4 *
5 * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
6 * Toyohashi Univ. of Technology, JAPAN
7 * Copyright (C) 2005-2008 by Embedded and Real-Time Systems Laboratory
8 * Graduate School of Information Science, Nagoya Univ., JAPAN
9 * Copyright (C) 2010 by Meika Sugimoto
10 *
11 * 上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
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 * 由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを
32 * 免責すること.
33 *
34 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お
35 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
36 * に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
37 * アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
38 * の責任を負わない.
39 *
40 */
41
42/*
43 * システム状態管理機能
44 */
45
46#include "kernel_impl.h"
47#include "check.h"
48#include "task.h"
49
50/*
51 * トレースログマクロのデフォルト定義
52 */
53
54#ifndef LOG_LOC_CPU_ENTER
55#define LOG_LOC_CPU_ENTER()
56#endif /* LOG_LOC_CPU_ENTER */
57
58#ifndef LOG_LOC_CPU_LEAVE
59#define LOG_LOC_CPU_LEAVE(ercd)
60#endif /* LOG_LOC_CPU_LEAVE */
61
62#ifndef LOG_ILOC_CPU_ENTER
63#define LOG_ILOC_CPU_ENTER()
64#endif /* LOG_ILOC_CPU_ENTER */
65
66#ifndef LOG_ILOC_CPU_LEAVE
67#define LOG_ILOC_CPU_LEAVE(ercd)
68#endif /* LOG_ILOC_CPU_LEAVE */
69
70#ifndef LOG_UNL_CPU_ENTER
71#define LOG_UNL_CPU_ENTER()
72#endif /* LOG_UNL_CPU_ENTER */
73
74#ifndef LOG_UNL_CPU_LEAVE
75#define LOG_UNL_CPU_LEAVE(ercd)
76#endif /* LOG_UNL_CPU_LEAVE */
77
78#ifndef LOG_IUNL_CPU_ENTER
79#define LOG_IUNL_CPU_ENTER()
80#endif /* LOG_IUNL_CPU_ENTER */
81
82#ifndef LOG_IUNL_CPU_LEAVE
83#define LOG_IUNL_CPU_LEAVE(ercd)
84#endif /* LOG_IUNL_CPU_LEAVE */
85
86#ifndef LOG_DIS_DSP_ENTER
87#define LOG_DIS_DSP_ENTER()
88#endif /* LOG_DIS_DSP_ENTER */
89
90#ifndef LOG_DIS_DSP_LEAVE
91#define LOG_DIS_DSP_LEAVE(ercd)
92#endif /* LOG_DIS_DSP_LEAVE */
93
94#ifndef LOG_ENA_DSP_ENTER
95#define LOG_ENA_DSP_ENTER()
96#endif /* LOG_ENA_DSP_ENTER */
97
98#ifndef LOG_ENA_DSP_LEAVE
99#define LOG_ENA_DSP_LEAVE(ercd)
100#endif /* LOG_ENA_DSP_LEAVE */
101
102#ifndef LOG_SNS_CTX_ENTER
103#define LOG_SNS_CTX_ENTER()
104#endif /* LOG_SNS_CTX_ENTER */
105
106#ifndef LOG_SNS_CTX_LEAVE
107#define LOG_SNS_CTX_LEAVE(state)
108#endif /* LOG_SNS_CTX_LEAVE */
109
110#ifndef LOG_SNS_LOC_ENTER
111#define LOG_SNS_LOC_ENTER()
112#endif /* LOG_SNS_LOC_ENTER */
113
114#ifndef LOG_SNS_LOC_LEAVE
115#define LOG_SNS_LOC_LEAVE(state)
116#endif /* LOG_SNS_LOC_LEAVE */
117
118#ifndef LOG_SNS_DSP_ENTER
119#define LOG_SNS_DSP_ENTER()
120#endif /* LOG_SNS_DSP_ENTER */
121
122#ifndef LOG_SNS_DSP_LEAVE
123#define LOG_SNS_DSP_LEAVE(state)
124#endif /* LOG_SNS_DSP_LEAVE */
125
126#ifndef LOG_SNS_DPN_ENTER
127#define LOG_SNS_DPN_ENTER()
128#endif /* LOG_SNS_DPN_ENTER */
129
130#ifndef LOG_SNS_DPN_LEAVE
131#define LOG_SNS_DPN_LEAVE(state)
132#endif /* LOG_SNS_DPN_LEAVE */
133
134#ifndef LOG_SNS_KER_ENTER
135#define LOG_SNS_KER_ENTER()
136#endif /* LOG_SNS_KER_ENTER */
137
138#ifndef LOG_SNS_KER_LEAVE
139#define LOG_SNS_KER_LEAVE(state)
140#endif /* LOG_SNS_KER_LEAVE */
141
142/*
143 * CPUロック状態への移行
144 */
145#ifdef TOPPERS_loc_cpu
146
147ER
148loc_cpu(void)
149{
150 ER ercd;
151
152 LOG_LOC_CPU_ENTER();
153 CHECK_TSKCTX();
154
155 if (!t_sense_lock()) {
156 t_lock_cpu();
157 }
158 ercd = E_OK;
159
160 error_exit:
161 LOG_LOC_CPU_LEAVE(ercd);
162 return(ercd);
163}
164
165#endif /* TOPPERS_loc_cpu */
166
167/*
168 * CPUロック状態への移行(非タスクコンテキスト用)
169 */
170#ifdef TOPPERS_iloc_cpu
171
172ER
173iloc_cpu(void)
174{
175 ER ercd;
176
177 LOG_ILOC_CPU_ENTER();
178 CHECK_INTCTX();
179
180 if (!i_sense_lock()) {
181 i_lock_cpu();
182 }
183 ercd = E_OK;
184
185 error_exit:
186 LOG_ILOC_CPU_LEAVE(ercd);
187 return(ercd);
188}
189
190#endif /* TOPPERS_iloc_cpu */
191
192/*
193 * CPUロック状態の解除
194 *
195 * CPUロック中は,ディスパッチが必要となるサービスコールを呼び出すこ
196 * とはできないため,CPUロック状態の解除時にディスパッチャを起動する
197 * 必要はない.
198 */
199#ifdef TOPPERS_unl_cpu
200
201ER
202unl_cpu(void)
203{
204 ER ercd;
205
206 LOG_UNL_CPU_ENTER();
207 CHECK_TSKCTX();
208
209 if (t_sense_lock()) {
210 t_unlock_cpu();
211 }
212 ercd = E_OK;
213
214 error_exit:
215 LOG_UNL_CPU_LEAVE(ercd);
216 return(ercd);
217}
218
219#endif /* TOPPERS_unl_cpu */
220
221/*
222 * CPUロック状態の解除(非タスクコンテキスト用)
223 *
224 * CPUロック中は,ディスパッチが必要となるサービスコールを呼び出すこ
225 * とはできないため,CPUロック状態の解除時にディスパッチャの起動を要
226 * 求する必要はない.
227 */
228#ifdef TOPPERS_iunl_cpu
229
230ER
231iunl_cpu(void)
232{
233 ER ercd;
234
235 LOG_IUNL_CPU_ENTER();
236 CHECK_INTCTX();
237
238 if (i_sense_lock()) {
239 i_unlock_cpu();
240 }
241 ercd = E_OK;
242
243 error_exit:
244 LOG_IUNL_CPU_LEAVE(ercd);
245 return(ercd);
246}
247
248#endif /* TOPPERS_iunl_cpu */
249
250/*
251 * ディスパッチの禁止
252 */
253#ifdef TOPPERS_dis_dsp
254
255ER
256dis_dsp(void)
257{
258 ER ercd;
259
260 LOG_DIS_DSP_ENTER();
261 CHECK_TSKCTX_UNL();
262
263 t_lock_cpu();
264 disdsp = true;
265 ercd = E_OK;
266 t_unlock_cpu();
267
268 error_exit:
269 LOG_DIS_DSP_LEAVE(ercd);
270 return(ercd);
271}
272
273#endif /* TOPPERS_dis_dsp */
274
275/*
276 * ディスパッチの許可
277 */
278#ifdef TOPPERS_ena_dsp
279
280ER
281ena_dsp(void)
282{
283 ER ercd;
284 uint_t tskipri;
285
286 LOG_ENA_DSP_ENTER();
287 CHECK_TSKCTX_UNL();
288
289 t_lock_cpu();
290 disdsp = false;
291
292 tskipri = search_schedtsk();
293 if (tskipri < runtsk_curpri) {
294 run_task(tskipri);
295 }
296 ercd = E_OK;
297 t_unlock_cpu();
298
299 error_exit:
300 LOG_ENA_DSP_LEAVE(ercd);
301 return(ercd);
302}
303
304#endif /* TOPPERS_ena_dsp */
305
306/*
307 * コンテキストの参照
308 */
309#ifdef TOPPERS_sns_ctx
310
311bool_t
312sns_ctx(void)
313{
314 bool_t state;
315
316 LOG_SNS_CTX_ENTER();
317 state = sense_context() ? true : false;
318 LOG_SNS_CTX_LEAVE(state);
319
320 return(state);
321}
322
323#endif /* TOPPERS_sns_ctx */
324
325/*
326 * CPUロック状態の参照
327 */
328#ifdef TOPPERS_sns_loc
329
330bool_t
331sns_loc(void)
332{
333 bool_t state;
334
335 LOG_SNS_LOC_ENTER();
336 state = x_sense_lock() ? true : false;
337 LOG_SNS_LOC_LEAVE(state);
338
339 return(state);
340}
341
342#endif /* TOPPERS_sns_loc */
343
344/*
345 * ディスパッチ禁止状態の参照
346 */
347#ifdef TOPPERS_sns_dsp
348
349bool_t
350sns_dsp(void)
351{
352 bool_t state;
353
354 LOG_SNS_DSP_ENTER();
355 state = disdsp;
356 LOG_SNS_DSP_LEAVE(state);
357
358 return(state);
359}
360
361#endif /* TOPPERS_sns_dsp */
362
363/*
364 * ディスパッチ保留状態の参照
365 */
366#ifdef TOPPERS_sns_dpn
367
368bool_t
369sns_dpn(void)
370{
371 bool_t state;
372
373 LOG_SNS_DPN_ENTER();
374 state = ((sense_context()) || (t_sense_lock()) || disdsp) ?
375 true : false;
376 LOG_SNS_DPN_LEAVE(state);
377
378 return(state);
379}
380
381#endif /* TOPPERS_sns_dpn */
382
383/*
384 * カーネル非動作状態の参照
385 */
386#ifdef TOPPERS_sns_ker
387
388bool_t
389sns_ker(void)
390{
391 bool_t state;
392
393 LOG_SNS_KER_ENTER();
394 state = kerflg ? false : true;
395 LOG_SNS_KER_LEAVE(state);
396
397 return(state);
398}
399
400#endif /* TOPPERS_sns_ker */
Note: See TracBrowser for help on using the repository browser.