(OS自作本編第3回)Ubuntu,Fedora,Cygwinで動作確認した

2010/02/28

あなたは 人目のお客様です.

「12ステップで作る 組込みOS自作入門」のソースコードは, 以下からダウンロードできます.(書籍用KOZOS/H8の最新版)

春のOSCが終わりました.KOZOSのブースに来ていただいたかた,セミナーに来て いただいたかた,どうもありがとうございました.

書籍化にあたって,開発環境が FreeBSD だけサポートというのもちょっと寂しいので, GNU/LinuxやWindowsの環境での動作確認も行いました.これらについては全部書籍の ほうで説明はしてあるのですが,OSCでの説明を聞いて「KOZOSをいじってみたい!」 というかたもいるかもしれないので,開発環境については,先行でここで情報公開 しておきます.

まずソースコードですが,以下が書籍 「12ステップで作る 組込みOS自作入門」 の最新版のソースコードです. 以下をご利用ください.ターゲットボードは秋月のH8/3069Fマイコンボードです.

※ binutilsとgccはサポートページから ダウンロードできます.(2011/10/30追加)

ソースコードは12ステップに分かれており,徐々にOSを作り上げていくという内容に なっています.具体的には,以下のような構成になっています.

(2010/05/23追記) マイコンボードの購入と実際に試すために必要なものに関しては, 書籍のサポートページ を参照してください. 「マイコンボードの購入について」の項に,必要なもののリストと購入方法が 説明してあります.(もちろん書籍のほうでも説明してあります)

以下は書籍原稿から,開発環境に関する説明を部分的に抜粋・適宜修正したものです. 開発環境を構築する際の参考にしてください. 以下の説明で不明な点があれば...書籍販売を待ってください... (2010/05/23追記)5月21に書籍が販売されました.なので不明点があれば, 書籍のほうを読んでください.

開発環境の構築方法

PCの準備

本書ではクロス開発環境のホストとして,FreeBSD か GNU/Linux を想定しています. まずは,以下の方法のうちどれが自分に都合がいいかを選んで, インストール作業を行ってください.

方法としては,上のものほど初心者向けです. いずれかの方法で,PCを用意してください.

筆者が一番おすすめするのは,専用のPCを中古などで購入してしまうことです. このような開発には,専用PCがあるとやはりなにかと便利だからです. PCを中古で購入する場合,なるべくならシリアル・ポートが標準でついているものを 選ぶといいでしょう.

PCにシリアル・ポートがついていない場合,USBのシリアル・アダプタを利用するのが 楽でいいと思いますが,PC-UNIXだとたまに利用できないアダプタがあったりします. またUSBのシリアル・アダプタだとフラッシュROMへの書き込みがうまくいかない場合が あるなど,注意が必要になります.なるべくならばシリアル・ポートを標準装備して いる古めの中古PCを用意することをおすすめします.

中古といえどPCを購入するのは...という読者のかたは, 手持ちのPCがUSBメモリからブートできるかどうか調べてみるといいでしょう. その場合,USBメモリ上にインストールするという方法もあります. ただしこの場合には,インストール先を誤ってPC本体のハードディスクを上書き しないように,十分に注意してください.

手持ちのPCがUSBメモリからブートできないならば,Windows上にQEMUをインストール し,QEMUによる仮想PC上にPC-UNIXをインストールするという方法があります. QEMUについては,以下を参照してください.

http://www.h7.dion.ne.jp/~qemu-win/index-ja.html
http://homepage3.nifty.com/takeda-toshiya/qemu/

参考までに,QEMUの起動方法と簡単な操作方法を列挙しておきます.

いずれの方法でも,インストール作業は既存のPCのデータ損失の危険をともない ますので,データのバックアップなどは十分にとった上で作業してください.

また本書ではクロス・コンパイル,フラッシュROMへの書き込み, シリアル経由でのファイル転送をすべて1台のPCで行うという前提で説明して いますが,ツールの使いやすさなどによっては,これらを別々のPCで行っても いいでしょう.たとえばプログラミングはGNU/Linuxの環境で行うが, フラッシュROMへの書き込みはWindows用のGUIツールを使う,などの方法でも 構いません.

PC-UNIXの準備

インストールするのは,筆者はFreeBSDを愛用しているのですが, 初心者のかたはGNU/Linuxがいいでしょう.ディストリビューションはどれでもいいとは 思いますが,筆者が動作確認しているという理由で,「Fedora」か「Ubuntu」を おすすめしておきます.

FedoraとUbuntuについては,以下を参照してください.

http://fedoraproject.org/ja/
http://www.ubuntulinux.jp/

もしくは Windows に「Cygwin」をインストールする,という方法もあります. Cygwin は Windows 上で動作するUNIX互換環境です. Windows環境を普段から使い慣れている人には,Cygwin環境は馴染みやすいでしょう.

実はH8/3069Fマイコン・ボードの付属CD-ROMにCygwin環境が添付されていますので, それをそのままインストールしてしまうのが手っ取り早くていいと思います. 付属CD-ROMにはインストーラ(setup.exe)が添付されていますのでそれを起動し, インストール元はデフォルトでInternet経由になっていますが 「Install from Local Directory」を指定して,CD-ROM上のフォルダから インストールします.テキストファイルの種別はUnixを指定します.

インストールするとCygwinのアイコンが作成されるので,クリックするとCygwin環境に 入ります.環境自体は標準で「c:\cygwin」にインストールされ,ユーザの ホームディレクトリは「c:\cygwin\home」にあるので,そこにファイルを置けば Cygwin 環境から参照することができます.

Cygwin を利用する場合には,メインの開発環境がPC-UNIXでなくWindowsになるため, 本書で説明している内容と異なる点が一部出てきますので注意してください. ただ本書のプログラムは Cygwin 環境でも確認を行っており,相違点があれば その都度説明してあります.

本書の内容は,以下の環境で実践できることを確認してあります.

よくわからなければ

ここまでの説明で,どれを選んだらいいかよくわからないというかたも いることかと思います.

そんなかたは,次のどれかからやりやすい方法を選んでください.

  1. いらないPCかもしくは中古PCを1台用意して Ubuntu をインストールする.
  2. 手持ちのPCがUSBメモリからブートできるならば,USBメモリ上に Ubuntu を インストールする.
  3. WindowsXPに H8/3069Fマイコン・ボードの付属CD-ROMから Cygwin をインストール する.
  4. WindowsXPにQEMUをインストールし,QEMUによる仮想PC上に Ubuntu を インストールする.
1と2の方法については,PC-UNIXがPC上でネイティブで動作するため, インストールさえ完了してしまえば,あとは難しい考慮は不要です. ただ2の方法をとる場合には,既存のハードディスクを上書きしないように十分に 注意してください(よくわからなければ,避けたほうが無難でしょう). 4の方法については仮想PC上での動作になるため, シリアル・ポートの使いかたについて,注意が必要になります.

Ubuntu のインストール方法については,インターネット上で検索すれば いくらでも出てくるのでここで詳しくは説明しませんが,簡単に言うと

  1. インストールCDのイメージをダウンロードし,CDに焼いてインストールCDを 作成する.
  2. インストールCDから起動する.(QEMUによる仮想PC上にインストールするならば, 仮想PCをインストールCDで起動する)
  3. ライブCDとしてブートし,CDブートでデスクトップ環境が起動する.
  4. ハードディスクにインストールするためのアイコンがあるのでクリックすると, インストールが開始される.
  5. 開発専用のPCにするのならば,ハードディスクのパーティション分けなども すべて自動でお任せでいいので,難しいことは考えずにインストールが完了する. (USBメモリ上にインストールするならば,ここでインストール先の指定が必要)
という手順になります.Fedora もほぼ同様です.

セルフ・コンパイラ

次に,環境によっては「セルフ・コンパイラ」のインストールが必要になります.

セルフ・コンパイラはホスト・コンパイラとも呼ばれ,クロス・コンパイラや フラッシュROM書き込みツールの実行コマンド作成(一般に「ビルド」と呼びます) のために利用されます.

FreeBSDはインストールすると,セルフ・コンパイラとしてgccが標準でインストール されます.また Cygwin 環境を利用する場合にも,セルフ・コンパイラとして やはりgccが標準でインストールされます. このためこれらの環境では,セルフ・コンパイラについて気にする必要はありません.

ただFreeBSDでは,gccなどのビルドに GNU make のインストールが必要になります. これはFreeBSDでいうところの「パッケージ」になっているので, パッケージ・インストールしておいてください. developカテゴリの「gmake」というものがそれです. またシェルとしてbashが必要になるので,bashもインストールしておいてください. カテゴリは「shell」です.

またGNU/Linuxでは,ディストリビューションによってはセルフ・コンパイラが 標準でインストールされないものもあるようです.筆者が試してみたところ, Ubuntu9.10では標準で入っていましたが,Fedora11ではインストールされていません でした.このようなディストリビューションでは,セルフ開発環境を追加インストール してください.

多くのGNU/Linuxディストリビューションでは,アプリケーションの追加インストールが 簡便な操作で行えるようになっています.Fedora では 「System」-「Administration」-「Add/Remove Software」で 管理ツールが起動しますので,「Programming」のカテゴリから binutils, gcc, make を選択しインストールしてください. インターネットに繋がった環境で実行すれば,自動的にダウンロードして インストールしてくれます.筆者は以下をインストールしました.

なお参考までに,Ubuntuでは 「システム」-「システム管理」-「Synapticパッケージ・マネージャ」 で,同様に管理ツールを起動して追加アプリケーションをインストールできます. こちらは後ほど,minicomとlrzszというアプリケーションをインストールするために 利用します.

クロス・コンパイラ

PCの準備ができたら,いよいよプログラミング環境の作成です. まずは,クロス・コンパイラをインストールする必要があります.

クロス・コンパイラにはGNUプロジェクトが提供している gcc というコンパイラを 利用します.またコンパイラ以外のアセンブラやリンカなどのツール類として, やはりGNUプロジェクトが提供している binutils というツールを利用します.

GNUプロジェクトは,UNIX互換の様々なアプリケーションを独自で作成し, フリーソフトウェアとして配布しているプロジェクトです. GNUプロジェクトについては以下を参照してください.

http://www.gnu.org/home.ja.html

まずクロス開発用のbinutilsとgccをビルドし,インストールします. GNUのftpサイトやミラーサイトなどから,binutilsとgccの最新版をダウンロード してください.gccはバージョン3系が安定しているようです. 日本だと,以下のミラーサイトからダウンロードできます.

http://core.ring.gr.jp/pub/GNU/
ftp://ftp.ring.gr.jp/pub/GNU/
本書執筆時点での最新版はそれぞれ「binutils-2.19.1」「gcc-3.4.6」になります. 筆者は以下の2つのファイルをダウンロードしました.

binutilsのインストール

まず,binutils をH8用にビルドしてインストールしましょう. ダウンロードした binutils-2.19.1.tar.gz を解凍し展開します.

% tar xvzf binutils-2.19.1.tar.gz
展開するとカレント・フォルダに「binutils-2.19.1」というフォルダが作成 されるので,そこに入ります.
% cd binutils-2.19.1
さらに以下を実行することで,H8のクロス開発用に binutils をビルドできます.
% ./configure --target=h8300-elf --disable-nls
% make    (FreeBSDの場合は「gmake」を実行)
もしもビルドに失敗したら,./configure の実行の際に --disable-werror という オプションを付加して,もう一度ためしてみてください.筆者が試したところでは, Cygwin 環境でのビルド時にエラーとなり,上記オプションで回避できました.

ビルドできたら,スーパー・ユーザになって make install を実行します.

% su      (スーパー・ユーザになる)
Password: (スーパー・ユーザのパスワードを入力)
# make install    (FreeBSDの場合は「gmake install」を実行)
Cygwinの場合はスーパー・ユーザにならずに,そのまま「make install」してしまって 構いません.またUbuntuではスーパー・ユーザの作業は「sudo」というコマンドを 用いて行うというポリシーになっているので,スーパー・ユーザにはならずに以下の ように実行してください.
% sudo make install
[sudo] password for hiroaki: (パスワードを入力)
なお今後,スーパー・ユーザで実行すべきコマンドは行頭を「#」で, 一般ユーザで実行するコマンドは行頭を「%」と表記して区別することにします.

これで /usr/local/bin 以下に h8300-elf-as (アセンブラ) や h8300-elf-ld (リンカ) というように,「h8300-elf-」を接頭語として 各種ツール類がインストールされます.また /usr/local/h8300-elf という フォルダが作成され,その下に as や ld というように,「h8300-elf-」を 取り除いた名前でインストールされます.

インストール先を /usr/local 以外にしたい場合(KNOPPIXなどのライブCDを利用して いて,USBメディア上などにツール類をインストールしたい,等)には, ./configure の実行の際に --prefix=<フォルダ名>の ようにして,インストール先のフォルダを指定してください. たとえばUSBメモリを /usb にマウントしているならば, --prefix=/usb のように指定することで,/usb以下にインストールできます.

gccのインストール

次にCコンパイラとして gcc をビルドしインストールします. まず gcc-3.4.6.tar.gz を展開してください.

% tar xvzf gcc-3.4.6.tar.gz
展開すると gcc-3.4.6 というフォルダが作成されるので,そこに入ります.
% cd gcc-3.4.6
さらに以下を実行することで,gccをH8用のクロス・コンパイラとしてビルドできます.
% setenv SHELL /usr/local/bin/bash  (FreeBSD等でシェルがbash以外の場合に必要)
% ./configure --target=h8300-elf --disable-nls --disable-threads \
--disable-shared --enable-languages=c
% make    (FreeBSDの場合は「gmake」を実行)
setenv による設定は,GNU/LinuxやCygwinでは必要ありません. ビルドにはやはり数分〜数十分かかります.

注意として,--enable-languages ではC言語のみを指定してください. ここに --enable-languages=c,c++ のように指定すると,C++コンパイラも 作成しようとします.しかしこの場合,C++のために必要なライブラリなどが 出てきてしまい,そのままではうまくビルドできなくなります. 本書ではC++は利用せずC言語のみで十分なので,C言語のみを指定してください.

ビルドに失敗した場合には,binutils と同様に ./configure の実行の際に --disable-werror というオプションを試してみてください.

またセルフ・コンパイラであるgccのバージョンによっては, ビルド中に以下のエラーで停止してしまうかもしれません.

In function ‘open’,
    inlined from ‘collect_execute’ at ./collect2.c:1537:
/usr/include/bits/fcntl2.h:51: error: call to ‘__open_missing_mode’ declared with attribute error: open with O_CREAT in second argument needs 3 arguments
make[1]: *** [collect2.o] エラー 1
この場合,gcc/collect2.c の
      redir_handle = open (redir, O_WRONLY | O_TRUNC | O_CREAT);
という行を
      redir_handle = open (redir, O_WRONLY | O_TRUNC | O_CREAT, 0755);
のように修正してビルドしなおしてください.理由はエラーメッセージのとおりで, O_CREATがある場合は3番目の引数にファイルのモードを指定しないといけないため です(/usr/include/bits/fcntl2.hでチェックされています). 筆者はUbuntuの環境で上記エラーが発生し,本修正で問題なく回避できました.

ビルドが完了したら,以下でインストールできます.

% su
Password:
# setenv SHELL /usr/local/bin/bash  (FreeBSD等でシェルがbash以外の場合に必要)
# make install    (FreeBSDの場合は「gmake install」を実行)
今までと同様,setenv による設定はFreeBSDのみ,Cygwinではsuは不要, Ubuntuではsudoを利用してください.

インストール先は binutils と同様に,/usr/local になります. インストール先を /usr/local 以外にしたい場合には,binutilsと同様に ./configure の実行時に --prefix=<フォルダ> を指定します.

これでクロス・コンパイル環境の構築は完了です.

添付CD-ROM付属のクロス・コンパイラ

ここでは binutils と gcc をH8用にビルドすることでクロス・コンパイル環境を 構築しました.しかし H8/3069Fマイコン・ボードの添付CD-ROMには, Windows用とLinux用のクロス・コンパイラが付属しています.

Windows用には,binutils と gcc をH8用にビルドしたものがCygwinに含まれています. よって添付CD-ROMからCygwinをインストールしている場合には, H8用のクロス・コンパイラもすでにインストールされています. これらは h8300-hms というターゲット名でビルドされていますので, h8300-hms-* というコマンド名で /usr/bin に, また /usr/h8300-hms 以下に,インストールされています.

Linux用には,付属CD-ROMにRPMの形式で,H8用にビルド済みの binutils と gcc が 添付されています.参考までに,スーパーユーザで以下を実行することでRPMを インストールできます.インストール先は Cygwin と同様に /usr/bin/h8300-hms-* と /usr/h8300-hms です.

# rpm -i h8300-hms-binutils-2.11.2-1.i386.rpm
# rpm -i h8300-hms-gcc-3.0.2-1.i386.rpm
ただし本書ではこれらは使わずに,binutils と gcc を自前でビルドしたものを 利用します.というのは,これらは実は最終的な実行形式ファイルをCOFF形式という フォーマットで作成するため,本書での利用に不向きだからです. ブート・ローダーだけなら利用可能ですし,objcopy というツールを利用して COFF形式をELF形式(ELF形式については後述します)に変換することでOS作成にも 利用可能なのですが,せっかくなので自前でビルドした binutils と gcc を利用する こととします.

またUbuntuではSynapticパッケージ・マネージャから 「binutils-h8300-hms」「gcc-h8300-hms」をインストールすることができますが, これらも同様にCOFF形式を出力するようなので,本書では利用しません.

フラッシュROM書き込みツール

多くのCPUボードはフラッシュROMを持っており,電源ONの際にはフラッシュROMの プログラムが最初に起動します.通常はフラッシュROMにはブート・ローダーなどを 置いておきます.

フラッシュROMへの書き込みには「Open SH/H8 writer」 (「h8write」とも呼ばれています)というフリーソフトが使えます. C言語のソースの形で配布されています.

またWindowsを利用しているならば,H8/3069Fの内蔵フラッシュROM書き込み用ツールが h8write以外にもいくつかあり,それらが利用できます.有名なところでは, H8の開発元であるルネサステクノロジがFDT(Flash Development Toolkit)という ツールを作成しています.FDTについては以下を参照してください.

http://japan.renesas.com/homepage.jsp
FDTは評価版を上記サイトから,無償でダウンロードできます.評価版でも有償版と 異なるのはサポートが無いことくらいであり,フラッシュROM書き込み機能にはとくに 問題はないようです(利用者も多いようです).

要はファームウェアを内蔵フラッシュROMに書き込めればそれでいいので, h8writeの利用方法がよくわからなければ,これらのツールを使ってもいいでしょう. 本書では主に h8write を利用しますが,FDTについても利用方法のみ説明します.

h8writeは,H8/3069Fマイコン・ボードの付属CD-ROMに,ソース・コード, Windows用の実行ファイル(h8write.exe),Linux用の実行ファイルが添付されています. なおWindowsの場合には付属CD-ROMからCygwinをインストールすると h8write も 一緒にインストールされるため(/usr/bin/h8write.exe),そちらを利用しても 構いません.もちろん,ソース・コードをコンパイルして利用しても構いません. またCD-ROM添付のLinux用の実行ファイルを実行するには

% chmod +x h8write
によって実行フラグを立てておく必要があります.

また最新版(2003/01/16更新のもの)を以下からダウンロードできます. ダウンロードできるのはソース・コードとLinuxでの実行ファイル,Windowsでの 実行ファイルです.

http://mes.sourceforge.jp/h8/writer-j.html
筆者が試したところ,CD-ROM付属版も最新版も,どちらも問題なく使えました. ただ上記サイトからダウンロードした最新版のほうが,フラッシュROMへの書き込み量が 少なく書き込み時間が短くて済んだのと,コンパイル時のワーニングが少なかった ので,FreeBSD,GNU/Linux,Windows とも,極力そちらを使ったほうがいいでしょう.

FreeBSDの場合には,ソース・コード(h8write.c)をダウンロードしてコンパイルし, 実行ファイルを作成する必要があります.以下のようにして実行ファイルを作成 できます.GNU/LinuxやWindows(Cygwin環境)でも同様にビルドできます. ただし Windows でのビルドの際には,h8write.c の先頭にあるOS指定の #define で 「Win32」を有効化し,それ以外は無効化 (デフォルトで「LINUX」が有効になっていると思います) してビルドしてください.

% gcc h8write.c -o h8write -Wall
h8write.c の先頭部分にはOS指定の #define があります.しかし実際にはこの #define 指定は(Windows以外では)シリアル・デバイスを切替えるだけであり, 実行時には利用するシリアル・デバイス名を引数として指定可能です. よってWindows以外では,h8write.c の修正は不要です.

「Hello World」を動かしてみよう!

プログラム・リストがそろったところで,ビルドして実行形式を作成してみましょう.

まずこのホームページの上のほうで公開されているソースコードをダウンロードして ください.フォルダ構成は下図のようになっています.

src ─┬─ 01 ── bootload ── main.c    ┐
      │                         startup.s │(1stステップのソース・コード)
      │                         vector.c  │
      │                         …        ┘
      ├─ 02 ── bootload ── … (2ndステップのソース・コード)
      ├─ 03 ── bootload ── … (3rdステップのソース・コード)
      …
      └ tools── h8write─── h8write.c (h8writeのソース・コード)
                                 h8write   (h8writeの実行ファイル)

また,h8writeの実行ファイルを上図の場所に置いてください. これはh8writeが「../../tools/h8write/h8write」というフォルダにあるという前提で Makefile を書いてあるためです.h8writeを別の場所に置くならば,Makefile 中の 「H8WRITE」の定義を適宜,書き換えてください.

プログラムをビルドする

ソース・コードのあるフォルダで make することでビルドできます. とりあえず,最終完成形(12ステップ目)のソース・コードで試してみましょう. ブート・ローダーはsrc/12/bootload,OSはsrc/12/osに入り, それぞれおもむろに「make」を実行してみましょう. 「kzload」「kozos」というファイルが作成されていたらビルド成功です. ブート・ローダーは,さらに「make image」を実行して, モトローラSレコード・フォーマットに変換してください. これで「kzload.mot」というファイルができあがります. もしもうまくビルドできない場合は,以下を確認してください.

フラッシュROMへの書き込み

作成したブート・ローダー(kzload.mot)を,H8/3069Fマイコン・ボード上の CPU内蔵フラッシュROMに書き込みます.

以下のものを用意してください.

まずは,シリアル・ポートを持っているPCを用意してください. コンパイルしているPCにシリアル・ポートが付いている場合はそのまま使えば いいのですが,シリアル・ポートが付いているPCを別に用意している場合には, そのPCに kzload.mot をコピーして持ってきてください.

H8/3069Fマイコン・ボードをシリアル・コネクタが上, LANコネクタが左にくるようにして見てください.

マイコン・ボードの右上には,4連のディップ・スイッチがあります. これらはCPUの動作モード設定ピンに直結しているスイッチで,CPUの動作モードを 指定することができます.またディップ・スイッチのすぐ右には, リセット・ボタンがあります.

まず,ディップ・スイッチを左から,ON,ON,OFF,ONの状態(上,上,下,上)に してください. この状態で電源ONすると,フラッシュROM書き込みモードとしてCPUが起動します.

PCとH8/3069Fマイコン・ボードをシリアル・ケーブルで接続します. さらにマイコン・ボードに電源アダプタを接続し,電源を入れます. H8/3069Fマイコン・ボードには電源のON/OFFボタンがありませんので, 電源アダプタを接続するとそのまま電源ONになります.

H8/3069Fマイコン・ボードの電源を入れたらフラッシュROM書き込みモードで起動して いますので,h8writeを実行することで,シリアル経由でフラッシュROMに 書き込みができます.

suでスーパー・ユーザになって,以下のように実行してください.

# h8write -3069 -f20 kzload.mot <シリアルのデバイス・ファイル>
Windowsの場合はスーパー・ユーザになる必要はありません. また Ubuntu の場合はスーパー・ユーザにならず,sudo によって実行してください.

「シリアルのデバイス・ファイル」は, おそらく以下のようになります.

各OSのシリアル・デバイス・ファイル
OSデバイス・ファイル名
FreeBSD-4.xでPC付属のシリアル・ポートを利用/dev/cuaa0
FreeBSD-6.xでPC付属のシリアル・ポートを利用/dev/cuad0
FreeBSDでUSBシリアルアダプタを利用/dev/cuaU0
LinuxでPC付属のシリアル・ポートを利用/dev/ttyS0
LinuxでUSBシリアルアダプタを利用/dev/ttyUSB0
Windowscom1

なおシリアルのデバイス名は, 利用するシリアル・ポートの状態によっても異なってきますので注意してください. 例えばシリアル・ポートが複数存在する場合には, 「cuad0」や「ttyS0」でなく「cuad1」や「ttyS1」のようにデバイスの番号が 変わってくるかもしれません. また Windows でうまくいかない場合には,com1 以降の com2, com3, ... でも 試してみてください.

配布しているブート・ローダーの Makefile では, 「make write」によって作成したファームウェアを h8write で書き込みできる ようになっています.の以下の部分です.

write :         $(TARGET).mot
                $(H8WRITE) -3069 -f20 $(TARGET).mot $(H8WRITE_SERDEV)
よって kzload.mot をビルドしたPCにH8/3069Fマイコン・ボードをシリアル接続 しているのならば,「make write」を実行すれば,h8write を実行してkzload.motを マイコン・ボードに転送してくれます.ただしこの場合,以下の注意が必要です.

まずMakefile中では,h8write のある場所を

H8WRITE = ../../tools/h8write/h8write
のようにして定義しています.よって make write を利用するためには, h8write の実行ファイルを定位置に置いてください (もしくはフォルダ構成に合わせて Makefile の H8WRITE を修正してください).

またシリアルのデバイスファイルはMakefile中で,以下のようにして定義されて います.

H8WRITE_SERDEV = /dev/cuad0
デフォルトでは FreeBSD に合わせて「/dev/cuad0」にしてあります. これも自身の環境に合わせて,書き換えてください.

さらに,h8write はデバイス・ファイルへの書き込みを行うため, make write はスーパー・ユーザで実行する必要があります.

% su
Password: (スーパー・ユーザのパスワードを入力)
によってスーパー・ユーザに切替えて,make write を実行してください.

なお注意として,h8writeと後述するFDTともに,USBシリアル・アダプタだと うまく書き込みができない場合があるようです.

また Fedora と Ubuntu では,PCに標準装備されているシリアル・ポートをh8writeから 利用した場合でも,PC起動後の最初の1回しか書き込みが成功しないという問題が 出ています.PCを再起動すると再度書き込みできるようになるので,この場合は 面倒ですがその都度再起動してみてください.

FDTの利用

フラッシュROMの書き込みに h8write でなく先述したルネサステクノロジの FDT(Flash Development Toolkit)を利用したい場合には,以下のようにしてください.

まずFDTをインストールします.筆者は以下ルネサステクノロジのサイトから 評価版の FDT v4.04 をダウンロードしました.なおダウンロードには登録 (無料ですが)が必要です.

http://japan.renesas.com/homepage.jsp
インストール時には拡張子の関連付けを聞いてくるので,デフォルトの設定に 加えて *.mot を追加しておきます.

インストール後にFDTを起動し,「新規プロジェクトワークスペースの作成」 を選択して適当な名前でワークスペースを作成します. マイコンの種類を聞いてくるので,H8/3069Fを選択します. シリアル・ポートを聞いてくるので,これは自身の環境に合わせて選択します.

次に入力クロックを聞いてくるので,20MHzを選択します. モードはブートモード(BOOT Mode), ボーレートはデフォルト(38400bps), その他パラメータはデフォルトのまま (フラッシュ書き込み時保護レベルは「Automatic」, 出力メッセージレベルは「Advanced」)とします.

H8/3069Fマイコン・ボードをPCにシリアル接続し,FDTのメニューで 「デバイス」-「デバイスとの接続」で,マイコン・ボードを認識します. さらに「ファイル」-「データファイルを開く」で「kzload.mot」を開き (拡張子の付け忘れで「kzload」を開かないよう注意), 「デバイス」-「対象ファイルのダウンロード」で,フラッシュROMに書き込むことが できます.

端末エミュレータの準備

今回作成した「Hello World」は文字列をシリアル出力するものですから, 動作を確認するためには,シリアル・ポートでの入出力を行う,いわゆる 「端末エミュレータ」が必要になります.

端末エミュレータは各種ありますが,以下にいくつか候補をあげますので, 自分に合ったものを選んで利用してください.

上記ツールの各々については,以下で簡単に説明します. なおシリアル接続時のパラメータは以下の表のようになります.

シリアル通信のパラメータ
ボーレート9600bps
データ長8ビット
ストップビット長1ビット
パリティ無し
ハードウェア・フロー制御無し
ソフトウェア・フロー制御(XON/XOFF)無し

「cu」の利用

FreeBSDではcuというツールが標準で利用できます. cuは「端末エミュレータ」というよりは, シリアル経由で別のシステムに接続するための単なるツールですが, 本書での用途には十分に利用できます.

cuを利用する場合,H8/3069Fマイコン・ボードとシリアル接続しているPCで スーパー・ユーザになって,以下のようにして起動してください.

% su
Password: (スーパー・ユーザのパスワードを入力)
# cu -l <シリアルのデバイス・ファイル>
「シリアルのデバイス・ファイル」は,h8write実行時に指定したものと同じです. シリアル接続のパラメータはデフォルトで上の表のように なっているためとくに指定は不要ですが,ボーレートの設定が必要ならば, 起動時に「-s 9600」のようにして指定することができます.

注意として,cuによる接続を行ったままの状態で h8write を実行すると, シリアル・デバイスがcuに占有されているため,h8write がうまく動作できません.

cuはキーボードを「~」「.」と連続して押下することで終了できます. h8writeの利用時には,必ずcuを抜けるようにしましょう. またh8writeでの書き込みがうまくいかない場合には,cuが繋ぎっぱなしになって いないか,疑ってみてください. プログラムの修正と書き込み,動作確認を繰り返し行っていると,このミスを しやすくなります(筆者がよくやるミスで多いのが,これです).

「Minicom」の利用

cuはコマンドライン・ベースのツールですが, 「Minicom」というフル・スクリーンの端末エミュレータがあり, 様々なUNIX系OSに移植されています.FedoraやUbuntuでは Minicom が利用できます. また FreeBSD のパッケージにもなっているので,FreeBSDでも利用できます.

Ubuntuの場合は,追加インストールが必要です.Ubuntuは「Synaptic」という パッケージ・マネージャを持っています.インターネットに接続された状態で 「システム」-「システム管理」-「Synapticパッケージ・マネージャ」 でSynapticを起動し,Minicomをインストールすることができます. なおこの際,ついでに「lrzsz」というツールもインストールしておいてください. これは以降のファイル転送に利用します.

FreeBSDの場合は,インストーラ(sysinstall)からパッケージ・インストールできます. Minicomは「comms」のカテゴリにあります.またUbuntuと同様に,この際ついでに 「lrzsz」もインストールしておいてください.カテゴリはやはり「comms」です.

Fedora はMinicomもlrzszも初めからインストール済みのようなので追加インストール は不要ですが,もしもインストールされていない場合には,追加インストールを 行ってください.

Minicomのインストールが完了したら,スーパー・ユーザになって以下のようにして 起動します.Minicomは -s オプション付きで起動することで, 設定メニューによる設定ファイルの作成後,起動します. なおUbuntuの場合は sudo によって起動してください.

# minicom -s -o
あとはメニューに従って,以下を設定してください. 設定が完了したら,メニューの「Save setup as dfl」を指定することで, 設定内容が「minirc.dfl」というファイルに保存されます. minirc.dflの位置は /etc か /usr/local/etc の下あたりです. さらに Minicom が端末エミュレータとして起動し,シリアル接続されます.

Minicom の操作はCtrlキーで行います. まずは「Ctrl+a」「z」でメニューが出ますので,読んでみてください. 「Ctrl+a」「x」で終了させることができます.

設定は最初の起動時のみで構いません.2回目以降は以下で起動できます.

# minicom -o
なおシリアル接続したままだと h8write がうまく動作しないのは,cuと同様です. h8writeの利用時には,必ず Minicom を終了させるようにしましょう.

「Kermit」の利用

「Kermit」という端末エミュレータがあり,やはりこれも Minicom と同様に, 様々なUNIX系OSに移植されています.Kermitには「C-Kermit」「G-Kermit」などの 種類があります.

Kermit を利用する場合,追加インストールが必要なのは Minicom と同様です. まずはインストールを行い,さらにスーパー・ユーザで

# kermit
を実行して起動してください.起動すると
(/home/hiroaki/) C-Kermit>
のようにコマンド・プロンプトが表示されます.まずは
(/home/hiroaki/) C-Kermit>help
で,ヘルプを読んでみてください.また詳細なマニュアルを
(/home/hiroaki/) C-Kermit>manual
で参照できます.

コマンド・プロンプトが表示されている状態で

(/home/hiroaki/) C-Kermit>set line /dev/cuad0
のように入力することでシリアル・デバイスを指定します.さらに
(/home/hiroaki/) C-Kermit>connect
で,シリアル接続します.うまくいかない場合は
(/home/hiroaki/) C-Kermit>set carrier-watch off
を試してみてください.

接続後は「Ctrl-\」「?」でヘルプを出力します. 「Ctrl-\」「c」でコマンド・プロンプトに戻り, 「Ctrl-\」「q」で終了します.またコマンド・プロンプトから「exit」で 終了することもできます.

「ハイパーターミナル」の利用

WindowsXPには標準で「ハイパーターミナル」という端末エミュレータが付属して います.スタートメニューの「アクセサリ」-「通信」-「ハイパーターミナル」で起動 できます.

「ファイル」-「新しい接続」で接続方法にシリアルのデバイスを指定します. さらにシリアル・ポートの設定を適切に行うことで,シリアル接続できます.

「TeraTerm」の利用

Windowsの場合は,「TeraTerm」という有名な端末エミュレータがあります. TeraTermはvectorの以下のサイトからダウンロードできます.

http://www.vector.co.jp/
TeraTermを起動すると接続先を聞いてきますので,シリアル・ポートを選択し, シリアルデバイスを指定します. うまく接続できない場合は,「設定」-「シリアルポート」で 接続時のパラメータが正しいか,確認してみてください.

フラッシュROMからの起動

これでフラッシュROMへの書き込みも完了し,端末エミュレータの準備もできました.

いよいよ起動してみましょう.まずH8/3069Fマイコン・ボードのディップ・スイッチを 左から,ON,OFF,ON,OFFの状態(上,下,上,下)にしてください. この状態で電源を入れると,CPUが内蔵フラッシュROMからプログラムを起動します.

端末エミュレータを起動し,電源を入れます. H8/3069Fマイコン・ボードには電源スイッチがありませんので,電源アダプタの コネクタを抜き差しするか,リセット・ボタンを押します.リセット・ボタンは ディップ・スイッチのすぐ右側にあります.

うまく起動できれば,端末エミュレータ上にプロンプトが出力されるはずです. リセット・ボタンを押すと,押すたびに再起動してプロンプトが出力されます.

OSの起動

ブート・ローダーが起動したら,次はOSをロードして起動します.

OSのロードには XMODEM プロトコルによるファイル転送を行いますから, まずは XMODEM による ファイル転送が行えるアプリケーションをPCにインストールする必要があります.

ファイル転送プログラムのインストール

ファイル転送プログラムには,FreeBSDやGNU/Linuxでは lrzsz という フリーソフトウェアが利用できますので,まずは lrzsz をインストールしてください. FreeBSDでは lrzsz はパッケージになっている(commsのカテゴリです)ので, パッケージ・インストールできます.

Fedora では lrzsz は Minicom と同様に,はじめからインストール済みのようです. もしもインストールされていない場合には,追加インストールしてください. Ubuntuではインストールが必要なようですので,Synapticパッケージ・マネージャから インストールしてください.

Windowsの場合はハイパーターミナルやTeraTermがXMODEMの機能を持っているため, ファイル転送プログラムのインストールはとくに必要ありません.

ファイル転送をしてみる

ブート・ローダーをフラッシュROMに書き込んだ状態で ディップ・スイッチを実行モードにしてマイコン・ボードを起動すると, 「kzload>」という「プロンプト」が出力されるはずです.

この状態では,CUIでのコマンド入力待ちになっています.

まず「load」と入力することで load コマンドを実行して, XMODEMでの受信待ちに入ります.

あとはファイル転送プログラムを起動してファイル転送を行うわけですが, 端末エミュレータごとに方法は異なるため,個別に説明します. ただ共通した注意点がいくつかあります.それは

という3つのことです.

というのは,ファイル転送の選択後にファイル指定に手間取っていると, ファイル転送開始時にH8/3069Fマイコン・ボードから送信される転送開始要求のNAKが どうもその間に積まれてしまい,ファイル転送プログラムによってはこれが エラー通知のNAK扱いになってしまい転送失敗してしまうことがあるようなのです.

とくに転送開始要求のNAK送信の間隔が短いとエラーになりやすいため, 本書ではNAKの間隔を8秒程度と,長めにとっています. このため転送開始を選択してから実際に転送が開始されるまで数秒かかる 場合があります.転送開始を指定してからなかなか転送が始まらないとしても, 数秒は待ってみてください.

またファイル転送プログラムによっては,転送するファイルの選択にはあまり もたもたして時間をかけず,スピーディに行う必要があるようです.

さらに,フロー制御が有効になっているとファイル転送に失敗します. 今まではキーボードからのテキスト文字の入力を受け付けていただけなので, 実はフロー制御の影響はあまり関係なかったのですが,今回はバイナリ・ファイルを シリアルの転送速度いっぱいで送るため,フロー制御が有効になっていると 転送に失敗します.もしもファイル転送がうまくいかない場合には 「ハードウェア・フロー制御」「ソフトウェア・フロー制御」「XON/XOFF」 「フロー・コントロール」 などといった設定が有効になっていないか,確認してみてください.

「cu」の場合

cuで接続している場合には,ブート・ローダーでの「load」の実行後にキーボード から「~」「C」と入力します(「C」は大文字ですので,Shiftキーを押すことに 注意してください).これは子プロセスとしてファイル転送プログラムを 起動するためのcuへのコマンドです.

「~」「C」と入力すると,起動する子プロセスの指定待ちになります. ここで,子プロセスとして「lsx」を起動することで,XMODEMプロトコルで ファイル転送ができます.「lsx」は「lrzsz」に付属している,XMODEMプロトコルの ファイル転送アプリです.

OSのディレクトリ(src/12/os)でmakeを実行して作成した「kozos」というファイルが, OSのオブジェクトです.これを転送します.「lsx kozos」と入力して Enterを押してみてください.lsxがcuから子プロセスとして起動され,cu経由で マイコン・ボードとXMODEM通信を行い,ファイルの転送を実施します. なお「lsx」が存在しない場合には,かわりに「sx」を指定してみてください.

「XMODEM receive succeeded.」と出力されれば,転送は成功です. 失敗すると「XMODEM receive error!」と出力されます.

「Minicom」の場合

端末エミュレータとして「Minicom」を利用している場合には,まず Minicom を -s オプション付きで起動して,ファイル転送の設定を行ってください. 起動はスーパー・ユーザになって行います.

# minicom -s -o
設定メニューから「File transfer protocols」を選択することで,ファイル転送の 設定が行えます.とはいえXMODEMに関してはとくに設定を行う必要は無く, デフォルトのままで問題はありません.

ただ先述したように,ファイル選択にあまり時間をかけるとNAKが誤認識され, 転送に失敗する場合があるようです.このため「Use filename selection window」は 「No」にして,ファイル選択はパス名指定でスピーディに行えるようにしておいた ほうがいいでしょう.

また「Serial port setup」の設定でフロー制御が無効になっているか, もう一度確認しておいてください. ハードウェア・フロー制御,ソフトウェア・フロー制御の両方とも, 無効にしておく必要があります.

ブート・ローダーで「load」を実行後,Minicomで「Ctrl+a」「s」のようにキー入力 することで,ファイル転送メニューに入れます.プロトコルにXMODEMを選択し, 転送するファイルの名前を入力することで,ファイル転送を開始します.

先述したように,ファイル名入力にはあまり時間をかけすぎないように注意して ください.cuの例と同様に「kozos」を転送してみましょう.

「Kermit」の場合

Kermitの場合は,まずKermitのコマンド・プロンプトで以下の設定を行っておきます.

C-Kermit>set protocol xmodem lrx {lrx -a} {lsx %s} {lsx -a %s} lrx lrx
上記はFreeBSDの場合です.FreeBSDのlrzszパッケージでは, lrzsz に含まれるXMODEM送信・受信プログラムはそれぞれ「lsx」「lrx」という コマンド名なので,ファイル転送時に起動されるプログラムにそれらを指定して います.

これに対して Fedora や Ubuntu では, lrzsz に含まれるXMODEM送信・受信プログラムはそれぞれ「sx」「rx」という コマンド名のようですので,以下のように「lsx」を「sx」に, 「lrx」を「rx」に置き換えて設定してください.

C-Kermit>set protocol xmodem rx {rx -a} {sx %s} {sx -a %s} rx rx
設定が終わったら connect でブート・ローダーに接続します.
C-Kermit>connect
ブート・ローダーで「load」の実行後,「Ctrl+\」「c」でKermitの コマンド・プロンプトに戻ります.さらに転送するファイルを指定して send コマンドを実行することで,ファイル転送を行うことができます. cuの例と同様に「kozos」を転送してみましょう.
C-Kermit>send kozos
ファイル転送が完了したら,connect で再度ブート・ローダーに再接続してください.
C-Kermit>connect

先述したように,ファイル名入力にはあまり時間をかけすぎないように注意して ください.

「ハイパーターミナル」の場合

ハイパーターミナルでは,ブート・ローダーで「load」を実行後, メニューから「転送」-「ファイルの送信」を選択します. ファイル選択し,さらにプロトコルに「Xmodem」を選択することで 転送が開始されます. 「kozos」を転送してみましょう.

ファイル名入力にはあまり時間をかけすぎないように注意してください.

「TeraTerm」の場合

TeraTermでは,ブート・ローダーで「load」を実行後, メニューから「ファイル」-「転送」-「XMODEM」-「送信」を選択します.

「オプション」には「チェックサム」を指定してください (「CRC」や「1K」を選択すると転送できません). あとはファイル選択すれば,ファイルが転送されます. 「kozos」を転送してみましょう.

ファイル名入力にはあまり時間をかけすぎないように注意してください.

OSの起動

転送が完了したら,「run」を実行することでOSが起動します.

ここで起動するのはシリアルからのコマンドに応答するだけの簡単なものです. 「echo XXX」と入力すると,「XXX」と答えます.

動作としては単純ですが,単にシリアルに応答しているというだけではなく, 割込みハンドラからコマンド処理スレッドにメッセージを投げ,コマンド処理 スレッドが行単位でのコマンド処理を行い,応答をシリアルデバイス管理スレッドに 投げ,シリアルデバイス管理スレッドが出力処理を行う, 送信は割込みに応じて続く文字を順次送信する, やることが無いときにはアイドルスレッドがCPUを省電力モードに移行させるという, 割込みドリブン&スレッドベースの動作をしています. スレッドも複数のものが同期しながら動作しており,いかにもOS上で動いているという 動作になっています.


メールは kozos(アットマーク)kozos.jp まで