ページ 1 / 1
if文の条件を満たしているはずなのにif文を通らない
Posted: 2018年6月20日(水) 22:24
by asahi
仕事で組み込み系のプログラムをしています。現在困っている現象に出くわしてしまいました。
現象:下記コードにおいて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文を通らない
Posted: 2018年6月21日(木) 00:45
by かずま
asahi さんが書きました: ↑7年前
if文の前でブレイクポイントを張って変数を確認するとpulsecnt=20010、zcnt = 1にセットされています。しかし
if文をとおりません。
ブレイクポイントで止まった後、ステップ実行しても、
{ /*処理文*/ } に行かないのですか?
それとも、処理文にもブレイクポイントを設定しているけれど、
そこでは停止しないということですか?
次のように volatile を付けると、どうなりますか?
コード:
/*外部変数の定義*/
volatile uint8_t zcnt = 0;
volatile uint16_t pulsecnt = 0;
asahi さんが書きました: ↑7年前
仮説:外部割込みで使用した変数の値が変わっていも、main文には反映されない
main は、文ではなく、関数です。
Re: if文の条件を満たしているはずなのにif文を通らない
Posted: 2018年6月21日(木) 23:01
by Dixq (管理人)
ブレイクポイントで止めた時はその値でも、別スレッドで値が書き換わることはないのでしょうか。
もしくは、Releaseコンパイルになっていてデバッガで見ている値が不正になっているようなことはありませんか?
仮説について、具体的なコードは分かりませんが、値の参照が正しく、if文の直前で書き換わっているならmain文の中だろうとどこだろうと繁栄されています。
参照不可能なスコープから参照するようなコードがあればコンパイルエラーになるはずです。
Re: if文の条件を満たしているはずなのにif文を通らない
Posted: 2018年6月22日(金) 10:04
by usao
zcnt++;
を2回通ればもうそのifの条件を満たさなくなるわけですが
単に割り込みが連続発生しているとかいう事は無いのでしょうか.
(試しに zcnt++ ではなく zcnt=1 にしてみてもダメ?)
Re: if文の条件を満たしているはずなのにif文を通らない
Posted: 2018年6月28日(木) 07:38
by damon500
if((int)pulsecnt> (int)20000 && (int)zcnt == (int)1){
}
こんなんでもダメでしょうか?
Re: if文の条件を満たしているはずなのにif文を通らない
Posted: 2018年7月14日(土) 11:44
by asahi
かずまさん
返信おくれてすみません。
>次のように volatile を付けると、どうなりますか?
コード:
/*外部変数の定義*/
volatile uint8_t zcnt = 0;
volatile uint16_t pulsecnt = 0;
⇒volatile定義することで、if文を通りました!
volatile宣言することでコードの最適化を抑制できることができたんですね。勉強になりました。
回答してくださった方々、非常に参考になりました。ありがとうございます!