亀井です
過去の辛い記憶がよみがえってきました。
> 藤原と申します。
> オフトピックですが……
>
>
> 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 など使うなとつっこまれそうですが。
}