H8SX/1655マイコンで、 グローバル変数が動作しなくて困っています。 周りの人に聞いても原因がわからず、ネットにも解決策を見つけれず 藁をもすがる気持ちで投稿します。 どうか皆様のお知恵をお貸しください。

ファイナルファンタジー1,092閲覧xmlns="http://www.w3.org/2000/svg">100

ベストアンサー

0

ThanksImg質問者からのお礼コメント

本ご指摘の結果、グローバル変数が機能するようになりましたので、 本回答をベストアンサーとさせて頂きます。 どうもありがとうございます。 PS。。本誌、P65(5章図3)に該当記述がありました事を明記致します。 >quickbrwnfoxjumpsoverthelazydog様 >waterproofsugar様 ご回答ありがとうございます。 ウェイト部分のご指摘ですが、最適化の影響を受けていたことがわかりましたので、報告させて頂きます。

お礼日時:2012/7/8 19:11

その他の回答(2件)

0

コンパイル結果をアセンブリリストで出力して,比べてみれば何か分かると思います。 wait 効いてますか? 最適化の結果ごっそり削除されているかもしれません。 volatile unsigned long i; にすれば良いかも。 本当にローカル/グローバルの違いなのか, if 文の位置が関係しているのかも興味があります。 if 文ではなく,#if ~ #else ~ #end を使った場合はどうか? とかとか。

1

ソースで見る分には問題無さそうだねぇ。 この手の話はちょっとした記述ミスとかオブジェクトの取り違えとかの単純ミスであるパターンが多いんだけど... 試してみるとすれば、 ・アセンブルリストを出力して動作を追ってみる。 ・切り替えで変わる部分を可能な限り少なくして試す。例えば、 /* 以下一文をコメントアウトすればローカル */ #define GLV #ifdef GLV volatile unsigned long count=0; /* グローバル変数は0に初期化されることが決まっているけど気になるならおまじない */ #endif void main(void){ unsigned long i; #ifndef GLV volatile unsigned long count=0; #enidf PM.DDR = PM.DDR |0x08; PM.DR.BIT.B3 = 0; count=0; glv_count=0; while(1) { for (i = 0; i < 100000; i++); //wait count++; if(count>20){ PM.DR.BIT.B3 = ~PM.DR.BIT.B3;} //invert LED_state if(count>30){ count=0;} } } だったらどうなるか、とか。

1人がナイス!しています