реклама на сайте
подробности

 
 
> Поделимся опытом, Несколько процессов - общие переменные
SasaVitebsk
сообщение Mar 12 2006, 12:47
Сообщение #1


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



Вопрос чисто риторический и не очень. smile.gif
Я думаю с этим вопросом в той или иной степени сталкивался каждый разработчик. Так давайте же братцы поделимся опытом, так сказать облегчим душу. smile.gif

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

Итак кто как борится с вызыванием прерывания во время модификации переменной. Приведу пример (Пример абстракный. Привожу его для понимания картины).
Имеется кольцевой буфер. Переменная EndInBuf двухбайтная. При переходе по кольцу осуществляются след. действия.
if (EndInBuf > (BEGIN_IN_BUF + LENGTH_IN_BUF)) EndInBuf = BEGIN_IN_BUF;
Очевидно что операция присваивания будет происходить в несколько ассемблерных команд. Если между этими командами происходит вызов прерывания и в этом прерывании используется переменная EndInBuf, то произойдёт ошибка. Я в своей практике (на ассемблере) использовал следующие способы предотвращения данных ситуаций.
1) Самый простой. Сокращаешь до минимума число критических операций. На время данной операции запрещаешь прерывания.
2) Синхронизация процессов. В прерывании устанавливаешь флаг. В голове сбрасываешь и дожидаешься установки. Это означает что прерывание пришло и у тебя есть некоторое время для модификации, до прихода следующего прерывания.
3) Разделяешь процессы во времени так, чтобы они никогда не перекрывались. (Так сказать мини ОС smile.gif )
4) В некоторых случаях помогает написание програмного контролера прерываний. (Модификация пункта 1)

Меня интересует как к этому подходят другие? Имеются ли "общепринятые решения по данному вопросу"? smile.gif Особенно меня это интересует в плане применения на C. Так как я сейчас перехожу на данный язык.
Дело в том что я сейчас нахожусь на распутьи. Мне надо осуществить операцию типа "чистка мусора". Как к этому подойти по грамотному, пока не знаю. Ни одно решение пока мне не понравилось.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
vet
сообщение Mar 13 2006, 07:51
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 550
Регистрация: 16-06-04
Из: Казань
Пользователь №: 32



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


--------------------
Главная линия этого опуса ясна мне насквозь!
Go to the top of the page
 
+Quote Post
dxp
сообщение Mar 13 2006, 08:59
Сообщение #3


Adept
******

Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343



Цитата(vet @ Mar 13 2006, 13:51) *
dxp,
Критическая секция - это часть программы, в которой осуществляется доступ к разделяемым данным. Проще всего реализовать это запретом прерываний, эмбеддеры так часто и делают. Но по теории реализация к.с. опирается на семафоры, и в многозадачках это основной способ.

Но критическая секция - не семафор! Не будем путать "палец, указующий на Луну" с самой Луной. smile.gif


--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st July 2025 - 18:54
Рейтинг@Mail.ru


Страница сгенерированна за 0.01362 секунд с 7
ELECTRONIX ©2004-2016