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

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

|
Добрый вечер Что имеем: 8 битный проц, программа в прерывании читает из кольцевого буфера, указатель чтения -просто индекс массива, двухбайтное число. В основном теле мне приходит поток байт, который я контролирую (запускаю/останавливаю поток) и размещаю байты в этом же кольцевом буфере по другому указателю -указателю записи (тоже индекс массива). До этих пор все замечательно, но чтобы управлять потоком мне нужно знать сколько байт содержится в буфере, для этого я беру разницу между указателями записи и чтения и побитно умножаю ее на (размер_массива - 1). Эту разницу приходится брать в нескольких местах программы, при этом на время вычисления нужно блокировать прерывание, поскольку операция не атомарная, а одна из переменных модифицируется в прерывании. Если этого не делать происходит глюк, если делать -появляется задержка обработки прерывания, а это нехорошо, т.к в нем происходит формирования аудио сигнала. Да и некрасиво это и неудобно -следить какую перменную обрабатываю, нужно или нет блокировать прерывание, ну и поскольку кольцевой буфер используется в различных прерываниях нужно еще и учитывать какое именно прерывание блокировать Может это както по-другому можно делать, подскажите.
|
|
|
|
|
 |
Ответов
|
Oct 3 2015, 19:44
|
Знающий
   
Группа: Участник
Сообщений: 750
Регистрация: 1-11-11
Пользователь №: 68 088

|
Цитата(Alexashka @ Oct 3 2015, 22:40)  Может это както по-другому можно делать, подскажите. Заведите переменную "количество байт в буфере" и обновляйте её вместе с изменением указателей чтения и записи.
--------------------
"... часами я мог наблюдать, как люди работают." (М. Горький)
|
|
|
|
|
Oct 3 2015, 19:49
|

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

|
Цитата(gerber @ Oct 3 2015, 22:44)  Заведите переменную "количество байт в буфере" и обновляйте её вместе с изменением указателей чтения и записи. неа, смотрите, эта переменная тоже двухбайтная выходит. Допустим если байт в буфере больше 2000 нужно остановить поток, для этого я сравниваю ее с числом 2000, при этом сначала сравнивается младшие байты, потом старшие, если между этими операциями произойдет вызов подпрограммы, которая изменит старший байт "количество байт в буфере", то в результате сравнения можно получить очень неверный результат.
|
|
|
|
|
Oct 4 2015, 07:47
|
Гуру
     
Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713

|
Цитата(Alexashka @ Oct 4 2015, 01:49)  неа, смотрите, эта переменная тоже двухбайтная выходит. Допустим если байт в буфере больше 2000 нужно остановить поток, для этого я сравниваю ее с числом 2000, при этом сначала сравнивается младшие байты, потом старшие, если между этими операциями произойдет вызов подпрограммы, которая изменит старший байт "количество байт в буфере", то в результате сравнения можно получить очень неверный результат. Конечно не нужно никаких "количеств байт". Достаточно двух указателей (чтения/записи). И достаточно операции чтения/записи этих указателей сделать атомарными. И для вычисления кол-ва байт достаточно найти разность указателей (с учётом их цикличности), не нужно никаких "побитных умножений". Неужто запрет прерывания на пару команд так влияет на выполнение алгоритма??? Тогда у Вас вероятно неправильно построен алгоритм.
|
|
|
|
|
Oct 4 2015, 11:27
|
;
     
Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509

|
Цитата(jcxz @ Oct 4 2015, 10:47)  Неужто запрет прерывания на пару команд так влияет на выполнение алгоритма??? Тогда у Вас вероятно неправильно построен алгоритм. можно проверку делать с учетом неатомарности, поскольку указатели в данном случае readonly 100500 раз об этом говорили, но давно, лет 6-7 назад. Пора обновлять например. Код volatile char *r_pos, w_pos; char * nonatomic_ptr(char ** dsc) { char * res = *dsc; while(res != *dsc) res = *dsc; return res; }
char *p = nonatomic_ptr(&r_pos); если оптимизатор выкидывает - dsc должен быть volatile, наверное
Сообщение отредактировал _Pasha - Oct 4 2015, 11:28
|
|
|
|
Сообщений в этой теме
Alexashka Работа с переменными в прерывании и основном теле Oct 3 2015, 19:40   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 Valentine Loginov Идея в том, что атомарный флаг делается тоже через... Oct 8 2015, 07:35 Alexashka Цитата(Valentine Loginov @ Oct 8 2015, 11... Oct 8 2015, 07:58  jcxz Цитата(Alexashka @ Oct 8 2015, 13:58) Ест... Oct 8 2015, 09:09   Alexashka Цитата(jcxz @ Oct 8 2015, 13:09) Есть вер... Oct 8 2015, 18:17    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
|
|
|