背景
マイクロコントローラとは?
マイクロコントローラは、1チップ上のシステムです。 あなたのコンピュータがプロセッサ、RAM、ストレージ、イーサーネットポートなど、いくつかの個別の部品で構成されている一方、マイクロコントローラはそれらの構成部品を1つの「チップ」またはパッケージに組み込んでいます。 このことにより、より少ない部品数でシステムを構築できます。
マイクロコントローラでできることは?
多くのことができます! マイクロコントローラは「組込みシステム」として知られているものの中心になる部品です。 組込みシステムはどこにでもありますが、通常それらに気づくことはありません。 組込みシステムは、衣服を洗濯したり、書類を印刷したり、食べ物を調理します。 組込みシステムは、生活し働く建物を快適な温度に保ち、自動車を走らせる部品を制御します。
ほとんどの組込みシステムはユーザーの介入なしに動作します。 洗濯機のようにユーザーインタフェースがある場合でさえ、ほとんどの動作は組込みシステムだけで完結します。
組込みシステムは物理的な処理を制御するのに、よく使われます。 そのため、組込みシステムは世界の状態を知るためのデバイス(「センサ」)と物を動かすためのデバイス(「アクチュエータ」)を持ちます。 例えば、建物の気候を制御するシステムは次のデバイスを持つでしょう。
- 複数の場所で温度と湿度を計測するためのセンサ
- ファンの速度を制御するアクチュエータ
- 建物の熱を取り込んだり排出するアクチュエータ
いつマイクロコントローラを使うべきなのでしょうか?
上述したほとんどの組込みシステムはLinuxが動いているコンピュータ(例えば「Raspberry Pi」)で実装することができます。 代わりにマイクロコントローラを使うのはなぜでしょうか? プログラムの開発がより大変に思えます。
いくつかの理由があります。
コスト。マイクロコントローラは汎用コンピュータよりずっと安価です。 マイクロコントローラは安価なだけでなく、動作に必要となる外部電気部品がずっと少ないです。 そのため、プリント基板(PCB)を小さく安価に、設計し製造できます。
消費電力。ほとんどのマイクロコントローラは本格的なプロセッサと比べるとほんの少しの電力しか使いません。 バッテリで動作するアプリケーションにとって、これは大きな違いです。
応答性。組込みシステムの中には、その目的を果たすため、常に限られた時間間隔で応答しなければならないものもあります(例えば車の「アンチロック」ブレーキシステムです)。 もしシステムがこのデッドラインに間に合わないと、悲惨な結末を迎えるでしょう。 このようなデッドラインは「ハードリアルタイム」要求と呼ばれています。 このようなデッドラインの制約がある組込みシステムは「ハードリアルタイムシステム」と呼ばれます。 汎用コンピュータと汎用OSは通常、多くのソフトウェアコンポーネントでコンピュータの処理資源を共有します。 そのため、厳密な時間制約内でのプログラム実行を保証するのが難しいです。
信頼性。より部品が少ないシステム(ハードウェアとソフトウェアの両方)では、間違いが起こりにくくなります!
マイクロコントローラを使うべきでない時はいつでしょうか?
計算量が膨大な場合です。 消費電力を低く抑えるため、マイクロコントローラは非常に限られた計算資源しか持ちません。 例えば、浮動小数点演算を提供するハードウェアすらないマイクロコントローラもあります。 そのようなデバイスでは単精度浮動小数点数の単純な加算ですら、数百CPUサイクルかかります。
CではなくRustを使う理由はなんでしょうか?
あなたが既にRustとCとの違いを知っており、ここで説得する必要がないことを願っています。 あえて1つ強調すると、それはパッケージ管理システムです。 RustにはCargoがある一方、C言語は公式の広く普及しているパッケージ管理システムがありません。 パッケージ管理システムがあることは開発を非常に楽にします。 私の意見としては、パッケージ管理が簡単であることは、コードの再利用を促進します。 なぜなら、ライブラリがアプリケーションに容易に結合できるからです。 このことは、ライブラリがより「実戦で使われる」ことにも良い影響があります。
Rustを使うべきでない理由は何でしょうか?
もしくは、RustよりCを選ぶ理由はなんでしょうか?
C言語のエコシステムはより成熟しています。 多くの問題に対して、既に解決策が存在しています。 時間制約のあるプロセスを制御する必要がある場合、既存の商用リアルタイムOS(RTOS)を選び、問題を解決することができます。 Rustにはまだ、商用で製品レベルのRTOSがないため、自分自身で作るか、開発中のものを試す必要があります。 Awesome Embedded Rustリポジトリにはそれらのリストがあります。