Temporary fix for mbuf's byte index

Each buffer should use its own byte index since the value would otherwise be
overwritten when writing to other buffers
This commit is contained in:
Steins7 2023-09-24 18:33:20 +02:00
parent a7099d5dfd
commit dbfba20520
2 changed files with 21 additions and 10 deletions

View File

@ -18,6 +18,9 @@
static void mbuf_callback(enum DmaIRQSource src, volatile void* param);
#define byte_index (((uint8_t**)buffer->buffers)[buffer->buffer_index][buffer->buffer_size + 1])
#define dma_byte_index (((uint8_t**)buffer->buffers)[buffer->dma_buffer_index][buffer->buffer_size + 1])
//--local variables-------------------------------------------------------------
@ -32,8 +35,7 @@ void dma_mbuf_configure(volatile struct DmaMultiBuffer* buffer, void** buffers,
buffer->buffers = buffers;
buffer->dest = dest;
buffer->buffer_size = buffer_size;
buffer->byte_index = 0;
buffer->buffer_size = buffer_size - 2;
buffer->buffer_nb = buffer_nb;
buffer->free_buffer_nb = buffer_nb - 1;
@ -43,6 +45,12 @@ void dma_mbuf_configure(volatile struct DmaMultiBuffer* buffer, void** buffers,
buffer->dma = dma;
buffer->channel = channel;
buffer->config = DMA_CONFIG | priority;
for (uint8_t i=0; i<buffer->buffer_nb; ++i) {
for (uint16_t j=0; j<buffer->buffer_size + 2; ++j) {
((uint8_t**)buffer->buffers)[i][j] = 0;
}
}
}
uint32_t dma_mbuf_write_byte(volatile struct DmaMultiBuffer* buffer,
@ -51,7 +59,8 @@ uint32_t dma_mbuf_write_byte(volatile struct DmaMultiBuffer* buffer,
dma_enter_critical(buffer->dma, buffer->channel);
//if the current buffer is full, we need to switch it with an empty one
if (buffer->byte_index >= buffer->buffer_size) {
volatile uint16_t index = byte_index;
if (byte_index >= buffer->buffer_size) {
//if all buffer full, give up
if (buffer->free_buffer_nb == 0) {
@ -65,13 +74,14 @@ uint32_t dma_mbuf_write_byte(volatile struct DmaMultiBuffer* buffer,
}
--buffer->free_buffer_nb;
buffer->byte_index = 0;
byte_index = 0;
}
//write the byte
uint8_t** buffers = (uint8_t**)buffer->buffers;
buffers[buffer->buffer_index][buffer->byte_index] = byte;
++buffer->byte_index;
buffers[buffer->buffer_index][byte_index] = byte;
++byte_index;
++index;
dma_exit_critical(buffer->dma, buffer->channel);
return 0;
@ -81,14 +91,14 @@ void dma_mbuf_refresh(volatile struct DmaMultiBuffer* buffer)
{
//no more data to send, stop here
if (buffer->dma_buffer_index == buffer->buffer_index
&& buffer->byte_index == 0) {
&& byte_index == 0) {
return;
}
//else start a new transfer
dma_configure(buffer->dma, buffer->channel, buffer->config, buffer->dest,
buffer->buffers[buffer->dma_buffer_index],
buffer->byte_index, mbuf_callback, buffer);
dma_byte_index, mbuf_callback, buffer);
//if the newly transfering buffer was being written to, switch the current
//buffer. Since we just ended a transfer, the next buffer should be empty
@ -98,7 +108,9 @@ void dma_mbuf_refresh(volatile struct DmaMultiBuffer* buffer)
if (buffer->buffer_index >= buffer->buffer_nb) {
buffer->buffer_index = 0;
}
buffer->byte_index = 0;
--buffer->free_buffer_nb;
byte_index = 0;
}
return;

View File

@ -25,7 +25,6 @@ struct DmaMultiBuffer {
volatile void* dest; //destination peripheral register
uint16_t buffer_size; //size of a single buffer
uint16_t byte_index; //index of the current byte in the current buffer
uint8_t buffer_nb; //total number of buffers
uint8_t free_buffer_nb; //number of buffers not currently used