source: asp3_tinet_ecnl_arm/trunk/asp3_dcre/tecsgen/tecslib/plugin/SharedRPCPlugin.rb@ 352

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

arm向けASP3版ECNLを追加

  • Property svn:eol-style set to native
  • Property svn:mime-type set to text/x-ruby;charset=UTF-8
File size: 12.1 KB
Line 
1# -*- coding: utf-8 -*-
2#
3# TECS Generator
4# Generator for TOPPERS Embedded Component System
5#
6# Copyright (C) 2008-2014 by TOPPERS Project
7#--
8# 上記著作権者は,以下の(1)~(4)の条件を満たす場合に限り,本ソフトウェ
9# ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
10# 変・再配布(以下,利用と呼ぶ)することを無償で許諾する.
11# (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
12# 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
13# スコード中に含まれていること.
14# (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
15# 用できる形で再配布する場合には,再配布に伴うドキュメント(利用
16# 者マニュアルなど)に,上記の著作権表示,この利用条件および下記
17# の無保証規定を掲載すること.
18# (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
19# 用できない形で再配布する場合には,次のいずれかの条件を満たすこ
20# と.
21# (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
22# 作権表示,この利用条件および下記の無保証規定を掲載すること.
23# (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
24# 報告すること.
25# (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
26# 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
27# また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
28# 由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを
29# 免責すること.
30#
31# 本ソフトウェアは,無保証で提供されているものである.上記著作権者お
32# よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
33# に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
34# アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
35# の責任を負わない.
36#
37# $Id$
38#++
39
40require_tecsgen_lib "lib/GenTransparentMarshaler.rb"
41require_tecsgen_lib "lib/GenParamCopy.rb"
42
43#= SharedRPC プラグイン
44# SharedRPC チャンネルを生成する
45# プラグイン引数は GenTransparentMarshaler 参照
46
47# mikan through plugin: namespace が考慮されていない
48# これを利用する場合、以下のように toppers_jsp.cdl sChannel.cdl を指定する必要がある
49# tecsgen toppers_jsp.cdl sChannel.cdl your_description.cdl
50
51# 以下を仮定(制限事項)
52# 呼び元、呼び先のエンディアン、char, short, int_t, long_t, intptr_t のサイズが同じ
53# 有符号、無符号でサイズが同じ
54
55class SharedRPCPlugin < ThroughPlugin
56
57 attr_reader :region
58 @@shared_channel_list = {}
59 include GenTransparentMarshaler
60 include GenParamCopy
61
62 #=== RPCPlugin の initialize
63 # 説明は ThroughPlugin (plugin.rb) を参照
64 def initialize( cell_name, plugin_arg, next_cell, next_cell_port_name, signature, celltype, caller_cell )
65
66 # mikan プラグインオプション指定の不一致のチェック task_priority,
67
68 super
69 initialize_transparent_marshaler cell_name
70
71 # オプション:GenTransparentMarshaler 参照
72 @plugin_arg_check_proc_tab = RPCPluginArgProc
73 @channelCellName = "" # nil にしておく
74 parse_plugin_arg
75
76 @shared_channel_ct_name = :"tSharedRPCPlugin_#{@channelCelltype}"
77 @shared_channel_ct_file_name = "#{$gen}/#{@shared_channel_ct_name}.cdl"
78 @rpc_channel_celltype_name = :"tSharedRPCPlugin_#{@TDRCelltype}_#{@channelCelltype}_#{@signature.get_global_name}"
79 @rpc_channel_celltype_file_name = "#{$gen}/#{@rpc_channel_celltype_name}.cdl"
80
81 @shared_channel_cell = @channelCellName
82 if @shared_channel_cell == "" then
83 cdl_error( "SharedRPCPlugin: need channelCellName option" )
84 end
85
86 if @@shared_channel_list[ @shared_channel_cell ] == nil then
87 # 初出
88 @@shared_channel_list[ @shared_channel_cell ] = [ self ]
89 else
90 # 二番目以降
91 @@shared_channel_list[ @shared_channel_cell ] << self
92 end
93 @sub_channel_no = ( @@shared_channel_list[ @shared_channel_cell ].length ) -1
94
95 if @region != @@shared_channel_list[ @shared_channel_cell ][0].region then
96 # 初出とリージョン不一致 (初出は、自分自身とチェックされる。無駄だが小さいので放置)
97 cdl_error( "SharedRPCPlugin: preferred region mismatch current: #{@region.get_name} previous: #{@@shared_channel_list[ @shared_channel_cell ][0].region.get_name}")
98 else
99 dbgPrint "SahredRPCPlugin: Region: #{@region.get_name}, #{@@shared_channel_list[ @shared_channel_cell ][0].region.get_name}\n"
100 end
101
102 if @signature.need_PPAllocator? then
103 if @PPAllocatorSize == nil then
104 cdl_error( "PPAllocatorSize must be speicified for oneway [in] array" )
105 end
106 end
107
108 end
109
110 # def set_through_info( start_region, end_region, through_type )
111 # super
112 #
113 # end
114
115 def gen_plugin_decl_code( file )
116
117 # このセルタイプ(同じシグニチャ)は既に生成されているか?
118 if @@generated_celltype[ @shared_channel_ct_name ] == nil then
119 @@generated_celltype[ @shared_channel_ct_name ] = [ self ]
120 else
121 @@generated_celltype[ @shared_channel_ct_name ] << self
122 end
123
124 if @@generated_celltype[ @ct_name ] == nil then
125 @@generated_celltype[ @ct_name ] = [ self ]
126 else
127 @@generated_celltype[ @ct_name ] << self
128 end
129
130 gen_marshaler_celltype
131 # 同じ内容を二度書く可能性あり (AppFile は不可)
132
133 if @signature.need_PPAllocator? then
134 alloc_call_port = " call sPPAllocator cPPAllocator;\n"
135 alloc_call_port_join = " cPPAllocator => composite.cPPAllocator;\n"
136 else
137 alloc_call_port = ""
138 alloc_call_port_join = ""
139 end
140
141 f = CFile.open( @rpc_channel_celltype_file_name, "w" )
142 # 同じ内容を二度書く可能性あり (AppFile は不可)
143
144 f.print <<EOT
145import( "#{@marshaler_celltype_file_name}" );
146
147composite #{@rpc_channel_celltype_name} {
148 /* Interface */
149 call #{@signature.get_namespace_path} #{@call_port_name};
150 entry #{@signature.get_namespace_path} eThroughEntry;
151 call sTDR cTDR;
152 call sEventflag cEventflag;
153 entry sUnmarshalerMain eUnmarshalAndCallFunction;
154#{alloc_call_port}
155 [optional]
156 call sSemaphore cLockChannel;
157
158 /* Implementation */
159 cell #{@marshaler_celltype_name} #{@signature.get_global_name}_marshaler{
160 cTDR => composite.cTDR;
161 cEventflag => composite.cEventflag;
162 cLockChannel => composite.cLockChannel;
163 };
164 cell #{@unmarshaler_celltype_name} #{@signature.get_global_name}_unmarshaler{
165 cTDR => composite.cTDR;
166 cEventflag => composite.cEventflag;
167 cServerCall => composite.#{@call_port_name};
168#{alloc_call_port_join} };
169 composite.eThroughEntry => #{@signature.get_global_name}_marshaler.eClientEntry;
170 composite.eUnmarshalAndCallFunction => #{@signature.get_global_name}_unmarshaler.eUnmarshalAndCallFunction;
171};
172EOT
173 # mikan stackSize option & 最新 tecs_package 対応
174
175 f.close
176
177 f = CFile.open( "#{$gen}/#{@shared_channel_ct_name}.cdl", "w" )
178 # 同じ内容を二度書く可能性あり (AppFile は不可)
179
180 f.print <<EOT
181[active]
182composite #{@shared_channel_ct_name} {
183 /* Interface */
184 entry sSemaphore eSemaphore[];
185 call sUnmarshalerMain cUnmarshalAndCallFunction[];
186
187 entry sDataqueue eDataqueue;
188 entry sTDR eTDR;
189 entry sEventflag eEventflag;
190
191 attr {
192 PRI priority;
193 };
194
195 /* Implementation */
196 cell #{@channelCelltype} Channel{
197 };
198 cell tSemaphore Semaphore {count = 1; attribute = C_EXP("TA_NULL");};
199 cell tRPCSharedTaskMain RPCSharedTaskMain {
200 cUnmarshalAndCallFunction => composite.cUnmarshalAndCallFunction;
201 cServerSideTDR = Channel.eTDR;
202 };
203 cell tRPCSharedChannelMan RPCChannelMan {
204 cSemaphore = Semaphore.eSemaphore;
205 cClientSideTDR = Channel.eTDR;
206 };
207 cell tTask RPCSharedTask {
208 cBody = RPCSharedTaskMain.eMain;
209 taskAttribute = C_EXP("TA_ACT");
210 stackSize = 4096;
211 priority = composite.priority;
212 };
213 composite.eTDR => Channel.eTDR;
214 composite.eEventflag => Channel.eEventflag;
215 composite.eSemaphore => RPCChannelMan.eSemaphore;
216 composite.eDataqueue => Channel.eDataqueue;
217};
218EOT
219 f.close
220
221 end
222
223 #=== through cell コードを生成
224 #
225 #
226 def gen_through_cell_code( file )
227
228 gen_plugin_decl_code( file )
229
230 file.print <<EOT
231import( "#{@rpc_channel_celltype_file_name}" );
232import( "#{$gen}/#{@shared_channel_ct_name}.cdl" );
233EOT
234
235 # nest = @next_cell.get_region.gen_region_str_pre file
236 nest = @region.gen_region_str_pre file
237 indent_str = " " * nest
238
239 # セルを探す
240 # path =["::",@next_cell.get_name]
241 # cell = Namespace.find( path )
242 cell = Namespace.find( @next_cell.get_namespace_path )
243
244 # PPAllocator が必要か?
245 if @signature.need_PPAllocator? then
246 if @sub_channel_no == 0 then
247 file.print <<EOT
248#{indent_str}cell tPPAllocator PPAllocator_#{@shared_channel_cell}{
249#{indent_str} heapSize = #{@PPAllocatorSize};
250#{indent_str}};
251EOT
252 end
253
254 ppallocator_join = "#{indent_str} cPPAllocator = PPAllocator_#{@shared_channel_cell}.ePPAllocator;\n"
255 else
256 ppallocator_join = ""
257 end
258
259 # 共有される通信チャンネルの生成のプロトタイプ宣言
260 file.print <<EOT
261#{indent_str}cell #{@shared_channel_ct_name} #{@shared_channel_cell};
262EOT
263
264 # ここから各結合ごとのセルを生成
265
266 # アロケータの指定があるか?
267 if cell.get_allocator_list.length > 0 then
268
269 file.print "#{indent_str}[allocator("
270
271 delim = ""
272 cell.get_allocator_list.each do |type, eport, subsc, func, buf, alloc|
273
274 file.print delim
275 delim = ",\n#{indent_str} " # 最終行には出さない
276
277 if subsc then # 配列添数
278 subsc_str = '[#{subsc}]'
279 else
280 subsc_str = ""
281 end
282
283 eport = "eThroughEntry" #RPCの受け口名に変更
284 file.print "#{eport}#{subsc_str}.#{func}.#{buf} = #{alloc}"
285 end
286
287 file.puts ")]"
288 end
289
290 # セル本体の生成
291 file.print <<EOT
292#{indent_str}cell #{@rpc_channel_celltype_name} #{@cell_name} {
293#{indent_str} #{@call_port_name} = #{@next_cell.get_name}.#{@next_cell_port_name};
294#{indent_str} cTDR = #{@shared_channel_cell}.eTDR;
295#{indent_str} cEventflag = #{@shared_channel_cell}.eEventflag;
296#{indent_str} cLockChannel = #{@shared_channel_cell}.eSemaphore[#{@sub_channel_no}];
297#{ppallocator_join}#{indent_str}};
298EOT
299 @region.gen_region_str_post file
300 end
301
302 #=== 後ろのコードを生成
303 #プラグインの後ろのコードを生成
304 #file:: File:
305 def self.gen_post_code( file )
306 file.print "/* '#{self.name}' post code */\n"
307 @@shared_channel_list.each{ |chan_name,plugin_obj|
308 plugin_obj[0].gen_post_code( file, plugin_obj )
309 }
310 end
311
312 #=== 後ろのコードを生成
313 # plugin_obj[0] が代表して出力する(インスタンス変数にアクセスしたいため)
314 def gen_post_code( file, plugin_obj )
315
316 chan_name = @shared_channel_cell
317
318 nest = @region.gen_region_str_pre file
319 indent_str = " " * nest
320
321 # 共有されている通信チャンネルの生成
322 # 各プラグインインスタンスでは @shared_channel_ct_name として記憶している
323 file.print "#{indent_str}cell tSharedRPCPlugin_#{@channelCelltype} #{chan_name} {\n"
324 plugin_obj.each{ |po|
325 file.print <<EOT
326#{indent_str} cUnmarshalAndCallFunction[] = #{@cell_name}.eUnmarshalAndCallFunction;
327EOT
328 }
329 file.printf "#{indent_str} priority = #{@task_priority};\n#{indent_str}};\n"
330 @region.gen_region_str_post file
331
332 end
333
334end
335
Note: See TracBrowser for help on using the repository browser.