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

 
 
> Передача данных, 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
3 страниц V  < 1 2 3  
Start new topic
Ответов (30 - 34)
Atlantis-
сообщение Dec 16 2016, 14:31
Сообщение #31


Местный
***

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



Цитата(Valentine Loginov @ Dec 16 2016, 11:23) *
Тут вам в помощь счётный семафор. Не обязательно же чтобы на каждый вызов прерывания немедленно запускалась задача обработки, главное чтобы данные не потерялись.

Подозрительно большие числа по временам, особенно на переключение контекста FreeRTOS, это сколько же у вас там задач? Было бы легче, если бы была информация о камне и его тактировании. Те же прерывания нужно оптимизировать грамотными аттрибутами на инлайнинг, оптимизацию и пр.

6 задач, но 5 обычно в ждущем состоянии (ждут сообщений в своих очередях). Может я как то не так меряю, я просто вначале обработчика прерывания выдаю на тестовой ноге единичку, а в конце - ноль. И измеряю осциллографом.
Go to the top of the page
 
+Quote Post
jcxz
сообщение Dec 17 2016, 10:51
Сообщение #32


Гуру
******

Группа: Свой
Сообщений: 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
Сообщение #33


Местный
***

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



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

Например, чтобы поймать в коде ноль и переключить в этот момент громкость.
Чтобы в нужный момент (нужный USB фрейм и смещение в отсчетах ЦАП) запустить выдачу массива данных
Иногда чтобы посчитать фильтрованные значения
Go to the top of the page
 
+Quote Post
AlexandrY
сообщение Dec 26 2016, 09:39
Сообщение #34


Ally
******

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



Цитата(Atlantis- @ Dec 26 2016, 09:18) *
Например, чтобы поймать в коде ноль и переключить в этот момент громкость.
Чтобы в нужный момент (нужный USB фрейм и смещение в отсчетах ЦАП) запустить выдачу массива данных
Иногда чтобы посчитать фильтрованные значения


Долго думали, однако. biggrin.gif
Смысл переключать громкость так оперативно? Это уже модуляция получается.

Ну и остально все надуманно. Все это прекрасно делается на буферах.
Go to the top of the page
 
+Quote Post
Atlantis-
сообщение Dec 26 2016, 11:16
Сообщение #35


Местный
***

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



Цитата(AlexandrY @ Dec 26 2016, 12:39) *
Смысл переключать громкость так оперативно? Это уже модуляция получается.

а чего ждать? паузы? можно долго ждать, памяти много, секунд на 20

Цитата(AlexandrY @ Dec 26 2016, 12:39) *
Ну и остально все надуманно. Все это прекрасно делается на буферах.

может быть, я не думал над этим вариантом
Go to the top of the page
 
+Quote Post

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

 


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


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