Pico-2 の BIOS は C で書かれていますので,Pico-2 上で動作させるユーザ=プログラムも C で書くのがよいでしょう.ここでは例として非常にシンプルなプログラムを取り上げます.このプログラムは,100ms ごとにカウントアップされる2進数を LED に表示するものです.
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 を構築することです.以下のインストールの手順例を参考にしてください.
unix$ cd binutils-2.20
unix$ ./configure --target=sh-elf
unix$ make
unix$ sudo make install
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つのみです.
-
sh-elf-gcc
C コンパイラ本体です.リンカ sh-elf-ld やアセンブラsh-elf-as は,この sh-elf-gcc が窓口となって,自動的に起動されます. -
sh-elf-objcopy
コンパイルされたオブジェクト=ファイルを,後述するフラッシュ=メモリに書き込むために,S-record というフォーマットに変換するツールです.
MakeBox とは,ユーザ=プログラムのソース=ファイルと,そのコンパイルに必要なファイル(Makefile など)を入れた〈ディレクトリ〉(または〈フォルダ〉)のことです.ユーザ=プログラムごとに別々の MakeBox を用意するのがよいでしょう.MakeBox の中には,少なくとも以下のファイルが入っています.
-
userprog.c
ユーザ=プログラムです.ユーザが実際に書くのはこのファイルだけです. -
Makefile
コンパイルの手続きを記述したスクリプトです.ユーザ=プログラムのファイル名が userprog.c 以外の場合は,このファイルの先頭行 "PROG =userprog" の userprog を,ユーザ=プログラムのファイル名から拡張子(.c)を除いたものに置き換えてください.ほかの場所は変更しないでください. -
sh7046f.h
SH2/7046F のハードウェア情報(メモリマップト=レジスタの構造など)を記述したヘッダファイルです.変更しないでください. -
boot.c
・
boot.h
boot.c は,Pico-2 がリセット(あるいは電源オン)されたとき,最初に実行する関数 boot() を収めた C プログラムです.ユーザ=プログラムを実行する前に必要な前処理(メモリや I/O ポートの初期化など)を行ない,その後にユーザ=プログラムの main() を呼び出します.また,割り込み処理の初期化関数(definterrupt, set_imask)をユーザに提供します.boot.h はそのヘッダファイルです.どちらも変更しないでください. -
bios.c
・
bios.h
bios.c は BIOS プログラムです.ユーザに BIOS インタフェース関数を提供します.bios.h はそのヘッダファイルです.どちらも変更しないでください. -
ldscript.x
リンカ=スクリプトで,ユーザ=プログラムで定義された変数や関数が Pico-2 のメモリのどこに配置されるのかを記述してあります.またリセット時のベクタ(実行開始アドレスやスタックポインタ初期値)もこの中に記述してあります.Pico-2 は 256KB のフラッシュ=メモリ(いわゆる EEPROM)と 12KB の RAM を持っています.プログラムおよび変数の初期値はフラッシュ=メモリに,変数とスタック=エリアは RAM に配置されます.変更しないでください.
- ダウンロード: MakeBox(サンプル=プログラム付)
あとは,適当なシェル端末から MakeBox に入り,そこで make と打つだけです.これで boot.o, bios.o, userprog.o の3つの中間ファイルと,userprog.out, userprog.sr の2つの実行可能ファイルが生成されます.このなかで重要なのは最後の userprog.sr だけで,他のファイルは消してしまっても構いません.

実行可能なユーザ=プログラム userprog.out を S-record フォーマットに変換したものが userprog.sr です.このファイルをフラッシュ=メモリに書き込み,Pico-2 をリセットあるいは電源を再投入することで,このユーザ=プログラムが Pico-2 上で動作するわけです.次の章では,userprog.sr を Pico-2 のフラッシュ=メモリに書き込む方法について説明します.
コンパイルしたプログラムは,まだ PC のハードディスク上にあるだけで,これを Pico-2 のフラッシュ=メモリに書き込むことで,はじめて実行可能になります.フラッシュ=メモリへの書き込みに特別なハードウェアは不要です.すべてソフトウェアで(たとえばロボットに組み込んだ状態でも)書き込む・書き換えることができます.その手順は,つぎのようになります.
まず,転送対象となる〈書き込み制御プログラム〉や,PC 側で動作させる〈転送プログラム〉を準備します.下のリンクから tar ファイルをダウンロード・展開し,ディレクトリ pc-flash のなかで make と打つと,つぎの3つのプログラムが作られます.
- pico-flash.sr
Pico-2 上で動作する〈書き込み制御プログラム〉(S-record フォーマット)です.ブート=モードで起動された Pico-2 上で動作します.ソースプログラムは pico-flash.c です.コンパイル済オブジェクトファイル(S-record フォーマット)は pico-flash.sr です. - pc-boot
PC 上で動作する〈ブート転送プログラム〉です.ブート=モードで起動されたPico-2 に,〈書き込み制御プログラム〉を転送します.ソースプログラムは pc-boot.c です.(Linux・Mac・Windows に対応しています.) - pc-flash
PC 上で動作する〈フラッシュ転送プログラム〉です.Pico-2 で実行された〈書き込み制御プログラム〉に,実際に書き込む対象となるユーザプログラムを転送します.ソースプログラムは pc-flash.c です.(Linux・Mac・Windows に対応しています.)
(補足) 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; に置き換えてください.
- ダウンロード: フラッシュ=メモリ書き込みプログラム(Linux・Mac・Windows 対応)
Pico-2 表面のスイッチ SW6・7 を ON にした状態で Pico-2 の RESET SW を押す(あるいは電源を入れる)ことで,Pico-2 は〈ブート=モード〉で起動します.〈ブート=モード〉の Pico-2 は,通信ポート(PORTX・PORTY)から読み込んだデータを RAM に順次格納するようになります.

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

たとえば,PC のシリアル=ポート /dev/ttyS0 から,〈書き込み制御プログラム〉pico-flash.sr を転送する場合,つぎのようになります.
プログラム転送には数秒〜数十秒かかります.転送が終了すると,Pico-2 はフラッシュ=メモリのデータをすべて消去し,RAM 上に転送された〈書き込み制御プログラム〉の実行を開始します.Pico-2 の〈書き込み制御プログラム〉はすべての LED を点灯させ,書き込み対象となるデータの待ち受け状態に入ります.
書き込み対象となるデータ(つまりユーザ=プログラム)を,PC から Pico-2 に転送し,フラッシュ=メモリに書き込みます.このために PC 側で動作させる〈フラッシュ転送プログラム〉が pc-flash です.

たとえば,PC のシリアル=ポート /dev/ttyUSB0 から,ユーザ=プログラム ../makebox/userprog.sr を転送する場合,つぎのようになります.
プログラム転送および書き込みには数秒〜数十秒かかりますが,この間,書き込み中のメモリ=アドレスのビット11−7が LED5−1 に表示されます.転送および書き込みが終了すると,Pico-2 は,すべての LED を点灯させ,プログラムを終了します.これでユーザ=プログラムがフラッシュ=メモリに書き込まれました.
フラッシュ=メモリに書き込んだユーザ=プログラムを実行するには,いちどPico-2 の電源を OFF にし,Pico-2 表面のスイッチ SW6・7 を OFF にしてから,再び Pico-2 の電源を入れます.これでユーザ=プログラムが起動します.もちろん,フラッシュ=メモリの内容は Pico-2 の電源を OFF にしても消えません.電源を ON にするだけで,ユーザ=プログラムが起動します.また実行途中で RESET SW を押せば,ユーザ=プログラムは再起動します.