2013年5月21日火曜日

ARM QEMUでDhrystoneを動かしてみる

整数演算の処理速度を評価する指標として知られるDhrystone(ドライストーン)ですが、コンパイラ効率やlibcの性能にも影響を受ける点も指摘されており、総合的に見るとプロセッサ単体の性能というよりはプラットフォーム全体の能力を反映したものと言えそうです。切り分けのためにはあまりよくない特性で、ベンチマークとして他の指標も見ないとよい評価はできないかもしれませんが、とりあえず手元でぱっと動かせると便利なものの一つには変わりないでしょう。

そこで今回はDhrystoneをARMコンパイルしてQEMUで動かす手順を確認。

1. ソースコードのダウンロード


ここからソースコードのアーカイブをダウンロードして解凍します。

2. Makefileの編集


エディタを使って、解凍したソースコードに同梱されているMakefileを環境に合わせて編集します。
下記のエントリを編集。同じ名前のエントリは一番最後に書いた行が有効になりますが、紛らわしければコメントアウトしたり消してしまったりしても構いません。

3. ビルド


ARMクロスコンパイラでコンパイルします。ツールチェインのインストールについてはこちら2を参照。
ツールチェインへのパスを通しておいて
でおk。

4. 実行


QEMU ARMを使って実行してみます。QEMU ARMのインストールはこちら1を参照。
実行回数の指定を求められます。試しに1000000回を指定。多いほど時間はかかりますが、少なすぎると失敗します。

実行が終わると、下記のように処理結果が表示されます。
Dhrystoneによるベンチマーク指標であるDMIPS値を得るには、Dhrystones per Secondを1757で割る必要があります。1MIPSの基準マシンとされているVAX 11/780のDhrystones per Second値との比を取るためです。この演算より、

250000 / 1757 = 142 DMIPS

が得られます。

実際にはMakefile中のHZエントリを編集してターゲットプラットフォームに合わせたメモリクロック(MHz)を設定しなければならないため、 上記の値は意味ナシです(初期値の60で算出されています)。

いろいろなプロセッサのDMIPS値と比べてみるのも面白いです。Cortex-A9あたりだと、1GHzで2500DMIPSになるようですね。

参考情報

Dhrystone howto
Dhrystone - Wikipedia


2013年5月20日月曜日

MarsBoard A10開封の儀

カードサイズのARMボードを性懲りもなくまた買ってみました。Allwinner A10搭載のMarsBoard A10です。コアは1.2GHzのCortex-A8、同クラスのボードには最近発売されたBeagleBone Blackや、何やら名前の良く似たMarS Boardあたりもありそうですが、MarsBoardの特徴はSATAコネクタが実装されていること。ちょっとしたNASなんかも作れてしまうかもしれません。

この辺のボードはいずれも
  • MarsBoard A10: $49.99
  • BeagleBone Black: $45
  • MarS Board: $99
と一般的なLinuxボードと比べてローコストなのが魅力です。

まずは荷姿。新書を4冊くらい重ねた程度の小さな段ボール箱。飾らない外装です。ちなみに送料は本体価格に込み、10日から2週間くらいで着きました。


中身もシンプル。


ケーブル類はボードの下にありました。


ボードA面。 左側のUSBコネクタとEternetジャックあたりの配置はRaspberryPiにも似ていますが、実装面積の大きいA10チップとROM、DDR3が存在感ありです。電源電圧は5V、右上にDCジャックもありますが、左下のUSB Mini-Bからも供給可能です。あとは右側にHDMI Type C、SATA、microSD。ピンは2mmピッチです。RaspberryPiとはいろいろな規格が違いますね。
SATAの隣の白いスイッチは、回路図を確認するとRECOVERという名前で、UBOOTという信号線につながっていますが、リセットか、あるいはブートセレクタでしょうか。


B面にはヘッドフォンジャック。


後はこの辺のイメージをいろいろ動かしてみたいですが、とりあえずまた今度。

2013年5月18日土曜日

RaspbianをインストールしてRaspberryPiをWebサーバにする

DebianのRaspberryPi移植版であるRaspbianの公式で、Raspbian Installerというツールが配布されています。SDカードに書き込んでRaspberryPiから起動すると、対話式のインストーラでRaspbianをSDカードに上書きしてくれるというものです。これを使ってRaspbianをインストールし、Webサーバを動かしてみます。

1. SDカードのフォーマット

今回は手元にあった8GBを使いました。インストール中に上書きされてしまいますが、最初にインストーラのバイナリを書き込むためにフォーマットします。ファイルシステムはFAT32で、パーティションは一つ。Linuxでfdiskを使ってもOKだと思います(手順はこちら)。

2. インストーラのコピー

ここからインストーラのzipアーカイブをダウンロードして展開します。
  • bootcode.bin
  • cmdline.txt
  • kernel.img
  • loader.bin
  • README.txt
  • start.elf
の6つのファイルが展開されるので、それらをフォーマットしたSDカードへコピーします。このとき必ずbootcode.binを最初にコピーし、後から他のファイルのコピーをします。こうしないと、bootcode.binがカードの先頭アドレスに書き込まれないため、十分なファイルシステムを実装されていない最小構成のファーストステージブートローダでは見つけて読み出すことができません。(RaspberryPiのブートシーケンスはここ参照)

3. ネットワークの準備

Raspbian Installerはネットワークインストーラなので、正しくインターネット接続されている必要があります。またDHCPによる自動IP割り当てを利用するため、DHCP機能の付いたルータなどが必要です。

4. 起動

書き込んだSDカードをRaspberryPiのカードスロットに挿し、ディスプレイとキーボードを接続して電源を入れます。

5. 言語の選択

インストーラの表示言語を選択します。ここで選択した言語はインストール対象のDebianのデフォルトにもなります。


6. ロケーションの選択



7. キーボードの設定

接続したキーボードに合わせた言語を選択します。


8. ネットワークの設定

接続されるドメイン名とRaspberryPiのホスト名を設定します。


9. ミラーホスト選択

ここでは公式に記載のあるとおり、ミラーを自動選択してくれるmirrordirector.raspbian.orgを設定します。

ディレクトリは/raspbian/に変更。


HTTPプロキシは空白でOK。


10. インストールコンポーネントのダウンロード

「カーネルモジュールが見つかりませんでした。」というメッセージが出ますが、そのまま<はい>を選択します。


ダウンロードが始まります。


11.アカウントのセットアップ

rootおよび任意ユーザアカウントの設定をします。まずはrootのパスワード。


再入力。


次にユーザカウントのフルネーム。


ユーザアカウントのユーザ名。


ユーザのパスワード。


再入力。


12. パーティショニング

SDカードのパーティション作成を行います。


自動で推奨構成が設定されます。特に変更の必要がなければ、そのまま「パーティショニングの終了とディスクへの変更の書き込み」を選択。


変更の確認。<はい>を選択。


パーティションの初期化が始まります。暫し待つ。


13. システムのインストール

続いてベースシステムのインストール。暫し待つ。


「定義された APT ソースにインストール可能なカーネルが見つかりませんでした。」と表示されますが、そのまま<はい>


aptの設定。待つだけ。


利用調査の統計に協力するかどうか。任意で。


必要なソフトウェアの選択。SSH serverにチェックが入っているので、Web serverにもチェックを加えて、<続ける>


ブートローダなしで続ける」は、そのまま<続ける>


インストールの終了を待つ。


14. Webサーバの動作確認

ホストマシンのWebブラウザでRaspberryPiのIPアドレスを入力し、It works!というページが表示されればOKです。RaspberryPiのアドレスがわからない場合は、ディスプレイでログインしifconfigコマンドを入力します。


以上。

公式にもRaspbianのイメージがありますが、パーティションが2GB固定なので、apg-get update等するとすぐに容量がいっぱいになってしまいWebサーバのインストールができなくなります。容量の大きいSDカードに書き込んだ上で、gpartedでパーティションを拡張する方法もあると思いますが、今回はRaspbianインストーラーを使ってWebサーバを初期インストールしました。なお既存のRaspberryPiに後からWebサーバをインストールする方法はこちらのページに記載があります。

参考情報

Raspbian Installer


2013年5月12日日曜日

RaspberryPiのGPIOでLEDを点灯

RaspberryPiのGPIOを扱う練習で、LEDの点灯をしてみます。

1. LEDの接続


GPIOの出力を確認するためのLEDを接続します。SoCのGPIOに直接接続されるので、電流制限抵抗を付けるのを忘れないでください。ローコストのボードとは言え、あっさり壊してしまってはもったいないですからね。だいたい数百オームでOKだと思いますが、気になる場合は使用するLEDのVFを調べて、GPIOのソース電流に収まるよう抵抗値を決める必要があります。今回は根拠ナシですがとりあえず470Ωを選びました。


抵抗を接続する足はLEDのアノード側、カソード側どちらでもOKですが、足の長さがわからなくなるので、LEDの極性を忘れないように気をつけます。(なお画像のようにハンダ付けしなくても、ブレッドボードを使ってもOKです。)


LEDをRaspberryPiに接続します。基板上のGPIOコネクタのうち、GPIOとGNDが隣り合っている13ピン、14ピンを使います。LEDのアノード側を基板内側の13ピン(GPIO) 、カソード側を基板外側の14ピン(GND)に接続します。


私の使用しているRaspberryPiはRev.2.0なので、13ピンはSoCのGPIO27に接続されています。回路図こちらのWikiにリンクがあります。

2. コマンドで点灯してみる


DebianのRaspberryPi向け改変版のRaspbianでは、ファイル入出力を通してRaspberryPiのGPIOをコントロールすることができます。Raspbianを使うには、ここからRaspbianのイメージをダウンロードし、Win32 Disk ImagerなどでSDカードに焼いてから、RaspberryPiのカードスロットに挿して起動します。

起動したら、まずログイン。HDMIで画面表示してUSBキーボードを使ってもいいですし、LAN接続してSSHを使ってもいいです。 ユーザー名はpi、パスワードはraspberryになっています。

ログインしたら、下記のようにコマンドします。
まずsuでスーパーユーザーに変更。続いて、/sys/class/gpio/ディレクトリの下のexportファイルにピン番号を指定すると、対応するgpioのディレクトリが作成されます。directionファイルで入出力方向を指定した後、valueファイルへの入力でGPIOの出力をON/OFFすることができます。


このように、ファイル入出力で操作できることで、 コマンドだけでなく、およそファイル入出力の機能を持った言語であれば、CでもPythonでも、同様の操作を行うことができます。
次に、C++によるGPIO操作のプログラムを試してみます。

3. プログラムによる点滅


まずはソースファイルを作成しエディタでソースコードを入力。
ARM用のクロスコンパイラでビルドします。ツールチェインのインストールはこちらの記事の「2. ARMコンパイラのインストール」をご参照ください。コンパイルできたら、バイナリをRaspberryPiにロードします。RaspberryPiをホストマシンと同じLANに接続しておけばSSHが利用できるので、SCPでコピーします。
ロードされたバイナリをRaspberryPiで実行します。まずは実行可能なようにパーミッションを変更。続いてスーパーユーザーでバイナリを実行します。
LEDが点滅を始めます。


参考情報
Creating a "Blinking LED" project for Raspberry PI

2013年5月5日日曜日

APC Paper Alternative

This article describes how to make a APC Paper mimic paper-made case for APC 8750 Neo-ITX sized ARM board.

紙製ケースに入った本のようなルックスのクールなミニPC、APC Paperの発売を待っていたのに、"Pre-Order in March"が"Coming soon..."になり、待てども暦はもう皐月、、、そんなあなたへ!

APC 8750を入れる紙箱を作って、気分だけでもPaperを味わっちゃいましょう。

紙箱のレシピは、バチカさんのこちらの記事を参考にさせていただきました。

材料
 ・ ボール紙(2mm厚) 画材店等で売ってます
 ・ 包装紙(外装、内箱、裏表紙用に何種類か)
 ・ 貼り付けボス 4pcs
 ・ ねじ(M3) 4本

道具
 ・ シャーペン
 ・ スティックのり(包装紙を貼る用。ペーパーセメントを使うと紙にシワがよらないのでなお良し)
 ・ ボンド(厚紙貼り合わせ用)

まずは内箱を作ります。
下の写真にある5枚に切った厚紙が内箱の材料です。真ん中の大きいのが底板、上下左右にある4枚が側面に当たる部分です。寸法はそれぞれ
 ・ 底面(1枚) 204x145mm
 ・ 長い側面(2枚) 204x59mm
 ・ 短い側面(2枚) 141x59mm
になっています。


切り出したら、長い側面のうち1枚にI/Oパネル用の穴を開けます。


後で登場しますが、貼り付けボスの高さだけ基板底面が上がります。また、基板を箱の中心に置く場合、パネルの位置は中心にはならないので注意が必要です。なおパネルの寸法はこちら(PDF)で確認できます。


位置を決めたら切り開きます。


実際にパネルをはめてサイズを確認しましょう。小さすぎる場合は調整して、ぴったりはまるようにします。


続いて側面と底面の厚紙を張り合わせます。底面の上に側面の厚紙を載せるようにして、ボンドで張り合わせていきます。


こんな感じになります。短い側面の両端が長い側面にはさまれるように組みます。


次にスティックのりまたはペーパーセメントで包装紙を貼り付けていきます。内箱の高さ+10mmくらいの幅に切って、側面の周囲を巻きつけるように貼っていきます。上下5mmくらいずつ紙が余るので、内側に折り込むように貼り付けます。


I/Oパネル用の窓に穴を開けます。ここも包装紙を周囲5mm程度を折り込めるように残した上で、真ん中を切り落とします。残った部分を、厚紙側に空けた窓の角まで切り込みを入れた上で、折り込んで貼り付けます。


内箱への基板の組付けには、下図のような貼り付けボスを使います。今回使ったのはタカチ電機工業のT-600というもの。M3のねじで基板を固定します。


はじめに基板側に貼り付けボスを固定してから、はくり紙をはがして位置決めすると楽です。


I/Oパネルにあわせて基板の位置決めをしたら、貼り付けボスをしっかり押し付けて固定します。これで内箱はとりあえず完成。


最後にふたになる外側のパーツを組み立てていきます。
まずは厚紙の切り出し。
 ・ 表紙(2枚) 210x148mm
 ・ 背表紙(1枚) 210x61mm
ちなみにこのサイズはA5書籍に合わせているので、APC 8750基板を入れると少し余裕ができます。


外装用の包装紙を貼り付けていきます。前後の表紙と背表紙の厚紙3枚を4mm程度の間隔をあけて並べ、その上下左右に25mm程度の余白を空けたくらいの大きさに包装紙を切ります。包装紙と厚紙をスティックのりまたはペーパーセメントで貼り付け。四隅は厚紙の角から3mm程度空けて斜めに切り落とします。


余白を内側に折り込んで貼り付けます。


内側に別の紙を貼って厚紙部分を隠します。内箱が載るところは省略で。


最後に、内箱と表紙をボンドで張り合わせます。きちんとふたが閉まるように気をつけてください。表紙の折り目の部分で定規などで内紙を押さえながら折り込むと、きれいに折り目が付きます。


完成図。ちょっとした雑貨入れのようなおとなしいルックスで、800MHzのARMコアを潜ませたにくい1台のできあがり。





ちなみにAPC 8750よりもAPC Rockを使った方が、コネクタが低い分、薄くできると思います。

和風版も作成。こちらは文庫本サイズです。


Arduinoが2台収納できます、殿。



APC Forumに投稿されている諸先輩方の作品も秀逸です。併せてご覧ください。
 ・ "The netbook case" by Icesnake
 ・ "My 0$ APC case" by Maxwell