]> git.sur5r.net Git - freertos/commitdiff
Update the the MPU simulator project to exercise the timer API.
authorrtel <rtel@1d2547de-c912-0410-9cb9-b8ca96c0e9e2>
Mon, 17 Dec 2018 22:06:58 +0000 (22:06 +0000)
committerrtel <rtel@1d2547de-c912-0410-9cb9-b8ca96c0e9e2>
Mon, 17 Dec 2018 22:06:58 +0000 (22:06 +0000)
git-svn-id: https://svn.code.sf.net/p/freertos/code/trunk@2607 1d2547de-c912-0410-9cb9-b8ca96c0e9e2

FreeRTOS/Demo/CORTEX_MPU_Simulator_Keil_GCC/FreeRTOSConfig.h
FreeRTOS/Demo/CORTEX_MPU_Simulator_Keil_GCC/GCC_Specific/RTOSDemo.uvoptx
FreeRTOS/Demo/CORTEX_MPU_Simulator_Keil_GCC/main.c

index e8b04346aa5d5025a720628bd1d07d5200d15c1f..85210996225da239a39c53073e58e1ee119a5b8e 100644 (file)
@@ -105,7 +105,7 @@ to exclude the API function. */
 #define INCLUDE_vTaskDelayUntil                                1\r
 #define INCLUDE_vTaskDelay                                     1\r
 #define INCLUDE_eTaskGetState                          1\r
-#define INCLUDE_xTimerPendFunctionCall         0\r
+#define INCLUDE_xTimerPendFunctionCall         1\r
 #define INCLUDE_xSemaphoreGetMutexHolder       1\r
 #define INCLUDE_xTaskGetHandle                         1\r
 #define INCLUDE_xTaskGetCurrentTaskHandle      1\r
index 365eb69cacdae08f7425bbfe578ca519dbb285b8..85705cfdbf8e56f68c3c17821b0999c9b32ebd5c 100644 (file)
         <SetRegEntry>
           <Number>0</Number>
           <Key>DLGDARM</Key>
-          <Name>(1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0)(1012=1215,201,1680,501,0)</Name>
+          <Name>(1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0)(1012=1071,201,1536,501,0)</Name>
         </SetRegEntry>
         <SetRegEntry>
           <Number>0</Number>
           <Name>-UV1115SAE -O2983 -S0 -C0 -P00 -N00("ARM CoreSight JTAG-DP") -D00(4BA00477) -L00(4) -TO18 -TC10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO11  -FN1 -FC1000 -FD20000000 -FF0NEW_DEVICE -FL080000 -FS00 -FP0($$Device:ARMCM4_FP$Device\ARM\Flash\NEW_DEVICE.FLM)</Name>
         </SetRegEntry>
       </TargetDriverDllRegistry>
-      <Breakpoint/>
+      <Breakpoint>
+        <Bp>
+          <Number>0</Number>
+          <Type>0</Type>
+          <LineNumber>614</LineNumber>
+          <EnabledFlag>1</EnabledFlag>
+          <Address>23132</Address>
+          <ByteObject>0</ByteObject>
+          <HtxType>0</HtxType>
+          <ManyObjects>0</ManyObjects>
+          <SizeOfObject>0</SizeOfObject>
+          <BreakByAccess>0</BreakByAccess>
+          <BreakIfRCount>1</BreakIfRCount>
+          <Filename>C:\Users\ribarry\Dev\FreeRTOS\WorkingCopy\FreeRTOS\Source\stream_buffer.c</Filename>
+          <ExecCommand></ExecCommand>
+          <Expression>\\RTOSDemo\../../../Source/stream_buffer.c\614</Expression>
+        </Bp>
+      </Breakpoint>
       <WatchWindow1>
         <Ww>
           <count>0</count>
       <DebugFlag>
         <trace>0</trace>
         <periodic>1</periodic>
-        <aLwin>1</aLwin>
+        <aLwin>0</aLwin>
         <aCover>0</aCover>
         <aSer1>0</aSer1>
         <aSer2>0</aSer2>
         <aLa>0</aLa>
         <aPa1>0</aPa1>
         <AscS4>0</AscS4>
-        <aSer4>0</aSer4>
+        <aSer4>1</aSer4>
         <StkLoc>0</StkLoc>
         <TrcWin>0</TrcWin>
         <newCpu>0</newCpu>
index 1ccddbbe7965503da5ab4a3231d5877a2d13c64f..82b51a1b5352223393163c6d769c6f71a4985d3a 100644 (file)
@@ -158,6 +158,7 @@ static void prvExerciseEventGroupAPI( void );
 static void prvExerciseSemaphoreAPI( void );\r
 static void prvExerciseTaskNotificationAPI( void );\r
 static void prvExerciseStreamBufferAPI( void );\r
+static void prvExerciseTimerAPI( void );\r
 \r
 /*\r
  * Just configures any clocks and IO necessary.\r
@@ -196,6 +197,13 @@ static void prvTestMemoryRegions( void );
  */\r
 static void prvTimerCallback( TimerHandle_t xExpiredTimer );\r
 \r
+/*\r
+ * The callback function and a function that is pended used when exercising the\r
+ * timer API.\r
+ */\r
+static void prvPendedFunctionCall( void *pvParameter1, uint32_t ulParameter2 );\r
+static void prvTestTimerCallback( TimerHandle_t xTimer );\r
+\r
 /*-----------------------------------------------------------*/\r
 \r
 /* The handle of the queue used to communicate between tasks and between tasks\r
@@ -763,6 +771,7 @@ static void prvTaskToDelete( void *pvParameters )
        prvExerciseSemaphoreAPI();\r
        prvExerciseTaskNotificationAPI();\r
        prvExerciseStreamBufferAPI();\r
+       prvExerciseTimerAPI();\r
 \r
        /* For code coverage test purposes it is deleted by the Idle task. */\r
        configASSERT( uxTaskGetStackHighWaterMark( NULL ) > 0 );\r
@@ -771,6 +780,72 @@ static void prvTaskToDelete( void *pvParameters )
 }\r
 /*-----------------------------------------------------------*/\r
 \r
+static void prvPendedFunctionCall( void *pvParameter1, uint32_t ulParameter2 )\r
+{\r
+uint32_t *pulCounter = ( uint32_t * ) pvParameter1;\r
+       \r
+       /* Increment the paramater to show the pended function has executed. */\r
+       ( *pulCounter )++;\r
+}\r
+/*-----------------------------------------------------------*/\r
+\r
+static void prvTestTimerCallback( TimerHandle_t xTimer )\r
+{\r
+uint32_t ulTimerID;\r
+       \r
+       /* Increment the timer's ID to show the callback has executed. */\r
+       ulTimerID = ( uint32_t ) pvTimerGetTimerID( xTimer );\r
+       ulTimerID++;\r
+       vTimerSetTimerID( xTimer, ( void * ) ulTimerID );\r
+}\r
+/*-----------------------------------------------------------*/\r
+\r
+static void prvExerciseTimerAPI( void )\r
+{\r
+TimerHandle_t xTimer;\r
+const char * const pcTimerName = "TestTimer";\r
+const TickType_t x10ms = pdMS_TO_TICKS( 3 );\r
+uint32_t ulValueForTesting = 0;\r
+       \r
+       xTimer = xTimerCreate(  pcTimerName, \r
+                                                       x10ms,\r
+                                                       pdFALSE, /* Created as a one shot timer. */\r
+                                                       0,\r
+                                                       prvTestTimerCallback );\r
+       configASSERT( xTimer ); \r
+       configASSERT( xTimerIsTimerActive( xTimer ) == pdFALSE );\r
+       configASSERT( xTimerGetTimerDaemonTaskHandle() != NULL );\r
+       configASSERT( strcmp( pcTimerName, pcTimerGetName( xTimer ) ) == 0 );\r
+       configASSERT( xTimerGetPeriod( xTimer ) == x10ms );\r
+       configASSERT( xTimerGetExpiryTime( xTimer ) == 0 ); /* The timer has been created only. */\r
+       \r
+       /* Pend a function then wait for it to execute.  All it does is increment\r
+       its parameter. */\r
+       xTimerPendFunctionCall( prvPendedFunctionCall, &ulValueForTesting, 0, 0 );\r
+       vTaskDelay( x10ms );\r
+       configASSERT( ulValueForTesting == 1 );\r
+       \r
+       /* Timer was created as a one shot timer.  Its callback just increments the\r
+       timer's ID - so set the ID to 0, let the timer run for a number of timeout\r
+       periods, then check the timer has only executed once. */\r
+       vTimerSetTimerID( xTimer, ( void * ) 0 );\r
+       xTimerStart( xTimer, 0 );\r
+       vTaskDelay( 3UL * x10ms );\r
+       configASSERT( ( ( uint32_t ) ( pvTimerGetTimerID( xTimer ) ) ) == 1UL );\r
+       \r
+       /* Now change the timer to be an autoreload timer and check it executes\r
+       the expected number of times. */\r
+       vTimerSetReloadMode( xTimer, pdTRUE );\r
+       xTimerStart( xTimer, 0 );\r
+       vTaskDelay( 3UL * x10ms );\r
+       configASSERT( ( uint32_t ) ( pvTimerGetTimerID( xTimer ) ) > 3UL );\r
+       configASSERT( xTimerStop( xTimer, 0 ) != pdFAIL );\r
+       \r
+       /* Clean up at the end. */\r
+       xTimerDelete( xTimer, portMAX_DELAY );\r
+}\r
+/*-----------------------------------------------------------*/\r
+\r
 static void prvExerciseStreamBufferAPI( void )\r
 {\r
 uint8_t ucBuffer[ 10 ];\r
@@ -799,19 +874,6 @@ StreamBufferHandle_t xStreamBuffer;
                                                                                  0 );\r
                configASSERT( xReturned == sizeof( xRead ) );\r
                configASSERT( xRead == x );\r
-\r
-               xStreamBufferSendFromISR( xStreamBuffer,\r
-                                                                ( void * ) &x,\r
-                                                                sizeof( x ),\r
-                                                                NULL );\r
-               configASSERT( xReturned == sizeof( x ) );\r
-\r
-               xReturned = xStreamBufferReceiveFromISR( xStreamBuffer,\r
-                                                                                                ( void * ) &xRead,\r
-                                                                                                sizeof( xRead ),\r
-                                                                                                NULL );\r
-               configASSERT( xReturned == sizeof( xRead ) );\r
-               configASSERT( xRead == x );\r
                configASSERT( xStreamBufferIsFull( xStreamBuffer ) == pdFALSE );\r
                configASSERT( xStreamBufferIsEmpty( xStreamBuffer ) == pdTRUE );\r
                configASSERT( xStreamBufferSpacesAvailable( xStreamBuffer ) == sizeof( ucBuffer ) );\r
@@ -865,8 +927,12 @@ volatile uint32_t ulReadData;
        test purposes. */\r
        if( xTaskToDelete != NULL )\r
        {\r
-               vTaskDelete( xTaskToDelete );\r
-               xTaskToDelete = NULL;\r
+               if( eTaskGetState( xTaskToDelete ) == eSuspended )\r
+               {\r
+                       /* The task has finished its tests and can be deleted. */\r
+                       vTaskDelete( xTaskToDelete );\r
+                       xTaskToDelete = NULL;\r
+               }\r
        }\r
 \r
        ( void ) ulReadData;\r