if文の条件を満たしているはずなのにif文を通らない

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
asahi
記事: 8
登録日時: 5年前

if文の条件を満たしているはずなのにif文を通らない

#1

投稿記事 by asahi » 5年前

仕事で組み込み系のプログラムをしています。現在困っている現象に出くわしてしまいました。
現象:下記コードにおいてif文の条件を満たしているはずなのにif文を通らない
目指す機能:1マイコンのあるピンにパルスが入ってきたら外部割込みが働いてzcntをインクリメントする
2zcntが1になったら、かつpulsecntが20000を超えたら処理する。pulsecntは定期的に増加する

if文の前でブレイクポイントを張って変数を確認するとpulsecnt=20010、zcnt = 1にセットされています。しかし
if文をとおりません。
どなたか同じような現象に遭遇した人はいないでしょうか。

私の中で考えている仮設はこうです
仮説:外部割込みで使用した変数の値が変わっていも、main文には反映されない

コード:

/*外部変数の定義*/
uint8_t zcnt=0;
uint16_t pulsecnt= 0;

int main(void){

	while(1){
	   pulsecnt = TIM2->CNT;     /*レジスタ値の読み取り*/
 		if(pulsecnt> 20000 && zcnt == 1){
     		/*処理文*/
     		}
 	}
 }

/*外部割込み関数*/
 EXTI4_IRQ_handler(){
        clearFlg(PA4);   //割り込みフラグのクリア
 	zcnt++;
}
よろしくお願いします

かずま

Re: if文の条件を満たしているはずなのにif文を通らない

#2

投稿記事 by かずま » 5年前

asahi さんが書きました:
5年前
if文の前でブレイクポイントを張って変数を確認するとpulsecnt=20010、zcnt = 1にセットされています。しかし
if文をとおりません。
ブレイクポイントで止まった後、ステップ実行しても、
{ /*処理文*/ } に行かないのですか?
それとも、処理文にもブレイクポイントを設定しているけれど、
そこでは停止しないということですか?

次のように volatile を付けると、どうなりますか?

コード:

/*外部変数の定義*/
volatile uint8_t zcnt = 0;
volatile uint16_t pulsecnt = 0;
asahi さんが書きました:
5年前
仮説:外部割込みで使用した変数の値が変わっていも、main文には反映されない
main は、文ではなく、関数です。

アバター
Dixq (管理人)
管理人
記事: 1661
登録日時: 13年前
住所: 北海道札幌市
連絡を取る:

Re: if文の条件を満たしているはずなのにif文を通らない

#3

投稿記事 by Dixq (管理人) » 5年前

ブレイクポイントで止めた時はその値でも、別スレッドで値が書き換わることはないのでしょうか。
もしくは、Releaseコンパイルになっていてデバッガで見ている値が不正になっているようなことはありませんか?

仮説について、具体的なコードは分かりませんが、値の参照が正しく、if文の直前で書き換わっているならmain文の中だろうとどこだろうと繁栄されています。
参照不可能なスコープから参照するようなコードがあればコンパイルエラーになるはずです。

アバター
usao
記事: 1887
登録日時: 11年前

Re: if文の条件を満たしているはずなのにif文を通らない

#4

投稿記事 by usao » 5年前

zcnt++;
を2回通ればもうそのifの条件を満たさなくなるわけですが
単に割り込みが連続発生しているとかいう事は無いのでしょうか.
(試しに zcnt++ ではなく zcnt=1 にしてみてもダメ?)

damon500
記事: 7
登録日時: 8年前

Re: if文の条件を満たしているはずなのにif文を通らない

#5

投稿記事 by damon500 » 5年前

if((int)pulsecnt> (int)20000 && (int)zcnt == (int)1){
}
こんなんでもダメでしょうか?

asahi
記事: 8
登録日時: 5年前

Re: if文の条件を満たしているはずなのにif文を通らない

#6

投稿記事 by asahi » 5年前

かずまさん

返信おくれてすみません。

>次のように volatile を付けると、どうなりますか?

コード:

/*外部変数の定義*/
volatile uint8_t zcnt = 0;
volatile uint16_t pulsecnt = 0;
⇒volatile定義することで、if文を通りました!
volatile宣言することでコードの最適化を抑制できることができたんですね。勉強になりました。
回答してくださった方々、非常に参考になりました。ありがとうございます!

返信

“C言語何でも質問掲示板” へ戻る