0

いくつかの IO でポーリングを行うタスクを書きたいと思います。ここで、CPU をブロックするのではなく、1 マイクロ秒ごとに IO をチェックする必要があります。私は比較的 VxWorks の初心者でありusleep(1);、ポーリング ループに a を挿入しても、おそらく必要な処理が行われないことに気付きました。これについてはどうすればよいですか?

私にはsysClkRateGet()十分ではない 60 が返されることがわかりました。私はポーリングして迅速に反応する必要がありますが、CPU で行われている他のことをブロックすることはできないので、私のためにtaskDelay()それを行うことはできないと思います...私のタスクのダウンタイムを短縮できるものは他にありますか (よりも 1/60 秒)?

編集

短いポーリング機能を実行する 1 秒ごとにタイマーを開始する方がはるかにスマートであることがわかったと思います。私は次のようにタイマーをトリガーしました:

timer_t polltimerID;
struct itimerspec poll_time;
poll_time.it_value.tv_sec = 0;
poll_time.it_value.tv_nsec= 1000; 

poll_time.it_interval.tv_sec = 0;
poll_time.it_interval.tv_nsec= 1000; // execute it every 1us

if(timer_create (CLOCK_REALTIME, NULL, &polltimerID))
    printf("problem in timer_create(): %s",strerror(errno));

if(timer_connect (polltimerID,MyPollFunction,0))
    printf("problem in timer_connect(): %s",strerror(errno));

if(timer_settime (polltimerID, 0, &poll_time, NULL))
    printf("problem in timer_settime(): %s",strerror(errno));

しかし、私はまだ正確にはわかりません.タイマーの優先順位は何ですか.現在のタスクを先取りできる場合(およびその方法)は誰ですか?

4

1 に答える 1

2

posixタイマーは、システムクロックから駆動されるため(ご指摘のとおり60Hzです)、必要な動作をしません。

100KHz タイマーを提供する「組み込み」OS 機能はありません。

  • ボード上で未使用のハードウェア タイマーを見つける必要があります (CPU リファレンス マニュアルが役立ちます)。

  • タイマーレジスタを 100KHz に設定する必要があります (これも参照マニュアルが適切です)。

  • タイマー割り込みラインを関数に接続する必要があります: intConnect (vector, fn, arg)

VxWorks カーネル プログラマーズ マニュアルには、割り込みサービス ルーチンの記述に関する情報が記載されています。

于 2013-11-16T02:12:28.633 に答える