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

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

ソースを追加

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