Index: firmware/App/Services/CommBuffers.c =================================================================== diff -u -rb64c49fdcf2b6d95e61e63f8e258c4e600935bbd -rc4434389fe6c3314c2bba98dc2f4cf737551f637 --- firmware/App/Services/CommBuffers.c (.../CommBuffers.c) (revision b64c49fdcf2b6d95e61e63f8e258c4e600935bbd) +++ firmware/App/Services/CommBuffers.c (.../CommBuffers.c) (revision c4434389fe6c3314c2bba98dc2f4cf737551f637) @@ -91,10 +91,11 @@ // verify given buffer if ( buffer < NUM_OF_COMM_BUFFERS ) { + BOOL bufferFull = FALSE; U32 activeBuffer; U32 currentActiveBufCount; // where to start adding new data to buffer (after existing data) - // add requires brief thread protection because there may be multiple sources for transmits trying to add data to a buffer. + // thread protection for queue operations _disable_IRQ(); bufferGetLock[ buffer ] = TRUE; @@ -112,17 +113,19 @@ 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(); + bufferFull = TRUE; + } + // release thread protection + bufferGetLock[ buffer ] = FALSE; + _enable_IRQ(); + // if buffer was full, trigger s/w fault + if ( TRUE == bufferFull ) + { SET_ALARM_WITH_2_U32_DATA( ALARM_ID_SOFTWARE_FAULT, SW_FAULT_ID_COMM_BUFFERS_ADD_TOO_MUCH_DATA, len ) } } @@ -159,6 +162,8 @@ // verify given buffer if ( buffer < NUM_OF_COMM_BUFFERS ) { + // thread protection for queue operations + _disable_IRQ(); // verify requested # of bytes to get are in the buffer if ( ( len <= ( COMM_BUFFER_LENGTH * DOUBLE_BUFFERS ) ) && ( len <= numberOfBytesInCommBuffer( buffer ) ) ) { @@ -182,6 +187,8 @@ result += remNumOfBytes; } } + // release thread protection + _enable_IRQ(); } else // invalid buffer given { @@ -214,6 +221,8 @@ // verify given buffer if ( buffer < NUM_OF_COMM_BUFFERS ) { + // thread protection for queue operations + _disable_IRQ(); // verify requested # of bytes to peek are in the buffer if ( ( len <= ( COMM_BUFFER_LENGTH * DOUBLE_BUFFERS ) ) && ( len <= numberOfBytesInCommBuffer( buffer ) ) ) { @@ -236,6 +245,8 @@ numOfBytesPeeked = bytesInInactiveBuffer + remNumOfBytes; } } + // release thread protection + _enable_IRQ(); } else // invalid buffer given {