|
Передача данных, 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, 08:28
|
Частый гость
 
Группа: Участник
Сообщений: 78
Регистрация: 7-04-10
Из: Пушкино
Пользователь №: 56 462

|
Цитата(Atlantis- @ Dec 15 2016, 10:35)  как писать в кольцевой буфер из основного потока и из прерывания одновременно. Запрещать прерывание во время работы с буфером из основного приложения. Но это некрасиво. Цитата(Atlantis- @ Dec 15 2016, 10:35)  То есть получается надо внутри прерывания I2S буферизировать сообщения... Разделите свой драйвер I2S на две части: обработчик прерывания и фоновый обработчик на уровне приложения. Фоновый обработчик драйвера I2S будет через небольшой буфер получать данные из обработчика прерывания, а затем формировать и передавать сообщения в вашу общую очередь, доступ к которой вы осуществляете мьютексом. Это позволит вам не блокировать прерывания (не терять данные) и разграничить доступ. Однако следует корректно рассчитать размеры буферов и очередей, а также времена блокировки обработчиков во время обращения за доступом к мьютексу.
|
|
|
|
|
Dec 15 2016, 11:52
|
Местный
  
Группа: Участник
Сообщений: 491
Регистрация: 18-05-11
Пользователь №: 65 102

|
Цитата(Valentine Loginov @ Dec 15 2016, 11:28)  Запрещать прерывание во время работы с буфером из основного приложения. Но это некрасиво. Джиттер будет если надолго запрещать Цитата(Valentine Loginov @ Dec 15 2016, 11:28)  Разделите свой драйвер I2S на две части: обработчик прерывания и фоновый обработчик на уровне приложения. Фоновый обработчик драйвера I2S будет через небольшой буфер получать данные из обработчика прерывания, а затем формировать и передавать сообщения в вашу общую очередь, доступ к которой вы осуществляете мьютексом. Это позволит вам не блокировать прерывания (не терять данные) и разграничить доступ. Однако следует корректно рассчитать размеры буферов и очередей, а также времена блокировки обработчиков во время обращения за доступом к мьютексу. Я хотел так сначала разделить - чтобы прерывание I2S только отправляло данные и обрабатывало флаги, а расчет следующих данных для отправки и всего остального вести в специальной задаче, которую вызывать из прерывания I2S. Но I2S у меня работает на частоте 48 кГц, то есть период 21 мкс, прерывание I2S обрабатывается у меня за 3 мкс, а вызов задачи FreeRTOS занимает 4 мкс! Поэтому я решил все эти дела делать в прерывании, даже для сообщений кольцевой буфер сделал, хотя мог просто очередь создать и писать в нее хоть из прерываний, хоть из основного потока одновременно. Но писать в очередь в прерывании I2S это плюс 4 мкс к времени его обработки, то есть в сумме 7 мкс, а это уже треть от 21...в общем показалось мне многовато, поэтому и пытаюсь что то изобрести.
|
|
|
|
Сообщений в этой теме
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     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  zltigo Цитата(Atlantis- @ Dec 15 2016, 09:3... Dec 15 2016, 13:08   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
|
|
|