|
Работа с переменными в прерывании и основном теле, жутко неудобно выходит |
|
|
|
Oct 3 2015, 19:40
|

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

|
Добрый вечер Что имеем: 8 битный проц, программа в прерывании читает из кольцевого буфера, указатель чтения -просто индекс массива, двухбайтное число. В основном теле мне приходит поток байт, который я контролирую (запускаю/останавливаю поток) и размещаю байты в этом же кольцевом буфере по другому указателю -указателю записи (тоже индекс массива). До этих пор все замечательно, но чтобы управлять потоком мне нужно знать сколько байт содержится в буфере, для этого я беру разницу между указателями записи и чтения и побитно умножаю ее на (размер_массива - 1). Эту разницу приходится брать в нескольких местах программы, при этом на время вычисления нужно блокировать прерывание, поскольку операция не атомарная, а одна из переменных модифицируется в прерывании. Если этого не делать происходит глюк, если делать -появляется задержка обработки прерывания, а это нехорошо, т.к в нем происходит формирования аудио сигнала. Да и некрасиво это и неудобно -следить какую перменную обрабатываю, нужно или нет блокировать прерывание, ну и поскольку кольцевой буфер используется в различных прерываниях нужно еще и учитывать какое именно прерывание блокировать Может это както по-другому можно делать, подскажите.
|
|
|
|
|
 |
Ответов
|
Oct 8 2015, 07:58
|

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

|
Цитата(Valentine Loginov @ Oct 8 2015, 11:35)  Идея в том, что атомарный флаг делается тоже через критические секции, другое дело, что к нему обращается программа куда реже, чем к индексам буфера, за счет чего снижается количество критических секций. Не знаю может это тоже самое, но у меня была была идея такая: в основной программе работаем не с самими индексами буфера, а с их копиями, причем перед обращением к переменным-копиями устанавливаем спец.флаг занятости, потом сбрасываем его. В прерывании текущее значение индекса копируется в переменную-копию в том случае, если флаг занятости не установлен, если же он установлен -копирование не производится (оно произойдет при последующих заходах в прерывание). Есть однако вероятность (хоть и небольшая, но есть) что при каждом заходе в прерывание флаг занятости будет установлен и мы так и не сможем обновить наши копии индексов. Однако в этом случае проблема с атомарностью не возникает, т.е. критические секции вообще не нужны и нет задержки входа в прерывание.
|
|
|
|
Сообщений в этой теме
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
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|