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

 
 
> Работа с переменными в прерывании и основном теле, жутко неудобно выходит
Alexashka
сообщение Oct 3 2015, 19:40
Сообщение #1


Практикующий маг
******

Группа: Свой
Сообщений: 3 634
Регистрация: 28-04-05
Из: Дубна, Моск.обл
Пользователь №: 4 576



Добрый вечер sm.gif
Что имеем: 8 битный проц, программа в прерывании читает из кольцевого буфера, указатель чтения -просто индекс массива, двухбайтное число. В основном теле мне приходит поток байт, который я контролирую (запускаю/останавливаю поток) и размещаю байты в этом же кольцевом буфере по другому указателю -указателю записи (тоже индекс массива). До этих пор все замечательно, но чтобы управлять потоком мне нужно знать сколько байт содержится в буфере, для этого я беру разницу между указателями записи и чтения и побитно умножаю ее на (размер_массива - 1). Эту разницу приходится брать в нескольких местах программы, при этом на время вычисления нужно блокировать прерывание, поскольку операция не атомарная, а одна из переменных модифицируется в прерывании. Если этого не делать происходит глюк, если делать -появляется задержка обработки прерывания, а это нехорошо, т.к в нем происходит формирования аудио сигнала. Да и некрасиво это и неудобно -следить какую перменную обрабатываю, нужно или нет блокировать прерывание, ну и поскольку кольцевой буфер используется в различных прерываниях нужно еще и учитывать какое именно прерывание блокировать biggrin.gif
Может это както по-другому можно делать, подскажите.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Valentine Logino...
сообщение Oct 8 2015, 07:35
Сообщение #2


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

Группа: Участник
Сообщений: 78
Регистрация: 7-04-10
Из: Пушкино
Пользователь №: 56 462



Идея в том, что атомарный флаг делается тоже через критические секции, другое дело, что к нему обращается программа куда реже, чем к индексам буфера, за счет чего снижается количество критических секций.
Go to the top of the page
 
+Quote Post
Alexashka
сообщение Oct 8 2015, 07:58
Сообщение #3


Практикующий маг
******

Группа: Свой
Сообщений: 3 634
Регистрация: 28-04-05
Из: Дубна, Моск.обл
Пользователь №: 4 576



Цитата(Valentine Loginov @ Oct 8 2015, 11:35) *
Идея в том, что атомарный флаг делается тоже через критические секции, другое дело, что к нему обращается программа куда реже, чем к индексам буфера, за счет чего снижается количество критических секций.

Не знаю может это тоже самое, но у меня была была идея такая: в основной программе работаем не с самими индексами буфера, а с их копиями, причем перед обращением к переменным-копиями устанавливаем спец.флаг занятости, потом сбрасываем его. В прерывании текущее значение индекса копируется в переменную-копию в том случае, если флаг занятости не установлен, если же он установлен -копирование не производится (оно произойдет при последующих заходах в прерывание). Есть однако вероятность (хоть и небольшая, но есть) что при каждом заходе в прерывание флаг занятости будет установлен и мы так и не сможем обновить наши копии индексов. Однако в этом случае проблема с атомарностью не возникает, т.е. критические секции вообще не нужны и нет задержки входа в прерывание.
Go to the top of the page
 
+Quote Post
jcxz
сообщение Oct 8 2015, 09:09
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(Alexashka @ Oct 8 2015, 13:58) *
Есть однако вероятность (хоть и небольшая, но есть) что при каждом заходе в прерывание флаг занятости будет установлен и мы так и не сможем обновить наши копии индексов. Однако в этом случае проблема с атомарностью не возникает, т.е. критические секции вообще не нужны и нет задержки входа в прерывание.

Есть вероятность, что Ваше ПО сейчас работает, а через 10 секунд - есть вероятность, что не работает. Сейчас работает, а если добавить ещё строчку в исходник - есть вероятность, что не заработает.
Вероятно наиболее вероятное место такому вероятному ПО - на помойке wink.gif
Go to the top of the page
 
+Quote Post
Alexashka
сообщение Oct 8 2015, 18:17
Сообщение #5


Практикующий маг
******

Группа: Свой
Сообщений: 3 634
Регистрация: 28-04-05
Из: Дубна, Моск.обл
Пользователь №: 4 576



Цитата(jcxz @ Oct 8 2015, 13:09) *
Есть вероятность, что Ваше ПО сейчас работает, а через 10 секунд - есть вероятность, что не работает...

Да это понятно, только объясните чем этот механизм отличается от предложенного с разделением доступа?
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Alexashka   Работа с переменными в прерывании и основном теле   Oct 3 2015, 19:40
- - gerber   Цитата(Alexashka @ Oct 3 2015, 22:40) Мож...   Oct 3 2015, 19:44
|- - Alexashka   Цитата(gerber @ Oct 3 2015, 22:44) Заведи...   Oct 3 2015, 19:49
|- - jcxz   Цитата(Alexashka @ Oct 4 2015, 01:49) неа...   Oct 4 2015, 07:47
|- - _Pasha   Цитата(jcxz @ Oct 4 2015, 10:47) Неужто з...   Oct 4 2015, 11:27
||- - ViKo   Цитата(_Pasha @ Oct 4 2015, 14:27) Кодvol...   Oct 8 2015, 09:31
||- - _Pasha   Цитата(ViKo @ Oct 8 2015, 12:31) Читать и...   Oct 8 2015, 16:55
|- - Alexashka   Цитата(jcxz @ Oct 4 2015, 10:47) Конечно ...   Oct 4 2015, 21:53
|- - jcxz   Цитата(Alexashka @ Oct 5 2015, 03:53) Зап...   Oct 5 2015, 04:12
||- - Alexashka   Цитата(jcxz @ Oct 5 2015, 07:12) ЗАЧЕМ???...   Oct 5 2015, 12:25
|||- - jcxz   Цитата(Alexashka @ Oct 5 2015, 18:25) -пр...   Oct 5 2015, 12:51
|||- - Сергей Борщ   Цитата(Alexashka @ Oct 5 2015, 15:25) сли...   Oct 5 2015, 12:53
|||- - jcxz   Цитата(Alexashka @ Oct 5 2015, 18:25) Пос...   Oct 5 2015, 12:58
|||- - Alexashka   Цитата(jcxz @ Oct 5 2015, 15:58) Там где ...   Oct 6 2015, 07:29
|||- - jcxz   Цитата(Alexashka @ Oct 6 2015, 13:29) Да ...   Oct 6 2015, 08:10
||||- - Alexashka   Цитата(jcxz @ Oct 6 2015, 11:10) просто т...   Oct 6 2015, 08:41
|||- - _Pasha   Цитата(Alexashka @ Oct 6 2015, 10:29) Доб...   Oct 6 2015, 11:51
|||- - Alexashka   Цитата(_Pasha @ Oct 6 2015, 14:51) Ну я к...   Oct 6 2015, 16:36
||- - MrYuran   Цитата(jcxz @ Oct 5 2015, 07:12) Это то ж...   Oct 6 2015, 10:49
||- - jcxz   Цитата(MrYuran @ Oct 6 2015, 16:49) Преим...   Oct 7 2015, 02:41
|- - _Pasha   Цитата(Alexashka @ Oct 5 2015, 00:53) Поя...   Oct 5 2015, 13:36
- - gerber   Значит, можно сделать порог кратным 256 и ограничи...   Oct 3 2015, 20:05
|- - Alexashka   ЦитатаЗначит, можно сделать порог кратным 256 и ог...   Oct 3 2015, 22:28
- - aaarrr   Разделите свой большой буфер на N маленьких и опер...   Oct 3 2015, 20:14
- - smalcom   ЦитатаРазделите свой большой буфер на N маленьких ...   Oct 3 2015, 21:43
- - Valentine Loginov   Вариант с так называемым "nonatomic" по-...   Oct 7 2015, 07:13
|- - zltigo   QUOTE (Valentine Loginov @ Oct 7 2015, 10...   Oct 7 2015, 07:25
||- - jcxz   Цитата(Alexashka @ Oct 9 2015, 00:17) Да ...   Oct 9 2015, 03:18
||- - ASN   Alexashka Так и не понял, почему запрет прерываний...   Oct 9 2015, 06:05
|- - zltigo   QUOTE (Valentine Loginov @ Oct 8 2015, 10...   Oct 8 2015, 09:13
- - Valentine Loginov   Вообще долгая работа с данными в прерывании плохо....   Oct 9 2015, 06:51
|- - Alexashka   Цитата(Valentine Loginov @ Oct 9 2015, 10...   Oct 9 2015, 07:40
|- - zltigo   QUOTE (Alexashka @ Oct 9 2015, 10:40) Я х...   Oct 9 2015, 08:33
|- - Alexashka   Цитата(zltigo @ Oct 9 2015, 12:33) Лучше ...   Oct 9 2015, 13:09
|- - zltigo   QUOTE (Alexashka @ Oct 9 2015, 16:09) А к...   Oct 9 2015, 13:42
- - rudy_b   Цитата(Alexashka @ Oct 3 2015, 22:40) Доб...   Oct 9 2015, 13:19
|- - Alexashka   Цитата(rudy_b @ Oct 9 2015, 17:19) Как-то...   Oct 9 2015, 17:09
- - ViKo   Так зачем "чутка освободится..."? Сделай...   Oct 9 2015, 18:19
|- - rudy_b   Цитата(ViKo @ Oct 9 2015, 21:19) Так заче...   Oct 9 2015, 23:08
||- - Dog Pawlowa   Какие компоненты в систему заложишь, так она и поп...   Oct 10 2015, 03:51
|- - Alexashka   Цитата(ViKo @ Oct 9 2015, 22:19) Так заче...   Oct 10 2015, 11:19
|- - ViKo   Цитата(Alexashka @ Oct 10 2015, 14:19) Эт...   Oct 10 2015, 11:39
||- - Alexashka   Цитата(ViKo @ Oct 10 2015, 15:39) Красиво...   Oct 10 2015, 12:09
||- - Tanya   Цитата(Alexashka @ Oct 10 2015, 15:09) Жа...   Oct 10 2015, 12:19
||- - Alexashka   Цитата(Tanya @ Oct 10 2015, 16:19) Понима...   Oct 10 2015, 15:31
||- - _Pasha   Цитата(Alexashka @ Oct 10 2015, 18:31) Ду...   Oct 10 2015, 18:06
|- - Tanya   Цитата(Alexashka @ Oct 10 2015, 14:19) И ...   Oct 10 2015, 11:47
- - ViKo   Можно и одним буфером обойтись, если разбить его н...   Oct 10 2015, 13:57
- - smalcom   тогда будет ограничение на размер буфера.   Oct 10 2015, 18:56
|- - zltigo   QUOTE (smalcom @ Oct 10 2015, 21:56) тогд...   Oct 10 2015, 19:04
|- - Alexashka   Цитата(zltigo @ Oct 10 2015, 23:04) Вам у...   Oct 11 2015, 20:56
|- - zltigo   QUOTE (Alexashka @ Oct 11 2015, 23:56) Вы...   Oct 11 2015, 21:01
|- - Alexashka   Цитата(zltigo @ Oct 12 2015, 01:01) Если ...   Oct 12 2015, 06:38
- - smalcom   а?   Oct 10 2015, 20:09
- - ViKo   Да, для 8-битников 16 256-байтовых буферов будет л...   Oct 12 2015, 05:45
- - smalcom   для этого используйте 3, 4 и т.д. буферов.   Oct 12 2015, 08:00


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

 


RSS Текстовая версия Сейчас: 24th June 2025 - 20:03
Рейтинг@Mail.ru


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