А как проверяете была остановлена задача или нет? Не по возвращаемому ли значению функции ulTaskNotifyTake()?
Дело в том, что функция xTaskNotifyStateClear() очищает лишь флаг уведомления (значение ucNotifyState в TCB), но не отчищает 32-битное значение переменной уведомления (ulNotifiedValue). При этом xTaskNotifyGive(), которой вы скорее всего пользуетесь для передачи уведомления, выставляет флаг ucNotifyState и инкрементирует ulNotifiedValue, а функция ulTaskNotifyTake() ожидает флага в течение заданного времени, но возвращает не успешность ожидания флака, а значение переменной ulNotifiedValue.
Если есть необходимость после сброса уведомления понять блокировалась ли задача (а она скорее всего блокировалась, раз мы непосредственно перед ожиданием уведомления сбросили флаг), то надо применить ulTaskNotifyTake(pdTRUE, 0), которая сбросит не только флаг, но и значение, либо при ожидании воспользоваться функцией xTaskNotifyWait(), например в виде xTaskNotifyWait(0, 0, NULL, portMAX_DELAY), которая вернет флаг pdTRUE = уведомление_произошло, pdFALSE = произошел_таймаут.
|