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

 
 
> Передача данных, fifo, кольцевой буфер и т.д.
Atlantis-
сообщение Dec 12 2016, 15:43
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 491
Регистрация: 18-05-11
Пользователь №: 65 102



Добрый день!
Мне нужен некий буфер для обмена данными между прерываниями (в одном пишу в буфер, в другом читаю, передаю дальше) с условием, что при чтении данные должны лежать в памяти линейно.
Суть в том, что сейчас я пишу в кольцевой буфер данные в прерывании I2S, потом в прерывании USB SOF смотрю есть ли данные, если есть - отправляю. Проблема в том, что библиотечная функция передачи данных по USB требует в качестве параметров адрес начала массива данных и количество данных. А буфер то у меня кольцевой! Подскажите, какие есть еще способы передачи данных? Я всегда кольцевым буфером пользовался, а тут надо чтобы данные лежали линейно в памяти.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
zltigo
сообщение Dec 14 2016, 22:44
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(Atlantis- @ Dec 12 2016, 17:43) *
Мне нужен некий буфер для обмена данными между прерываниями (в одном пишу в буфер, в другом читаю, передаю дальше) с условием, что при чтении данные должны лежать в памяти линейно.

Элементарно. Организовать кольцевой буфер не из байтов, а из блоков данных типового размера.Если блоки данных произвольного размера, то добавить дополнительный указатель позволяющий помечать и соответственно пропускать в конце блока памяти выделенного под кольцевой буфер блок, размер которого недостаточен для размещения полученного блока данных.



--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Atlantis-
сообщение Dec 15 2016, 07:35
Сообщение #3


Местный
***

Группа: Участник
Сообщений: 491
Регистрация: 18-05-11
Пользователь №: 65 102



Цитата(zltigo @ Dec 15 2016, 01:44) *
Элементарно. Организовать кольцевой буфер не из байтов, а из блоков данных типового размера.

Эмм...и что будет? У меня сейчас кольцевой буфер 64 байта, а блоки данных 8 байт. Это не мешает одному блоку данных находиться в конце буфера, а второму - в начале.
Цитата(Сергей Борщ @ Dec 15 2016, 09:46) *
Простите, а что мешает при переходе через конец буфера первой посылкой отправлять данные от текущего положения до конца буфера, а по следующему запросу отдавать уже от начала буфера? Я так в УАСПП через ПДП отправляю и VCP у меня так же работает.

Я сначала отмел этот вариант потому что скорость передачи данных по Interrupt каналу и так всего 64 байта за 1 мс. Потом прикинул, вроде должно хватать, получается это более выгодный вариант, чем копировать в линейный буфер.
Но меня сейчас больше волнует, как писать в кольцевой буфер из основного потока и из прерывания одновременно.
Цитата(toweroff @ Dec 14 2016, 21:19) *
то есть как?
функция, которая пишет в буфер, все используют только ее

в начале ждем мютекс, в конце отпускаем

если функция вызывается и мютекс занят (кто-то уже вызвал функцию), ОС будет держать вызывающую функцию в ожидании, пока мютекс не освободится (ранее вызвавший функцию записи в буфер закончил работу)

Это подразумевает, что пишущий поток должен отложить свою работу на потом. У меня предполагается, что в кольцевой буфер будут писаться сообщения из прерывания I2S о начале/конце выдаваемого блока данных и сообщения из основного потока о нажатии кнопок.
То есть очень вероятен вариант, что я буду писать сообщение в буфер из основного потока, в этот момент вылетит прерывание и данные смешаются. Тут я вроде бы должен заблокировать запись в буфер из прерывания, но когда прерывание снова сработает снова - мне надо будет посылать еще одно сообщение (первое - о конце одного блока данных, второе - о начале другого блока). То есть получается надо внутри прерывания I2S буферизировать сообщения...

Сообщение отредактировал Atlantis- - Dec 15 2016, 07:57
Go to the top of the page
 
+Quote Post
zltigo
сообщение Dec 15 2016, 13:08
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(Atlantis- @ Dec 15 2016, 09:35) *
Эмм...и что будет? У меня сейчас кольцевой буфер 64 байта, а блоки данных 8 байт. Это не мешает одному блоку данных находиться в конце буфера, а второму - в начале.

Не понял о чем Вы написали, и в чем тогда проблема, но 8 байтовые блоки укладываются в 64 байта без перехода за границу блока. Если хотите оперировать (например передавать) большими блоками, то тогда и буфер должен состоять из блоков такого размера


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Atlantis-   Передача данных   Dec 12 2016, 15:43
- - _Pasha   если взять двумерный массив? пишете в одну страниц...   Dec 12 2016, 16:56
- - G.Simenon   Цитата(Atlantis- @ Dec 12 2016, 16:4...   Dec 12 2016, 18:01
|- - Atlantis-   Цитата(G.Simenon @ Dec 12 2016, 21:01) Мо...   Dec 13 2016, 06:48
- - conan   Цитата(Atlantis- @ Dec 12 2016, 18:4...   Dec 13 2016, 00:59
- - uriy   Два линейных буфера. Один для манипуляций с ним, в...   Dec 13 2016, 04:56
- - Valentine Loginov   Вам предложили работать с несколькими линейными ма...   Dec 13 2016, 07:19
|- - Atlantis-   Цитата(Valentine Loginov @ Dec 13 2016, 10...   Dec 13 2016, 08:32
- - Atlantis-   Столкнулся с такой проблемой: как организовать буф...   Dec 13 2016, 13:41
|- - AlexandrY   Цитата(Atlantis- @ Dec 13 2016, 15:4...   Dec 14 2016, 08:14
|- - jcxz   Цитата(AlexandrY @ Dec 14 2016, 11:14) С ...   Dec 14 2016, 08:36
|- - AlexandrY   Цитата(jcxz @ Dec 14 2016, 10:36) Это ест...   Dec 14 2016, 08:47
|- - jcxz   Цитата(AlexandrY @ Dec 14 2016, 11:47) Вы...   Dec 17 2016, 10:51
|- - Atlantis-   Цитата(jcxz @ Dec 17 2016, 13:51) Соверше...   Dec 26 2016, 07:18
|- - AlexandrY   Цитата(Atlantis- @ Dec 26 2016, 09:1...   Dec 26 2016, 09:39
|- - Atlantis-   Цитата(AlexandrY @ Dec 26 2016, 12:39) См...   Dec 26 2016, 11:16
- - uriy   Мютексы. Либо все-таки писать из одного потока, а ...   Dec 14 2016, 04:50
|- - toweroff   Цитата(uriy @ Dec 14 2016, 07:50) Мютексы...   Dec 14 2016, 07:31
|- - Atlantis-   Цитата(uriy @ Dec 14 2016, 07:50) Мютексы...   Dec 14 2016, 12:40
|- - toweroff   Цитата(Atlantis- @ Dec 14 2016, 15:4...   Dec 14 2016, 18:19
|- - Valentine Loginov   Цитата(Atlantis- @ Dec 15 2016, 10:3...   Dec 15 2016, 08:28
||- - Atlantis-   Цитата(Valentine Loginov @ Dec 15 2016, 11...   Dec 15 2016, 11:52
||- - AlexandrY   Цитата(Atlantis- @ Dec 15 2016, 13:5...   Dec 15 2016, 13:24
|||- - Atlantis-   Цитата(AlexandrY @ Dec 15 2016, 16:24) Вы...   Dec 15 2016, 14:03
|||- - zltigo   Цитата(Atlantis- @ Dec 15 2016, 16:0...   Dec 16 2016, 08:45
|||- - AlexandrY   Цитата(Atlantis- @ Dec 15 2016, 16:0...   Dec 16 2016, 09:58
||- - Valentine Loginov   Цитата(Atlantis- @ Dec 15 2016, 14:5...   Dec 16 2016, 08:23
||- - Atlantis-   Цитата(Valentine Loginov @ Dec 16 2016, 11...   Dec 16 2016, 14:31
|- - Atlantis-   Цитата(zltigo @ Dec 15 2016, 16:08) Не по...   Dec 15 2016, 13:26
|- - zltigo   Цитата(Atlantis- @ Dec 15 2016, 15:2...   Dec 15 2016, 13:30
- - Сергей Борщ   Простите, а что мешает при переходе через конец бу...   Dec 15 2016, 06:46
- - toweroff   можно вообще сделать кольцо из структур uint8_t* p...   Dec 16 2016, 09:45


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

 


RSS Текстовая версия Сейчас: 13th August 2025 - 19:17
Рейтинг@Mail.ru


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