2011-10-19 143 views
1

我有一个任务,基本上是一个定时器;所以它进入睡眠状态,应该周期性地唤醒。所以计时器任务睡了10毫秒。但是现在发生的情况是,它在醒来时不一致,不能依靠正确地唤醒。Linux RTOS睡眠() - 唤醒()定时任务

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

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

(附加细节:任务是用于无线网络的MAC定时器; RTOS是U velOSity微内核)

+0

RTOS在哪里出现这个问题?你在最后提到了u-velosity,但它似乎完全不相关的问题在哪里没有提及。 – Clifford

回答

2

您应该使用由OS上而不是依赖于调度器提供的计时器API。这里是对timer API for Linux drivers的介绍。

+0

只需要上传@Micea,我发现了开发一个用户空间应用程序的相同事情,该应用程序必须定期在UART总线上发送一些数据。当定时器结束时,我使用一个OS定时器来触发信号。该信号作为中断,在您的应用程序中,您只需在收到信号时运行任务。这显着改善了我的事情。我从一个〜3ms波动到小于1ms波动。 – Eric

1

如果你需要硬核时间,操作系统调度程序可能不够好(正如你找到的那样)。

如果可以的话,使用单独的定时器外设,以及使用它的ISR做少,你可以用(时间戳一些关键数据,设置例如一些标志)和然后脱身让你更高的抖动常规利用那些数据,并保证其时间安全性较低。

+0

谢谢。我可能会按照您的建议使用外设。 – mane

0

Linux不是一个RTOS,这可能是你的问题的根源。

您可以使Linux更适合以各种方式和各种程度的实时使用。有关某些方法的信息,请参阅A comparison of real-time Linux approaches,并对可预期的实时性能级别进行评估。