我有一个基本上是TIMER的任务;所以它进入睡眠状态,并且应该定期唤醒。所以计时器任务会睡10个小时。但正在发生的事情是它在醒来时是不一致的,不能依赖于及时唤醒。
事实上,在我的跑步中,睡眠时间有很大差异。有时它在觉醒时可能会有1-2毫秒的变化,很少有时间也不会恢复。这是因为内核调度程序将所有休眠和等待的任务放入队列中,然后当它轮询以查看谁被唤醒时,我认为它是循环的。因此,有时候调度程序再次轮询时任务就会过期。有时,当有中断时,ISR会控制并延迟计时器的唤醒。
处理此类问题的最佳解决方案是什么?
(其他细节:任务是无线网络的MAC定时器; RTOS是u-velOSity微内核)
答案 0 :(得分:2)
您应该使用操作系统提供的计时器API,而不是依赖于调度程序。以下是对timer API for Linux drivers。
的介绍答案 1 :(得分:1)
如果您需要硬核定时,OS调度程序可能不够好(正如您所发现的那样)。
如果可以,请使用单独的计时器外围设备,并使用它的ISR尽可能少地执行(为一些关键数据加时间戳,例如设置一些标志)和然后让你的更高抖动的例程使用该数据的时间保证较少。
答案 2 :(得分:0)
Linux不是RTOS,这可能是您问题的根源。
您可以通过各种方式和不同程度地使Linux更适合实时使用。有关某些方法和对您可以预期的实时性能水平的评估,请参阅A comparison of real-time Linux approaches。