source: EcnlProtoTool/trunk/asp3_dcre/kernel/sys_manage.c@ 270

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

mruby版ECNLプロトタイピング・ツールを追加

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id
  • Property svn:mime-type set to text/x-csrc
File size: 10.9 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 * 上記著作権者
12は,以下の(1)~(4)の条件を満たす場合に限り,本ソフトウェ
13 * ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
14 * 変・再é…
15å¸ƒï¼ˆä»¥ä¸‹ï¼Œåˆ©ç”¨ã¨å‘¼ã¶ï¼‰ã™ã‚‹ã“とを無償で許諾する.
16 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
17 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
18 * スコード中に含まれていること.
19 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
20 * 用できる形で再é…
21å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œå†é…
22å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨
23 * 者
24マニュアルなど)に,上記の著作権表示,この利用条件および下記
25 * の無保証規定を掲載すること.
26 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
27 * 用できない形で再é…
28å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œæ¬¡ã®ã„ずれかの条件を満たすこ
29 * と.
30 * (a) 再é…
31å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨è€…
32マニュアルなど)に,上記の著
33 * 作権表示,この利用条件および下記の無保証規定を掲載すること.
34 * (b) 再é…
35å¸ƒã®å½¢æ…
36‹ã‚’,別に定める方法によって,TOPPERSプロジェクトに
37 * 報告すること.
38 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
39 * 害からも,上記著作権者
40およびTOPPERSプロジェクトをå…
41è²¬ã™ã‚‹ã“と.
42 * また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
43 * 由に基づく請求からも,上記著作権者
44およびTOPPERSプロジェクトを
45 * å…
46è²¬ã™ã‚‹ã“と.
47 *
48 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者
49お
50 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
51 * に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
52 * アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
53 * の責任を負わない.
54 *
55 * $Id: sys_manage.c 270 2017-02-09 04:03:47Z coas-nagasima $
56 */
57
58/*
59 * システム状æ…
60‹ç®¡ç†æ©Ÿèƒ½
61 */
62
63#include "kernel_impl.h"
64#include "check.h"
65#include "task.h"
66
67/*
68 * トレースログマクロのデフォルト定義
69 */
70#ifndef LOG_ROT_RDQ_ENTER
71#define LOG_ROT_RDQ_ENTER(tskpri)
72#endif /* LOG_ROT_RDQ_ENTER */
73
74#ifndef LOG_ROT_RDQ_LEAVE
75#define LOG_ROT_RDQ_LEAVE(ercd)
76#endif /* LOG_ROT_RDQ_LEAVE */
77
78#ifndef LOG_GET_TID_ENTER
79#define LOG_GET_TID_ENTER(p_tskid)
80#endif /* LOG_GET_TID_ENTER */
81
82#ifndef LOG_GET_TID_LEAVE
83#define LOG_GET_TID_LEAVE(ercd, p_tskid)
84#endif /* LOG_GET_TID_LEAVE */
85
86#ifndef LOG_GET_LOD_ENTER
87#define LOG_GET_LOD_ENTER(tskpri, p_load)
88#endif /* LOG_GET_LOD_ENTER */
89
90#ifndef LOG_GET_LOD_LEAVE
91#define LOG_GET_LOD_LEAVE(ercd, p_load)
92#endif /* LOG_GET_LOD_LEAVE */
93
94#ifndef LOG_GET_NTH_ENTER
95#define LOG_GET_NTH_ENTER(tskpri, nth, p_tskid)
96#endif /* LOG_GET_NTH_ENTER */
97
98#ifndef LOG_GET_NTH_LEAVE
99#define LOG_GET_NTH_LEAVE(ercd, p_tskid)
100#endif /* LOG_GET_NTH_LEAVE */
101
102#ifndef LOG_LOC_CPU_ENTER
103#define LOG_LOC_CPU_ENTER()
104#endif /* LOG_LOC_CPU_ENTER */
105
106#ifndef LOG_LOC_CPU_LEAVE
107#define LOG_LOC_CPU_LEAVE(ercd)
108#endif /* LOG_LOC_CPU_LEAVE */
109
110#ifndef LOG_UNL_CPU_ENTER
111#define LOG_UNL_CPU_ENTER()
112#endif /* LOG_UNL_CPU_ENTER */
113
114#ifndef LOG_UNL_CPU_LEAVE
115#define LOG_UNL_CPU_LEAVE(ercd)
116#endif /* LOG_UNL_CPU_LEAVE */
117
118#ifndef LOG_DIS_DSP_ENTER
119#define LOG_DIS_DSP_ENTER()
120#endif /* LOG_DIS_DSP_ENTER */
121
122#ifndef LOG_DIS_DSP_LEAVE
123#define LOG_DIS_DSP_LEAVE(ercd)
124#endif /* LOG_DIS_DSP_LEAVE */
125
126#ifndef LOG_ENA_DSP_ENTER
127#define LOG_ENA_DSP_ENTER()
128#endif /* LOG_ENA_DSP_ENTER */
129
130#ifndef LOG_ENA_DSP_LEAVE
131#define LOG_ENA_DSP_LEAVE(ercd)
132#endif /* LOG_ENA_DSP_LEAVE */
133
134#ifndef LOG_SNS_CTX_ENTER
135#define LOG_SNS_CTX_ENTER()
136#endif /* LOG_SNS_CTX_ENTER */
137
138#ifndef LOG_SNS_CTX_LEAVE
139#define LOG_SNS_CTX_LEAVE(state)
140#endif /* LOG_SNS_CTX_LEAVE */
141
142#ifndef LOG_SNS_LOC_ENTER
143#define LOG_SNS_LOC_ENTER()
144#endif /* LOG_SNS_LOC_ENTER */
145
146#ifndef LOG_SNS_LOC_LEAVE
147#define LOG_SNS_LOC_LEAVE(state)
148#endif /* LOG_SNS_LOC_LEAVE */
149
150#ifndef LOG_SNS_DSP_ENTER
151#define LOG_SNS_DSP_ENTER()
152#endif /* LOG_SNS_DSP_ENTER */
153
154#ifndef LOG_SNS_DSP_LEAVE
155#define LOG_SNS_DSP_LEAVE(state)
156#endif /* LOG_SNS_DSP_LEAVE */
157
158#ifndef LOG_SNS_DPN_ENTER
159#define LOG_SNS_DPN_ENTER()
160#endif /* LOG_SNS_DPN_ENTER */
161
162#ifndef LOG_SNS_DPN_LEAVE
163#define LOG_SNS_DPN_LEAVE(state)
164#endif /* LOG_SNS_DPN_LEAVE */
165
166#ifndef LOG_SNS_KER_ENTER
167#define LOG_SNS_KER_ENTER()
168#endif /* LOG_SNS_KER_ENTER */
169
170#ifndef LOG_SNS_KER_LEAVE
171#define LOG_SNS_KER_LEAVE(state)
172#endif /* LOG_SNS_KER_LEAVE */
173
174/*
175 * タスクの優å…
176ˆé †ä½ã®å›žè»¢ï¼»NGKI3548ï¼½
177 */
178#ifdef TOPPERS_rot_rdq
179
180ER
181rot_rdq(PRI tskpri)
182{
183 uint_t pri;
184 ER ercd;
185
186 LOG_ROT_RDQ_ENTER(tskpri);
187 CHECK_UNL(); /*ï¼»NGKI2684ï¼½*/
188 if (tskpri == TPRI_SELF && !sense_context()) {
189 pri = p_runtsk->bpriority; /*ï¼»NGKI2689ï¼½*/
190 }
191 else {
192 CHECK_PAR(VALID_TPRI(tskpri)); /*ï¼»NGKI2685ï¼½*/
193 pri = INT_PRIORITY(tskpri);
194 }
195
196 lock_cpu();
197 rotate_ready_queue(&(ready_queue[pri]));
198 if (p_runtsk != p_schedtsk) {
199 if (!sense_context()) {
200 dispatch();
201 }
202 else {
203 request_dispatch();
204 }
205 }
206 ercd = E_OK;
207 unlock_cpu();
208
209 error_exit:
210 LOG_ROT_RDQ_LEAVE(ercd);
211 return(ercd);
212}
213
214#endif /* TOPPERS_rot_rdq */
215
216/*
217 * 実行状æ…
218‹ã®ã‚¿ã‚¹ã‚¯IDの参ç…
219§ï¼»NGKI3550ï¼½
220 */
221#ifdef TOPPERS_get_tid
222
223ER
224get_tid(ID *p_tskid)
225{
226 ER ercd;
227
228 LOG_GET_TID_ENTER(p_tskid);
229 CHECK_UNL(); /*ï¼»NGKI2707ï¼½*/
230
231 lock_cpu();
232 *p_tskid = (p_runtsk == NULL) ? TSK_NONE : TSKID(p_runtsk);
233 ercd = E_OK;
234 unlock_cpu();
235
236 error_exit:
237 LOG_GET_TID_LEAVE(ercd, p_tskid);
238 return(ercd);
239}
240
241#endif /* TOPPERS_get_tid */
242
243/*
244 * 実行できるタスクの数の参ç…
245§ï¼»NGKI3623ï¼½
246 */
247#ifdef TOPPERS_get_lod
248
249ER
250get_lod(PRI tskpri, uint_t *p_load)
251{
252 uint_t pri, load;
253 QUEUE *p_queue, *p_entry;
254 ER ercd;
255
256 LOG_GET_LOD_ENTER(p_tskid, p_load);
257 CHECK_TSKCTX_UNL(); /*[NGKI3624][NGKI3625]*/
258 if (tskpri == TPRI_SELF) {
259 pri = p_runtsk->bpriority; /*ï¼»NGKI3631ï¼½*/
260 }
261 else {
262 CHECK_PAR(VALID_TPRI(tskpri)); /*ï¼»NGKI3626ï¼½*/
263 pri = INT_PRIORITY(tskpri);
264 }
265 p_queue = &(ready_queue[pri]);
266
267 lock_cpu();
268 load = 0U;
269 for (p_entry = p_queue->p_next; p_entry != p_queue;
270 p_entry = p_entry->p_next) {
271 load += 1U;
272 }
273 *p_load = load;
274 ercd = E_OK;
275 unlock_cpu();
276
277 error_exit:
278 LOG_GET_LOD_LEAVE(ercd, p_load);
279 return(ercd);
280}
281
282#endif /* TOPPERS_get_lod */
283
284/*
285 * 指定した優å…
286ˆé †ä½ã®ã‚¿ã‚¹ã‚¯IDの参ç…
287§ï¼»NGKI3641ï¼½
288 */
289#ifdef TOPPERS_get_nth
290
291ER
292get_nth(PRI tskpri, uint_t nth, ID *p_tskid)
293{
294 uint_t pri;
295 QUEUE *p_queue, *p_entry;
296 ID tskid;
297 ER ercd;
298
299 LOG_GET_NTH_ENTER(p_tskid, nth, p_tskid);
300 CHECK_TSKCTX_UNL(); /*[NGKI3642][NGKI3643]*/
301 if (tskpri == TPRI_SELF) {
302 pri = p_runtsk->bpriority; /*ï¼»NGKI3650ï¼½*/
303 }
304 else {
305 CHECK_PAR(VALID_TPRI(tskpri)); /*ï¼»NGKI3644ï¼½*/
306 pri = INT_PRIORITY(tskpri);
307 }
308 p_queue = &(ready_queue[pri]);
309
310 lock_cpu();
311 tskid = TSK_NONE;
312 for (p_entry = p_queue->p_next; p_entry != p_queue;
313 p_entry = p_entry->p_next) {
314 if (nth == 0U) {
315 tskid = TSKID((TCB *) p_entry);
316 break;
317 }
318 nth -= 1U;
319 }
320 *p_tskid = tskid;
321 ercd = E_OK;
322 unlock_cpu();
323
324 error_exit:
325 LOG_GET_NTH_LEAVE(ercd, p_tskid);
326 return(ercd);
327}
328
329#endif /* TOPPERS_get_nth */
330
331/*
332 * CPUロック状æ…
333‹ã¸ã®é·ç§»ï¼»NGKI3538ï¼½
334 */
335#ifdef TOPPERS_loc_cpu
336
337ER
338loc_cpu(void)
339{
340 ER ercd;
341
342 LOG_LOC_CPU_ENTER();
343
344 if (!sense_lock()) { /*ï¼»NGKI2731ï¼½*/
345 lock_cpu(); /*ï¼»NGKI2730ï¼½*/
346 }
347 ercd = E_OK;
348
349 LOG_LOC_CPU_LEAVE(ercd);
350 return(ercd);
351}
352
353#endif /* TOPPERS_loc_cpu */
354
355/*
356 * CPUロック状æ…
357‹ã®è§£é™¤ï¼»NGKI3539ï¼½
358 *
359 * CPUロック中は,ディスパッチが必
360要となるサービスコールを呼び出すこ
361 * とはできないため,CPUロック状æ…
362‹ã®è§£é™¤æ™‚にディスパッチャを起動する
363 * 必
364要はない.
365 */
366#ifdef TOPPERS_unl_cpu
367
368ER
369unl_cpu(void)
370{
371 ER ercd;
372
373 LOG_UNL_CPU_ENTER();
374
375 if (sense_lock()) { /*ï¼»NGKI2738ï¼½*/
376 unlock_cpu(); /*ï¼»NGKI2737ï¼½*/
377 }
378 ercd = E_OK;
379
380 LOG_UNL_CPU_LEAVE(ercd);
381 return(ercd);
382}
383
384#endif /* TOPPERS_unl_cpu */
385
386/*
387 * ディスパッチの禁止[NGKI2740]
388 */
389#ifdef TOPPERS_dis_dsp
390
391ER
392dis_dsp(void)
393{
394 ER ercd;
395
396 LOG_DIS_DSP_ENTER();
397 CHECK_TSKCTX_UNL(); /*[NGKI2741][NGKI2742]*/
398
399 lock_cpu();
400 enadsp = false;
401 dspflg = false;
402 ercd = E_OK;
403 unlock_cpu();
404
405 error_exit:
406 LOG_DIS_DSP_LEAVE(ercd);
407 return(ercd);
408}
409
410#endif /* TOPPERS_dis_dsp */
411
412/*
413 * ディスパッチの許可[NGKI2746]
414 */
415#ifdef TOPPERS_ena_dsp
416
417ER
418ena_dsp(void)
419{
420 ER ercd;
421
422 LOG_ENA_DSP_ENTER();
423 CHECK_TSKCTX_UNL(); /*[NGKI2747][NGKI2748]*/
424
425 lock_cpu();
426 enadsp = true;
427 if (t_get_ipm() == TIPM_ENAALL) {
428 dspflg = true;
429 p_schedtsk = search_schedtsk();
430 if (p_runtsk->raster && p_runtsk->enater) {
431 task_terminate(p_runtsk);
432 exit_and_dispatch();
433 ercd = E_SYS;
434 }
435 else {
436 if (p_runtsk != p_schedtsk) {
437 dispatch();
438 }
439 ercd = E_OK;
440 }
441 }
442 else {
443 ercd = E_OK;
444 }
445 unlock_cpu();
446
447 error_exit:
448 LOG_ENA_DSP_LEAVE(ercd);
449 return(ercd);
450}
451
452#endif /* TOPPERS_ena_dsp */
453
454/*
455 * コンテキストの参ç…
456§ï¼»NGKI2752ï¼½
457 */
458#ifdef TOPPERS_sns_ctx
459
460bool_t
461sns_ctx(void)
462{
463 bool_t state;
464
465 LOG_SNS_CTX_ENTER();
466 state = sense_context() ? true : false;
467 LOG_SNS_CTX_LEAVE(state);
468 return(state);
469}
470
471#endif /* TOPPERS_sns_ctx */
472
473/*
474 * CPUロック状æ…
475‹ã®å‚ç…
476§ï¼»NGKI2754ï¼½
477 */
478#ifdef TOPPERS_sns_loc
479
480bool_t
481sns_loc(void)
482{
483 bool_t state;
484
485 LOG_SNS_LOC_ENTER();
486 state = sense_lock() ? true : false;
487 LOG_SNS_LOC_LEAVE(state);
488 return(state);
489}
490
491#endif /* TOPPERS_sns_loc */
492
493/*
494 * ディスパッチ禁止状æ…
495‹ã®å‚ç…
496§ï¼»NGKI2756ï¼½
497 */
498#ifdef TOPPERS_sns_dsp
499
500bool_t
501sns_dsp(void)
502{
503 bool_t state;
504
505 LOG_SNS_DSP_ENTER();
506 state = !enadsp;
507 LOG_SNS_DSP_LEAVE(state);
508 return(state);
509}
510
511#endif /* TOPPERS_sns_dsp */
512
513/*
514 * ディスパッチ保留状æ…
515‹ã®å‚ç…
516§ï¼»NGKI2758ï¼½
517 */
518#ifdef TOPPERS_sns_dpn
519
520bool_t
521sns_dpn(void)
522{
523 bool_t state;
524
525 LOG_SNS_DPN_ENTER();
526 state = (sense_context() || sense_lock() || !dspflg) ? true : false;
527 LOG_SNS_DPN_LEAVE(state);
528 return(state);
529}
530
531#endif /* TOPPERS_sns_dpn */
532
533/*
534 * カーネル非動作状æ…
535‹ã®å‚ç…
536§ï¼»NGKI2760ï¼½
537 */
538#ifdef TOPPERS_sns_ker
539
540bool_t
541sns_ker(void)
542{
543 bool_t state;
544
545 LOG_SNS_KER_ENTER();
546 state = kerflg ? false : true;
547 LOG_SNS_KER_LEAVE(state);
548 return(state);
549}
550
551#endif /* TOPPERS_sns_ker */
Note: See TracBrowser for help on using the repository browser.