而不是答案我在这里寻找一个想法。
我想测量Android中传感器采样的调度延迟。特别是我想测量从传感器中断请求到执行数据读取的下半部分的时间。
除数据读取外,下半部分已经有时间戳指令。实际上,应用程序(作为java或本机,没有区别)收集样本作为元组[测量,时间戳]。
时间戳遵循时钟源clock_gettime(CLOCK_MONOTONIC, &t);
因此,假设下半部分未被抢占,则此时间戳以某种方式指示任务调度即时。缺少的是找到相应的irq瞬间的直接或间接方式。
安全地假设我们可以向传感器询问任何采样率。驱动程序骨架如下(Galaxy的S3陀螺仪)
err = request_threaded_irq(data->client->irq, NULL,
lsm330dlc_gyro_interrupt_thread\
, IRQF_TRIGGER_RISING | IRQF_ONESHOT,\
"lsm330dlc_gyro", data);
static irqreturn_t lsm330dlc_gyro_interrupt_thread(int irq\
, void *lsm330dlc_gyro_data_p) {
...
struct lsm330dlc_gyro_data *data = lsm330dlc_gyro_data_p;
...
res = lsm330dlc_gyro_read_values(data->client,
&data->xyz_data, data->entries);
...
input_report_rel(data->input_dev, REL_RX, gyro_adjusted[0]);
input_report_rel(data->input_dev, REL_RY, gyro_adjusted[1]);
input_report_rel(data->input_dev, REL_RZ, gyro_adjusted[2]);
input_sync(data->input_dev);
...
}
关键的限制是我需要(好吧,我只有足够的资源)在商业设备上从用户空间执行这种测量,而无需触及和重新整理内核。希望在实验精度上有限的mpact。我不知道这种约束是否可以进行这样的实验,到目前为止我无法找出任何合理的方法。
如果实验变得简单,我可能会考虑重新编译内核。
感谢。
答案 0 :(得分:0)
首先,如果不触及内核,就无法执行此测量。
其次,我没有在ISR代码中看到任何下半部分。
如果计算完第三个底部并且可以重新编译内核,则可以在ISR中对jiffie值进行采样,然后在下半部分重新采样。获取两个样本之间的差异,并从导出到U空间的时间戳中减去该偏移量。