Easyelectronics.ru

Электроника для всех
Текущее время: 26 янв 2022, 13:01

Часовой пояс: UTC + 5 часов



JLCPCB – Прототипы печатных плат за $2/5шт. два слоя. $5/5шт. четыре слоя
Крупнейший производитель печатных плат и прототипов. Более 600000 клиентов и свыше 10000 заказов в день!
Получите скидку на почтовую отправку при первом заказе в JLCPCB!

Начать новую тему Ответить на тему  [ Сообщений: 15 ] 
Автор Сообщение
 Заголовок сообщения: TriggerLevel в StreamBuffer
СообщениеДобавлено: 04 авг 2021, 10:18 
Старожил
Аватара пользователя

Зарегистрирован: 20 май 2013, 22:29
Сообщения: 805
Кто-нибудь понял как наиболее удобно использовать параметр в TriggerLevel? Сейчас его тупо приходится присваивать в размер данных, которые надо прочитать функцией xStreamBufferSetTriggerLevel. Если присвоить больше, то будет задержка при чтении. Если присвоить меньше, то будет выходить из функции чтения раньше чем прочитает все данные, которые я запросил.
В чём сакральный смысл TriggerLevel? Какой сценарий использования разработчики FreeRTOS предполагали для этого параметра?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: TriggerLevel в StreamBuffer
СообщениеДобавлено: 05 авг 2021, 16:05 
Только пришел

Зарегистрирован: 09 фев 2012, 21:29
Сообщения: 19
Например если у вас заранее известна длина поступающих сообщений и она всегда одинакова.
Но действительно было бы удобно если бы макрос sbSEND_COMPLETED( pxStreamBuffer ) сделали бы какой-нибудь nonstatic функцией. Типа:
Код:
void vStreamBufferManualTrigger( StreamBufferHandle_t xStreamBuffer );


И тогда бы ее можно было вызывать например по uart_idle или получению признака конца пакета, или при получении нужно кол-ва байт если размер определяется по типу пакета или указан в заголовке пакета.
А пока удобнее для подобных вещей использовать Message Buffers


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: TriggerLevel в StreamBuffer
СообщениеДобавлено: 05 авг 2021, 21:14 
Старожил
Аватара пользователя

Зарегистрирован: 20 май 2013, 22:29
Сообщения: 805
andreykorol писал(а):
Например если у вас заранее известна длина поступающих сообщений и она всегда одинакова.

Ну а зачем тогда он нужен? Всё равно я буду считывать нужное количество байт, указывая это количество байт как аргумент функции xStreamBufferReceive. Для чего в данном случае может быть полезен TriggerLevel?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: TriggerLevel в StreamBuffer
СообщениеДобавлено: 05 авг 2021, 23:15 
Старожил

Зарегистрирован: 02 авг 2021, 21:34
Сообщения: 574
®


Последний раз редактировалось KilkennyCat 28 ноя 2021, 16:35, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: TriggerLevel в StreamBuffer
СообщениеДобавлено: 05 авг 2021, 23:19 
Старожил
Аватара пользователя

Зарегистрирован: 20 май 2013, 22:29
Сообщения: 805
А как TriggerLevel помогает в эффективном использовании планировщика задач?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: TriggerLevel в StreamBuffer
СообщениеДобавлено: 05 авг 2021, 23:44 
Старожил

Зарегистрирован: 02 авг 2021, 21:34
Сообщения: 574
®


Последний раз редактировалось KilkennyCat 28 ноя 2021, 16:34, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: TriggerLevel в StreamBuffer
СообщениеДобавлено: 06 авг 2021, 00:06 
Старожил
Аватара пользователя

Зарегистрирован: 20 май 2013, 22:29
Сообщения: 805
Это всё понятно и описано в документации. Но какой сценарий использования этого самого TriggerLevel?

Повторюсь. Сейчас, когда мне например, надо считать 10 байт из потока, я делаю так:
Код:
xStreamBufferSetTriggerLevel(buffer, 10);
xStreamBufferReceive(buffer, dst, 10, portMAX_DELAY);


Если бы разработчики не "придумали" бы TriggerLevel, у меня просто бы отсутствовала строка с xStreamBufferSetTriggerLevel и всё. Я пытаюсь понять какой сценарий использования закладывали разработчики для TriggerLevel, чтобы не бездумно выставлять его в размер данных, которые надо считать, а как-то более эффективно.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: TriggerLevel в StreamBuffer
СообщениеДобавлено: 06 авг 2021, 00:17 
Старожил

Зарегистрирован: 02 авг 2021, 21:34
Сообщения: 574
®


Последний раз редактировалось KilkennyCat 28 ноя 2021, 16:34, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: TriggerLevel в StreamBuffer
СообщениеДобавлено: 06 авг 2021, 00:45 
Старожил
Аватара пользователя

Зарегистрирован: 20 май 2013, 22:29
Сообщения: 805
Я читал документацию и всё понял. Но не придумал реального сценария использования, кроме как тупо присваивать его в размер данных, которые надо считать (но потом всё равно приходится размер данных указывать в функции для чтения). Поэтому спрашиваю у коллективного разума.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: TriggerLevel в StreamBuffer
СообщениеДобавлено: 06 авг 2021, 01:00 
Старожил

Зарегистрирован: 02 авг 2021, 21:34
Сообщения: 574
®


Последний раз редактировалось KilkennyCat 28 ноя 2021, 16:32, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: TriggerLevel в StreamBuffer
СообщениеДобавлено: 06 авг 2021, 01:16 
Старожил
Аватара пользователя

Зарегистрирован: 20 май 2013, 22:29
Сообщения: 805
KilkennyCat писал(а):
2) получаем и обрабатываем пакет определённого размера, и в этом случае делается лишь один вызов xStreamBufferReceive(); и про задачу забывается, пока пакет не будет получен (ну или время не истечёт), и это вполне удобно;
3) то же что и 2, но пакеты могут быть разного размера, и тогда меняя TriggerLevel, продолжаем удобно забирать все.
Кроме того, имеет смысл глянуть, как устроен MessageBuffer, может, это было необходимо для его реализации? мне сейчас, к сожалению, не глянуть...


Так я всё равно передаю размер данных, которые мне надо считать в функцию xStreamBufferReceive! Без TriggerLevel можно прекрасно обойтись. Если представить, что в реализации нету TriggerLevel и мне надо прочитать 10 байт из буфера - я просто напишу
Код:
xStreamBufferReceive(buffer, dst, 10, timeout);

и либо эти 10 байт будут прочитаны, либо xStreamBufferReceive прочитает только часть и отвалится по таймауту.

Но тем не менее, разработчики разделили в реализации 1) размер данных, которые мы указываем для чтения и 2) триггер для пробуждения задачи. Почему? И как это можно использовать в своих целях?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: TriggerLevel в StreamBuffer
СообщениеДобавлено: 06 авг 2021, 01:36 
Старожил

Зарегистрирован: 02 авг 2021, 21:34
Сообщения: 574
®


Последний раз редактировалось KilkennyCat 28 ноя 2021, 16:32, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: TriggerLevel в StreamBuffer
СообщениеДобавлено: 07 авг 2021, 23:18 
Старожил
Аватара пользователя

Зарегистрирован: 20 май 2013, 22:29
Сообщения: 805
Выяснилось, что вот даже так не работает (как я изначально понял что надо использовать):
Код:
xStreamBufferSetTriggerLevel(buffer, 10);
xStreamBufferReceive(buffer, dst, 10, portMAX_DELAY);


т.к.
1) значение, которое устанавливается при помощи xStreamBufferSetTriggerLevel применяется только когда буфер потока опустошается до нуля
2) если буфер не пуст на момент вызова xStreamBufferReceive, то xStreamBufferReceive не блокирует и всегда считает некоторое количество байт из буфера, даже если оно меньше запрошенного размера


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: TriggerLevel в StreamBuffer
СообщениеДобавлено: 08 авг 2021, 01:42 
Старожил

Зарегистрирован: 02 авг 2021, 21:34
Сообщения: 574
®


Последний раз редактировалось KilkennyCat 28 ноя 2021, 16:32, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: TriggerLevel в StreamBuffer
СообщениеДобавлено: 08 авг 2021, 02:21 
Старожил
Аватара пользователя

Зарегистрирован: 20 май 2013, 22:29
Сообщения: 805
Я вообще отказался от xStreamBufferSetTriggerLevel. Сейчас у меня это значение равно 1 и задаётся только при создании потока. Т.к. перед чтением из потока его задавать бессмысленно, мне проще было сделать повторное чтение из потока, пока не будут прочитаны все запрошенные байты.

PS: смысл TriggerLevel стал для меня ещё большей загадкой ))


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 15 ] 


Часовой пояс: UTC + 5 часов


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB