source: azure_iot_hub_f767zi/trunk/asp_baseplatform/utils/gentest@ 457

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

ファイルを追加

File size: 10.2 KB
Line 
1#! /usr/bin/perl
2#
3# TOPPERS Software
4# Toyohashi Open Platform for Embedded Real-Time Systems
5#
6# Copyright (C) 2007-2014 by Embedded and Real-Time Systems Laboratory
7# Graduate School of Information Science, Nagoya Univ., JAPAN
8#
9# 上記著作権者
10は,以下の(1)~(4)の条件を満たす場合に限り,本ソフトウェ
11# ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
12# 変・再é…
13å¸ƒï¼ˆä»¥ä¸‹ï¼Œåˆ©ç”¨ã¨å‘¼ã¶ï¼‰ã™ã‚‹ã“とを無償で許諾する.
14# (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
15# 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
16# スコード中に含まれていること.
17# (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
18# 用できる形で再é…
19å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œå†é…
20å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨
21# 者
22マニュアルなど)に,上記の著作権表示,この利用条件および下記
23# の無保証規定を掲載すること.
24# (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
25# 用できない形で再é…
26å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œæ¬¡ã®ã„ずれかの条件を満たすこ
27# と.
28# (a) 再é…
29å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨è€…
30マニュアルなど)に,上記の著
31# 作権表示,この利用条件および下記の無保証規定を掲載すること.
32# (b) 再é…
33å¸ƒã®å½¢æ…
34‹ã‚’,別に定める方法によって,TOPPERSプロジェクトに
35# 報告すること.
36# (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
37# 害からも,上記著作権者
38およびTOPPERSプロジェクトをå…
39è²¬ã™ã‚‹ã“と.
40# また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
41# 由に基づく請求からも,上記著作権者
42およびTOPPERSプロジェクトを
43# å…
44è²¬ã™ã‚‹ã“と.
45#
46# 本ソフトウェアは,無保証で提供されているものである.上記著作権者
47お
48# よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
49# に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
50# アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
51# の責任を負わない.
52#
53# $Id$
54#
55
56#
57# テストプログラム生成ツール
58#
59
60use open ":encoding(euc-jp)";
61use encoding "euc-jp";
62
63$infile = $ARGV[0];
64
65%parampos = (
66 "get_pri" => 2,
67 "get_inf" => 1,
68 "ref_tsk" => 2,
69 "ref_tex" => 2,
70 "ref_sem" => 2,
71 "ref_flg" => 2,
72 "ref_dtq" => 2,
73 "ref_pdq" => 2,
74 "ref_mbx" => 2,
75 "ref_mtx" => 2,
76 "ref_mbf" => 2,
77 "ref_mpf" => 2,
78 "get_tim" => 1,
79 "get_utm" => 1,
80 "ref_cyc" => 2,
81 "ref_alm" => 2,
82 "get_tid" => 1,
83 "iget_tid" => 1,
84 "get_ipm" => 1,
85);
86
87%paramtype = (
88 "get_pri" => "PRI",
89 "get_inf" => "intptr_t",
90 "ref_tsk" => "T_RTSK",
91 "ref_tex" => "T_RTEX",
92 "ref_sem" => "T_RSEM",
93 "ref_flg" => "T_RFLG",
94 "ref_dtq" => "T_RDTQ",
95 "ref_pdq" => "T_RPDQ",
96 "ref_mbx" => "T_RMBX",
97 "ref_mtx" => "T_RMTX",
98 "ref_mbf" => "T_RMBF",
99 "ref_mpf" => "T_RMPF",
100 "get_tim" => "SYSTIM",
101 "get_utm" => "SYSUTM",
102 "ref_cyc" => "T_RCYC",
103 "ref_alm" => "T_RALM",
104 "get_tid" => "ID",
105 "iget_tid" => "ID",
106 "get_ipm" => "PRI",
107);
108
109$last_check_point = 0;
110
111sub gen_var_def {
112 local($svc_call) = @_;
113 local($svcname, @params);
114 local($typename, $varname);
115
116 if ($svc_call =~ /^([a-z_]+)\((.*)\)$/) {
117 $svcname = $1;
118 @params = split(/\s*,\s*/, $2);
119
120 if ($parampos{$svcname}) {
121 $varname = $params[@parampos{$svcname} - 1];
122 $varname =~ s/^\&//;
123 $typename = $paramtype{$svcname};
124 ${$TASKVAR{$tskid}}{$typename} = ${varname};
125 }
126 }
127}
128
129sub gen_svc_call {
130 local($svc_call, $error_code_string) = @_;
131 local($error_code);
132
133 ${$TASKVAR{$tskid}}{"ER_UINT"} = "ercd";
134
135 push(@{$TASKCODE{$tskid}{$tskcnt}}, sprintf("\tercd = %s;", $svc_call));
136 gen_var_def($svc_call);
137
138 if ($error_code_string eq "") {
139 push(@{$TASKCODE{$tskid}{$tskcnt}},
140 sprintf("\tcheck_ercd(ercd, E_OK);"), "");
141 }
142 elsif ($error_code_string =~ /^\-\>\s*noreturn$/) {
143 push(@{$TASKCODE{$tskid}{$tskcnt}}, "");
144 }
145 else {
146 $error_code = $error_code_string;
147 $error_code =~ s/^\-\>\s*([A-Za-z0-9_]*)$/$1/;
148 push(@{$TASKCODE{$tskid}{$tskcnt}},
149 sprintf("\tcheck_ercd(ercd, %s);", $error_code), "");
150 }
151}
152
153sub parse_line {
154 local($line) = @_;
155
156 while ($line =~ s/\\$//) {
157 $line1 = <INFILE>;
158 $output_line .= $line1;
159 chomp $line1;
160 $line1 =~ s/^\s*\*\s*//;
161 $line1 =~ s/\s*\/\/.*$//;
162 $line1 =~ s/\s*\.\.\..*$//;
163 $line .= $line1;
164 }
165
166 if ($line =~ /^\.\./) {
167 # do nothing.
168 }
169 elsif ($line =~ /^==\s*((TASK|ALM|CPUEXC|EXTSVC)[0-9]*)(.*)$/) {
170 $procflag = 1;
171 $tskid = $1;
172 $line2 = $3;
173 if ($line2 =~ /^\-TEX(.*)$/) {
174 $tskid = $tskid."-TEX";
175 $line2 = $1;
176 }
177 if ($line2 =~ /^\-([0-9]+)(.*)$/) {
178 $tskcnt = $1;
179 if (!$TASKCOUNTVAR{$tskid}) {
180 if ($tskid =~ /^TASK([0-9]*)$/) {
181 $countvar = "task$1_count";
182 }
183 elsif ($tskid =~ /^TASK([0-9]*)-TEX$/) {
184 $countvar = "tex_task$1_count";
185 }
186 elsif ($tskid =~ /^ALM([0-9]*)$/) {
187 $countvar = "alarm$1_count";
188 }
189 elsif ($tskid =~ /^CPUEXC([0-9]*)$/) {
190 $countvar = "cpuexc$1_count";
191 }
192 elsif ($tskid =~ /^EXTSVC([0-9]*)$/) {
193 $countvar = "extsvc$1_count";
194 }
195 $TASKCOUNTVAR{$tskid} = $countvar;
196 }
197 }
198 else {
199 $tskcnt = "";
200 }
201 if ($startflag) {
202 push(@{$TASKCODE{$tskid}{$tskcnt}}, "\ttest_start(__FILE__);");
203 push(@{$TASKCODE{$tskid}{$tskcnt}}, "");
204 $startflag = 0;
205 }
206 }
207 elsif (!$procflag) {
208 # do nothing.
209 }
210 elsif ($line =~ /^([0-9]+\:)\s*END$/) {
211 $check_str = $1;
212 $check_no = ++$last_check_point;
213 push(@{$TASKCODE{$tskid}{$tskcnt}},
214 sprintf("\tcheck_finish(%d);", $check_no));
215 $procflag = 0;
216 $output_line =~ s/$check_str/$check_no:/;
217 }
218 else {
219 if ($line =~ /^([0-9]+\:)\s*(.*)/) {
220 $check_str = $1;
221 $line = $2;
222 $check_no = ++$last_check_point;
223 push(@{$TASKCODE{$tskid}{$tskcnt}},
224 sprintf("\tcheck_point(%d);", $check_no));
225 $output_line =~ s/$check_str/$check_no:/;
226 }
227 if ($line =~ /^(assert\(.*\))$/) {
228 $assert_string = $1;
229 push(@{$TASKCODE{$tskid}{$tskcnt}},
230 sprintf("\tcheck_%s;", $assert_string), "");
231 }
232 elsif ($line =~ /^(state(_i)?\(.*\))$/) {
233 $state_string = $1;
234 push(@{$TASKCODE{$tskid}{$tskcnt}},
235 sprintf("\tcheck_%s;", $state_string), "");
236 }
237 elsif ($line =~ /^call\((.*)\)$/ || $line =~ /^DO\((.*)\)$/) {
238 $call_string = $1;
239 push(@{$TASKCODE{$tskid}{$tskcnt}},
240 sprintf("\t%s;", $call_string), "");
241 }
242 elsif ($line =~ /^MISSING$/) {
243 push(@{$TASKCODE{$tskid}{$tskcnt}}, "");
244 }
245 elsif ($line =~ /^RETURN((\(.*\))?)$/) {
246 $return_string = $1;
247 push(@{$TASKCODE{$tskid}{$tskcnt}},
248 "\treturn".$return_string.";", "");
249 }
250 elsif ($line =~ /^GOTO\((.*)\)$/) {
251 $goto_string = $1;
252 push(@{$TASKCODE{$tskid}{$tskcnt}},
253 sprintf("\tgoto %s;", $goto_string), "");
254 }
255 elsif ($line =~ /^LABEL\((.*)\)$/) {
256 $label_string = $1;
257 $indent_string = $indentstr;
258 $indent_string =~ s/\t$//;
259 push(@{$TASKCODE{$tskid}{$tskcnt}},
260 sprintf("%s:", $label_string));
261 }
262 elsif ($line =~ /^([a-z_]+\(.*\))\s*(\-\>\s*[A-Za-z0-9_]*)?\s*$/) {
263 $svc_call = $1;
264 $error_code_string = $2;
265 gen_svc_call($svc_call, $error_code_string);
266 }
267 else {
268 print STDERR "Error: ",$line,"\n";
269 }
270 }
271}
272
273#
274# スクリプトファイル読込み処理
275#
276$procflag = 0;
277$startflag = 1;
278$outflag = 1;
279open(INFILE, $infile) || die "Cannot open $infile";
280while (($line = <INFILE>) && $outflag) {
281 $output_line = $line;
282 chomp $line;
283 $line =~ s/^\s*\*\s*//;
284 $line =~ s/\s*\/\/.*$//;
285 $line =~ s/\s*\.\.\..*$//;
286 if ($line) {
287 parse_line($line);
288 }
289 print $output_line;
290 if ($output_line =~ /DO NOT DELETE THIS LINE/) {
291 $outflag = 0;
292 }
293}
294close(INFILE);
295
296#
297# タスクの変数定義のコード出力
298#
299sub output_task_vardef {
300 my($tskid) = @_;
301
302 foreach my $typename (keys(%{$TASKVAR{$tskid}})) {
303 print "\t",$typename, (length($typename) < 4 ? "\t\t" : "\t"),
304 ${$TASKVAR{$tskid}}{$typename},";\n";
305 }
306}
307
308#
309# タスク本体のコード出力
310#
311sub output_task_body {
312 my($tskid) = @_;
313
314 foreach my $tskcnt (sort {$a <=> $b} (keys(%{$TASKCODE{$tskid}}))) {
315 printf "\tcase %d:\n", $tskcnt;
316 foreach my $line (@{$TASKCODE{$tskid}{$tskcnt}}) {
317 print "\t",$line if ($line);
318 print "\n";
319 }
320 printf "\t\tcheck_point(0);\n\n";
321 }
322}
323
324#
325# タスクコードの出力
326#
327sub output_task {
328 if ($TASKCOUNTVAR{$tskid}) {
329 printf "\nstatic uint_t\t%s = 0;\n", $TASKCOUNTVAR{$tskid};
330 }
331 if ($tskid =~ /^TASK([0-9]*)$/) {
332 print "\nvoid\n";
333 print "task$1(intptr_t exinf)\n";
334 }
335 elsif ($tskid =~ /^TASK([0-9]*)-TEX$/) {
336 print "\nvoid\n";
337 print "tex_task$1(TEXPTN texptn, intptr_t exinf)\n";
338 }
339 elsif ($tskid =~ /^ALM([0-9]*)$/) {
340 print "\nvoid\n";
341 print "alarm$1_handler(intptr_t exinf)\n";
342 }
343 elsif ($tskid =~ /^CPUEXC([0-9]*)$/) {
344 print "\nvoid\n";
345 print "cpuexc$1_handler(void *p_excinf)\n";
346 }
347 elsif ($tskid =~ /^EXTSVC([0-9]*)$/) {
348 print "\nER_UINT\n";
349 print "extsvc$1_routine(intptr_t par1, intptr_t par2, intptr_t par3,\n";
350 print "\t\t\t\t\t\t\t\tintptr_t par4, intptr_t par5, ID cdmid)\n";
351 }
352 print "{\n";
353 output_task_vardef($tskid);
354 print "\n";
355 if ($TASKCOUNTVAR{$tskid}) {
356 printf "\tswitch (++%s) {\n", $TASKCOUNTVAR{$tskid};
357 output_task_body($tskid);
358 printf "\tdefault:\n";
359 printf "\t\tcheck_point(0);\n";
360 printf "\t}\n";
361 }
362 else {
363 foreach my $line (@{$TASKCODE{$tskid}{""}}) {
364 print $line,"\n";
365 }
366 }
367 print "\tcheck_point(0);\n";
368 if ($tskid =~ /^EXTSVC([0-9]*)$/) {
369 print "\treturn(E_SYS);\n";
370 }
371 print "}\n";
372}
373
374#
375# テストプログラム出力処理
376#
377foreach $tskid (sort(keys(%TASKCODE))) {
378 output_task();
379}
Note: See TracBrowser for help on using the repository browser.