« rx-elf-gccでのアプリの作成方法 | トップページ | rx-elf-gccの問題点 »

2011.05.11

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型がサポートされていたので、試したくなりました。

実行結果はこんな感じです。
Rxgccprintf

このGCCとprintfのサンプルアプリケーションを、こちらのURLにおいておきます。
GCCを使う際の雛型にしていただければと思います。
http://www.tokudenkairo.co.jp/rx62n/#download

(※リンカスクリプトをちゃんと作っていないので、まだROMからの起動はできません。RAM上へロードして実行してください)
なお、printfを使うとサイズが20kBくらい増えます。

上のサンプルアプリ中のtkdn_sci.cは、iodefine.hを参照していないので、GCCでもルネサスCコンパイラでもどちらでもコンパイルできると思います。

|

« rx-elf-gccでのアプリの作成方法 | トップページ | rx-elf-gccの問題点 »

コメント

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

コメントを書く



(ウェブ上には掲載しません)




« rx-elf-gccでのアプリの作成方法 | トップページ | rx-elf-gccの問題点 »