mirror of
https://github.com/FreeRTOS/FreeRTOS-Kernel.git
synced 2025-12-23 11:09:28 -05:00
Demo: Exit on Error with Qemu MPS2 Full Demo (#642)
This commit is contained in:
parent
141070a2eb
commit
d663850e1b
3 changed files with 54 additions and 7 deletions
|
|
@ -64,7 +64,6 @@ else
|
||||||
CFLAGS := -DmainCREATE_SIMPLE_BLINKY_DEMO_ONLY=1
|
CFLAGS := -DmainCREATE_SIMPLE_BLINKY_DEMO_ONLY=1
|
||||||
endif
|
endif
|
||||||
|
|
||||||
#DEFINES := -DprojCOVERAGE_TEST -DQEMU_SOC_MPS2 -DHEAP3
|
|
||||||
DEFINES := -DQEMU_SOC_MPS2 -DHEAP3
|
DEFINES := -DQEMU_SOC_MPS2 -DHEAP3
|
||||||
|
|
||||||
LDFLAGS = -T ./scripts/mps2_m3.ld -specs=nano.specs --specs=rdimon.specs -lc -lrdimon
|
LDFLAGS = -T ./scripts/mps2_m3.ld -specs=nano.specs --specs=rdimon.specs -lc -lrdimon
|
||||||
|
|
|
||||||
|
|
@ -26,12 +26,14 @@
|
||||||
|
|
||||||
#ifndef CONSOLE_H
|
#ifndef CONSOLE_H
|
||||||
#define CONSOLE_H
|
#define CONSOLE_H
|
||||||
|
|
||||||
/* *INDENT-OFF* */
|
/* *INDENT-OFF* */
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
/* *INDENT-ON* */
|
/* *INDENT-ON* */
|
||||||
|
|
||||||
|
|
||||||
/*-----------------------------------------------------------
|
/*-----------------------------------------------------------
|
||||||
* Example console I/O wrappers.
|
* Example console I/O wrappers.
|
||||||
*----------------------------------------------------------*/
|
*----------------------------------------------------------*/
|
||||||
|
|
|
||||||
|
|
@ -186,6 +186,9 @@ static void prvReloadModeTestTimerCallback( TimerHandle_t xTimer );
|
||||||
/* The variable into which error messages are latched. */
|
/* The variable into which error messages are latched. */
|
||||||
static char * pcStatusMessage = "OK: No errors";
|
static char * pcStatusMessage = "OK: No errors";
|
||||||
|
|
||||||
|
int xErrorCount = 1;
|
||||||
|
|
||||||
|
|
||||||
/* This semaphore is created purely to test using the vSemaphoreDelete() and
|
/* This semaphore is created purely to test using the vSemaphoreDelete() and
|
||||||
* semaphore tracing API functions. It has no other purpose. */
|
* semaphore tracing API functions. It has no other purpose. */
|
||||||
static SemaphoreHandle_t xMutexToDelete = NULL;
|
static SemaphoreHandle_t xMutexToDelete = NULL;
|
||||||
|
|
@ -287,6 +290,7 @@ static void prvCheckTask( void * pvParameters )
|
||||||
if( xAreTimerDemoTasksStillRunning( xCycleFrequency ) != pdTRUE )
|
if( xAreTimerDemoTasksStillRunning( xCycleFrequency ) != pdTRUE )
|
||||||
{
|
{
|
||||||
pcStatusMessage = "Error: TimerDemo";
|
pcStatusMessage = "Error: TimerDemo";
|
||||||
|
xErrorCount++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
@ -294,106 +298,132 @@ static void prvCheckTask( void * pvParameters )
|
||||||
if( xAreStreamBufferTasksStillRunning() != pdTRUE )
|
if( xAreStreamBufferTasksStillRunning() != pdTRUE )
|
||||||
{
|
{
|
||||||
pcStatusMessage = "Error: StreamBuffer";
|
pcStatusMessage = "Error: StreamBuffer";
|
||||||
|
xErrorCount++;
|
||||||
}
|
}
|
||||||
else if( xAreMessageBufferTasksStillRunning() != pdTRUE )
|
else if( xAreMessageBufferTasksStillRunning() != pdTRUE )
|
||||||
{
|
{
|
||||||
pcStatusMessage = "Error: MessageBuffer";
|
pcStatusMessage = "Error: MessageBuffer";
|
||||||
|
xErrorCount++;
|
||||||
}
|
}
|
||||||
else if( xAreTaskNotificationTasksStillRunning() != pdTRUE )
|
else if( xAreTaskNotificationTasksStillRunning() != pdTRUE )
|
||||||
{
|
{
|
||||||
pcStatusMessage = "Error: Notification";
|
pcStatusMessage = "Error: Notification";
|
||||||
|
xErrorCount++;
|
||||||
}
|
}
|
||||||
/* else if( xAreTaskNotificationArrayTasksStillRunning() != pdTRUE ) */
|
/*
|
||||||
/* { */
|
* else if( xAreTaskNotificationArrayTasksStillRunning() != pdTRUE )
|
||||||
/* pcStatusMessage = "Error: NotificationArray"; */
|
* {
|
||||||
/* } */
|
* pcStatusMessage = "Error: NotificationArray";
|
||||||
|
* }
|
||||||
|
*/
|
||||||
else if( xAreInterruptSemaphoreTasksStillRunning() != pdTRUE )
|
else if( xAreInterruptSemaphoreTasksStillRunning() != pdTRUE )
|
||||||
{
|
{
|
||||||
pcStatusMessage = "Error: IntSem";
|
pcStatusMessage = "Error: IntSem";
|
||||||
|
xErrorCount++;
|
||||||
}
|
}
|
||||||
else if( xAreEventGroupTasksStillRunning() != pdTRUE )
|
else if( xAreEventGroupTasksStillRunning() != pdTRUE )
|
||||||
{
|
{
|
||||||
pcStatusMessage = "Error: EventGroup";
|
pcStatusMessage = "Error: EventGroup";
|
||||||
|
xErrorCount++;
|
||||||
}
|
}
|
||||||
else if( xAreIntegerMathsTaskStillRunning() != pdTRUE )
|
else if( xAreIntegerMathsTaskStillRunning() != pdTRUE )
|
||||||
{
|
{
|
||||||
pcStatusMessage = "Error: IntMath";
|
pcStatusMessage = "Error: IntMath";
|
||||||
|
xErrorCount++;
|
||||||
}
|
}
|
||||||
else if( xAreGenericQueueTasksStillRunning() != pdTRUE )
|
else if( xAreGenericQueueTasksStillRunning() != pdTRUE )
|
||||||
{
|
{
|
||||||
pcStatusMessage = "Error: GenQueue";
|
pcStatusMessage = "Error: GenQueue";
|
||||||
|
xErrorCount++;
|
||||||
}
|
}
|
||||||
else if( xAreQueuePeekTasksStillRunning() != pdTRUE )
|
else if( xAreQueuePeekTasksStillRunning() != pdTRUE )
|
||||||
{
|
{
|
||||||
pcStatusMessage = "Error: QueuePeek";
|
pcStatusMessage = "Error: QueuePeek";
|
||||||
|
xErrorCount++;
|
||||||
}
|
}
|
||||||
else if( xAreBlockingQueuesStillRunning() != pdTRUE )
|
else if( xAreBlockingQueuesStillRunning() != pdTRUE )
|
||||||
{
|
{
|
||||||
pcStatusMessage = "Error: BlockQueue";
|
pcStatusMessage = "Error: BlockQueue";
|
||||||
|
xErrorCount++;
|
||||||
}
|
}
|
||||||
else if( xAreSemaphoreTasksStillRunning() != pdTRUE )
|
else if( xAreSemaphoreTasksStillRunning() != pdTRUE )
|
||||||
{
|
{
|
||||||
pcStatusMessage = "Error: SemTest";
|
pcStatusMessage = "Error: SemTest";
|
||||||
|
xErrorCount++;
|
||||||
}
|
}
|
||||||
else if( xArePollingQueuesStillRunning() != pdTRUE )
|
else if( xArePollingQueuesStillRunning() != pdTRUE )
|
||||||
{
|
{
|
||||||
pcStatusMessage = "Error: PollQueue";
|
pcStatusMessage = "Error: PollQueue";
|
||||||
|
xErrorCount++;
|
||||||
}
|
}
|
||||||
else if( xAreMathsTaskStillRunning() != pdPASS )
|
else if( xAreMathsTaskStillRunning() != pdPASS )
|
||||||
{
|
{
|
||||||
pcStatusMessage = "Error: Flop";
|
pcStatusMessage = "Error: Flop";
|
||||||
|
xErrorCount++;
|
||||||
}
|
}
|
||||||
else if( xAreRecursiveMutexTasksStillRunning() != pdTRUE )
|
else if( xAreRecursiveMutexTasksStillRunning() != pdTRUE )
|
||||||
{
|
{
|
||||||
pcStatusMessage = "Error: RecMutex";
|
pcStatusMessage = "Error: RecMutex";
|
||||||
|
xErrorCount++;
|
||||||
}
|
}
|
||||||
else if( xAreCountingSemaphoreTasksStillRunning() != pdTRUE )
|
else if( xAreCountingSemaphoreTasksStillRunning() != pdTRUE )
|
||||||
{
|
{
|
||||||
pcStatusMessage = "Error: CountSem";
|
pcStatusMessage = "Error: CountSem";
|
||||||
|
xErrorCount++;
|
||||||
}
|
}
|
||||||
else if( xIsCreateTaskStillRunning() != pdTRUE )
|
else if( xIsCreateTaskStillRunning() != pdTRUE )
|
||||||
{
|
{
|
||||||
pcStatusMessage = "Error: Death";
|
pcStatusMessage = "Error: Death";
|
||||||
|
xErrorCount++;
|
||||||
}
|
}
|
||||||
else if( xAreDynamicPriorityTasksStillRunning() != pdPASS )
|
else if( xAreDynamicPriorityTasksStillRunning() != pdPASS )
|
||||||
{
|
{
|
||||||
pcStatusMessage = "Error: Dynamic";
|
pcStatusMessage = "Error: Dynamic";
|
||||||
|
xErrorCount++;
|
||||||
}
|
}
|
||||||
else if( xIsQueueOverwriteTaskStillRunning() != pdPASS )
|
else if( xIsQueueOverwriteTaskStillRunning() != pdPASS )
|
||||||
{
|
{
|
||||||
pcStatusMessage = "Error: Queue overwrite";
|
pcStatusMessage = "Error: Queue overwrite";
|
||||||
|
xErrorCount++;
|
||||||
}
|
}
|
||||||
else if( xAreBlockTimeTestTasksStillRunning() != pdPASS )
|
else if( xAreBlockTimeTestTasksStillRunning() != pdPASS )
|
||||||
{
|
{
|
||||||
pcStatusMessage = "Error: Block time";
|
pcStatusMessage = "Error: Block time";
|
||||||
|
xErrorCount++;
|
||||||
}
|
}
|
||||||
else if( xAreAbortDelayTestTasksStillRunning() != pdPASS )
|
else if( xAreAbortDelayTestTasksStillRunning() != pdPASS )
|
||||||
{
|
{
|
||||||
pcStatusMessage = "Error: Abort delay";
|
pcStatusMessage = "Error: Abort delay";
|
||||||
|
xErrorCount++;
|
||||||
}
|
}
|
||||||
else if( xIsInterruptStreamBufferDemoStillRunning() != pdPASS )
|
else if( xIsInterruptStreamBufferDemoStillRunning() != pdPASS )
|
||||||
{
|
{
|
||||||
pcStatusMessage = "Error: Stream buffer interrupt";
|
pcStatusMessage = "Error: Stream buffer interrupt";
|
||||||
|
xErrorCount++;
|
||||||
}
|
}
|
||||||
else if( xAreMessageBufferAMPTasksStillRunning() != pdPASS )
|
else if( xAreMessageBufferAMPTasksStillRunning() != pdPASS )
|
||||||
{
|
{
|
||||||
pcStatusMessage = "Error: Message buffer AMP";
|
pcStatusMessage = "Error: Message buffer AMP";
|
||||||
|
xErrorCount++;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if ( configUSE_QUEUE_SETS == 1 )
|
#if ( configUSE_QUEUE_SETS == 1 )
|
||||||
else if( xAreQueueSetTasksStillRunning() != pdPASS )
|
else if( xAreQueueSetTasksStillRunning() != pdPASS )
|
||||||
{
|
{
|
||||||
pcStatusMessage = "Error: Queue set";
|
pcStatusMessage = "Error: Queue set";
|
||||||
|
xErrorCount++;
|
||||||
}
|
}
|
||||||
else if( xAreQueueSetPollTasksStillRunning() != pdPASS )
|
else if( xAreQueueSetPollTasksStillRunning() != pdPASS )
|
||||||
{
|
{
|
||||||
pcStatusMessage = "Error: Queue set polling";
|
pcStatusMessage = "Error: Queue set polling";
|
||||||
|
xErrorCount++;
|
||||||
}
|
}
|
||||||
#endif
|
#endif /* if ( configUSE_QUEUE_SETS == 1 ) */
|
||||||
|
|
||||||
#if ( configSUPPORT_STATIC_ALLOCATION == 1 )
|
#if ( configSUPPORT_STATIC_ALLOCATION == 1 )
|
||||||
else if( xAreStaticAllocationTasksStillRunning() != pdPASS )
|
else if( xAreStaticAllocationTasksStillRunning() != pdPASS )
|
||||||
{
|
{
|
||||||
|
xErrorCount++;
|
||||||
pcStatusMessage = "Error: Static allocation";
|
pcStatusMessage = "Error: Static allocation";
|
||||||
}
|
}
|
||||||
#endif /* configSUPPORT_STATIC_ALLOCATION */
|
#endif /* configSUPPORT_STATIC_ALLOCATION */
|
||||||
|
|
@ -402,6 +432,10 @@ static void prvCheckTask( void * pvParameters )
|
||||||
pcStatusMessage,
|
pcStatusMessage,
|
||||||
xTaskGetTickCount() );
|
xTaskGetTickCount() );
|
||||||
|
|
||||||
|
if( xErrorCount != 0 )
|
||||||
|
{
|
||||||
|
exit( 1 );
|
||||||
|
}
|
||||||
/* Reset the error condition */
|
/* Reset the error condition */
|
||||||
pcStatusMessage = "OK: No errors";
|
pcStatusMessage = "OK: No errors";
|
||||||
}
|
}
|
||||||
|
|
@ -483,6 +517,7 @@ void vFullDemoIdleFunction( void )
|
||||||
if( xRunCodeCoverageTestAdditions() != pdPASS )
|
if( xRunCodeCoverageTestAdditions() != pdPASS )
|
||||||
{
|
{
|
||||||
pcStatusMessage = "Code coverage additions failed.\r\n";
|
pcStatusMessage = "Code coverage additions failed.\r\n";
|
||||||
|
xErrorCount++;
|
||||||
}
|
}
|
||||||
|
|
||||||
if( ( xTaskGetTickCount() - configINITIAL_TICK_COUNT ) >= xMaxRunTime )
|
if( ( xTaskGetTickCount() - configINITIAL_TICK_COUNT ) >= xMaxRunTime )
|
||||||
|
|
@ -649,6 +684,7 @@ static void prvDemonstrateTaskStateAndHandleGetFunctions( void )
|
||||||
if( xTaskGetCurrentTaskHandle() != xIdleTaskHandle )
|
if( xTaskGetCurrentTaskHandle() != xIdleTaskHandle )
|
||||||
{
|
{
|
||||||
pcStatusMessage = "Error: Returned idle task handle was incorrect";
|
pcStatusMessage = "Error: Returned idle task handle was incorrect";
|
||||||
|
xErrorCount++;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Check the same handle is obtained using the idle task's name. First try
|
/* Check the same handle is obtained using the idle task's name. First try
|
||||||
|
|
@ -656,11 +692,13 @@ static void prvDemonstrateTaskStateAndHandleGetFunctions( void )
|
||||||
if( xTaskGetHandle( "Idle" ) == xIdleTaskHandle )
|
if( xTaskGetHandle( "Idle" ) == xIdleTaskHandle )
|
||||||
{
|
{
|
||||||
pcStatusMessage = "Error: Returned handle for name Idle was incorrect";
|
pcStatusMessage = "Error: Returned handle for name Idle was incorrect";
|
||||||
|
xErrorCount++;
|
||||||
}
|
}
|
||||||
|
|
||||||
if( xTaskGetHandle( "IDLE" ) != xIdleTaskHandle )
|
if( xTaskGetHandle( "IDLE" ) != xIdleTaskHandle )
|
||||||
{
|
{
|
||||||
pcStatusMessage = "Error: Returned handle for name Idle was incorrect";
|
pcStatusMessage = "Error: Returned handle for name Idle was incorrect";
|
||||||
|
xErrorCount++;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Check the timer task handle was returned correctly. */
|
/* Check the timer task handle was returned correctly. */
|
||||||
|
|
@ -669,23 +707,27 @@ static void prvDemonstrateTaskStateAndHandleGetFunctions( void )
|
||||||
if( strcmp( pcTaskName, "Tmr Svc" ) != 0 )
|
if( strcmp( pcTaskName, "Tmr Svc" ) != 0 )
|
||||||
{
|
{
|
||||||
pcStatusMessage = "Error: Returned timer task handle was incorrect";
|
pcStatusMessage = "Error: Returned timer task handle was incorrect";
|
||||||
|
xErrorCount++;
|
||||||
}
|
}
|
||||||
|
|
||||||
if( xTaskGetHandle( "Tmr Svc" ) != xTimerTaskHandle )
|
if( xTaskGetHandle( "Tmr Svc" ) != xTimerTaskHandle )
|
||||||
{
|
{
|
||||||
pcStatusMessage = "Error: Returned handle for name Tmr Svc was incorrect";
|
pcStatusMessage = "Error: Returned handle for name Tmr Svc was incorrect";
|
||||||
|
xErrorCount++;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* This task is running, make sure it's state is returned as running. */
|
/* This task is running, make sure it's state is returned as running. */
|
||||||
if( eTaskStateGet( xIdleTaskHandle ) != eRunning )
|
if( eTaskStateGet( xIdleTaskHandle ) != eRunning )
|
||||||
{
|
{
|
||||||
pcStatusMessage = "Error: Returned idle task state was incorrect";
|
pcStatusMessage = "Error: Returned idle task state was incorrect";
|
||||||
|
xErrorCount++;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* If this task is running, then the timer task must be blocked. */
|
/* If this task is running, then the timer task must be blocked. */
|
||||||
if( eTaskStateGet( xTimerTaskHandle ) != eBlocked )
|
if( eTaskStateGet( xTimerTaskHandle ) != eBlocked )
|
||||||
{
|
{
|
||||||
pcStatusMessage = "Error: Returned timer task state was incorrect";
|
pcStatusMessage = "Error: Returned timer task state was incorrect";
|
||||||
|
xErrorCount++;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Also with the vTaskGetInfo() function. */
|
/* Also with the vTaskGetInfo() function. */
|
||||||
|
|
@ -702,6 +744,7 @@ static void prvDemonstrateTaskStateAndHandleGetFunctions( void )
|
||||||
( xTaskInfo.xHandle != xTimerTaskHandle ) )
|
( xTaskInfo.xHandle != xTimerTaskHandle ) )
|
||||||
{
|
{
|
||||||
pcStatusMessage = "Error: vTaskGetInfo() returned incorrect information about the timer task";
|
pcStatusMessage = "Error: vTaskGetInfo() returned incorrect information about the timer task";
|
||||||
|
xErrorCount++;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Other tests that should only be performed once follow. The test task
|
/* Other tests that should only be performed once follow. The test task
|
||||||
|
|
@ -719,6 +762,7 @@ static void prvDemonstrateTaskStateAndHandleGetFunctions( void )
|
||||||
if( eTaskStateGet( xTestTask ) != eReady )
|
if( eTaskStateGet( xTestTask ) != eReady )
|
||||||
{
|
{
|
||||||
pcStatusMessage = "Error: Returned test task state was incorrect 1";
|
pcStatusMessage = "Error: Returned test task state was incorrect 1";
|
||||||
|
xErrorCount++;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Now suspend the test task and check its state is reported correctly. */
|
/* Now suspend the test task and check its state is reported correctly. */
|
||||||
|
|
@ -727,6 +771,7 @@ static void prvDemonstrateTaskStateAndHandleGetFunctions( void )
|
||||||
if( eTaskStateGet( xTestTask ) != eSuspended )
|
if( eTaskStateGet( xTestTask ) != eSuspended )
|
||||||
{
|
{
|
||||||
pcStatusMessage = "Error: Returned test task state was incorrect 2";
|
pcStatusMessage = "Error: Returned test task state was incorrect 2";
|
||||||
|
xErrorCount++;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Now delete the task and check its state is reported correctly. */
|
/* Now delete the task and check its state is reported correctly. */
|
||||||
|
|
@ -735,6 +780,7 @@ static void prvDemonstrateTaskStateAndHandleGetFunctions( void )
|
||||||
if( eTaskStateGet( xTestTask ) != eDeleted )
|
if( eTaskStateGet( xTestTask ) != eDeleted )
|
||||||
{
|
{
|
||||||
pcStatusMessage = "Error: Returned test task state was incorrect 3";
|
pcStatusMessage = "Error: Returned test task state was incorrect 3";
|
||||||
|
xErrorCount++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -871,7 +917,7 @@ static void prvDemonstrateChangingTimerReloadMode( void * pvParameters )
|
||||||
|
|
||||||
xTimer = xTimerCreate( pcTimerName,
|
xTimer = xTimerCreate( pcTimerName,
|
||||||
x100ms,
|
x100ms,
|
||||||
pdFALSE, /* Created as a one-shot timer. */
|
pdFALSE, /* Created as a one-shot timer. */
|
||||||
0,
|
0,
|
||||||
prvReloadModeTestTimerCallback );
|
prvReloadModeTestTimerCallback );
|
||||||
configASSERT( xTimer );
|
configASSERT( xTimer );
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue