source: asp3_wo_tecs/trunk/extension/dcre/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: 14.0 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$ kernel_cfg.hのå…
63ˆé ­éƒ¨åˆ†ã®ç”Ÿæˆ
64$
65$FILE "kernel_cfg.h.new"$
66
67/* kernel_cfg.h */$NL$
68#ifndef TOPPERS_KERNEL_CFG_H$NL$
69#define TOPPERS_KERNEL_CFG_H$NL$
70
71$
72$ kernel_cfg.cのå…
73ˆé ­éƒ¨åˆ†ã®ç”Ÿæˆ
74$
75$FILE "kernel_cfg.c"$
76
77/* kernel_cfg.c */$NL$
78#include "kernel/kernel_int.h"$NL$
79#include "kernel_cfg.h"$NL$
80$NL$
81
82#if !(TKERNEL_PRID == 0x0007U && (TKERNEL_PRVER & 0xf000U) == 0x3000U)$NL$
83#error The kernel does not match this configuration file.$NL$
84#endif$NL$
85$NL$
86
87$
88$ インクルードディレクティブ(#include)
89$
90/*$NL$
91$SPC$* Include Directives (#include)$NL$
92$SPC$*/$NL$
93$NL$
94$INCLUDES$
95$NL$
96
97$
98$ スタック領域の確保関数
99$
100$IF !ISFUNCTION("ALLOC_STACK")$
101$FUNCTION ALLOC_STACK$
102$ // 大きい方に丸めたサイズで確保する[NGKI1050][NGKI3220]
103 static STK_T $ARGV[1]$[COUNT_STK_T($ARGV[2]$)];$NL$
104 $RESULT = FORMAT("ROUND_STK_T(%1%)", ARGV[2])$
105$END$
106$END$
107
108$
109$ 通知ハンドラの生成関数
110$
111$FUNCTION GENERATE_NFYHDR$
112$ // パラメータを変数に格納
113 $nfymode = ARGV[1]$
114 $nfymode1 = nfymode & 0x0f$
115 $nfymode2 = nfymode & ~0x0f$
116 $par1 = ARGV[2]$
117 $par2 = ARGV[3]$
118 $text_line = ARGV[6]$
119 $objid = ARGV[7]$
120 $apiname = ARGV[8]$
121
122$ // 通知処理のパラメータ数による補正処理
123 $IF nfymode == TNFY_HANDLER || nfymode1 == TNFY_SETVAR
124 || nfymode1 == TNFY_SETFLG
125 || nfymode1 == TNFY_SNDDTQ$
126$ // 通知処理のパラメータが2つの場合
127 $numpar = 2$
128 $epar1 = ARGV[4]$
129 $epar2 = ARGV[5]$
130 $ELSE$
131$ // 通知処理のパラメータが1つの場合
132 $numpar = 1$
133 $epar1 = ARGV[3]$
134 $epar2 = ARGV[4]$
135 $END$
136
137$ // パラメータ数のチェック
138 $IF (numpar == 2 && !LENGTH(par2))
139 || (nfymode2 != 0 && !LENGTH(epar1))
140 || (nfymode2 == TENFY_SETFLG && !LENGTH(epar2))$
141$ // パラメータが足りない場合
142 $ERROR text_line$
143 $FORMAT(_("too few parameters for %1% `%2%\' of `%3%\' in %4%"),
144 "nfymode", nfymode, objid, apiname)$
145 $END$
146 $ELIF (nfymode2 == 0 && LENGTH(epar1))
147 || (nfymode2 != TENFY_SETFLG && LENGTH(epar2))$
148$ // パラメータが多すぎる場合
149 $ERROR text_line$
150 $FORMAT(_("too many parameters for %1% `%2%\' of `%3%\' in %4%"),
151 "nfymode", nfymode, objid, apiname)$
152 $END$
153 $ELIF nfymode == TNFY_HANDLER$
154$ // タイムイベントハンドラの呼出し
155 $funcname = FORMAT("(NFYHDR)(%s)", par2)$
156 $ELSE$
157$ // 通知ハンドラの関数名
158 $funcname = CONCAT("_kernel_nfyhdr_", objid)$
159
160$ // エラー通知のための変数のアドレスとオブジェクトIDを格納する
161$ // 変数の生成(エラーチェックのために必
162要)
163 $IF nfymode2 == TENFY_SETVAR || nfymode2 == TENFY_INCVAR$
164 intptr_t *const $funcname$_p_evar =
165 $SPC$(intptr_t *)($epar1$);$NL$$NL$
166 $ELIF nfymode2 == TENFY_ACTTSK || nfymode2 == TENFY_WUPTSK$
167 const ID $funcname$_etskid = $epar1$;$NL$$NL$
168 $ELIF nfymode2 == TENFY_SIGSEM$
169 const ID $funcname$_esemid = $epar1$;$NL$$NL$
170 $ELIF nfymode2 == TENFY_SETFLG$
171 const ID $funcname$_eflgid = $epar1$;$NL$$NL$
172 $ELIF nfymode2 == TENFY_SNDDTQ$
173 const ID $funcname$_edtqid = $epar1$;$NL$$NL$
174 $END$
175
176$ // 関数のå…
177ˆé ­éƒ¨åˆ†ã®ç”Ÿæˆ
178 static void$NL$
179 $funcname$(intptr_t exinf)$NL$
180 {$NL$
181
182 $IF nfymode2 == 0$
183$ // エラー通知がない場合
184 $error_code = "(void) "$
185 $ELSE$
186$ // エラー通知がある場合
187 $TAB$ER ercd;$NL$
188 $NL$
189 $error_code = "ercd = "$
190 $END$
191
192$ // イベント通知処理の処理
193 $IF nfymode1 == TNFY_SETVAR && nfymode2 == 0$
194$ // 変数の設定
195 $TAB$*((intptr_t *) exinf) = ($par2$);$NL$
196 $ELIF nfymode1 == TNFY_INCVAR && nfymode2 == 0$
197$ // 変数のインクリメント
198 $TAB$*((intptr_t *) exinf) += 1;$NL$
199 $ELIF nfymode1 == TNFY_ACTTSK$
200$ // タスクの起動
201 $TAB$$error_code$act_tsk((ID) exinf);$NL$
202 $ELIF nfymode1 == TNFY_WUPTSK$
203$ // タスクの起床
204 $TAB$$error_code$wup_tsk((ID) exinf);$NL$
205 $ELIF nfymode1 == TNFY_SIGSEM$
206$ // セマフォの返却
207 $TAB$$error_code$sig_sem((ID) exinf);$NL$
208 $ELIF nfymode1 == TNFY_SETFLG$
209$ // イベントフラグのセット
210 $TAB$$error_code$set_flg(((ID) exinf), $par2$);$NL$
211 $ELIF nfymode1 == TNFY_SNDDTQ$
212$ // データキューへの送信
213 $TAB$$error_code$psnd_dtq(((ID) exinf), $par2$);$NL$
214 $ELSE$
215 $ERROR text_line$E_PAR:$SPC$
216 $FORMAT(_("illegal %1% `%2%\' of `%3%\' in %4%"),
217 "nfymode", nfymode, objid, apiname)$
218 $END$
219 $END$
220
221 $IF nfymode2 != 0$
222$ // エラー通知処理の処理
223 $TAB$if (ercd != E_OK) {$NL$
224
225 $IF nfymode2 == TENFY_SETVAR$
226$ // 変数の設定
227 $TAB$$TAB$*$funcname$_p_evar = (intptr_t) ercd;$NL$
228 $ELIF nfymode2 == TENFY_INCVAR$
229$ // 変数のインクリメント
230 $TAB$$TAB$*$funcname$_p_evar += 1;$NL$
231 $ELIF nfymode2 == TENFY_ACTTSK$
232$ // タスクの起動
233 $TAB$$TAB$(void) act_tsk($funcname$_etskid);$NL$
234 $ELIF nfymode2 == TENFY_WUPTSK$
235$ // タスクの起床
236 $TAB$$TAB$(void) wup_tsk($funcname$_etskid);$NL$
237 $ELIF nfymode2 == TENFY_SIGSEM$
238$ // セマフォの返却
239 $TAB$$TAB$(void) sig_sem($funcname$_esemid);$NL$
240 $ELIF nfymode2 == TENFY_SETFLG$
241$ // イベントフラグのセット
242 $TAB$$TAB$(void) set_flg($funcname$_eflgid, $epar2$);$NL$
243 $ELIF nfymode2 == TENFY_SNDDTQ$
244$ // データキューへの送信
245 $TAB$$TAB$(void) psnd_dtq
246 ($funcname$_edtqid, (intptr_t) ercd);$NL$
247 $ELSE$
248 $ERROR text_line$E_PAR:$SPC$
249 $FORMAT(_("illegal %1% `%2%\' of `%3%\' in %4%"),
250 "nfymode", nfymode, objid, apiname)$
251 $END$
252 $END$
253
254 $TAB$}$NL$
255 $END$
256
257$ // 関数の末尾部分の生成
258 }$NL$
259 $NL$
260 $END$
261 $RESULT = funcname$
262$END$
263
264$
265$ 各機能モジュールのコンフィギュレーション
266$
267$INCLUDE "kernel/task.tf"$
268$INCLUDE "kernel/semaphore.tf"$
269$INCLUDE "kernel/eventflag.tf"$
270$INCLUDE "kernel/dataqueue.tf"$
271$INCLUDE "kernel/pridataq.tf"$
272$INCLUDE "kernel/mutex.tf"$
273$INCLUDE "kernel/mempfix.tf"$
274$INCLUDE "kernel/cyclic.tf"$
275$INCLUDE "kernel/alarm.tf"$
276$INCLUDE "kernel/interrupt.tf"$
277$INCLUDE "kernel/exception.tf"$
278
279$
280$ 非タスクコンテキスト用のスタック領域
281$
282/*$NL$
283$SPC$* Stack Area for Non-task Context$NL$
284$SPC$*/$NL$
285$NL$
286
287$IF !LENGTH(ICS.ORDER_LIST)$
288$ // DEF_ICSがない場合のデフォルト値の設定
289 #ifdef DEFAULT_ISTK$NL$
290 $NL$
291 #define TOPPERS_ISTKSZ DEFAULT_ISTKSZ$NL$
292 #define TOPPERS_ISTK DEFAULT_ISTK$NL$
293 $NL$
294 #else /* DEAULT_ISTK */$NL$
295 $NL$
296 $istksz = ALLOC_STACK("_kernel_istack", "DEFAULT_ISTKSZ")$$NL$
297 #define TOPPERS_ISTKSZ $istksz$$NL$
298 #define TOPPERS_ISTK _kernel_istack$NL$
299 $NL$
300 #endif /* DEAULT_ISTK */$NL$
301$ELSE$
302
303$ // 静的API「DEF_ICS」が複数ある(E_OBJ)[NGKI3216]
304 $IF LENGTH(ICS.ORDER_LIST) > 1$
305 $ERROR$E_OBJ: $FORMAT(_("too many %1%"), "DEF_ICS")$$END$
306 $END$
307
308$ // istkszが0以下か,ターゲット定義の最小値(TARGET_MIN_ISTKSZ)よりも
309$ // 小さい場合(E_PAR)[NGKI3254]
310 $IF ICS.ISTKSZ[1] <= 0 || (TARGET_MIN_ISTKSZ
311 && ICS.ISTKSZ[1] < TARGET_MIN_ISTKSZ)$
312 $ERROR ICS.TEXT_LINE[1]$E_PAR:$SPC$
313 $FORMAT(_("too small %1% `%2%\' in %3%"),
314 "istksz", ICS.ISTKSZ[1], "DEF_ICS")$
315 $END$
316 $END$
317
318$ // istkszがスタック領域のサイズとして正しくない場合(E_PAR)[NGKI3222]
319 $IF !EQ(ICS.ISTK[1], "NULL") && CHECK_STKSZ_ALIGN
320 && (ICS.ISTKSZ[1] & (CHECK_STKSZ_ALIGN - 1))$
321 $ERROR ICS.TEXT_LINE[1]$E_PAR:$SPC$
322 $FORMAT(_("%1% `%2%\' in %3% is not aligned"),
323 "istksz", ICS.ISTKSZ[1], "DEF_ICS")$
324 $END$
325 $END$
326
327 $IF EQ(ICS.ISTK[1], "NULL")$
328$ // スタック領域の自動割付け
329 $istksz = ALLOC_STACK("_kernel_istack", ICS.ISTKSZ[1])$$NL$
330 #define TOPPERS_ISTKSZ $istksz$$NL$
331 #define TOPPERS_ISTK _kernel_istack$NL$
332 $ELSE$
333 #define TOPPERS_ISTKSZ ($ICS.ISTKSZ[1]$)$NL$
334 #define TOPPERS_ISTK (void *)($ICS.ISTK[1]$)$NL$
335 $END$
336$END$
337$NL$
338
339$ 非タスクコンテキスト用のスタック領域
340const size_t _kernel_istksz = TOPPERS_ISTKSZ;$NL$
341STK_T *const _kernel_istk = TOPPERS_ISTK;$NL$
342$NL$
343#ifdef TOPPERS_ISTKPT$NL$
344STK_T *const _kernel_istkpt = TOPPERS_ISTKPT(TOPPERS_ISTK, TOPPERS_ISTKSZ);$NL$
345#endif /* TOPPERS_ISTKPT */$NL$
346$NL$
347
348$
349$ カーネルが割り付けるメモリ領域
350$
351/*$NL$
352$SPC$* Memory Area Allocated by Kernel$NL$
353$SPC$*/$NL$
354$NL$
355
356$IF !LENGTH(KMM.ORDER_LIST)$
357$ // DEF_KMMがない場合のデフォルト値の設定
358 #define TOPPERS_KMMSZ 0$NL$
359 #define TOPPERS_KMM NULL$NL$
360$ELSE$
361
362$ // 静的API「DEF_KMM」が複数ある(E_OBJ)
363 $IF LENGTH(KMM.ORDER_LIST) > 1$
364 $ERROR$E_OBJ: $FORMAT(_("too many %1%"), "DEF_KMM")$$END$
365 $END$
366
367$ // kmmszが0以下の場合(E_PAR)
368 $IF KMM.KMMSZ[1] <= 0$
369 $ERROR KMM.TEXT_LINE[1]$E_PAR:$SPC$
370 $FORMAT(_("%1% `%2%\' is zero in %3%"),
371 "kmmsz", KMM.KMMSZ[1], "DEF_KMM")$
372 $END$
373 $END$
374
375$ // kmmszがカーネルが割り付けるメモリ領域のサイズとして正しくない場
376$ // 合(E_PAR)
377 $IF !EQ(KMM.KMM[1], "NULL") && CHECK_MB_ALIGN
378 && (KMM.KMMSZ[1] & (CHECK_MB_ALIGN - 1))$
379 $ERROR KMM.TEXT_LINE[1]$E_PAR:$SPC$
380 $FORMAT(_("%1% `%2%\' in %3% is not aligned"),
381 "kmmsz", KMM.KMMSZ[1], "DEF_KMM")$
382 $END$
383 $END$
384
385 $IF EQ(KMM.KMM[1], "NULL")$
386$ // カーネルが割り付けるメモリ領域の自動割付け
387 static MB_T _kernel_memory[TOPPERS_COUNT_SZ($KMM.KMMSZ[1]$, sizeof(MB_T))];$NL$
388 #define TOPPERS_KMMSZ TOPPERS_ROUND_SZ($KMM.KMMSZ[1]$, sizeof(MB_T))$NL$
389 #define TOPPERS_KMM _kernel_memory$NL$
390 $ELSE$
391 #define TOPPERS_KMMSZ ($KMM.KMMSZ[1]$)$NL$
392 #define TOPPERS_KMM (void *)($KMM.KMM[1]$)$NL$
393 $END$
394$END$
395$NL$
396
397$ カーネルが割り付けるメモリ領域
398const size_t _kernel_kmmsz = TOPPERS_KMMSZ;$NL$
399MB_T *const _kernel_kmm = TOPPERS_KMM;$NL$
400$NL$
401
402$
403$ タイムイベント管理
404$
405/*$NL$
406$SPC$* Time Event Management$NL$
407$SPC$*/$NL$
408$NL$
409TMEVTN _kernel_tmevt_heap[1 + TNUM_TSKID + TNUM_CYCID + TNUM_ALMID];$NL$
410$NL$
411
412$
413$ 各モジュールの初期化関数
414$
415/*$NL$
416$SPC$* Module Initialization Function$NL$
417$SPC$*/$NL$
418$NL$
419void$NL$
420_kernel_initialize_object(void)$NL$
421{$NL$
422$FOREACH func (initfuncs)$
423 $TAB$$func$$NL$
424$END$
425}$NL$
426$NL$
427
428$
429$ 初期化ルーチンの実行関数
430$
431/*$NL$
432$SPC$* Initialization Routine$NL$
433$SPC$*/$NL$
434$NL$
435void$NL$
436_kernel_call_inirtn(void)$NL$
437{$NL$
438$FOREACH order INI.ORDER_LIST$
439$ // iniatrが無効の場合(E_RSATR)[NGKI3241]
440$ //(TA_NULLでない場合)
441 $IF INI.INIATR[order] != 0$
442 $ERROR INI.TEXT_LINE[order]$E_RSATR:$SPC$
443 $FORMAT(_("illegal %1% `%2%\' of %3% `%4%\' in %5%"),
444 "iniatr", INI.INIATR[order], "inirtn",
445 INI.INIRTN[order], "ATT_INI")$
446 $END$
447 $END$
448 $TAB$((INIRTN)($INI.INIRTN[order]$))((intptr_t)($INI.EXINF[order]$));$NL$
449$END$
450}$NL$
451$NL$
452
453$
454$ 終了処理ルーチンの実行関数
455$
456/*$NL$
457$SPC$* Termination Routine$NL$
458$SPC$*/$NL$
459$NL$
460void$NL$
461_kernel_call_terrtn(void)$NL$
462{$NL$
463$FOREACH rorder TER.RORDER_LIST$
464$ // teratrが無効の場合(E_RSATR)[NGKI3248]
465$ //(TA_NULLでない場合)
466 $IF TER.TERATR[rorder] != 0$
467 $ERROR TER.TEXT_LINE[rorder]$E_RSATR:$SPC$
468 $FORMAT(_("illegal %1% `%2%\' of %3% `%4%\' in %5%"),
469 "teratr", TER.TERATR[rorder], "terrtn",
470 TER.TERRTN[rorder], "ATT_TER")$
471 $END$
472 $END$
473 $TAB$((TERRTN)($TER.TERRTN[rorder]$))((intptr_t)($TER.EXINF[rorder]$));$NL$
474$END$
475}$NL$
476$NL$
477
478$
479$ kernel_cfg.hの末尾部分の生成
480$
481$FILE "kernel_cfg.h.new"$
482
483#endif /* TOPPERS_KERNEL_CFG_H */$NL$
Note: See TracBrowser for help on using the repository browser.