Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 时钟\u gettime无法立即更新_Android_C_Linux_Timer_Arm - Fatal编程技术网

Android 时钟\u gettime无法立即更新

Android 时钟\u gettime无法立即更新,android,c,linux,timer,arm,Android,C,Linux,Timer,Arm,更新 在检查时间分辨率之后,我们尝试在内核空间中调试这个问题 unsigned long long task_sched_runtime(struct task_struct *p) { unsigned long flags; struct rq *rq; u64 ns = 0; rq = task_rq_lock(p, &flags); ns = p->se.sum_exec_runtime + do_task_delta_exec(p

更新

在检查时间分辨率之后,我们尝试在内核空间中调试这个问题

unsigned long long task_sched_runtime(struct task_struct *p)
{
    unsigned long flags;
    struct rq *rq;
    u64 ns = 0;

    rq = task_rq_lock(p, &flags);
    ns = p->se.sum_exec_runtime + do_task_delta_exec(p, rq);
    task_rq_unlock(rq, &flags);

    //printk("task_sched runtime\n");
    return ns; 
}
我们的新实验表明,时间
p->se.sum\u exec\u运行时
不会立即更新。但是如果我们在函数中添加
printk()
。时间将立即更新

旧的

我们正在开发一个Android程序。 但是,函数
threadCpuTimenanos()
测量的时间在我们的平台上并不总是正确的

经过实验,我们发现从
clock\u gettime
返回的时间不会立即更新。 即使经过几次while循环迭代,我们得到的时间仍然没有改变

下面是我们的示例代码:

while(1)
{
    test = 1;
    test = clock_gettime(CLOCK_THREAD_CPUTIME_ID, &now);

    printf(" clock gettime test 1 %lx, %lx , ret = %d\n",now.tv_sec , now.tv_nsec,test );

    pre = now.tv_nsec;
    sleep(1);
}
此代码在x86 PC上运行正常,但在内核为2.6.35.13的嵌入式平台ARM Cortex-A9中运行不正常


有什么想法吗?

时钟的分辨率取决于平台。用于在您的平台上查找解决方案。根据您的实验结果,pc-x86和您的目标平台上的时钟分辨率是不同的。

时钟线程CPUTIME ID时钟测量的是所花费的CPU时间,而不是实时时间,您花费的CPU时间几乎为零。另外,
CLOCK\u THREAD\u CPUTIME\u ID
(特定于线程的CPU时间)在Linux/glibc上的实现不正确,甚至可能在glibc上根本不起作用
CLOCK\u PROCESS\u CPUTIME\u ID
或任何被称为的东西应该工作得更好。

在android CTS中,也有一个案例存在同样的问题。读取计时器两次,但它们是相同的

testThreadCpuTimeNanos失败junit.framework.AssertionFailedError位于 android.os.cts.DebugTest.testThreadCpuTimeNanos

$man clock\u获得时间

SMP系统的注意事项

在许多平台上,使用来自CPU的计时器(i386上的TSC,安腾上的AR.ITC),可以实现时钟进程ID和时钟线程ID时钟。这些寄存器在CPU之间可能不同,因此如果进程迁移到另一个CPU,这些时钟可能会返回虚假结果

如果SMP系统中的CPU具有不同的时钟源,则无法保持计时器寄存器之间的相关性,因为每个CPU将以稍微不同的频率运行。如果是这种情况,则时钟_getcpuclockid(0)将返回enoint以表示此情况。这两个时钟只有在能够确保某个进程停留在某个CPU上时才有用

SMP系统中的处理器并非完全在同一时间启动,因此计时器寄存器通常以偏移量运行。有些体系结构包含试图在启动时限制这些偏移量的代码。然而,代码不能保证精确地调整偏移量。Glibc不包含处理这些偏移的规定(与Linux内核不同)。通常,这些偏移很小,因此在大多数情况下,影响可以忽略不计


我更改了时钟gettime以使用时钟单调的RAW,将线程分配给一个CPU,得到不同的值。 我也在研究双皮质-A9

while(1)
{
测试=1;
测试=时钟获取时间(时钟单调、原始和现在);
printf(“时钟获取时间测试1%lx,%lx,ret=%d\n”,now.tv\u sec,now.tv\u nsec,测试);
pre=now.tv\u nsec;
睡眠(1);
}

也许计数器只精确到毫秒?这个循环几乎不消耗CPU,因此需要多次循环才能达到1ms。你是否试图用忙碌的等待来代替睡眠?你想衡量什么?超过“挂钟时间”的时间或程序占用CPU的时间?是的,睡眠是不必要的。我们想晚一点给他量尺寸。时间程序占用了CPU。谢谢您的回复。但是我们发现时间分辨率与x86相同。是的,线程中cpu消耗的时间几乎为零。但即使是我们也会在休息的时候睡觉。结果仍然是一样的。尝试一下时钟进程,时钟获取时间ID仍然无效。时钟获取时间之间有一个大的printf,连续调用时钟获取时间,有时会得到零差,如果分辨率降至1ns,这就没有意义了。