source: asp_ewarm/asp-1.7.0/utils/gentest

Last change on this file was 61, checked in by ertl-honda, 11 years ago

ASP for EWARM のコミット.

File size: 7.4 KB
Line 
1#! /usr/bin/perl
2#
3# TOPPERS Software
4# Toyohashi Open Platform for Embedded Real-Time Systems
5#
6# Copyright (C) 2007-2008 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# 本ソフトウェアは,無保証で提供されているものである.上記著作権者お
33# よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
34# に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
35# アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
36# の責任を負わない.
37#
38# @(#) $Id: gentest 1546 2009-05-08 10:05:22Z ertl-hiro $
39#
40
41#
42# テストプログラム生成ツール
43#
44
45$infile = $ARGV[0];
46
47%parampos = (
48 "get_pri" => 2,
49 "get_inf" => 1,
50 "ref_tsk" => 2,
51 "ref_tex" => 2,
52 "ref_sem" => 2,
53 "ref_flg" => 2,
54 "ref_dtq" => 2,
55 "ref_pdq" => 2,
56 "ref_mbx" => 2,
57 "ref_mtx" => 2,
58 "ref_mpf" => 2,
59 "get_tim" => 1,
60 "get_utm" => 1,
61 "ref_cyc" => 2,
62 "ref_alm" => 2,
63 "get_tid" => 1,
64 "iget_tid" => 1,
65 "get_ipm" => 1,
66);
67
68%paramtype = (
69 "get_pri" => "PRI",
70 "get_inf" => "intptr_t",
71 "ref_tsk" => "T_RTSK",
72 "ref_tex" => "T_RTEX",
73 "ref_sem" => "T_RSEM",
74 "ref_flg" => "T_RFLG",
75 "ref_dtq" => "T_RDTQ",
76 "ref_pdq" => "T_RPDQ",
77 "ref_mbx" => "T_RMBX",
78 "ref_mtx" => "T_RMTX",
79 "ref_mpf" => "T_RMPF",
80 "get_tim" => "SYSTIM",
81 "get_utm" => "SYSUTM",
82 "ref_cyc" => "T_RCYC",
83 "ref_alm" => "T_RALM",
84 "get_tid" => "ID",
85 "iget_tid" => "ID",
86 "get_ipm" => "PRI",
87);
88
89sub gen_var_def {
90 local($svc_call) = @_;
91 local($svcname, @params);
92 local($typename, $varname);
93
94 if ($svc_call =~ /^([a-z_]+)\((.*)\)$/) {
95 $svcname = $1;
96 @params = split(/\s*,\s*/, $2);
97
98 if ($parampos{$svcname}) {
99 $varname = $params[@parampos{$svcname} - 1];
100 $varname =~ s/^\&//;
101 $typename = $paramtype{$svcname};
102 ${$TASKVAR{$tskid}}{$typename} = ${varname};
103 }
104 }
105}
106
107sub gen_svc_call {
108 local($svc_call, $error_code_string) = @_;
109 local($error_code);
110
111 $TASKCODE{$tskid} .= $indentstr;
112 $TASKCODE{$tskid} .= sprintf("ercd = %s;\n", $svc_call);
113 do gen_var_def($svc_call);
114
115 if ($error_code_string eq "") {
116 $TASKCODE{$tskid} .= $indentstr;
117 $TASKCODE{$tskid} .= sprintf("check_ercd(ercd, E_OK);\n");
118 }
119 elsif ($error_code_string =~ /^\-\>\s*noreturn$/) {
120 # do nothing.
121 }
122 else {
123 $error_code = $error_code_string;
124 $error_code =~ s/^\-\>\s*([A-Z_]*)$/$1/;
125 $TASKCODE{$tskid} .= $indentstr;
126 $TASKCODE{$tskid} .= sprintf("check_ercd(ercd, %s);\n", $error_code);
127 }
128}
129
130sub parse_line {
131 local($line) = @_;
132
133 if ($line =~ /^\.\./) {
134 # do nothing.
135 }
136 elsif ($line =~ /^==\s*((TASK|ALM)[0-9]+)(.*)$/) {
137 $startflag = 1;
138 $tskid = $1;
139 $line2 = $3;
140 if ($line2 =~ /^\-([0-9]+)/) {
141 $tskcount = $1;
142 $indentstr = "\t\t";
143 if (!$TASKCOUNT{$tskid}) {
144 $TASKCOUNT{$tskid} = 0;
145 if ($tskid =~ /^TASK([0-9]+)$/) {
146 $countvar = "task$1_count";
147 }
148 elsif ($tskid =~ /^ALM([0-9]+)$/) {
149 $countvar = "alarm$1_count";
150 }
151 $TASKCOUNTVAR{$tskid} = $countvar;
152 }
153 if ($tskcount == $TASKCOUNT{$tskid} + 1) {
154 if ($tskcount > 1) {
155 $TASKCODE{$tskid} .= "\n".$indentstr;
156 $TASKCODE{$tskid} .= sprintf("check_point(0);\n\n");
157 }
158 $TASKCOUNT{$tskid} = $tskcount;
159 $TASKCODE{$tskid} .= sprintf("\tcase %d:", $tskcount);
160 }
161 elsif ($tskcount != $TASKCOUNT{$tskid}) {
162 printf STDERR "Subtask count error: %d-%d\n",$tskid,$tskcount;
163 }
164 }
165 else {
166 $tskcount = "";
167 $indentstr = "\t";
168 }
169 }
170 elsif (!$startflag) {
171 # do nothing.
172 }
173 elsif ($line =~ /^(assert\(.*\))$/) {
174 $assert_string = $1;
175 $TASKCODE{$tskid} .= $indentstr;
176 $TASKCODE{$tskid} .= sprintf("check_%s;\n", $assert_string);
177 }
178 elsif ($line =~ /^call\((.*)\)$/) {
179 $call_string = $1;
180 $TASKCODE{$tskid} .= "\n".$indentstr;
181 $TASKCODE{$tskid} .= sprintf("%s;\n", $call_string);
182 }
183 elsif ($line =~ /^([0-9]+)\:\s*MISSING$/) {
184 $check_no = $1;
185 $TASKCODE{$tskid} .= "\n".$indentstr;
186 $TASKCODE{$tskid} .= sprintf("check_point(%d);\n", $check_no);
187 }
188 elsif ($line =~ /^([0-9]+)\:\s*RETURN$/) {
189 $check_no = $1;
190 $TASKCODE{$tskid} .= "\n".$indentstr;
191 $TASKCODE{$tskid} .= sprintf("check_point(%d);\n", $check_no);
192 $TASKCODE{$tskid} .= $indentstr;
193 $TASKCODE{$tskid} .= "return;\n";
194 }
195 elsif ($line =~ /^RETURN$/) {
196 $TASKCODE{$tskid} .= "\n".$indentstr;
197 $TASKCODE{$tskid} .= "return;\n";
198 }
199 elsif ($line =~ /^([0-9]+)\:\s*END$/) {
200 $check_no = $1;
201 $TASKCODE{$tskid} .= "\n".$indentstr;
202 $TASKCODE{$tskid} .= sprintf("check_finish(%d);\n", $check_no);
203 $endflag = 1;
204 }
205 elsif ($line =~ /^([0-9]+)\:\s*([a-z_]+\(.*\))\s*(\-\>\s*[A-Za-z_]*)?\s*$/) {
206 $check_no = $1;
207 $svc_call = $2;
208 $error_code_string = $3;
209 $TASKCODE{$tskid} .= "\n".$indentstr;
210 $TASKCODE{$tskid} .= sprintf("check_point(%d);\n", $check_no);
211 do gen_svc_call($svc_call, $error_code_string);
212 }
213 elsif ($line =~ /^([a-z_]+\(.*\))\s*(\-\>\s*[A-Za-z_]*)?\s*$/) {
214 $svc_call = $1;
215 $error_code_string = $2;
216 $TASKCODE{$tskid} .= "\n";
217 do gen_svc_call($svc_call, $error_code_string);
218 }
219 else {
220 print STDERR "Error: ",$line,"\n";
221 }
222}
223
224#
225# スクリプトファイル読込み処理
226#
227$startflag = 0;
228$endflag = 0;
229open(INFILE, $infile) || die "Cannot open $infile";
230while (($line = <INFILE>) && !$endflag) {
231 chomp $line;
232 $line =~ s/^\s*\*\s*//;
233 $line =~ s/\s*\/\/.*$//;
234 $line =~ s/\s*\.\.\..*$//;
235 next unless($line);
236 do parse_line($line);
237}
238close(INFILE);
239
240#
241# タスクコードの出力
242#
243sub output_task {
244 if ($TASKCOUNT{$tskid}) {
245 printf "\nstatic uint_t\t%s = 0;\n", $TASKCOUNTVAR{$tskid};
246 }
247 print "\nvoid\n";
248 if ($tskid =~ /^TASK([0-9]+)$/) {
249 print "task$1(intptr_t exinf)\n";
250 }
251 elsif ($tskid =~ /^ALM([0-9]+)$/) {
252 print "alarm$1_handler(intptr_t exinf)\n";
253 }
254 print "{\n";
255 print "\tER\t\tercd;\n";
256 foreach $typename (keys(%{$TASKVAR{$tskid}})) {
257 print "\t",$typename, (length($typename) < 4 ? "\t\t" : "\t"),
258 ${$TASKVAR{$tskid}}{$typename},";\n";
259 }
260 if ($TASKCOUNT{$tskid}) {
261 printf "\n\tswitch (++%s) {\n", $TASKCOUNTVAR{$tskid};
262 }
263 print $TASKCODE{$tskid};
264 if ($TASKCOUNT{$tskid}) {
265 printf "\n\t\tcheck_point(0);\n";
266 printf "\t}\n";
267 }
268 else {
269 print "\n";
270 }
271 print "\tcheck_point(0);\n";
272 print "}\n";
273}
274
275#
276# テストプログラム出力処理
277#
278foreach $tskid (sort(keys(TASKCODE))) {
279 do output_task();
280}
Note: See TracBrowser for help on using the repository browser.