2017-06-22 7 views
0

このトピックでは、人事タイマーと実際の精度の問題についてより詳しく説明します。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タイマーは正確なタイミングに間違った解決策です(ハードウェアドライバを作成する必要がある場合は必須です)。

各投稿は非常に高く評価されます。

ありがとうございました!

答えて

0

問題は解決され、仮想化環境に関連する問題でした。

古いラップトップ(HPシングルコア1.9GHz)では、60Uからの遅延があり、新しいもの(Dellクアッドコア)では10μS以下の良好な遅延があります!