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

Межпроцессорная синхронизация для доступа к переменным

Всем привет.

Объясните, пожалуйста, нужно ли обеспечивать межпроцессорную синхронизацию для доуступа к переменным простых типов (8 бит, bool) на AVR с использованием scmRTOS и др. ОС?
Имеется несколько читающих и пишущих процессов в эту переменную.

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


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

3 минуты назад, spongebob сказал:

на AVR

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

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


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

22 минуты назад, spongebob сказал:

нужно ли обеспечивать межпроцессорную синхронизацию

А что - уже многоядерные AVR появились???  :scratch_one-s_head:

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


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

44 minutes ago, mantech said:

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

Я не про можно, а про нужно :)
Правильно ли я понимаю, что доступ к 8-битным переменным всегда атомарен? Ну, т. е., ситуации, при которых один процесс пишет в переменную и его прерывает другой процесс, чтобы записать или прочитать (и наоборот), не приведут к проблемам?
Если переменная более 8 бит (или какая-либо сложная структура), то между записью/чтением ее байтов могут вклиниться другие подобные операции и тут точно могут быть проблемы...

24 minutes ago, jcxz said:

А что - уже многоядерные AVR появились???  :scratch_one-s_head:

Я про доступ к переменной в памяти из разных процессов ОС, допустим scmRTOS.
В рамках этой ОС потоки называются процессами. Это непринципиально.

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

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


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

Все не совсем так. Если один процесс только пишет в переменную, а другой только читает - то да, атомарно. Но если идет чтение-модификация-запись или проверка переменной и запись в нее, то может быть много интересного. Рассмотрим ситуацию: процесс хочет отмодифицировать переменную. Он выбирает значение из памяти в регистр, т.к. операции можификации бывают только над регистрами, затем процесс прервали и изменили значение переменной в памяти. Управление вернули. Процесс модифицирует регистр и пишет его в память. Значение, которое записал другой процесс пропало.

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


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

В любой ос есть критические секции, которые не могут быть прерваны.

Если сомневаешься, то пользуйся.

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


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

>> нужно ли обеспечивать межпроцессорную синхронизацию

1 hour ago, spongebob said:

. . . . Это непринципиально.

правильное использование терминов как раз принципиально.

Эта "тема" называется inter-process communication, IPC

 

ps  Разбираясь с синхронизацией, атомарностью "наразвес" своими силами, Вы рискуете изобрести велосипед в виде mutex-а или семафора.

Посмотрите их реализацию (исходник) в scmRTOS, возможно это "ОНО".

 

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


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

Логичен ещё один процесс арбитра записи, и к/от каждого участника очереди — две пары флагов и буферная переменная.

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


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

49 minutes ago, k155la3 said:

нужно ли обеспечивать межпроцессорную синхронизацию

Ой, прошу прощения... написал совсем не то, что нужно... конечно же межпроцессную (межпоточную) синхронизацию.

50 minutes ago, k155la3 said:

Разбираясь с синхронизацией, атомарностью "наразвес" своими силами, Вы рискуете изобрести велосипед в виде mutex-а или семафора.

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

14 minutes ago, Plain said:

Логичен ещё один процесс арбитра записи, и к/от каждого участника очереди — две пары флагов и буферная переменная.

А это для чего?

1 hour ago, rkit said:

В любой ос есть критические секции, которые не могут быть прерваны.

Если сомневаешься, то пользуйся.

Да, конечно, я использую их, спасибо.

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


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

3 часа назад, spongebob сказал:

Правильно ли я понимаю, что доступ к 8-битным переменным всегда атомарен?

Операции чтение-модификация-запись неатомарны ни для каких типов. Если таковые имеются над этой переменной в вашем коде (например |=, &= ), то средства межпроцессного взаимодействия нужны.

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


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

13 hours ago, Darth Vader said:

Операции чтение-модификация-запись неатомарны ни для каких типов. Если таковые имеются над этой переменной в вашем коде (например |=, &= ), то средства межпроцессного взаимодействия нужны.

Не, чтение-модификация-запись - у меня нет. У меня bool. Два процесса, просто читают, пишут, проверяют значение.

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

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


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

40 минут назад, spongebob сказал:

Не, чтение-модификация-запись - у меня нет. У меня bool. Два процесса, просто читают, пишут, проверяют значение.

:wacko2:

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


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

3 hours ago, spongebob said:

Не, чтение-модификация-запись - у меня нет. У меня bool. Два процесса, просто читают, пишут, проверяют значение.

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

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


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

23 часа назад, spongebob сказал:

Не, чтение-модификация-запись - у меня нет

Если ваша переменная не регистровая, по практически все операции над ней, кроме = (присваивание значения) будут неатомарны. Для любой операции: +, -, *, /, &, |, ^, <<, >> значение из переменной в памяти надо считать в регистр, произвести операцию в регистре и записать результат обратно в переменную в памяти.

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


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

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

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

Гость
Ответить в этой теме...

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

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

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

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

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

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