Dima1060 0 12 декабря, 2016 Опубликовано 12 декабря, 2016 · Жалоба Добрый день! Мне нужен некий буфер для обмена данными между прерываниями (в одном пишу в буфер, в другом читаю, передаю дальше) с условием, что при чтении данные должны лежать в памяти линейно. Суть в том, что сейчас я пишу в кольцевой буфер данные в прерывании I2S, потом в прерывании USB SOF смотрю есть ли данные, если есть - отправляю. Проблема в том, что библиотечная функция передачи данных по USB требует в качестве параметров адрес начала массива данных и количество данных. А буфер то у меня кольцевой! Подскажите, какие есть еще способы передачи данных? Я всегда кольцевым буфером пользовался, а тут надо чтобы данные лежали линейно в памяти. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_Pasha 0 12 декабря, 2016 Опубликовано 12 декабря, 2016 (изменено) · Жалоба если взять двумерный массив? пишете в одну страницу, читаете из другой страниц может быть более чем 2 ну и счетчик записей, сквозной. при вычитывании записей - кол-во вычитанных вычитается, пардон за тавтологию Изменено 12 декабря, 2016 пользователем _Pasha Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Simenon 0 12 декабря, 2016 Опубликовано 12 декабря, 2016 · Жалоба Проблема в том, что библиотечная функция передачи данных по USB требует в качестве параметров адрес начала массива данных и количество данных. ... надо чтобы данные лежали линейно в памяти. Может, перед вызовом библиотечной функции, копировать данные из кольцевого буфера в линейный? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
conan 0 13 декабря, 2016 Опубликовано 13 декабря, 2016 · Жалоба Добрый день! Мне нужен некий буфер для обмена данными между прерываниями (в одном пишу в буфер, в другом читаю, передаю дальше) с условием, что при чтении данные должны лежать в памяти линейно. Суть в том, что сейчас я пишу в кольцевой буфер данные в прерывании I2S, потом в прерывании USB SOF смотрю есть ли данные, если есть - отправляю. Проблема в том, что библиотечная функция передачи данных по USB требует в качестве параметров адрес начала массива данных и количество данных. А буфер то у меня кольцевой! Подскажите, какие есть еще способы передачи данных? Я всегда кольцевым буфером пользовался, а тут надо чтобы данные лежали линейно в памяти. Либо сперва скопировать в линейный буфер, и потом отдать в библиотечную функцию, либо вызывать библиотечную функцию 2 раза: первый -- для ранних данных, второй -- для последних (если организация кольц. буфера позволяет). Если все происходит от прерываний, то возникает вопрос повторной входимости функционала кольцевого буфера, который автоматически снимается, если вся работа с ним происходит в состоянии запрета прерываний Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
uriy 4 13 декабря, 2016 Опубликовано 13 декабря, 2016 · Жалоба Два линейных буфера. Один для манипуляций с ним, второй готовый для передачи. Внутри прерывания 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; } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Dima1060 0 13 декабря, 2016 Опубликовано 13 декабря, 2016 · Жалоба Может, перед вызовом библиотечной функции, копировать данные из кольцевого буфера в линейный? я в данный момент так и делаю, но хочется какой то более красивый вариант Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
becopt 0 13 декабря, 2016 Опубликовано 13 декабря, 2016 · Жалоба Вам предложили работать с несколькими линейными массивами и оперировать индексами массива. Более конкретно про различные методики можно почитать у Таненбаума в "Современные операционные системы", раздел 5.3.3 (Программное обеспечение ввода-вывода, не зависящее от конкретных устройств). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Dima1060 0 13 декабря, 2016 Опубликовано 13 декабря, 2016 · Жалоба Вам предложили работать с несколькими линейными массивами и оперировать индексами массива. я понял, в один массив писать, из другого читать. только тут есть нюанс, что теоретически (да и практически бывает) функция отправки по USB может не вернуть OK, то есть надо данные отправить в следующий раз. в случае с двумя массивами, как минимум перепутается последовательность сообщений, хотя наверно можно не переключать массивы в случае если данные не были отправлены... Более конкретно про различные методики можно почитать у Таненбаума в "Современные операционные системы", раздел 5.3.3 (Программное обеспечение ввода-вывода, не зависящее от конкретных устройств). Спасибо Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Dima1060 0 13 декабря, 2016 Опубликовано 13 декабря, 2016 · Жалоба Столкнулся с такой проблемой: как организовать буфер, чтобы можно было писать в него из нескольких источников? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
uriy 4 14 декабря, 2016 Опубликовано 14 декабря, 2016 · Жалоба Мютексы. Либо все-таки писать из одного потока, а в этот поток кидать очереди из других потоков которым нужен доступ к этому буферу. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
toweroff 0 14 декабря, 2016 Опубликовано 14 декабря, 2016 · Жалоба Мютексы. +1 тоже более изящного ничего не придумал Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AlexandrY 2 14 декабря, 2016 Опубликовано 14 декабря, 2016 · Жалоба Столкнулся с такой проблемой: как организовать буфер, чтобы можно было писать в него из нескольких источников? Есть такая штука у Kinetis называется linked DMA . Не путать со scatter/gather DMA. С помощью linked DMA можно легко с одного сигнала-триггера собрать в одно место данные от нескольких источников. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 184 14 декабря, 2016 Опубликовано 14 декабря, 2016 · Жалоба С помощью linked DMA можно легко с одного сигнала-триггера собрать в одно место данные от нескольких источников. Это есть почти во всех МК.... кроме STM32. А большинство народу тут сидят именно на ём. :laughing: Правда, например в LPC17, такой режим не поддерживает возможности синхронизации от разных источников. А в Kinetis это возможно? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AlexandrY 2 14 декабря, 2016 Опубликовано 14 декабря, 2016 · Жалоба Это есть почти во всех МК.... кроме STM32. А большинство народу тут сидят именно на ём. :laughing: Правда, например в LPC17, такой режим не поддерживает возможности синхронизации от разных источников. А в Kinetis это возможно? Вы наверно перепутали с Linked List DMA или Linked DMA как в Gecko. Нет, в Kinetis это нечто иное. Смотрите мануал. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Dima1060 0 14 декабря, 2016 Опубликовано 14 декабря, 2016 (изменено) · Жалоба Мютексы. Не совсем понял, как их использовать в моем случае? Изменено 14 декабря, 2016 пользователем Atlantis- Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться