[gcc][AVR] attributeによるバイト数装飾

2010/03/11開発環境::gccimport

変数のビットサイズ~gcc方言の巻

avr-gccのstdint.hを見る

VMにWinXP32bitを放り込んで、WinAVR 20100110をインスコ。uint32_tが8bitになっとる、という話をmixiのコミュで見かけたので検証してみました。とりあえずコードレベルで追いかけるとして、ヘッダファイルを探索。

typedef unsigned int uint32_t __attribute__ ((__mode__ (__SI__))); 

・・・・なんぞこれ。

__attribute__ってあたりは、まぁ、なんぞローカル定義の装飾しているなぁとは思うわけですが、__SI__ってなによ...


変数サイズ指定

Anton-sanがいいこといった! Single Integerだそうだ。

・・・ナニソレ?


* Title: Gcc help pages about __mode__ keyword
* From: Anton Soppelsa <soppelsa at igi dot cnr dot it>
* To: gcc at gnu dot org
* Date: Tue, 22 Nov 2005 15:48:45 +0100
* Subject: Gcc help pages about __mode__ keyword

Dear GCC help pages maintainers,
I recently encountered a statement like this one


__attribute__((__mode__(__DI__)))

in a micro kernel source file.

As I'm not so skilled with this kind of C/C++ syntax I tried to read the manual about the keywords involved in that expression.
Despite I found information about "__attribute__" and "__mode__"
I wasn't able to find information about "__DI__" (on the gcc manual pages).
Of course I found in Internet partial explanation of the meaning of "__DI__" keyword and also found out that there are many of the same type like "__SI__", "__HI__", and "__QI__".
 By the way, do they mean Double-, Single-, Half-, Quarter-, -Integer?

The point is that it seem to me those identifiers are actually keywords of the compiler.
So they really have be mentioned (at least) in the compiler manual. Better would be if they are explained.
I guess that part of the manual is not so well maintained because I found only reference to the keywords "__byte__" or "__word__" or "__pointer__".


This message is just to inform u about something if u have the time to work about has to be done (in my opinion) .
Best regards,

※本文にメールアドレスがありましたが、削除しています。改行も入れました..

__SI__の謎

George-sanないすだ!CIL (C Intermediate Language)ということで、Cコンパイル時の中間言語の領域に到達した。やはりこのあたりから学ばないと、コンパイラの理解は終わらないようだな…。


GCC allows you to use the __mode__ attribute to specify the size of the integer instead of the standard char, short and so on:

int __attribute__ ((__mode__ (  __QI__ ))) i8;
int __attribute__ ((__mode__ (  __HI__ ))) i16;
int __attribute__ ((__mode__ (  __SI__ ))) i32;
int __attribute__ ((__mode__ (  __DI__ ))) i64;

ちょっとわかりづらい。CLI特有というわけでもないぽいなぁ...


答えは身近に―

後閑師のところで、C30の説明があり、ここで紹介されてました。ナンテコッタイw

以下、引用

typedef int __attribute__((__mode__(SI))) int32 ; // int32を32ビット幅の整数型と定義

modeで指定したビット幅の型を定義する\byteは1バイト整数型、wordは1ワード整数、pointerはポインタ型を定義する\modeには下記記号が使用できる\QI : 8ビット(char)\HI : 16ビット(int)\SI : 32ビット(long)\DI : 64ビット(long long)\SF : 32ビット(float)\DF : 64ビット(long double)ちょっぴり、アンダースコアの量が違いますが、まぁ、もともとも思想は同じと思って良いでしょう。処理系依存が多いでしょうし、迷ったときはアセンブラコードをはかせてみる。sizeof()でバイト数をチェックする、といった習慣をつけたほうが良いですね。特にマイコン屋さんは。仕事でも趣味でも。ね。。

注意

斜め読みどころか、英語弱いのにかじりながら見た部分が多いですので、鵜呑みにせずリンク先の情報を消化して納得してください。\WEBの情報がすべて正しいとは限りませんし、何事も本家までさかのぼるよう習慣付けましょう…。頼むよほんと(ぉ

2010/02/17(水)[perl] forkで子供がたくさん

子プロセスを作って並列処理

表題のとおり。自動計測系の構築などで、監視する側と実行する側とに分離したいとき、forkを使うのが易いようです。

Windowsなら、Active Perlのperlforkを見ると、いろいろと例が載っています。

TrackBack先のMagic Voxで見かけたので、記事を書いてみます。

自分で確認した記録でもありますが...なお、Windows7 Ultimatex64 + Active Perl v5.10.0で試しました.

コーディング例

use POSIX ":sys_wait_h";

$| = 1;
my ($pid, $n) ;
	$n = 4 ;

	do {
		$pid = fork ;
		if (!defined $pid) {
			die "fork fairule...\n" ;
		}
		elsif ($pid==0) {	# child
			print "I'm a child $n/pid=$pid \n";
			sleep 10 - $n ;
			exit $n ;
		} else {
			print "create process $pid\n";
		}
		--$n;
	} while ($n>0) ;

my $killid ;
	sleep 1;
	do {
#		$killid = wait();
		$killid = waitpid(-1, WNOHANG);

		print "child $killid  is dead and said $?\n" unless $killid==0;
	} while ($killid!=-1) ;
	print "Terminate test PGM.\n" ;
exit ;

親としては、子が消えるまで待ったり、よそからの要求で殺したりするわけですね。とりあえずは、forkで分岐するところをテンプレート的にお試ししました、というだけで。

実行例

>perl tst_fork01.pl
create process -4900
I'm a child 4/pid=0
create process -888
I'm a child 3/pid=0
create process -2364
I'm a child 2/pid=0
create process -2004
I'm a child 1/pid=0
child -4900  is dead and said 1024
child -888  is dead and said 768
child -2364  is dead and said 512
child -2004  is dead and said 256
child -1  is dead and said -1
Terminate test PGM.

ただし、Perl で複数個のワーカープロセスを動かして処理を行う場合のコードとして例が挙がっているように、まじめにやる場合はこちらを参照したほうがよさそうです。SIGトラップして云々・・・。まだまだ勉強不足のようで('A`

2010/02/09(火)[Perl] 快適デバッグ環境

Perl環境

Active Stateから、Active Perlを拾ってきてインストール。

後のEclipseでデバッグする際に必要となるので、PadWalkerを拾ってくる。コマンドラインからppmでインスコできるので便利ね。

実行例:

C:\>ppm install PadWalker
Downloading PadWalker-1.9...done
Unpacking PadWalker-1.9...done
Generating HTML for PadWalker-1.9...done
Updating files in site area...done
   6 files installed

Eclipse

本体

Eclipse.orgから、パッケージを拾ってくる。現在GALILEOが新しい模様。いろんなぱケージがあるけれど、java開発しないならCDTでも十分。足りなくなったらパッケージを入れていけばいいでしょう。*1

インストーラが嫌いな人はzip版がいい感じ。eclipseディレクトリを作って、その下に展開して言ってくれるので、どこかのルートにでも展開するといいでしょう。

プラグイン

Eclipseのメジャーなプラグインは、多くはUpdate Siteを持っているようで、Eclipse側でUpdate siteを登録して拾ってこさせることができます。また、更新チェックもしてくれるので便利です。基本的にサイト側で親切に書かれているので、そちらを参照ください・・・。ここではポインタを示すだけで、あまり細かいところまでは記載しないようにしておきます。*2


EPIC

EPICのサイトから、Perl開発用のプラグインを拾ってくる。参考サイトの@ITが詳しいので、ここでの説明は省略する。余力があれば自前でSnapShotをとっておくかネ。

BABEL

Babel Projectのページにインストール方法が記載されています。やっぱり日本語のほうがサクサクと判断が進みます。

Babel projectの方々に感謝を。


*1 : 個人的にjava触らないので、CDT,EPICあればシアワセ

*2 : Version upで操作が変わったりもしますからねぇ...

参考

スクリプト言語をサポートするEclipseプラグイン

2010/02/04(木)[Perl] 変数の型を調べる

変数の型を調べたい

ref演算子が使える模様。リファレンスならその型を返してくれる模様。リファレンスじゃなかったらnullぽ...

blessされているときは、クラス名が返ってくるらすぃ。い万ところ使わないから参考程度にメモ。

ソース

use strict ;

my $test ;
my $ref_1 = [1, 2] ;
my $ref_2 = \$test ;
my $ref_3 = $ref_1 ;
my $ref_4 = {1 =>'t'} ;
my %hash_1 = {1 =>'t', [2,3]} ;

	&chk_type($test) ;
	&chk_type($ref_1) ;
	&chk_type($ref_2) ;
	&chk_type($ref_3) ;
	&chk_type($ref_4) ;
	&chk_type(%hash_1) ;
	&chk_type(\%hash_1) ;

exit ;

sub chk_type($)
{
my $v = shift @_ ;
my $a = ref $v;
  print "$a へのリファレンス\n" if ($a) ;
  print "scaler\n" unless ($a) ;

}

実行結果

scaler
ARRAY へのリファレンス
SCALAR へのリファレンス
ARRAY へのリファレンス
HASH へのリファレンス
scaler
HASH へのリファレンス

配列やハッシュの要素として、任意の型をガンガン放り込めるので、それを調べて処理したいという欲求があったのですよ...

Cで書くなら、voidポインタをキャストして使っていたかなぁ。

C++やC#なら実行時型とか使って、同じような処理ができると思う。が、まぁ、今回はPerlだけ。ワンタイムの使い捨てになりかねないので..(^^;

2010/02/02(火)ニコ技動画~アイデア発想ヒント講座~

おちゃをにごす

ということで、とりあえずTLに流れていたので御紹介。発想力は必要ですね。上下左右、どこにでも人はいるので、突出して目立つには難しいものです。特に真似しやすいものは、改良・改善・変形で過去のものになって逝きます。常に新しいコトを探し、発信しつづける必要があるわけですね。


まぁ、無理せず、必要に応じて得られたアウトプットを少し紹介する程度にしておくのが無難なのでしょうなぁ。無理し続けて継続しないほうがショックはでかいw