Jump to content
    

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

Всем привет.

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

Share this post


Link to post
Share on other sites

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

на AVR

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

Share this post


Link to post
Share on other sites

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

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

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

Share this post


Link to post
Share on other sites

44 minutes ago, mantech said:

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

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

24 minutes ago, jcxz said:

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

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

Edited by spongebob

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

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

Share this post


Link to post
Share on other sites

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

1 hour ago, spongebob said:

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

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

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

 

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

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

 

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

49 minutes ago, k155la3 said:

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

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

50 minutes ago, k155la3 said:

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

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

14 minutes ago, Plain said:

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

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

1 hour ago, rkit said:

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

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

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

Share this post


Link to post
Share on other sites

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

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

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

Share this post


Link to post
Share on other sites

13 hours ago, Darth Vader said:

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

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

Edited by spongebob

Share this post


Link to post
Share on other sites

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

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

:wacko2:

Share this post


Link to post
Share on other sites

3 hours ago, spongebob said:

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

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

Share this post


Link to post
Share on other sites

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

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

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

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...