H8TRONプロジェクト
株式会社ヴィッツ 開発第3部
μITRON4.0 on H8/300H(H8-3048) プロジェクト報告
参加メンバ : 水野 智仁(チームリーダ )
大西 秀一
森川 聡久
1.はじめに
1.1.μITRONに関して
μITRONは豊橋技術科学大学の高田 広章助教授を中心としてプロジェクトが展開されており、μITRON仕様OSは各種の家電製品に搭載され日本国内ではシェアNo.1である。本コーナーでは、弊社社員が参加したTOPPERS/JSPカーネル勉強会('01/8/13~9/17 豊橋技科大にて実施)の成果を活かし、TOPPERS/JSPカーネルのH8プロセッサへのポーティングを行った成果を報告するものです。JSPとはJust Standard Profileの略であり、μITRON4.0仕様の中で規定されているプロファイルのひとつであるスタンダードプロファイル規定に従って実装されています。スタンダードプロファイル規定では基本機能のみをサポートしています。そのためリアルタイムOSの勉強をはじめるときのひとつの到達目標となります。
1.2.目的
本コーナーの目的は、初心者がターゲットプロセッサへのポーティングを行う場合の計画、設計、実装、ターゲット依存部を理解したカーネル開発技術の習得を目指しています。
~コラム~
TRONとITRON
トロン(TRON: The Real-time Operating system Nucleus)は、理想的なコンピュータアーキテクチャの構築を目的として、1984年に東京大学の坂村健博士によって提案された新しいコンピュータOS仕様であり、産業界と大学の協力のもとで、まったく新しいコンピュータの体系の実現を目指している。トロンプロジェクトの究極のゴールは「どこでもコンピュータ環境」の実現を目指している。そしてその究極のゴールを担うプロジェクトとしてITRONが存在している。ITRONはIndustrial TRONの略であり、主に工業製品に搭載されることを前提としたリアルタイムOSである。μITRONはMicro ITRONの略であり、主にマイコンを利用する家電機器を対象に策定されている組み込みリアルタイムOSである。μITRON仕様は高田広章助教授によってプロジェクトが進められています。坂村健博士と高田広章助教授が師弟関係であることはいうまでもありません。産業の中心部分に大学が存在するという形が組み込みの世界では目に見える結果として成り立っているのです。
参考サイト
ITRON Project Home Page
http://www.ertl.ics.tut.ac.jp/ITRON/
TOPPERS/JSP Kernel
http://www.ertl.jp/TOPPERS/
TRON
http://www.tron.org/
2. H8ボードの組み立て
2.1. 用意する物
2.1.1. AKI-H8/3048F 開発キット (株)秋月電子通商 http://www.akizuki.ne.jp/
主な仕様
・CPU:H8/300H(16MHz)
・ROM:128KBフラッシュメモリ
・RAM:4KB SRAM
・タイマー:16BIT x 5ch、PWM最大5相
・シリアル通信 2ch、同期、非同期切り替え可能、ボーレートジェネレータ内蔵
・ウォッチドックタイマ 1ch、インターバルタイマーとしても使用可
・DMAコントローラ ショートアドレス4ch(最大)、フルアドレス2ch(最大)
・リフレッシュコントローラ 2CAS/2WE方式、インターバルタイマとしても使用可
・A/D変換 10BIT x 8ch
・D/A変換 8BIT x 2ch
・I/O 入出力78本(最大)
・LCD (SC1602B5) 16桁 x 2列
・その他 16MBまでリニアアドレス拡張可
基本クロックをソフトで1/1~1/8まで分周可(ギヤ機能)
周辺モジュールを個々にスタンバイ可
1MHz~16MHz動作可(5V常温では最大20MHz動作可)
5V、3V動作可(3Vは8MHz動作まで)
・大きさ:5cm x 7cm
ポーティングターゲットとして上記AKI-H8/3048F 開発キットを選択した。
AKI-H8で使われている日立H8/300Hシリーズ、H8/3048FCPUは、大容量のフラッシュ(128kbyte)を始め、シリアル入出力やAD/DAコンバータ等の各種周辺機能を1チップに集積しています。しかし、CPUに内蔵されているROMは書き込み回数が100回までなのでプログラムを何度も書き直すことができません。そこで、今回は内蔵ROMをエミュレートするためにRAMを増設しRAM上でプログラム開発を行い、完成したプログラムをROMに書き込むという手順に基づくプログラミング環境を構築することにしました。
2.1.2. 部品
・上記開発キットのほかに以下の増設部品を用意しました。
・台座用ゴム(シール付き)
・ジュフロン線(4色 黒、黄、赤、青)
・配線パターンシール
・128 kb SRAM(HM628128DPL-5)
・電源用コネクタ
・RAM増設用ボード
・RAMソケット(32PIN)
2.1.3. 工具
・今回製作するに当たり、以下の工具を使用しました。
・はんだ(有鉛はんだ)
・はんだごて
・はんだ吸い取り機
・ニッパー:銅線のカット
・アロンアルファ:銅線のシール?を貼り付ける為。
・ホットボンド
~コラム~
はんだとはんだごての選択
昨今はんだに含まれる鉛成分が生活環境に影響をあたえるということで、家電製品では鉛無しの無鉛はんだが使用されるようになってきています。AKI-H8マイコン開発セットにははんだも含まれていますが、無鉛はんだでした。当初は無鉛はんだをそのまま利用して作業を進めていましたが、動作チェックの際に動作しませんでした。原因ははんだ付け不良による伝導不良でした。無鉛はんだを利用したことにより融点が上がり、実際にははんだが流れこんでいない部分があったのです。はんだごての達人ならば接触不良ということにはならないでしょうが、初心者がはんだ付けをする場合は有鉛はんだを使用したほうが間違いが少ないと思われます。またはんだごてもなるべく出力が高いものを利用したほうがよいでしょう。しかし、出力が高いと今度は電子部品をいためてしまう恐れがあるので注意してください。
2.2.スペック
・製作したマシンスペックです。
・CPUボード
・LCD1個
・ボタン4個
・LED3個
・メモリ128MB
・SRAM+SRAMボード
2.3.設計回路図
(クリックすると拡大図が表示されます)
2.4. モニタの導入
H8のモニタを作成したマイコンボードのメモリに対応させます。今回は128KByteのメモリを増設しましたのでH8/300Hはモード5での動作になります。モニタのソースセットは下記URLよりダウンロードしてください。
モード5の説明
ポート1、2、5 の機能がアドレス端子A19~A0となり、最大1M バイトのアドレス空間をアクセスできます。リセット直後は入力ポートになっています。したがってアドレスバスとして使用する場合は各々の対応するデータディレクションレジスタ(P1DDR、P2DDR、P5DDR)を1 にセットして、ポート1、2、5 を出力に設定してください。バスモードはリセット直後に、8 ビットバスモードとなり、すべてのエリアは8 ビットアクセス空間となります。ただし、ABWCR により、少なくとも1つのエリアを16 ビットアクセス空間に設定した場合には、16 ビットバスモードとなります。
モニタの変更
モニタのソースの中のMONITOR.SRCの_INITIALIZE:以下をこのように記述します。
; RAM用初期化
MOV.B #H'FF, R0L
MOV.B R0L, @ABWCR:8 ; CS1領域バス幅8ビット(P4:D0-D7)
MOV.B #H'FD, R0L
MOV.B R0L, @ASTCR:8 ; CS1領域2ステートアクセス
MOV.B #H'FF, R0L
MOV.B R0L, @P1_DDR ; P1をアドレスバス(A0-A7)
MOV.B R0L, @P2_DDR ; P2をアドレスバス(A8-A15)
MOV.B R0L, @P5_DDR ; P5をアドレスバス(A16-A19)
MOV.B #H'08, R0L
MOV.B R0L, @P8_DDR ; P8-3 CS1出力
JMP @ER5 ; Goto Monitor Program
以上で増設RAMが使用できるようになります。
その後はモニタのソースセット付属のReadmeに従い、アセンブル、リンク、コンバートをしてモニタのバイナリを作成してください。
出来上がったモニタをH8/300Hに書き込む場合はAKI-H8マイコン開発キットに含まれるフラッシュユーティリティで書きこみます。
2.5. 通信環境の構築
通信させるためにはRS-232Cのケーブルと、シリアル通信に対応したターミナルソフトが必要です。RS-232Cのケーブルは(PC側)メスD-SUB9PIN ⇔ オスS-SUB25PIN(H8側)の昔のモデム接続に使用したシリアルのストレートを使用します。名古屋大須価格で大体1000円前後です。
ターミナルソフトはTeraTermを使用しました。高機能のターミナル通信ソフトです。TELNET接続で利用された方も多いはずです。モニタとの通信ではCOMポートを使用しますので、もしCOMポートが無いPCを使用している場合はUSBでCOMポートを増設する周辺機器が出ていますので試してみてください。
まずケーブルを接続します。次にTeraTermを起動します。TeraTermの設定で、通信速度は19200Bps、エラー制御はXon/Xoffに設定してください。それ以外の値だと通信時にエラーが出ます。設定をしたあとに現在の設定を保存して起きましょう。次回起動時も有効になるはずです。最後にH8のボードを電源をいれます。設定が間違っていなければ次のような案内表示が出たと思います。
H8/3048 Series Advanced Mode Monitor Ver. 2.2A
Copyright (C) Hitachi, Ltd. 1995
Copyright (C) Hitachi Microcomputer System, Ltd. 1995
モニタとの通信が取れたらコマンドを試します。以下に使用するコマンドを挙げます。
G : プログラムの実行
: G [〈addr〉]
addrで指定したアドレスよりプログラムを実行します。
addrを省略すると、現在のPCより実行します。
B : ブレイクポイント
ブレイクポイントは最大8個まで設定できます。
設定・・・ブレイクポイントの設定
: B 〈addr〉
addrで指定したアドレスにブレイクポイントを設定します。
解除・・・ブレイクポイントの解除
: B - [〈addr〉]
addrで指定したアドレスのブレイクポイントを解除します。
addrを省略すると、これまでに設定した全てのブレイクポイントを解除します。
表示・・・これまでに設定したブレイクポイントの表示
: B
S : シングルステップ実行
: S [〈step_num〉]
step_numで指定したステップ数だけ実行します。
step_numには0(無限を意味する)~99が指定可能です。
step_numを省略すると1ステップずつ実行します。
D : メモリダンプ
: D 〈s_addr〉 [〈e_addr〉] [; 〈size〉]
s_addrにはダンプ開始アドレスを指定します。
e_addrにはダンプ終了アドレスを指定します。
e_addrを省略するとs_addrから256バイト分ダンプします。
「;」以降はオプションです。sizeにはダンプするサイズを指定します。オプションを省略すると
ダンプサイズは1バイトとなります。
sizeのパラメータは以下の通りです。
B・・・1バイト
W・・・2バイト
L・・・4バイト
M : メモリデータの変更
: M 〈addr〉 [; 〈size〉]
addrには変更するメモリのアドレスを指定します。
addrで指定したアドレス以降のメモリを対話式に変更します。対話入力時に「.」と入力すると
対話入力を終了します。
sizeには変更対象のサイズを指定します。オプションを省略すると1バイトとなります。
パラメータは上記メモリダンプと同じです。
F : メモリへのデータ書込み
: F 〈s_addr〉 〈e_addr〉 〈data〉
s_addrには書込み開始アドレスを指定します。
e_addrには書込み終了アドレスを指定します。
dataにはメモリに書込むデータを1バイトで指定します。
L : プログラムロード
: L
ロード待ち状態にします。
ロード待ち状態のときにホスト側通信ソフトからファイルを送信するとメモリにプログラムが
ロードされます。本研修では、「ファイル」の「ファイル送信」メニューにてファイルを
選択・送信します。
DA : 逆アセンブル
: DA 〈s_addr〉 [〈e_addr〉]
s_addrには逆アセンブル開始アドレスを指定します。
e_addrには逆アセンブル終了アドレスを指定します。
e_addrを省略するとs_addrから16命令分逆アセンブルします。
R : レジスタ内容表示
: R
レジスタ内容一覧を表示します。
. :レジスタ内容変更
: . 〈reg_name〉 [〈data〉]
reg_nameには変更するレジスタの名前を指定します。
dataには変更する値を指定します。
dataを省略するとreg_nameで指定したレジスタ以降の値を対話式に指定出来ます。
対話入力時に「.」と入力すると対話入力を終了します。
H8 : 内蔵周辺機能状態表示
: H8 〈name〉
nameには表示したい周辺機能を指定します。周辺機能のシンボルは以下の通りです。
なお、周辺機能の詳細についてはサーバーの
「Project2\アプリ開発\H8\Documents\H8_manuals\ハードウェアマニュアル」を参照してください。
DMAC0・・・ダイレクトメモリアクセスコントローラー0
DMAC1・・・ダイレクトメモリアクセスコントローラー1
ITU・・・・・ビットインテグレーテッドタイマユニット(共通)
ITU0・・・・ビットインテグレーテッドタイマユニット(0)
ITU1・・・・ビットインテグレーテッドタイマユニット(1)
ITU2・・・・ビットインテグレーテッドタイマユニット(2)
ITU3・・・・ビットインテグレーテッドタイマユニット(3)
ITU4・・・・ビットインテグレーテッドタイマユニット(4)
TPC・・・・・プログラマブルタイミングパターンコントローラ
WDT・・・・ウォッチドックタイマ
SCI0・・・・シリアルコミュニケーションインタフェース0
SCI1・・・・シリアルコミュニケーションインタフェース1
I/O・・・・・インプット/アウトプットポート
D/A・・・・・D/Aコンバータ
A/D・・・・・A/Dコンバータ
INTC・・・・外部割込みコントローラ
BSC・・・・・バスコントローラなど
? :ヘルプ
: [〈command〉] ?
commandにはヘルプ表示したいデバックコマンドを指定します。
commandを省略するとデバックコマンド一覧が表示されます。
コマンド履歴
: [〈command〉] .
commandには履歴を見たいデバックコマンドを指定します。
commandには「D」・「M」・「F」・「DA」・「H8」のみ指定できます。
~コラム~
AKI-H8開発キットに関して
AKI-H8開発キットは7800円とかなり手ごろな価格で入手できることができる優れたキットだと思います。開発キットの中にはスイッチ、LEDはもちろん、LCD、電源キットも付属しています。これ一台で十分に勉強ができることと思います。また付属のマニュアルも丁寧に書かれており、ボリュームもかなりあります。ただし、慌てて作成する必要はありません。部品点数もかなり多いのでゆっくり作成しましょう(私たちは急ぎすぎて何度もはんだ吸い取り機のお世話になりました)。そして完成した暁には必ず動作チェックをしましょう。自分では必要がない機能であっても(DMA転送など)動作確認はきちんとしておきましょう。素性のよいソフトにするためにはまずハードウエアに問題を残さないようにすることが必要です。(私たちはLEDの出力にポートBを使用しましたがbit3が動作不良を起こしていました・・・5ヶ月後に気付くはめになるとは)
参考サイト
(株)秋月電子通商
http://www.akizuki.ne.jp/
モニタのダウンロード
http://www.hitachisemiconductor.com/sic/jsp/japan/jpn/Sicd/Japanese/Seminar/top.htm
モニタの解説(改造)
http://www.ertl.ics.tut.ac.jp/~muranaka/h8/
導入解説
http://www.cqpub.co.jp/toragi/DLF/TR9809M.htm
HM628128DPL-5仕様書
(日立セミコンダクター、2002年4月30日現在 HM628128DPL-5の仕様書は登録されていません)
http://semiconductor.hitachi.com/index.html
3.cygwinを用いたクロスコンパイル環境の構築
C言語を用いた開発環境を構築するためにCYGWIN+GCCの開発環境を構築する。
3.1.準備
CYGWINはあらかじめインストールしておきます。インストールの手順は下記の参考サイトでご参照ください。
以下のソースファイルを用意する。
アセンブラ・リンカ
binutils-2.10.tar.gz
http://www.gnu.org/
http://sources.redhat.com/binutils/
ftp://ftp.ring.gr.jp/pub/GNU/binutils
Cコンパイラ
gcc-2.95.2.tar.gz
http://gcc.gnu.org/
ftp://ftp.ring.gr.jp/pub/GNU/gcc
標準Cライブラリ
newlib-1.8.2.tar.gz
http://sources.redhad.com/newlib/
GNUデバッガ
gdb-5.0.tar.gz
http://sources.redhat.com/gdb/download/
作業用ディレクトリを作成
# mkdir /usr/local/src
binutils-2.10.tar.gz, gcc-2.95.2.tar.gz, newlib-1.8.2.tar.gz を /usr/local/src に移動。
3.2.binutilsの作成
ソースを解凍
# cd /usr/local/src
# tar xzvf binutils-2.10.tar.gz
作業用ディレクトリ作成
# mkdir binutils-2.10/work
# cd binutils-2.10/work
コンフィグレーション
# ./configure --target=h8300-hms-coff --prefix=/usr/local/h8
コンパイル・インストール
# make
# make install
ここでインストールされたツールを実行できるようにするためにパスを通す。
# PATH=$PATH:/usr/local/h8/bin
3.3.gcc の作成
newlibのヘッダーファイルを使用するので解凍する
# cd /usr/local/src
# tar xzvf newlib-1.8.2.tar.gz
gcc をコンパイル
# tar xzvf gcc-2.95.2.tar.gz
# mkdir gcc-2.95.2/work
# cd gcc-2.95.2/work
# ../configure --target=h8300-hms-coff --prefix=/usr/local/h8 --with-newlib --wi
th-headers=/usr/local/src/newlib-1.8.2/newlib/libc/include
# make LANGUAGES="c"
# make install LANGUAGES="c"
3.4. newlib の作成
# cd /usr/local/src/newlib-1.8.2
# mkdir work
# cd work
# ../configure --target=h8300-hms-coff --prefix=/usr/local/h8
# make
# make install
以上で以下のH8プロセッサ用のツールが使用できるようになる
h8300-hms-coff-as アセンブラ
h8300-hms-coff-ld リンカ
h8300-hms-coff-gcc Cコンパイラ
h8300-hms-coff-objcopy オブジェクトファイル変換ツール
h8300-hms-coff-objdump 逆アセンブラ
h8300-hms-coff-nm シンボル名表示
h8300-hms-coff-size プログラムサイズ表示
短い名前で使用できるようにシンボリックリンクを張る
# cd /usr/local/bin
# ln -s /usr/local/h8/bin/h8300-hms-coff-as h8-as
# ln -s /usr/local/h8/bin/h8300-hms-coff-ld h8-ld
# ln -s /usr/local/h8/bin/h8300-hms-coff-gcc h8-gcc
# ln -s /usr/local/h8/bin/h8300-hms-coff-objcopy h8-objcopy
# ln -s /usr/local/h8/bin/h8300-hms-coff-objdump h8-objdump
# ln -s /usr/local/h8/bin/h8300-hms-coff-nm h8-nm
# ln -s /usr/local/h8/bin/h8300-hms-coff-size h8-size
これで各ツールが h8-xxxx で使用できる。
インストール後は /usr/local/src 以下は消しても良い。
3.5. gdbの作成
導入したGDBはVersion 5.0(20010428-1)です。
gdb-5.0.tar.gzをダウンロードしてください。
GDBを使用できるようにするには、GDBのソースコードにH8モニタに対応させるための
パッチを当てる必要があります。
パッチファイルは次の2つ必要です。
h8300-hms-gdb-5.0-4.src.rpm
h8300-hms-gdb-5.0-HITACHI_MON-1.tar.gz
こちらからダウンロードしてください。
http://sourceforge.net/project/showfiles.php?group_id=24580
http://homepage2.nifty.com/t_yasui/micro_mouse/h8/GCC-Cross3.html
ダウンロードをしたファイルを展開します。
gdbにパッチを当てます。
cd gdb-5.0
patch -p1 〈 [somewhere]/h8300-hms-gdb-5.0-4.patch
cd gdb
patch -p0 〈 [somewhere]/h8300-hms-gdb-5.0-HITACHI_MON-1/monitor.c.diff
patch -p0 〈 [somewhere]/h8300-hms-gdb-5.0-HITACHI_MON-1/remote-hms.c.diff
./configure --target=h8300-hms --prefix=/usr/local/cross_h8
make
make install
3.6. 動作確認
次のサンプルをダウンロードして、ここまでの確認を行います。
サンプルのダウンロード
3.6.1. クロスコンパイル環境の確認
実際にコンパイルしてみますが、その前にcygwinへのパスを通しておきましょう。cygwinのコマンドはbash上でも、コマンドプロンプト上でも実行できます。ここではコマンドプロンプト上で行ってみましょう。
コマンドプロンプト起動
C:\cygwin にインストールした場合は、次のようにします。path c:\cygwin\bin;c:\cygwin\usr\local\cross_h8\bin
また、サンプルのMakefileも修正します。
CMD_DIR = c:/cygwin/usr/local/cross_h8/bin
にしてください。
今回モニタを使いますので、
ON_ROM_MONITOR = T
のままにしておいてください。
サンプルを展開したディレクトリに移動し、Makeします。
cd [somewhere]
make cleanall
make
正常にMakeが完了しましたか?Makeできなかった場合は、パスの確認や、もう一度クロスコンパイル環境の構築手順を見直してみましょう。正常にMakeできた場合は、motファイルが生成されていますね。これでクロスコンパイル環境の構築は完了です。
3.6.2. H8ボードの確認
次にH8ボード上でサンプルを動かしてみましょう。TeraTermにはファイル転送機能があります。モニタのLコマンドを実行し、motファイルを転送します。
転送が完了したら、Gコマンドを実行します。正常に動きましたか?
LCDに文字が表示されない、ボタンを押しても無反応、LEDが点灯しない、などは接線がおかしい可能性があります。もう一度2章の設計図と同じか見直してみましょう。
どうしても原因がわからない場合は、デバッグしましょう。H8モニタデバッガとgdbを使うことができます。gdbについては5章を参照してください。
設計図と異なる実装をされた方は、サンプルのソースコードのポートの設定を変更しましょう。ライブラリの使い方はヘッダファイルを参照してください。
3.6.3. ROM焼きの確認
次にH8のROMにサンプルを書き込んでみましょう。
サンプルのMakefileを次のように修正し、Makeし直してください。
ON_ROM_MONITOR = F
生成されたMOTファイルをフラッシュユーティリティで書きこみます。
書き込み完了後、電源を入れたら動きましたか?これでいつでも遊べますね。
デバッグする場合は、再度H8モニタを書き込み直さなければなりませんので注意しましょう。ROMの書き込み限度は100回です。
参考サイト
・CYGWIN
http://sources.redhat.com/cygwin/
・binutils
http://sources.redhat.com/binutils/
・gcc
http://gcc.gnu.org/index.html
・newlib
http://sources.redhat.com/newlib/
・gdb
http://sources.redhat.com/gdb/download/
・GNU による AKI-H8 のプログラム開発
http://www.tt.rim.or.jp/~hoso/H8/
・Programming the H8300 using the C programming language http://www.horsens.ih.dk/textpage/text_DAT/tex_IT_retning/Stephan/LRLF2002/html/h8300h.html
4. ライブラリ開発
4.1. 目的
H8のハードウェアについての知識が無くても、気軽にC言語でH8アプリケーションを開発できるよう、以下のライブラリの開発をしました。
ライブラリのソースコードと使用法は、上記サンプルのlibディレクトリにあります。
ライブラリの組み込み方もサンプルを参照してください。
4.2. LEDライブラリ
・指定したLEDの点灯/消去機能
・マルチポート対応
4.3. ボタンライブラリ
・指定したボタンによるIRQ割り込み通知機能
・ボタンの押下状態の提供
・マルチポート対応
・マルチIRQ対応
4.4. LCDライブラリ
・LCD (SC1602B5)の各種機能の提供
・マルチポート対応
4.5. 時計ライブラリ
・タイマ管理機能
・アラーム管理機能
・WAIT機能
・ITUマルチチャンネル対応
4.6. シリアルライブラリ
・シリアル入出力機能
・シリアル割り込み通知機能
・SCIマルチチャンネル対応
5. OSの導入
5.1. 用意する物
・TOPPERS/JSPカーネル
豊橋技術科学大学高田研究室にて開発中のTOPPERS/JSPカーネルをH8に対応させる。
TOPPERS/JSPカーネルはμITRON4.0仕様に準拠したリアルタイムカーネルであり、フリーで提供されている。
ターゲット独立部と依存部を明確に分離した設計になっており、他のターゲットプロセッサへのポーティングが容易な構造になっている。
今回ポーティングしたRelease 1.1.1は、こちらからダウンロードできる。
http://www.ertl.ics.tut.ac.jp/TOPPERS/JSP/jsp-1.1.1.tar.gz
・H8ドキュメント
H8に関する各種ドキュメントは日立のホームページよりダウンロードできる。
http://www.hitachisemiconductor.com/sic/servlet/request?
SCREEN_ID=ViewUsrParametricSearched&LINE_PATTERN_NAME=HD6433048&LANGUAGE_CD=JP&LAYER_ID=9
これらの中で特に次の「ハードウェアマニュアル」は熟読する必要がある。
http://www.hitachisemiconductor.com/sic/resource/japan/jpn/pdf/mpumcu/j602093_h83048.pdf
5.2. OSポーティング
TOPPERS/JSPカーネルをH8へ対応させる作業を行う。
ターゲット依存部(jsp/config以下)にH8用のソースコードを追加するのみの修正である。
アセンブラでのコーディングは必須のため、H8のアセンブラについて学習しておく必要がある。
5.3. 設計
今回SH3のソースコードを参考にして、必要な箇所をH8用に修正する方針とした。
必要な箇所とは、SH3とH8のハードウェアの違いに関する箇所であり、レジスタの違い、アセンブラの違いなど数多くある。これら全てを載せることはできないため、本節ではSH3と設計方針の違う点について挙げることとした。
詳しくはH8のハードウェアマニュアルを参照しながら見ていただきたい。
5.3.1. 割込み優先度
SH3では、SRの4-7bit目に割込みマスクがあり、16段階のマスクが可能である。
H8ではCCRは存在しないため、IPRというレジスタにて管理する。
IPRは割込みコントローラによって管理される。
IPRのビットをONをすることで、プライオリティレベル1の割込みを優先することができる。
今回、CCRのIビットを1、UIビットを0、SYSCRのUEビットを0と予め設定する
ことで、プライオリティレベル1の割込みのみ割込みを許可することにした。
割込みを禁止するには、IPRでマスクする必要がある。
IPRにはIPRA,IPRBの2つがあり、全部で16段階(16ビット分)の優先度がある。
そのため、16段階の割込み優先度を設けた実装とした。
chg_ipm()に指定した優先度でマスク可能とする。
5.3.2. 例外処理
SH3では、即座に実行される優先度のない割込みを「例外処理」として実装されていた。CPUアドレスエラーなどがこれにあたる。
H8ではこのような機構は存在しないため、例外処理は割り込み処理と同等の扱いとする。
5.3.3. 割込みネスト回数
TOPPERS/JSPでは、割込みネスト回数を管理し、ネスト回数が1以上の時割り込まれている状態、すなわち非タスクコンテキストでの動作と判断する。
SH3もこのように実装されており、H8でもこの方針を引き継ぐ。
ただし、SH3ではr7_bankにて管理していたが、H8はバンクレジスタを持たないため、グローバル変数(int_nest)にて管理することとした。
5.3.4. シリアル入出力
SH3版はGDBスタブが実装されており、スタブによるシリアル出力が可能である。
H8では現段階ではGDBスタブを実装していないため、スタブによる出力はサポートしていない。
H8では、GDBによるデバッグは可能であるが、シリアル出力はモニタデバッガ使用時のみサポートとなる。
5.3.5. キャッシュ
H8ではキャッシュが存在しないため、キャッシュモードの設定などは行わない。
5.4. 開発物
Release 1.1.1に対応した弊社ポーティング済みソースはこちらからダウンロードしてください。
H8/3048F対応ソース
確認サンプル
ダウンロードしたファイルを展開して、それぞれ
jsp/config/h8300
jsp/slot_h8
においてください。
5.5.TOPPERS/JSPカーネルRelease.1.3との比較
2002年5月現在、TOPPERS/JSPカーネルはRelease.1.3が公開されている。これは既にH8/3048Fに対応されている。そこで、私たちが開発したものとどのように実装が異なるかを比較・検証してみた。
Release.1.3はこちらからダウンロードできる。
http://www.ertl.jp/TOPPERS/JSP/jsp-1.3.tar.gz
5.5.1. vectorテーブル
+JSP版
vectorテーブルに対して直書きしている。また、リリース版では、該当しない割込みが入った場合、cpu_experr()をコールしている。cpu_experr()ではsyslogメッセージを出して、無限ループで止まる。
+ヴィッツ版
vectorテーブルに対して直書きしてるのは同じ。
コメント:
ROM焼きしたらデバッグできなくなるため、異常な箇所では シリアルログを出力するなどの仕込みがある方が良いと考える。
5.5.2. _hardware_init_hook
+JSP版
割り込み処理の初期化と、外部RAMの初期化が行われている。
+ヴィッツ版
使用していない。割り込み処理の初期化はcpu_initialize()にて、外部RAMの初期化スタートアップルーチンに直書きした。
コメント:
割込みの初期設定は設計依存であるため、cpu_initialize()でも良いと考える。その方が、初期化完了する前に割り込みが入ることもなく安全である。外部RAMについては、素直に_hardware_init_hookを用いるべきだと思う。
5.5.3. exc_sense_lock()
+JSP版
return(*((UW *)p_excinf) & (H8INT_MASK_ALL << 24));
+ヴィッツ版
return(current_ipr() == intmask_table[MIN_IPM]);
コメント:
H8には例外処理は無いため、sense_lock()と同一処理でよいかと考えた。また、p_excinfに何が入ってくるのかわからないため、対応不十分かも知れない。
5.5.4. 割込み制御
+JSP版
CCRのUIビットのON/OFFのみの制御。
+ヴィッツ版
CCRの制御。
コメント:
グループ毎の割込み許可も有効にしている。より複雑な割込み制御ができる。
5.5.5. CPU例外処理
+JSP版
割込み処理と同等にマクロ定義(define)してある。
+ヴィッツ版
H8ではCPU例外処理はありえないので、省略した。
コメント:
CPU例外が存在するプロセッサからの移植時を考慮すると、JSP版のように割込み処理と同一の処理にしておく方が望ましい。
5.5.6. _interrupt, _interrupt_from_intサブルーチン
+JSP版
INTHDR_ENTRYマクロで、使用する割込みハンドラ分生成している。
+ヴィッツ版
最低限の処理については全要因分用意して、共用できる箇所は共通サブルーチンにしている。
コメント:
JSP版では多くの割込み要因を有効にした場合、コード量が多くなってしまう。使用しない要因については割込みハンドラ自体用意しない方がよいのかもしれないが、 汎用的なOSにするため全て用意している。要因毎の割込みルーチンのコードは、マクロを用いた方がミスが無く良いと考えられる。
5.5.7. シルアル
初期化
+JSP版
技科大版ではマルチチャンネルに対応している。(HWPORTの引数が有効)またレジスタ設定にはマクロ関数を利用している。
outb(base + H8SCR, inb(base + H8SCR) & ~(H8SCR_TE | H8SCR_RE));
+ヴィッツ版
AKI-H8マザボードがSCI1しか結線されていないのでSCI1しか使用できないようになっている。
コメント:
SH3に合わせるため割り切りました。レジスタ設定にはレジスタ指定マクロを利用している。
SCI1_SCR = 0x00;/*SCRのクリア、TEビット、REビットを0クリア*/
割込み
+JSP版
エラー発生時にはSCIが再度復帰するようになっている。
+ヴィッツ版
エラー発生時にはエラーをクリアするだけの処理にしている。
5.5.8. タイマ
タイマの初期化
+JSP版
マクロ指定で使用するITUを変更できるようになっている。
+ヴィッツ版
ITU0固定である。
コメント:
SH3に合わせて割り切りました。
タイマの終了
+JSP版
インラインアセンブラ利用によるビットクリアが入っている。
+ヴィッツ版
レジスタ設定マクロを利用して、ビットクリアしている。
参考文献
・H8ビギナーズガイド
白土義男 著 東京電気大学出版局 \2,800
ISBN 4-501-32160-1
参考サイト
・TOPPERS
http://www.ertl.ics.tut.ac.jp/TOPPERS/
・GNU による AKI-H8 のプログラム開発
http://www.tt.rim.or.jp/~hoso/H8/
・GNU開発環境構築マニュアル(H8用)
http://www.tron-net.gr.jp/~h1suzuki/toppers/lxr/source/doc/gnu_install.txt?a=h8
・GCCコマンド・オプション
http://www.asahi-net.or.jp/~wg5k-ickw/html/online/gcc-2.95.2/gcc_2.html
・日本語マニュアルだよGDBVer 4.12
http://www.i.h.kyoto-u.ac.jp/~shom/gdb_jman/gdb_jman.txt
6. おまけ
弊社では以下のような拡張AKI-H8マイコンボードの作成例がある。
試験機
H8 on μITRONを作成するにあたって使用したボードです。素人が作成したものなのであまりきれいにはできていません。一応メモリのボードは取り外しができる用に設計はしましたがサブI/Oボードの作成までできませんでした。
標準機
新人研修用に作成されたマシンです。多機能I/Oボードと、RAMを増設することで、アセンブラ、C言語、を利用して、タイマ、割り込み、シリアル、I/Oポートなど一通りの学習ができます。
量産機
ヴィッツブランドのAKI-H8改造ボードです。拡張I/Oボードにスピカ、センサなどと加えています。最終的にはモーター制御を利用した簡単なロボットの基盤となる予定です。



