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 * This file contains some test scenarios that ensure tasks do not exit queue
kenjiArai 0:d4960fcea8ff 56 * send or receive functions prematurely. A description of the tests is
kenjiArai 0:d4960fcea8ff 57 * included within the code.
kenjiArai 0:d4960fcea8ff 58 */
kenjiArai 0:d4960fcea8ff 59
kenjiArai 0:d4960fcea8ff 60 /* Kernel includes. */
kenjiArai 0:d4960fcea8ff 61 #include "FreeRTOS.h"
kenjiArai 0:d4960fcea8ff 62 #include "task.h"
kenjiArai 0:d4960fcea8ff 63 #include "queue.h"
kenjiArai 0:d4960fcea8ff 64
kenjiArai 0:d4960fcea8ff 65 /* Demo includes. */
kenjiArai 0:d4960fcea8ff 66 #include "blocktim.h"
kenjiArai 0:d4960fcea8ff 67
kenjiArai 0:d4960fcea8ff 68 /* Task priorities. Allow these to be overridden. */
kenjiArai 0:d4960fcea8ff 69 #ifndef bktPRIMARY_PRIORITY
kenjiArai 0:d4960fcea8ff 70 #define bktPRIMARY_PRIORITY ( 3 )
kenjiArai 0:d4960fcea8ff 71 #endif
kenjiArai 0:d4960fcea8ff 72
kenjiArai 0:d4960fcea8ff 73 #ifndef bktSECONDARY_PRIORITY
kenjiArai 0:d4960fcea8ff 74 #define bktSECONDARY_PRIORITY ( 2 )
kenjiArai 0:d4960fcea8ff 75 #endif
kenjiArai 0:d4960fcea8ff 76
kenjiArai 0:d4960fcea8ff 77 /* Task behaviour. */
kenjiArai 0:d4960fcea8ff 78 #define bktQUEUE_LENGTH ( 5 )
kenjiArai 0:d4960fcea8ff 79 #define bktSHORT_WAIT ( ( ( portTickType ) 20 ) / portTICK_RATE_MS )
kenjiArai 0:d4960fcea8ff 80 #define bktPRIMARY_BLOCK_TIME ( 10 )
kenjiArai 0:d4960fcea8ff 81 #define bktALLOWABLE_MARGIN ( 15 )
kenjiArai 0:d4960fcea8ff 82 #define bktTIME_TO_BLOCK ( 175 )
kenjiArai 0:d4960fcea8ff 83 #define bktDONT_BLOCK ( ( portTickType ) 0 )
kenjiArai 0:d4960fcea8ff 84 #define bktRUN_INDICATOR ( ( unsigned portBASE_TYPE ) 0x55 )
kenjiArai 0:d4960fcea8ff 85
kenjiArai 0:d4960fcea8ff 86 /* The queue on which the tasks block. */
kenjiArai 0:d4960fcea8ff 87 static xQueueHandle xTestQueue;
kenjiArai 0:d4960fcea8ff 88
kenjiArai 0:d4960fcea8ff 89 /* Handle to the secondary task is required by the primary task for calls
kenjiArai 0:d4960fcea8ff 90 to vTaskSuspend/Resume(). */
kenjiArai 0:d4960fcea8ff 91 static xTaskHandle xSecondary;
kenjiArai 0:d4960fcea8ff 92
kenjiArai 0:d4960fcea8ff 93 /* Used to ensure that tasks are still executing without error. */
kenjiArai 0:d4960fcea8ff 94 static volatile portBASE_TYPE xPrimaryCycles = 0, xSecondaryCycles = 0;
kenjiArai 0:d4960fcea8ff 95 static volatile portBASE_TYPE xErrorOccurred = pdFALSE;
kenjiArai 0:d4960fcea8ff 96
kenjiArai 0:d4960fcea8ff 97 /* Provides a simple mechanism for the primary task to know when the
kenjiArai 0:d4960fcea8ff 98 secondary task has executed. */
kenjiArai 0:d4960fcea8ff 99 static volatile unsigned portBASE_TYPE xRunIndicator;
kenjiArai 0:d4960fcea8ff 100
kenjiArai 0:d4960fcea8ff 101 /* The two test tasks. Their behaviour is commented within the files. */
kenjiArai 0:d4960fcea8ff 102 static void vPrimaryBlockTimeTestTask( void *pvParameters );
kenjiArai 0:d4960fcea8ff 103 static void vSecondaryBlockTimeTestTask( void *pvParameters );
kenjiArai 0:d4960fcea8ff 104
kenjiArai 0:d4960fcea8ff 105 /*-----------------------------------------------------------*/
kenjiArai 0:d4960fcea8ff 106
kenjiArai 0:d4960fcea8ff 107 void vCreateBlockTimeTasks( void )
kenjiArai 0:d4960fcea8ff 108 {
kenjiArai 0:d4960fcea8ff 109 /* Create the queue on which the two tasks block. */
kenjiArai 0:d4960fcea8ff 110 xTestQueue = xQueueCreate( bktQUEUE_LENGTH, sizeof( portBASE_TYPE ) );
kenjiArai 0:d4960fcea8ff 111
kenjiArai 0:d4960fcea8ff 112 /* vQueueAddToRegistry() adds the queue to the queue registry, if one is
kenjiArai 0:d4960fcea8ff 113 in use. The queue registry is provided as a means for kernel aware
kenjiArai 0:d4960fcea8ff 114 debuggers to locate queues and has no purpose if a kernel aware debugger
kenjiArai 0:d4960fcea8ff 115 is not being used. The call to vQueueAddToRegistry() will be removed
kenjiArai 0:d4960fcea8ff 116 by the pre-processor if configQUEUE_REGISTRY_SIZE is not defined or is
kenjiArai 0:d4960fcea8ff 117 defined to be less than 1. */
kenjiArai 0:d4960fcea8ff 118 vQueueAddToRegistry( xTestQueue, ( signed char * ) "Block_Time_Queue" );
kenjiArai 0:d4960fcea8ff 119
kenjiArai 0:d4960fcea8ff 120 /* Create the two test tasks. */
kenjiArai 0:d4960fcea8ff 121 xTaskCreate( vPrimaryBlockTimeTestTask, ( signed char * )"BTest1", configMINIMAL_STACK_SIZE, NULL, bktPRIMARY_PRIORITY, NULL );
kenjiArai 0:d4960fcea8ff 122 xTaskCreate( vSecondaryBlockTimeTestTask, ( signed char * )"BTest2", configMINIMAL_STACK_SIZE, NULL, bktSECONDARY_PRIORITY, &xSecondary );
kenjiArai 0:d4960fcea8ff 123 }
kenjiArai 0:d4960fcea8ff 124 /*-----------------------------------------------------------*/
kenjiArai 0:d4960fcea8ff 125
kenjiArai 0:d4960fcea8ff 126 static void vPrimaryBlockTimeTestTask( void *pvParameters )
kenjiArai 0:d4960fcea8ff 127 {
kenjiArai 0:d4960fcea8ff 128 portBASE_TYPE xItem, xData;
kenjiArai 0:d4960fcea8ff 129 portTickType xTimeWhenBlocking;
kenjiArai 0:d4960fcea8ff 130 portTickType xTimeToBlock, xBlockedTime;
kenjiArai 0:d4960fcea8ff 131
kenjiArai 0:d4960fcea8ff 132 ( void ) pvParameters;
kenjiArai 0:d4960fcea8ff 133
kenjiArai 0:d4960fcea8ff 134 for( ;; )
kenjiArai 0:d4960fcea8ff 135 {
kenjiArai 0:d4960fcea8ff 136 /*********************************************************************
kenjiArai 0:d4960fcea8ff 137 Test 1
kenjiArai 0:d4960fcea8ff 138
kenjiArai 0:d4960fcea8ff 139 Simple block time wakeup test on queue receives. */
kenjiArai 0:d4960fcea8ff 140 for( xItem = 0; xItem < bktQUEUE_LENGTH; xItem++ )
kenjiArai 0:d4960fcea8ff 141 {
kenjiArai 0:d4960fcea8ff 142 /* The queue is empty. Attempt to read from the queue using a block
kenjiArai 0:d4960fcea8ff 143 time. When we wake, ensure the delta in time is as expected. */
kenjiArai 0:d4960fcea8ff 144 xTimeToBlock = bktPRIMARY_BLOCK_TIME << xItem;
kenjiArai 0:d4960fcea8ff 145
kenjiArai 0:d4960fcea8ff 146 xTimeWhenBlocking = xTaskGetTickCount();
kenjiArai 0:d4960fcea8ff 147
kenjiArai 0:d4960fcea8ff 148 /* We should unblock after xTimeToBlock having not received
kenjiArai 0:d4960fcea8ff 149 anything on the queue. */
kenjiArai 0:d4960fcea8ff 150 if( xQueueReceive( xTestQueue, &xData, xTimeToBlock ) != errQUEUE_EMPTY )
kenjiArai 0:d4960fcea8ff 151 {
kenjiArai 0:d4960fcea8ff 152 xErrorOccurred = pdTRUE;
kenjiArai 0:d4960fcea8ff 153 }
kenjiArai 0:d4960fcea8ff 154
kenjiArai 0:d4960fcea8ff 155 /* How long were we blocked for? */
kenjiArai 0:d4960fcea8ff 156 xBlockedTime = xTaskGetTickCount() - xTimeWhenBlocking;
kenjiArai 0:d4960fcea8ff 157
kenjiArai 0:d4960fcea8ff 158 if( xBlockedTime < xTimeToBlock )
kenjiArai 0:d4960fcea8ff 159 {
kenjiArai 0:d4960fcea8ff 160 /* Should not have blocked for less than we requested. */
kenjiArai 0:d4960fcea8ff 161 xErrorOccurred = pdTRUE;
kenjiArai 0:d4960fcea8ff 162 }
kenjiArai 0:d4960fcea8ff 163
kenjiArai 0:d4960fcea8ff 164 if( xBlockedTime > ( xTimeToBlock + bktALLOWABLE_MARGIN ) )
kenjiArai 0:d4960fcea8ff 165 {
kenjiArai 0:d4960fcea8ff 166 /* Should not have blocked for longer than we requested,
kenjiArai 0:d4960fcea8ff 167 although we would not necessarily run as soon as we were
kenjiArai 0:d4960fcea8ff 168 unblocked so a margin is allowed. */
kenjiArai 0:d4960fcea8ff 169 xErrorOccurred = pdTRUE;
kenjiArai 0:d4960fcea8ff 170 }
kenjiArai 0:d4960fcea8ff 171 }
kenjiArai 0:d4960fcea8ff 172
kenjiArai 0:d4960fcea8ff 173 /*********************************************************************
kenjiArai 0:d4960fcea8ff 174 Test 2
kenjiArai 0:d4960fcea8ff 175
kenjiArai 0:d4960fcea8ff 176 Simple block time wakeup test on queue sends.
kenjiArai 0:d4960fcea8ff 177
kenjiArai 0:d4960fcea8ff 178 First fill the queue. It should be empty so all sends should pass. */
kenjiArai 0:d4960fcea8ff 179 for( xItem = 0; xItem < bktQUEUE_LENGTH; xItem++ )
kenjiArai 0:d4960fcea8ff 180 {
kenjiArai 0:d4960fcea8ff 181 if( xQueueSend( xTestQueue, &xItem, bktDONT_BLOCK ) != pdPASS )
kenjiArai 0:d4960fcea8ff 182 {
kenjiArai 0:d4960fcea8ff 183 xErrorOccurred = pdTRUE;
kenjiArai 0:d4960fcea8ff 184 }
kenjiArai 0:d4960fcea8ff 185
kenjiArai 0:d4960fcea8ff 186 #if configUSE_PREEMPTION == 0
kenjiArai 0:d4960fcea8ff 187 taskYIELD();
kenjiArai 0:d4960fcea8ff 188 #endif
kenjiArai 0:d4960fcea8ff 189 }
kenjiArai 0:d4960fcea8ff 190
kenjiArai 0:d4960fcea8ff 191 for( xItem = 0; xItem < bktQUEUE_LENGTH; xItem++ )
kenjiArai 0:d4960fcea8ff 192 {
kenjiArai 0:d4960fcea8ff 193 /* The queue is full. Attempt to write to the queue using a block
kenjiArai 0:d4960fcea8ff 194 time. When we wake, ensure the delta in time is as expected. */
kenjiArai 0:d4960fcea8ff 195 xTimeToBlock = bktPRIMARY_BLOCK_TIME << xItem;
kenjiArai 0:d4960fcea8ff 196
kenjiArai 0:d4960fcea8ff 197 xTimeWhenBlocking = xTaskGetTickCount();
kenjiArai 0:d4960fcea8ff 198
kenjiArai 0:d4960fcea8ff 199 /* We should unblock after xTimeToBlock having not received
kenjiArai 0:d4960fcea8ff 200 anything on the queue. */
kenjiArai 0:d4960fcea8ff 201 if( xQueueSend( xTestQueue, &xItem, xTimeToBlock ) != errQUEUE_FULL )
kenjiArai 0:d4960fcea8ff 202 {
kenjiArai 0:d4960fcea8ff 203 xErrorOccurred = pdTRUE;
kenjiArai 0:d4960fcea8ff 204 }
kenjiArai 0:d4960fcea8ff 205
kenjiArai 0:d4960fcea8ff 206 /* How long were we blocked for? */
kenjiArai 0:d4960fcea8ff 207 xBlockedTime = xTaskGetTickCount() - xTimeWhenBlocking;
kenjiArai 0:d4960fcea8ff 208
kenjiArai 0:d4960fcea8ff 209 if( xBlockedTime < xTimeToBlock )
kenjiArai 0:d4960fcea8ff 210 {
kenjiArai 0:d4960fcea8ff 211 /* Should not have blocked for less than we requested. */
kenjiArai 0:d4960fcea8ff 212 xErrorOccurred = pdTRUE;
kenjiArai 0:d4960fcea8ff 213 }
kenjiArai 0:d4960fcea8ff 214
kenjiArai 0:d4960fcea8ff 215 if( xBlockedTime > ( xTimeToBlock + bktALLOWABLE_MARGIN ) )
kenjiArai 0:d4960fcea8ff 216 {
kenjiArai 0:d4960fcea8ff 217 /* Should not have blocked for longer than we requested,
kenjiArai 0:d4960fcea8ff 218 although we would not necessarily run as soon as we were
kenjiArai 0:d4960fcea8ff 219 unblocked so a margin is allowed. */
kenjiArai 0:d4960fcea8ff 220 xErrorOccurred = pdTRUE;
kenjiArai 0:d4960fcea8ff 221 }
kenjiArai 0:d4960fcea8ff 222 }
kenjiArai 0:d4960fcea8ff 223
kenjiArai 0:d4960fcea8ff 224 /*********************************************************************
kenjiArai 0:d4960fcea8ff 225 Test 3
kenjiArai 0:d4960fcea8ff 226
kenjiArai 0:d4960fcea8ff 227 Wake the other task, it will block attempting to post to the queue.
kenjiArai 0:d4960fcea8ff 228 When we read from the queue the other task will wake, but before it
kenjiArai 0:d4960fcea8ff 229 can run we will post to the queue again. When the other task runs it
kenjiArai 0:d4960fcea8ff 230 will find the queue still full, even though it was woken. It should
kenjiArai 0:d4960fcea8ff 231 recognise that its block time has not expired and return to block for
kenjiArai 0:d4960fcea8ff 232 the remains of its block time.
kenjiArai 0:d4960fcea8ff 233
kenjiArai 0:d4960fcea8ff 234 Wake the other task so it blocks attempting to post to the already
kenjiArai 0:d4960fcea8ff 235 full queue. */
kenjiArai 0:d4960fcea8ff 236 xRunIndicator = 0;
kenjiArai 0:d4960fcea8ff 237 vTaskResume( xSecondary );
kenjiArai 0:d4960fcea8ff 238
kenjiArai 0:d4960fcea8ff 239 /* We need to wait a little to ensure the other task executes. */
kenjiArai 0:d4960fcea8ff 240 while( xRunIndicator != bktRUN_INDICATOR )
kenjiArai 0:d4960fcea8ff 241 {
kenjiArai 0:d4960fcea8ff 242 /* The other task has not yet executed. */
kenjiArai 0:d4960fcea8ff 243 vTaskDelay( bktSHORT_WAIT );
kenjiArai 0:d4960fcea8ff 244 }
kenjiArai 0:d4960fcea8ff 245 /* Make sure the other task is blocked on the queue. */
kenjiArai 0:d4960fcea8ff 246 vTaskDelay( bktSHORT_WAIT );
kenjiArai 0:d4960fcea8ff 247 xRunIndicator = 0;
kenjiArai 0:d4960fcea8ff 248
kenjiArai 0:d4960fcea8ff 249 for( xItem = 0; xItem < bktQUEUE_LENGTH; xItem++ )
kenjiArai 0:d4960fcea8ff 250 {
kenjiArai 0:d4960fcea8ff 251 /* Now when we make space on the queue the other task should wake
kenjiArai 0:d4960fcea8ff 252 but not execute as this task has higher priority. */
kenjiArai 0:d4960fcea8ff 253 if( xQueueReceive( xTestQueue, &xData, bktDONT_BLOCK ) != pdPASS )
kenjiArai 0:d4960fcea8ff 254 {
kenjiArai 0:d4960fcea8ff 255 xErrorOccurred = pdTRUE;
kenjiArai 0:d4960fcea8ff 256 }
kenjiArai 0:d4960fcea8ff 257
kenjiArai 0:d4960fcea8ff 258 /* Now fill the queue again before the other task gets a chance to
kenjiArai 0:d4960fcea8ff 259 execute. If the other task had executed we would find the queue
kenjiArai 0:d4960fcea8ff 260 full ourselves, and the other task have set xRunIndicator. */
kenjiArai 0:d4960fcea8ff 261 if( xQueueSend( xTestQueue, &xItem, bktDONT_BLOCK ) != pdPASS )
kenjiArai 0:d4960fcea8ff 262 {
kenjiArai 0:d4960fcea8ff 263 xErrorOccurred = pdTRUE;
kenjiArai 0:d4960fcea8ff 264 }
kenjiArai 0:d4960fcea8ff 265
kenjiArai 0:d4960fcea8ff 266 if( xRunIndicator == bktRUN_INDICATOR )
kenjiArai 0:d4960fcea8ff 267 {
kenjiArai 0:d4960fcea8ff 268 /* The other task should not have executed. */
kenjiArai 0:d4960fcea8ff 269 xErrorOccurred = pdTRUE;
kenjiArai 0:d4960fcea8ff 270 }
kenjiArai 0:d4960fcea8ff 271
kenjiArai 0:d4960fcea8ff 272 /* Raise the priority of the other task so it executes and blocks
kenjiArai 0:d4960fcea8ff 273 on the queue again. */
kenjiArai 0:d4960fcea8ff 274 vTaskPrioritySet( xSecondary, bktPRIMARY_PRIORITY + 2 );
kenjiArai 0:d4960fcea8ff 275
kenjiArai 0:d4960fcea8ff 276 /* The other task should now have re-blocked without exiting the
kenjiArai 0:d4960fcea8ff 277 queue function. */
kenjiArai 0:d4960fcea8ff 278 if( xRunIndicator == bktRUN_INDICATOR )
kenjiArai 0:d4960fcea8ff 279 {
kenjiArai 0:d4960fcea8ff 280 /* The other task should not have executed outside of the
kenjiArai 0:d4960fcea8ff 281 queue function. */
kenjiArai 0:d4960fcea8ff 282 xErrorOccurred = pdTRUE;
kenjiArai 0:d4960fcea8ff 283 }
kenjiArai 0:d4960fcea8ff 284
kenjiArai 0:d4960fcea8ff 285 /* Set the priority back down. */
kenjiArai 0:d4960fcea8ff 286 vTaskPrioritySet( xSecondary, bktSECONDARY_PRIORITY );
kenjiArai 0:d4960fcea8ff 287 }
kenjiArai 0:d4960fcea8ff 288
kenjiArai 0:d4960fcea8ff 289 /* Let the other task timeout. When it unblockes it will check that it
kenjiArai 0:d4960fcea8ff 290 unblocked at the correct time, then suspend itself. */
kenjiArai 0:d4960fcea8ff 291 while( xRunIndicator != bktRUN_INDICATOR )
kenjiArai 0:d4960fcea8ff 292 {
kenjiArai 0:d4960fcea8ff 293 vTaskDelay( bktSHORT_WAIT );
kenjiArai 0:d4960fcea8ff 294 }
kenjiArai 0:d4960fcea8ff 295 vTaskDelay( bktSHORT_WAIT );
kenjiArai 0:d4960fcea8ff 296 xRunIndicator = 0;
kenjiArai 0:d4960fcea8ff 297
kenjiArai 0:d4960fcea8ff 298
kenjiArai 0:d4960fcea8ff 299 /*********************************************************************
kenjiArai 0:d4960fcea8ff 300 Test 4
kenjiArai 0:d4960fcea8ff 301
kenjiArai 0:d4960fcea8ff 302 As per test 3 - but with the send and receive the other way around.
kenjiArai 0:d4960fcea8ff 303 The other task blocks attempting to read from the queue.
kenjiArai 0:d4960fcea8ff 304
kenjiArai 0:d4960fcea8ff 305 Empty the queue. We should find that it is full. */
kenjiArai 0:d4960fcea8ff 306 for( xItem = 0; xItem < bktQUEUE_LENGTH; xItem++ )
kenjiArai 0:d4960fcea8ff 307 {
kenjiArai 0:d4960fcea8ff 308 if( xQueueReceive( xTestQueue, &xData, bktDONT_BLOCK ) != pdPASS )
kenjiArai 0:d4960fcea8ff 309 {
kenjiArai 0:d4960fcea8ff 310 xErrorOccurred = pdTRUE;
kenjiArai 0:d4960fcea8ff 311 }
kenjiArai 0:d4960fcea8ff 312 }
kenjiArai 0:d4960fcea8ff 313
kenjiArai 0:d4960fcea8ff 314 /* Wake the other task so it blocks attempting to read from the
kenjiArai 0:d4960fcea8ff 315 already empty queue. */
kenjiArai 0:d4960fcea8ff 316 vTaskResume( xSecondary );
kenjiArai 0:d4960fcea8ff 317
kenjiArai 0:d4960fcea8ff 318 /* We need to wait a little to ensure the other task executes. */
kenjiArai 0:d4960fcea8ff 319 while( xRunIndicator != bktRUN_INDICATOR )
kenjiArai 0:d4960fcea8ff 320 {
kenjiArai 0:d4960fcea8ff 321 vTaskDelay( bktSHORT_WAIT );
kenjiArai 0:d4960fcea8ff 322 }
kenjiArai 0:d4960fcea8ff 323 vTaskDelay( bktSHORT_WAIT );
kenjiArai 0:d4960fcea8ff 324 xRunIndicator = 0;
kenjiArai 0:d4960fcea8ff 325
kenjiArai 0:d4960fcea8ff 326 for( xItem = 0; xItem < bktQUEUE_LENGTH; xItem++ )
kenjiArai 0:d4960fcea8ff 327 {
kenjiArai 0:d4960fcea8ff 328 /* Now when we place an item on the queue the other task should
kenjiArai 0:d4960fcea8ff 329 wake but not execute as this task has higher priority. */
kenjiArai 0:d4960fcea8ff 330 if( xQueueSend( xTestQueue, &xItem, bktDONT_BLOCK ) != pdPASS )
kenjiArai 0:d4960fcea8ff 331 {
kenjiArai 0:d4960fcea8ff 332 xErrorOccurred = pdTRUE;
kenjiArai 0:d4960fcea8ff 333 }
kenjiArai 0:d4960fcea8ff 334
kenjiArai 0:d4960fcea8ff 335 /* Now empty the queue again before the other task gets a chance to
kenjiArai 0:d4960fcea8ff 336 execute. If the other task had executed we would find the queue
kenjiArai 0:d4960fcea8ff 337 empty ourselves, and the other task would be suspended. */
kenjiArai 0:d4960fcea8ff 338 if( xQueueReceive( xTestQueue, &xData, bktDONT_BLOCK ) != pdPASS )
kenjiArai 0:d4960fcea8ff 339 {
kenjiArai 0:d4960fcea8ff 340 xErrorOccurred = pdTRUE;
kenjiArai 0:d4960fcea8ff 341 }
kenjiArai 0:d4960fcea8ff 342
kenjiArai 0:d4960fcea8ff 343 if( xRunIndicator == bktRUN_INDICATOR )
kenjiArai 0:d4960fcea8ff 344 {
kenjiArai 0:d4960fcea8ff 345 /* The other task should not have executed. */
kenjiArai 0:d4960fcea8ff 346 xErrorOccurred = pdTRUE;
kenjiArai 0:d4960fcea8ff 347 }
kenjiArai 0:d4960fcea8ff 348
kenjiArai 0:d4960fcea8ff 349 /* Raise the priority of the other task so it executes and blocks
kenjiArai 0:d4960fcea8ff 350 on the queue again. */
kenjiArai 0:d4960fcea8ff 351 vTaskPrioritySet( xSecondary, bktPRIMARY_PRIORITY + 2 );
kenjiArai 0:d4960fcea8ff 352
kenjiArai 0:d4960fcea8ff 353 /* The other task should now have re-blocked without exiting the
kenjiArai 0:d4960fcea8ff 354 queue function. */
kenjiArai 0:d4960fcea8ff 355 if( xRunIndicator == bktRUN_INDICATOR )
kenjiArai 0:d4960fcea8ff 356 {
kenjiArai 0:d4960fcea8ff 357 /* The other task should not have executed outside of the
kenjiArai 0:d4960fcea8ff 358 queue function. */
kenjiArai 0:d4960fcea8ff 359 xErrorOccurred = pdTRUE;
kenjiArai 0:d4960fcea8ff 360 }
kenjiArai 0:d4960fcea8ff 361 vTaskPrioritySet( xSecondary, bktSECONDARY_PRIORITY );
kenjiArai 0:d4960fcea8ff 362 }
kenjiArai 0:d4960fcea8ff 363
kenjiArai 0:d4960fcea8ff 364 /* Let the other task timeout. When it unblockes it will check that it
kenjiArai 0:d4960fcea8ff 365 unblocked at the correct time, then suspend itself. */
kenjiArai 0:d4960fcea8ff 366 while( xRunIndicator != bktRUN_INDICATOR )
kenjiArai 0:d4960fcea8ff 367 {
kenjiArai 0:d4960fcea8ff 368 vTaskDelay( bktSHORT_WAIT );
kenjiArai 0:d4960fcea8ff 369 }
kenjiArai 0:d4960fcea8ff 370 vTaskDelay( bktSHORT_WAIT );
kenjiArai 0:d4960fcea8ff 371
kenjiArai 0:d4960fcea8ff 372 xPrimaryCycles++;
kenjiArai 0:d4960fcea8ff 373 }
kenjiArai 0:d4960fcea8ff 374 }
kenjiArai 0:d4960fcea8ff 375 /*-----------------------------------------------------------*/
kenjiArai 0:d4960fcea8ff 376
kenjiArai 0:d4960fcea8ff 377 static void vSecondaryBlockTimeTestTask( void *pvParameters )
kenjiArai 0:d4960fcea8ff 378 {
kenjiArai 0:d4960fcea8ff 379 portTickType xTimeWhenBlocking, xBlockedTime;
kenjiArai 0:d4960fcea8ff 380 portBASE_TYPE xData;
kenjiArai 0:d4960fcea8ff 381
kenjiArai 0:d4960fcea8ff 382 ( void ) pvParameters;
kenjiArai 0:d4960fcea8ff 383
kenjiArai 0:d4960fcea8ff 384 for( ;; )
kenjiArai 0:d4960fcea8ff 385 {
kenjiArai 0:d4960fcea8ff 386 /*********************************************************************
kenjiArai 0:d4960fcea8ff 387 Test 1 and 2
kenjiArai 0:d4960fcea8ff 388
kenjiArai 0:d4960fcea8ff 389 This task does does not participate in these tests. */
kenjiArai 0:d4960fcea8ff 390 vTaskSuspend( NULL );
kenjiArai 0:d4960fcea8ff 391
kenjiArai 0:d4960fcea8ff 392 /*********************************************************************
kenjiArai 0:d4960fcea8ff 393 Test 3
kenjiArai 0:d4960fcea8ff 394
kenjiArai 0:d4960fcea8ff 395 The first thing we do is attempt to read from the queue. It should be
kenjiArai 0:d4960fcea8ff 396 full so we block. Note the time before we block so we can check the
kenjiArai 0:d4960fcea8ff 397 wake time is as per that expected. */
kenjiArai 0:d4960fcea8ff 398 xTimeWhenBlocking = xTaskGetTickCount();
kenjiArai 0:d4960fcea8ff 399
kenjiArai 0:d4960fcea8ff 400 /* We should unblock after bktTIME_TO_BLOCK having not sent
kenjiArai 0:d4960fcea8ff 401 anything to the queue. */
kenjiArai 0:d4960fcea8ff 402 xData = 0;
kenjiArai 0:d4960fcea8ff 403 xRunIndicator = bktRUN_INDICATOR;
kenjiArai 0:d4960fcea8ff 404 if( xQueueSend( xTestQueue, &xData, bktTIME_TO_BLOCK ) != errQUEUE_FULL )
kenjiArai 0:d4960fcea8ff 405 {
kenjiArai 0:d4960fcea8ff 406 xErrorOccurred = pdTRUE;
kenjiArai 0:d4960fcea8ff 407 }
kenjiArai 0:d4960fcea8ff 408
kenjiArai 0:d4960fcea8ff 409 /* How long were we inside the send function? */
kenjiArai 0:d4960fcea8ff 410 xBlockedTime = xTaskGetTickCount() - xTimeWhenBlocking;
kenjiArai 0:d4960fcea8ff 411
kenjiArai 0:d4960fcea8ff 412 /* We should not have blocked for less time than bktTIME_TO_BLOCK. */
kenjiArai 0:d4960fcea8ff 413 if( xBlockedTime < bktTIME_TO_BLOCK )
kenjiArai 0:d4960fcea8ff 414 {
kenjiArai 0:d4960fcea8ff 415 xErrorOccurred = pdTRUE;
kenjiArai 0:d4960fcea8ff 416 }
kenjiArai 0:d4960fcea8ff 417
kenjiArai 0:d4960fcea8ff 418 /* We should of not blocked for much longer than bktALLOWABLE_MARGIN
kenjiArai 0:d4960fcea8ff 419 either. A margin is permitted as we would not necessarily run as
kenjiArai 0:d4960fcea8ff 420 soon as we unblocked. */
kenjiArai 0:d4960fcea8ff 421 if( xBlockedTime > ( bktTIME_TO_BLOCK + bktALLOWABLE_MARGIN ) )
kenjiArai 0:d4960fcea8ff 422 {
kenjiArai 0:d4960fcea8ff 423 xErrorOccurred = pdTRUE;
kenjiArai 0:d4960fcea8ff 424 }
kenjiArai 0:d4960fcea8ff 425
kenjiArai 0:d4960fcea8ff 426 /* Suspend ready for test 3. */
kenjiArai 0:d4960fcea8ff 427 xRunIndicator = bktRUN_INDICATOR;
kenjiArai 0:d4960fcea8ff 428 vTaskSuspend( NULL );
kenjiArai 0:d4960fcea8ff 429
kenjiArai 0:d4960fcea8ff 430 /*********************************************************************
kenjiArai 0:d4960fcea8ff 431 Test 4
kenjiArai 0:d4960fcea8ff 432
kenjiArai 0:d4960fcea8ff 433 As per test three, but with the send and receive reversed. */
kenjiArai 0:d4960fcea8ff 434 xTimeWhenBlocking = xTaskGetTickCount();
kenjiArai 0:d4960fcea8ff 435
kenjiArai 0:d4960fcea8ff 436 /* We should unblock after bktTIME_TO_BLOCK having not received
kenjiArai 0:d4960fcea8ff 437 anything on the queue. */
kenjiArai 0:d4960fcea8ff 438 xRunIndicator = bktRUN_INDICATOR;
kenjiArai 0:d4960fcea8ff 439 if( xQueueReceive( xTestQueue, &xData, bktTIME_TO_BLOCK ) != errQUEUE_EMPTY )
kenjiArai 0:d4960fcea8ff 440 {
kenjiArai 0:d4960fcea8ff 441 xErrorOccurred = pdTRUE;
kenjiArai 0:d4960fcea8ff 442 }
kenjiArai 0:d4960fcea8ff 443
kenjiArai 0:d4960fcea8ff 444 xBlockedTime = xTaskGetTickCount() - xTimeWhenBlocking;
kenjiArai 0:d4960fcea8ff 445
kenjiArai 0:d4960fcea8ff 446 /* We should not have blocked for less time than bktTIME_TO_BLOCK. */
kenjiArai 0:d4960fcea8ff 447 if( xBlockedTime < bktTIME_TO_BLOCK )
kenjiArai 0:d4960fcea8ff 448 {
kenjiArai 0:d4960fcea8ff 449 xErrorOccurred = pdTRUE;
kenjiArai 0:d4960fcea8ff 450 }
kenjiArai 0:d4960fcea8ff 451
kenjiArai 0:d4960fcea8ff 452 /* We should of not blocked for much longer than bktALLOWABLE_MARGIN
kenjiArai 0:d4960fcea8ff 453 either. A margin is permitted as we would not necessarily run as soon
kenjiArai 0:d4960fcea8ff 454 as we unblocked. */
kenjiArai 0:d4960fcea8ff 455 if( xBlockedTime > ( bktTIME_TO_BLOCK + bktALLOWABLE_MARGIN ) )
kenjiArai 0:d4960fcea8ff 456 {
kenjiArai 0:d4960fcea8ff 457 xErrorOccurred = pdTRUE;
kenjiArai 0:d4960fcea8ff 458 }
kenjiArai 0:d4960fcea8ff 459
kenjiArai 0:d4960fcea8ff 460 xRunIndicator = bktRUN_INDICATOR;
kenjiArai 0:d4960fcea8ff 461
kenjiArai 0:d4960fcea8ff 462 xSecondaryCycles++;
kenjiArai 0:d4960fcea8ff 463 }
kenjiArai 0:d4960fcea8ff 464 }
kenjiArai 0:d4960fcea8ff 465 /*-----------------------------------------------------------*/
kenjiArai 0:d4960fcea8ff 466
kenjiArai 0:d4960fcea8ff 467 portBASE_TYPE xAreBlockTimeTestTasksStillRunning( void )
kenjiArai 0:d4960fcea8ff 468 {
kenjiArai 0:d4960fcea8ff 469 static portBASE_TYPE xLastPrimaryCycleCount = 0, xLastSecondaryCycleCount = 0;
kenjiArai 0:d4960fcea8ff 470 portBASE_TYPE xReturn = pdPASS;
kenjiArai 0:d4960fcea8ff 471
kenjiArai 0:d4960fcea8ff 472 /* Have both tasks performed at least one cycle since this function was
kenjiArai 0:d4960fcea8ff 473 last called? */
kenjiArai 0:d4960fcea8ff 474 if( xPrimaryCycles == xLastPrimaryCycleCount )
kenjiArai 0:d4960fcea8ff 475 {
kenjiArai 0:d4960fcea8ff 476 xReturn = pdFAIL;
kenjiArai 0:d4960fcea8ff 477 }
kenjiArai 0:d4960fcea8ff 478
kenjiArai 0:d4960fcea8ff 479 if( xSecondaryCycles == xLastSecondaryCycleCount )
kenjiArai 0:d4960fcea8ff 480 {
kenjiArai 0:d4960fcea8ff 481 xReturn = pdFAIL;
kenjiArai 0:d4960fcea8ff 482 }
kenjiArai 0:d4960fcea8ff 483
kenjiArai 0:d4960fcea8ff 484 if( xErrorOccurred == pdTRUE )
kenjiArai 0:d4960fcea8ff 485 {
kenjiArai 0:d4960fcea8ff 486 xReturn = pdFAIL;
kenjiArai 0:d4960fcea8ff 487 }
kenjiArai 0:d4960fcea8ff 488
kenjiArai 0:d4960fcea8ff 489 xLastSecondaryCycleCount = xSecondaryCycles;
kenjiArai 0:d4960fcea8ff 490 xLastPrimaryCycleCount = xPrimaryCycles;
kenjiArai 0:d4960fcea8ff 491
kenjiArai 0:d4960fcea8ff 492 return xReturn;
kenjiArai 0:d4960fcea8ff 493 }