Вы используете RTOS? Как правило, этот тип вещей может быть обработан наличием потока с высоким приоритетом, который получает сигнал для выполнения некоторой работы по прерыванию.
Если вы не используете ОСРВ, у вас есть только несколько задач, и работа, выполняемая прерыванием, не слишком ресурсоемкая, возможно, проще всего выполнить работу с высоким приоритетом в контексте обработчик прерываний. Если эти условия не выполняются, то реализация того, о чем вы говорите, станет началом самой базовой многозадачной ОС. Это может быть интересный проект сам по себе, но если вы хотите просто выполнить работу, возможно, вы захотите рассмотреть простую ОСРВ.
Поскольку вы упомянули некоторые особенности работы, которую вы делаете, вот краткий обзор того, как я справлялся с подобной проблемой в прошлом:
Для обработки полученных данных через UART - один метод, который я использовал при работе с более простой системой, которая не имеет полной поддержки задач (т. Е. Задачи циклически перерабатываются в простом цикле while
) должен иметь общую очередь для данных, полученных из UART. Когда срабатывает прерывание UART, данные считываются из RDR (регистра данных приема) UART и помещаются в очередь. Уловка, чтобы справиться с этим таким образом, чтобы указатели очереди не были повреждены, состоит в том, чтобы тщательно сделать указатели очереди изменчивыми и убедиться, что только обработчик прерываний изменяет указатель хвоста и что только задача «переднего плана», которая читает данные вне очереди изменил указатель головы. Общий обзор:
Убедитесь, что queue.head
и queue.tail
равны volatile
(или запишите эти биты в сборке), чтобы убедиться в отсутствии проблем с последовательностью.
Теперь просто убедитесь, что ваша очередь принятых данных UART достаточно велика, и в ней будут храниться все байты, которые могли быть получены до того, как задача переднего плана получит шанс на выполнение. Задача переднего плана должна извлекать данные из очереди в свои собственные буферы для создания сообщений, которые передаются задаче «обработчик сообщений».