forked from mfulz_github/qmk_firmware
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.
This commit is contained in:
parent
1c74fd78bd
commit
d126146887
|
@ -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)
|
||||
|
|
|
@ -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()))
|
||||
|
|
|
@ -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()))
|
||||
|
|
|
@ -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()))
|
||||
|
|
|
@ -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()))
|
||||
|
|
|
@ -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
|
||||
* <b>New:</b>
|
||||
* - 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
|
||||
* <b>New:</b>
|
||||
* - 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
|
||||
* <b>New:</b>
|
||||
* - 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
|
||||
*
|
||||
* <b>New:</b>
|
||||
|
@ -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
|
||||
*
|
||||
* <b>New:</b>
|
||||
|
@ -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
|
||||
*
|
||||
* <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 Endpoint_Write_Control_Stream_* functions not sending a terminating IN when given data Length is zero
|
||||
*
|
||||
*
|
||||
* \section Sec_ChangeLog090924 Version 090924
|
||||
*
|
||||
* <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
|
||||
* 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
|
||||
|
|
|
@ -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 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
|
||||
|
||||
|
|
Loading…
Reference in New Issue