私は現在、センサーからデータを取得するために10msごとに呼び出される関数を用意しようとしています。Python、Raspberry pi、正確に10ミリ秒のタスクを呼び出す
私はgpio interuptからコールバックをtriggringしていましたが、センサーを変更しました。私が現在使っているコールバックにはINTピンがありません。
私の目標は、タイマーによって生成された内部的な干渉で同じ動作をすることです。
私はこの topicimport threading
def work():
threading.Timer(0.25, work).start()
print(time.time())
print "stackoverflow"
work()
からこれを試してみました。しかし、私はそれを実行したとき、私はタイマーが本当に正確ではない、それはあなたが見ることができるように時間をかけてderivatingだことがわかります。
1494418413.1584847
stackoverflow
1494418413.1686869
stackoverflow
1494418413.1788757
stackoverflow
1494418413.1890721
stackoverflow
1494418413.1992736
stackoverflow
1494418413.2094712
stackoverflow
1494418413.2196639
stackoverflow
1494418413.2298684
stackoverflow
1494418413.2400634
stackoverflow
1494418413.2502584
stackoverflow
1494418413.2604961
stackoverflow
1494418413.270702
stackoverflow
1494418413.2808678
stackoverflow
1494418413.2910736
stackoverflow
1494418413.301277
stackoverflow
したがって、タイマーは10ミリ秒ごとに0.2ミリ秒で微分されます。これは、数秒後にはかなり大きな偏りです。
私が知っているのは、実際には「リアルタイム」のために作られたものではありませんが、それを行う方法があるはずです。
誰かが既にpythonで時間制限を処理しなければならない場合は、私はいくつかのアドバイスを持ってうれしいです。
ありがとうございました。
タイマー自体の時間と印刷を許可していないため、漂っています。実際の時間と次の10msが経過する時間の差に基づいてタイマーを設定すると、タイミングがずれなくなります。たとえば、ループを開始する前の時間を取得し、ターゲットを10ms単位で増分して維持し、タイマーを(target-currenttime)の期間開始し、タイマーが満了するとターゲットに10msを追加して再び開始します。ジッタが許容できるかどうかを自分で確認する必要があります。つまり、使用シナリオ全体で平均とピークを測定してください。 – barny
答えがありがとう、私はタイマーのスケジューリングの時間を測定していませんが、そのようなドリフト。 私のポイントは、この10msのために非常に正確でありたいと思っています。この方法の問題は、私がいつもタイマーのスケジュールからドリフトすることです。 – Arkaik
これを冒頭に一度だけ定義し、期限切れ後に再び自動的にタイマーを開始させる方法はありますか? – Arkaik