Please see my note book http://mbed.org/users/kenjiArai/notebook/freertos-on-mbed-board-with-mbed-cloud-ide--never-/

This is too old.
Below is another FreeRTOS on mbed.
http://developer.mbed.org/users/rgrover1/code/FreeRTOS/
I don't know it works well or not.
I have not evaluated it.

Committer:
kenjiArai
Date:
Sat Jan 01 11:17:45 2011 +0000
Revision:
0:d4960fcea8ff

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
kenjiArai 0:d4960fcea8ff 1 /*
kenjiArai 0:d4960fcea8ff 2 FreeRTOS V6.0.3 - Copyright (C) 2010 Real Time Engineers Ltd.
kenjiArai 0:d4960fcea8ff 3
kenjiArai 0:d4960fcea8ff 4 ***************************************************************************
kenjiArai 0:d4960fcea8ff 5 * *
kenjiArai 0:d4960fcea8ff 6 * If you are: *
kenjiArai 0:d4960fcea8ff 7 * *
kenjiArai 0:d4960fcea8ff 8 * + New to FreeRTOS, *
kenjiArai 0:d4960fcea8ff 9 * + Wanting to learn FreeRTOS or multitasking in general quickly *
kenjiArai 0:d4960fcea8ff 10 * + Looking for basic training, *
kenjiArai 0:d4960fcea8ff 11 * + Wanting to improve your FreeRTOS skills and productivity *
kenjiArai 0:d4960fcea8ff 12 * *
kenjiArai 0:d4960fcea8ff 13 * then take a look at the FreeRTOS eBook *
kenjiArai 0:d4960fcea8ff 14 * *
kenjiArai 0:d4960fcea8ff 15 * "Using the FreeRTOS Real Time Kernel - a Practical Guide" *
kenjiArai 0:d4960fcea8ff 16 * http://www.FreeRTOS.org/Documentation *
kenjiArai 0:d4960fcea8ff 17 * *
kenjiArai 0:d4960fcea8ff 18 * A pdf reference manual is also available. Both are usually delivered *
kenjiArai 0:d4960fcea8ff 19 * to your inbox within 20 minutes to two hours when purchased between 8am *
kenjiArai 0:d4960fcea8ff 20 * and 8pm GMT (although please allow up to 24 hours in case of *
kenjiArai 0:d4960fcea8ff 21 * exceptional circumstances). Thank you for your support! *
kenjiArai 0:d4960fcea8ff 22 * *
kenjiArai 0:d4960fcea8ff 23 ***************************************************************************
kenjiArai 0:d4960fcea8ff 24
kenjiArai 0:d4960fcea8ff 25 This file is part of the FreeRTOS distribution.
kenjiArai 0:d4960fcea8ff 26
kenjiArai 0:d4960fcea8ff 27 FreeRTOS is free software; you can redistribute it and/or modify it under
kenjiArai 0:d4960fcea8ff 28 the terms of the GNU General Public License (version 2) as published by the
kenjiArai 0:d4960fcea8ff 29 Free Software Foundation AND MODIFIED BY the FreeRTOS exception.
kenjiArai 0:d4960fcea8ff 30 ***NOTE*** The exception to the GPL is included to allow you to distribute
kenjiArai 0:d4960fcea8ff 31 a combined work that includes FreeRTOS without being obliged to provide the
kenjiArai 0:d4960fcea8ff 32 source code for proprietary components outside of the FreeRTOS kernel.
kenjiArai 0:d4960fcea8ff 33 FreeRTOS is distributed in the hope that it will be useful, but WITHOUT
kenjiArai 0:d4960fcea8ff 34 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
kenjiArai 0:d4960fcea8ff 35 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
kenjiArai 0:d4960fcea8ff 36 more details. You should have received a copy of the GNU General Public
kenjiArai 0:d4960fcea8ff 37 License and the FreeRTOS license exception along with FreeRTOS; if not it
kenjiArai 0:d4960fcea8ff 38 can be viewed here: http://www.freertos.org/a00114.html and also obtained
kenjiArai 0:d4960fcea8ff 39 by writing to Richard Barry, contact details for whom are available on the
kenjiArai 0:d4960fcea8ff 40 FreeRTOS WEB site.
kenjiArai 0:d4960fcea8ff 41
kenjiArai 0:d4960fcea8ff 42 1 tab == 4 spaces!
kenjiArai 0:d4960fcea8ff 43
kenjiArai 0:d4960fcea8ff 44 http://www.FreeRTOS.org - Documentation, latest information, license and
kenjiArai 0:d4960fcea8ff 45 contact details.
kenjiArai 0:d4960fcea8ff 46
kenjiArai 0:d4960fcea8ff 47 http://www.SafeRTOS.com - A version that is certified for use in safety
kenjiArai 0:d4960fcea8ff 48 critical systems.
kenjiArai 0:d4960fcea8ff 49
kenjiArai 0:d4960fcea8ff 50 http://www.OpenRTOS.com - Commercial support, development, porting,
kenjiArai 0:d4960fcea8ff 51 licensing and training services.
kenjiArai 0:d4960fcea8ff 52 */
kenjiArai 0:d4960fcea8ff 53
kenjiArai 0:d4960fcea8ff 54
kenjiArai 0:d4960fcea8ff 55 /*
kenjiArai 0:d4960fcea8ff 56 * Tests the behaviour when data is peeked from a queue when there are
kenjiArai 0:d4960fcea8ff 57 * multiple tasks blocked on the queue.
kenjiArai 0:d4960fcea8ff 58 */
kenjiArai 0:d4960fcea8ff 59
kenjiArai 0:d4960fcea8ff 60
kenjiArai 0:d4960fcea8ff 61 #include <stdlib.h>
kenjiArai 0:d4960fcea8ff 62
kenjiArai 0:d4960fcea8ff 63 /* Scheduler include files. */
kenjiArai 0:d4960fcea8ff 64 #include "FreeRTOS.h"
kenjiArai 0:d4960fcea8ff 65 #include "task.h"
kenjiArai 0:d4960fcea8ff 66 #include "queue.h"
kenjiArai 0:d4960fcea8ff 67 #include "semphr.h"
kenjiArai 0:d4960fcea8ff 68
kenjiArai 0:d4960fcea8ff 69 /* Demo program include files. */
kenjiArai 0:d4960fcea8ff 70 #include "QPeek.h"
kenjiArai 0:d4960fcea8ff 71
kenjiArai 0:d4960fcea8ff 72 #define qpeekQUEUE_LENGTH ( 5 )
kenjiArai 0:d4960fcea8ff 73 #define qpeekNO_BLOCK ( 0 )
kenjiArai 0:d4960fcea8ff 74 #define qpeekSHORT_DELAY ( 10 )
kenjiArai 0:d4960fcea8ff 75
kenjiArai 0:d4960fcea8ff 76 #define qpeekLOW_PRIORITY ( tskIDLE_PRIORITY + 0 )
kenjiArai 0:d4960fcea8ff 77 #define qpeekMEDIUM_PRIORITY ( tskIDLE_PRIORITY + 1 )
kenjiArai 0:d4960fcea8ff 78 #define qpeekHIGH_PRIORITY ( tskIDLE_PRIORITY + 2 )
kenjiArai 0:d4960fcea8ff 79 #define qpeekHIGHEST_PRIORITY ( tskIDLE_PRIORITY + 3 )
kenjiArai 0:d4960fcea8ff 80
kenjiArai 0:d4960fcea8ff 81 /*-----------------------------------------------------------*/
kenjiArai 0:d4960fcea8ff 82
kenjiArai 0:d4960fcea8ff 83 /*
kenjiArai 0:d4960fcea8ff 84 * The following three tasks are used to demonstrate the peeking behaviour.
kenjiArai 0:d4960fcea8ff 85 * Each task is given a different priority to demonstrate the order in which
kenjiArai 0:d4960fcea8ff 86 * tasks are woken as data is peeked from a queue.
kenjiArai 0:d4960fcea8ff 87 */
kenjiArai 0:d4960fcea8ff 88 static void prvLowPriorityPeekTask( void *pvParameters );
kenjiArai 0:d4960fcea8ff 89 static void prvMediumPriorityPeekTask( void *pvParameters );
kenjiArai 0:d4960fcea8ff 90 static void prvHighPriorityPeekTask( void *pvParameters );
kenjiArai 0:d4960fcea8ff 91 static void prvHighestPriorityPeekTask( void *pvParameters );
kenjiArai 0:d4960fcea8ff 92
kenjiArai 0:d4960fcea8ff 93 /*-----------------------------------------------------------*/
kenjiArai 0:d4960fcea8ff 94
kenjiArai 0:d4960fcea8ff 95 /* Flag that will be latched to pdTRUE should any unexpected behaviour be
kenjiArai 0:d4960fcea8ff 96 detected in any of the tasks. */
kenjiArai 0:d4960fcea8ff 97 static volatile portBASE_TYPE xErrorDetected = pdFALSE;
kenjiArai 0:d4960fcea8ff 98
kenjiArai 0:d4960fcea8ff 99 /* Counter that is incremented on each cycle of a test. This is used to
kenjiArai 0:d4960fcea8ff 100 detect a stalled task - a test that is no longer running. */
kenjiArai 0:d4960fcea8ff 101 static volatile unsigned portLONG ulLoopCounter = 0;
kenjiArai 0:d4960fcea8ff 102
kenjiArai 0:d4960fcea8ff 103 /* Handles to the test tasks. */
kenjiArai 0:d4960fcea8ff 104 xTaskHandle xMediumPriorityTask, xHighPriorityTask, xHighestPriorityTask;
kenjiArai 0:d4960fcea8ff 105 /*-----------------------------------------------------------*/
kenjiArai 0:d4960fcea8ff 106
kenjiArai 0:d4960fcea8ff 107 void vStartQueuePeekTasks( void )
kenjiArai 0:d4960fcea8ff 108 {
kenjiArai 0:d4960fcea8ff 109 xQueueHandle xQueue;
kenjiArai 0:d4960fcea8ff 110
kenjiArai 0:d4960fcea8ff 111 /* Create the queue that we are going to use for the test/demo. */
kenjiArai 0:d4960fcea8ff 112 xQueue = xQueueCreate( qpeekQUEUE_LENGTH, sizeof( unsigned portLONG ) );
kenjiArai 0:d4960fcea8ff 113
kenjiArai 0:d4960fcea8ff 114 /* vQueueAddToRegistry() adds the queue to the queue registry, if one is
kenjiArai 0:d4960fcea8ff 115 in use. The queue registry is provided as a means for kernel aware
kenjiArai 0:d4960fcea8ff 116 debuggers to locate queues and has no purpose if a kernel aware debugger
kenjiArai 0:d4960fcea8ff 117 is not being used. The call to vQueueAddToRegistry() will be removed
kenjiArai 0:d4960fcea8ff 118 by the pre-processor if configQUEUE_REGISTRY_SIZE is not defined or is
kenjiArai 0:d4960fcea8ff 119 defined to be less than 1. */
kenjiArai 0:d4960fcea8ff 120 vQueueAddToRegistry( xQueue, ( signed portCHAR * ) "QPeek_Test_Queue" );
kenjiArai 0:d4960fcea8ff 121
kenjiArai 0:d4960fcea8ff 122 /* Create the demo tasks and pass it the queue just created. We are
kenjiArai 0:d4960fcea8ff 123 passing the queue handle by value so it does not matter that it is declared
kenjiArai 0:d4960fcea8ff 124 on the stack here. */
kenjiArai 0:d4960fcea8ff 125 xTaskCreate( prvLowPriorityPeekTask, ( signed portCHAR * )"PeekL", configMINIMAL_STACK_SIZE, ( void * ) xQueue, qpeekLOW_PRIORITY, NULL );
kenjiArai 0:d4960fcea8ff 126 xTaskCreate( prvMediumPriorityPeekTask, ( signed portCHAR * )"PeekM", configMINIMAL_STACK_SIZE, ( void * ) xQueue, qpeekMEDIUM_PRIORITY, &xMediumPriorityTask );
kenjiArai 0:d4960fcea8ff 127 xTaskCreate( prvHighPriorityPeekTask, ( signed portCHAR * )"PeekH1", configMINIMAL_STACK_SIZE, ( void * ) xQueue, qpeekHIGH_PRIORITY, &xHighPriorityTask );
kenjiArai 0:d4960fcea8ff 128 xTaskCreate( prvHighestPriorityPeekTask, ( signed portCHAR * )"PeekH2", configMINIMAL_STACK_SIZE, ( void * ) xQueue, qpeekHIGHEST_PRIORITY, &xHighestPriorityTask );
kenjiArai 0:d4960fcea8ff 129 }
kenjiArai 0:d4960fcea8ff 130 /*-----------------------------------------------------------*/
kenjiArai 0:d4960fcea8ff 131
kenjiArai 0:d4960fcea8ff 132 static void prvHighestPriorityPeekTask( void *pvParameters )
kenjiArai 0:d4960fcea8ff 133 {
kenjiArai 0:d4960fcea8ff 134 xQueueHandle xQueue = ( xQueueHandle ) pvParameters;
kenjiArai 0:d4960fcea8ff 135 unsigned portLONG ulValue;
kenjiArai 0:d4960fcea8ff 136
kenjiArai 0:d4960fcea8ff 137 #ifdef USE_STDIO
kenjiArai 0:d4960fcea8ff 138 {
kenjiArai 0:d4960fcea8ff 139 void vPrintDisplayMessage( const portCHAR * const * ppcMessageToSend );
kenjiArai 0:d4960fcea8ff 140
kenjiArai 0:d4960fcea8ff 141 const portCHAR * const pcTaskStartMsg = "Queue peek test started.\r\n";
kenjiArai 0:d4960fcea8ff 142
kenjiArai 0:d4960fcea8ff 143 /* Queue a message for printing to say the task has started. */
kenjiArai 0:d4960fcea8ff 144 vPrintDisplayMessage( &pcTaskStartMsg );
kenjiArai 0:d4960fcea8ff 145 }
kenjiArai 0:d4960fcea8ff 146 #endif
kenjiArai 0:d4960fcea8ff 147
kenjiArai 0:d4960fcea8ff 148 for( ;; )
kenjiArai 0:d4960fcea8ff 149 {
kenjiArai 0:d4960fcea8ff 150 /* Try peeking from the queue. The queue should be empty so we will
kenjiArai 0:d4960fcea8ff 151 block, allowing the high priority task to execute. */
kenjiArai 0:d4960fcea8ff 152 if( xQueuePeek( xQueue, &ulValue, portMAX_DELAY ) != pdPASS )
kenjiArai 0:d4960fcea8ff 153 {
kenjiArai 0:d4960fcea8ff 154 /* We expected to have received something by the time we unblock. */
kenjiArai 0:d4960fcea8ff 155 xErrorDetected = pdTRUE;
kenjiArai 0:d4960fcea8ff 156 }
kenjiArai 0:d4960fcea8ff 157
kenjiArai 0:d4960fcea8ff 158 /* When we reach here the high and medium priority tasks should still
kenjiArai 0:d4960fcea8ff 159 be blocked on the queue. We unblocked because the low priority task
kenjiArai 0:d4960fcea8ff 160 wrote a value to the queue, which we should have peeked. Peeking the
kenjiArai 0:d4960fcea8ff 161 data (rather than receiving it) will leave the data on the queue, so
kenjiArai 0:d4960fcea8ff 162 the high priority task should then have also been unblocked, but not
kenjiArai 0:d4960fcea8ff 163 yet executed. */
kenjiArai 0:d4960fcea8ff 164 if( ulValue != 0x11223344 )
kenjiArai 0:d4960fcea8ff 165 {
kenjiArai 0:d4960fcea8ff 166 /* We did not receive the expected value. */
kenjiArai 0:d4960fcea8ff 167 xErrorDetected = pdTRUE;
kenjiArai 0:d4960fcea8ff 168 }
kenjiArai 0:d4960fcea8ff 169
kenjiArai 0:d4960fcea8ff 170 if( uxQueueMessagesWaiting( xQueue ) != 1 )
kenjiArai 0:d4960fcea8ff 171 {
kenjiArai 0:d4960fcea8ff 172 /* The message should have been left on the queue. */
kenjiArai 0:d4960fcea8ff 173 xErrorDetected = pdTRUE;
kenjiArai 0:d4960fcea8ff 174 }
kenjiArai 0:d4960fcea8ff 175
kenjiArai 0:d4960fcea8ff 176 /* Now we are going to actually receive the data, so when the high
kenjiArai 0:d4960fcea8ff 177 priority task runs it will find the queue empty and return to the
kenjiArai 0:d4960fcea8ff 178 blocked state. */
kenjiArai 0:d4960fcea8ff 179 ulValue = 0;
kenjiArai 0:d4960fcea8ff 180 if( xQueueReceive( xQueue, &ulValue, qpeekNO_BLOCK ) != pdPASS )
kenjiArai 0:d4960fcea8ff 181 {
kenjiArai 0:d4960fcea8ff 182 /* We expected to receive the value. */
kenjiArai 0:d4960fcea8ff 183 xErrorDetected = pdTRUE;
kenjiArai 0:d4960fcea8ff 184 }
kenjiArai 0:d4960fcea8ff 185
kenjiArai 0:d4960fcea8ff 186 if( ulValue != 0x11223344 )
kenjiArai 0:d4960fcea8ff 187 {
kenjiArai 0:d4960fcea8ff 188 /* We did not receive the expected value - which should have been
kenjiArai 0:d4960fcea8ff 189 the same value as was peeked. */
kenjiArai 0:d4960fcea8ff 190 xErrorDetected = pdTRUE;
kenjiArai 0:d4960fcea8ff 191 }
kenjiArai 0:d4960fcea8ff 192
kenjiArai 0:d4960fcea8ff 193 /* Now we will block again as the queue is once more empty. The low
kenjiArai 0:d4960fcea8ff 194 priority task can then execute again. */
kenjiArai 0:d4960fcea8ff 195 if( xQueuePeek( xQueue, &ulValue, portMAX_DELAY ) != pdPASS )
kenjiArai 0:d4960fcea8ff 196 {
kenjiArai 0:d4960fcea8ff 197 /* We expected to have received something by the time we unblock. */
kenjiArai 0:d4960fcea8ff 198 xErrorDetected = pdTRUE;
kenjiArai 0:d4960fcea8ff 199 }
kenjiArai 0:d4960fcea8ff 200
kenjiArai 0:d4960fcea8ff 201 /* When we get here the low priority task should have again written to the
kenjiArai 0:d4960fcea8ff 202 queue. */
kenjiArai 0:d4960fcea8ff 203 if( ulValue != 0x01234567 )
kenjiArai 0:d4960fcea8ff 204 {
kenjiArai 0:d4960fcea8ff 205 /* We did not receive the expected value. */
kenjiArai 0:d4960fcea8ff 206 xErrorDetected = pdTRUE;
kenjiArai 0:d4960fcea8ff 207 }
kenjiArai 0:d4960fcea8ff 208
kenjiArai 0:d4960fcea8ff 209 if( uxQueueMessagesWaiting( xQueue ) != 1 )
kenjiArai 0:d4960fcea8ff 210 {
kenjiArai 0:d4960fcea8ff 211 /* The message should have been left on the queue. */
kenjiArai 0:d4960fcea8ff 212 xErrorDetected = pdTRUE;
kenjiArai 0:d4960fcea8ff 213 }
kenjiArai 0:d4960fcea8ff 214
kenjiArai 0:d4960fcea8ff 215 /* We only peeked the data, so suspending ourselves now should enable
kenjiArai 0:d4960fcea8ff 216 the high priority task to also peek the data. The high priority task
kenjiArai 0:d4960fcea8ff 217 will have been unblocked when we peeked the data as we left the data
kenjiArai 0:d4960fcea8ff 218 in the queue. */
kenjiArai 0:d4960fcea8ff 219 vTaskSuspend( NULL );
kenjiArai 0:d4960fcea8ff 220
kenjiArai 0:d4960fcea8ff 221
kenjiArai 0:d4960fcea8ff 222
kenjiArai 0:d4960fcea8ff 223 /* This time we are going to do the same as the above test, but the
kenjiArai 0:d4960fcea8ff 224 high priority task is going to receive the data, rather than peek it.
kenjiArai 0:d4960fcea8ff 225 This means that the medium priority task should never peek the value. */
kenjiArai 0:d4960fcea8ff 226 if( xQueuePeek( xQueue, &ulValue, portMAX_DELAY ) != pdPASS )
kenjiArai 0:d4960fcea8ff 227 {
kenjiArai 0:d4960fcea8ff 228 xErrorDetected = pdTRUE;
kenjiArai 0:d4960fcea8ff 229 }
kenjiArai 0:d4960fcea8ff 230
kenjiArai 0:d4960fcea8ff 231 if( ulValue != 0xaabbaabb )
kenjiArai 0:d4960fcea8ff 232 {
kenjiArai 0:d4960fcea8ff 233 xErrorDetected = pdTRUE;
kenjiArai 0:d4960fcea8ff 234 }
kenjiArai 0:d4960fcea8ff 235
kenjiArai 0:d4960fcea8ff 236 vTaskSuspend( NULL );
kenjiArai 0:d4960fcea8ff 237 }
kenjiArai 0:d4960fcea8ff 238 }
kenjiArai 0:d4960fcea8ff 239 /*-----------------------------------------------------------*/
kenjiArai 0:d4960fcea8ff 240
kenjiArai 0:d4960fcea8ff 241 static void prvHighPriorityPeekTask( void *pvParameters )
kenjiArai 0:d4960fcea8ff 242 {
kenjiArai 0:d4960fcea8ff 243 xQueueHandle xQueue = ( xQueueHandle ) pvParameters;
kenjiArai 0:d4960fcea8ff 244 unsigned portLONG ulValue;
kenjiArai 0:d4960fcea8ff 245
kenjiArai 0:d4960fcea8ff 246 for( ;; )
kenjiArai 0:d4960fcea8ff 247 {
kenjiArai 0:d4960fcea8ff 248 /* Try peeking from the queue. The queue should be empty so we will
kenjiArai 0:d4960fcea8ff 249 block, allowing the medium priority task to execute. Both the high
kenjiArai 0:d4960fcea8ff 250 and highest priority tasks will then be blocked on the queue. */
kenjiArai 0:d4960fcea8ff 251 if( xQueuePeek( xQueue, &ulValue, portMAX_DELAY ) != pdPASS )
kenjiArai 0:d4960fcea8ff 252 {
kenjiArai 0:d4960fcea8ff 253 /* We expected to have received something by the time we unblock. */
kenjiArai 0:d4960fcea8ff 254 xErrorDetected = pdTRUE;
kenjiArai 0:d4960fcea8ff 255 }
kenjiArai 0:d4960fcea8ff 256
kenjiArai 0:d4960fcea8ff 257 /* When we get here the highest priority task should have peeked the data
kenjiArai 0:d4960fcea8ff 258 (unblocking this task) then suspended (allowing this task to also peek
kenjiArai 0:d4960fcea8ff 259 the data). */
kenjiArai 0:d4960fcea8ff 260 if( ulValue != 0x01234567 )
kenjiArai 0:d4960fcea8ff 261 {
kenjiArai 0:d4960fcea8ff 262 /* We did not receive the expected value. */
kenjiArai 0:d4960fcea8ff 263 xErrorDetected = pdTRUE;
kenjiArai 0:d4960fcea8ff 264 }
kenjiArai 0:d4960fcea8ff 265
kenjiArai 0:d4960fcea8ff 266 if( uxQueueMessagesWaiting( xQueue ) != 1 )
kenjiArai 0:d4960fcea8ff 267 {
kenjiArai 0:d4960fcea8ff 268 /* The message should have been left on the queue. */
kenjiArai 0:d4960fcea8ff 269 xErrorDetected = pdTRUE;
kenjiArai 0:d4960fcea8ff 270 }
kenjiArai 0:d4960fcea8ff 271
kenjiArai 0:d4960fcea8ff 272 /* We only peeked the data, so suspending ourselves now should enable
kenjiArai 0:d4960fcea8ff 273 the medium priority task to also peek the data. The medium priority task
kenjiArai 0:d4960fcea8ff 274 will have been unblocked when we peeked the data as we left the data
kenjiArai 0:d4960fcea8ff 275 in the queue. */
kenjiArai 0:d4960fcea8ff 276 vTaskSuspend( NULL );
kenjiArai 0:d4960fcea8ff 277
kenjiArai 0:d4960fcea8ff 278
kenjiArai 0:d4960fcea8ff 279 /* This time we are going actually receive the value, so the medium
kenjiArai 0:d4960fcea8ff 280 priority task will never peek the data - we removed it from the queue. */
kenjiArai 0:d4960fcea8ff 281 if( xQueueReceive( xQueue, &ulValue, portMAX_DELAY ) != pdPASS )
kenjiArai 0:d4960fcea8ff 282 {
kenjiArai 0:d4960fcea8ff 283 xErrorDetected = pdTRUE;
kenjiArai 0:d4960fcea8ff 284 }
kenjiArai 0:d4960fcea8ff 285
kenjiArai 0:d4960fcea8ff 286 if( ulValue != 0xaabbaabb )
kenjiArai 0:d4960fcea8ff 287 {
kenjiArai 0:d4960fcea8ff 288 xErrorDetected = pdTRUE;
kenjiArai 0:d4960fcea8ff 289 }
kenjiArai 0:d4960fcea8ff 290
kenjiArai 0:d4960fcea8ff 291 vTaskSuspend( NULL );
kenjiArai 0:d4960fcea8ff 292 }
kenjiArai 0:d4960fcea8ff 293 }
kenjiArai 0:d4960fcea8ff 294 /*-----------------------------------------------------------*/
kenjiArai 0:d4960fcea8ff 295
kenjiArai 0:d4960fcea8ff 296 static void prvMediumPriorityPeekTask( void *pvParameters )
kenjiArai 0:d4960fcea8ff 297 {
kenjiArai 0:d4960fcea8ff 298 xQueueHandle xQueue = ( xQueueHandle ) pvParameters;
kenjiArai 0:d4960fcea8ff 299 unsigned portLONG ulValue;
kenjiArai 0:d4960fcea8ff 300
kenjiArai 0:d4960fcea8ff 301 for( ;; )
kenjiArai 0:d4960fcea8ff 302 {
kenjiArai 0:d4960fcea8ff 303 /* Try peeking from the queue. The queue should be empty so we will
kenjiArai 0:d4960fcea8ff 304 block, allowing the low priority task to execute. The highest, high
kenjiArai 0:d4960fcea8ff 305 and medium priority tasks will then all be blocked on the queue. */
kenjiArai 0:d4960fcea8ff 306 if( xQueuePeek( xQueue, &ulValue, portMAX_DELAY ) != pdPASS )
kenjiArai 0:d4960fcea8ff 307 {
kenjiArai 0:d4960fcea8ff 308 /* We expected to have received something by the time we unblock. */
kenjiArai 0:d4960fcea8ff 309 xErrorDetected = pdTRUE;
kenjiArai 0:d4960fcea8ff 310 }
kenjiArai 0:d4960fcea8ff 311
kenjiArai 0:d4960fcea8ff 312 /* When we get here the high priority task should have peeked the data
kenjiArai 0:d4960fcea8ff 313 (unblocking this task) then suspended (allowing this task to also peek
kenjiArai 0:d4960fcea8ff 314 the data). */
kenjiArai 0:d4960fcea8ff 315 if( ulValue != 0x01234567 )
kenjiArai 0:d4960fcea8ff 316 {
kenjiArai 0:d4960fcea8ff 317 /* We did not receive the expected value. */
kenjiArai 0:d4960fcea8ff 318 xErrorDetected = pdTRUE;
kenjiArai 0:d4960fcea8ff 319 }
kenjiArai 0:d4960fcea8ff 320
kenjiArai 0:d4960fcea8ff 321 if( uxQueueMessagesWaiting( xQueue ) != 1 )
kenjiArai 0:d4960fcea8ff 322 {
kenjiArai 0:d4960fcea8ff 323 /* The message should have been left on the queue. */
kenjiArai 0:d4960fcea8ff 324 xErrorDetected = pdTRUE;
kenjiArai 0:d4960fcea8ff 325 }
kenjiArai 0:d4960fcea8ff 326
kenjiArai 0:d4960fcea8ff 327 /* Just so we know the test is still running. */
kenjiArai 0:d4960fcea8ff 328 ulLoopCounter++;
kenjiArai 0:d4960fcea8ff 329
kenjiArai 0:d4960fcea8ff 330 /* Now we can suspend ourselves so the low priority task can execute
kenjiArai 0:d4960fcea8ff 331 again. */
kenjiArai 0:d4960fcea8ff 332 vTaskSuspend( NULL );
kenjiArai 0:d4960fcea8ff 333 }
kenjiArai 0:d4960fcea8ff 334 }
kenjiArai 0:d4960fcea8ff 335 /*-----------------------------------------------------------*/
kenjiArai 0:d4960fcea8ff 336
kenjiArai 0:d4960fcea8ff 337 static void prvLowPriorityPeekTask( void *pvParameters )
kenjiArai 0:d4960fcea8ff 338 {
kenjiArai 0:d4960fcea8ff 339 xQueueHandle xQueue = ( xQueueHandle ) pvParameters;
kenjiArai 0:d4960fcea8ff 340 unsigned portLONG ulValue;
kenjiArai 0:d4960fcea8ff 341
kenjiArai 0:d4960fcea8ff 342 for( ;; )
kenjiArai 0:d4960fcea8ff 343 {
kenjiArai 0:d4960fcea8ff 344 /* Write some data to the queue. This should unblock the highest
kenjiArai 0:d4960fcea8ff 345 priority task that is waiting to peek data from the queue. */
kenjiArai 0:d4960fcea8ff 346 ulValue = 0x11223344;
kenjiArai 0:d4960fcea8ff 347 if( xQueueSendToBack( xQueue, &ulValue, qpeekNO_BLOCK ) != pdPASS )
kenjiArai 0:d4960fcea8ff 348 {
kenjiArai 0:d4960fcea8ff 349 /* We were expecting the queue to be empty so we should not of
kenjiArai 0:d4960fcea8ff 350 had a problem writing to the queue. */
kenjiArai 0:d4960fcea8ff 351 xErrorDetected = pdTRUE;
kenjiArai 0:d4960fcea8ff 352 }
kenjiArai 0:d4960fcea8ff 353
kenjiArai 0:d4960fcea8ff 354 /* By the time we get here the data should have been removed from
kenjiArai 0:d4960fcea8ff 355 the queue. */
kenjiArai 0:d4960fcea8ff 356 if( uxQueueMessagesWaiting( xQueue ) != 0 )
kenjiArai 0:d4960fcea8ff 357 {
kenjiArai 0:d4960fcea8ff 358 xErrorDetected = pdTRUE;
kenjiArai 0:d4960fcea8ff 359 }
kenjiArai 0:d4960fcea8ff 360
kenjiArai 0:d4960fcea8ff 361 /* Write another value to the queue, again waking the highest priority
kenjiArai 0:d4960fcea8ff 362 task that is blocked on the queue. */
kenjiArai 0:d4960fcea8ff 363 ulValue = 0x01234567;
kenjiArai 0:d4960fcea8ff 364 if( xQueueSendToBack( xQueue, &ulValue, qpeekNO_BLOCK ) != pdPASS )
kenjiArai 0:d4960fcea8ff 365 {
kenjiArai 0:d4960fcea8ff 366 /* We were expecting the queue to be empty so we should not of
kenjiArai 0:d4960fcea8ff 367 had a problem writing to the queue. */
kenjiArai 0:d4960fcea8ff 368 xErrorDetected = pdTRUE;
kenjiArai 0:d4960fcea8ff 369 }
kenjiArai 0:d4960fcea8ff 370
kenjiArai 0:d4960fcea8ff 371 /* All the other tasks should now have successfully peeked the data.
kenjiArai 0:d4960fcea8ff 372 The data is still in the queue so we should be able to receive it. */
kenjiArai 0:d4960fcea8ff 373 ulValue = 0;
kenjiArai 0:d4960fcea8ff 374 if( xQueueReceive( xQueue, &ulValue, qpeekNO_BLOCK ) != pdPASS )
kenjiArai 0:d4960fcea8ff 375 {
kenjiArai 0:d4960fcea8ff 376 /* We expected to receive the data. */
kenjiArai 0:d4960fcea8ff 377 xErrorDetected = pdTRUE;
kenjiArai 0:d4960fcea8ff 378 }
kenjiArai 0:d4960fcea8ff 379
kenjiArai 0:d4960fcea8ff 380 if( ulValue != 0x01234567 )
kenjiArai 0:d4960fcea8ff 381 {
kenjiArai 0:d4960fcea8ff 382 /* We did not receive the expected value. */
kenjiArai 0:d4960fcea8ff 383 }
kenjiArai 0:d4960fcea8ff 384
kenjiArai 0:d4960fcea8ff 385 /* Lets just delay a while as this is an intensive test as we don't
kenjiArai 0:d4960fcea8ff 386 want to starve other tests of processing time. */
kenjiArai 0:d4960fcea8ff 387 vTaskDelay( qpeekSHORT_DELAY );
kenjiArai 0:d4960fcea8ff 388
kenjiArai 0:d4960fcea8ff 389 /* Unsuspend the other tasks so we can repeat the test - this time
kenjiArai 0:d4960fcea8ff 390 however not all the other tasks will peek the data as the high
kenjiArai 0:d4960fcea8ff 391 priority task is actually going to remove it from the queue. Send
kenjiArai 0:d4960fcea8ff 392 to front is used just to be different. As the queue is empty it
kenjiArai 0:d4960fcea8ff 393 makes no difference to the result. */
kenjiArai 0:d4960fcea8ff 394 vTaskResume( xMediumPriorityTask );
kenjiArai 0:d4960fcea8ff 395 vTaskResume( xHighPriorityTask );
kenjiArai 0:d4960fcea8ff 396 vTaskResume( xHighestPriorityTask );
kenjiArai 0:d4960fcea8ff 397
kenjiArai 0:d4960fcea8ff 398 ulValue = 0xaabbaabb;
kenjiArai 0:d4960fcea8ff 399 if( xQueueSendToFront( xQueue, &ulValue, qpeekNO_BLOCK ) != pdPASS )
kenjiArai 0:d4960fcea8ff 400 {
kenjiArai 0:d4960fcea8ff 401 /* We were expecting the queue to be empty so we should not of
kenjiArai 0:d4960fcea8ff 402 had a problem writing to the queue. */
kenjiArai 0:d4960fcea8ff 403 xErrorDetected = pdTRUE;
kenjiArai 0:d4960fcea8ff 404 }
kenjiArai 0:d4960fcea8ff 405
kenjiArai 0:d4960fcea8ff 406 /* This time we should find that the queue is empty. The high priority
kenjiArai 0:d4960fcea8ff 407 task actually removed the data rather than just peeking it. */
kenjiArai 0:d4960fcea8ff 408 if( xQueuePeek( xQueue, &ulValue, qpeekNO_BLOCK ) != errQUEUE_EMPTY )
kenjiArai 0:d4960fcea8ff 409 {
kenjiArai 0:d4960fcea8ff 410 /* We expected to receive the data. */
kenjiArai 0:d4960fcea8ff 411 xErrorDetected = pdTRUE;
kenjiArai 0:d4960fcea8ff 412 }
kenjiArai 0:d4960fcea8ff 413
kenjiArai 0:d4960fcea8ff 414 /* Unsuspend the highest and high priority tasks so we can go back
kenjiArai 0:d4960fcea8ff 415 and repeat the whole thing. The medium priority task should not be
kenjiArai 0:d4960fcea8ff 416 suspended as it was not able to peek the data in this last case. */
kenjiArai 0:d4960fcea8ff 417 vTaskResume( xHighPriorityTask );
kenjiArai 0:d4960fcea8ff 418 vTaskResume( xHighestPriorityTask );
kenjiArai 0:d4960fcea8ff 419
kenjiArai 0:d4960fcea8ff 420 /* Lets just delay a while as this is an intensive test as we don't
kenjiArai 0:d4960fcea8ff 421 want to starve other tests of processing time. */
kenjiArai 0:d4960fcea8ff 422 vTaskDelay( qpeekSHORT_DELAY );
kenjiArai 0:d4960fcea8ff 423 }
kenjiArai 0:d4960fcea8ff 424 }
kenjiArai 0:d4960fcea8ff 425 /*-----------------------------------------------------------*/
kenjiArai 0:d4960fcea8ff 426
kenjiArai 0:d4960fcea8ff 427 /* This is called to check that all the created tasks are still running. */
kenjiArai 0:d4960fcea8ff 428 portBASE_TYPE xAreQueuePeekTasksStillRunning( void )
kenjiArai 0:d4960fcea8ff 429 {
kenjiArai 0:d4960fcea8ff 430 static unsigned portLONG ulLastLoopCounter = 0;
kenjiArai 0:d4960fcea8ff 431
kenjiArai 0:d4960fcea8ff 432 /* If the demo task is still running then we expect the loopcounter to
kenjiArai 0:d4960fcea8ff 433 have incremented since this function was last called. */
kenjiArai 0:d4960fcea8ff 434 if( ulLastLoopCounter == ulLoopCounter )
kenjiArai 0:d4960fcea8ff 435 {
kenjiArai 0:d4960fcea8ff 436 xErrorDetected = pdTRUE;
kenjiArai 0:d4960fcea8ff 437 }
kenjiArai 0:d4960fcea8ff 438
kenjiArai 0:d4960fcea8ff 439 ulLastLoopCounter = ulLoopCounter;
kenjiArai 0:d4960fcea8ff 440
kenjiArai 0:d4960fcea8ff 441 /* Errors detected in the task itself will have latched xErrorDetected
kenjiArai 0:d4960fcea8ff 442 to true. */
kenjiArai 0:d4960fcea8ff 443
kenjiArai 0:d4960fcea8ff 444 return !xErrorDetected;
kenjiArai 0:d4960fcea8ff 445 }
kenjiArai 0:d4960fcea8ff 446