rx-elf-gccでprintf等のライブラリを使う
rx-elf-gccでprintf等のライブラリを使うことができるようになりました。
printfは内部でmallocを使っているので、mallocが使えるようにしなければなりません。
mallocを使えるようにするためには、sbrkという関数を作る必要があります。
また、printfは、writeなどの低レベルな関数を使ってstdoutに出力します。
作る必要があるのは、sbrk、open、read、write、lseek、isatty、fstat、closeの各関数です。そして、writeの中でSCIに向けて1文字ずつ出力するような処理をすれば、printfの結果をシリアルポートに出力することができるようになります。
また、リンカで-lc -lgcc -lmのオプションをつけ、-L/usr/local/tkdn-20110507/rx-elf/rx-elf/lib/ -L/usr/local/tkdn-20110507/rx-elf/lib/gcc/rx-elf/4.6.0/とパスを通せば、ひととおりのライブラリ関数が使えるようになります。
三角関数の計算と、unsigned long long型を実験してみました。printfのソースコードを見たらlong long型がサポートされていたので、試したくなりました。
実行結果はこんな感じです。
このGCCとprintfのサンプルアプリケーションを、こちらのURLにおいておきます。
GCCを使う際の雛型にしていただければと思います。
http://www.tokudenkairo.co.jp/rx62n/#download
(※リンカスクリプトをちゃんと作っていないので、まだROMからの起動はできません。RAM上へロードして実行してください)
なお、printfを使うとサイズが20kBくらい増えます。
上のサンプルアプリ中のtkdn_sci.cは、iodefine.hを参照していないので、GCCでもルネサスCコンパイラでもどちらでもコンパイルできると思います。
| 固定リンク
コメント
printf()系はサイズ大きいですね。
昔sprintf使う際に節約のため機能限定版作ったりしてました。%dのみ対応とかならかなり小さくなった覚えがあります。
投稿: 柊 | 2011.05.11 19:10
はい。printfは大きいです。+20KBが無視できない場合もありますね。コンパクトな機能限定printfの標準的なものがあるといいですね。
投稿: なひたふ | 2011.05.12 03:31
newlibならiprintf/siprintfを使うと浮動小数点サポートがバッサリ外れます。
また、ビルド時に--disable-newlib-io-long-longでlong longサポートを、--disable-newlib-io-floatでprintf自体から浮動小数点サポートを外せます。
投稿: kikairoya | 2011.05.14 13:39