TrueSTUDIOからEclipseへ乗り換える(拾遺)
今回は拾遺というとで、いくつかのトピックを取り上げます。
■浮動小数点演算について
普通にfloatやdoubleを使って演算する分には、FPUを使わないデフォルトの設定で問題ないようです。ただ、引数がfloatの関数にdoubleを渡したりすると、エラーが出ます。シェーキーのプロジェクトでは、fmod()にdoubleの変数を渡したときに起こりました。
「乗り換えガイド」に書いたように、FPUを使う設定にするとエラーはなくなります。理由はよくわかりません。
また、doubleの定義時に0以外の初期値を設定するとシリアルポートのボーレートがおかしくなると書きましたが、僕の環境でもそうならない場合もありました。どうも不思議ですが、やらないほうが無難でしょう。
■sprintfとsscanfのサンプル
サンプルプロジェクトを参考までに公開します。PA2がパソコンへの送信、PA3がパソコンからの受信でレベルコンバータを通してパソコンのCOMポートと接続します。ボーレートは9600bpsです。
プログラムは実数(10とか0.123とか)をターミナルから入力してリターンキーを押すと、"10 *2= 20"のように入力値の2倍をタイプアウトします。
ファイルサイズの関係で、srcフォルダのみ公開します。
■使い勝手
商品であるTrueSTUDIOに比べると気配りが足りません。たとえば、修正したソースを保存し忘れてビルドしてしまい、デバッグしようとして初めて「保存してないファイルがあるがどうするか?」なんて聞かれてしまいます。わかってんならビルドのとき聞けよといいたくなります。まあ、ロハだからしょうがないかとは思いますが、このへんカスタマイズできるならなんとかしたいところですね。
■コードサイズ
ツールチェインが無償版のせいか、結構大きくなります。シェーキーのソフトはTrueSTUDIOでは約60KBでしたが、こちらでは1.5倍くらいのサイズになりました。
[Project]-[Properties]-[C/C++ Build]-[Settings]でToolchainタブをクリック、Arm Sourcery Windows GCC CompilerのOptimizationをクリックして、Optimize level を Optimize(-O1)に設定してビルドすると、少し小さくなって1.2倍くらいに収まりました。これ以外のレベルを選んでもあまり変わらないようです。
« TrueSTUDIOからEclipseへ乗り換える(その3) | トップページ | 夏休みの工作・ロボクライマーをインドアで遊んでみる »
「管理人のページ」カテゴリの記事
- スパイ映画に出てきそうな高一再生検波受信機(2022.12.10)
- 「超小型」電池管再生検波ポケットラジオ(2022.11.08)
- サブミニ管5678と大型バーアンテナの再生検波ポータブル(2022.07.14)
- 電池管マイブーム到来(2022.07.01)
- グレイ・ウォルターの真空管式電子カメを作ってみる(2022.06.27)
「ロボット作ろう」カテゴリの記事
- Raspberry Pi3でturtlebotを動かしたいのだけど(2016.06.11)
- STM32F4のAD変換トラブル(その2)(2013.03.29)
- TrueSTUDIOからEclipseへ乗り換える(拾遺)(2012.07.14)
- TrueSTUDIOからEclipseへ乗り換える(その3)(2012.07.13)
- TrueSTUDIOからEclipseへ乗り換える(その2)(2012.07.07)
コメント
« TrueSTUDIOからEclipseへ乗り換える(その3) | トップページ | 夏休みの工作・ロボクライマーをインドアで遊んでみる »
はじめまして。
TrueSTUDIOが使えなくなってきたのでEclipseか何かに移そうと思ってこのブログの記事を使わしてもらっています。
一つエラーが出てしまってネットで検索しても解決できず、行き詰ってしまったので質問させてください。
乗り換えPDF v2に従って開発環境を構築したのですがLinkerが
c:/program files (x86)/codesourcery/sourcery g++ lite/bin/../lib/gcc/arm-none-eabi/4.5.2/../../../../arm-none-eabi/lib/thumb2\libc.a(lib_a-init.o): In function `__libc_init_array':
init.c:(.text+0x38): undefined reference to `_init'
というエラーを吐いて止まってしまいます。
もちろんLinkerのGeneralのところのチェックボックスはつけているのですが・・・
何か解決方法はありませんでしょうか?
投稿: Junk | 2012年10月22日 (月) 14時45分
こんにちは 管理人のササガワです。
ご質問のレポートを見ると、配列の初期化のリファレンスが受け入れられないようですね。どこかで配列の初期化に(text+0x38)という引数を持ってるところがあるんでしょうか?たぶん、そのような配列の初期化の仕方はtrueStudioではよくても、gccでは受け入れないのではないかと思われます。(スミマセン、僕も修行中の身の上、そんなにはっきりした答えはもってません)
僕はきわめて古典的に
u_int8 Buff[100];
のように配列を定義して、初期化はforループでいちいちやってます。
ご参考までに
投稿: ササガワ | 2012年10月22日 (月) 17時43分
実機テストまではやってませんんが一応コンパイルがすべて通るようにはなったので報告させて頂きます。
原因はinit.cというファイルとその中に_init()という関数がなかったことにあるようです。
ProjName/src以下にinit.cを作って命令も何も書かない void _init(){}を入れたところエラーが無くなりました。
ありがとうございました。
投稿: Junk | 2012年10月22日 (月) 23時08分