tickGet() と tickAnnounce 以外に VxWorks でシステム時刻を取得する方法はありますか? 特定のタスクのタスク切り替え間の時間を測定したいのですが、 taskSwitchHookAdd 関数の最初と最後の 2 つの tickGet() 値が常に同じであるため、 tickGet() の精度が十分ではないと思います!
2 に答える
タスクの切り替えを試して時間を計る場合は、少なくともマイクロ秒 (us) レベルのタイマーが必要だと思います。
通常、この細かい粒度のタイマー/クロックは、実行しているプラットフォームによってのみ提供されます。組み込みシステムで作業している場合は、ボード サポート パッケージ (存在する場合) のマニュアルを読んで、ボード上のさまざまなタイマーにアクセスするための関数が提供されているかどうかを確認できます。
より低レベルの解決策は、システムで実行されているプロセッサを特定し、プロセッサの内部タイムベース レジスタ (TBR) をポーリングする簡単なアセンブリ コードを記述することです。これには、実行しているプロセッサについて少し調査が必要になる場合がありますが、簡単に実行できます。
PPC ベースのプロセッサで実行している場合は、次のコードを使用して TBR を読み取ることができます。
loop: mftbu rx #load most significant half from TBU
mftbl ry #load least significant half from TBL
mftbu rz #load from TBU again
cmpw rz,rx #see if 'old' = 'new'
bne loop #repeat if two values read from TBU are unequal
x86 ベースのプロセッサーでは、RDTSC
アセンブリー命令を使用してタイム・スタンプ・カウンター (TSC) を読み取ることを検討してください。vxWorks のpentiumALibには、 C を使用して TSC を読みやすくするいくつかのライブラリ関数 (pentiumTscGet64()
および) があります。pentiumTscGet32()
幸運を!
使用しているプラットフォームによって異なりますが、x86 の場合は次を使用できます。
pentiumTscGet64();