- ベストアンサー
h8/3052でsin,cos関数を使うためには?
現在h83052を用いて光量センサの値を測定するプログラムを作成し、完成するまでに至っています。その測定結果から、h8でついでにフーリエ展開した係数の結果まで表示するように現在プログラムを改良しています。 フーリエ展開の計算過程にはsin,cos関数を使用する必要があり、コンパイルのところで算術演算関数用ライブラリlibm.aをリンクする必要があります。このライブラリlibm.aというのは、クロスコンパイル環境を構築するときにインストールしたnewlibの中に含まれていると思ったのですが、h8用に構築したlibディレクトリ内にlibm.aファイルがありませんでした。構築の際に失敗したのか、もともとほかのlibm.aファイルを使用するのか、よくわかりません。 おそらく、h8用にインストールしたものを使用しないとコンパイルの際のシンボルがうまくあわないと思うので、困っているのですが・・・ どなたかわかる人がいらっしゃればよろしくおねがいします。 簡単なようで難しい感じになっています。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
肝心の環境が書いてないので憶測ですが、 > h8用に構築したlibディレクトリ内にlibm.aファイルがありませんでした。 自身で環境構築を行っているならば、--prefixで設定したディレクトリ内に --targetで指定したディレクトリが作成され、その中にlibディレクトリが できているかもしれませんね。 configure時に設定したオプションはgccの-vオプションで確認が可能です。 (無論ネイティブのではなくクロスコンパイル用のgcc) この時、--with-newlibと--with-headersの定義がなされていたか一応確認 環境構築時にnewlibのビルドとインストールを行っていればlibm.aは作成されているでしょう。 コア別、エンディアン別にディレクトリ分けされてる場合もありますが、 3052であれば300H、ビックエンディアンくらいしかないでしょうから、 探すのも容易じゃないかな。 gccのバージョンとnewlibのバージョンによってはうまく構築できないような話も伺いますので、構築時に実績のある環境を選択することも重要でしょう。
その他の回答 (3)
- bug_bug
- ベストアンサー率78% (36/46)
とりあえず、libm.a:sprintfの件は、別スレ立ってる様なので、そちらに書き込んでみました。
- bug_bug
- ベストアンサー率78% (36/46)
トラブル解決おめでとうございます。 > こんな感じでいいでしょうか。 シリアル通信の上に乗っかるプロトコル仕様の設計になりますので、 「自分でルールを決めて好きなように実装すればよい。」 ってのがきっと解答になってしまうのでしょう。 それも寂しい気がしますので割りと融通の利くサンプルでもご参考になれば。 ホストPCからの入力はHterm,TeraTerm,minicomなどの汎用シリアル通信アプリケーション。コマンドの入力はenterキー入力で完了とする。 これくらいの縛りであれば、ターゲット側で受信用のリングバッファでも用意しておき、CRの入力があった場合に、バッファ内の受信データをパーサに渡します。 パーサではstrcmpでも使ってコマンドを分類し、該当コマンドのハンドラを呼び出せば、後でいくらでもコマンドの拡張が可能です。 簡単なリモートコンソールを実装してしまうわけですね。 難易度もそれほど高くないことと、ちゃちゃっと作ってしまえば、使い回しも楽ですしデバッグ用に重宝しますよ。 やってることはプロトコルスタックの設計とか、状態遷移の実装とか必要になりますし、組み込み系ソフトウェアにとって実の多いトレーニングになると思います。
お礼
ありがとうございます。最終的には、いろいろ設定値を変更できるようにしたいので、とても参考になります。 今、フーリエ変換した値ををシリアル通信のソフト(ハイパーターミナル)などで表示できるようするために、その値を文字コードに変換して送るようにしているところです。 その変換した値がどのくらいなのかわからないので、場合わけ等が必要なのかと思っていましたら、会社の方にsprintfを使えばいいと言われました。 それは気づかなかったと思って、使ってみたら動きませんでした(^^; 型のあわせ方とかが間違っているのかな? char buf[100]; sprintf(buf,"%f",a[k]); //a[k]はフーリエ展開した係数の値(double) for(i=0;i<100;i++){ SCI_OUT_d(buf[i]); //SCI_OUT_dはシリアル送信関数 } なにかおかしいところありますか? ためしに char buf[100]; float DFTa; DFTa=(float)a[k]; sprintf(buf,"%f",a[k]); //a[k]はフーリエ転換した係数の値(double) for(i=0;i<100;i++){ SCI_OUT_d(buf[i]); //SCI_OUT_dはシリアル送信関数 } でfloat型にしてみてもそこでとまってしまいました。
- xcode_15
- ベストアンサー率18% (19/102)
参考になるかは判りませんが、下記のページで、「H8でコンパイラに数学ライブラリーが付属していない場合下記の方法で作ることができます。」とありました。 http://s8426ec.free100.tv/math.htm
お礼
回答ありがとうございます。ここに質問する前にそのページは見ましたが、自作する方法は初心者の自分としてはかなり困難であると思ったのでスルーしてしまいました。libmを構築することはできましたので、なんとかできそうです。ありがとうございました。
お礼
いつもありがとうございます。助かります。 構築の際にtargetで指定した場所にlibディレクトリはあるのですが、libmのファイルがなかったんです。。。 もう一度、newlibの構築を行ったら、できました。 gcccore-3.4.6のインストールの際についでにnewlibのインストールも行いましたが、--with-headersがついていなかったのかもしれません。 それで、算術演算関数ライブラリをリンクすることができ、フーリエ変換できるようになりました。 今度はSCI受信の機能を使用して、フーリエ変換で使用する基本周期などの値を入力できるようにしたいです。受信はできるようになりました。(エコーバックで確認)しかし、その受信した値をどのようにしようかというところで少しつまずいてしまっています。 1文字受信→配列に格納→格納した値をアスキーコードからバイナリコードに変換→各位になるように計算して基本周期として格納 こんな感じでいいでしょうか。 つまずいているところは、受信しているときに今のところ無限ループにしているので、どのように終わりにするかということです。