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

 
 
> Работа с переменными в прерывании и основном теле, жутко неудобно выходит
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
Ответов
gerber
сообщение Oct 3 2015, 19:44
Сообщение #2


Знающий
****

Группа: Участник
Сообщений: 750
Регистрация: 1-11-11
Пользователь №: 68 088



Цитата(Alexashka @ Oct 3 2015, 22:40) *
Может это както по-другому можно делать, подскажите.

Заведите переменную "количество байт в буфере" и обновляйте её вместе с изменением указателей чтения и записи.


--------------------
"... часами я мог наблюдать, как люди работают." (М. Горький)
Go to the top of the page
 
+Quote Post
Alexashka
сообщение Oct 3 2015, 19:49
Сообщение #3


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

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



Цитата(gerber @ Oct 3 2015, 22:44) *
Заведите переменную "количество байт в буфере" и обновляйте её вместе с изменением указателей чтения и записи.

неа, смотрите, эта переменная тоже двухбайтная выходит. Допустим если байт в буфере больше 2000 нужно остановить поток, для этого я сравниваю ее с числом 2000, при этом сначала сравнивается младшие байты, потом старшие, если между этими операциями произойдет вызов подпрограммы, которая изменит старший байт "количество байт в буфере", то в результате сравнения можно получить очень неверный результат.
Go to the top of the page
 
+Quote Post
jcxz
сообщение Oct 4 2015, 07:47
Сообщение #4


Гуру
******

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



Цитата(Alexashka @ Oct 4 2015, 01:49) *
неа, смотрите, эта переменная тоже двухбайтная выходит. Допустим если байт в буфере больше 2000 нужно остановить поток, для этого я сравниваю ее с числом 2000, при этом сначала сравнивается младшие байты, потом старшие, если между этими операциями произойдет вызов подпрограммы, которая изменит старший байт "количество байт в буфере", то в результате сравнения можно получить очень неверный результат.

Конечно не нужно никаких "количеств байт". Достаточно двух указателей (чтения/записи). И достаточно операции чтения/записи этих указателей сделать атомарными. И для вычисления кол-ва байт достаточно найти разность указателей (с учётом их цикличности), не нужно никаких "побитных умножений".
Неужто запрет прерывания на пару команд так влияет на выполнение алгоритма??? Тогда у Вас вероятно неправильно построен алгоритм.
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Oct 4 2015, 11:27
Сообщение #5


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Цитата(jcxz @ Oct 4 2015, 10:47) *
Неужто запрет прерывания на пару команд так влияет на выполнение алгоритма??? Тогда у Вас вероятно неправильно построен алгоритм.

можно проверку делать с учетом неатомарности, поскольку указатели в данном случае readonly
100500 раз об этом говорили, но давно, лет 6-7 назад. Пора обновлять rolleyes.gif
например.
Код
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
Go to the top of the page
 
+Quote Post
ViKo
сообщение Oct 8 2015, 09:31
Сообщение #6


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Цитата(_Pasha @ Oct 4 2015, 14:27) *
Код
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, наверное

Читать и сравнивать целиком 2-байтовый указатель - неоптимально. Можно прочитать старший байт, затем младший, затем снова старший, и если он не изменился, значит, 2-байтовое число верное.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Alexashka   Работа с переменными в прерывании и основном теле   Oct 3 2015, 19:40
||- - _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
- - 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


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

 


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


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