Easyelectronics.ru • Просмотр темы - Очереди и блокировка задач [Решено]

Easyelectronics.ru

Электроника для всех
Текущее время: 16 авг 2018, 10:51

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



    • JLCPCB - Прототипы 10 PCBs всего за 2$ (100*100mm, 2-layer)
    • Как мы делаем платы, смотрите на YouTube
    • Крупнейшая китайская фабрика прототипов. 300000+ заказчиков и 10000+ заказов в день!
    • LCSC - Крупнейший китайский онлайн магазин комплектующих.

Начать новую тему Ответить на тему  [ Сообщений: 39 ]  На страницу 1, 2  След.
Автор Сообщение
 Заголовок сообщения: Очереди и блокировка задач [Решено]
СообщениеДобавлено: 10 май 2017, 02:54 
Старожил
Аватара пользователя

Зарегистрирован: 01 авг 2016, 10:47
Сообщения: 223
Откуда: Таганрог
Доброго времени суток, комрады
Появился небольшой вопрос: во FreeRTOS имеется возможность блокирования задачи до появления в очереди хотя бы одного элемента. Существует ли возможность осуществить блокирование задачи до появления N элементов в очереди?

Пока на ум приходит только ручная установка семафора по достижению порога ....


Последний раз редактировалось CheMax 28 июн 2017, 14:26, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Очереди и блокировка задач
СообщениеДобавлено: 10 май 2017, 03:15 
Старожил

Зарегистрирован: 19 мар 2013, 19:37
Сообщения: 2481
Откуда: Санкт-Петербург
В смысле - ручная установка? Счётный семафор (xSemaphoreCreateCounting) - вроде ж ровно то, что требуется, нет?
Если что - freertos я не знаю, просто посмотрел, как в ней семафор зовут.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Очереди и блокировка задач
СообщениеДобавлено: 10 май 2017, 12:03 
Старожил
Аватара пользователя

Зарегистрирован: 01 авг 2016, 10:47
Сообщения: 223
Откуда: Таганрог
Обрисую ситуацию чуть подробней:

Задача А: принимает данные, складывает в очередь.
Задача Б: заблокирована, пока не в очереди не появится элемент (пытаемся получить элемент из очереди, его нет, блокируемся)

Хотелка:
Задача А: принимает данные, складывает в очередь.
Задача Б: заблокирована, пока в очереди не окажется N элементов.

По поводу ручной установки:
Задача А: принимает данные, складывает в очередь. Как только сложила N ставит семафор
Задача Б: ждет семафор

aamonster писал(а):
... Счётный семафор (xSemaphoreCreateCounting) - вроде ж ровно то, что требуется, нет? ...
Не совсем, это по сути счетчик числа записей.

aamonster писал(а):
...Если что - freertos я не знаю, просто посмотрел, как в ней семафор зовут.

Это мы тоже умеем и сделали в первую очередь )


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Очереди и блокировка задач
СообщениеДобавлено: 10 май 2017, 12:09 
Старожил

Зарегистрирован: 16 ноя 2012, 07:47
Сообщения: 2664
Насколько быстро надо реагировать на данные в очереди? Если неспешно, то можно в задаче Б с некоторым периодом просто опрашивать сколько сообщений уже в очереди через uxQueueMessagesWaiting. Ну либо все таки вычитывать данные из очереди во внутренний буфер задачи и подсчитывать сколько элементов уже прочитали.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Очереди и блокировка задач
СообщениеДобавлено: 10 май 2017, 12:17 
Старожил
Аватара пользователя

Зарегистрирован: 01 авг 2016, 10:47
Сообщения: 223
Откуда: Таганрог
темп поступления данных 1 кГц, реагировать надо достаточно быстро, дабы не вызывать: а) больших задержек в передаче данных, б) переполнения входного буфера. Предположительно, порог заполнения будет 10-20 элементов


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Очереди и блокировка задач
СообщениеДобавлено: 10 май 2017, 12:34 
Старожил

Зарегистрирован: 16 ноя 2012, 07:47
Сообщения: 2664
Так и читайте в задаче вашу очередь, складывайте во внутренний буфер, увеличивайте счетчик. Как дойдете до нужного количества - обрабатывайте весь буфер.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Очереди и блокировка задач
СообщениеДобавлено: 10 май 2017, 12:49 
Старожил
Аватара пользователя

Зарегистрирован: 01 авг 2016, 10:47
Сообщения: 223
Откуда: Таганрог
Hold писал(а):
Так и читайте в задаче вашу очередь, складывайте во внутренний буфер, увеличивайте счетчик. Как дойдете до нужного количества - обрабатывайте весь буфер.


Это похоже на то, что я предлагал, называя "ручной установкой семафора". Это понятно, это не сложно реализовать.

Хотелось узнать, а вдруг есть возможность операционки такая. у меня опыта с FreeRTOS без 5 минут неделя, мало ли, что пропустил ...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Очереди и блокировка задач
СообщениеДобавлено: 10 май 2017, 14:18 
Старожил

Зарегистрирован: 16 ноя 2012, 07:47
Сообщения: 2664
А зачем понадобилась такая обработка данных из очереди? Опишите задачу, может совсем по другому все стоит делать.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Очереди и блокировка задач
СообщениеДобавлено: 10 май 2017, 15:07 
Старожил
Аватара пользователя

Зарегистрирован: 01 авг 2016, 10:47
Сообщения: 223
Откуда: Таганрог
Hold писал(а):
А зачем понадобилась такая обработка данных из очереди? Опишите задачу, может совсем по другому все стоит делать.

Могу только рассказать суть, остальное увы тайна покрытая мраком)

Суть:
с АЦП идет поток данных, 1кГц. Необходимо пропустить этот поток параллельно (условно параллельно, за счет использования RTOS) через два блока цифровых фильтров. Фильтры хотят на входе разное количество точек для обсчета.

По выходу фильтров данные собираются и выравниваются с данными от других источников для передачи дальше по цепи.

Суть хотелки: имея одну очередь дергать две задачи по обсчету с максимальной эффективностью. Отсутствие желания проверять каждый раз сколько элементов в очереди, обусловлено необходимостью максимальной энергоэффективности


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Очереди и блокировка задач
СообщениеДобавлено: 10 май 2017, 15:26 
Старожил

Зарегистрирован: 16 ноя 2012, 07:47
Сообщения: 2664
Параллельно все равно не выйдет, время выполнения будет тоже самое, а может и больше(переключение и все прочее), чем выполнять задачи последовательно.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Очереди и блокировка задач
СообщениеДобавлено: 10 май 2017, 15:35 
Старожил
Аватара пользователя

Зарегистрирован: 01 авг 2016, 10:47
Сообщения: 223
Откуда: Таганрог
Hold писал(а):
Параллельно все равно не выйдет, время выполнения будет тоже самое, а может и больше(переключение и все прочее), чем выполнять задачи последовательно.


я ж написал, условно параллельно. я понимаю как это работает.
Условную параллельность можно получить, если одна задача обрабатывает данные порциями по 5шт, другая по 17. Тогда появится ощущение что обе работают как бы параллельно.

ещё раз: нет желания сидеть в задаче и проверять а пришло нужное число данных или нет. Хочется узнать, есть ли возможность сказать операционке: а разблокируй задачу по заполнению очереди на N элементов, не раньше.


Пока вижу возможность только в привязке в момент поступления данных, а задачу блокировать не очередью, а семафором.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Очереди и блокировка задач
СообщениеДобавлено: 10 май 2017, 15:47 
Старожил

Зарегистрирован: 16 ноя 2012, 07:47
Сообщения: 2664
В задаче не надо сидеть, она спокойно себе спит, ожидая поступление данных из очереди. Как только данные пришли проверяете, а набралось ли нужное кол-во во внутреннем буфере. Если нет, тогда спокойно ожидаете дальнейшее поступление данных. Ну а если набралось - то работаете с данными, и потом опять ожидаете.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Очереди и блокировка задач
СообщениеДобавлено: 10 май 2017, 15:55 
Старожил

Зарегистрирован: 22 мар 2010, 22:54
Сообщения: 3996
меньшего оверхеда можно добиться, если в одно сообщение класть сразу N требуемых отсчетов. и всего делов.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Очереди и блокировка задач
СообщениеДобавлено: 10 май 2017, 16:01 
Старожил
Аватара пользователя

Зарегистрирован: 01 авг 2016, 10:47
Сообщения: 223
Откуда: Таганрог
Hold писал(а):
В задаче не надо сидеть, она спокойно себе спит, ожидая поступление данных из очереди. Как только данные пришли проверяете, а набралось ли нужное кол-во во внутреннем буфере. Если нет, тогда спокойно ожидаете дальнейшее поступление данных. Ну а если набралось - то работаете с данными, и потом опять ожидаете.


все, уловил суть. бессонные ночи все таки заставляют тупить (

да, наверно так и сделаю, если иных идей не появиться. Благодарствую за уделенное время


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Очереди и блокировка задач
СообщениеДобавлено: 10 май 2017, 16:03 
Старожил
Аватара пользователя

Зарегистрирован: 01 авг 2016, 10:47
Сообщения: 223
Откуда: Таганрог
Ink писал(а):
меньшего оверхеда можно добиться, если в одно сообщение класть сразу N требуемых отсчетов. и всего делов.


не исключено, однако, стоит помнить что задач потребляющих ресурс две и каждая хочет свои N отсчетов. а с таким подходом, получаем необходимость двух очередей, разве нет?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Очереди и блокировка задач
СообщениеДобавлено: 10 май 2017, 16:10 
Старожил

Зарегистрирован: 16 ноя 2012, 07:47
Сообщения: 2664
Так ли необходимо прям две задачи? Ведь можно же спокойно настроить DMA, по прерыванию заполнения DMA перенацелить DMA на другой буфер, в это время разблокировать задачу хоть семафором или vTaskResume и отдать указатель на заполненный буфер. Неспешно обработать и ждать следующих данных. Не совсем понятно для чего делать две задачи, которые кушают стек, ресурсы, появляеются вышеописанные грабли.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Очереди и блокировка задач
СообщениеДобавлено: 10 май 2017, 16:20 
Старожил
Аватара пользователя

Зарегистрирован: 01 авг 2016, 10:47
Сообщения: 223
Откуда: Таганрог
Hold писал(а):
Так ли необходимо прям две задачи? Ведь можно же спокойно настроить DMA, по прерыванию заполнения DMA перенацелить DMA на другой буфер, в это время разблокировать задачу хоть семафором или vTaskResume и отдать указатель на заполненный буфер. Неспешно обработать и ждать следующих данных. Не совсем понятно для чего делать две задачи, которые кушают стек, ресурсы, появляеются вышеописанные грабли.


две задачи ибо два разных фильтра цифровых работают с одними данными. Каждый фильтр имеет требование по количеству точек на входе для получения 1 точки на выходе. Один из фильтров имеет больший приоритет, второй может быть заведомо медленным по скорости работы.
Убедил или нет, но задач нужно ровно две на обработку.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Очереди и блокировка задач
СообщениеДобавлено: 10 май 2017, 16:47 
Старожил

Зарегистрирован: 22 мар 2010, 22:54
Сообщения: 3996
CheMax писал(а):
стоит помнить что задач потребляющих ресурс две и каждая хочет свои N отсчетов. а с таким подходом, получаем необходимость двух очередей, разве нет?
я видимо что-то не понимаю. вы хотите из одной очереди брать то 5, то 17 отсчетов? или как?
я понял так, что есть 2 фильтра и надо через оба прогонять один и тот же сигнал. вам в любом случае нужно 2 очереди. или как еще это может работать? может какой-то другой есть физический смысл...

вот стоит помнить, что переключение контекста - это дорогая операция. а складывать в локальный буфер сэмпл и делать ++ счетчику - очень дешево (а дма - еще дешевле). поэтому лучше давать задаче управление один раз в N отсчетов, кладя в очередь массив, а не постоянно дергая ее.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Очереди и блокировка задач
СообщениеДобавлено: 10 май 2017, 17:08 
Старожил

Зарегистрирован: 16 ноя 2012, 07:47
Сообщения: 2664
Или динамически выделять память, куда складывать все результаты, а в очередь класть только указатель на эти данные, чтобы почем зря не гонять данные. Хотя и статически можно выделить буферы.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Очереди и блокировка задач
СообщениеДобавлено: 10 май 2017, 17:20 
Старожил
Аватара пользователя

Зарегистрирован: 01 авг 2016, 10:47
Сообщения: 223
Откуда: Таганрог
Ink писал(а):
я видимо что-то не понимаю. вы хотите из одной очереди брать то 5, то 17 отсчетов? или как?...

Да, брать то одно число элементов, то другое. Очередь позволяет так в принципе;

Ink писал(а):
я понял так, что есть 2 фильтра и надо через оба прогонять один и тот же сигнал. вам в любом случае нужно 2 очереди. или как еще это может работать? может какой-то другой есть физический смысл...

Совершенно верно, два фильтра, один сигнал. Возможно я погорячился, и действительно есть необходимость в копировании данных в локальные массивы для обработки

DMA каналов хоть и много, но практически все заняты


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Очереди и блокировка задач
СообщениеДобавлено: 10 май 2017, 17:56 
Заглядывает иногда

Зарегистрирован: 03 май 2017, 17:34
Сообщения: 90
Для первого нужно 17 данных, для второго 5. Пока первый копит данные для себя, второй уже 3 раза обсчитал данные и готовится к 4-му заходу.
Если нужно дождаться 17 данных и потом запустить работу обоих алгоритмов, такую задачу можно выполнить по другому.
Заводим глобальный массив на максимальное кол-во исходных данных (17). И все алгоритмы читают эти данные и не изменяют.
Из очереди принимаемых данных заполняем статический массив. При достижении максимума, производим запуск всех алгоритмов.
Перед запуском каждого алгоритма, увеличиваем счетчик.
Каждый запущенный алгоритм, по завершении уменьшает счетчик.

После запуска всех задач (алгоритмов),
а) исходная задача переходит в режим ожидания счетчика в нуль;
б) исходная очередь готова к накоплению данных.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Очереди и блокировка задач
СообщениеДобавлено: 10 май 2017, 21:01 
Старожил

Зарегистрирован: 19 мар 2013, 19:37
Сообщения: 2481
Откуда: Санкт-Петербург
Счётчики в вызывающем треде - наиболее эффективное решение (их самих синхронизировать не надо, и взаимодействие между тредами минимально - по одной отправке сигнала на большой обрабатываемый блок).

Ну и, конечно, если речь идёт об обработке накапливающихся в буфере (dma или ещё как) данных - то не требуется слать сообщения на каждый чих, достаточно (при выполнении условия) передать сообщением текущую позицию в буфере.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Очереди и блокировка задач
СообщениеДобавлено: 10 май 2017, 21:08 
Старожил

Зарегистрирован: 22 мар 2010, 22:54
Сообщения: 3996
Hold писал(а):
Или динамически выделять память
это дорого. в очереди уже "статически" выделена память. копирование небольшого массива сильно выгоднее динамического выделения памяти.
CheMax писал(а):
Да, брать то одно число элементов, то другое. Очередь позволяет так в принципе;
очереди-то пофиг, я физического смысла не пойму. какая такая задача может быть, что половину сигнала можно фильтровать одним способом, половину - другим... интересно узнать какой-нить пример.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Очереди и блокировка задач
СообщениеДобавлено: 10 май 2017, 23:57 
Старожил
Аватара пользователя

Зарегистрирован: 01 авг 2016, 10:47
Сообщения: 223
Откуда: Таганрог
Ink писал(а):
CheMax писал(а):
Да, брать то одно число элементов, то другое. Очередь позволяет так в принципе;
очереди-то пофиг, я физического смысла не пойму. какая такая задача может быть, что половину сигнала можно фильтровать одним способом, половину - другим... интересно узнать какой-нить пример.


физический смысл прост, ибо это физиологический сигнал. Одним фильтром выделяется одна составляющая, другим другая. Хотя пример можно привести абстрактный: в рамках большой полосы у Вас два или более полезных сигнала разнесенных по частоте. вот вы и выделяете из общего сигнала два разных разными фильтрами.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Очереди и блокировка задач
СообщениеДобавлено: 11 май 2017, 00:00 
Старожил
Аватара пользователя

Зарегистрирован: 01 авг 2016, 10:47
Сообщения: 223
Откуда: Таганрог
aamonster писал(а):
Счётчики в вызывающем треде - наиболее эффективное решение (их самих синхронизировать не надо, и взаимодействие между тредами минимально - по одной отправке сигнала на большой обрабатываемый блок).

Ну и, конечно, если речь идёт об обработке накапливающихся в буфере (dma или ещё как) данных - то не требуется слать сообщения на каждый чих, достаточно (при выполнении условия) передать сообщением текущую позицию в буфере.


Хм, при этом пользуется кольцевой буфер для приема данных получается. Передаем указатель по записи, указатель по чтению модифицируется самостоятельно и в своей задаче. Блин, а логичное ж решение)

Надо подумать будет над такой реализацией.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 39 ]  На страницу 1, 2  След.

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


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

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


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

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

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