[H8-ML(5567)] Re:最適化条件で動作が変わる場合(Re: 使えるCコンパイラ)
From: "kazuaki kamei" <kkamei@xxxxxxxxxxxxxxxxx>
Date: 2005年05月23日(月)15時19分12秒
亀井です 

過去の辛い記憶がよみがえってきました。

> 藤原と申します。
> オフトピックですが……
>
>
> This message is reply to Takehiro Amaike - san
> (Subject was : [H8-ML(5561)] Re: 使えるCコンパイラ)
>
> Message-ID: <20050523024039.4250.ML@xxxxxxxxxx>
> in Mon, 23 May 2005 02:53:38 +0900 ...
>
>> GCCを使って思ったのは、最適化に微妙にバグがあるような気がする事です。
>> 最適化の方法を変更すると全く動かなくなったりと何か変な感じです。
>
>  GCC は使ったことがないので、「一般論」ですが、最適化の方法で動いたり
> 動かなかったりするというのは、変数やポインタの初期化が適切に行われてい
> ないことを反映している場合があります。

もっと具体的に言うとこういう事ですよね。
私も、今よりも初心者の頃(今でも大して進歩していません)にはまりました。
0x900番地のポートにパルス出力を出してモータ動かしたのですが 
volatileを付けないと規則性のない動きをして原因をつかむのに苦労しました。
なにせ、動く事もあるので、最適化の原因になかなか気が付きませんでした。 
書き方によって、展開されたアッセンブラを見ると、変数Aに1ループで
1回しか書き込んでいませんでした。 GCCのバグだと当時思っていました。

//#define A    *(volatile unsigned int  *)(0x900)    //うまく動く
#define A    *(unsigned int  *)(0x900)   // maim の書き方次第で動かない

int main(void)
{
loop:
     A=1;
  nr_delay(10);
     A=0;
  nr_delay(10);
     A=1;
  nr_delay(10);
     A=0;
  nr_delay(10);
 goto loop;     //GOTO など使うなとつっこまれそうですが。
} 

スレッド概略
[5549(R)](起点)
 └[5564(U)]
   └[表示中]


投稿順に移動
[←前の記事へ(P)]
[→次の記事へ(N)]


リスト表示へ
[このスレッド(T)]
[本記事の前後(L)]