こんにちは
現在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実行すると値が変わっていることがあります。
上記の関数が悪いか、他の関数が影響しているか調べている最中なのですが、
何かご存知のある方いましたら教えていただけますか?
『H8S、H8/300シリーズ C/C++コンパイラ、アセンブラ、最適化リンケージエディタ コンパイラパッケージVer.7.00 ユーザーズマニュアル』の 258頁を見ると unsigned int は 2 バイトの型で取りうる値の範囲が 0~65535 とありますが、貼られているプログラムでは
以上の問題があると思います。
#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 様
ご回答有難うございます。
型やループ等、初歩的な間違いばかりで申し訳ないです…
御二人のソースコードとても参考になりました。
私の関数も悪いのですが、サムが違った際のメモリをファイル出力し、比較したところ
不要なセクション(何も入っていない)がマッピングされていた部分に差分があった為、
それも原因かもしれません。
手当たり次第調査してみます。