Это зависит от того, оптимизируете ли вы время ожидания или пропускную способность.
Поскольку вы спрашивали об эффективности, я думаю, вы смотрите на пропускную способность. В этом случае один проверенный способ состоит в том, чтобы обработчики прерываний считывали датчики, ставили в очередь команду и состояние и возвращались немедленно.
У вас есть программный поток без прерываний, который выбирает команды из очереди и объявляет события для обработчиков. Это минимизирует ваше время переключения задач. Вы можете использовать специфичную для домена логику, чтобы объединять команды, выбрасывать команды, которые больше не актуальны, и т. Д.
По сути, именно так работают оконные системы. Каждый щелчок мыши, движение мыши, нажатие клавиатуры и т. Д. Приводит к тому, что команда ставится в очередь. Система управления окнами отбирает команды и вызывает соответствующий обработчик. Существует обширная логика для отбрасывания команд, которые не имеют отношения к моменту, когда они выбраны из очереди, для объединения команд и для их ускорения.
Сетевые стеки используют ту же модель. Пакеты ставятся в очередь на уровне сети, затем основной цикл отбирает их и использует инверсию модели управления для обработки каждого пакета.