タイマ¶
タイマ APIでは、システム起動からの経過時間の取得、およびタイマの登録/解除ができます。
タイマで登録した関数は、コアサービスが内部で所有しているスタックを使用して、SVC(AARCH32)/EL1h(AARCH64)モードで 呼び出されます。
API¶
タイマ関連のAPIを使用するには、solid_timer.h をインクルードしてください。
#include "solid_timer.h"
タイマタイプ¶
SOLID_TIMER_HANDLER¶
-
typedef struct _SOLID_TIMER_HANDLER_ SOLID_TIMER_HANDLER¶
-
struct _SOLID_TIMER_HANDLER_¶
説明
タイマ登録用ハンドラ
定義
typedef struct _SOLID_TIMER_HANDLER_ { struct _SOLID_TIMER_HANDLER_ *pNext; struct _SOLID_TIMER_HANDLER_ *pCallQ; uint64_t globalTick; int type; uint32_t time; void (*func)(void*, SOLID_CPU_CONTEXT*); void* param; } SOLID_TIMER_HANDLER;
メンバー
-
struct _SOLID_TIMER_HANDLER_ *pNext¶
SOLID側で使用
-
struct _SOLID_TIMER_HANDLER_ *pCallQ¶
SOLID側で使用
-
uint64_t globalTick¶
SOLID側で使用 / any:SOLID_TIMER_TYPE_GLOBALTICK 指定時はここにtick値を設定
-
int type¶
-
uint32_t time¶
タイマ通知をする時間(usec)
-
void (*func)(void*, SOLID_CPU_CONTEXT*)¶
タイマ通知時に呼び出される関数
-
void *param¶
タイマ通知時に呼び出される関数のパラメータ
-
struct _SOLID_TIMER_HANDLER_ *pNext¶
SOLID_TIMER_ToUsec¶
-
uint64_t SOLID_TIMER_ToUsec(unsigned long long ticks)¶
tick値から時間(usec)に変換します
- パラメータ
ticks -- tick値
- 戻り値
変換した時間(usec)
SOLID_TIMER_RegisterTimer¶
-
int SOLID_TIMER_RegisterTimer(SOLID_TIMER_HANDLER *pHandler)¶
タイマを登録します
- パラメータ
pHandler -- 登録するタイマの情報(関数呼び出し後も保持する必要があります)
- 戻り値
SOLID_ERR_OK
: 正常終了それ以外: エラー
SOLID_TIMER_UnRegisterTimer¶
-
int SOLID_TIMER_UnRegisterTimer(SOLID_TIMER_HANDLER *pHandler)¶
タイマの登録を解除します
ワンショットタイマの場合、自動的に解除されますのでこの関数を呼び出す必要はありません
- パラメータ
pHandler -- 登録時に使用したタイマの情報
- 戻り値
SOLID_ERR_OK
: 正常終了それ以外: エラー
SOLID_TIMER_WaitNsec¶
-
void SOLID_TIMER_WaitNsec(unsigned long nsec)¶
指定された時間(nsec)以下を待ちます(ビジーループ)
- パラメータ
nsec -- 待ち時間
SOLID_TIMER_GetTicksPerSec¶
-
uint32_t SOLID_TIMER_GetTicksPerSec(void)¶
1秒当たりのtick数を取得
- 戻り値
1秒当たりのtick数
SOLID_TIMER_GetMaxTicks¶
-
uint64_t SOLID_TIMER_GetMaxTicks(void)¶
タイマで設定可能な最長時間(tick)を取得
- 戻り値
タイマで設定可能な最大tick値
SOLID_TIMER_GetMaxTimerTime¶
-
uint64_t SOLID_TIMER_GetMaxTimerTime(void)¶
タイマで設定可能な最長時間(us)を取得
- 戻り値
タイマで設定可能な最長時間(us)
タイマの要実装関数¶
SOLIDのタイマは、1つのハードウェアタイマで動作しますが、誤差を軽減するためにフリーランのカウンタを別に用意すること( SOLID_USE_GLOBALTICK
)で、より精度の高いタイマ動作が可能な設計になっています。
SMP時には、各CPU間の時刻同期のため、 SOLID_USE_GLOBALTICK
が必須となります。
タイマ関連の要実装関数の定義は、impl_timer.h にあります。
#include "impl_timer.h"
IMPL_TIMER_INFO¶
-
typedef struct _IMPL_TIMER_INFO_ IMPL_TIMER_INFO¶
-
struct _IMPL_TIMER_INFO_¶
説明
タイマ情報の構造体
定義
typedef struct _IMPL_TIMER_INFO_ { uint32_t tickspersec; uint32_t maxticks; int intno; int priority; int config; } IMPL_TIMER_INFO;
メンバー
-
uint32_t tickspersec¶
1秒当たりのtick数
-
uint32_t maxticks¶
タイマで設定可能な最大tick数
-
int intno¶
タイマ発火時の割り込み番号
-
int priority¶
タイマの割り込み優先度
-
int config¶
タイマの割り込み設定:
SOLID_INTC_HANDLER
参照
-
uint32_t tickspersec¶
IMPL_TIMER_Init¶
-
void IMPL_TIMER_Init(IMPL_TIMER_INFO *pInfo)¶
SOLID用のタイマを初期化します
初期化後、
pInfo
にタイマに関する情報を格納してください- パラメータ
pInfo -- タイマの情報
IMPL_TIMER_GetTimerTick¶
-
uint32_t IMPL_TIMER_GetTimerTick()¶
直前の
IMPL_TIMER_SetTimer
からの経過時間(tick数)を返してください- 戻り値
経過したtick数
IMPL_TIMER_SetTimer¶
-
void IMPL_TIMER_SetTimer(uint32_t ticks)¶
タイマを設定します
設定時間が経過したら、
IMPL_TIMER_Init
で通知した割り込みを発生させてください- パラメータ
ticks -- 設定するタイマ値(tick数)
IMPL_TIMER_ClearInterrupt¶
-
void IMPL_TIMER_ClearInterrupt(void)¶
タイマの割り込みをクリアします
割込み発生時にタイマ内部の割込みクリア・終了処理が必要な場合は後処理を実装してください
フリーランカウンタの要実装関数¶
フリーランカウンタの要実装関数の定義は、impl_globaltick.h にあります。
#include "impl_globaltick.h"
IMPL_GLOBAL_TICK_INFO¶
-
typedef struct _IMPL_GLOBAL_TICK_INFO_ IMPL_GLOBAL_TICK_INFO¶
IMPL_GLOBAL_TICK_Init¶
-
void IMPL_GLOBAL_TICK_Init(IMPL_GLOBAL_TICK_INFO *pInfo)¶
SOLID用のフリーランカウンタを初期化します
ハードウェアをフリーランモード(最大値までカウントしたら0に戻る状態)で初期化し、
pInfo
にフリーランカウンタに関する情報を格納してください- パラメータ
pInfo -- フリーランカウンタの情報を格納するバッファ
IMPL_GLOBAL_TICK_GetCurrent¶
-
uint64_t IMPL_GLOBAL_TICK_GetCurrent(void)¶
フリーランカウンタの現在のtick値を取得します。
- 戻り値
現在のtick値