source: azure_iot_hub/trunk/asp3_dcre/tecsgen/tecslib/plugin/HRPPlugin.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: 15.3 KB
Line 
1# coding: utf-8
2#
3# TECS Generator
4# Generator for TOPPERS Embedded Component System
5#
6# Copyright (C) 2014-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# $Id$
53#++
54
55
56require_tecsgen_lib "HRPKernelObjectManager.rb"
57#
58# 各メソッドの役割りは、DomainPlugin.rb を参ç…
59§ã®ã“と
60# HRPカーネル用ドメインプラグイン
61class HRPPlugin < DomainPlugin
62
63 def initialize( region, name, option )
64 super
65 dbgPrint "HRPPlugin: initialize: region=#{region.get_name}, domainName=#{name}, option=#{option}\n"
66 @region = region
67 @name = name
68 case option
69 when "kernel", "user", "OutOfDomain"
70 # OK
71 @option = option
72 else
73 cdl_error( "HRPPlugin: '$1' is unacceptable domain kind, specify 'kernel' or 'user'", option )
74 @option = "kernel" # とりあえず kernel を設定しておく
75 end
76 end
77
78 def add_through_plugin( join, current_region, next_region, through_type )
79 # join.get_owner:Cell 左辺のセル
80 # join.get_definition:Port 呼び口
81 # join.get_subscript:Integer or nil 呼び口é…
82åˆ—の添数 (Join::@subscript の説明参ç…
83§)
84 # join.get_cell:Cell 右辺のセル
85 # join.get_port_name:Symbol 受け口
86 # get_rhs_subscript:Integer or nil 受け口é…
87åˆ—の添数 (Join::@rhs_subscript の説明参ç…
88§)
89 # return []
90 dbgPrint "MyDomainPlugin: add_through_plugin: #{current_region.get_name}=>#{next_region.get_name}, #{join.get_owner.get_name}.#{join.get_definition.get_name}=>#{join.get_cell.get_name}.#{join.get_port_name}, #{through_type}\n"
91
92 #puts "=====Join Check Start====="
93 #puts "caller: #{join.get_owner.get_name.to_s}, callee: #{join.get_cell.get_name.to_s}"
94 #puts "=====Join Check param====="
95 current_domain = current_region.get_domain_root.get_domain_type
96 next_domain = next_region.get_domain_root.get_domain_type
97 #puts current_domain.get_option.to_s
98 # if !next_domain.nil?
99 # puts next_domain.get_option.to_s
100 # else
101 # puts "next domain is nil!"
102 # end
103
104 HRPPlugin.add_inter_domain_join_set join
105 # p join.get_cell.get_name
106 # p join.get_cell.get_real_celltype(join.get_rhs_port1).get_name
107 # if HRPKernelObjectManager.include_celltype?(join.get_cell.get_celltype.get_global_name) #oyama: get_name => get_global_name
108 if HRPKernelObjectManager.include_celltype?(join.
109 get_cell.
110 get_real_celltype(join.get_rhs_port1).
111 get_global_name) #oyama: get_name => get_global_name
112 # 結合å…
113ˆãŒã‚«ãƒ¼ãƒãƒ«ã‚ªãƒ–ジェクトセル
114 # @plugin_body = HRP2SVCPlugin.new(cell_name, plugin_arg, next_cell, next_cell_port_name, signature, celltype, caller_cell)
115 # 何もしないthrough
116 # puts "***** #{join.get_cell.get_celltype.get_name} is kernel object"
117 return []
118 # return [ :HRP2SVCPlugin, "channelCelltype=tMessagebufferChannel,noClientSemaphore=true" ]
119 # elsif @end_region.is_root?
120 # elsif next_region.get_option == OutOfDomain
121 # elsif next_domain.nil?
122 elsif next_domain.get_option.to_s == "OutOfDomain"
123 # # 結合å…
124ˆãŒç„¡æ‰€å±ž
125 # # 何もしないthrough
126 # # @plugin_body = HRP2SVCPlugin.new(cell_name, plugin_arg, next_cell, next_cell_port_name, signature, celltype, caller_cell)
127 # puts "***** nil"
128 return []
129 #elsif @start_region.get_param != :KERNEL_DOMAIN && @end_region.get_param == :KERNEL_DOMAIN
130 elsif current_domain.get_option.to_s != "kernel" && next_domain.get_option.to_s == "kernel"
131 # ユーザドメインからカーネルドメインへの結合
132 # @plugin_body = HRP2SVCPlugin.new(cell_name, plugin_arg, next_cell, next_cell_port_name, signature, celltype, caller_cell)
133 # puts "***** svc"
134 return [ :HRPSVCPlugin, "" ]
135 elsif current_domain != next_domain
136 # 別のユーザドメインへの結合
137 # @plugin_body = HRP2RPCPlugin.new(cell_name, plugin_arg, next_cell, next_cell_port_name, signature, celltype, caller_cell)
138 # puts "***** rpc"
139 # return [ :HRPRPCPlugin, "channelCelltype=tMessagebufferChannel,noClientSemaphore=true" ]
140 # puts "HRPPlugin:RPC:PPAllocatorSize=256"
141 return [ :HRPRPCPlugin, "noClientSemaphore=false,PPAllocatorSize=256" ]
142 else
143 # その他
144 # 何もしないthrough
145 # @plugin_body = HRP2SVCPlugin.new(cell_name, plugin_arg, next_cell, next_cell_port_name, signature, celltype, caller_cell)
146 dbgPrint "warning: at HRP Join Check"
147 return nil
148 end
149
150 # puts "=====Join Check End====="
151 end
152
153 def joinable?(current_region, next_region, through_type )
154 dbgPrint "MyDomainPlugin: joinable? from #{current_region.get_name} to #{next_region.get_name} (#{through_type})\n"
155 return true
156 end
157
158 #== ドメイン種別を返す
159 #return::Symbol :kernel, :user, :OutOfDomain
160 def get_kind
161 return @option.to_sym
162 end
163
164 def self.gen_post_code file
165 end
166
167 # ATT_MODを生成済みかどうか # 2017.8.27
168 @@generate_memory_module = false
169
170 @@include_extsvc_fncd = false # 17.07.26 暫定
171 #
172 # ATT_MODの生成
173 # gen_factory実行時には,すべてのセルタイププラグインを生成済みのはずなので,
174 # カーネルAPIコードのメモリ保護を省略できる.
175 #
176 def gen_factory
177 super
178
179 if @@include_extsvc_fncd == false
180 file = AppFile.open( "#{$gen}/tecsgen.cfg" )
181 file.print "/* HRPPlugin 001 */\n"
182 file.print "#include \"extsvc_fncode.h\"\n" ## 2017.7.26
183 file.close
184 @@include_extsvc_fncd = true
185 end
186
187 if @@generate_memory_module == false
188
189 # INCLUDE を出力
190 # すべてのドメインに対する cfg をå…
191ˆã«ç”Ÿæˆã—ておく
192 # もし、ドメインに属するカーネルオブジェクトも、モジュールもない場合でも、cfg が出力される
193 regions = DomainType.get_domain_regions[ :HRP ]
194 file = AppFile.open( "#{$gen}/tecsgen.cfg" )
195 file.print "/* HRPPlugin 002 */\n"
196 regions.each{ |region|
197 if ! region.is_root? then
198 nsp = "#{region.get_global_name}"
199 file2 = AppFile.open( "#{$gen}/tecsgen_#{nsp}.cfg" )
200 file2.close
201 case region.get_domain_type.get_kind
202 when :kernel
203 pre = "KERNEL_DOMAIN{\n "
204 post = "}\n"
205 when :user
206 pre = "DOMAIN(#{region.get_name}){\n "
207 post = "}\n"
208 when :OutOfDomain
209 pre = ""
210 post = "\n"
211 end
212 file.puts "#{pre}INCLUDE(\"#{$gen}/tecsgen_#{nsp}.cfg\");\n#{post}"
213 end
214 }
215 file.print "/* HRPPlugin 002 end */\n\n"
216 file.close
217
218 check_celltype_list = []
219
220 #
221 # ATT_MODの生成
222 #
223 Cell.get_cell_list2.each { |cell|
224 # すべてのセルを走査してセルタイプをチェック
225 ct = cell.get_celltype
226 if ct.class == Celltype && check_celltype_list.include?( ct ) == false
227 # チェック済みセルタイプに登録
228 check_celltype_list << ct
229
230 # 未チェックのセルタイプだった場合
231 # puts "check for ATT_MOD : #{ct.classget_global_name}"
232 # puts "check for ATT_MOD : #{ct.get_global_name}"
233
234 # カーネルAPIのコード,データはメモリ保護しない # HRP3 oyama delete by Takada's request
235 # next if HRPKernelObjectManager.include_celltype?( ct.get_name )
236
237 # 必
238要のないセルタイプのコード,データはメモリ保護しない
239 next if ! ct.need_generate?
240
241 # HRPのドメインリージョンを取得
242 regions = ct.get_domain_roots
243 regions_hrp = regions[ :HRP ]
244 dbgPrint "HRP domain in #{ct.get_name}: "
245 regions_hrp.each { |reg|
246 dbgPrint reg.get_name
247 }
248 # puts ""
249
250 # セル管理ブロックとスケルトンのメモリ保護
251 # gen_celltype_names_domain 相当の処理
252 if regions_hrp.include?( Region.get_root ) == false && regions_hrp.length > 1
253 # ドメインが複数で,OutOfDomainにセルが存在しないセルタイプの場合
254 # å…
255±æœ‰ã®ã‚»ãƒ«ç®¡ç†ãƒ–ロックとスケルトンコードを登録する
256 file = AppFile.open( "#{$gen}/tecsgen.cfg" )
257 file.printf "%-60s/* HRPPlugin 003 */\n", "ATT_MOD(\"#{ct.get_global_name}_tecsgen.o\");"
258 file.close
259 end
260
261 regions_hrp.each { |reg|
262 if reg.is_root?
263 nsp = ""
264 else
265 nsp = "_#{reg.get_global_name}"
266 end
267 file = AppFile.open( "#{$gen}/tecsgen#{nsp}.cfg" )
268 file.printf "%-50s/* HRPPlugin 004 */\n", "ATT_MOD(\"#{ct.get_global_name}#{nsp}_tecsgen.o\");"
269 file.close
270 }
271
272 # セルタイプコードがない場合はスキップ
273 next if ct.is_all_entry_inline? && ! ct.is_active?
274
275 # セルタイプコードのメモリ保護
276 # gen_celltype_names_domain2 相当の処理
277 if regions_hrp.include?( Region.get_root ) == true || regions_hrp.length > 1
278 # OutOfDomainにセルが存在するセルタイプの場合
279 # または,複数のドメインにセルが存在するセルタイプの場合
280 # セルタイプコードをå…
281±æœ‰ã™ã‚‹ã‚ˆã†ã«ç™»éŒ²ã™ã‚‹
282 file = AppFile.open( "#{$gen}/tecsgen.cfg" )
283 else
284 # OutOfDomainでない単一のドメインにセルが存在するセルタイプの場合
285 # セルタイプコードを専有するように登録する
286 file = AppFile.open( "#{$gen}/tecsgen_#{regions_hrp[0].get_global_name}.cfg" )
287 end
288
289 file.printf "%-50s/* HRPPlugin 005 */\n", "ATT_MOD(\"#{ct.get_global_name}.o\");"
290 file.close
291 else
292 # 何もしない
293 end
294 }
295
296 @@generate_memory_module = true
297 else
298 # 何もしない
299 end
300 end
301
302 #----- Inter Domain Join Set -----#
303 @@inter_domain_join_set = {} #{entry_cell =>{domain_root=>count} } Hash of inter domain join
304 def self.add_inter_domain_join_set join
305 rhs_cell = join.get_cell
306 dbgPrint "--------- add_inter_domain:#{join.get_owner.get_namespace_path} => #{join.get_cell.get_namespace_path}-----\n"
307 domain_root = join.get_owner.get_region.get_domain_root # lhs cell's domain root
308 if @@inter_domain_join_set[ rhs_cell ] == nil then
309 @@inter_domain_join_set[ rhs_cell ] = []
310 end
311 # 左辺のドメインルートを記録
312 @@inter_domain_join_set[ rhs_cell ] << join
313 end
314 def self.get_inter_domain_join_set rhs_cell
315 if @@inter_domain_join_set[ rhs_cell ] then
316 @@inter_domain_join_set[ rhs_cell ].uniq!
317 else
318 @@inter_domain_join_set[ rhs_cell ] = []
319 end
320 return @@inter_domain_join_set[ rhs_cell ]
321 end
322 def self.get_inter_domain_join_roots rhs_cell
323 dbgPrint "--------- get_inter_domain #{rhs_cell.get_namespace_path} -----\n"
324 domain_roots = []
325 set = get_inter_domain_join_set rhs_cell
326 set.each{ |join|
327 dbgPrint "--------- get_inter_domain:#{join.get_owner.get_namespace_path} => #{join.get_cell.get_namespace_path}-----\n"
328 # if join.get_owner.get_region.get_domain_root.get_domain_type.get_option == "user" then
329 domain_roots << join.get_owner.get_region.get_domain_root
330 # end
331 }
332 return domain_roots.uniq
333 end
334
335 def self.get_sac_str cell
336 domain_roots = self.get_inter_domain_join_roots cell
337 delim = ""
338 acv = ""
339 cell_domain_root = cell.get_region.get_domain_root
340 if cell_domain_root.get_domain_type.get_kind != :OutOfDomain then
341 domain_roots << cell.get_region.get_domain_root # 結合å…
342ˆã®ãƒ‰ãƒ¡ã‚¤ãƒ³ã‚‚含める
343 end
344 domain_roots.each{ |dr|
345 case dr.get_domain_type.get_kind
346 when :kernel
347 acv += "#{delim}TACP_KERNEL"
348 delim = "|"
349 when :user
350 acv += "#{delim}TACP(#{dr.get_name})"
351 delim = "|"
352 if cell_domain_root.get_domain_type.get_kind != :OutOfDomain &&
353 dr.get_namespace_path != cell_domain_root.get_namespace_path then
354 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 )
355 end
356 when :OutOfDomain
357 if cell_domain_root.get_domain_type.get_kind == :OutOfDomain then
358 acv += "#{delim}TACP_SHARED"
359 delim = "|"
360 end
361 else
362 raise "unkown domain kind"
363 end
364 }
365 if acv == "" then
366 # 呼びå…
367ˆã‚»ãƒ«ãŒç„¡æ‰€å±žã‹ã¤ã€å‘¼ã³å…
368ƒã‚‚無所属のみ、または結合無しの場合
369 acv = "TACP_SHARED"
370 end
371 sac_str = "{"
372 delim = ""
373 [:accessPattern1, :accessPattern2, :accessPattern3, :accessPattern4].each{ |acp|
374 init = (cell.get_attr_initializer acp).to_s
375 if init != "OMIT"
376 sac_str += delim + init
377 else
378 sac_str += delim + acv
379 end
380 delim = ", "
381 }
382 return sac_str + '}'
383 end
384end
Note: See TracBrowser for help on using the repository browser.