ホーム フォーラム Texas Instruments マイコン C2000 数値代入の順序

このトピックには1件の返信が含まれ、2人の参加者がいます。5 年、 3 ヶ月前Yojiro Yojiro さんが最後の更新を行いました。

2件の投稿を表示中 - 1 - 2件目 (全2件中)
  • 投稿者
    投稿
  • #6345 返信

    HGTK
    参加者

    数値代入の順序

    デバイス型番:TMS320F28377SPTP

    お世話になっております。
    現在、プログラム作成を実施しておりますが、
    下記のコードにおいて、意図した動作とならず、困っております。

    //条件成立前のX = 0
    if(条件){
    Y = X ; //Xの前回値をYに保存したい
    X = 10 ; //Xに次の値を代入したい
    }

    条件成立時の結果 ⇒ Y = 10 X = 10

    プログラムの処理は上から順に実施されると思っていますが、
    2行同時に処理されているような挙動となっているように思います。

    処理の順序において、上から順番との考え方が間違っているでしょうか?
    お手数おかけしますがご教示のほどお願いいたします。

    #6346 返信
    Yojiro
    Yojiro
    従業員

    HGTKさん

    プログラムの処理につきましては、基本的には上から順に実施されますが、最適化の設定により、プログラムの順番は前後することはあります。この条件分で変数Yへ設定したあと、その後変数Yが使用されることなく、再び変数Yへ変数Xの値を代入する行がある場合、最適化によっては最初の代入により変数Yは更新された変数Xの値が入る可能性はあります。
    変数Yがauto変数の場合は、変数Y自体が、スタック領域ではなくレジスタに割り当てられることもあります。この場合、デバッグにてステップ実行でこのコードを実行直後は正しく反映して見えるのですが、数ステップ先では、別の用途で使用され値が変わって見えることもあります。

    これを防ぐためには、変数Xおよび変数Yの定義・宣言において、volatile修飾子をつけていただくことをおすすめいたします。変数の定義・宣言にてvolatile修飾子を使用いただくと、その変数に対する最適化が抑制されますので、期待する動作となることが期待できます。

    また、上記コードのみからの判断にはなりますが、コメントの記載についてもご確認いただけますでしょうか。
    C言語ではコメントの記述に2種類( “/* ~ */” と “// ~”)使用することができます。後者(”// ~”)をお使い且つ日本語(Shift-JIS)での記載の場合、文字コードに注意いただく必要がございます。Shift-JISでは、2バイト目に’\’(文字コード0x5C)が使用される文字が複数あります。この文字をコメントの最後の文字に使用されると、続く改行文字が無効となり、コンパイルエラーまたは意図しない動作の原因となります。
    コメントに”// ~ ”を使用される場合は、最後の文字にピリオド”.”を入れていただくか、文字コードをUnicodeで保存いただくことをおすすめいたします。

     

    ご確認のほど、よろしくお願いいたします。

2件の投稿を表示中 - 1 - 2件目 (全2件中)