Linux计时器有时挂起并停在1ns

时间:2013-11-25 03:51:56

标签: linux linux-kernel embedded-linux

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

我的应用程序在Linux中使用一个高分辨率计时器来报警。此计时器有时不会过期。这个问题很少发生,每次发生在系统上都可能需要很长时间。

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

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

我查看了Linux源代码,发现了一个可能的场景:

函数timer_gettime最终在函数common_timer_getposix-timers.c)中。如果计时器处于活动状态且剩余时间为common_timer_get,则函数it_value.tv_nsec = 1将返回<= 0。这意味着计时器已倒计时,计时器状态必须为“入队”或“回调”。

我认为它处于状态'回调',这意味着它在函数__run_hrtimerhrtimer.c)中运行。函数__run_hrtimer正在调用函数__remove_hrtimer,它会在计时器状态从“排队”更改为“回调”之前从计时器活动列表中删除计时器。

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

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

是否有人见过类似案件?

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

0 个答案:

没有答案