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

Vij*_*och 11 linux linux-kernel embedded-linux

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

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

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

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

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

该函数timer_gettime以函数common_timer_get(posix-timers.c)结束.函数common_timer_get返回it_value.tv_nsec = 1如果计时器是活动的剩余时间<= 0.这意味着计时器已经倒计时并且计时器状态必须是'入队'或'回调'.

我认为它处于状态'回调',这意味着它在function __run_hrtimer(hrtimer.c)中运行.函数__run_hrtimer是调用函数__remove_hrtimer,它在将计时器状态从"排队"更改为"回调"之前从计时器活动列表中删除计时器.

__run_hrtimer在将定时器状态更改为"回调"和清除状态"回调"的函数结束之间,函数会调用多个函数.如果挂在这里,timer_gettime当定时器不在活动列表中时,该功能可能返回1ns.这里它调用Linux内核中的几个函数和应用程序中的回调函数.

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

是否有人见过类似案件?

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