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

Запрос данных из задачи в задачу

Приветствую,

Есть задача с ADC которая анализирует данные - вычисляет среднее min max итп.

Время от времени надо запросить данные из другой задачи с rs232 command line.
Просто спросить текущие значения параметров.

Как лучше сделать - 2 очереди, в одной запрос в другой ответ? Или как то еще?

Спасибо.

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


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

34 minutes ago, Mty said:

Как лучше сделать

К чему такие сложности?

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

Изменено пользователем tonyk_av

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


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

11 minutes ago, tonyk_av said:

К чему такие сложности?

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

 

О, круто. Спасибо!
Даже мютексы не надо мутить?

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


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

Есть еще уведомления - Task Notification - легкий механизм для "пинка" одной задачи другой.

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


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

25 minutes ago, Mty said:

Даже мютексы не надо мутить?

Для чего? FreeRTOS идёт в исходниках, посмотри, что и как там сделано и сопоставь со своими хотелками.

Как я понял из вопроса, нужно просто обновить не большой блок данных из одной задачи с гарантией, что другие задачи до окончания обновления не смогут его прочитать. По-моему, самое простое- это запретить прерывание планировщика на время записи одной задачи и чтения другой. Это как раз  делает критическая секция.

Изменено пользователем tonyk_av

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


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

Общая память + volatile-флажок, без критических секций и т.д.

Процесс, который пишет данные, удостоверяется, что флажок сброшен - только потом пишет данные в память и устанавливает флажок.

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

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


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

В концепции RTOS этот флажок называется мьютексом - mutual exclusion - взаимное исключение

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

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


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

1 час назад, Arlleex сказал:

Общая память + volatile-флажок, без критических секций и т.д.

Если задачи - независимы друг от друга, то критическая секция нужна. Потому как пишущая задача вполне может захотеть обновить данные до того, как предыдущие данные считаны читающей задачей. Так что = критическая секция (для сериализации доступа к данным) + какой-либо механизм нотификации (об обновлении данных) читающей задаче. Второе может быть как простым volatile-флажком, так и каким-то средством из арсенала ОС.

1 час назад, Arlleex сказал:

Процесс, который пишет данные, удостоверяется, что флажок сброшен - только потом пишет данные в память и устанавливает флажок.

А если предыдущие данные ещё не считаны, но пришли новые? Куда их девать? Вот для того и нужны критическая секция + нотификатор.

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

1 час назад, Arlleex сказал:

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

Неправильный алгоритм. Сперва читающий процесс должен сбросить флажок-нотификатор, и только потом - считывать данные. Так как иначе он может сбросить флаг новых данных, даже не прочитав их.

1 час назад, EdgeAligned сказал:

В концепции RTOS этот флажок называется мьютексом - mutual exclusion - взаимное исключение

Это не так. Флажков в РТОС бывает много разных. И в любом случае всегда советовать весьма тяжёлый мьютекс - так себе совет. Мьютекс я бы советовал в самом последнем случае.

 

PS: Если не нравится критическая секция или мьютекс (который весьма сложен внутри, намного сложнее критической секции, а потому требует много ресурсов от ОС; и применять его лишний раз в простых случаях - неоптимально), то есть множество других вариантов межзадачной синхронизации. Вместо критической секции (которая может запрещать все прерывания), можно останавливать шедулер ОС на время чтения/записи разделяемых данных (что является аналогом критической секции, но без помех работе прерываний).

Кроме того - есть механизмы межзадачной синхронизации вне-РТОС функционала. Спин-блокировка например. Если у ТС процессор = Cortex-M, то для атомизации доступа к разделяемым данным можно использовать механизм эксклюзивного доступа. В случае, если объём передаваемых параметров небольшой (~десятки байт), то эксклюзивный доступ намного легче (по занимаемым ресурсам) чем мьютекс. И при этом совершенно не мешает работе прерываний.

При выборе конкретного способа синхронизации в каждом конкретном случае, следует идти от простого к сложному: Сперва примерить самый простой способ. Если не подходит - переходим к более сложному, примеряем его. И так далее... Только так можно создавать оптимальные программы.

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


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

4 hours ago, EdgeAligned said:

Запрет вообще всех прерываний тормознет всю систему.

Ничего он не тормознёт, тем более на ARM. Посмотрите в исходниках как он сделан. Да и запись-чтение десятка-другого байт весьма быстрая операция, чтобы просадить процессор МК.

3 hours ago, jcxz said:

При выборе конкретного способа синхронизации в каждом конкретном случае, следует идти от простого к сложному

Вот именно! Но сначала прочитать теорию, потом посмотреть, как это сделано во FreeRTOS для ARM. jcxz знает, что говорит.

3 hours ago, jcxz said:

А если предыдущие данные ещё не считаны, но пришли новые? Куда их девать?

Не для jcxz: тут нужно определиться, что важнее, скорость или память. Если скорость, то, войдя в критическую секцию, сразу копируем данные в разделяемую память или из неё и сразу выходим из критической секции, после чего спокойно разбираемся с данными. Если память жмёт, то в критической секции максимально быстро обрабатываем данные.

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


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

15 hours ago, tonyk_av said:

Не для jcxz: тут нужно определиться, что важнее, скорость или память. Если скорость, то, войдя в критическую секцию, сразу копируем данные в разделяемую память или из неё и сразу выходим из критической секции, после чего спокойно разбираемся с данными. Если память жмёт, то в критической секции максимально быстро обрабатываем данные.

У меня как раз случай с десятком байт. Критическая секция отлично подходит чтобы скопировать байты в свою задачу и потом работать с ними. Ну и вторая критическая секция в задаче - источнике, при заполнении массива - источника данных.
Это отличный простой и малозатратный способ по сравнению с тем, что я хотел делать на 2х очередях.
Спасибо!

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


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

On 5/26/2024 at 1:57 PM, Mty said:

О, круто. Спасибо!
Даже мютексы не надо мутить?

ну я обсемаформливаю

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


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

еслиб мог сказать обмьютексливаю ,  то сказал бы, но ниасилил.

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


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

В 26.05.2024 в 14:53, Arlleex сказал:

Общая память + volatile-флажок, без критических секций и т.д.

А разве volatile-флажок обеспечит атомарность операции изменения этого флажка?    По-моему, как минимум нужно флажок помещать вкритическую секцию.

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


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

17 minutes ago, Ozone said:

А разве volatile-флажок обеспечит атомарность операции изменения этого флажка?    По-моему, как минимум нужно флажок помещать вкритическую секцию.

Если он 0 и 1 то и критических секций не надо. А иногда и надо. Тут у каждого своя голова.

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


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

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

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

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

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

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

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

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

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

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