c++ - 跨内核和用户空间的 Linux 时序

标签 c++ linux time linux-kernel linux-device-driver

我正在为一个特殊的相机编写一个内核模块,通过 V4L2 处理帧到用户空间代码的传输。然后我在应用程序中做很多用户空间的事情。

时间在这里非常关键,所以我一直在做大量的性能分析和普通的旧 std::chrono::steady_clock 东西来跟踪时间,但我已经到了我的地步还需要从内核端收集计时数据,以便我可以分析从硬件中断到 V4L DQBuf 到用户空间的整个路径...

谁能推荐一种获取高分辨率计时数据的好方法,它与应用程序用户空间数据一致,我可以将其用于此类比较?现在我正在以微秒为单位测量事件..

Ubuntu 12.04 LTS

最佳答案

在最低级别,如果您使用的是 x86/x86-64 处理器,则有 rdtscrdtscp 指令。这应该在内核/用户空间边界上提供最低的开销、尽可能高的分辨率。

但是,有些事情您需要担心。您需要确保您在同一个核心/cpu 上执行,进程没有进行上下文切换,并且频率在调用之间没有变化。如果 cpu 支持不变的 tsc,(/proc/cpuinfo 中的constant_tsc)它在 cpus/核心和频率上更可靠一些。

这应该提供大约纳秒级的精度。

关于c++ - 跨内核和用户空间的 Linux 时序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22646933/

相关文章:

c++ - GDB 自动激活并具有 100% 的 CPU 事件

linux - 使用exec命令的目的是什么

java - 僵尸异常幸存被捕获

android - 将日期/时间(以毫秒为单位)格式化为 Android 中的本地字符串

mysql - 两列sql之间两次

c++ - 如何将函数包装器转换为模板?

c++ - gcc nullptr 问题

c++ - 我需要分发哪个版本的可再发行版本?

c++ - 使用操作系统定义的默认文件对话框的 QFileDialog 替代方案?

mysql - 在服务器上转换时间戳在 PHP 和 MySQL 中给出不同的结果