Index: firmware/App/Services/CommBuffers.c =================================================================== diff -u -r439894cb0508e69af3ece09ae57a62feac09e3f2 -r3f3729899d6811c763bc8e5ef9baf54a2d5c9cfe --- firmware/App/Services/CommBuffers.c (.../CommBuffers.c) (revision 439894cb0508e69af3ece09ae57a62feac09e3f2) +++ firmware/App/Services/CommBuffers.c (.../CommBuffers.c) (revision 3f3729899d6811c763bc8e5ef9baf54a2d5c9cfe) @@ -32,12 +32,10 @@ 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 static U32 firstBufferOverflowTimeStamp = 0; // time stamp of a prior overflow event - allows for an overflow persistence check // ********** private function prototypes ********** -static void clearBuffer( COMM_BUFFER_T buffer ); static U32 switchDoubleBuffer( COMM_BUFFER_T buffer ); static void getDataFromInactiveBuffer( COMM_BUFFER_T buffer, U08 *data, U32 len ); @@ -72,21 +70,27 @@ * @param buffer : the buffer to clear * @return none *************************************************************************/ -static void clearBuffer( COMM_BUFFER_T buffer ) +void clearBuffer( COMM_BUFFER_T buffer ) { if ( buffer < NUM_OF_COMM_BUFFERS ) { S32 d,i; + // thread protection for queue operations + _disable_IRQ(); + activeDoubleBuffer[ buffer ] = 0; - for ( d = 0; d < DOUBLE_BUFFERS; d++ ) - { - commBufferByteCount[ buffer ][ d ] = 0; - for ( i = 0; i < COMM_BUFFER_LENGTH; i++ ) - { - commBuffers[ buffer ][ d ][ i ] = 0; - } - } + for ( d = 0; d < DOUBLE_BUFFERS; d++ ) + { + commBufferByteCount[ buffer ][ d ] = 0; + for ( i = 0; i < COMM_BUFFER_LENGTH; i++ ) + { + commBuffers[ buffer ][ d ][ i ] = 0; + } + } + + // release thread protection + _enable_IRQ(); } } @@ -118,7 +122,6 @@ // thread protection for queue operations _disable_IRQ(); - bufferGetLock[ buffer ] = TRUE; activeBuffer = activeDoubleBuffer[ buffer ]; currentActiveBufCount = commBufferByteCount[ buffer ][ activeBuffer ]; @@ -139,21 +142,20 @@ } else // buffer too full to add this much data { -#ifdef DEBUG_ENABLED - char debugStr[50]; - sprintf( debugStr, "Buffer Overflow: #%3d, %3d bytes, %02X %02X %02X %02X %02X %02X %02X %02X \n", buffer, len, data[0], data[1], data[2], data[3], data[4], data[5], data[6], data[7] ); - sendDebugData( (U08*)debugStr, strlen(debugStr) ); - sendDebugDataToUI( (U08*)debugStr ); -#endif bufferFull = TRUE; - clearBuffer( buffer ); } // release thread protection - bufferGetLock[ buffer ] = FALSE; _enable_IRQ(); // if buffer was full, check persistence - trigger s/w fault if persists if ( TRUE == bufferFull ) { +#ifdef DEBUG_ENABLED + char debugStr[100]; + sprintf( debugStr, "Buf OF:#%3d,%3d, %02X:%02X:%02X:%02X:%02X:%02X:%02X:%02X\n", buffer, len, data[0], data[1], data[2], data[3], data[4], data[5], data[6], data[7] ); + sendDebugData( (U08*)debugStr, strlen(debugStr) ); + sendDebugDataToUI( (U08*)debugStr ); +#endif + clearBuffer( buffer ); // not first overflow? if ( firstBufferOverflowTimeStamp != 0 ) { @@ -324,14 +326,7 @@ 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 ]; - } + result = commBufferByteCount[ buffer ][ inactiveBuffer ] + commBufferByteCount[ buffer ][ activeBuffer ]; } else // invalid buffer {