source: rtos_arduino/trunk/asp_1.9.2/utils/genoffset@ 136

Last change on this file since 136 was 136, checked in by ertl-honda, 8 years ago

ライブラリとOS及びベーシックなサンプルの追加.

File size: 6.9 KB
Line 
1#! /usr/bin/perl
2#
3# TOPPERS Software
4# Toyohashi Open Platform for Embedded Real-Time Systems
5#
6# Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
7# Toyohashi Univ. of Technology, JAPAN
8# Copyright (C) 2004-2011 by Embedded and Real-Time Systems Laboratory
9# Graduate School of Information Science, Nagoya Univ., JAPAN
10#
11# 上記著作権者
12は,以下の(1)~(4)の条件を満たす場合に限り,本ソフトウェ
13# ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
14# 変・再é…
15å¸ƒï¼ˆä»¥ä¸‹ï¼Œåˆ©ç”¨ã¨å‘¼ã¶ï¼‰ã™ã‚‹ã“とを無償で許諾する.
16# (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
17# 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
18# スコード中に含まれていること.
19# (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
20# 用できる形で再é…
21å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œå†é…
22å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨
23# 者
24マニュアルなど)に,上記の著作権表示,この利用条件および下記
25# の無保証規定を掲載すること.
26# (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
27# 用できない形で再é…
28å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œæ¬¡ã®ã„ずれかの条件を満たすこ
29# と.
30# (a) 再é…
31å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨è€…
32マニュアルなど)に,上記の著
33# 作権表示,この利用条件および下記の無保証規定を掲載すること.
34# (b) 再é…
35å¸ƒã®å½¢æ…
36‹ã‚’,別に定める方法によって,TOPPERSプロジェクトに
37# 報告すること.
38# (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
39# 害からも,上記著作権者
40およびTOPPERSプロジェクトをå…
41è²¬ã™ã‚‹ã“と.
42# また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
43# 由に基づく請求からも,上記著作権者
44およびTOPPERSプロジェクトを
45# å…
46è²¬ã™ã‚‹ã“と.
47#
48# 本ソフトウェアは,無保証で提供されているものである.上記著作権者
49お
50# よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
51# に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
52# アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
53# の責任を負わない.
54#
55# @(#) $Id: genoffset 2253 2011-09-11 01:23:40Z ertl-hiro $
56#
57
58#
59# 初期化
60#
61$infile = $ARGV[0];
62$sil_endian = "";
63
64#
65# 解釈できるディレクティブのテーブル
66#
67%directives = (
68 "long", "",
69 "dword", "",
70 "word", "",
71 "hword", "",
72 "int", "",
73 "short", "",
74 "half", "",
75 "byte", "",
76 "value", "",
77 "uaword", "",
78 "uashort", "",
79 "data32", 4,
80 "data16", 2,
81 "data8", 1,
82 "zero", -1,
83 "space", -1,
84 "globl", 0,
85 "global", 0,
86 "align", 0,
87 "p2align", 0,
88 "even", 0,
89 "data", 0,
90 "stabs", 0,
91 "type", 0,
92 "size", 0,
93 "section", 0,
94 "sdata", 0,
95 "code", 0,
96);
97
98#
99# オフセット値の出力
100#
101sub parse_offset {
102 my($label, $val) = @_;
103
104 printf "#define %s\t%d\n",$label,$val;
105}
106
107#
108# ディレクティブの読み取り
109#
110sub ref_bit {
111 my($size) = @_;
112 my($dir, $directive);
113
114 while ($line = <INFILE>) {
115 chomp $line;
116 next if ($line =~ /^[ \t]*[#;].*$/);
117
118 if ($line =~ /[ \t]*\.([a-zA-Z0-9]+)[ \t]*([^ \t]*)[ \t]*/
119 && defined($dir = $directives{$1})) {
120 $directive = $1;
121 if ($dir eq "") {
122 # 登録すべきディレクティブ
123 $directives{$directive} = $size;
124 }
125 last;
126 }
127 else {
128 # 解析できない行
129 print STDERR "genoffset: cannot parse: $line\n";
130 $error = 1;
131 }
132 }
133}
134
135#
136# ビットサーチ
137#
138sub search_bit {
139 my($val) = @_;
140 my($val_bit);
141
142 return(-1) if ($val == 0);
143
144 $val_bit = 0;
145 while (($val & 1) == 0) {
146 $val >>= 1;
147 $val_bit++;
148 }
149 return($val_bit);
150}
151
152#
153# ビット位置の出力
154#
155sub parse_bit {
156 my($endian, $size, $label) = @_;
157 my($offset, $dir, $val, $val_bit);
158
159 if ($sil_endian && $endian ne $sil_endian) {
160 # エンディアンの不一致
161 print STDERR "genoffset: endian mismatch: $line\n";
162 $error = 1;
163 }
164
165 $offset = 0;
166 while ($line = <INFILE>) {
167 chomp $line;
168 next if ($line =~ /^[ \t]*[#;].*$/);
169
170 if ($line =~ /[ \t]*\.([a-zA-Z0-9]+)[ \t]*([^ \t]*)[ \t]*/
171 && defined($dir = $directives{$1})) {
172 $val = $2;
173
174 # 16進数と8進数の数値への変換処理
175 if ($val =~ /^0x(.+)$/) {
176 $val = hex($1);
177 }
178 elsif ($val =~ /^0(.+)$/) {
179 $val = oct($1);
180 }
181
182 if ($dir eq "") {
183 # サイズを知らないディレクティブ
184 print STDERR "genoffset: unknown directive: $line\n";
185 $error = 1;
186 }
187 elsif ($dir == 0) {
188 # 読み飛ばすべきディレクティブ
189 }
190 elsif ($dir == -1) {
191 # .zeroディレクティブの処理
192 $offset += $val;
193 }
194 elsif ($val == 0) {
195 # 値が0のフィールドの処理
196 $offset += $dir;
197 }
198 else {
199 # 値が0でないフィールドが見つかればループを終了
200 last;
201 }
202 }
203 else {
204 # 解析できない行
205 print STDERR "genoffset: cannot parse: $line\n";
206 $error = 1;
207 }
208 }
209
210 # ビット位置を探す
211 $val_bit = search_bit($val);
212
213 # バイト単位に換算する
214 if ($endian eq "B") {
215 $offset += $dir - 1;
216 $offset -= $val_bit >> 3;
217 }
218 else {
219 $offset += $val_bit >> 3;
220 }
221 $val_bit &= 0x07;
222
223 # 出力単位に換算する
224 if ($size eq "W") {
225 if ($endian eq "B") {
226 $val_bit += 24;
227 $val_bit -= ($offset & 0x03) << 3;
228 }
229 else {
230 $val_bit += ($offset & 0x03) << 3;
231 }
232 $offset &= ~0x03;
233 }
234 elsif ($size eq "H") {
235 if ($endian eq "B") {
236 $val_bit += 8;
237 $val_bit -= ($offset & 0x01) << 3;
238 }
239 else {
240 $val_bit += ($offset & 0x01) << 3;
241 }
242 $offset &= ~0x01;
243 }
244
245 # 定義の出力
246 $label =~ s/^_//;
247 printf "#define %s\t%d\n",$label,$offset;
248 printf "#define %s_bit\t%d\n",$label,$val_bit;
249 printf "#define %s_mask\t0x%x\n",$label,(1 << $val_bit);
250}
251
252#
253# メインルーチン
254#
255print "/* This file is generated by genoffset. */\n";
256print "\n";
257
258$error = 0;
259open(INFILE, $infile) || die "Cannot open $infile";
260while ($line = <INFILE>) {
261 chomp $line;
262
263 if ($line =~ /^[ \t]*OFFSET_DEF ([^ \t]+) = [#\$]?([^ \t]+)/) {
264 parse_offset($1, $2);
265 }
266 elsif ($line =~ /^[ \t]*_?BIT_REF_([0-9]+):/) {
267 ref_bit($1);
268 }
269 elsif ($line =~ /^[ \t]*SIL_ENDIAN = ([BL])/) {
270 $sil_endian = $1;
271 }
272}
273#
274# コンパイラがグローバル変数のé…
275ç½®é †åºã‚’変更すると,BIT_REF_?が下にな
276# る可能性があるため,頭から読み直す.
277#
278seek(INFILE, 0, SEEK_SET);
279while ($line = <INFILE>) {
280 chomp $line;
281
282 if ($line =~ /^[ \t]*_?BIT_([BL])([BHW])_([^ \t]+):/) {
283 parse_bit($1, $2, $3);
284 }
285}
286close(INFILE);
287exit($error);
Note: See TracBrowser for help on using the repository browser.