David Fletcher / Mbed 2 deprecated cc3100_Test_mqtt_CM4F

Dependencies:   mbed

Committer:
dflet
Date:
Thu Sep 03 14:07:01 2015 +0000
Revision:
0:1e7b5dd9edb4
First commit, it's been hanging around for a while. Updated SPI mode change 1 to 0.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
dflet 0:1e7b5dd9edb4 1 /*
dflet 0:1e7b5dd9edb4 2 FreeRTOS V8.2.1 - Copyright (C) 2015 Real Time Engineers Ltd.
dflet 0:1e7b5dd9edb4 3 All rights reserved
dflet 0:1e7b5dd9edb4 4
dflet 0:1e7b5dd9edb4 5 VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION.
dflet 0:1e7b5dd9edb4 6
dflet 0:1e7b5dd9edb4 7 This file is part of the FreeRTOS distribution.
dflet 0:1e7b5dd9edb4 8
dflet 0:1e7b5dd9edb4 9 FreeRTOS is free software; you can redistribute it and/or modify it under
dflet 0:1e7b5dd9edb4 10 the terms of the GNU General Public License (version 2) as published by the
dflet 0:1e7b5dd9edb4 11 Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception.
dflet 0:1e7b5dd9edb4 12
dflet 0:1e7b5dd9edb4 13 ***************************************************************************
dflet 0:1e7b5dd9edb4 14 >>! NOTE: The modification to the GPL is included to allow you to !<<
dflet 0:1e7b5dd9edb4 15 >>! distribute a combined work that includes FreeRTOS without being !<<
dflet 0:1e7b5dd9edb4 16 >>! obliged to provide the source code for proprietary components !<<
dflet 0:1e7b5dd9edb4 17 >>! outside of the FreeRTOS kernel. !<<
dflet 0:1e7b5dd9edb4 18 ***************************************************************************
dflet 0:1e7b5dd9edb4 19
dflet 0:1e7b5dd9edb4 20 FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY
dflet 0:1e7b5dd9edb4 21 WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
dflet 0:1e7b5dd9edb4 22 FOR A PARTICULAR PURPOSE. Full license text is available on the following
dflet 0:1e7b5dd9edb4 23 link: http://www.freertos.org/a00114.html
dflet 0:1e7b5dd9edb4 24
dflet 0:1e7b5dd9edb4 25 ***************************************************************************
dflet 0:1e7b5dd9edb4 26 * *
dflet 0:1e7b5dd9edb4 27 * FreeRTOS provides completely free yet professionally developed, *
dflet 0:1e7b5dd9edb4 28 * robust, strictly quality controlled, supported, and cross *
dflet 0:1e7b5dd9edb4 29 * platform software that is more than just the market leader, it *
dflet 0:1e7b5dd9edb4 30 * is the industry's de facto standard. *
dflet 0:1e7b5dd9edb4 31 * *
dflet 0:1e7b5dd9edb4 32 * Help yourself get started quickly while simultaneously helping *
dflet 0:1e7b5dd9edb4 33 * to support the FreeRTOS project by purchasing a FreeRTOS *
dflet 0:1e7b5dd9edb4 34 * tutorial book, reference manual, or both: *
dflet 0:1e7b5dd9edb4 35 * http://www.FreeRTOS.org/Documentation *
dflet 0:1e7b5dd9edb4 36 * *
dflet 0:1e7b5dd9edb4 37 ***************************************************************************
dflet 0:1e7b5dd9edb4 38
dflet 0:1e7b5dd9edb4 39 http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading
dflet 0:1e7b5dd9edb4 40 the FAQ page "My application does not run, what could be wrong?". Have you
dflet 0:1e7b5dd9edb4 41 defined configASSERT()?
dflet 0:1e7b5dd9edb4 42
dflet 0:1e7b5dd9edb4 43 http://www.FreeRTOS.org/support - In return for receiving this top quality
dflet 0:1e7b5dd9edb4 44 embedded software for free we request you assist our global community by
dflet 0:1e7b5dd9edb4 45 participating in the support forum.
dflet 0:1e7b5dd9edb4 46
dflet 0:1e7b5dd9edb4 47 http://www.FreeRTOS.org/training - Investing in training allows your team to
dflet 0:1e7b5dd9edb4 48 be as productive as possible as early as possible. Now you can receive
dflet 0:1e7b5dd9edb4 49 FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers
dflet 0:1e7b5dd9edb4 50 Ltd, and the world's leading authority on the world's leading RTOS.
dflet 0:1e7b5dd9edb4 51
dflet 0:1e7b5dd9edb4 52 http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products,
dflet 0:1e7b5dd9edb4 53 including FreeRTOS+Trace - an indispensable productivity tool, a DOS
dflet 0:1e7b5dd9edb4 54 compatible FAT file system, and our tiny thread aware UDP/IP stack.
dflet 0:1e7b5dd9edb4 55
dflet 0:1e7b5dd9edb4 56 http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate.
dflet 0:1e7b5dd9edb4 57 Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS.
dflet 0:1e7b5dd9edb4 58
dflet 0:1e7b5dd9edb4 59 http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High
dflet 0:1e7b5dd9edb4 60 Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS
dflet 0:1e7b5dd9edb4 61 licenses offer ticketed support, indemnification and commercial middleware.
dflet 0:1e7b5dd9edb4 62
dflet 0:1e7b5dd9edb4 63 http://www.SafeRTOS.com - High Integrity Systems also provide a safety
dflet 0:1e7b5dd9edb4 64 engineered and independently SIL3 certified version for use in safety and
dflet 0:1e7b5dd9edb4 65 mission critical applications that require provable dependability.
dflet 0:1e7b5dd9edb4 66
dflet 0:1e7b5dd9edb4 67 1 tab == 4 spaces!
dflet 0:1e7b5dd9edb4 68 */
dflet 0:1e7b5dd9edb4 69
dflet 0:1e7b5dd9edb4 70 /* Standard includes. */
dflet 0:1e7b5dd9edb4 71 #include <stdlib.h>
dflet 0:1e7b5dd9edb4 72
dflet 0:1e7b5dd9edb4 73 /* Defining MPU_WRAPPERS_INCLUDED_FROM_API_FILE prevents task.h from redefining
dflet 0:1e7b5dd9edb4 74 all the API functions to use the MPU wrappers. That should only be done when
dflet 0:1e7b5dd9edb4 75 task.h is included from an application file. */
dflet 0:1e7b5dd9edb4 76 #define MPU_WRAPPERS_INCLUDED_FROM_API_FILE
dflet 0:1e7b5dd9edb4 77
dflet 0:1e7b5dd9edb4 78 /* FreeRTOS includes. */
dflet 0:1e7b5dd9edb4 79 #include "FreeRTOS.h"
dflet 0:1e7b5dd9edb4 80 #include "task.h"
dflet 0:1e7b5dd9edb4 81 #include "timers.h"
dflet 0:1e7b5dd9edb4 82 #include "event_groups.h"
dflet 0:1e7b5dd9edb4 83
dflet 0:1e7b5dd9edb4 84 /* Lint e961 and e750 are suppressed as a MISRA exception justified because the
dflet 0:1e7b5dd9edb4 85 MPU ports require MPU_WRAPPERS_INCLUDED_FROM_API_FILE to be defined for the
dflet 0:1e7b5dd9edb4 86 header files above, but not in this file, in order to generate the correct
dflet 0:1e7b5dd9edb4 87 privileged Vs unprivileged linkage and placement. */
dflet 0:1e7b5dd9edb4 88 #undef MPU_WRAPPERS_INCLUDED_FROM_API_FILE /*lint !e961 !e750. */
dflet 0:1e7b5dd9edb4 89
dflet 0:1e7b5dd9edb4 90 #if ( INCLUDE_xEventGroupSetBitFromISR == 1 ) && ( configUSE_TIMERS == 0 )
dflet 0:1e7b5dd9edb4 91 #error configUSE_TIMERS must be set to 1 to make the xEventGroupSetBitFromISR() function available.
dflet 0:1e7b5dd9edb4 92 #endif
dflet 0:1e7b5dd9edb4 93
dflet 0:1e7b5dd9edb4 94 #if ( INCLUDE_xEventGroupSetBitFromISR == 1 ) && ( INCLUDE_xTimerPendFunctionCall == 0 )
dflet 0:1e7b5dd9edb4 95 #error INCLUDE_xTimerPendFunctionCall must also be set to one to make the xEventGroupSetBitFromISR() function available.
dflet 0:1e7b5dd9edb4 96 #endif
dflet 0:1e7b5dd9edb4 97
dflet 0:1e7b5dd9edb4 98 /* The following bit fields convey control information in a task's event list
dflet 0:1e7b5dd9edb4 99 item value. It is important they don't clash with the
dflet 0:1e7b5dd9edb4 100 taskEVENT_LIST_ITEM_VALUE_IN_USE definition. */
dflet 0:1e7b5dd9edb4 101 #if configUSE_16_BIT_TICKS == 1
dflet 0:1e7b5dd9edb4 102 #define eventCLEAR_EVENTS_ON_EXIT_BIT 0x0100U
dflet 0:1e7b5dd9edb4 103 #define eventUNBLOCKED_DUE_TO_BIT_SET 0x0200U
dflet 0:1e7b5dd9edb4 104 #define eventWAIT_FOR_ALL_BITS 0x0400U
dflet 0:1e7b5dd9edb4 105 #define eventEVENT_BITS_CONTROL_BYTES 0xff00U
dflet 0:1e7b5dd9edb4 106 #else
dflet 0:1e7b5dd9edb4 107 #define eventCLEAR_EVENTS_ON_EXIT_BIT 0x01000000UL
dflet 0:1e7b5dd9edb4 108 #define eventUNBLOCKED_DUE_TO_BIT_SET 0x02000000UL
dflet 0:1e7b5dd9edb4 109 #define eventWAIT_FOR_ALL_BITS 0x04000000UL
dflet 0:1e7b5dd9edb4 110 #define eventEVENT_BITS_CONTROL_BYTES 0xff000000UL
dflet 0:1e7b5dd9edb4 111 #endif
dflet 0:1e7b5dd9edb4 112
dflet 0:1e7b5dd9edb4 113 typedef struct xEventGroupDefinition
dflet 0:1e7b5dd9edb4 114 {
dflet 0:1e7b5dd9edb4 115 EventBits_t uxEventBits;
dflet 0:1e7b5dd9edb4 116 List_t xTasksWaitingForBits; /*< List of tasks waiting for a bit to be set. */
dflet 0:1e7b5dd9edb4 117
dflet 0:1e7b5dd9edb4 118 #if( configUSE_TRACE_FACILITY == 1 )
dflet 0:1e7b5dd9edb4 119 UBaseType_t uxEventGroupNumber;
dflet 0:1e7b5dd9edb4 120 #endif
dflet 0:1e7b5dd9edb4 121
dflet 0:1e7b5dd9edb4 122 } EventGroup_t;
dflet 0:1e7b5dd9edb4 123
dflet 0:1e7b5dd9edb4 124 /*-----------------------------------------------------------*/
dflet 0:1e7b5dd9edb4 125
dflet 0:1e7b5dd9edb4 126 /*
dflet 0:1e7b5dd9edb4 127 * Test the bits set in uxCurrentEventBits to see if the wait condition is met.
dflet 0:1e7b5dd9edb4 128 * The wait condition is defined by xWaitForAllBits. If xWaitForAllBits is
dflet 0:1e7b5dd9edb4 129 * pdTRUE then the wait condition is met if all the bits set in uxBitsToWaitFor
dflet 0:1e7b5dd9edb4 130 * are also set in uxCurrentEventBits. If xWaitForAllBits is pdFALSE then the
dflet 0:1e7b5dd9edb4 131 * wait condition is met if any of the bits set in uxBitsToWait for are also set
dflet 0:1e7b5dd9edb4 132 * in uxCurrentEventBits.
dflet 0:1e7b5dd9edb4 133 */
dflet 0:1e7b5dd9edb4 134 static BaseType_t prvTestWaitCondition( const EventBits_t uxCurrentEventBits, const EventBits_t uxBitsToWaitFor, const BaseType_t xWaitForAllBits );
dflet 0:1e7b5dd9edb4 135
dflet 0:1e7b5dd9edb4 136 /*-----------------------------------------------------------*/
dflet 0:1e7b5dd9edb4 137
dflet 0:1e7b5dd9edb4 138 EventGroupHandle_t xEventGroupCreate( void )
dflet 0:1e7b5dd9edb4 139 {
dflet 0:1e7b5dd9edb4 140 EventGroup_t *pxEventBits;
dflet 0:1e7b5dd9edb4 141
dflet 0:1e7b5dd9edb4 142 pxEventBits = ( EventGroup_t * ) pvPortMalloc( sizeof( EventGroup_t ) );
dflet 0:1e7b5dd9edb4 143 if( pxEventBits != NULL )
dflet 0:1e7b5dd9edb4 144 {
dflet 0:1e7b5dd9edb4 145 pxEventBits->uxEventBits = 0;
dflet 0:1e7b5dd9edb4 146 vListInitialise( &( pxEventBits->xTasksWaitingForBits ) );
dflet 0:1e7b5dd9edb4 147 traceEVENT_GROUP_CREATE( pxEventBits );
dflet 0:1e7b5dd9edb4 148 }
dflet 0:1e7b5dd9edb4 149 else
dflet 0:1e7b5dd9edb4 150 {
dflet 0:1e7b5dd9edb4 151 traceEVENT_GROUP_CREATE_FAILED();
dflet 0:1e7b5dd9edb4 152 }
dflet 0:1e7b5dd9edb4 153
dflet 0:1e7b5dd9edb4 154 return ( EventGroupHandle_t ) pxEventBits;
dflet 0:1e7b5dd9edb4 155 }
dflet 0:1e7b5dd9edb4 156 /*-----------------------------------------------------------*/
dflet 0:1e7b5dd9edb4 157
dflet 0:1e7b5dd9edb4 158 EventBits_t xEventGroupSync( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToSet, const EventBits_t uxBitsToWaitFor, TickType_t xTicksToWait )
dflet 0:1e7b5dd9edb4 159 {
dflet 0:1e7b5dd9edb4 160 EventBits_t uxOriginalBitValue, uxReturn;
dflet 0:1e7b5dd9edb4 161 EventGroup_t *pxEventBits = ( EventGroup_t * ) xEventGroup;
dflet 0:1e7b5dd9edb4 162 BaseType_t xAlreadyYielded;
dflet 0:1e7b5dd9edb4 163 BaseType_t xTimeoutOccurred = pdFALSE;
dflet 0:1e7b5dd9edb4 164
dflet 0:1e7b5dd9edb4 165 configASSERT( ( uxBitsToWaitFor & eventEVENT_BITS_CONTROL_BYTES ) == 0 );
dflet 0:1e7b5dd9edb4 166 configASSERT( uxBitsToWaitFor != 0 );
dflet 0:1e7b5dd9edb4 167 #if ( ( INCLUDE_xTaskGetSchedulerState == 1 ) || ( configUSE_TIMERS == 1 ) )
dflet 0:1e7b5dd9edb4 168 {
dflet 0:1e7b5dd9edb4 169 configASSERT( !( ( xTaskGetSchedulerState() == taskSCHEDULER_SUSPENDED ) && ( xTicksToWait != 0 ) ) );
dflet 0:1e7b5dd9edb4 170 }
dflet 0:1e7b5dd9edb4 171 #endif
dflet 0:1e7b5dd9edb4 172
dflet 0:1e7b5dd9edb4 173 vTaskSuspendAll();
dflet 0:1e7b5dd9edb4 174 {
dflet 0:1e7b5dd9edb4 175 uxOriginalBitValue = pxEventBits->uxEventBits;
dflet 0:1e7b5dd9edb4 176
dflet 0:1e7b5dd9edb4 177 ( void ) xEventGroupSetBits( xEventGroup, uxBitsToSet );
dflet 0:1e7b5dd9edb4 178
dflet 0:1e7b5dd9edb4 179 if( ( ( uxOriginalBitValue | uxBitsToSet ) & uxBitsToWaitFor ) == uxBitsToWaitFor )
dflet 0:1e7b5dd9edb4 180 {
dflet 0:1e7b5dd9edb4 181 /* All the rendezvous bits are now set - no need to block. */
dflet 0:1e7b5dd9edb4 182 uxReturn = ( uxOriginalBitValue | uxBitsToSet );
dflet 0:1e7b5dd9edb4 183
dflet 0:1e7b5dd9edb4 184 /* Rendezvous always clear the bits. They will have been cleared
dflet 0:1e7b5dd9edb4 185 already unless this is the only task in the rendezvous. */
dflet 0:1e7b5dd9edb4 186 pxEventBits->uxEventBits &= ~uxBitsToWaitFor;
dflet 0:1e7b5dd9edb4 187
dflet 0:1e7b5dd9edb4 188 xTicksToWait = 0;
dflet 0:1e7b5dd9edb4 189 }
dflet 0:1e7b5dd9edb4 190 else
dflet 0:1e7b5dd9edb4 191 {
dflet 0:1e7b5dd9edb4 192 if( xTicksToWait != ( TickType_t ) 0 )
dflet 0:1e7b5dd9edb4 193 {
dflet 0:1e7b5dd9edb4 194 traceEVENT_GROUP_SYNC_BLOCK( xEventGroup, uxBitsToSet, uxBitsToWaitFor );
dflet 0:1e7b5dd9edb4 195
dflet 0:1e7b5dd9edb4 196 /* Store the bits that the calling task is waiting for in the
dflet 0:1e7b5dd9edb4 197 task's event list item so the kernel knows when a match is
dflet 0:1e7b5dd9edb4 198 found. Then enter the blocked state. */
dflet 0:1e7b5dd9edb4 199 vTaskPlaceOnUnorderedEventList( &( pxEventBits->xTasksWaitingForBits ), ( uxBitsToWaitFor | eventCLEAR_EVENTS_ON_EXIT_BIT | eventWAIT_FOR_ALL_BITS ), xTicksToWait );
dflet 0:1e7b5dd9edb4 200
dflet 0:1e7b5dd9edb4 201 /* This assignment is obsolete as uxReturn will get set after
dflet 0:1e7b5dd9edb4 202 the task unblocks, but some compilers mistakenly generate a
dflet 0:1e7b5dd9edb4 203 warning about uxReturn being returned without being set if the
dflet 0:1e7b5dd9edb4 204 assignment is omitted. */
dflet 0:1e7b5dd9edb4 205 uxReturn = 0;
dflet 0:1e7b5dd9edb4 206 }
dflet 0:1e7b5dd9edb4 207 else
dflet 0:1e7b5dd9edb4 208 {
dflet 0:1e7b5dd9edb4 209 /* The rendezvous bits were not set, but no block time was
dflet 0:1e7b5dd9edb4 210 specified - just return the current event bit value. */
dflet 0:1e7b5dd9edb4 211 uxReturn = pxEventBits->uxEventBits;
dflet 0:1e7b5dd9edb4 212 }
dflet 0:1e7b5dd9edb4 213 }
dflet 0:1e7b5dd9edb4 214 }
dflet 0:1e7b5dd9edb4 215 xAlreadyYielded = xTaskResumeAll();
dflet 0:1e7b5dd9edb4 216
dflet 0:1e7b5dd9edb4 217 if( xTicksToWait != ( TickType_t ) 0 )
dflet 0:1e7b5dd9edb4 218 {
dflet 0:1e7b5dd9edb4 219 if( xAlreadyYielded == pdFALSE )
dflet 0:1e7b5dd9edb4 220 {
dflet 0:1e7b5dd9edb4 221 portYIELD_WITHIN_API();
dflet 0:1e7b5dd9edb4 222 }
dflet 0:1e7b5dd9edb4 223 else
dflet 0:1e7b5dd9edb4 224 {
dflet 0:1e7b5dd9edb4 225 mtCOVERAGE_TEST_MARKER();
dflet 0:1e7b5dd9edb4 226 }
dflet 0:1e7b5dd9edb4 227
dflet 0:1e7b5dd9edb4 228 /* The task blocked to wait for its required bits to be set - at this
dflet 0:1e7b5dd9edb4 229 point either the required bits were set or the block time expired. If
dflet 0:1e7b5dd9edb4 230 the required bits were set they will have been stored in the task's
dflet 0:1e7b5dd9edb4 231 event list item, and they should now be retrieved then cleared. */
dflet 0:1e7b5dd9edb4 232 uxReturn = uxTaskResetEventItemValue();
dflet 0:1e7b5dd9edb4 233
dflet 0:1e7b5dd9edb4 234 if( ( uxReturn & eventUNBLOCKED_DUE_TO_BIT_SET ) == ( EventBits_t ) 0 )
dflet 0:1e7b5dd9edb4 235 {
dflet 0:1e7b5dd9edb4 236 /* The task timed out, just return the current event bit value. */
dflet 0:1e7b5dd9edb4 237 taskENTER_CRITICAL();
dflet 0:1e7b5dd9edb4 238 {
dflet 0:1e7b5dd9edb4 239 uxReturn = pxEventBits->uxEventBits;
dflet 0:1e7b5dd9edb4 240
dflet 0:1e7b5dd9edb4 241 /* Although the task got here because it timed out before the
dflet 0:1e7b5dd9edb4 242 bits it was waiting for were set, it is possible that since it
dflet 0:1e7b5dd9edb4 243 unblocked another task has set the bits. If this is the case
dflet 0:1e7b5dd9edb4 244 then it needs to clear the bits before exiting. */
dflet 0:1e7b5dd9edb4 245 if( ( uxReturn & uxBitsToWaitFor ) == uxBitsToWaitFor )
dflet 0:1e7b5dd9edb4 246 {
dflet 0:1e7b5dd9edb4 247 pxEventBits->uxEventBits &= ~uxBitsToWaitFor;
dflet 0:1e7b5dd9edb4 248 }
dflet 0:1e7b5dd9edb4 249 else
dflet 0:1e7b5dd9edb4 250 {
dflet 0:1e7b5dd9edb4 251 mtCOVERAGE_TEST_MARKER();
dflet 0:1e7b5dd9edb4 252 }
dflet 0:1e7b5dd9edb4 253 }
dflet 0:1e7b5dd9edb4 254 taskEXIT_CRITICAL();
dflet 0:1e7b5dd9edb4 255
dflet 0:1e7b5dd9edb4 256 xTimeoutOccurred = pdTRUE;
dflet 0:1e7b5dd9edb4 257 }
dflet 0:1e7b5dd9edb4 258 else
dflet 0:1e7b5dd9edb4 259 {
dflet 0:1e7b5dd9edb4 260 /* The task unblocked because the bits were set. */
dflet 0:1e7b5dd9edb4 261 }
dflet 0:1e7b5dd9edb4 262
dflet 0:1e7b5dd9edb4 263 /* Control bits might be set as the task had blocked should not be
dflet 0:1e7b5dd9edb4 264 returned. */
dflet 0:1e7b5dd9edb4 265 uxReturn &= ~eventEVENT_BITS_CONTROL_BYTES;
dflet 0:1e7b5dd9edb4 266 }
dflet 0:1e7b5dd9edb4 267
dflet 0:1e7b5dd9edb4 268 traceEVENT_GROUP_SYNC_END( xEventGroup, uxBitsToSet, uxBitsToWaitFor, xTimeoutOccurred );
dflet 0:1e7b5dd9edb4 269
dflet 0:1e7b5dd9edb4 270 return uxReturn;
dflet 0:1e7b5dd9edb4 271 }
dflet 0:1e7b5dd9edb4 272 /*-----------------------------------------------------------*/
dflet 0:1e7b5dd9edb4 273
dflet 0:1e7b5dd9edb4 274 EventBits_t xEventGroupWaitBits( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToWaitFor, const BaseType_t xClearOnExit, const BaseType_t xWaitForAllBits, TickType_t xTicksToWait )
dflet 0:1e7b5dd9edb4 275 {
dflet 0:1e7b5dd9edb4 276 EventGroup_t *pxEventBits = ( EventGroup_t * ) xEventGroup;
dflet 0:1e7b5dd9edb4 277 EventBits_t uxReturn, uxControlBits = 0;
dflet 0:1e7b5dd9edb4 278 BaseType_t xWaitConditionMet, xAlreadyYielded;
dflet 0:1e7b5dd9edb4 279 BaseType_t xTimeoutOccurred = pdFALSE;
dflet 0:1e7b5dd9edb4 280
dflet 0:1e7b5dd9edb4 281 /* Check the user is not attempting to wait on the bits used by the kernel
dflet 0:1e7b5dd9edb4 282 itself, and that at least one bit is being requested. */
dflet 0:1e7b5dd9edb4 283 configASSERT( xEventGroup );
dflet 0:1e7b5dd9edb4 284 configASSERT( ( uxBitsToWaitFor & eventEVENT_BITS_CONTROL_BYTES ) == 0 );
dflet 0:1e7b5dd9edb4 285 configASSERT( uxBitsToWaitFor != 0 );
dflet 0:1e7b5dd9edb4 286 #if ( ( INCLUDE_xTaskGetSchedulerState == 1 ) || ( configUSE_TIMERS == 1 ) )
dflet 0:1e7b5dd9edb4 287 {
dflet 0:1e7b5dd9edb4 288 configASSERT( !( ( xTaskGetSchedulerState() == taskSCHEDULER_SUSPENDED ) && ( xTicksToWait != 0 ) ) );
dflet 0:1e7b5dd9edb4 289 }
dflet 0:1e7b5dd9edb4 290 #endif
dflet 0:1e7b5dd9edb4 291
dflet 0:1e7b5dd9edb4 292 vTaskSuspendAll();
dflet 0:1e7b5dd9edb4 293 {
dflet 0:1e7b5dd9edb4 294 const EventBits_t uxCurrentEventBits = pxEventBits->uxEventBits;
dflet 0:1e7b5dd9edb4 295
dflet 0:1e7b5dd9edb4 296 /* Check to see if the wait condition is already met or not. */
dflet 0:1e7b5dd9edb4 297 xWaitConditionMet = prvTestWaitCondition( uxCurrentEventBits, uxBitsToWaitFor, xWaitForAllBits );
dflet 0:1e7b5dd9edb4 298
dflet 0:1e7b5dd9edb4 299 if( xWaitConditionMet != pdFALSE )
dflet 0:1e7b5dd9edb4 300 {
dflet 0:1e7b5dd9edb4 301 /* The wait condition has already been met so there is no need to
dflet 0:1e7b5dd9edb4 302 block. */
dflet 0:1e7b5dd9edb4 303 uxReturn = uxCurrentEventBits;
dflet 0:1e7b5dd9edb4 304 xTicksToWait = ( TickType_t ) 0;
dflet 0:1e7b5dd9edb4 305
dflet 0:1e7b5dd9edb4 306 /* Clear the wait bits if requested to do so. */
dflet 0:1e7b5dd9edb4 307 if( xClearOnExit != pdFALSE )
dflet 0:1e7b5dd9edb4 308 {
dflet 0:1e7b5dd9edb4 309 pxEventBits->uxEventBits &= ~uxBitsToWaitFor;
dflet 0:1e7b5dd9edb4 310 }
dflet 0:1e7b5dd9edb4 311 else
dflet 0:1e7b5dd9edb4 312 {
dflet 0:1e7b5dd9edb4 313 mtCOVERAGE_TEST_MARKER();
dflet 0:1e7b5dd9edb4 314 }
dflet 0:1e7b5dd9edb4 315 }
dflet 0:1e7b5dd9edb4 316 else if( xTicksToWait == ( TickType_t ) 0 )
dflet 0:1e7b5dd9edb4 317 {
dflet 0:1e7b5dd9edb4 318 /* The wait condition has not been met, but no block time was
dflet 0:1e7b5dd9edb4 319 specified, so just return the current value. */
dflet 0:1e7b5dd9edb4 320 uxReturn = uxCurrentEventBits;
dflet 0:1e7b5dd9edb4 321 }
dflet 0:1e7b5dd9edb4 322 else
dflet 0:1e7b5dd9edb4 323 {
dflet 0:1e7b5dd9edb4 324 /* The task is going to block to wait for its required bits to be
dflet 0:1e7b5dd9edb4 325 set. uxControlBits are used to remember the specified behaviour of
dflet 0:1e7b5dd9edb4 326 this call to xEventGroupWaitBits() - for use when the event bits
dflet 0:1e7b5dd9edb4 327 unblock the task. */
dflet 0:1e7b5dd9edb4 328 if( xClearOnExit != pdFALSE )
dflet 0:1e7b5dd9edb4 329 {
dflet 0:1e7b5dd9edb4 330 uxControlBits |= eventCLEAR_EVENTS_ON_EXIT_BIT;
dflet 0:1e7b5dd9edb4 331 }
dflet 0:1e7b5dd9edb4 332 else
dflet 0:1e7b5dd9edb4 333 {
dflet 0:1e7b5dd9edb4 334 mtCOVERAGE_TEST_MARKER();
dflet 0:1e7b5dd9edb4 335 }
dflet 0:1e7b5dd9edb4 336
dflet 0:1e7b5dd9edb4 337 if( xWaitForAllBits != pdFALSE )
dflet 0:1e7b5dd9edb4 338 {
dflet 0:1e7b5dd9edb4 339 uxControlBits |= eventWAIT_FOR_ALL_BITS;
dflet 0:1e7b5dd9edb4 340 }
dflet 0:1e7b5dd9edb4 341 else
dflet 0:1e7b5dd9edb4 342 {
dflet 0:1e7b5dd9edb4 343 mtCOVERAGE_TEST_MARKER();
dflet 0:1e7b5dd9edb4 344 }
dflet 0:1e7b5dd9edb4 345
dflet 0:1e7b5dd9edb4 346 /* Store the bits that the calling task is waiting for in the
dflet 0:1e7b5dd9edb4 347 task's event list item so the kernel knows when a match is
dflet 0:1e7b5dd9edb4 348 found. Then enter the blocked state. */
dflet 0:1e7b5dd9edb4 349 vTaskPlaceOnUnorderedEventList( &( pxEventBits->xTasksWaitingForBits ), ( uxBitsToWaitFor | uxControlBits ), xTicksToWait );
dflet 0:1e7b5dd9edb4 350
dflet 0:1e7b5dd9edb4 351 /* This is obsolete as it will get set after the task unblocks, but
dflet 0:1e7b5dd9edb4 352 some compilers mistakenly generate a warning about the variable
dflet 0:1e7b5dd9edb4 353 being returned without being set if it is not done. */
dflet 0:1e7b5dd9edb4 354 uxReturn = 0;
dflet 0:1e7b5dd9edb4 355
dflet 0:1e7b5dd9edb4 356 traceEVENT_GROUP_WAIT_BITS_BLOCK( xEventGroup, uxBitsToWaitFor );
dflet 0:1e7b5dd9edb4 357 }
dflet 0:1e7b5dd9edb4 358 }
dflet 0:1e7b5dd9edb4 359 xAlreadyYielded = xTaskResumeAll();
dflet 0:1e7b5dd9edb4 360
dflet 0:1e7b5dd9edb4 361 if( xTicksToWait != ( TickType_t ) 0 )
dflet 0:1e7b5dd9edb4 362 {
dflet 0:1e7b5dd9edb4 363 if( xAlreadyYielded == pdFALSE )
dflet 0:1e7b5dd9edb4 364 {
dflet 0:1e7b5dd9edb4 365 portYIELD_WITHIN_API();
dflet 0:1e7b5dd9edb4 366 }
dflet 0:1e7b5dd9edb4 367 else
dflet 0:1e7b5dd9edb4 368 {
dflet 0:1e7b5dd9edb4 369 mtCOVERAGE_TEST_MARKER();
dflet 0:1e7b5dd9edb4 370 }
dflet 0:1e7b5dd9edb4 371
dflet 0:1e7b5dd9edb4 372 /* The task blocked to wait for its required bits to be set - at this
dflet 0:1e7b5dd9edb4 373 point either the required bits were set or the block time expired. If
dflet 0:1e7b5dd9edb4 374 the required bits were set they will have been stored in the task's
dflet 0:1e7b5dd9edb4 375 event list item, and they should now be retrieved then cleared. */
dflet 0:1e7b5dd9edb4 376 uxReturn = uxTaskResetEventItemValue();
dflet 0:1e7b5dd9edb4 377
dflet 0:1e7b5dd9edb4 378 if( ( uxReturn & eventUNBLOCKED_DUE_TO_BIT_SET ) == ( EventBits_t ) 0 )
dflet 0:1e7b5dd9edb4 379 {
dflet 0:1e7b5dd9edb4 380 taskENTER_CRITICAL();
dflet 0:1e7b5dd9edb4 381 {
dflet 0:1e7b5dd9edb4 382 /* The task timed out, just return the current event bit value. */
dflet 0:1e7b5dd9edb4 383 uxReturn = pxEventBits->uxEventBits;
dflet 0:1e7b5dd9edb4 384
dflet 0:1e7b5dd9edb4 385 /* It is possible that the event bits were updated between this
dflet 0:1e7b5dd9edb4 386 task leaving the Blocked state and running again. */
dflet 0:1e7b5dd9edb4 387 if( prvTestWaitCondition( uxReturn, uxBitsToWaitFor, xWaitForAllBits ) != pdFALSE )
dflet 0:1e7b5dd9edb4 388 {
dflet 0:1e7b5dd9edb4 389 if( xClearOnExit != pdFALSE )
dflet 0:1e7b5dd9edb4 390 {
dflet 0:1e7b5dd9edb4 391 pxEventBits->uxEventBits &= ~uxBitsToWaitFor;
dflet 0:1e7b5dd9edb4 392 }
dflet 0:1e7b5dd9edb4 393 else
dflet 0:1e7b5dd9edb4 394 {
dflet 0:1e7b5dd9edb4 395 mtCOVERAGE_TEST_MARKER();
dflet 0:1e7b5dd9edb4 396 }
dflet 0:1e7b5dd9edb4 397 }
dflet 0:1e7b5dd9edb4 398 else
dflet 0:1e7b5dd9edb4 399 {
dflet 0:1e7b5dd9edb4 400 mtCOVERAGE_TEST_MARKER();
dflet 0:1e7b5dd9edb4 401 }
dflet 0:1e7b5dd9edb4 402 }
dflet 0:1e7b5dd9edb4 403 taskEXIT_CRITICAL();
dflet 0:1e7b5dd9edb4 404
dflet 0:1e7b5dd9edb4 405 /* Prevent compiler warnings when trace macros are not used. */
dflet 0:1e7b5dd9edb4 406 xTimeoutOccurred = pdFALSE;
dflet 0:1e7b5dd9edb4 407 }
dflet 0:1e7b5dd9edb4 408 else
dflet 0:1e7b5dd9edb4 409 {
dflet 0:1e7b5dd9edb4 410 /* The task unblocked because the bits were set. */
dflet 0:1e7b5dd9edb4 411 }
dflet 0:1e7b5dd9edb4 412
dflet 0:1e7b5dd9edb4 413 /* The task blocked so control bits may have been set. */
dflet 0:1e7b5dd9edb4 414 uxReturn &= ~eventEVENT_BITS_CONTROL_BYTES;
dflet 0:1e7b5dd9edb4 415 }
dflet 0:1e7b5dd9edb4 416 traceEVENT_GROUP_WAIT_BITS_END( xEventGroup, uxBitsToWaitFor, xTimeoutOccurred );
dflet 0:1e7b5dd9edb4 417
dflet 0:1e7b5dd9edb4 418 return uxReturn;
dflet 0:1e7b5dd9edb4 419 }
dflet 0:1e7b5dd9edb4 420 /*-----------------------------------------------------------*/
dflet 0:1e7b5dd9edb4 421
dflet 0:1e7b5dd9edb4 422 EventBits_t xEventGroupClearBits( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToClear )
dflet 0:1e7b5dd9edb4 423 {
dflet 0:1e7b5dd9edb4 424 EventGroup_t *pxEventBits = ( EventGroup_t * ) xEventGroup;
dflet 0:1e7b5dd9edb4 425 EventBits_t uxReturn;
dflet 0:1e7b5dd9edb4 426
dflet 0:1e7b5dd9edb4 427 /* Check the user is not attempting to clear the bits used by the kernel
dflet 0:1e7b5dd9edb4 428 itself. */
dflet 0:1e7b5dd9edb4 429 configASSERT( xEventGroup );
dflet 0:1e7b5dd9edb4 430 configASSERT( ( uxBitsToClear & eventEVENT_BITS_CONTROL_BYTES ) == 0 );
dflet 0:1e7b5dd9edb4 431
dflet 0:1e7b5dd9edb4 432 taskENTER_CRITICAL();
dflet 0:1e7b5dd9edb4 433 {
dflet 0:1e7b5dd9edb4 434 traceEVENT_GROUP_CLEAR_BITS( xEventGroup, uxBitsToClear );
dflet 0:1e7b5dd9edb4 435
dflet 0:1e7b5dd9edb4 436 /* The value returned is the event group value prior to the bits being
dflet 0:1e7b5dd9edb4 437 cleared. */
dflet 0:1e7b5dd9edb4 438 uxReturn = pxEventBits->uxEventBits;
dflet 0:1e7b5dd9edb4 439
dflet 0:1e7b5dd9edb4 440 /* Clear the bits. */
dflet 0:1e7b5dd9edb4 441 pxEventBits->uxEventBits &= ~uxBitsToClear;
dflet 0:1e7b5dd9edb4 442 }
dflet 0:1e7b5dd9edb4 443 taskEXIT_CRITICAL();
dflet 0:1e7b5dd9edb4 444
dflet 0:1e7b5dd9edb4 445 return uxReturn;
dflet 0:1e7b5dd9edb4 446 }
dflet 0:1e7b5dd9edb4 447 /*-----------------------------------------------------------*/
dflet 0:1e7b5dd9edb4 448
dflet 0:1e7b5dd9edb4 449 #if ( ( configUSE_TRACE_FACILITY == 1 ) && ( INCLUDE_xTimerPendFunctionCall == 1 ) && ( configUSE_TIMERS == 1 ) )
dflet 0:1e7b5dd9edb4 450
dflet 0:1e7b5dd9edb4 451 BaseType_t xEventGroupClearBitsFromISR( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToClear )
dflet 0:1e7b5dd9edb4 452 {
dflet 0:1e7b5dd9edb4 453 BaseType_t xReturn;
dflet 0:1e7b5dd9edb4 454
dflet 0:1e7b5dd9edb4 455 traceEVENT_GROUP_CLEAR_BITS_FROM_ISR( xEventGroup, uxBitsToClear );
dflet 0:1e7b5dd9edb4 456 xReturn = xTimerPendFunctionCallFromISR( vEventGroupClearBitsCallback, ( void * ) xEventGroup, ( uint32_t ) uxBitsToClear, NULL );
dflet 0:1e7b5dd9edb4 457
dflet 0:1e7b5dd9edb4 458 return xReturn;
dflet 0:1e7b5dd9edb4 459 }
dflet 0:1e7b5dd9edb4 460
dflet 0:1e7b5dd9edb4 461 #endif
dflet 0:1e7b5dd9edb4 462 /*-----------------------------------------------------------*/
dflet 0:1e7b5dd9edb4 463
dflet 0:1e7b5dd9edb4 464 EventBits_t xEventGroupGetBitsFromISR( EventGroupHandle_t xEventGroup )
dflet 0:1e7b5dd9edb4 465 {
dflet 0:1e7b5dd9edb4 466 UBaseType_t uxSavedInterruptStatus;
dflet 0:1e7b5dd9edb4 467 EventGroup_t *pxEventBits = ( EventGroup_t * ) xEventGroup;
dflet 0:1e7b5dd9edb4 468 EventBits_t uxReturn;
dflet 0:1e7b5dd9edb4 469
dflet 0:1e7b5dd9edb4 470 uxSavedInterruptStatus = portSET_INTERRUPT_MASK_FROM_ISR();
dflet 0:1e7b5dd9edb4 471 {
dflet 0:1e7b5dd9edb4 472 uxReturn = pxEventBits->uxEventBits;
dflet 0:1e7b5dd9edb4 473 }
dflet 0:1e7b5dd9edb4 474 portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedInterruptStatus );
dflet 0:1e7b5dd9edb4 475
dflet 0:1e7b5dd9edb4 476 return uxReturn;
dflet 0:1e7b5dd9edb4 477 }
dflet 0:1e7b5dd9edb4 478 /*-----------------------------------------------------------*/
dflet 0:1e7b5dd9edb4 479
dflet 0:1e7b5dd9edb4 480 EventBits_t xEventGroupSetBits( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToSet )
dflet 0:1e7b5dd9edb4 481 {
dflet 0:1e7b5dd9edb4 482 ListItem_t *pxListItem, *pxNext;
dflet 0:1e7b5dd9edb4 483 ListItem_t const *pxListEnd;
dflet 0:1e7b5dd9edb4 484 List_t *pxList;
dflet 0:1e7b5dd9edb4 485 EventBits_t uxBitsToClear = 0, uxBitsWaitedFor, uxControlBits;
dflet 0:1e7b5dd9edb4 486 EventGroup_t *pxEventBits = ( EventGroup_t * ) xEventGroup;
dflet 0:1e7b5dd9edb4 487 BaseType_t xMatchFound = pdFALSE;
dflet 0:1e7b5dd9edb4 488
dflet 0:1e7b5dd9edb4 489 /* Check the user is not attempting to set the bits used by the kernel
dflet 0:1e7b5dd9edb4 490 itself. */
dflet 0:1e7b5dd9edb4 491 configASSERT( xEventGroup );
dflet 0:1e7b5dd9edb4 492 configASSERT( ( uxBitsToSet & eventEVENT_BITS_CONTROL_BYTES ) == 0 );
dflet 0:1e7b5dd9edb4 493
dflet 0:1e7b5dd9edb4 494 pxList = &( pxEventBits->xTasksWaitingForBits );
dflet 0:1e7b5dd9edb4 495 pxListEnd = listGET_END_MARKER( pxList ); /*lint !e826 !e740 The mini list structure is used as the list end to save RAM. This is checked and valid. */
dflet 0:1e7b5dd9edb4 496 vTaskSuspendAll();
dflet 0:1e7b5dd9edb4 497 {
dflet 0:1e7b5dd9edb4 498 traceEVENT_GROUP_SET_BITS( xEventGroup, uxBitsToSet );
dflet 0:1e7b5dd9edb4 499
dflet 0:1e7b5dd9edb4 500 pxListItem = listGET_HEAD_ENTRY( pxList );
dflet 0:1e7b5dd9edb4 501
dflet 0:1e7b5dd9edb4 502 /* Set the bits. */
dflet 0:1e7b5dd9edb4 503 pxEventBits->uxEventBits |= uxBitsToSet;
dflet 0:1e7b5dd9edb4 504
dflet 0:1e7b5dd9edb4 505 /* See if the new bit value should unblock any tasks. */
dflet 0:1e7b5dd9edb4 506 while( pxListItem != pxListEnd )
dflet 0:1e7b5dd9edb4 507 {
dflet 0:1e7b5dd9edb4 508 pxNext = listGET_NEXT( pxListItem );
dflet 0:1e7b5dd9edb4 509 uxBitsWaitedFor = listGET_LIST_ITEM_VALUE( pxListItem );
dflet 0:1e7b5dd9edb4 510 xMatchFound = pdFALSE;
dflet 0:1e7b5dd9edb4 511
dflet 0:1e7b5dd9edb4 512 /* Split the bits waited for from the control bits. */
dflet 0:1e7b5dd9edb4 513 uxControlBits = uxBitsWaitedFor & eventEVENT_BITS_CONTROL_BYTES;
dflet 0:1e7b5dd9edb4 514 uxBitsWaitedFor &= ~eventEVENT_BITS_CONTROL_BYTES;
dflet 0:1e7b5dd9edb4 515
dflet 0:1e7b5dd9edb4 516 if( ( uxControlBits & eventWAIT_FOR_ALL_BITS ) == ( EventBits_t ) 0 )
dflet 0:1e7b5dd9edb4 517 {
dflet 0:1e7b5dd9edb4 518 /* Just looking for single bit being set. */
dflet 0:1e7b5dd9edb4 519 if( ( uxBitsWaitedFor & pxEventBits->uxEventBits ) != ( EventBits_t ) 0 )
dflet 0:1e7b5dd9edb4 520 {
dflet 0:1e7b5dd9edb4 521 xMatchFound = pdTRUE;
dflet 0:1e7b5dd9edb4 522 }
dflet 0:1e7b5dd9edb4 523 else
dflet 0:1e7b5dd9edb4 524 {
dflet 0:1e7b5dd9edb4 525 mtCOVERAGE_TEST_MARKER();
dflet 0:1e7b5dd9edb4 526 }
dflet 0:1e7b5dd9edb4 527 }
dflet 0:1e7b5dd9edb4 528 else if( ( uxBitsWaitedFor & pxEventBits->uxEventBits ) == uxBitsWaitedFor )
dflet 0:1e7b5dd9edb4 529 {
dflet 0:1e7b5dd9edb4 530 /* All bits are set. */
dflet 0:1e7b5dd9edb4 531 xMatchFound = pdTRUE;
dflet 0:1e7b5dd9edb4 532 }
dflet 0:1e7b5dd9edb4 533 else
dflet 0:1e7b5dd9edb4 534 {
dflet 0:1e7b5dd9edb4 535 /* Need all bits to be set, but not all the bits were set. */
dflet 0:1e7b5dd9edb4 536 }
dflet 0:1e7b5dd9edb4 537
dflet 0:1e7b5dd9edb4 538 if( xMatchFound != pdFALSE )
dflet 0:1e7b5dd9edb4 539 {
dflet 0:1e7b5dd9edb4 540 /* The bits match. Should the bits be cleared on exit? */
dflet 0:1e7b5dd9edb4 541 if( ( uxControlBits & eventCLEAR_EVENTS_ON_EXIT_BIT ) != ( EventBits_t ) 0 )
dflet 0:1e7b5dd9edb4 542 {
dflet 0:1e7b5dd9edb4 543 uxBitsToClear |= uxBitsWaitedFor;
dflet 0:1e7b5dd9edb4 544 }
dflet 0:1e7b5dd9edb4 545 else
dflet 0:1e7b5dd9edb4 546 {
dflet 0:1e7b5dd9edb4 547 mtCOVERAGE_TEST_MARKER();
dflet 0:1e7b5dd9edb4 548 }
dflet 0:1e7b5dd9edb4 549
dflet 0:1e7b5dd9edb4 550 /* Store the actual event flag value in the task's event list
dflet 0:1e7b5dd9edb4 551 item before removing the task from the event list. The
dflet 0:1e7b5dd9edb4 552 eventUNBLOCKED_DUE_TO_BIT_SET bit is set so the task knows
dflet 0:1e7b5dd9edb4 553 that is was unblocked due to its required bits matching, rather
dflet 0:1e7b5dd9edb4 554 than because it timed out. */
dflet 0:1e7b5dd9edb4 555 ( void ) xTaskRemoveFromUnorderedEventList( pxListItem, pxEventBits->uxEventBits | eventUNBLOCKED_DUE_TO_BIT_SET );
dflet 0:1e7b5dd9edb4 556 }
dflet 0:1e7b5dd9edb4 557
dflet 0:1e7b5dd9edb4 558 /* Move onto the next list item. Note pxListItem->pxNext is not
dflet 0:1e7b5dd9edb4 559 used here as the list item may have been removed from the event list
dflet 0:1e7b5dd9edb4 560 and inserted into the ready/pending reading list. */
dflet 0:1e7b5dd9edb4 561 pxListItem = pxNext;
dflet 0:1e7b5dd9edb4 562 }
dflet 0:1e7b5dd9edb4 563
dflet 0:1e7b5dd9edb4 564 /* Clear any bits that matched when the eventCLEAR_EVENTS_ON_EXIT_BIT
dflet 0:1e7b5dd9edb4 565 bit was set in the control word. */
dflet 0:1e7b5dd9edb4 566 pxEventBits->uxEventBits &= ~uxBitsToClear;
dflet 0:1e7b5dd9edb4 567 }
dflet 0:1e7b5dd9edb4 568 ( void ) xTaskResumeAll();
dflet 0:1e7b5dd9edb4 569
dflet 0:1e7b5dd9edb4 570 return pxEventBits->uxEventBits;
dflet 0:1e7b5dd9edb4 571 }
dflet 0:1e7b5dd9edb4 572 /*-----------------------------------------------------------*/
dflet 0:1e7b5dd9edb4 573
dflet 0:1e7b5dd9edb4 574 void vEventGroupDelete( EventGroupHandle_t xEventGroup )
dflet 0:1e7b5dd9edb4 575 {
dflet 0:1e7b5dd9edb4 576 EventGroup_t *pxEventBits = ( EventGroup_t * ) xEventGroup;
dflet 0:1e7b5dd9edb4 577 const List_t *pxTasksWaitingForBits = &( pxEventBits->xTasksWaitingForBits );
dflet 0:1e7b5dd9edb4 578
dflet 0:1e7b5dd9edb4 579 vTaskSuspendAll();
dflet 0:1e7b5dd9edb4 580 {
dflet 0:1e7b5dd9edb4 581 traceEVENT_GROUP_DELETE( xEventGroup );
dflet 0:1e7b5dd9edb4 582
dflet 0:1e7b5dd9edb4 583 while( listCURRENT_LIST_LENGTH( pxTasksWaitingForBits ) > ( UBaseType_t ) 0 )
dflet 0:1e7b5dd9edb4 584 {
dflet 0:1e7b5dd9edb4 585 /* Unblock the task, returning 0 as the event list is being deleted
dflet 0:1e7b5dd9edb4 586 and cannot therefore have any bits set. */
dflet 0:1e7b5dd9edb4 587 configASSERT( pxTasksWaitingForBits->xListEnd.pxNext != ( ListItem_t * ) &( pxTasksWaitingForBits->xListEnd ) );
dflet 0:1e7b5dd9edb4 588 ( void ) xTaskRemoveFromUnorderedEventList( pxTasksWaitingForBits->xListEnd.pxNext, eventUNBLOCKED_DUE_TO_BIT_SET );
dflet 0:1e7b5dd9edb4 589 }
dflet 0:1e7b5dd9edb4 590
dflet 0:1e7b5dd9edb4 591 vPortFree( pxEventBits );
dflet 0:1e7b5dd9edb4 592 }
dflet 0:1e7b5dd9edb4 593 ( void ) xTaskResumeAll();
dflet 0:1e7b5dd9edb4 594 }
dflet 0:1e7b5dd9edb4 595 /*-----------------------------------------------------------*/
dflet 0:1e7b5dd9edb4 596
dflet 0:1e7b5dd9edb4 597 /* For internal use only - execute a 'set bits' command that was pended from
dflet 0:1e7b5dd9edb4 598 an interrupt. */
dflet 0:1e7b5dd9edb4 599 void vEventGroupSetBitsCallback( void *pvEventGroup, const uint32_t ulBitsToSet )
dflet 0:1e7b5dd9edb4 600 {
dflet 0:1e7b5dd9edb4 601 ( void ) xEventGroupSetBits( pvEventGroup, ( EventBits_t ) ulBitsToSet );
dflet 0:1e7b5dd9edb4 602 }
dflet 0:1e7b5dd9edb4 603 /*-----------------------------------------------------------*/
dflet 0:1e7b5dd9edb4 604
dflet 0:1e7b5dd9edb4 605 /* For internal use only - execute a 'clear bits' command that was pended from
dflet 0:1e7b5dd9edb4 606 an interrupt. */
dflet 0:1e7b5dd9edb4 607 void vEventGroupClearBitsCallback( void *pvEventGroup, const uint32_t ulBitsToClear )
dflet 0:1e7b5dd9edb4 608 {
dflet 0:1e7b5dd9edb4 609 ( void ) xEventGroupClearBits( pvEventGroup, ( EventBits_t ) ulBitsToClear );
dflet 0:1e7b5dd9edb4 610 }
dflet 0:1e7b5dd9edb4 611 /*-----------------------------------------------------------*/
dflet 0:1e7b5dd9edb4 612
dflet 0:1e7b5dd9edb4 613 static BaseType_t prvTestWaitCondition( const EventBits_t uxCurrentEventBits, const EventBits_t uxBitsToWaitFor, const BaseType_t xWaitForAllBits )
dflet 0:1e7b5dd9edb4 614 {
dflet 0:1e7b5dd9edb4 615 BaseType_t xWaitConditionMet = pdFALSE;
dflet 0:1e7b5dd9edb4 616
dflet 0:1e7b5dd9edb4 617 if( xWaitForAllBits == pdFALSE )
dflet 0:1e7b5dd9edb4 618 {
dflet 0:1e7b5dd9edb4 619 /* Task only has to wait for one bit within uxBitsToWaitFor to be
dflet 0:1e7b5dd9edb4 620 set. Is one already set? */
dflet 0:1e7b5dd9edb4 621 if( ( uxCurrentEventBits & uxBitsToWaitFor ) != ( EventBits_t ) 0 )
dflet 0:1e7b5dd9edb4 622 {
dflet 0:1e7b5dd9edb4 623 xWaitConditionMet = pdTRUE;
dflet 0:1e7b5dd9edb4 624 }
dflet 0:1e7b5dd9edb4 625 else
dflet 0:1e7b5dd9edb4 626 {
dflet 0:1e7b5dd9edb4 627 mtCOVERAGE_TEST_MARKER();
dflet 0:1e7b5dd9edb4 628 }
dflet 0:1e7b5dd9edb4 629 }
dflet 0:1e7b5dd9edb4 630 else
dflet 0:1e7b5dd9edb4 631 {
dflet 0:1e7b5dd9edb4 632 /* Task has to wait for all the bits in uxBitsToWaitFor to be set.
dflet 0:1e7b5dd9edb4 633 Are they set already? */
dflet 0:1e7b5dd9edb4 634 if( ( uxCurrentEventBits & uxBitsToWaitFor ) == uxBitsToWaitFor )
dflet 0:1e7b5dd9edb4 635 {
dflet 0:1e7b5dd9edb4 636 xWaitConditionMet = pdTRUE;
dflet 0:1e7b5dd9edb4 637 }
dflet 0:1e7b5dd9edb4 638 else
dflet 0:1e7b5dd9edb4 639 {
dflet 0:1e7b5dd9edb4 640 mtCOVERAGE_TEST_MARKER();
dflet 0:1e7b5dd9edb4 641 }
dflet 0:1e7b5dd9edb4 642 }
dflet 0:1e7b5dd9edb4 643
dflet 0:1e7b5dd9edb4 644 return xWaitConditionMet;
dflet 0:1e7b5dd9edb4 645 }
dflet 0:1e7b5dd9edb4 646 /*-----------------------------------------------------------*/
dflet 0:1e7b5dd9edb4 647
dflet 0:1e7b5dd9edb4 648 #if ( ( configUSE_TRACE_FACILITY == 1 ) && ( INCLUDE_xTimerPendFunctionCall == 1 ) && ( configUSE_TIMERS == 1 ) )
dflet 0:1e7b5dd9edb4 649
dflet 0:1e7b5dd9edb4 650 BaseType_t xEventGroupSetBitsFromISR( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToSet, BaseType_t *pxHigherPriorityTaskWoken )
dflet 0:1e7b5dd9edb4 651 {
dflet 0:1e7b5dd9edb4 652 BaseType_t xReturn;
dflet 0:1e7b5dd9edb4 653
dflet 0:1e7b5dd9edb4 654 traceEVENT_GROUP_SET_BITS_FROM_ISR( xEventGroup, uxBitsToSet );
dflet 0:1e7b5dd9edb4 655 xReturn = xTimerPendFunctionCallFromISR( vEventGroupSetBitsCallback, ( void * ) xEventGroup, ( uint32_t ) uxBitsToSet, pxHigherPriorityTaskWoken );
dflet 0:1e7b5dd9edb4 656
dflet 0:1e7b5dd9edb4 657 return xReturn;
dflet 0:1e7b5dd9edb4 658 }
dflet 0:1e7b5dd9edb4 659
dflet 0:1e7b5dd9edb4 660 #endif
dflet 0:1e7b5dd9edb4 661 /*-----------------------------------------------------------*/
dflet 0:1e7b5dd9edb4 662
dflet 0:1e7b5dd9edb4 663 #if (configUSE_TRACE_FACILITY == 1)
dflet 0:1e7b5dd9edb4 664
dflet 0:1e7b5dd9edb4 665 UBaseType_t uxEventGroupGetNumber( void* xEventGroup )
dflet 0:1e7b5dd9edb4 666 {
dflet 0:1e7b5dd9edb4 667 UBaseType_t xReturn;
dflet 0:1e7b5dd9edb4 668 EventGroup_t *pxEventBits = ( EventGroup_t * ) xEventGroup;
dflet 0:1e7b5dd9edb4 669
dflet 0:1e7b5dd9edb4 670 if( xEventGroup == NULL )
dflet 0:1e7b5dd9edb4 671 {
dflet 0:1e7b5dd9edb4 672 xReturn = 0;
dflet 0:1e7b5dd9edb4 673 }
dflet 0:1e7b5dd9edb4 674 else
dflet 0:1e7b5dd9edb4 675 {
dflet 0:1e7b5dd9edb4 676 xReturn = pxEventBits->uxEventGroupNumber;
dflet 0:1e7b5dd9edb4 677 }
dflet 0:1e7b5dd9edb4 678
dflet 0:1e7b5dd9edb4 679 return xReturn;
dflet 0:1e7b5dd9edb4 680 }
dflet 0:1e7b5dd9edb4 681
dflet 0:1e7b5dd9edb4 682 #endif
dflet 0:1e7b5dd9edb4 683
dflet 0:1e7b5dd9edb4 684