Я пишу драйвер для устройства, которое не имеет DMA.
Драйвер запускает работу устройства, а затем ожидает завершения операции, периодически вытягивая флаг busy с устройства.
Операция занимает 4,5 или 9 микросекунд для завершения.Ни при каких обстоятельствах устройство не завершает работу раньше.Ошибки не будут возникать из-за состояния чтения устройства позже, чем назначенный период времени (9 микросекунд).
Busywait
Все статьи ядра, найденные в Интернете, сообщают о времени ожидания занятостиэтот маленький.Они утверждают, что любая операция сна будет тратить больше ресурсов, чем занято.Лично я не люблю тратить циклы на тривиальное ожидание.
Расписание / сон
Я обнаружил, что на целевом оборудовании с процессом, использующим весь ЦП schedule()
вызов, вызывающий другие потоки (на пустом процессоре другие потоки отсутствуют) может быть вызван до 4 раз до завершения работы устройства.Когда я добавляю больше фиктивных процессов для загрузки ЦП, я вижу, что вызов по расписанию в моем драйвере дает более справедливое распределение ЦП для одновременно запущенных процессов.
Должен ли я вызывать schedule()
или даже usleep_range()
во время ожидания моего устройства, или я должен полагаться на вытеснение ядра, чтобы иметь дело с занятыми ожиданиями?