773mbar

2014年01月 ≪  12345678910111213141516171819202122232425262728293031 ≫ 2014年02月
TOPスポンサー広告 ≫ Galileoのmillis()TOPIntel Galileo ≫ Galileoのmillis()

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
スポンサー広告 | Comments(-) | Trackbacks(-)

Galileoのmillis()

Galileoのmillos()関数の値がおかしい。
調べてみたら、こんな実装。
ソースは Java/hardware/arduino/x86/cores/arduino/UtilTime.cpp

unsigned long millis( void )
{
    return micros() / 1000;
}

これでは4294967(2^32/1000)、つまり約1時間11分でループしてしまう。
そこで以下のように書き換え。

unsigned long millis( void )
{
  struct timespec t;
  t.tv_sec = t.tv_nsec = 0;
  clock_gettime(CLOCK_REALTIME, &t);
  return (unsigned long)(t.tv_sec)*1000L + t.tv_nsec / 1000000L ;
}

これで32bitフルにカウントされた値が返るようになる。
ちなみにmicros()はこんな実装。それをちょこっと変更しただけ。

unsigned long micros( void )
{
  struct timespec t;
  t.tv_sec = t.tv_nsec = 0;
  /* Considering the system does not suspend CLOCK_REALTIME is welcome.
     However, if in the future our system suspend, we need to replace
     CLOCK_REALTIME by CLOCK_BOOTTIME and apply the proper patches in 
     the kernel. */ 
  clock_gettime(CLOCK_REALTIME, &t);
  return (unsigned long)(t.tv_sec)*1000000L + t.tv_nsec / 1000L ;
}
スポンサーサイト
Intel Galileo | Comments(-) | Trackbacks(-)
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。