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.
pull/1469/head
Dean Camera 14 years ago
parent 1c74fd78bd
commit d126146887

@ -126,10 +126,10 @@
*/ */
static inline void RingBuffer_InitBuffer(RingBuffer_t* Buffer, uint8_t* const DataPtr, const uint16_t Size) 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) ATOMIC_BLOCK(ATOMIC_RESTORESTATE)
{ {
GCC_FORCE_POINTER_ACCESS(Buffer);
Buffer->In = DataPtr; Buffer->In = DataPtr;
Buffer->Out = DataPtr; Buffer->Out = DataPtr;
Buffer->Start = &DataPtr[0]; Buffer->Start = &DataPtr[0];
@ -203,9 +203,11 @@
* \param[in,out] Buffer Pointer to a ring buffer structure to insert into. * \param[in,out] Buffer Pointer to a ring buffer structure to insert into.
* \param[in] Data Data element to insert into the buffer. * \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) const uint8_t Data)
{ {
GCC_FORCE_POINTER_ACCESS(Buffer);
*Buffer->In = Data; *Buffer->In = Data;
if (++Buffer->In == Buffer->End) if (++Buffer->In == Buffer->End)
@ -227,8 +229,10 @@
* *
* \return Next data element stored in the buffer. * \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; uint8_t Data = *Buffer->Out;
if (++Buffer->Out == Buffer->End) if (++Buffer->Out == Buffer->End)

@ -44,46 +44,6 @@ uint8_t Endpoint_Discard_Stream(uint16_t Length
if ((ErrorCode = Endpoint_WaitUntilReady())) if ((ErrorCode = Endpoint_WaitUntilReady()))
return ErrorCode; 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) while (Length)
{ {
if (!(Endpoint_IsReadWriteAllowed())) if (!(Endpoint_IsReadWriteAllowed()))

@ -45,46 +45,6 @@ uint8_t Pipe_Discard_Stream(uint16_t Length
if ((ErrorCode = Pipe_WaitUntilReady())) if ((ErrorCode = Pipe_WaitUntilReady()))
return ErrorCode; 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) while (Length)
{ {
if (!(Pipe_IsReadWriteAllowed())) if (!(Pipe_IsReadWriteAllowed()))

@ -8,46 +8,6 @@ uint8_t TEMPLATE_FUNC_NAME (TEMPLATE_BUFFER_TYPE Buffer,
if ((ErrorCode = Endpoint_WaitUntilReady())) if ((ErrorCode = Endpoint_WaitUntilReady()))
return ErrorCode; 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) while (Length)
{ {
if (!(Endpoint_IsReadWriteAllowed())) if (!(Endpoint_IsReadWriteAllowed()))

@ -10,46 +10,6 @@ uint8_t TEMPLATE_FUNC_NAME (TEMPLATE_BUFFER_TYPE Buffer,
if ((ErrorCode = Pipe_WaitUntilReady())) if ((ErrorCode = Pipe_WaitUntilReady()))
return ErrorCode; 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) while (Length)
{ {
if (!(Pipe_IsReadWriteAllowed())) if (!(Pipe_IsReadWriteAllowed()))

@ -25,6 +25,7 @@
* - Added new *_ENUMERROR_PipeConfigurationFailed error codes for the *_Host_ConfigurePipes() routines * - 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 * - 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 * 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: * - Library Applications:
* - Changed the XPLAINBridge software UART to use the regular timer CTC mode instead of the alternative CTC mode * - 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 * 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 * - 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 * memory space that is only byte (not page) addressable
* *
*
* \section Sec_ChangeLog101122 Version 101122 * \section Sec_ChangeLog101122 Version 101122
* <b>New:</b> * <b>New:</b>
* - Core: * - Core:
@ -154,6 +156,7 @@
* - Fixed incorrect PollingIntervalMS values in the demo/project/bootloader endpoint descriptors (thanks to MCS Electronics) * - 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 AVRISP-MKII clone project not starting the target's program automatically after exiting TPI programming mode
* *
*
* \section Sec_ChangeLog100807 Version 100807 * \section Sec_ChangeLog100807 Version 100807
* <b>New:</b> * <b>New:</b>
* - Added new ADC_DisableChannel() function (thanks to Mich Davis) * - 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 * - Fixed software application start command broken in the DFU class bootloader when dfu-programmer is used due to application
* start address corruption * start address corruption
* *
*
* \section Sec_ChangeLog100513 Version 100513 * \section Sec_ChangeLog100513 Version 100513
* <b>New:</b> * <b>New:</b>
* - Added incomplete MIDIToneGenerator project * - Added incomplete MIDIToneGenerator project
@ -293,6 +297,7 @@
* request is being processed, causing possible lockups if a USB interrupt occurs during a transfer * 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 * - Remove incorrect Abstract Call Management class specific descriptor from the CDC demos, bootloaders and projects
* *
*
* \section Sec_ChangeLog100219 Version 100219 * \section Sec_ChangeLog100219 Version 100219
* *
* <b>New:</b> * <b>New:</b>
@ -349,6 +354,7 @@
* - Fixed AVRISP project not extending the command delay after each successful page/word/byte program * - 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 accuracy of the SERIAL_UBBRVAL() and SERIAL_2X_UBBRVAL() macros for higher baud rates (thanks to Renaud Cerrato)
* *
*
* \section Sec_ChangeLog091223 Version 091223 * \section Sec_ChangeLog091223 Version 091223
* *
* <b>New:</b> * <b>New:</b>
@ -414,6 +420,7 @@
* - Fixed AVRISP project timeouts not checking for the correct timeout period (thanks to Carl Ott) * - 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 STK525 Dataflash driver using incorrect bit-shifting for Dataflash addresses (thanks to Tim Mitchell)
* *
*
* \section Sec_ChangeLog091122 Version 091122 * \section Sec_ChangeLog091122 Version 091122
* *
* <b>New:</b> * <b>New:</b>
@ -461,6 +468,7 @@
* - Fixed LowLevel Keyboard demo not saving the issues report only after it has been sent to the host * - 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 Endpoint_Write_Control_Stream_* functions not sending a terminating IN when given data Length is zero
* *
*
* \section Sec_ChangeLog090924 Version 090924 * \section Sec_ChangeLog090924 Version 090924
* *
* <b>New:</b> * <b>New:</b>

@ -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 * by defining this token, reducing the compiled binary size. When removed, the stream functions no longer accept a callback function as
* a parameter. * 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 * <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 * 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 * voltage regulator is enabled, and the device speed when in device mode. By defining this token to a mask comprised of the USB options

@ -120,7 +120,6 @@ LUFA_OPTS = -D FIXED_CONTROL_ENDPOINT_SIZE=8
LUFA_OPTS += -D FIXED_NUM_CONFIGURATIONS=1 LUFA_OPTS += -D FIXED_NUM_CONFIGURATIONS=1
LUFA_OPTS += -D DEVICE_STATE_AS_GPIOR=0 LUFA_OPTS += -D DEVICE_STATE_AS_GPIOR=0
LUFA_OPTS += -D USE_FLASH_DESCRIPTORS 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 USE_STATIC_OPTIONS="(USB_DEVICE_OPT_FULLSPEED | USB_OPT_REG_ENABLED | USB_OPT_AUTO_PLL)"
LUFA_OPTS += -D INTERRUPT_CONTROL_ENDPOINT LUFA_OPTS += -D INTERRUPT_CONTROL_ENDPOINT

Loading…
Cancel
Save