реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> xTaskNotifyStateClear
MiklPolikov
сообщение Jun 22 2016, 22:34
Сообщение #1


Гуру
******

Группа: Свой
Сообщений: 2 015
Регистрация: 23-01-07
Из: Москва
Пользователь №: 24 702



Пытаюсь обнулить уведомления задачи при помощи xTaskNotifyStateClear
Ожидаю, что после обнуления ulTaskNotifyTake остановит задачу.
На деле программа проходит через ulTaskNotifyTake.
xTaskNotifyStateClear возвращает 0 если уведомлений задачи не было, 1 если были.
Если заменить xTaskNotifyStateClear на ulTaskNotifyTake(pdTRUE, 0) , то уведомления обнуляются, всё работает как я ожидаю.

result=xTaskNotifyStateClear(NULL); //обнуляем уведомления.
ulTaskNotifyTake(pdTRUE, portMAX_DELAY); //ожидаю, что здесь задача остановится.

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


--------------------
Если у Вас нет практического опыта в данной теме- не вступайте в дискуссию и не пишите никаких теоретических рассуждений! Заранее спасибо !
Go to the top of the page
 
+Quote Post
SMaster
сообщение Jun 23 2016, 03:12
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 20
Регистрация: 9-03-06
Пользователь №: 15 099



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

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

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

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st July 2025 - 08:18
Рейтинг@Mail.ru


Страница сгенерированна за 0.01331 секунд с 7
ELECTRONIX ©2004-2016