Я работаю над проектом с использованием STM32F446 с шаблоном, созданным с помощью STM32CubeMX (для инициализации периферийных устройств и промежуточного программного обеспечения, такого как FreeRTOS с интерфейсом CMSIS-V1). У меня есть два потока, которые общаются с помощью почтовых ящиков, но я столкнулся с проблемой: одно из тел потока
void StartDispatcherTask(void const * argument)
{
mailCommand *commandData = NULL;
mailCommandResponse *commandResponse = NULL;
osEvent event;
for(;;)
{
event = osMailGet(commandMailHandle, osWaitForever);
commandData = (mailCommand *)event.value.p;
// Here is the problem
osDelay(5000);
}
}
Доходит до задержки, но никогда не выходит. Есть ли проблема с использованием почтового ящика и задержкой в одной ветке? Я пробовал также установить задержку перед for(;;)
, и это работает.
РЕДАКТИРОВАТЬ: Думаю, я могу попытаться добавить больше деталей к проблеме. Первый поток отправляет письмо определенного типа, а затем ожидает письма другого типа; поток, в котором я получаю сообщение, переходит к первому типу и выполняет некоторый код в зависимости от того, что он получает, а затем отправляет результат как письмо второго типа; иногда бывает так, что он должен ждать с помощью osDelay, и там он перестает работать, но не входит в какой-либо обработчик ошибок
osMailGet()
, где ждет вечно (или, по крайней мере, пока что-то не отправит сообщение или его). - person Clifford   schedule 05.05.2019commandData
(и ничего не делает с ним). - person Clifford   schedule 05.05.2019osDelay
, и она была достигнута, но если я позволю ей запустить снова, я вижу, что она застряла в функцииprvCheckTasksWaitingTermination
- person ArenaLor   schedule 05.05.2019prvCheckTasksWaitingTermination
- вероятно, он актуален. Удаление задач следует считать необычным в системе реального времени - показанный код не показывает, где и почему вы могли это делать. - person Clifford   schedule 05.05.2019