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

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

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

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

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

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

 

  • 変なコードを書いてるか、値が入らないというのが勘違いのどちらかではないですか
  • 現象を再現できるプロジェクトをまるごと公開されると問題解決に協力してくれる方も出てくるのではないかと思います。
  • fujiaさん回答有難うございます。
    CS+ CACX V4.0400からの移植で、動作済のソースを移植して、発生した問題です。
    E1を使用したデッバグ中に、発覚しました。
    不思議な現象としては、ブレークポイントを置きシングルステップで変数の状態を確認すると値が入ります。
    PROジェクトを公開したいのですが、フォーラムでの公開方法がわかりません。ご教授ください。
  • 新規プロジェクト製作し、以下のプログラムで動作を確認しましたが同様な現象が再現しました。
    ***********************************************************************************************************************
    Pragma directive
    ***********************************************************************************************************************/
    /* Start user code for pragma. Do not edit comment generated here */
    /* End user code. Do not edit comment generated here */

    /***********************************************************************************************************************
    Global variables and functions
    ***********************************************************************************************************************/
    /* Start user code for global. Do not edit comment generated here */
    volatile uint16_t test_counter;
    /* End user code. Do not edit comment generated here */
    void R_MAIN_UserInit(void);

    /***********************************************************************************************************************
    * Function Name: main
    * Description : This function implements main function.
    * Arguments : None
    * Return Value : None
    ***********************************************************************************************************************/
    void main(void)
    {
    R_MAIN_UserInit();
    /* Start user code. Do not edit comment generated here */
    test_counter = 0;
    NOP();
    while (1U)
    {
    test_counter++;
    NOP();
    NOP();
    NOP();
    NOP();

    }
    /* End user code. Do not edit comment generated here */
    }
  • E1エミュレータの問題かもしれません。
    シュミレータでは、問題が再現しません。
  • > PROジェクトを公開したいのですが、フォーラムでの公開方法がわかりません。

    投稿するコメントを入力する際に Reply ボタンの隣の Use rich formatting をクリックするとドラッグアンドドロップ等で投稿コメントに .zip ファイルを添付できるようなります。
  • 制御CPU.zip

    プロジェックトファイルです。

    CS+ CACX開発環境ではこのような経験は有りません。CS+ CCと何か違いが有るのでしょうか。

  • tanuさん、こんにちは。NoMaYと申します。

    > シュミレータでは、問題が再現しません。

    過去、ビルド時のマイコンの型番とオンチップデバッグで実際にデバッグに使用していたマイコンの型番が違うことによる下記トラブル事例があったことを思い出しました。その辺りは大丈夫ですか?

    RL78 CS+のシュミレート と E1エミュレータ での設定の差
    japan.renesasrulz.com/cafe_rene/f/002-2095199602/6299/rl78-cs-e1

    switch 文使用時の挙動 (最適化なし時)
    japan.renesasrulz.com/cafe_rene/f/forum18/6147/switch

    もちろん、以下の点などは謎のままですけれども。(以下の1番目と2番目は上記と関連がありそうな予感はします。)

    > シングルステップで変数の状態を確認すると値が入ります。

    > 初期値を定義したら変数に値が入るようになった

    > 変数/関数配列情報の出力オプションを有効にしたら何故かしら問題が解決
     

  • NoMaYさん回答有難うございます。
    マイコン型式を確認しましたが、同じでした。

    変数/関数配列情報の出力オプションを有効にしたら何故かしら問題が解決した様に見えましたが、構造体の変数が特に変です。
    構造体のメンバーもvolatile指定しています。
    typedef struct tagWork_State { /* ステージ遷移登録テーブル */
    volatile uint8_t work_stage_no; /* 現在のワークがいるステージ */
    volatile uint8_t work_OkNg; /* 検査結果 OKorNG */
    volatile uint16_t stage_distance_count[stage_num]; /* ワーク検出からステージ1検査までの距離mm */
    // ステージ0はワーク検出ステージであるため常に0
    volatile uint16_t g_test_led_distance_count[stage_num]; // [0]照明点灯開始距離カウンタ
    // [1]照明消灯距離カウンタ
    } Work_State;

    volatile Work_State g_work_state[Work_No_num] ; /* ワークステージ状態構造体の実態 */

    起動時に、変数の初期化を行っていますが、ウオッチで確認すると初期化した値が入らないです。
    謎です。
  • tanuさん、こんにちは。NoMaYです。

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

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

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

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