【发布时间】:2012-06-26 14:52:11
【问题描述】:
更新
检查时间分辨率后,我们尝试在内核空间调试问题。
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_exec_runtime 不会立即更新。但是如果我们在函数内部添加printk()。时间将立即更新。
旧
我们正在开发一个 Android 程序。
但是,threadCpuTimenanos() 函数测量的时间在我们的平台上并不总是正确的。
经过实验,我们发现clock_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 中正确运行。
有什么想法吗?
【问题讨论】:
-
也许计数器只精确到毫秒?这个循环几乎不消耗 CPU,所以需要多轮才能达到 1ms。您是否尝试用忙碌的等待来代替睡眠?
-
您要测量什么?过了“挂钟时间”的时间还是你的程序占用 CPU 的时间?
-
是的,睡眠是不必要的。我们想稍后测量他。时间程序占用CPU。