H8 300HTiny ROMのサム

こんにちは

現在H8 300Tinyの評価キット(デバイスは36079)を使用して、

ROMのサムを計算するプログラムを作成しています。

ROMの0x00000000番地から0x0001EFFF番地の値を加算しているのですが、

毎回サムの計算値が異なってしまいます。

チェックサムの関数は下記のようにしています。

#define ROM_STR_ADDR ((unsigned int)0x00000000)

#define ROM_END_ADDR((unsigned int)0x0001EFFF)

static void check_sum(void)
{
 unsigned char  *sum_addr;
 unsigned int sum_cnt;
 unsigned int sum_data = 0;

 sum_addr = ((unsigned char*)ROM_STR_ADDR);
 for(sum_cnt = ROM_STR_ADDR ; sum_cnt < ROM_END_ADDR ; sum_cnt++ )
 {
  sum_data += *sum_addr;
  sum_addr++;
 } 
}

HEWにて上記関数を実行して、その後Reset実行すると値が変わっていることがあります。

上記の関数が悪いか、他の関数が影響しているか調べている最中なのですが、

何かご存知のある方いましたら教えていただけますか?

Parents
  • 『H8S、H8/300シリーズ C/C++コンパイラ、アセンブラ、最適化リンケージエディタ コンパイラパッケージVer.7.00 ユーザーズマニュアル』の 258頁を見ると unsigned int は 2 バイトの型で取りうる値の範囲が 0~65535 とありますが、貼られているプログラムでは

    • アドレスを unsigned int にキャストしている為、下 16bit しか有効になっていない
    • for ループの有効アドレスの判定が ROM_END_ADDR 未満となっているため最終アドレスが計算されない

    以上の問題があると思います。

    #define ROM_STR_ADDR ((const unsigned char*)0x00000000L)
    
    #define ROM_END_ADDR ((const unsigned char*)0x0001EFFFL)
    
    static void check_sum(void)
    {
     const unsigned char  *sum_addr;
     unsigned int sum_data = 0;
    
     for(sum_addr = ROM_STR_ADDR ; sum_addr <= ROM_END_ADDR ; sum_addr++)
     {
      sum_data += *sum_addr;
     } 
    }
    

    とされてはどうでしょうか?

  • 今使用しているものです、良かったら使用してみてください。

    //サムコード生成

    unsigned long make_sum(unsigned char *buffer, long size)

    {

    long i;

    unsigned long a, b;

    a = 0;

    for(i = 0;i < size;i += 2) {

    b = (unsigned long)(buffer[i] & 0xff) * 256;

    b |= (unsigned long)buffer[i + 1] & 0xff;

    a = a + b;

    }

    return (~a & 0xffffffff);

    }

  • fujita nozomu様 IKUZO 様

    ご回答有難うございます。

    型やループ等、初歩的な間違いばかりで申し訳ないです…

    御二人のソースコードとても参考になりました。

    私の関数も悪いのですが、サムが違った際のメモリをファイル出力し、比較したところ

    不要なセクション(何も入っていない)がマッピングされていた部分に差分があった為、

    それも原因かもしれません。

    手当たり次第調査してみます。

Reply
  • fujita nozomu様 IKUZO 様

    ご回答有難うございます。

    型やループ等、初歩的な間違いばかりで申し訳ないです…

    御二人のソースコードとても参考になりました。

    私の関数も悪いのですが、サムが違った際のメモリをファイル出力し、比較したところ

    不要なセクション(何も入っていない)がマッピングされていた部分に差分があった為、

    それも原因かもしれません。

    手当たり次第調査してみます。

Children
No Data