picox  0.1
Xtime

時間を扱うための関数等 [詳解]

Xtime 連携図

データ構造

struct  XTimeVal
 高精度のシステム時刻を格納するための型です [詳解]
 

マクロ定義

#define X_TICKS_FOREVER   ((XTicks)-1)
 待ち関数で永久待ちを表す特殊値です [詳解]
 
#define X_TICKS_PER_SEC   X_CONF_TICKS_PER_SEC
 

型定義

typedef int32_t XMSeconds
 ミリ秒単位の時間を格納する型です
 
typedef int32_t XSeconds
 秒単位の時間を格納する型です [詳解]
 
typedef int32_t XTicks
 システムチックを格納する型です
 
typedef uint32_t XTime
 time_tの代替をするシステム時刻を格納するための型です [詳解]
 
typedef int32_t XUSeconds
 マイクロ秒単位の時間を格納する型です
 

関数

static XTimeVal x_gettimeofday2 (void)
 現在時刻を返します
 

変数

XTime tv_sec
 
int32_t tv_usec
 

user_porting_functions

XTicks x_port_ticks_now (void)
 現在のチック時間を返します
 
int x_port_gettimeofday (XTimeVal *tv, void *tz_dammy)
 現在時刻を返します [詳解]
 
void x_port_msleep (XMSeconds msec)
 ミリ秒単位のスリープを行います [詳解]
 
void x_port_usleep (XUSeconds usec)
 マイクロ秒単位のスリープを行います [詳解]
 
void x_port_mdelay (XMSeconds msec)
 ミリ秒単位のディレイを行います [詳解]
 
void x_port_udelay (XUSeconds usec)
 マイクロ秒単位のディレイを行います [詳解]
 
#define x_ticks_now   x_port_ticks_now
 
#define x_gettimeofday   x_port_gettimeofday
 
#define x_msleep   x_port_msleep
 
#define x_usleep   x_port_usleep
 
#define x_mdelay   x_port_mdelay
 
#define x_udelay   x_port_mdelay
 

time_conversions

X秒からチックへの変換の際はチック単位に切り上げし、チックからX秒への変換は切 り下げます。 時間待ちが最終的にはチック単位で行われるため、指定時間以上の待ち時間を確保す ることがこの変換規則の目的です。

static XTicks x_msec_to_ticks (XMSeconds msec)
 ミリ秒をチックに変換した値を返します
 
static XTicks x_usec_to_ticks (XUSeconds usec)
 マイクロ秒をチックに変換した値を返します
 
static XMSeconds x_ticks_to_msec (XTicks ticks)
 チックをミリ秒に変換した値を返します
 
static XUSeconds x_ticks_to_usec (XTicks ticks)
 チックをマイクロ秒に変換した値を返します
 

time_conversion_macros

同等の関数のマクロ版です

#define X_MSEC_TO_TICKS(msec)    (X_DIV_ROUNDUP((msec) * X_TICKS_PER_SEC, 1000))
 
#define X_USEC_TO_TICKS(usec)    (X_DIV_ROUNDUP((usec) * X_TICKS_PER_SEC, 1000) / 1000)
 
#define X_TICKS_TO_MSEC(ticks)   (((ticks) * 1000) / X_TICKS_PER_SEC)
 
#define X_TICKS_TO_USEC(ticks)   ((((ticks) * 1000) / X_TICKS_PER_SEC) * 1000)
 

timeval_operations

以下リンク先のstruct timevalに対する操作の互換マクロです。XTimeValに対して使 用します。

https://linuxjm.osdn.jp/html/LDP_man-pages/man3/timeradd.3.html

#define x_timerclear(tvp)    ((tvp)->tv_sec = (tvp)->tv_usec = 0)
 
#define x_timerisset(tvp)    ((tvp)->tv_sec || (tvp)->tv_usec)
 
#define x_timercmp(tvp, uvp, cmp)
 
#define x_timeradd(tvp, uvp, vvp)
 
#define x_timersub(tvp, uvp, vvp)
 

詳解

時間を扱うための関数等

マクロ定義詳解

#define X_TICKS_FOREVER   ((XTicks)-1)

待ち関数で永久待ちを表す特殊値です

マルチタスク系の特定の関数でのみ有効です。

#define X_TICKS_PER_SEC   X_CONF_TICKS_PER_SEC
#define x_timeradd (   tvp,
  uvp,
  vvp 
)
値:
do { \
(vvp)->tv_sec = (tvp)->tv_sec + (uvp)->tv_sec; \
(vvp)->tv_usec = (tvp)->tv_usec + (uvp)->tv_usec; \
if ((vvp)->tv_usec >= X_INT32_C(1000000)) \
{ \
(vvp)->tv_sec++; \
(vvp)->tv_usec -= X_INT32_C(1000000); \
} \
} while (0)
#define x_timercmp (   tvp,
  uvp,
  cmp 
)
値:
(((tvp)->tv_sec == (uvp)->tv_sec) ? \
((tvp)->tv_usec cmp (uvp)->tv_usec) : \
((tvp)->tv_sec cmp (uvp)->tv_sec))
#define x_timersub (   tvp,
  uvp,
  vvp 
)
値:
do { \
(vvp)->tv_sec = (tvp)->tv_sec - (uvp)->tv_sec; \
(vvp)->tv_usec = (tvp)->tv_usec - (uvp)->tv_usec; \
if ((vvp)->tv_usec < 0) \
{ \
(vvp)->tv_sec--; \
(vvp)->tv_usec += X_INT32_C(1000000); \
} \
} while (0)

型定義詳解

typedef int32_t XSeconds

秒単位の時間を格納する型です

XTimeはUNIX時間が基準ですが、XSecondsは単純な秒数として扱うことを意図してい ます。

typedef uint32_t XTime

time_tの代替をするシステム時刻を格納するための型です

POSIX互換システム風にUNIX時間1970年1月1日0時0分0秒(ただしタイムゾーンは考慮 しない)からの経過秒数を表します。 旧いシステムではtime_tは32bit符号ありで実装されることが多く、2038年問題があ りますが、XTimeは符号なしなので2106年まで保持可能です。

関数詳解

int x_port_gettimeofday ( XTimeVal tv,
void *  tz_dammy 
)

現在時刻を返します

POSIX標準のgettimeofday()のpicox版です。本来は第2引数にタイムゾーンを指定し ますが、picoxは対応していないため、ダミーの引数として常に無視します。

ポインタを渡すのが面倒な時はx_gettimeofday2()を使用するとXTimeValを戻り値か ら直接取得できます。

https://linuxjm.osdn.jp/html/LDP_man-pages/man2/gettimeofday.2.html

void x_port_mdelay ( XMSeconds  msec)

ミリ秒単位のディレイを行います

覚え書き
スリープとディレイの違いは、X_CONF_UDELAY_IMPL_TYPEのドキュメントを参照して ください。
参照
X_CONF_MDELAY_IMPL_TYPE
void x_port_msleep ( XMSeconds  msec)

ミリ秒単位のスリープを行います

精度は実装次第ですが、通常はチック周期に切り上げられると考えてください。

覚え書き
ユーザーが移植を行う場合、少なくとも指定時間以上の待ちを保証できるように実装 してください。
void x_port_udelay ( XUSeconds  usec)

マイクロ秒単位のディレイを行います

覚え書き
スリープとディレイの違いは、X_CONF_MDELAY_IMPL_TYPEのドキュメントを参照して ください。
参照
X_CONF_UDELAY_IMPL_TYPE
void x_port_usleep ( XUSeconds  usec)

マイクロ秒単位のスリープを行います

覚え書き
注意点はx_port_msleep()と同様です。

変数詳解

int32_t tv_usec