組み込みソフトウェアとは、一般的にコンピュータとは考えられていない機械やデバイス(組み込みシステムとも呼ばれる)を制御するために書かれたコンピュータソフトウェアのことです。通常、動作する特定のハードウェアに特化しており、時間とメモリの制約があります。 [ 1 ]この用語はファームウェアとほぼ同義で使われることもあります。[ 2 ]

組み込みソフトウェアの正確かつ安定した特徴は、すべての機能が人間インターフェースを介して開始/制御されるのではなく、機械インターフェースを介して開始/制御されるか、またはまったく開始/制御されないことである。[ 3 ]
メーカーは、自動車、電話、モデム、ロボット、家電製品、おもちゃ、セキュリティシステム、ペースメーカー、テレビ、セットトップボックス、デジタル時計などの電子機器に組み込みソフトウェアを組み込んでいます。[ 4 ]このソフトウェアは、数キロバイトのメモリを備えた8ビットマイクロコントローラ上で動作する照明制御のように非常に単純なものもあり、適切な処理複雑度は、おそらく近似的に正しい計算フレームワーク[ 5 ](ランダム化アルゴリズムに基づく方法論)によって決定されます。しかし、組み込みソフトウェアは、ルーター、光ネットワーク要素、航空機、ミサイル、プロセス制御システムなどのアプリケーションでは非常に高度になることがあります。[ 6 ]
macOS、Windows、Linuxなどのオペレーティングシステムを一般的に使用する標準的なコンピュータとは異なり、組み込みソフトウェアはオペレーティングシステムを使用しない場合があります。使用する場合は、さまざまなオペレーティングシステムから選択できますが、通常はリアルタイムオペレーティングシステムです。組み込みソフトウェアのコードは通常CまたはC++で記述されますが、 C#、Java、Python、JavaScriptなどのさまざまな高水準プログラミング言語も、マイクロコントローラや組み込みシステムを対象として一般的に使用されています。[ 7 ]アセンブリ言語も、特にブートと割り込み処理でよく使用されます。Adaは、一部の軍事および航空プロジェクトで使用されています。

ほとんどの消費者は、コンピュータ上で機能を提供するアプリケーションソフトウェアに馴染みがあります。しかし、組み込みソフトウェアは目に見えにくいものの、複雑さは劣りません。アプリケーションソフトウェアとは異なり、組み込みソフトウェアはハードウェア要件と機能が固定されており、サードパーティ製のハードウェアやソフトウェアの追加は厳しく制限されています。
組み込みソフトウェアには、製造時に必要なすべてのデバイスドライバを含める必要があり、デバイスドライバはさまざまなハードウェアデバイス用に作成されます。これらのデバイスドライバは、BSP(ボードサポートパッケージ)と呼ばれ、ハードウェア固有のドライバやその他のルーチンを含むソフトウェア層を形成し、特定のオペレーティングシステム(従来はリアルタイムオペレーティングシステム、RTOS)が特定のハードウェア環境(コンピュータまたはCPUカード)で機能することを可能にし、RTOS自体と統合されます。ソフトウェアは、選択されたCPUと特定のチップに大きく依存します。ほとんどの組み込みソフトウェアエンジニアは、少なくとも回路図の読み方と、レジスタと通信システムの使用方法を判断するためのコンポーネントのデータシートの読み方に関する基本的な知識を持っています。10進数、 16進数、2進数間の変換とビット操作の使用も役立ちます。[ 8 ]
ハードウェアの管理にはWebアプリケーションがよく用いられるが、XMLファイルなどの出力がコンピュータに渡されて表示される場合もある。一般的にはフォルダ構造のファイルシステムが使用されるが、SQLデータベースは必ずしも利用されないことが多い。
ソフトウェア開発にはクロスコンパイラの使用が不可欠です。クロスコンパイラはコンピュータ上で動作し、ターゲットデバイス用の実行可能コードを生成します。デバッグにはインサーキットエミュレータや、JTAGやSWDデバッガなどのデバッグハードウェアが必要です。ソフトウェア開発者は多くの場合、カーネル(OS)のソースコード全体にアクセスできます。
ストレージメモリと RAM のサイズは大きく異なる場合があります。一部のシステムは 16 KB の Flash と 4 KB の RAM で動作し、CPU は 8 MHz で動作しますが、他のシステムは現代のコンピュータに匹敵します。[ 9 ]これらのスペース要件により、C ++ ではなく、 C または組み込み C ++でより多くの作業が行われるようになります。BASICのようなインタプリタ型言語(たとえばParallax Propeller はコンパイル済み BASIC を使用できます) やJava (Java ME Embedded 8.3 [ 10 ]は、たとえばARM Cortex-M4、Cortex-M7マイクロコントローラ、およびRaspberry PiやIntel Galileo Gen. 2で使用されている古いARM11で使用できます) は一般的に使用されていません。ただし、インタプリタ型Python 3 言語の実装であるMicroPythonは、マイクロコントローラでの使用のために特別に用意されており、たとえば32 ビットARMベース (BBC micro:bitなど) および16 ビットPIC マイクロコントローラで使用できます。
プロセッサ間、およびプロセッサと他のコンポーネント間の通信は不可欠です。直接メモリアドレッシングの他に、ハードウェアレベルで一般的なプロトコルには、I²C、SPI、シリアルポート、1-Wire、イーサネット、USBなどがあります。
組み込みシステムでの使用を想定して設計された通信プロトコルは、InterNiche TechnologiesやCMX Systemsなどの企業からクローズドソースとして提供されている。オープンソースのプロトコルは、uIP、lwipなどから派生している。