Цитата(hound @ May 17 2015, 16:15)

Переход в другую задачу еще не совсем вариант, потому что это в этом "другом режиме работы" нужно девайсу отправить буквально одну команду.
Если нужно отправить одну команду и вернуться в основной режим, то нужно просто синхронно выполнить одну функцию с отправкой этой команды.
Но за "буквально" могут скрываться неприятные нюансы.
Цитата
Идеальным вариантом было бы при получении в прерывании уведомления о этом режиме, например, выставлять флаг и запускать сразу следующую итерацию цикла.
Для того, чтобы при получении определенного сообщения завершить текущую итерацию, стек функций от корня итерации до чтения этого сообщения должен поддерживать код возврата, который обрабатывается как и любая нештатная ситуация и приводит к досрочному завершению текущей операции.
Сложно что-то советовать когда непонятны критерии выбора решения.
К чему такая экономия на задачах? Не хватает памяти? (При том, что судя по всему требуемый объем стека небольшой и легко прогнозируем.)
Если итерацию основного режима все-равно нужно прервать, то в ней так или иначе необходима обработка исключений.
А значит переключение режима должно эскалироваться как любая ошибка и приводить к началу новой итерации.
И там в самом начале итерации должен проверяться какой-то флаг и обрабатываться "другой режим".
А вообще нужно просто организовать задачу в виде стейт-машины. И все переключения режимов сразу станут штатными ситуациями.
Проблемма, судя по всему в том, что задача принимает сообщения в разных местах кода или даже принимает сообщения из нескольких очередей.
Это в принципе плохо - повышает количество гонок и вероятность взаминых блокировок.
Нужно стремиться к тому, чтобы поток, обрабатывающий события, получал их в одном месте и из одного источника.