« 既読の本などを…… | トップページ | ストレス解消、かなぁ。 »

2006/01/08

【メモ】VxWorksで時刻設定など

お仕事がらみの覚え書き。

#include <time.h>
#include <ifLib.h>
#include <net/if.h>
#include <time.h>
  :
  :
STATUS status ; /* OK, ERROR, etc. */
int result ; /* 0(OK), -1(ERROR), etc. */
  :
/* --- クロック分解能を設定 --- */
{
  status = sysClkRateSet( 8000 ); /* 1 秒間の割込回数を指定: デフォルト100(10msec)、最大8000(125μsec) */
}
/* --- クロック分解能確認 --- */
{
  int rate = sysClkRateGet() ;
  printf( "Clock Rate=%d\n", rate ) ;
}
/* --- 環境変数TIMEZONE設定 --- */
{
  status = putenv( "TIMEZONE=JST::-540::" ) ; /* JST-9 */
}
/* --- 環境変数TIMEZONE確認 --- */
{
  char * tz = (char *)getenv( "TIMEZONE" ) ;
  printf( "TIMEZONE=%s\n", ((tz==NULL)?"":tz) ) ;
}
/* --- 時刻設定 --- */
{
#if 0 /* 時間設定等でよく使用される構造体 */
  struct tm
  {
  int tm_sec; /* seconds after the minute - [0, 59] */
  int tm_min; /* minutes after the hour - [0, 59] */
  int tm_hour; /* hours after midnight - [0, 23] */
  int tm_mday; /* day of the month - [1, 31] */
  int tm_mon; /* months since January - [0, 11] */
  int tm_year; /* years since 1900 */
  int tm_wday; /* days since Sunday - [0, 6] */
  int tm_yday; /* days since January 1 - [0, 365] */
  int tm_isdst; /* Daylight Saving Time flag */
  } ;
  struct timespec
  { /* interval = tv_sec*10**9 + tv_nsec */
  time_t tv_sec; /* seconds */
  long tv_nsec; /* nanoseconds (0 - 1,000,000,000) */
  } ;
#endif
  struct tm tm_val ;
  struct timespec ts_val ;
 
  tm_val.tm_year = 2005-1900 ; /* 年 */
  tm_val.tm_mon = 12-1 ; /* 月 */
  tm_val.tm_mday = 28 ; /* 日 */
  tm_val.tm_hour = 17 ; /* 時 */
  tm_val.tm_min = 30 ; /* 分 */
  tm_val.tm_sec = 0 ; /* 秒 */
  tm_val.tm_isdst = -1 ; /* 季節時間(夏時間)無効 */
  /* ※ tm_wday(週), tm_yday(経過時間) は設定の必要はなし(mktime()内で自動計算されて設定される) */
 
  ts_val.tv_sec = mktime( &tm_val ) ; /* 詳細時間→暦時間変換 */
  if ( ts_val.tv_sec != (time_t)(-1) ) { /* エラー無し */
  ts_val.tv_nsec = 0 ; /* ナノ秒 */
  result = clock_settime( CLOCK_REALTIME, &ts_val ) ;
  }
}
/* --- 時刻確認 --- */
{
  struct timespec ts_val ;
  struct tm * tm_val_p ;
 
  result = clock_gettime( CLOCK_REALTIME, &ts_val ) ;
  tm_val_p = localtime( &(ts_val.tv_sec) ) ;
 
  printf( "%04d/%02d/%02d %02d:%02d:%02d.%06lu\n", \
  (1900+tm_val_p->tm_year), (1+tm_val_p->tm_mon), tm_val_p->tm_mday, \
  tm_val_p->tm_hour, tm_val_p->tm_min, tm_val_p->tm_sec, (ts_val.tv_nsec/1000) \
  ) ;
}

« 既読の本などを…… | トップページ | ストレス解消、かなぁ。 »

覚書」カテゴリの記事

コメント

Vxworksで10msec単位で時間を確認する方法をさがしていてこのページを見つけました。

clock_settime()で時間のセットは出来るのですが、
clock_gettime()で時間を読むと秒単位の時間(tv_sec)はちゃんと変化するのですが、
ナノ秒単位の時間(tv_nsec)が変化しません。
Vxworksの設定など何か必要なのでしょうか?
ちなみに、Vxworks 5.5.1
ハードウェアは、MVME6100(PowerPC)を使ってます。

はじめまして>走って登れるプログラマさん。

私もVxWorksは詳しい訳ではないので、上記メモの内容以上のことはわからないのですが。
とりあえず、お使いの環境では、デフォルトでSystem Clock Rate(sysClkRateGet()で得られる値)は幾つになっていますか?

これは1秒間の割込回数で、タイマの分解能に相当します。
当方の経験した環境では、デフォルトで60(=16.7ms)とか100(=10ms)とかなっているものなどがありました。
これが時刻の最小単位となります。

上記の例だと、sysClockRateSet(8000)とすることで、分解能を125μsecまで上げています。

注意しないといけないのは、設定できる割込回数の上限はシステムにより異なるということで、これを越える値を設定した場合の動作は不定のようです。

システムのマニュアル等で上限値が書かれていればそれを使用できますが、不明な場合はとりあえずデフォルトの値を取得して、それを基準に少しずつRateを上げて設定可能かどうか試してみる、という作業が必要となります。

ただ、これに関係有るとすると、お使いのシステムではSystem Clockの分解能が1になっていることになってしまいます。
絶対無いとは言えませんが、ちょっと考えにくい気もするので、別の要因があるのかも知れません。
申し訳ないですが、その場合はお役に立てそうにありません。

風柳 さん、親切なレスありがとうございます。

ナノ秒単位の時間(tv_nsec)が変化しないと云うのは
私の間違いでした。
時間を表示する間隔を1秒周期にしていたので、
秒単位の時間(tv_sec)しか変化しないように見えていたようです。
System Clock Rateを100にして、1.01秒周期で時間を表示する
ようにしたら、tv_nsecも変化しました。

走って登れるプログラマさん、こんにちは。

なる程、そういうことでしたか。
なにはともあれ、解決したようでよかったです。

コメントを書く

(ウェブ上には掲載しません)

トラックバック


この記事へのトラックバック一覧です: 【メモ】VxWorksで時刻設定など:

« 既読の本などを…… | トップページ | ストレス解消、かなぁ。 »

戻るリンク追加

カレンダー

2024年6月
            1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30            

ココログカレンダーPlus(旧2)

検索


    • Web全体 サイト内
    • 蔵書のISBNを入力して下さい
    • はじめる前
      初級者向け
      上級者向け
      ブログ紹介
      結果を表示

コメントリストツリー化

無料ブログはココログ