第10章 システム構成管理機能
ブート処理は,RI78V4が処理を実行するうえで必要となる最低限のハードウエアを初期化するためにユーザ・オウン・コーディング部として切り出された初期化処理専用ルーチンであり,リセット割り込みが発生した際にCPUが強制的に制御を移すベクタ・テーブル・アドレスに割り付けられた割り込みエントリ処理から呼び出されます。
.PUBLIC _boot .EXTERN __kernel_start, _hdwinit, __init_ri_stackarea, _reset .SECTION .stack_bss, BSS ;ブート内でスタックを使用する場合は領域確保 _stackend: .DS 0x100 _stacktop: _boot .VECTOR 0x0000 .SECTION .text, TEXT _boot: SEL RB0 ;レジスタ・バンクの設定 MOVW SP, #LOWW(_stacktop) ;スタック・ポインタSPの設定 CALL !!_reset ;カーネル初期化情報のクリア MOVW HL, #LOWW(STARTOF(.kernel_data_init)) MOVW AX, #LOWW(STARTOF(.kernel_data_init) + SIZEOF(.kernel_data_init)) BR $L2_KERNEL_DATA L1_KERNEL_DATA: MOV [HL+0], #0 INCW HL L2_KERNEL_DATA: CMPW AX, HL BNZ $L1_KERNEL_DATA CALL !!__init_ri_stackarea ;RAM領域のクリア(別関数で実施) BR !!__kernel_start ;カーネル初期化部に制御を移す CLRW AX _exit: BR $exit |
- スタックの切り替え
ブート処理に制御が移った時点では,“スタック・ポインタSPの設定”が実行されていません。
したがって,ブート処理専用スタックを使用する場合は,ブート処理の開始部分で“スタック・ポインタSPの設定”を記述する必要があります。
ブート処理に制御が移った時点では,“スタック・ポインタSPの設定”が実行されていません。
したがって,ブート処理専用スタックを使用する場合は,ブート処理の開始部分で“スタック・ポインタSPの設定”を記述する必要があります。
- 割り込み状態
ブート処理に制御が移った時点では,“カーネル初期化部”が実行されていません。
したがって,該当処理が完了する以前に割り込みが発生した際には,システムが暴走する可能性があります。そこで,ブート処理では,プログラム・ステータス・ワードPSWの割り込み許可フラグIEを操作して,マスカブル割り込みの受け付けを明示的に禁止してください。
ブート処理に制御が移った時点では,“カーネル初期化部”が実行されていません。
したがって,該当処理が完了する以前に割り込みが発生した際には,システムが暴走する可能性があります。そこで,ブート処理では,プログラム・ステータス・ワードPSWの割り込み許可フラグIEを操作して,マスカブル割り込みの受け付けを明示的に禁止してください。
- レジスタ・バンクの設定
RI78V4では,ブート処理内で_kernel_startを呼び出す以前に設定されたレジスタ・バンクから他のレジスタ・バンクへと切り替えることを禁止(RI78V4管理外の割り込み処理を除く)しています。
RI78V4では,ブート処理内で_kernel_startを呼び出す以前に設定されたレジスタ・バンクから他のレジスタ・バンクへと切り替えることを禁止(RI78V4管理外の割り込み処理を除く)しています。
- システム依存情報の基本型
システム依存情報を記述する場合,規定されたファイル名(usrown.h),規定されたマクロ名(KERNEL_USR_TMCNTREG,KERNEL_USR_TMCMPREG)を用いて記述します。
以下に,システム依存情報をC言語で記述する場合の基本型を示します。
システム依存情報を記述する場合,規定されたファイル名(usrown.h),規定されたマクロ名(KERNEL_USR_TMCNTREG,KERNEL_USR_TMCMPREG)を用いて記述します。
以下に,システム依存情報をC言語で記述する場合の基本型を示します。
#include <kernel_id.h> /*システム情報ヘッダ・ファイルの定義*/ #define KERNEL_USR_TMCNTREG 0x0180 /*I/Oアドレス*/ #define KERNEL_USR_TMCMPREG 0xff18 /*I/Oアドレス*/ |
備考 本情報の記述は,プロパティ パネル → [タスク・アナライザ]タブ → [トレース]カテゴリ → [トレース・モードの選択]で“ソフトウエア・トレース・モードで,長時間統計を取得”を選択した場合に限り必要となります。
備考 本情報の記述は,プロパティ パネル → [タスク・アナライザ]タブ → [トレース]カテゴリ → [トレース・モードの選択]で“ソフトウエア・トレース・モードで,トレース・チャートを取得”,または“ソフトウエア・トレース・モードで,長時間統計を取得”を選択した場合に限り必要となります。
初期化ルーチンは,ユーザの実行環境に依存したハードウエア(周辺コントローラなど)を初期化するためにユーザ・オウン・コーディング部として切り出された初期化処理専用ルーチンであり,カーネル初期化部から呼び出されます。
- 静的な登録
初期化ルーチンの静的な登録は,規定された関数名init_handlerで初期化ルーチンを記述することにより実現されます。
RI78V4では,カーネル初期化部において,該当シンボル情報をもとに初期化ルーチンの登録処理を実行し,管理対象とします。
初期化ルーチンの静的な登録は,規定された関数名init_handlerで初期化ルーチンを記述することにより実現されます。
RI78V4では,カーネル初期化部において,該当シンボル情報をもとに初期化ルーチンの登録処理を実行し,管理対象とします。
#include <kernel.h> /*標準ヘッダ・ファイルの定義*/ #include <kernel_id.h> /*システム情報ヘッダ・ファイルの定義*/ void init_handler ( void ) { ............ /*初期化ルーチンの本体処理*/ ............ return; /*初期化ルーチンの終了*/ } |
$INCLUDE (kernel.inc) ;標準ヘッダ・ファイルの定義 $INCLUDE (kernel_id.inc) ;システム情報ヘッダ・ファイルの定義 .PUBLIC _init_handler .SECTION .textf, TEXTF _init_handler: ............ ;初期化ルーチンの本体処理 ............ RET ;初期化ルーチンの終了 |
- スタックの切り替え
RI78V4では,初期化ルーチンに制御を移す際に“システム・スタックへの切り替え処理”を,初期化ルーチンから制御を戻す際に“切り替え先のカーネル初期化部用スタックへの切り替え処理”を実行しています。
したがって,ユーザは,初期化ルーチン内でスタックの切り替えに関する処理を記述する必要はありません。
RI78V4では,初期化ルーチンに制御を移す際に“システム・スタックへの切り替え処理”を,初期化ルーチンから制御を戻す際に“切り替え先のカーネル初期化部用スタックへの切り替え処理”を実行しています。
したがって,ユーザは,初期化ルーチン内でスタックの切り替えに関する処理を記述する必要はありません。
- 割り込み状態
RI78V4では,初期化ルーチンに制御を移す際に“マスカブル割り込みの受け付けが禁止された状態”としています。
なお,初期化ルーチンに制御が移った時点では,カーネル初期化部の処理が完了していません。
したがって,初期化ルーチン内で明示的にマスカブル割り込みの受付けを許可した際には,システムが暴走する可能性があります。そこで,RI78V4では,初期化ルーチン内でマスカブル割り込みの受け付けを許可することを禁止しています。
RI78V4では,初期化ルーチンに制御を移す際に“マスカブル割り込みの受け付けが禁止された状態”としています。
なお,初期化ルーチンに制御が移った時点では,カーネル初期化部の処理が完了していません。
したがって,初期化ルーチン内で明示的にマスカブル割り込みの受付けを許可した際には,システムが暴走する可能性があります。そこで,RI78V4では,初期化ルーチン内でマスカブル割り込みの受け付けを許可することを禁止しています。
#include <kernel.h> /*標準ヘッダ・ファイルの定義*/ #include <kernel_id.h> /*システム情報ヘッダ・ファイルの定義*/ void func_task ( VP_INT exinf ) { T_RVER pk_rver; /*データ構造体の宣言*/ UH maker; /*変数の宣言*/ UH prid; /*変数の宣言*/ UH spver; /*変数の宣言*/ UH prver; /*変数の宣言*/ UH prno[4]; /*変数の宣言*/ ............ ............ ref_ver ( &pk_rver ); /*バージョン情報の参照*/ maker = pk_rver.maker; /*メーカ・コードの獲得*/ prid = pk_rver.prid; /*識別番号の獲得*/ spver = pk_rver.spver; /*バージョン番号の獲得*/ prver = pk_rver.prver; /*バージョン番号の獲得*/ prno[0] = pk_rver.prno[0]; /*版数の獲得*/ prno[1] = pk_rver.prno[1]; /*メモリ・モデルの獲得*/ ............ ............ } |