組込みベースのC++って何?
高木です。おはようございます。
今回は久々に朝に投稿することにしました。
どちらかといえば朝に投稿するほうが好きなんですが、以前は私ばかりが投稿する状況になっていましたので19時投稿に改めた経緯があります。
今は吉田を中心に他のスタッフが頑張って投稿してくれていますので、朝に戻しても問題ないでしょう。
さて、今回の話題は「組込みベースのC++って何?」です。
このフレーズは、昨日馬詰から聞いたものですが、わかるようでわからないフレーズですね。
私の場合、『組込み現場の「C++」プログラミング 明日から使える徹底入門』という著書もあったりするわけで、この話題については言及しておかないわけにはいかないと思いました。
先ほどの著書ですが、現在は弊社サイトで全文を公開しています。
興味のある方は覗いてみてください。
その著書はもう9年も前のものです。
当時は今と比べて、組込みでC++を使うことはそんなに多くありませんでした。
現在はといえば、結構当たり前のようにC++が使われているように思います。
そういえば自動車業界なんかのAUTOSARではC++11が使われると聞いています。
そんなわけで、上記の本の内容は古くなってしまった部分も少なくありません。
C++11以前の出版ということもありますしね。
組込みでC++を使うといっても、いろいろなケースが考えられます。
今回はそのうちの代表的なものについて考察してみることにします。
ひとつはWindowsやLinuxを使う場合です。
組込みでもWindowsやLinuxを使う場合が普通にあります。
この場合、基本的にはPCのプログラムと同じなのですが、いわゆる業務系の開発とは異なる点に気を付けなければならないなど、組込み特有のノウハウが必要になることがあります。
Raspberry Piなんかも普通はLinuxが動きますので、この範疇に含まれますね。
もうひとつは、いかにも組込みらしいマイコンボードを使う場合です。
多くは、μITRONなどのリアルタイムOSを使っていますが、ベアメタル(OSがなく直接ハードウェアを制御する環境)の場合も少なくありません。
いずれにしても、CやC++では「フリースタンディング環境」に分類されるもので、PCなどの「ホスト環境」と比べると大きな制約があります。
「フリースタンディング環境」ではどんな制約(というか特徴)があるかというと、まずプログラムの開始がmainとは限りません。
mainではなく、処理系定義の関数から始まることになっています。
もちろん、それがmainの場合もありますけど。
マイコンの場合、ハード的にリセットがかかった直後に呼び出されるスタートアップルーチンから自分で書くことも少なくありません。
そこでは、スタックポインタの設定、割り込みベクタテーブルの設定、DRAMの初期設定などハードウェアの設定を行ったあと、静的オブジェクトの静的初期化(コンストラクタを呼ぶ前のゼロクリアなど)を行います。
「フリースタンディング環境」のもうひとつの制約は、サポートされる標準ライブラリが非常に制限されることです。
C++の最新版であるC++17では昔のC++に比べてライブラリがかなり拡充されましたが、「フリースタンディング環境」でサポートされるのは以下のものだけです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | <ciso646> <cstddef> <cfloat> <limits> <climits> <cstdint> <cstdlib> <new> <typeinfo> <exception> <initializer_list> <cstdarg> <type_traits> <atomic> <cstdalign> <cstdbool> |
<cstdlib>があるだけマシのように思うかもしれませんが、フルスペックでサポートされるわけではなく、exit関数など一部しかサポートされません。
また、標準規格からははずれるのですが、現実には例外処理や実行時型識別(RTTI)も使えないことが多々あります。
こんな感じで、ホスト環境とはかなり勝手が違うのです。
ほかにもいろいろあるのですが、今回はこれぐらいにして、続きは別の機会にしたいと思います。