source: azure_iot_hub/trunk/asp3_dcre/kernel/sys_manage.c@ 389

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

ビルドが通るよう更新

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