• ベストアンサー

関数の返す値で直接Bitをセットしてはいけないのでしょうか?

GDLでH8/3052Fのプログラムを作っています。 関数abc()は常に1を返す状態にあります。 これを無限ループで動作させたとき P6.DR.BIT.B4 = abc(); とするとP6.DR.BIT.B4 は一瞬0になった(パルスのように)あと1になります。 ところが if (abc()) P6.DR.BIT.B4 = 1; else P6.DR.BIT.B4 = 0; とするとP6.DR.BIT.B4 常に1になります。 (こちらが正しいと思いますが) プログラムそのものが悪いのか H8 CPU固有の特性によるものか悩んでいます。 教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
  • MASATO3
  • ベストアンサー率60% (27/45)
回答No.3

> とするとP6.DR.BIT.B4 は一瞬0になった(パルスのように)あと1になります。 式の実行が完了した時点でP6.DR.BIT.B4が1になっていればそれは正しい動作ではないでしょうか? (この点、Cの規格を確認したわけではないので確実な情報ではありません) > プログラムそのものが悪いのか > H8 CPU固有の特性によるものか悩んでいます。 コンパイラの特性のような気がします。 何も悪くないのではないでしょうか。 そうは言っても一瞬でも0になるのは困るという場合は、以下の選択肢が考えられます。お好みのものをどうぞ。 ・inlineアセンブラを使う(H8/3052F用コンパイラで使えるかどうかは分かりませんが)。これは確実に望みの動作を得られるでしょう。 ・コンパイラ制作者に報告して直してもらう。事前に生成されたコードを確認してから報告した方が良いでしょう。 ・自力でコンパイラを改造する。 ・釈然としないものを抱えたまま後者の書き方に変える。(たぶんこれが現実解かと思います)

その他の回答 (5)

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.6

> >(特にGCCでは)I/Oポートのビットフィールドを使うのは好ましくありません。 > これは一旦変数に出力データを格納し、それをI/Oに出力したほうがよい > という意味でしょうか? 違います。 ビットフィールドというのは、実際にどのような並びになるか、実際にリード・ライトされるときにどれだけの語長(8ビットか16ビットか32ビットかなど)でアクセスされるかは処理系に依存しますし、境界整列は不定になるからです。 ビットフィールドを最も使いたくなる用途はI/Oですが、ビットフィールドに最も適さない用途もまたI/Oなのです。

  • terra5
  • ベストアンサー率34% (574/1662)
回答No.5

基本的にプログラムが悪いのだろうと思います。 メモリマップドI/Oでビットフィールドを使っているようなら、この主のプログラムでは無謀な部類では。 コンパイラはメモリ上の変数を使うのが前提にできているでしょうから、volatileつけるとかそういう指示や使い方は使う方の責任でしょう。 余分なアクセスで結果が変わることも当たり前にありますし。

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.4

根本的に間違っていると嫌なのですが、GDLというのはベストテクノロジー製のGCC Developer Lite版のことですよね? > >P6の型定義と変数宣言 > GDLに付属しているものをそのまま使っています。 手元にGDLがないので、P6の型定義と変数宣言を見せていただかないと、どうしようもありません。volatileが付いているかどうかや、__attribute__で何か属性が付いているかどうかでも、おそらくコンパイル結果が変わるはずです。volatileが付いていなければ、#3さんの指摘どおり、正しい動作だといえます。 それに、GCCのバージョンやコンパイルオプションなども必要です。 予想ですが、型または変数の宣言がおかしいか、割り込みや別のタスクが干渉しているか、回路の設計がまずいかのどれかだと思います。 ちなみに、(特にGCCでは)I/Oポートのビットフィールドを使うのは好ましくありません。 いずれにしても、コンパイラの出力結果を見ないことには、原因の完全な特定はできないと思います。

Kuma2000
質問者

補足

回答ありがとうございます。 >根本的に間違っていると嫌なのですが、GDLというのはベストテクノロジー製の>GCC Developer Lite版のことですよね? そうです。 >(特にGCCでは)I/Oポートのビットフィールドを使うのは好ましくありません。 これは一旦変数に出力データを格納し、それをI/Oに出力したほうがよい という意味でしょうか?

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.2

次のどちらかを教えていただければ、もしかすると分かるかもしれません。 1. 該当箇所のコンパイル結果(-Sオプションを付けた場合の出力) 2. GCCのバージョン、コンパイルオプション、P6の型定義と変数宣言、および該当箇所を含む関数の全ソース そしてもうひとつ、 > P6.DR.BIT.B4 は一瞬0になった(パルスのように)あと1になります。 これはどのようにして調べましたか? デバッガで調べたのでしょうか?それともポートの出力をオシロやロジアナで調べたのでしょうか?

Kuma2000
質問者

お礼

回答ありがとうございました。 >P6の型定義と変数宣言 GDLに付属しているものをそのまま使っています。 >これはどのようにして調べましたか? オシロで測定しました。 関数から戻るタイミングに0から1になります。

回答No.1

でき上がったオブジェクトを逆アセンブルするか、リスティングファイルを出力して、マシン語レベルで調べてみては?