Linux RTOS sleep () - wakeup () для задачи таймера - PullRequest
1 голос
/ 19 октября 2011

У меня есть задача, которая в основном ТАЙМЕР;поэтому он засыпает и должен периодически просыпаться .. Так что задание таймера спит, скажем, 10 мс.Но что происходит, так это то, что он непоследователен при пробуждении, и на него нельзя полагаться, чтобы он проснулся вовремя правильно.

На самом деле, в моих пробежках есть большая разница во времени сна.Иногда оно может изменяться на 1-2 мс при пробуждении и совсем не возвращаться вообще.Это связано с тем, что планировщик ядра помещает все спящие и ожидающие задачи в очередь, а затем, когда он опрашивает, чтобы узнать, кого нужно разбудить, я думаю, что это циклический перебор.Поэтому иногда задание истекает к тому времени, когда планировщик снова опрашивает.Иногда, когда есть прерывания, ISR получает контроль и задерживает таймер от пробуждения.

Как лучше всего решить эту проблему?

(Дополнительные сведения: Задача - это таймер MAC для беспроводной сети; RTOS - это микроядро u-velOSity)

Ответы [ 3 ]

2 голосов
/ 20 октября 2011

Вы должны использовать API таймера, предоставляемый ОС, а не полагаться на планировщик. Вот введение в API таймера для драйверов Linux .

1 голос
/ 20 октября 2011

Если вам нужна жесткая синхронизация, планировщик ОС вряд ли будет достаточно хорош (как вы обнаружили).

Если вы можете, используйте отдельное периферийное устройство таймера и используйте его ISR дляМало того, с чем вы можете обойтись (отметка времени некоторых важных данных, например, установка некоторых флагов) и , а затем позволяют вашей подпрограмме с большим джиттером использовать эти данные с менее гарантированным временем.

0 голосов
/ 22 октября 2011

Linux не является ОСРВ, и это, вероятно, корень вашей проблемы.

Вы можете сделать Linux более подходящим для использования в реальном времени различными способами и в различной степени.* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * .

...