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

 
 
> Передача данных, 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
Ответов
Atlantis-
сообщение Dec 13 2016, 13:41
Сообщение #2


Местный
***

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



Столкнулся с такой проблемой: как организовать буфер, чтобы можно было писать в него из нескольких источников?
Go to the top of the page
 
+Quote Post
AlexandrY
сообщение Dec 14 2016, 08:14
Сообщение #3


Ally
******

Группа: Модераторы
Сообщений: 6 232
Регистрация: 19-01-05
Пользователь №: 2 050



Цитата(Atlantis- @ Dec 13 2016, 15:41) *
Столкнулся с такой проблемой: как организовать буфер, чтобы можно было писать в него из нескольких источников?


Есть такая штука у Kinetis называется linked DMA . Не путать со scatter/gather DMA.
С помощью linked DMA можно легко с одного сигнала-триггера собрать в одно место данные от нескольких источников.
Go to the top of the page
 
+Quote Post
jcxz
сообщение Dec 14 2016, 08:36
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(AlexandrY @ Dec 14 2016, 11:14) *
С помощью linked DMA можно легко с одного сигнала-триггера собрать в одно место данные от нескольких источников.

Это есть почти во всех МК.... кроме STM32. А большинство народу тут сидят именно на ём. laughing.gif
Правда, например в LPC17, такой режим не поддерживает возможности синхронизации от разных источников.
А в Kinetis это возможно?
Go to the top of the page
 
+Quote Post
AlexandrY
сообщение Dec 14 2016, 08:47
Сообщение #5


Ally
******

Группа: Модераторы
Сообщений: 6 232
Регистрация: 19-01-05
Пользователь №: 2 050



Цитата(jcxz @ Dec 14 2016, 10:36) *
Это есть почти во всех МК.... кроме STM32. А большинство народу тут сидят именно на ём. laughing.gif
Правда, например в LPC17, такой режим не поддерживает возможности синхронизации от разных источников.
А в Kinetis это возможно?


Вы наверно перепутали с Linked List DMA или Linked DMA как в Gecko.
Нет, в Kinetis это нечто иное. Смотрите мануал.
Go to the top of the page
 
+Quote Post
jcxz
сообщение Dec 17 2016, 10:51
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(AlexandrY @ Dec 14 2016, 11:47) *
Вы наверно перепутали с Linked List DMA или Linked DMA как в Gecko.
Нет, в Kinetis это нечто иное. Смотрите мануал.

Я имел в виду именно "Linked List" - свЯзные списки. В LPC. В Tiva тоже подобный есть.
С EFM32 не имею опыта.

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

Я так тоже делаю. Но тут надо умнее рассчитывать размер очередной передачи. Чтобы не оказалось, что в очередной передаче нужно передать всего один байт. sm.gif

Цитата(Valentine Loginov @ Dec 15 2016, 11:28) *
Запрещать прерывание во время работы с буфером из основного приложения. Но это некрасиво.

Если хочется, то можно и без запрета прерываний.
Как тут уже предложил zltigo: иметь кольцевой буфер не в виде просто массива байт, а в виде массива указателей на блоки с массивами байт.
Функция, которая хочет записать данные в такой буфер, из некоего пула свободных блоков получает блок, записывает свои данные туда, формирует заголовок блока и помещает этот блок в кольцевую очередь при помощи LDREX/STREX.
Я обычно так строю очереди для межпоточных передач данных под виндой. Без семафоров и критических секций, на семействе функций InterlockedExchange...().

Цитата(AlexandrY @ Dec 15 2016, 16:24) *
Выглядит не очень разумно каждый сэмпл на I2S делать прерывание.
Но даже так, 3 мкс на прерывание в котором только пересылка это подозрительно много. Может прерывание RTOS используете?

К гадалке не ходи - на каждое прерывание дёргает отправку сообщений какому-то объекту синхронизации ОС .
Совершенно безграмотная организация работы! На пустом месте тратится огромная часть времени процессора.
Какой смысл дёргать ОС так часто???
Go to the top of the page
 
+Quote Post
Atlantis-
сообщение Dec 26 2016, 07:18
Сообщение #7


Местный
***

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



Цитата(jcxz @ Dec 17 2016, 13:51) *
Совершенно безграмотная организация работы! На пустом месте тратится огромная часть времени процессора.
Какой смысл дёргать ОС так часто???

Например, чтобы поймать в коде ноль и переключить в этот момент громкость.
Чтобы в нужный момент (нужный USB фрейм и смещение в отсчетах ЦАП) запустить выдачу массива данных
Иногда чтобы посчитать фильтрованные значения
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
|- - 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
- - zltigo   Цитата(Atlantis- @ Dec 12 2016, 17:4...   Dec 14 2016, 22:44
|- - Atlantis-   Цитата(zltigo @ Dec 15 2016, 01:44) Элеме...   Dec 15 2016, 07:35
|- - 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
|- - 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


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

 


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


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