このトピックでは、人事タイマーと実際の精度の問題についてより詳しく説明します。HRタイマの精度試験ケース
私はそれらについて多くのドキュメントを学びました。そして、それらは、Linuxカーネルモジュール内の実行を遅らせる問題に対して、CPUのコストが低く、タイミングの精度が高いという点で最も信頼性の高い解決策であると確信しました。いくつかの時間に重大なドライバーもこのようなものを使用しますhttps://dev.openwrt.org/browser/trunk/target/linux/generic/files/drivers/pwm/gpio-pwm.c?rev=35328)。
あなたにとってもそれは正しいですか?
ここで私がこれまで見た中で最も包括的で詳細な文書の1つです:https://www.landley.net/kdocs/ols/2006/ols2006v1-pages-333-346.pdf。
HRタイマーはjiffiesの解像度を下すことを約束しますが、残念ながら私のシステムでは6ms未満の遅延について予想される結果が得られませんでした(後で詳しく説明します)。
私の環境は次のとおりです。
- のWindows 10 PRO 64ビット/ 8GBのRAM/CPU Intelの4つのコア
- VMware Playerの12
仮想化OSのLinuxのミント18.1 64ビット
カーネル構成
- バージョン:4.10.0-24-ge neric = Y
- CONFIG_HIGH_RES_TIMERS
- CONFIG_POSIX_TIMERS = Y
- CONFIG_NO_HZ_COMMON = Y
- CONFIG_NO_HZ_IDLE = Y
- CONFIG_NO_HZ = Y
- CONFIG_HZ_250 = Y
CONFIG_HZ = 250
/sys/devices/system/clocksource/clocksource0/available_clocksource => ts C HPET acpi_pm
/SYS /デバイス/システム/クロックソース/ clocksource0/current_clocksource =>
TSC私は自由で公開Linuxカーネルモジュールを書いたベンチマークを行うにはURL https://bitbucket.org/DareDevilDev/hr-timers-tester/。 READMEファイルには、自分でコンパイルして実行するための指示があります。
それは次のように一連のサイクルを実行する:
- 米国10 .. 90米100のUS
- 1 MSによる米国10
- 100 US .. 900米国増分だけインクリメント。 9ms、1ms増分
- 10ms .. 90ms、10ms増分
- 100ms ..900ミリ秒、100ミリ秒
- によって増加し、最終的に1秒
タイミングが「ktime_get」機能により測定され、事前に割り当てられた配列に格納され、高速性能のために、内部の不要な遅延を回避するためにされていますhrタイマーコールバック。
データを収集した後、モジュールはサンプリングデータテーブルを出力します。あなたは上記のカーネル・ログ・ダンプで見ることができるように、6つのMSは最初の予想遅延サンプルです
10 uS = 41082 nS
20 uS = 23955 nS
30 uS = 478361 nS
40 uS = 27341 nS
50 uS = 806875 nS
60 uS = 139721 nS
70 uS = 963793 nS
80 uS = 39475 nS
90 uS = 175736 nS
100 uS = 1096272 nS
200 uS = 10099 nS
300 uS = 967644 nS
400 uS = 999006 nS
500 uS = 1025254 nS
600 uS = 1125488 nS
700 uS = 982296 nS
800 uS = 1011911 nS
900 uS = 978652 nS
1000 uS = 1985231 nS
2000 uS = 1984367 nS
3000 uS = 2068547 nS
4000 uS = 5000319 nS
5000 uS = 4144947 nS
6000 uS = 6047991 nS <= First expected delay!
7000 uS = 6835180 nS
8000 uS = 8057504 nS
9000 uS = 9218573 nS
10000 uS = 10435313 nS
...のように...
:私のシナリオ関連データについては
です。
私は私のC.H.I.P.に同じ試験を繰り返した。 1GHzで動作し、Ubuntu 14.04(カーネル4.4.13、HZ = 200)を装備したARMベースのボードラズベリーのようなシステムです(https://getchip.com/pages/chip)。この場合
私は良い結果を得た:30 = 44666 nS
40 = 24125 nS
50 = 49208 nS
60 = 60208 nS
70 = 70042 nS
80 = 78334 nS
90 = 89708 nS
100 = 126083 nS
200 = 184917 nS
300 = 302917 nS <= First expected delay!
400 = 395000 nS
500 = 515333 nS
600 = 591583 nS
700 = 697458 nS
800 = 800875 nS
900 = 900125 nS
1000 = 1013375 nS
...のように...その安いボードは良い結果に
は300 uSとするので来ます。
あなたはどう思いますか?プラットフォームに依存しない方法でHRタイマーの精度を上げるには良い方法がありますか? HRタイマーは正確なタイミングに間違った解決策です(ハードウェアドライバを作成する必要がある場合は必須です)。
各投稿は非常に高く評価されます。
ありがとうございました!