【问题标题】:How to get the interrupt time (timestamp) in kernel mode of real time Linux?如何获取实时Linux内核模式下的中断时间(时间戳)?
【发布时间】:2014-04-01 08:49:33
【问题描述】:

客户端/服务器通信 - 客户端是发送者,服务器是接收者。

当服务器在以太网接口(UDP)上接收到数据时,服务器中的内核被触发。我在服务器端使用实时 LINUX。服务器(即嵌入式 pc 目标)正在处理中断以触发嵌入式 pc 目标(包含 rt Linux)以获取注意力以执行新到达的数据。

如何在中断发生后立即计算内核中的时间并将响应发送回客户端?

【问题讨论】:

  • 你准备好修改内核源代码了吗?
  • 我打算用ftrace来调试内核!!!实时操作发生在 rt linux 的内核模式下,所以我不能在用户空间写一个 ISR 来处理这个。

标签: linux linux-kernel timestamp embedded-linux ftrace


【解决方案1】:

1) 如果你使用的是嵌入式linux平台,你可以参考CPU datasheet:也许它有一套高速定时器。例如,我使用的是基于 ARM Cortex A8 的 SoC,它具有时钟频率高达 38.4 MHz 的 GP 计时器,因此我可以以约 27ns 的精度测量执行时间。很可能,您的操作系统不会提供这样的 API,因此欢迎您直接从内核驱动程序读写 CPU 寄存器。

2) 如果您只想估计执行时间,仅此而已,您可以使用电路板的 GPIO 引脚之一。在“开始”设置引脚,在“结束”设置引脚,然后用示波器观察这个引脚,如果有的话。

3) 如果我误解了你,你只需要一个实时的时间戳(比如 HH:mm:ss),你可以参考你板子的 RTC 芯片。使用实时时钟芯片的驱动程序,您可以从内核模块中读取时间。不幸的是,您可能无法从中断服务程序中做到这一点。 或者,如果需要,只需调用 do_gettimeofday 并通过 time_to_tm 将 timeval 转换为人类可读的内容:)

【讨论】:

  • 当服务器从客户端接收到数据(嵌入式PC目标上的实时linux)时,内核(服务器)停止当前执行并切换到新到达的。我想要内核被抢占的时间戳和内核开始执行的时间戳。如何获取内核时间??
  • 我使用clock_gettime来获取时间戳,但是在内核中哪里调用它来获取时间戳??
  • 恐怕我无法引导您到源代码的具体行来放置您的时间戳:您应该查看以太网芯片驱动程序的源代码,找到您需要的 ISR 和其他功能。然后将获取的值打印到控制台,或保存到 sysfs,或实现您自己的接口以从用户空间或其他驱动程序访问。
猜你喜欢
  • 2014-05-24
  • 2014-04-08
  • 1970-01-01
  • 2013-04-10
  • 2017-06-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多