2001/08/26 【ソフトウエア編TOPに戻る】
日立製作所のRISC式ワンチップマイコンのSH(SuperH)シリーズは、最近流行りのマイコンです。特にSH2マイコンは制御用に便利で比較的手軽なマイコンです。今回は、トランジスタ技術2001/6月号の特集「32ビット・マイコンSH−2入門」をもとに、力弥なりに簡単に実行できるSH2のソフト開発環境を整えたので、ご紹介します。
トランジスタ技術の特集では、一番ポピュラーなSH2-7045Fについての解説がなされていますが、力弥が入手したマイコンはSH2-7051Fです。しかし、基本的な開発環境はとりあえず一緒なので、トラ技の記事と共に参考にして下さい。トラ技2001/6月号をお持ちでない方は、すぐに本屋さんにバックナンバーの注文をしましょう。
なお、今回のターゲットとなるマイコンボードは、アルファプロジェクト製のAP-SH2F-1Aです。ハードウエアについては、電子回路編 5.SH2(7051F)マイコンボードを参照して下さい。
以下にこのページの目次を載せてみます。こんな調子で話を進めます。
4−3.GNUpro-99r1p1での実行プログラム生成に必要なファイル類
4−6.生成した実行ファイルmotをSH2のフラッシュROMに書き込む
アルファプロジェクトのAP-SH2F-1Aを通販で買うと、マイコンボード本体とフロッピーディスクが1枚、そしてボードの回路図とマニュアルの閲覧方法が書いてある紙が届けられます。
フロッピーの中身には自己解凍形式のユーティリティファイルapsh2f1a.exeと、README.TXTが収録されており、ユーティリティファイルを解凍すると、以下のフォルダが現れ、それぞれには必要なファイル類が入っています。
■fztat
ユーザープログラムをフラッシュに書き込むためのプログラムFW7051.exeが収録されています。
■manual
マイコンボードAP-SH2F-1Aの使用方法を説明するPDFファイルが収録されています。
■sample
サンプルプログラムが収録されていますgcc版と日立C版の両方が収められています。
■回路図
マイコンボードAP-SH2F-1Aの回路図がPDFファイルで収録されています。
ただし、SH2ワンチップマイコンのハードウエアマニュアルや、アセンブラ、Cコンパイラおよびリンカといった開発ツールは収められていませんので、個別に入手する必要があります。
力弥の場合は、ハードウエアマニュアルは日立製作所のホームページから、開発ツール(GNUpro)はトラ技2001/6月号付録のCD-ROMから入手しました。
AP-SH2F-1Aのフロッピーに入っているREADME.TXTを見ると、コンパイラは以下の2種類に対応すると明記されています。
1.日立C(日立 SuperH RISC engine Cコンパイラ)
2.GCC(gnupro-99r1p1)
■1.日立C(日立 SuperH RISC engine Cコンパイラ)
日立製作所が提供する純正(?)のソフトウエア開発環境です。通常のC言語では記述できないCPU内のステータスレジスタ(SR)の参照/操作や、SLEEP命令などが組み込み関数として用意されているらしく、マイコン特有の命令が直接記述できる点などが、有利のようです。
■2.GCC(gnupro-99r1p1)
GNUプロジェクトによって開発されたコンパイラで、広く一般的に使われている環境です。しかし、GUNのツール類はもともとLinux上で動作するように作られており、それをWundows上で動くようにしたのが、レッドハット社製のGNUproです。ただしWindows上で動くと言ってもGUI環境上ではなくて、あくまでDOSプロンプト上での話です。
GNUproをWindows上のGUI環境で統合的に動かすものとして、ベストテクノロジー製のGCC Developer Lite版などがあります。
日立とGCCのどちらを利用するかは自由ですが、広く一般的に普及しているという点から、力弥はGCCを選ぶことにします。日立の開発ツールが一般にどれくらい普及しているかは分かりません。もしかしたらすごく使いやすいかもしれませんが、広く他に流用できそうな技術を身に付けるという点では、GCCのほうが良いのかなあ、といった程度で決めました...。
ベストテクノロジー製のGCC Developer Lite版を使って、GUI環境で統合的に開発をしたいのはやまやまですが、説明書を見るとH8/3048FとSH2/7045Fに対応となっており、SH2/7051Fへの対応は明記されていないので、今回は見送ります。
なので、今回の開発環境も、AKI-H8用の秋月純正Cコンパイラの開発環境のように、WindowsのDOSプロンプトから実行させます。(すみません...)
201−2.GNUpro-99r1p1による開発環境整備の概要
GNUによる開発環境整備の手順は、トランジスタ技術2001/6月号に詳しく紹介されており、いまさら力弥がここに書くこともないのですが、AP-SH2F-1Aに付属のSAMPLEプログラムを利用しながら、ちょっとだけ手を加えて自分なりに使いやすくしてみたいと思います。
変更点は以下のとおりです。といっても大したことは無いのですが...
1.ユーザー関数をヘッダファイルにまとめて、コンパイル作業をパターン化する。
トラ技の特集記事では、複数のユーザー関数を個別にコンパイルし、リンカで結合させる事例で紹介されています。今回はユーザー関数をヘッダファイル化して取り込み、コンパイルするのはひとつのメインとなるプログラムのみとして、コンパイルのために実行するコマンドをパターン化させます。
2.パターン化させたコンパイル作業をBATファイルにして自動化する。
感じとしてはAKI-H8用にご紹介した3.C言語コンパイル手順と同様の手法で、コンパイルの結果をソースプログラムが保存されている特定のフォルダ上に自動的に作成させるようにします。
何度も言いますが、ここから先はトランジスタ技術2001/6月号の特集記事を見ながらでないと実際にお手元で確認することができないかもしれませんので、是非バックナンバーの注文を!(CQ出版社のマワシモノ...)
201−3.GNUpro-99r1p1での実行プログラム生成に必要なファイル類
GNUproでユーザープログラムを作成するためには、以下のファイル類が必要になります。
1.ベクタテーブル定義ファイル vector.s
2.スタートアップファイル crt0.s
3.リンカスクリプトファイル lnkscrpt.x
4.マップファイル mapfile.map
5.C言語によるユーザープログラム 例としてsample.c
6.ヘッダファイル SH7050s.h
7.ユーザヘッダファイル myfunc.h
1.ベクタテーブル定義ファイル vector.s
電源を入れたあとにユーザープログラムが起動するのは、このベクタテーブルファイルのお陰です。ベクタテーブルの中の先頭アドレスで _startラベルと _stackラベルを指定して実行させることによってユーザープログラムが動き出します。また、種々の割り込み要因が発生した場合に、所定の割り込み関数が呼び出されるのも、ベクタテーブルのお陰です。
ベクタテーブルファイルは非常に長いので、ここに記載するのはやめておきますが、ここをクリックするとダウンロードできます。(vector.s) トラ技の特集版ではなくボードに付属のサンプル版ですが、トラ技の記事と変わりません。
サンプル版のベクタテーブルには、すでに_int_cmi0 , _int_atu0 , _int_eri_1 , _int_rxi1 , _int_txi1 , _int_tei1などの割り込み関数が定義されていますが、通常はユーザープログラムで使用する割り込み要因の部分だけにラベル名(割り込み関数名)を記入し、使用しない割り込み要因の部分は _start と記入しておきます。
2.スタートアップファイル crt0.s
ベクタテーブルの先頭アドレスで指定した _start , _stack の処理内容を記述したアセンブリ言語のファイルです。ベクタテーブルと、このスタートアップファイルを合わせると、ちょうどAKI-H8でのstartup.marに相当する機能となります。
今回はトラ技の特集版ではなく、ボードに付属のサンプル版を利用しますが、内部処理的にはboot関数の呼び出しと、スタックアドレスの設定が行なわれます。ここをクリックするとダウンロードできます。(crt0.s)
トラ技版では外部関数用として _boot , _main , _exit の各ラベルが定義されており、boot関数終了後は、引き続きmain関数を実行するように、crt0.sの中で指定されています。
一方、ボード付属のサンプル版では外部関数としては _boot のラベルしか登録されていないので、main関数は勝手には起動されません。なので、boot関数の中の一番最後の部分で、main関数を呼び出してあげる必要があります。
3.リンカスクリプトファイル lnkscrpt.x
プログラムを各セクションごとに実メモリーに配置していくための、メモリー領域を指定するためのファイルで、リンカを動作させるためのものです。通常はハードウエア環境ごとに固定の設定でOKですが、モニターデバッガを使用する場合には、ここの設定を変更する必要が出てきます。これもトラ技版ではなくボード付属のサンプル版を利用します。ここをクリックするとダウンロードできます。(lnkscrpt.x) なお、このlnkscrptというファイル名称は、今回環境を整備する上で力弥が勝手に付けた名前で、オリジナルはsh2f_1a.xでした。
4.マップファイル mapfile.map
リンカが、プログラムの各セクションや関数類をメモリー上にどう割り付けたか、の結果を報告するファイルです。なので、開発者が作成するファイルではありません。しかし、リンクを実行しているときにマップファイル自体が存在していないとリンカがエラーを返してくるらしいので、エラーを出さないために、あらかじめ用意しておきます。ここをクリックするとダウンロードできます。(mapfile.ma_ というファイル名称になっているため、ダウンロード後は拡張子をmapに変更して下さい。) なお、このmapfileというファイル名称も、今回環境を整備する上で力弥が勝手に付けた名前です。
5.C言語によるユーザープログラム
当然、これがないとどうしようもありません。(^^; ただし、H8の時のように単純には行かないようです。それは起動までの手順の部分にある種の癖があり、またCPUのアーキテクチャに起因する独特な前準備などが必要になる点です。
スタートアップファイルcrt0.sのなかで、先ずはじめにboot()関数を呼び出すようにしていますので、ユーザープログラムの中には、必ずboot()関数が必要です。boot()関数の中では、SH2マイコンの各端子の機能設定を行い、続いてメモリの初期化関数をsectionInit()呼び出し、その後にmain()関数に処理を渡しています。また、main()関数の一番初めに、__main()というダミー関数を置く必要があります。今のところはお呪い程度と考えておきます。
今回のC言語でのサンプルプログラムは、ここをクリックするとダウンロード(sample.c) できますので、参照して下さい。 これもボードに付属のサンプルプログラム(main.c)が元ですが、プログラムの先頭部分に#include "myfunc.h"を追記しています。
ユーザープログラムの作成方法については、別の機会にご紹介いたします。
6.ヘッダファイル sh7050s.h
SH2-7051Fの内部レジスタが定義されています。AKI-H8の3048F.Hの役割と一緒です。ユーザープログラム中で#include "sh7050s.h"と記述して読み込んであげる事により、各種のI/O機能を利用したプログラムが作りやすくなります。sh7050s.hは、ボードに付属のサンプルプログラムの中に収められていますので、そちらから入手して下さい。
7.ユーザヘッダファイル myfunc.h
ユーザーが作った関数類をまとめたヘッダファイルです。トラ技版やボード付属のサンプル版では、sci.cというシリアル通信の関数を集めた個別のプログラムが提供されており、メインのプログラムとはリンカによって結合させていました。しかし、これらの共通として利用できる関数はヘッダファイルにまとめてインクルードしたほうが、コンパイル作業もパターン化できて得策だと考え、myfunc.hというヘッダファイルに載せ替えました。#include "sh7050s.h"と同様に#include "myfunc.h"として読み込んで使用します。ここをクリックするとダウンロードできます。(myfunc.h) myfunc.hの中身は、今後順次増やしていくことになります。
またこの他にも、GNUproをインストールすると標準的に利用できる関数が沢山のヘッダファイルに収められて提供されます。積極的に利用すると便利でしょう。
では、具体的に開発環境の整備の方法をご紹介します。
201−4−1.GNUpro-99r1p1のインストール
トラ技2001/6月号の特集第4章「gccとGNUproによるソフトウエア開発の実際」をよく読んで、インストールを行います。GNUpro-99r1p1のプログラム本体は、同じくトラ技2001/6月号に付属のCD-ROMに収められています。なお、レッドハット社のホームページからも入手可能です。
201−4−2.実行プログラムの生成に必要なファイル類を、所定のフォルダに置く
以下のような階層のディレクトリ構造でフォルダを作り、実行プログラムの生成に必要なファイル類をそれぞれの場所に置いていきます。なお、以下の事例でのドライブ名(E:)は力弥の開発環境での話ですので、自分の環境に合わせて読み替えて下さい。
|
E: ┐ DATA┐ SH2┐ C_SOURCE┐ SAMPLE ←プログラム名と同じフォルダを作る
■SH2のフォルダには、以下のファイルを入れておきます。 crt0.s lnkscrpt.x mapfile.map sh7050s.h myfunc.h go.bat ← このあとでご説明します。
■プログラム名と同じ名称のフォルダの中には、以下のファイルを入れます。 (例としてsample) sample.c ← ユーザープログラムです。 vector.s ← ユーザープログラムごとに割込み設定が異なるのでここに置きます。
|
201−4−3.コンパイル作業を一括で行なうためのバッチファイルを作る go.bat
実行プログラムの生成に必要なファイル類は、以下の手順でアセンブル、コンパイル、リンクおよびファイル変換されて、フラッシュROMに書き込める形式の実行ファイルになります。
■1.vector.s のアセンブル
vector.sをアセンブルして、vector.oというオブジェクトファイルを生成します。
■2.crt0.sのアセンブル
crt0.sをアセンブルして、crt0.oというオブジェクトファイルを生成します。
■3.C言語メインプログラムのコンパイル
事例としてsample.cというC言語のプログラムをコンパイルして、sample.oというオブジェクトファイルを生成します。
■4.リンカにより実行可能なファイルを生成
vector.o , crt0.o , sample.o の各オブジェクトファイルを、リンカスクリプトlnkscrpt.xに基づいて結合させ、実行可能なファイルsample.outを生成させます。同時にリンク結果はマップファイルmapfile.mapに書き出されます。
■5.モトローラSファイル形式に変換して完成
最後に、実行可能なファイルをフラッシュROMに書き込むことができるファイル形式に変換して完成します。sample.mot
以上の一連の動作を行なうバッチファイルを以下にご紹介します。ここをクリックするとダウンロードできます。go.bat
| del crt0.o del c_source\%1\vector.o del c_source\%1\%1.o del c_source\%1\%1.out del c_source\%1\%1.mot sh-hms-gcc -c -v -t -O0 -m2 c_source\%1\vector.s -o c_source\%1\vector.o sh-hms-gcc -c -v -t -O0 -m2 crt0.s -o crt0.o sh-hms-gcc -c -v -t -O0 -m2 c_source\%1\%1.c -o c_source\%1\%1.o sh-hms-gcc -v -t -m2 -nostartfiles -Wl,-Map mapfile.map -o c_source\%1\%1.out c_source\%1\vector.o crt0.o c_source\%1\%1.o -Tlnkscrpt.x sh-hms-objcopy -O srec c_source\%1\%1.out c_source\%1\%1.mot |
go.batは、上記の環境の例で言うと「E:\DATA\SH2」のフォルダに入れておくことになります。
では、ここで整備した環境を使って、実際にサンプルプログラムsample.cをコンパイルして、フラッシュROMに書き込める形式のファイルまで一気に作ってみます。手順は以下の通りです。
■1.GNUproを起動する。
GNUproがインストールされていれば、スタート→プログラム→Cygnus→Cygnus GNUpro Toolkit GNUpro-99r1p1というタグをたどって、GNUproを起動させることができます。
起動すると、WindowsのDOSプロンプトが開きます。
■2.カレントフォルダを\DATA\SH2に移す。
DOSプロンプトから、以下の操作を行いカレントフォルダを\DATA\SH2に移します。
E: (リターン)
CD DATA\SH2 (リターン)
DOSプロンプトの表示が E:\data\sh2> になったら成功です。
■3.ファイルを確認する。
4−4−2.実行プログラムの生成に必要なファイル類を、所定のフォルダに置くを参照して、E:\data\sh2\c_source\の下にプログラム名称と同じフォルダを作ってあることと、更にそのフォルダの中に、C言語のユーザープログラム とvector.s があることを確認します。
■4.DOSプロンプトからBATファイルを実行する。
DOSプロンプトから、go に続けてプログラム名称を入力してリターンを押します。今回はsampleというプログラム名称なので、
go sample (リターン)
を実行すると、フラッシュに書き込み可能なsample.motが出来上がります。sample.motはプログラム名称と同じフォルダ内に生成されるため、この場合はsampleというフォルダに作られます。
同じフォルダの中に、各種のオブジェクトファイルも作られていることが分かります。アセンブルやコンパイル時にエラーが発生すると、それらのオブジェクトファイルは生成されません。また、DOSプロンプトの表示をさかのぼると、エラー内容が明記されているはずなので、参照してデバッグします。
201−6.生成した実行ファイルmotをSH2のフラッシュROMに書き込む
生成した実行ファイル(事例ではsample.mot)を、AP-SH2F-1AボードのSH2に書き込む手順をご紹介します。詳しくはトラ技2001/6月号や、ボードの取り扱い説明書を参照して下さい。
■1.開発用のパソコンとAP-SH2F-1Aボードを接続する。
接続にはRS232Cシリアルのクロスケーブルを使います。AP-SH2F-1AボードにはDsub9ピン(オス座)のシリアルコネクタが付いているので、それに適合するケーブルを使います。
■2.AP-SH2F-1Aのディップスイッチを書き込み用に設定する。
標準仕様のAP-SH2F-1Aであれば、以下のような設定にします。
![]() |
RAMサイズ:256Kbyte
CPUモード:17 内蔵フラッシュ有効ブートモード クロックモード:入力クロックx4倍モード
フラッシュROMのプロテクトが解除されていて、モニタデバッガの動作状態と連携して自動的にブートが掛かるというモードです。 |
設定が終わったら、ボードに電源を加えてもOKです。DC+5Vの単一電源です。
■3.F-ZTATフラッシュ書き込みソフトの起動
ボードに付属されていたフロッピディスクに、フラッシュROMへの書き込みソフトFW7051.EXEが含まれています。エクスプローラ上からそのファイルをダブルクリックすると、書き込みソフトが起動します。
書き込みソフト上でCPU設定(動作クロック 19.66MHz)と通信ポート設定(パソコン側の環境によってCOMポートを選択)を行います。
■4.書き込みファイルの指定
書き込みソフト上のメニューから、ファイル→開く を実行して、書き込みたいファイル(今回はsample.mot)を選択します。すると、ダウンロードをはじめるという確認メッセージが開くので、「はい」を選んで進めると、プログラムの転送が開始されます。転送状況のログも表示されます。
■2.AP-SH2F-1Aのディップスイッチをプログラム実行用に設定する。
転送が終了したらボードの電源を抜き、ディップスイッチを以下のように設定します。
標準仕様のAP-SH2F-1Aであれば、以下のようになります。
![]() |
RAMサイズ:256Kbyte
CPUモード:2 内蔵フラッシュMCU拡張モード16BIT クロックモード:入力クロックx4倍モード
フラッシュROMのプロテクトが有効となり、ユーザープログラムの実行が可能となります。 |
設定が終わったら、ボードに電源を加えます。するとプログラムの動作が開始されるはずです。
今回のサンプルプログラムsample.motは、パソコンからシリアル通信で送られてきた文字データを、そのまま1文字ずつパソコンに送り返す動作をします。その他にもタイマー割り込みによってIOポートからパルスが出力されたりしますが、そちらは周辺回路を用意しないと確認できません。
ひとまずは、パソコン側で以下の通信設定でハイパーターミナルを立ち上げ、キーボードから打ち込んだ文字がハイパーターミナル上に表示されれば、SH2のプログラムが実行されていることになります。SH2ボードの電源をきると、打ち込んだ文字が表示されなくなるので、動作していることが分かって頂けると思います。
■ハイパーターミナルの通信設定
| ビット/秒 | 38400 |
| データビット | 8 |
| パリティ | なし |
| ストップビット | 1 |
| フロー制御 | なし |
どうですか?ちゃんと動きましたか?
今回は駆け足でSH2のソフトウエア開発環境についてご紹介しました。SH2-7045Fのボードを選べば、トラ技などの特集記事の通りに動かすことができるので安心ですが、今回は敢えてSH2-7051Fを選びました。
SH2でのプログラムの作り方については、追々ご紹介していくことにします。また、強力なモニタデバッガも入手してありますので、その使い方も追ってご紹介します。モニタデバッガを使いこなさないと、SH2を使う意味が半減します。お楽しみに。