[Uclinux-h8-devel] CSCR、SCR2、whileループで?です。

アーカイブの一覧に戻る

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*****>




Uclinux-h8-devel メーリングリストの案内
アーカイブの一覧に戻る