Skip to main content

IAR Embedded Workbench for Arm 9.70.x

システムの起動と終了

このセクションの内容:

ここでは、アプリケーションの起動と終了時のランタイム環境の動作について説明します。

開始と終了を処理するコードは、 arm\src\lib\armarm\src\lib\thumb(Cortex-Mの場合)あるいは arm\src\lib\a64ディレクトリ内のソースファイルcstartup.scmain.scexit.sおよびarm\src\lib\runtimeディレクトリ内のlow_level_init.cにあります。

注記

これらのファイルをいくつかインストールするには、IAR Library Sourceパッケージを展開する必要があります。

システム起動コードのカスタマイズ方法については、システム初期化を参照してください。

システム起動

システムの起動時、main関数に入るる前に初期化シーケンスが実行されます。 このシーケンスでは、ターゲットハードウェアとC/C++環境で必要とされる初期化を実行します。

ハードウェアの初期化は、以下のように実行されます。

SystemStartup1 70percent.png
  • CPUがリセットされると、システム起動コードのプログラムエントリラベル__iar_program_startで起動を開始します64ビットモードの場合、リンカシンボル__Reset_addressでセットアップされます。

  • 64ビットモードの場合、プログラムはハードリセットで入力された例外レベルから例外レベルまでを調べます。

  • スタックポインタは、CSTACKブロックの最後の位置に初期化されます。

  • ARM7/9/11、Cortex-A、Cortex-Rのデバイスについては、例外スタックポインタは対応する各セクションの最後の位置に初期化されます。

  • 関数__low_level_initを定義している場合、この関数が呼び出され、アプリケーションで低レベルの初期化を実行できます。

C/C++の初期化は、以下のように実行されます。

SystemStartup2 70percent.png
  • 静的変数とグローバル変数が初期化されます。つまり、ゼロ初期化変数がクリアされ、他の初期化変数の値がROMからRAMメモリにコピーされます。このステップは、_ _low_level_initがゼロを返す場合には、省略されます。詳細については、システム起動時の初期化を参照してください。

  • 静的C++オブジェクトが生成されます。

  • main関数が呼び出され、アプリケーションが起動します。

初期化フェーズについて詳しくは、アプリケーションの実行 — 概要を参照してください。

システム終了

以下の図には、組み込みアプリケーションの終了を制御するための各種の方法を示します。

SystemTermination 70percent.png

アプリケーションは、以下の2つの方法で正常終了できます。

  • main関数から戻る

  • exit関数を呼び出す

C規格では、2つの方法は同等であると規定されているため、システム起動コードはmainから戻る際にexit関数を呼び出します。exit関数には、mainのリターン値がパラメータとして引き渡されます。

デフォルトのexit関数はCで記述されています。この関数は、以下を実行する小さなアセンブラ関数_exitを呼び出します。

  • アプリケーション終了時に実行するように登録した関数を呼び出します。これには、C++の静的/グローバル変数のデストラクタと、標準C関数atexitで登録された関数が含まれます。atexit 制限の設定を参照してください。

  • 開かれているすべてのファイルを閉じます。

  • __exitを呼び出します。

  • __exitの最後まで到達したら、システムを停止します。

アプリケーションは、abort_Exitまたはquick_exit関数を呼び出すことによっても終了できます。abort関数は、単に__exit を呼び出してシステムの停止を行うだけで、終了処理は実行しません。_Exit関数もabort関数とほとんど同じですが、_Exitでは、終了ステータス情報を渡すための引数をとります。quick_exit関数は_Exit関数と同等ですが、 __exitを呼び出す前に、at_quick_exitを通過してそれぞれの関数を呼び出します。

終了時にアプリケーションでシステムのリセットなど追加処理を希望する場合(atexitが不十分な場合)、__exit(int)関数の独自の実装を記述することができます。

自作モジュールでオーバライドできるライブラリファイルは、arm\src\libディレクトリにあります。ライブラリモジュールのオーバライドを参照してください。

システム終了のC-SPYデバッグサポート

リンク時にC-SPYエミュレートI/Oを有効にしている場合、通常の__exit関数は特殊な関数に置き換えられますC-SPYはこの関数が呼び出された時点を認識し、プログラム終了をエミュレートするための適切なアクションを実行できます。詳細については、C-SPYによりエミュレーションされたI/Oの概要を参照してください。