|
Передача данных, fifo, кольцевой буфер и т.д. |
|
|
|
Dec 12 2016, 15:43
|
Местный
  
Группа: Участник
Сообщений: 491
Регистрация: 18-05-11
Пользователь №: 65 102

|
Добрый день! Мне нужен некий буфер для обмена данными между прерываниями (в одном пишу в буфер, в другом читаю, передаю дальше) с условием, что при чтении данные должны лежать в памяти линейно. Суть в том, что сейчас я пишу в кольцевой буфер данные в прерывании I2S, потом в прерывании USB SOF смотрю есть ли данные, если есть - отправляю. Проблема в том, что библиотечная функция передачи данных по USB требует в качестве параметров адрес начала массива данных и количество данных. А буфер то у меня кольцевой! Подскажите, какие есть еще способы передачи данных? Я всегда кольцевым буфером пользовался, а тут надо чтобы данные лежали линейно в памяти.
|
|
|
|
|
Dec 12 2016, 18:01
|
Группа: Участник
Сообщений: 9
Регистрация: 12-12-16
Пользователь №: 94 601

|
Цитата(Atlantis- @ Dec 12 2016, 16:43)  Проблема в том, что библиотечная функция передачи данных по USB требует в качестве параметров адрес начала массива данных и количество данных. ... надо чтобы данные лежали линейно в памяти. Может, перед вызовом библиотечной функции, копировать данные из кольцевого буфера в линейный?
|
|
|
|
|
Dec 13 2016, 00:59
|
Участник

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

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

Гуру
     
Группа: Свой
Сообщений: 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; }
|
|
|
|
|
Dec 13 2016, 06:48
|
Местный
  
Группа: Участник
Сообщений: 491
Регистрация: 18-05-11
Пользователь №: 65 102

|
Цитата(G.Simenon @ Dec 12 2016, 21:01)  Может, перед вызовом библиотечной функции, копировать данные из кольцевого буфера в линейный? я в данный момент так и делаю, но хочется какой то более красивый вариант
|
|
|
|
|
Dec 13 2016, 08:32
|
Местный
  
Группа: Участник
Сообщений: 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 (Программное обеспечение ввода-вывода, не зависящее от конкретных устройств). Спасибо
|
|
|
|
|
Dec 14 2016, 12:40
|
Местный
  
Группа: Участник
Сообщений: 491
Регистрация: 18-05-11
Пользователь №: 65 102

|
Цитата(uriy @ Dec 14 2016, 07:50)  Мютексы. Не совсем понял, как их использовать в моем случае?
Сообщение отредактировал Atlantis- - Dec 14 2016, 13:35
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|