arduinoプログラムをc言語に移植する

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
arTOc

arduinoプログラムをc言語に移植する

#1

投稿記事 by arTOc » 12年前

現在arduino言語で書かれたプログラムをc言語で描き直そうとしています。
それでmillis()をc言語で書くことになったのですがどのように書けばいいのかわかりません。

リファレンスによると
「Arduinoボードがプログラムの実行を開始した時から現在までの時間をミリ秒単位で返します。約50日間でオーバーフローし、ゼロに戻ります。 」
と書いてあります。

書き直す場合プログラムを起動した時に時間を記録させる必要があって面倒なのでパソコンが起動してからの時間をミリ秒単位で返す関数を作成したいと思っています。
こんなかんじの関数を作りたいです。

コード:

unsigned long millis(void){
}
os ubuntu
コンパイラ gcc

アバター
みけCAT
記事: 6734
登録日時: 15年前
住所: 千葉県
連絡を取る:

Re: arduinoプログラムをc言語に移植する

#2

投稿記事 by みけCAT » 12年前

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関数を隠蔽するような特殊なライブラリを使用しているのですか?
最後に編集したユーザー みけCAT on 2013年12月01日(日) 22:37 [ 編集 1 回目 ]
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

アバター
みけCAT
記事: 6734
登録日時: 15年前
住所: 千葉県
連絡を取る:

Re: arduinoプログラムをc言語に移植する

#3

投稿記事 by みけCAT » 12年前

パソコンが起動してからの時間は、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
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

arTOc

Re: arduinoプログラムをc言語に移植する

#4

投稿記事 by arTOc » 12年前

>main関数を隠蔽するような特殊なライブラリを使用しているのですか?
arduinoではそのようになっています。

ありがとうございました。
うまく動きました。

閉鎖

“C言語何でも質問掲示板” へ戻る