Linux 计时器在某个时间挂起并在 1ns 处停止

Linux timer hangs sometime and stops at 1ns

提问人:Vijay Katoch 提问时间:11/25/2013 最后编辑:NmkVijay Katoch 更新时间:9/15/2023 访问量:800

问:

我有一个带有 PowerPC 5200 的嵌入式主板,运行 Realtime Linux 版本 2.6.33。

我的应用程序在 Linux 中使用一个高分辨率计时器进行警报。此计时器有时不会过期。该问题很少发生,每次在系统上发生时可能会持续数月。

计时器由具有绝对时间的功能设置。 当计时器没有过期时,我做了一些有趣的观察:timer_settime

  • 函数返回剩余时间 1ns。timer_gettime
  • 通过显示文件来检查活动计时器,并且未在活动计时器列表中显示此计时器。/proc/timer_listtimer_list

我研究了 Linux 源代码并发现了一种可能的情况:

该函数以函数 () 结束。如果计时器处于活动状态且剩余时间为 ,则返回函数。这意味着计时器已倒计时,计时器状态必须为“排队”或“回调”。timer_gettimecommon_timer_getposix-timers.ccommon_timer_getit_value.tv_nsec = 1<= 0

假设它处于“回调”状态,这意味着它正在函数()中运行。函数正在调用函数,该函数在将计时器状态从“排队”更改为“回调”之前从计时器活动列表中删除计时器。__run_hrtimerhrtimer.c__run_hrtimer__remove_hrtimer

在将计时器状态更改为“callback”和清除状态“callback”的函数末尾之间,在函数中调用了多个函数。如果它挂在这里,当定时器不在活动列表中时,该函数可能会返回 1ns。在这里,它调用了 Linux 内核中的几个函数和应用程序中的回调函数。__run_hrtimertimer_gettime

我已经检查了我的应用程序中的回调函数。它发出信号量信号,并在同一线程上再次设置计时器。我不明白为什么这不应该起作用。

有没有人见过类似的案例?

是否有人知道这里出了什么问题?

embedded-linux

评论

0赞 0x1F602 5/7/2015
某处有竞争条件吗?你能展示一些代码吗?
0赞 user3387542 2/15/2017
我们正在使用带有 RT 补丁的内核 2.6.33,并且遇到了同样的问题。如果在回调中选中,则计时器不为零 - 剩余 1ns。

答: 暂无答案