我有一块带PowerPC 5200的嵌入式主板,运行版本为2.6.33的Realtime Linux。
我的应用程序在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
。这意味着计时器已倒计时,计时器状态必须为“入队”或“回调”。
我认为它处于状态'回调',这意味着它在函数__run_hrtimer
(hrtimer.c
)中运行。函数__run_hrtimer
正在调用函数__remove_hrtimer
,它会在计时器状态从“排队”更改为“回调”之前从计时器活动列表中删除计时器。
在将定时器状态更改为“回调”和清除状态“回调”的函数结束之间,在函数__run_hrtimer
中调用了几个函数。如果它挂在这里,函数timer_gettime
可能返回1ns,而计时器不在活动列表中。这里它调用Linux内核中的几个函数和应用程序中的回调函数。
我已经检查了我的应用程序中的回调函数。它发信号通知信号量并在同一线程上再次设置定时器。我不明白为什么那不起作用。
是否有人见过类似案件?
是否有人知道这里出了什么问题?