仕事で組み込み系のプログラムをしています。現在困っている現象に出くわしてしまいました。
現象:下記コードにおいてif文の条件を満たしているはずなのにif文を通らない
目指す機能:1マイコンのあるピンにパルスが入ってきたら外部割込みが働いてzcntをインクリメントする
2zcntが1になったら、かつpulsecntが20000を超えたら処理する。pulsecntは定期的に増加する
if文の前でブレイクポイントを張って変数を確認するとpulsecnt=20010、zcnt = 1にセットされています。しかし
if文をとおりません。
どなたか同じような現象に遭遇した人はいないでしょうか。
私の中で考えている仮設はこうです
仮説:外部割込みで使用した変数の値が変わっていも、main文には反映されない
よろしくお願いします
if文の条件を満たしているはずなのにif文を通らない
Re: if文の条件を満たしているはずなのにif文を通らない
ブレイクポイントで止まった後、ステップ実行しても、
{ /*処理文*/ } に行かないのですか?
それとも、処理文にもブレイクポイントを設定しているけれど、
そこでは停止しないということですか?
次のように volatile を付けると、どうなりますか?
main は、文ではなく、関数です。
- Dixq (管理人)
- 管理人
- 記事: 1661
- 登録日時: 13年前
- 住所: 北海道札幌市
- 連絡を取る:
Re: if文の条件を満たしているはずなのにif文を通らない
ブレイクポイントで止めた時はその値でも、別スレッドで値が書き換わることはないのでしょうか。
もしくは、Releaseコンパイルになっていてデバッガで見ている値が不正になっているようなことはありませんか?
仮説について、具体的なコードは分かりませんが、値の参照が正しく、if文の直前で書き換わっているならmain文の中だろうとどこだろうと繁栄されています。
参照不可能なスコープから参照するようなコードがあればコンパイルエラーになるはずです。
もしくは、Releaseコンパイルになっていてデバッガで見ている値が不正になっているようなことはありませんか?
仮説について、具体的なコードは分かりませんが、値の参照が正しく、if文の直前で書き換わっているならmain文の中だろうとどこだろうと繁栄されています。
参照不可能なスコープから参照するようなコードがあればコンパイルエラーになるはずです。
Re: if文の条件を満たしているはずなのにif文を通らない
zcnt++;
を2回通ればもうそのifの条件を満たさなくなるわけですが
単に割り込みが連続発生しているとかいう事は無いのでしょうか.
(試しに zcnt++ ではなく zcnt=1 にしてみてもダメ?)
を2回通ればもうそのifの条件を満たさなくなるわけですが
単に割り込みが連続発生しているとかいう事は無いのでしょうか.
(試しに zcnt++ ではなく zcnt=1 にしてみてもダメ?)
Re: if文の条件を満たしているはずなのにif文を通らない
if((int)pulsecnt> (int)20000 && (int)zcnt == (int)1){
}
こんなんでもダメでしょうか?
}
こんなんでもダメでしょうか?