組み込みOS自作入門!!「番外編-なぜ標準ライブラリを使わない?」

昨日から組み込みOS自作の記事を書き始めたのですが、さっそく番外編がやってまいりました(笑)

今回は標準ライブラリを使用していないのですが、はじめてマイコンのプログラムを書いた時に、「なんでprintfが使えないんだ?」という疑問を持ったのを昨日の記事(http://d.hatena.ne.jp/kuro_m88/20101225/1293298112)に対する質問を読んで思い出したので、自分なりにまとめてみました。


標準出力先に文字列を出力するのなら、printf関数を使用するのが一般的ですし、正弦の値を出したければsin関数を使うでしょう。これらを利用したければ、newlibというライブラリを使用します。
しかし、今回はあえて使用していません。ちょっと問題があるからです。
標準ライブラリのどこが「問題」なのかというと、デカいんです。


マイコンというのは、特定用途での使用がメインです。想像しやすい例としては、家電製品でしょうか。冷蔵庫、電子レンジ、洗濯機…等です。
これらは、行うべき仕事が決まっています。それ以外の仕事はしません。(というか、できませんw)
よって、必要のない機能はどんどん削っていって、コストダウンを図ります。ということは、それらの制御に使用するマイコンの性能も必要最低限になります。
極端な例ですが、PICマイコンの入門によく使用されるPIC16F84Aというマイコンは、

  • ROM 1.75キロバイト
  • RAM 68バイト(注:キロバイトではなくバイトです)

と、非常にリソースが少ないのがわかります。


一方標準ライブラリなのですが、マイコンにとっては高機能すぎるんです。printfは、書式指定機能がありますが、浮動小数点数の処理など、結構サイズが大きそうです。
このような高機能なライブラリを使用すると、容量の小さなマイコンだったら確実にそれだけでROMが足りなくなります。ROMが足りていても、printfで%fを使用すると、スタックオーバーフローをしてしまったり、容量の問題を回避しても、動作が重くなってしまったりと…あまりいいことがありません。必要最低限のものがあれば困らないので、必要になったら機能を限定した軽量版ライブラリを使用すればいいのです。
逆に、汎用コンピュータはいろんな仕事をしなければならないので、高機能であればあるほどいいわけです。
ここが、組み込みと汎用の違いなのではないでしょうか。


もちろん、ここまでで話した内容は、性能の低いマイコンの話であって、そこそこの性能をもったマイコンならば、そんなことは気にしなくても問題は発生しません。


ちなみに、今回組み込みOS自作に使用したH8/3069Fは

  • RAM 16キロバイト
  • ROM 512キロバイト

なので、newlibは使えますが、必要になったときに使おうと思います。
坂井さんの本では、OSをフルスクラッチで作るのが目標なので、putsやputc,memcopyなどの関数は実装が簡単なので自分で作ってしまいます。そこらへんのライブラリも含めて自作ということで。
あと、僕個人の考えなのですが…自分で書いたOSより、標準ライブラリの方がその何十倍もサイズが大きかったら悲しいよなぁ…という気持ちがあるからかもしれません(笑)


坂井さんの本をひと通り終えたら、H8SX/1655を使用してkozosを自分なりに改造したものをつくろうと思っているので、その時はnewlib使うと思います。