[H8-ML(2435)] sprintfを使うと暴走?
From: eqpred <eqpred@xxxxxxxxxxx>
Date: 2002年11月25日(月)09時40分37秒
 初めまして。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 *~
スレッド概略
[表示中](起点)


投稿順に移動
[←前の記事へ(P)]
[→次の記事へ(N)]


リスト表示へ
[このスレッド(T)]
[本記事の前後(L)]