2014-02-19

FlashAir™でベアメタルRasPi

FlashAir™ + Raspberry Pi の組み合わせに、さらに適した使い方を発見した。

(なんちゃって)「ベアメタル・プログラミング」である。

Raspberry Pi をOSなしで使用する、ハードウェアを直にたたくプログラム。こういうOSレスの環境を最近の若者?は「ベアメタル(bare-metal)」と呼ぶらしい。

本格的にベアメタルなプログラミングに取り組むなら、JTAGデバッガーでも買いましょう。という話になるんだろうが、カジュアル・ベアメタル・プログラマーには、FlashAirとリセットスイッチがあれば十分だ。

RasPiのブートシーケンス

さて、ベアメタル環境でプログラムを動かすにはどうすればいいのだろうか?

RasPiが起動する仕組みについて http://elinux.org/RPi_Software に解説がある。これによると、起動SDカード上のファイルは次の順番で読み込まれて実行されることが分かる。

  1. bootcode.bin ブートローダー
  2. start.elf GPUファームウェア
  3. kernel.img ユーザーコード

このうち、bootcode.binとstart.elfはメーカーから提供されるファームウェアあつかいの部分なのでユーザーはいじらなくてよい。

ということで、要するに、OSを介さずにプログラムを実行したければ、kernel.img(Linuxカーネル)を、自作のベアボーン・アプリケーションのバイナリに置き換えてやればよいのである。

「kernel.img」というファイル名は、特に指定がなければこの名前が使われるデフォルト値であり、config.txtを編集して別の名前のファイルをロードさせることもできる。

クロス環境の準備

Mac上でRaspberry Pi用のベアメタルなプログラムを開発するには「arm-none-eabi」のクロスコンパイル環境を用意する必要がある(RasPi上でコンパイルしてもいいけどね)。 MacPorts を使って GNU ARM ツールチェーンをインストールしておく。

$ sudo port install arm-none-eabi-gcc
$ sudo port install arm-none-eabi-binutils

binutilsはgccを入れると自動的にインストールされているハズなので、わざわざ別に指定しなくてもよいが例示した。

ハードウェアの準備

初期化してWi-Fi接続可能(かつファイルのアップロード可能)に設定したFlashAirを用意し、Raspberry Piに差し込んで電源を入れておく。カードの中身は何もない状態なので、当然RaspPiを起動してもなにも起こらないが、それでいい。

FlashAirのアップロード許可設定については別記事「FlashAir™をRasPiの起動ディスクにする」の「アップロードを許可する」を参照。

後述のデモで使用するので、RasPiにはディスプレイを接続するのを忘れずに。それから、ベアメタルなプログラミングでは、頻繁に再起動することになるだろうから、RasPiにリセットスイッチを取り付けておいた方が便利である。

ブートに必要なファイルの準備

起動に必要なブートローダー、GPUファームウェアなどは https://github.com/raspberrypi/firmware/tree/master/boot で配布されているので、そこからダウンロードできる。bootcode.bin、start.elf、fixup.datをダウンロードして、FlashAirにアップロードしておく。kernel*.imgは、これから用意する自前のコードを使うので必要ない。

ベアメタルの実例

ベアボーン・アプリケーションのデモンストレーションとして、GitHubで公開されている Raspberry Pi ARM based bare metal examples のサンプル「video01」を試してみよう。これは、フレームバッファに画像データを書き込んで表示させるプログラムである。

適当な場所にリポジトリをクローンして、サンプル「video01」をビルドする。

$ git clone https://github.com/dwelch67/raspberrypi.git
$ cd raspberrypi/video01
$ make clean
$ make

正常に終了するとraspberrypi/video01ディレクトリー内に「kernel.img」が作成される。 このkernel.imgをFlashAirにアップロードする。

$ curl -F file=@kernel.img http://flashair.local/upload.cgi

Raspberry Piをリセット(再起動)する。

ディスプレイに画像が表示されれば成功である。2014年2月18日時点のサンプルではこんな具合に気球の画像が表示される。

まっさらなFlashAirでの実行手順を説明したが、既にRaspbianをインストール済みのFlashAirで試す場合は、まず、カード内のkernel.imgをダウンロードして、分かりやすいところにバックアップしておいてから、video01のkernel.imgをアップロードする。サンプルプログラムの動作を確認したら、あらかじめバックアップしておいたkernel.imgをFlashAirに転送して、RasPiをリセットすれば元に戻せる。

FlashAirだから、プログラムを変更するたびにMacとRasPiの間でカードを抜いたり差したりしなくてすむので幸せ〜。アップロードしてリセットスイッチを押すだけ。

さあ、これ(FlashAir + Raspberry Pi + リセットスイッチ)で、あなたも(なんちゃって)ベアメタル・プログラマーの仲間入りだ。がんばれ若者。おじさんは、もう体力ないからOS有りでいくけどね。

0 件のコメント:

コメントを投稿