H8S用ミニカーネルと簡易モニタ
sorry. japanese only.
このページは全然作り中です。
ワンチップマイクロコントローラーH8S用のミニカーネルを作成しましたので
ご紹介いたします。ターゲットMCUは,H8S2144と2128です。
GCC(cygwin環境)でのアセンブラとC言語を使用して作成しました。
ターゲットのハード構成例は以下の通りです。
H8Sミニカーネルのターゲット概略構成図
H8Sミニカーネルのターゲット回路図
H8Sミニカーネルの機能概要
(1) 仮想例外ベクタ機能
H8Sは例外ベクタテーブルが先頭アドレス0x000000固定であるため,内蔵ROMを使用する場合には,
例外ベクタを固定化する必要があります。
ミニカーネルでは,この例外ベクタを全て定義して,そこに 処理がわたると,指定されたアド
レスにある仮想ベクタテーブルのアドレスへと変換して,そちらのアドレスへ処理を引き渡す,
仮想ベクタ機能を実装してあります。
DTCを持つH8S2128の場合には,DTCベクタを適当に定義してあります。
(2) I/Oポート,外部バス設定/初期化
SRAMを外部に接続してRAM上にアプリケーションをロードして実行できるように,あらかじめ外部
バスを使用可能なように初期化を行います。
(3) 計時機能
WDT1とNMIを使用して,時刻の計時を行います。時刻換算処理とあわせることで,アプリケーショ
ンで時刻の利用が簡素化できます。
(4) SCI入出力サポート
SCIを使用して調歩同期式で通信を行う場合に,リングバッファと割り込みを使用したバッファリ
ング機能をカーネルの機能として実装してあります。
(5) CLCD出力サポート
CLCDの初期化や表示を行う処理を実装してあります。
(6) LED/ボタンスイッチ入出力サポート
押しボタンスイッチにスイッチ入力やLED出力処理を実装してあります。
アプリケーション側で,一定の周期で入出力ルーチンをコールすれば,ボタンの押下状態やその
変化を読み取ることが出来ます。
(7) 各種演算ルーチン
時刻換算やCRC計算,乗除算や浮動小数点変換など,いくつかの処理サポートルーチンを実装して
あります。
(8) 簡易モニタ(メモリ表示,Sレコードの読み込み,アプリ起動など)
SCIをコンソールとして簡易モニタにより,ユーザアプリケーションのロードや実行などが行えま
す。また起動時のIRQ0-2の状態により,既にロードしてあるアプリケーションを起動することも
出来ます。
制限事項
(1) NMIはカーネルで占有します。
(2) 計時機能を使用する場合にはWDT1を使用します。
(3) 内蔵RAMの一部(0xffff00-7f=128バイトの領域)はカーネルで占有します。
ミニカーネルと簡易モニタのビルド
必要に応じてMakefileを修正してmakeすればokです。bin/ディレクトリの下にS-record形式の*.mot
ファイルが出来るので,内蔵ROMに焼いてください。
大体0x000000-0x0005ffが各種ベクタ,続く0x000600-0x004fffがカーネルのサービスルーチン群,
0x005a00-0x006fffが仮想例外ベクタ処理を含む例外処理ルーチン群になります。
ミニカーネルと簡易モニタのソースアーカイブ
カーネルソースを整理中...
ソースツリー概略
inc/*.inc,inc/*.h,src/*.S,src/*.cをコンパイルまたはアセンブルし,オブジェクトをobj/*.oに
格納する。リンクした実行形式はbin/*.elfに格納される。
ソースツリー
+ Makefile
+ extROMmap.awk ツール
+ h8300s-2128-kernel.xc
+ H8S_kernel_2128.xc 開発/app用カーネルシンボル(リンカスクリプト用)
+ H8S_kernel_2128.ext 開発/app用カーネルシンボル(Cインクルードファイル用)
+ h8wrt.py
+ 2144_F29M5_P115k2.mot
+ doc/
+ bin/
+ obj/
+ inc/
+ 2128s.h
+ 2144s.h
+ basicIO.h
+ BTNLED.h
+ CLCD.h
+ crcutl.h
+ H8S_common0.h
+ printf.h
+ sci0.h
+ sci1.h
+ timeutl.h
+ 2128s.inc
+ 2144s.inc
+ H8S_common0.inc
+ intvect_handlers.inc
+ intvect_sysvect.inc
+ SYS_default.inc
+ src/
+ motdump.awk ツール
+ 10main.c
+ Cmonitor.c
+ crcutl.c
+ printf.c
+ sci0.c
+ sci1.c
+ 00start_exceptions.S
+ 01sysdata.S
+ 02memutil.S
+ 02syscalls.S
+ 02systime.S
+ 03ext_mon.S
+ 09crt0.S
+ BTNLED.S
+ CLCD.S
+ float.S
+ GPScontext.S
+ muldiv.S
+ timeutl.S
簡易モニタのコマンド
l [offset] load program(S-rec)
g [<vector address> go user program
d [<address> [<length>=0x100]] dump byte
e <address> <data> enter byte
w <address> <data> write byte
fb [<address> [<length>=0x100 [<data>=0x00]]] fill
mv <dst-address> <src-address> <length> copy/move
cs [<address> [<length>] ] check sum
cmp <address1> <address2> [<length>] compare memory
内蔵RAMの使用内訳
領域自体は01sysdata.Sで定義しています。
初期値は00start_exceptions.Sで定義しています。
内容的には以下のような感じです。
0xffff00-0xffff1fがカーネル初期化用のスタック領域などに使います。
0xffff20(LONG)はカーネルのバージョンが格納されます。
0xffff24(LONG)はリザーブ領域です。
0xffff28(LONG)はatexitシステムコールで設定される,exit時のコールバックアドレスです。
初期値は0xffffffffです。奇数の値にすると無効と見做します
0xffff2c(LONG)はbrk,sbrkシステムコールで設定される,ブレークポイント(heap領域の末尾)
です。 初期値は0x00000000です。最初にbrkシステムコールで設定しましょう。
0xffff30(LONG)はデバッグ用のメモリダンプの開始アドレスです。CLCDが使用できる状態だと
このアドレスで指定した領域16バイト分のメモリ領域を16進数で,CLCDに繰り返しダンプ
します。先頭のBYTEは内部で制御カウンタに使用しますので,有効なのは24ビットだけです。
初期値は0xffffffffです。
0xffff34(LONG)はリザーブ領域です。
0xffff38(LONG)はIOポートP4,P5,P6,P9用のDDRの値を順に格納してあります。特にP6はCLCDと
ボタンLED入出力で制御に使用されるため,CLCDやボタンLED入出力を使用する場合には,
適切な値を設定してください。
0xffff3c(LONG)は,ボタンSW,LEDの状態および,CLCDとのバス使用の排他制御で使用されます。
先頭からバイト順に,前回のボタンSW状態の記憶用,最近のボタンSW状態,LEDの点灯制御
末尾の1バイトが排他制御用のセマッフォです。
0xffff40-0xffff4fは,カーネルのSCI受信バッファ制御用の領域や受信エラーの格納領域です。
カーネル起動時には4バイトのリングバッファでバッファリングします。
0xffff50-0xffff5fは,カーネルのSCI送信バッファ制御用の領域や送信完了フラグの格納領域です。
カーネル起動時には4バイトのリングバッファでバッファリングします。
0xffff60(LONG)は,計時処理で使用される秒単位のカウンタです。
0xffff64(LONG)は,計時処理で使用される秒未満単位のカウンタです。(1/2**32秒単位です)
0xffff68(LONG)は,計時処理で使用される秒未満のカウンタの増分値です。
0xffff6c(LONG)は,計時処理で使用される秒未満単位のカウンタの桁あふれ時に補正される値です。
0xffff70(WORD)は,0でない場合にNMI毎にデクリメントされる16ビットダウンカウンタです。
0xffff72(BYTE)は,0でない場合にNMI毎にデクリメントされる8ビットダウンカウンタ0です。
0xffff73(BYTE)は,0でない場合にNMI毎にデクリメントされる8ビットダウンカウンタ1です。
0xffff74(LONG)は,NMI毎にインクリメントされるカウンタです。
0xffff78(LONG)は,NMIでフックする処理のアドレスです。
0xffff7c(LONG)は,仮想例外ベクタテーブルの先頭アドレスを格納します。
処理ルーチンなどの定義
カーネルの各処理ルーチンのアドレスなどは,make時にH8S_kernel_xxxx.extやH8S_kernel_xxxx.xc
(xxxxはMPUモデル名)のファイルに外部シンボルテーブルとして出力されます。
ユーザアプリケーションでは,これらをコンパイル時にincludeしたり,リンカスクリプトでinclude
することで,カーネルのシンボルを利用できます。
ユーザアプリケーションを作成する場合
面倒なので,H8Sミニカーネル環境下で動作するGPSモニタを作成しましたので
そちらを参考にしてください。
[ご注意]
・このページの記載事項については,一切無保証です。