The FAST_STREAM_TRANSFERS compile time option has been removed due to lack of use...
authorDean Camera <dean@fourwalledcubicle.com>
Sat, 8 Jan 2011 00:54:30 +0000 (00:54 +0000)
committerDean Camera <dean@fourwalledcubicle.com>
Sat, 8 Jan 2011 00:54:30 +0000 (00:54 +0000)
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
LUFA/Drivers/USB/HighLevel/EndpointStream.c
LUFA/Drivers/USB/HighLevel/PipeStream.c
LUFA/Drivers/USB/HighLevel/Template/Template_Endpoint_RW.c
LUFA/Drivers/USB/HighLevel/Template/Template_Pipe_RW.c
LUFA/ManPages/ChangeLog.txt
LUFA/ManPages/CompileTimeTokens.txt
Projects/Webserver/makefile

index d9d3a83..605f92c 100644 (file)
                 */\r
                static inline void RingBuffer_InitBuffer(RingBuffer_t* Buffer, uint8_t* const DataPtr, const uint16_t Size)\r
                {\r
                 */\r
                static inline void RingBuffer_InitBuffer(RingBuffer_t* Buffer, uint8_t* const DataPtr, const uint16_t Size)\r
                {\r
+                       GCC_FORCE_POINTER_ACCESS(Buffer);\r
+\r
                        ATOMIC_BLOCK(ATOMIC_RESTORESTATE)\r
                        ATOMIC_BLOCK(ATOMIC_RESTORESTATE)\r
-                       {\r
-                               GCC_FORCE_POINTER_ACCESS(Buffer);\r
-                               \r
+                       {       \r
                                Buffer->In     = DataPtr;\r
                                Buffer->Out    = DataPtr;\r
                                Buffer->Start  = &DataPtr[0];\r
                                Buffer->In     = DataPtr;\r
                                Buffer->Out    = DataPtr;\r
                                Buffer->Start  = &DataPtr[0];\r
                 *  \param[in,out] Buffer  Pointer to a ring buffer structure to insert into.\r
                 *  \param[in]     Data    Data element to insert into the buffer.\r
                 */\r
                 *  \param[in,out] Buffer  Pointer to a ring buffer structure to insert into.\r
                 *  \param[in]     Data    Data element to insert into the buffer.\r
                 */\r
-               static inline void RingBuffer_Insert(RingBuffer_t* const Buffer,\r
+               static inline void RingBuffer_Insert(RingBuffer_t* Buffer,\r
                                                     const uint8_t Data)\r
                {\r
                                                     const uint8_t Data)\r
                {\r
+                       GCC_FORCE_POINTER_ACCESS(Buffer);\r
+\r
                        *Buffer->In = Data;\r
 \r
                        if (++Buffer->In == Buffer->End)\r
                        *Buffer->In = Data;\r
 \r
                        if (++Buffer->In == Buffer->End)\r
                 *\r
                 *  \return Next data element stored in the buffer.\r
                 */\r
                 *\r
                 *  \return Next data element stored in the buffer.\r
                 */\r
-               static inline uint8_t RingBuffer_Remove(RingBuffer_t* const Buffer)\r
+               static inline uint8_t RingBuffer_Remove(RingBuffer_t* Buffer)\r
                {\r
                {\r
+                       GCC_FORCE_POINTER_ACCESS(Buffer);\r
+               \r
                        uint8_t Data = *Buffer->Out;\r
 \r
                        if (++Buffer->Out == Buffer->End)\r
                        uint8_t Data = *Buffer->Out;\r
 \r
                        if (++Buffer->Out == Buffer->End)\r
index 76875b2..c2bb392 100644 (file)
@@ -44,46 +44,6 @@ uint8_t Endpoint_Discard_Stream(uint16_t Length
        if ((ErrorCode = Endpoint_WaitUntilReady()))\r
          return ErrorCode;\r
 \r
        if ((ErrorCode = Endpoint_WaitUntilReady()))\r
          return ErrorCode;\r
 \r
-       #if defined(FAST_STREAM_TRANSFERS)\r
-       uint8_t BytesRemToAlignment = (Endpoint_BytesInEndpoint() & 0x07);\r
-\r
-       if (Length >= 8)\r
-       {\r
-               Length -= BytesRemToAlignment;\r
-\r
-               switch (BytesRemToAlignment)\r
-               {\r
-                       default:\r
-                               do\r
-                               {\r
-                                       if (!(Endpoint_IsReadWriteAllowed()))\r
-                                       {\r
-                                               Endpoint_ClearOUT();\r
-\r
-                                               #if !defined(NO_STREAM_CALLBACKS)\r
-                                               if ((Callback != NULL) && (Callback() == STREAMCALLBACK_Abort))\r
-                                                 return ENDPOINT_RWSTREAM_CallbackAborted;\r
-                                               #endif\r
-\r
-                                               if ((ErrorCode = Endpoint_WaitUntilReady()))\r
-                                                 return ErrorCode;\r
-                                       }\r
-\r
-                                       Length -= 8;\r
-                                       \r
-                                       Endpoint_Discard_Byte();\r
-                       case 7: Endpoint_Discard_Byte();\r
-                       case 6: Endpoint_Discard_Byte();\r
-                       case 5: Endpoint_Discard_Byte();\r
-                       case 4: Endpoint_Discard_Byte();\r
-                       case 3: Endpoint_Discard_Byte();\r
-                       case 2: Endpoint_Discard_Byte();\r
-                       case 1: Endpoint_Discard_Byte();\r
-                               } while (Length >= 8);  \r
-               }\r
-       }\r
-       #endif\r
-\r
        while (Length)\r
        {\r
                if (!(Endpoint_IsReadWriteAllowed()))\r
        while (Length)\r
        {\r
                if (!(Endpoint_IsReadWriteAllowed()))\r
index 6243400..98c5720 100644 (file)
@@ -45,46 +45,6 @@ uint8_t Pipe_Discard_Stream(uint16_t Length
        if ((ErrorCode = Pipe_WaitUntilReady()))\r
          return ErrorCode;\r
 \r
        if ((ErrorCode = Pipe_WaitUntilReady()))\r
          return ErrorCode;\r
 \r
-       #if defined(FAST_STREAM_TRANSFERS)\r
-       uint8_t BytesRemToAlignment = (Pipe_BytesInPipe() & 0x07);\r
-\r
-       if (Length >= 8)\r
-       {\r
-               Length -= BytesRemToAlignment;\r
-\r
-               switch (BytesRemToAlignment)\r
-               {\r
-                       default:\r
-                               do\r
-                               {\r
-                                       if (!(Pipe_IsReadWriteAllowed()))\r
-                                       {\r
-                                               Pipe_ClearIN();\r
-                                                       \r
-                                               #if !defined(NO_STREAM_CALLBACKS)\r
-                                               if ((Callback != NULL) && (Callback() == STREAMCALLBACK_Abort))\r
-                                                 return PIPE_RWSTREAM_CallbackAborted;\r
-                                               #endif\r
-\r
-                                               if ((ErrorCode = Pipe_WaitUntilReady()))\r
-                                                 return ErrorCode;\r
-                                       }\r
-\r
-                                       Length -= 8;\r
-                                       \r
-                                       Pipe_Discard_Byte();\r
-                       case 7: Pipe_Discard_Byte();\r
-                       case 6: Pipe_Discard_Byte();\r
-                       case 5: Pipe_Discard_Byte();\r
-                       case 4: Pipe_Discard_Byte();\r
-                       case 3: Pipe_Discard_Byte();\r
-                       case 2: Pipe_Discard_Byte();\r
-                       case 1: Pipe_Discard_Byte();\r
-                               } while (Length >= 8);  \r
-               }\r
-       }\r
-       #endif\r
-\r
        while (Length)\r
        {\r
                if (!(Pipe_IsReadWriteAllowed()))\r
        while (Length)\r
        {\r
                if (!(Pipe_IsReadWriteAllowed()))\r
index 6657f38..8a97e15 100644 (file)
@@ -8,46 +8,6 @@ uint8_t TEMPLATE_FUNC_NAME (TEMPLATE_BUFFER_TYPE Buffer,
        if ((ErrorCode = Endpoint_WaitUntilReady()))
          return ErrorCode;
 
        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()))
        while (Length)
        {
                if (!(Endpoint_IsReadWriteAllowed()))
index a998469..eebe52f 100644 (file)
@@ -10,46 +10,6 @@ uint8_t TEMPLATE_FUNC_NAME (TEMPLATE_BUFFER_TYPE Buffer,
        if ((ErrorCode = Pipe_WaitUntilReady()))
          return ErrorCode;
 
        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()))
        while (Length)
        {
                if (!(Pipe_IsReadWriteAllowed()))
index 87aa5ee..dc0ca01 100644 (file)
@@ -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
   *   - 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
   *  - 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
   *
   *   - 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
   *  <b>New:</b>
   *  - Core:
   *  \section Sec_ChangeLog101122 Version 101122
   *  <b>New:</b>
   *  - Core:
   *    - 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
   *
   *    - 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
   *  <b>New:</b>
   *  - Added new ADC_DisableChannel() function (thanks to Mich Davis)
   *  \section Sec_ChangeLog100807 Version 100807
   *  <b>New:</b>
   *  - Added new ADC_DisableChannel() function (thanks to Mich Davis)
   *  - Fixed software application start command broken in the DFU class bootloader when dfu-programmer is used due to application
   *    start address corruption
   *
   *  - 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
   *  <b>New:</b>
   *  - Added incomplete MIDIToneGenerator project
   *  \section Sec_ChangeLog100513 Version 100513
   *  <b>New:</b>
   *  - Added incomplete MIDIToneGenerator project
   *    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
   *
   *    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
   *
   *  <b>New:</b>
   *  \section Sec_ChangeLog100219 Version 100219
   *
   *  <b>New:</b>
   *  - 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)
   *
   *  - 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
   *
   *  <b>New:</b>
   *  \section Sec_ChangeLog091223 Version 091223
   *
   *  <b>New:</b>
   *  - 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)
   *
   *  - 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
   *
   *  <b>New:</b>
   *  \section Sec_ChangeLog091122 Version 091122
   *
   *  <b>New:</b>
   *  - 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
   *
   *  - 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
   *
   *  <b>New:</b>
   *  \section Sec_ChangeLog090924 Version 090924
   *
   *  <b>New:</b>
index b120617..70ad1a9 100644 (file)
  *  by defining this token, reducing the compiled binary size. When removed, the stream functions no longer accept a callback function as
  *  a parameter.
  *
  *  by defining this token, reducing the compiled binary size. When removed, the stream functions no longer accept a callback function as
  *  a parameter.
  *
- *  <b>FAST_STREAM_TRANSFERS</b> - ( \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.
- *
  *  <b>USE_STATIC_OPTIONS</b>=<i>x</i> - ( \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
  *  <b>USE_STATIC_OPTIONS</b>=<i>x</i> - ( \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
index 1544218..acc371a 100644 (file)
@@ -120,7 +120,6 @@ LUFA_OPTS  = -D FIXED_CONTROL_ENDPOINT_SIZE=8
 LUFA_OPTS += -D FIXED_NUM_CONFIGURATIONS=1
 LUFA_OPTS += -D DEVICE_STATE_AS_GPIOR=0
 LUFA_OPTS += -D USE_FLASH_DESCRIPTORS
 LUFA_OPTS += -D FIXED_NUM_CONFIGURATIONS=1
 LUFA_OPTS += -D DEVICE_STATE_AS_GPIOR=0
 LUFA_OPTS += -D USE_FLASH_DESCRIPTORS
-LUFA_OPTS += -D FAST_STREAM_TRANSFERS
 LUFA_OPTS += -D USE_STATIC_OPTIONS="(USB_DEVICE_OPT_FULLSPEED | USB_OPT_REG_ENABLED | USB_OPT_AUTO_PLL)"
 LUFA_OPTS += -D INTERRUPT_CONTROL_ENDPOINT
 
 LUFA_OPTS += -D USE_STATIC_OPTIONS="(USB_DEVICE_OPT_FULLSPEED | USB_OPT_REG_ENABLED | USB_OPT_AUTO_PLL)"
 LUFA_OPTS += -D INTERRUPT_CONTROL_ENDPOINT