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.
*/\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
- {\r
- GCC_FORCE_POINTER_ACCESS(Buffer);\r
- \r
+ { \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
- 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
+ GCC_FORCE_POINTER_ACCESS(Buffer);\r
+\r
*Buffer->In = Data;\r
\r
if (++Buffer->In == Buffer->End)\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
+ GCC_FORCE_POINTER_ACCESS(Buffer);\r
+ \r
uint8_t Data = *Buffer->Out;\r
\r
if (++Buffer->Out == Buffer->End)\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
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
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()))
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()))
* - 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
* - 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:
* - 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)
* - 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
* 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>
* - 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>
* - 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>
* - 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>
* 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
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