Infanoid | Keepon | ClayBot
日本語 | English
ユーザ=プログラムの書きかた

Pico-2 の BIOS は C で書かれていますので,Pico-2 上で動作させるユーザ=プログラムも C で書くのがよいでしょう.ここでは例として非常にシンプルなプログラムを取り上げます.このプログラムは,100ms ごとにカウントアップされる2進数を LED に表示するものです.

userprog.c
 1: #include "sh7046f.h"
 2: #include "boot.h"
 3: #include "bios.h"
 4: 
 5: uint  count = 0;
 6: 
 7: int  main (void)
 8: {
 9:     void  every100ms();
10: 
11:     LED_init();
12:     CMT0_init(3, 4799, every100ms);
13: 
14:     set_imask(0);
15:     for (;;) {}
16: }
17: 
18: void  every100ms (void)
19: {
20:     count++;
21:     LED_set(count & 0x1f);
22: }

1行目では,SH2/7046F のハードウェア情報を記述したヘッダファイル sh7046f.h を読み込んでいます.2行目ではブートプログラムのヘッダファイル boot.h を,3行目では BIOS プログラムのヘッダファイル bios.h を読み込んでいます.これらは〈おまじない〉と考えてください.

12行目で汎用タイマ CMT0 を初期化しています.関数 every100ms() を 100ms 周期で呼び出す設定です.14行目の set_imask(0) は,汎用タイマなどによる「割り込み」を許可する〈おまじない〉です.15行目の for 文は無限ループになっていますが,そのウラで汎用タイマ CMT0 が動いていて,100ms ごとに割り込み(つまり関数 every100ms() の呼び出し)が発生します.(このような無限ループは「イベント=ループ」と呼ばれています.)

コンパイルのしかた
【開発ツールの整備】

ユーザ=プログラムをコンパイルするには,gcc (GNU C Compiler) を利用します.具体的には,binutils(as・ld など),gcc(cc 本体),newlib(組込みシステム用の C ライブラリ)の3つが必要です.いずれもフリー=ソフトウェアです.Pico-2 開発者(小嶋)の環境では,binutils-2.20,gcc-4.2.4,newlib-1.17.0 を PC 上の Linux(Ubuntu, Vine Linux など)や Mac 上の Mac OS X で使っています.

インストール時に注意すべきことは,ターゲットとして sh-elf を指定して,クロス=コンパイラ(PC 上で動く SH2 コンパイラ)として構築することと,binutils をインストールし,のちに gcc/newlib を構築することです.以下のインストールの手順例を参考にしてください.

binutils のインストール(例)
unix$ tar xvf binutils-2.20.tar
unix$ cd binutils-2.20
unix$ ./configure --target=sh-elf
unix$ make
unix$ sudo make install
gcc と newlib のインストール(例)
unix$ tar xvf gcc-4.2.4.tar
unix$ tar xvf newlib-1.17.0.tar
unix$ cd gcc-4.2.4
unix$ ln -s ../newlib-1.17.0/newlib newlib
unix$ ./configure --target=sh-elf --enable-languages="c" --enable-libssp=no ---with-newlib
unix$ make
unix$ sudo make install

いくつかの開発ツールがインストールされますが,ユーザ=プログラムのコンパイルに直接利用するのは,以下の2つのみです.

【MakeBox の準備】

MakeBox とは,ユーザ=プログラムのソース=ファイルと,そのコンパイルに必要なファイル(Makefile など)を入れた〈ディレクトリ〉(または〈フォルダ〉)のことです.ユーザ=プログラムごとに別々の MakeBox を用意するのがよいでしょう.MakeBox の中には,少なくとも以下のファイルが入っています.

【コンパイル】

あとは,適当なシェル端末から MakeBox に入り,そこで make と打つだけです.これで boot.o, bios.o, userprog.o の3つの中間ファイルと,userprog.out, userprog.sr の2つの実行可能ファイルが生成されます.このなかで重要なのは最後の userprog.sr だけで,他のファイルは消してしまっても構いません.

図:Pico-2ユーザプログラムのコンパイル作業の流れ

実行可能なユーザ=プログラム userprog.out を S-record フォーマットに変換したものが userprog.sr です.このファイルをフラッシュ=メモリに書き込み,Pico-2 をリセットあるいは電源を再投入することで,このユーザ=プログラムが Pico-2 上で動作するわけです.次の章では,userprog.sr を Pico-2 のフラッシュ=メモリに書き込む方法について説明します.

フラッシュ=メモリへの書き込みかた

コンパイルしたプログラムは,まだ PC のハードディスク上にあるだけで,これを Pico-2 のフラッシュ=メモリに書き込むことで,はじめて実行可能になります.フラッシュ=メモリへの書き込みに特別なハードウェアは不要です.すべてソフトウェアで(たとえばロボットに組み込んだ状態でも)書き込む・書き換えることができます.その手順は,つぎのようになります.

【手順1: フラッシュ=メモリ書き込みプログラムの準備】

まず,転送対象となる〈書き込み制御プログラム〉や,PC 側で動作させる〈転送プログラム〉を準備します.下のリンクから tar ファイルをダウンロード・展開し,ディレクトリ pc-flash のなかで make と打つと,つぎの3つのプログラムが作られます.

(補足) PC 側のソフトウェアは,MacBook(Mac OS X, Ubuntu Linux, Windows XP)と Keyspan USA-19HS の組合せで動作することを確認しています.しかし,一部の OS・USB-シリアル変換器・ドライバの組合せでは,pc-boot や pc-flash がうまく動作しないことがあるようです.たとえば,Mac OS X で I-O DATA USB-RSAQ5(I-O DATA 提供ドライバを使用)の場合,pc-flash がエラー終了してしまいます.この場合は,pc-flash.c の 484行目 error_exit("pc-flash: acknowledge timeout (main)");ack = 1; に置き換えてください.

【手順2: Pico-2 を〈ブート=モード〉で起動】

Pico-2 表面のスイッチ SW6・7 を ON にした状態で Pico-2 の RESET SW を押す(あるいは電源を入れる)ことで,Pico-2 は〈ブート=モード〉で起動します.〈ブート=モード〉の Pico-2 は,通信ポート(PORTX・PORTY)から読み込んだデータを RAM に順次格納するようになります.

写真:Pico-2のブート=モード設定スイッチSW6/7の場所
【手順3: 〈書き込み制御プログラム〉の転送】

〈書き込み制御プログラム〉pico-flash.sr を PC から Pico-2 に転送します.このために PC 側で動作させる〈ブート転送プログラム〉が pc-boot です.

図:ホストPCからブート転送プログラムが転送される様子

たとえば,PC のシリアル=ポート /dev/ttyS0 から,〈書き込み制御プログラム〉pico-flash.sr を転送する場合,つぎのようになります.

unix$ pc-boot --dev /dev/ttyS0 pico-flash.sr

プログラム転送には数秒〜数十秒かかります.転送が終了すると,Pico-2 はフラッシュ=メモリのデータをすべて消去し,RAM 上に転送された〈書き込み制御プログラム〉の実行を開始します.Pico-2 の〈書き込み制御プログラム〉はすべての LED を点灯させ,書き込み対象となるデータの待ち受け状態に入ります.

【手順4: ユーザ=プログラムの書き込み】

書き込み対象となるデータ(つまりユーザ=プログラム)を,PC から Pico-2 に転送し,フラッシュ=メモリに書き込みます.このために PC 側で動作させる〈フラッシュ転送プログラム〉が pc-flash です.

図:ユーザプログラムがフラッシュメモリに書き込まれる様子

たとえば,PC のシリアル=ポート /dev/ttyUSB0 から,ユーザ=プログラム ../makebox/userprog.sr を転送する場合,つぎのようになります.

unix$ pc-flash --dev /dev/ttyUSB0 ../makebox/userprog.sr

プログラム転送および書き込みには数秒〜数十秒かかりますが,この間,書き込み中のメモリ=アドレスのビット11−7が LED5−1 に表示されます.転送および書き込みが終了すると,Pico-2 は,すべての LED を点灯させ,プログラムを終了します.これでユーザ=プログラムがフラッシュ=メモリに書き込まれました.

【手順5: ユーザ=プログラムの実行】

フラッシュ=メモリに書き込んだユーザ=プログラムを実行するには,いちどPico-2 の電源を OFF にし,Pico-2 表面のスイッチ SW6・7 を OFF にしてから,再び Pico-2 の電源を入れます.これでユーザ=プログラムが起動します.もちろん,フラッシュ=メモリの内容は Pico-2 の電源を OFF にしても消えません.電源を ON にするだけで,ユーザ=プログラムが起動します.また実行途中で RESET SW を押せば,ユーザ=プログラムは再起動します.