static void circular_buffer_test(circular_buffer_t cb) { int i; test_t t; for (i = 0; i < 7; ++i) { memset(t.buf, 0, sizeof(t.buf)); t.index = i + 1; sprintf(t.buf, "the test buffer with id=>%d\n", t.index); t.len = strlen(t.buf); circular_buffer_put(cb, (const char*)&t, sizeof(t)); } fprintf(stdout, "size : %d\n", circular_buffer_size(cb)); fprintf(stdout, "circular buffer get=>%d\n", circular_buffer_get(cb, sizeof(t), (char*)&t)); fprintf(stdout, "size : %d\n", circular_buffer_size(cb)); test_show(t); for (i = 0; i < 1; ++i) { memset(t.buf, 0, sizeof(t.buf)); t.index = (i + 7) * (i + 7); sprintf(t.buf, "the test buffer with id=>%d\n", t.index); t.len = strlen(t.buf); circular_buffer_put(cb, (const char*)&t, sizeof(t)); } fprintf(stdout, "size : %d\n", circular_buffer_size(cb)); while (!circular_buffer_empty(cb)) { circular_buffer_get(cb, sizeof(t), (char*)&t); test_show(t); } fprintf(stdout, "size : %d\n", circular_buffer_size(cb)); }
size_t circular_buffer_write(circular_buffer_t* buffer, const uint8_t* data, size_t size) { // Если места недостаточно или размер данных равен 0 - возврат 0. if(buffer->size - buffer->count < size || size == 0) return 0; size_t n; for(n = 0; n < size; n ++) circular_buffer_put(buffer, *data ++); return size; }
/** * \brief Call back function for DMA left channel receive complete * * This function will be called when DMA receive completes * This function changes the destination address of the DMA channel and * restarts the DMA transfer. * * \param dmaStatus [IN] Status of the DMA transfer * \param dataCallback [IN] I2S handle * * \return void * */ void I2S_DmaRxLChCallBack( PSP_DMATransferStatus dmaStatus, void *dataCallback ) { Uint16 *ptrRxLeft; Uint16 i; #ifdef ENABLE_RECORD if ((dataCallback != NULL) && (dmaStatus == PSP_DMA_TRANSFER_COMPLETE)) { /* Get pointer to ping/pong buffer */ ptrRxLeft = &my_i2sRxLeftBuf[0]; if (left_rx_buf_sel == 0x1) /* check ping or pong buffer */ { /* this buffer has data to be processed */ ptrRxLeft += DMA_TARNSFER_SZ; } left_rx_buf_sel ^= 0x1; /* update ping/pong */ // copy data to the /*if(SEM_count(&SEM_BufferFull) > PROCESS_BUFFER_SIZE/DMA_TARNSFER_SZ){ return; }*/ for (i = 0; i < DMA_BUFFER_SZ; i++) { // NOTE: since we need datapack to be disabled on I2S tx, we need it disabled on I2S rx therefore // we get 2 words per DMA transfer so the offset into DMA buffers has to be twice as big recInLeftBuf = *ptrRxLeft; ptrRxLeft += 2; circular_buffer_put(recInLeftBuf); /*bufferIn[bufferInIdx] = (recInLeftBuf & 0xFF); bufferInIdx = (bufferInIdx+1) % PROCESS_BUFFER_SIZE; bufferIn[bufferInIdx] = ((recInLeftBuf >> 8) & 0xFF); bufferInIdx = (bufferInIdx+1) % PROCESS_BUFFER_SIZE; */ } SEM_post(&SEM_BufferFull); //LOG_printf(&trace, "IN log %ld\n",bufferInIdx); } else { #ifdef DEBUG_LOG_PRINT LOG_printf(&trace, "Left RX DMA Failed"); #endif } #endif // ENABLE_RECORD }
void mesg_queue_add(mesg_queue *q, mesg_queue_entry * entry) { pthread_mutex_lock(&q->lock); circular_buffer_put(q->buffer,entry); pthread_mutex_unlock(&q->lock); }