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 semphr.h"
kenjiArai 0:d4960fcea8ff 56 #endif
kenjiArai 0:d4960fcea8ff 57
kenjiArai 0:d4960fcea8ff 58 #ifndef SEMAPHORE_H
kenjiArai 0:d4960fcea8ff 59 #define SEMAPHORE_H
kenjiArai 0:d4960fcea8ff 60
kenjiArai 0:d4960fcea8ff 61 #include "queue.h"
kenjiArai 0:d4960fcea8ff 62
kenjiArai 0:d4960fcea8ff 63 typedef xQueueHandle xSemaphoreHandle;
kenjiArai 0:d4960fcea8ff 64
kenjiArai 0:d4960fcea8ff 65 #define semBINARY_SEMAPHORE_QUEUE_LENGTH ( ( unsigned char ) 1 )
kenjiArai 0:d4960fcea8ff 66 #define semSEMAPHORE_QUEUE_ITEM_LENGTH ( ( unsigned char ) 0 )
kenjiArai 0:d4960fcea8ff 67 #define semGIVE_BLOCK_TIME ( ( portTickType ) 0 )
kenjiArai 0:d4960fcea8ff 68
kenjiArai 0:d4960fcea8ff 69
kenjiArai 0:d4960fcea8ff 70 /**
kenjiArai 0:d4960fcea8ff 71 * semphr. h
kenjiArai 0:d4960fcea8ff 72 * <pre>vSemaphoreCreateBinary( xSemaphoreHandle xSemaphore )</pre>
kenjiArai 0:d4960fcea8ff 73 *
kenjiArai 0:d4960fcea8ff 74 * <i>Macro</i> that implements a semaphore by using the existing queue mechanism.
kenjiArai 0:d4960fcea8ff 75 * The queue length is 1 as this is a binary semaphore. The data size is 0
kenjiArai 0:d4960fcea8ff 76 * as we don't want to actually store any data - we just want to know if the
kenjiArai 0:d4960fcea8ff 77 * queue is empty or full.
kenjiArai 0:d4960fcea8ff 78 *
kenjiArai 0:d4960fcea8ff 79 * This type of semaphore can be used for pure synchronisation between tasks or
kenjiArai 0:d4960fcea8ff 80 * between an interrupt and a task. The semaphore need not be given back once
kenjiArai 0:d4960fcea8ff 81 * obtained, so one task/interrupt can continuously 'give' the semaphore while
kenjiArai 0:d4960fcea8ff 82 * another continuously 'takes' the semaphore. For this reason this type of
kenjiArai 0:d4960fcea8ff 83 * semaphore does not use a priority inheritance mechanism. For an alternative
kenjiArai 0:d4960fcea8ff 84 * that does use priority inheritance see xSemaphoreCreateMutex().
kenjiArai 0:d4960fcea8ff 85 *
kenjiArai 0:d4960fcea8ff 86 * @param xSemaphore Handle to the created semaphore. Should be of type xSemaphoreHandle.
kenjiArai 0:d4960fcea8ff 87 *
kenjiArai 0:d4960fcea8ff 88 * Example usage:
kenjiArai 0:d4960fcea8ff 89 <pre>
kenjiArai 0:d4960fcea8ff 90 xSemaphoreHandle xSemaphore;
kenjiArai 0:d4960fcea8ff 91
kenjiArai 0:d4960fcea8ff 92 void vATask( void * pvParameters )
kenjiArai 0:d4960fcea8ff 93 {
kenjiArai 0:d4960fcea8ff 94 // Semaphore cannot be used before a call to vSemaphoreCreateBinary ().
kenjiArai 0:d4960fcea8ff 95 // This is a macro so pass the variable in directly.
kenjiArai 0:d4960fcea8ff 96 vSemaphoreCreateBinary( xSemaphore );
kenjiArai 0:d4960fcea8ff 97
kenjiArai 0:d4960fcea8ff 98 if( xSemaphore != NULL )
kenjiArai 0:d4960fcea8ff 99 {
kenjiArai 0:d4960fcea8ff 100 // The semaphore was created successfully.
kenjiArai 0:d4960fcea8ff 101 // The semaphore can now be used.
kenjiArai 0:d4960fcea8ff 102 }
kenjiArai 0:d4960fcea8ff 103 }
kenjiArai 0:d4960fcea8ff 104 </pre>
kenjiArai 0:d4960fcea8ff 105 * \defgroup vSemaphoreCreateBinary vSemaphoreCreateBinary
kenjiArai 0:d4960fcea8ff 106 * \ingroup Semaphores
kenjiArai 0:d4960fcea8ff 107 */
kenjiArai 0:d4960fcea8ff 108 #define vSemaphoreCreateBinary( xSemaphore ) { \
kenjiArai 0:d4960fcea8ff 109 xSemaphore = xQueueCreate( ( unsigned portBASE_TYPE ) 1, semSEMAPHORE_QUEUE_ITEM_LENGTH ); \
kenjiArai 0:d4960fcea8ff 110 if( xSemaphore != NULL ) \
kenjiArai 0:d4960fcea8ff 111 { \
kenjiArai 0:d4960fcea8ff 112 xSemaphoreGive( xSemaphore ); \
kenjiArai 0:d4960fcea8ff 113 } \
kenjiArai 0:d4960fcea8ff 114 }
kenjiArai 0:d4960fcea8ff 115
kenjiArai 0:d4960fcea8ff 116 /**
kenjiArai 0:d4960fcea8ff 117 * semphr. h
kenjiArai 0:d4960fcea8ff 118 * <pre>xSemaphoreTake(
kenjiArai 0:d4960fcea8ff 119 * xSemaphoreHandle xSemaphore,
kenjiArai 0:d4960fcea8ff 120 * portTickType xBlockTime
kenjiArai 0:d4960fcea8ff 121 * )</pre>
kenjiArai 0:d4960fcea8ff 122 *
kenjiArai 0:d4960fcea8ff 123 * <i>Macro</i> to obtain a semaphore. The semaphore must have previously been
kenjiArai 0:d4960fcea8ff 124 * created with a call to vSemaphoreCreateBinary(), xSemaphoreCreateMutex() or
kenjiArai 0:d4960fcea8ff 125 * xSemaphoreCreateCounting().
kenjiArai 0:d4960fcea8ff 126 *
kenjiArai 0:d4960fcea8ff 127 * @param xSemaphore A handle to the semaphore being taken - obtained when
kenjiArai 0:d4960fcea8ff 128 * the semaphore was created.
kenjiArai 0:d4960fcea8ff 129 *
kenjiArai 0:d4960fcea8ff 130 * @param xBlockTime The time in ticks to wait for the semaphore to become
kenjiArai 0:d4960fcea8ff 131 * available. The macro portTICK_RATE_MS can be used to convert this to a
kenjiArai 0:d4960fcea8ff 132 * real time. A block time of zero can be used to poll the semaphore. A block
kenjiArai 0:d4960fcea8ff 133 * time of portMAX_DELAY can be used to block indefinitely (provided
kenjiArai 0:d4960fcea8ff 134 * INCLUDE_vTaskSuspend is set to 1 in FreeRTOSConfig.h).
kenjiArai 0:d4960fcea8ff 135 *
kenjiArai 0:d4960fcea8ff 136 * @return pdTRUE if the semaphore was obtained. pdFALSE
kenjiArai 0:d4960fcea8ff 137 * if xBlockTime expired without the semaphore becoming available.
kenjiArai 0:d4960fcea8ff 138 *
kenjiArai 0:d4960fcea8ff 139 * Example usage:
kenjiArai 0:d4960fcea8ff 140 <pre>
kenjiArai 0:d4960fcea8ff 141 xSemaphoreHandle xSemaphore = NULL;
kenjiArai 0:d4960fcea8ff 142
kenjiArai 0:d4960fcea8ff 143 // A task that creates a semaphore.
kenjiArai 0:d4960fcea8ff 144 void vATask( void * pvParameters )
kenjiArai 0:d4960fcea8ff 145 {
kenjiArai 0:d4960fcea8ff 146 // Create the semaphore to guard a shared resource.
kenjiArai 0:d4960fcea8ff 147 vSemaphoreCreateBinary( xSemaphore );
kenjiArai 0:d4960fcea8ff 148 }
kenjiArai 0:d4960fcea8ff 149
kenjiArai 0:d4960fcea8ff 150 // A task that uses the semaphore.
kenjiArai 0:d4960fcea8ff 151 void vAnotherTask( void * pvParameters )
kenjiArai 0:d4960fcea8ff 152 {
kenjiArai 0:d4960fcea8ff 153 // ... Do other things.
kenjiArai 0:d4960fcea8ff 154
kenjiArai 0:d4960fcea8ff 155 if( xSemaphore != NULL )
kenjiArai 0:d4960fcea8ff 156 {
kenjiArai 0:d4960fcea8ff 157 // See if we can obtain the semaphore. If the semaphore is not available
kenjiArai 0:d4960fcea8ff 158 // wait 10 ticks to see if it becomes free.
kenjiArai 0:d4960fcea8ff 159 if( xSemaphoreTake( xSemaphore, ( portTickType ) 10 ) == pdTRUE )
kenjiArai 0:d4960fcea8ff 160 {
kenjiArai 0:d4960fcea8ff 161 // We were able to obtain the semaphore and can now access the
kenjiArai 0:d4960fcea8ff 162 // shared resource.
kenjiArai 0:d4960fcea8ff 163
kenjiArai 0:d4960fcea8ff 164 // ...
kenjiArai 0:d4960fcea8ff 165
kenjiArai 0:d4960fcea8ff 166 // We have finished accessing the shared resource. Release the
kenjiArai 0:d4960fcea8ff 167 // semaphore.
kenjiArai 0:d4960fcea8ff 168 xSemaphoreGive( xSemaphore );
kenjiArai 0:d4960fcea8ff 169 }
kenjiArai 0:d4960fcea8ff 170 else
kenjiArai 0:d4960fcea8ff 171 {
kenjiArai 0:d4960fcea8ff 172 // We could not obtain the semaphore and can therefore not access
kenjiArai 0:d4960fcea8ff 173 // the shared resource safely.
kenjiArai 0:d4960fcea8ff 174 }
kenjiArai 0:d4960fcea8ff 175 }
kenjiArai 0:d4960fcea8ff 176 }
kenjiArai 0:d4960fcea8ff 177 </pre>
kenjiArai 0:d4960fcea8ff 178 * \defgroup xSemaphoreTake xSemaphoreTake
kenjiArai 0:d4960fcea8ff 179 * \ingroup Semaphores
kenjiArai 0:d4960fcea8ff 180 */
kenjiArai 0:d4960fcea8ff 181 #define xSemaphoreTake( xSemaphore, xBlockTime ) xQueueGenericReceive( ( xQueueHandle ) xSemaphore, NULL, xBlockTime, pdFALSE )
kenjiArai 0:d4960fcea8ff 182
kenjiArai 0:d4960fcea8ff 183 /**
kenjiArai 0:d4960fcea8ff 184 * semphr. h
kenjiArai 0:d4960fcea8ff 185 * xSemaphoreTakeRecursive(
kenjiArai 0:d4960fcea8ff 186 * xSemaphoreHandle xMutex,
kenjiArai 0:d4960fcea8ff 187 * portTickType xBlockTime
kenjiArai 0:d4960fcea8ff 188 * )
kenjiArai 0:d4960fcea8ff 189 *
kenjiArai 0:d4960fcea8ff 190 * <i>Macro</i> to recursively obtain, or 'take', a mutex type semaphore.
kenjiArai 0:d4960fcea8ff 191 * The mutex must have previously been created using a call to
kenjiArai 0:d4960fcea8ff 192 * xSemaphoreCreateRecursiveMutex();
kenjiArai 0:d4960fcea8ff 193 *
kenjiArai 0:d4960fcea8ff 194 * configUSE_RECURSIVE_MUTEXES must be set to 1 in FreeRTOSConfig.h for this
kenjiArai 0:d4960fcea8ff 195 * macro to be available.
kenjiArai 0:d4960fcea8ff 196 *
kenjiArai 0:d4960fcea8ff 197 * This macro must not be used on mutexes created using xSemaphoreCreateMutex().
kenjiArai 0:d4960fcea8ff 198 *
kenjiArai 0:d4960fcea8ff 199 * A mutex used recursively can be 'taken' repeatedly by the owner. The mutex
kenjiArai 0:d4960fcea8ff 200 * doesn't become available again until the owner has called
kenjiArai 0:d4960fcea8ff 201 * xSemaphoreGiveRecursive() for each successful 'take' request. For example,
kenjiArai 0:d4960fcea8ff 202 * if a task successfully 'takes' the same mutex 5 times then the mutex will
kenjiArai 0:d4960fcea8ff 203 * not be available to any other task until it has also 'given' the mutex back
kenjiArai 0:d4960fcea8ff 204 * exactly five times.
kenjiArai 0:d4960fcea8ff 205 *
kenjiArai 0:d4960fcea8ff 206 * @param xMutex A handle to the mutex being obtained. This is the
kenjiArai 0:d4960fcea8ff 207 * handle returned by xSemaphoreCreateRecursiveMutex();
kenjiArai 0:d4960fcea8ff 208 *
kenjiArai 0:d4960fcea8ff 209 * @param xBlockTime The time in ticks to wait for the semaphore to become
kenjiArai 0:d4960fcea8ff 210 * available. The macro portTICK_RATE_MS can be used to convert this to a
kenjiArai 0:d4960fcea8ff 211 * real time. A block time of zero can be used to poll the semaphore. If
kenjiArai 0:d4960fcea8ff 212 * the task already owns the semaphore then xSemaphoreTakeRecursive() will
kenjiArai 0:d4960fcea8ff 213 * return immediately no matter what the value of xBlockTime.
kenjiArai 0:d4960fcea8ff 214 *
kenjiArai 0:d4960fcea8ff 215 * @return pdTRUE if the semaphore was obtained. pdFALSE if xBlockTime
kenjiArai 0:d4960fcea8ff 216 * expired without the semaphore becoming available.
kenjiArai 0:d4960fcea8ff 217 *
kenjiArai 0:d4960fcea8ff 218 * Example usage:
kenjiArai 0:d4960fcea8ff 219 <pre>
kenjiArai 0:d4960fcea8ff 220 xSemaphoreHandle xMutex = NULL;
kenjiArai 0:d4960fcea8ff 221
kenjiArai 0:d4960fcea8ff 222 // A task that creates a mutex.
kenjiArai 0:d4960fcea8ff 223 void vATask( void * pvParameters )
kenjiArai 0:d4960fcea8ff 224 {
kenjiArai 0:d4960fcea8ff 225 // Create the mutex to guard a shared resource.
kenjiArai 0:d4960fcea8ff 226 xMutex = xSemaphoreCreateRecursiveMutex();
kenjiArai 0:d4960fcea8ff 227 }
kenjiArai 0:d4960fcea8ff 228
kenjiArai 0:d4960fcea8ff 229 // A task that uses the mutex.
kenjiArai 0:d4960fcea8ff 230 void vAnotherTask( void * pvParameters )
kenjiArai 0:d4960fcea8ff 231 {
kenjiArai 0:d4960fcea8ff 232 // ... Do other things.
kenjiArai 0:d4960fcea8ff 233
kenjiArai 0:d4960fcea8ff 234 if( xMutex != NULL )
kenjiArai 0:d4960fcea8ff 235 {
kenjiArai 0:d4960fcea8ff 236 // See if we can obtain the mutex. If the mutex is not available
kenjiArai 0:d4960fcea8ff 237 // wait 10 ticks to see if it becomes free.
kenjiArai 0:d4960fcea8ff 238 if( xSemaphoreTakeRecursive( xSemaphore, ( portTickType ) 10 ) == pdTRUE )
kenjiArai 0:d4960fcea8ff 239 {
kenjiArai 0:d4960fcea8ff 240 // We were able to obtain the mutex and can now access the
kenjiArai 0:d4960fcea8ff 241 // shared resource.
kenjiArai 0:d4960fcea8ff 242
kenjiArai 0:d4960fcea8ff 243 // ...
kenjiArai 0:d4960fcea8ff 244 // For some reason due to the nature of the code further calls to
kenjiArai 0:d4960fcea8ff 245 // xSemaphoreTakeRecursive() are made on the same mutex. In real
kenjiArai 0:d4960fcea8ff 246 // code these would not be just sequential calls as this would make
kenjiArai 0:d4960fcea8ff 247 // no sense. Instead the calls are likely to be buried inside
kenjiArai 0:d4960fcea8ff 248 // a more complex call structure.
kenjiArai 0:d4960fcea8ff 249 xSemaphoreTakeRecursive( xMutex, ( portTickType ) 10 );
kenjiArai 0:d4960fcea8ff 250 xSemaphoreTakeRecursive( xMutex, ( portTickType ) 10 );
kenjiArai 0:d4960fcea8ff 251
kenjiArai 0:d4960fcea8ff 252 // The mutex has now been 'taken' three times, so will not be
kenjiArai 0:d4960fcea8ff 253 // available to another task until it has also been given back
kenjiArai 0:d4960fcea8ff 254 // three times. Again it is unlikely that real code would have
kenjiArai 0:d4960fcea8ff 255 // these calls sequentially, but instead buried in a more complex
kenjiArai 0:d4960fcea8ff 256 // call structure. This is just for illustrative purposes.
kenjiArai 0:d4960fcea8ff 257 xSemaphoreGiveRecursive( xMutex );
kenjiArai 0:d4960fcea8ff 258 xSemaphoreGiveRecursive( xMutex );
kenjiArai 0:d4960fcea8ff 259 xSemaphoreGiveRecursive( xMutex );
kenjiArai 0:d4960fcea8ff 260
kenjiArai 0:d4960fcea8ff 261 // Now the mutex can be taken by other tasks.
kenjiArai 0:d4960fcea8ff 262 }
kenjiArai 0:d4960fcea8ff 263 else
kenjiArai 0:d4960fcea8ff 264 {
kenjiArai 0:d4960fcea8ff 265 // We could not obtain the mutex and can therefore not access
kenjiArai 0:d4960fcea8ff 266 // the shared resource safely.
kenjiArai 0:d4960fcea8ff 267 }
kenjiArai 0:d4960fcea8ff 268 }
kenjiArai 0:d4960fcea8ff 269 }
kenjiArai 0:d4960fcea8ff 270 </pre>
kenjiArai 0:d4960fcea8ff 271 * \defgroup xSemaphoreTakeRecursive xSemaphoreTakeRecursive
kenjiArai 0:d4960fcea8ff 272 * \ingroup Semaphores
kenjiArai 0:d4960fcea8ff 273 */
kenjiArai 0:d4960fcea8ff 274 #define xSemaphoreTakeRecursive( xMutex, xBlockTime ) xQueueTakeMutexRecursive( xMutex, xBlockTime )
kenjiArai 0:d4960fcea8ff 275
kenjiArai 0:d4960fcea8ff 276
kenjiArai 0:d4960fcea8ff 277 /*
kenjiArai 0:d4960fcea8ff 278 * xSemaphoreAltTake() is an alternative version of xSemaphoreTake().
kenjiArai 0:d4960fcea8ff 279 *
kenjiArai 0:d4960fcea8ff 280 * The source code that implements the alternative (Alt) API is much
kenjiArai 0:d4960fcea8ff 281 * simpler because it executes everything from within a critical section.
kenjiArai 0:d4960fcea8ff 282 * This is the approach taken by many other RTOSes, but FreeRTOS.org has the
kenjiArai 0:d4960fcea8ff 283 * preferred fully featured API too. The fully featured API has more
kenjiArai 0:d4960fcea8ff 284 * complex code that takes longer to execute, but makes much less use of
kenjiArai 0:d4960fcea8ff 285 * critical sections. Therefore the alternative API sacrifices interrupt
kenjiArai 0:d4960fcea8ff 286 * responsiveness to gain execution speed, whereas the fully featured API
kenjiArai 0:d4960fcea8ff 287 * sacrifices execution speed to ensure better interrupt responsiveness.
kenjiArai 0:d4960fcea8ff 288 */
kenjiArai 0:d4960fcea8ff 289 #define xSemaphoreAltTake( xSemaphore, xBlockTime ) xQueueAltGenericReceive( ( xQueueHandle ) xSemaphore, NULL, xBlockTime, pdFALSE )
kenjiArai 0:d4960fcea8ff 290
kenjiArai 0:d4960fcea8ff 291 /**
kenjiArai 0:d4960fcea8ff 292 * semphr. h
kenjiArai 0:d4960fcea8ff 293 * <pre>xSemaphoreGive( xSemaphoreHandle xSemaphore )</pre>
kenjiArai 0:d4960fcea8ff 294 *
kenjiArai 0:d4960fcea8ff 295 * <i>Macro</i> to release a semaphore. The semaphore must have previously been
kenjiArai 0:d4960fcea8ff 296 * created with a call to vSemaphoreCreateBinary(), xSemaphoreCreateMutex() or
kenjiArai 0:d4960fcea8ff 297 * xSemaphoreCreateCounting(). and obtained using sSemaphoreTake().
kenjiArai 0:d4960fcea8ff 298 *
kenjiArai 0:d4960fcea8ff 299 * This macro must not be used from an ISR. See xSemaphoreGiveFromISR () for
kenjiArai 0:d4960fcea8ff 300 * an alternative which can be used from an ISR.
kenjiArai 0:d4960fcea8ff 301 *
kenjiArai 0:d4960fcea8ff 302 * This macro must also not be used on semaphores created using
kenjiArai 0:d4960fcea8ff 303 * xSemaphoreCreateRecursiveMutex().
kenjiArai 0:d4960fcea8ff 304 *
kenjiArai 0:d4960fcea8ff 305 * @param xSemaphore A handle to the semaphore being released. This is the
kenjiArai 0:d4960fcea8ff 306 * handle returned when the semaphore was created.
kenjiArai 0:d4960fcea8ff 307 *
kenjiArai 0:d4960fcea8ff 308 * @return pdTRUE if the semaphore was released. pdFALSE if an error occurred.
kenjiArai 0:d4960fcea8ff 309 * Semaphores are implemented using queues. An error can occur if there is
kenjiArai 0:d4960fcea8ff 310 * no space on the queue to post a message - indicating that the
kenjiArai 0:d4960fcea8ff 311 * semaphore was not first obtained correctly.
kenjiArai 0:d4960fcea8ff 312 *
kenjiArai 0:d4960fcea8ff 313 * Example usage:
kenjiArai 0:d4960fcea8ff 314 <pre>
kenjiArai 0:d4960fcea8ff 315 xSemaphoreHandle xSemaphore = NULL;
kenjiArai 0:d4960fcea8ff 316
kenjiArai 0:d4960fcea8ff 317 void vATask( void * pvParameters )
kenjiArai 0:d4960fcea8ff 318 {
kenjiArai 0:d4960fcea8ff 319 // Create the semaphore to guard a shared resource.
kenjiArai 0:d4960fcea8ff 320 vSemaphoreCreateBinary( xSemaphore );
kenjiArai 0:d4960fcea8ff 321
kenjiArai 0:d4960fcea8ff 322 if( xSemaphore != NULL )
kenjiArai 0:d4960fcea8ff 323 {
kenjiArai 0:d4960fcea8ff 324 if( xSemaphoreGive( xSemaphore ) != pdTRUE )
kenjiArai 0:d4960fcea8ff 325 {
kenjiArai 0:d4960fcea8ff 326 // We would expect this call to fail because we cannot give
kenjiArai 0:d4960fcea8ff 327 // a semaphore without first "taking" it!
kenjiArai 0:d4960fcea8ff 328 }
kenjiArai 0:d4960fcea8ff 329
kenjiArai 0:d4960fcea8ff 330 // Obtain the semaphore - don't block if the semaphore is not
kenjiArai 0:d4960fcea8ff 331 // immediately available.
kenjiArai 0:d4960fcea8ff 332 if( xSemaphoreTake( xSemaphore, ( portTickType ) 0 ) )
kenjiArai 0:d4960fcea8ff 333 {
kenjiArai 0:d4960fcea8ff 334 // We now have the semaphore and can access the shared resource.
kenjiArai 0:d4960fcea8ff 335
kenjiArai 0:d4960fcea8ff 336 // ...
kenjiArai 0:d4960fcea8ff 337
kenjiArai 0:d4960fcea8ff 338 // We have finished accessing the shared resource so can free the
kenjiArai 0:d4960fcea8ff 339 // semaphore.
kenjiArai 0:d4960fcea8ff 340 if( xSemaphoreGive( xSemaphore ) != pdTRUE )
kenjiArai 0:d4960fcea8ff 341 {
kenjiArai 0:d4960fcea8ff 342 // We would not expect this call to fail because we must have
kenjiArai 0:d4960fcea8ff 343 // obtained the semaphore to get here.
kenjiArai 0:d4960fcea8ff 344 }
kenjiArai 0:d4960fcea8ff 345 }
kenjiArai 0:d4960fcea8ff 346 }
kenjiArai 0:d4960fcea8ff 347 }
kenjiArai 0:d4960fcea8ff 348 </pre>
kenjiArai 0:d4960fcea8ff 349 * \defgroup xSemaphoreGive xSemaphoreGive
kenjiArai 0:d4960fcea8ff 350 * \ingroup Semaphores
kenjiArai 0:d4960fcea8ff 351 */
kenjiArai 0:d4960fcea8ff 352 #define xSemaphoreGive( xSemaphore ) xQueueGenericSend( ( xQueueHandle ) xSemaphore, NULL, semGIVE_BLOCK_TIME, queueSEND_TO_BACK )
kenjiArai 0:d4960fcea8ff 353
kenjiArai 0:d4960fcea8ff 354 /**
kenjiArai 0:d4960fcea8ff 355 * semphr. h
kenjiArai 0:d4960fcea8ff 356 * <pre>xSemaphoreGiveRecursive( xSemaphoreHandle xMutex )</pre>
kenjiArai 0:d4960fcea8ff 357 *
kenjiArai 0:d4960fcea8ff 358 * <i>Macro</i> to recursively release, or 'give', a mutex type semaphore.
kenjiArai 0:d4960fcea8ff 359 * The mutex must have previously been created using a call to
kenjiArai 0:d4960fcea8ff 360 * xSemaphoreCreateRecursiveMutex();
kenjiArai 0:d4960fcea8ff 361 *
kenjiArai 0:d4960fcea8ff 362 * configUSE_RECURSIVE_MUTEXES must be set to 1 in FreeRTOSConfig.h for this
kenjiArai 0:d4960fcea8ff 363 * macro to be available.
kenjiArai 0:d4960fcea8ff 364 *
kenjiArai 0:d4960fcea8ff 365 * This macro must not be used on mutexes created using xSemaphoreCreateMutex().
kenjiArai 0:d4960fcea8ff 366 *
kenjiArai 0:d4960fcea8ff 367 * A mutex used recursively can be 'taken' repeatedly by the owner. The mutex
kenjiArai 0:d4960fcea8ff 368 * doesn't become available again until the owner has called
kenjiArai 0:d4960fcea8ff 369 * xSemaphoreGiveRecursive() for each successful 'take' request. For example,
kenjiArai 0:d4960fcea8ff 370 * if a task successfully 'takes' the same mutex 5 times then the mutex will
kenjiArai 0:d4960fcea8ff 371 * not be available to any other task until it has also 'given' the mutex back
kenjiArai 0:d4960fcea8ff 372 * exactly five times.
kenjiArai 0:d4960fcea8ff 373 *
kenjiArai 0:d4960fcea8ff 374 * @param xMutex A handle to the mutex being released, or 'given'. This is the
kenjiArai 0:d4960fcea8ff 375 * handle returned by xSemaphoreCreateMutex();
kenjiArai 0:d4960fcea8ff 376 *
kenjiArai 0:d4960fcea8ff 377 * @return pdTRUE if the semaphore was given.
kenjiArai 0:d4960fcea8ff 378 *
kenjiArai 0:d4960fcea8ff 379 * Example usage:
kenjiArai 0:d4960fcea8ff 380 <pre>
kenjiArai 0:d4960fcea8ff 381 xSemaphoreHandle xMutex = NULL;
kenjiArai 0:d4960fcea8ff 382
kenjiArai 0:d4960fcea8ff 383 // A task that creates a mutex.
kenjiArai 0:d4960fcea8ff 384 void vATask( void * pvParameters )
kenjiArai 0:d4960fcea8ff 385 {
kenjiArai 0:d4960fcea8ff 386 // Create the mutex to guard a shared resource.
kenjiArai 0:d4960fcea8ff 387 xMutex = xSemaphoreCreateRecursiveMutex();
kenjiArai 0:d4960fcea8ff 388 }
kenjiArai 0:d4960fcea8ff 389
kenjiArai 0:d4960fcea8ff 390 // A task that uses the mutex.
kenjiArai 0:d4960fcea8ff 391 void vAnotherTask( void * pvParameters )
kenjiArai 0:d4960fcea8ff 392 {
kenjiArai 0:d4960fcea8ff 393 // ... Do other things.
kenjiArai 0:d4960fcea8ff 394
kenjiArai 0:d4960fcea8ff 395 if( xMutex != NULL )
kenjiArai 0:d4960fcea8ff 396 {
kenjiArai 0:d4960fcea8ff 397 // See if we can obtain the mutex. If the mutex is not available
kenjiArai 0:d4960fcea8ff 398 // wait 10 ticks to see if it becomes free.
kenjiArai 0:d4960fcea8ff 399 if( xSemaphoreTakeRecursive( xMutex, ( portTickType ) 10 ) == pdTRUE )
kenjiArai 0:d4960fcea8ff 400 {
kenjiArai 0:d4960fcea8ff 401 // We were able to obtain the mutex and can now access the
kenjiArai 0:d4960fcea8ff 402 // shared resource.
kenjiArai 0:d4960fcea8ff 403
kenjiArai 0:d4960fcea8ff 404 // ...
kenjiArai 0:d4960fcea8ff 405 // For some reason due to the nature of the code further calls to
kenjiArai 0:d4960fcea8ff 406 // xSemaphoreTakeRecursive() are made on the same mutex. In real
kenjiArai 0:d4960fcea8ff 407 // code these would not be just sequential calls as this would make
kenjiArai 0:d4960fcea8ff 408 // no sense. Instead the calls are likely to be buried inside
kenjiArai 0:d4960fcea8ff 409 // a more complex call structure.
kenjiArai 0:d4960fcea8ff 410 xSemaphoreTakeRecursive( xMutex, ( portTickType ) 10 );
kenjiArai 0:d4960fcea8ff 411 xSemaphoreTakeRecursive( xMutex, ( portTickType ) 10 );
kenjiArai 0:d4960fcea8ff 412
kenjiArai 0:d4960fcea8ff 413 // The mutex has now been 'taken' three times, so will not be
kenjiArai 0:d4960fcea8ff 414 // available to another task until it has also been given back
kenjiArai 0:d4960fcea8ff 415 // three times. Again it is unlikely that real code would have
kenjiArai 0:d4960fcea8ff 416 // these calls sequentially, it would be more likely that the calls
kenjiArai 0:d4960fcea8ff 417 // to xSemaphoreGiveRecursive() would be called as a call stack
kenjiArai 0:d4960fcea8ff 418 // unwound. This is just for demonstrative purposes.
kenjiArai 0:d4960fcea8ff 419 xSemaphoreGiveRecursive( xMutex );
kenjiArai 0:d4960fcea8ff 420 xSemaphoreGiveRecursive( xMutex );
kenjiArai 0:d4960fcea8ff 421 xSemaphoreGiveRecursive( xMutex );
kenjiArai 0:d4960fcea8ff 422
kenjiArai 0:d4960fcea8ff 423 // Now the mutex can be taken by other tasks.
kenjiArai 0:d4960fcea8ff 424 }
kenjiArai 0:d4960fcea8ff 425 else
kenjiArai 0:d4960fcea8ff 426 {
kenjiArai 0:d4960fcea8ff 427 // We could not obtain the mutex and can therefore not access
kenjiArai 0:d4960fcea8ff 428 // the shared resource safely.
kenjiArai 0:d4960fcea8ff 429 }
kenjiArai 0:d4960fcea8ff 430 }
kenjiArai 0:d4960fcea8ff 431 }
kenjiArai 0:d4960fcea8ff 432 </pre>
kenjiArai 0:d4960fcea8ff 433 * \defgroup xSemaphoreGiveRecursive xSemaphoreGiveRecursive
kenjiArai 0:d4960fcea8ff 434 * \ingroup Semaphores
kenjiArai 0:d4960fcea8ff 435 */
kenjiArai 0:d4960fcea8ff 436 #define xSemaphoreGiveRecursive( xMutex ) xQueueGiveMutexRecursive( xMutex )
kenjiArai 0:d4960fcea8ff 437
kenjiArai 0:d4960fcea8ff 438 /*
kenjiArai 0:d4960fcea8ff 439 * xSemaphoreAltGive() is an alternative version of xSemaphoreGive().
kenjiArai 0:d4960fcea8ff 440 *
kenjiArai 0:d4960fcea8ff 441 * The source code that implements the alternative (Alt) API is much
kenjiArai 0:d4960fcea8ff 442 * simpler because it executes everything from within a critical section.
kenjiArai 0:d4960fcea8ff 443 * This is the approach taken by many other RTOSes, but FreeRTOS.org has the
kenjiArai 0:d4960fcea8ff 444 * preferred fully featured API too. The fully featured API has more
kenjiArai 0:d4960fcea8ff 445 * complex code that takes longer to execute, but makes much less use of
kenjiArai 0:d4960fcea8ff 446 * critical sections. Therefore the alternative API sacrifices interrupt
kenjiArai 0:d4960fcea8ff 447 * responsiveness to gain execution speed, whereas the fully featured API
kenjiArai 0:d4960fcea8ff 448 * sacrifices execution speed to ensure better interrupt responsiveness.
kenjiArai 0:d4960fcea8ff 449 */
kenjiArai 0:d4960fcea8ff 450 #define xSemaphoreAltGive( xSemaphore ) xQueueAltGenericSend( ( xQueueHandle ) xSemaphore, NULL, semGIVE_BLOCK_TIME, queueSEND_TO_BACK )
kenjiArai 0:d4960fcea8ff 451
kenjiArai 0:d4960fcea8ff 452 /**
kenjiArai 0:d4960fcea8ff 453 * semphr. h
kenjiArai 0:d4960fcea8ff 454 * <pre>
kenjiArai 0:d4960fcea8ff 455 xSemaphoreGiveFromISR(
kenjiArai 0:d4960fcea8ff 456 xSemaphoreHandle xSemaphore,
kenjiArai 0:d4960fcea8ff 457 signed portBASE_TYPE *pxHigherPriorityTaskWoken
kenjiArai 0:d4960fcea8ff 458 )</pre>
kenjiArai 0:d4960fcea8ff 459 *
kenjiArai 0:d4960fcea8ff 460 * <i>Macro</i> to release a semaphore. The semaphore must have previously been
kenjiArai 0:d4960fcea8ff 461 * created with a call to vSemaphoreCreateBinary() or xSemaphoreCreateCounting().
kenjiArai 0:d4960fcea8ff 462 *
kenjiArai 0:d4960fcea8ff 463 * Mutex type semaphores (those created using a call to xSemaphoreCreateMutex())
kenjiArai 0:d4960fcea8ff 464 * must not be used with this macro.
kenjiArai 0:d4960fcea8ff 465 *
kenjiArai 0:d4960fcea8ff 466 * This macro can be used from an ISR.
kenjiArai 0:d4960fcea8ff 467 *
kenjiArai 0:d4960fcea8ff 468 * @param xSemaphore A handle to the semaphore being released. This is the
kenjiArai 0:d4960fcea8ff 469 * handle returned when the semaphore was created.
kenjiArai 0:d4960fcea8ff 470 *
kenjiArai 0:d4960fcea8ff 471 * @param pxHigherPriorityTaskWoken xSemaphoreGiveFromISR() will set
kenjiArai 0:d4960fcea8ff 472 * *pxHigherPriorityTaskWoken to pdTRUE if giving the semaphore caused a task
kenjiArai 0:d4960fcea8ff 473 * to unblock, and the unblocked task has a priority higher than the currently
kenjiArai 0:d4960fcea8ff 474 * running task. If xSemaphoreGiveFromISR() sets this value to pdTRUE then
kenjiArai 0:d4960fcea8ff 475 * a context switch should be requested before the interrupt is exited.
kenjiArai 0:d4960fcea8ff 476 *
kenjiArai 0:d4960fcea8ff 477 * @return pdTRUE if the semaphore was successfully given, otherwise errQUEUE_FULL.
kenjiArai 0:d4960fcea8ff 478 *
kenjiArai 0:d4960fcea8ff 479 * Example usage:
kenjiArai 0:d4960fcea8ff 480 <pre>
kenjiArai 0:d4960fcea8ff 481 \#define LONG_TIME 0xffff
kenjiArai 0:d4960fcea8ff 482 \#define TICKS_TO_WAIT 10
kenjiArai 0:d4960fcea8ff 483 xSemaphoreHandle xSemaphore = NULL;
kenjiArai 0:d4960fcea8ff 484
kenjiArai 0:d4960fcea8ff 485 // Repetitive task.
kenjiArai 0:d4960fcea8ff 486 void vATask( void * pvParameters )
kenjiArai 0:d4960fcea8ff 487 {
kenjiArai 0:d4960fcea8ff 488 for( ;; )
kenjiArai 0:d4960fcea8ff 489 {
kenjiArai 0:d4960fcea8ff 490 // We want this task to run every 10 ticks of a timer. The semaphore
kenjiArai 0:d4960fcea8ff 491 // was created before this task was started.
kenjiArai 0:d4960fcea8ff 492
kenjiArai 0:d4960fcea8ff 493 // Block waiting for the semaphore to become available.
kenjiArai 0:d4960fcea8ff 494 if( xSemaphoreTake( xSemaphore, LONG_TIME ) == pdTRUE )
kenjiArai 0:d4960fcea8ff 495 {
kenjiArai 0:d4960fcea8ff 496 // It is time to execute.
kenjiArai 0:d4960fcea8ff 497
kenjiArai 0:d4960fcea8ff 498 // ...
kenjiArai 0:d4960fcea8ff 499
kenjiArai 0:d4960fcea8ff 500 // We have finished our task. Return to the top of the loop where
kenjiArai 0:d4960fcea8ff 501 // we will block on the semaphore until it is time to execute
kenjiArai 0:d4960fcea8ff 502 // again. Note when using the semaphore for synchronisation with an
kenjiArai 0:d4960fcea8ff 503 // ISR in this manner there is no need to 'give' the semaphore back.
kenjiArai 0:d4960fcea8ff 504 }
kenjiArai 0:d4960fcea8ff 505 }
kenjiArai 0:d4960fcea8ff 506 }
kenjiArai 0:d4960fcea8ff 507
kenjiArai 0:d4960fcea8ff 508 // Timer ISR
kenjiArai 0:d4960fcea8ff 509 void vTimerISR( void * pvParameters )
kenjiArai 0:d4960fcea8ff 510 {
kenjiArai 0:d4960fcea8ff 511 static unsigned char ucLocalTickCount = 0;
kenjiArai 0:d4960fcea8ff 512 static signed portBASE_TYPE xHigherPriorityTaskWoken;
kenjiArai 0:d4960fcea8ff 513
kenjiArai 0:d4960fcea8ff 514 // A timer tick has occurred.
kenjiArai 0:d4960fcea8ff 515
kenjiArai 0:d4960fcea8ff 516 // ... Do other time functions.
kenjiArai 0:d4960fcea8ff 517
kenjiArai 0:d4960fcea8ff 518 // Is it time for vATask () to run?
kenjiArai 0:d4960fcea8ff 519 xHigherPriorityTaskWoken = pdFALSE;
kenjiArai 0:d4960fcea8ff 520 ucLocalTickCount++;
kenjiArai 0:d4960fcea8ff 521 if( ucLocalTickCount >= TICKS_TO_WAIT )
kenjiArai 0:d4960fcea8ff 522 {
kenjiArai 0:d4960fcea8ff 523 // Unblock the task by releasing the semaphore.
kenjiArai 0:d4960fcea8ff 524 xSemaphoreGiveFromISR( xSemaphore, &xHigherPriorityTaskWoken );
kenjiArai 0:d4960fcea8ff 525
kenjiArai 0:d4960fcea8ff 526 // Reset the count so we release the semaphore again in 10 ticks time.
kenjiArai 0:d4960fcea8ff 527 ucLocalTickCount = 0;
kenjiArai 0:d4960fcea8ff 528 }
kenjiArai 0:d4960fcea8ff 529
kenjiArai 0:d4960fcea8ff 530 if( xHigherPriorityTaskWoken != pdFALSE )
kenjiArai 0:d4960fcea8ff 531 {
kenjiArai 0:d4960fcea8ff 532 // We can force a context switch here. Context switching from an
kenjiArai 0:d4960fcea8ff 533 // ISR uses port specific syntax. Check the demo task for your port
kenjiArai 0:d4960fcea8ff 534 // to find the syntax required.
kenjiArai 0:d4960fcea8ff 535 }
kenjiArai 0:d4960fcea8ff 536 }
kenjiArai 0:d4960fcea8ff 537 </pre>
kenjiArai 0:d4960fcea8ff 538 * \defgroup xSemaphoreGiveFromISR xSemaphoreGiveFromISR
kenjiArai 0:d4960fcea8ff 539 * \ingroup Semaphores
kenjiArai 0:d4960fcea8ff 540 */
kenjiArai 0:d4960fcea8ff 541 #define xSemaphoreGiveFromISR( xSemaphore, pxHigherPriorityTaskWoken ) xQueueGenericSendFromISR( ( xQueueHandle ) xSemaphore, NULL, pxHigherPriorityTaskWoken, queueSEND_TO_BACK )
kenjiArai 0:d4960fcea8ff 542
kenjiArai 0:d4960fcea8ff 543 /**
kenjiArai 0:d4960fcea8ff 544 * semphr. h
kenjiArai 0:d4960fcea8ff 545 * <pre>xSemaphoreHandle xSemaphoreCreateMutex( void )</pre>
kenjiArai 0:d4960fcea8ff 546 *
kenjiArai 0:d4960fcea8ff 547 * <i>Macro</i> that implements a mutex semaphore by using the existing queue
kenjiArai 0:d4960fcea8ff 548 * mechanism.
kenjiArai 0:d4960fcea8ff 549 *
kenjiArai 0:d4960fcea8ff 550 * Mutexes created using this macro can be accessed using the xSemaphoreTake()
kenjiArai 0:d4960fcea8ff 551 * and xSemaphoreGive() macros. The xSemaphoreTakeRecursive() and
kenjiArai 0:d4960fcea8ff 552 * xSemaphoreGiveRecursive() macros should not be used.
kenjiArai 0:d4960fcea8ff 553 *
kenjiArai 0:d4960fcea8ff 554 * This type of semaphore uses a priority inheritance mechanism so a task
kenjiArai 0:d4960fcea8ff 555 * 'taking' a semaphore MUST ALWAYS 'give' the semaphore back once the
kenjiArai 0:d4960fcea8ff 556 * semaphore it is no longer required.
kenjiArai 0:d4960fcea8ff 557 *
kenjiArai 0:d4960fcea8ff 558 * Mutex type semaphores cannot be used from within interrupt service routines.
kenjiArai 0:d4960fcea8ff 559 *
kenjiArai 0:d4960fcea8ff 560 * See vSemaphoreCreateBinary() for an alternative implementation that can be
kenjiArai 0:d4960fcea8ff 561 * used for pure synchronisation (where one task or interrupt always 'gives' the
kenjiArai 0:d4960fcea8ff 562 * semaphore and another always 'takes' the semaphore) and from within interrupt
kenjiArai 0:d4960fcea8ff 563 * service routines.
kenjiArai 0:d4960fcea8ff 564 *
kenjiArai 0:d4960fcea8ff 565 * @return xSemaphore Handle to the created mutex semaphore. Should be of type
kenjiArai 0:d4960fcea8ff 566 * xSemaphoreHandle.
kenjiArai 0:d4960fcea8ff 567 *
kenjiArai 0:d4960fcea8ff 568 * Example usage:
kenjiArai 0:d4960fcea8ff 569 <pre>
kenjiArai 0:d4960fcea8ff 570 xSemaphoreHandle xSemaphore;
kenjiArai 0:d4960fcea8ff 571
kenjiArai 0:d4960fcea8ff 572 void vATask( void * pvParameters )
kenjiArai 0:d4960fcea8ff 573 {
kenjiArai 0:d4960fcea8ff 574 // Semaphore cannot be used before a call to xSemaphoreCreateMutex().
kenjiArai 0:d4960fcea8ff 575 // This is a macro so pass the variable in directly.
kenjiArai 0:d4960fcea8ff 576 xSemaphore = xSemaphoreCreateMutex();
kenjiArai 0:d4960fcea8ff 577
kenjiArai 0:d4960fcea8ff 578 if( xSemaphore != NULL )
kenjiArai 0:d4960fcea8ff 579 {
kenjiArai 0:d4960fcea8ff 580 // The semaphore was created successfully.
kenjiArai 0:d4960fcea8ff 581 // The semaphore can now be used.
kenjiArai 0:d4960fcea8ff 582 }
kenjiArai 0:d4960fcea8ff 583 }
kenjiArai 0:d4960fcea8ff 584 </pre>
kenjiArai 0:d4960fcea8ff 585 * \defgroup vSemaphoreCreateMutex vSemaphoreCreateMutex
kenjiArai 0:d4960fcea8ff 586 * \ingroup Semaphores
kenjiArai 0:d4960fcea8ff 587 */
kenjiArai 0:d4960fcea8ff 588 #define xSemaphoreCreateMutex() xQueueCreateMutex()
kenjiArai 0:d4960fcea8ff 589
kenjiArai 0:d4960fcea8ff 590
kenjiArai 0:d4960fcea8ff 591 /**
kenjiArai 0:d4960fcea8ff 592 * semphr. h
kenjiArai 0:d4960fcea8ff 593 * <pre>xSemaphoreHandle xSemaphoreCreateRecursiveMutex( void )</pre>
kenjiArai 0:d4960fcea8ff 594 *
kenjiArai 0:d4960fcea8ff 595 * <i>Macro</i> that implements a recursive mutex by using the existing queue
kenjiArai 0:d4960fcea8ff 596 * mechanism.
kenjiArai 0:d4960fcea8ff 597 *
kenjiArai 0:d4960fcea8ff 598 * Mutexes created using this macro can be accessed using the
kenjiArai 0:d4960fcea8ff 599 * xSemaphoreTakeRecursive() and xSemaphoreGiveRecursive() macros. The
kenjiArai 0:d4960fcea8ff 600 * xSemaphoreTake() and xSemaphoreGive() macros should not be used.
kenjiArai 0:d4960fcea8ff 601 *
kenjiArai 0:d4960fcea8ff 602 * A mutex used recursively can be 'taken' repeatedly by the owner. The mutex
kenjiArai 0:d4960fcea8ff 603 * doesn't become available again until the owner has called
kenjiArai 0:d4960fcea8ff 604 * xSemaphoreGiveRecursive() for each successful 'take' request. For example,
kenjiArai 0:d4960fcea8ff 605 * if a task successfully 'takes' the same mutex 5 times then the mutex will
kenjiArai 0:d4960fcea8ff 606 * not be available to any other task until it has also 'given' the mutex back
kenjiArai 0:d4960fcea8ff 607 * exactly five times.
kenjiArai 0:d4960fcea8ff 608 *
kenjiArai 0:d4960fcea8ff 609 * This type of semaphore uses a priority inheritance mechanism so a task
kenjiArai 0:d4960fcea8ff 610 * 'taking' a semaphore MUST ALWAYS 'give' the semaphore back once the
kenjiArai 0:d4960fcea8ff 611 * semaphore it is no longer required.
kenjiArai 0:d4960fcea8ff 612 *
kenjiArai 0:d4960fcea8ff 613 * Mutex type semaphores cannot be used from within interrupt service routines.
kenjiArai 0:d4960fcea8ff 614 *
kenjiArai 0:d4960fcea8ff 615 * See vSemaphoreCreateBinary() for an alternative implementation that can be
kenjiArai 0:d4960fcea8ff 616 * used for pure synchronisation (where one task or interrupt always 'gives' the
kenjiArai 0:d4960fcea8ff 617 * semaphore and another always 'takes' the semaphore) and from within interrupt
kenjiArai 0:d4960fcea8ff 618 * service routines.
kenjiArai 0:d4960fcea8ff 619 *
kenjiArai 0:d4960fcea8ff 620 * @return xSemaphore Handle to the created mutex semaphore. Should be of type
kenjiArai 0:d4960fcea8ff 621 * xSemaphoreHandle.
kenjiArai 0:d4960fcea8ff 622 *
kenjiArai 0:d4960fcea8ff 623 * Example usage:
kenjiArai 0:d4960fcea8ff 624 <pre>
kenjiArai 0:d4960fcea8ff 625 xSemaphoreHandle xSemaphore;
kenjiArai 0:d4960fcea8ff 626
kenjiArai 0:d4960fcea8ff 627 void vATask( void * pvParameters )
kenjiArai 0:d4960fcea8ff 628 {
kenjiArai 0:d4960fcea8ff 629 // Semaphore cannot be used before a call to xSemaphoreCreateMutex().
kenjiArai 0:d4960fcea8ff 630 // This is a macro so pass the variable in directly.
kenjiArai 0:d4960fcea8ff 631 xSemaphore = xSemaphoreCreateRecursiveMutex();
kenjiArai 0:d4960fcea8ff 632
kenjiArai 0:d4960fcea8ff 633 if( xSemaphore != NULL )
kenjiArai 0:d4960fcea8ff 634 {
kenjiArai 0:d4960fcea8ff 635 // The semaphore was created successfully.
kenjiArai 0:d4960fcea8ff 636 // The semaphore can now be used.
kenjiArai 0:d4960fcea8ff 637 }
kenjiArai 0:d4960fcea8ff 638 }
kenjiArai 0:d4960fcea8ff 639 </pre>
kenjiArai 0:d4960fcea8ff 640 * \defgroup vSemaphoreCreateMutex vSemaphoreCreateMutex
kenjiArai 0:d4960fcea8ff 641 * \ingroup Semaphores
kenjiArai 0:d4960fcea8ff 642 */
kenjiArai 0:d4960fcea8ff 643 #define xSemaphoreCreateRecursiveMutex() xQueueCreateMutex()
kenjiArai 0:d4960fcea8ff 644
kenjiArai 0:d4960fcea8ff 645 /**
kenjiArai 0:d4960fcea8ff 646 * semphr. h
kenjiArai 0:d4960fcea8ff 647 * <pre>xSemaphoreHandle xSemaphoreCreateCounting( unsigned portBASE_TYPE uxMaxCount, unsigned portBASE_TYPE uxInitialCount )</pre>
kenjiArai 0:d4960fcea8ff 648 *
kenjiArai 0:d4960fcea8ff 649 * <i>Macro</i> that creates a counting semaphore by using the existing
kenjiArai 0:d4960fcea8ff 650 * queue mechanism.
kenjiArai 0:d4960fcea8ff 651 *
kenjiArai 0:d4960fcea8ff 652 * Counting semaphores are typically used for two things:
kenjiArai 0:d4960fcea8ff 653 *
kenjiArai 0:d4960fcea8ff 654 * 1) Counting events.
kenjiArai 0:d4960fcea8ff 655 *
kenjiArai 0:d4960fcea8ff 656 * In this usage scenario an event handler will 'give' a semaphore each time
kenjiArai 0:d4960fcea8ff 657 * an event occurs (incrementing the semaphore count value), and a handler
kenjiArai 0:d4960fcea8ff 658 * task will 'take' a semaphore each time it processes an event
kenjiArai 0:d4960fcea8ff 659 * (decrementing the semaphore count value). The count value is therefore
kenjiArai 0:d4960fcea8ff 660 * the difference between the number of events that have occurred and the
kenjiArai 0:d4960fcea8ff 661 * number that have been processed. In this case it is desirable for the
kenjiArai 0:d4960fcea8ff 662 * initial count value to be zero.
kenjiArai 0:d4960fcea8ff 663 *
kenjiArai 0:d4960fcea8ff 664 * 2) Resource management.
kenjiArai 0:d4960fcea8ff 665 *
kenjiArai 0:d4960fcea8ff 666 * In this usage scenario the count value indicates the number of resources
kenjiArai 0:d4960fcea8ff 667 * available. To obtain control of a resource a task must first obtain a
kenjiArai 0:d4960fcea8ff 668 * semaphore - decrementing the semaphore count value. When the count value
kenjiArai 0:d4960fcea8ff 669 * reaches zero there are no free resources. When a task finishes with the
kenjiArai 0:d4960fcea8ff 670 * resource it 'gives' the semaphore back - incrementing the semaphore count
kenjiArai 0:d4960fcea8ff 671 * value. In this case it is desirable for the initial count value to be
kenjiArai 0:d4960fcea8ff 672 * equal to the maximum count value, indicating that all resources are free.
kenjiArai 0:d4960fcea8ff 673 *
kenjiArai 0:d4960fcea8ff 674 * @param uxMaxCount The maximum count value that can be reached. When the
kenjiArai 0:d4960fcea8ff 675 * semaphore reaches this value it can no longer be 'given'.
kenjiArai 0:d4960fcea8ff 676 *
kenjiArai 0:d4960fcea8ff 677 * @param uxInitialCount The count value assigned to the semaphore when it is
kenjiArai 0:d4960fcea8ff 678 * created.
kenjiArai 0:d4960fcea8ff 679 *
kenjiArai 0:d4960fcea8ff 680 * @return Handle to the created semaphore. Null if the semaphore could not be
kenjiArai 0:d4960fcea8ff 681 * created.
kenjiArai 0:d4960fcea8ff 682 *
kenjiArai 0:d4960fcea8ff 683 * Example usage:
kenjiArai 0:d4960fcea8ff 684 <pre>
kenjiArai 0:d4960fcea8ff 685 xSemaphoreHandle xSemaphore;
kenjiArai 0:d4960fcea8ff 686
kenjiArai 0:d4960fcea8ff 687 void vATask( void * pvParameters )
kenjiArai 0:d4960fcea8ff 688 {
kenjiArai 0:d4960fcea8ff 689 xSemaphoreHandle xSemaphore = NULL;
kenjiArai 0:d4960fcea8ff 690
kenjiArai 0:d4960fcea8ff 691 // Semaphore cannot be used before a call to xSemaphoreCreateCounting().
kenjiArai 0:d4960fcea8ff 692 // The max value to which the semaphore can count should be 10, and the
kenjiArai 0:d4960fcea8ff 693 // initial value assigned to the count should be 0.
kenjiArai 0:d4960fcea8ff 694 xSemaphore = xSemaphoreCreateCounting( 10, 0 );
kenjiArai 0:d4960fcea8ff 695
kenjiArai 0:d4960fcea8ff 696 if( xSemaphore != NULL )
kenjiArai 0:d4960fcea8ff 697 {
kenjiArai 0:d4960fcea8ff 698 // The semaphore was created successfully.
kenjiArai 0:d4960fcea8ff 699 // The semaphore can now be used.
kenjiArai 0:d4960fcea8ff 700 }
kenjiArai 0:d4960fcea8ff 701 }
kenjiArai 0:d4960fcea8ff 702 </pre>
kenjiArai 0:d4960fcea8ff 703 * \defgroup xSemaphoreCreateCounting xSemaphoreCreateCounting
kenjiArai 0:d4960fcea8ff 704 * \ingroup Semaphores
kenjiArai 0:d4960fcea8ff 705 */
kenjiArai 0:d4960fcea8ff 706 #define xSemaphoreCreateCounting( uxMaxCount, uxInitialCount ) xQueueCreateCountingSemaphore( uxMaxCount, uxInitialCount )
kenjiArai 0:d4960fcea8ff 707
kenjiArai 0:d4960fcea8ff 708
kenjiArai 0:d4960fcea8ff 709 #endif /* SEMAPHORE_H */
kenjiArai 0:d4960fcea8ff 710
kenjiArai 0:d4960fcea8ff 711