元μT-Kernel(今は違うもの)実装仕様書 Version 1.00.00 2008年1月 0 まえがき 0.0 はじめに この文書には、元μT-Kernel(今は違うもの)の特定のボードへの実装の仕様が書かれ ている。 対象とするμT-Kernelのバージョンは、1.00.00版とする。 細かいことはμT-Kernel実装仕様書H8S/2212版(Version 1.00.00)を適当に参照。 0.1 何をするものか μT-Kernel Version 1.00.00のH8S/2212版のリファレンスコードにパッチを当て、H8/3 069やH8/3052, H8/3664で無理矢理動かそうとするもの。 μT-Kernelを名乗るためには互換性認証をパスしなければならないが、個人相手にそん なことをやってくれる訳じゃなさそうなので、とりあえずこんな形で公開するしかな い。 非公式なものなので、T-Engine Forumへクレームを言うこともできなくなるし、何か不 具合が起こった場合の対処は各自でどうにかしてもらうしかない…使うなら自己責任。 0.2 使いかた PC-UNIX上だとこんな感じ。Cygwin環境でも多分こんな感じだと思う。 $ tar zxpf utkernel.1.00.00.tar.gz $ cd utkernel_source/ $ patch -p1 < utk-1.00.00-h8xxxx-unofficial-yyyymmdd.patch 機種名やディレクトリ名はapp_h8s2212やh8s2212のまま。makeしてできあがったオブジ ェクトが、パッチに書かれた機種向けになる。 複数の機種で使いたい場合は、各機種毎にutkernel.1.00.00.tar.gzの展開からやらない と駄目なので、注意。 0.3 ビルドの際のヒント 環境変数の設定を忘れると大変。 $ export BD=/home/user/utkernel_source $ export GNU_BD=/usr/local $ export TOOL_ORIGIN=GNUh8300 $ export GNUh8300=/usr/local/h8300-elf 最初は手で設定して、面倒になってきたらビルド用のディレクトリにあるMakefileに仕 込んでおくと良さそう。※設定値は各自の環境に応じて読み替える perlのパスも要注意。以下のファイルは/usr/local/bin/perlを前提としているので、 /usr/bin/perlの場合は書き換えないといけない。 $(BD)/etc/mkfuncfiles $(BD)/mkiflib $(BD)/mktdsvc $(BD)/mktksvc $(BD)/lib/libsvc/build/h8s2212/makeifex.pl $(BD)/lib/libsvc/build/h8s2212/makeiftd.pl $(BD)/lib/libsvc/build/h8s2212/makeiftk.pl ビルド用のディレクトリは、$(BD)/kernel/sysmain/build/app_h8s2212。make, make c leanを知っていれば多分大丈夫。makeはGNU makeを使う。 ターゲットに転送するのは、kernel-ram.motもしくはkernel-rom.mot。 1 CPU 1.1 ハードウェア仕様 ○H8/3664版 CPU: Renesas H8/3664 ROM 32kB(CPU内蔵) RAM: 2kB(CPU内蔵) AKI-H8/3664(秋月電子通商)を使用する。 ※32kHzのサブクリスタルが必須 ○H8/3069版 CPU: Renesas H8/3069 ROM: 512kB(CPU内蔵) RAM: 16kB(CPU内蔵) AKI-H8/3069FフラッシュマイコンLANボードを使用する。 AKI-H8/3069FフラッシュマイコンLANボード上のDRAM(2MB)で動作させる場合 は、H8簡易モニタ (http://www.mit.pref.miyagi.jp/embedded/consortium/h8mon.html)を使用す る。 ○H8/3052版 CPU: Renesas H8/3052 ROM: 512kB(CPU内蔵) RAM: 8kB(CPU内蔵) AKI-H8-LANボード+AE-3052ボードを使用する。 AKI-H8-LANボード上のSRAM(128kB)で動作させる場合は、H8簡易モニタ (http://www.mit.pref.miyagi.jp/embedded/consortium/h8mon.html)を使用す る。 1.2 動作モードと保護レベル MMUやMPUが存在しないため、保護レベルの切り替えという概念は無い。 保護レベルの指定は、全てレベル0として扱う。 2 メモリマップ 2.1 H8/3664版 2.1.1 全体 0x0000 +-----------------------+ |内蔵ROM (32kB) | 0x0000-0x7fff 0x8000 +-----------------------+ :(未使用) : 0xf780 +-----------------------+ |内蔵RAM (2kB) | 0xf780-0xff7f 0xff80 +-----------------------+ |内部I/Oレジスタ | 0xff80-0xffff 0xffff +-----------------------+ 2.1.2 内蔵ROM領域 32kBの内蔵ROM領域は、以下のように使用する。 0x0000 +-----------------------+ |割込例外ベクタテーブル | 0x0000-0x0033 0x0034 +-----------------------+ |μT-Kernelコード | +- - - - - - - - - - - -+ |(未使用) | 0x8000 +-----------------------+ 内蔵ROMには、割込例外ベクタテーブルとμT-Kernelコードを配置する。 2.1.3 内蔵RAM領域 2kBの内蔵RAM領域は、以下のように使用する。 0xf780 +-----------------------+ |.data | +- - - - - - - - - - - -+ |.bss (NoInit) | +- - - - - - - - - - - -+ |.bss | +- - - - - - - - - - - -+ ←SYSTEMAREA_TOP |μT-Kernel管理領域 | 0xfec0 +-----------------------+ ←SYSTEMAREA_END |割込スタック (192byte) | 0xff80 +-----------------------+ ←sp初期値 NoInit: ゼロ初期化されない.bss 内蔵RAMの下位アドレスから、.dataおよび.bssを割り当てる。 μT-Kernel管理領域は、μT-Kernelのメモリ管理機能が使用する。 μT-Kernel管理領域は、設定ファイル(utk_config_depend.h)のSYSTEMAREA_TOP, SYSTE MAREA_ENDの指定された間の領域とする。通常は、空いているメモリ領域は全てμT-Ker nelのメモリ管理機能に割り当てられる。 2.2 H8/3069版 2.2.1 全体 CPUの動作モードは、CPU内蔵のROM・RAMだけで動作させる場合は、モード7とする。 AKI-H8/3069FフラッシュマイコンLANボード上のDRAMを使用する場合は、モード5。 モードにかかわらず、EMCビットの設定は1とする。 0x000000 +-----------------------+ |内蔵ROM (512kB) | 0x000000-0x07ffff 0x080000 +-----------------------+ :(外部アドレス空間) (*): 0x400000 +-----------------------+ |外付DRAM (2MB) (*)| 0x400000-0x5fffff 0x600000 +-----------------------+ :(外部アドレス空間) (*): 0xfee000 +-----------------------+ |内部I/Oレジスタ(1) | 0xfee100 +-----------------------+ :(外部アドレス空間) (*): 0xffbf20 +-----------------------+ |内蔵RAM (16kB) | 0xffbf20-0xffff1f 0xffff20 +-----------------------+ |内部I/Oレジスタ(2) (*)| 0xffffea +-----------------------+ :(外部アドレス空間) : 0xffffff +-----------------------+ (*)モード5のみ存在 2.2.2 内蔵ROM領域/外付DRAM領域 512kBの内蔵ROM領域・2MBの外付DRAM領域は、以下のように使用する。 ・H8簡易モニタを使用しない場合 0x000000 +-----------------------+ |割込例外ベクタテーブル | 0x000000-0x0000ff 0x000100 +-----------------------+ |μT-Kernelコード | +- - - - - - - - - - - -+ |(未使用) | 0x080000 +-----------------------+ 0x400000 +-----------------------+ |(未使用) | 0x400000-0x5fffff 0x600000 +-----------------------+ 内蔵ROMには、割込例外ベクタテーブルとμT-Kernelコードを配置する。 ・H8簡易モニタを使用する場合 0x000000 +-----------------------+ |H8簡易モニタ | 0x000000-0x07ffff 0x080000 +-----------------------+ 0x400000 +-----------------------+ |μT-Kernelコード | 0x400000-0x5fffff +- - - - - - - - - - - -+ |(未使用) | 0x600000 +-----------------------+ 内蔵ROMは、H8簡易モニタが使用する。 割込例外ベクタテーブルは、H8簡易モニタが内蔵RAM領域上に提供する(後述)。 外付DRAM領域に、μT-Kernelコードを配置する。 2.2.3 内蔵RAM領域 16kBの内蔵RAM領域は、以下のように使用する。 0xffbf20 +-----------------------+ |モニタ・作業領域 (*)| 0xffc000 +-----------------------+ |モニタ・ベクタ領域 (*)| 0xffc100 +-----------------------+ |.data | +- - - - - - - - - - - -+ |.bss (NoInit) | +- - - - - - - - - - - -+ |.bss | +- - - - - - - - - - - -+ ←SYSTEMAREA_TOP |μT-Kernel管理領域 | 0xfffe60 +-----------------------+ ←SYSTEMAREA_END |割込スタック (192byte) | 0xffff20 +-----------------------+ ←sp初期値 (*)H8簡易モニタ使用時のみ存在 NoInit: ゼロ初期化されない.bss 内蔵RAMの下位アドレスから、.dataおよび.bssを割り当てる。 μT-Kernel管理領域は、μT-Kernelのメモリ管理機能が使用する。 μT-Kernel管理領域は、設定ファイル(utk_config_depend.h)のSYSTEMAREA_TOP, SYSTE MAREA_ENDの指定された間の領域とする。通常は、空いているメモリ領域は全てμT-Ker nelのメモリ管理機能に割り当てられる。 2.3 H8/3052版 2.3.1 全体 CPUの動作モードは、CPU内蔵のROM・RAMだけで動作させる場合は、モード7とする。 AKI-H8-LANボード上のSRAMを使用する場合は、モード6。 0x000000 +-----------------------+ |内蔵ROM (512kB) | 0x000000-0x07ffff 0x080000 +-----------------------+ :(外部アドレス空間) (*): 0x220000 +-----------------------+ |外付SRAM (128kB) (*)| 0x220000-0x23ffff 0x240000 +-----------------------+ :(外部アドレス空間) (*): 0xffdf10 +-----------------------+ |内蔵RAM (8kB) | 0xffdf10-0xffff0f 0xffff10 +-----------------------+ :(外部アドレス空間) : 0xffff1c +-----------------------+ |内部I/Oレジスタ(2) (*)| 0xffffff +-----------------------+ (*)モード6のみ存在 2.3.2 内蔵ROM領域/外付SRAM領域 512kBの内蔵ROM領域・128kBの外付SRAM領域は、以下のように使用する。 ・H8簡易モニタを使用しない場合 0x000000 +-----------------------+ |割込例外ベクタテーブル | 0x000000-0x0000ff 0x000100 +-----------------------+ |μT-Kernelコード | +- - - - - - - - - - - -+ |(未使用) | 0x080000 +-----------------------+ 0x220000 +-----------------------+ |(未使用) | 0x220000-0x23ffff 0x240000 +-----------------------+ 内蔵ROMには、割込例外ベクタテーブルとμT-Kernelコードを配置する。 ・H8簡易モニタを使用する場合 0x000000 +-----------------------+ |H8簡易モニタ | 0x000000-0x07ffff 0x080000 +-----------------------+ 0x220000 +-----------------------+ |μT-Kernelコード | 0x220000-0x23ffff +- - - - - - - - - - - -+ |(未使用) | 0x240000 +-----------------------+ 内蔵ROMは、H8簡易モニタが使用する。 割込例外ベクタテーブルは、H8簡易モニタが内蔵RAM領域上に提供する(後述)。 外付SRAM領域に、μT-Kernelコードを配置する。 2.3.3 内蔵RAM領域 8kBの内蔵RAM領域は、以下のように使用する。 0xffdf10 +-----------------------+ |モニタ・作業領域 (*)| 0xffe000 +-----------------------+ |モニタ・ベクタ領域 (*)| 0xffe100 +-----------------------+ |.data | +- - - - - - - - - - - -+ |.bss (NoInit) | +- - - - - - - - - - - -+ |.bss | +- - - - - - - - - - - -+ ←SYSTEMAREA_TOP |μT-Kernel管理領域 | 0xfffe50 +-----------------------+ ←SYSTEMAREA_END |割込スタック (192byte) | 0xffff10 +-----------------------+ ←sp初期値 (*)H8簡易モニタ使用時のみ存在 NoInit: ゼロ初期化されない.bss 内蔵RAMの下位アドレスから、.dataおよび.bssを割り当てる。 μT-Kernel管理領域は、μT-Kernelのメモリ管理機能が使用する。 μT-Kernel管理領域は、設定ファイル(utk_config_depend.h)のSYSTEMAREA_TOP, SYSTE MAREA_ENDの指定された間の領域とする。通常は、空いているメモリ領域は全てμT-Ker nelのメモリ管理機能に割り当てられる。 2.4 スタック 以下の二種類のスタックが存在する。 (1)システムスタック (2)割り込みスタック 詳細はμT-Kernel実装仕様書 H8S/2212版を参照。 3 割り込み及び例外 3.1 割り込み定義番号 tk_def_int()で定義する割り込み定義番号(dintno)は、以下に示すベクタ番号の値を使 用する。 (H8/3664) ベクタアドレス ベクタ番号 割り込み要因 0x0000 0 reset 0x0002 1 reserved 0x0004 2 reserved 0x0006 3 reserved 0x0008 4 reserved 0x000a 5 reserved 0x000c 6 reserved 0x000e 7 NMI 0x0010 8 trap (#0) 0x0012 9 trap (#1) 0x0014 10 trap (#2) 0x0016 11 trap (#3) 0x0018 12 address break 0x001a 13 direct transition 0x001c 14 IRQ0 0x001e 15 IRQ1 0x0020 16 IRQ2 0x0022 17 IRQ3 0x0024 18 WKP 0x0026 19 Timer A 0x0028 20 reserved 0x002a 21 Timer W 0x002c 22 Timer V 0x002e 23 SCI3 0x0030 24 I2C 0x0032 25 A/D converter (H8/3069) ベクタアドレス ベクタ番号 割り込み要因 0x000000 0 reset 0x000004 1 reserved 0x000008 2 reserved 0x00000c 3 reserved 0x000010 4 reserved 0x000014 5 reserved 0x000018 6 reserved 0x00001c 7 NMI 0x000020 8 trap (#0) 0x000024 9 trap (#1) 0x000028 10 trap (#2) 0x00002c 11 trap (#3) 0x000030 12 IRQ0 0x000034 13 IRQ1 0x000038 14 IRQ2 0x00003c 15 IRQ3 0x000040 16 IRQ4 0x000044 17 IRQ5 0x000048 18 reserved 0x00004c 19 reserved 0x000050 20 WOVI 0x000054 21 CMI 0x000058 22 reserved 0x00005c 23 ADI 0x000060 24 IMIA0 0x000064 25 IMIB0 0x000068 26 OVI0 0x00006c 27 reserved 0x000070 28 IMIA1 0x000074 29 IMIB1 0x000078 30 OVI1 0x00007c 31 reserved 0x000080 32 IMIA2 0x000084 33 IMIB2 0x000088 34 OVI2 0x00008c 35 reserved 0x000090 36 CMIA0 0x000094 37 CMIB0 0x000098 38 CMIA1/CMIB1 0x00009c 39 TOVI0/TOVI1 0x0000a0 40 CMIA2 0x0000a4 41 CMIB2 0x0000a8 42 CMIA3/CMIB3 0x0000ac 43 TOVI2/TOVI3 0x0000b0 44 DEND0A 0x0000b4 45 DEND0B 0x0000b8 46 DEND1A 0x0000bc 47 DEND1B 0x0000c0 48 reserved 0x0000c4 49 reserved 0x0000c8 50 reserved 0x0000cc 51 reserved 0x0000d0 52 ERI0 0x0000d4 53 RXI0 0x0000d8 54 TXI0 0x0000dc 55 TEI0 0x0000e0 56 ERI1 0x0000e4 57 RXI1 0x0000e8 58 TXI1 0x0000ec 59 TEI1 0x0000f0 60 ERI2 0x0000f4 61 RXI2 0x0000f8 62 TXI2 0x0000fc 63 TEI2 (H8/3052) ベクタアドレス ベクタ番号 割り込み要因 0x000000 0 reset 0x000004 1 reserved 0x000008 2 reserved 0x00000c 3 reserved 0x000010 4 reserved 0x000014 5 reserved 0x000018 6 reserved 0x00001c 7 NMI 0x000020 8 trap (#0) 0x000024 9 trap (#1) 0x000028 10 trap (#2) 0x00002c 11 trap (#3) 0x000030 12 IRQ0 0x000034 13 IRQ1 0x000038 14 IRQ2 0x00003c 15 IRQ3 0x000040 16 IRQ4 0x000044 17 IRQ5 0x000048 18 reserved 0x00004c 19 reserved 0x000050 20 WOVI 0x000054 21 CMI 0x000058 22 reserved 0x00005c 23 reserved 0x000060 24 IMIA0 0x000064 25 IMIB0 0x000068 26 OVI0 0x00006c 27 reserved 0x000070 28 IMIA1 0x000074 29 IMIB1 0x000078 30 OVI1 0x00007c 31 reserved 0x000080 32 IMIA2 0x000084 33 IMIB2 0x000088 34 OVI2 0x00008c 35 reserved 0x000090 36 IMIA3 0x000094 37 IMIB3 0x000098 38 OVI3 0x00009c 39 reserved 0x0000a0 40 IMIA4 0x0000a4 41 IMIB4 0x0000a8 42 OVI4 0x0000ac 43 reserved 0x0000b0 44 DEND0A 0x0000b4 45 DEND0B 0x0000b8 46 DEND1A 0x0000bc 47 DEND1B 0x0000c0 48 reserved 0x0000c4 49 reserved 0x0000c8 50 reserved 0x0000cc 51 reserved 0x0000d0 52 ERI0 0x0000d4 53 RXI0 0x0000d8 54 TXI0 0x0000dc 55 TEI0 0x0000e0 56 ERI1 0x0000e4 57 RXI1 0x0000e8 58 TXI1 0x0000ec 59 TEI1 0x0000f0 60 ADI 0x0000f4 -- ---- 0x0000f8 -- ---- 0x0000fc -- ---- 3.2 TRAPA命令の割り当て TRAPA命令は0〜2を使用する(対応する割り込み定義番号は8〜10)。 trapa 0 システムコール・拡張SVC trapa 1 tk_ret_int()システムコール trapa 2 タスクディスパッチャ trapa 3 (未使用) 3.3 割り込みハンドラ μT-Kernel実装仕様書 H8S/2212版を参照。 H8S/2212版のリファレンスコードでは、knl_int_nestは32bit幅の値であるが、本実装 では16bitの値とする。 4 初期化および起動処理 4.1 起動手順 システムがリセットされると、カーネルが起動する。 カーネルが起動してから、main()関数が呼ばれるまでの処理は以下の通り。 icrt0.S (H8/3664) icrt0.S (H8/3069, H8/3052) 4.2 ユーザ初期化プログラム μT-Kernel実装仕様書 H8S/2212版を参照。 5 カーネル実装仕様 5.1 システム状態判定 (1) タスク独立部(割り込みハンドラ・タイムイベントハンドラ) カーネル内にフラグを設けて判定。 knl_taskindp = 0 タスク部 knl_taskindp > 0 タスク独立部 H8S/2212版のリファレンスコードでは、knl_taskindpは32bit幅の値であるが、本実装で は16bitの値とする。 (2) 凖タスク部(拡張SVCハンドラ) カーネル内にフラグを設けて判定。 TCBのsysmode = 0 タスク部 TCBのsysmode > 0 タスク独立部 5.1 カーネルが使用する例外・割り込み (H8/3664, H8/3069, H8/3664共通) trapa 0 システムコール・拡張SVC trapa 1 tk_ret_int()システムコール trapa 2 タスクディスパッチャ (H8/3664) dintno 19 Timer A (H8/3069, H8/3052) dintno 24 IMIA0