home > MONIX

MONIX (ROM monitor + GDB stub for Renesas H8/300H)

MONIXとは? ライセンス ダウンロード ビルド コマンド 使用例 (HOS) 使用例 (TOPPERS/JSP) 参考


履歴


MONIXとは?

MONIX (モニックス)とは、 Renesas H8/300H用のROMモニタ/ブートローダです。

機能概要


ライセンス

3-clause BSD-style license ( Modified BSD license ) です。

ダウンロード

最新版Ver.0.2:
monix-20071204.tbz2
Ver.0.1: monix-20070504.tbz2

ビルド

環境

Windows XPにcygwin、および、
KPIT (http://www.kpitgnutools.com/ の h8300-elf-gcc をインストールしていることを想定しています。 動作確認しているバージョンは以下の通りです。
$ h8300-elf-gcc -v Reading specs from c:/Program Files/Renesas/HEW30/Tools/KPIT Cummins/GNUH8-ELF/v0403/h8300-elf/bin/../lib/gcc/h8300-elf/3.4-GNUH8_v0403/specs Configured with: /home/kpit/fsfsrc/gcc-3.4-20040813/configure --build=i686-pc-linux-gnu --host=i386-pc-mingw32msvc --enable-languages=c,c++ --target=h8300-elf --with-newlib --prefix=/usr/share/mingwgnuh8300_v0403_elf-1 Thread model: single gcc version 3.4-GNUH8_v0403
および
$ h8300-elf-gcc -v Using built-in specs. Target: h8300-elf Configured with: /home/kpit/fsfsrc/gcc-4.2-20060812/configure --build=i686-pc-linux-gnu --host=i386-pc-mingw32msvc --enable-languages=c,c++ --target=h8300-elf --with-newlib --prefix=/usr/share/mingwgnuh8300_v0603_elf-1 Thread model: single gcc version 4.2-GNUH8_v0603

ソースコード展開

$ tar jxvf monix-YYYYMMDD.tbz2
なお、YYYYMMDDは、ダウンロードしたファイルのものに読み換えてください。

ビルド

$ cd monix
$ make
これにより、Motorola S-recordのファイル monix.mot ができます。

このファイルを適当な書き込みツールによりH8内蔵フラッシュメモリに書き込みます。

ユーザベクタ

番地0x400000から長さ0x100バイト(AKI-H8/3069F LANボードの外付け2MB DRAMの先頭)を ユーザベクタ(ロードされるプログラムの割り込みベクタ)として解釈します。

このアドレスは、リンカスクリプト (monix-aki_h8lan.x) で以下のように指定しています。

        uservec	: o = 0x400000, l = 0x100

ユーザベクタのアドレスを変えたい場合は、これを変更してください。


コマンド

苫小牧高等専門学校により開発され、 宮城県産業技術総合センターのサイトで公開されている「H8用簡易モニタ」
http://www.mit.pref.miyagi.jp/embedded/consortium/h8mon.html と同様にさせていただいています。 ただし、表示、コマンドラインインタフェースの詳細は微妙に異なるものもあります。

以下、主要なコマンドの説明です。

参:MONIXで扱うターゲットプログラムのバイナリの形式


使用例 (HOS)

HOS (http://sourceforge.jp/projects/hos/) を対象のプログラムとして、 BOOTP+TFTPダウンロード、および、GDBスタブの使用例を示します。

環境

TeraTermの設定例
TeraTermの設定例

HOS v4の入手、ビルド

こちらをご参照ください。

ターゲットへのBOOTP+TFTPでのロード

ターゲット電源オン

シリアルポート(SCI1)にシリアルケーブル(ストレート)を接続して、電源を入れます。
MONIX Ver.0.1 (Jan 18 2007, 23:41:08)
BootMode: 0x00
1:

ターゲットにBOOTP(DHCP) + TFTPでプログラムダウンロード

tftpコマンドで、 TFTPサーバを動かしているホストPC(以下の例では192.168.0.2)から、 ベタバイナリ(sample.bin)をダウンロードします。
1:tftp 192.168.0.2 sample.bin EtherInit DONE. Ethernet Address : 00:02:cb:01:55:c2 BOOTP DONE. my_ip=192.168.0.3, bootfile=, server_ip(BOOTP)=192.168.0.1 ==> my_ip=192.168.0.3, bootfile=sample.bin, server_ip(TFTP)=192.168.0.2, loadaddr=0x400000 TFTP Start....(10 blocks) DONE. 1:

実行

1:go
HOS
00000:Task1
01002:Task1	→以降、1秒毎に表示を繰り返す。
02004:Task1
03006:Task1
04008:Task1
等となればよい。

GDBスタブ

ターゲット電源オン

MONIX Ver.0.1 (Jan 18 2007, 23:41:08)
BootMode: 0x00
1:

ターゲットでGDBスタブを動かす

以下の例では、UDPのポート9999でGDBスタブを動かします。
1:stub net 9999
EtherInit DONE.
Ethernet Address : 00:02:cb:01:55:c2
BOOTP DONE.
my_ip=192.168.0.3, bootfile=, server_ip(BOOTP)=192.168.0.1
Start GDB stub...
StubNetDebugStart: call bind (port=9999)

ホストでGDBを動かす

KPITのGDB (h8300-elf-gdb あるいは h8300-elf-insight) は、 cygwin bashでは動かないので、Windowsのコマンドプロンプトで動かします。

gdbが起動したら、targetコマンドで、 ターゲットのIPアドレス (この例では192.168.0.3) とスタブのUDPポート (この例では9999) を指定します。

C:\work\hos-v4\sample\h83-akilan>h8300-elf-gdb sample.elf GNU gdb 6.0.0.90_20031231 Copyright 2003 Free Software Foundation, Inc. GDB is free software, covered by the GNU General Public License, and you are welcome to change it and/or distribute copies of it under certain conditions. Type "show copying" to see the conditions. There is absolutely no warranty for GDB. Type "show warranty" for details. This GDB was configured as "--host=i686-pc-cygwin --target=h8300-elf"... (gdb) target remote udp:192.168.0.3:9999 →ターゲットのIPアドレスとスタブのUDPポート warning: The remote protocol may be unreliable over UDP. warning: Some events may be lost, rendering further debugging impossible. Remote debugging using udp:192.168.0.3:9999 0x00006b8c in ?? () (gdb) load →ロードする Loading section .vectors, size 0x100 lma 0x400000 Loading section .text, size 0x1220 lma 0x400100 Loading section .data, size 0x20 lma 0x401320 Start address 0x400100, load size 4928 Transfer rate: 39424 bits in <1 sec, 62 bytes/write. (gdb) b main →ブレークポイント設定 Breakpoint 1 at 0x400146: file sample.c, line 25. (gdb) c →動かす Continuing. Breakpoint 1, main () at sample.c:25 25 Sci_Initialize(SCI_57600); (gdb) n 33 Sci_PutChar('H'); (gdb) n 34 Sci_PutChar('O'); (gdb) n 35 Sci_PutChar('S'); (gdb) n 36 Sci_PutChar('\r'); (gdb) n 37 Sci_PutChar('\n'); (gdb) n 39 sta_hos(); (gdb) s sta_hos () at ../../../src/kernel/hos/sta_hos.c:20 20 kernel_cfg_init(); (gdb) s kernel_cfg_init () at kernel_cfg.c:190 190 kernel_tcb_ram[i].tcb_rom = &kernel_tcb_rom[i]; (gdb) n 194 kernel_intcb_tbl[24].exinf = (VP_INT)(0); (gdb) n 195 kernel_intcb_tbl[24].isr = (FP)(OsTimer_TimerHandler); (gdb) n 196 kernel_intcb_tbl[57].exinf = (VP_INT)(0); (gdb) c Continuing. Interrupted while waiting for the program. →Ctrl-Cを入力 Give up (and stop debugging it)? (y or n) y (gdb) q C:\work\hos-v4\sample\h83-akilan>

このときのターゲット側の表示

1:stub net 9999
EtherInit DONE.
Ethernet Address : 00:02:cb:01:55:c2
BOOTP DONE.
my_ip=192.168.0.3, bootfile=, server_ip(BOOTP)=192.168.0.1
Start GDB stub...
StubNetDebugStart: call bind (port=9999)

HOS
00000:Task1
01002:Task1
02004:Task1
03006:Task1
04008:Task1
05010:Task1
06012:Task1

使用例 (TOPPERS/JSP)

(HOSの場合と同様ですので、あわせてHOSの方の説明もご覧ください。)

TOPPERS/JSP (http://www.toppers.jp/) を対象のプログラムとして、 BOOTP+TFTPダウンロード、および、GDBスタブの使用例を示します。

環境

TOPPERS/JSP Release 1.4.2 の入手、ビルド

こちらをご参照ください。

ターゲットへのBOOTP+TFTPでのロード

ターゲット電源オン

シリアルポート(SCI1)にシリアルケーブル(ストレート)を接続して、電源を入れます。
MONIX Ver.0.1 (Jan 18 2007, 23:41:08)
BootMode: 0x00
1:

ターゲットにBOOTP(DHCP) + TFTPでプログラムダウンロード

tftpコマンドで、 TFTPサーバを動かしているホストPC(以下の例では192.168.0.2)から、 ベタバイナリ(jsp.bin)をダウンロードします。
1:tftp 192.168.0.2 jsp.bin EtherInit DONE. Ethernet Address : 00:02:cb:01:55:b1 BOOTP DONE. my_ip=192.168.0.3, bootfile=, server_ip(BOOTP)=192.168.0.1 ==> my_ip=192.168.0.3, bootfile=jsp.bin, server_ip(TFTP)=192.168.0.2, loadaddr=0x400000 TFTP Start....(55 blocks) DONE. 1:

実行

1:go JSP Kernel Release 1.4 (patchlevel = 2) for AKI-H8/3069F (Jan 19 2007, 19:32:22) Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory Toyohashi Univ. of Technology, JAPAN Copyright (C) 2001-2005 by Industrial Technology Institute, Miyagi Prefectural Government, JAPAN Copyright (C) 2001-2004 by Dep. of Computer Science and Engineering Tomakomai National College of Technology, JAPAN Copyright (C) 2003-2004 by Katsuhiro Amano System logging task is started on port 1. Sample program starts (exinf = 0). task1 is running (001). | →以降、表示を繰り返す。 task1 is running (002). | task1 is running (003). | task1 is running (004). | task1 is running (005). | task1 is running (006). | task1 is running (007). | task1 is running (008). | task1 is running (009). | task1 is running (010). | task1 is running (011). | task1 is running (012). |
等となればよい。

GDBスタブ

ターゲット電源オン

MONIX Ver.0.1 (Jan 18 2007, 23:41:08)
BootMode: 0x00
1:

ターゲットでGDBスタブを動かす

以下の例では、デフォルトのUDPのポート9000でGDBスタブを動かします。
1:stub net
EtherInit DONE.
Ethernet Address : 00:02:cb:01:55:c2
BOOTP DONE.
my_ip=192.168.0.3, bootfile=, server_ip(BOOTP)=192.168.0.1
Start GDB stub...
StubNetDebugStart: call bind (port=9000)

ホストでGDBを動かす

KPITのGDB (h8300-elf-gdb あるいは h8300-elf-insight) は、 cygwin bashでは動かないので、Windowsのコマンドプロンプトで動かします。

gdbが起動したら、targetコマンドで、 ターゲットのIPアドレス (この例では192.168.0.3) とスタブのUDPポート (この例では9000) を指定します。

C:\work\TOPPERS\jsp\MYSAMPLE>h8300-elf-gdb jsp.exe GNU gdb 6.0.0.90_20031231 Copyright 2003 Free Software Foundation, Inc. GDB is free software, covered by the GNU General Public License, and you are welcome to change it and/or distribute copies of it under certain conditions. Type "show copying" to see the conditions. There is absolutely no warranty for GDB. Type "show warranty" for details. This GDB was configured as "--host=i686-pc-cygwin --target=h8300-elf"... (gdb) target remote udp:192.168.0.3:9000 →ターゲットのIPアドレスとスタブのUDPポート warning: The remote protocol may be unreliable over UDP. warning: Some events may be lost, rendering further debugging impossible. Remote debugging using udp:192.168.0.3:9000 0x00006dba in ?? () (gdb) load →ロードする Loading section .vectors, size 0x100 lma 0x400000 Loading section .text, size 0x5ab6 lma 0x400100 Loading section .rodata, size 0x113e lma 0x405bb8 Loading section .data, size 0xe lma 0x406cf8 Start address 0x400100, load size 27906 Transfer rate: 37208 bits/sec, 63 bytes/write. (gdb) b main_task →ブレークポイント設定 Breakpoint 1 at 0x400474: file sample1.c, line 251. (gdb) c →動かす Continuing. Breakpoint 1, main_task (exinf=0x0) at sample1.c:251 251 ID tskid = TASK1; (gdb) list 246 * ・皈、・・ソ・ケ・ッ →EUCのコメントのため化けている 247 */ 248 void main_task(VP_INT exinf) 249 { 250 char c; 251 ID tskid = TASK1; 252 volatile UW i; 253 INT tskno = 1; 254 ER_UINT ercd; 255 PRI tskpri; (gdb) 256 SYSTIM stime1, stime2; 257 #ifndef OMIT_VGET_TIM 258 SYSUTIM utime1, utime2; 259 #endif /* OMIT_VGET_TIM */ 260 261 vmsk_log(LOG_UPTO(LOG_INFO), LOG_UPTO(LOG_EMERG)); 262 syslog(LOG_NOTICE, "Sample program starts (exinf = %d).", (INT) exinf); 263 264 syscall(serial_ctl_por(TASK_PORTID, 265 (IOCTL_CRLF | IOCTL_FCSND | IOCTL_FCRCV))); (gdb) 266 267 /* 268 * ・・シ・ライソ、ホタ゜ト →EUCのコメントのため化けている 269 */ 270 task_loop = LOOP_REF; 271 get_tim(&stime1); 272 for (i = 0; i < task_loop; i++); 273 get_tim(&stime2); 274 task_loop = LOOP_REF * 400 / (stime2 - stime1); 275 tex_loop = task_loop / 5; (gdb) b 273 →273行にブレークポイント設定。 Breakpoint 2 at 0x400522: file sample1.c, line 273. (gdb) c Continuing. Breakpoint 2, main_task (exinf=0x0) at sample1.c:273 273 get_tim(&stime2); (gdb) p i →変数iの値を表示。 $1 = 100000 (gdb) n 274 task_loop = LOOP_REF * 400 / (stime2 - stime1); (gdb) p stime1 $2 = 23 (gdb) p stime2 $3 = 1350 (gdb) b syslog →syslog関数にブレークポイントを設定。 Breakpoint 3 at 0x401e52: file ../library/vasyslog.c, line 57. (gdb) c Continuing. Breakpoint 3, syslog (prio=5, format=0x405bd0 "task%d is running (%03d). %s") at ../library/vasyslog.c:57 57 log.logtype = LOG_TYPE_COMMENT; (gdb) where →スタックトレース表示。 #0 syslog (prio=5, format=0x405bd0 "task%d is running (%03d). %s") at ../library/vasyslog.c:57 #1 0x004001da in task (exinf=0x500614) at sample1.c:128 #2 0x004033de in can_act (tskid=5) at ../kernel/task_manage.c:150 #3 0x0040139e in serial_rea_dat (portid=1, buf=0x500614 "", len=1) at t_services.h:97 #4 0x0040058a in main_task (exinf=0x0) at t_services.h:88 #5 0x004033de in can_act (tskid=5) at ../kernel/task_manage.c:150 #6 0x00401960 in logtask (exinf=0x5) at t_services.h:97 #7 0x004033de in can_act (tskid=5) at ../kernel/task_manage.c:150 (gdb) c Continuing. Breakpoint 3, syslog (prio=5, format=0x405bd0 "task%d is running (%03d). %s") at ../library/vasyslog.c:57 57 log.logtype = LOG_TYPE_COMMENT; (gdb) c Continuing. Breakpoint 3, syslog (prio=5, format=0x405bd0 "task%d is running (%03d). %s") at ../library/vasyslog.c:57 57 log.logtype = LOG_TYPE_COMMENT; (gdb)

このときのターゲット側の表示

省略。

参考


Shuji KUWAHARA
$Id: index.html 315 2008-04-20 13:11:27Z kuwa $