Nobuyuki Maruyama
episl****@anet*****
2005年 3月 2日 (水) 16:27:39 JST
初めまして、丸山と申します。(長文失礼します。) H8MAXを購入、寺脇様と同様にelf2fltで一週間ばかり格闘していたところ、 >そういう部分は特に無いはずですが… >ひょっとしてinstall時のldを入れ換える所でしょうか? の記載に助けられました。 これにより、プログラムそのものは動くようになったのですが、 以下の点が未だ不安定です。 解決法(ヒント)を教えて頂けませんでしょうか? 1.PA-1を入力に設定し、プッシュスイッチを接続しています。 このスイッチONの検出のため、whileループを用いた関数を書いてみましたが、 (下記リスト)ループが約100回程まわったところで固まってしまいます。 リソースを使い切ってしまうようで ”CTRL+C”で更に100回程度動きますが、再度固まります。。 OS(linux)上でのプログラムの経験がほとんど無いので不明なのですが "input.h"等を用いた、デバイスとして割り込みを待つ形にしないと いけないのでしょうか? 2.また、PBにSC1602の液晶を接続し、文字を表示させようと思ったのですが、 三岩様のH8OS等で必要であったPB出力設定のための CSCR = 0x0F; SCR2 = 0x00; の設定を記載すると暴走してしまいます。 uClinux上ではこれらは不要なのでしょうか? なお、 当方の環境は gcc-3.3 binutils-2.14, http://strawberry-linux.com/h8max/devel.php の通りに構築した後、 elf2fltのみ http://prdownloads.sourceforge.jp/uclinux-h8/13093/elf2flt-cvs.tar.gzより 最新(?)のelf2fltをwget、上記でコンパイルしたものをコピーして使っています。 Makefileとうまく動かないプログラムは以下の通りです。(変数名定義省略) ------------------------------------------------------------------------------- CC = h8300-elf-gcc OBJCOPY = h8300-elf-objcopy #CFLAGS = -mh -mrelax -mint32 CFLAGS = -mh -mint32 CFLAGS += -static #CFLAGS += -Wl,--entry=main -nostdlib #CFLAGS += -nodefaultlibs CFLAGS += -nostartfiles /usr/src/uClinux-dist-h8300/uClibc/lib/crt0.o #CFLAGS += -finhibit-size-directive -fno-ident -fomit-frame-pointer CFLAGS += -I. CFLAGS += -I/usr/src/uClinux-dist-h8300/uClibc/include #CFLAGS += -Wall -v -save-temps #LDFLAGS += -Wl,-T/usr/local/h8300-elf/lib/elf2flt.ld LDFLAGS += -L/usr/src/uClinux-dist-h8300/uClibc/lib# -lc -lgcc #LDFLAGS += -Wl,-r#-Ur for C++ LDFLAGS += -Wl,-elf2flt #LDFLAGS += -Wl,-elf2flt-lc LDFLAGS += -Wl,-move-rodata #LDFLAGS += -Wl,--verbose #-Wl,-V error_test: error_test.c Makefile ${CC} ${CFLAGS} -o $@ $@.c ${LDFLAGS} tags: error_test.c etags *.c clean: rm -f TAGS error_test *~ -------------------------------------------------------------- int main(void) { int i = 0; rm_init(); /* initialize this machine */ // スイッチ入力待ちの間 LED RED点灯 PBDR &= 0x00; /* PortB 0000 000 : clear allbits */ PBDR |= 0x40; /* PortB 0100 000 */ /* PB6:LED-Red = ON */ // Switch 入力待ち printf("Jump to 'get_push_sw()'...\n"); while(get_push_SW()) /* 刺激スイッチが押されて1になるのを待つ*/ { printf(" get_push_sw(): %d times\n", i ++); printf("\nPush Switch, please...\n"); } // 無事 終わったら LED Green 点灯 PBDR &= 0x00; /* PortB 0000 000 : clear allbits */ PBDR |= 0x80; /* PortB 1000 000 : set PB7 */ /* PB7:LED-Green = ON */ } /*--- メインプログラム終了 ---*/ void rm_init() /* initialize this machine */ { /* ポートA */ PADDR &= 0x00; /* PortA一旦すべてのbitをクリア */ PADDR |= 0xfe; /* PortA-0はin,その他ビット出力 */ /* ポートB */ // CSCR = 0x0f; /* "CSCR","SCR2"の設定がないと */ // SCR2 = 0 ; /* PortB,Port9 がまともに動かないはず。*/ /* でも、これをactivateすると暴走する。*/ /* 今後、暇が出来たら'/dev/lcd'で動かす?*/ PBDDR = 0xff; /* PortBは全ビット出力に設定 */ /*--- 各データーの初期化 ---*/ // スイッチ <switchは 正 論理> PADR &= 0x0; /* PA-7 OFF (PA = PA & 0000 0000) */ // LED初期化 PBDR=0x00; /* PortBの全ビットをLowに設定 */ /* LED = OFF */ } /****************************************/ /* read push switch status ~ ON=H,OFF=L */ /****************************************/ int get_push_SW() { printf (" PA = %d \n",PADR); return (PADR & 0x01) ? 0 : 1; /* SW_OFF=0、SW_ON=1を返す */ } ----------------------------------------------------------------- 動作メッセージはこんな感じです。 Push Switch, please... PA = 0 get_push_sw(): 96 times Push Switch, please... PA = 0 get_push_sw()*<−−カーソル点滅。 <ここで CTRL+C 入力すると> Push Switch, please... PA = 0 get_push_sw(): 193 times Push Switch, p まで動きます。 PB6,PB7は上記プログラムで出力として正常(?)動作しています。 -- 島根大学医学部・脳神経外科 丸山 信之 Nobuyuki Maruyama <episl****@anet*****>