MiklPolikov 0 22 июня, 2016 Опубликовано 22 июня, 2016 · Жалоба Пытаюсь обнулить уведомления задачи при помощи xTaskNotifyStateClear Ожидаю, что после обнуления ulTaskNotifyTake остановит задачу. На деле программа проходит через ulTaskNotifyTake. xTaskNotifyStateClear возвращает 0 если уведомлений задачи не было, 1 если были. Если заменить xTaskNotifyStateClear на ulTaskNotifyTake(pdTRUE, 0) , то уведомления обнуляются, всё работает как я ожидаю. result=xTaskNotifyStateClear(NULL); //обнуляем уведомления. ulTaskNotifyTake(pdTRUE, portMAX_DELAY); //ожидаю, что здесь задача остановится. Вопрос: почему xTaskNotifyStateClear не обнуляет уведомления ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SMaster 0 23 июня, 2016 Опубликовано 23 июня, 2016 · Жалоба А как проверяете была остановлена задача или нет? Не по возвращаемому ли значению функции ulTaskNotifyTake()? Дело в том, что функция xTaskNotifyStateClear() очищает лишь флаг уведомления (значение ucNotifyState в TCB), но не отчищает 32-битное значение переменной уведомления (ulNotifiedValue). При этом xTaskNotifyGive(), которой вы скорее всего пользуетесь для передачи уведомления, выставляет флаг ucNotifyState и инкрементирует ulNotifiedValue, а функция ulTaskNotifyTake() ожидает флага в течение заданного времени, но возвращает не успешность ожидания флака, а значение переменной ulNotifiedValue. Если есть необходимость после сброса уведомления понять блокировалась ли задача (а она скорее всего блокировалась, раз мы непосредственно перед ожиданием уведомления сбросили флаг), то надо применить ulTaskNotifyTake(pdTRUE, 0), которая сбросит не только флаг, но и значение, либо при ожидании воспользоваться функцией xTaskNotifyWait(), например в виде xTaskNotifyWait(0, 0, NULL, portMAX_DELAY), которая вернет флаг pdTRUE = уведомление_произошло, pdFALSE = произошел_таймаут. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться