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 #ifndef INC_FREERTOS_H
kenjiArai 0:d4960fcea8ff 55 #error "#include FreeRTOS.h" must appear in source files before "#include queue.h"
kenjiArai 0:d4960fcea8ff 56 #endif
kenjiArai 0:d4960fcea8ff 57
kenjiArai 0:d4960fcea8ff 58
kenjiArai 0:d4960fcea8ff 59
kenjiArai 0:d4960fcea8ff 60
kenjiArai 0:d4960fcea8ff 61 #ifndef QUEUE_H
kenjiArai 0:d4960fcea8ff 62 #define QUEUE_H
kenjiArai 0:d4960fcea8ff 63
kenjiArai 0:d4960fcea8ff 64 #ifdef __cplusplus
kenjiArai 0:d4960fcea8ff 65 extern "C" {
kenjiArai 0:d4960fcea8ff 66 #endif
kenjiArai 0:d4960fcea8ff 67
kenjiArai 0:d4960fcea8ff 68 #include "mpu_wrappers.h"
kenjiArai 0:d4960fcea8ff 69
kenjiArai 0:d4960fcea8ff 70 typedef void * xQueueHandle;
kenjiArai 0:d4960fcea8ff 71
kenjiArai 0:d4960fcea8ff 72
kenjiArai 0:d4960fcea8ff 73 /* For internal use only. */
kenjiArai 0:d4960fcea8ff 74 #define queueSEND_TO_BACK ( 0 )
kenjiArai 0:d4960fcea8ff 75 #define queueSEND_TO_FRONT ( 1 )
kenjiArai 0:d4960fcea8ff 76
kenjiArai 0:d4960fcea8ff 77
kenjiArai 0:d4960fcea8ff 78 /**
kenjiArai 0:d4960fcea8ff 79 * queue. h
kenjiArai 0:d4960fcea8ff 80 * <pre>
kenjiArai 0:d4960fcea8ff 81 xQueueHandle xQueueCreate(
kenjiArai 0:d4960fcea8ff 82 unsigned portBASE_TYPE uxQueueLength,
kenjiArai 0:d4960fcea8ff 83 unsigned portBASE_TYPE uxItemSize
kenjiArai 0:d4960fcea8ff 84 );
kenjiArai 0:d4960fcea8ff 85 * </pre>
kenjiArai 0:d4960fcea8ff 86 *
kenjiArai 0:d4960fcea8ff 87 * Creates a new queue instance. This allocates the storage required by the
kenjiArai 0:d4960fcea8ff 88 * new queue and returns a handle for the queue.
kenjiArai 0:d4960fcea8ff 89 *
kenjiArai 0:d4960fcea8ff 90 * @param uxQueueLength The maximum number of items that the queue can contain.
kenjiArai 0:d4960fcea8ff 91 *
kenjiArai 0:d4960fcea8ff 92 * @param uxItemSize The number of bytes each item in the queue will require.
kenjiArai 0:d4960fcea8ff 93 * Items are queued by copy, not by reference, so this is the number of bytes
kenjiArai 0:d4960fcea8ff 94 * that will be copied for each posted item. Each item on the queue must be
kenjiArai 0:d4960fcea8ff 95 * the same size.
kenjiArai 0:d4960fcea8ff 96 *
kenjiArai 0:d4960fcea8ff 97 * @return If the queue is successfully create then a handle to the newly
kenjiArai 0:d4960fcea8ff 98 * created queue is returned. If the queue cannot be created then 0 is
kenjiArai 0:d4960fcea8ff 99 * returned.
kenjiArai 0:d4960fcea8ff 100 *
kenjiArai 0:d4960fcea8ff 101 * Example usage:
kenjiArai 0:d4960fcea8ff 102 <pre>
kenjiArai 0:d4960fcea8ff 103 struct AMessage
kenjiArai 0:d4960fcea8ff 104 {
kenjiArai 0:d4960fcea8ff 105 char ucMessageID;
kenjiArai 0:d4960fcea8ff 106 char ucData[ 20 ];
kenjiArai 0:d4960fcea8ff 107 };
kenjiArai 0:d4960fcea8ff 108
kenjiArai 0:d4960fcea8ff 109 void vATask( void *pvParameters )
kenjiArai 0:d4960fcea8ff 110 {
kenjiArai 0:d4960fcea8ff 111 xQueueHandle xQueue1, xQueue2;
kenjiArai 0:d4960fcea8ff 112
kenjiArai 0:d4960fcea8ff 113 // Create a queue capable of containing 10 unsigned long values.
kenjiArai 0:d4960fcea8ff 114 xQueue1 = xQueueCreate( 10, sizeof( unsigned long ) );
kenjiArai 0:d4960fcea8ff 115 if( xQueue1 == 0 )
kenjiArai 0:d4960fcea8ff 116 {
kenjiArai 0:d4960fcea8ff 117 // Queue was not created and must not be used.
kenjiArai 0:d4960fcea8ff 118 }
kenjiArai 0:d4960fcea8ff 119
kenjiArai 0:d4960fcea8ff 120 // Create a queue capable of containing 10 pointers to AMessage structures.
kenjiArai 0:d4960fcea8ff 121 // These should be passed by pointer as they contain a lot of data.
kenjiArai 0:d4960fcea8ff 122 xQueue2 = xQueueCreate( 10, sizeof( struct AMessage * ) );
kenjiArai 0:d4960fcea8ff 123 if( xQueue2 == 0 )
kenjiArai 0:d4960fcea8ff 124 {
kenjiArai 0:d4960fcea8ff 125 // Queue was not created and must not be used.
kenjiArai 0:d4960fcea8ff 126 }
kenjiArai 0:d4960fcea8ff 127
kenjiArai 0:d4960fcea8ff 128 // ... Rest of task code.
kenjiArai 0:d4960fcea8ff 129 }
kenjiArai 0:d4960fcea8ff 130 </pre>
kenjiArai 0:d4960fcea8ff 131 * \defgroup xQueueCreate xQueueCreate
kenjiArai 0:d4960fcea8ff 132 * \ingroup QueueManagement
kenjiArai 0:d4960fcea8ff 133 */
kenjiArai 0:d4960fcea8ff 134 xQueueHandle xQueueCreate( unsigned portBASE_TYPE uxQueueLength, unsigned portBASE_TYPE uxItemSize );
kenjiArai 0:d4960fcea8ff 135
kenjiArai 0:d4960fcea8ff 136 /**
kenjiArai 0:d4960fcea8ff 137 * queue. h
kenjiArai 0:d4960fcea8ff 138 * <pre>
kenjiArai 0:d4960fcea8ff 139 portBASE_TYPE xQueueSendToToFront(
kenjiArai 0:d4960fcea8ff 140 xQueueHandle xQueue,
kenjiArai 0:d4960fcea8ff 141 const void * pvItemToQueue,
kenjiArai 0:d4960fcea8ff 142 portTickType xTicksToWait
kenjiArai 0:d4960fcea8ff 143 );
kenjiArai 0:d4960fcea8ff 144 * </pre>
kenjiArai 0:d4960fcea8ff 145 *
kenjiArai 0:d4960fcea8ff 146 * This is a macro that calls xQueueGenericSend().
kenjiArai 0:d4960fcea8ff 147 *
kenjiArai 0:d4960fcea8ff 148 * Post an item to the front of a queue. The item is queued by copy, not by
kenjiArai 0:d4960fcea8ff 149 * reference. This function must not be called from an interrupt service
kenjiArai 0:d4960fcea8ff 150 * routine. See xQueueSendFromISR () for an alternative which may be used
kenjiArai 0:d4960fcea8ff 151 * in an ISR.
kenjiArai 0:d4960fcea8ff 152 *
kenjiArai 0:d4960fcea8ff 153 * @param xQueue The handle to the queue on which the item is to be posted.
kenjiArai 0:d4960fcea8ff 154 *
kenjiArai 0:d4960fcea8ff 155 * @param pvItemToQueue A pointer to the item that is to be placed on the
kenjiArai 0:d4960fcea8ff 156 * queue. The size of the items the queue will hold was defined when the
kenjiArai 0:d4960fcea8ff 157 * queue was created, so this many bytes will be copied from pvItemToQueue
kenjiArai 0:d4960fcea8ff 158 * into the queue storage area.
kenjiArai 0:d4960fcea8ff 159 *
kenjiArai 0:d4960fcea8ff 160 * @param xTicksToWait The maximum amount of time the task should block
kenjiArai 0:d4960fcea8ff 161 * waiting for space to become available on the queue, should it already
kenjiArai 0:d4960fcea8ff 162 * be full. The call will return immediately if this is set to 0 and the
kenjiArai 0:d4960fcea8ff 163 * queue is full. The time is defined in tick periods so the constant
kenjiArai 0:d4960fcea8ff 164 * portTICK_RATE_MS should be used to convert to real time if this is required.
kenjiArai 0:d4960fcea8ff 165 *
kenjiArai 0:d4960fcea8ff 166 * @return pdTRUE if the item was successfully posted, otherwise errQUEUE_FULL.
kenjiArai 0:d4960fcea8ff 167 *
kenjiArai 0:d4960fcea8ff 168 * Example usage:
kenjiArai 0:d4960fcea8ff 169 <pre>
kenjiArai 0:d4960fcea8ff 170 struct AMessage
kenjiArai 0:d4960fcea8ff 171 {
kenjiArai 0:d4960fcea8ff 172 char ucMessageID;
kenjiArai 0:d4960fcea8ff 173 char ucData[ 20 ];
kenjiArai 0:d4960fcea8ff 174 } xMessage;
kenjiArai 0:d4960fcea8ff 175
kenjiArai 0:d4960fcea8ff 176 unsigned long ulVar = 10UL;
kenjiArai 0:d4960fcea8ff 177
kenjiArai 0:d4960fcea8ff 178 void vATask( void *pvParameters )
kenjiArai 0:d4960fcea8ff 179 {
kenjiArai 0:d4960fcea8ff 180 xQueueHandle xQueue1, xQueue2;
kenjiArai 0:d4960fcea8ff 181 struct AMessage *pxMessage;
kenjiArai 0:d4960fcea8ff 182
kenjiArai 0:d4960fcea8ff 183 // Create a queue capable of containing 10 unsigned long values.
kenjiArai 0:d4960fcea8ff 184 xQueue1 = xQueueCreate( 10, sizeof( unsigned long ) );
kenjiArai 0:d4960fcea8ff 185
kenjiArai 0:d4960fcea8ff 186 // Create a queue capable of containing 10 pointers to AMessage structures.
kenjiArai 0:d4960fcea8ff 187 // These should be passed by pointer as they contain a lot of data.
kenjiArai 0:d4960fcea8ff 188 xQueue2 = xQueueCreate( 10, sizeof( struct AMessage * ) );
kenjiArai 0:d4960fcea8ff 189
kenjiArai 0:d4960fcea8ff 190 // ...
kenjiArai 0:d4960fcea8ff 191
kenjiArai 0:d4960fcea8ff 192 if( xQueue1 != 0 )
kenjiArai 0:d4960fcea8ff 193 {
kenjiArai 0:d4960fcea8ff 194 // Send an unsigned long. Wait for 10 ticks for space to become
kenjiArai 0:d4960fcea8ff 195 // available if necessary.
kenjiArai 0:d4960fcea8ff 196 if( xQueueSendToFront( xQueue1, ( void * ) &ulVar, ( portTickType ) 10 ) != pdPASS )
kenjiArai 0:d4960fcea8ff 197 {
kenjiArai 0:d4960fcea8ff 198 // Failed to post the message, even after 10 ticks.
kenjiArai 0:d4960fcea8ff 199 }
kenjiArai 0:d4960fcea8ff 200 }
kenjiArai 0:d4960fcea8ff 201
kenjiArai 0:d4960fcea8ff 202 if( xQueue2 != 0 )
kenjiArai 0:d4960fcea8ff 203 {
kenjiArai 0:d4960fcea8ff 204 // Send a pointer to a struct AMessage object. Don't block if the
kenjiArai 0:d4960fcea8ff 205 // queue is already full.
kenjiArai 0:d4960fcea8ff 206 pxMessage = & xMessage;
kenjiArai 0:d4960fcea8ff 207 xQueueSendToFront( xQueue2, ( void * ) &pxMessage, ( portTickType ) 0 );
kenjiArai 0:d4960fcea8ff 208 }
kenjiArai 0:d4960fcea8ff 209
kenjiArai 0:d4960fcea8ff 210 // ... Rest of task code.
kenjiArai 0:d4960fcea8ff 211 }
kenjiArai 0:d4960fcea8ff 212 </pre>
kenjiArai 0:d4960fcea8ff 213 * \defgroup xQueueSend xQueueSend
kenjiArai 0:d4960fcea8ff 214 * \ingroup QueueManagement
kenjiArai 0:d4960fcea8ff 215 */
kenjiArai 0:d4960fcea8ff 216 #define xQueueSendToFront( xQueue, pvItemToQueue, xTicksToWait ) xQueueGenericSend( xQueue, pvItemToQueue, xTicksToWait, queueSEND_TO_FRONT )
kenjiArai 0:d4960fcea8ff 217
kenjiArai 0:d4960fcea8ff 218 /**
kenjiArai 0:d4960fcea8ff 219 * queue. h
kenjiArai 0:d4960fcea8ff 220 * <pre>
kenjiArai 0:d4960fcea8ff 221 portBASE_TYPE xQueueSendToBack(
kenjiArai 0:d4960fcea8ff 222 xQueueHandle xQueue,
kenjiArai 0:d4960fcea8ff 223 const void * pvItemToQueue,
kenjiArai 0:d4960fcea8ff 224 portTickType xTicksToWait
kenjiArai 0:d4960fcea8ff 225 );
kenjiArai 0:d4960fcea8ff 226 * </pre>
kenjiArai 0:d4960fcea8ff 227 *
kenjiArai 0:d4960fcea8ff 228 * This is a macro that calls xQueueGenericSend().
kenjiArai 0:d4960fcea8ff 229 *
kenjiArai 0:d4960fcea8ff 230 * Post an item to the back of a queue. The item is queued by copy, not by
kenjiArai 0:d4960fcea8ff 231 * reference. This function must not be called from an interrupt service
kenjiArai 0:d4960fcea8ff 232 * routine. See xQueueSendFromISR () for an alternative which may be used
kenjiArai 0:d4960fcea8ff 233 * in an ISR.
kenjiArai 0:d4960fcea8ff 234 *
kenjiArai 0:d4960fcea8ff 235 * @param xQueue The handle to the queue on which the item is to be posted.
kenjiArai 0:d4960fcea8ff 236 *
kenjiArai 0:d4960fcea8ff 237 * @param pvItemToQueue A pointer to the item that is to be placed on the
kenjiArai 0:d4960fcea8ff 238 * queue. The size of the items the queue will hold was defined when the
kenjiArai 0:d4960fcea8ff 239 * queue was created, so this many bytes will be copied from pvItemToQueue
kenjiArai 0:d4960fcea8ff 240 * into the queue storage area.
kenjiArai 0:d4960fcea8ff 241 *
kenjiArai 0:d4960fcea8ff 242 * @param xTicksToWait The maximum amount of time the task should block
kenjiArai 0:d4960fcea8ff 243 * waiting for space to become available on the queue, should it already
kenjiArai 0:d4960fcea8ff 244 * be full. The call will return immediately if this is set to 0 and the queue
kenjiArai 0:d4960fcea8ff 245 * is full. The time is defined in tick periods so the constant
kenjiArai 0:d4960fcea8ff 246 * portTICK_RATE_MS should be used to convert to real time if this is required.
kenjiArai 0:d4960fcea8ff 247 *
kenjiArai 0:d4960fcea8ff 248 * @return pdTRUE if the item was successfully posted, otherwise errQUEUE_FULL.
kenjiArai 0:d4960fcea8ff 249 *
kenjiArai 0:d4960fcea8ff 250 * Example usage:
kenjiArai 0:d4960fcea8ff 251 <pre>
kenjiArai 0:d4960fcea8ff 252 struct AMessage
kenjiArai 0:d4960fcea8ff 253 {
kenjiArai 0:d4960fcea8ff 254 char ucMessageID;
kenjiArai 0:d4960fcea8ff 255 char ucData[ 20 ];
kenjiArai 0:d4960fcea8ff 256 } xMessage;
kenjiArai 0:d4960fcea8ff 257
kenjiArai 0:d4960fcea8ff 258 unsigned long ulVar = 10UL;
kenjiArai 0:d4960fcea8ff 259
kenjiArai 0:d4960fcea8ff 260 void vATask( void *pvParameters )
kenjiArai 0:d4960fcea8ff 261 {
kenjiArai 0:d4960fcea8ff 262 xQueueHandle xQueue1, xQueue2;
kenjiArai 0:d4960fcea8ff 263 struct AMessage *pxMessage;
kenjiArai 0:d4960fcea8ff 264
kenjiArai 0:d4960fcea8ff 265 // Create a queue capable of containing 10 unsigned long values.
kenjiArai 0:d4960fcea8ff 266 xQueue1 = xQueueCreate( 10, sizeof( unsigned long ) );
kenjiArai 0:d4960fcea8ff 267
kenjiArai 0:d4960fcea8ff 268 // Create a queue capable of containing 10 pointers to AMessage structures.
kenjiArai 0:d4960fcea8ff 269 // These should be passed by pointer as they contain a lot of data.
kenjiArai 0:d4960fcea8ff 270 xQueue2 = xQueueCreate( 10, sizeof( struct AMessage * ) );
kenjiArai 0:d4960fcea8ff 271
kenjiArai 0:d4960fcea8ff 272 // ...
kenjiArai 0:d4960fcea8ff 273
kenjiArai 0:d4960fcea8ff 274 if( xQueue1 != 0 )
kenjiArai 0:d4960fcea8ff 275 {
kenjiArai 0:d4960fcea8ff 276 // Send an unsigned long. Wait for 10 ticks for space to become
kenjiArai 0:d4960fcea8ff 277 // available if necessary.
kenjiArai 0:d4960fcea8ff 278 if( xQueueSendToBack( xQueue1, ( void * ) &ulVar, ( portTickType ) 10 ) != pdPASS )
kenjiArai 0:d4960fcea8ff 279 {
kenjiArai 0:d4960fcea8ff 280 // Failed to post the message, even after 10 ticks.
kenjiArai 0:d4960fcea8ff 281 }
kenjiArai 0:d4960fcea8ff 282 }
kenjiArai 0:d4960fcea8ff 283
kenjiArai 0:d4960fcea8ff 284 if( xQueue2 != 0 )
kenjiArai 0:d4960fcea8ff 285 {
kenjiArai 0:d4960fcea8ff 286 // Send a pointer to a struct AMessage object. Don't block if the
kenjiArai 0:d4960fcea8ff 287 // queue is already full.
kenjiArai 0:d4960fcea8ff 288 pxMessage = & xMessage;
kenjiArai 0:d4960fcea8ff 289 xQueueSendToBack( xQueue2, ( void * ) &pxMessage, ( portTickType ) 0 );
kenjiArai 0:d4960fcea8ff 290 }
kenjiArai 0:d4960fcea8ff 291
kenjiArai 0:d4960fcea8ff 292 // ... Rest of task code.
kenjiArai 0:d4960fcea8ff 293 }
kenjiArai 0:d4960fcea8ff 294 </pre>
kenjiArai 0:d4960fcea8ff 295 * \defgroup xQueueSend xQueueSend
kenjiArai 0:d4960fcea8ff 296 * \ingroup QueueManagement
kenjiArai 0:d4960fcea8ff 297 */
kenjiArai 0:d4960fcea8ff 298 #define xQueueSendToBack( xQueue, pvItemToQueue, xTicksToWait ) xQueueGenericSend( xQueue, pvItemToQueue, xTicksToWait, queueSEND_TO_BACK )
kenjiArai 0:d4960fcea8ff 299
kenjiArai 0:d4960fcea8ff 300 /**
kenjiArai 0:d4960fcea8ff 301 * queue. h
kenjiArai 0:d4960fcea8ff 302 * <pre>
kenjiArai 0:d4960fcea8ff 303 portBASE_TYPE xQueueSend(
kenjiArai 0:d4960fcea8ff 304 xQueueHandle xQueue,
kenjiArai 0:d4960fcea8ff 305 const void * pvItemToQueue,
kenjiArai 0:d4960fcea8ff 306 portTickType xTicksToWait
kenjiArai 0:d4960fcea8ff 307 );
kenjiArai 0:d4960fcea8ff 308 * </pre>
kenjiArai 0:d4960fcea8ff 309 *
kenjiArai 0:d4960fcea8ff 310 * This is a macro that calls xQueueGenericSend(). It is included for
kenjiArai 0:d4960fcea8ff 311 * backward compatibility with versions of FreeRTOS.org that did not
kenjiArai 0:d4960fcea8ff 312 * include the xQueueSendToFront() and xQueueSendToBack() macros. It is
kenjiArai 0:d4960fcea8ff 313 * equivalent to xQueueSendToBack().
kenjiArai 0:d4960fcea8ff 314 *
kenjiArai 0:d4960fcea8ff 315 * Post an item on a queue. The item is queued by copy, not by reference.
kenjiArai 0:d4960fcea8ff 316 * This function must not be called from an interrupt service routine.
kenjiArai 0:d4960fcea8ff 317 * See xQueueSendFromISR () for an alternative which may be used in an ISR.
kenjiArai 0:d4960fcea8ff 318 *
kenjiArai 0:d4960fcea8ff 319 * @param xQueue The handle to the queue on which the item is to be posted.
kenjiArai 0:d4960fcea8ff 320 *
kenjiArai 0:d4960fcea8ff 321 * @param pvItemToQueue A pointer to the item that is to be placed on the
kenjiArai 0:d4960fcea8ff 322 * queue. The size of the items the queue will hold was defined when the
kenjiArai 0:d4960fcea8ff 323 * queue was created, so this many bytes will be copied from pvItemToQueue
kenjiArai 0:d4960fcea8ff 324 * into the queue storage area.
kenjiArai 0:d4960fcea8ff 325 *
kenjiArai 0:d4960fcea8ff 326 * @param xTicksToWait The maximum amount of time the task should block
kenjiArai 0:d4960fcea8ff 327 * waiting for space to become available on the queue, should it already
kenjiArai 0:d4960fcea8ff 328 * be full. The call will return immediately if this is set to 0 and the
kenjiArai 0:d4960fcea8ff 329 * queue is full. The time is defined in tick periods so the constant
kenjiArai 0:d4960fcea8ff 330 * portTICK_RATE_MS should be used to convert to real time if this is required.
kenjiArai 0:d4960fcea8ff 331 *
kenjiArai 0:d4960fcea8ff 332 * @return pdTRUE if the item was successfully posted, otherwise errQUEUE_FULL.
kenjiArai 0:d4960fcea8ff 333 *
kenjiArai 0:d4960fcea8ff 334 * Example usage:
kenjiArai 0:d4960fcea8ff 335 <pre>
kenjiArai 0:d4960fcea8ff 336 struct AMessage
kenjiArai 0:d4960fcea8ff 337 {
kenjiArai 0:d4960fcea8ff 338 char ucMessageID;
kenjiArai 0:d4960fcea8ff 339 char ucData[ 20 ];
kenjiArai 0:d4960fcea8ff 340 } xMessage;
kenjiArai 0:d4960fcea8ff 341
kenjiArai 0:d4960fcea8ff 342 unsigned long ulVar = 10UL;
kenjiArai 0:d4960fcea8ff 343
kenjiArai 0:d4960fcea8ff 344 void vATask( void *pvParameters )
kenjiArai 0:d4960fcea8ff 345 {
kenjiArai 0:d4960fcea8ff 346 xQueueHandle xQueue1, xQueue2;
kenjiArai 0:d4960fcea8ff 347 struct AMessage *pxMessage;
kenjiArai 0:d4960fcea8ff 348
kenjiArai 0:d4960fcea8ff 349 // Create a queue capable of containing 10 unsigned long values.
kenjiArai 0:d4960fcea8ff 350 xQueue1 = xQueueCreate( 10, sizeof( unsigned long ) );
kenjiArai 0:d4960fcea8ff 351
kenjiArai 0:d4960fcea8ff 352 // Create a queue capable of containing 10 pointers to AMessage structures.
kenjiArai 0:d4960fcea8ff 353 // These should be passed by pointer as they contain a lot of data.
kenjiArai 0:d4960fcea8ff 354 xQueue2 = xQueueCreate( 10, sizeof( struct AMessage * ) );
kenjiArai 0:d4960fcea8ff 355
kenjiArai 0:d4960fcea8ff 356 // ...
kenjiArai 0:d4960fcea8ff 357
kenjiArai 0:d4960fcea8ff 358 if( xQueue1 != 0 )
kenjiArai 0:d4960fcea8ff 359 {
kenjiArai 0:d4960fcea8ff 360 // Send an unsigned long. Wait for 10 ticks for space to become
kenjiArai 0:d4960fcea8ff 361 // available if necessary.
kenjiArai 0:d4960fcea8ff 362 if( xQueueSend( xQueue1, ( void * ) &ulVar, ( portTickType ) 10 ) != pdPASS )
kenjiArai 0:d4960fcea8ff 363 {
kenjiArai 0:d4960fcea8ff 364 // Failed to post the message, even after 10 ticks.
kenjiArai 0:d4960fcea8ff 365 }
kenjiArai 0:d4960fcea8ff 366 }
kenjiArai 0:d4960fcea8ff 367
kenjiArai 0:d4960fcea8ff 368 if( xQueue2 != 0 )
kenjiArai 0:d4960fcea8ff 369 {
kenjiArai 0:d4960fcea8ff 370 // Send a pointer to a struct AMessage object. Don't block if the
kenjiArai 0:d4960fcea8ff 371 // queue is already full.
kenjiArai 0:d4960fcea8ff 372 pxMessage = & xMessage;
kenjiArai 0:d4960fcea8ff 373 xQueueSend( xQueue2, ( void * ) &pxMessage, ( portTickType ) 0 );
kenjiArai 0:d4960fcea8ff 374 }
kenjiArai 0:d4960fcea8ff 375
kenjiArai 0:d4960fcea8ff 376 // ... Rest of task code.
kenjiArai 0:d4960fcea8ff 377 }
kenjiArai 0:d4960fcea8ff 378 </pre>
kenjiArai 0:d4960fcea8ff 379 * \defgroup xQueueSend xQueueSend
kenjiArai 0:d4960fcea8ff 380 * \ingroup QueueManagement
kenjiArai 0:d4960fcea8ff 381 */
kenjiArai 0:d4960fcea8ff 382 #define xQueueSend( xQueue, pvItemToQueue, xTicksToWait ) xQueueGenericSend( xQueue, pvItemToQueue, xTicksToWait, queueSEND_TO_BACK )
kenjiArai 0:d4960fcea8ff 383
kenjiArai 0:d4960fcea8ff 384
kenjiArai 0:d4960fcea8ff 385 /**
kenjiArai 0:d4960fcea8ff 386 * queue. h
kenjiArai 0:d4960fcea8ff 387 * <pre>
kenjiArai 0:d4960fcea8ff 388 portBASE_TYPE xQueueGenericSend(
kenjiArai 0:d4960fcea8ff 389 xQueueHandle xQueue,
kenjiArai 0:d4960fcea8ff 390 const void * pvItemToQueue,
kenjiArai 0:d4960fcea8ff 391 portTickType xTicksToWait
kenjiArai 0:d4960fcea8ff 392 portBASE_TYPE xCopyPosition
kenjiArai 0:d4960fcea8ff 393 );
kenjiArai 0:d4960fcea8ff 394 * </pre>
kenjiArai 0:d4960fcea8ff 395 *
kenjiArai 0:d4960fcea8ff 396 * It is preferred that the macros xQueueSend(), xQueueSendToFront() and
kenjiArai 0:d4960fcea8ff 397 * xQueueSendToBack() are used in place of calling this function directly.
kenjiArai 0:d4960fcea8ff 398 *
kenjiArai 0:d4960fcea8ff 399 * Post an item on a queue. The item is queued by copy, not by reference.
kenjiArai 0:d4960fcea8ff 400 * This function must not be called from an interrupt service routine.
kenjiArai 0:d4960fcea8ff 401 * See xQueueSendFromISR () for an alternative which may be used in an ISR.
kenjiArai 0:d4960fcea8ff 402 *
kenjiArai 0:d4960fcea8ff 403 * @param xQueue The handle to the queue on which the item is to be posted.
kenjiArai 0:d4960fcea8ff 404 *
kenjiArai 0:d4960fcea8ff 405 * @param pvItemToQueue A pointer to the item that is to be placed on the
kenjiArai 0:d4960fcea8ff 406 * queue. The size of the items the queue will hold was defined when the
kenjiArai 0:d4960fcea8ff 407 * queue was created, so this many bytes will be copied from pvItemToQueue
kenjiArai 0:d4960fcea8ff 408 * into the queue storage area.
kenjiArai 0:d4960fcea8ff 409 *
kenjiArai 0:d4960fcea8ff 410 * @param xTicksToWait The maximum amount of time the task should block
kenjiArai 0:d4960fcea8ff 411 * waiting for space to become available on the queue, should it already
kenjiArai 0:d4960fcea8ff 412 * be full. The call will return immediately if this is set to 0 and the
kenjiArai 0:d4960fcea8ff 413 * queue is full. The time is defined in tick periods so the constant
kenjiArai 0:d4960fcea8ff 414 * portTICK_RATE_MS should be used to convert to real time if this is required.
kenjiArai 0:d4960fcea8ff 415 *
kenjiArai 0:d4960fcea8ff 416 * @param xCopyPosition Can take the value queueSEND_TO_BACK to place the
kenjiArai 0:d4960fcea8ff 417 * item at the back of the queue, or queueSEND_TO_FRONT to place the item
kenjiArai 0:d4960fcea8ff 418 * at the front of the queue (for high priority messages).
kenjiArai 0:d4960fcea8ff 419 *
kenjiArai 0:d4960fcea8ff 420 * @return pdTRUE if the item was successfully posted, otherwise errQUEUE_FULL.
kenjiArai 0:d4960fcea8ff 421 *
kenjiArai 0:d4960fcea8ff 422 * Example usage:
kenjiArai 0:d4960fcea8ff 423 <pre>
kenjiArai 0:d4960fcea8ff 424 struct AMessage
kenjiArai 0:d4960fcea8ff 425 {
kenjiArai 0:d4960fcea8ff 426 char ucMessageID;
kenjiArai 0:d4960fcea8ff 427 char ucData[ 20 ];
kenjiArai 0:d4960fcea8ff 428 } xMessage;
kenjiArai 0:d4960fcea8ff 429
kenjiArai 0:d4960fcea8ff 430 unsigned long ulVar = 10UL;
kenjiArai 0:d4960fcea8ff 431
kenjiArai 0:d4960fcea8ff 432 void vATask( void *pvParameters )
kenjiArai 0:d4960fcea8ff 433 {
kenjiArai 0:d4960fcea8ff 434 xQueueHandle xQueue1, xQueue2;
kenjiArai 0:d4960fcea8ff 435 struct AMessage *pxMessage;
kenjiArai 0:d4960fcea8ff 436
kenjiArai 0:d4960fcea8ff 437 // Create a queue capable of containing 10 unsigned long values.
kenjiArai 0:d4960fcea8ff 438 xQueue1 = xQueueCreate( 10, sizeof( unsigned long ) );
kenjiArai 0:d4960fcea8ff 439
kenjiArai 0:d4960fcea8ff 440 // Create a queue capable of containing 10 pointers to AMessage structures.
kenjiArai 0:d4960fcea8ff 441 // These should be passed by pointer as they contain a lot of data.
kenjiArai 0:d4960fcea8ff 442 xQueue2 = xQueueCreate( 10, sizeof( struct AMessage * ) );
kenjiArai 0:d4960fcea8ff 443
kenjiArai 0:d4960fcea8ff 444 // ...
kenjiArai 0:d4960fcea8ff 445
kenjiArai 0:d4960fcea8ff 446 if( xQueue1 != 0 )
kenjiArai 0:d4960fcea8ff 447 {
kenjiArai 0:d4960fcea8ff 448 // Send an unsigned long. Wait for 10 ticks for space to become
kenjiArai 0:d4960fcea8ff 449 // available if necessary.
kenjiArai 0:d4960fcea8ff 450 if( xQueueGenericSend( xQueue1, ( void * ) &ulVar, ( portTickType ) 10, queueSEND_TO_BACK ) != pdPASS )
kenjiArai 0:d4960fcea8ff 451 {
kenjiArai 0:d4960fcea8ff 452 // Failed to post the message, even after 10 ticks.
kenjiArai 0:d4960fcea8ff 453 }
kenjiArai 0:d4960fcea8ff 454 }
kenjiArai 0:d4960fcea8ff 455
kenjiArai 0:d4960fcea8ff 456 if( xQueue2 != 0 )
kenjiArai 0:d4960fcea8ff 457 {
kenjiArai 0:d4960fcea8ff 458 // Send a pointer to a struct AMessage object. Don't block if the
kenjiArai 0:d4960fcea8ff 459 // queue is already full.
kenjiArai 0:d4960fcea8ff 460 pxMessage = & xMessage;
kenjiArai 0:d4960fcea8ff 461 xQueueGenericSend( xQueue2, ( void * ) &pxMessage, ( portTickType ) 0, queueSEND_TO_BACK );
kenjiArai 0:d4960fcea8ff 462 }
kenjiArai 0:d4960fcea8ff 463
kenjiArai 0:d4960fcea8ff 464 // ... Rest of task code.
kenjiArai 0:d4960fcea8ff 465 }
kenjiArai 0:d4960fcea8ff 466 </pre>
kenjiArai 0:d4960fcea8ff 467 * \defgroup xQueueSend xQueueSend
kenjiArai 0:d4960fcea8ff 468 * \ingroup QueueManagement
kenjiArai 0:d4960fcea8ff 469 */
kenjiArai 0:d4960fcea8ff 470 signed portBASE_TYPE xQueueGenericSend( xQueueHandle xQueue, const void * const pvItemToQueue, portTickType xTicksToWait, portBASE_TYPE xCopyPosition );
kenjiArai 0:d4960fcea8ff 471
kenjiArai 0:d4960fcea8ff 472 /**
kenjiArai 0:d4960fcea8ff 473 * queue. h
kenjiArai 0:d4960fcea8ff 474 * <pre>
kenjiArai 0:d4960fcea8ff 475 portBASE_TYPE xQueuePeek(
kenjiArai 0:d4960fcea8ff 476 xQueueHandle xQueue,
kenjiArai 0:d4960fcea8ff 477 void *pvBuffer,
kenjiArai 0:d4960fcea8ff 478 portTickType xTicksToWait
kenjiArai 0:d4960fcea8ff 479 );</pre>
kenjiArai 0:d4960fcea8ff 480 *
kenjiArai 0:d4960fcea8ff 481 * This is a macro that calls the xQueueGenericReceive() function.
kenjiArai 0:d4960fcea8ff 482 *
kenjiArai 0:d4960fcea8ff 483 * Receive an item from a queue without removing the item from the queue.
kenjiArai 0:d4960fcea8ff 484 * The item is received by copy so a buffer of adequate size must be
kenjiArai 0:d4960fcea8ff 485 * provided. The number of bytes copied into the buffer was defined when
kenjiArai 0:d4960fcea8ff 486 * the queue was created.
kenjiArai 0:d4960fcea8ff 487 *
kenjiArai 0:d4960fcea8ff 488 * Successfully received items remain on the queue so will be returned again
kenjiArai 0:d4960fcea8ff 489 * by the next call, or a call to xQueueReceive().
kenjiArai 0:d4960fcea8ff 490 *
kenjiArai 0:d4960fcea8ff 491 * This macro must not be used in an interrupt service routine.
kenjiArai 0:d4960fcea8ff 492 *
kenjiArai 0:d4960fcea8ff 493 * @param pxQueue The handle to the queue from which the item is to be
kenjiArai 0:d4960fcea8ff 494 * received.
kenjiArai 0:d4960fcea8ff 495 *
kenjiArai 0:d4960fcea8ff 496 * @param pvBuffer Pointer to the buffer into which the received item will
kenjiArai 0:d4960fcea8ff 497 * be copied.
kenjiArai 0:d4960fcea8ff 498 *
kenjiArai 0:d4960fcea8ff 499 * @param xTicksToWait The maximum amount of time the task should block
kenjiArai 0:d4960fcea8ff 500 * waiting for an item to receive should the queue be empty at the time
kenjiArai 0:d4960fcea8ff 501 * of the call. The time is defined in tick periods so the constant
kenjiArai 0:d4960fcea8ff 502 * portTICK_RATE_MS should be used to convert to real time if this is required.
kenjiArai 0:d4960fcea8ff 503 * xQueuePeek() will return immediately if xTicksToWait is 0 and the queue
kenjiArai 0:d4960fcea8ff 504 * is empty.
kenjiArai 0:d4960fcea8ff 505 *
kenjiArai 0:d4960fcea8ff 506 * @return pdTRUE if an item was successfully received from the queue,
kenjiArai 0:d4960fcea8ff 507 * otherwise pdFALSE.
kenjiArai 0:d4960fcea8ff 508 *
kenjiArai 0:d4960fcea8ff 509 * Example usage:
kenjiArai 0:d4960fcea8ff 510 <pre>
kenjiArai 0:d4960fcea8ff 511 struct AMessage
kenjiArai 0:d4960fcea8ff 512 {
kenjiArai 0:d4960fcea8ff 513 char ucMessageID;
kenjiArai 0:d4960fcea8ff 514 char ucData[ 20 ];
kenjiArai 0:d4960fcea8ff 515 } xMessage;
kenjiArai 0:d4960fcea8ff 516
kenjiArai 0:d4960fcea8ff 517 xQueueHandle xQueue;
kenjiArai 0:d4960fcea8ff 518
kenjiArai 0:d4960fcea8ff 519 // Task to create a queue and post a value.
kenjiArai 0:d4960fcea8ff 520 void vATask( void *pvParameters )
kenjiArai 0:d4960fcea8ff 521 {
kenjiArai 0:d4960fcea8ff 522 struct AMessage *pxMessage;
kenjiArai 0:d4960fcea8ff 523
kenjiArai 0:d4960fcea8ff 524 // Create a queue capable of containing 10 pointers to AMessage structures.
kenjiArai 0:d4960fcea8ff 525 // These should be passed by pointer as they contain a lot of data.
kenjiArai 0:d4960fcea8ff 526 xQueue = xQueueCreate( 10, sizeof( struct AMessage * ) );
kenjiArai 0:d4960fcea8ff 527 if( xQueue == 0 )
kenjiArai 0:d4960fcea8ff 528 {
kenjiArai 0:d4960fcea8ff 529 // Failed to create the queue.
kenjiArai 0:d4960fcea8ff 530 }
kenjiArai 0:d4960fcea8ff 531
kenjiArai 0:d4960fcea8ff 532 // ...
kenjiArai 0:d4960fcea8ff 533
kenjiArai 0:d4960fcea8ff 534 // Send a pointer to a struct AMessage object. Don't block if the
kenjiArai 0:d4960fcea8ff 535 // queue is already full.
kenjiArai 0:d4960fcea8ff 536 pxMessage = & xMessage;
kenjiArai 0:d4960fcea8ff 537 xQueueSend( xQueue, ( void * ) &pxMessage, ( portTickType ) 0 );
kenjiArai 0:d4960fcea8ff 538
kenjiArai 0:d4960fcea8ff 539 // ... Rest of task code.
kenjiArai 0:d4960fcea8ff 540 }
kenjiArai 0:d4960fcea8ff 541
kenjiArai 0:d4960fcea8ff 542 // Task to peek the data from the queue.
kenjiArai 0:d4960fcea8ff 543 void vADifferentTask( void *pvParameters )
kenjiArai 0:d4960fcea8ff 544 {
kenjiArai 0:d4960fcea8ff 545 struct AMessage *pxRxedMessage;
kenjiArai 0:d4960fcea8ff 546
kenjiArai 0:d4960fcea8ff 547 if( xQueue != 0 )
kenjiArai 0:d4960fcea8ff 548 {
kenjiArai 0:d4960fcea8ff 549 // Peek a message on the created queue. Block for 10 ticks if a
kenjiArai 0:d4960fcea8ff 550 // message is not immediately available.
kenjiArai 0:d4960fcea8ff 551 if( xQueuePeek( xQueue, &( pxRxedMessage ), ( portTickType ) 10 ) )
kenjiArai 0:d4960fcea8ff 552 {
kenjiArai 0:d4960fcea8ff 553 // pcRxedMessage now points to the struct AMessage variable posted
kenjiArai 0:d4960fcea8ff 554 // by vATask, but the item still remains on the queue.
kenjiArai 0:d4960fcea8ff 555 }
kenjiArai 0:d4960fcea8ff 556 }
kenjiArai 0:d4960fcea8ff 557
kenjiArai 0:d4960fcea8ff 558 // ... Rest of task code.
kenjiArai 0:d4960fcea8ff 559 }
kenjiArai 0:d4960fcea8ff 560 </pre>
kenjiArai 0:d4960fcea8ff 561 * \defgroup xQueueReceive xQueueReceive
kenjiArai 0:d4960fcea8ff 562 * \ingroup QueueManagement
kenjiArai 0:d4960fcea8ff 563 */
kenjiArai 0:d4960fcea8ff 564 #define xQueuePeek( xQueue, pvBuffer, xTicksToWait ) xQueueGenericReceive( xQueue, pvBuffer, xTicksToWait, pdTRUE )
kenjiArai 0:d4960fcea8ff 565
kenjiArai 0:d4960fcea8ff 566 /**
kenjiArai 0:d4960fcea8ff 567 * queue. h
kenjiArai 0:d4960fcea8ff 568 * <pre>
kenjiArai 0:d4960fcea8ff 569 portBASE_TYPE xQueueReceive(
kenjiArai 0:d4960fcea8ff 570 xQueueHandle xQueue,
kenjiArai 0:d4960fcea8ff 571 void *pvBuffer,
kenjiArai 0:d4960fcea8ff 572 portTickType xTicksToWait
kenjiArai 0:d4960fcea8ff 573 );</pre>
kenjiArai 0:d4960fcea8ff 574 *
kenjiArai 0:d4960fcea8ff 575 * This is a macro that calls the xQueueGenericReceive() function.
kenjiArai 0:d4960fcea8ff 576 *
kenjiArai 0:d4960fcea8ff 577 * Receive an item from a queue. The item is received by copy so a buffer of
kenjiArai 0:d4960fcea8ff 578 * adequate size must be provided. The number of bytes copied into the buffer
kenjiArai 0:d4960fcea8ff 579 * was defined when the queue was created.
kenjiArai 0:d4960fcea8ff 580 *
kenjiArai 0:d4960fcea8ff 581 * Successfully received items are removed from the queue.
kenjiArai 0:d4960fcea8ff 582 *
kenjiArai 0:d4960fcea8ff 583 * This function must not be used in an interrupt service routine. See
kenjiArai 0:d4960fcea8ff 584 * xQueueReceiveFromISR for an alternative that can.
kenjiArai 0:d4960fcea8ff 585 *
kenjiArai 0:d4960fcea8ff 586 * @param pxQueue The handle to the queue from which the item is to be
kenjiArai 0:d4960fcea8ff 587 * received.
kenjiArai 0:d4960fcea8ff 588 *
kenjiArai 0:d4960fcea8ff 589 * @param pvBuffer Pointer to the buffer into which the received item will
kenjiArai 0:d4960fcea8ff 590 * be copied.
kenjiArai 0:d4960fcea8ff 591 *
kenjiArai 0:d4960fcea8ff 592 * @param xTicksToWait The maximum amount of time the task should block
kenjiArai 0:d4960fcea8ff 593 * waiting for an item to receive should the queue be empty at the time
kenjiArai 0:d4960fcea8ff 594 * of the call. xQueueReceive() will return immediately if xTicksToWait
kenjiArai 0:d4960fcea8ff 595 * is zero and the queue is empty. The time is defined in tick periods so the
kenjiArai 0:d4960fcea8ff 596 * constant portTICK_RATE_MS should be used to convert to real time if this is
kenjiArai 0:d4960fcea8ff 597 * required.
kenjiArai 0:d4960fcea8ff 598 *
kenjiArai 0:d4960fcea8ff 599 * @return pdTRUE if an item was successfully received from the queue,
kenjiArai 0:d4960fcea8ff 600 * otherwise pdFALSE.
kenjiArai 0:d4960fcea8ff 601 *
kenjiArai 0:d4960fcea8ff 602 * Example usage:
kenjiArai 0:d4960fcea8ff 603 <pre>
kenjiArai 0:d4960fcea8ff 604 struct AMessage
kenjiArai 0:d4960fcea8ff 605 {
kenjiArai 0:d4960fcea8ff 606 char ucMessageID;
kenjiArai 0:d4960fcea8ff 607 char ucData[ 20 ];
kenjiArai 0:d4960fcea8ff 608 } xMessage;
kenjiArai 0:d4960fcea8ff 609
kenjiArai 0:d4960fcea8ff 610 xQueueHandle xQueue;
kenjiArai 0:d4960fcea8ff 611
kenjiArai 0:d4960fcea8ff 612 // Task to create a queue and post a value.
kenjiArai 0:d4960fcea8ff 613 void vATask( void *pvParameters )
kenjiArai 0:d4960fcea8ff 614 {
kenjiArai 0:d4960fcea8ff 615 struct AMessage *pxMessage;
kenjiArai 0:d4960fcea8ff 616
kenjiArai 0:d4960fcea8ff 617 // Create a queue capable of containing 10 pointers to AMessage structures.
kenjiArai 0:d4960fcea8ff 618 // These should be passed by pointer as they contain a lot of data.
kenjiArai 0:d4960fcea8ff 619 xQueue = xQueueCreate( 10, sizeof( struct AMessage * ) );
kenjiArai 0:d4960fcea8ff 620 if( xQueue == 0 )
kenjiArai 0:d4960fcea8ff 621 {
kenjiArai 0:d4960fcea8ff 622 // Failed to create the queue.
kenjiArai 0:d4960fcea8ff 623 }
kenjiArai 0:d4960fcea8ff 624
kenjiArai 0:d4960fcea8ff 625 // ...
kenjiArai 0:d4960fcea8ff 626
kenjiArai 0:d4960fcea8ff 627 // Send a pointer to a struct AMessage object. Don't block if the
kenjiArai 0:d4960fcea8ff 628 // queue is already full.
kenjiArai 0:d4960fcea8ff 629 pxMessage = & xMessage;
kenjiArai 0:d4960fcea8ff 630 xQueueSend( xQueue, ( void * ) &pxMessage, ( portTickType ) 0 );
kenjiArai 0:d4960fcea8ff 631
kenjiArai 0:d4960fcea8ff 632 // ... Rest of task code.
kenjiArai 0:d4960fcea8ff 633 }
kenjiArai 0:d4960fcea8ff 634
kenjiArai 0:d4960fcea8ff 635 // Task to receive from the queue.
kenjiArai 0:d4960fcea8ff 636 void vADifferentTask( void *pvParameters )
kenjiArai 0:d4960fcea8ff 637 {
kenjiArai 0:d4960fcea8ff 638 struct AMessage *pxRxedMessage;
kenjiArai 0:d4960fcea8ff 639
kenjiArai 0:d4960fcea8ff 640 if( xQueue != 0 )
kenjiArai 0:d4960fcea8ff 641 {
kenjiArai 0:d4960fcea8ff 642 // Receive a message on the created queue. Block for 10 ticks if a
kenjiArai 0:d4960fcea8ff 643 // message is not immediately available.
kenjiArai 0:d4960fcea8ff 644 if( xQueueReceive( xQueue, &( pxRxedMessage ), ( portTickType ) 10 ) )
kenjiArai 0:d4960fcea8ff 645 {
kenjiArai 0:d4960fcea8ff 646 // pcRxedMessage now points to the struct AMessage variable posted
kenjiArai 0:d4960fcea8ff 647 // by vATask.
kenjiArai 0:d4960fcea8ff 648 }
kenjiArai 0:d4960fcea8ff 649 }
kenjiArai 0:d4960fcea8ff 650
kenjiArai 0:d4960fcea8ff 651 // ... Rest of task code.
kenjiArai 0:d4960fcea8ff 652 }
kenjiArai 0:d4960fcea8ff 653 </pre>
kenjiArai 0:d4960fcea8ff 654 * \defgroup xQueueReceive xQueueReceive
kenjiArai 0:d4960fcea8ff 655 * \ingroup QueueManagement
kenjiArai 0:d4960fcea8ff 656 */
kenjiArai 0:d4960fcea8ff 657 #define xQueueReceive( xQueue, pvBuffer, xTicksToWait ) xQueueGenericReceive( xQueue, pvBuffer, xTicksToWait, pdFALSE )
kenjiArai 0:d4960fcea8ff 658
kenjiArai 0:d4960fcea8ff 659
kenjiArai 0:d4960fcea8ff 660 /**
kenjiArai 0:d4960fcea8ff 661 * queue. h
kenjiArai 0:d4960fcea8ff 662 * <pre>
kenjiArai 0:d4960fcea8ff 663 portBASE_TYPE xQueueGenericReceive(
kenjiArai 0:d4960fcea8ff 664 xQueueHandle xQueue,
kenjiArai 0:d4960fcea8ff 665 void *pvBuffer,
kenjiArai 0:d4960fcea8ff 666 portTickType xTicksToWait
kenjiArai 0:d4960fcea8ff 667 portBASE_TYPE xJustPeek
kenjiArai 0:d4960fcea8ff 668 );</pre>
kenjiArai 0:d4960fcea8ff 669 *
kenjiArai 0:d4960fcea8ff 670 * It is preferred that the macro xQueueReceive() be used rather than calling
kenjiArai 0:d4960fcea8ff 671 * this function directly.
kenjiArai 0:d4960fcea8ff 672 *
kenjiArai 0:d4960fcea8ff 673 * Receive an item from a queue. The item is received by copy so a buffer of
kenjiArai 0:d4960fcea8ff 674 * adequate size must be provided. The number of bytes copied into the buffer
kenjiArai 0:d4960fcea8ff 675 * was defined when the queue was created.
kenjiArai 0:d4960fcea8ff 676 *
kenjiArai 0:d4960fcea8ff 677 * This function must not be used in an interrupt service routine. See
kenjiArai 0:d4960fcea8ff 678 * xQueueReceiveFromISR for an alternative that can.
kenjiArai 0:d4960fcea8ff 679 *
kenjiArai 0:d4960fcea8ff 680 * @param pxQueue The handle to the queue from which the item is to be
kenjiArai 0:d4960fcea8ff 681 * received.
kenjiArai 0:d4960fcea8ff 682 *
kenjiArai 0:d4960fcea8ff 683 * @param pvBuffer Pointer to the buffer into which the received item will
kenjiArai 0:d4960fcea8ff 684 * be copied.
kenjiArai 0:d4960fcea8ff 685 *
kenjiArai 0:d4960fcea8ff 686 * @param xTicksToWait The maximum amount of time the task should block
kenjiArai 0:d4960fcea8ff 687 * waiting for an item to receive should the queue be empty at the time
kenjiArai 0:d4960fcea8ff 688 * of the call. The time is defined in tick periods so the constant
kenjiArai 0:d4960fcea8ff 689 * portTICK_RATE_MS should be used to convert to real time if this is required.
kenjiArai 0:d4960fcea8ff 690 * xQueueGenericReceive() will return immediately if the queue is empty and
kenjiArai 0:d4960fcea8ff 691 * xTicksToWait is 0.
kenjiArai 0:d4960fcea8ff 692 *
kenjiArai 0:d4960fcea8ff 693 * @param xJustPeek When set to true, the item received from the queue is not
kenjiArai 0:d4960fcea8ff 694 * actually removed from the queue - meaning a subsequent call to
kenjiArai 0:d4960fcea8ff 695 * xQueueReceive() will return the same item. When set to false, the item
kenjiArai 0:d4960fcea8ff 696 * being received from the queue is also removed from the queue.
kenjiArai 0:d4960fcea8ff 697 *
kenjiArai 0:d4960fcea8ff 698 * @return pdTRUE if an item was successfully received from the queue,
kenjiArai 0:d4960fcea8ff 699 * otherwise pdFALSE.
kenjiArai 0:d4960fcea8ff 700 *
kenjiArai 0:d4960fcea8ff 701 * Example usage:
kenjiArai 0:d4960fcea8ff 702 <pre>
kenjiArai 0:d4960fcea8ff 703 struct AMessage
kenjiArai 0:d4960fcea8ff 704 {
kenjiArai 0:d4960fcea8ff 705 char ucMessageID;
kenjiArai 0:d4960fcea8ff 706 char ucData[ 20 ];
kenjiArai 0:d4960fcea8ff 707 } xMessage;
kenjiArai 0:d4960fcea8ff 708
kenjiArai 0:d4960fcea8ff 709 xQueueHandle xQueue;
kenjiArai 0:d4960fcea8ff 710
kenjiArai 0:d4960fcea8ff 711 // Task to create a queue and post a value.
kenjiArai 0:d4960fcea8ff 712 void vATask( void *pvParameters )
kenjiArai 0:d4960fcea8ff 713 {
kenjiArai 0:d4960fcea8ff 714 struct AMessage *pxMessage;
kenjiArai 0:d4960fcea8ff 715
kenjiArai 0:d4960fcea8ff 716 // Create a queue capable of containing 10 pointers to AMessage structures.
kenjiArai 0:d4960fcea8ff 717 // These should be passed by pointer as they contain a lot of data.
kenjiArai 0:d4960fcea8ff 718 xQueue = xQueueCreate( 10, sizeof( struct AMessage * ) );
kenjiArai 0:d4960fcea8ff 719 if( xQueue == 0 )
kenjiArai 0:d4960fcea8ff 720 {
kenjiArai 0:d4960fcea8ff 721 // Failed to create the queue.
kenjiArai 0:d4960fcea8ff 722 }
kenjiArai 0:d4960fcea8ff 723
kenjiArai 0:d4960fcea8ff 724 // ...
kenjiArai 0:d4960fcea8ff 725
kenjiArai 0:d4960fcea8ff 726 // Send a pointer to a struct AMessage object. Don't block if the
kenjiArai 0:d4960fcea8ff 727 // queue is already full.
kenjiArai 0:d4960fcea8ff 728 pxMessage = & xMessage;
kenjiArai 0:d4960fcea8ff 729 xQueueSend( xQueue, ( void * ) &pxMessage, ( portTickType ) 0 );
kenjiArai 0:d4960fcea8ff 730
kenjiArai 0:d4960fcea8ff 731 // ... Rest of task code.
kenjiArai 0:d4960fcea8ff 732 }
kenjiArai 0:d4960fcea8ff 733
kenjiArai 0:d4960fcea8ff 734 // Task to receive from the queue.
kenjiArai 0:d4960fcea8ff 735 void vADifferentTask( void *pvParameters )
kenjiArai 0:d4960fcea8ff 736 {
kenjiArai 0:d4960fcea8ff 737 struct AMessage *pxRxedMessage;
kenjiArai 0:d4960fcea8ff 738
kenjiArai 0:d4960fcea8ff 739 if( xQueue != 0 )
kenjiArai 0:d4960fcea8ff 740 {
kenjiArai 0:d4960fcea8ff 741 // Receive a message on the created queue. Block for 10 ticks if a
kenjiArai 0:d4960fcea8ff 742 // message is not immediately available.
kenjiArai 0:d4960fcea8ff 743 if( xQueueGenericReceive( xQueue, &( pxRxedMessage ), ( portTickType ) 10 ) )
kenjiArai 0:d4960fcea8ff 744 {
kenjiArai 0:d4960fcea8ff 745 // pcRxedMessage now points to the struct AMessage variable posted
kenjiArai 0:d4960fcea8ff 746 // by vATask.
kenjiArai 0:d4960fcea8ff 747 }
kenjiArai 0:d4960fcea8ff 748 }
kenjiArai 0:d4960fcea8ff 749
kenjiArai 0:d4960fcea8ff 750 // ... Rest of task code.
kenjiArai 0:d4960fcea8ff 751 }
kenjiArai 0:d4960fcea8ff 752 </pre>
kenjiArai 0:d4960fcea8ff 753 * \defgroup xQueueReceive xQueueReceive
kenjiArai 0:d4960fcea8ff 754 * \ingroup QueueManagement
kenjiArai 0:d4960fcea8ff 755 */
kenjiArai 0:d4960fcea8ff 756 signed portBASE_TYPE xQueueGenericReceive( xQueueHandle xQueue, void * const pvBuffer, portTickType xTicksToWait, portBASE_TYPE xJustPeek );
kenjiArai 0:d4960fcea8ff 757
kenjiArai 0:d4960fcea8ff 758 /**
kenjiArai 0:d4960fcea8ff 759 * queue. h
kenjiArai 0:d4960fcea8ff 760 * <pre>unsigned portBASE_TYPE uxQueueMessagesWaiting( const xQueueHandle xQueue );</pre>
kenjiArai 0:d4960fcea8ff 761 *
kenjiArai 0:d4960fcea8ff 762 * Return the number of messages stored in a queue.
kenjiArai 0:d4960fcea8ff 763 *
kenjiArai 0:d4960fcea8ff 764 * @param xQueue A handle to the queue being queried.
kenjiArai 0:d4960fcea8ff 765 *
kenjiArai 0:d4960fcea8ff 766 * @return The number of messages available in the queue.
kenjiArai 0:d4960fcea8ff 767 *
kenjiArai 0:d4960fcea8ff 768 * \page uxQueueMessagesWaiting uxQueueMessagesWaiting
kenjiArai 0:d4960fcea8ff 769 * \ingroup QueueManagement
kenjiArai 0:d4960fcea8ff 770 */
kenjiArai 0:d4960fcea8ff 771 unsigned portBASE_TYPE uxQueueMessagesWaiting( const xQueueHandle xQueue );
kenjiArai 0:d4960fcea8ff 772
kenjiArai 0:d4960fcea8ff 773 /**
kenjiArai 0:d4960fcea8ff 774 * queue. h
kenjiArai 0:d4960fcea8ff 775 * <pre>void vQueueDelete( xQueueHandle xQueue );</pre>
kenjiArai 0:d4960fcea8ff 776 *
kenjiArai 0:d4960fcea8ff 777 * Delete a queue - freeing all the memory allocated for storing of items
kenjiArai 0:d4960fcea8ff 778 * placed on the queue.
kenjiArai 0:d4960fcea8ff 779 *
kenjiArai 0:d4960fcea8ff 780 * @param xQueue A handle to the queue to be deleted.
kenjiArai 0:d4960fcea8ff 781 *
kenjiArai 0:d4960fcea8ff 782 * \page vQueueDelete vQueueDelete
kenjiArai 0:d4960fcea8ff 783 * \ingroup QueueManagement
kenjiArai 0:d4960fcea8ff 784 */
kenjiArai 0:d4960fcea8ff 785 void vQueueDelete( xQueueHandle xQueue );
kenjiArai 0:d4960fcea8ff 786
kenjiArai 0:d4960fcea8ff 787 /**
kenjiArai 0:d4960fcea8ff 788 * queue. h
kenjiArai 0:d4960fcea8ff 789 * <pre>
kenjiArai 0:d4960fcea8ff 790 portBASE_TYPE xQueueSendToFrontFromISR(
kenjiArai 0:d4960fcea8ff 791 xQueueHandle pxQueue,
kenjiArai 0:d4960fcea8ff 792 const void *pvItemToQueue,
kenjiArai 0:d4960fcea8ff 793 portBASE_TYPE *pxHigherPriorityTaskWoken
kenjiArai 0:d4960fcea8ff 794 );
kenjiArai 0:d4960fcea8ff 795 </pre>
kenjiArai 0:d4960fcea8ff 796 *
kenjiArai 0:d4960fcea8ff 797 * This is a macro that calls xQueueGenericSendFromISR().
kenjiArai 0:d4960fcea8ff 798 *
kenjiArai 0:d4960fcea8ff 799 * Post an item to the front of a queue. It is safe to use this macro from
kenjiArai 0:d4960fcea8ff 800 * within an interrupt service routine.
kenjiArai 0:d4960fcea8ff 801 *
kenjiArai 0:d4960fcea8ff 802 * Items are queued by copy not reference so it is preferable to only
kenjiArai 0:d4960fcea8ff 803 * queue small items, especially when called from an ISR. In most cases
kenjiArai 0:d4960fcea8ff 804 * it would be preferable to store a pointer to the item being queued.
kenjiArai 0:d4960fcea8ff 805 *
kenjiArai 0:d4960fcea8ff 806 * @param xQueue The handle to the queue on which the item is to be posted.
kenjiArai 0:d4960fcea8ff 807 *
kenjiArai 0:d4960fcea8ff 808 * @param pvItemToQueue A pointer to the item that is to be placed on the
kenjiArai 0:d4960fcea8ff 809 * queue. The size of the items the queue will hold was defined when the
kenjiArai 0:d4960fcea8ff 810 * queue was created, so this many bytes will be copied from pvItemToQueue
kenjiArai 0:d4960fcea8ff 811 * into the queue storage area.
kenjiArai 0:d4960fcea8ff 812 *
kenjiArai 0:d4960fcea8ff 813 * @param pxHigherPriorityTaskWoken xQueueSendToFrontFromISR() will set
kenjiArai 0:d4960fcea8ff 814 * *pxHigherPriorityTaskWoken to pdTRUE if sending to the queue caused a task
kenjiArai 0:d4960fcea8ff 815 * to unblock, and the unblocked task has a priority higher than the currently
kenjiArai 0:d4960fcea8ff 816 * running task. If xQueueSendToFromFromISR() sets this value to pdTRUE then
kenjiArai 0:d4960fcea8ff 817 * a context switch should be requested before the interrupt is exited.
kenjiArai 0:d4960fcea8ff 818 *
kenjiArai 0:d4960fcea8ff 819 * @return pdTRUE if the data was successfully sent to the queue, otherwise
kenjiArai 0:d4960fcea8ff 820 * errQUEUE_FULL.
kenjiArai 0:d4960fcea8ff 821 *
kenjiArai 0:d4960fcea8ff 822 * Example usage for buffered IO (where the ISR can obtain more than one value
kenjiArai 0:d4960fcea8ff 823 * per call):
kenjiArai 0:d4960fcea8ff 824 <pre>
kenjiArai 0:d4960fcea8ff 825 void vBufferISR( void )
kenjiArai 0:d4960fcea8ff 826 {
kenjiArai 0:d4960fcea8ff 827 char cIn;
kenjiArai 0:d4960fcea8ff 828 portBASE_TYPE xHigherPrioritTaskWoken;
kenjiArai 0:d4960fcea8ff 829
kenjiArai 0:d4960fcea8ff 830 // We have not woken a task at the start of the ISR.
kenjiArai 0:d4960fcea8ff 831 xHigherPriorityTaskWoken = pdFALSE;
kenjiArai 0:d4960fcea8ff 832
kenjiArai 0:d4960fcea8ff 833 // Loop until the buffer is empty.
kenjiArai 0:d4960fcea8ff 834 do
kenjiArai 0:d4960fcea8ff 835 {
kenjiArai 0:d4960fcea8ff 836 // Obtain a byte from the buffer.
kenjiArai 0:d4960fcea8ff 837 cIn = portINPUT_BYTE( RX_REGISTER_ADDRESS );
kenjiArai 0:d4960fcea8ff 838
kenjiArai 0:d4960fcea8ff 839 // Post the byte.
kenjiArai 0:d4960fcea8ff 840 xQueueSendToFrontFromISR( xRxQueue, &cIn, &xHigherPriorityTaskWoken );
kenjiArai 0:d4960fcea8ff 841
kenjiArai 0:d4960fcea8ff 842 } while( portINPUT_BYTE( BUFFER_COUNT ) );
kenjiArai 0:d4960fcea8ff 843
kenjiArai 0:d4960fcea8ff 844 // Now the buffer is empty we can switch context if necessary.
kenjiArai 0:d4960fcea8ff 845 if( xHigherPriorityTaskWoken )
kenjiArai 0:d4960fcea8ff 846 {
kenjiArai 0:d4960fcea8ff 847 taskYIELD ();
kenjiArai 0:d4960fcea8ff 848 }
kenjiArai 0:d4960fcea8ff 849 }
kenjiArai 0:d4960fcea8ff 850 </pre>
kenjiArai 0:d4960fcea8ff 851 *
kenjiArai 0:d4960fcea8ff 852 * \defgroup xQueueSendFromISR xQueueSendFromISR
kenjiArai 0:d4960fcea8ff 853 * \ingroup QueueManagement
kenjiArai 0:d4960fcea8ff 854 */
kenjiArai 0:d4960fcea8ff 855 #define xQueueSendToFrontFromISR( pxQueue, pvItemToQueue, pxHigherPriorityTaskWoken ) xQueueGenericSendFromISR( pxQueue, pvItemToQueue, pxHigherPriorityTaskWoken, queueSEND_TO_FRONT )
kenjiArai 0:d4960fcea8ff 856
kenjiArai 0:d4960fcea8ff 857
kenjiArai 0:d4960fcea8ff 858 /**
kenjiArai 0:d4960fcea8ff 859 * queue. h
kenjiArai 0:d4960fcea8ff 860 * <pre>
kenjiArai 0:d4960fcea8ff 861 portBASE_TYPE xQueueSendToBackFromISR(
kenjiArai 0:d4960fcea8ff 862 xQueueHandle pxQueue,
kenjiArai 0:d4960fcea8ff 863 const void *pvItemToQueue,
kenjiArai 0:d4960fcea8ff 864 portBASE_TYPE *pxHigherPriorityTaskWoken
kenjiArai 0:d4960fcea8ff 865 );
kenjiArai 0:d4960fcea8ff 866 </pre>
kenjiArai 0:d4960fcea8ff 867 *
kenjiArai 0:d4960fcea8ff 868 * This is a macro that calls xQueueGenericSendFromISR().
kenjiArai 0:d4960fcea8ff 869 *
kenjiArai 0:d4960fcea8ff 870 * Post an item to the back of a queue. It is safe to use this macro from
kenjiArai 0:d4960fcea8ff 871 * within an interrupt service routine.
kenjiArai 0:d4960fcea8ff 872 *
kenjiArai 0:d4960fcea8ff 873 * Items are queued by copy not reference so it is preferable to only
kenjiArai 0:d4960fcea8ff 874 * queue small items, especially when called from an ISR. In most cases
kenjiArai 0:d4960fcea8ff 875 * it would be preferable to store a pointer to the item being queued.
kenjiArai 0:d4960fcea8ff 876 *
kenjiArai 0:d4960fcea8ff 877 * @param xQueue The handle to the queue on which the item is to be posted.
kenjiArai 0:d4960fcea8ff 878 *
kenjiArai 0:d4960fcea8ff 879 * @param pvItemToQueue A pointer to the item that is to be placed on the
kenjiArai 0:d4960fcea8ff 880 * queue. The size of the items the queue will hold was defined when the
kenjiArai 0:d4960fcea8ff 881 * queue was created, so this many bytes will be copied from pvItemToQueue
kenjiArai 0:d4960fcea8ff 882 * into the queue storage area.
kenjiArai 0:d4960fcea8ff 883 *
kenjiArai 0:d4960fcea8ff 884 * @param pxHigherPriorityTaskWoken xQueueSendToBackFromISR() will set
kenjiArai 0:d4960fcea8ff 885 * *pxHigherPriorityTaskWoken to pdTRUE if sending to the queue caused a task
kenjiArai 0:d4960fcea8ff 886 * to unblock, and the unblocked task has a priority higher than the currently
kenjiArai 0:d4960fcea8ff 887 * running task. If xQueueSendToBackFromISR() sets this value to pdTRUE then
kenjiArai 0:d4960fcea8ff 888 * a context switch should be requested before the interrupt is exited.
kenjiArai 0:d4960fcea8ff 889 *
kenjiArai 0:d4960fcea8ff 890 * @return pdTRUE if the data was successfully sent to the queue, otherwise
kenjiArai 0:d4960fcea8ff 891 * errQUEUE_FULL.
kenjiArai 0:d4960fcea8ff 892 *
kenjiArai 0:d4960fcea8ff 893 * Example usage for buffered IO (where the ISR can obtain more than one value
kenjiArai 0:d4960fcea8ff 894 * per call):
kenjiArai 0:d4960fcea8ff 895 <pre>
kenjiArai 0:d4960fcea8ff 896 void vBufferISR( void )
kenjiArai 0:d4960fcea8ff 897 {
kenjiArai 0:d4960fcea8ff 898 char cIn;
kenjiArai 0:d4960fcea8ff 899 portBASE_TYPE xHigherPriorityTaskWoken;
kenjiArai 0:d4960fcea8ff 900
kenjiArai 0:d4960fcea8ff 901 // We have not woken a task at the start of the ISR.
kenjiArai 0:d4960fcea8ff 902 xHigherPriorityTaskWoken = pdFALSE;
kenjiArai 0:d4960fcea8ff 903
kenjiArai 0:d4960fcea8ff 904 // Loop until the buffer is empty.
kenjiArai 0:d4960fcea8ff 905 do
kenjiArai 0:d4960fcea8ff 906 {
kenjiArai 0:d4960fcea8ff 907 // Obtain a byte from the buffer.
kenjiArai 0:d4960fcea8ff 908 cIn = portINPUT_BYTE( RX_REGISTER_ADDRESS );
kenjiArai 0:d4960fcea8ff 909
kenjiArai 0:d4960fcea8ff 910 // Post the byte.
kenjiArai 0:d4960fcea8ff 911 xQueueSendToBackFromISR( xRxQueue, &cIn, &xHigherPriorityTaskWoken );
kenjiArai 0:d4960fcea8ff 912
kenjiArai 0:d4960fcea8ff 913 } while( portINPUT_BYTE( BUFFER_COUNT ) );
kenjiArai 0:d4960fcea8ff 914
kenjiArai 0:d4960fcea8ff 915 // Now the buffer is empty we can switch context if necessary.
kenjiArai 0:d4960fcea8ff 916 if( xHigherPriorityTaskWoken )
kenjiArai 0:d4960fcea8ff 917 {
kenjiArai 0:d4960fcea8ff 918 taskYIELD ();
kenjiArai 0:d4960fcea8ff 919 }
kenjiArai 0:d4960fcea8ff 920 }
kenjiArai 0:d4960fcea8ff 921 </pre>
kenjiArai 0:d4960fcea8ff 922 *
kenjiArai 0:d4960fcea8ff 923 * \defgroup xQueueSendFromISR xQueueSendFromISR
kenjiArai 0:d4960fcea8ff 924 * \ingroup QueueManagement
kenjiArai 0:d4960fcea8ff 925 */
kenjiArai 0:d4960fcea8ff 926 #define xQueueSendToBackFromISR( pxQueue, pvItemToQueue, pxHigherPriorityTaskWoken ) xQueueGenericSendFromISR( pxQueue, pvItemToQueue, pxHigherPriorityTaskWoken, queueSEND_TO_BACK )
kenjiArai 0:d4960fcea8ff 927
kenjiArai 0:d4960fcea8ff 928 /**
kenjiArai 0:d4960fcea8ff 929 * queue. h
kenjiArai 0:d4960fcea8ff 930 * <pre>
kenjiArai 0:d4960fcea8ff 931 portBASE_TYPE xQueueSendFromISR(
kenjiArai 0:d4960fcea8ff 932 xQueueHandle pxQueue,
kenjiArai 0:d4960fcea8ff 933 const void *pvItemToQueue,
kenjiArai 0:d4960fcea8ff 934 portBASE_TYPE *pxHigherPriorityTaskWoken
kenjiArai 0:d4960fcea8ff 935 );
kenjiArai 0:d4960fcea8ff 936 </pre>
kenjiArai 0:d4960fcea8ff 937 *
kenjiArai 0:d4960fcea8ff 938 * This is a macro that calls xQueueGenericSendFromISR(). It is included
kenjiArai 0:d4960fcea8ff 939 * for backward compatibility with versions of FreeRTOS.org that did not
kenjiArai 0:d4960fcea8ff 940 * include the xQueueSendToBackFromISR() and xQueueSendToFrontFromISR()
kenjiArai 0:d4960fcea8ff 941 * macros.
kenjiArai 0:d4960fcea8ff 942 *
kenjiArai 0:d4960fcea8ff 943 * Post an item to the back of a queue. It is safe to use this function from
kenjiArai 0:d4960fcea8ff 944 * within an interrupt service routine.
kenjiArai 0:d4960fcea8ff 945 *
kenjiArai 0:d4960fcea8ff 946 * Items are queued by copy not reference so it is preferable to only
kenjiArai 0:d4960fcea8ff 947 * queue small items, especially when called from an ISR. In most cases
kenjiArai 0:d4960fcea8ff 948 * it would be preferable to store a pointer to the item being queued.
kenjiArai 0:d4960fcea8ff 949 *
kenjiArai 0:d4960fcea8ff 950 * @param xQueue The handle to the queue on which the item is to be posted.
kenjiArai 0:d4960fcea8ff 951 *
kenjiArai 0:d4960fcea8ff 952 * @param pvItemToQueue A pointer to the item that is to be placed on the
kenjiArai 0:d4960fcea8ff 953 * queue. The size of the items the queue will hold was defined when the
kenjiArai 0:d4960fcea8ff 954 * queue was created, so this many bytes will be copied from pvItemToQueue
kenjiArai 0:d4960fcea8ff 955 * into the queue storage area.
kenjiArai 0:d4960fcea8ff 956 *
kenjiArai 0:d4960fcea8ff 957 * @param pxHigherPriorityTaskWoken xQueueSendFromISR() will set
kenjiArai 0:d4960fcea8ff 958 * *pxHigherPriorityTaskWoken to pdTRUE if sending to the queue caused a task
kenjiArai 0:d4960fcea8ff 959 * to unblock, and the unblocked task has a priority higher than the currently
kenjiArai 0:d4960fcea8ff 960 * running task. If xQueueSendFromISR() sets this value to pdTRUE then
kenjiArai 0:d4960fcea8ff 961 * a context switch should be requested before the interrupt is exited.
kenjiArai 0:d4960fcea8ff 962 *
kenjiArai 0:d4960fcea8ff 963 * @return pdTRUE if the data was successfully sent to the queue, otherwise
kenjiArai 0:d4960fcea8ff 964 * errQUEUE_FULL.
kenjiArai 0:d4960fcea8ff 965 *
kenjiArai 0:d4960fcea8ff 966 * Example usage for buffered IO (where the ISR can obtain more than one value
kenjiArai 0:d4960fcea8ff 967 * per call):
kenjiArai 0:d4960fcea8ff 968 <pre>
kenjiArai 0:d4960fcea8ff 969 void vBufferISR( void )
kenjiArai 0:d4960fcea8ff 970 {
kenjiArai 0:d4960fcea8ff 971 char cIn;
kenjiArai 0:d4960fcea8ff 972 portBASE_TYPE xHigherPriorityTaskWoken;
kenjiArai 0:d4960fcea8ff 973
kenjiArai 0:d4960fcea8ff 974 // We have not woken a task at the start of the ISR.
kenjiArai 0:d4960fcea8ff 975 xHigherPriorityTaskWoken = pdFALSE;
kenjiArai 0:d4960fcea8ff 976
kenjiArai 0:d4960fcea8ff 977 // Loop until the buffer is empty.
kenjiArai 0:d4960fcea8ff 978 do
kenjiArai 0:d4960fcea8ff 979 {
kenjiArai 0:d4960fcea8ff 980 // Obtain a byte from the buffer.
kenjiArai 0:d4960fcea8ff 981 cIn = portINPUT_BYTE( RX_REGISTER_ADDRESS );
kenjiArai 0:d4960fcea8ff 982
kenjiArai 0:d4960fcea8ff 983 // Post the byte.
kenjiArai 0:d4960fcea8ff 984 xQueueSendFromISR( xRxQueue, &cIn, &xHigherPriorityTaskWoken );
kenjiArai 0:d4960fcea8ff 985
kenjiArai 0:d4960fcea8ff 986 } while( portINPUT_BYTE( BUFFER_COUNT ) );
kenjiArai 0:d4960fcea8ff 987
kenjiArai 0:d4960fcea8ff 988 // Now the buffer is empty we can switch context if necessary.
kenjiArai 0:d4960fcea8ff 989 if( xHigherPriorityTaskWoken )
kenjiArai 0:d4960fcea8ff 990 {
kenjiArai 0:d4960fcea8ff 991 // Actual macro used here is port specific.
kenjiArai 0:d4960fcea8ff 992 taskYIELD_FROM_ISR ();
kenjiArai 0:d4960fcea8ff 993 }
kenjiArai 0:d4960fcea8ff 994 }
kenjiArai 0:d4960fcea8ff 995 </pre>
kenjiArai 0:d4960fcea8ff 996 *
kenjiArai 0:d4960fcea8ff 997 * \defgroup xQueueSendFromISR xQueueSendFromISR
kenjiArai 0:d4960fcea8ff 998 * \ingroup QueueManagement
kenjiArai 0:d4960fcea8ff 999 */
kenjiArai 0:d4960fcea8ff 1000 #define xQueueSendFromISR( pxQueue, pvItemToQueue, pxHigherPriorityTaskWoken ) xQueueGenericSendFromISR( pxQueue, pvItemToQueue, pxHigherPriorityTaskWoken, queueSEND_TO_BACK )
kenjiArai 0:d4960fcea8ff 1001
kenjiArai 0:d4960fcea8ff 1002 /**
kenjiArai 0:d4960fcea8ff 1003 * queue. h
kenjiArai 0:d4960fcea8ff 1004 * <pre>
kenjiArai 0:d4960fcea8ff 1005 portBASE_TYPE xQueueGenericSendFromISR(
kenjiArai 0:d4960fcea8ff 1006 xQueueHandle pxQueue,
kenjiArai 0:d4960fcea8ff 1007 const void *pvItemToQueue,
kenjiArai 0:d4960fcea8ff 1008 portBASE_TYPE *pxHigherPriorityTaskWoken,
kenjiArai 0:d4960fcea8ff 1009 portBASE_TYPE xCopyPosition
kenjiArai 0:d4960fcea8ff 1010 );
kenjiArai 0:d4960fcea8ff 1011 </pre>
kenjiArai 0:d4960fcea8ff 1012 *
kenjiArai 0:d4960fcea8ff 1013 * It is preferred that the macros xQueueSendFromISR(),
kenjiArai 0:d4960fcea8ff 1014 * xQueueSendToFrontFromISR() and xQueueSendToBackFromISR() be used in place
kenjiArai 0:d4960fcea8ff 1015 * of calling this function directly.
kenjiArai 0:d4960fcea8ff 1016 *
kenjiArai 0:d4960fcea8ff 1017 * Post an item on a queue. It is safe to use this function from within an
kenjiArai 0:d4960fcea8ff 1018 * interrupt service routine.
kenjiArai 0:d4960fcea8ff 1019 *
kenjiArai 0:d4960fcea8ff 1020 * Items are queued by copy not reference so it is preferable to only
kenjiArai 0:d4960fcea8ff 1021 * queue small items, especially when called from an ISR. In most cases
kenjiArai 0:d4960fcea8ff 1022 * it would be preferable to store a pointer to the item being queued.
kenjiArai 0:d4960fcea8ff 1023 *
kenjiArai 0:d4960fcea8ff 1024 * @param xQueue The handle to the queue on which the item is to be posted.
kenjiArai 0:d4960fcea8ff 1025 *
kenjiArai 0:d4960fcea8ff 1026 * @param pvItemToQueue A pointer to the item that is to be placed on the
kenjiArai 0:d4960fcea8ff 1027 * queue. The size of the items the queue will hold was defined when the
kenjiArai 0:d4960fcea8ff 1028 * queue was created, so this many bytes will be copied from pvItemToQueue
kenjiArai 0:d4960fcea8ff 1029 * into the queue storage area.
kenjiArai 0:d4960fcea8ff 1030 *
kenjiArai 0:d4960fcea8ff 1031 * @param pxHigherPriorityTaskWoken xQueueGenericSendFromISR() will set
kenjiArai 0:d4960fcea8ff 1032 * *pxHigherPriorityTaskWoken to pdTRUE if sending to the queue caused a task
kenjiArai 0:d4960fcea8ff 1033 * to unblock, and the unblocked task has a priority higher than the currently
kenjiArai 0:d4960fcea8ff 1034 * running task. If xQueueGenericSendFromISR() sets this value to pdTRUE then
kenjiArai 0:d4960fcea8ff 1035 * a context switch should be requested before the interrupt is exited.
kenjiArai 0:d4960fcea8ff 1036 *
kenjiArai 0:d4960fcea8ff 1037 * @param xCopyPosition Can take the value queueSEND_TO_BACK to place the
kenjiArai 0:d4960fcea8ff 1038 * item at the back of the queue, or queueSEND_TO_FRONT to place the item
kenjiArai 0:d4960fcea8ff 1039 * at the front of the queue (for high priority messages).
kenjiArai 0:d4960fcea8ff 1040 *
kenjiArai 0:d4960fcea8ff 1041 * @return pdTRUE if the data was successfully sent to the queue, otherwise
kenjiArai 0:d4960fcea8ff 1042 * errQUEUE_FULL.
kenjiArai 0:d4960fcea8ff 1043 *
kenjiArai 0:d4960fcea8ff 1044 * Example usage for buffered IO (where the ISR can obtain more than one value
kenjiArai 0:d4960fcea8ff 1045 * per call):
kenjiArai 0:d4960fcea8ff 1046 <pre>
kenjiArai 0:d4960fcea8ff 1047 void vBufferISR( void )
kenjiArai 0:d4960fcea8ff 1048 {
kenjiArai 0:d4960fcea8ff 1049 char cIn;
kenjiArai 0:d4960fcea8ff 1050 portBASE_TYPE xHigherPriorityTaskWokenByPost;
kenjiArai 0:d4960fcea8ff 1051
kenjiArai 0:d4960fcea8ff 1052 // We have not woken a task at the start of the ISR.
kenjiArai 0:d4960fcea8ff 1053 xHigherPriorityTaskWokenByPost = pdFALSE;
kenjiArai 0:d4960fcea8ff 1054
kenjiArai 0:d4960fcea8ff 1055 // Loop until the buffer is empty.
kenjiArai 0:d4960fcea8ff 1056 do
kenjiArai 0:d4960fcea8ff 1057 {
kenjiArai 0:d4960fcea8ff 1058 // Obtain a byte from the buffer.
kenjiArai 0:d4960fcea8ff 1059 cIn = portINPUT_BYTE( RX_REGISTER_ADDRESS );
kenjiArai 0:d4960fcea8ff 1060
kenjiArai 0:d4960fcea8ff 1061 // Post each byte.
kenjiArai 0:d4960fcea8ff 1062 xQueueGenericSendFromISR( xRxQueue, &cIn, &xHigherPriorityTaskWokenByPost, queueSEND_TO_BACK );
kenjiArai 0:d4960fcea8ff 1063
kenjiArai 0:d4960fcea8ff 1064 } while( portINPUT_BYTE( BUFFER_COUNT ) );
kenjiArai 0:d4960fcea8ff 1065
kenjiArai 0:d4960fcea8ff 1066 // Now the buffer is empty we can switch context if necessary. Note that the
kenjiArai 0:d4960fcea8ff 1067 // name of the yield function required is port specific.
kenjiArai 0:d4960fcea8ff 1068 if( xHigherPriorityTaskWokenByPost )
kenjiArai 0:d4960fcea8ff 1069 {
kenjiArai 0:d4960fcea8ff 1070 taskYIELD_YIELD_FROM_ISR();
kenjiArai 0:d4960fcea8ff 1071 }
kenjiArai 0:d4960fcea8ff 1072 }
kenjiArai 0:d4960fcea8ff 1073 </pre>
kenjiArai 0:d4960fcea8ff 1074 *
kenjiArai 0:d4960fcea8ff 1075 * \defgroup xQueueSendFromISR xQueueSendFromISR
kenjiArai 0:d4960fcea8ff 1076 * \ingroup QueueManagement
kenjiArai 0:d4960fcea8ff 1077 */
kenjiArai 0:d4960fcea8ff 1078 signed portBASE_TYPE xQueueGenericSendFromISR( xQueueHandle pxQueue, const void * const pvItemToQueue, signed portBASE_TYPE *pxHigherPriorityTaskWoken, portBASE_TYPE xCopyPosition );
kenjiArai 0:d4960fcea8ff 1079
kenjiArai 0:d4960fcea8ff 1080 /**
kenjiArai 0:d4960fcea8ff 1081 * queue. h
kenjiArai 0:d4960fcea8ff 1082 * <pre>
kenjiArai 0:d4960fcea8ff 1083 portBASE_TYPE xQueueReceiveFromISR(
kenjiArai 0:d4960fcea8ff 1084 xQueueHandle pxQueue,
kenjiArai 0:d4960fcea8ff 1085 void *pvBuffer,
kenjiArai 0:d4960fcea8ff 1086 portBASE_TYPE *pxTaskWoken
kenjiArai 0:d4960fcea8ff 1087 );
kenjiArai 0:d4960fcea8ff 1088 * </pre>
kenjiArai 0:d4960fcea8ff 1089 *
kenjiArai 0:d4960fcea8ff 1090 * Receive an item from a queue. It is safe to use this function from within an
kenjiArai 0:d4960fcea8ff 1091 * interrupt service routine.
kenjiArai 0:d4960fcea8ff 1092 *
kenjiArai 0:d4960fcea8ff 1093 * @param pxQueue The handle to the queue from which the item is to be
kenjiArai 0:d4960fcea8ff 1094 * received.
kenjiArai 0:d4960fcea8ff 1095 *
kenjiArai 0:d4960fcea8ff 1096 * @param pvBuffer Pointer to the buffer into which the received item will
kenjiArai 0:d4960fcea8ff 1097 * be copied.
kenjiArai 0:d4960fcea8ff 1098 *
kenjiArai 0:d4960fcea8ff 1099 * @param pxTaskWoken A task may be blocked waiting for space to become
kenjiArai 0:d4960fcea8ff 1100 * available on the queue. If xQueueReceiveFromISR causes such a task to
kenjiArai 0:d4960fcea8ff 1101 * unblock *pxTaskWoken will get set to pdTRUE, otherwise *pxTaskWoken will
kenjiArai 0:d4960fcea8ff 1102 * remain unchanged.
kenjiArai 0:d4960fcea8ff 1103 *
kenjiArai 0:d4960fcea8ff 1104 * @return pdTRUE if an item was successfully received from the queue,
kenjiArai 0:d4960fcea8ff 1105 * otherwise pdFALSE.
kenjiArai 0:d4960fcea8ff 1106 *
kenjiArai 0:d4960fcea8ff 1107 * Example usage:
kenjiArai 0:d4960fcea8ff 1108 <pre>
kenjiArai 0:d4960fcea8ff 1109
kenjiArai 0:d4960fcea8ff 1110 xQueueHandle xQueue;
kenjiArai 0:d4960fcea8ff 1111
kenjiArai 0:d4960fcea8ff 1112 // Function to create a queue and post some values.
kenjiArai 0:d4960fcea8ff 1113 void vAFunction( void *pvParameters )
kenjiArai 0:d4960fcea8ff 1114 {
kenjiArai 0:d4960fcea8ff 1115 char cValueToPost;
kenjiArai 0:d4960fcea8ff 1116 const portTickType xBlockTime = ( portTickType )0xff;
kenjiArai 0:d4960fcea8ff 1117
kenjiArai 0:d4960fcea8ff 1118 // Create a queue capable of containing 10 characters.
kenjiArai 0:d4960fcea8ff 1119 xQueue = xQueueCreate( 10, sizeof( char ) );
kenjiArai 0:d4960fcea8ff 1120 if( xQueue == 0 )
kenjiArai 0:d4960fcea8ff 1121 {
kenjiArai 0:d4960fcea8ff 1122 // Failed to create the queue.
kenjiArai 0:d4960fcea8ff 1123 }
kenjiArai 0:d4960fcea8ff 1124
kenjiArai 0:d4960fcea8ff 1125 // ...
kenjiArai 0:d4960fcea8ff 1126
kenjiArai 0:d4960fcea8ff 1127 // Post some characters that will be used within an ISR. If the queue
kenjiArai 0:d4960fcea8ff 1128 // is full then this task will block for xBlockTime ticks.
kenjiArai 0:d4960fcea8ff 1129 cValueToPost = 'a';
kenjiArai 0:d4960fcea8ff 1130 xQueueSend( xQueue, ( void * ) &cValueToPost, xBlockTime );
kenjiArai 0:d4960fcea8ff 1131 cValueToPost = 'b';
kenjiArai 0:d4960fcea8ff 1132 xQueueSend( xQueue, ( void * ) &cValueToPost, xBlockTime );
kenjiArai 0:d4960fcea8ff 1133
kenjiArai 0:d4960fcea8ff 1134 // ... keep posting characters ... this task may block when the queue
kenjiArai 0:d4960fcea8ff 1135 // becomes full.
kenjiArai 0:d4960fcea8ff 1136
kenjiArai 0:d4960fcea8ff 1137 cValueToPost = 'c';
kenjiArai 0:d4960fcea8ff 1138 xQueueSend( xQueue, ( void * ) &cValueToPost, xBlockTime );
kenjiArai 0:d4960fcea8ff 1139 }
kenjiArai 0:d4960fcea8ff 1140
kenjiArai 0:d4960fcea8ff 1141 // ISR that outputs all the characters received on the queue.
kenjiArai 0:d4960fcea8ff 1142 void vISR_Routine( void )
kenjiArai 0:d4960fcea8ff 1143 {
kenjiArai 0:d4960fcea8ff 1144 portBASE_TYPE xTaskWokenByReceive = pdFALSE;
kenjiArai 0:d4960fcea8ff 1145 char cRxedChar;
kenjiArai 0:d4960fcea8ff 1146
kenjiArai 0:d4960fcea8ff 1147 while( xQueueReceiveFromISR( xQueue, ( void * ) &cRxedChar, &xTaskWokenByReceive) )
kenjiArai 0:d4960fcea8ff 1148 {
kenjiArai 0:d4960fcea8ff 1149 // A character was received. Output the character now.
kenjiArai 0:d4960fcea8ff 1150 vOutputCharacter( cRxedChar );
kenjiArai 0:d4960fcea8ff 1151
kenjiArai 0:d4960fcea8ff 1152 // If removing the character from the queue woke the task that was
kenjiArai 0:d4960fcea8ff 1153 // posting onto the queue cTaskWokenByReceive will have been set to
kenjiArai 0:d4960fcea8ff 1154 // pdTRUE. No matter how many times this loop iterates only one
kenjiArai 0:d4960fcea8ff 1155 // task will be woken.
kenjiArai 0:d4960fcea8ff 1156 }
kenjiArai 0:d4960fcea8ff 1157
kenjiArai 0:d4960fcea8ff 1158 if( cTaskWokenByPost != ( char ) pdFALSE;
kenjiArai 0:d4960fcea8ff 1159 {
kenjiArai 0:d4960fcea8ff 1160 taskYIELD ();
kenjiArai 0:d4960fcea8ff 1161 }
kenjiArai 0:d4960fcea8ff 1162 }
kenjiArai 0:d4960fcea8ff 1163 </pre>
kenjiArai 0:d4960fcea8ff 1164 * \defgroup xQueueReceiveFromISR xQueueReceiveFromISR
kenjiArai 0:d4960fcea8ff 1165 * \ingroup QueueManagement
kenjiArai 0:d4960fcea8ff 1166 */
kenjiArai 0:d4960fcea8ff 1167 signed portBASE_TYPE xQueueReceiveFromISR( xQueueHandle pxQueue, void * const pvBuffer, signed portBASE_TYPE *pxTaskWoken );
kenjiArai 0:d4960fcea8ff 1168
kenjiArai 0:d4960fcea8ff 1169 /*
kenjiArai 0:d4960fcea8ff 1170 * Utilities to query queue that are safe to use from an ISR. These utilities
kenjiArai 0:d4960fcea8ff 1171 * should be used only from witin an ISR, or within a critical section.
kenjiArai 0:d4960fcea8ff 1172 */
kenjiArai 0:d4960fcea8ff 1173 signed portBASE_TYPE xQueueIsQueueEmptyFromISR( const xQueueHandle pxQueue );
kenjiArai 0:d4960fcea8ff 1174 signed portBASE_TYPE xQueueIsQueueFullFromISR( const xQueueHandle pxQueue );
kenjiArai 0:d4960fcea8ff 1175 unsigned portBASE_TYPE uxQueueMessagesWaitingFromISR( const xQueueHandle pxQueue );
kenjiArai 0:d4960fcea8ff 1176
kenjiArai 0:d4960fcea8ff 1177
kenjiArai 0:d4960fcea8ff 1178 /*
kenjiArai 0:d4960fcea8ff 1179 * xQueueAltGenericSend() is an alternative version of xQueueGenericSend().
kenjiArai 0:d4960fcea8ff 1180 * Likewise xQueueAltGenericReceive() is an alternative version of
kenjiArai 0:d4960fcea8ff 1181 * xQueueGenericReceive().
kenjiArai 0:d4960fcea8ff 1182 *
kenjiArai 0:d4960fcea8ff 1183 * The source code that implements the alternative (Alt) API is much
kenjiArai 0:d4960fcea8ff 1184 * simpler because it executes everything from within a critical section.
kenjiArai 0:d4960fcea8ff 1185 * This is the approach taken by many other RTOSes, but FreeRTOS.org has the
kenjiArai 0:d4960fcea8ff 1186 * preferred fully featured API too. The fully featured API has more
kenjiArai 0:d4960fcea8ff 1187 * complex code that takes longer to execute, but makes much less use of
kenjiArai 0:d4960fcea8ff 1188 * critical sections. Therefore the alternative API sacrifices interrupt
kenjiArai 0:d4960fcea8ff 1189 * responsiveness to gain execution speed, whereas the fully featured API
kenjiArai 0:d4960fcea8ff 1190 * sacrifices execution speed to ensure better interrupt responsiveness.
kenjiArai 0:d4960fcea8ff 1191 */
kenjiArai 0:d4960fcea8ff 1192 signed portBASE_TYPE xQueueAltGenericSend( xQueueHandle pxQueue, const void * const pvItemToQueue, portTickType xTicksToWait, portBASE_TYPE xCopyPosition );
kenjiArai 0:d4960fcea8ff 1193 signed portBASE_TYPE xQueueAltGenericReceive( xQueueHandle pxQueue, void * const pvBuffer, portTickType xTicksToWait, portBASE_TYPE xJustPeeking );
kenjiArai 0:d4960fcea8ff 1194 #define xQueueAltSendToFront( xQueue, pvItemToQueue, xTicksToWait ) xQueueAltGenericSend( xQueue, pvItemToQueue, xTicksToWait, queueSEND_TO_FRONT )
kenjiArai 0:d4960fcea8ff 1195 #define xQueueAltSendToBack( xQueue, pvItemToQueue, xTicksToWait ) xQueueAltGenericSend( xQueue, pvItemToQueue, xTicksToWait, queueSEND_TO_BACK )
kenjiArai 0:d4960fcea8ff 1196 #define xQueueAltReceive( xQueue, pvBuffer, xTicksToWait ) xQueueAltGenericReceive( xQueue, pvBuffer, xTicksToWait, pdFALSE )
kenjiArai 0:d4960fcea8ff 1197 #define xQueueAltPeek( xQueue, pvBuffer, xTicksToWait ) xQueueAltGenericReceive( xQueue, pvBuffer, xTicksToWait, pdTRUE )
kenjiArai 0:d4960fcea8ff 1198
kenjiArai 0:d4960fcea8ff 1199 /*
kenjiArai 0:d4960fcea8ff 1200 * The functions defined above are for passing data to and from tasks. The
kenjiArai 0:d4960fcea8ff 1201 * functions below are the equivalents for passing data to and from
kenjiArai 0:d4960fcea8ff 1202 * co-routines.
kenjiArai 0:d4960fcea8ff 1203 *
kenjiArai 0:d4960fcea8ff 1204 * These functions are called from the co-routine macro implementation and
kenjiArai 0:d4960fcea8ff 1205 * should not be called directly from application code. Instead use the macro
kenjiArai 0:d4960fcea8ff 1206 * wrappers defined within croutine.h.
kenjiArai 0:d4960fcea8ff 1207 */
kenjiArai 0:d4960fcea8ff 1208 signed portBASE_TYPE xQueueCRSendFromISR( xQueueHandle pxQueue, const void *pvItemToQueue, signed portBASE_TYPE xCoRoutinePreviouslyWoken );
kenjiArai 0:d4960fcea8ff 1209 signed portBASE_TYPE xQueueCRReceiveFromISR( xQueueHandle pxQueue, void *pvBuffer, signed portBASE_TYPE *pxTaskWoken );
kenjiArai 0:d4960fcea8ff 1210 signed portBASE_TYPE xQueueCRSend( xQueueHandle pxQueue, const void *pvItemToQueue, portTickType xTicksToWait );
kenjiArai 0:d4960fcea8ff 1211 signed portBASE_TYPE xQueueCRReceive( xQueueHandle pxQueue, void *pvBuffer, portTickType xTicksToWait );
kenjiArai 0:d4960fcea8ff 1212
kenjiArai 0:d4960fcea8ff 1213 /*
kenjiArai 0:d4960fcea8ff 1214 * For internal use only. Use xSemaphoreCreateMutex() or
kenjiArai 0:d4960fcea8ff 1215 * xSemaphoreCreateCounting() instead of calling these functions directly.
kenjiArai 0:d4960fcea8ff 1216 */
kenjiArai 0:d4960fcea8ff 1217 xQueueHandle xQueueCreateMutex( void );
kenjiArai 0:d4960fcea8ff 1218 xQueueHandle xQueueCreateCountingSemaphore( unsigned portBASE_TYPE uxCountValue, unsigned portBASE_TYPE uxInitialCount );
kenjiArai 0:d4960fcea8ff 1219
kenjiArai 0:d4960fcea8ff 1220 /*
kenjiArai 0:d4960fcea8ff 1221 * For internal use only. Use xSemaphoreTakeMutexRecursive() or
kenjiArai 0:d4960fcea8ff 1222 * xSemaphoreGiveMutexRecursive() instead of calling these functions directly.
kenjiArai 0:d4960fcea8ff 1223 */
kenjiArai 0:d4960fcea8ff 1224 portBASE_TYPE xQueueTakeMutexRecursive( xQueueHandle xMutex, portTickType xBlockTime );
kenjiArai 0:d4960fcea8ff 1225 portBASE_TYPE xQueueGiveMutexRecursive( xQueueHandle xMutex );
kenjiArai 0:d4960fcea8ff 1226
kenjiArai 0:d4960fcea8ff 1227 /*
kenjiArai 0:d4960fcea8ff 1228 * The registry is provided as a means for kernel aware debuggers to
kenjiArai 0:d4960fcea8ff 1229 * locate queues, semaphores and mutexes. Call vQueueAddToRegistry() add
kenjiArai 0:d4960fcea8ff 1230 * a queue, semaphore or mutex handle to the registry if you want the handle
kenjiArai 0:d4960fcea8ff 1231 * to be available to a kernel aware debugger. If you are not using a kernel
kenjiArai 0:d4960fcea8ff 1232 * aware debugger then this function can be ignored.
kenjiArai 0:d4960fcea8ff 1233 *
kenjiArai 0:d4960fcea8ff 1234 * configQUEUE_REGISTRY_SIZE defines the maximum number of handles the
kenjiArai 0:d4960fcea8ff 1235 * registry can hold. configQUEUE_REGISTRY_SIZE must be greater than 0
kenjiArai 0:d4960fcea8ff 1236 * within FreeRTOSConfig.h for the registry to be available. Its value
kenjiArai 0:d4960fcea8ff 1237 * does not effect the number of queues, semaphores and mutexes that can be
kenjiArai 0:d4960fcea8ff 1238 * created - just the number that the registry can hold.
kenjiArai 0:d4960fcea8ff 1239 *
kenjiArai 0:d4960fcea8ff 1240 * @param xQueue The handle of the queue being added to the registry. This
kenjiArai 0:d4960fcea8ff 1241 * is the handle returned by a call to xQueueCreate(). Semaphore and mutex
kenjiArai 0:d4960fcea8ff 1242 * handles can also be passed in here.
kenjiArai 0:d4960fcea8ff 1243 *
kenjiArai 0:d4960fcea8ff 1244 * @param pcName The name to be associated with the handle. This is the
kenjiArai 0:d4960fcea8ff 1245 * name that the kernel aware debugger will display.
kenjiArai 0:d4960fcea8ff 1246 */
kenjiArai 0:d4960fcea8ff 1247 //#if configQUEUE_REGISTRY_SIZE > 0
kenjiArai 0:d4960fcea8ff 1248 void vQueueAddToRegistry( xQueueHandle xQueue, signed char *pcName );
kenjiArai 0:d4960fcea8ff 1249 //#endif
kenjiArai 0:d4960fcea8ff 1250
kenjiArai 0:d4960fcea8ff 1251
kenjiArai 0:d4960fcea8ff 1252
kenjiArai 0:d4960fcea8ff 1253
kenjiArai 0:d4960fcea8ff 1254 #ifdef __cplusplus
kenjiArai 0:d4960fcea8ff 1255 }
kenjiArai 0:d4960fcea8ff 1256 #endif
kenjiArai 0:d4960fcea8ff 1257
kenjiArai 0:d4960fcea8ff 1258 #endif /* QUEUE_H */
kenjiArai 0:d4960fcea8ff 1259