ベクタ¶
SOLID-OSでは、ベクタ発生時に登録した関数を呼び出すことができます。
関数は、コアサービスが内部で所有しているスタックを使用して、SVC(AArch32時)/EL1h(AArch64時)モードで呼び出されます。
登録がなければ、例外発生時にデフォルトの動作が呼び出されます。 JTAGデバッガが接続されている場合は、予め埋め込まれているブレークポイント命令によって 実行が停止し、IDE上に発生した例外の種類などの情報が表示されます。
ベクタ関連のAPIを使用するには、solid_vector.h をインクルードしてください。
#include "solid_vector.h"
API¶
ベクタ番号(AArch32)¶
-
SOLID_VECTOR_UNDEF¶
-
SOLID_VECTOR_SWI¶
-
SOLID_VECTOR_PREFETCH¶
-
SOLID_VECTOR_DATAABORT¶
-
SOLID_VECTOR_IRQ¶
-
SOLID_VECTOR_FIQ¶
定数
名前
値
説明
SOLID_VECTOR_UNDEF0
未定義命令
SOLID_VECTOR_SWI1
ソフトウェア割り込み
SOLID_VECTOR_PREFETCH2
プリフェッチアボート
SOLID_VECTOR_DATAABORT3
データアボート
SOLID_VECTOR_IRQ4
割り込み要求
SOLID_VECTOR_FIQ5
高速割り込み要求
ベクタ番号(AArch64)¶
ベクタ番号(Cortex-M)¶
-
SOLID_VECTOR_RESET¶
-
SOLID_VECTOR_NMI¶
-
SOLID_VECTOR_HARDFAULT¶
-
SOLID_VECTOR_MEMMANAGE¶
-
SOLID_VECTOR_BUSFAULT¶
-
SOLID_VECTOR_USAGEFAULT¶
-
SOLID_VECTOR_SVCCALL¶
-
SOLID_VECTOR_MONITOR¶
-
SOLID_VECTOR_PENDSV¶
-
SOLID_VECTOR_SYSTICK¶
定数
名前
値
説明
SOLID_VECTOR_RESET1
リセット
SOLID_VECTOR_NMI2
ノンマスカブル割り込み
SOLID_VECTOR_HARDFAULT3
ハードフォルト
SOLID_VECTOR_MEMMANAGE4
メモリ管理フォルト
SOLID_VECTOR_BUSFAULT5
バスフォルト
SOLID_VECTOR_USAGEFAULT6
使用法フォルト
SOLID_VECTOR_SVCCALL11
SVC呼び出し
SOLID_VECTOR_MONITOR12
デバッグモニタ
SOLID_VECTOR_PENDSV14
PendSV
SOLID_VECTOR_SYSTICK15
SysTick
SOLID_VECTOR_IRQ(Cortex-M)16
外部割り込み
ベクタ番号(RISC-V)¶
-
SOLID_VECTOR_EXC¶
定数
名前
値
説明
SOLID_VECTOR_EXC0
例外
SOLID_VECTOR_IRQ(RISC-V)1
割り込み
注釈
各アーキテクチャには、ベクタ番号の最大値を表す SOLID_VECTOR_MAX も定義されて
います(AArch32: 6, AArch64: 4, Cortex-M: 17, RISC-V: 2)。
SOLID_VECTOR_HANDLER¶
-
typedef struct _SOLID_VECTOR_HANDLER_ SOLID_VECTOR_HANDLER¶
-
struct _SOLID_VECTOR_HANDLER_¶
説明
ベクタハンドラ登録用構造体
定義
typedef struct _SOLID_VECTOR_HANDLER_ { struct _SOLID_VECTOR_HANDLER_ *pNext; int (*func)(void*, SOLID_CPU_CONTEXT*); void* param; } SOLID_VECTOR_HANDLER;
メンバー
-
struct _SOLID_VECTOR_HANDLER_ *pNext¶
コアサービス側で使用
-
int (*func)(void*, SOLID_CPU_CONTEXT*)¶
ベクタ発生時に呼び出される関数。第一引数にparam, 第二引数にベクタが発行した時点のコンテキストが渡されます。
-
void *param¶
ベクタ発生時に呼び出される関数に渡す引数
-
struct _SOLID_VECTOR_HANDLER_ *pNext¶
SOLID_VECTOR_Register¶
-
int SOLID_VECTOR_Register(int vec, SOLID_VECTOR_HANDLER *pHandler)¶
割り込みベクタのハンドラを登録します
ハンドラは必ず
SOLID_VECTOR_UnRegisterまで確保されている、かつ書き込み可能な領域 (.bss/.data領域またはmalloc()等で確保した領域)を使用してください。- パラメータ:
vec -- 登録する ベクタ番号( SOLID_VECTOR_XXX )
pHandler -- 登録するハンドラ
- 戻り値:
SOLID_ERR_OK: 正常終了それ以外: エラー
SOLID_VECTOR_UnRegister¶
-
int SOLID_VECTOR_UnRegister(int vec, SOLID_VECTOR_HANDLER *pHandler)¶
割り込みベクタのハンドラの登録を解除します
- パラメータ:
vec -- 登録を解除する ベクタ番号( SOLID_VECTOR_XXX )
pHandler -- 登録を解除するハンドラ
- 戻り値:
SOLID_ERR_OK: 正常終了それ以外: エラー
SOLID_VECTOR_IsInInterrupt¶
-
int SOLID_VECTOR_IsInInterrupt(void)¶
割り込みベクタ処理中かどうかを判定する
- 戻り値:
0: 割り込み処理中でない
1: 割り込み処理中である
SOLID_VECTOR_GetJumpAddress¶
-
SOLID_ADDRESS SOLID_VECTOR_GetJumpAddress(int vec)¶
指定したベクタの登録先アドレス(ジャンプ先)を取得します。
- パラメータ:
vec -- ベクタ番号( SOLID_VECTOR_XXX )
- 戻り値:
ベクタのジャンプ先アドレス
SOLID_VECTOR_SetVector¶
-
int SOLID_VECTOR_SetVector(int vec, SOLID_ADDRESS addr)¶
指定したベクタのジャンプ先アドレスを設定します。(Cortex-Mのみ)
- パラメータ:
vec -- ベクタ番号( SOLID_VECTOR_XXX )
addr -- 設定するジャンプ先アドレス
- 戻り値:
SOLID_ERR_OK: 正常終了それ以外: エラー
SOLID_VECTOR_SetVectorPriority¶
-
int SOLID_VECTOR_SetVectorPriority(int vec, int priority)¶
指定したベクタの割り込み優先度を設定します。(Cortex-Mのみ)
- パラメータ:
vec -- ベクタ番号( SOLID_VECTOR_XXX )
priority -- 設定する優先度
- 戻り値:
SOLID_ERR_OK: 正常終了それ以外: エラー
SOLID_SVC_HANDLER¶
-
typedef struct _SOLID_SVC_HANDLER_ SOLID_SVC_HANDLER¶
-
struct _SOLID_SVC_HANDLER_¶
説明
SVC(SWI)割り込みハンドラ登録用構造体
定義
typedef struct _SOLID_SVC_HANDLER_ { struct _SOLID_SVC_HANDLER_ *pNext; int (*func)(void*, int, SOLID_CPU_CONTEXT*); void* param; int startSvcNo; int endSvcNo; } SOLID_SVC_HANDLER;
メンバー
-
struct _SOLID_SVC_HANDLER_ *pNext¶
コアサービス側で使用
-
int (*func)(void*, int, SOLID_CPU_CONTEXT*)¶
SVC(SWI)割り込み発生時に呼び出される関数。第一引数にparam、第二引数に発生したSVC番号、第三引数にSVCを発行したコンテキスト(PCはSVCの次の命令)が渡されます。
-
void *param¶
発生時に呼び出される関数に渡す引数
-
int startSvcNo¶
対応するSVC(SWI)割り込みの開始番号
-
int endSvcNo¶
対応するSVC(SWI)割り込みの終了番号
-
struct _SOLID_SVC_HANDLER_ *pNext¶
SOLID_SVC_Register¶
-
int SOLID_SVC_Register(SOLID_SVC_HANDLER *pHandler)¶
SVC(SWI)割り込みのハンドラを登録します
ハンドラは必ず
SOLID_SVC_UnRegisterまで確保されている、かつ書き込み可能な領域 (.bss/.data領域またはmalloc()等で確保した領域)を使用してください。- パラメータ:
pHandler -- 登録するハンドラ
- 戻り値:
SOLID_ERR_OK: 正常終了それ以外: エラー
SOLID_SVC_UnRegister¶
-
int SOLID_SVC_UnRegister(SOLID_SVC_HANDLER *pHandler)¶
SVC(SWI)割り込みのハンドラの登録を解除します
- パラメータ:
pHandler -- 登録を解除するハンドラ
- 戻り値:
SOLID_ERR_OK: 正常終了それ以外: エラー