source: asp3_wo_tecs/trunk/extension/rstr_task/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
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 QUEUE *p_queue;
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 p_queue = &(ready_queue[pri]);
199 if (queue_empty(p_queue)) {
200 ercd = E_OK;
201 }
202 else if ((((TCB *)(p_queue->p_next))->p_tinib->tskatr & TA_RSTR) != 0U) {
203 ercd = E_NOSPT;
204 }
205 else {
206 rotate_ready_queue(&(ready_queue[pri]));
207 if (p_runtsk != p_schedtsk) {
208 if (!sense_context()) {
209 dispatch();
210 }
211 else {
212 request_dispatch();
213 }
214 }
215 ercd = E_OK;
216 }
217 unlock_cpu();
218
219 error_exit:
220 LOG_ROT_RDQ_LEAVE(ercd);
221 return(ercd);
222}
223
224#endif /* TOPPERS_rot_rdq */
225
226/*
227 * 実行状æ…
228‹ã®ã‚¿ã‚¹ã‚¯IDの参ç…
229§
230 */
231#ifdef TOPPERS_get_tid
232
233ER
234get_tid(ID *p_tskid)
235{
236 ER ercd;
237
238 LOG_GET_TID_ENTER(p_tskid);
239 CHECK_UNL();
240
241 lock_cpu();
242 *p_tskid = (p_runtsk == NULL) ? TSK_NONE : TSKID(p_runtsk);
243 ercd = E_OK;
244 unlock_cpu();
245
246 error_exit:
247 LOG_GET_TID_LEAVE(ercd, p_tskid);
248 return(ercd);
249}
250
251#endif /* TOPPERS_get_tid */
252
253/*
254 * 実行できるタスクの数の参ç…
255§
256 */
257#ifdef TOPPERS_get_lod
258
259ER
260get_lod(PRI tskpri, uint_t *p_load)
261{
262 uint_t pri, load;
263 QUEUE *p_queue, *p_entry;
264 ER ercd;
265
266 LOG_GET_LOD_ENTER(p_tskid, p_load);
267 CHECK_TSKCTX_UNL();
268 if (tskpri == TPRI_SELF) {
269 pri = p_runtsk->bpriority;
270 }
271 else {
272 CHECK_PAR(VALID_TPRI(tskpri));
273 pri = INT_PRIORITY(tskpri);
274 }
275 p_queue = &(ready_queue[pri]);
276
277 lock_cpu();
278 load = 0U;
279 for (p_entry = p_queue->p_next; p_entry != p_queue;
280 p_entry = p_entry->p_next) {
281 load += 1U;
282 }
283 *p_load = load;
284 ercd = E_OK;
285 unlock_cpu();
286
287 error_exit:
288 LOG_GET_LOD_LEAVE(ercd, p_load);
289 return(ercd);
290}
291
292#endif /* TOPPERS_get_lod */
293
294/*
295 * 指定した優å…
296ˆé †ä½ã®ã‚¿ã‚¹ã‚¯IDの参ç…
297§
298 */
299#ifdef TOPPERS_get_nth
300
301ER
302get_nth(PRI tskpri, uint_t nth, ID *p_tskid)
303{
304 uint_t pri;
305 QUEUE *p_queue, *p_entry;
306 ID tskid;
307 ER ercd;
308
309 LOG_GET_NTH_ENTER(p_tskid, nth, p_tskid);
310 CHECK_TSKCTX_UNL();
311 if (tskpri == TPRI_SELF) {
312 pri = p_runtsk->bpriority;
313 }
314 else {
315 CHECK_PAR(VALID_TPRI(tskpri));
316 pri = INT_PRIORITY(tskpri);
317 }
318 p_queue = &(ready_queue[pri]);
319
320 lock_cpu();
321 tskid = TSK_NONE;
322 for (p_entry = p_queue->p_next; p_entry != p_queue;
323 p_entry = p_entry->p_next) {
324 if (nth == 0U) {
325 tskid = TSKID((TCB *) p_entry);
326 break;
327 }
328 nth -= 1U;
329 }
330 *p_tskid = tskid;
331 ercd = E_OK;
332 unlock_cpu();
333
334 error_exit:
335 LOG_GET_NTH_LEAVE(ercd, p_tskid);
336 return(ercd);
337}
338
339#endif /* TOPPERS_get_nth */
340
341/*
342 * CPUロック状æ…
343‹ã¸ã®é·ç§»
344 */
345#ifdef TOPPERS_loc_cpu
346
347ER
348loc_cpu(void)
349{
350 ER ercd;
351
352 LOG_LOC_CPU_ENTER();
353
354 if (!sense_lock()) {
355 lock_cpu();
356 }
357 ercd = E_OK;
358
359 LOG_LOC_CPU_LEAVE(ercd);
360 return(ercd);
361}
362
363#endif /* TOPPERS_loc_cpu */
364
365/*
366 * CPUロック状æ…
367‹ã®è§£é™¤
368 *
369 * CPUロック中は,ディスパッチが必
370要となるサービスコールを呼び出すこ
371 * とはできないため,CPUロック状æ…
372‹ã®è§£é™¤æ™‚にディスパッチャを起動する
373 * 必
374要はない.
375 */
376#ifdef TOPPERS_unl_cpu
377
378ER
379unl_cpu(void)
380{
381 ER ercd;
382
383 LOG_UNL_CPU_ENTER();
384
385 if (sense_lock()) {
386 unlock_cpu();
387 }
388 ercd = E_OK;
389
390 LOG_UNL_CPU_LEAVE(ercd);
391 return(ercd);
392}
393
394#endif /* TOPPERS_unl_cpu */
395
396/*
397 * ディスパッチの禁止
398 */
399#ifdef TOPPERS_dis_dsp
400
401ER
402dis_dsp(void)
403{
404 ER ercd;
405
406 LOG_DIS_DSP_ENTER();
407 CHECK_TSKCTX_UNL();
408
409 lock_cpu();
410 enadsp = false;
411 dspflg = false;
412 ercd = E_OK;
413 unlock_cpu();
414
415 error_exit:
416 LOG_DIS_DSP_LEAVE(ercd);
417 return(ercd);
418}
419
420#endif /* TOPPERS_dis_dsp */
421
422/*
423 * ディスパッチの許可
424 */
425#ifdef TOPPERS_ena_dsp
426
427ER
428ena_dsp(void)
429{
430 ER ercd;
431
432 LOG_ENA_DSP_ENTER();
433 CHECK_TSKCTX_UNL();
434
435 lock_cpu();
436 enadsp = true;
437 if (t_get_ipm() == TIPM_ENAALL) {
438 dspflg = true;
439 p_schedtsk = search_schedtsk();
440 if (p_runtsk->raster && p_runtsk->enater) {
441 task_terminate(p_runtsk);
442 exit_and_dispatch();
443 ercd = E_SYS;
444 }
445 else {
446 if (p_runtsk != p_schedtsk) {
447 dispatch();
448 }
449 ercd = E_OK;
450 }
451 }
452 else {
453 ercd = E_OK;
454 }
455 unlock_cpu();
456
457 error_exit:
458 LOG_ENA_DSP_LEAVE(ercd);
459 return(ercd);
460}
461
462#endif /* TOPPERS_ena_dsp */
463
464/*
465 * コンテキストの参ç…
466§
467 */
468#ifdef TOPPERS_sns_ctx
469
470bool_t
471sns_ctx(void)
472{
473 bool_t state;
474
475 LOG_SNS_CTX_ENTER();
476 state = sense_context() ? true : false;
477 LOG_SNS_CTX_LEAVE(state);
478 return(state);
479}
480
481#endif /* TOPPERS_sns_ctx */
482
483/*
484 * CPUロック状æ…
485‹ã®å‚ç…
486§
487 */
488#ifdef TOPPERS_sns_loc
489
490bool_t
491sns_loc(void)
492{
493 bool_t state;
494
495 LOG_SNS_LOC_ENTER();
496 state = sense_lock() ? true : false;
497 LOG_SNS_LOC_LEAVE(state);
498 return(state);
499}
500
501#endif /* TOPPERS_sns_loc */
502
503/*
504 * ディスパッチ禁止状æ…
505‹ã®å‚ç…
506§
507 */
508#ifdef TOPPERS_sns_dsp
509
510bool_t
511sns_dsp(void)
512{
513 bool_t state;
514
515 LOG_SNS_DSP_ENTER();
516 state = !enadsp;
517 LOG_SNS_DSP_LEAVE(state);
518 return(state);
519}
520
521#endif /* TOPPERS_sns_dsp */
522
523/*
524 * ディスパッチ保留状æ…
525‹ã®å‚ç…
526§
527 */
528#ifdef TOPPERS_sns_dpn
529
530bool_t
531sns_dpn(void)
532{
533 bool_t state;
534
535 LOG_SNS_DPN_ENTER();
536 state = (sense_context() || sense_lock() || !dspflg) ? true : false;
537 LOG_SNS_DPN_LEAVE(state);
538 return(state);
539}
540
541#endif /* TOPPERS_sns_dpn */
542
543/*
544 * カーネル非動作状æ…
545‹ã®å‚ç…
546§
547 */
548#ifdef TOPPERS_sns_ker
549
550bool_t
551sns_ker(void)
552{
553 bool_t state;
554
555 LOG_SNS_KER_ENTER();
556 state = kerflg ? false : true;
557 LOG_SNS_KER_LEAVE(state);
558 return(state);
559}
560
561#endif /* TOPPERS_sns_ker */
Note: See TracBrowser for help on using the repository browser.