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

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


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

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



Так зачем "чутка освободится..."? Сделайте 2 буфера. В один принимаете, из другого кидаете в ШИМ. Когда в том, что в ШИМ, данные закончатся, переключаетесь на тот, в который принимали. Он уже будет весь забит. И т.д. По-моему, это называется "двойная буферизация". А принимайте тоже по прерыванию, только приоритет задайте ниже, чем у таймера выкидывания. И... это, зачем большие буфера? sm.gif sm.gif
Go to the top of the page
 
+Quote Post
rudy_b
сообщение Oct 9 2015, 23:08
Сообщение #3


Знающий
****

Группа: Свой
Сообщений: 888
Регистрация: 25-09-08
Из: Питер
Пользователь №: 40 458



Цитата(ViKo @ Oct 9 2015, 21:19) *
Так зачем "чутка освободится..."? Сделайте 2 буфера. В один принимаете, из другого кидаете в ШИМ...
...А принимайте тоже по прерыванию, только приоритет задайте ниже, чем у таймера выкидывания. И... это, зачем большие буфера? sm.gif sm.gif

Все так, но не нужно два буфера - нужен только один - кольцевой.
И, как и предложено, и принимать и считывать по прерываниям. Если они одного уровня - друг друга прерывать не будут, обычно на 8-ми битках так сделано. Приоритет работает только при одновременном возникновении двух запросов - вот тогда первым будет более приоритетный.
Т.е. при работе с указателями вообще никаких проблем не будет.

Большой размер буфера иногда нужен при работе с писюком для разравнивания данных - он иногда любит отключать задачу чуть не на секунду.

Джиттера все равно не избежать, можно только снизить его до минимума, если сделать прерывание считывания более высокоуровневым (т.е. разрешить ему прерывать прерывание записи).
Тогда есть два варианта. Можно аккуратно работать с указатем записи (кратковременный запрет прерываний) - но это джиттер, хоть и малый.
А можно и без запрета прерываний.
За буфером следит более высокоуровневое прерывание и оно, при приближении к заполнению, ставит (и снимает, с командой продолжения приема или иначе) флаг, который более низкоприоритеное прерывание использует для остановки входного потока.
Указатель чтения оно меняет как ему вздумается (это его параметр), а вот указателей записи - два.
Один из них использует только низкоприоритетное прерывание, а второй - более высокоприоритетное.
Периодически происходит синхронизация этих указателей в старшем прерывании - для определения остатка свободного места в буфере. Тут может возникнуть болтанка и нужен запас свободного места в буфере на максимальное число неудачных попыток синхронизации (ну и плюс запас).
Для синхронизации, младшее прерывание меняет свой указатель поэтапно, каждый раз выставляя и снимая бит валидности в отдельной переменной.
Т.е., перед изменением оно сначала снимает бит валидности, затем меняет указатель, затем ставит бит валидности. Это можно делать и для каждого байта по отдельности.
Старший приоритет синхронизирует свой указатель только если стоит бит валидности.
Это, практически, критическая секция, но специфическая, с пропуском, но без зависания.

Тут могут возникнуть некоторые проблемы с временными накладками, но если держать запас по буферу и блокировать прием (запись) при длительных неудачах синхронизации (буфер перестанет меняться и будет стоять бит валидности), то все разруливается.

Можно использовать и несколько фокусов типа - при неудачной синхронизации инкрементировать указатель приема в старшем прерывании (это снизит болтанку буфера) и т.п.

Заморочно, конечно, но джиттер будет минимален.

Аналогичное взаимодействие можно организовать и между main loop и прерыванием считывания. Тогда будет только одно прерывание и джиттер будет меньше.
Go to the top of the page
 
+Quote Post
Dog Pawlowa
сообщение Oct 10 2015, 03:51
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823



Какие компоненты в систему заложишь, так она и поплывет.

PC + восьмибитник + требование к джиттеру = бульк

Извините за ОФФ.


--------------------
Уходя, оставьте свет...
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
- - 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
|- - 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 Текстовая версия Сейчас: 11th August 2025 - 10:14
Рейтинг@Mail.ru


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