Windows版 iTRONサービスコールの作成 (時間管理機能)
(その2)
システム時刻の設定と参照をするサービスコールは以下のとおりです。
サービスコール名 | 説明 |
---|---|
set_tim | システム時刻の設定を行います。 |
get_tim | システム時刻の参照を行います。 |
システム時刻の設定を行うには以下のサービスコールを使用します。
ER set_tim( const SYSTIME *pk_tim )
引数 | 説明 |
---|---|
pk_tim | 設定する時刻を格納した構造体のポインタ。 |
戻り値 | 説明 |
---|---|
E_OK | 正常終了。 |
E_PAR | パラメータエラー。 |
・サービスコールのソースコードは以下のようになります。
/****************************************************************************/
/*!
* @brief システム時刻の設定.
*
* @param [in] pk_tim 設定する時刻を格納した構造体のポインタ.
*
* @retval エラーコード.
*/
ER set_tim( const SYSTIME *pk_tim )
{
if( !pk_tim ){
return E_PAR;
}
wi_CommonLock();
//! システム時刻を設定する.
wi_SetSystemTime( ((DWORDLONG)(pk_tim->utime) << 32) + (DWORDLONG)(pk_tim->ltime) );
wi_CommonUnlock();
return E_OK;
}
設定する時刻を格納した構造体のポインタが NULL の場合はエラーで終了します。
設定するシステム時刻を引数にして時刻設定関数を呼び出します。
時刻設定関数
時刻設定関数のソースコードは以下のとおりです。
/****************************************************************************/
/*!
* @brief システム時刻の設定.
*
* @param [in] stime 設定する時刻.
*
* @retval なし.
*/
void wi_SetSystemTime( DWORDLONG stime )
{
SystemTime = stime;
}
システム時刻のグローバル変数に引数で指定されたシステム時刻を設定します。
システム時刻を更新する周期タイマ・タスクのソースコードは以下のとおりです。
/****************************************************************************/
/*!
* @brief 周期タイマ・タスク.
*
* @param [in] arg タスクリソース構造体のポインタ.
*
* @retval 常に0を返す.
*/
static unsigned __stdcall TimerTask( void* arg )
{
while( !ExitFlag ){
DWORD btime,ntime,dtime;
//! スリープ前のタイムカウンタを取得する.
btime = GetTickCount();
//! 一定時間スリープさせる.
Sleep( CYCLETIME );
//! スリープ後のタイムカウンタを取得する.
ntime = GetTickCount();
//! 実際にスリープした時間を計算する.
if( ntime >= btime ){
dtime = ntime - btime;
}else{
dtime = btime - ntime;
}
//! システム時刻をカウントアップする.
SystemTime += dtime;
//! 周期起動ハンドラを呼び出す.
wi_CycleTimer( SystemTime );
//! アラーム・ハンドラを呼び出す.
wi_CallAlarmHandler( SystemTime );
}
_endthreadex( 0 );
return 0;
}
周期タイマ・タスクは以下のような処理を行います。
- スリープ前のタイムカウンタを読み込んでおきます。
- CYCLETIME で指定された時間、Sleep()関数でタスクをスリープします。
- スリープ後のタイムカウンタを読み込んで、実際にスリープした時間を計算します。
- システム時刻に 実際にスリープした時間を加算します。
- 周期起動ハンドラ処理を呼び出します。
- アラーム・ハンドラ処理を呼び出します。
- システムが終了されるまで(ExitFlag == TRUE となるまで)上記の処理を繰り返します。
システム時刻を参照するには以下のサービスコールを使用します。
ER get_tim( SYSTIME *pk_tim )
引数 | 説明 |
---|---|
pk_tim | システム時刻を格納する構造体のポインタ。 |
戻り値 | 説明 |
---|---|
E_OK | 正常終了。 |
E_PAR | パラメータエラー。 |
・サービスコールのソースコードは以下のようになります。
/****************************************************************************/
/*!
* @brief システム時刻の参照.
*
* @param [in] pk_tim システム時刻を格納する構造体のポインタ.
*
* @retval エラーコード.
*/
ER get_tim( SYSTIME *pk_tim )
{
DWORDLONG sys_time;
if( !pk_tim ){
return E_PAR;
}
wi_CommonLock();
//! システム時刻を参照する.
sys_time = wi_GetSystemTime();
pk_tim->utime = (short)(sys_time >> 32 & 0x0000FFFF);
pk_tim->ltime = (long )(sys_time & 0xFFFFFFFF);
wi_CommonUnlock();
return E_OK;
}
時刻を格納する構造体のポインタが NULL の場合はエラーで終了します。
システム時刻を格納する領域のポインタを引数にして時刻参照関数を呼び出します。
時刻参照関数
時刻参照関数のソースコードは以下のとおりです。
/****************************************************************************/
/*!
* @brief システム時刻の参照.
*
* @param なし.
*
* @retval システム時刻.
*/
DWORDLONG wi_GetSystemTime( void )
{
return SystemTime;
}
システム時刻を戻り値として返します。