source: asp3_tinet_ecnl_arm/trunk/asp3_dcre/tecsgen/tecslib/plugin/HRPRPCPlugin.rb@ 374

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

mbed関連を更新
シリアルドライバをmbedのHALを使うよう変更
ファイルディスクリプタの処理を更新

  • Property charset set to UTF-8
  • Property svn:eol-style set to native
  • Property svn:mime-type set to text/x-ruby
File size: 15.2 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# $Id$
53#++
54
55require_tecsgen_lib "lib/GenOpaqueMarshaler.rb"
56require_tecsgen_lib "lib/GenParamCopy.rb"
57
58#= HRPRPCPlugin プラグイン
59# スループラグイン (through)
60# ・OpaqueMarshalerPlugin を使用してマーシャラセルタイプを生成する
61# ・マーシャラ、TDR、チャンネル、メッセージバッファを生成する
62#
63class HRPRPCPlugin < ThroughPlugin
64
65 include GenOpaqueMarshaler
66 include GenParamCopy
67
68 # RPCPlugin 専用のオプション
69 HRPRPCPluginArgProc = RPCPluginArgProc.dup # 複製を作ってå…
70ƒã‚’変更しないようにする
71 HRPRPCPluginArgProc[ "noClientSemaphore" ] = Proc.new { |obj,rhs| obj.set_noClientSemaphore rhs }
72 HRPRPCPluginArgProc[ "semaphoreCelltype" ] = Proc.new { |obj,rhs| obj.set_semaphoreCelltype rhs }
73 @@isFirstInstance = true
74
75 #=== RPCPlugin の initialize
76 # 説明は ThroughPlugin (plugin.rb) を参ç…
77§
78 def initialize( cell_name, plugin_arg, next_cell, next_cell_port_name, next_cell_port_subscript, signature, celltype, caller_cell )
79 super
80 @b_noClientSemaphore = false
81 @semaphoreCelltype = "tSemaphore"
82 initialize_opaque_marshaler
83
84 # オプション:GenOpaqueMarshaler 参ç…
85§
86 @plugin_arg_check_proc_tab = HRPRPCPluginArgProc
87 parse_plugin_arg
88
89 @rpc_channel_celltype_name = "tRPCPlugin_#{@TDRCelltype}_#{@channelCelltype}_#{@signature.get_name}"
90 @rpc_channel_celltype_file_name = "#{$gen}/#{@rpc_channel_celltype_name}.cdl"
91
92 if @signature.get_context == "non-task" then
93 cdl_error( "HRP9999 RPC cannot be applied to non-task context signature '$1'", @signature.get_name )
94 elsif @signature.get_context == "any" then
95 cdl_info( "HRP9999 RPC is applied to any context signature '$1'", @signature.get_name )
96 end
97
98 if @signature.need_PPAllocator?(true) then
99 if @PPAllocatorSize == nil then
100 cdl_error( "HRP9999 PPAllocatorSize must be speicified for pointer argments" )
101 # @PPAllocatorSize = 0 # 仮に 0 としておく (cdl の構文エラーを避けるため)
102 end
103 elsif @PPAllocatorSize then
104 cdl_warning( "HRP9999 PPAllocatorSize speicified in spite of PPAllocator unnecessary" )
105 @PPAllocatorSize = nil
106 end
107
108# @signature.each_param{ |func_decl, param_decl|
109# if func_decl.get_type.is_oneway? then
110# if ( param_decl.get_size || param_decl.get_count ) && param_decl.get_string then
111# cdl_error( "array of string not supported for oneway function in Transparent RPC" ) # mikan 文字列のé…
112åˆ—
113# elsif param_decl.get_string == -1 then
114# cdl_error( "length unspecified string is not permited for oneway function in Transparent RPC" ) # mikan 長さ未指定文字列
115# end
116# end
117# }
118
119 #
120 # tecsgen/tecs/rpcにincludeパスを通す
121 # #include "tecs_rpc.h" を実現するために必
122要
123 # 大山:削除 Makefile.tecsgen に vpath, INCLUDES をå…
124¥ã‚Œã‚‹ã®ã¯ã€ã‚ˆããªã„考え
125 # TECSGEN.add_search_path で Makefile_templ にå…
126¥ã‚Œã‚‹ã®ãŒã‚ˆã„
127 # if @@isFirstInstance
128 # f = AppFile.open( "#{$gen}/Makefile.tecsgen" )
129 # f.puts "INCLUDES := $(INCLUDES) -I $(TECSPATH) -I $(TECSPATH)/rpc"
130 # f.puts "vpath %.c $(TECSPATH) $(TECSPATH)/rpc"
131 # f.close()
132 # @@isFirstInstance = false
133 # end
134 end
135
136 #=== plugin の宣言コード (celltype の定義) 生成
137 def gen_plugin_decl_code( file )
138
139 ct_name = "#{@ct_name}_#{@channelCelltype}"
140
141 # このセルタイプ(同じシグニチャ)は既に生成されているか?
142 if @@generated_celltype[ ct_name ] == nil then
143 @@generated_celltype[ ct_name ] = [ self ]
144 else
145 @@generated_celltype[ ct_name ] << self
146 return
147 end
148
149 f = CFile.open( @rpc_channel_celltype_file_name, "w" )
150 # 同じ内
151容を二度書く可能性あり (AppFile は不可)
152
153 f.print <<EOT
154import( <rpc.cdl> );
155import( <tMessageBufferCEP.cdl> );
156generate( OpaqueMarshalerPlugin, #{@signature.get_namespace_path}, "" );
157
158composite tOpaqueMarshaler_#{@signature.get_global_name}_through {
159 entry #{@signature.get_namespace_path} eThroughEntry;
160 call sTDR cTDR;
161 [optional]
162 call sSemaphore cLockChannel;
163 [optional]
164 call sRPCErrorHandler cErrorHandler;
165
166 cell tOpaqueMarshaler_#{@signature.get_global_name} Marshaler{
167 cTDR => composite.cTDR;
168 cLockChannel => composite.cLockChannel;
169 cErrorHandler => composite.cErrorHandler;
170 };
171 composite.eThroughEntry => Marshaler.eClientEntry;
172};
173
174EOT
175
176 f.close
177 end
178
179 #=== through cell コードを生成
180 #
181 #
182 def gen_through_cell_code( file )
183
184 gen_plugin_decl_code( file )
185 file.print <<EOT
186import( <#{@rpc_channel_celltype_file_name}> );
187EOT
188
189 case @start_region.get_domain_root.get_domain_type.get_kind
190 when :kernel
191 tacp_str = "\"TACP_KERNEL"
192 when :user
193 tacp_str = "\"TACP(#{@start_region.get_domain_root.get_name})"
194 when :OutOfDomain
195 tacp_str = "\"TACP_SHARED"
196 end
197 # p "end_region=#{@end_region.get_name} kind=#{@end_region.get_domain_root.get_domain_type.get_kind}"
198 case @end_region.get_domain_root.get_domain_type.get_kind
199 when :kernel
200 tacp_str += "|TACP_KERNEL\""
201 when :user
202 tacp_str += "|TACP(#{@end_region.get_domain_root.get_name})\""
203 when :OutOfDomain
204 tacp_str += "|TACP_SHARED\""
205 end
206 nest_str = ""
207 file.print <<EOT
208#{nest_str} // MessageBuffer client=>server
209#{nest_str} cell tMessageBuffer #{@clientChannelCell}Body0{
210#{nest_str} maxMessageSize = 64; /* This value must be same as MessageBufferCEP's buffer size */
211#{nest_str} bufferSize = 128;
212#{nest_str} accessPattern1 = C_EXP( #{tacp_str} );
213#{nest_str} accessPattern2 = C_EXP( #{tacp_str} );
214#{nest_str} accessPattern3 = C_EXP( #{tacp_str} );
215#{nest_str} accessPattern4 = C_EXP( #{tacp_str} );
216#{nest_str} };
217EOT
218 file.print <<EOT
219
220#{nest_str} // MessageBuffer server=>client
221#{nest_str} cell tMessageBuffer #{@clientChannelCell}Body1{
222#{nest_str} maxMessageSize = 64; /* This value must be same as MessageBufferCEP's buffer size */
223#{nest_str} bufferSize = 128;
224#{nest_str} accessPattern1 = C_EXP( #{tacp_str} );
225#{nest_str} accessPattern2 = C_EXP( #{tacp_str} );
226#{nest_str} accessPattern3 = C_EXP( #{tacp_str} );
227#{nest_str} accessPattern4 = C_EXP( #{tacp_str} );
228#{nest_str} };
229EOT
230
231 ##### クライアント側のセルの生成 #####
232 nest = @start_region.gen_region_str_pre file
233 nest_str = " " * nest
234
235 # セマフォの生成
236 if @b_noClientSemaphore == false then
237 file.print <<EOT
238#{nest_str} // Semaphore for Multi-task use ("specify noClientSemaphore" option to delete this)
239#{nest_str} cell #{@semaphoreCelltype} #{@serverChannelCell}_Semaphore{
240#{nest_str} initialCount = 1;
241#{nest_str} };
242EOT
243 end
244
245 # クライアント側チャンネル (tMessageBufferCEP)の生成
246 # チャンネルは必
247ずリージョン下にあるので、 '::' でつなぐ (でなければ、ルートリージョンにないかチェックが必
248要)
249
250 file.print <<EOT
251#{nest_str} // Client Side Channel
252#{nest_str} cell tMessageBufferCEP #{@clientChannelCell}_CEP{
253#{nest_str} cMessageBuffer0 = #{@clientChannelCell}Body0.eMessageBuffer;
254#{nest_str} cMessageBuffer1 = #{@clientChannelCell}Body1.eMessageBuffer;
255#{nest_str} };
256
257#{nest_str} // Client Side TDR
258#{nest_str} cell tTDR #{@clientChannelCell}_TDR{
259#{nest_str} cChannel = #{@clientChannelCell}_CEP.eChannel;
260#{nest_str} };
261
262#{nest_str} // Marshaler
263EOT
264
265 # セマフォの結合文
266 if @b_noClientSemaphore == false then
267 semaphore = "#{nest_str} cLockChannel = #{@serverChannelCell}_Semaphore.eSemaphore;\n"
268 else
269 semaphore = ""
270 end
271
272 ### クライアント側チャンネル (マーシャラ+TDR)の生成 ###
273 cell = @next_cell
274 # アロケータの指定があるか?
275 if cell.get_allocator_list.length > 0 then
276
277 file.print nest_str
278 file.print "[allocator("
279
280 delim = ""
281 cell.get_allocator_list.each do |type, eport, subsc, func, buf, alloc|
282
283 alloc_str = alloc.to_s
284 subst = @substituteAllocator[alloc_str.to_sym]
285 if subst then
286 alloc_str = subst[2]+"."+subst[3]
287 end
288
289 file.print delim
290 delim = ",\n" # 最終行には出さない
291
292 if subsc then # é…
293åˆ—添数
294 subsc_str = '[#{subsc}]'
295 else
296 subsc_str = ""
297 end
298
299 eport = "eThroughEntry" #RPCの受け口名に変更
300 file.print nest_str
301 file.print "#{eport}#{subsc_str}.#{func}.#{buf} = #{alloc_str}"
302 end
303
304 file.puts ")]"
305 end
306
307 if @clientErrorHandler then
308 clientErrorHandler_str = "#{nest_str} cErrorHandler = #{@clientErrorHandler};\n"
309 else
310 clientErrorHandler_str = ""
311 end
312
313 file.print <<EOT
314#{nest_str} cell tOpaqueMarshaler_#{@signature.get_global_name}_through #{@cell_name} {
315#{nest_str} cTDR = #{@clientChannelCell}_TDR.eTDR;
316#{clientErrorHandler_str}#{semaphore}#{nest_str} };
317EOT
318 ### END: クライアント側チャンネル (マーシャラ+TDR)の生成 ###
319 @start_region.gen_region_str_post file
320 file.print "\n\n"
321
322 ##### サーバー側のセルの生成 #####
323 nest = @end_region.gen_region_str_pre file
324 nest_str = " " * nest
325
326 if @serverErrorHandler then
327 serverErrorHandler_str = "#{nest_str} cErrorHandler = #{@serverErrorHandler};\n"
328 else
329 serverErrorHandler_str = ""
330 end
331
332 if @b_genOpener then
333 opener = "#{nest_str} cOpener = #{@serverChannelCell}.eOpener;\n"
334 else
335 opener = ""
336 end
337
338 # サーバー側チャンネル (tMessageBufferCEP)
339 if @PPAllocatorSize then
340 alloc_cell =<<EOT
341
342#{nest_str} cell tPPAllocator #{@serverChannelCell}_PPAllocator {
343#{nest_str} heapSize = #{@PPAllocatorSize};
344#{nest_str} };
345EOT
346 alloc_call_port_join = "#{nest_str} cPPAllocator = #{@serverChannelCell}_PPAllocator.ePPAllocator;\n"
347 else
348 alloc_cell = ""
349 alloc_call_port_join = ""
350 end
351
352 file.print <<EOT
353#{nest_str} // Server Side Channel
354#{nest_str} cell tMessageBufferCEP #{@serverChannelCell}_CEP{
355#{nest_str} cMessageBuffer0 = #{@clientChannelCell}Body1.eMessageBuffer;
356#{nest_str} cMessageBuffer1 = #{@clientChannelCell}Body0.eMessageBuffer;
357#{nest_str} };
358EOT
359
360 # サーバー側TDR
361 file.print <<EOT
362
363#{nest_str} // Server Side TDR
364#{nest_str} cell tTDR #{@serverChannelCell}_TDR{
365#{nest_str} cChannel = #{@serverChannelCell}_CEP.eChannel;
366#{nest_str} };
367EOT
368
369 if @next_cell_port_subscript then
370 subscript = '[' + @next_cell_port_subscript.to_s + ']'
371 else
372 subscript = ""
373 end
374
375 # サーバー側チャンネル (アンマーシャラ)
376 file.print <<EOT
377#{alloc_cell}
378#{nest_str} // Unmarshaler
379#{nest_str} cell tOpaqueUnmarshaler_#{@signature.get_global_name} #{@serverChannelCell}_Unmarshaler {
380#{nest_str} cTDR = #{@serverChannelCell}_TDR.eTDR;
381#{nest_str} cServerCall = #{@next_cell.get_namespace_path.get_path_str}.#{@next_cell_port_name}#{subscript};
382#{alloc_call_port_join}#{serverErrorHandler_str}#{nest_str} };
383EOT
384
385 # サーバー側タスクメイン
386 file.print <<EOT
387
388#{nest_str} // Unmarshaler Task Main
389#{nest_str} cell #{@taskMainCelltype} #{@serverChannelCell}_TaskMain {
390#{nest_str} cMain = #{@serverChannelCell}_Unmarshaler.eService;
391#{opener}#{nest_str} };
392EOT
393
394 # サーバー側タスク
395 file.print <<EOT
396
397#{nest_str} // Unmarshaler Task
398#{nest_str} cell #{@taskCelltype} #{@serverChannelCell}_Task {
399#{nest_str} cTaskBody = #{@serverChannelCell}_TaskMain.eMain;
400#{nest_str} priority = #{@taskPriority};
401#{nest_str} stackSize = #{@stackSize};
402#{nest_str} attribute = C_EXP( "TA_ACT" ); /* mikan : marshaler task starts at beginning */
403#{nest_str} };
404EOT
405 @end_region.gen_region_str_post file
406 end
407
408
409 #=== プラグイン引数 noClientSemaphore のチェック
410 def set_noClientSemaphore rhs
411 rhs = rhs.to_sym
412 if rhs == :true then
413 @b_noClientSemaphore = true
414 elsif rhs == :false then
415 @b_noClientSemaphore = false
416 else
417 cdl_error( "RPCPlugin: specify true or false for noClientSemaphore" )
418 end
419 end
420
421 #=== プラグイン引数 semaphoreCelltype のチェック
422 def set_semaphoreCelltype rhs
423 @semaphoreCelltype = rhs.to_sym
424 nsp = NamespacePath.analyze( @semaphoreCelltype.to_s )
425 obj = Namespace.find( nsp )
426 if ! obj.instance_of?( Celltype ) && ! obj.instance_of?( CompositeCelltype ) then
427 cdl_error( "RPCPlugin: semaphoreCelltype '#{rhs}' not celltype or not defined" )
428 end
429 end
430
431 #=== NamespacePath を得る
432 # 生成するセルの namespace path を生成する
433 def get_cell_namespace_path
434# nsp = @region.get_namespace.get_namespace_path
435 nsp = @start_region.get_namespace_path
436 return nsp.append( @cell_name )
437 end
438
439end
440
441
Note: See TracBrowser for help on using the repository browser.