0

ループ内の関数の開始から終了までの時間を測定したい。この違いは、ここでは重要でない処理を実行する内側の while ループのループ量を設定するために使用されます。

私はこのような関数の時間を計りたい:

#include <wiringPi.h>
#include <time.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <unistd.h>
#define BILLION 1E9

float hz = 1000;
long int nsPerTick = BILLION/hz;

double unprocessed = 1;
struct timespec now;
struct timespec last;
clock_gettime(CLOCK_REALTIME, &last);

[ ... ]

while (1) 
{
    clock_gettime(CLOCK_REALTIME, &now); 

    double diff = (last.tv_nsec - now.tv_nsec );

    unprocessed = unprocessed + (diff/ nsPerTick);
    clock_gettime(CLOCK_REALTIME, &last);


    while (unprocessed >= 1) { 
            unprocessed --;
            DO SOME RANDOM MAGIC;
            }
    }

タイマーの差は常にマイナスです。これがエラーの場所であると言われました:

    if ( (last.tv_nsec - now.tv_nsec)<0) {
         double diff = 1000000000+ last.tv_nsec - now.tv_nsec;
         }
    else {
         double diff = (last.tv_nsec - now.tv_nsec );
    }

それでも、私の変数の差は「-1095043244」のように常に負です(ただし、関数中に費やされた時間はもちろん正です)。

どうしたの?

4

4 に答える 4

1

あなたの最初の問題は、'last.tv_nsec - now.tv_nsec' が間違っていることです。

last.tv_nsec過去にあり (1 に設定されているとしましょう)、now.tv_nsec常に後になります (たとえば、8ns 後なので 9 です)。その場合、last.tv_nsec - now.tv_nsec== 1 - 9 == -8 です。

もう 1 つの問題は、tv_nsec がナノ秒単位の時間ではないことです。そのためには、秒単位の時間を 10 億倍して加算する必要があります。したがって、現在と最後の間の ns の差を取得するには、次のようにします。

((now.tv_sec - last.tv_sec) * ONE_BILLION) + (now.tv_nsec - last.tv_nsec)

(注意: now.tv_nsec と last.tv_nsec はどちらも 10 億未満ですが、一方を他方から引くと -1000000000 未満の値になることに、まだ少し驚いています。 )

于 2013-02-03T20:22:12.653 に答える
0

last.tv_nsec - now.tv_nsecダブルに保管しないでください。

のドキュメントをtime.h見ると、tv_nsecが long として格納されていることがわかります。したがって、次のようなものが必要になります。

long diff = end.tv_nsec - begin.tv_nsec

そうは言っても、ナノ秒を比較するだけではうまくいかない可能性があります。また、秒数も確認する必要があります。したがって、すべてを秒に変換するには、これを使用できます。

long nanosec_diff = end.tv_nsec - begin.tv_nsec;
time_t sec_diff = end.tv_sec - begin.tv_sec; // need <sys/types.h> for time_t
double diff_in_seconds = sec_diff + nanosec_diff / 1000000000.0

また、常に開始時刻から終了時刻を差し引いていることを確認してください (そうしないと、時間は負のままになります)。

そして、そこに行きます!

于 2014-02-17T01:53:30.753 に答える
0

C はわかりませんが、Raspberry Pi でのタイミングの問題であれば、チップに RTC (リアルタイム クロック) がないことが関係している可能性があります。

于 2013-06-10T19:04:36.240 に答える