Linux RTOS sleep() - 用于计时器任务的wakeup()

时间:2011-10-19 19:31:53

标签: timer kernel embedded-linux rtos

我有一个基本上是TIMER的任务;所以它进入睡眠状态,并且应该定期唤醒。所以计时器任务会睡10个小时。但正在发生的事情是它在醒来时是不一致的,不能依赖于及时唤醒。

事实上,在我的跑步中,睡眠时间有很大差异。有时它在觉醒时可能会有1-2毫秒的变化,很少有时间也不会恢复。这是因为内核调度程序将所有休眠和等待的任务放入队列中,然后当它轮询以查看谁被唤醒时,我认为它是循环的。因此,有时候调度程序再次轮询时任务就会过期。有时,当有中断时,ISR会控制并延迟计时器的唤醒。

处理此类问题的最佳解决方案是什么?

(其他细节:任务是无线网络的MAC定时器; RTOS是u-velOSity微内核)

3 个答案:

答案 0 :(得分:2)

您应该使用操作系统提供的计时器API,而不是依赖于调度程序。以下是对timer API for Linux drivers

的介绍

答案 1 :(得分:1)

如果您需要硬核定时,OS调度程序可能不够好(正如您所发现的那样)。

如果可以,请使用单独的计时器外围设备,并使用它的ISR尽可能少地执行(为一些关键数据加时间戳,例如设置一些标志)和然后让你的更高抖动的例程使用该数据的时间保证较少。

答案 2 :(得分:0)

Linux不是RTOS,这可能是您问题的根源。

您可以通过各种方式和不同程度地使Linux更适合实时使用。有关某些方法和对您可以预期的实时性能水平的评估,请参阅A comparison of real-time Linux approaches