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;
}
	

システム時刻を戻り値として返します。



Windowsは米国Microsoft Corporationの登録商標です。