source: atk2-sc3_fl850f1l/utils/gentest@ 117

Last change on this file since 117 was 117, checked in by ertl-ishikawa, 9 years ago

ATK2-SC3 1.3.2 FL850F1L(RH850F1L)依存部(GCC/GHS/CCRH)を追加

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