第14章 システム初期化処理
RI850V4におけるシステム初期化処理では,リセットの発生から処理プログラムに制御を移すまでに必要となる“RI850V4が処理を実行するうえで必要となるハードウエア,およびソフトウエアの初期化処理”を提供しています。
RI850V4では,さまざまな実行環境に対応するために,システム初期化処理のうち,RI850V4が処理を実行するうえで必要となるハードウエア依存処理(ブート処理),およびRI850V4が処理を実行するうえで必要となる各種情報(システム依存情報)をユーザ・オウン・コーディング部として切り出しています。これにより,さまざまな実行環境への移植性を向上させるとともに,カスタマイズを容易なものとしています。
ブート処理は,RI850V4が処理を実行するうえで必要となる最低限のハードウエアを初期化するためにユーザ・オウン・コーディング部として切り出された初期化処理専用ルーチンであり,割り込みエントリ処理から呼び出されます。
.public __boot .text .cseg text .align 0x2 __boot : ............ ............ mov #__kernel_start, r11 /*カーネル初期化部に制御を移す*/ jarl [r11], lp |
- ブート処理内での処理
ブート処理は,割り込みエントリ処理からRI850V4を介在させることなく呼び出される初期化処理専用ルーチンです。このため,ブート処理を記述する際には,以下に示す注意点があります。
ブート処理は,割り込みエントリ処理からRI850V4を介在させることなく呼び出される初期化処理専用ルーチンです。このため,ブート処理を記述する際には,以下に示す注意点があります。
- 記述方法
C言語,またはアセンブリ言語で記述します。
C言語で記述するときは通常の関数と同様に記述することができます。
アセンブリ言語で記述するときは使用するコンパイラの呼び出し規約にのっとって作成してください。
C言語,またはアセンブリ言語で記述します。
C言語で記述するときは通常の関数と同様に記述することができます。
アセンブリ言語で記述するときは使用するコンパイラの呼び出し規約にのっとって作成してください。
- スタックの切り替え
ブート処理が開始された時点では“カーネル初期化部の実行”が行われていません。したがって,ブート処理用スタックを使用する際には,ブート処理の開始部分でスタックの設定処理(スタック・ポインタSPの設定)を記述する必要があります。
ブート処理が開始された時点では“カーネル初期化部の実行”が行われていません。したがって,ブート処理用スタックを使用する際には,ブート処理の開始部分でスタックの設定処理(スタック・ポインタSPの設定)を記述する必要があります。
備考3 処理プログラム(タスク,周期ハンドラなど)でエレメント・ポインタEPの書き換えを行う場合,コンパイル・オプション-Xep=callee(プロパティ パネル → [共通オプション]タブ → [レジスタ・モード]カテゴリ → [epレジスタの扱い]で“calee-saveとして扱う”を選択)の指定が必須となります。
- コンパイラCC-RHの場合
コンパイラCC-RHが提供しているRAMセクション領域初期化関数_INITSCT_RHを利用することにより,処理の記述を簡素化することが可能となります。
以下に,.kernel_data_initセクションの初期化をアセンブリ言語で記述する場合の記述例を示します。
コンパイラCC-RHが提供しているRAMセクション領域初期化関数_INITSCT_RHを利用することにより,処理の記述を簡素化することが可能となります。
以下に,.kernel_data_initセクションの初期化をアセンブリ言語で記述する場合の記述例を示します。
.section ".INIT_BSEC.const", const .align 0x4 .dw #__s.kernel_data_init, #__e.kernel_data_init mov r0, r6 mov r0, r7 mov #__s.INIT_BSEC.const, r8 mov #__e.INIT_BSEC.const, r9 jarl __INITSCT_RH, lp |
上記のように定義すると,CCV850コンパイラが生成するランタイム・クリア・テーブル(__ghsbinfo_clear, __ghseinfo_clear)に.kernel_data_initのセクション情報が含まれます。以下にランタイム・クリア・テーブルに含まれるセクション領域を初期化する処理の記述例を示します。
備考6 直接ベクタ方式のエントリ・ファイルを使用時に必要となるリセット・ベクタ・ベース・アドレスRBASEのRINTビット,および例外ハンドラ・ベクタ・アドレスEBASEのRINTビットに対する操作(縮小モードで動作させるか否か)は初期化ルーチンで行ってください。
- システム依存情報の基本型
システム依存情報を記述する場合,規定されたファイル名(userown.h),規定されたマクロ名(KERNEL_USR_TMCNTREG,KERNEL_USR_BASETIME)を用いて記述します。
以下に,システム依存情報をC言語で記述する場合の基本型を示します。
システム依存情報を記述する場合,規定されたファイル名(userown.h),規定されたマクロ名(KERNEL_USR_TMCNTREG,KERNEL_USR_BASETIME)を用いて記述します。
以下に,システム依存情報をC言語で記述する場合の基本型を示します。
#include <kernel_id.h> /*システム情報ヘッダ・ファイルの定義*/ #define KERNEL_USR_TMCNTREG 0xffec0004 /*I/Oアドレス*/ #define KERNEL_USR_BASETIME 250 /*1カウント当たりの時間(4MHz→250ns)*/ |
備考 本情報の記述は,プロパティ パネル → [タスク・アナライザ]タブ → [トレース]カテゴリ → [トレース・モードの選択]で“ソフトウエア・トレース・モードで,長時間統計を取得”を選択した場合に限り必要となります。
- 基本クロック用タイマ情報
カウンタ・レジスタOSTMnのI/Oアドレス(レジスタ・ベース・アドレス + 0x4),およびOSタイマの周波数から換算される1カウント当たりの時間(単位:ns)をマクロ定義
カウンタ・レジスタOSTMnのI/Oアドレス(レジスタ・ベース・アドレス + 0x4),およびOSタイマの周波数から換算される1カウント当たりの時間(単位:ns)をマクロ定義
備考 本情報の記述は,プロパティ パネル → [タスク・アナライザ]タブ → [トレース]カテゴリ → [トレース・モードの選択]で“ソフトウエア・トレース・モードで,トレース・チャートを取得”,または“ソフトウエア・トレース・モードで,長時間統計を取得”を選択した場合に限り必要となります。
- システム時刻の初期化
基本クロック用タイマ割り込みの例外コードtim_intnoで定義されたEIレベル・マスカブル割り込みが発生した際に基本クロック周期tim_baseを単位とした更新が行われるシステム時刻を初期化(0を設定)します。
基本クロック用タイマ割り込みの例外コードtim_intnoで定義されたEIレベル・マスカブル割り込みが発生した際に基本クロック周期tim_baseを単位とした更新が行われるシステム時刻を初期化(0を設定)します。