]> git.sur5r.net Git - freertos/blobdiff - FreeRTOS/Demo/CORTEX_MPU_Simulator_Keil_GCC/main.c
Ensure both one-shot and auto-reload are written consistently with a hyphen in comments.
[freertos] / FreeRTOS / Demo / CORTEX_MPU_Simulator_Keil_GCC / main.c
index 02442c448330e14c02e43e01f555157a0a4adf5a..185ac7ba7069c4a171adbca7c17b914d63ab14b3 100644 (file)
@@ -1,6 +1,6 @@
 /*\r
- * FreeRTOS Kernel V10.0.0\r
- * Copyright (C) 2017 Amazon.com, Inc. or its affiliates.  All Rights Reserved.\r
+ * FreeRTOS Kernel V10.2.1\r
+ * Copyright (C) 2019 Amazon.com, Inc. or its affiliates.  All Rights Reserved.\r
  *\r
  * Permission is hereby granted, free of charge, to any person obtaining a copy of\r
  * this software and associated documentation files (the "Software"), to deal in\r
@@ -10,8 +10,7 @@
  * subject to the following conditions:\r
  *\r
  * The above copyright notice and this permission notice shall be included in all\r
- * copies or substantial portions of the Software. If you wish to use our Amazon\r
- * FreeRTOS name, please do so in a fair use way that does not cause confusion.\r
+ * copies or substantial portions of the Software.\r
  *\r
  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r
  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\r
@@ -159,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
@@ -197,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
@@ -764,13 +771,83 @@ 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
+       configASSERT( uxTaskGetStackHighWaterMark2( NULL ) > 0 );\r
+       /* Run time stats are not being gathered - this is just to exercise\r
+       API. */\r
+       configASSERT( xTaskGetIdleRunTimeCounter() == 0 ); \r
        vTaskSuspend( NULL );\r
 }\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 x3ms = pdMS_TO_TICKS( 3 );\r
+uint32_t ulValueForTesting = 0;\r
+\r
+       xTimer = xTimerCreate(  pcTimerName,\r
+                                                       x3ms,\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 ) == x3ms );\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( x3ms );\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 * x3ms );\r
+       configASSERT( ( ( uint32_t ) ( pvTimerGetTimerID( xTimer ) ) ) == 1UL );\r
+\r
+       /* Now change the timer to be an auto-reload timer and check it executes\r
+       the expected number of times. */\r
+       vTimerSetReloadMode( xTimer, pdTRUE );\r
+       xTimerStart( xTimer, 0 );\r
+       vTaskDelay( 3UL * x3ms );\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 +876,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 +929,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
@@ -1058,7 +1126,7 @@ void vApplicationMallocFailedHook( void )
 }\r
 /*-----------------------------------------------------------*/\r
 \r
-static void prvTimerCallback( TaskHandle_t xExpiredTimer )\r
+static void prvTimerCallback( TimerHandle_t xExpiredTimer )\r
 {\r
 uint32_t ulCount;\r
 \r