Перейти к содержанию
    

Добрый день!

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

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

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

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

Изменено пользователем _Pasha

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Добрый день!

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

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

 

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

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

 

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

Спасибо

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Мютексы.

Либо все-таки писать из одного потока, а в этот поток кидать очереди из других потоков которым нужен доступ к этому буферу.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

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

 

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Мютексы.

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

Изменено пользователем Atlantis-

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...