CS+ cc V8.04.00 r_main.c グロバール定義の変数に値が入らない

ターゲットRL78/G13で発生した問題ですが・・・・

R_main.cで定義したグローバル変数に値が入らない問題が発生して、頭を抱えていました。

定義した変数は、volatile uint16_t 型の1次元配列です。初期値を定義したら変数に値が入るようになった。(変な話です)

マップファイルの内容を確認する為に、変数/関数配列情報の出力オプションを有効にしたら何故かしら問題が解決ししました。

経験のある方は、おられませんか。

 

Parents
  • tanuさん、こんにちは。NoMaYです。

    そうでしたか。大丈夫でしたか。以下の情報から考えると、私の場合、次のようなステップを踏むかと思います。

    > 起動時に、変数の初期化を行っていますが、ウオッチで確認すると初期化した値が入らないです。

    (0) 変数の初期化を行っている部分を、逆アセンブルウィンドウでステップ実行して、コードの動作を把握する
    (1) メモリに書いている命令(変数の初期化)の実行後、書き込んだアドレスのメモリの内容をメモリウィンドウで調べる
    (2) メモリの内容が期待した値でなければ、メモリウィンドウ上で値を変更出来るか調べる
    (3) メモリウィンドウ上で値を変更出来たなら、メモリに書いている命令のステップ実行でメモリの値が書き込んだ値にならない点にフォーカスした画面コピーを投稿する
    (4) メモリの内容が期待した値であれば、メモリウィンドウとウォッチウィンドウの表示が合わない点にフォーカスした画面コピーを投稿する
    (5) メモリウィンドウ上で値を変更出来なかったら、画面コピーを投稿する前に、何が起きていそうか再度考えてみる

    既に調べられているかも知れないですけど、画面コピーを見てみないと、うまく状況把握出来ないです。

  • NoMaYさん、tanuです。

    ステップ実行で、確認すると構造体変数に値が入りますが、ループ終了でブレークし確認すると値が入りません。ウオッチの値を直接変更は可能です。また、メモリの内容もステップでは変わっていますが、構造体配列の場合に問題が発生します。通常の配列は、初期化されます。

    g_work_state[0]がステップ実行後の変数値で、g_work_state[1]以降がforループ終了時の変数値です。

    g_test_led_off_distance_count[]の配列は、問題なく初期化されます。

  • tanu様
    鈴木と申します。定義している変数に volatileをつけるとどうなるでしょうか
    代入しかしていない変数ですと、コンパイラの最適化によっては
    省略されることもあります。以上、よろしくお願いします
  • 回答有難う御座います。
    全ての変数に、volatileは必ず付けています。
    最適化は、嫌な経験が有りますので、コンパイラオプションも外しています。
Reply
  • 回答有難う御座います。
    全ての変数に、volatileは必ず付けています。
    最適化は、嫌な経験が有りますので、コンパイラオプションも外しています。
Children
  • tanu様、回答ありがとうございます。コード生成をお使いですね。
    変数の初期化を R_Systeminit()関数内で行っていないでしょうか?
    このハードウェア関連の初期化を行った後にRAMの初期化が実行されるので
    変数もクリアされます。(cstart.asm をご参照ください)
    以上、よろしくお願いします