
現在h83052を用いて光量センサの値を測定するプログラムを作成し、完成するまでに至っています。その測定結果から、h8でついでにフーリエ展開した係数の結果まで表示するように現在プログラムを改良しています。
フーリエ展開の計算過程にはsin,cos関数を使用する必要があり、コンパイルのところで算術演算関数用ライブラリlibm.aをリンクする必要があります。このライブラリlibm.aというのは、クロスコンパイル環境を構築するときにインストールしたnewlibの中に含まれていると思ったのですが、h8用に構築したlibディレクトリ内にlibm.aファイルがありませんでした。構築の際に失敗したのか、もともとほかのlibm.aファイルを使用するのか、よくわかりません。
おそらく、h8用にインストールしたものを使用しないとコンパイルの際のシンボルがうまくあわないと思うので、困っているのですが・・・
どなたかわかる人がいらっしゃればよろしくおねがいします。
簡単なようで難しい感じになっています。
No.2ベストアンサー
- 回答日時:
肝心の環境が書いてないので憶測ですが、
> h8用に構築したlibディレクトリ内にlibm.aファイルがありませんでした。
自身で環境構築を行っているならば、--prefixで設定したディレクトリ内に
--targetで指定したディレクトリが作成され、その中にlibディレクトリが
できているかもしれませんね。
configure時に設定したオプションはgccの-vオプションで確認が可能です。
(無論ネイティブのではなくクロスコンパイル用のgcc)
この時、--with-newlibと--with-headersの定義がなされていたか一応確認
環境構築時にnewlibのビルドとインストールを行っていればlibm.aは作成されているでしょう。
コア別、エンディアン別にディレクトリ分けされてる場合もありますが、
3052であれば300H、ビックエンディアンくらいしかないでしょうから、
探すのも容易じゃないかな。
gccのバージョンとnewlibのバージョンによってはうまく構築できないような話も伺いますので、構築時に実績のある環境を選択することも重要でしょう。
いつもありがとうございます。助かります。
構築の際にtargetで指定した場所にlibディレクトリはあるのですが、libmのファイルがなかったんです。。。
もう一度、newlibの構築を行ったら、できました。
gcccore-3.4.6のインストールの際についでにnewlibのインストールも行いましたが、--with-headersがついていなかったのかもしれません。
それで、算術演算関数ライブラリをリンクすることができ、フーリエ変換できるようになりました。
今度はSCI受信の機能を使用して、フーリエ変換で使用する基本周期などの値を入力できるようにしたいです。受信はできるようになりました。(エコーバックで確認)しかし、その受信した値をどのようにしようかというところで少しつまずいてしまっています。
1文字受信→配列に格納→格納した値をアスキーコードからバイナリコードに変換→各位になるように計算して基本周期として格納
こんな感じでいいでしょうか。
つまずいているところは、受信しているときに今のところ無限ループにしているので、どのように終わりにするかということです。
No.3
- 回答日時:
トラブル解決おめでとうございます。
> こんな感じでいいでしょうか。
シリアル通信の上に乗っかるプロトコル仕様の設計になりますので、
「自分でルールを決めて好きなように実装すればよい。」
ってのがきっと解答になってしまうのでしょう。
それも寂しい気がしますので割りと融通の利くサンプルでもご参考になれば。
ホスト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型にしてみてもそこでとまってしまいました。

No.1
- 回答日時:
参考になるかは判りませんが、下記のページで、「H8でコンパイラに数学ライブラリーが付属していない場合下記の方法で作ることができます。
」とありました。http://s8426ec.free100.tv/math.htm
回答ありがとうございます。ここに質問する前にそのページは見ましたが、自作する方法は初心者の自分としてはかなり困難であると思ったのでスルーしてしまいました。libmを構築することはできましたので、なんとかできそうです。ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
” OS ビルド ” の意味が分か...
-
<math.h>があるのにsqrtが・...
-
エクセルVBAではRound...
-
h8/3052でsin,cos関数を使うた...
-
「fatal error C1189」を回避す...
-
C言語のコンパイルができません
-
C言語でヘッダファイルにグロー...
-
コンパイルエラー:ユーザ定義...
-
PRO*C コンパイルエラー
-
動的な変数名のつけ方について
-
うまくコンパイルできません
-
cygwinのgccが、エラーになって...
-
LoadLibraryについて
-
複数のサブディレクトリを一緒...
-
1 つ以上の複数回定義されてい...
-
C言語でmからnまでの合計を求め...
-
セミコロンについて
-
マクロ コンパイルがグレーバック
-
漢字のコメントをはずすとコン...
-
リッチエディットのやり方が解...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBAを何回も作り直して、容量が...
-
” OS ビルド ” の意味が分か...
-
「fatal error C1189」を回避す...
-
C言語でヘッダファイルにグロー...
-
エクセルVBAではRound...
-
Makefile作成時の拡張子.oとは?
-
ILSpyで、デコンパイルできない。
-
1 つ以上の複数回定義されてい...
-
マクロ コンパイルがグレーバック
-
セミコロンについて
-
外部シンボル "_main"は未解決です
-
C++コンパイル時に『 C1083: in...
-
ビルドとリビルドの違いを教え...
-
コンパイルエラー:ユーザ定義...
-
「DeclareステートメントにPtrS...
-
戻り値について
-
pyc 編集 閲覧
-
PRO*C コンパイルエラー
-
【VC++6.0(MFC)】警告「LINK : ...
-
漢字のコメントをはずすとコン...
おすすめ情報