(toppers-users 1207) Re: tinet h8 3068f_lan の AKI_MONITOR

Katsuhiro Amano amano @ toyotamacs.co.jp
2003年 9月 11日 (木) 08:45:41 JST


高橋さん、谷本さん、こんにちは。

トヨタマックス 天野です。
h8300-elf環境でデバックが出来る(?)ようになりました。
#まだ問題点はありそうですが。。

| ところで、Redbootは以下のところからゲットしたのでは?
| http://sourceforge.jp/projects/ecos-h8/files/
|
| そうだとすれば、elf形式です。
| gccなどのソースをゲットして上記よりのパッチを当てて
| ツールを作成するか
開発環境ですが、ご教授いただいた所で、パッチをあてて構築しました。
普通にToppers開発環境を作るのと同じでした。h8300-elfにしただけです。

|
/usr/local/bin/h8300-elf-gcc -S -mh -mint32 -mrelax -O2  -DLABEL_ASM -DCPU_C
LOCK
|
=20000000 -DGDB_STUB -DSUPPORT_INET4 -DSUPPORT_TCP  -DSUPPORT_ETHER -DIF_ETH
ER_C
|
FG_ED -I. -I../include -I../config/h8net -I../config/h8net/akih8_3068f_lan -
I../
| tinet/include -g -Werror   -I../kernel ../config/h8net/makeoffset.c
| ../utils/genoffset makeoffset.s > offset.h
| genoffset: cannot parse:        .type   _ref_4, @object
| genoffset: cannot parse:        .size   _ref_4, 4
| genoffset: cannot parse:        .type   _ref_2, @object
| genoffset: cannot parse:        .size   _ref_2, 2
| genoffset: cannot parse:        .type   _ref_1, @object
| genoffset: cannot parse:        .size   _ref_1, 1
| genoffset: cannot parse:        .type   _TCB_enatex, @object
| genoffset: cannot parse:        .size   _TCB_enatex, 32
| genoffset: unknown directive:   .long   0
| make: *** [offset.h] Error 1
|  
|  しばらくは、COFFでやっていくので、あまり追いかけませんが、もしこの
|  件に関してヒントになることがあれば、ご返信いただければ幸いです。

同様の症状が発生しました。対策は2点です。
対策1:","の後のスペースを認める
utils/genoffset
113:
#  elsif ($line =~ /[ \t]*\.([a-zA-Z0-9]+)[ \t]*([^ \t]*)$/
  elsif ($line =~ /[ \t]*\.([a-zA-Z0-9]+)[ \t]*([^\t]*)$/
217:
#  elsif ($line =~ /[ \t]*\.([a-zA-Z0-9]+)[ \t]*([^ \t]*)$/
  elsif ($line =~ /[ \t]*\.([a-zA-Z0-9]+)[ \t]*([^\t]*)$/

対策2:longが下記アセンブラコードでサイズ解決されないので
(.zero が吐かれる)"=1"にするとアセンブラコードが変わるのでサイズがわかるら
しい。
config/h8/makeoffset.c
//asm("! BIT_REF");
//UW ref_4 = 0;
//UH ref_2 = 0;
//UB ref_1 = 0;
//asm("! END");
asm("! BIT_REF");
UW ref_4 = 1;
UH ref_2 = 1;
UB ref_1 = 1;
asm("! END");

| (その先 make で止まってますが・・・)
| コンフィグレータ1.3に変更してますか?
make dependするとmake.dependedができますが、
ここで<commnd line> <bin-->と言う文字が入ってしまう。
それをはじいてmake.dependファイルを作成する様に変更。
utils/makedep
#  if ($line =~ /^\#\s*([0-9]+)\s*\"([^\"]+)\"/) {
  if ($line =~ /^\#\s*([0-9]+)\s*\"([^\"<>]+)\"/) {

あとチェッカーでエラーが連発する。とりあえずコメントアウト
チェッカーが走らないけど、この際無視。
# $(JSPDIR)/cfg/$(TARGET_PREFIX)chk $(JSPOBJ) -cs jsp.chk \
#    -cpu $(CPU) -system $(SYS) -obj

下記がないと.vectors セクションがSレコードになったときに
消えてしまう。オブジェクト形式になった時に、ALLOC LOADフラグがないため。
sys_support.S
 .section ".vectors","ax"
/* .section .vectors */

下記があるとデバッガのTRAP命令で例外が発生してしまう。
/* .long _no_reg_exception */ /*  8, 0x0020: trap */
/* .long _no_reg_exception */ /*  9, 0x0024: trap */
/* .long _no_reg_exception */ /* 10, 0x0028: trap */
/* .long _no_reg_exception */ /* 11, 0x002c: trap */
 .long 0  /*  8, 0x0020: trap */
 .long 0  /*  9, 0x0024: trap */
 .long 0  /* 10, 0x0028: trap */
 .long 0  /* 11, 0x002c: trap */

(toppers-users 1074) にある部分の変更。
#define VECTOR_TABLE_ADDR  0x00fffd20
#define JMP_OPECODE   0x5a000000
extern void vectors(void);
void vector_table_copy(void)
{
    unsigned int n = 0x100/sizeof(unsigned int);   /* ベクタテーブルサイズ
*/
    unsigned int *o = (unsigned int *)VECTOR_TABLE_ADDR; /* ベクタテーブルコ
ピー先 */
    unsigned int *i = (unsigned int *)vectors;    /* ベクタテーブルコピー元
*/

    while (n -- > 0) {
        if (*i != 0) {              /* NOPはなにもしない */
            *o = JMP_OPECODE | *i;  /* jmp命令の付加 */
        }
        o++; i++;
    }
}

スタックの位置変更
//#define STACKTOP     0x00ffff20  /* タスク独立部用スタックの初期値 */
#define STACKTOP     0x005b0000  /* タスク独立部用スタックの初期値 */

あとはシリアルの出力をSCI0にしたぐらいです。
このぐらいの変更で、とりあえずデバックできるようになりました。
かなり間違っていることをやっているかもしれませんので
つっこみをいれていただけると幸いです。