H8マイコンのソース・・・なんだが・・・

アバター
バグ
記事: 130
登録日時: 14年前
住所: 愛媛県
連絡を取る:

H8マイコンのソース・・・なんだが・・・

投稿記事 by バグ » 13年前

20MHzの水晶で動いているH8OSを使用したH8マイコン用のソースなんだけど・・・
割り込みハンドラで時間を計測してるっぽい箇所がありましてね。

CODE:

int count = 1;
void wait_timer()
{
	// カウントが100000以上になったらリセット
	// 約0.4602 msecごとに呼び出される
	if (count++ > 100000)
	{
		count = 1;
	}
}
まず、約0.4602 msecってのがどこから来た数値なのかと・・・

H8OSでは8192カウント毎に割り込みが発生します。
つまり、今回のように20MHzの水晶だと、1 / 20000000 * 8192 = 0.0004096 secとなり、0.4096 msec毎に割り込みが発生するはずなのです。

で、問いただしてみると、オシロで計測した数値だとのこと・・・うーん・・・それでいいのかよ・・・。

実際の理論値と比較しても、1カウント辺り0.0506 msecのズレが発生している訳ですよ。ということはこれを100000回繰り返している訳ですから、条件を満たす頃には5 secほど誤差が発生しますよと。

まぁ、仮に誤差を許容するとして、1カウント辺り0.4602 msecだとしても100000カウントって46.02 secですよ。
そんな長い時間計測して何に使用しているのかな?と解析してみると計測終了の監視に使っているようなのですね。

しかし、終了する条件が(count == 1)を満たした場合・・・おいおい。
たまたま、この条件を満たした状態で判定文を通過してくれればいいですが、最初の割り込みが発生する前に判定文に到達したら即終了ですし、そうでなかったらもう46秒待機ですよ。(幸いにもここでおかしくなっているという報告は今のところないですが・・・)


今、たまに固まって暴走(にみえる)状態になってしまうってんで、原因を解明すべくデバッグしてるんですけどね・・・もうね、序盤にしてツッコミどころが満載過ぎて疲れました・・・。

ISLe
記事: 2650
登録日時: 14年前

RE: H8マイコンのソース・・・なんだが・・・

投稿記事 by ISLe » 13年前

巷では並列コンピューティングが流行ってますが怖いですね。

naohiro19
記事: 256
登録日時: 14年前

RE: H8マイコンのソース・・・なんだが・・・

投稿記事 by naohiro19 » 13年前

おそらくこのソースのif文は100000より大きくなることはありえないので通らないと思います。(たぶん)

アバター
バグ
記事: 130
登録日時: 14年前
住所: 愛媛県
連絡を取る:

RE: H8マイコンのソース・・・なんだが・・・

投稿記事 by バグ » 13年前

>>Isleさん
新しい技術は怖いけど、覚える楽しさもあるので困ったところです。
こういう仕事してる人って、基本的にマゾでないとやってられないと思う私(コラ

>> naohiro19
>>おそらくこのソースのif文は100000より大きくなることはありえないので通らないと思います。(たぶん)

あ、分かりづらかったかもしれませんが、countはグローバル変数で、割り込みハンドラを紐付ける前に必ず1で初期化しております。なので、この関数が割り込みで呼ばれる度にカウントアップされますよ。
それから、int型は16bitではなく32bitにしております。
最後に編集したユーザー バグ on 2012年7月03日(火) 09:27 [ 編集 1 回目 ]