初期設定ルーチンPowerON_Reset_PCは、main関数を実行する前、および実行した後に必要な手続きを記述する関数です。初期設定ルーチンの中で必要となる処理を、順番に記述します。
初期設定処理を行うための、PSWレジスタ初期化を実施します。たとえば、初期設定処理中、割り込みを受け付けない設定にするために、PSWに対して割り込み禁止の設定をします。
リセット時のPSWは全bitゼロに初期化され、割り込み許可ビット(Iビット)も割り込み禁止状態(ゼロ)として初期化されています。
スタックポインタ(USPレジスタおよびISPレジスタ)を初期化します。PowerON_Reset_PC関数に対して"#pragma entry"宣言することにより、コンパイラが自動的にISP/USP初期化コードを関数先頭に生成します。
PowerON_Reset_PC関数は、#pragma entry宣言されているため、この手続きを記述する必要はありません。
コンパイラでbaseオプションを使用している場合、プログラム全体でベースアドレスとして使用する汎用レジスタを初期化する必要があります。PowerON_Reset_PC関数に対して"#pragma entry"宣言することにより、コンパイラが自動的に各レジスタへの初期化コードを関数先頭に生成します。
PowerON_Reset_PC関数は、#pragma entry宣言されているため、この手続きを記述する必要はありません。
可変ベクタテーブルの配置アドレスを、INTBに書き込みます。その他、必要に応じて、FINTV、FPSW、BPC、BPSW、EXTB、DPSWの初期化を行います。これらの初期化は、コンパイラの組み込み関数を使って行うことができます。
ただし、PSWだけは、割り込みマスク設定を維持するため、初期化はまだ行いません。
RAM領域セクションの初期化用ルーチン(_INITSCT)を呼び出します。未初期化データセクションはゼロ初期化されます。初期化データセクションは、ROM領域の初期値をRAM領域へコピーします。_INITSCTは、標準ライブラリとして提供されます。
初期化対象のセクションは、ユーザがセクション初期化用テーブル(DTBL,BTBL)へ記述する必要があります。_INITSCT関数が使用するセクションの先頭アドレスおよび最終アドレスを、セクションアドレス演算子を用いて設定します。
セクション初期化用テーブルのセクション名は、未初期化データ領域をC$BSEC、初期化データ領域をC$DSECで宣言します。
C/C++言語ライブラリ関数使用時に、必要な初期化を実施するルーチン(_INITLIB)を呼び出します。
実際に使用する機能に合わせた必要最低限の初期設定を行うために、以下の指針を参考にしてください。
C++言語のプログラム開発の場合、グローバルに宣言されたクラスオブジェクトのコンストラクタを呼び出すためのルーチン(_CALL_INIT)を呼び出します。_CALL_INITは、標準ライブラリとして提供されます。
PSWレジスタを初期化します。割り込みマスクの設定も、ここで解除します。
リセット以降は特権モード(PSWのPMビットがゼロ)で動作していますが、ユーザモードに切り替えたい場合は、組み込み関数のchg_pmusrを実行します。
chg_pmusr関数にはいくつか注意事項がありますので、使用する場合は、4.2.6 組み込み関数のchg_pmusrの項目を参照ください。
C++言語のプログラム開発の場合、グローバルに宣言されたクラスオブジェクトのデストラクタを呼び出すためのルーチン(_CALL_END)を呼び出します。_CALL_ENDは、標準ライブラリとして提供されます。