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

 
 
2 страниц V  < 1 2  
Reply to this topicStart new topic
> Запрет/Разрешение прерываний в кольцевых буферах, Как правильно и оптимально?
AHTOXA
сообщение Jun 18 2008, 17:38
Сообщение #16


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Цитата(rezident @ Jun 18 2008, 20:21) *
Для кольцевых буферов я лично использую два индекса - один индекс для чтения, другой для записи. Ну и счетчик еще.


Я тоже так делаю :-) Но всё равно, изменение значения счётчика приходится выполнять при запрещённых прервыаниях, ибо операция не атомарная.


Цитата(Rst7 @ Jun 18 2008, 23:11) *
Я к тому веду, что в общем случае, при работе с кольцевыми буферами необходима атомарная RMW-операция с памятью хотя-бы в одном месте. С учетом того, что на RISC-процах нет столь любимого на PDP11 INC и DEC прямо ячейки памяти, получается, что необходимо уметь запрещать/разрешать прерывания (или переключение задач в общем случае).


Во-воsmile.gif


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
defunct
сообщение Jun 18 2008, 21:16
Сообщение #17


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(Rst7 @ Jun 18 2008, 15:02) *
>> if ((U8)(buf.in + 1) != buf.out) buf.data [buf.in++] = c;

Да, такая конструкция работает. По причине атомарности добавления. А вот аналогиная передача - - работать не будет.


Это еще почему?! Еще как будет работать. По причине того что in++ делается уже после того как байт добавлен в очередь.

Предположим передатчик прервал фоновую задачу в любой момент выполнения

if ((U8)(buf.in + 1) != buf.out) buf.data [buf.in++] = c;

Если индекс "in" соответвует разрядности процессора, и будет записан в память одной командой ST тогда будем иметь только три возможные комбинации в обработчике прерывания:

buf.in == buf.out нет новых данных (ничего не отправлено)
buf.in == buf.out есть новые данные (ничего не отправлено, т.к. индексы говорят об отсутсвии данных)
buf.in != buf.out есть новые данные (берем сколько можно пока out != in)

Все комбинации безопасны.

Ранее чем изменится индекс in, передатчик не сможет определить, что байт был добавлен в буфер, соответвенно ничего лишнего или частично положенного не вытянет.

Для работоспособности этой конструкции необходимо
- чтобы данные шли всегда из одного и того же источника (задачи)
- забирались всегда одним и тем же адресатом (задачей)
(источник и адресат - могут быть разными задачами)
и достаточно атомарности обновления индекса (запись одной командой ST), т.е. индекс не может быть большей разрядности чем разрядность регистров процессора. Все остальное не важно.
Go to the top of the page
 
+Quote Post
tag
сообщение Jun 19 2008, 05:20
Сообщение #18


Частый гость
**

Группа: Свой
Сообщений: 151
Регистрация: 21-02-06
Пользователь №: 14 561



Цитата(Rst7 @ Jun 18 2008, 16:02) *
Да, такая конструкция работает. По причине атомарности добавления. А вот аналогиная передача - работать не будет.

...и передача тоже будет работать и по причине атомарности в том числе
Go to the top of the page
 
+Quote Post
Rst7
сообщение Jun 19 2008, 05:25
Сообщение #19


Йа моск ;)
******

Группа: Модераторы
Сообщений: 4 345
Регистрация: 7-07-05
Из: Kharkiv-city
Пользователь №: 6 610



Цитата
Это еще почему?! Еще как будет работать.


Да, согласен. Тут я погорячился, но...

Цитата
Для работоспособности этой конструкции необходимо - чтобы данные шли всегда из одного и того же источника (задачи)


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

В общем случае я бы такую задачу формулировал и решал с точки зрения минимизации нахождения в состоянии с запрещенными прерываниями.


--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
Go to the top of the page
 
+Quote Post
tag
сообщение Jun 19 2008, 05:26
Сообщение #20


Частый гость
**

Группа: Свой
Сообщений: 151
Регистрация: 21-02-06
Пользователь №: 14 561



...скажу даже больше, так реализован обмен с модемом в библиотеке TCP/IP для ARM от Keil-а кажется
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 9th August 2025 - 16:46
Рейтинг@Mail.ru


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