1

而不是我在这里寻找一个想法的答案。

我想测量 Android 中传感器采样的调度延迟。特别是我想测量从传感器中断请求到负责读取数据的下半部分执行的时间。

除了读取的数据外,下半部分已经有了时间戳指令。事实上,样本是由应用程序(是 java 或本地的,没有区别)作为元组 [measurement,timestamp] 收集的。时间戳跟随时钟源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);
    ...
}

关键的限制是我需要(好吧,我只有足够的资源来)在商业设备上从用户空间执行此测量,而无需调试和重新编译内核。希望对实验准确性的影响有限。我不知道在这种约束下是否可以进行这样的实验,到目前为止我还想不出任何合理的方法。

如果实验变得简单,我可能还会考虑重新编译内核。

谢谢。

4

1 回答 1

0

首先,不接触内核就无法执行此测量。

其次,我没有看到您的 ISR 代码中配置了任何下半部分。

第三,如果完全安排了下半部分并且可以重新编译内核,您可以在 ISR 中对 jiffie 值进行采样,然后在下半部分再次对其进行重新采样。取两个样本之间的差异,并从导出到 U 空间的时间戳中减去该偏移量。

于 2013-08-06T12:40:43.913 回答