From d1261468875f4772898c4395880735784e651d91 Mon Sep 17 00:00:00 2001 From: Dean Camera Date: Sat, 8 Jan 2011 00:54:30 +0000 Subject: The FAST_STREAM_TRANSFERS compile time option has been removed due to lack of use and low cost/benefit ratio. Add GCC_FORCE_POINTER_ACCESS() macro use to the RingBuffer library header, to attempt to force GCC into producing more efficient code for manipulating the buffers. --- LUFA/Drivers/Misc/RingBuffer.h | 14 +++++--- LUFA/Drivers/USB/HighLevel/EndpointStream.c | 40 ---------------------- LUFA/Drivers/USB/HighLevel/PipeStream.c | 40 ---------------------- .../USB/HighLevel/Template/Template_Endpoint_RW.c | 40 ---------------------- .../USB/HighLevel/Template/Template_Pipe_RW.c | 40 ---------------------- LUFA/ManPages/ChangeLog.txt | 8 +++++ LUFA/ManPages/CompileTimeTokens.txt | 7 ---- 7 files changed, 17 insertions(+), 172 deletions(-) (limited to 'LUFA') diff --git a/LUFA/Drivers/Misc/RingBuffer.h b/LUFA/Drivers/Misc/RingBuffer.h index d9d3a8340..605f92c11 100644 --- a/LUFA/Drivers/Misc/RingBuffer.h +++ b/LUFA/Drivers/Misc/RingBuffer.h @@ -126,10 +126,10 @@ */ static inline void RingBuffer_InitBuffer(RingBuffer_t* Buffer, uint8_t* const DataPtr, const uint16_t Size) { + GCC_FORCE_POINTER_ACCESS(Buffer); + ATOMIC_BLOCK(ATOMIC_RESTORESTATE) - { - GCC_FORCE_POINTER_ACCESS(Buffer); - + { Buffer->In = DataPtr; Buffer->Out = DataPtr; Buffer->Start = &DataPtr[0]; @@ -203,9 +203,11 @@ * \param[in,out] Buffer Pointer to a ring buffer structure to insert into. * \param[in] Data Data element to insert into the buffer. */ - static inline void RingBuffer_Insert(RingBuffer_t* const Buffer, + static inline void RingBuffer_Insert(RingBuffer_t* Buffer, const uint8_t Data) { + GCC_FORCE_POINTER_ACCESS(Buffer); + *Buffer->In = Data; if (++Buffer->In == Buffer->End) @@ -227,8 +229,10 @@ * * \return Next data element stored in the buffer. */ - static inline uint8_t RingBuffer_Remove(RingBuffer_t* const Buffer) + static inline uint8_t RingBuffer_Remove(RingBuffer_t* Buffer) { + GCC_FORCE_POINTER_ACCESS(Buffer); + uint8_t Data = *Buffer->Out; if (++Buffer->Out == Buffer->End) diff --git a/LUFA/Drivers/USB/HighLevel/EndpointStream.c b/LUFA/Drivers/USB/HighLevel/EndpointStream.c index 76875b258..c2bb3922c 100644 --- a/LUFA/Drivers/USB/HighLevel/EndpointStream.c +++ b/LUFA/Drivers/USB/HighLevel/EndpointStream.c @@ -44,46 +44,6 @@ uint8_t Endpoint_Discard_Stream(uint16_t Length if ((ErrorCode = Endpoint_WaitUntilReady())) return ErrorCode; - #if defined(FAST_STREAM_TRANSFERS) - uint8_t BytesRemToAlignment = (Endpoint_BytesInEndpoint() & 0x07); - - if (Length >= 8) - { - Length -= BytesRemToAlignment; - - switch (BytesRemToAlignment) - { - default: - do - { - if (!(Endpoint_IsReadWriteAllowed())) - { - Endpoint_ClearOUT(); - - #if !defined(NO_STREAM_CALLBACKS) - if ((Callback != NULL) && (Callback() == STREAMCALLBACK_Abort)) - return ENDPOINT_RWSTREAM_CallbackAborted; - #endif - - if ((ErrorCode = Endpoint_WaitUntilReady())) - return ErrorCode; - } - - Length -= 8; - - Endpoint_Discard_Byte(); - case 7: Endpoint_Discard_Byte(); - case 6: Endpoint_Discard_Byte(); - case 5: Endpoint_Discard_Byte(); - case 4: Endpoint_Discard_Byte(); - case 3: Endpoint_Discard_Byte(); - case 2: Endpoint_Discard_Byte(); - case 1: Endpoint_Discard_Byte(); - } while (Length >= 8); - } - } - #endif - while (Length) { if (!(Endpoint_IsReadWriteAllowed())) diff --git a/LUFA/Drivers/USB/HighLevel/PipeStream.c b/LUFA/Drivers/USB/HighLevel/PipeStream.c index 624340017..98c57206f 100644 --- a/LUFA/Drivers/USB/HighLevel/PipeStream.c +++ b/LUFA/Drivers/USB/HighLevel/PipeStream.c @@ -45,46 +45,6 @@ uint8_t Pipe_Discard_Stream(uint16_t Length if ((ErrorCode = Pipe_WaitUntilReady())) return ErrorCode; - #if defined(FAST_STREAM_TRANSFERS) - uint8_t BytesRemToAlignment = (Pipe_BytesInPipe() & 0x07); - - if (Length >= 8) - { - Length -= BytesRemToAlignment; - - switch (BytesRemToAlignment) - { - default: - do - { - if (!(Pipe_IsReadWriteAllowed())) - { - Pipe_ClearIN(); - - #if !defined(NO_STREAM_CALLBACKS) - if ((Callback != NULL) && (Callback() == STREAMCALLBACK_Abort)) - return PIPE_RWSTREAM_CallbackAborted; - #endif - - if ((ErrorCode = Pipe_WaitUntilReady())) - return ErrorCode; - } - - Length -= 8; - - Pipe_Discard_Byte(); - case 7: Pipe_Discard_Byte(); - case 6: Pipe_Discard_Byte(); - case 5: Pipe_Discard_Byte(); - case 4: Pipe_Discard_Byte(); - case 3: Pipe_Discard_Byte(); - case 2: Pipe_Discard_Byte(); - case 1: Pipe_Discard_Byte(); - } while (Length >= 8); - } - } - #endif - while (Length) { if (!(Pipe_IsReadWriteAllowed())) diff --git a/LUFA/Drivers/USB/HighLevel/Template/Template_Endpoint_RW.c b/LUFA/Drivers/USB/HighLevel/Template/Template_Endpoint_RW.c index 6657f38eb..8a97e1565 100644 --- a/LUFA/Drivers/USB/HighLevel/Template/Template_Endpoint_RW.c +++ b/LUFA/Drivers/USB/HighLevel/Template/Template_Endpoint_RW.c @@ -8,46 +8,6 @@ uint8_t TEMPLATE_FUNC_NAME (TEMPLATE_BUFFER_TYPE Buffer, if ((ErrorCode = Endpoint_WaitUntilReady())) return ErrorCode; - #if defined(FAST_STREAM_TRANSFERS) - uint8_t BytesRemToAlignment = (Endpoint_BytesInEndpoint() & 0x07); - - if (Length >= 8) - { - Length -= BytesRemToAlignment; - - switch (BytesRemToAlignment) - { - default: - do - { - if (!(Endpoint_IsReadWriteAllowed())) - { - TEMPLATE_CLEAR_ENDPOINT(); - - #if !defined(NO_STREAM_CALLBACKS) - if ((Callback != NULL) && (Callback() == STREAMCALLBACK_Abort)) - return ENDPOINT_RWSTREAM_CallbackAborted; - #endif - - if ((ErrorCode = Endpoint_WaitUntilReady())) - return ErrorCode; - } - - Length -= 8; - - TEMPLATE_TRANSFER_BYTE(DataStream); - case 7: TEMPLATE_TRANSFER_BYTE(DataStream); - case 6: TEMPLATE_TRANSFER_BYTE(DataStream); - case 5: TEMPLATE_TRANSFER_BYTE(DataStream); - case 4: TEMPLATE_TRANSFER_BYTE(DataStream); - case 3: TEMPLATE_TRANSFER_BYTE(DataStream); - case 2: TEMPLATE_TRANSFER_BYTE(DataStream); - case 1: TEMPLATE_TRANSFER_BYTE(DataStream); - } while (Length >= 8); - } - } - #endif - while (Length) { if (!(Endpoint_IsReadWriteAllowed())) diff --git a/LUFA/Drivers/USB/HighLevel/Template/Template_Pipe_RW.c b/LUFA/Drivers/USB/HighLevel/Template/Template_Pipe_RW.c index a998469d2..eebe52f12 100644 --- a/LUFA/Drivers/USB/HighLevel/Template/Template_Pipe_RW.c +++ b/LUFA/Drivers/USB/HighLevel/Template/Template_Pipe_RW.c @@ -10,46 +10,6 @@ uint8_t TEMPLATE_FUNC_NAME (TEMPLATE_BUFFER_TYPE Buffer, if ((ErrorCode = Pipe_WaitUntilReady())) return ErrorCode; - #if defined(FAST_STREAM_TRANSFERS) - uint8_t BytesRemToAlignment = (Pipe_BytesInPipe() & 0x07); - - if (Length >= 8) - { - Length -= BytesRemToAlignment; - - switch (BytesRemToAlignment) - { - default: - do - { - if (!(Pipe_IsReadWriteAllowed())) - { - TEMPLATE_CLEAR_PIPE(); - - #if !defined(NO_STREAM_CALLBACKS) - if ((Callback != NULL) && (Callback() == STREAMCALLBACK_Abort)) - return PIPE_RWSTREAM_CallbackAborted; - #endif - - if ((ErrorCode = Pipe_WaitUntilReady())) - return ErrorCode; - } - - Length -= 8; - - TEMPLATE_TRANSFER_BYTE(DataStream); - case 7: TEMPLATE_TRANSFER_BYTE(DataStream); - case 6: TEMPLATE_TRANSFER_BYTE(DataStream); - case 5: TEMPLATE_TRANSFER_BYTE(DataStream); - case 4: TEMPLATE_TRANSFER_BYTE(DataStream); - case 3: TEMPLATE_TRANSFER_BYTE(DataStream); - case 2: TEMPLATE_TRANSFER_BYTE(DataStream); - case 1: TEMPLATE_TRANSFER_BYTE(DataStream); - } while (Length >= 8); - } - } - #endif - while (Length) { if (!(Pipe_IsReadWriteAllowed())) diff --git a/LUFA/ManPages/ChangeLog.txt b/LUFA/ManPages/ChangeLog.txt index 87aa5eedb..dc0ca01fd 100644 --- a/LUFA/ManPages/ChangeLog.txt +++ b/LUFA/ManPages/ChangeLog.txt @@ -25,6 +25,7 @@ * - Added new *_ENUMERROR_PipeConfigurationFailed error codes for the *_Host_ConfigurePipes() routines * - The USARTStream global is now public and documented in the SerialStream module, allowing for the serial USART * stream to be accessed via its handle rather than via the implicit stdout and stdin streams + * - The FAST_STREAM_TRANSFERS compile time option has been removed due to lack of use and low cost/benefit ratio * - Library Applications: * - Changed the XPLAINBridge software UART to use the regular timer CTC mode instead of the alternative CTC mode * via the Input Capture register, to reduce user confusion @@ -49,6 +50,7 @@ * - Fixed possible programming problem in the AVRISP-MKII clone project when programming specific patterns into a target * memory space that is only byte (not page) addressable * + * * \section Sec_ChangeLog101122 Version 101122 * New: * - Core: @@ -154,6 +156,7 @@ * - Fixed incorrect PollingIntervalMS values in the demo/project/bootloader endpoint descriptors (thanks to MCS Electronics) * - Fixed AVRISP-MKII clone project not starting the target's program automatically after exiting TPI programming mode * + * * \section Sec_ChangeLog100807 Version 100807 * New: * - Added new ADC_DisableChannel() function (thanks to Mich Davis) @@ -218,6 +221,7 @@ * - Fixed software application start command broken in the DFU class bootloader when dfu-programmer is used due to application * start address corruption * + * * \section Sec_ChangeLog100513 Version 100513 * New: * - Added incomplete MIDIToneGenerator project @@ -293,6 +297,7 @@ * request is being processed, causing possible lockups if a USB interrupt occurs during a transfer * - Remove incorrect Abstract Call Management class specific descriptor from the CDC demos, bootloaders and projects * + * * \section Sec_ChangeLog100219 Version 100219 * * New: @@ -349,6 +354,7 @@ * - Fixed AVRISP project not extending the command delay after each successful page/word/byte program * - Fixed accuracy of the SERIAL_UBBRVAL() and SERIAL_2X_UBBRVAL() macros for higher baud rates (thanks to Renaud Cerrato) * + * * \section Sec_ChangeLog091223 Version 091223 * * New: @@ -414,6 +420,7 @@ * - Fixed AVRISP project timeouts not checking for the correct timeout period (thanks to Carl Ott) * - Fixed STK525 Dataflash driver using incorrect bit-shifting for Dataflash addresses (thanks to Tim Mitchell) * + * * \section Sec_ChangeLog091122 Version 091122 * * New: @@ -461,6 +468,7 @@ * - Fixed LowLevel Keyboard demo not saving the issues report only after it has been sent to the host * - Fixed Endpoint_Write_Control_Stream_* functions not sending a terminating IN when given data Length is zero * + * * \section Sec_ChangeLog090924 Version 090924 * * New: diff --git a/LUFA/ManPages/CompileTimeTokens.txt b/LUFA/ManPages/CompileTimeTokens.txt index b120617e0..70ad1a935 100644 --- a/LUFA/ManPages/CompileTimeTokens.txt +++ b/LUFA/ManPages/CompileTimeTokens.txt @@ -90,13 +90,6 @@ * by defining this token, reducing the compiled binary size. When removed, the stream functions no longer accept a callback function as * a parameter. * - * FAST_STREAM_TRANSFERS - ( \ref Group_EndpointPacketManagement , \ref Group_PipePacketManagement )\n - * By default, streams are transferred internally via a loop, sending or receiving one byte per iteration before checking for a bank full - * or empty condition. This allows for multiple stream functions to be chained together easily, as there are no alignment issues. However, - * this can lead to heavy performance penalties in applications where large streams are used frequently. When this compile time option is - * used, bytes are sent or received in groups of 8 bytes at a time increasing performance at the expense of a larger flash memory consumption - * due to the extra code required to deal with byte alignment. - * * USE_STATIC_OPTIONS=x - ( \ref Group_USBManagement ) \n * By default, the USB_Init() function accepts dynamic options at runtime to alter the library behaviour, including whether the USB pad * voltage regulator is enabled, and the device speed when in device mode. By defining this token to a mask comprised of the USB options -- cgit v1.2.3