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

|
Цитата(Atlantis- @ Dec 15 2016, 14:52)  Я хотел так сначала разделить - чтобы прерывание I2S только отправляло данные и обрабатывало флаги, а расчет следующих данных для отправки и всего остального вести в специальной задаче, которую вызывать из прерывания I2S. Но I2S у меня работает на частоте 48 кГц, то есть период 21 мкс, прерывание I2S обрабатывается у меня за 3 мкс, а вызов задачи FreeRTOS занимает 4 мкс! Поэтому я решил все эти дела делать в прерывании, даже для сообщений кольцевой буфер сделал, хотя мог просто очередь создать и писать в нее хоть из прерываний, хоть из основного потока одновременно. Но писать в очередь в прерывании I2S это плюс 4 мкс к времени его обработки, то есть в сумме 7 мкс, а это уже треть от 21...в общем показалось мне многовато, поэтому и пытаюсь что то изобрести. Тут вам в помощь счётный семафор. Не обязательно же чтобы на каждый вызов прерывания немедленно запускалась задача обработки, главное чтобы данные не потерялись. Подозрительно большие числа по временам, особенно на переключение контекста FreeRTOS, это сколько же у вас там задач? Было бы легче, если бы была информация о камне и его тактировании. Те же прерывания нужно оптимизировать грамотными аттрибутами на инлайнинг, оптимизацию и пр.
|
|
|
|
|
Dec 16 2016, 14:31
|
Местный
  
Группа: Участник
Сообщений: 491
Регистрация: 18-05-11
Пользователь №: 65 102

|
Цитата(Valentine Loginov @ Dec 16 2016, 11:23)  Тут вам в помощь счётный семафор. Не обязательно же чтобы на каждый вызов прерывания немедленно запускалась задача обработки, главное чтобы данные не потерялись.
Подозрительно большие числа по временам, особенно на переключение контекста FreeRTOS, это сколько же у вас там задач? Было бы легче, если бы была информация о камне и его тактировании. Те же прерывания нужно оптимизировать грамотными аттрибутами на инлайнинг, оптимизацию и пр. 6 задач, но 5 обычно в ждущем состоянии (ждут сообщений в своих очередях). Может я как то не так меряю, я просто вначале обработчика прерывания выдаю на тестовой ноге единичку, а в конце - ноль. И измеряю осциллографом.
|
|
|
|
Сообщений в этой теме
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    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  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
|
|
|