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

 
 
3 страниц V   1 2 3 >  
Reply to this topicStart new topic
> Передача данных, 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
_Pasha
сообщение Dec 12 2016, 16:56
Сообщение #2


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



если взять двумерный массив?
пишете в одну страницу, читаете из другой
страниц может быть более чем 2
ну и счетчик записей, сквозной.
при вычитывании записей - кол-во вычитанных вычитается, пардон за тавтологию

Сообщение отредактировал _Pasha - Dec 12 2016, 16:58
Go to the top of the page
 
+Quote Post
G.Simenon
сообщение Dec 12 2016, 18:01
Сообщение #3





Группа: Участник
Сообщений: 9
Регистрация: 12-12-16
Пользователь №: 94 601



Цитата(Atlantis- @ Dec 12 2016, 16:43) *
Проблема в том, что библиотечная функция передачи данных по USB требует в качестве параметров адрес начала массива данных и количество данных. ... надо чтобы данные лежали линейно в памяти.

Может, перед вызовом библиотечной функции, копировать данные из кольцевого буфера в линейный?
Go to the top of the page
 
+Quote Post
conan
сообщение Dec 13 2016, 00:59
Сообщение #4


Участник
*

Группа: Участник
Сообщений: 56
Регистрация: 3-11-11
Пользователь №: 68 126



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


Либо сперва скопировать в линейный буфер, и потом отдать в библиотечную функцию, либо вызывать библиотечную функцию 2 раза: первый -- для ранних данных, второй -- для последних (если организация кольц. буфера позволяет). Если все происходит от прерываний, то возникает вопрос повторной входимости функционала кольцевого буфера, который автоматически снимается, если вся работа с ним происходит в состоянии запрета прерываний
Go to the top of the page
 
+Quote Post
uriy
сообщение Dec 13 2016, 04:56
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 2 429
Регистрация: 30-11-05
Из: Ижевск
Пользователь №: 11 606



Два линейных буфера. Один для манипуляций с ним, второй готовый для передачи.
Внутри прерывания USB меняете указатель.
Примерно вот так:
буферы и указатели на них
Код
volatile int16_t *rx_buf;
volatile int16_t *tx_buf;
volatile int16_t *tmp_rx_buf;
volatile int16_t *tmp_tx_buf;

volatile int16_t rx_buf1[RESAMPELING_SCALE*(FRAME+BUFFER_RES)];
volatile int16_t tx_buf1[RESAMPELING_SCALE*(FRAME+BUFFER_RES)];
volatile int16_t rx_buf2[RESAMPELING_SCALE*(FRAME+BUFFER_RES)];
volatile int16_t tx_buf2[RESAMPELING_SCALE*(FRAME+BUFFER_RES)];

Внутри прерывания:
Код
    if (rx_buf == rx_buf1)
    {
        rx_buf = rx_buf2;
        tx_buf = tx_buf2;
        tmp_rx_buf = rx_buf1;
        tmp_tx_buf = tx_buf1;
    }
    else
    {
        rx_buf = rx_buf1;
        tx_buf = tx_buf1;
        tmp_rx_buf = rx_buf2;
        tmp_tx_buf = tx_buf2;
    }
Go to the top of the page
 
+Quote Post
Atlantis-
сообщение Dec 13 2016, 06:48
Сообщение #6


Местный
***

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



Цитата(G.Simenon @ Dec 12 2016, 21:01) *
Может, перед вызовом библиотечной функции, копировать данные из кольцевого буфера в линейный?

я в данный момент так и делаю, но хочется какой то более красивый вариант
Go to the top of the page
 
+Quote Post
Valentine Logino...
сообщение Dec 13 2016, 07:19
Сообщение #7


Частый гость
**

Группа: Участник
Сообщений: 78
Регистрация: 7-04-10
Из: Пушкино
Пользователь №: 56 462



Вам предложили работать с несколькими линейными массивами и оперировать индексами массива.
Более конкретно про различные методики можно почитать у Таненбаума в "Современные операционные системы", раздел 5.3.3 (Программное обеспечение ввода-вывода, не зависящее от конкретных устройств).
Go to the top of the page
 
+Quote Post
Atlantis-
сообщение Dec 13 2016, 08:32
Сообщение #8


Местный
***

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



Цитата(Valentine Loginov @ Dec 13 2016, 10:19) *
Вам предложили работать с несколькими линейными массивами и оперировать индексами массива.

я понял, в один массив писать, из другого читать. только тут есть нюанс, что теоретически (да и практически бывает) функция отправки по USB может не вернуть OK, то есть надо данные отправить в следующий раз. в случае с двумя массивами, как минимум перепутается последовательность сообщений, хотя наверно можно не переключать массивы в случае если данные не были отправлены...

Цитата(Valentine Loginov @ Dec 13 2016, 10:19) *
Более конкретно про различные методики можно почитать у Таненбаума в "Современные операционные системы", раздел 5.3.3 (Программное обеспечение ввода-вывода, не зависящее от конкретных устройств).

Спасибо
Go to the top of the page
 
+Quote Post
Atlantis-
сообщение Dec 13 2016, 13:41
Сообщение #9


Местный
***

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



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


Гуру
******

Группа: Свой
Сообщений: 2 429
Регистрация: 30-11-05
Из: Ижевск
Пользователь №: 11 606



Мютексы.
Либо все-таки писать из одного потока, а в этот поток кидать очереди из других потоков которым нужен доступ к этому буферу.
Go to the top of the page
 
+Quote Post
toweroff
сообщение Dec 14 2016, 07:31
Сообщение #11


Гуру
******

Группа: Свой
Сообщений: 2 957
Регистрация: 19-09-06
Из: Москва
Пользователь №: 20 514



Цитата(uriy @ Dec 14 2016, 07:50) *
Мютексы.

+1
тоже более изящного ничего не придумал
Go to the top of the page
 
+Quote Post
AlexandrY
сообщение Dec 14 2016, 08:14
Сообщение #12


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
Сообщение #13


Гуру
******

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


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
Atlantis-
сообщение Dec 14 2016, 12:40
Сообщение #15


Местный
***

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



Цитата(uriy @ Dec 14 2016, 07:50) *
Мютексы.

Не совсем понял, как их использовать в моем случае?

Сообщение отредактировал Atlantis- - Dec 14 2016, 13:35
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 Текстовая версия Сейчас: 15th August 2025 - 09:36
Рейтинг@Mail.ru


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