Правильное использование MemcpyC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Правильное использование Memcpy

Сообщение Anonymous »

У меня есть некоторые проблемы с проектом, который я делаю. Я знаю теорию указателя/массивов/ссылок и должен знать, как это сделать, тем не менее я провожу два дня без какого -либо прогресса. Я был бы очень благодарен. Я получаю данные по SPI. Затем данные хранятся в буфере (буфер int32_t [1024 или 2048]). Существует счетчик, который считается от 0 до размера 1 и определяет место, где хранится точка данных. В настоящее время я получаю тестовый сигнал, который внутренне генерируется UC < /p>
//ch1: receive 24 bit data in 8 bit chunks -> store in an int32_t
ch1=ch1|(SPI.transfer(PIN_CS, 0x00, SPI_CONTINUE)8;
ch1=ch1|(SPI.transfer(PIN_CS, 0x00, SPI_CONTINUE)8;
ch1=ch1|(SPI.transfer(PIN_CS, 0x00, SPI_CONTINUE)8;

if(Not Important){
_ch1Buffer[_ch1SampleCount] = ch1;
_ch1SampleCount++;
if(_ch1SampleCount>SAMPLE_BUFFER_SIZE-1) _ch1SampleCount=0;
}
< /code>
Этот ISR активен все время. Поскольку мне нужны необработанные данные для обработки сигналов, и буфер изменяется ISR всякий раз, когда доступна новая точка данных, я хочу скопировать части буфера во временное «хранилище». В Mainloop, когда счетчик достигает определенного размера, я вызываю метод получить некоторые из данных буфера (около 30 образцов). < /P>
Метод получает текущую позицию в буфере: < /p>
'int ch1Pos = _ch1SampleCount;'
< /code>
А затем, в зависимости от этой позиции, я пытаюсь использовать Memcpy, чтобы получить свои образцы. В зависимости от позиции в буфере, должен быть «оберток», чтобы получить полный набор образцов: < /p>
if(ch1Pos>=(RAW_BLOCK_SIZE-1)){
memcpy(&ch1[0],&_ch1Buffer[ch1Pos-(RAW_BLOCK_SIZE-1)] , RAW_BLOCK_SIZE*sizeof(int32_t));
}else{
memcpy(&ch1[RAW_BLOCK_SIZE-1 - ch1Pos],&_ch1Buffer[0],(ch1Pos)*sizeof(int32_t));
memcpy(&ch1[0],&_ch1Buffer[SAMPLE_BUFFER_SIZE-1-(RAW_BLOCK_SIZE- ch1Pos)],(RAW_BLOCK_SIZE-ch1Pos)*sizeof(int32_t));
}
< /code>

_ch1buffer - это буфер, содержащий необработанные данные < /li>
Образец /> CH1POS - это позиция последней точки данных, записанной в буфер из ISR в то время, когда этот метод называется < /li>
< /ul>
Технически, я знаю о требованиях, но, по -видимому, этого недостаточно. < /p>
Я знаю, что данные, полученные по интерфейсу SPI, являются «правильными». Проблема в том, что это не относится к извлеченным образцам. В данных много шипов, которые указывают на то, что я читал то, что не должен был читать. Пример кода выше - одна версия многих, и пока вы читаете это, я уверен, что снова все изменил. Это обновленный код для части Memcpy: < /p>
if(ch1Pos>=(RAW_BLOCK_SIZE-1)){
memcpy(&ch1[0],&_ch1Buffer[ch1Pos-(RAW_BLOCK_SIZE-1)] , RAW_BLOCK_SIZE*sizeof(int32_t));
}else{
memcpy(&ch1[RAW_BLOCK_SIZE-1-ch1Pos],&_ch1Buffer[0],(ch1Pos+1)*sizeof(int32_t));
memcpy(&ch1[0],&_ch1Buffer[SAMPLE_BUFFER_SIZE-(RAW_BLOCK_SIZE-1-ch1Pos)],(RAW_BLOCK_SIZE-1-ch1Pos)*sizeof(int32_t));
}
}
< /code>
Это уже сделало это намного лучше. Из всех изменений все вроде испортилось. Теперь там есть только одна ошибка.

Есть периодический всплеск. Я постараюсь получить больше информации, но я думаю, что это неправильный доступ во время обертывания. /> edit ii < /strong>
, чтобы ответить на вопросы @David Schwartz: < /p>

memset (_ch1buffer, 0, sizeof (int32_t)*sample_buffer_size); < /code> < /li>
< /ul>
edit iii < /strong>

Извините за часты Уменьшение CH1POS: 'int ch1pos = _ch1samplecount;'
Теперь есть только один периодический «Спайк» (неправильное значение). Это должно быть что -то с командой Split Memcpy. Я продолжу смотреть. Если у кого -то есть идея ...

Подробнее здесь: https://stackoverflow.com/questions/376 ... -of-memcpy
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»