source: asp3_gr_sakura/trunk/kernel/sys_manage.c@ 318

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

プロパティの文字コードにUTF-8を追加、キーワードを削除

  • Property svn:eol-style set to native
  • Property svn:mime-type set to text/x-csrc; charset=UTF-8
File size: 11.1 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-2015 by Embedded and Real-Time Systems Laboratory
9 * Graduate School of Information Science, Nagoya Univ., JAPAN
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 * $Id$
41 */
42
43/*
44 * システム状態管理機能
45 */
46
47#include "kernel_impl.h"
48#include "check.h"
49#include "task.h"
50#include "overrun.h"
51
52/*
53 * トレースログマクロのデフォルト定義
54 */
55#ifndef LOG_ROT_RDQ_ENTER
56#define LOG_ROT_RDQ_ENTER(tskpri)
57#endif /* LOG_ROT_RDQ_ENTER */
58
59#ifndef LOG_ROT_RDQ_LEAVE
60#define LOG_ROT_RDQ_LEAVE(ercd)
61#endif /* LOG_ROT_RDQ_LEAVE */
62
63#ifndef LOG_GET_TID_ENTER
64#define LOG_GET_TID_ENTER(p_tskid)
65#endif /* LOG_GET_TID_ENTER */
66
67#ifndef LOG_GET_TID_LEAVE
68#define LOG_GET_TID_LEAVE(ercd, p_tskid)
69#endif /* LOG_GET_TID_LEAVE */
70
71#ifndef LOG_GET_LOD_ENTER
72#define LOG_GET_LOD_ENTER(tskpri, p_load)
73#endif /* LOG_GET_LOD_ENTER */
74
75#ifndef LOG_GET_LOD_LEAVE
76#define LOG_GET_LOD_LEAVE(ercd, p_load)
77#endif /* LOG_GET_LOD_LEAVE */
78
79#ifndef LOG_GET_NTH_ENTER
80#define LOG_GET_NTH_ENTER(tskpri, nth, p_tskid)
81#endif /* LOG_GET_NTH_ENTER */
82
83#ifndef LOG_GET_NTH_LEAVE
84#define LOG_GET_NTH_LEAVE(ercd, p_tskid)
85#endif /* LOG_GET_NTH_LEAVE */
86
87#ifndef LOG_LOC_CPU_ENTER
88#define LOG_LOC_CPU_ENTER()
89#endif /* LOG_LOC_CPU_ENTER */
90
91#ifndef LOG_LOC_CPU_LEAVE
92#define LOG_LOC_CPU_LEAVE(ercd)
93#endif /* LOG_LOC_CPU_LEAVE */
94
95#ifndef LOG_UNL_CPU_ENTER
96#define LOG_UNL_CPU_ENTER()
97#endif /* LOG_UNL_CPU_ENTER */
98
99#ifndef LOG_UNL_CPU_LEAVE
100#define LOG_UNL_CPU_LEAVE(ercd)
101#endif /* LOG_UNL_CPU_LEAVE */
102
103#ifndef LOG_DIS_DSP_ENTER
104#define LOG_DIS_DSP_ENTER()
105#endif /* LOG_DIS_DSP_ENTER */
106
107#ifndef LOG_DIS_DSP_LEAVE
108#define LOG_DIS_DSP_LEAVE(ercd)
109#endif /* LOG_DIS_DSP_LEAVE */
110
111#ifndef LOG_ENA_DSP_ENTER
112#define LOG_ENA_DSP_ENTER()
113#endif /* LOG_ENA_DSP_ENTER */
114
115#ifndef LOG_ENA_DSP_LEAVE
116#define LOG_ENA_DSP_LEAVE(ercd)
117#endif /* LOG_ENA_DSP_LEAVE */
118
119#ifndef LOG_SNS_CTX_ENTER
120#define LOG_SNS_CTX_ENTER()
121#endif /* LOG_SNS_CTX_ENTER */
122
123#ifndef LOG_SNS_CTX_LEAVE
124#define LOG_SNS_CTX_LEAVE(state)
125#endif /* LOG_SNS_CTX_LEAVE */
126
127#ifndef LOG_SNS_LOC_ENTER
128#define LOG_SNS_LOC_ENTER()
129#endif /* LOG_SNS_LOC_ENTER */
130
131#ifndef LOG_SNS_LOC_LEAVE
132#define LOG_SNS_LOC_LEAVE(state)
133#endif /* LOG_SNS_LOC_LEAVE */
134
135#ifndef LOG_SNS_DSP_ENTER
136#define LOG_SNS_DSP_ENTER()
137#endif /* LOG_SNS_DSP_ENTER */
138
139#ifndef LOG_SNS_DSP_LEAVE
140#define LOG_SNS_DSP_LEAVE(state)
141#endif /* LOG_SNS_DSP_LEAVE */
142
143#ifndef LOG_SNS_DPN_ENTER
144#define LOG_SNS_DPN_ENTER()
145#endif /* LOG_SNS_DPN_ENTER */
146
147#ifndef LOG_SNS_DPN_LEAVE
148#define LOG_SNS_DPN_LEAVE(state)
149#endif /* LOG_SNS_DPN_LEAVE */
150
151#ifndef LOG_SNS_KER_ENTER
152#define LOG_SNS_KER_ENTER()
153#endif /* LOG_SNS_KER_ENTER */
154
155#ifndef LOG_SNS_KER_LEAVE
156#define LOG_SNS_KER_LEAVE(state)
157#endif /* LOG_SNS_KER_LEAVE */
158
159/*
160 * タスクの優先順位の回転[NGKI3548]
161 */
162#ifdef TOPPERS_rot_rdq
163
164ER
165rot_rdq(PRI tskpri)
166{
167 uint_t pri;
168 ER ercd;
169
170 LOG_ROT_RDQ_ENTER(tskpri);
171 CHECK_UNL(); /*[NGKI2684]*/
172 if (tskpri == TPRI_SELF && !sense_context()) {
173 pri = p_runtsk->bpriority; /*[NGKI2689]*/
174 }
175 else {
176 CHECK_PAR(VALID_TPRI(tskpri)); /*[NGKI2685]*/
177 pri = INT_PRIORITY(tskpri);
178 }
179
180 lock_cpu();
181 rotate_ready_queue(&(ready_queue[pri]));
182 if (p_runtsk != p_schedtsk) {
183 if (!sense_context()) {
184 dispatch();
185 }
186 else {
187 request_dispatch();
188 }
189 }
190 ercd = E_OK;
191 unlock_cpu();
192
193 error_exit:
194 LOG_ROT_RDQ_LEAVE(ercd);
195 return(ercd);
196}
197
198#endif /* TOPPERS_rot_rdq */
199
200/*
201 * 実行状態のタスクIDの参照[NGKI3550]
202 */
203#ifdef TOPPERS_get_tid
204
205ER
206get_tid(ID *p_tskid)
207{
208 ER ercd;
209
210 LOG_GET_TID_ENTER(p_tskid);
211 CHECK_UNL(); /*[NGKI2707]*/
212
213 lock_cpu();
214 *p_tskid = (p_runtsk == NULL) ? TSK_NONE : TSKID(p_runtsk);
215 ercd = E_OK;
216 unlock_cpu();
217
218 error_exit:
219 LOG_GET_TID_LEAVE(ercd, p_tskid);
220 return(ercd);
221}
222
223#endif /* TOPPERS_get_tid */
224
225/*
226 * 実行できるタスクの数の参照[NGKI3623]
227 */
228#ifdef TOPPERS_get_lod
229
230ER
231get_lod(PRI tskpri, uint_t *p_load)
232{
233 uint_t pri, load;
234 QUEUE *p_queue, *p_entry;
235 ER ercd;
236
237 LOG_GET_LOD_ENTER(p_tskid, p_load);
238 CHECK_TSKCTX_UNL(); /*[NGKI3624][NGKI3625]*/
239 if (tskpri == TPRI_SELF) {
240 pri = p_runtsk->bpriority; /*[NGKI3631]*/
241 }
242 else {
243 CHECK_PAR(VALID_TPRI(tskpri)); /*[NGKI3626]*/
244 pri = INT_PRIORITY(tskpri);
245 }
246 p_queue = &(ready_queue[pri]);
247
248 lock_cpu();
249 load = 0U;
250 for (p_entry = p_queue->p_next; p_entry != p_queue;
251 p_entry = p_entry->p_next) {
252 load += 1U;
253 }
254 *p_load = load;
255 ercd = E_OK;
256 unlock_cpu();
257
258 error_exit:
259 LOG_GET_LOD_LEAVE(ercd, p_load);
260 return(ercd);
261}
262
263#endif /* TOPPERS_get_lod */
264
265/*
266 * 指定した優先順位のタスクIDの参照[NGKI3641]
267 */
268#ifdef TOPPERS_get_nth
269
270ER
271get_nth(PRI tskpri, uint_t nth, ID *p_tskid)
272{
273 uint_t pri;
274 QUEUE *p_queue, *p_entry;
275 ID tskid;
276 ER ercd;
277
278 LOG_GET_NTH_ENTER(p_tskid, nth, p_tskid);
279 CHECK_TSKCTX_UNL(); /*[NGKI3642][NGKI3643]*/
280 if (tskpri == TPRI_SELF) {
281 pri = p_runtsk->bpriority; /*[NGKI3650]*/
282 }
283 else {
284 CHECK_PAR(VALID_TPRI(tskpri)); /*[NGKI3644]*/
285 pri = INT_PRIORITY(tskpri);
286 }
287 p_queue = &(ready_queue[pri]);
288
289 lock_cpu();
290 tskid = TSK_NONE;
291 for (p_entry = p_queue->p_next; p_entry != p_queue;
292 p_entry = p_entry->p_next) {
293 if (nth == 0U) {
294 tskid = TSKID((TCB *) p_entry);
295 break;
296 }
297 nth -= 1U;
298 }
299 *p_tskid = tskid;
300 ercd = E_OK;
301 unlock_cpu();
302
303 error_exit:
304 LOG_GET_NTH_LEAVE(ercd, p_tskid);
305 return(ercd);
306}
307
308#endif /* TOPPERS_get_nth */
309
310/*
311 * CPUロック状態への遷移[NGKI3538]
312 */
313#ifdef TOPPERS_loc_cpu
314
315ER
316loc_cpu(void)
317{
318 ER ercd;
319
320 LOG_LOC_CPU_ENTER();
321
322 if (!sense_lock()) { /*[NGKI2731]*/
323 lock_cpu(); /*[NGKI2730]*/
324 }
325 ercd = E_OK;
326
327 LOG_LOC_CPU_LEAVE(ercd);
328 return(ercd);
329}
330
331#endif /* TOPPERS_loc_cpu */
332
333/*
334 * CPUロック状態の解除[NGKI3539]
335 *
336 * CPUロック中は,ディスパッチが必要となるサービスコールを呼び出すこ
337 * とはできないため,CPUロック状態の解除時にディスパッチャを起動する
338 * 必要はない.
339 */
340#ifdef TOPPERS_unl_cpu
341
342ER
343unl_cpu(void)
344{
345 ER ercd;
346
347 LOG_UNL_CPU_ENTER();
348
349 if (sense_lock()) { /*[NGKI2738]*/
350 unlock_cpu(); /*[NGKI2737]*/
351 }
352 ercd = E_OK;
353
354 LOG_UNL_CPU_LEAVE(ercd);
355 return(ercd);
356}
357
358#endif /* TOPPERS_unl_cpu */
359
360/*
361 * ディスパッチの禁止[NGKI2740]
362 */
363#ifdef TOPPERS_dis_dsp
364
365ER
366dis_dsp(void)
367{
368 ER ercd;
369
370 LOG_DIS_DSP_ENTER();
371 CHECK_TSKCTX_UNL(); /*[NGKI2741][NGKI2742]*/
372
373 lock_cpu();
374 enadsp = false;
375 dspflg = false;
376 ercd = E_OK;
377 unlock_cpu();
378
379 error_exit:
380 LOG_DIS_DSP_LEAVE(ercd);
381 return(ercd);
382}
383
384#endif /* TOPPERS_dis_dsp */
385
386/*
387 * ディスパッチの許可[NGKI2746]
388 */
389#ifdef TOPPERS_ena_dsp
390
391ER
392ena_dsp(void)
393{
394 ER ercd;
395
396 LOG_ENA_DSP_ENTER();
397 CHECK_TSKCTX_UNL(); /*[NGKI2747][NGKI2748]*/
398
399 lock_cpu();
400 enadsp = true;
401 if (t_get_ipm() == TIPM_ENAALL) {
402 dspflg = true;
403 p_schedtsk = search_schedtsk();
404 if (p_runtsk->raster && p_runtsk->enater) {
405#ifdef TOPPERS_SUPPORT_OVRHDR
406 if (p_runtsk->staovr) {
407 (void) target_ovrtimer_stop(INTNO_DUMMY_TIMER);
408 ovrtimer_flag = false;
409 }
410#endif /* TOPPERS_SUPPORT_OVRHDR */
411 task_terminate(p_runtsk);
412 exit_and_dispatch();
413 ercd = E_SYS;
414 }
415 else {
416 if (p_runtsk != p_schedtsk) {
417 dispatch();
418 }
419 ercd = E_OK;
420 }
421 }
422 else {
423 ercd = E_OK;
424 }
425 unlock_cpu();
426
427 error_exit:
428 LOG_ENA_DSP_LEAVE(ercd);
429 return(ercd);
430}
431
432#endif /* TOPPERS_ena_dsp */
433
434/*
435 * コンテキストの参照[NGKI2752]
436 */
437#ifdef TOPPERS_sns_ctx
438
439bool_t
440sns_ctx(void)
441{
442 bool_t state;
443
444 LOG_SNS_CTX_ENTER();
445 state = sense_context() ? true : false;
446 LOG_SNS_CTX_LEAVE(state);
447 return(state);
448}
449
450#endif /* TOPPERS_sns_ctx */
451
452/*
453 * CPUロック状態の参照[NGKI2754]
454 */
455#ifdef TOPPERS_sns_loc
456
457bool_t
458sns_loc(void)
459{
460 bool_t state;
461
462 LOG_SNS_LOC_ENTER();
463 state = sense_lock() ? true : false;
464 LOG_SNS_LOC_LEAVE(state);
465 return(state);
466}
467
468#endif /* TOPPERS_sns_loc */
469
470/*
471 * ディスパッチ禁止状態の参照[NGKI2756]
472 */
473#ifdef TOPPERS_sns_dsp
474
475bool_t
476sns_dsp(void)
477{
478 bool_t state;
479
480 LOG_SNS_DSP_ENTER();
481 state = !enadsp;
482 LOG_SNS_DSP_LEAVE(state);
483 return(state);
484}
485
486#endif /* TOPPERS_sns_dsp */
487
488/*
489 * ディスパッチ保留状態の参照[NGKI2758]
490 */
491#ifdef TOPPERS_sns_dpn
492
493bool_t
494sns_dpn(void)
495{
496 bool_t state;
497
498 LOG_SNS_DPN_ENTER();
499 state = (sense_context() || sense_lock() || !dspflg) ? true : false;
500 LOG_SNS_DPN_LEAVE(state);
501 return(state);
502}
503
504#endif /* TOPPERS_sns_dpn */
505
506/*
507 * カーネル非動作状態の参照[NGKI2760]
508 */
509#ifdef TOPPERS_sns_ker
510
511bool_t
512sns_ker(void)
513{
514 bool_t state;
515
516 LOG_SNS_KER_ENTER();
517 state = kerflg ? false : true;
518 LOG_SNS_KER_LEAVE(state);
519 return(state);
520}
521
522#endif /* TOPPERS_sns_ker */
Note: See TracBrowser for help on using the repository browser.