source: EcnlProtoTool/trunk/asp3_dcre/kernel/startup.c@ 429

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

ASP3, TINET, mbed を更新

  • Property svn:eol-style set to native
  • Property svn:mime-type set to text/x-csrc;charset=UTF-8
File size: 6.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-2018 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 "time_event.h"
49#include <sil.h>
50
51/*
52 * トレースログマクロのデフォルト定義
53 */
54#ifndef LOG_KER_ENTER
55#define LOG_KER_ENTER()
56#endif /* LOG_KER_ENTER */
57
58#ifndef LOG_KER_LEAVE
59#define LOG_KER_LEAVE()
60#endif /* LOG_KER_LEAVE */
61
62#ifndef LOG_EXT_KER_ENTER
63#define LOG_EXT_KER_ENTER()
64#endif /* LOG_EXT_KER_ENTER */
65
66#ifndef LOG_EXT_KER_LEAVE
67#define LOG_EXT_KER_LEAVE(ercd)
68#endif /* LOG_EXT_KER_LEAVE */
69
70#ifdef TOPPERS_sta_ker
71
72/*
73 * カーネル動作状態フラグ
74 *
75 * スタートアップルーチンで,false(=0)に初期化されることを期待して
76 * いる.
77 */
78bool_t kerflg = false;
79
80/*
81 * カーネルメモリプール領域有効フラグ
82 */
83bool_t mpk_valid;
84
85/*
86 * カーネルの起動
87 */
88void
89sta_ker(void)
90{
91 uint_t i;
92
93 /*
94 * TECSの初期化
95 */
96#ifndef TOPPERS_OMIT_TECS
97 initialize_tecs();
98#endif /* TOPPERS_OMIT_TECS */
99
100 /*
101 * ターゲット依存の初期化
102 */
103 target_initialize();
104
105 /*
106 * 各モジュールの初期化
107 *
108 * タイムイベント管理モジュールは他のモジュールより先に初期化
109 * する必要がある.
110 */
111 if (mpk != NULL) {
112 mpk_valid = initialize_mempool(mpk, mpksz);
113 }
114 else {
115 mpk_valid = false;
116 }
117 initialize_tmevt(); /*[ASPD1061]*/
118 initialize_object();
119
120 /*
121 * 初期化ルーチンの実行
122 */
123 for (i = 0; i < tnum_inirtn; i++) {
124 (*(inirtnb_table[i].inirtn))(inirtnb_table[i].exinf);
125 }
126
127 /*
128 * 高分解能タイマの設定
129 */
130 current_hrtcnt = target_hrt_get_current(); /*[ASPD1063]*/
131 set_hrt_event(); /*[ASPD1064]*/
132
133 /*
134 * カーネル動作の開始
135 */
136 kerflg = true;
137 LOG_KER_ENTER();
138 start_dispatch();
139 assert(0);
140}
141
142#endif /* TOPPERS_sta_ker */
143
144/*
145 * カーネルの終了
146 */
147#ifdef TOPPERS_ext_ker
148
149ER
150ext_ker(void)
151{
152 SIL_PRE_LOC;
153
154 LOG_EXT_KER_ENTER();
155
156 /*
157 * 割込みロック状態に移行
158 */
159 SIL_LOC_INT();
160
161 /*
162 * カーネル動作の終了
163 */
164 LOG_KER_LEAVE();
165 kerflg = false;
166
167 /*
168 * カーネルの終了処理の呼出し
169 *
170 * 非タスクコンテキストに切り換えて,exit_kernelを呼び出す.
171 */
172 call_exit_kernel();
173
174 /*
175 * コンパイラの警告対策(ここへ来ることはないはず)
176 */
177 SIL_UNL_INT();
178 LOG_EXT_KER_LEAVE(E_SYS);
179 return(E_SYS);
180}
181
182/*
183 * カーネルの終了処理
184 */
185void
186exit_kernel(void)
187{
188 uint_t i;
189
190 /*
191 * 終了処理ルーチンの実行
192 */
193 for (i = 0; i < tnum_terrtn; i++) {
194 (*(terrtnb_table[i].terrtn))(terrtnb_table[i].exinf);
195 }
196
197 /*
198 * ターゲット依存の終了処理
199 */
200 target_exit();
201 assert(0);
202}
203
204#endif /* TOPPERS_ext_ker */
205
206/*
207 * デフォルトのメモリプール管理機能
208 *
209 * メモリプール領域の先頭から順に割り当てを行い,すべてのメモリ領域が
210 * 解放されるまで解放されたメモリ領域を再利用しないメモリプール管理機
211 * 能.
212 */
213#ifdef TOPPERS_kermem
214#ifndef OMIT_MEMPOOL_DEFAULT
215
216typedef struct {
217 void *brk; /* メモリプール領域の未使用領域の先頭番地 */
218 void *limit; /* メモリプール領域の上限 */
219 uint_t count; /* 割り当てたメモリ領域の数 */
220} MEMPOOLCB;
221
222bool_t
223initialize_mempool(MB_T *mempool, size_t size)
224{
225 MEMPOOLCB *p_mempoolcb = ((MEMPOOLCB *) mempool);
226
227 if (size >= sizeof(MEMPOOLCB)) {
228 p_mempoolcb->brk = ((char *) mempool) + sizeof(MEMPOOLCB);
229 p_mempoolcb->limit = ((char *) mempool) + size;
230 p_mempoolcb->count = 0;
231 return(true);
232 }
233 else {
234 return(false);
235 }
236}
237
238void *
239malloc_mempool(MB_T *mempool, size_t size)
240{
241 MEMPOOLCB *p_mempoolcb = ((MEMPOOLCB *) mempool);
242 void *brk;
243
244 brk = ((MEMPOOLCB *) mempool)->brk;
245 if (((char *)(p_mempoolcb->limit)) - ((char *) brk) >= size) {
246 p_mempoolcb->brk = ((char *) brk) + size;
247 p_mempoolcb->count += 1;
248 return(brk);
249 }
250 else {
251 return(NULL);
252 }
253}
254
255void
256free_mempool(MB_T *mempool, void *ptr)
257{
258 MEMPOOLCB *p_mempoolcb = ((MEMPOOLCB *) mempool);
259
260 p_mempoolcb->count -= 1;
261 if (p_mempoolcb->count == 0) {
262 p_mempoolcb->brk = ((char *) mempool) + sizeof(MEMPOOLCB);
263 }
264}
265
266#endif /* OMIT_MEMPOOL_DEFAULT */
267#endif /* TOPPERS_kermem */
Note: See TracBrowser for help on using the repository browser.