Index: firmware/App/Services/CommBuffers.c =================================================================== diff -u -r1bbf9da32e622975efed00b1a7589387a9829440 -rf7e3018ec6ab762fe08efb42b21fb2ca970174b0 --- firmware/App/Services/CommBuffers.c (.../CommBuffers.c) (revision 1bbf9da32e622975efed00b1a7589387a9829440) +++ firmware/App/Services/CommBuffers.c (.../CommBuffers.c) (revision f7e3018ec6ab762fe08efb42b21fb2ca970174b0) @@ -1,6 +1,6 @@ /************************************************************************** * - * Copyright (c) 2019-2019 Diality Inc. - All Rights Reserved. + * Copyright (c) 2019-2020 Diality Inc. - All Rights Reserved. * * THIS CODE MAY NOT BE COPIED OR REPRODUCED IN ANY FORM, IN PART OR IN * WHOLE, WITHOUT THE EXPLICIT PERMISSION OF THE COPYRIGHT OWNER. @@ -32,9 +32,10 @@ // ********** private data ********** -static U32 commBufferByteCount[ NUM_OF_COMM_BUFFERS ][ DOUBLE_BUFFERS ]; // for each buffer, how many bytes does it contain? (also index to next available) -static U32 activeDoubleBuffer[ NUM_OF_COMM_BUFFERS ]; // for each buffer, which double buffer is being fed right now? +static volatile U32 commBufferByteCount[ NUM_OF_COMM_BUFFERS ][ DOUBLE_BUFFERS ]; // for each buffer, how many bytes does it contain? (also index to next available) +static volatile U32 activeDoubleBuffer[ NUM_OF_COMM_BUFFERS ]; // for each buffer, which double buffer is being fed right now? static U08 commBuffers[ NUM_OF_COMM_BUFFERS ][ DOUBLE_BUFFERS ][ COMM_BUFFER_LENGTH ]; // each is double buffered to avoid thread contention +static volatile BOOL bufferGetLock[ NUM_OF_COMM_BUFFERS ]; // prevent getter from accessing active buffer while add in progress // ********** private function prototypes ********** @@ -96,6 +97,7 @@ // add requires brief thread protection because there may be multiple sources for transmits trying to add data to a buffer. _disable_IRQ(); + bufferGetLock[ buffer ] = TRUE; activeBuffer = activeDoubleBuffer[ buffer ]; currentActiveBufCount = commBufferByteCount[ buffer ][ activeBuffer ]; @@ -105,20 +107,22 @@ { U08 *buffPtr; // buffer destination for added data - // adjust buffer count per this data add (also reserves space to add data before releasing thread protection) - commBufferByteCount[ buffer ][ activeBuffer ] += len; - // release thread protection - _enable_IRQ(); // set destination pointer to end of active buffer data buffPtr = &commBuffers[ buffer ][ activeBuffer ][ currentActiveBufCount ]; // copy source data to destination buffer memcpy( buffPtr, data, len ); + // adjust buffer count per this data add (also reserves space to add data before releasing thread protection) + commBufferByteCount[ buffer ][ activeBuffer ] += len; + // release thread protection + bufferGetLock[ buffer ] = FALSE; + _enable_IRQ(); // data successfully added to buffer result = TRUE; } else // buffer too full to add this much data { // release thread protection + bufferGetLock[ buffer ] = FALSE; _enable_IRQ(); SET_ALARM_WITH_2_U32_DATA( ALARM_ID_SOFTWARE_FAULT, SW_FAULT_ID_COMM_BUFFERS_ADD_TOO_MUCH_DATA, len ) } @@ -156,7 +160,7 @@ // verify given buffer if ( buffer < NUM_OF_COMM_BUFFERS ) { - // verify size of get + // verify requested # of bytes to get are in the buffer if ( ( len <= ( COMM_BUFFER_LENGTH * DOUBLE_BUFFERS ) ) && ( len <= numberOfBytesInCommBuffer( buffer ) ) ) { U32 activeBuffer = activeDoubleBuffer[ buffer ]; @@ -179,10 +183,6 @@ result += remNumOfBytes; } } - else // invalid get size given - { - SET_ALARM_WITH_2_U32_DATA( ALARM_ID_SOFTWARE_FAULT, SW_FAULT_ID_COMM_BUFFERS_GET_TOO_MUCH_DATA, len ) - } } else // invalid buffer given { @@ -215,7 +215,7 @@ // verify given buffer if ( buffer < NUM_OF_COMM_BUFFERS ) { - // verify size of peek + // verify requested # of bytes to peek are in the buffer if ( ( len <= ( COMM_BUFFER_LENGTH * DOUBLE_BUFFERS ) ) && ( len <= numberOfBytesInCommBuffer( buffer ) ) ) { U32 activeBuffer = activeDoubleBuffer[ buffer ]; @@ -237,10 +237,6 @@ numOfBytesPeeked = bytesInInactiveBuffer + remNumOfBytes; } } - else // invalid peek size given - { - SET_ALARM_WITH_2_U32_DATA( ALARM_ID_SOFTWARE_FAULT, SW_FAULT_ID_COMM_BUFFERS_PEEK_TOO_MUCH_DATA, len ) - } } else // invalid buffer given { @@ -268,7 +264,17 @@ // verify given buffer if ( buffer < NUM_OF_COMM_BUFFERS ) { - result = commBufferByteCount[ buffer ][ 0 ] + commBufferByteCount[ buffer ][ 1 ]; + U32 activeBuffer = activeDoubleBuffer[ buffer ]; + U32 inactiveBuffer = GET_TOGGLE( activeBuffer, 0, 1 ); + + if ( FALSE == bufferGetLock[ buffer ] ) + { + result = commBufferByteCount[ buffer ][ inactiveBuffer ] + commBufferByteCount[ buffer ][ activeBuffer ]; + } + else + { + result = commBufferByteCount[ buffer ][ inactiveBuffer ]; + } } else // invalid buffer {