source: asp3_wo_tecs/trunk/kernel/kernel.tf@ 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: 12.5 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) 2007 by TAKAGI Nobuhisa
7$ Copyright (C) 2007-2015 by Embedded and Real-Time Systems Laboratory
8$ Graduate School of Information Science, Nagoya Univ., JAPAN
9$
10$ 上記著作権者
11は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
12$ ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
13$ 変・再é…
14å¸ƒï¼ˆä»¥ä¸‹ï¼Œåˆ©ç”¨ã¨å‘¼ã¶ï¼‰ã™ã‚‹ã“とを無償で許諾する.
15$ (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
16$ 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
17$ スコード中に含まれていること.
18$ (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
19$ 用できる形で再é…
20å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œå†é…
21å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨
22$ 者
23マニュアルなど)に,上記の著作権表示,この利用条件および下記
24$ の無保証規定を掲載すること.
25$ (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
26$ 用できない形で再é…
27å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œæ¬¡ã®ã„ずれかの条件を満たすこ
28$ と.
29$ (a) 再é…
30å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨è€…
31マニュアルなど)に,上記の著
32$ 作権表示,この利用条件および下記の無保証規定を掲載すること.
33$ (b) 再é…
34å¸ƒã®å½¢æ…
35‹ã‚’,別に定める方法によって,TOPPERSプロジェクトに
36$ 報告すること.
37$ (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
38$ 害からも,上記著作権者
39およびTOPPERSプロジェクトをå…
40è²¬ã™ã‚‹ã“と.
41$ また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
42$ 由に基づく請求からも,上記著作権者
43およびTOPPERSプロジェクトを
44$ å…
45è²¬ã™ã‚‹ã“と.
46$
47$ 本ソフトウェアは,無保証で提供されているものである.上記著作権者
48お
49$ よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
50$ に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
51$ アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
52$ の責任を負わない.
53$
54$ $Id: kernel.tf 480 2016-01-03 07:37:12Z ertl-hiro $
55$
56
57$
58$ コンフィギュレータのパス2のテンプレートファイル
59$
60
61$
62$ タイムスタンプファイルの生成
63$
64$FILE "kernel_cfg.timestamp"$
65
66$
67$ kernel_cfg.hのå…
68ˆé ­éƒ¨åˆ†ã®ç”Ÿæˆ
69$
70$FILE "kernel_cfg.h.new"$
71
72/* kernel_cfg.h */$NL$
73#ifndef TOPPERS_KERNEL_CFG_H$NL$
74#define TOPPERS_KERNEL_CFG_H$NL$
75
76$
77$ kernel_cfg.cのå…
78ˆé ­éƒ¨åˆ†ã®ç”Ÿæˆ
79$
80$FILE "kernel_cfg.c"$
81
82/* kernel_cfg.c */$NL$
83#include "kernel/kernel_int.h"$NL$
84#include "kernel_cfg.h"$NL$
85$NL$
86
87#if !(TKERNEL_PRID == 0x0007U && (TKERNEL_PRVER & 0xf000U) == 0x3000U)$NL$
88#error The kernel does not match this configuration file.$NL$
89#endif$NL$
90$NL$
91
92$
93$ インクルードディレクティブ(#include)
94$
95/*$NL$
96$SPC$* Include Directives (#include)$NL$
97$SPC$*/$NL$
98$NL$
99$INCLUDES$
100$NL$
101
102$
103$ スタック領域の確保関数
104$
105$IF !ISFUNCTION("ALLOC_STACK")$
106$FUNCTION ALLOC_STACK$
107$ // 大きい方に丸めたサイズで確保する[NGKI1050][NGKI3220]
108 static STK_T $ARGV[1]$[COUNT_STK_T($ARGV[2]$)];$NL$
109 $RESULT = FORMAT("ROUND_STK_T(%1%)", ARGV[2])$
110$END$
111$END$
112
113$
114$ 通知ハンドラの生成関数
115$
116$FUNCTION GENERATE_NFYHDR$
117$ // パラメータを変数に格納
118 $nfymode = ARGV[1]$
119 $nfymode1 = nfymode & 0x0f$
120 $nfymode2 = nfymode & ~0x0f$
121 $par1 = ARGV[2]$
122 $par2 = ARGV[3]$
123 $text_line = ARGV[6]$
124 $objid = ARGV[7]$
125 $apiname = ARGV[8]$
126
127$ // 通知処理のパラメータ数による補正処理
128 $IF nfymode == TNFY_HANDLER || nfymode1 == TNFY_SETVAR
129 || nfymode1 == TNFY_SETFLG
130 || nfymode1 == TNFY_SNDDTQ$
131$ // 通知処理のパラメータが2つの場合
132 $numpar = 2$
133 $epar1 = ARGV[4]$
134 $epar2 = ARGV[5]$
135 $ELSE$
136$ // 通知処理のパラメータが1つの場合
137 $numpar = 1$
138 $epar1 = ARGV[3]$
139 $epar2 = ARGV[4]$
140 $END$
141
142$ // パラメータ数のチェック
143 $IF (numpar == 2 && !LENGTH(par2))
144 || (nfymode2 != 0 && !LENGTH(epar1))
145 || (nfymode2 == TENFY_SETFLG && !LENGTH(epar2))$
146$ // パラメータが足りない場合
147 $ERROR text_line$
148 $FORMAT(_("too few parameters for %1% `%2%\' of `%3%\' in %4%"),
149 "nfymode", nfymode, objid, apiname)$
150 $END$
151 $ELIF (nfymode2 == 0 && LENGTH(epar1))
152 || (nfymode2 != TENFY_SETFLG && LENGTH(epar2))$
153$ // パラメータが多すぎる場合
154 $ERROR text_line$
155 $FORMAT(_("too many parameters for %1% `%2%\' of `%3%\' in %4%"),
156 "nfymode", nfymode, objid, apiname)$
157 $END$
158 $ELIF nfymode == TNFY_HANDLER$
159$ // タイムイベントハンドラの呼出し
160 $funcname = FORMAT("(NFYHDR)(%s)", par2)$
161 $ELSE$
162$ // 通知ハンドラの関数名
163 $funcname = CONCAT("_kernel_nfyhdr_", objid)$
164
165$ // エラー通知のための変数のアドレスとオブジェクトIDを格納する
166$ // 変数の生成(エラーチェックのために必
167要)
168 $IF nfymode2 == TENFY_SETVAR || nfymode2 == TENFY_INCVAR$
169 intptr_t *const $funcname$_p_evar =
170 $SPC$(intptr_t *)($epar1$);$NL$$NL$
171 $ELIF nfymode2 == TENFY_ACTTSK || nfymode2 == TENFY_WUPTSK$
172 const ID $funcname$_etskid = $epar1$;$NL$$NL$
173 $ELIF nfymode2 == TENFY_SIGSEM$
174 const ID $funcname$_esemid = $epar1$;$NL$$NL$
175 $ELIF nfymode2 == TENFY_SETFLG$
176 const ID $funcname$_eflgid = $epar1$;$NL$$NL$
177 $ELIF nfymode2 == TENFY_SNDDTQ$
178 const ID $funcname$_edtqid = $epar1$;$NL$$NL$
179 $END$
180
181$ // 関数のå…
182ˆé ­éƒ¨åˆ†ã®ç”Ÿæˆ
183 static void$NL$
184 $funcname$(intptr_t exinf)$NL$
185 {$NL$
186
187 $IF nfymode2 == 0$
188$ // エラー通知がない場合
189 $error_code = "(void) "$
190 $ELSE$
191$ // エラー通知がある場合
192 $TAB$ER ercd;$NL$
193 $NL$
194 $error_code = "ercd = "$
195 $END$
196
197$ // イベント通知処理の処理
198 $IF nfymode1 == TNFY_SETVAR && nfymode2 == 0$
199$ // 変数の設定
200 $TAB$*((intptr_t *) exinf) = ($par2$);$NL$
201 $ELIF nfymode1 == TNFY_INCVAR && nfymode2 == 0$
202$ // 変数のインクリメント
203 $TAB$*((intptr_t *) exinf) += 1;$NL$
204 $ELIF nfymode1 == TNFY_ACTTSK$
205$ // タスクの起動
206 $TAB$$error_code$act_tsk((ID) exinf);$NL$
207 $ELIF nfymode1 == TNFY_WUPTSK$
208$ // タスクの起床
209 $TAB$$error_code$wup_tsk((ID) exinf);$NL$
210 $ELIF nfymode1 == TNFY_SIGSEM$
211$ // セマフォの返却
212 $TAB$$error_code$sig_sem((ID) exinf);$NL$
213 $ELIF nfymode1 == TNFY_SETFLG$
214$ // イベントフラグのセット
215 $TAB$$error_code$set_flg(((ID) exinf), $par2$);$NL$
216 $ELIF nfymode1 == TNFY_SNDDTQ$
217$ // データキューへの送信
218 $TAB$$error_code$psnd_dtq(((ID) exinf), $par2$);$NL$
219 $ELSE$
220 $ERROR text_line$E_PAR:$SPC$
221 $FORMAT(_("illegal %1% `%2%\' of `%3%\' in %4%"),
222 "nfymode", nfymode, objid, apiname)$
223 $END$
224 $END$
225
226 $IF nfymode2 != 0$
227$ // エラー通知処理の処理
228 $TAB$if (ercd != E_OK) {$NL$
229
230 $IF nfymode2 == TENFY_SETVAR$
231$ // 変数の設定
232 $TAB$$TAB$*$funcname$_p_evar = (intptr_t) ercd;$NL$
233 $ELIF nfymode2 == TENFY_INCVAR$
234$ // 変数のインクリメント
235 $TAB$$TAB$*$funcname$_p_evar += 1;$NL$
236 $ELIF nfymode2 == TENFY_ACTTSK$
237$ // タスクの起動
238 $TAB$$TAB$(void) act_tsk($funcname$_etskid);$NL$
239 $ELIF nfymode2 == TENFY_WUPTSK$
240$ // タスクの起床
241 $TAB$$TAB$(void) wup_tsk($funcname$_etskid);$NL$
242 $ELIF nfymode2 == TENFY_SIGSEM$
243$ // セマフォの返却
244 $TAB$$TAB$(void) sig_sem($funcname$_esemid);$NL$
245 $ELIF nfymode2 == TENFY_SETFLG$
246$ // イベントフラグのセット
247 $TAB$$TAB$(void) set_flg($funcname$_eflgid, $epar2$);$NL$
248 $ELIF nfymode2 == TENFY_SNDDTQ$
249$ // データキューへの送信
250 $TAB$$TAB$(void) psnd_dtq
251 ($funcname$_edtqid, (intptr_t) ercd);$NL$
252 $ELSE$
253 $ERROR text_line$E_PAR:$SPC$
254 $FORMAT(_("illegal %1% `%2%\' of `%3%\' in %4%"),
255 "nfymode", nfymode, objid, apiname)$
256 $END$
257 $END$
258
259 $TAB$}$NL$
260 $END$
261
262$ // 関数の末尾部分の生成
263 }$NL$
264 $NL$
265 $END$
266 $RESULT = funcname$
267$END$
268
269$
270$ 各機能モジュールのコンフィギュレーション
271$
272$INCLUDE "kernel/task.tf"$
273$INCLUDE "kernel/semaphore.tf"$
274$INCLUDE "kernel/eventflag.tf"$
275$INCLUDE "kernel/dataqueue.tf"$
276$INCLUDE "kernel/pridataq.tf"$
277$INCLUDE "kernel/mutex.tf"$
278$INCLUDE "kernel/mempfix.tf"$
279$INCLUDE "kernel/cyclic.tf"$
280$INCLUDE "kernel/alarm.tf"$
281$INCLUDE "kernel/interrupt.tf"$
282$INCLUDE "kernel/exception.tf"$
283
284$
285$ 非タスクコンテキスト用のスタック領域
286$
287/*$NL$
288$SPC$* Stack Area for Non-task Context$NL$
289$SPC$*/$NL$
290$NL$
291
292$IF !LENGTH(ICS.ORDER_LIST)$
293$ // DEF_ICSがない場合のデフォルト値の設定
294 #ifdef DEFAULT_ISTK$NL$
295 $NL$
296 #define TOPPERS_ISTKSZ DEFAULT_ISTKSZ$NL$
297 #define TOPPERS_ISTK DEFAULT_ISTK$NL$
298 $NL$
299 #else /* DEAULT_ISTK */$NL$
300 $NL$
301 $istksz = ALLOC_STACK("_kernel_istack", "DEFAULT_ISTKSZ")$$NL$
302 #define TOPPERS_ISTKSZ $istksz$$NL$
303 #define TOPPERS_ISTK _kernel_istack$NL$
304 $NL$
305 #endif /* DEAULT_ISTK */$NL$
306$ELSE$
307
308$ // 静的API「DEF_ICS」が複数ある(E_OBJ)[NGKI3216]
309 $IF LENGTH(ICS.ORDER_LIST) > 1$
310 $ERROR$E_OBJ: $FORMAT(_("too many %1%"), "DEF_ICS")$$END$
311 $END$
312
313$ // istkszが0以下か,ターゲット定義の最小値(TARGET_MIN_ISTKSZ)よりも
314$ // 小さい場合(E_PAR)[NGKI3254]
315 $IF ICS.ISTKSZ[1] <= 0 || (TARGET_MIN_ISTKSZ
316 && ICS.ISTKSZ[1] < TARGET_MIN_ISTKSZ)$
317 $ERROR ICS.TEXT_LINE[1]$E_PAR:$SPC$
318 $FORMAT(_("too small %1% `%2%\' in %3%"),
319 "istksz", ICS.ISTKSZ[1], "DEF_ICS")$
320 $END$
321 $END$
322
323$ // istkszがスタック領域のサイズとして正しくない場合(E_PAR)[NGKI3222]
324 $IF !EQ(ICS.ISTK[1], "NULL") && CHECK_STKSZ_ALIGN
325 && (ICS.ISTKSZ[1] & (CHECK_STKSZ_ALIGN - 1))$
326 $ERROR ICS.TEXT_LINE[1]$E_PAR:$SPC$
327 $FORMAT(_("%1% `%2%\' in %3% is not aligned"),
328 "istksz", ICS.ISTKSZ[1], "DEF_ICS")$
329 $END$
330 $END$
331
332 $IF EQ(ICS.ISTK[1], "NULL")$
333$ // スタック領域の自動割付け
334 $istksz = ALLOC_STACK("_kernel_istack", ICS.ISTKSZ[1])$$NL$
335 #define TOPPERS_ISTKSZ $istksz$$NL$
336 #define TOPPERS_ISTK _kernel_istack$NL$
337 $ELSE$
338 #define TOPPERS_ISTKSZ ($ICS.ISTKSZ[1]$)$NL$
339 #define TOPPERS_ISTK (void *)($ICS.ISTK[1]$)$NL$
340 $END$
341$END$
342$NL$
343
344$ 非タスクコンテキスト用のスタック領域
345const size_t _kernel_istksz = TOPPERS_ISTKSZ;$NL$
346STK_T *const _kernel_istk = TOPPERS_ISTK;$NL$
347$NL$
348#ifdef TOPPERS_ISTKPT$NL$
349STK_T *const _kernel_istkpt = TOPPERS_ISTKPT(TOPPERS_ISTK, TOPPERS_ISTKSZ);$NL$
350#endif /* TOPPERS_ISTKPT */$NL$
351$NL$
352
353$
354$ タイムイベント管理
355$
356/*$NL$
357$SPC$* Time Event Management$NL$
358$SPC$*/$NL$
359$NL$
360TMEVTN _kernel_tmevt_heap[1 + TNUM_TSKID + TNUM_CYCID + TNUM_ALMID];$NL$
361$NL$
362
363$
364$ 各モジュールの初期化関数
365$
366/*$NL$
367$SPC$* Module Initialization Function$NL$
368$SPC$*/$NL$
369$NL$
370void$NL$
371_kernel_initialize_object(void)$NL$
372{$NL$
373$FOREACH func (initfuncs)$
374 $TAB$$func$$NL$
375$END$
376}$NL$
377$NL$
378
379$
380$ 初期化ルーチンの実行関数
381$
382/*$NL$
383$SPC$* Initialization Routine$NL$
384$SPC$*/$NL$
385$NL$
386void$NL$
387_kernel_call_inirtn(void)$NL$
388{$NL$
389$FOREACH order INI.ORDER_LIST$
390$ // iniatrが無効の場合(E_RSATR)[NGKI3241]
391$ //(TA_NULLでない場合)
392 $IF INI.INIATR[order] != 0$
393 $ERROR INI.TEXT_LINE[order]$E_RSATR:$SPC$
394 $FORMAT(_("illegal %1% `%2%\' of %3% `%4%\' in %5%"),
395 "iniatr", INI.INIATR[order], "inirtn",
396 INI.INIRTN[order], "ATT_INI")$
397 $END$
398 $END$
399 $TAB$((INIRTN)($INI.INIRTN[order]$))((intptr_t)($INI.EXINF[order]$));$NL$
400$END$
401}$NL$
402$NL$
403
404$
405$ 終了処理ルーチンの実行関数
406$
407/*$NL$
408$SPC$* Termination Routine$NL$
409$SPC$*/$NL$
410$NL$
411void$NL$
412_kernel_call_terrtn(void)$NL$
413{$NL$
414$FOREACH rorder TER.RORDER_LIST$
415$ // teratrが無効の場合(E_RSATR)[NGKI3248]
416$ //(TA_NULLでない場合)
417 $IF TER.TERATR[rorder] != 0$
418 $ERROR TER.TEXT_LINE[rorder]$E_RSATR:$SPC$
419 $FORMAT(_("illegal %1% `%2%\' of %3% `%4%\' in %5%"),
420 "teratr", TER.TERATR[rorder], "terrtn",
421 TER.TERRTN[rorder], "ATT_TER")$
422 $END$
423 $END$
424 $TAB$((TERRTN)($TER.TERRTN[rorder]$))((intptr_t)($TER.EXINF[rorder]$));$NL$
425$END$
426}$NL$
427$NL$
428
429$
430$ kernel_cfg.hの末尾部分の生成
431$
432$FILE "kernel_cfg.h.new"$
433
434#endif /* TOPPERS_KERNEL_CFG_H */$NL$
Note: See TracBrowser for help on using the repository browser.