タイマ

タイマ 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

タイマのタイプ(SOLID_TIMER_TYPE_XXX)

uint32_t time

タイマ通知をする時間(μsec)

void (*func)(void*, SOLID_CPU_CONTEXT*)

タイマ通知時に呼び出される関数

void *param

タイマ通知時に呼び出される関数のパラメータ

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_TIMER_UnRegisterTimer

int SOLID_TIMER_UnRegisterTimer(SOLID_TIMER_HANDLER *pHandler)

タイマの登録を解除します

ワンショットタイマの場合、自動的に解除されますのでこの関数を呼び出す必要はありません

パラメータ
  • pHandler -- 登録時に使用したタイマの情報

戻り値

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 参照

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
struct _IMPL_GLOBAL_TICK_INFO_

説明

フリーランカウンタ情報の構造体

定義

typedef struct _IMPL_GLOBAL_TICK_INFO_ {
    uint64_t maxticks;
    uint64_t tickspersec;
} IMPL_GLOBAL_TICK_INFO;

メンバー

uint64_t maxticks

フリーランカウンタで計測可能な最大tick数

uint64_t tickspersec

1秒当たりのtick数

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)

フリーランカウンタの再開

省電力等によりタイマを再開する時に呼びだされます。フリーランカウンタを停止した場合は、ここで再開処理を行ってください。