summaryrefslogtreecommitdiff
path: root/FreeRTOS/Demo/ThirdParty/Template/TestRunner.c
diff options
context:
space:
mode:
Diffstat (limited to 'FreeRTOS/Demo/ThirdParty/Template/TestRunner.c')
-rw-r--r--FreeRTOS/Demo/ThirdParty/Template/TestRunner.c589
1 files changed, 589 insertions, 0 deletions
diff --git a/FreeRTOS/Demo/ThirdParty/Template/TestRunner.c b/FreeRTOS/Demo/ThirdParty/Template/TestRunner.c
new file mode 100644
index 000000000..c94ffbbb2
--- /dev/null
+++ b/FreeRTOS/Demo/ThirdParty/Template/TestRunner.c
@@ -0,0 +1,589 @@
+/*
+ * FreeRTOS V202104.00
+ * Copyright (C) 2017 Amazon.com, Inc. or its affiliates. All Rights Reserved.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of
+ * this software and associated documentation files (the "Software"), to deal in
+ * the Software without restriction, including without limitation the rights to
+ * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+ * the Software, and to permit persons to whom the Software is furnished to do so,
+ * subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * http://www.FreeRTOS.org
+ * http://aws.amazon.com/freertos
+ *
+ * 1 tab == 4 spaces!
+ */
+
+/* Standard includes. */
+#include <stdio.h>
+#include <stdlib.h>
+
+/* Kernel includes. */
+#include "FreeRTOS.h"
+#include "task.h"
+#include "queue.h"
+#include "timers.h"
+#include "semphr.h"
+
+/* Various test includes. */
+#include "BlockQ.h"
+#include "integer.h"
+#include "semtest.h"
+#include "PollQ.h"
+#include "GenQTest.h"
+#include "QPeek.h"
+#include "recmutex.h"
+#include "flop.h"
+#include "TimerDemo.h"
+#include "countsem.h"
+#include "death.h"
+#include "QueueSet.h"
+#include "QueueOverwrite.h"
+#include "EventGroupsDemo.h"
+#include "IntSemTest.h"
+#include "IntQueue.h"
+#include "TaskNotify.h"
+#include "TaskNotifyArray.h"
+#include "QueueSetPolling.h"
+#include "StaticAllocation.h"
+#include "blocktim.h"
+#include "AbortDelay.h"
+#include "MessageBufferDemo.h"
+#include "StreamBufferDemo.h"
+#include "StreamBufferInterrupt.h"
+#include "RegTests.h"
+
+/**
+ * Priorities at which the tasks are created.
+ */
+#define testrunnerCHECK_TASK_PRIORITY ( configMAX_PRIORITIES - 2 )
+#define testrunnerQUEUE_POLL_PRIORITY ( tskIDLE_PRIORITY + 1 )
+#define testrunnerSEM_TEST_PRIORITY ( tskIDLE_PRIORITY + 1 )
+#define testrunnerBLOCK_Q_PRIORITY ( tskIDLE_PRIORITY + 2 )
+#define testrunnerCREATOR_TASK_PRIORITY ( tskIDLE_PRIORITY + 3 )
+#define testrunnerFLASH_TASK_PRIORITY ( tskIDLE_PRIORITY + 1 )
+#define testrunnerINTEGER_TASK_PRIORITY ( tskIDLE_PRIORITY )
+#define testrunnerGEN_QUEUE_TASK_PRIORITY ( tskIDLE_PRIORITY )
+#define testrunnerFLOP_TASK_PRIORITY ( tskIDLE_PRIORITY )
+#define testrunnerQUEUE_OVERWRITE_PRIORITY ( tskIDLE_PRIORITY )
+#define testrunnerREGISTER_TEST_PRIORITY ( tskIDLE_PRIORITY )
+
+/**
+ * Period used in timer tests.
+ */
+#define testrunnerTIMER_TEST_PERIOD ( 50 )
+/*-----------------------------------------------------------*/
+
+/**
+ * The variable into which error messages are latched.
+ */
+static char *pcStatusMessage = "No errors";
+/*-----------------------------------------------------------*/
+
+/**
+ * The task that periodically checks that all the standard demo tasks are
+ * still executing and error free.
+ */
+static void prvCheckTask( void *pvParameters );
+/*-----------------------------------------------------------*/
+
+void vStartTests( void )
+{
+ BaseType_t xResult;
+
+ xResult = xTaskCreate( prvCheckTask,
+ "Check",
+ configMINIMAL_STACK_SIZE,
+ NULL,
+ testrunnerCHECK_TASK_PRIORITY,
+ NULL );
+
+ if( xResult == pdPASS )
+ {
+ #if( configSTART_TASK_NOTIFY_TESTS == 1 )
+ {
+ vStartTaskNotifyTask();
+ }
+ #endif /* configSTART_TASK_NOTIFY_TESTS */
+
+ #if( configSTART_TASK_NOTIFY_ARRAY_TESTS == 1 )
+ {
+ vStartTaskNotifyArrayTask();
+ }
+ #endif /* configSTART_TASK_NOTIFY_ARRAY_TESTS */
+
+ #if( configSTART_BLOCKING_QUEUE_TESTS == 1 )
+ {
+ vStartBlockingQueueTasks( testrunnerBLOCK_Q_PRIORITY );
+ }
+ #endif /* configSTART_BLOCKING_QUEUE_TESTS */
+
+ #if( configSTART_SEMAPHORE_TESTS == 1 )
+ {
+ vStartSemaphoreTasks( testrunnerSEM_TEST_PRIORITY );
+ }
+ #endif /* configSTART_SEMAPHORE_TESTS */
+
+ #if( configSTART_POLLED_QUEUE_TESTS == 1 )
+ {
+ vStartPolledQueueTasks( testrunnerQUEUE_POLL_PRIORITY );
+ }
+ #endif /* configSTART_POLLED_QUEUE_TESTS */
+
+ #if( configSTART_INTEGER_MATH_TESTS == 1 )
+ {
+ vStartIntegerMathTasks( testrunnerINTEGER_TASK_PRIORITY );
+ }
+ #endif /* configSTART_INTEGER_MATH_TESTS */
+
+ #if( configSTART_GENERIC_QUEUE_TESTS == 1 )
+ {
+ vStartGenericQueueTasks( testrunnerGEN_QUEUE_TASK_PRIORITY );
+ }
+ #endif /* configSTART_GENERIC_QUEUE_TESTS */
+
+ #if( configSTART_PEEK_QUEUE_TESTS == 1 )
+ {
+ vStartQueuePeekTasks();
+ }
+ #endif /* configSTART_PEEK_QUEUE_TESTS */
+
+ #if( configSTART_MATH_TESTS == 1 )
+ {
+ vStartMathTasks( testrunnerFLOP_TASK_PRIORITY );
+ }
+ #endif /* configSTART_MATH_TESTS */
+
+ #if( configSTART_RECURSIVE_MUTEX_TESTS == 1 )
+ {
+ vStartRecursiveMutexTasks();
+ }
+ #endif /* configSTART_RECURSIVE_MUTEX_TESTS */
+
+ #if( configSTART_COUNTING_SEMAPHORE_TESTS == 1 )
+ {
+ vStartCountingSemaphoreTasks();
+ }
+ #endif /* configSTART_COUNTING_SEMAPHORE_TESTS */
+
+ #if( configSTART_QUEUE_SET_TESTS == 1 )
+ {
+ vStartQueueSetTasks();
+ }
+ #endif /* configSTART_QUEUE_SET_TESTS */
+
+ #if( configSTART_QUEUE_OVERWRITE_TESTS == 1 )
+ {
+ vStartQueueOverwriteTask( testrunnerQUEUE_OVERWRITE_PRIORITY );
+ }
+ #endif /* configSTART_QUEUE_OVERWRITE_TESTS */
+
+ #if( configSTART_EVENT_GROUP_TESTS == 1 )
+ {
+ vStartEventGroupTasks();
+ }
+ #endif /* configSTART_EVENT_GROUP_TESTS */
+
+ #if( configSTART_INTERRUPT_SEMAPHORE_TESTS == 1 )
+ {
+ vStartInterruptSemaphoreTasks();
+ }
+ #endif /* configSTART_INTERRUPT_SEMAPHORE_TESTS */
+
+ #if( configSTART_QUEUE_SET_POLLING_TESTS == 1 )
+ {
+ vStartQueueSetPollingTask();
+ }
+ #endif /* configSTART_QUEUE_SET_POLLING_TESTS */
+
+ #if( configSTART_BLOCK_TIME_TESTS == 1 )
+ {
+ vCreateBlockTimeTasks();
+ }
+ #endif /* configSTART_BLOCK_TIME_TESTS */
+
+ #if( configSTART_ABORT_DELAY_TESTS == 1 )
+ {
+ vCreateAbortDelayTasks();
+ }
+ #endif /* configSTART_ABORT_DELAY_TESTS */
+
+ #if( configSTART_MESSAGE_BUFFER_TESTS == 1 )
+ {
+ vStartMessageBufferTasks( configMINIMAL_STACK_SIZE );
+ }
+ #endif /* configSTART_MESSAGE_BUFFER_TESTS */
+
+ #if(configSTART_STREAM_BUFFER_TESTS == 1 )
+ {
+ vStartStreamBufferTasks();
+ }
+ #endif /* configSTART_STREAM_BUFFER_TESTS */
+
+ #if( configSTART_STREAM_BUFFER_INTERRUPT_TESTS == 1 )
+ {
+ vStartStreamBufferInterruptDemo();
+ }
+ #endif /* configSTART_STREAM_BUFFER_INTERRUPT_TESTS */
+
+ #if( ( configSTART_TIMER_TESTS == 1 ) && ( configUSE_PREEMPTION != 0 ) )
+ {
+ /* Don't expect these tasks to pass when preemption is not used. */
+ vStartTimerDemoTask( testrunnerTIMER_TEST_PERIOD );
+ }
+ #endif /* ( configSTART_TIMER_TESTS == 1 ) && ( configUSE_PREEMPTION != 0 ) */
+
+ #if( configSTART_INTERRUPT_QUEUE_TESTS == 1 )
+ {
+ vStartInterruptQueueTasks();
+ }
+ #endif /* configSTART_INTERRUPT_QUEUE_TESTS */
+
+ #if( configSTART_REGISTER_TESTS == 1 )
+ {
+ vStartRegisterTasks( testrunnerREGISTER_TEST_PRIORITY );
+ }
+ #endif /* configSTART_REGISTER_TESTS */
+
+ #if( configSTART_DELETE_SELF_TESTS == 1 )
+ {
+ /* The suicide tasks must be created last as they need to know how many
+ * tasks were running prior to their creation. This then allows them to
+ * ascertain whether or not the correct/expected number of tasks are
+ * running at any given time. */
+ vCreateSuicidalTasks( testrunnerCREATOR_TASK_PRIORITY );
+ }
+ #endif /* configSTART_DELETE_SELF_TESTS */
+ }
+
+ vTaskStartScheduler();
+}
+/*-----------------------------------------------------------*/
+
+void vApplicationTickHook( void )
+{
+ #if( configSTART_TASK_NOTIFY_TESTS == 1 )
+ {
+ xNotifyTaskFromISR();
+ }
+ #endif /* configSTART_TASK_NOTIFY_TESTS */
+
+ #if( configSTART_TASK_NOTIFY_ARRAY_TESTS == 1 )
+ {
+ xNotifyArrayTaskFromISR();
+ }
+ #endif /* configSTART_TASK_NOTIFY_ARRAY_TESTS */
+
+ #if( configSTART_QUEUE_SET_TESTS == 1 )
+ {
+ vQueueSetAccessQueueSetFromISR();
+ }
+ #endif /* configSTART_QUEUE_SET_TESTS */
+
+ #if( configSTART_QUEUE_OVERWRITE_TESTS == 1 )
+ {
+ vQueueOverwritePeriodicISRDemo();
+ }
+ #endif /* configSTART_QUEUE_OVERWRITE_TESTS */
+
+ #if( configSTART_EVENT_GROUP_TESTS == 1 )
+ {
+ vPeriodicEventGroupsProcessing();
+ }
+ #endif /* configSTART_EVENT_GROUP_TESTS */
+
+ #if( configSTART_INTERRUPT_SEMAPHORE_TESTS == 1 )
+ {
+ vInterruptSemaphorePeriodicTest();
+ }
+ #endif /* configSTART_INTERRUPT_SEMAPHORE_TESTS */
+
+ #if( configSTART_QUEUE_SET_POLLING_TESTS == 1 )
+ {
+ vQueueSetPollingInterruptAccess();
+ }
+ #endif /* configSTART_QUEUE_SET_POLLING_TESTS */
+
+ #if( configSTART_STREAM_BUFFER_TESTS == 1 )
+ {
+ vPeriodicStreamBufferProcessing();
+ }
+ #endif /* configSTART_STREAM_BUFFER_TESTS */
+
+ #if( configSTART_STREAM_BUFFER_INTERRUPT_TESTS == 1 )
+ {
+ vBasicStreamBufferSendFromISR();
+ }
+ #endif /* configSTART_STREAM_BUFFER_INTERRUPT_TESTS */
+
+ #if( ( configSTART_TIMER_TESTS == 1 ) && ( configUSE_PREEMPTION != 0 ) )
+ {
+ /* Only created when preemption is used. */
+ vTimerPeriodicISRTests();
+ }
+ #endif /* ( configSTART_TIMER_TESTS == 1 ) && ( configUSE_PREEMPTION != 0 ) */
+
+ #if( configSTART_INTERRUPT_QUEUE_TESTS == 1 )
+ {
+ portYIELD_FROM_ISR( xFirstTimerHandler() );
+ }
+ #endif /* configSTART_INTERRUPT_QUEUE_TESTS */
+}
+/*-----------------------------------------------------------*/
+
+static void prvCheckTask( void *pvParameters )
+{
+TickType_t xNextWakeTime;
+const TickType_t xCycleFrequency = pdMS_TO_TICKS( 5000UL );
+
+ /* Silence compiler warnings about unused variables. */
+ ( void ) pvParameters;
+
+ /* Initialise xNextWakeTime - this only needs to be done once. */
+ xNextWakeTime = xTaskGetTickCount();
+
+ for( ;; )
+ {
+ /* Place this task in the blocked state until it is time to run again. */
+ vTaskDelayUntil( &xNextWakeTime, xCycleFrequency );
+
+ #if( configSTART_TASK_NOTIFY_TESTS == 1 )
+ {
+ if( xAreTaskNotificationTasksStillRunning() != pdTRUE )
+ {
+ pcStatusMessage = "Error: Notification";
+ }
+ }
+ #endif /* configSTART_TASK_NOTIFY_TESTS */
+
+ #if( configSTART_TASK_NOTIFY_ARRAY_TESTS == 1 )
+ {
+ if( xAreTaskNotificationArrayTasksStillRunning() != pdTRUE )
+ {
+ pcStatusMessage = "Error: Notification Array";
+ }
+ }
+ #endif /* configSTART_TASK_NOTIFY_ARRAY_TESTS */
+
+ #if( configSTART_BLOCKING_QUEUE_TESTS == 1 )
+ {
+ if( xAreBlockingQueuesStillRunning() != pdTRUE )
+ {
+ pcStatusMessage = "Error: BlockQueue";
+ }
+ }
+ #endif /* configSTART_BLOCKING_QUEUE_TESTS */
+
+ #if( configSTART_SEMAPHORE_TESTS == 1 )
+ {
+ if( xAreSemaphoreTasksStillRunning() != pdTRUE )
+ {
+ pcStatusMessage = "Error: SemTest";
+ }
+ }
+ #endif /* configSTART_SEMAPHORE_TESTS */
+
+ #if( configSTART_POLLED_QUEUE_TESTS == 1 )
+ {
+ if( xArePollingQueuesStillRunning() != pdTRUE )
+ {
+ pcStatusMessage = "Error: PollQueue";
+ }
+ }
+ #endif /* configSTART_POLLED_QUEUE_TESTS */
+
+ #if( configSTART_INTEGER_MATH_TESTS == 1 )
+ {
+ if( xAreIntegerMathsTaskStillRunning() != pdTRUE )
+ {
+ pcStatusMessage = "Error: IntMath";
+ }
+ }
+ #endif /* configSTART_INTEGER_MATH_TESTS */
+
+ #if( configSTART_GENERIC_QUEUE_TESTS == 1 )
+ {
+ if( xAreGenericQueueTasksStillRunning() != pdTRUE )
+ {
+ pcStatusMessage = "Error: GenQueue";
+ }
+ }
+ #endif /* configSTART_GENERIC_QUEUE_TESTS */
+
+ #if( configSTART_PEEK_QUEUE_TESTS == 1 )
+ {
+ if( xAreQueuePeekTasksStillRunning() != pdTRUE )
+ {
+ pcStatusMessage = "Error: QueuePeek";
+ }
+ }
+ #endif /* configSTART_PEEK_QUEUE_TESTS */
+
+ #if( configSTART_MATH_TESTS == 1 )
+ {
+ if( xAreMathsTaskStillRunning() != pdPASS )
+ {
+ pcStatusMessage = "Error: Flop";
+ }
+ }
+ #endif /* configSTART_MATH_TESTS */
+
+ #if( configSTART_RECURSIVE_MUTEX_TESTS == 1 )
+ {
+ if( xAreRecursiveMutexTasksStillRunning() != pdTRUE )
+ {
+ pcStatusMessage = "Error: RecMutex";
+ }
+ }
+ #endif /* configSTART_RECURSIVE_MUTEX_TESTS */
+
+ #if( configSTART_COUNTING_SEMAPHORE_TESTS == 1 )
+ {
+ if( xAreCountingSemaphoreTasksStillRunning() != pdTRUE )
+ {
+ pcStatusMessage = "Error: CountSem";
+ }
+ }
+ #endif /* configSTART_COUNTING_SEMAPHORE_TESTS */
+
+ #if( configSTART_QUEUE_SET_TESTS == 1 )
+ {
+ if( xAreQueueSetTasksStillRunning() != pdPASS )
+ {
+ pcStatusMessage = "Error: Queue set";
+ }
+ }
+ #endif /* configSTART_QUEUE_SET_TESTS */
+
+ #if( configSTART_QUEUE_OVERWRITE_TESTS == 1 )
+ {
+ if( xIsQueueOverwriteTaskStillRunning() != pdPASS )
+ {
+ pcStatusMessage = "Error: Queue overwrite";
+ }
+ }
+ #endif /* configSTART_QUEUE_OVERWRITE_TESTS */
+
+ #if( configSTART_EVENT_GROUP_TESTS == 1 )
+ {
+ if( xAreEventGroupTasksStillRunning() != pdTRUE )
+ {
+ pcStatusMessage = "Error: EventGroup";
+ }
+ }
+ #endif /* configSTART_EVENT_GROUP_TESTS */
+
+ #if( configSTART_INTERRUPT_SEMAPHORE_TESTS == 1 )
+ {
+ if( xAreInterruptSemaphoreTasksStillRunning() != pdTRUE )
+ {
+ pcStatusMessage = "Error: IntSem";
+ }
+ }
+ #endif /* configSTART_INTERRUPT_SEMAPHORE_TESTS */
+
+ #if( configSTART_QUEUE_SET_POLLING_TESTS == 1 )
+ {
+ if( xAreQueueSetPollTasksStillRunning() != pdPASS )
+ {
+ pcStatusMessage = "Error: Queue set polling";
+ }
+ }
+ #endif /* configSTART_QUEUE_SET_POLLING_TESTS */
+
+ #if( configSTART_BLOCK_TIME_TESTS == 1 )
+ {
+ if( xAreBlockTimeTestTasksStillRunning() != pdPASS )
+ {
+ pcStatusMessage = "Error: Block time";
+ }
+ }
+ #endif /* configSTART_BLOCK_TIME_TESTS */
+
+ #if( configSTART_ABORT_DELAY_TESTS == 1 )
+ {
+ if( xAreAbortDelayTestTasksStillRunning() != pdPASS )
+ {
+ pcStatusMessage = "Error: Abort delay";
+ }
+ }
+ #endif /* configSTART_ABORT_DELAY_TESTS */
+
+ #if( configSTART_MESSAGE_BUFFER_TESTS == 1 )
+ {
+ if( xAreMessageBufferTasksStillRunning() != pdTRUE )
+ {
+ pcStatusMessage = "Error: MessageBuffer";
+ }
+ }
+ #endif /* configSTART_MESSAGE_BUFFER_TESTS */
+
+ #if( configSTART_STREAM_BUFFER_TESTS == 1 )
+ {
+ if( xAreStreamBufferTasksStillRunning() != pdTRUE )
+ {
+ pcStatusMessage = "Error: StreamBuffer";
+ }
+ }
+ #endif /* configSTART_STREAM_BUFFER_TESTS */
+
+ #if( configSTART_STREAM_BUFFER_INTERRUPT_TESTS == 1 )
+ {
+ if( xIsInterruptStreamBufferDemoStillRunning() != pdPASS )
+ {
+ pcStatusMessage = "Error: Stream buffer interrupt";
+ }
+ }
+ #endif /* configSTART_STREAM_BUFFER_INTERRUPT_TESTS */
+
+ #if( ( configSTART_TIMER_TESTS == 1 ) && ( configUSE_PREEMPTION != 0 ) )
+ {
+ if( xAreTimerDemoTasksStillRunning( xCycleFrequency ) != pdTRUE )
+ {
+ pcStatusMessage = "Error: TimerDemo";
+ }
+ }
+ #endif /* ( configSTART_TIMER_TESTS == 1 ) && ( configUSE_PREEMPTION != 0 ) */
+
+ #if( configSTART_INTERRUPT_QUEUE_TESTS == 1 )
+ {
+ if( xAreIntQueueTasksStillRunning() != pdTRUE )
+ {
+ pcStatusMessage = "Error: IntQueue";
+ }
+ }
+ #endif /* configSTART_INTERRUPT_QUEUE_TESTS */
+
+ #if( configSTART_REGISTER_TESTS == 1 )
+ {
+ if( xAreRegisterTasksStillRunning() != pdTRUE )
+ {
+ pcStatusMessage = "Error: RegTests";
+ }
+ }
+ #endif /* configSTART_REGISTER_TESTS */
+
+ #if( configSTART_DELETE_SELF_TESTS == 1 )
+ {
+ if( xIsCreateTaskStillRunning() != pdTRUE )
+ {
+ pcStatusMessage = "Error: Death";
+ }
+ }
+ #endif /* configSTART_DELETE_SELF_TESTS */
+
+ configPRINTF( ( "%s \r\n", pcStatusMessage ) );
+ }
+}
+/*-----------------------------------------------------------*/