Index: firmware/App/Services/CommBuffers.c =================================================================== diff -u -rc9cb494c004e390155ce7c8b3cda96cf8c1b5fa7 -r2112e3143003eaf9584d4be068f7ca89b33c941a --- firmware/App/Services/CommBuffers.c (.../CommBuffers.c) (revision c9cb494c004e390155ce7c8b3cda96cf8c1b5fa7) +++ firmware/App/Services/CommBuffers.c (.../CommBuffers.c) (revision 2112e3143003eaf9584d4be068f7ca89b33c941a) @@ -92,10 +92,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; @@ -121,9 +122,14 @@ } 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 ) } } @@ -160,6 +166,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 ) ) ) { @@ -183,6 +191,8 @@ result += remNumOfBytes; } } + // release thread protection + _enable_IRQ(); } else // invalid buffer given { @@ -215,6 +225,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 ) ) ) { @@ -237,6 +249,8 @@ numOfBytesPeeked = bytesInInactiveBuffer + remNumOfBytes; } } + // release thread protection + _enable_IRQ(); } else // invalid buffer given {