Adjusted the wrap checks in the QueueSet test task.

Added the QueueSet test to the Rowlay Stellaris and SAM4S-EK Studio demos.
Updated the MSVC demo to use heap_4.c.
This commit is contained in:
Richard Barry 2013-02-12 14:30:12 +00:00
parent 0262f4a6cd
commit 9b26071eb8
13 changed files with 92 additions and 60 deletions

View File

@ -99,6 +99,7 @@
#define configQUEUE_REGISTRY_SIZE 10 #define configQUEUE_REGISTRY_SIZE 10
#define configGENERATE_RUN_TIME_STATS 1 #define configGENERATE_RUN_TIME_STATS 1
#define configUSE_MALLOC_FAILED_HOOK 1 #define configUSE_MALLOC_FAILED_HOOK 1
#define configUSE_QUEUE_SETS 1
#define configMAX_PRIORITIES ( 5UL ) #define configMAX_PRIORITIES ( 5UL )
#define configMAX_CO_ROUTINE_PRIORITIES ( 2 ) #define configMAX_CO_ROUTINE_PRIORITIES ( 2 )
@ -132,4 +133,7 @@ to zero. */
version. */ version. */
#define configUSE_PORT_OPTIMISED_TASK_SELECTION 1 #define configUSE_PORT_OPTIMISED_TASK_SELECTION 1
/* Disable interrupts and sit in a null loop if assert is called. */
#define configASSERT( x ) if( ( x == 0 ) ) { taskDISABLE_INTERRUPTS(); for( ;; ); }
#endif /* FREERTOS_CONFIG_H */ #endif /* FREERTOS_CONFIG_H */

View File

@ -58,7 +58,9 @@
<file file_name="../Common/include/death.h"/> <file file_name="../Common/include/death.h"/>
<file file_name="../Common/include/GenQTest.h"/> <file file_name="../Common/include/GenQTest.h"/>
<file file_name="../Common/include/integer.h"/> <file file_name="../Common/include/integer.h"/>
<file file_name="../Common/include/QueueSet.h"/>
</folder> </folder>
<file file_name="../Common/Minimal/QueueSet.c"/>
</folder> </folder>
<folder Name="WEB Server"> <folder Name="WEB Server">
<file file_name="webserver/uIP_Task.c"/> <file file_name="webserver/uIP_Task.c"/>

View File

@ -24,9 +24,7 @@
<ProjectSessionItem path="RTOSDemo" name="unnamed" /> <ProjectSessionItem path="RTOSDemo" name="unnamed" />
<ProjectSessionItem path="RTOSDemo;RTOSDemo" name="unnamed" /> <ProjectSessionItem path="RTOSDemo;RTOSDemo" name="unnamed" />
<ProjectSessionItem path="RTOSDemo;RTOSDemo;Source Files" name="unnamed" /> <ProjectSessionItem path="RTOSDemo;RTOSDemo;Source Files" name="unnamed" />
<ProjectSessionItem path="RTOSDemo;RTOSDemo;Source Files;FreeRTOS" name="unnamed" />
<ProjectSessionItem path="RTOSDemo;RTOSDemo;Source Files;include" name="unnamed" /> <ProjectSessionItem path="RTOSDemo;RTOSDemo;Source Files;include" name="unnamed" />
<ProjectSessionItem path="RTOSDemo;RTOSDemo;Source Files;WEB Server" name="unnamed" />
</Project> </Project>
<Register1> <Register1>
<RegisterWindow openNodes="CPU;CPU/xPSR;CPU/CFBP" binaryNodes="" hiddenNodes="" unsignedNodes="" visibleGroups="CPU" decimalNodes="" octalNodes="" asciiNodes="" /> <RegisterWindow openNodes="CPU;CPU/xPSR;CPU/CFBP" binaryNodes="" hiddenNodes="" unsignedNodes="" visibleGroups="CPU" decimalNodes="" octalNodes="" asciiNodes="" />
@ -57,7 +55,7 @@
<Watches active="0" update="Never" /> <Watches active="0" update="Never" />
</Watch4> </Watch4>
<Files> <Files>
<SessionOpenFile useTextEdit="1" useBinaryEdit="0" codecName="Latin1" x="0" debugPath="C:\E\Dev\FreeRTOS\WorkingCopy\FreeRTOS\Demo\CORTEX_LM3Sxxxx_Rowley\main.c" y="238" path="C:\E\Dev\FreeRTOS\WorkingCopy\FreeRTOS\Demo\CORTEX_LM3Sxxxx_Rowley\main.c" left="0" selected="1" name="unnamed" top="63" /> <SessionOpenFile useTextEdit="1" useBinaryEdit="0" codecName="Latin1" x="0" debugPath="C:\E\Dev\FreeRTOS\WorkingCopy\FreeRTOS\Demo\CORTEX_LM3Sxxxx_Rowley\main.c" y="241" path="C:\E\Dev\FreeRTOS\WorkingCopy\FreeRTOS\Demo\CORTEX_LM3Sxxxx_Rowley\main.c" left="0" selected="1" name="unnamed" top="59" />
</Files> </Files>
<ARMCrossStudioWindow activeProject="RTOSDemo" autoConnectTarget="Luminary USB Debug" debugSearchFileMap="" fileDialogInitialDirectory="C:\E\Dev\FreeRTOS\WorkingCopy\FreeRTOS\Source\portable\MemMang" fileDialogDefaultFilter="*.*" autoConnectCapabilities="388991" debugSearchPath="" buildConfiguration="THUMB Flash Debug" /> <ARMCrossStudioWindow activeProject="RTOSDemo" autoConnectTarget="Luminary USB Debug" debugSearchFileMap="" fileDialogInitialDirectory="C:\E\Dev\FreeRTOS\WorkingCopy\FreeRTOS\Demo\Common\include" fileDialogDefaultFilter="*.*" autoConnectCapabilities="388991" debugSearchPath="" buildConfiguration="THUMB Flash Debug" />
</session> </session>

View File

@ -146,6 +146,7 @@
#include "QPeek.h" #include "QPeek.h"
#include "recmutex.h" #include "recmutex.h"
#include "IntQueue.h" #include "IntQueue.h"
#include "QueueSet.h"
/*-----------------------------------------------------------*/ /*-----------------------------------------------------------*/
@ -262,6 +263,7 @@ int main( void )
vStartQueuePeekTasks(); vStartQueuePeekTasks();
vStartRecursiveMutexTasks(); vStartRecursiveMutexTasks();
vStartInterruptQueueTasks(); vStartInterruptQueueTasks();
vStartQueueSetTasks();
/* Start the tasks defined within this file/specific to this demo. */ /* Start the tasks defined within this file/specific to this demo. */
xTaskCreate( vOLEDTask, ( signed char * ) "OLED", mainOLED_TASK_STACK_SIZE, NULL, tskIDLE_PRIORITY, NULL ); xTaskCreate( vOLEDTask, ( signed char * ) "OLED", mainOLED_TASK_STACK_SIZE, NULL, tskIDLE_PRIORITY, NULL );
@ -366,12 +368,18 @@ portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE;
{ {
xMessage.pcMessage = "ERROR IN INT QUEUE"; xMessage.pcMessage = "ERROR IN INT QUEUE";
} }
else if( xAreQueueSetTasksStillRunning() != pdTRUE )
{
xMessage.pcMessage = "ERROR IN QUEUE SET";
}
/* Send the message to the OLED gatekeeper for display. */ /* Send the message to the OLED gatekeeper for display. */
xHigherPriorityTaskWoken = pdFALSE; xHigherPriorityTaskWoken = pdFALSE;
xQueueSendFromISR( xOLEDQueue, &xMessage, &xHigherPriorityTaskWoken ); xQueueSendFromISR( xOLEDQueue, &xMessage, &xHigherPriorityTaskWoken );
} }
/* Exercise the queue sets from an ISR. */
vQueueSetAccessQueueSetFromISR();
} }
/*-----------------------------------------------------------*/ /*-----------------------------------------------------------*/

View File

@ -93,11 +93,12 @@
extern uint32_t SystemCoreClock; extern uint32_t SystemCoreClock;
#define configUSE_PREEMPTION 1 #define configUSE_PREEMPTION 1
#define configUSE_PORT_OPTIMISED_TASK_SELECTION 1
#define configUSE_IDLE_HOOK 0 #define configUSE_IDLE_HOOK 0
#define configUSE_TICK_HOOK 1 #define configUSE_TICK_HOOK 1
#define configCPU_CLOCK_HZ ( SystemCoreClock ) #define configCPU_CLOCK_HZ ( SystemCoreClock )
#define configTICK_RATE_HZ ( ( portTickType ) 1000 ) #define configTICK_RATE_HZ ( ( portTickType ) 1000 )
#define configMAX_PRIORITIES ( ( unsigned portBASE_TYPE ) 5 ) #define configMAX_PRIORITIES ( 5 )
#define configMINIMAL_STACK_SIZE ( ( unsigned short ) 130 ) #define configMINIMAL_STACK_SIZE ( ( unsigned short ) 130 )
#define configTOTAL_HEAP_SIZE ( ( size_t ) ( 40960 ) ) #define configTOTAL_HEAP_SIZE ( ( size_t ) ( 40960 ) )
#define configMAX_TASK_NAME_LEN ( 10 ) #define configMAX_TASK_NAME_LEN ( 10 )

View File

@ -211,7 +211,7 @@ void vApplicationTickHook( void )
#if ( mainCREATE_SIMPLE_BLINKY_DEMO_ONLY == 0 ) #if ( mainCREATE_SIMPLE_BLINKY_DEMO_ONLY == 0 )
{ {
/* In this case the tick hook is used as part of the queue set test. */ /* In this case the tick hook is used as part of the queue set test. */
vQueueSetWriteToQueueFromISR(); vQueueSetAccessQueueSetFromISR();
} }
#endif /* mainCREATE_SIMPLE_BLINKY_DEMO_ONLY */ #endif /* mainCREATE_SIMPLE_BLINKY_DEMO_ONLY */
} }

View File

@ -116,13 +116,18 @@ queuesetPRIORITY_CHANGE_LOOPS number of values are sent to a queue. */
#define queuesetPRIORITY_CHANGE_LOOPS 100UL #define queuesetPRIORITY_CHANGE_LOOPS 100UL
/* The ISR sends to the queue every queuesetISR_TX_PERIOD ticks. */ /* The ISR sends to the queue every queuesetISR_TX_PERIOD ticks. */
#define queuesetISR_TX_PERIOD 2//( 100UL ) #define queuesetISR_TX_PERIOD ( 100UL )
/* The allowable maximum deviation between a received value and the expected /* The allowable maximum deviation between a received value and the expected
received value. A deviation will occur when data is received from a queue received value. A deviation will occur when data is received from a queue
inside an ISR in between a task receiving from a queue and the task checking inside an ISR in between a task receiving from a queue and the task checking
the received value. */ the received value. */
#define queuesetALLOWABLE_RX_DEVIATION 5 #define queuesetALLOWABLE_RX_DEVIATION 3
/* Ignore values that are at the boundaries of allowable values to make the
testing of limits easier (don't have to deal with wrapping values). */
#define queuesetIGNORED_BOUNDARY ( queuesetALLOWABLE_RX_DEVIATION * 2 )
/* /*
* The task that periodically sends to the queue set. * The task that periodically sends to the queue set.
*/ */
@ -414,18 +419,22 @@ static unsigned long ulExpectedReceivedFromTask = 0, ulExpectedReceivedFromISR =
if( ulReceived >= queuesetINITIAL_ISR_TX_VALUE ) if( ulReceived >= queuesetINITIAL_ISR_TX_VALUE )
{ {
/* The value was sent from the ISR. */ /* The value was sent from the ISR. */
if( ( ulReceived - queuesetINITIAL_ISR_TX_VALUE ) < queuesetALLOWABLE_RX_DEVIATION ) if( ( ulReceived - queuesetINITIAL_ISR_TX_VALUE ) < queuesetIGNORED_BOUNDARY )
{ {
/* The value received is at the lower limit of the expected range. /* The value received is at the lower limit of the expected range.
Don't test it and expect to receive one higher next time. */ Don't test it and expect to receive one higher next time. */
ulExpectedReceivedFromISR++; ulExpectedReceivedFromISR++;
} }
else if( ( ULONG_MAX - ulReceived ) <= queuesetALLOWABLE_RX_DEVIATION ) else if( ( ULONG_MAX - ulReceived ) <= queuesetIGNORED_BOUNDARY )
{ {
/* The value received is at the higher limit of the expected range. /* The value received is at the higher limit of the expected range.
Don't test it and expect to wrap soon. */ Don't test it and expect to wrap soon. */
ulExpectedReceivedFromISR++;
if( ulExpectedReceivedFromISR == 0 )
{
ulExpectedReceivedFromISR = queuesetINITIAL_ISR_TX_VALUE; ulExpectedReceivedFromISR = queuesetINITIAL_ISR_TX_VALUE;
} }
}
else else
{ {
/* Check the value against its expected value range. */ /* Check the value against its expected value range. */
@ -443,18 +452,22 @@ static unsigned long ulExpectedReceivedFromTask = 0, ulExpectedReceivedFromISR =
else else
{ {
/* The value was sent from the Tx task. */ /* The value was sent from the Tx task. */
if( ulReceived < queuesetALLOWABLE_RX_DEVIATION ) if( ulReceived < queuesetIGNORED_BOUNDARY )
{ {
/* The value received is at the lower limit of the expected range. /* The value received is at the lower limit of the expected range.
Don't test it, and expect to receive one higher next time. */ Don't test it, and expect to receive one higher next time. */
ulExpectedReceivedFromTask++; ulExpectedReceivedFromTask++;
} }
else if( ( ( queuesetINITIAL_ISR_TX_VALUE - 1 ) - ulReceived ) <= queuesetALLOWABLE_RX_DEVIATION ) else if( ( ( queuesetINITIAL_ISR_TX_VALUE - 1 ) - ulReceived ) <= queuesetIGNORED_BOUNDARY )
{ {
/* The value received is at the higher limit of the expected range. /* The value received is at the higher limit of the expected range.
Don't test it and expect to wrap soon. */ Don't test it and expect to wrap soon. */
ulExpectedReceivedFromTask++;
if( ulExpectedReceivedFromTask >= queuesetINITIAL_ISR_TX_VALUE )
{
ulExpectedReceivedFromTask = 0; ulExpectedReceivedFromTask = 0;
} }
}
else else
{ {
/* Check the value against its expected value range. */ /* Check the value against its expected value range. */

View File

@ -85,7 +85,7 @@
#define configUSE_TICK_HOOK 1 #define configUSE_TICK_HOOK 1
#define configTICK_RATE_HZ ( 1000 ) /* In this non-real time simulated environment the tick frequency has to be at least a multiple of the Win32 tick frequency, and therefore very slow. */ #define configTICK_RATE_HZ ( 1000 ) /* In this non-real time simulated environment the tick frequency has to be at least a multiple of the Win32 tick frequency, and therefore very slow. */
#define configMINIMAL_STACK_SIZE ( ( unsigned short ) 50 ) /* In this simulated case, the stack only has to hold one small structure as the real stack is part of the win32 thread. */ #define configMINIMAL_STACK_SIZE ( ( unsigned short ) 50 ) /* In this simulated case, the stack only has to hold one small structure as the real stack is part of the win32 thread. */
#define configTOTAL_HEAP_SIZE ( ( size_t ) 0 ) /* This parameter has no effect when heap_3.c is included in the project. */ #define configTOTAL_HEAP_SIZE ( ( size_t ) ( 20 * 1024 ) )
#define configMAX_TASK_NAME_LEN ( 12 ) #define configMAX_TASK_NAME_LEN ( 12 )
#define configUSE_TRACE_FACILITY 1 #define configUSE_TRACE_FACILITY 1
#define configUSE_16_BIT_TICKS 0 #define configUSE_16_BIT_TICKS 0

Binary file not shown.

View File

@ -129,7 +129,7 @@
<ClCompile Include="..\..\..\FreeRTOS-Plus\FreeRTOS-Plus-Trace\trcKernel.c" /> <ClCompile Include="..\..\..\FreeRTOS-Plus\FreeRTOS-Plus-Trace\trcKernel.c" />
<ClCompile Include="..\..\..\FreeRTOS-Plus\FreeRTOS-Plus-Trace\trcPort.c" /> <ClCompile Include="..\..\..\FreeRTOS-Plus\FreeRTOS-Plus-Trace\trcPort.c" />
<ClCompile Include="..\..\..\FreeRTOS-Plus\FreeRTOS-Plus-Trace\trcUser.c" /> <ClCompile Include="..\..\..\FreeRTOS-Plus\FreeRTOS-Plus-Trace\trcUser.c" />
<ClCompile Include="..\..\Source\portable\MemMang\heap_3.c" /> <ClCompile Include="..\..\Source\portable\MemMang\heap_4.c" />
<ClCompile Include="..\..\Source\timers.c" /> <ClCompile Include="..\..\Source\timers.c" />
<ClCompile Include="..\Common\Minimal\BlockQ.c" /> <ClCompile Include="..\Common\Minimal\BlockQ.c" />
<ClCompile Include="..\Common\Minimal\blocktim.c" /> <ClCompile Include="..\Common\Minimal\blocktim.c" />

View File

@ -49,9 +49,6 @@
<ClCompile Include="..\..\Source\tasks.c"> <ClCompile Include="..\..\Source\tasks.c">
<Filter>FreeRTOS Source\Source</Filter> <Filter>FreeRTOS Source\Source</Filter>
</ClCompile> </ClCompile>
<ClCompile Include="..\..\Source\portable\MemMang\heap_3.c">
<Filter>FreeRTOS Source\Source</Filter>
</ClCompile>
<ClCompile Include="..\..\Source\portable\MSVC-MingW\port.c"> <ClCompile Include="..\..\Source\portable\MSVC-MingW\port.c">
<Filter>FreeRTOS Source\Source\Portable</Filter> <Filter>FreeRTOS Source\Source\Portable</Filter>
</ClCompile> </ClCompile>
@ -115,6 +112,9 @@
<ClCompile Include="Run-time-stats-utils.c"> <ClCompile Include="Run-time-stats-utils.c">
<Filter>Demo App Source</Filter> <Filter>Demo App Source</Filter>
</ClCompile> </ClCompile>
<ClCompile Include="..\..\Source\portable\MemMang\heap_4.c">
<Filter>FreeRTOS Source\Source\Portable</Filter>
</ClCompile>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ClInclude Include="FreeRTOSConfig.h"> <ClInclude Include="FreeRTOSConfig.h">

View File

@ -96,6 +96,7 @@
/* Standard includes. */ /* Standard includes. */
#include <stdio.h> #include <stdio.h>
#include <stdlib.h>
/* Kernel includes. */ /* Kernel includes. */
#include <FreeRTOS.h> #include <FreeRTOS.h>
@ -292,6 +293,7 @@ const unsigned long ulMSToSleep = 15;
xTaskHandle xIdleTaskHandle, xTimerTaskHandle, xTestTask; xTaskHandle xIdleTaskHandle, xTimerTaskHandle, xTestTask;
signed char *pcTaskName; signed char *pcTaskName;
const unsigned char ucConstQueueNumber = 0xaaU, ucConstTaskNumber = 0x55U; const unsigned char ucConstQueueNumber = 0xaaU, ucConstTaskNumber = 0x55U;
void *pvAllocated;
/* These three functions are only meant for use by trace code, and not for /* These three functions are only meant for use by trace code, and not for
direct use from application code, hence their prototypes are not in queue.h. */ direct use from application code, hence their prototypes are not in queue.h. */
@ -386,13 +388,17 @@ extern unsigned portBASE_TYPE uxTaskGetTaskNumber( xTaskHandle xTask );
} }
} }
} }
/* Exercise heap_4 a bit. The malloc failed hook will trap failed
allocations so there is no need to test here. */
pvAllocated = pvPortMalloc( ( rand() % 100 ) + 1 );
vPortFree( pvAllocated );
} }
/*-----------------------------------------------------------*/ /*-----------------------------------------------------------*/
void vApplicationMallocFailedHook( void ) void vApplicationMallocFailedHook( void )
{ {
/* Can be implemented if required, but probably not required in this vAssertCalled();
environment and running this demo. */
} }
/*-----------------------------------------------------------*/ /*-----------------------------------------------------------*/