/*\r
- FreeRTOS V8.0.1 - Copyright (C) 2014 Real Time Engineers Ltd. \r
+ FreeRTOS V8.2.3 - Copyright (C) 2015 Real Time Engineers Ltd.\r
All rights reserved\r
\r
VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION.\r
\r
- ***************************************************************************\r
- * *\r
- * FreeRTOS provides completely free yet professionally developed, *\r
- * robust, strictly quality controlled, supported, and cross *\r
- * platform software that has become a de facto standard. *\r
- * *\r
- * Help yourself get started quickly and support the FreeRTOS *\r
- * project by purchasing a FreeRTOS tutorial book, reference *\r
- * manual, or both from: http://www.FreeRTOS.org/Documentation *\r
- * *\r
- * Thank you! *\r
- * *\r
- ***************************************************************************\r
-\r
This file is part of the FreeRTOS distribution.\r
\r
FreeRTOS is free software; you can redistribute it and/or modify it under\r
the terms of the GNU General Public License (version 2) as published by the\r
- Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception.\r
+ Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception.\r
\r
+ ***************************************************************************\r
>>! NOTE: The modification to the GPL is included to allow you to !<<\r
>>! distribute a combined work that includes FreeRTOS without being !<<\r
>>! obliged to provide the source code for proprietary components !<<\r
>>! outside of the FreeRTOS kernel. !<<\r
+ ***************************************************************************\r
\r
FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY\r
WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS\r
- FOR A PARTICULAR PURPOSE. Full license text is available from the following\r
+ FOR A PARTICULAR PURPOSE. Full license text is available on the following\r
link: http://www.freertos.org/a00114.html\r
\r
- 1 tab == 4 spaces!\r
-\r
***************************************************************************\r
* *\r
- * Having a problem? Start by reading the FAQ "My application does *\r
- * not run, what could be wrong?" *\r
+ * FreeRTOS provides completely free yet professionally developed, *\r
+ * robust, strictly quality controlled, supported, and cross *\r
+ * platform software that is more than just the market leader, it *\r
+ * is the industry's de facto standard. *\r
* *\r
- * http://www.FreeRTOS.org/FAQHelp.html *\r
+ * Help yourself get started quickly while simultaneously helping *\r
+ * to support the FreeRTOS project by purchasing a FreeRTOS *\r
+ * tutorial book, reference manual, or both: *\r
+ * http://www.FreeRTOS.org/Documentation *\r
* *\r
***************************************************************************\r
\r
- http://www.FreeRTOS.org - Documentation, books, training, latest versions,\r
- license and Real Time Engineers Ltd. contact details.\r
+ http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading\r
+ the FAQ page "My application does not run, what could be wrong?". Have you\r
+ defined configASSERT()?\r
+\r
+ http://www.FreeRTOS.org/support - In return for receiving this top quality\r
+ embedded software for free we request you assist our global community by\r
+ participating in the support forum.\r
+\r
+ http://www.FreeRTOS.org/training - Investing in training allows your team to\r
+ be as productive as possible as early as possible. Now you can receive\r
+ FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers\r
+ Ltd, and the world's leading authority on the world's leading RTOS.\r
\r
http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products,\r
including FreeRTOS+Trace - an indispensable productivity tool, a DOS\r
compatible FAT file system, and our tiny thread aware UDP/IP stack.\r
\r
- http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High\r
- Integrity Systems to sell under the OpenRTOS brand. Low cost OpenRTOS\r
- licenses offer ticketed support, indemnification and middleware.\r
+ http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate.\r
+ Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS.\r
+\r
+ http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High\r
+ Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS\r
+ licenses offer ticketed support, indemnification and commercial middleware.\r
\r
http://www.SafeRTOS.com - High Integrity Systems also provide a safety\r
engineered and independently SIL3 certified version for use in safety and\r
* range of the value being used to distinguish between the two message\r
* sources.\r
*/\r
-static void prvCheckReceivedValue( unsigned long ulReceived );\r
+static void prvCheckReceivedValue( uint32_t ulReceived );\r
\r
/*\r
* For purposes of test coverage, functions that read from and write to a\r
* Checks a value received from a queue falls within the range of expected\r
* values.\r
*/\r
-static portBASE_TYPE prvCheckReceivedValueWithinExpectedRange( unsigned long ulReceived, unsigned long ulExpectedReceived );\r
+static BaseType_t prvCheckReceivedValueWithinExpectedRange( uint32_t ulReceived, uint32_t ulExpectedReceived );\r
\r
/*\r
* Increase test coverage by occasionally change the priorities of the two tasks\r
* Local pseudo random number seed and return functions. Used to avoid calls\r
* to the standard library.\r
*/\r
-static unsigned long prvRand( void );\r
-static void prvSRand( unsigned long ulSeed );\r
+static uint32_t prvRand( void );\r
+static void prvSRand( uint32_t ulSeed );\r
\r
/*-----------------------------------------------------------*/\r
\r
\r
/* Counts how many times each queue in the set is used to ensure all the\r
queues are used. */\r
-static unsigned long ulQueueUsedCounter[ queuesetNUM_QUEUES_IN_SET ] = { 0 };\r
+static uint32_t ulQueueUsedCounter[ queuesetNUM_QUEUES_IN_SET ] = { 0 };\r
\r
/* The handle of the queue set to which the queues are added. */\r
static QueueSetHandle_t xQueueSet;\r
xAreQueueSetTasksStillRunning() returns pdPASS if the value of\r
ulCycleCounter has changed between consecutive calls, and pdFALSE if\r
ulCycleCounter has stopped incrementing (indicating an error condition). */\r
-static volatile unsigned long ulCycleCounter = 0UL;\r
+static volatile uint32_t ulCycleCounter = 0UL;\r
\r
/* Set to pdFAIL if an error is detected by any queue set task.\r
ulCycleCounter will only be incremented if xQueueSetTasksSatus equals pdPASS. */\r
-static volatile portBASE_TYPE xQueueSetTasksStatus = pdPASS;\r
+static volatile BaseType_t xQueueSetTasksStatus = pdPASS;\r
\r
/* Just a flag to let the function that writes to a queue from an ISR know that\r
the queues are setup and can be used. */\r
-static volatile portBASE_TYPE xSetupComplete = pdFALSE;\r
+static volatile BaseType_t xSetupComplete = pdFALSE;\r
\r
/* The value sent to the queue from the ISR is file scope so the\r
xAreQueeuSetTasksStillRunning() function can check it is incrementing as\r
expected. */\r
-static volatile unsigned long ulISRTxValue = queuesetINITIAL_ISR_TX_VALUE;\r
+static volatile uint32_t ulISRTxValue = queuesetINITIAL_ISR_TX_VALUE;\r
\r
/* Used by the pseudo random number generator. */\r
-static unsigned long ulNextRand = 0;\r
+static uint32_t ulNextRand = 0;\r
\r
/* The task handles are stored so their priorities can be changed. */\r
TaskHandle_t xQueueSetSendingTask, xQueueSetReceivingTask;\r
}\r
/*-----------------------------------------------------------*/\r
\r
-portBASE_TYPE xAreQueueSetTasksStillRunning( void )\r
+BaseType_t xAreQueueSetTasksStillRunning( void )\r
{\r
-static unsigned long ulLastCycleCounter, ulLastISRTxValue = 0;\r
-static unsigned long ulLastQueueUsedCounter[ queuesetNUM_QUEUES_IN_SET ] = { 0 };\r
-portBASE_TYPE xReturn = pdPASS, x;\r
+static uint32_t ulLastCycleCounter, ulLastISRTxValue = 0;\r
+static uint32_t ulLastQueueUsedCounter[ queuesetNUM_QUEUES_IN_SET ] = { 0 };\r
+BaseType_t xReturn = pdPASS, x;\r
\r
if( ulLastCycleCounter == ulCycleCounter )\r
{\r
\r
static void prvQueueSetSendingTask( void *pvParameters )\r
{\r
-unsigned long ulTaskTxValue = 0, ulQueueToWriteTo;\r
+uint32_t ulTaskTxValue = 0, ulQueueToWriteTo;\r
QueueHandle_t xQueueInUse;\r
\r
/* Remove compiler warning about the unused parameter. */\r
( void ) pvParameters;\r
\r
/* Seed mini pseudo random number generator. */\r
- prvSRand( ( unsigned long ) &ulTaskTxValue );\r
+ prvSRand( ( uint32_t ) &ulTaskTxValue );\r
\r
for( ;; )\r
{\r
\r
static void prvChangeRelativePriorities( void )\r
{\r
-static unsigned portBASE_TYPE ulLoops = 0;\r
+static UBaseType_t ulLoops = 0;\r
static eRelativePriorities ePriorities = eEqualPriority;\r
\r
/* Occasionally change the task priority relative to the priority of\r
\r
static void prvQueueSetReceivingTask( void *pvParameters )\r
{\r
-unsigned long ulReceived;\r
+uint32_t ulReceived;\r
QueueHandle_t xActivatedQueue;\r
+TickType_t xBlockTime;\r
\r
/* Remove compiler warnings. */\r
( void ) pvParameters;\r
\r
for( ;; )\r
{\r
+ /* For test coverage reasons, the block time is dependent on the\r
+ priority of this task - which changes during the test. When the task\r
+ is at the idle priority it polls the queue set. */\r
+ if( uxTaskPriorityGet( NULL ) == tskIDLE_PRIORITY )\r
+ {\r
+ xBlockTime = 0;\r
+ }\r
+ else\r
+ {\r
+ xBlockTime = portMAX_DELAY;\r
+ }\r
+\r
/* Wait for a message to arrive on one of the queues in the set. */\r
- xActivatedQueue = xQueueSelectFromSet( xQueueSet, portMAX_DELAY );\r
- configASSERT( xActivatedQueue );\r
+ xActivatedQueue = xQueueSelectFromSet( xQueueSet, portMAX_DELAY ); \r
\r
if( xActivatedQueue == NULL )\r
{\r
- /* This should not happen as an infinite delay was used. */\r
- xQueueSetTasksStatus = pdFAIL;\r
+ if( xBlockTime != 0 )\r
+ {\r
+ /* This should not happen as an infinite delay was used. */\r
+ xQueueSetTasksStatus = pdFAIL;\r
+ }\r
}\r
else\r
{\r
prvCheckReceivedValue( ulReceived );\r
}\r
taskEXIT_CRITICAL();\r
- }\r
\r
- if( xQueueSetTasksStatus == pdPASS )\r
- {\r
- ulCycleCounter++;\r
+ if( xQueueSetTasksStatus == pdPASS )\r
+ {\r
+ ulCycleCounter++;\r
+ }\r
}\r
}\r
}\r
\r
void vQueueSetAccessQueueSetFromISR( void )\r
{\r
-static unsigned long ulCallCount = 0;\r
+static uint32_t ulCallCount = 0;\r
\r
/* xSetupComplete is set to pdTRUE when the queues have been created and\r
are available for use. */\r
}\r
/*-----------------------------------------------------------*/\r
\r
-static void prvCheckReceivedValue( unsigned long ulReceived )\r
+static void prvCheckReceivedValue( uint32_t ulReceived )\r
{\r
-static unsigned long ulExpectedReceivedFromTask = 0, ulExpectedReceivedFromISR = queuesetINITIAL_ISR_TX_VALUE;\r
+static uint32_t ulExpectedReceivedFromTask = 0, ulExpectedReceivedFromISR = queuesetINITIAL_ISR_TX_VALUE;\r
\r
/* Values are received in tasks and interrupts. It is likely that the\r
receiving task will sometimes get preempted by the receiving interrupt\r
}\r
/*-----------------------------------------------------------*/\r
\r
-static portBASE_TYPE prvCheckReceivedValueWithinExpectedRange( unsigned long ulReceived, unsigned long ulExpectedReceived )\r
+static BaseType_t prvCheckReceivedValueWithinExpectedRange( uint32_t ulReceived, uint32_t ulExpectedReceived )\r
{\r
-portBASE_TYPE xReturn = pdPASS;\r
+BaseType_t xReturn = pdPASS;\r
\r
if( ulReceived > ulExpectedReceived )\r
{\r
static void prvReceiveFromQueueInSetFromISR( void )\r
{\r
QueueSetMemberHandle_t xActivatedQueue;\r
-unsigned long ulReceived;\r
+uint32_t ulReceived;\r
\r
/* See if any of the queues in the set contain data. */\r
xActivatedQueue = xQueueSelectFromSetFromISR( xQueueSet );\r
\r
static void prvSendToQueueInSetFromISR( void )\r
{\r
-static portBASE_TYPE xQueueToWriteTo = 0;\r
+static BaseType_t xQueueToWriteTo = 0;\r
\r
if( xQueueSendFromISR( xQueues[ xQueueToWriteTo ], ( void * ) &ulISRTxValue, NULL ) == pdPASS )\r
{\r
ulISRTxValue++;\r
\r
- /* If the Tx value has wrapped then set it back to its\r
- initial value. */\r
+ /* If the Tx value has wrapped then set it back to its initial value. */\r
if( ulISRTxValue == 0UL )\r
{\r
ulISRTxValue = queuesetINITIAL_ISR_TX_VALUE;\r
\r
static void prvSetupTest( void )\r
{\r
-portBASE_TYPE x;\r
-unsigned long ulValueToSend = 0;\r
+BaseType_t x;\r
+uint32_t ulValueToSend = 0;\r
\r
/* Ensure the queues are created and the queue set configured before the\r
sending task is unsuspended.\r
for( x = 0; x < queuesetNUM_QUEUES_IN_SET; x++ )\r
{\r
/* Create the queue and add it to the set. The queue is just holding\r
- unsigned long value. */\r
- xQueues[ x ] = xQueueCreate( queuesetQUEUE_LENGTH, sizeof( unsigned long ) );\r
+ uint32_t value. */\r
+ xQueues[ x ] = xQueueCreate( queuesetQUEUE_LENGTH, sizeof( uint32_t ) );\r
configASSERT( xQueues[ x ] );\r
if( xQueueAddToSet( xQueues[ x ], xQueueSet ) != pdPASS )\r
{\r
}\r
/*-----------------------------------------------------------*/\r
\r
-static unsigned long prvRand( void )\r
+static uint32_t prvRand( void )\r
{\r
ulNextRand = ( ulNextRand * 1103515245UL ) + 12345UL;\r
return ( ulNextRand / 65536UL ) % 32768UL;\r
}\r
/*-----------------------------------------------------------*/\r
\r
-static void prvSRand( unsigned long ulSeed )\r
+static void prvSRand( uint32_t ulSeed )\r
{\r
ulNextRand = ulSeed;\r
}\r