spongebob 0 Posted April 14 · Report post Всем привет. Объясните, пожалуйста, нужно ли обеспечивать межпроцессорную синхронизацию для доуступа к переменным простых типов (8 бит, bool) на AVR с использованием scmRTOS и др. ОС? Имеется несколько читающих и пишущих процессов в эту переменную. Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
mantech 1 Posted April 14 · Report post 3 минуты назад, spongebob сказал: на AVR И как вы себе это представляете? Аппаратных механизмов доступа к общей памяти нет и у гораздо более мощных процессоров, программно, через порт и прерывания с использованием механизмов синхронизации при обновлении можно. Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
jcxz 4 Posted April 14 · Report post 22 минуты назад, spongebob сказал: нужно ли обеспечивать межпроцессорную синхронизацию А что - уже многоядерные AVR появились??? Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
spongebob 0 Posted April 14 (edited) · Report post 44 minutes ago, mantech said: И как вы себе это представляете? Аппаратных механизмов доступа к общей памяти нет и у гораздо более мощных процессоров, программно, через порт и прерывания с использованием механизмов синхронизации при обновлении можно. Я не про можно, а про нужно :) Правильно ли я понимаю, что доступ к 8-битным переменным всегда атомарен? Ну, т. е., ситуации, при которых один процесс пишет в переменную и его прерывает другой процесс, чтобы записать или прочитать (и наоборот), не приведут к проблемам? Если переменная более 8 бит (или какая-либо сложная структура), то между записью/чтением ее байтов могут вклиниться другие подобные операции и тут точно могут быть проблемы... 24 minutes ago, jcxz said: А что - уже многоядерные AVR появились??? Я про доступ к переменной в памяти из разных процессов ОС, допустим scmRTOS. В рамках этой ОС потоки называются процессами. Это непринципиально. Edited April 14 by spongebob Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
Alex11 0 Posted April 14 · Report post Все не совсем так. Если один процесс только пишет в переменную, а другой только читает - то да, атомарно. Но если идет чтение-модификация-запись или проверка переменной и запись в нее, то может быть много интересного. Рассмотрим ситуацию: процесс хочет отмодифицировать переменную. Он выбирает значение из памяти в регистр, т.к. операции можификации бывают только над регистрами, затем процесс прервали и изменили значение переменной в памяти. Управление вернули. Процесс модифицирует регистр и пишет его в память. Значение, которое записал другой процесс пропало. Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
rkit 0 Posted April 14 · Report post В любой ос есть критические секции, которые не могут быть прерваны. Если сомневаешься, то пользуйся. Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
k155la3 2 Posted April 14 · Report post >> нужно ли обеспечивать межпроцессорную синхронизацию 1 hour ago, spongebob said: . . . . Это непринципиально. правильное использование терминов как раз принципиально. Эта "тема" называется inter-process communication, IPC ps Разбираясь с синхронизацией, атомарностью "наразвес" своими силами, Вы рискуете изобрести велосипед в виде mutex-а или семафора. Посмотрите их реализацию (исходник) в scmRTOS, возможно это "ОНО". Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
Plain 0 Posted April 14 · Report post Логичен ещё один процесс арбитра записи, и к/от каждого участника очереди — две пары флагов и буферная переменная. Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
spongebob 0 Posted April 14 · Report post 49 minutes ago, k155la3 said: нужно ли обеспечивать межпроцессорную синхронизацию Ой, прошу прощения... написал совсем не то, что нужно... конечно же межпроцессную (межпоточную) синхронизацию. 50 minutes ago, k155la3 said: Разбираясь с синхронизацией, атомарностью "наразвес" своими силами, Вы рискуете изобрести велосипед в виде mutex-а или семафора. Да, конечно, я знаю про них и использую их. Вопрос был про доступ к простой однобайтной переменной. Спасибо. 14 minutes ago, Plain said: Логичен ещё один процесс арбитра записи, и к/от каждого участника очереди — две пары флагов и буферная переменная. А это для чего? 1 hour ago, rkit said: В любой ос есть критические секции, которые не могут быть прерваны. Если сомневаешься, то пользуйся. Да, конечно, я использую их, спасибо. Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
Darth Vader 0 Posted April 14 · Report post 3 часа назад, spongebob сказал: Правильно ли я понимаю, что доступ к 8-битным переменным всегда атомарен? Операции чтение-модификация-запись неатомарны ни для каких типов. Если таковые имеются над этой переменной в вашем коде (например |=, &= ), то средства межпроцессного взаимодействия нужны. Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
Andrew_Q 0 Posted April 15 · Report post http://we.easyelectronics.ru/os-rtos/mezhprocessnaya-kommunikaciya-v-scmrtos-chast-1-myuteksy.html Не оно? Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
spongebob 0 Posted April 15 (edited) · Report post 13 hours ago, Darth Vader said: Операции чтение-модификация-запись неатомарны ни для каких типов. Если таковые имеются над этой переменной в вашем коде (например |=, &= ), то средства межпроцессного взаимодействия нужны. Не, чтение-модификация-запись - у меня нет. У меня bool. Два процесса, просто читают, пишут, проверяют значение. Edited April 15 by spongebob Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
Arlleex 1 Posted April 15 · Report post 40 минут назад, spongebob сказал: Не, чтение-модификация-запись - у меня нет. У меня bool. Два процесса, просто читают, пишут, проверяют значение. Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
k155la3 2 Posted April 15 · Report post 3 hours ago, spongebob said: Не, чтение-модификация-запись - у меня нет. У меня bool. Два процесса, просто читают, пишут, проверяют значение. Так можете налететь на трудноотлавливаемый баг-глюк-сбой из-за явления, подобного децимации. Оно наблюдается даже на цифровых осциллографах. Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
Darth Vader 0 Posted April 16 · Report post 23 часа назад, spongebob сказал: Не, чтение-модификация-запись - у меня нет Если ваша переменная не регистровая, по практически все операции над ней, кроме = (присваивание значения) будут неатомарны. Для любой операции: +, -, *, /, &, |, ^, <<, >> значение из переменной в памяти надо считать в регистр, произвести операцию в регистре и записать результат обратно в переменную в памяти. Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...