source: asp3_wo_tecs/trunk/extension/subprio/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.4 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
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ˆé †ä½ã®å›žè»¢
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();
188 if (tskpri == TPRI_SELF && !sense_context()) {
189 pri = p_runtsk->bpriority;
190 }
191 else {
192 CHECK_PAR(VALID_TPRI(tskpri));
193 pri = INT_PRIORITY(tskpri);
194 }
195 CHECK_ILUSE((subprio_primap & PRIMAP_BIT(pri)) == 0U);
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 task_terminate(p_runtsk);
433 exit_and_dispatch();
434 ercd = E_SYS;
435 }
436 else {
437 if (p_runtsk != p_schedtsk) {
438 dispatch();
439 }
440 ercd = E_OK;
441 }
442 }
443 else {
444 ercd = E_OK;
445 }
446 unlock_cpu();
447
448 error_exit:
449 LOG_ENA_DSP_LEAVE(ercd);
450 return(ercd);
451}
452
453#endif /* TOPPERS_ena_dsp */
454
455/*
456 * コンテキストの参ç…
457§
458 */
459#ifdef TOPPERS_sns_ctx
460
461bool_t
462sns_ctx(void)
463{
464 bool_t state;
465
466 LOG_SNS_CTX_ENTER();
467 state = sense_context() ? true : false;
468 LOG_SNS_CTX_LEAVE(state);
469 return(state);
470}
471
472#endif /* TOPPERS_sns_ctx */
473
474/*
475 * CPUロック状æ…
476‹ã®å‚ç…
477§
478 */
479#ifdef TOPPERS_sns_loc
480
481bool_t
482sns_loc(void)
483{
484 bool_t state;
485
486 LOG_SNS_LOC_ENTER();
487 state = sense_lock() ? true : false;
488 LOG_SNS_LOC_LEAVE(state);
489 return(state);
490}
491
492#endif /* TOPPERS_sns_loc */
493
494/*
495 * ディスパッチ禁止状æ…
496‹ã®å‚ç…
497§
498 */
499#ifdef TOPPERS_sns_dsp
500
501bool_t
502sns_dsp(void)
503{
504 bool_t state;
505
506 LOG_SNS_DSP_ENTER();
507 state = !enadsp;
508 LOG_SNS_DSP_LEAVE(state);
509 return(state);
510}
511
512#endif /* TOPPERS_sns_dsp */
513
514/*
515 * ディスパッチ保留状æ…
516‹ã®å‚ç…
517§
518 */
519#ifdef TOPPERS_sns_dpn
520
521bool_t
522sns_dpn(void)
523{
524 bool_t state;
525
526 LOG_SNS_DPN_ENTER();
527 state = (sense_context() || sense_lock() || !dspflg) ? true : false;
528 LOG_SNS_DPN_LEAVE(state);
529 return(state);
530}
531
532#endif /* TOPPERS_sns_dpn */
533
534/*
535 * カーネル非動作状æ…
536‹ã®å‚ç…
537§
538 */
539#ifdef TOPPERS_sns_ker
540
541bool_t
542sns_ker(void)
543{
544 bool_t state;
545
546 LOG_SNS_KER_ENTER();
547 state = kerflg ? false : true;
548 LOG_SNS_KER_LEAVE(state);
549 return(state);
550}
551
552#endif /* TOPPERS_sns_ker */
Note: See TracBrowser for help on using the repository browser.