はじめに
家電や自動車、産業機器など、大多数の製品が今やソフトウェアで制御され動いています。これらの機器内部に組み込まれて制御しているソフトウェアを組み込みソフトと呼び、機器を動かしているシステム一式(機械+回路+ソフト)を組み込みシステムと呼びます。
CPUにはマイコンが用いられています。 Windows Embeddedや組み込みLinux、Raspberry Piなども流行ではありますが、やはり主流は小型で低消費電力なマイコンです。
マイコン
マイクロコンピューターまたはマイクロコントローラーの略で、CPU・ROM・RAM・ADC・I/Oポート(GPIO)や通信機能など多くの機能を1つのICに詰め込んだ超小型のコンピューターです。通常パソコンのクロック周波数が1~3GHzなのに対し、マイコンのクロック周波数は1~200MHz程度となっています。特に高速処理が求められない機器では、20MHz以下のクロック周波数で動作しているものも数多くあります。
組み込みシステムでは大は小を兼ねません。不必要に高機能・高性能なマイコンではなく、製品の性能に合わせたマイコンを選択します。これは寸法、消費電流や発熱などの問題があるためです。また単純に、高機能・高性能なマイコンは単価が高くなります。
マイコンの構造
マイコンの構造は、概ね下図のようになっています。低機能なマイコンではRTCなど一部周辺機器(ペリフェラル)を搭載していなかったり、高機能なマイコンではROM(主にフラッシュメモリー)やRAMのサイズが大きかったり、通信機能など同一の周辺機器を複数搭載したりしています。
組み込みソフト開発の特徴
ROM・RAMサイズに制限がある
マイコンのROMとRAMサイズはとても少ないです。ROM 数十KB、RAM 数KBのマイコンが今でも最前線で使われています。 ちろん数百KBというROMやRAMを搭載したマイコンもありますが、その分高価で寸法や消費電流も大きなものになります。
特にRAMサイズの制限を強く受けることがあり、場合によっては同じアドレスのRAMを共用することもあります。またスタックメモリーの節約や処理速度を優先するためなら、関数化せずにべた書きすることもあります。パソコン向けソフトと違い、泥臭いコードを迫られることがあるのが組み込みソフトの世界です。
遅いクロック周波数で動作しなければならない
上にも記載しているとおり、マイコンのクロック周波数はパソコンなどと比べてずっと低速です。複雑な演算処理は苦手で、乗算や除算など時間のかかる計算はできる限り減らす必要があります。
また処理速度以外にも気を付けることがあります。例えばUARTのボーレートです。ボーレートはシステムクロックの分周から作成するため、低システムクロックでは狙いのボーレートが作成できないということも起こりえます。
決められた時間で動作しなければならない(リアルタイム性)
組み込みシステムでは、一定周期毎の動作を求められることが良くあります。この一定周期毎の動作を確実に行うためには、決められた時間内に処理を完了させる必要があります。これをリアルタイム性といいます。パソコンを使っていると突然処理が遅くなったり、極端な場合何秒間か操作不能に陥るようなことがあります。このようなことが許されないのが組み込みソフトの世界です。
ハードウェアに依存する部分が大きい
組み込みシステムは殆どが専用設計された機械・回路上で動作します。電源は外部から供給されることもあれば、電池駆動の場合もあります。表示器1つとっても大型(といっても5インチや7インチ)カラーLCD、キャラクターLCD、7セグメントLEDなどいろいろあり、機器の用途に合わせて使い分ける必要があります。さらに開発途中の仕様変更や部品の急な生産終了で、周辺部品が変わってしまうこともあるかもしれません。
そして最も特徴的なこととして、ハードウェアが揃うまで満足いく開発環境が整わないことです。マイコンや周辺部品のデータシートを見ながら勘と経験でコーディングを進めるものも、実際に動かしてみると思い違いで動作しないということが往々にしてあります。しかしハードウェアが揃ってからコーディングを開始していては、納期に間に合わなくなってしまいます。このため多少のリスクを考慮したうえで、開発を進める必要があります。このようにして組み込みソフト開発の現場では、納期に追われる日々が続くのです。
組み込みソフトとC言語
組み込みソフト開発で最も用いられているプログラミング言語は、C言語です。C++、Java、Python、Rustなど新しい言語も用いられていますが、まだしばらく一番はC言語でしょう。C言語がISOとANSIによって標準化されたのは1990年です。このような古いプログラミング言語が今でも組み込みソフトで用いられているのには、次のような特徴があるためです。
- 暗黙のコード生成がなく、意図したコードだけが実行される。
- ビット単位の論理演算やビットシフトを行える。
- アドレスを指定した強力なポインター演算を行える。
- 高速、軽快。
- C言語は歴史が古く、過去の資産が多くある。
- 多くのメーカーがC言語に対応した開発環境を用意している。