source: azure_iot_hub/trunk/asp3_dcre/tecsgen/tecslib/plugin/HRPKernelObjectPlugin.rb@ 388

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

Azure IoT Hub Device C SDK を使ったサンプルの追加

  • Property svn:eol-style set to native
  • Property svn:mime-type set to text/x-ruby
File size: 16.1 KB
Line 
1# coding: utf-8
2#
3# TECS Generator
4# Generator for TOPPERS Embedded Component System
5#
6# Copyright (C) 2008-2018 by TOPPERS Project
7#--
8# 上記著作権者
9は,以下の(1)~(4)の条件を満たす場合に限り,本ソフトウェ
10# ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
11# 変・再é…
12å¸ƒï¼ˆä»¥ä¸‹ï¼Œåˆ©ç”¨ã¨å‘¼ã¶ï¼‰ã™ã‚‹ã“とを無償で許諾する.
13# (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
14# 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
15# スコード中に含まれていること.
16# (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
17# 用できる形で再é…
18å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œå†é…
19å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨
20# 者
21マニュアルなど)に,上記の著作権表示,この利用条件および下記
22# の無保証規定を掲載すること.
23# (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
24# 用できない形で再é…
25å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œæ¬¡ã®ã„ずれかの条件を満たすこ
26# と.
27# (a) 再é…
28å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨è€…
29マニュアルなど)に,上記の著
30# 作権表示,この利用条件および下記の無保証規定を掲載すること.
31# (b) 再é…
32å¸ƒã®å½¢æ…
33‹ã‚’,別に定める方法によって,TOPPERSプロジェクトに
34# 報告すること.
35# (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
36# 害からも,上記著作権者
37およびTOPPERSプロジェクトをå…
38è²¬ã™ã‚‹ã“と.
39# また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
40# 由に基づく請求からも,上記著作権者
41およびTOPPERSプロジェクトを
42# å…
43è²¬ã™ã‚‹ã“と.
44#
45# 本ソフトウェアは,無保証で提供されているものである.上記著作権者
46お
47# よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
48# に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
49# アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
50# の責任を負わない.
51#
52#
53# $Id$
54#++
55
56#== celltype プラグインのå…
57±é€šã®è¦ªã‚¯ãƒ©ã‚¹
58class HRPKernelObjectPlugin < CelltypePlugin
59 # @@obj_hash = {}
60
61 #@celltype:: Celltype
62 #@option:: String :オプション文字列
63 def initialize( celltype, option )
64 super
65 #
66 # それぞれのカーネルオブジェクトを解析対象セルタイプに追加
67 # 目的:
68 # - カーネルオブジェクトのセルをメモリ保護対象外とする
69 # - カーネルオブジェクト本体の管理はTECSでなくOSで実施するため
70 # - カーネルオブジェクトのセルへのアクセスを直接関数呼出し
71 #  とする
72 # - システムサービス呼出しはOSが提供するため
73 HRPKernelObjectPlugin.set_celltype(celltype)
74 end
75
76 #=== HRPKernelObjectPlugin#print_cfg_cre
77 # 各種カーネルオブジェクトのCRE_*の出力
78 # file:: FILE: 出力å…
79ˆãƒ•ã‚¡ã‚¤ãƒ«
80 # val :: string: カーネルオブジェクトの属性の解析結果
81 # tab :: string: インデント用のtab
82 def print_cfg_cre(file, cell, val, tab)
83 raise "called virtual method print_cfg_cre in #{@celltype.get_name} plugin"
84 end
85
86 #=== HRPKernelObjectPlugin#print_cfg_sac
87 # 各種カーネルオブジェクトのSAC_*の出力
88 # file:: FILE: 出力å…
89ˆãƒ•ã‚¡ã‚¤ãƒ«
90 # val :: string: カーネルオブジェクトの属性の解析結果
91 # acv :: string: アクセスベクタ
92 def print_cfg_sac(file, val, acv)
93 raise "called virtual method print_cfg_sac in #{@celltype.get_name} plugin"
94 end
95
96 #
97 # セルタイププラグインの本体メソッド
98 # - 静的APIの生成
99 # file:: FILE: 出力å…
100ˆãƒ•ã‚¡ã‚¤ãƒ«
101 #
102 def gen_factory file
103 dbgPrint "===== begin #{@celltype.get_name.to_s} plugin =====\n"
104
105 #
106 # 対象となるすべてのセルについて、受け口に結合されている
107 # セルの所属ドメインを解析
108 # - 生成すべきcfgファイル名を取得するために必
109要
110 #
111 if !HRPKernelObjectPlugin.isChecked()
112 HRPKernelObjectPlugin.check_referenced_cells()
113 else
114 dbgPrint "***** already checked\n"
115 end
116
117 # 追記するために AppFile を使う(文字コード変換されない)
118 file2 = AppFile.open( "#{$gen}/tecsgen.cfg" )
119 file2.print "\n/* Generated by #{self.class.name} */\n\n"
120
121 @celltype.get_cell_list.each { |cell|
122 if cell.is_generate?
123 dbgPrint "===== begin check my domain #{cell.get_name} =====\n"
124 #
125 # カーネルオブジェクトの属性を,valにコピー
126 #
127 val = {}
128 @celltype.get_attribute_list.each{ |a|
129 # p a.get_name
130 if a.get_type.kind_of?( ArrayType )
131 val[a.get_name] = []
132 if j = cell.get_join_list.get_item(a.get_name)
133 # セル生成時に初期化する場合
134 j.get_rhs.each { |elem|
135 val[a.get_name] << elem.to_s
136 }
137 elsif i = a.get_initializer
138 # セルタイプの初期化値を使う場合
139 i.each { |elem|
140 val[a.get_name] << elem.to_s
141 }
142 else
143 raise "attribute is not initialized"
144 end
145 else
146 if j = cell.get_join_list.get_item(a.get_name)
147 # セル生成時に初期化する場合
148 val[a.get_name] = j.get_rhs.to_s
149 elsif i = a.get_initializer
150 # セルタイプの初期化値を使う場合
151 val[a.get_name] = i.to_s
152 else
153 raise "attribute is not initialized"
154 end
155 end
156 }
157 # generate.rbを参考に
158 # $id$を置換
159 if val[:id].nil? != true
160 name_array = @celltype.get_name_array( cell )
161 val[:id] = @celltype.subst_name( val[:id], name_array )
162 end
163 # $cbp$の代わり
164 cell_domain_root = cell.get_region.get_domain_root
165 cell_domain_type = cell.get_region.get_domain_root.get_domain_type
166
167 # CRE_XXX/DEF_XXXの生成
168 if cell_domain_type.get_option.to_s != "OutOfDomain"
169 # 保護ドメインに属する場合
170 if !HRPKernelObjectPlugin.include_region(cell_domain_root.get_name.to_s)
171 # その保護ドメインの.cfgが生成されていない場合
172 HRPKernelObjectPlugin.set_region_list(cell_domain_root.get_name.to_s)
173 dbgPrint "~~~~~ #{cell_domain_root.get_name.to_s} is registered!\n"
174
175# # if cell.get_region.get_param == :KERNEL_DOMAIN
176# if cell_domain_type.get_option.to_s == "kernel"
177# file2.print "KERNEL_DOMAIN{\n"
178# else
179# file2.print "DOMAIN(#{cell_domain_root.get_name.to_s}){\n"
180# end
181# file2.puts "\tINCLUDE(\"#{$gen}/tecsgen_#{cell_domain_root.get_name.to_s}.cfg\");"
182# file2.puts "}\n"
183 else
184 dbgPrint "~~~~~ #{cell.get_region.get_namespace_path} is included in"
185 #p @@region_list
186 end
187 file3 = AppFile.open( "#{$gen}/tecsgen_#{cell_domain_root.get_global_name}.cfg" )
188 print_cfg_cre(file3, cell, val,"")
189 file3.close
190 else
191 # 無所属の場合
192 dbgPrint "~~~~~ #{cell_domain_root.get_namespace_path} is OutOfDomain\n"
193 # print "~~~~~ #{cell_domain_root.get_namespace_path} is OutOfDomain\n"
194 # p cell_domain_root.get_name
195 if cell_domain_root.get_name == "::" then
196 print_cfg_cre(file2, cell, val, "")
197 else
198# if !HRPKernelObjectPlugin.include_region(cell_domain_root.get_name.to_s)
199# # その保護ドメインの.cfgが生成されていない場合
200# HRPKernelObjectPlugin.set_region_list(cell_domain_root.get_name.to_s)
201# file2.puts "INCLUDE(\"#{$gen}/tecsgen_#{cell_domain_root.get_name.to_s}.cfg\");\n"
202# end
203 file3 = AppFile.open( "#{$gen}/tecsgen_#{cell_domain_root.get_name.to_s}.cfg" )
204 print_cfg_cre(file3, cell, val,"")
205 file3.close
206 end
207
208 end
209
210 dbgPrint "===== end check my domain #{cell.get_name} =====\n"
211
212 #
213 # SAC_XXXの生成
214 #
215 if !val[:accessPattern1].nil?
216 dbgPrint "===== begin check regions #{cell.get_name} =====\n"
217 i = 0
218 acv = { \
219 :accessPattern1 => val[:accessPattern1], \
220 :accessPattern2 => val[:accessPattern2], \
221 :accessPattern3 => val[:accessPattern3], \
222 :accessPattern4 => val[:accessPattern4] \
223 }
224 acv_tmp = []
225 domain_roots = HRPPlugin.get_inter_domain_join_roots cell
226 # 結合å…
227ˆã‚»ãƒ«ã®ãƒ‰ãƒ¡ã‚¤ãƒ³ã‚’加える
228 if cell_domain_type.get_kind != :OutOfDomain then
229 domain_roots << cell_domain_root
230 end
231 domain_roots.each{ |dr|
232 case dr.get_domain_type.get_kind
233 when :user
234 acv_tmp << "TACP(#{dr.get_name})"
235 when :kernel
236 acv_tmp << "TACP_KERNEL"
237 when :OutOfDomain
238 if cell_domain_type.get_kind == :OutOfDomain then
239 # 呼びå…
240ƒã‚‚、呼びå…
241ˆã‚‚ OutOfDomain の場合
242 acv_tmp << "TACP_SHARED"
243 end
244 end
245 }
246 acv_tmp.uniq!
247 if acv_tmp.length == 0 then
248 # 呼びå…
249ˆã‚»ãƒ«ãŒç„¡æ‰€å±žã‹ã¤ã€å‘¼ã³å…
250ƒã‚‚無所属のみ、または結合無しの場合
251 acv_tmp = [ "TACP_SHARED" ]
252 end
253 b_info = false
254 b_warn = false
255 acv.each { |key, acp|
256 if !acp.nil?
257 if acp != "OMIT"
258 elsif cell_domain_type.get_kind != :OutOfDomain
259 # p "UserDomainCell or KernelDomainCell"
260 domain_roots = HRPPlugin.get_inter_domain_join_roots cell
261 domain_roots.each{ |dr|
262 #
263 case dr.get_domain_type.get_kind
264 when :kernel
265 when :user
266 if dr.get_namespace_path != cell.get_region.get_domain_root.get_namespace_path
267 # 他のユーザードメインからの結合
268 if( b_warn == false ) then
269 cdl_error( "HRP9999 '$1': kernel object joined from other user domain. kernel object joined from multi-user-domain must be placed out of domain", cell.get_name )
270 b_warn = true
271 end
272 end
273 when :OutOfDomain
274 if( b_info == false ) then
275 # 無所属からの結合
276 # cdl_error( "HRP9999 kernel object joined from out of domain" )
277 if cell_domain_type.get_kind == :OutOfDomain
278 # この情
279報は、不要と判断する (無所属から無所属へ結合があると、アクセス許可ベクタが設定されない)
280 # cdl_info2( cell.get_locale, "HRP9999 '$1': kernel object joined from out of domain, access vector is not set", cell.get_name )
281 b_info = true
282 end
283 end
284 else
285 raise "unknown domain kind"
286 end
287 }
288 # acv[key] = "TACP(#{cell_domain_root.get_name.to_s})"
289 else
290 # p "OutOfDomainCell"
291 # 無所属のセル
292 # 結合å…
293ƒãƒ‰ãƒ¡ã‚¤ãƒ³ã«è¨±å¯ã™ã‚‹
294 # 結合å…
295ƒã«ç„¡æ‰€å±žã®ã‚»ãƒ«ãŒã‚ると、TACP_SHARED が設定される. フロー解析してドメインを特定できるのが、あるべき仕様
296 end
297 if acp == "OMIT"
298 acv[key] = acv_tmp.join( '|' )
299 end
300 end
301 }
302 #各種SACの生成
303 domainOption = cell_domain_type.get_option
304 # p "domain_root ", cell.get_region.get_domain_root.get_name
305 if domainOption != "OutOfDomain" || cell.get_region.get_domain_root.get_name != "::"
306 # 保護ドメインに属する場合
307 file3 = AppFile.open( "#{$gen}/tecsgen_#{cell.get_region.get_name.to_s}.cfg" )
308 print_cfg_sac(file3, val, acv)
309 file3.close
310 else
311 # 無所属の場合
312 print_cfg_sac(file2, val, acv)
313 end
314
315 dbgPrint "===== end check regions #{cell.get_name} =====\n"
316 end
317 end
318 }
319 dbgPrint "===== end #{@celltype.get_name.to_s} plugin =====\n"
320 file2.close
321 end
322
323 # カーネルオブジェクトセルタイプの管理
324 # HRPKernelObjectPluginクラスに対してメソッド呼出しを行うことを想定
325 @@checked = false
326 @@celltype_list = []
327 @@region_list = []
328
329 def self.isChecked()
330 return @@checked
331 end
332
333 def self.check_referenced_cells()
334 dbgPrint "===== begin check registered celltype =====\n"
335 self.get_celltype_list.each { |ct|
336 dbgPrint( ct.get_name.to_s + "\n" )
337 }
338 dbgPrint "===== end check registered celltype =====\n"
339
340 @@checked = true
341 end
342
343 def self.set_celltype( celltype )
344 @@celltype_list << celltype
345 end
346
347 def self.get_celltype_list
348 return @@celltype_list
349 end
350
351 def self.set_region_list( region )
352 @@region_list << region
353 end
354
355 def self.include_region( region )
356 return @@region_list.include?(region)
357 end
358
359 def self.include_celltype?( celltype )
360 return @@celltype_list.include?(celltype)
361 end
362
363end
364
Note: See TracBrowser for help on using the repository browser.