タイマ
タイマ APIでは、システム起動からの経過時間の取得、およびタイマの登録/解除ができます。
タイマで登録した関数は、コアサービスが内部で所有しているスタックを使用して、SVC(AArch32)/EL1h(AArch64)モードで 呼び出されます。
API
タイマ関連のAPIを使用するには、solid_timer.h
をインクルードしてください。
#include "solid_timer.h"
タイマタイプ
-
SOLID_TIMER_TYPE_ONESHOT
-
SOLID_TIMER_TYPE_INTERVAL
-
SOLID_TIMER_TYPE_GLOBALTICK
定数
名前
値
説明
SOLID_TIMER_TYPE_ONESHOT
0
ワンショットタイマ : 自動的に登録解除
SOLID_TIMER_TYPE_INTERVAL
1
インターバルタイマ :
SOLID_TIMER_UnRegisterTimer
するまで定期的に呼ばれるSOLID_TIMER_TYPE_GLOBALTICK
2
TICK指定のタイマ : 相対時間ではなく、tick値で登録
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側で使用 /
SOLID_TIMER_TYPE_GLOBALTICK
指定時はここにtick値を設定
-
int type
-
uint32_t time
タイマ通知をする時間(μsec)
-
void (*func)(void*, SOLID_CPU_CONTEXT*)
タイマ通知時に呼び出される関数
-
void *param
タイマ通知時に呼び出される関数のパラメータ
-
struct _SOLID_TIMER_HANDLER_ *pNext
SOLID_TIMER_GetCurrentTick
-
uint64_t SOLID_TIMER_GetCurrentTick()
タイマの現在の経過tickを取得します
- 戻り値
現在のtick値
SOLID_TIMER_ToUsec
-
uint64_t SOLID_TIMER_ToUsec(unsigned long long ticks)
tick値から時間(μsec)に変換します
- パラメータ
ticks -- tick値
- 戻り値
変換した時間(μsec)
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)
タイマで設定可能な最長時間(μs)を取得
- 戻り値
タイマで設定可能な最長時間(μs)
SOLID_TIMER_Suspend
-
void SOLID_TIMER_Suspend(void)
タイマの一時停止
省電力等により、タイマを一時停止する場合に呼び出してください。この呼び出しにより、タイマの一時停止および使用している割り込みの無効化を行います。
SOLID_TIMER_Resume
-
void SOLID_TIMER_Resume(void)
タイマの再開
省電力等により、タイマを再開する場合に呼び出してください。この呼び出しにより、タイマの再開および使用している割り込みの有効化を行います。
タイマの要実装関数
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_TIMER_Suspend
-
void IMPL_TIMER_Suspend(void)
タイマの一時停止
省電力等によりタイマを一時停止する時に呼びだされます。タイマを停止できる場合は、ここで停止処理を行ってください。
IMPL_TIMER_Resume
-
void IMPL_TIMER_Resume(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値
IMPL_GLOBAL_TICK_Suspend
-
void IMPL_GLOBAL_TICK_Suspend(void)
フリーランカウンタの一時停止
省電力等によりタイマを一時停止する時に呼びだされます。フリーランカウンタを停止できる場合は、ここで停止処理を行ってください。
IMPL_GLOBAL_TICK_Resume
-
void IMPL_GLOBAL_TICK_Resume(void)
フリーランカウンタの再開
省電力等によりタイマを再開する時に呼びだされます。フリーランカウンタを停止した場合は、ここで再開処理を行ってください。