Когда звонить по расписанию ()? - PullRequest
1 голос
/ 31 августа 2011

Я пишу драйвер для устройства, которое не имеет DMA.

Драйвер запускает работу устройства, а затем ожидает завершения операции, периодически вытягивая флаг busy с устройства.

Операция занимает 4,5 или 9 микросекунд для завершения.Ни при каких обстоятельствах устройство не завершает работу раньше.Ошибки не будут возникать из-за состояния чтения устройства позже, чем назначенный период времени (9 микросекунд).

Busywait

Все статьи ядра, найденные в Интернете, сообщают о времени ожидания занятостиэтот маленький.Они утверждают, что любая операция сна будет тратить больше ресурсов, чем занято.Лично я не люблю тратить циклы на тривиальное ожидание.

Расписание / сон

Я обнаружил, что на целевом оборудовании с процессом, использующим весь ЦП schedule() вызов, вызывающий другие потоки (на пустом процессоре другие потоки отсутствуют) может быть вызван до 4 раз до завершения работы устройства.Когда я добавляю больше фиктивных процессов для загрузки ЦП, я вижу, что вызов по расписанию в моем драйвере дает более справедливое распределение ЦП для одновременно запущенных процессов.

Должен ли я вызывать schedule() или даже usleep_range() во время ожидания моего устройства, или я должен полагаться на вытеснение ядра, чтобы иметь дело с занятыми ожиданиями?

1 Ответ

0 голосов
/ 31 августа 2011

В соответствии с Documentation / timers / timers-howto.txt , usleep_range - это то, что вы хотите для последних ядер.Я должен был прочитать более внимательно.Для <10us, он говорит использовать <code>udelay.Поэтому я думаю, это зависит от того, как долго вы готовы спать.]

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...