1

カーネルログのこのタイムスタンプの不一致について誰か説明してもらえますか?

指定した時間に Android を起動するアプリを作成し、アプリはAlarmManagerAPI とセットを活用します。

AlarmManager.ELAPSED_REALTIME_WAKEUP

アプリは意図したとおりに動作し、ユーザーが指定した時刻に正しくウェイクアップします。しかし、カーネルのタイムスタンプには不一致があります。からソースコードをたどり、Androidがアラームの起床時間を正しく設定してカーネルに送信することを確認しました(たとえば、Androidが経過時間を取得するために使用するJavaレイヤーからAlarmManagerService.java、100秒を追加し、秒とナノ秒の値を変換して、最後に、JNI を介してカーネル層に送信します)。alarm-dev.cSystemClock.elapsedRealtime()

ただし、ログを読み取るdmesgと、カーネルのタイムスタンプに不一致があるように見えます。alarm_ioctl状態を持つ関数ANDROID_ALARM_SET(0):が呼び出された時点でdmesg、次のメッセージが出力されました。

[20450.036529] alarm 2 set 20544.720000000

これ[20450.036529]は、それが現在の時刻であり20544.720000000AlarmManagerAndroid が起動する時刻であることを意味します。値20544.720000000は、Android レイヤーと logcat のタイムスタンプ (例: logcat -v time) から設定されました。この値は、Android が起動することになっているときです。

Android レイヤーからカーネル レイヤーまでの所要時間は 10 分の 1 秒未満ですが、なぜデルタが94.683471である5.316529必要があるのでしょうか? または、経過時間は、によって出力されたカーネル時間とは異なりdmesgますか?

もう 1 つの興味深い観察結果は、上記のように、ユーザーが指定した時間にアプリが起動することです。この場合、ユーザーがアプリを呼び出した後AlarmManager、100 秒でタブレットが起動しました。

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

参考文献:

4

1 に答える 1

1

オプション1

printk() によって生成されたタイムスタンプに依存する代わりに、メッセージ内にタイムスタンプを埋め込みたい場合があります。このアプローチにより、少なくとも時間の真の測定値が得られるはずです。

オプション 2

タイムスタンプを取得するためにkernel/printk.cで使用される API を調べることができます。

printkが cpu_clock() を使用している場合、次のことを考慮する必要があります。

CPUクロック

 14  * What:
 15  *
 16  * cpu_clock(i) provides a fast (execution time) high resolution
 17  * clock with bounded drift between CPUs. The value of cpu_clock(i)
 18  * is monotonic for constant i. The timestamp returned is in nanoseconds
于 2013-02-19T03:54:14.760 に答える