開発の流れとモニタプログラム
これまでは,マイコンの歴史や内部構造,命令の処理方法などについて学んできた.これから先は,実際の組込みソフトウェア学習教材,通称ミームス(MEMEs:Multi purpose Educational Material for Embedded software)を使ってマイコンにおけるソフトウェア開発について学習する.
ミームスには,ルネサスエレクトロニクス社製の32ビットマイコンR5F70855AN80FPV が搭載されている.これは正式な名称で,「型番」と呼ばれる名前である.メーカに注文するときなどに使う名称である.本ページでは,俗称であるSH7085と呼ぶこととする.
プログラム開発の大まかな流れ
まず自分たちが作ったプログラムを実際のマイコンで実行させるまでの大まかな流れを図1に示す.これを実現するために必要なツールは,HEW(ヒュウ:High performance Embedded Workshop),hterm,モニタプログラムの3つである.これらについては,後で説明するので,ここでは,単に必要な道具とだけ思っておけばよい.
図1:プログラム開発の流れ
もちろん,実行した結果が自分が思った通りに動作しない場合は,プログラム作成からもう一度やり直す必要がある.それでは,それぞれの工程について説明する.
プログラムの作成
ここで言うプログラムとは,厳密にはユーザプログラムである.今回の開発環境では,2種類の異なる役割のプログラムが登場する.1つは,ユーザプログラムであり,もう1つは,モニタプログラムである.明確に区別するため,ユーザプログラムとモニタプログラムという言葉を使い分けて説明する.
プログラミング言語には,C言語を用いる.今回のようなマイコンを使った組込みソフトウェア開発においては,C言語で開発することが(今のところ)主流である.C言語で記述することが難しい場合には,アセンブリ言語を使用することもあるが,今回はすべてをC言語で記述するため,アセンブリ言語についてはここでは説明しない.
ユーザプログラムの記述には,HEWで提供されているテキストエディタを使用する.(自分の好きな環境にカスタマイズすることも可能であるがそれについては,ここでは説明しない.)
ビルド
マイコンが理解して実行できるのは機械語(マシン語)と呼ばれる数値情報(2進数や16進数)で表現された言語だけである.そのため,C言語で記述したユーザプログラムを直接マイコンに転送しても動作させることはできない.作成したユーザプログラムは機械語に変換してマイコンに送る必要がある.この機械語に変換する作業をビルドと呼ぶ.ビルドとは,記述したプログラムをコンパイルし,必要なライブラリとリンクし,機械語を生成することである.
プログラムをビルドし,生成された機械語を実際にエディタで開いて見ると,16進数の数値情報になっている.この数値情報にもいくつか種類があり,Intel-HEX(拡張子 hex)やMotrola-S(拡張子 mot または s )フォーマットと呼ばれるものがある.今回は,Motrola-S フォーマット(拡張子 mot )のファイルをマイコンに転送して実行させる.
ユーザは,HEWがあれば,プログラムの記述とビルドをすることはできるが,実際にマイコンに mot ファイルを転送するには,別のツールが必要になる.
ダウンロード
HEWでプログラムを記述し,ビルドによって生成された mot ファイルをマイコンに転送することをダウンロードと言う.ファイルをマイコンにダウンロードするとき,ファイルをどこに(どのメモリ領域に)ダウンロードするかで必要になるツールが異なる.
今回は,マイコン内部の ROM にはモニタプログラムがダウンロードされた状態であるため,ユーザプログラムはモニタプログラムを介して,外付けの SRAM へダウンロードされる.そのためのツールが hterm である.hterm は,モニタプログラムと通信を行いユーザプログラムをSRAMにダウンロードするツールであると考えて良い.簡易的なデバッガ機能もあるので必要に応じて説明する.
実行
ユーザプログラムの実行は,モニタプログラムを介して実行される.今回の開発環境においては,ユーザプログラムは全てモニタプログラムを介してダウンロードされ,実行されるようになっている.モニタプログラムは,hterm と通信するようになっており,ユーザは hterm からモニタプログラムに対してコマンドを送信することで様々な動作をさせることができる.ユーザプログラムのダウンロードや実行など,すべて hterm からコマンドを送り実現される.
モニタプログラムを介する理由は,内蔵ROMの書き換え回数の問題である.今回の SH7085 に内蔵されているROMの書き換え回数は100回である.そのため,ユーザプログラムを ROM に頻繁に書き込んだ場合,ROMの寿命が短くなってしまう.そのため,内蔵ROMにはモニタプログラムを常駐させておき,ユーザプログラムは外部のSRAMに格納し実行させる方式をとる.
モニタプログラムの役割
ミームス上のマイコンの内蔵ROMには,既にモニタプログラムが書き込まれている.ここでは,このモニタプログラムの役割について説明する.
ミームスに電源を投入すると,SH7085は内蔵ROMの特定番地からプログラムを実行し始める.このプログラムがモニタプログラムである.モニタプログラムの主な役割は次の3つである.
- 外部SRAMとの接続やPCとの通信確立
- PCからのコマンドを受付てそれを実行
- printf() やscanf() の標準入出力の提供
モニタプログラムには,上記以外にも多くの機能があるが,今回はこの3つを知っていれば十分である.
外部SRAMとの接続やPCとの通信確立
マイコンは,プログラムがなければ動作しない.これについてはこれまでに学習してきた.命令を逐次読みだしてそれに応じた処理を行うのがマイコンである.つまり,プログラムが無い状態でマイコンに電源を投入しても何も起こらないのである.
そこで,モニタプログラムをマイコンの電源投入時に実行するようにしておき,すぐにプログラム開発ができるような環境を提供する.まず,ユーザプログラムは内蔵ROMではなく,外部のSRAM上にダウンロードして実行されると説明してきた.このSRAMとの接続設定を行なっているのはモニタプログラムである.また,プログラム開発のためのPCとの通信を行うための機能もモニタプログラムが提供している.このモニタプログラムの設定は,使用するハードウェア環境によって異なるので,今回使用しているモニタプログラムを別の環境で使用することは不可能である.
今回のモニタプログラムでは,SH7085の BSC と SCI という機能を主に使っている.これについては,ここでは説明しないが,BSC が SRAM との通信を行なっているアドレスバスやデータバスの設定を行う機能である.SCI はシリアル通信を行うための機能である.
PCからのコマンドを受付て実行
プログラム開発用のPCとMEMEsを図2のようにUSBケーブルで接続して,PCでは,hterm を起動させておく.この状態で,MEMEsに電源を投入すると,SH7085の内蔵ROM内のモニタプログラムが実行される.モニタプログラムは,各種設定を行い,hterm上にオープニングメッセージを表示して,PCからコマンドの受け付け待ち状態になる.近年のPCの多くは,RS232Cと呼ばれるシリアル通信ポートを備えておらず,ほぼ全てがUSBになっている.しかし,SH7085との通信はシリアル通信であり,USBではない.そこで,MEMEsには,USBをシリアルに変換するICが搭載されている.
図2:パソコンとマイコンの接続方法
hterm 上のオープニングメッセージが文字化け状態になっているとは,通信速度が異なっている場合が多く正常に通信できていない.この場合,hterm の通信速度の設定を見直す必要がある.詳細については,後の hterm の使い方で説明する.
hterm 上からコマンドを入力すると,USBケーブル,USB-シリアル変換ICを介してSH7085のモニタプログラムへ送られる.モニタプログラムは受け取ったコマンドに対応した処理を行う.このコマンドに対して応答する必要があれば,その結果が hterm 上に表示される.
モニタプログラムのコマンドはいくつかの種類があるが,今回使用するコマンドとしては,Dコマンド、Fコマンド、Lコマンド、Gコマンドの4つを覚えておけば十分である.
- Dコマンド: ダンプコマンドと呼ばれ,任意の番地の内容を16進数で hterm 上に表示する.任意の番地が指定可能なので,内蔵ROMや外部のSRAM,取り込んだデータの内容やレジスタの設定値などを確認することができる.
- Fコマンド: フィルコマンドと呼ばれ,任意の番地から始まるブロックに数値データを書き込むコマンドである.メモリのクリアや特定の値でメモリ内を埋めたいときに使用する.
- Lコマンド: ロードコマンドと呼ばれ,HEWでビルドされて生成されたmotファイルをSRAMへダウンロードする際に使用するコマンドである.
- Gコマンド: ゴーコマンドと呼ばれ,任意の番地を指定してユーザプログラムを実行するコマンドである.番地の指定がない場合は,ユーザプログラムで指定されている番地から実行される.
printf()とscanf()機能の提供
一般的にC言語でプログラムを記述するとき,printf(“Hello World”); と記述すればディスプレイ上に文字が表示される.また,scanf()関数はキーボードからのキー入力を受け取りプログラムによって処理される.これらのディスプレイやキーボードは,標準入出力と呼ばれるデバイスであり,PC上で開発するC言語のプログラムであればほとんどの場合がディスプレイやキーボードが標準入出力となる.
しかし,今回のようなマイコンを使ったプログラムの場合,標準入出力がどのデバイスであるかは不明である.そこで,モニタプログラムには,printf()とscanf()関数が組み込まれており,標準入力を hterm からの入力とし,標準出力を hterm としている.つまり,hterm を介してprintf やscanf の入出力を行なっている.
図3:printf と scanf 関数の位置づけ
ユーザプログラム中にprintf やscanf を使用する場合,モニタプログラムが提供しているprintf とscanf を使用する.つまり,図3のように,ユーザプログラム中に記述したprintf や scanf 関数の実体はモニタプログラム中に存在しており,ユーザをそれらの関数を使うようにする.