]> git.sur5r.net Git - freertos/commitdiff
Introduce xMessageBufferNextLengthBytes() and tests for the same.
authorrtel <rtel@1d2547de-c912-0410-9cb9-b8ca96c0e9e2>
Sun, 4 Mar 2018 19:25:14 +0000 (19:25 +0000)
committerrtel <rtel@1d2547de-c912-0410-9cb9-b8ca96c0e9e2>
Sun, 4 Mar 2018 19:25:14 +0000 (19:25 +0000)
Add call to traceTASK_SWITCHED_IN() in vTaskStartScheduler() so trace tools can see the first task to run.

git-svn-id: https://svn.code.sf.net/p/freertos/code/trunk@2531 1d2547de-c912-0410-9cb9-b8ca96c0e9e2

FreeRTOS/Demo/Common/Minimal/MessageBufferDemo.c
FreeRTOS/Demo/WIN32-MSVC/.vs/WIN32/v14/.suo
FreeRTOS/Source/include/message_buffer.h
FreeRTOS/Source/include/mpu_prototypes.h
FreeRTOS/Source/include/mpu_wrappers.h
FreeRTOS/Source/include/stream_buffer.h
FreeRTOS/Source/portable/Common/mpu_wrappers.c
FreeRTOS/Source/stream_buffer.c
FreeRTOS/Source/tasks.c

index 852b8f000689cefe0289e920851a613e02023fc6..4422b2bd5109b9881278da5c97eef2145afc17a1 100644 (file)
@@ -156,7 +156,7 @@ MessageBufferHandle_t xMessageBuffer;
 \r
 static void prvSingleTaskTests( MessageBufferHandle_t xMessageBuffer )\r
 {\r
-size_t xReturned, xItem, xExpectedSpace;\r
+size_t xReturned, xItem, xExpectedSpace, xNextLength;\r
 const size_t xMax6ByteMessages = mbMESSAGE_BUFFER_LENGTH_BYTES / ( 6 + mbBYTES_TO_STORE_MESSAGE_LENGTH );\r
 const size_t x6ByteLength = 6, x17ByteLength = 17;\r
 uint8_t *pucFullBuffer, *pucData, *pucReadData;\r
@@ -177,11 +177,15 @@ UBaseType_t uxOriginalPriority;
        pucReadData = pucData + x17ByteLength;\r
 \r
        /* Nothing has been added or removed yet, so expect the free space to be\r
-       exactly as created. */\r
+       exactly as created and the length of the next message to be 0. */\r
        xExpectedSpace = xMessageBufferSpaceAvailable( xMessageBuffer );\r
        configASSERT( xExpectedSpace == mbMESSAGE_BUFFER_LENGTH_BYTES );\r
        configASSERT( xMessageBufferIsEmpty( xMessageBuffer ) == pdTRUE );\r
-\r
+       xNextLength = xMessageBufferNextLengthBytes( xMessageBuffer );\r
+       configASSERT( xNextLength == 0 );\r
+       /* In case configASSERT() is not define. */\r
+       ( void ) xExpectedSpace;\r
+       ( void ) xNextLength;\r
 \r
        /* The buffer is 50 bytes long.  When an item is added to the buffer an\r
        additional 4 bytes are added to hold the item's size.  That means adding\r
@@ -215,6 +219,11 @@ UBaseType_t uxOriginalPriority;
                xReturned = xMessageBufferSpaceAvailable( xMessageBuffer );\r
                configASSERT( xReturned == xExpectedSpace );\r
                ( void ) xReturned; /* In case configASSERT() is not defined. */\r
+\r
+               /* Only 6 byte messages are written. */\r
+               xNextLength = xMessageBufferNextLengthBytes( xMessageBuffer );\r
+               configASSERT( xNextLength == x6ByteLength );\r
+               ( void ) xNextLength; /* In case configASSERT() is not defined. */\r
        }\r
 \r
        /* Now the buffer should be full, and attempting to add anything will should\r
@@ -255,6 +264,11 @@ UBaseType_t uxOriginalPriority;
                configASSERT( xReturned == 0 );\r
                ( void ) xReturned; /* In case configASSERT() is not defined. */\r
 \r
+               /* Should still be at least one 6 byte message still available. */\r
+               xNextLength = xMessageBufferNextLengthBytes( xMessageBuffer );\r
+               configASSERT( xNextLength == x6ByteLength );\r
+               ( void ) xNextLength; /* In case configASSERT() is not defined. */\r
+\r
                /* Read the next 6 bytes out.  The 'FromISR' version is used to give it\r
                some exercise as a block time is not used.  THa requires the code to be\r
                in a critical section so this test can be run with FreeRTOS ports that\r
@@ -284,6 +298,11 @@ UBaseType_t uxOriginalPriority;
        configASSERT( xMessageBufferIsEmpty( xMessageBuffer ) == pdTRUE );\r
        xExpectedSpace = xMessageBufferSpaceAvailable( xMessageBuffer );\r
        configASSERT( xExpectedSpace == mbMESSAGE_BUFFER_LENGTH_BYTES );\r
+       ( void ) xExpectedSpace; /* In case configASSERT() is not defined. */\r
+       xNextLength = xMessageBufferNextLengthBytes( xMessageBuffer );\r
+       configASSERT( xNextLength == 0 );\r
+       ( void ) xNextLength; /* In case configASSERT() is not defined. */\r
+\r
 \r
        /* Reading with a timeout should also fail after the appropriate time.  The\r
        priority is temporarily boosted in this part of the test to keep the\r
@@ -320,6 +339,11 @@ UBaseType_t uxOriginalPriority;
                configASSERT( xReturned == x17ByteLength );\r
                ( void ) xReturned; /* In case configASSERT() is not defined. */\r
 \r
+               /* Only 17 byte messages are written. */\r
+               xNextLength = xMessageBufferNextLengthBytes( xMessageBuffer );\r
+               configASSERT( xNextLength == x17ByteLength );\r
+               ( void ) xNextLength; /* In case configASSERT() is not defined. */\r
+\r
                /* The space in the buffer will have reduced by the amount of user data\r
                written into the buffer and the amount of space used to store the length\r
                of the data written into the buffer. */\r
@@ -334,6 +358,12 @@ UBaseType_t uxOriginalPriority;
 \r
                /* Does the data read out match that expected? */\r
                configASSERT( memcmp( ( void * ) pucData, ( void * ) pucReadData, x17ByteLength ) == 0 );\r
+\r
+               /* Don't expect any messages to be available as the data was read out\r
+               again. */\r
+               xNextLength = xMessageBufferNextLengthBytes( xMessageBuffer );\r
+               configASSERT( xNextLength == 0 );\r
+               ( void ) xNextLength; /* In case configASSERT() is not defined. */\r
        }\r
 \r
        /* The buffer should be empty again. */\r
@@ -357,10 +387,19 @@ UBaseType_t uxOriginalPriority;
        configASSERT( xReturned == 0 );\r
        ( void ) xReturned; /* In case configASSERT() is not defined. */\r
 \r
+       /* Don't expect any messages to be available as the above were too large to\r
+       get written. */\r
+       xNextLength = xMessageBufferNextLengthBytes( xMessageBuffer );\r
+       configASSERT( xNextLength == 0 );\r
+       ( void ) xNextLength; /* In case configASSERT() is not defined. */\r
+\r
        /* Can write mbMESSAGE_BUFFER_LENGTH_BYTES - sizeof( size_t ) bytes though. */\r
        xReturned = xMessageBufferSend( xMessageBuffer, ( const void * ) pc55ByteString, mbMESSAGE_BUFFER_LENGTH_BYTES - sizeof( size_t ), mbDONT_BLOCK );\r
        configASSERT( xReturned == mbMESSAGE_BUFFER_LENGTH_BYTES - sizeof( size_t ) );\r
        ( void ) xReturned; /* In case configASSERT() is not defined. */\r
+       xNextLength = xMessageBufferNextLengthBytes( xMessageBuffer );\r
+       configASSERT( xNextLength == ( mbMESSAGE_BUFFER_LENGTH_BYTES - sizeof( size_t ) ) );\r
+       ( void ) xNextLength; /* In case configASSERT() is not defined. */\r
        xReturned = xMessageBufferReceive( xMessageBuffer, ( void * ) pucFullBuffer, mbMESSAGE_BUFFER_LENGTH_BYTES - sizeof( size_t ), mbDONT_BLOCK );\r
        configASSERT( xReturned == ( mbMESSAGE_BUFFER_LENGTH_BYTES - sizeof( size_t ) ) );\r
        ( void ) xReturned; /* In case configASSERT() is not defined. */\r
index 87d803022f5336a90ac661e095bfa862fae8593d..bb4718846ff2e2ac0118868b0a9b0feb09583b50 100644 (file)
Binary files a/FreeRTOS/Demo/WIN32-MSVC/.vs/WIN32/v14/.suo and b/FreeRTOS/Demo/WIN32-MSVC/.vs/WIN32/v14/.suo differ
index 8be974041ed755289d6bb0e527fcdef926486353..752cbe7d870e9e59a75a8b62822a4d59c572172e 100644 (file)
@@ -693,6 +693,25 @@ size_t xMessageBufferSpaceAvailable( MessageBufferHandle_t xMessageBuffer ) );
  */\r
 #define xMessageBufferSpaceAvailable( xMessageBuffer ) xStreamBufferSpacesAvailable( ( StreamBufferHandle_t ) xMessageBuffer )\r
 \r
+/**\r
+ * message_buffer.h\r
+ <pre>\r
+ size_t xMessageBufferNextLengthBytes( MessageBufferHandle_t xMessageBuffer ) );\r
+ </pre>\r
+ * Returns the length (in bytes) of the next message in a message buffer.\r
+ * Useful if xMessageBufferReceive() returned 0 because the size of the buffer\r
+ * passed into xMessageBufferReceive() was too small to hold the next message.\r
+ *\r
+ * @param xMessageBuffer The handle of the message buffer being queried.\r
+ *\r
+ * @return The length (in bytes) of the next message in the message buffer, or 0\r
+ * if the message buffer is empty.\r
+ *\r
+ * \defgroup xMessageBufferNextLengthBytes xMessageBufferNextLengthBytes\r
+ * \ingroup MessageBufferManagement\r
+ */\r
+#define xMessageBufferNextLengthBytes( xMessageBuffer ) xStreamBufferNextMessageLengthBytes( ( StreamBufferHandle_t ) xMessageBuffer ) PRIVILEGED_FUNCTION;\r
+\r
 /**\r
  * message_buffer.h\r
  *\r
index a08d748fb077afea2f9ca4587080daa279134b58..d015cf7507fa7c97bbb73650f96616942a102140 100644 (file)
@@ -138,6 +138,7 @@ UBaseType_t MPU_uxEventGroupGetNumber( void* xEventGroup );
 size_t MPU_xStreamBufferSend( StreamBufferHandle_t xStreamBuffer, const void *pvTxData, size_t xDataLengthBytes, TickType_t xTicksToWait );\r
 size_t MPU_xStreamBufferSendFromISR( StreamBufferHandle_t xStreamBuffer, const void *pvTxData, size_t xDataLengthBytes, BaseType_t * const pxHigherPriorityTaskWoken );\r
 size_t MPU_xStreamBufferReceive( StreamBufferHandle_t xStreamBuffer, void *pvRxData, size_t xBufferLengthBytes, TickType_t xTicksToWait );\r
+size_t MPU_xStreamBufferNextMessageLengthBytes( StreamBufferHandle_t xStreamBuffer );\r
 size_t MPU_xStreamBufferReceiveFromISR( StreamBufferHandle_t xStreamBuffer, void *pvRxData, size_t xBufferLengthBytes, BaseType_t * const pxHigherPriorityTaskWoken );\r
 void MPU_vStreamBufferDelete( StreamBufferHandle_t xStreamBuffer );\r
 BaseType_t MPU_xStreamBufferIsFull( StreamBufferHandle_t xStreamBuffer );\r
index 1e97ae4c83afc2feb75dad29862f7f67494a90da..3ab181f2fab172321ad02bbdfa04542df4ca2761 100644 (file)
@@ -142,6 +142,7 @@ only for ports that are using the MPU. */
                #define xStreamBufferSend                                               MPU_xStreamBufferSend\r
                #define xStreamBufferSendFromISR                                MPU_xStreamBufferSendFromISR\r
                #define xStreamBufferReceive                                    MPU_xStreamBufferReceive\r
+               #define xStreamBufferNextMessageLengthBytes             MPU_xStreamBufferNextMessageLengthBytes\r
                #define xStreamBufferReceiveFromISR                             MPU_xStreamBufferReceiveFromISR\r
                #define vStreamBufferDelete                                             MPU_vStreamBufferDelete\r
                #define xStreamBufferIsFull                                             MPU_xStreamBufferIsFull\r
index f967dd2843707eea7433cb67257f4f6037d2a6c4..560d3d40aa28f72f8c810b293931242c712937d5 100644 (file)
@@ -839,6 +839,8 @@ StreamBufferHandle_t xStreamBufferGenericCreateStatic( size_t xBufferSizeBytes,
                                                                                                           uint8_t * const pucStreamBufferStorageArea,\r
                                                                                                           StaticStreamBuffer_t * const pxStaticStreamBuffer ) PRIVILEGED_FUNCTION;\r
 \r
+size_t xStreamBufferNextMessageLengthBytes( StreamBufferHandle_t xStreamBuffer ) PRIVILEGED_FUNCTION;\r
+\r
 #if( configUSE_TRACE_FACILITY == 1 )\r
        void vStreamBufferSetStreamBufferNumber( StreamBufferHandle_t xStreamBuffer, UBaseType_t uxStreamBufferNumber ) PRIVILEGED_FUNCTION;\r
        UBaseType_t uxStreamBufferGetStreamBufferNumber( StreamBufferHandle_t xStreamBuffer ) PRIVILEGED_FUNCTION;\r
index 73cfdf22399dd0fc27d6e57e3fcfd60d83eb9189..5bdbc100c30c20e9f0f53f65f4215a4e8dddaa4b 100644 (file)
@@ -1136,6 +1136,18 @@ BaseType_t xRunningPrivileged = xPortRaisePrivilege();
 }\r
 /*-----------------------------------------------------------*/\r
 \r
+size_t MPU_xStreamBufferNextMessageLengthBytes( StreamBufferHandle_t xStreamBuffer )\r
+{\r
+size_t xReturn;\r
+BaseType_t xRunningPrivileged = xPortRaisePrivilege();\r
+\r
+       xReturn = xStreamBufferNextMessageLengthBytes( xStreamBuffer );\r
+       vPortResetPrivilege( xRunningPrivileged );\r
+\r
+       return xReturn;\r
+}\r
+/*-----------------------------------------------------------*/\r
+\r
 size_t MPU_xStreamBufferReceive( StreamBufferHandle_t xStreamBuffer, void *pvRxData, size_t xBufferLengthBytes, TickType_t xTicksToWait )\r
 {\r
 size_t xReturn;\r
index 40619108a7755bd8ac4f6b13148d3b3ba359cbbc..963a35593c7225d182b199fa900f31c159270285 100644 (file)
@@ -792,6 +792,48 @@ size_t xReceivedLength = 0, xBytesAvailable, xBytesToStoreMessageLength;
 }\r
 /*-----------------------------------------------------------*/\r
 \r
+size_t xStreamBufferNextMessageLengthBytes( StreamBufferHandle_t xStreamBuffer )\r
+{\r
+StreamBuffer_t * const pxStreamBuffer = ( StreamBuffer_t * ) xStreamBuffer; /*lint !e9087 !e9079 Safe cast as StreamBufferHandle_t is opaque Streambuffer_t. */\r
+size_t xReturn, xBytesAvailable, xOriginalTail;\r
+\r
+       configASSERT( pxStreamBuffer );\r
+\r
+       /* Ensure the stream buffer is being used as a message buffer. */\r
+       if( ( pxStreamBuffer->ucFlags & sbFLAGS_IS_MESSAGE_BUFFER ) != ( uint8_t ) 0 )\r
+       {\r
+               xBytesAvailable = prvBytesInBuffer( pxStreamBuffer );\r
+               if( xBytesAvailable > sbBYTES_TO_STORE_MESSAGE_LENGTH )\r
+               {\r
+                       /* The number of bytes available is greater than the number of bytes\r
+                       required to hold the length of the next message, so another message\r
+                       is available.  Return its length without removing the length bytes\r
+                       from the buffer.  A copy of the tail is stored so the buffer can be\r
+                       returned to its prior state as the message is not actually being\r
+                       removed from the buffer. */\r
+                       xOriginalTail = pxStreamBuffer->xTail;\r
+                       ( void ) prvReadBytesFromBuffer( pxStreamBuffer, ( uint8_t * ) &xReturn, sbBYTES_TO_STORE_MESSAGE_LENGTH, xBytesAvailable );\r
+                       pxStreamBuffer->xTail = xOriginalTail;\r
+               }\r
+               else\r
+               {\r
+                       /* The minimum amount of bytes in a message buffer is\r
+                       ( sbBYTES_TO_STORE_MESSAGE_LENGTH + 1 ), so if xBytesAvailable is\r
+                       less than sbBYTES_TO_STORE_MESSAGE_LENGTH the only other valid\r
+                       value is 0. */\r
+                       configASSERT( xBytesAvailable == 0 );\r
+                       xReturn = 0;\r
+               }\r
+       }\r
+       else\r
+       {\r
+               xReturn = 0;\r
+       }\r
+\r
+       return xReturn;\r
+}\r
+/*-----------------------------------------------------------*/\r
+\r
 size_t xStreamBufferReceiveFromISR( StreamBufferHandle_t xStreamBuffer,\r
                                                                        void *pvRxData,\r
                                                                        size_t xBufferLengthBytes,\r
index 268c17c6254866101b9da7143cc91f4905d5a652..3a0cbf4e9fbce212a6b1cb3d3dbe470583a91d27 100644 (file)
@@ -1994,6 +1994,8 @@ BaseType_t xReturn;
                FreeRTOSConfig.h file. */\r
                portCONFIGURE_TIMER_FOR_RUN_TIME_STATS();\r
 \r
+               traceTASK_SWITCHED_IN();\r
+\r
                /* Setting up the timer tick is hardware specific and thus in the\r
                portable interface. */\r
                if( xPortStartScheduler() != pdFALSE )\r