アプリケーションの実行 — 概要
このセクションでは、組み込みアプリケーションの実行の概要を以下の3つのフェーズに分けて説明します。
初期化フェーズ
初期化フェーズは、アプリケーションの起動時(CPUのリセット時)、main関数が入力される前に実行されます。簡潔にすると、初期化フェーズは次のように分割できます。
ハードウェア初期化。通常、少なくともスタックポインタが初期化されます。
ハードウェア初期化は通常、システム起動コード
cstartup.sと、必要に応じて、ユーザが用意する追加の低レベルルーチンで実行されます。 また、ハードウェアの残りの部分のリセット/RESTARTや、ソフトウェアC/C++システム初期化の準備のためのCPUなどの設定が行われる場合もあります。ソフトウェアC/C++システム初期化
一般的に、この初期化フェーズでは、
main関数が呼び出される前に、すべてのグローバル(静的にリンクされた)C/C++シンボルがその正しい初期化値を受け取っていることが前提です。アプリケーション初期化
これは、使用しているアプリケーションにより異なります。RTOSカーネルの設定や、RTOSが実行するアプリケーションの初期タスクの開始が含まれます。ベアボーンアプリケーションでは、さまざまな割り込みの設定、通信の初期化、デバイスの初期化などが含まれます。
ROM/フラッシュベースのシステムでは、定数や関数がすでにROMに配置されています。また、リンカにより、利用可能なRAMはすでに変数、スタック、ヒープなどの異なるエリアに分割されています。RAMに配置されたすべてのシンボルは、main関数が呼び出される前に初期化される必要があります。
以下の一連の図は、初期化の各種段階の概要を簡単に示します。
アプリケーションが起動されると、システム起動コードは、まず、スタックポインタを事前定義されたスタックエリアの末尾を指すように初期化するなど、ハードウェアの初期化を実行します。

次にゼロ初期化するメモリがクリアされます。つまり、ゼロで埋められます:

一般的に、これはゼロで初期化されるデータなどのデータで、たとえば
int i = 0;などで宣言される変数です。初期化されるデータ、たとえば
int i = 6;のように宣言されたデータでは、イニシャライザがROMからRAMにコピーされます。
次に、C++オブジェクトなどの動的に初期化された静的オブジェクトが構築されます。
最後に、
main関数が呼出されます。
各段階について詳しくは、システムの起動と終了を参照してください。データ初期化の詳細については、システム起動時の初期化を参照してください。
実行フェーズ
組み込みアプリケーションのソフトウェアは、通常、割り込み駆動型のループか、外部相互処理や内部イベントを制御するためのポーリングを使用するループのいずれかで実装されます。割り込み駆動型システムの場合、割り込みは、通常、main関数の開始時に初期化されます。
リアルタイムで動作し、応答性が重要なシステムでは、マルチタスクシステムが必要になることがあります。つまり、アプリケーションソフトウェアは、リアルタイムオペレーティングシステム(RTOS)で補足する必要があります。この場合、RTOSおよびさまざまなタスクは、main関数の開始前に初期化される必要があります。
終了フェーズ
一般的に、組み込み関数は終了しません。終了する場合、正しい終了動作を定義する必要があります。
アプリケーションを制御したまま終了するには、標準Cライブラリ関数のexit、_Exit、quick_exit、またはabortのいずれかを呼び出すか、mainから戻ります。mainから戻ると、exit関数が実行されます。すなわち、静的およびグローバル変数のC++デストラクタが呼び出され(C++のみ)、開いているすべてのファイルが閉じます。
ただし、プログラムロジックが間違っている場合、アプリケーションを制御したまま終了できず、異常終了して、システムがクラッシュすることがあります。
これらの詳細は、システム終了を参照してください。