Перейти к содержанию
    

xTaskNotifyStateClear

Пытаюсь обнулить уведомления задачи при помощи xTaskNotifyStateClear

Ожидаю, что после обнуления ulTaskNotifyTake остановит задачу.

На деле программа проходит через ulTaskNotifyTake.

xTaskNotifyStateClear возвращает 0 если уведомлений задачи не было, 1 если были.

Если заменить xTaskNotifyStateClear на ulTaskNotifyTake(pdTRUE, 0) , то уведомления обнуляются, всё работает как я ожидаю.

 

result=xTaskNotifyStateClear(NULL); //обнуляем уведомления.

ulTaskNotifyTake(pdTRUE, portMAX_DELAY); //ожидаю, что здесь задача остановится.

 

Вопрос: почему xTaskNotifyStateClear не обнуляет уведомления ?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А как проверяете была остановлена задача или нет? Не по возвращаемому ли значению функции ulTaskNotifyTake()?

 

Дело в том, что функция xTaskNotifyStateClear() очищает лишь флаг уведомления (значение ucNotifyState в TCB), но не отчищает 32-битное значение переменной уведомления (ulNotifiedValue). При этом xTaskNotifyGive(), которой вы скорее всего пользуетесь для передачи уведомления, выставляет флаг ucNotifyState и инкрементирует ulNotifiedValue, а функция ulTaskNotifyTake() ожидает флага в течение заданного времени, но возвращает не успешность ожидания флака, а значение переменной ulNotifiedValue.

 

Если есть необходимость после сброса уведомления понять блокировалась ли задача (а она скорее всего блокировалась, раз мы непосредственно перед ожиданием уведомления сбросили флаг), то надо применить ulTaskNotifyTake(pdTRUE, 0), которая сбросит не только флаг, но и значение, либо при ожидании воспользоваться функцией xTaskNotifyWait(), например в виде xTaskNotifyWait(0, 0, NULL, portMAX_DELAY), которая вернет флаг pdTRUE = уведомление_произошло, pdFALSE = произошел_таймаут.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...