2009-07-03 8 views
7

私は、OMAP ZOOM 3430 MDKに付属のTMS32064x + DSPでコードを実行するのに必要なクロック・サイレンスを測定しようとしています。私はDSPチップの "Programmer's Guide"を見て、DSPがclock()機能をサポートしていると言います。私は何私のハードウェアでtime.h clock()が壊れていますか?

は、私はちょうど

start = clock(); 
for (i=0;i<100;i++){ 
    /* do something here */ 
} 
stop = clock(); 
total = stop - start; 

を行い、その後、ARMプロセッサと、以前に割り当てられた共有メモリへの「スタート」、「ストップ」と「合計」の値を入れて、本当に簡単です。次に、それを単にARM側の画面に表示します。

問題は、私が最初に実行したときに、常に同じ「合計」値を得て、次の実行では常に0になります。 「開始」値と「停止」値は「合計」値と一緒に使用されます。

最も奇妙なことは、彼らは少しパターンに従っているようだということです! Apparantly

# ./sampleapp 
Total = 63744 
Start clock() value = 0x000000f9 
Stop clock() value = 0x0000f9f9 
# ./sampleapp 
Total = 4177526784 
Start clock() value = 0x00f9f9f9 
Stop clock() value = 0xf9f9f9f9 
# ./sampleapp 
Total clock cyles = 0 
Start clock() value = 0xf9f9f9f9 
Stop clock() value = 0xf9f9f9f9 

、クロック()がうまく機能していないが、これが原因で、私は間違って何かのや物のこのタイプは、ハードウェアでサポートされていないためであるならば、私はよく分からない。私は以下の出力を置きます私が持っています。これがなぜ起こっているのでしょうか?

+0

クロックがこれらの値を返すことは間違いありませんか?共有メモリにアクセスする際の問題を見ているだけでしょうか? – Vicky

+0

これをチェックするには、戻り値の1つ、たとえば "start"をあらかじめ定義された値または共有メモリアドレスの値に変更するだけで、画面上で正しいものが得られます。 –

+0

TIには例がありますか?他のコーデックの例では、実行経過時間も計算していたと思います。彼らがclock()APIを使用したかどうかは分かりません。しかし、それはデコーダやエンコーダのサンプルコードで動作するようです。 – simon

答えて

2

これまでの質問を読んで、これまでの質問より、オリジナルポスターは、これまでの投稿者よりもかなり多くの知識を持っていて、clock()が壊れている(またはサポートされていない)未定義の結果)はかなり可能性が高いようです。

+0

私はこれも事実だと考え始めたので、もうこの質問を未回答のままにする必要はありません。皆さんありがとうございました。 –

+0

あなたの謙虚さは、あなたが貢献者よりもかなり知識があると信じることに同意し始め、それを答えたものとして選択することができます。 nice :)私は、OMAPでclock()も壊れていることに同意します。 – ustun

+0

clock()に問題があるのはあなただけの人ではないようです。おそらくここで提供される解決策は助けになるでしょう。 http://stackoverflow.com/questions/588307/c-obtaining-milliseconds-time-on-linux-clock-doesnt-seem-to-work-properly – Matt

0

奇妙なことに、なぜに事前に割り当てられたの共有メモリが必要ですか。なぜ普通のスタック変数で試してみませんか?私が紛失しているものはありますか?

+2

はい、表示されたコードがあるプロセッサ、つまりDSPで実行され、結果を表示するコードが別のメインARM CPU上で実行されるという事実はありません。 – unwind

0

おそらく時計を最初に初期化する必要があります。

+0

私が知っている限り、clock()は参照ポイントを実行可能ファイルの最初の呼び出しとして取ります。私はその値を手動で初期化/リセットする方法を知らない。あなたはどうやってそれをしますか? –

+0

私はマニュアルページをもう一度読み直しました。標準はそのようなことをする方法を提供しません。 – swegi

0

どのように印刷していますか?おそらく問題は実際に結果を表示することでしょうか?

ほとんどのプラットフォームでは、clock_tは長いlongです。 %dでprintfを使用している場合は、表示されている結果が変わる可能性があります。

+0

sizeof(clock_t)が出力され、4です。これはunsigned intと定義されています。 –

+0

この静脈を持続させるには、印刷コードが良いと証明されていますか?同じ種類のメモリ転送/プリントアウトでいくつかの値を入力して、それらが正しく横切っているかどうかを確認しましたか? – DevSolar

0

開始変数と終了変数の型が 'clock_t'で、共有メモリが渡された数値の解釈で同じと仮定すると、問題の呼び出しは時計の呼び出しではなく、開始終了時刻の差。

あなたの問題は2つの間の共有メモリにあると思います。 2つのプロセッサー間でメモリーをどのように共有しているかを示すコードを投稿できますか?

+0

私は単に、dmmcopyサンプルで使用したのと同じTIメソッドを使用します。 MPU側のサンプル: http://gitorious.org/ti-dspbridge/userspace/blobs/master/source/samples/mpu/src/dmmcopy/dmmcopy.c DSPサンプル: ます。http:// gitorious。 しかし、私はハード・コードされた値をDSPからCPUに正しく渡すことができるので、問題は共有メモリにあるとは思わないおよび総変数。 –

0

おそらく、インラインアセンブリを使用して、CPUのカウンタレジスタに直接アクセスすることができます。

TMS320C64x +には、TSCL、TSCHに64ビットタイムスタンプレジスタがあります。 リセット時にカウンタが有効になっていない場合は、を最初にレジスタに書き込んでカウンタを開始する必要があります(これはclockで問題になる可能性があります)。レジスタからの読み込みは、それぞれの命令が別々の命令で読み出されなければならない(そして、割り込みを得ることができるため...)。

+0

私はこれが古い質問だったのか分かりませんでした。これは私がタイムスタンプに注意を払わないために得られるものです! –

関連する問題