ページ 1 / 1
arduinoプログラムをc言語に移植する
Posted: 2013年12月01日(日) 21:22
by arTOc
現在arduino言語で書かれたプログラムをc言語で描き直そうとしています。
それでmillis()をc言語で書くことになったのですがどのように書けばいいのかわかりません。
リファレンスによると
「Arduinoボードがプログラムの実行を開始した時から現在までの時間をミリ秒単位で返します。約50日間でオーバーフローし、ゼロに戻ります。 」
と書いてあります。
書き直す場合プログラムを起動した時に時間を記録させる必要があって面倒なのでパソコンが起動してからの時間をミリ秒単位で返す関数を作成したいと思っています。
こんなかんじの関数を作りたいです。
コード:
unsigned long millis(void){
}
os ubuntu
コンパイラ gcc
Re: arduinoプログラムをc言語に移植する
Posted: 2013年12月01日(日) 22:13
by みけCAT
WindowsならGetTickCountまたはTimeGetTime関数で一発なのですが、(TimeGetTime関数の方が精度が高いらしい)
Linuxだと自分の知識ではプログラムを起動したときからの時間の方が測定が簡単だと思います。【編集:下のレスの内容を調べた結果、撤回】
コード:
#include <sys/time.h>
unsigned long millis(void) {
static unsigned long long start=0;
unsigned long long now;
struct timeval tv;
gettimeofday(&tv,NULL);
now=tv_sec*1000ll+tv_usec/1000;
if(start==0) {
start=now;
return 0;
} else {
return (unsigned long)(now-start);
}
}
int main(void) {
/* プログラム起動時に一度呼ぶことにより、プログラム開始時の時刻を記録する */
millis();
/* 処理 */
return 0;
}
テストはしていません。
arTOc さんが書きました:プログラムを起動した時に時間を記録させる必要があって面倒なので
main関数を隠蔽するような特殊なライブラリを使用しているのですか?
Re: arduinoプログラムをc言語に移植する
Posted: 2013年12月01日(日) 22:32
by みけCAT
パソコンが起動してからの時間は、Linuxではclock_gettime関数で取得できるらしいです。
コード:
#include <time.h>
unsigned long millis(void) {
struct timespec tp;
clock_gettime(CLOCK_MONOTONIC,&tp);
return (unsigned long)(tp.tv_sec*1000ul+tp.tv_nsec/1000000);
}
コンパイルオプションに-lrtを追加してください。
情報元:
http://luna2-linux.blogspot.jp/2011/11/blog-post.html
Re: arduinoプログラムをc言語に移植する
Posted: 2013年12月03日(火) 17:05
by arTOc
>main関数を隠蔽するような特殊なライブラリを使用しているのですか?
arduinoではそのようになっています。
ありがとうございました。
うまく動きました。