
組み込みシステムとは、コンピュータプロセッサ、コンピュータメモリ、入出力周辺機器の組み合わせからなる特殊なコンピュータシステムであり、より大きな機械システムまたは電子システム内で専用の機能を持つ。[ 1 ] [ 2 ]これは、多くの場合、電気または電子ハードウェアと機械部品を含む完全なデバイスの一部として組み込まれている。
組み込みシステムは、一般的に使用されている多くのデバイスを制御しています。[ 3 ] 2009年製造されたマイクロプロセッサの98%が組み込みシステムで使用されていると推定されている。[ 4 ]組み込みシステムは通常、それが組み込まれる機械の物理的な動作を制御するため、リアルタイム処理に関する制約を受けることが多い。
現代の組み込みシステムは、多くの場合マイクロコントローラ(すなわち、メモリと周辺インターフェースを内蔵したマイクロプロセッサ)をベースとしていますが、特に複雑なシステムでは、通常のマイクロプロセッサ(メモリと周辺インターフェース回路に外部チップを使用)も一般的です。いずれの場合も、使用されるプロセッサは、汎用から特定の種類の計算に特化したもの、あるいは対象となるアプリケーションに合わせてカスタム設計されたものまで、さまざまな種類があります。専用プロセッサの一般的な標準クラスは、デジタル信号プロセッサ(DSP)です。組み込みシステムは特定のタスクに特化しているため、設計エンジニアはそれを最適化して製品のサイズとコストを削減し、信頼性とパフォーマンスを向上させることができます。一部の組み込みシステムは大量生産されており、規模の経済の恩恵を受けています。
組み込みシステムは、デジタル時計やMP3プレーヤーなどの携帯型パーソナルデバイスから、家電製品、産業用組立ライン、ロボット、輸送車両、信号機制御装置、医療画像システムなどの大型機器まで、幅広い規模に及びます。多くの場合、航空機の航空電子機器や宇宙船の宇宙電子機器のように、他の機器のサブシステムを構成します。工場、パイプライン、電力網などの大規模設備は、複数の組み込みシステムがネットワークで接続されて稼働しています。プログラマブルロジックコントローラなどの組み込みシステムは、ソフトウェアのカスタマイズによって汎用化され、多くの場合、その機能ユニットを構成します。
マイクロプロセッサとマイクロコントローラの起源は、1960年代初頭に開発されたMOSFET(金属酸化膜半導体電界効果トランジスタ)から作られた集積回路チップであるMOS集積回路に遡ることができます。1964年までに、MOSチップはバイポーラチップよりも高いトランジスタ密度と低い製造コストを達成しました。MOSチップはムーアの法則で予測された速度でさらに複雑化し、1960年代後半には1つのMOSチップ上に数百個のトランジスタを持つ大規模集積回路(LSI)につながりました。MOS LSIチップのコンピューティングへの応用は、エンジニアが完全なコンピュータプロセッサシステムを複数のMOS LSIチップに収めることができると認識し始めたことから、最初のマイクロプロセッサの基礎となりました。[ 5 ]
最初のマルチチップマイクロプロセッサは、 1969年のFour-Phase Systems AL1と1970年のGarrett AiResearch MP944で、複数のMOS LSIチップを使用して開発されました。最初のシングルチップマイクロプロセッサは、1971年にリリースされたIntel 4004です。これは、 Federico Fagginが自身のシリコンゲートMOS技術を使用して、 IntelのエンジニアであるMarcian HoffとStan Mazor、およびBusicomのエンジニアである島正敏とともに開発しました。[ 6 ]
現代の組み込みシステムとして認識できる最初のものの1つは、1965年頃にMIT計測研究所のチャールズ・スターク・ドレイパーによって開発されたアポロ誘導コンピュータ[ 7 ]でした。プロジェクト開始当初、アポロ誘導コンピュータは、コンピュータのサイズと重量を削減するために当時新しく開発されたモノリシック集積回路を使用していたため、アポロ計画の中で最もリスクの高いものと考えられていました。
初期の量産型組み込みシステムとしては、 1961年に発売されたミニットマンミサイル用のオートネティクス社製D-17誘導コンピュータが挙げられる。1966年にミニットマンIIの生産が開始されると、D-17は集積回路を初めて大量生産に採用した新型コンピュータに置き換えられた。
1960年代の初期のアプリケーション以来、組み込みシステムの価格は下がり、処理能力と機能は劇的に向上しました。初期のマイクロプロセッサであるIntel 4004(1971年発売)は、電卓などの小型システム向けに設計されましたが、それでも外部メモリとサポートチップが必要でした。1980年代初頭には、メモリ、入出力システムコンポーネントがプロセッサと同じチップに統合され、マイクロコントローラが形成されました。マイクロコントローラは、汎用コンピュータではコストが高すぎる用途で使用されています。マイクロプロセッサとマイクロコントローラのコストが下がるにつれて、組み込みシステムの普及が進みました。
比較的低コストのマイクロコントローラは、多数の個別部品と同じ役割を果たすようにプログラムできます。マイクロコントローラの登場により、高価なポテンショメータや可変コンデンサなどのノブ式アナログ部品を、マイクロプロセッサで読み取る上下ボタンやノブで置き換えることが可能になり、民生品においてもその代替が可能になりました。このような組み込みシステムは、従来型のソリューションよりも複雑になる傾向がありますが、その複雑さの大部分はマイクロコントローラ自体に集約されています。必要な追加部品はごくわずかで、設計作業の大部分はソフトウェアに集中します。組み込みプロセッサを使用しない新しい回路の設計・構築と比較すると、ソフトウェアのプロトタイプ作成とテストはより迅速に行えます。

組み込みシステムは、一般消費者向け、産業用、自動車用、家電製品、医療機器、通信機器、商業用、航空宇宙用、軍事用など、幅広い用途で一般的に使用されています。
電気通信システムは、ネットワーク用の電話交換機からエンドユーザーの携帯電話に至るまで、数多くの組み込みシステムを採用している。コンピュータネットワークは、専用のルーターとネットワークブリッジを使用してデータをルーティングする。
家電製品には、 MP3プレーヤー、テレビ、携帯電話、ゲーム機、デジタルカメラ、GPS受信機、プリンターなどがあります。電子レンジ、洗濯機、食器洗い機などの家庭用電化製品には、柔軟性、効率性、および機能を提供する組み込みシステムが搭載されています。高度な暖房、換気、空調(HVAC)システムは、ネットワーク接続されたサーモスタットを使用して、時間帯や季節によって変化する温度をより正確かつ効率的に制御します。ホームオートメーションは、照明、空調、セキュリティ、オーディオ/ビジュアル、監視などを制御するために使用できる有線および無線ネットワークを使用します。これらはすべて、センシングと制御のために組み込みデバイスを使用しています。
航空機から自動車に至るまで、輸送システムでは組み込みシステムがますます利用されるようになっている。新型航空機には、慣性誘導システムやGPS受信機などの高度な航空電子機器が搭載されており、これらには相当な安全要件も課せられている。宇宙船は軌道修正のためにアストロニクスシステムに依存している。ブラシレスDCモーター、誘導モーター、DCモーターなど、さまざまな電気モーターは電子モーターコントローラーを使用している。自動車、電気自動車、ハイブリッド車は、効率を最大化し、汚染を削減するために組み込みシステムをますます利用している。組み込みシステムを使用するその他の自動車安全システムには、アンチロックブレーキシステム(ABS)、電子安定制御(ESC/ESP)、トラクションコントロール(TCS)、自動四輪駆動などがある。
医療機器は、モニタリングに組み込みシステムを使用し、非侵襲的な内部検査にはさまざまな医用画像処理(陽電子放出断層撮影(PET)、単光子放出コンピュータ断層撮影(SPECT)、コンピュータ断層撮影(CT)、磁気共鳴画像法(MRI))を使用します。医療機器内の組み込みシステムは、多くの場合、産業用コンピュータによって駆動されます。[ 9 ]
組み込みシステムは、航空宇宙産業や防衛産業における安全性が極めて重要なシステムに使用されています。オンチップ3Gセルラーやその他のIoT監視・制御方式で有線または無線ネットワークに接続されていない限り、これらのシステムはハッキングから隔離され、より高いセキュリティを確保できます。防火対策としては、高温に耐え、動作を継続できるような設計が可能です。セキュリティ面では、組み込みシステムは自己完結型で、電気系統や通信系統が遮断された場合でも対応できます。
モートと呼ばれる小型無線デバイスは、ネットワーク接続された無線センサーです。無線センサーネットワークは、高度な集積回路(IC)設計によって可能になった小型化技術を活用し、高度なセンサーに完全な無線サブシステムを接続することで、人々や企業が物理世界の様々なものを測定し、監視・制御システムを通じてその情報に基づいて行動することを可能にします。これらのモートは完全に自己完結型で、通常はバッテリーを交換または充電するまで何年もバッテリー電源で動作します。
組み込みシステムは、複数のタスクを実行するように設計された汎用コンピュータとは対照的に、特定のタスクを実行するように設計されています。安全性や使いやすさなどの理由から、満たさなければならないリアルタイム性能の制約を持つものもあれば、性能要件が低い、あるいはまったくないものもあり、後者の場合はシステムハードウェアを簡素化してコストを削減できます。
組み込みシステムは必ずしも独立したデバイスではありません。多くの組み込みシステムは、より一般的な目的を果たすより大きなデバイス内の小さな部分です。たとえば、ギブソンロボットギターには弦をチューニングするための組み込みシステムが搭載されていますが、ロボットギターの全体的な目的は音楽を演奏することです。[ 10 ]同様に、自動車の組み込みシステムは、自動車自体のサブシステムとして特定の機能を提供します。

組み込みシステム向けに記述されたプログラム命令はファームウェアと呼ばれ、読み出し専用メモリまたはフラッシュメモリチップに格納されます。これらは、限られたコンピュータハードウェアリソース(少ないメモリ、小型または存在しないキーボードや画面など)で動作します。

組み込みシステムは、単一のタスクに特化したシステムのようにユーザーインターフェースがまったくないものから、現代のコンピュータのデスクトップオペレーティングシステムに似た複雑なグラフィカルユーザーインターフェースを備えたものまで多岐にわたります。シンプルな組み込みデバイスは、ボタン、発光ダイオード(LED)、グラフィックまたは文字液晶ディスプレイ(LCD)とシンプルなメニューシステムを使用します。タッチセンシング機能や画面端のソフトキーを備えたグラフィカル画面を使用するより高度なデバイスは、使用スペースを最小限に抑えながら柔軟性を提供します。ボタンの意味は画面に合わせて変更でき、選択は目的のものを指差すという自然な動作で行えます。
システムによっては、シリアル接続( RS-232など)やネットワーク接続(イーサネットなど)を利用して、リモートでユーザーインターフェースを提供するものがあります。このアプローチにより、組み込みシステムの機能が拡張され、ディスプレイのコストが削減され、ボードサポートパッケージ(BSP)が簡素化され、設計者はPC上でリッチなユーザーインターフェースを構築できるようになります。その好例として、組み込みデバイス( IPカメラやネットワークルーターなど)上で動作する組み込みHTTPサーバーの組み合わせが挙げられます。ユーザーインターフェースは、デバイスに接続されたPCのWebブラウザに表示されます。
汎用コンピュータと比較した場合、一般的な組み込みコンピュータの特性としては、低消費電力、小型サイズ、堅牢な動作範囲、そして低コストなどが挙げられます。ただし、その代償として処理能力は限られています。
組み込みシステム向けに数多くのマイクロコントローラが開発されてきた。汎用マイクロプロセッサも組み込みシステムで使用されるが、一般的にマイクロコントローラよりも多くのサポート回路を必要とする。
PC/104およびPC/104+は、小型で少量生産の組み込みシステムや堅牢システム向けに設計された既製コンピュータボードの規格例です。これらは主にx86ベースで、標準的なPCに比べて物理的に小型ですが、ほとんどのシンプルな(8/16ビット)組み込みシステムに比べると依然として大型です。オペレーティングシステムとしては、LinuxやNetBSDなどの標準的なもの、あるいはMicroC/OS-II、QNX、VxWorksなどの組み込みリアルタイムオペレーティングシステム(RTOS)を使用できます。
小型化や電力効率が最優先事項ではない特定のアプリケーションでは、汎用x86パーソナルコンピュータで使用されるコンポーネントと互換性のあるコンポーネントが使用される場合があります。VIA EPIAシリーズなどのボードは、PC互換でありながら高度に統合され、物理的に小型であるなど、組み込みエンジニアにとって魅力的な特性を備えているため、このギャップを埋めるのに役立ちます。このアプローチの利点は、一般的なソフトウェア開発で使用されるものと同じソフトウェア開発ツールとともに、低コストの汎用コンポーネントを使用できることです。このように構築されたシステムは、より大きなデバイスに統合され、単一の役割を果たすため、組み込みシステムとみなされます。このアプローチを採用する可能性のあるデバイスの例としては、アプリケーション固有のコードを含むATM(現金自動預け払い機)やアーケードゲーム機などがあります。
しかし、市販の組み込みシステムボードのほとんどはPC中心ではなく、ISAバスやPCIバスを使用していません。システムオンチッププロセッサが関わる場合、個別のコンポーネントを接続する標準化されたバスがあってもメリットはほとんどなく、ハードウェアツールとソフトウェアツールの両方にとって環境が大きく異なる可能性があります。
一般的な設計スタイルの一つとして、名刺サイズの小型システムモジュールを使用するものがあります。このモジュールには、ARMベースのシステムオンチッププロセッサや周辺機器などの高密度BGAチップ、ストレージ用の外部フラッシュメモリ、ランタイムメモリ用のDRAMが搭載されています。モジュールベンダーは通常、ブートソフトウェアを提供し、LinuxやリアルタイムOSなど、複数のオペレーティングシステムを選択できるようにします。これらのモジュールは、専門的なテスト問題に精通した企業によって大量生産され、アプリケーション固有の外部周辺機器を備えた少量生産のカスタムメインボードと組み合わせることができます。このアプローチの代表的な例としては、ArduinoやRaspberry Piが挙げられます。
システムオンチップ(SoC)は、複数のプロセッサ、乗算器、キャッシュ、さらには様々な種類のメモリ、そして有線または無線通信用のインターフェースといった各種周辺機器など、完全なシステムを1つのチップ上に集積したものです。多くの場合、グラフィックス処理ユニット(GPU)やDSPも搭載されています。SoCは、特定用途向け集積回路(ASIC)として実装することも、再構成可能なフィールドプログラマブルゲートアレイ(FPGA)を使用して実装することもできます。
ASICによる実装は、携帯電話やスマートフォンなどの大量生産される組み込みシステムで一般的です。一方、航空電子機器のように、信号処理性能、インターフェース、信頼性に関して特別なニーズを持つ、それほど大量生産されない組み込みシステムでは、ASICまたはFPGAによる実装が使用される場合があります。

組み込みシステムは、以下のような周辺機器を介して外部と通信します。
他のソフトウェアと同様に、組み込みシステム設計者はコンパイラ、アセンブラ、デバッガを使用して組み込みシステムソフトウェアを開発します。ただし、より具体的なツールを使用する場合もあります。
ソフトウェアツールは、さまざまな供給元から入手できます。
組み込みソフトウェアの開発には、 C++、Rust、Pythonなどのプログラミング言語や、 Qtなどのグラフィカルインターフェース用フレームワークといった、多様な開発ツールが必要となることがよくあります。これらのツールを用いることで、開発者は組み込みシステムの特定の要件に合わせた、効率的で拡張性が高く、機能豊富なアプリケーションを作成できます。ツールの選択は、リアルタイム性能、ハードウェアとの統合性、エネルギー効率といった要素によって左右されます。
組み込みシステムの複雑化に伴い、より高度なツールやオペレーティングシステムが、適切な機器へと移行しつつあります。例えば、携帯電話、PDA(携帯情報端末)、その他の民生用コンピュータでは、電子機器メーカー以外の第三者が購入または提供する重要なソフトウェアが必要となることがよくあります。こうしたシステムでは、サードパーティのソフトウェアプロバイダーが幅広い市場に製品を販売できるよう、Linux、NetBSD、FreeBSD、OSGi 、組み込みJavaといったオープンなプログラミング環境が不可欠です。
組み込みデバッグは、利用可能な機能に応じて、さまざまなレベルで実行できます。考慮すべき事項には、メインアプリケーションの動作速度が低下するかどうか、デバッグ対象のシステムまたはアプリケーションが実際のシステムまたはアプリケーションにどの程度近いか、デバッグ用に設定できるトリガーの表現力(例えば、特定のプログラムカウンタ値に達したときにメモリを検査するなど)、およびデバッグプロセスで検査できるもの(例えば、メモリのみ、またはメモリとレジスタなど)が含まれます。
デバッグ技術とシステムは、最も単純なものから最も高度なものまで、おおまかに以下の分野に分類されます。
外部デバッグに限定されない限り、プログラマは通常、ツールを通してソフトウェアをロードして実行したり、プロセッサで実行されているコードを表示したり、その動作を開始または停止したりできます。コードの表示形式は、高級プログラミング言語、アセンブリ言語、またはその両方の組み合わせなど、様々です。
リアルタイムオペレーティングシステムは、多くの場合、オペレーティングシステムイベントのトレースをサポートしています。システム動作の記録に基づいて、ホスト PC ツールによってグラフィカル ビューが表示されます。トレース記録は、ソフトウェア、RTOS、または専用のトレース ハードウェアによって実行できます。RTOS トレースにより、開発者はソフトウェア システムのタイミングとパフォーマンスの問題を理解し、高レベルのシステム動作を十分に理解できます。組み込みシステムでのトレース記録は、ハードウェアまたはソフトウェア ソリューションを使用して実現できます。ソフトウェア ベースのトレース記録は、特別なデバッグ ハードウェアを必要とせず、展開されたデバイスでトレースを記録するために使用できますが、CPU と RAM の使用に影響を与える可能性があります。[ 14 ] RTOS 環境で使用されるソフトウェア ベースのトレース方法の 1 つは、コード内の戦略的な場所でオペレーティングシステムによって呼び出され、フックとして機能するように実装できる空のマクロの使用です。
組み込みシステムは、多くの場合、何年もエラーなく連続稼働することが求められる機器に搭載され、場合によってはエラーが発生した場合でも自己復旧する機能も備えています。そのため、ソフトウェアは通常、パーソナルコンピュータ向けソフトウェアよりも綿密に開発・テストされ、ディスクドライブ、スイッチ、ボタンといった信頼性の低い機械的な可動部品は避けられます。
具体的な信頼性の問題としては、以下のようなものが挙げられます。
メモリリークなどのソフトウェアバグやハードウェアのソフトエラーなど、エラーからの復旧には、さまざまな技術が、時には組み合わせて使用されます。
携帯電話のような大量生産システムでは、コスト削減が設計上の最優先事項となるのが一般的です。エンジニアは通常、必要な機能を実装するのに十分な性能を持つハードウェアを選択します。
少量生産または試作型の組み込みシステムの場合、汎用コンピュータを改造するには、プログラムを制限したり、オペレーティングシステムをRTOSに置き換えたりする必要がある。
1978年、全米電気機器製造業者協会は 、プログラマブルマイクロコントローラの規格であるICS 3-1978をリリースしました[ 19 ] 。これには、シングルボードコンピュータ、数値コントローラ、イベントベースコントローラなど、ほぼすべてのコンピュータベースのコントローラが含まれます。
一般的に使用されているソフトウェアアーキテクチャには、いくつかの異なる種類がある。
この設計では、ソフトウェアは入力デバイスを監視するループのみを持ちます。このループはサブルーチンを呼び出し、各サブルーチンはハードウェアまたはソフトウェアの一部を管理します。そのため、これは単純な制御ループ、あるいはプログラム入出力と呼ばれます。
Some embedded systems are predominantly controlled by interrupts. This means that tasks performed by the system are triggered by different kinds of events; an interrupt could be generated, for example, by a timer at a predefined interval, or by a serial port controller receiving data.
This architecture is used if event handlers need low latency, and the event handlers are short and simple. These systems run a simple task in a main loop also, but this task is not very sensitive to unexpected delays. Sometimes the interrupt handler will add longer tasks to a queue structure. Later, after the interrupt handler has finished, these tasks are executed by the main loop. This method brings the system close to a multitasking kernel with discrete processes.
Cooperative multitasking is very similar to the simple control loop scheme, except that the loop is hidden in an API.[3][1] The programmer defines a series of tasks, and each task gets its own environment to run in. When a task is idle, it calls an idle routine, which passes control to another task.
The advantages and disadvantages are similar to those of the control loop, except that adding new software is easier, by simply writing a new task, or adding to the queue.
In this type of system, a low-level piece of code switches between tasks or threads based on a timer that invokes an interrupt. This is the level at which the system is generally considered to have an operating system kernel. Depending on how much functionality is required, it introduces more or less of the complexities associated with managing multiple tasks running conceptually in parallel.
As any code can potentially damage the data of another task (except in systems using a memory management unit) programs must be carefully designed and tested, and access to shared data must be controlled by some synchronization strategy such as message queues, semaphores or a non-blocking synchronization scheme.
Because of these complexities, it is common for organizations to use an off-the-shelf RTOS, allowing the application programmers to concentrate on device functionality rather than operating system services. The choice to include an RTOS brings in its own issues, however, as the selection must be made prior to starting the application development process. This timing forces developers to choose the embedded operating system for their device based on current requirements and so restricts future options to a large extent.[20]
組み込みシステムの複雑さは、シリアル通信、USB、TCP/IP、Bluetooth、無線LAN 、トランク無線、マルチチャネル、データおよび音声通信、高度なグラフィックス、マルチステート、マルチスレッド、多数の待機状態など、周辺機器やタスクの管理が求められるにつれて、絶えず増大しています。こうした傾向により、RTOSに加えて組み込みミドルウェアの採用が進んでいます。
マイクロカーネルはメモリを割り当て、CPUを異なる実行スレッドに切り替えます。ユーザーモードプロセスは、ファイルシステムやネットワークインターフェースなどの主要な機能を実装します。
エクソカーネルは、通常のサブルーチン呼び出しによって効率的に通信します。システム内のハードウェアとすべてのソフトウェアは、アプリケーションプログラマが利用可能であり、拡張可能です。
モノリシックカーネルとは、組み込み環境に適した高度な機能を備えた、比較的規模の大きなカーネルのことです。これにより、プログラマーはLinuxやMicrosoft Windowsのようなデスクトップオペレーティングシステムに似た環境を利用できるため、開発効率が非常に高くなります。一方で、ハードウェアリソースをかなり多く必要とし、価格も高くなることが多く、カーネルの複雑さゆえに予測可能性や信頼性に欠ける場合があります。
組み込みモノリシックカーネルの一般的な例としては、組み込みLinux、VXWorks、Windows CEなどが挙げられる。
ハードウェアのコスト増加にもかかわらず、この種の組み込みシステムは、特に無線ルーターやGPSナビゲーションシステムなどの高性能な組み込み機器において、人気が高まっている。
コアとなるオペレーティングシステムに加え、多くの組み込みシステムには上位層のソフトウェアコンポーネントが搭載されています。これらのコンポーネントには、CAN、TCP/IP、FTP、HTTP、HTTPSなどのネットワークプロトコルスタックや、 FATやフラッシュメモリ管理システムなどのストレージ機能が含まれます。組み込みデバイスにオーディオおよびビデオ機能が搭載されている場合は、適切なドライバとコーデックがシステムに含まれています。モノリシックカーネルの場合、これらのソフトウェア層の多くはカーネル内に含まれています。RTOSの場合、追加のソフトウェアコンポーネントの有無は、製品によって異なります。
自動車分野において、AUTOSARは組み込みソフトウェアの標準アーキテクチャである。
組み込みシステムとは、
マイクロプロセッサ
をベースとしたシステムであり、特定の機能または複数の機能を制御するように構築されている。