Mty 0 26 мая Опубликовано 26 мая · Жалоба Приветствую, Есть задача с ADC которая анализирует данные - вычисляет среднее min max итп. Время от времени надо запросить данные из другой задачи с rs232 command line. Просто спросить текущие значения параметров. Как лучше сделать - 2 очереди, в одной запрос в другой ответ? Или как то еще? Спасибо. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
tonyk_av 43 26 мая Опубликовано 26 мая (изменено) · Жалоба 34 minutes ago, Mty said: Как лучше сделать К чему такие сложности? Положи в разделяемую память, доступ синхронизируй через критические секции. Изменено 26 мая пользователем tonyk_av Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Mty 0 26 мая Опубликовано 26 мая · Жалоба 11 minutes ago, tonyk_av said: К чему такие сложности? Положи в разделяемую память, доступ синхронизируй через критические секции. О, круто. Спасибо! Даже мютексы не надо мутить? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
EdgeAligned 83 26 мая Опубликовано 26 мая · Жалоба Есть еще уведомления - Task Notification - легкий механизм для "пинка" одной задачи другой. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
tonyk_av 43 26 мая Опубликовано 26 мая (изменено) · Жалоба 25 minutes ago, Mty said: Даже мютексы не надо мутить? Для чего? FreeRTOS идёт в исходниках, посмотри, что и как там сделано и сопоставь со своими хотелками. Как я понял из вопроса, нужно просто обновить не большой блок данных из одной задачи с гарантией, что другие задачи до окончания обновления не смогут его прочитать. По-моему, самое простое- это запретить прерывание планировщика на время записи одной задачи и чтения другой. Это как раз делает критическая секция. Изменено 26 мая пользователем tonyk_av 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 178 26 мая Опубликовано 26 мая · Жалоба Общая память + volatile-флажок, без критических секций и т.д. Процесс, который пишет данные, удостоверяется, что флажок сброшен - только потом пишет данные в память и устанавливает флажок. Процесс, читающий данные, смотрит (периодически или по пинку), если флажок установлен - читает данные из памяти и потом чистит флажок. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
EdgeAligned 83 26 мая Опубликовано 26 мая · Жалоба В концепции RTOS этот флажок называется мьютексом - mutual exclusion - взаимное исключение Запрет вообще всех прерываний тормознет всю систему. Мьютекс же блокирнет лишь те задачи, которые относятся к защищаемой области. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 234 26 мая Опубликовано 26 мая · Жалоба 1 час назад, Arlleex сказал: Общая память + volatile-флажок, без критических секций и т.д. Если задачи - независимы друг от друга, то критическая секция нужна. Потому как пишущая задача вполне может захотеть обновить данные до того, как предыдущие данные считаны читающей задачей. Так что = критическая секция (для сериализации доступа к данным) + какой-либо механизм нотификации (об обновлении данных) читающей задаче. Второе может быть как простым volatile-флажком, так и каким-то средством из арсенала ОС. 1 час назад, Arlleex сказал: Процесс, который пишет данные, удостоверяется, что флажок сброшен - только потом пишет данные в память и устанавливает флажок. А если предыдущие данные ещё не считаны, но пришли новые? Куда их девать? Вот для того и нужны критическая секция + нотификатор. Из контекста вопроса видно, что передаваемые данные - какие-то параметры, которые могут приходить в любое время, асинхронно работе системы. В том числе и прийти несколько раз подряд с коротким интервалом. 1 час назад, Arlleex сказал: Процесс, читающий данные, смотрит (периодически или по пинку), если флажок установлен - читает данные из памяти и потом чистит флажок. Неправильный алгоритм. Сперва читающий процесс должен сбросить флажок-нотификатор, и только потом - считывать данные. Так как иначе он может сбросить флаг новых данных, даже не прочитав их. 1 час назад, EdgeAligned сказал: В концепции RTOS этот флажок называется мьютексом - mutual exclusion - взаимное исключение Это не так. Флажков в РТОС бывает много разных. И в любом случае всегда советовать весьма тяжёлый мьютекс - так себе совет. Мьютекс я бы советовал в самом последнем случае. PS: Если не нравится критическая секция или мьютекс (который весьма сложен внутри, намного сложнее критической секции, а потому требует много ресурсов от ОС; и применять его лишний раз в простых случаях - неоптимально), то есть множество других вариантов межзадачной синхронизации. Вместо критической секции (которая может запрещать все прерывания), можно останавливать шедулер ОС на время чтения/записи разделяемых данных (что является аналогом критической секции, но без помех работе прерываний). Кроме того - есть механизмы межзадачной синхронизации вне-РТОС функционала. Спин-блокировка например. Если у ТС процессор = Cortex-M, то для атомизации доступа к разделяемым данным можно использовать механизм эксклюзивного доступа. В случае, если объём передаваемых параметров небольшой (~десятки байт), то эксклюзивный доступ намного легче (по занимаемым ресурсам) чем мьютекс. И при этом совершенно не мешает работе прерываний. При выборе конкретного способа синхронизации в каждом конкретном случае, следует идти от простого к сложному: Сперва примерить самый простой способ. Если не подходит - переходим к более сложному, примеряем его. И так далее... Только так можно создавать оптимальные программы. 1 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
tonyk_av 43 26 мая Опубликовано 26 мая · Жалоба 4 hours ago, EdgeAligned said: Запрет вообще всех прерываний тормознет всю систему. Ничего он не тормознёт, тем более на ARM. Посмотрите в исходниках как он сделан. Да и запись-чтение десятка-другого байт весьма быстрая операция, чтобы просадить процессор МК. 3 hours ago, jcxz said: При выборе конкретного способа синхронизации в каждом конкретном случае, следует идти от простого к сложному Вот именно! Но сначала прочитать теорию, потом посмотреть, как это сделано во FreeRTOS для ARM. jcxz знает, что говорит. 3 hours ago, jcxz said: А если предыдущие данные ещё не считаны, но пришли новые? Куда их девать? Не для jcxz: тут нужно определиться, что важнее, скорость или память. Если скорость, то, войдя в критическую секцию, сразу копируем данные в разделяемую память или из неё и сразу выходим из критической секции, после чего спокойно разбираемся с данными. Если память жмёт, то в критической секции максимально быстро обрабатываем данные. 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Mty 0 27 мая Опубликовано 27 мая · Жалоба 15 hours ago, tonyk_av said: Не для jcxz: тут нужно определиться, что важнее, скорость или память. Если скорость, то, войдя в критическую секцию, сразу копируем данные в разделяемую память или из неё и сразу выходим из критической секции, после чего спокойно разбираемся с данными. Если память жмёт, то в критической секции максимально быстро обрабатываем данные. У меня как раз случай с десятком байт. Критическая секция отлично подходит чтобы скопировать байты в свою задачу и потом работать с ними. Ну и вторая критическая секция в задаче - источнике, при заполнении массива - источника данных. Это отличный простой и малозатратный способ по сравнению с тем, что я хотел делать на 2х очередях. Спасибо! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
firstvald 22 28 мая Опубликовано 28 мая · Жалоба On 5/26/2024 at 1:57 PM, Mty said: О, круто. Спасибо! Даже мютексы не надо мутить? ну я обсемаформливаю Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 178 28 мая Опубликовано 28 мая · Жалоба 3 минуты назад, firstvald сказал: обсемаформливаю 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
firstvald 22 28 мая Опубликовано 28 мая · Жалоба еслиб мог сказать обмьютексливаю , то сказал бы, но ниасилил. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Ozone 2 7 июня Опубликовано 7 июня · Жалоба В 26.05.2024 в 14:53, Arlleex сказал: Общая память + volatile-флажок, без критических секций и т.д. А разве volatile-флажок обеспечит атомарность операции изменения этого флажка? По-моему, как минимум нужно флажок помещать вкритическую секцию. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
x893 55 7 июня Опубликовано 7 июня · Жалоба 17 minutes ago, Ozone said: А разве volatile-флажок обеспечит атомарность операции изменения этого флажка? По-моему, как минимум нужно флажок помещать вкритическую секцию. Если он 0 и 1 то и критических секций не надо. А иногда и надо. Тут у каждого своя голова. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться