2011/12/04

擬似乱数、rand()もどき

,
Cで乱数を発生させる場合、特に精度を求めなければ、普通はrand() (<stdlib.h>)を使うことになります。が、もっと簡単なのでいい、という場合もあります。探してたら見つかったのでメモです。

これ:PICを使い乱数を発生させてLEDをランダムに光らせたいのですがプログラムがよくわ... - Yahoo!知恵袋

ちなみに、Attiny13Aでstdlib.hのrand()だと780byte程だったのが、上で紹介されてたrand()にしたら400byte弱になりましたとさ。ただまあ、まだ試してはいない←
Read more →

[電子工作]AVRの逆アセンブラ、avr-objdump.exeを使う

,
 AVRの逆アセンブラ、avr-objdumpの話です。

 WinAVRでプログラムを書いていて、「どうしてこんなメモリを喰うんだろう?」と思う時がありました。Cのコードを少し変えただけなのに、です。こんな時は、コンパイル結果である機械語のコードが全く違っていたりするので、確認のためにアセンブリのソースも見ないといけません。となると、逆アセンブラの出番になります。

 …前置きが長いですが、AVRの逆アセンブラ、「avr-objdump.exe」についてのメモです。
 この実行ファイルのオプションを知るには、avr-objdump.exeのmanを見て頂くのが早いです。一応、コマンドラインでただavr-objdumpと入力しても、オプション一覧が出ると思います。下にオプション一覧の画面を貼ってきます。

avr-objdump.exeのオプション一覧

 逆アセンブラを吐き出すためには、一旦C/C++で作成したプロジェクトをMake Allし、できたファイルのうちのオブジェクトファイル(拡張子は.o、大抵main.oとか)が必要です。コマンドラインで、avr-objdump -S main.o とすれば、逆アセンブラのリストがずらーっと並びます。テキストファイルなどにしたい場合は、avr-objdump -S main.o > dump.txtなどとすれば、そのディレクトリの中にdump.txtが作成され、以下のように逆アセンブラが出力されます。

逆アセンブラした結果(サクラエディタで閲覧)

 ちなみに私の場合、_delay_ms()がメモリを消費していたみたいです。直接の原因かは分かりませんが、公式には「The maximal possible delay is 262.14 ms / F_CPU in MHz.」と書かれているので、あまり大きな引数(400とか)にするのは考えものですね… 
Read more →