RX62T 実行されないコード

お世話になります。SYOUです。

RX62Tでソフトを作っていて、作成したコードにアドレスが割り当てられず、ブレークポイントを置けなくて困っているので投稿させてもらいます。(開発環境はCS+になります)

下に簡単に関数を書いたのですがこの関数をCS+でビルドしてみたところPos=i;のところにアドレスが表示されず、ブレークポイントが設置できません。

関数の内容をほかのところに直接書いた場合にはアドレスも表示され、ブレークポイントの設定もできました。

似たような状況になったことのある方いらっしゃいましたらお知恵をお借りしたいです。

 

void f(uint_16 j ,uint_8 k ,uint_32 Pos ){

 uint_16 i;

 for(m=0; j<10; m++){

  if( (box[ m ]==j) && (k==1) ){

    Pos = i;

  }

 }

}

Parents
  • わわいです。

    Posという変数が代入されるだけで参照されないため、コンパイラの最適化でその命令が削除されてますね。

    #また、変数 i に値が入ってません

    これをどーにかするには、お使いのコンパイラの設定で、最適化を「なし」にするか、「デバッグ用」、にするかしてコンパイルし直してみればいいです

  • void f(uint_16 j ,uint_8 k ,uint_32 Pos ){
    
     uint_16 i;
    
     for(m=0; j<10; m++){
    
      if( (box[ m ]==j) && (k==1) ){
    
        Pos = i;
    
      }
    
     }
    
    }
    
    • 引数 j の値がループ内で変化しないため、j<10 の条件が成り立つ場合には無限ループとなります
    • ループ変数 m を使用されていますが関数内に変数宣言がなく大域変数を使用されてるのかと思われますが、大域変数に短い名前を使用したり局所的用途に使用するのはバグの元です
    • ループ内で条件に一致した場合、引数 Pos に未初期化変数 i の値を代入されてますが、Pos で関数の外に結果を返したいのであれば、Pos の型は参照型にすべきと思われます。変数 i の値が未初期化で Pos に代入してるのも気になります

    CS+ の挙動以前の話として、書かれてるプログラムの見直しをお勧めします。

  •  どのようにアセンブラに変換されたのか見たらどうですか。

  • わわいさん

    最適化を「なし」にしてコンパイルをしたら治りました。ありがとうございました。

    fujitaさん

    簡単にしようとして大部分を削ったつもりだったのですが、そのせいでよくわからないソフトになってしまっていました。すいません。

    Posの型はそのままなので参照型への変更を考えたいと思います。

    リカルドさん

    混合状態で確認してみたのですがよくわからないところに飛んでしまっていて理解できなかったので、何かヒントになればと思い、質問させてもらいました。

    (アセンブラが詳しくないせいなのですが…)

    追加の質問になりますが、最適化をそのままの状態にして治す方法などはあるのでしょうか?

    なるべくならば今までの最適化レベルでプログラムを進めていきたいと考えているのでもしできるのであれば教えていただきたいです。

Reply
  • わわいさん

    最適化を「なし」にしてコンパイルをしたら治りました。ありがとうございました。

    fujitaさん

    簡単にしようとして大部分を削ったつもりだったのですが、そのせいでよくわからないソフトになってしまっていました。すいません。

    Posの型はそのままなので参照型への変更を考えたいと思います。

    リカルドさん

    混合状態で確認してみたのですがよくわからないところに飛んでしまっていて理解できなかったので、何かヒントになればと思い、質問させてもらいました。

    (アセンブラが詳しくないせいなのですが…)

    追加の質問になりますが、最適化をそのままの状態にして治す方法などはあるのでしょうか?

    なるべくならば今までの最適化レベルでプログラムを進めていきたいと考えているのでもしできるのであれば教えていただきたいです。

Children
No Data