我正在尝试跟踪系统何时唤醒和挂起(理想情况下,当monotonic_time启动和停止时),以便我可以准确地将单调时间戳与实时时钟关联起来。
在Android上,首先想到的方法是监视kmsg的唤醒消息,并使用其时间戳作为相当准确的标记。由于我不确定这个时间戳的准确性,我决定记录当前的单调时间。
以下代码在独立可执行文件中运行
while(true)
{
fgets(mLineBuffer, sizeof(mLineBuffer), mKmsgFile);
//Find first space
char * messageContent = strchr(mLineBuffer,' ');
//Offset one to get character after space
messageContent++;
if (strncmp (messageContent,"Enabling non-boot CPUs ...",25) == 0 )
{
clock_gettime(CLOCK_MONOTONIC,&mMono);
std::cout << mLineBuffer;
std::cout << std::to_string(mMono.tv_sec) << "." << std::to_string(mMono.tv_nsec) << "\n";
}
}
我期望clock_gettime返回的时间是在kmsg日志时间戳之后的某个时刻,而是在之前的600ms到200ms之后的任何时间。
<6>[226692.217017] Enabling non-boot CPUs ...
226691.681130889
-0.535886111
<6>[226692.626100] Enabling non-boot CPUs ...
226692.80532881
0.17922881
<6>[226693.305535] Enabling non-boot CPUs ...
226692.803398747
-0.502136253
在此特定会话期间,CLOCK_MONOTONIC始终与kmsg时间戳差异大约-500ms,在10次唤醒过程中仅翻转至+ 179ms。在以后的会议期间,它一直在-200毫秒之外。
在正常操作(不暂停或唤醒)期间监视所有kmsg条目时,存在相同的一致偏移。也许从暂停状态返回偶尔会使我的进程延迟足够长的时间以产生一个超过kmsg的时间戳,从而导致单个+ 179ms的差异。
CLOCK_MONOTONIC_COARSE和CLOCK_MONOTONIC_RAW的行为方式相同。
这是预期的行为吗?内核是否在单独的单调时钟上运行? 有没有其他方法可以获得与单调时间相关的唤醒/暂停时间?
最终目标是使用此信息来帮助绘制wakeup_sources随时间变化的内容,并特别关注唤醒后的活动。但是,如果kmsg时间戳是“不正确的”,那么wakeup_sources可能也是。