|
Передача данных, fifo, кольцевой буфер и т.д. |
|
|
|
Dec 12 2016, 15:43
|
Местный
  
Группа: Участник
Сообщений: 491
Регистрация: 18-05-11
Пользователь №: 65 102

|
Добрый день! Мне нужен некий буфер для обмена данными между прерываниями (в одном пишу в буфер, в другом читаю, передаю дальше) с условием, что при чтении данные должны лежать в памяти линейно. Суть в том, что сейчас я пишу в кольцевой буфер данные в прерывании I2S, потом в прерывании USB SOF смотрю есть ли данные, если есть - отправляю. Проблема в том, что библиотечная функция передачи данных по USB требует в качестве параметров адрес начала массива данных и количество данных. А буфер то у меня кольцевой! Подскажите, какие есть еще способы передачи данных? Я всегда кольцевым буфером пользовался, а тут надо чтобы данные лежали линейно в памяти.
|
|
|
|
|
 |
Ответов
|
Dec 14 2016, 22:44
|

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

|
Цитата(Atlantis- @ Dec 12 2016, 17:43)  Мне нужен некий буфер для обмена данными между прерываниями (в одном пишу в буфер, в другом читаю, передаю дальше) с условием, что при чтении данные должны лежать в памяти линейно. Элементарно. Организовать кольцевой буфер не из байтов, а из блоков данных типового размера.Если блоки данных произвольного размера, то добавить дополнительный указатель позволяющий помечать и соответственно пропускать в конце блока памяти выделенного под кольцевой буфер блок, размер которого недостаточен для размещения полученного блока данных.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Dec 15 2016, 07:35
|
Местный
  
Группа: Участник
Сообщений: 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
|
|
|
|
|
Dec 15 2016, 13:08
|

Гуру
     
Группа: Свой
Сообщений: 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
|
|
|
|
Сообщений в этой теме
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
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|