Jump to content

    
Sign in to follow this  
Dima1060

Передача данных

Recommended Posts

Добрый день!

Мне нужен некий буфер для обмена данными между прерываниями (в одном пишу в буфер, в другом читаю, передаю дальше) с условием, что при чтении данные должны лежать в памяти линейно.

Суть в том, что сейчас я пишу в кольцевой буфер данные в прерывании I2S, потом в прерывании USB SOF смотрю есть ли данные, если есть - отправляю. Проблема в том, что библиотечная функция передачи данных по USB требует в качестве параметров адрес начала массива данных и количество данных. А буфер то у меня кольцевой! Подскажите, какие есть еще способы передачи данных? Я всегда кольцевым буфером пользовался, а тут надо чтобы данные лежали линейно в памяти.

Share this post


Link to post
Share on other sites

если взять двумерный массив?

пишете в одну страницу, читаете из другой

страниц может быть более чем 2

ну и счетчик записей, сквозной.

при вычитывании записей - кол-во вычитанных вычитается, пардон за тавтологию

Edited by _Pasha

Share this post


Link to post
Share on other sites
Проблема в том, что библиотечная функция передачи данных по USB требует в качестве параметров адрес начала массива данных и количество данных. ... надо чтобы данные лежали линейно в памяти.

Может, перед вызовом библиотечной функции, копировать данные из кольцевого буфера в линейный?

 

Share this post


Link to post
Share on other sites
Добрый день!

Мне нужен некий буфер для обмена данными между прерываниями (в одном пишу в буфер, в другом читаю, передаю дальше) с условием, что при чтении данные должны лежать в памяти линейно.

Суть в том, что сейчас я пишу в кольцевой буфер данные в прерывании I2S, потом в прерывании USB SOF смотрю есть ли данные, если есть - отправляю. Проблема в том, что библиотечная функция передачи данных по USB требует в качестве параметров адрес начала массива данных и количество данных. А буфер то у меня кольцевой! Подскажите, какие есть еще способы передачи данных? Я всегда кольцевым буфером пользовался, а тут надо чтобы данные лежали линейно в памяти.

 

Либо сперва скопировать в линейный буфер, и потом отдать в библиотечную функцию, либо вызывать библиотечную функцию 2 раза: первый -- для ранних данных, второй -- для последних (если организация кольц. буфера позволяет). Если все происходит от прерываний, то возникает вопрос повторной входимости функционала кольцевого буфера, который автоматически снимается, если вся работа с ним происходит в состоянии запрета прерываний

 

Share this post


Link to post
Share on other sites

Два линейных буфера. Один для манипуляций с ним, второй готовый для передачи.

Внутри прерывания 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;
    }

Share this post


Link to post
Share on other sites
Может, перед вызовом библиотечной функции, копировать данные из кольцевого буфера в линейный?

я в данный момент так и делаю, но хочется какой то более красивый вариант

Share this post


Link to post
Share on other sites

Вам предложили работать с несколькими линейными массивами и оперировать индексами массива.

Более конкретно про различные методики можно почитать у Таненбаума в "Современные операционные системы", раздел 5.3.3 (Программное обеспечение ввода-вывода, не зависящее от конкретных устройств).

Share this post


Link to post
Share on other sites
Вам предложили работать с несколькими линейными массивами и оперировать индексами массива.

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

 

Более конкретно про различные методики можно почитать у Таненбаума в "Современные операционные системы", раздел 5.3.3 (Программное обеспечение ввода-вывода, не зависящее от конкретных устройств).

Спасибо

Share this post


Link to post
Share on other sites
Столкнулся с такой проблемой: как организовать буфер, чтобы можно было писать в него из нескольких источников?

 

Есть такая штука у Kinetis называется linked DMA . Не путать со scatter/gather DMA.

С помощью linked DMA можно легко с одного сигнала-триггера собрать в одно место данные от нескольких источников.

Share this post


Link to post
Share on other sites
С помощью linked DMA можно легко с одного сигнала-триггера собрать в одно место данные от нескольких источников.

Это есть почти во всех МК.... кроме STM32. А большинство народу тут сидят именно на ём. :laughing:

Правда, например в LPC17, такой режим не поддерживает возможности синхронизации от разных источников.

А в Kinetis это возможно?

Share this post


Link to post
Share on other sites
Это есть почти во всех МК.... кроме STM32. А большинство народу тут сидят именно на ём. :laughing:

Правда, например в LPC17, такой режим не поддерживает возможности синхронизации от разных источников.

А в Kinetis это возможно?

 

Вы наверно перепутали с Linked List DMA или Linked DMA как в Gecko.

Нет, в Kinetis это нечто иное. Смотрите мануал.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this