source: rubycfg_asp/trunk/asp_dcre/kernel/kernel.trb@ 315

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

SVNプロパティを設定

  • Property svn:eol-style set to native
  • Property svn:mime-type set to text/x-ruby; charset=UTF-8
File size: 12.4 KB
Line 
1# -*- coding: utf-8 -*-
2#
3# TOPPERS/ASP 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#
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: kernel.trb 716 2016-03-31 06:16:23Z ertl-hiro $
41#
42
43#
44# コンフィギュレータのパス2の生成スクリプト
45#
46
47#
48# タイムスタンプファイルの指定
49#
50$timeStampFileName = "kernel_cfg.timestamp"
51
52#
53# kernel_cfg.hの先頭部分の生成
54#
55$kernelCfgH = GenFile.new("kernel_cfg.h")
56$kernelCfgH.add(<<EOS)
57/* kernel_cfg.h */
58#ifndef TOPPERS_KERNEL_CFG_H
59#define TOPPERS_KERNEL_CFG_H
60EOS
61
62#
63# kernel_cfg.cの先頭部分の生成
64#
65$kernelCfgC = GenFile.new("kernel_cfg.c")
66$kernelCfgC.add(<<EOS)
67/* kernel_cfg.c */
68#include "kernel/kernel_int.h"
69#include "kernel_cfg.h"
70
71#if TKERNEL_PRID != 0x07u
72#error The kernel does not match this configuration file.
73#endif
74EOS
75
76#
77# インクルードディレクティブ(#include)
78#
79$kernelCfgC.comment_header("Include Directives (#include)")
80$includeFiles.each do |file|
81 $kernelCfgC.add("#include #{file}")
82end
83$kernelCfgC.add()
84
85#
86# スタック領域の確保関数
87#
88# スタック領域の定義分と,スタック領域のサイズ記述を配列で返す.
89#
90unless defined? AllocStack()
91 def AllocStack(stack, size)
92 # 大きい方に丸めたサイズで確保する[NGKI1050][NGKI3220]
93 $kernelCfgC.add("/*static*/ STK_T #{stack}[COUNT_STK_T(#{size})];")
94 return("ROUND_STK_T(#{size})")
95 end
96end
97
98#
99# カーネルオブジェクトに関する情報の生成(仮想クラス)
100#
101class KernelObject
102 def initialize(obj, object, obj_s = obj)
103 @obj = obj
104 @OBJ = obj.tr("a-z", "A-Z")
105 @object = object
106 @obj_s = obj_s
107 @OBJ_S = obj_s.tr("a-z", "A-Z")
108 @objid = (obj + "id").to_sym
109 @api = "CRE_#{@OBJ}".to_sym
110 @inibList = { "#{@OBJ_S}INIB" => "a#{@obj_s}inib_table"}
111 end
112
113 def generate()
114 # AID_@OBJの処理
115 numAutoObjid = 0
116 $cfgData["AID_#{@OBJ}".to_sym].each do |key, params|
117 numAutoObjid += params["no#{@obj}".to_sym]
118 end
119 numObjid = $cfgData[@api].size + numAutoObjid
120
121 # kernel_cfg.hの生成
122 $kernelCfgH.add("#define TNUM_#{@OBJ}ID\t#{numObjid}")
123
124 # オブジェクトのID番号のマクロ定義の生成
125 $cfgData[@api].sort.each do |key, params|
126 if params[@objid]
127 $kernelCfgH.add("#define #{params[@objid]}\t#{params[@objid].val}")
128 end
129 end
130 $kernelCfgH.add()
131
132 # オブジェクトのID番号を保持する変数
133 if $USE_EXTERNAL_ID
134 $cfgData[@api].sort.each do |key, params|
135 if params[@objid]
136 $kernelCfgC.add("const ID #{params[@objid]}_id" \
137 " = #{params[@objid].val};")
138 end
139 end
140 $kernelCfgC.add()
141 end
142
143 # 静的に生成されたオブジェクトの数
144 $kernelCfgC.add("#define TNUM_S#{@OBJ}ID\t#{$cfgData[@api].size}")
145
146 # オブジェクトID番号の最大値
147 $kernelCfgC.add("const ID _kernel_tmax_#{@obj}id" \
148 " = (TMIN_#{@OBJ}ID + TNUM_#{@OBJ}ID - 1);")
149 $kernelCfgC.add2("const ID _kernel_tmax_s#{@obj}id" \
150 " = (TMIN_#{@OBJ}ID + TNUM_S#{@OBJ}ID - 1);")
151
152 # データ構造
153 if $cfgData[@api].size > 0
154 # 事前準備(エラーチェック,メモリ領域の生成)
155 $cfgData[@api].sort.each do |key, params|
156 prepare(key, params)
157 end
158
159 # オブジェクト全体に対して必要なメモリ領域の生成(オプション)
160 if respond_to?(:generateData)
161 generateData()
162 end
163
164 # オブジェクト初期化ブロックの生成
165 $kernelCfgC.add("const #{@OBJ_S}INIB _kernel_#{@obj_s}inib_table" \
166 "[TNUM_S#{@OBJ}ID] = {")
167 $cfgData[@api].sort.each_with_index do |(key, params), index|
168 $kernelCfgC.add(",") if index > 0
169 $kernelCfgC.append("\t{ " + generateInib(key, params) + " }")
170 end
171 $kernelCfgC.add
172 $kernelCfgC.add2("};")
173 else
174 $kernelCfgC.add2("TOPPERS_EMPTY_LABEL(const #{@OBJ_S}INIB, " \
175 "_kernel_#{@obj_s}inib_table);")
176 end
177
178 # 動的生成オブジェクト用のオブジェクト初期化ブロック
179 @inibList.each do |type, array|
180 if numAutoObjid > 0
181 $kernelCfgC.add2("#{type} _kernel_#{array}[#{numAutoObjid}];")
182 else
183 $kernelCfgC.add2("TOPPERS_EMPTY_LABEL(#{type}, _kernel_#{array});")
184 end
185 end
186
187 if numObjid > 0
188 # オブジェクト管理ブロックの生成
189 $kernelCfgC.add2("#{@OBJ_S}CB _kernel_#{@obj_s}cb_table" \
190 "[TNUM_#{@OBJ}ID];")
191
192 # オブジェクト初期化関数の追加
193 $initializeFunctions.push("_kernel_initialize_#{@object}();")
194 else
195 $kernelCfgC.add2("TOPPERS_EMPTY_LABEL(#{@OBJ_S}CB, " \
196 "_kernel_#{@obj_s}cb_table);")
197 end
198 end
199end
200
201#
202# 各機能モジュールのコンフィギュレーション
203#
204$initializeFunctions = []
205IncludeTrb("kernel/task.trb")
206IncludeTrb("kernel/semaphore.trb")
207IncludeTrb("kernel/eventflag.trb")
208IncludeTrb("kernel/dataqueue.trb")
209IncludeTrb("kernel/pridataq.trb")
210IncludeTrb("kernel/mailbox.trb")
211IncludeTrb("kernel/mempfix.trb")
212IncludeTrb("kernel/cyclic.trb")
213IncludeTrb("kernel/alarm.trb")
214IncludeTrb("kernel/interrupt.trb")
215IncludeTrb("kernel/exception.trb")
216
217#
218# 非タスクコンテキスト用のスタック領域
219#
220$kernelCfgC.comment_header("Stack Area for Non-task Context")
221
222if $cfgData[:DEF_ICS].size == 0
223 # DEF_ICSがない場合のデフォルト値の設定
224 if $DEFAULT_ISTK.nil?
225 # スタック領域の自動割付け
226 istksz = AllocStack("_kernel_istack", "DEFAULT_ISTKSZ")
227 istk = "_kernel_istack"
228 else
229 istksz = "DEFAULT_ISTKSZ"
230 istk = "DEFAULT_ISTK"
231 end
232else
233 # 静的API「DEF_ICS」が複数ある(E_OBJ)[NGKI3216]
234 if $cfgData[:DEF_ICS].size > 1
235 error("E_OBJ: too many DEF_ICS")
236 end
237
238 # DEF_ICSがある場合の処理
239 params = $cfgData[:DEF_ICS][1]
240
241 # パラメータが省略された時のデフォルト値の設定
242 params[:istk] ||= "NULL"
243
244 # istkszがターゲット定義の最小値(TARGET_MIN_ISTKSZ,未定義の場合は1)
245 # よりも小さい場合(E_PAR)[NGKI3254]
246 if params[:istksz] < $TARGET_MIN_ISTKSZ
247 error_wrong("E_PAR", params, :istksz, "too small")
248 end
249
250 if params[:istk] == "NULL"
251 # スタック領域の自動割付け
252 istksz = AllocStack("_kernel_istack", params[:istksz])
253 istk = "_kernel_istack"
254 else
255 # istkszがスタック領域のサイズとして正しくない場合(E_PAR)[NGKI3222]
256 if (params[:istksz] & ($CHECK_STKSZ_ALIGN - 1)) != 0
257 error_wrong("E_PAR", params, :istksz, "not aligned")
258 end
259
260 istksz = "(#{params[:istksz]})"
261 istk = "(void *)(#{params[:istk]})"
262 end
263end
264
265$kernelCfgC.add(<<EOS)
266const size_t _kernel_istksz = #{istksz};
267STK_T *const _kernel_istk = #{istk};
268
269#ifdef TOPPERS_ISTKPT
270STK_T *const _kernel_istkpt = TOPPERS_ISTKPT(#{istk}, #{istksz});
271#endif /* TOPPERS_ISTKPT */
272EOS
273
274#
275# カーネルが割り付けるメモリ領域
276#
277$kernelCfgC.comment_header("Memory Area Allocated by Kernel")
278
279if $cfgData[:DEF_KMM].size == 0
280 # DEF_KMMがない場合のデフォルト値の設定
281 kmmsz = "0"
282 kmm = "NULL"
283else
284 # 静的API「DEF_KMM」が複数ある(E_OBJ)
285 if ($cfgData[:DEF_KMM].size > 1)
286 error("E_OBJ: too many DEF_KMM")
287 end
288
289 # DEF_KMMがある場合の処理
290 params = $cfgData[:DEF_KMM][1]
291
292 # パラメータが省略された時のデフォルト値の設定
293 params[:kmm] ||= "NULL"
294
295 # kmmszが0の場合(E_PAR)
296 if params[:kmmsz] == 0
297 error_wrong("E_PAR", params, :kmmsz, "zero")
298 end
299
300 if params[:kmm] == "NULL"
301 # カーネルが割り付けるメモリ領域の自動割付け
302 $kernelCfgC.add("static MB_T _kernel_memory" \
303 "[TOPPERS_COUNT_SZ(#{params[:kmmsz]}, sizeof(MB_T))];")
304 kmmsz = "TOPPERS_ROUND_SZ(#{params[:kmmsz]}, sizeof(MB_T))"
305 kmm = "_kernel_memory"
306 else
307 # kmmszがカーネルが割り付けるメモリ領域のサイズとして正しくない場合
308 # (E_PAR)
309 if (params[:kmmsz] & ($CHECK_MB_ALIGN - 1)) != 0
310 error_wrong("E_PAR", params, :kmmsz, "not aligned")
311 end
312
313 kmmsz = "(#{params[:kmmsz]})"
314 kmm = "(void *)(#{params[:kmm]})"
315 end
316end
317
318$kernelCfgC.add(<<EOS)
319const size_t _kernel_kmmsz = #{kmmsz};
320MB_T *const _kernel_kmm = #{kmm};
321EOS
322
323#
324# タイムイベント管理
325#
326$kernelCfgC.comment_header("Time Event Management")
327$kernelCfgC.add(<<EOS)
328TMEVTN _kernel_tmevt_heap[TNUM_TSKID + TNUM_CYCID + TNUM_ALMID];
329EOS
330
331#
332# 各モジュールの初期化関数
333#
334$kernelCfgC.comment_header("Module Initialization Function")
335$kernelCfgC.append(<<EOS)
336void
337_kernel_initialize_object(void)
338{
339EOS
340$initializeFunctions.each do |func|
341 $kernelCfgC.add("\t#{func}")
342end
343$kernelCfgC.add2("}")
344
345#
346# 初期化ルーチン機能
347#
348$kernelCfgC.comment_header("Initialization Routine")
349
350# エラーチェック
351$cfgData[:ATT_INI].each do |key, params|
352 # iniatrが無効の場合(E_RSATR)[NGKI3241]
353 #(TA_NULLでない場合)
354 if (params[:iniatr] != $TA_NULL)
355 error_illegal_sym("E_RSATR", params, :iniatr, :inirtn)
356 end
357end
358
359# 初期化ルーチンの実行関数の生成
360$kernelCfgC.append(<<EOS)
361void
362_kernel_call_inirtn(void)
363{
364EOS
365$cfgData[:ATT_INI].each do |key, params|
366 $kernelCfgC.add("\t((INIRTN)(#{params[:inirtn]}))" \
367 "((intptr_t)(#{params[:exinf]}));")
368end
369$kernelCfgC.add2("}")
370
371#
372# 終了処理ルーチン機能
373#
374$kernelCfgC.comment_header("Termination Routine")
375
376# エラーチェック
377$cfgData[:ATT_TER].each do |key, params|
378 # teratrが無効の場合(E_RSATR)[NGKI3248]
379 #(TA_NULLでない場合)
380 if (params[:teratr] != $TA_NULL)
381 error_illegal_sym("E_RSATR", params, :teratr, :terrtn)
382 end
383end
384
385# 終了処理ルーチンの実行関数の生成
386$kernelCfgC.append(<<EOS)
387void
388_kernel_call_terrtn(void)
389{
390EOS
391$cfgData[:ATT_TER].reverse_each do |key, params|
392 $kernelCfgC.add("\t((TERRTN)(#{params[:terrtn]}))" \
393 "((intptr_t)(#{params[:exinf]}));")
394end
395$kernelCfgC.add2("}")
396
397#
398# kernel_cfg.hの末尾部分の生成
399#
400$kernelCfgH.append(<<EOS)
401#endif /* TOPPERS_KERNEL_CFG_H */
402EOS
Note: See TracBrowser for help on using the repository browser.