source: asp3_wo_tecs/trunk/extension/ovrhdr/kernel/sys_manage.c@ 302

Last change on this file since 302 was 302, checked in by ertl-honda, 7 years ago

TECSレスのASP3の開発のため以下のtrunkからコピー
http://dev.toppers.jp/svn/asp3/branches/WO_TECS-3.C.0

File size: 10.6 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 470 2015-12-30 09:50:36Z ertl-hiro $
56 */
57
58/*
59 * システム状æ…
60‹ç®¡ç†æ©Ÿèƒ½
61 */
62
63#include "kernel_impl.h"
64#include "check.h"
65#include "task.h"
66#include "overrun.h"
67
68/*
69 * トレースログマクロのデフォルト定義
70 */
71#ifndef LOG_ROT_RDQ_ENTER
72#define LOG_ROT_RDQ_ENTER(tskpri)
73#endif /* LOG_ROT_RDQ_ENTER */
74
75#ifndef LOG_ROT_RDQ_LEAVE
76#define LOG_ROT_RDQ_LEAVE(ercd)
77#endif /* LOG_ROT_RDQ_LEAVE */
78
79#ifndef LOG_GET_TID_ENTER
80#define LOG_GET_TID_ENTER(p_tskid)
81#endif /* LOG_GET_TID_ENTER */
82
83#ifndef LOG_GET_TID_LEAVE
84#define LOG_GET_TID_LEAVE(ercd, p_tskid)
85#endif /* LOG_GET_TID_LEAVE */
86
87#ifndef LOG_GET_LOD_ENTER
88#define LOG_GET_LOD_ENTER(tskpri, p_load)
89#endif /* LOG_GET_LOD_ENTER */
90
91#ifndef LOG_GET_LOD_LEAVE
92#define LOG_GET_LOD_LEAVE(ercd, p_load)
93#endif /* LOG_GET_LOD_LEAVE */
94
95#ifndef LOG_GET_NTH_ENTER
96#define LOG_GET_NTH_ENTER(tskpri, nth, p_tskid)
97#endif /* LOG_GET_NTH_ENTER */
98
99#ifndef LOG_GET_NTH_LEAVE
100#define LOG_GET_NTH_LEAVE(ercd, p_tskid)
101#endif /* LOG_GET_NTH_LEAVE */
102
103#ifndef LOG_LOC_CPU_ENTER
104#define LOG_LOC_CPU_ENTER()
105#endif /* LOG_LOC_CPU_ENTER */
106
107#ifndef LOG_LOC_CPU_LEAVE
108#define LOG_LOC_CPU_LEAVE(ercd)
109#endif /* LOG_LOC_CPU_LEAVE */
110
111#ifndef LOG_UNL_CPU_ENTER
112#define LOG_UNL_CPU_ENTER()
113#endif /* LOG_UNL_CPU_ENTER */
114
115#ifndef LOG_UNL_CPU_LEAVE
116#define LOG_UNL_CPU_LEAVE(ercd)
117#endif /* LOG_UNL_CPU_LEAVE */
118
119#ifndef LOG_DIS_DSP_ENTER
120#define LOG_DIS_DSP_ENTER()
121#endif /* LOG_DIS_DSP_ENTER */
122
123#ifndef LOG_DIS_DSP_LEAVE
124#define LOG_DIS_DSP_LEAVE(ercd)
125#endif /* LOG_DIS_DSP_LEAVE */
126
127#ifndef LOG_ENA_DSP_ENTER
128#define LOG_ENA_DSP_ENTER()
129#endif /* LOG_ENA_DSP_ENTER */
130
131#ifndef LOG_ENA_DSP_LEAVE
132#define LOG_ENA_DSP_LEAVE(ercd)
133#endif /* LOG_ENA_DSP_LEAVE */
134
135#ifndef LOG_SNS_CTX_ENTER
136#define LOG_SNS_CTX_ENTER()
137#endif /* LOG_SNS_CTX_ENTER */
138
139#ifndef LOG_SNS_CTX_LEAVE
140#define LOG_SNS_CTX_LEAVE(state)
141#endif /* LOG_SNS_CTX_LEAVE */
142
143#ifndef LOG_SNS_LOC_ENTER
144#define LOG_SNS_LOC_ENTER()
145#endif /* LOG_SNS_LOC_ENTER */
146
147#ifndef LOG_SNS_LOC_LEAVE
148#define LOG_SNS_LOC_LEAVE(state)
149#endif /* LOG_SNS_LOC_LEAVE */
150
151#ifndef LOG_SNS_DSP_ENTER
152#define LOG_SNS_DSP_ENTER()
153#endif /* LOG_SNS_DSP_ENTER */
154
155#ifndef LOG_SNS_DSP_LEAVE
156#define LOG_SNS_DSP_LEAVE(state)
157#endif /* LOG_SNS_DSP_LEAVE */
158
159#ifndef LOG_SNS_DPN_ENTER
160#define LOG_SNS_DPN_ENTER()
161#endif /* LOG_SNS_DPN_ENTER */
162
163#ifndef LOG_SNS_DPN_LEAVE
164#define LOG_SNS_DPN_LEAVE(state)
165#endif /* LOG_SNS_DPN_LEAVE */
166
167#ifndef LOG_SNS_KER_ENTER
168#define LOG_SNS_KER_ENTER()
169#endif /* LOG_SNS_KER_ENTER */
170
171#ifndef LOG_SNS_KER_LEAVE
172#define LOG_SNS_KER_LEAVE(state)
173#endif /* LOG_SNS_KER_LEAVE */
174
175/*
176 * タスクの優å…
177ˆé †ä½ã®å›žè»¢
178 */
179#ifdef TOPPERS_rot_rdq
180
181ER
182rot_rdq(PRI tskpri)
183{
184 uint_t pri;
185 ER ercd;
186
187 LOG_ROT_RDQ_ENTER(tskpri);
188 CHECK_UNL();
189 if (tskpri == TPRI_SELF && !sense_context()) {
190 pri = p_runtsk->bpriority;
191 }
192 else {
193 CHECK_PAR(VALID_TPRI(tskpri));
194 pri = INT_PRIORITY(tskpri);
195 }
196
197 lock_cpu();
198 rotate_ready_queue(&(ready_queue[pri]));
199 if (p_runtsk != p_schedtsk) {
200 if (!sense_context()) {
201 dispatch();
202 }
203 else {
204 request_dispatch();
205 }
206 }
207 ercd = E_OK;
208 unlock_cpu();
209
210 error_exit:
211 LOG_ROT_RDQ_LEAVE(ercd);
212 return(ercd);
213}
214
215#endif /* TOPPERS_rot_rdq */
216
217/*
218 * 実行状æ…
219‹ã®ã‚¿ã‚¹ã‚¯IDの参ç…
220§
221 */
222#ifdef TOPPERS_get_tid
223
224ER
225get_tid(ID *p_tskid)
226{
227 ER ercd;
228
229 LOG_GET_TID_ENTER(p_tskid);
230 CHECK_UNL();
231
232 lock_cpu();
233 *p_tskid = (p_runtsk == NULL) ? TSK_NONE : TSKID(p_runtsk);
234 ercd = E_OK;
235 unlock_cpu();
236
237 error_exit:
238 LOG_GET_TID_LEAVE(ercd, p_tskid);
239 return(ercd);
240}
241
242#endif /* TOPPERS_get_tid */
243
244/*
245 * 実行できるタスクの数の参ç…
246§
247 */
248#ifdef TOPPERS_get_lod
249
250ER
251get_lod(PRI tskpri, uint_t *p_load)
252{
253 uint_t pri, load;
254 QUEUE *p_queue, *p_entry;
255 ER ercd;
256
257 LOG_GET_LOD_ENTER(p_tskid, p_load);
258 CHECK_TSKCTX_UNL();
259 if (tskpri == TPRI_SELF) {
260 pri = p_runtsk->bpriority;
261 }
262 else {
263 CHECK_PAR(VALID_TPRI(tskpri));
264 pri = INT_PRIORITY(tskpri);
265 }
266 p_queue = &(ready_queue[pri]);
267
268 lock_cpu();
269 load = 0U;
270 for (p_entry = p_queue->p_next; p_entry != p_queue;
271 p_entry = p_entry->p_next) {
272 load += 1U;
273 }
274 *p_load = load;
275 ercd = E_OK;
276 unlock_cpu();
277
278 error_exit:
279 LOG_GET_LOD_LEAVE(ercd, p_load);
280 return(ercd);
281}
282
283#endif /* TOPPERS_get_lod */
284
285/*
286 * 指定した優å…
287ˆé †ä½ã®ã‚¿ã‚¹ã‚¯IDの参ç…
288§
289 */
290#ifdef TOPPERS_get_nth
291
292ER
293get_nth(PRI tskpri, uint_t nth, ID *p_tskid)
294{
295 uint_t pri;
296 QUEUE *p_queue, *p_entry;
297 ID tskid;
298 ER ercd;
299
300 LOG_GET_NTH_ENTER(p_tskid, nth, p_tskid);
301 CHECK_TSKCTX_UNL();
302 if (tskpri == TPRI_SELF) {
303 pri = p_runtsk->bpriority;
304 }
305 else {
306 CHECK_PAR(VALID_TPRI(tskpri));
307 pri = INT_PRIORITY(tskpri);
308 }
309 p_queue = &(ready_queue[pri]);
310
311 lock_cpu();
312 tskid = TSK_NONE;
313 for (p_entry = p_queue->p_next; p_entry != p_queue;
314 p_entry = p_entry->p_next) {
315 if (nth == 0U) {
316 tskid = TSKID((TCB *) p_entry);
317 break;
318 }
319 nth -= 1U;
320 }
321 *p_tskid = tskid;
322 ercd = E_OK;
323 unlock_cpu();
324
325 error_exit:
326 LOG_GET_NTH_LEAVE(ercd, p_tskid);
327 return(ercd);
328}
329
330#endif /* TOPPERS_get_nth */
331
332/*
333 * CPUロック状æ…
334‹ã¸ã®é·ç§»
335 */
336#ifdef TOPPERS_loc_cpu
337
338ER
339loc_cpu(void)
340{
341 ER ercd;
342
343 LOG_LOC_CPU_ENTER();
344
345 if (!sense_lock()) {
346 lock_cpu();
347 }
348 ercd = E_OK;
349
350 LOG_LOC_CPU_LEAVE(ercd);
351 return(ercd);
352}
353
354#endif /* TOPPERS_loc_cpu */
355
356/*
357 * CPUロック状æ…
358‹ã®è§£é™¤
359 *
360 * CPUロック中は,ディスパッチが必
361要となるサービスコールを呼び出すこ
362 * とはできないため,CPUロック状æ…
363‹ã®è§£é™¤æ™‚にディスパッチャを起動する
364 * 必
365要はない.
366 */
367#ifdef TOPPERS_unl_cpu
368
369ER
370unl_cpu(void)
371{
372 ER ercd;
373
374 LOG_UNL_CPU_ENTER();
375
376 if (sense_lock()) {
377 unlock_cpu();
378 }
379 ercd = E_OK;
380
381 LOG_UNL_CPU_LEAVE(ercd);
382 return(ercd);
383}
384
385#endif /* TOPPERS_unl_cpu */
386
387/*
388 * ディスパッチの禁止
389 */
390#ifdef TOPPERS_dis_dsp
391
392ER
393dis_dsp(void)
394{
395 ER ercd;
396
397 LOG_DIS_DSP_ENTER();
398 CHECK_TSKCTX_UNL();
399
400 lock_cpu();
401 enadsp = false;
402 dspflg = false;
403 ercd = E_OK;
404 unlock_cpu();
405
406 error_exit:
407 LOG_DIS_DSP_LEAVE(ercd);
408 return(ercd);
409}
410
411#endif /* TOPPERS_dis_dsp */
412
413/*
414 * ディスパッチの許可
415 */
416#ifdef TOPPERS_ena_dsp
417
418ER
419ena_dsp(void)
420{
421 ER ercd;
422
423 LOG_ENA_DSP_ENTER();
424 CHECK_TSKCTX_UNL();
425
426 lock_cpu();
427 enadsp = true;
428 if (t_get_ipm() == TIPM_ENAALL) {
429 dspflg = true;
430 p_schedtsk = search_schedtsk();
431 if (p_runtsk->raster && p_runtsk->enater) {
432#ifdef TOPPERS_SUPPORT_OVRHDR
433 if (p_runtsk->staovr) {
434 (void) target_ovrtimer_stop();
435 ovrtimer_flag = false;
436 }
437#endif /* TOPPERS_SUPPORT_OVRHDR */
438 task_terminate(p_runtsk);
439 exit_and_dispatch();
440 ercd = E_SYS;
441 }
442 else {
443 if (p_runtsk != p_schedtsk) {
444 dispatch();
445 }
446 ercd = E_OK;
447 }
448 }
449 else {
450 ercd = E_OK;
451 }
452 unlock_cpu();
453
454 error_exit:
455 LOG_ENA_DSP_LEAVE(ercd);
456 return(ercd);
457}
458
459#endif /* TOPPERS_ena_dsp */
460
461/*
462 * コンテキストの参ç…
463§
464 */
465#ifdef TOPPERS_sns_ctx
466
467bool_t
468sns_ctx(void)
469{
470 bool_t state;
471
472 LOG_SNS_CTX_ENTER();
473 state = sense_context() ? true : false;
474 LOG_SNS_CTX_LEAVE(state);
475 return(state);
476}
477
478#endif /* TOPPERS_sns_ctx */
479
480/*
481 * CPUロック状æ…
482‹ã®å‚ç…
483§
484 */
485#ifdef TOPPERS_sns_loc
486
487bool_t
488sns_loc(void)
489{
490 bool_t state;
491
492 LOG_SNS_LOC_ENTER();
493 state = sense_lock() ? true : false;
494 LOG_SNS_LOC_LEAVE(state);
495 return(state);
496}
497
498#endif /* TOPPERS_sns_loc */
499
500/*
501 * ディスパッチ禁止状æ…
502‹ã®å‚ç…
503§
504 */
505#ifdef TOPPERS_sns_dsp
506
507bool_t
508sns_dsp(void)
509{
510 bool_t state;
511
512 LOG_SNS_DSP_ENTER();
513 state = !enadsp;
514 LOG_SNS_DSP_LEAVE(state);
515 return(state);
516}
517
518#endif /* TOPPERS_sns_dsp */
519
520/*
521 * ディスパッチ保留状æ…
522‹ã®å‚ç…
523§
524 */
525#ifdef TOPPERS_sns_dpn
526
527bool_t
528sns_dpn(void)
529{
530 bool_t state;
531
532 LOG_SNS_DPN_ENTER();
533 state = (sense_context() || sense_lock() || !dspflg) ? true : false;
534 LOG_SNS_DPN_LEAVE(state);
535 return(state);
536}
537
538#endif /* TOPPERS_sns_dpn */
539
540/*
541 * カーネル非動作状æ…
542‹ã®å‚ç…
543§
544 */
545#ifdef TOPPERS_sns_ker
546
547bool_t
548sns_ker(void)
549{
550 bool_t state;
551
552 LOG_SNS_KER_ENTER();
553 state = kerflg ? false : true;
554 LOG_SNS_KER_LEAVE(state);
555 return(state);
556}
557
558#endif /* TOPPERS_sns_ker */
Note: See TracBrowser for help on using the repository browser.