初めまして。H8/300H初心者のeqpredと申します。トラ技12月号を見て、
秋月のAKI-3069F/LANボードを使い始めました。トレーニングのために
次のようなUDPで通信するプログラムを書いたのですが、sprintfを使う
とプログラムが動かなくなります。問題を解決するためのアドバイスを
頂けないでしょうか。よろしくお願いいたします。
[状況]
(1)下記のプログラムをコンパイル後、3069ボードのRAMに転送し、
H8/OS >exec ffde40
を入力すると、
H8/OS >exec ffde40Welcome to the H8 Monitor!!
H8/OS >
となって終了してしまう(?)。
この時、当然pingには応答しない。
(2)sendtick内のsprintfをすぐ下のstrcpyで置き換えてコンパイルし実行す
ると、正常動作してサーバ側では"1"というメッセージを検出する。
(3)どちらの場合でも、コンパイル、リンク、転送時にエラーは出ない。
[3069ボード側のプログラム]
#include <h8/reg3067.h>
#include <h8/syscall.h>
#include <h8/printf.h>
#include <string.h>
#define PORT 6666 /* 使用ポート番号 */
int tick; /* カウンタ変数 */
/* UDP 割り込み処理 */
int udp(unsigned short port, struct sockaddr_in *addr)
{
return 0;
}
/* サーバにカウンタ値を送る */
int sendtick( int t)
{
char tc[4]; /* 文字バッファ */
struct sockaddr_in addr; /* アドレス構造体 */
addr.sin_familly = AF_INET; /* INETドメイン */
addr.sin_port = PORT; /* 使用するポート */
addr.sin_addr = IPADDR(192,168,181,94); /* サーバアドレス */
set_udpaddr( &addr, PORT); /* アドレス構造体を設定 */
/*---- 問題の個所 2002/11/25 (ここから) ----*/
/* sprintfではうまく動かず! */
sprintf( tc, "%d", t); /* カウンタ値を文字に変換 */
/* strcpyなら動く! */
//strcpy(tc,"1"); /* 文字を直接書く */
/*---- (ここまで) ----*/
udp_write( tc, strlen(tc)); /* 文字数だけ送信 */
}
/* メイン */
int main(void)
{
tick = 0; /* カウンタ初期化 */
ether_init(0x200000); /* イーサ初期化 */
if ( get_ether_status() == 0) /* 初期化失敗なら */
return -1; /* 強制終了 */
ip_setup( IPADDR(192,168,181,230), IPADDR(255,255,255,0)); /* 3069Fボードのアドレス設定 */
udp_regport( udp); /* 割り込み処理関数の登録 */
while( 1) { /* 無限ループ */
sendtick( tick); /* カウンタ値を送信 */
sleep(10); /* 1秒待つ */
tick++; /* カウントアップ */
}
}
[購入ボード]
秋月電子製3069F/LANボード 16MビットRAM付き
[使用環境]
開発PC
Compaq Armada M300 (mobile-PenIII 500MHz), 512MB
開発OS
RedHat Linux 7.3
コンパイラ/ツールなど
h8300-hms-gcc-3.0.2-1
h8300-hms-binutils-2.11.2-1
H8/OS ver2.5 (キット付属のもの)
[コンパイルに使うMakefile]
PROGS = cl.mot
CFLAG = -O -mh -g -mint32
OS = /home/development/h8/h8os/kit/h8_os
all: $(PROGS)
cl.mot: cl
h8300-hms-objcopy -O srec cl.coff cl.mot
chmod -x cl.mot
rm cl.coff
cl: cl.c
h8300-hms-gcc $(CFLAG) -T $(OS)/ram3068.x -nostartfiles $(OS)/crt/ramcrt0.S cl.c -o cl.coff -lc
clean:
rm cl.mot *~