source: rubycfg_ssp/kernel.trb@ 283

Last change on this file since 283 was 283, checked in by nmir-saito, 6 years ago

ファイルの追加

File size: 11.8 KB
Line 
1# -*- coding: utf-8 -*-
2#
3# TOPPERS/SSP Kernel
4# Toyohashi Open Platform for Embedded Real-Time Systems/
5# Advanced Standard Profile Kernel
6#
7# Copyright (C) 2015 by FUJI SOFT INCORPORATED, JAPAN
8# Copyright (C) 2015,2016 by Embedded and Real-Time Systems Laboratory
9# Graduate School of Information Science, Nagoya Univ., JAPAN
10# Copyright (C) 2017 by Naoki Saito
11# Nagoya Municipal Industrial Research Institute, JAPAN
12#
13# 上記著作権者
14は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
15# ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
16# 変・再é…
17å¸ƒï¼ˆä»¥ä¸‹ï¼Œåˆ©ç”¨ã¨å‘¼ã¶ï¼‰ã™ã‚‹ã“とを無償で許諾する.
18# (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
19# 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
20# スコード中に含まれていること.
21# (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
22# 用できる形で再é…
23å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œå†é…
24å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨
25# 者
26マニュアルなど)に,上記の著作権表示,この利用条件および下記
27# の無保証規定を掲載すること.
28# (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
29# 用できない形で再é…
30å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œæ¬¡ã®ã„ずれかの条件を満たすこ
31# と.
32# (a) 再é…
33å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨è€…
34マニュアルなど)に,上記の著
35# 作権表示,この利用条件および下記の無保証規定を掲載すること.
36# (b) 再é…
37å¸ƒã®å½¢æ…
38‹ã‚’,別に定める方法によって,TOPPERSプロジェクトに
39# 報告すること.
40# (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
41# 害からも,上記著作権者
42およびTOPPERSプロジェクトをå…
43è²¬ã™ã‚‹ã“と.
44# また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
45# 由に基づく請求からも,上記著作権者
46およびTOPPERSプロジェクトを
47# å…
48è²¬ã™ã‚‹ã“と.
49#
50# 本ソフトウェアは,無保証で提供されているものである.上記著作権者
51お
52# よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
53# に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
54# アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
55# の責任を負わない.
56#
57# $Id: kernel.trb 670 2016-03-03 15:08:11Z ertl-hiro $
58#
59
60#
61# コンフィギュレータのパス2の生成スクリプト
62#
63
64#
65# タイムスタンプファイルの指定
66#
67$timeStampFileName = "kernel_cfg.timestamp"
68
69#
70# kernel_cfg.hのå…
71ˆé ­éƒ¨åˆ†ã®ç”Ÿæˆ
72#
73$kernelCfgH = GenFile.new("kernel_cfg.h")
74$kernelCfgH.add(<<EOS)
75/* kernel_cfg.h */
76#ifndef TOPPERS_KERNEL_CFG_H
77#define TOPPERS_KERNEL_CFG_H
78EOS
79
80#
81# kernel_cfg.cのå…
82ˆé ­éƒ¨åˆ†ã®ç”Ÿæˆ
83#
84$kernelCfgC = GenFile.new("kernel_cfg.c")
85$kernelCfgC.add(<<EOS)
86/* kernel_cfg.c */
87#include "kernel/kernel_int.h"
88#include "kernel_cfg.h"
89
90#ifndef TOPPERS_EMPTY_LABEL
91#define TOPPERS_EMPTY_LABEL(x,y) x y[0]
92#endif
93EOS
94
95#
96# インクルードディレクティブ(#include)
97#
98$kernelCfgC.comment_header("Include Directives")
99$includeFiles.each do |file|
100 $kernelCfgC.add("#include #{file}")
101end
102$kernelCfgC.add()
103
104#
105# スタック領域の確保関数
106#
107# スタック領域の定義分と,スタック領域のサイズ記述をé…
108åˆ—で返す.
109#
110unless defined? AllocStack()
111 def AllocStack(stack, size)
112 # 大きい方に丸めたサイズで確保する
113 $kernelCfgC.add("static STK_T #{stack}[COUNT_STK_T(#{size})];")
114 return("ROUND_STK_T(#{size})")
115 end
116end
117
118#
119# カーネルオブジェクトに関する情
120報の生成(仮想クラス)
121#
122class KernelObject
123 def initialize(obj, object)
124 @obj = obj
125 @OBJ = obj.tr("a-z", "A-Z")
126 @object = object
127 @objid = (obj + "id").to_sym
128 @api = "CRE_#{@OBJ}".to_sym
129 end
130
131 # オブジェクトのID番号のマクロ定義生成
132 def generateIdMacro()
133 $cfgData[@api].sort.each do |key, params|
134 $kernelCfgH.add("#define #{params[@objid]}\t#{params[@objid].val}")
135 end
136 $kernelCfgH.add()
137 end
138
139 def generate()
140 # kernel_cfg.hの生成
141 $kernelCfgH.add("#define TNUM_#{@OBJ}ID\t#{$cfgData[@api].size}")
142
143 # オブジェクトのID番号のマクロ定義の生成
144 generateIdMacro()
145
146 # オブジェクトのID番号を保持する変数
147 if $USE_EXTERNAL_ID
148 $cfgData[@api].sort.each do |key, params|
149 $kernelCfgC.add("const ID #{params[@objid]}_id" \
150 " = #{params[@objid].val};")
151 end
152 $kernelCfgC.add()
153 end
154
155 # オブジェクトID番号の最大値
156 $kernelCfgC.add2("const ID _kernel_tmax_#{@obj}id" \
157 " = (TMIN_#{@OBJ}ID + TNUM_#{@OBJ}ID - 1);")
158
159 # データ構造の生成
160 if respond_to?(:generateData)
161 generateData()
162 end
163
164 if $cfgData[@api].size() > 0
165 # オブジェクト初期化関数の追加
166 $initializeFunctions.push("_kernel_initialize_#{@object}();")
167 end
168 end
169end
170
171#
172# 各機能モジュールのコンフィギュレーション
173#
174$initializeFunctions = []
175IncludeTrb("kernel/task.trb")
176IncludeTrb("extension/eventflag.trb")
177IncludeTrb("extension/dataqueue.trb")
178IncludeTrb("extension/cyclic.trb")
179IncludeTrb("extension/alarm.trb")
180IncludeTrb("kernel/interrupt.trb")
181IncludeTrb("kernel/exception.trb")
182
183#
184# 非タスクコンテキスト用のスタック領域
185#
186$kernelCfgC.comment_header("Stack Area for Non-task Context")
187
188# 非タスクコンテキスト用スタック領域のサイズ
189$istksz = 0
190
191# DEF_ICSのエントリが存在するか?
192if $cfgData[:DEF_ICS].size == 0
193 # ない場合,サイズは既定値(DEFAULT_ISTKSZ)を使う
194 $kernelCfgC.add2("#define TOPPERS_ISTKSZ DEFAULT_ISTKSZ")
195 $istksz = $DEFAULT_ISTKSZ
196else
197 # DEF_ICS のエントリがある場合
198
199 # 静的API「DEF_ICS」が複数ある(E_OBJ)
200 if $cfgData[:DEF_ICS].size > 1
201 error("E_OBJ: too many DEF_ICS")
202 end
203
204 params = $cfgData[:DEF_ICS][1]
205
206 # istksz に 0 を指定した場合(E_PAR)
207 if params[:istksz] == 0
208 error_wrong("E_PAR", params, :istksz, "size is 0")
209 # istk は常に NULL である (E_PAR)
210 elsif params[:istk] != "NULL"
211 error_wrong("E_PAR", params, :istk, "must be NULL")
212 end
213
214 $istksz = params[:istksz]
215 $kernelCfgC.add2("#define TOPPERS_ISTKSZ\t(#{$istksz})")
216end
217
218#
219# å…
220±æœ‰ã‚¹ã‚¿ãƒƒã‚¯é ˜åŸŸ
221# SSPではすべての処理単位のスタックをå…
222±æœ‰ã™ã‚‹ãŸã‚ï¼Œ
223# ここでシステムå…
224¨ä½“のスタック領域を確保する.
225#
226
227#
228# å…
229±æœ‰ã‚¹ã‚¿ãƒƒã‚¯ã®ã‚³ãƒ³ãƒ•ã‚£ã‚®ãƒ¥ãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ã«æˆåŠŸã—たかどうか
230# DEF_STK 処理中にエラーが発生した場合,この変数が false になる.
231#
232$defstk_success = true
233
234$kernelCfgC.comment_header("Stack Area for System")
235
236# å…
237±æœ‰ã‚¹ã‚¿ãƒƒã‚¯ã®ã‚µã‚¤ã‚º
238$stksz = 0
239
240stk_str = ""
241stksz_str = ""
242
243# DEF_STK のエントリが存在するか?
244if $cfgData[:DEF_STK].size == 0
245 # (1) DEF_STK のエントリがない場合
246 stk_str = "_kernel_stack"
247 stksz_str = AllocStack(stk_str, "TOPPERS_TSTKSZ+TOPPERS_ISTKSZ")
248
249 $stksz = $tstksz + $istksz
250else
251 # (2) DEF_STK のエントリがある場合
252
253 # 静的API「DEF_STK」が複数ある(E_OBJ)
254 if $cfgData[:DEF_STK].size > 1
255 $defstk_success = false
256 error("E_OBJ: too many DEF_STK")
257 end
258
259 params = $cfgData[:DEF_STK][1]
260
261 # DEF_STK の stksz で 0 を指定した場合(E_PAR)
262 if params[:stksz] == 0
263 $defstk_success = false
264 error_wrong("E_PAR", params, :stksz, "not allowed")
265 end
266
267 $stksz = params[:stksz]
268
269 if params[:stk] == "NULL"
270 # stk が NULL の場合,スタック領域を自動割付け
271 stk_str = "_kernel_stack"
272 stksz_str = AllocStack(stk_str, "#{$stksz}")
273 else
274 # stk が NULL 以外の場合(アプリ側でスタック領域を用意する場合)
275
276 # stksz がターゲット毎に定まるアライメントサイズの倍数にアライメントされていない場合(E_PAR)
277 if (defined? $CHECK_STKSZ_ALIGN) && (($stksz & ($CHECK_STKSZ_ALIGN - 1)) != 0)
278 $defstk_success = false
279 error_wrong("E_PAR", params, :stksz, "not aligned")
280 end
281
282 stk_str = params[:stk]
283 stksz_str = $stksz
284 end
285end
286
287#
288# å…
289±æœ‰ã‚¹ã‚¿ãƒƒã‚¯ã®ã‚¹ã‚¿ãƒƒã‚¯é ˜åŸŸ
290#
291$kernelCfgC.add(<<EOS)
292#define TOPPERS_STK (#{stk_str})
293#define TOPPERS_STKSZ (#{stksz_str})
294
295const SIZE\t_kernel_stksz = TOPPERS_STKSZ;
296STK_T *const\t_kernel_stk = TOPPERS_STK;
297
298#ifdef TOPPERS_ISTKPT
299STK_T *const\t_kernel_istkpt = TOPPERS_ISTKPT(TOPPERS_STK, TOPPERS_STKSZ);
300#endif /* TOPPERS_ISTKPT */
301EOS
302
303#
304# 優å…
305ˆåº¦å‰²ã‚Šå½“ておよびスタック設定に関する結果を標準出力へ表示
306# その際,スタックサイズの指定値が実際の割当てサイズより大きいかを確認する.
307#
308if $defepr_success && $defstk_success
309 result_str = <<EOS
310=====================================
311Stack size configuration result:
312\tEstimated task stack size = #{$tstksz}
313\tSpecified interrupt stack size = #{$istksz}(value=#{sprintf("%d", $istksz)})
314\tAllocated total stack size = #{$stksz}(value=#{sprintf("%d", $stksz)})
315EOS
316
317 print(result_str)
318 if $tstksz + $istksz > $stksz
319 print("\t!!!WARNING!!!: Estimated stack size is more than the allocated stack size.")
320 warning("Estimated stack size is more than the allocated stack size.")
321 end
322 print("=====================================\n")
323end
324
325#
326# タイムイベント管理
327#
328tnum_tmevt = $cfgData[:CRE_CYC].size + $cfgData[:CRE_ALM].size
329$kernelCfgC.comment_header("Time Event Management")
330$kernelCfgC.add(<<EOS)
331#define TNUM_TMEVT #{sprintf("%d", tnum_tmevt)}
332
333const uint_t _kernel_tnum_tmevt_queue = TNUM_TMEVT;
334
335QUEUE _kernel_tmevt_queue[TNUM_TMEVT+1];
336EVTTIM _kernel_tmevt_time[TNUM_TMEVT];
337CBACK _kernel_tmevt_callback[TNUM_TMEVT];
338uintptr_t _kernel_tmevt_arg[TNUM_TMEVT];
339EOS
340
341if tnum_tmevt > 0
342 # オブジェクト初期化関数の追加
343 $initializeFunctions.unshift("_kernel_initialize_time_event();")
344end
345
346#
347# 各モジュールの初期化関数
348#
349$kernelCfgC.comment_header("Module Initialization Function")
350$kernelCfgC.append(<<EOS)
351void
352_kernel_initialize_object(void)
353{
354EOS
355$initializeFunctions.each do |func|
356 $kernelCfgC.add("\t#{func}")
357end
358$kernelCfgC.add2("}")
359
360#
361# 初期化ルーチン機能
362#
363$kernelCfgC.comment_header("Initialization Routine")
364
365# エラーチェック
366$cfgData[:ATT_INI].each do |key, params|
367 # iniatrが無効の場合(E_RSATR)
368 #(TA_NULLでない場合)
369 if (params[:iniatr] != $TA_NULL)
370 error_illegal_sym("E_RSATR", params, :iniatr, :inirtn)
371 end
372end
373
374# 初期化ルーチンの実行関数の生成
375$kernelCfgC.append(<<EOS)
376void
377_kernel_call_inirtn(void)
378{
379EOS
380$cfgData[:ATT_INI].each do |key, params|
381 $kernelCfgC.add("\t((INIRTN)(#{params[:inirtn]}))" \
382 "((intptr_t)(#{params[:exinf]}));")
383end
384$kernelCfgC.add2("}")
385
386#
387# 終了処理ルーチン機能
388#
389$kernelCfgC.comment_header("Termination Routine")
390
391# エラーチェック
392$cfgData[:ATT_TER].each do |key, params|
393 # teratrが無効の場合(E_RSATR)
394 #(TA_NULLでない場合)
395 if (params[:teratr] != $TA_NULL)
396 error_illegal_sym("E_RSATR", params, :teratr, :terrtn)
397 end
398end
399
400# 終了処理ルーチンの実行関数の生成
401$kernelCfgC.append(<<EOS)
402void
403_kernel_call_terrtn(void)
404{
405EOS
406$cfgData[:ATT_TER].reverse_each do |key, params|
407 $kernelCfgC.add("\t((TERRTN)(#{params[:terrtn]}))" \
408 "((intptr_t)(#{params[:exinf]}));")
409end
410$kernelCfgC.add2("}")
411
412#
413# kernel_cfg.hの末尾部分の生成
414#
415$kernelCfgH.append(<<EOS)
416#endif /* TOPPERS_KERNEL_CFG_H */
417EOS
Note: See TracBrowser for help on using the repository browser.