📚

IT技術解説④:組み込み開発とは何か?

2025/03/23に公開

はじめに

組み込み開発とは、Wikipediaでは「家電製品や産業機器などに搭載された、特定の機能を実現するためのコンピュータ向けのソフトウェア開発」と表現されるが、何が対象で何が対象でないのかについて門外漢の人間にはよくわからないのが実情です。そこで本稿では、組み込み開発の定義や具体的な分類、使用されるプログラミング言語とその理由を整理します。

組み込み開発とはそもそも何を指すか?

組み込み開発とは、一般的にマイクロコントローラ(マイコン)や汎用MPU上で動作するファームウェアやソフトウェアを開発することを指します。そのため、VHDLやSystemCを用いたRTL(Register Transfer Level)の記述や、PLC(Programmable Logic Controller)を用いたFA(Factory Automation)制御のラダーシーケンス記述は通常含まれません。また、スマートフォンなどのアプリケーションプロセッサ(Snapdragon、Apple Aシリーズ等)上で動作するAndroidアプリなどのアプリケーション開発も、一般的に「組み込み開発」には含まれません。

分野 代表的な対象 使用言語・ツール 備考
⭕️組み込み開発 マイコン上のファームウェア、ドライバ、RTOS制御 C/C++、アセンブラ、Rust など ハードウェア寄りのソフト開発
✖️FA(PLC)制御開発 PLC(Programmable Logic Controller) ラダー図、ST(構造化テキスト)、FBDなど IEC 61131-3 に準拠、現場制御重視
✖️ハードウェア設計 FPGA、ASIC、SoC 等 VHDL、Verilog、SystemCなど 回路レベルの設計

組み込み開発の種類は?

組み込み開発は主に以下の3つに分類される。

  1. マイコンベンダーが提供するマイコン上で動作するファームウェアの開発
    主に車載ECUの開発に多い。
    Renesas、Infineon、NXP などが、CAN や LIN などの車載ネットワークや安全性に特化したマイコンを製造・販売しているため。

  2. 専用設計の FPGA 上に構成された MPU IP(多くは ARM コア)向けのファームウェア開発
    専用ハードウェア設計と密接に連携する開発であり、主に医療機器などに用いられる。

  3. 専用設計の ASIC に搭載された MPU IP(例:ARM Cortex-M など)向けのファームウェア開発
    主にスマートフォンの部品(タッチパネル、カメラなど)に多く見られ、これらの ASIC 内部には MPU が IP として組み込まれています。

一方、スマートフォンの中央アプリケーションプロセッサ(例:Cortex-Aシリーズ、Snapdragonなど)のアプリケーション部(Androidアプリ等)で動作するものは、組み込み開発の対象外とされます。ただし、TrustZoneやブートローダーなど低レイヤーのI/O制御部に関わるファームウェアは、広義では組み込み開発に含まれることがあります。

分類 組み込み開発に含まれるか
⭕️ マイコン上MPU向け 完全に含まれる
⭕️ 専用FPGA上MPU(IP)向け 含まれる(協調設計色は強め)
⭕️ ASIC上MPU(IP)向け 含まれる
✖️ スマホ中央SoC(メインコア)向け 含まれない
⚠️ スマホ中央SoC内のSecure Boot等向け 文脈により含まれる(ハード寄りの組み込み)

組み込み開発はどんな言語で行うのか?

組み込み開発では、インタラクションの相手が人間ではなく機械(センサーやアクチュエータ)であるため、リアルタイム性が非常に重視されます。そのため、ガベージコレクション(GC)による遅延(Stop-the-world)は許容されず、低消費電力かつ低コストのマイコン上で遅延なく動作することが求められます。よって、リアルタイム性とリソース制約に適したC、C++、(環境が整っていれば)Rustが主に使用されるのです。

また、本来C/C++はメモリ管理や未定義動作などのリスクが高いとされますが、組み込み開発現場ではQAC、Coverity、CodeSonarなどMISRA CやCERT-Cに準拠した静的解析ツールが非常に普及しているため、安全に運用することが可能となっています。

かつては、各マイコン向けのアセンブリ言語での開発は多く行われました。しかし、現在では、チップベンダが用意するBSP内に存在するブート処理、ハンドアセンブリによる高速化が必要な信号処理、コンパイル最適化でソースとのステップ一致ができなくなった実行バイナリのデバッグ、などの用途のみでアセンブリ言語を持ちるのが一般的です。

一方で、組み込みLinux環境などでGCを伴うPythonやJavaが使われることもありますが、これはリアルタイム性が低いユーザ空間のアプリケーション開発に限定され、ファームウェア開発そのものとは区別されます。

言語 理由
⭕️C デファクトスタンダード。最も直接的にHW制御ができ、メモリ使用も明確。
⭕️C++ Cの低レベル制御に加え、抽象化やRAIIによる安全性も確保可能(ただしGCなし)
⚠️Rust 所有権モデルによるゼロコスト抽象化と安全性の両立(ただし環境整備途上)
⚠️アセンブリ言語 チップベンダによるBSP作成、信号処理、デバッグ時等のみで局所利用
✖️Java/Python/C# GCによる遅延、ランタイムの重さ、実行環境の非現実性(VMが必要)

まとめ

組み込み開発とは、マイコンや専用MPU上で動作するファームウェアを開発することを指し、リアルタイム性や低消費電力・低コストが求められる分野です。車載ECUや専用FPGA・ASIC上で動作するファームウェア開発が主流であり、言語としてはC、C++、(環境が整っていれば)Rust が選ばれます。C/C++はリスクの高い言語ですが、静的解析ツールと厳密なコーディング規約の徹底により、安全な運用が可能になっているのが現在の組み込み開発の特徴です。

Discussion