マイクロ秒で精度が出るタイマーってご存知ではないでしょうか?
ご存知ならご教授おねがいします。

・環境
OS:XP
使用言語:C、C++
その他:API32使用

よろしくお願いします。

このQ&Aに関連する最新のQ&A

A 回答 (3件)

>実は業務で連続的に16bitのデータを送る通信システムを作成しているのですが、その送信するデータとデータの間のインターバル的な時間をマイクロ秒単位で管理したいのです。


>守秘義務が絡むのであまり詳しくお話できなくて申し訳ありません。。。

インターバルタイムが最低限の時間(オーバーを許容)なら問題ないと思いますが、そのインターバルタイムを死守しないとマズイならWindowsOSでは無理ですので、別のOSで特にリアルタイム性がメインのリアルタイムオペレーティングシステム(RTOS)を捜すべきだと思います。
http://ja.wikipedia.org/wiki/%E3%83%AA%E3%82%A2% …

インターバルタイムのオーバーが許容されても、QueryPerformanceCounterとPerformanceCounterは最近のCPUのターボ・ブーストなどのためで不正確になっています。
ターボ・ブーストとは。
http://www.pasonisan.com/customnavi/cpu_corei/10 …
最近のCPUの場合はこのターボ・ブーストの動作状況次第でQueryPerformanceCounterの値が実際の経過時間とズレてしまうのです。
なので、ブーストしないCPUなどの選択も考えないといけないでしょう。

QueryPerformanceCounterを実時間計測には使えない
http://d.hatena.ne.jp/shiku_otomiya/20100218/p1

あるいは、タイマカウントーを外部のマイコンに任せるとか通信自体を外部のマイコンにさせるとかすれば正確な動作は期待できます。
    • good
    • 0
この回答へのお礼

ご返事ありがとうございます。

どうやらWindowsOS単体では実装は難しそうですね。。。
ある程度のオーバーは許容範囲なので現状のままで行きたいと思います。
それでも厳しくなりましたら教えていただいたURLを参考に、機材、環境レベルでアプローチしてみたいと思います。

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

お礼日時:2011/04/20 17:29

Win32のQueryPerformanceCounterをつかうしかないかな?


http://support.microsoft.com/default.aspx?scid=k …
    • good
    • 0
この回答へのお礼

ご返事ありがとうございます。

URLを参考に自分でも調べてみようと思います。

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

お礼日時:2011/04/20 11:23

たとえタイマーがマイクロ秒単位の精度が出たとしてもマルチタスクOSであるXPが勝手に一定時間ごとにタスクを切り替えるので意味ないと思いますが?


標準的なWindowsにはOSの制約から使い物になるマイクロ秒単位のタイマーは無いと思います。

PerformanceCounterを使っても昨今の動的にクロックをブーストするCPUやマルチコアCPUのお陰でまともに計測できませんし。

なぜ必要なのかを、まず説明してもらうと答えが得られやすいと思います。
    • good
    • 1
この回答へのお礼

ご返事ありがとうございます。

実は業務で連続的に16bitのデータを送る通信システムを作成しているのですが、その送信するデータとデータの間のインターバル的な時間をマイクロ秒単位で管理したいのです。
守秘義務が絡むのであまり詳しくお話できなくて申し訳ありません。。。

お礼日時:2011/04/20 11:21

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qタイマーに時差をつけたい

こんにちは。

タイマーAとタイマーBがあって、タイマーA実行の後
時差(例:0.1秒)でタイマーBを動かす方法を教えてください。
よろしくお願いします。

Aベストアンサー

タイマーCを使ってタイマーA開始0.1秒後にタイマーBを開始する

Qマイクロ秒をはかる

Linuxではそういう関数があるようなのですが
Windowsでマイクロ秒を測定することは無理なのでしょうか?
(ミリ秒のはかり方は調べたら出てきました。)


よろしくお願いします。

Aベストアンサー

QueryPerformanceCounter でがんばる。

但し、かなりハード寄りの知識が要求され、制限もあり、
Windows はリアルタイム性を保証しないので、たいていの場合計測誤差で終わる。
このクラスになると、計測することでかかる負荷でも…。

Windows ではできないものと考えて、要件の方を再検討するのがお勧めです。
ちなみに用途はなんでしょうか?
ユーザインターフェイスなら人間には体感できず無駄ですし、
機器とのインターフェイスなら Windows アプリには保証ができず、
専用の RTOS やドライバなどを検討すべきです。

Qデロンギオイルヒーターのタイマーの故障

デロンギのオイルヒーターの本体についているスイッチON・OFFをするための赤い棒を上げ下げするタイマーが故障して、常にスイッチON状態になりました。そこで電源タイマーにコンセントをさして使おうかと思うのですが、その際本体に悪影響はないでしょうか?また、電源タイマーで時間の狂いにくいのはどれでしょうか?
タイマーの修理はお金がかかると思うので電源タイマーで代用したいのです。

Aベストアンサー

No.2の方に補足ですが、
デロンギのオイルヒータと同じ24時間タイマーの製品もあります。
WH3301WPなど。
これは、別の電気ヒータのサービス品として使われているもので、
オイルヒータにも使えると思います。

また、デジタル式としては、
REVEX デジタルプログラムタイマー PT60D
というのが、Amazonにレビューが書いてありました。
抵抗負荷(ヒータ)で1500WはOKと思われます。

ご参考まで

参考URL:http://ctlg.national.jp/product/info.do?pg=04&hb=WH3301WP

Q単精度計算と倍精度計算

F(x)=(1-x・x)1/2乗において、xの値を0.9、0.99、…0.99999と変化させた場合の単精度計算と倍精度計算の結果を求めるプログラムを教えてください。

Aベストアンサー

#include <stdio.h>
#include <math.h>

int main(){
  double dx;
  float fx;
  double tempd = 1.0f;
  float tempf = 1.0f;

  for(int i = 0;i < 5;i++){
    tempd *= 0.1f;
    printf("x = %-5.5f\n",1.0f-tempd);
    dx = 1.0f - tempd;
    printf("double = %-15.15f\n",sqrt(1.0f-dx*dx));

    tempf *= 0.1f;
    fx = 1.0f - tempf;
    printf("float = %-15.15f\n\n",sqrt(1.0f-fx*fx));
  }

  return 0;
}

こういうこと?

Qオイルヒーター用後付タイマー

タイマー無しのオイルヒーターをタイマー制御したいのですが
ホームセンターなどで販売しておる
タイマー 1000円から4000円ぐらいまでのもの
すべてにオイルヒーターには使用できませんとの記述があります。
オイルヒーターにもつかえるタイマーはございませんでしょうか?

Aベストアンサー

オイルヒーターは最大1500W(15A)も消費する製品です。
ヒーター使用中に電源コードをさわると微熱を持つのが判ると思います。
電源コードは当然抵抗値が小さいのですが、15Aという電流はそれでも熱するほどの大電流です。


簡素なタイマーで15Aも流すと内部が発熱して溶解、発火の原因となります。
1500Wまで対応を謳ったタイマーでなければなりません。

一応1500Wに対応した製品を紹介します。
 デジタルプログラムタイマーII グレーPT50DG
 http://www.amazon.co.jp/dp/B002YWD0ZE

アマゾンのレビューでもオイルヒーターに利用している方がいるようです。

Qユニックス時間(秒)を普通の日付時間(時:分:秒)に直すにはどうすればいいでしょうか。

こんにちわ。質問させて頂きます。

C言語で、pcap.hによってキャプチャされたパケットのタイムスタンプ(秒)を、標準時間と申しますか、時:分:秒に直したいと考えています。

時間変換の関数で、ctime,asctime,localtime等があるのは分かっているので、localtime関数を使おうと思っているのですが、使ってみたところポインタのタイプが違うのでエラーが出てしまいます。

具体的には、
方法(1):time_t変数に代入してやってみる
struct tm *t_st;
time_t timer;
timer = header->ts;
t_st = localtime (&timer);
方法(2):localtime関数に直接放り込む
t_st = localtime (&header->ts);

等を試してみたのですが当然アウトでした。

パケットヘッダの中の時間を表すheader->tsをどうにかlocaltime関数で使いたいと考えています。

これを解決する良い方法はあるでしょうか。
ご存知であればご教授いただけないでしょうか。どうぞよろしくお願いします。

こんにちわ。質問させて頂きます。

C言語で、pcap.hによってキャプチャされたパケットのタイムスタンプ(秒)を、標準時間と申しますか、時:分:秒に直したいと考えています。

時間変換の関数で、ctime,asctime,localtime等があるのは分かっているので、localtime関数を使おうと思っているのですが、使ってみたところポインタのタイプが違うのでエラーが出てしまいます。

具体的には、
方法(1):time_t変数に代入してやってみる
struct tm *t_st;
time_t timer;
timer = header->ts;
t_st = local...続きを読む

Aベストアンサー

time_t timer;
timer = header->ts;
t_st = localtime (&timer);
これでok
t_st->tm_mday
に日付が入ってます

駄目だったとしたらこの部分か
timer = header->ts;
パケットから持ってきたままだと ASCIIの可能性も

Qキッチンタイマーについて

キッチンタイマーについて教えてください。

複数の料理を並行して行う時にどうしてもタイマーが一つでは足りない場合があるのですが、複数の時間を設定できるタイマーって売っていますか?

例:10分後と20分後・40分後と1つのタイマーで複数の時間設定ができるものを探しています。

もしそのような商品がありましたら、教えてください。
キッチンタイマーでなくても複数設定できるものでしたら教えてください。

宜しくお願いします。

Aベストアンサー

下記にようなタイマーがありますよ。

タイマー3つ設定
http://www.amazon.co.jp/dp/B0002ZLCNM/ref=nosim/?tag=biglobe06-src-link-22&linkCode=as1

タイマー2つ設定
http://www.amazon.co.jp/s/ref=nb_ss_k?__mk_ja_JP=%83J%83%5E%83J%83i&url=search-alias%3Dkitchen&field-keywords=T-177BK&x=19&y=16

Qご教授ください。Segmentation faultが突然出ました!

卒論でプログラム作成しているのですが、Segmentation faultがでて困っています。
おそらく以下の個所があやしいと思うのですが、どこが危険か教えていただけるでしょうか?大きいプログラムなため以下にあやしい個所を一部抜粋します。

関数Bが特にあやしいと思っていますが、どう直していいのかわかりません;;

/* main一部 */
struct buf{
int id;
int no;
int wnd;
struct buf *next;
};

struct buf temp;
struct buf *restart1=&temp;
struct buf *resenddata1;
struct buf *rere;

/* 関数Aの一部 */
flowdata = (struct buf *)malloc(sizeof(struct buf));

resenddata1->next=flowdata;
flowdata->next=NULL;
resenddata1=flowdata;
temp_num[n]++;
resenddata1->no=temp_num[n];
resenddata1->wnd=cwnd[n];

/* 関数Bの一部 */
if(restart1->next != NULL){
rere = restart1->next;
restart1->next = rere->next;
if(check_no[n] == rere->wnd){
t_dep[n]=t+ceil(rto[n])*2-d12*2;
if(rere->no > max_no[n]){
max_no[n] = rere->no;
}
}
free(rere);
}

簡単に説明しますと、restartというスタート地点にどんどんresenddataをつなげていっています。(最後にNULL)ある地点にいくとrestart->nextをrereに入れてrereを解放という形です。ちなみにrestart1,restart2と同じようなものがあり、関数Aとrereは同じものを使うようにしています。(resenddata2として.rereは共通)
お手数ですが、よろしくお願いします。

卒論でプログラム作成しているのですが、Segmentation faultがでて困っています。
おそらく以下の個所があやしいと思うのですが、どこが危険か教えていただけるでしょうか?大きいプログラムなため以下にあやしい個所を一部抜粋します。

関数Bが特にあやしいと思っていますが、どう直していいのかわかりません;;

/* main一部 */
struct buf{
int id;
int no;
int wnd;
struct buf *next;
};

struct buf temp;
struct buf *restart1=&temp;
struct buf *resenddata1;
struct buf *rer...続きを読む

Aベストアンサー

>確かに(1)は必要ないですね^^;
いや、必要でした。
resenddata1には今まででに確保したbufのアドレスが入るわけですね。
しかも、No.1のお礼に記述の初期化処理があると。
その場合は確かにこの処理になります。

では更に質問です。
/* 関数Bの一部 */ では、データ列の中間部の開放処理しか書かれていないのですが、先頭部、および、最後尾の処理はどうなっているのでしょうか。

あと、
>struct buf temp;
>struct buf *restart1=&temp;
の部分ですが、この部分の処理に?となってしまいました。

このデータ構造の場合、tempを使わず、main()の始めのほうでmalloc()した領域をrestart1に設定するのが相場なので。

Qテレビをオンタイマーでつけたい。

家に2台(リビング・寝室)テレビがあるのですが、
配置を変えようと思います。

現在、寝室に置いてあるテレビはオン&オフタイマー付のもので
リビングのものには、オフタイマーしかありません。
メーカーは、どちらも同じなのですが・・・(関係ないですね。)

このオンタイマーの付いていないテレビを
オンタイマーでつける方法は、ないでしょうか?

オンタイマーでテレビが朝つかないと起きれないのです。。。

宜しくお願いします。

Aベストアンサー

>コンセントにつなぐタイマー類を使うときには、
寝るときは、テレビを消して布団に入らないといけないのでしょうか??

オンオフを何種類も設定できるので付けておいても大丈夫ですよ。

QC言語上級者になるための学習方法をご教授ください。

はじめまして。
私はC言語はある程度できるようになり、業務でも多少デバッグ/メンテナンスを行っているレベルです。

業務では0からソースを書いたことがなく、人の書いたソースのデバックなどで、まだ真にソースコードを書く力、読む力がついていません。

何かそこそこの大きさの規模のプログラムを自分で作成したり、人のソースコードを解析したりして力をつけたいと思っています。

しかし、ネット上で検索してみても、C言語入門のようなサイトなどしか見当たらなく、数十ステップ程の課題などしか発見できません。

何か程よく参考になりそうなソースコードなどを紹介しているサイトや、こんなものを作ってみればなどの情報などがございましたら
ご教授頂きたいと思います。

抽象的で申し訳ありませんがよろしくお願いします。

Aベストアンサー

ここのサイトなどどうでしょう?使えそうなプログラムもありそうですし、ソースサイズも大きいとおもいます。(じつは私も先日知ったばかりで、詳しくはない)

http://sourceforge.jp/

上記に登録されている、興味あるプログラムのソースが解読できるまでに、様々な知識が必要になると思います。UnixやCの書籍を何冊か購入しないとダメかもしれませんね。日本語処理だけでも一冊の本になるくらいですし。

私の場合、一般人がインターネット使えないころ、有名なストールマンのGnuライブラリが収録されたテープカートリッジを宅配で送ってもらい、テープからSunのワークステーションにソースを落として、なんとかコンパイルが通るようにソースやMakefileを修正したりする作業とかで覚えました。(膨大なSunのマニュアルには圧倒されました。)

なんにしても、書籍を読むだけじゃあダメで、大きめのソース読んで、機能拡張などの修正作業やって、そこで「あれ?コンパイルエラーになるなあ?」とか「ちゃんと動作してくれない」って、実際に手を動かさないとダメみたいですね。

なお、LinuxをPCに開発環境とソースとともにインストールすると、膨大なC言語やC++のソースがインストールされるので、それを読んでみるのもいいと思いますよ。

お勧めの1冊は、アスキー出版の「エキスパートCプログラミング --知られざるCの深層」です。目からウロコの内容です。

ここのサイトなどどうでしょう?使えそうなプログラムもありそうですし、ソースサイズも大きいとおもいます。(じつは私も先日知ったばかりで、詳しくはない)

http://sourceforge.jp/

上記に登録されている、興味あるプログラムのソースが解読できるまでに、様々な知識が必要になると思います。UnixやCの書籍を何冊か購入しないとダメかもしれませんね。日本語処理だけでも一冊の本になるくらいですし。

私の場合、一般人がインターネット使えないころ、有名なストールマンのGnuライブラリが収...続きを読む


人気Q&Aランキング

おすすめ情報