mirror of
				https://github.com/0xFEEDC0DE64/arduino-esp32.git
				synced 2025-10-30 21:51:40 +01:00 
			
		
		
		
	Initial Esp32c3 Support (#5060)
This commit is contained in:
		
							
								
								
									
										1329
									
								
								tools/sdk/esp32c3/include/freertos/include/freertos/FreeRTOS.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1329
									
								
								tools/sdk/esp32c3/include/freertos/include/freertos/FreeRTOS.h
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @@ -0,0 +1,300 @@ | ||||
| /* | ||||
|     FreeRTOS V10 - Copyright (C) 2021 Real Time Engineers Ltd. | ||||
|     All rights reserved | ||||
|  | ||||
|     VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. | ||||
|  | ||||
|     This file is part of the FreeRTOS distribution. | ||||
|  | ||||
|     FreeRTOS is free software; you can redistribute it and/or modify it under | ||||
|     the terms of the GNU General Public License (version 2) as published by the | ||||
|     Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception. | ||||
|  | ||||
| 	*************************************************************************** | ||||
|     >>!   NOTE: The modification to the GPL is included to allow you to     !<< | ||||
|     >>!   distribute a combined work that includes FreeRTOS without being   !<< | ||||
|     >>!   obliged to provide the source code for proprietary components     !<< | ||||
|     >>!   outside of the FreeRTOS kernel.                                   !<< | ||||
| 	*************************************************************************** | ||||
|  | ||||
|     FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY | ||||
|     WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS | ||||
|     FOR A PARTICULAR PURPOSE.  Full license text is available on the following | ||||
|     link: http://www.freertos.org/a00114.html | ||||
|  | ||||
|     *************************************************************************** | ||||
|      *                                                                       * | ||||
|      *    FreeRTOS provides completely free yet professionally developed,    * | ||||
|      *    robust, strictly quality controlled, supported, and cross          * | ||||
|      *    platform software that is more than just the market leader, it     * | ||||
|      *    is the industry's de facto standard.                               * | ||||
|      *                                                                       * | ||||
|      *    Help yourself get started quickly while simultaneously helping     * | ||||
|      *    to support the FreeRTOS project by purchasing a FreeRTOS           * | ||||
|      *    tutorial book, reference manual, or both:                          * | ||||
|      *    http://www.FreeRTOS.org/Documentation                              * | ||||
|      *                                                                       * | ||||
|     *************************************************************************** | ||||
|  | ||||
|     http://www.FreeRTOS.org/FAQHelp.html - Having a problem?  Start by reading | ||||
| 	the FAQ page "My application does not run, what could be wrong?".  Have you | ||||
| 	defined configASSERT()? | ||||
|  | ||||
| 	http://www.FreeRTOS.org/support - In return for receiving this top quality | ||||
| 	embedded software for free we request you assist our global community by | ||||
| 	participating in the support forum. | ||||
|  | ||||
| 	http://www.FreeRTOS.org/training - Investing in training allows your team to | ||||
| 	be as productive as possible as early as possible.  Now you can receive | ||||
| 	FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers | ||||
| 	Ltd, and the world's leading authority on the world's leading RTOS. | ||||
|  | ||||
|     http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, | ||||
|     including FreeRTOS+Trace - an indispensable productivity tool, a DOS | ||||
|     compatible FAT file system, and our tiny thread aware UDP/IP stack. | ||||
|  | ||||
|     http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. | ||||
|     Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. | ||||
|  | ||||
|     http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High | ||||
|     Integrity Systems ltd. to sell under the OpenRTOS brand.  Low cost OpenRTOS | ||||
|     licenses offer ticketed support, indemnification and commercial middleware. | ||||
|  | ||||
|     http://www.SafeRTOS.com - High Integrity Systems also provide a safety | ||||
|     engineered and independently SIL3 certified version for use in safety and | ||||
|     mission critical applications that require provable dependability. | ||||
|  | ||||
|     1 tab == 4 spaces! | ||||
| */ | ||||
|  | ||||
| #ifndef FREERTOS_CONFIG_H | ||||
| #define FREERTOS_CONFIG_H | ||||
|  | ||||
| #include "sdkconfig.h" | ||||
| // The arch-specific FreeRTOSConfig.h in port/<arch>/include. | ||||
| #include_next "freertos/FreeRTOSConfig.h" | ||||
|  | ||||
| #if !(defined(FREERTOS_CONFIG_XTENSA_H) || defined(FREERTOS_CONFIG_RISCV_H)) | ||||
| #error "Needs architecture-speific FreeRTOSConfig.h!" | ||||
| #endif | ||||
|  | ||||
| #ifndef CONFIG_FREERTOS_UNICORE | ||||
| #define portNUM_PROCESSORS                              2 | ||||
| #else | ||||
| #define portNUM_PROCESSORS                              1 | ||||
| #endif | ||||
|  | ||||
| #define configASSERT_2                                  0 | ||||
| #define portUSING_MPU_WRAPPERS                          0 | ||||
| #define configUSE_MUTEX                                 1 | ||||
|  | ||||
| #define configNUM_THREAD_LOCAL_STORAGE_POINTERS CONFIG_FREERTOS_THREAD_LOCAL_STORAGE_POINTERS | ||||
| #define configTHREAD_LOCAL_STORAGE_DELETE_CALLBACKS     1 | ||||
|  | ||||
| /* configASSERT behaviour */ | ||||
| #ifndef __ASSEMBLER__ | ||||
| #include <assert.h> | ||||
|  | ||||
| // If CONFIG_FREERTOS_ASSERT_DISABLE is set then configASSERT is defined empty later in FreeRTOS.h and the macro | ||||
| // configASSERT_DEFINED remains unset (meaning some warnings are avoided) | ||||
|  | ||||
| #if defined(CONFIG_FREERTOS_ASSERT_FAIL_PRINT_CONTINUE) | ||||
| #define configASSERT(a) if (unlikely(!(a))) {                               \ | ||||
|         esp_rom_printf("%s:%d (%s)- assert failed!\n", __FILE__, __LINE__,  \ | ||||
|                    __FUNCTION__);                                           \ | ||||
|     } | ||||
| #elif defined(CONFIG_FREERTOS_ASSERT_FAIL_ABORT) | ||||
| #define configASSERT(a) assert(a) | ||||
| #endif | ||||
|  | ||||
| #if CONFIG_FREERTOS_ASSERT_ON_UNTESTED_FUNCTION | ||||
| #define UNTESTED_FUNCTION() { esp_rom_printf("Untested FreeRTOS function %s\r\n", __FUNCTION__); configASSERT(false); } while(0) | ||||
| #else | ||||
| #define UNTESTED_FUNCTION() | ||||
| #endif | ||||
|  | ||||
| #endif /* def __ASSEMBLER__ */ | ||||
|  | ||||
| /*----------------------------------------------------------- | ||||
|  * Application specific definitions. | ||||
|  * | ||||
|  * These definitions should be adjusted for your particular hardware and | ||||
|  * application requirements. | ||||
|  * | ||||
|  * Note that the default heap size is deliberately kept small so that | ||||
|  * the build is more likely to succeed for configurations with limited | ||||
|  * memory. | ||||
|  * | ||||
|  * THESE PARAMETERS ARE DESCRIBED WITHIN THE 'CONFIGURATION' SECTION OF THE | ||||
|  * FreeRTOS API DOCUMENTATION AVAILABLE ON THE FreeRTOS.org WEB SITE. | ||||
|  *----------------------------------------------------------*/ | ||||
|  | ||||
| #define configUSE_PREEMPTION                            1 | ||||
| #define configUSE_IDLE_HOOK                             1 | ||||
| #define configUSE_TICK_HOOK                             1 | ||||
| #define configRECORD_STACK_HIGH_ADDRESS                 1 | ||||
| #define configTICK_RATE_HZ                              ( CONFIG_FREERTOS_HZ ) | ||||
|  | ||||
| /* This has impact on speed of search for highest priority */ | ||||
| #ifdef SMALL_TEST | ||||
| #define configMAX_PRIORITIES                            ( 7 ) | ||||
| #else | ||||
| #define configMAX_PRIORITIES                            ( 25 ) | ||||
| #endif | ||||
|  | ||||
| /* Various things that impact minimum stack sizes */ | ||||
|  | ||||
| /* Higher stack checker modes cause overhead on each function call */ | ||||
| #if CONFIG_STACK_CHECK_ALL || CONFIG_STACK_CHECK_STRONG | ||||
| #define configSTACK_OVERHEAD_CHECKER                    256 | ||||
| #else | ||||
| #define configSTACK_OVERHEAD_CHECKER                    0 | ||||
| #endif | ||||
|  | ||||
| /* with optimizations disabled, scheduler uses additional stack */ | ||||
| #if CONFIG_COMPILER_OPTIMIZATION_NONE | ||||
| #define configSTACK_OVERHEAD_OPTIMIZATION               320 | ||||
| #else | ||||
| #define configSTACK_OVERHEAD_OPTIMIZATION               0 | ||||
| #endif | ||||
|  | ||||
| /* apptrace mdule increases minimum stack usage */ | ||||
| #if CONFIG_APPTRACE_ENABLE | ||||
| #define configSTACK_OVERHEAD_APPTRACE                   1280 | ||||
| #else | ||||
| #define configSTACK_OVERHEAD_APPTRACE                   0 | ||||
| #endif | ||||
|  | ||||
| #define configSTACK_OVERHEAD_TOTAL (                                    \ | ||||
|                                     configSTACK_OVERHEAD_CHECKER +      \ | ||||
|                                     configSTACK_OVERHEAD_OPTIMIZATION + \ | ||||
|                                     configSTACK_OVERHEAD_APPTRACE       \ | ||||
|                                                                         ) | ||||
|  | ||||
| #define configMINIMAL_STACK_SIZE                        (768 + configSTACK_OVERHEAD_TOTAL) | ||||
|  | ||||
| #ifndef configIDLE_TASK_STACK_SIZE | ||||
| #define configIDLE_TASK_STACK_SIZE CONFIG_FREERTOS_IDLE_TASK_STACKSIZE | ||||
| #endif | ||||
|  | ||||
| /* Minimal heap size to make sure examples can run on memory limited | ||||
|    configs. Adjust this to suit your system. */ | ||||
|  | ||||
|  | ||||
| //We define the heap to span all of the non-statically-allocated shared RAM. ToDo: Make sure there | ||||
| //is some space left for the app and main cpu when running outside of a thread. | ||||
| #define configAPPLICATION_ALLOCATED_HEAP                1 | ||||
| #define configTOTAL_HEAP_SIZE                           (&_heap_end - &_heap_start)//( ( size_t ) (64 * 1024) ) | ||||
|  | ||||
| #define configMAX_TASK_NAME_LEN                         ( CONFIG_FREERTOS_MAX_TASK_NAME_LEN ) | ||||
|  | ||||
| #ifdef CONFIG_FREERTOS_USE_TRACE_FACILITY | ||||
| #define configUSE_TRACE_FACILITY                        1       /* Used by uxTaskGetSystemState(), and other trace facility functions */ | ||||
| #endif | ||||
|  | ||||
| #ifdef CONFIG_FREERTOS_USE_STATS_FORMATTING_FUNCTIONS | ||||
| #define configUSE_STATS_FORMATTING_FUNCTIONS            1   /* Used by vTaskList() */ | ||||
| #endif | ||||
|  | ||||
| #ifdef CONFIG_FREERTOS_VTASKLIST_INCLUDE_COREID | ||||
| #define configTASKLIST_INCLUDE_COREID                   1 | ||||
| #endif | ||||
|  | ||||
| #ifdef CONFIG_FREERTOS_GENERATE_RUN_TIME_STATS | ||||
| #define configGENERATE_RUN_TIME_STATS                   1       /* Used by vTaskGetRunTimeStats() */ | ||||
| #endif | ||||
|  | ||||
| #define configUSE_TRACE_FACILITY_2                      0 | ||||
| #define configBENCHMARK                                 0 | ||||
| #define configUSE_16_BIT_TICKS                          0 | ||||
| #define configIDLE_SHOULD_YIELD                         0 | ||||
| #define configQUEUE_REGISTRY_SIZE                       CONFIG_FREERTOS_QUEUE_REGISTRY_SIZE | ||||
|  | ||||
| #define configUSE_MUTEXES                               1 | ||||
| #define configUSE_RECURSIVE_MUTEXES                     1 | ||||
| #define configUSE_COUNTING_SEMAPHORES                   1 | ||||
|  | ||||
| #if CONFIG_FREERTOS_CHECK_STACKOVERFLOW_NONE | ||||
| #define configCHECK_FOR_STACK_OVERFLOW                  0 | ||||
| #elif CONFIG_FREERTOS_CHECK_STACKOVERFLOW_PTRVAL | ||||
| #define configCHECK_FOR_STACK_OVERFLOW                  1 | ||||
| #elif CONFIG_FREERTOS_CHECK_STACKOVERFLOW_CANARY | ||||
| #define configCHECK_FOR_STACK_OVERFLOW                  2 | ||||
| #endif | ||||
|  | ||||
|  | ||||
| /* Co-routine definitions. */ | ||||
| #define configUSE_CO_ROUTINES                           0 | ||||
| #define configMAX_CO_ROUTINE_PRIORITIES                 ( 2 ) | ||||
|  | ||||
| /* Set the following definitions to 1 to include the API function, or zero | ||||
|    to exclude the API function. */ | ||||
|  | ||||
| #define INCLUDE_vTaskPrioritySet                        1 | ||||
| #define INCLUDE_uxTaskPriorityGet                       1 | ||||
| #define INCLUDE_vTaskDelete                             1 | ||||
| #define INCLUDE_vTaskCleanUpResources                   0 | ||||
| #define INCLUDE_vTaskSuspend                            1 | ||||
| #define INCLUDE_vTaskDelayUntil                         1 | ||||
| #define INCLUDE_vTaskDelay                              1 | ||||
| #define INCLUDE_uxTaskGetStackHighWaterMark             1 | ||||
| #define INCLUDE_pcTaskGetTaskName                       1 | ||||
| #define INCLUDE_xTaskGetIdleTaskHandle                  1 | ||||
| #define INCLUDE_pxTaskGetStackStart                     1 | ||||
|  | ||||
| #define INCLUDE_xSemaphoreGetMutexHolder                1 | ||||
|  | ||||
| /* The priority at which the tick interrupt runs.  This should probably be | ||||
|    kept at 1. */ | ||||
| #define configKERNEL_INTERRUPT_PRIORITY                 1 | ||||
|  | ||||
| #define configUSE_NEWLIB_REENTRANT                      1 | ||||
|  | ||||
| #define configSUPPORT_DYNAMIC_ALLOCATION                1 | ||||
| #define configSUPPORT_STATIC_ALLOCATION                 1 | ||||
|  | ||||
| #ifndef __ASSEMBLER__ | ||||
| #if CONFIG_FREERTOS_ENABLE_STATIC_TASK_CLEAN_UP | ||||
| extern void vPortCleanUpTCB ( void *pxTCB ); | ||||
| #define portCLEAN_UP_TCB( pxTCB )           vPortCleanUpTCB( pxTCB ) | ||||
| #endif | ||||
| #endif | ||||
|  | ||||
| /* Test FreeRTOS timers (with timer task) and more. */ | ||||
| /* Some files don't compile if this flag is disabled */ | ||||
| #define configUSE_TIMERS                                1 | ||||
| #define configTIMER_TASK_PRIORITY                       CONFIG_FREERTOS_TIMER_TASK_PRIORITY | ||||
| #define configTIMER_QUEUE_LENGTH                        CONFIG_FREERTOS_TIMER_QUEUE_LENGTH | ||||
| #define configTIMER_TASK_STACK_DEPTH                    CONFIG_FREERTOS_TIMER_TASK_STACK_DEPTH | ||||
|  | ||||
| #define INCLUDE_xTimerPendFunctionCall                  1 | ||||
| #define INCLUDE_eTaskGetState                           1 | ||||
| #define configUSE_QUEUE_SETS                            1 | ||||
|  | ||||
| #define configUSE_TICKLESS_IDLE                         CONFIG_FREERTOS_USE_TICKLESS_IDLE | ||||
| #if configUSE_TICKLESS_IDLE | ||||
| #define configEXPECTED_IDLE_TIME_BEFORE_SLEEP           CONFIG_FREERTOS_IDLE_TIME_BEFORE_SLEEP | ||||
| #endif //configUSE_TICKLESS_IDLE | ||||
|  | ||||
|  | ||||
| #if CONFIG_ESP_COREDUMP_ENABLE | ||||
| #define configENABLE_TASK_SNAPSHOT                      1 | ||||
| #endif | ||||
| #ifndef configENABLE_TASK_SNAPSHOT | ||||
| #define configENABLE_TASK_SNAPSHOT                      1 | ||||
| #endif | ||||
|  | ||||
| #if CONFIG_SYSVIEW_ENABLE | ||||
| #ifndef __ASSEMBLER__ | ||||
| #include "SEGGER_SYSVIEW_FreeRTOS.h" | ||||
| #undef INLINE // to avoid redefinition | ||||
| #endif /* def __ASSEMBLER__ */ | ||||
| #endif | ||||
|  | ||||
| #if CONFIG_FREERTOS_CHECK_MUTEX_GIVEN_BY_OWNER | ||||
| #define configCHECK_MUTEX_GIVEN_BY_OWNER                1 | ||||
| #else | ||||
| #define configCHECK_MUTEX_GIVEN_BY_OWNER                0 | ||||
| #endif | ||||
|  | ||||
| #endif /* FREERTOS_CONFIG_H */ | ||||
							
								
								
									
										418
									
								
								tools/sdk/esp32c3/include/freertos/include/freertos/atomic.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										418
									
								
								tools/sdk/esp32c3/include/freertos/include/freertos/atomic.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,418 @@ | ||||
| /* | ||||
|  * FreeRTOS Kernel V10.2.1 | ||||
|  * Copyright (C) 2019 Amazon.com, Inc. or its affiliates.  All Rights Reserved. | ||||
|  * | ||||
|  * Permission is hereby granted, free of charge, to any person obtaining a copy of | ||||
|  * this software and associated documentation files (the "Software"), to deal in | ||||
|  * the Software without restriction, including without limitation the rights to | ||||
|  * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of | ||||
|  * the Software, and to permit persons to whom the Software is furnished to do so, | ||||
|  * subject to the following conditions: | ||||
|  * | ||||
|  * The above copyright notice and this permission notice shall be included in all | ||||
|  * copies or substantial portions of the Software. | ||||
|  * | ||||
|  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
|  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS | ||||
|  * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR | ||||
|  * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER | ||||
|  * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN | ||||
|  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. | ||||
|  * | ||||
|  * http://www.FreeRTOS.org | ||||
|  * http://aws.amazon.com/freertos | ||||
|  * | ||||
|  * 1 tab == 4 spaces! | ||||
|  */ | ||||
|  | ||||
| /** | ||||
|  * @file atomic.h | ||||
|  * @brief FreeRTOS atomic operation support. | ||||
|  * | ||||
|  * This file implements atomic by disabling interrupts globally. | ||||
|  * Implementation with architecture specific atomic instructions | ||||
|  * are to be provided under each compiler directory. | ||||
|  */ | ||||
|  | ||||
| #ifndef ATOMIC_H | ||||
| #define ATOMIC_H | ||||
|  | ||||
| #ifndef INC_FREERTOS_H | ||||
|     #error "include FreeRTOS.h must appear in source files before include atomic.h" | ||||
| #endif | ||||
|  | ||||
| /* Standard includes. */ | ||||
| #include <stdint.h> | ||||
|  | ||||
| #ifdef __cplusplus | ||||
| extern "C" { | ||||
| #endif | ||||
|  | ||||
| /* Port specific definitions -- entering/exiting critical section. | ||||
|  * Refer template -- ./lib/FreeRTOS/portable/Compiler/Arch/portmacro.h | ||||
|  * | ||||
|  * Every call to ATOMIC_EXIT_CRITICAL() must be closely paired with | ||||
|  * ATOMIC_ENTER_CRITICAL(). | ||||
|  *  */ | ||||
| #if defined( portSET_INTERRUPT_MASK_FROM_ISR ) | ||||
|  | ||||
|     /* Nested interrupt scheme is supported in this port. */ | ||||
|     #define ATOMIC_ENTER_CRITICAL()     \ | ||||
|         UBaseType_t uxCriticalSectionType = portSET_INTERRUPT_MASK_FROM_ISR() | ||||
|  | ||||
|     #define ATOMIC_EXIT_CRITICAL()      \ | ||||
|         portCLEAR_INTERRUPT_MASK_FROM_ISR( uxCriticalSectionType ) | ||||
|  | ||||
| #else | ||||
|  | ||||
|     /* Nested interrupt scheme is NOT supported in this port. */ | ||||
|     #define ATOMIC_ENTER_CRITICAL()     portENTER_CRITICAL() | ||||
|     #define ATOMIC_EXIT_CRITICAL()      portEXIT_CRITICAL() | ||||
|  | ||||
| #endif /* portSET_INTERRUPT_MASK_FROM_ISR() */ | ||||
|  | ||||
| /* Port specific definition -- "always inline". | ||||
|  * Inline is compiler specific, and may not always get inlined depending on your optimization level. | ||||
|  * Also, inline is considerred as performance optimization for atomic. | ||||
|  * Thus, if portFORCE_INLINE is not provided by portmacro.h, instead of resulting error, | ||||
|  * simply define it. | ||||
|  */ | ||||
| #ifndef portFORCE_INLINE | ||||
|     #define portFORCE_INLINE | ||||
| #endif | ||||
|  | ||||
| #define ATOMIC_COMPARE_AND_SWAP_SUCCESS     0x1U        /**< Compare and swap succeeded, swapped. */ | ||||
| #define ATOMIC_COMPARE_AND_SWAP_FAILURE     0x0U        /**< Compare and swap failed, did not swap. */ | ||||
|  | ||||
| /*----------------------------- Swap && CAS ------------------------------*/ | ||||
|  | ||||
| /** | ||||
|  * Atomic compare-and-swap | ||||
|  * | ||||
|  * @brief Performs an atomic compare-and-swap operation on the specified values. | ||||
|  * | ||||
|  * @param[in, out] pDestination  Pointer to memory location from where value is | ||||
|  *                               to be loaded and checked. | ||||
|  * @param[in] ulExchange         If condition meets, write this value to memory. | ||||
|  * @param[in] ulComparand        Swap condition. | ||||
|  * | ||||
|  * @return Unsigned integer of value 1 or 0. 1 for swapped, 0 for not swapped. | ||||
|  * | ||||
|  * @note This function only swaps *pDestination with ulExchange, if previous | ||||
|  *       *pDestination value equals ulComparand. | ||||
|  */ | ||||
| static portFORCE_INLINE uint32_t Atomic_CompareAndSwap_u32( | ||||
|         uint32_t volatile * pDestination, | ||||
|         uint32_t ulExchange, | ||||
|         uint32_t ulComparand ) | ||||
| { | ||||
|  | ||||
|     uint32_t ulReturnValue = ATOMIC_COMPARE_AND_SWAP_FAILURE; | ||||
|  | ||||
|     ATOMIC_ENTER_CRITICAL(); | ||||
|  | ||||
|     if ( *pDestination == ulComparand ) | ||||
|     { | ||||
|         *pDestination = ulExchange; | ||||
|         ulReturnValue = ATOMIC_COMPARE_AND_SWAP_SUCCESS; | ||||
|     } | ||||
|  | ||||
|     ATOMIC_EXIT_CRITICAL(); | ||||
|  | ||||
|     return ulReturnValue; | ||||
|  | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * Atomic swap (pointers) | ||||
|  * | ||||
|  * @brief Atomically sets the address pointed to by *ppDestination to the value | ||||
|  *        of *pExchange. | ||||
|  * | ||||
|  * @param[in, out] ppDestination  Pointer to memory location from where a pointer | ||||
|  *                                value is to be loaded and written back to. | ||||
|  * @param[in] pExchange           Pointer value to be written to *ppDestination. | ||||
|  * | ||||
|  * @return The initial value of *ppDestination. | ||||
|  */ | ||||
| static portFORCE_INLINE void * Atomic_SwapPointers_p32( | ||||
|         void * volatile * ppDestination, | ||||
|         void * pExchange ) | ||||
| { | ||||
|     void * pReturnValue; | ||||
|  | ||||
|     ATOMIC_ENTER_CRITICAL(); | ||||
|  | ||||
|     pReturnValue = *ppDestination; | ||||
|  | ||||
|     *ppDestination = pExchange; | ||||
|  | ||||
|     ATOMIC_EXIT_CRITICAL(); | ||||
|  | ||||
|     return pReturnValue; | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * Atomic compare-and-swap (pointers) | ||||
|  * | ||||
|  * @brief Performs an atomic compare-and-swap operation on the specified pointer | ||||
|  *        values. | ||||
|  * | ||||
|  * @param[in, out] ppDestination  Pointer to memory location from where a pointer | ||||
|  *                                value is to be loaded and checked. | ||||
|  * @param[in] pExchange           If condition meets, write this value to memory. | ||||
|  * @param[in] pComparand          Swap condition. | ||||
|  * | ||||
|  * @return Unsigned integer of value 1 or 0. 1 for swapped, 0 for not swapped. | ||||
|  * | ||||
|  * @note This function only swaps *ppDestination with pExchange, if previous | ||||
|  *       *ppDestination value equals pComparand. | ||||
|  */ | ||||
| static portFORCE_INLINE uint32_t Atomic_CompareAndSwapPointers_p32( | ||||
|         void * volatile * ppDestination, | ||||
|         void * pExchange, void * pComparand ) | ||||
| { | ||||
|     uint32_t ulReturnValue = ATOMIC_COMPARE_AND_SWAP_FAILURE; | ||||
|  | ||||
|     ATOMIC_ENTER_CRITICAL(); | ||||
|  | ||||
|     if ( *ppDestination == pComparand ) | ||||
|     { | ||||
|         *ppDestination = pExchange; | ||||
|         ulReturnValue = ATOMIC_COMPARE_AND_SWAP_SUCCESS; | ||||
|     } | ||||
|  | ||||
|     ATOMIC_EXIT_CRITICAL(); | ||||
|  | ||||
|     return ulReturnValue; | ||||
| } | ||||
|  | ||||
|  | ||||
| /*----------------------------- Arithmetic ------------------------------*/ | ||||
|  | ||||
| /** | ||||
|  * Atomic add | ||||
|  * | ||||
|  * @brief Atomically adds count to the value of the specified pointer points to. | ||||
|  * | ||||
|  * @param[in,out] pAddend  Pointer to memory location from where value is to be | ||||
|  *                         loaded and written back to. | ||||
|  * @param[in] ulCount      Value to be added to *pAddend. | ||||
|  * | ||||
|  * @return previous *pAddend value. | ||||
|  */ | ||||
| static portFORCE_INLINE uint32_t Atomic_Add_u32( | ||||
|         uint32_t volatile * pAddend, | ||||
|         uint32_t ulCount ) | ||||
| { | ||||
|     uint32_t ulCurrent; | ||||
|  | ||||
|     ATOMIC_ENTER_CRITICAL(); | ||||
|  | ||||
|     ulCurrent = *pAddend; | ||||
|  | ||||
|     *pAddend += ulCount; | ||||
|  | ||||
|     ATOMIC_EXIT_CRITICAL(); | ||||
|  | ||||
|     return ulCurrent; | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * Atomic subtract | ||||
|  * | ||||
|  * @brief Atomically subtracts count from the value of the specified pointer | ||||
|  *        pointers to. | ||||
|  * | ||||
|  * @param[in,out] pAddend  Pointer to memory location from where value is to be | ||||
|  *                         loaded and written back to. | ||||
|  * @param[in] ulCount      Value to be subtract from *pAddend. | ||||
|  * | ||||
|  * @return previous *pAddend value. | ||||
|  */ | ||||
| static portFORCE_INLINE uint32_t Atomic_Subtract_u32( | ||||
|         uint32_t volatile * pAddend, | ||||
|         uint32_t ulCount ) | ||||
| { | ||||
|     uint32_t ulCurrent; | ||||
|  | ||||
|     ATOMIC_ENTER_CRITICAL(); | ||||
|  | ||||
|     ulCurrent = *pAddend; | ||||
|  | ||||
|     *pAddend -= ulCount; | ||||
|  | ||||
|     ATOMIC_EXIT_CRITICAL(); | ||||
|  | ||||
|     return ulCurrent; | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * Atomic increment | ||||
|  * | ||||
|  * @brief Atomically increments the value of the specified pointer points to. | ||||
|  * | ||||
|  * @param[in,out] pAddend  Pointer to memory location from where value is to be | ||||
|  *                         loaded and written back to. | ||||
|  * | ||||
|  * @return *pAddend value before increment. | ||||
|  */ | ||||
| static portFORCE_INLINE uint32_t Atomic_Increment_u32( uint32_t volatile * pAddend ) | ||||
| { | ||||
|     uint32_t ulCurrent; | ||||
|  | ||||
|     ATOMIC_ENTER_CRITICAL(); | ||||
|  | ||||
|     ulCurrent = *pAddend; | ||||
|  | ||||
|     *pAddend += 1; | ||||
|  | ||||
|     ATOMIC_EXIT_CRITICAL(); | ||||
|  | ||||
|     return ulCurrent; | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * Atomic decrement | ||||
|  * | ||||
|  * @brief Atomically decrements the value of the specified pointer points to | ||||
|  * | ||||
|  * @param[in,out] pAddend  Pointer to memory location from where value is to be | ||||
|  *                         loaded and written back to. | ||||
|  * | ||||
|  * @return *pAddend value before decrement. | ||||
|  */ | ||||
| static portFORCE_INLINE uint32_t Atomic_Decrement_u32( uint32_t volatile * pAddend ) | ||||
| { | ||||
|     uint32_t ulCurrent; | ||||
|  | ||||
|     ATOMIC_ENTER_CRITICAL(); | ||||
|  | ||||
|     ulCurrent = *pAddend; | ||||
|  | ||||
|     *pAddend -= 1; | ||||
|  | ||||
|     ATOMIC_EXIT_CRITICAL(); | ||||
|  | ||||
|     return ulCurrent; | ||||
| } | ||||
|  | ||||
| /*----------------------------- Bitwise Logical ------------------------------*/ | ||||
|  | ||||
| /** | ||||
|  * Atomic OR | ||||
|  * | ||||
|  * @brief Performs an atomic OR operation on the specified values. | ||||
|  * | ||||
|  * @param [in, out] pDestination  Pointer to memory location from where value is | ||||
|  *                                to be loaded and written back to. | ||||
|  * @param [in] ulValue            Value to be ORed with *pDestination. | ||||
|  * | ||||
|  * @return The original value of *pDestination. | ||||
|  */ | ||||
| static portFORCE_INLINE uint32_t Atomic_OR_u32( | ||||
|         uint32_t volatile * pDestination, | ||||
|         uint32_t ulValue ) | ||||
| { | ||||
|     uint32_t ulCurrent; | ||||
|  | ||||
|     ATOMIC_ENTER_CRITICAL(); | ||||
|  | ||||
|     ulCurrent = *pDestination; | ||||
|  | ||||
|     *pDestination |= ulValue; | ||||
|  | ||||
|     ATOMIC_EXIT_CRITICAL(); | ||||
|  | ||||
|     return ulCurrent; | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * Atomic AND | ||||
|  * | ||||
|  * @brief Performs an atomic AND operation on the specified values. | ||||
|  * | ||||
|  * @param [in, out] pDestination  Pointer to memory location from where value is | ||||
|  *                                to be loaded and written back to. | ||||
|  * @param [in] ulValue            Value to be ANDed with *pDestination. | ||||
|  * | ||||
|  * @return The original value of *pDestination. | ||||
|  */ | ||||
| static portFORCE_INLINE uint32_t Atomic_AND_u32( | ||||
|         uint32_t volatile * pDestination, | ||||
|         uint32_t ulValue ) | ||||
| { | ||||
|     uint32_t ulCurrent; | ||||
|  | ||||
|     ATOMIC_ENTER_CRITICAL(); | ||||
|  | ||||
|     ulCurrent = *pDestination; | ||||
|  | ||||
|     *pDestination &= ulValue; | ||||
|  | ||||
|     ATOMIC_EXIT_CRITICAL(); | ||||
|  | ||||
|     return ulCurrent; | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * Atomic NAND | ||||
|  * | ||||
|  * @brief Performs an atomic NAND operation on the specified values. | ||||
|  * | ||||
|  * @param [in, out] pDestination  Pointer to memory location from where value is | ||||
|  *                                to be loaded and written back to. | ||||
|  * @param [in] ulValue            Value to be NANDed with *pDestination. | ||||
|  * | ||||
|  * @return The original value of *pDestination. | ||||
|  */ | ||||
| static portFORCE_INLINE uint32_t Atomic_NAND_u32( | ||||
|         uint32_t volatile * pDestination, | ||||
|         uint32_t ulValue ) | ||||
| { | ||||
|     uint32_t ulCurrent; | ||||
|  | ||||
|     ATOMIC_ENTER_CRITICAL(); | ||||
|  | ||||
|     ulCurrent = *pDestination; | ||||
|  | ||||
|     *pDestination = ~(ulCurrent & ulValue); | ||||
|  | ||||
|     ATOMIC_EXIT_CRITICAL(); | ||||
|  | ||||
|     return ulCurrent; | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * Atomic XOR | ||||
|  * | ||||
|  * @brief Performs an atomic XOR operation on the specified values. | ||||
|  * | ||||
|  * @param [in, out] pDestination  Pointer to memory location from where value is | ||||
|  *                                to be loaded and written back to. | ||||
|  * @param [in] ulValue            Value to be XORed with *pDestination. | ||||
|  * | ||||
|  * @return The original value of *pDestination. | ||||
|  */ | ||||
| static portFORCE_INLINE uint32_t Atomic_XOR_u32( | ||||
|         uint32_t volatile * pDestination, | ||||
|         uint32_t ulValue ) | ||||
| { | ||||
|     uint32_t ulCurrent; | ||||
|  | ||||
|     ATOMIC_ENTER_CRITICAL(); | ||||
|  | ||||
|     ulCurrent = *pDestination; | ||||
|  | ||||
|     *pDestination ^= ulValue; | ||||
|  | ||||
|     ATOMIC_EXIT_CRITICAL(); | ||||
|  | ||||
|     return ulCurrent; | ||||
| } | ||||
|  | ||||
| #ifdef __cplusplus | ||||
| } | ||||
| #endif | ||||
|  | ||||
| #endif /* ATOMIC_H */ | ||||
							
								
								
									
										720
									
								
								tools/sdk/esp32c3/include/freertos/include/freertos/croutine.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										720
									
								
								tools/sdk/esp32c3/include/freertos/include/freertos/croutine.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,720 @@ | ||||
| /* | ||||
|  * FreeRTOS Kernel V10.2.1 | ||||
|  * Copyright (C) 2019 Amazon.com, Inc. or its affiliates.  All Rights Reserved. | ||||
|  * | ||||
|  * Permission is hereby granted, free of charge, to any person obtaining a copy of | ||||
|  * this software and associated documentation files (the "Software"), to deal in | ||||
|  * the Software without restriction, including without limitation the rights to | ||||
|  * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of | ||||
|  * the Software, and to permit persons to whom the Software is furnished to do so, | ||||
|  * subject to the following conditions: | ||||
|  * | ||||
|  * The above copyright notice and this permission notice shall be included in all | ||||
|  * copies or substantial portions of the Software. | ||||
|  * | ||||
|  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
|  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS | ||||
|  * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR | ||||
|  * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER | ||||
|  * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN | ||||
|  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. | ||||
|  * | ||||
|  * http://www.FreeRTOS.org | ||||
|  * http://aws.amazon.com/freertos | ||||
|  * | ||||
|  * 1 tab == 4 spaces! | ||||
|  */ | ||||
|  | ||||
| #ifndef CO_ROUTINE_H | ||||
| #define CO_ROUTINE_H | ||||
|  | ||||
| #ifndef INC_FREERTOS_H | ||||
| 	#error "include FreeRTOS.h must appear in source files before include croutine.h" | ||||
| #endif | ||||
|  | ||||
| #include "list.h" | ||||
|  | ||||
| #ifdef __cplusplus | ||||
| extern "C" { | ||||
| #endif | ||||
|  | ||||
| /* Used to hide the implementation of the co-routine control block.  The | ||||
| control block structure however has to be included in the header due to | ||||
| the macro implementation of the co-routine functionality. */ | ||||
| typedef void * CoRoutineHandle_t; | ||||
|  | ||||
| /* Defines the prototype to which co-routine functions must conform. */ | ||||
| typedef void (*crCOROUTINE_CODE)( CoRoutineHandle_t, UBaseType_t ); | ||||
|  | ||||
| typedef struct corCoRoutineControlBlock | ||||
| { | ||||
| 	crCOROUTINE_CODE 	pxCoRoutineFunction; | ||||
| 	ListItem_t			xGenericListItem;	/*< List item used to place the CRCB in ready and blocked queues. */ | ||||
| 	ListItem_t			xEventListItem;		/*< List item used to place the CRCB in event lists. */ | ||||
| 	UBaseType_t 		uxPriority;			/*< The priority of the co-routine in relation to other co-routines. */ | ||||
| 	UBaseType_t 		uxIndex;			/*< Used to distinguish between co-routines when multiple co-routines use the same co-routine function. */ | ||||
| 	uint16_t 			uxState;			/*< Used internally by the co-routine implementation. */ | ||||
| } CRCB_t; /* Co-routine control block.  Note must be identical in size down to uxPriority with TCB_t. */ | ||||
|  | ||||
| /** | ||||
|  * croutine. h | ||||
|  *<pre> | ||||
|  BaseType_t xCoRoutineCreate( | ||||
|                                  crCOROUTINE_CODE pxCoRoutineCode, | ||||
|                                  UBaseType_t uxPriority, | ||||
|                                  UBaseType_t uxIndex | ||||
|                                );</pre> | ||||
|  * | ||||
|  * Create a new co-routine and add it to the list of co-routines that are | ||||
|  * ready to run. | ||||
|  * | ||||
|  * @param pxCoRoutineCode Pointer to the co-routine function.  Co-routine | ||||
|  * functions require special syntax - see the co-routine section of the WEB | ||||
|  * documentation for more information. | ||||
|  * | ||||
|  * @param uxPriority The priority with respect to other co-routines at which | ||||
|  *  the co-routine will run. | ||||
|  * | ||||
|  * @param uxIndex Used to distinguish between different co-routines that | ||||
|  * execute the same function.  See the example below and the co-routine section | ||||
|  * of the WEB documentation for further information. | ||||
|  * | ||||
|  * @return pdPASS if the co-routine was successfully created and added to a ready | ||||
|  * list, otherwise an error code defined with ProjDefs.h. | ||||
|  * | ||||
|  * Example usage: | ||||
|    <pre> | ||||
|  // Co-routine to be created. | ||||
|  void vFlashCoRoutine( CoRoutineHandle_t xHandle, UBaseType_t uxIndex ) | ||||
|  { | ||||
|  // Variables in co-routines must be declared static if they must maintain value across a blocking call. | ||||
|  // This may not be necessary for const variables. | ||||
|  static const char cLedToFlash[ 2 ] = { 5, 6 }; | ||||
|  static const TickType_t uxFlashRates[ 2 ] = { 200, 400 }; | ||||
|  | ||||
|      // Must start every co-routine with a call to crSTART(); | ||||
|      crSTART( xHandle ); | ||||
|  | ||||
|      for( ;; ) | ||||
|      { | ||||
|          // This co-routine just delays for a fixed period, then toggles | ||||
|          // an LED.  Two co-routines are created using this function, so | ||||
|          // the uxIndex parameter is used to tell the co-routine which | ||||
|          // LED to flash and how int32_t to delay.  This assumes xQueue has | ||||
|          // already been created. | ||||
|          vParTestToggleLED( cLedToFlash[ uxIndex ] ); | ||||
|          crDELAY( xHandle, uxFlashRates[ uxIndex ] ); | ||||
|      } | ||||
|  | ||||
|      // Must end every co-routine with a call to crEND(); | ||||
|      crEND(); | ||||
|  } | ||||
|  | ||||
|  // Function that creates two co-routines. | ||||
|  void vOtherFunction( void ) | ||||
|  { | ||||
|  uint8_t ucParameterToPass; | ||||
|  TaskHandle_t xHandle; | ||||
|  | ||||
|      // Create two co-routines at priority 0.  The first is given index 0 | ||||
|      // so (from the code above) toggles LED 5 every 200 ticks.  The second | ||||
|      // is given index 1 so toggles LED 6 every 400 ticks. | ||||
|      for( uxIndex = 0; uxIndex < 2; uxIndex++ ) | ||||
|      { | ||||
|          xCoRoutineCreate( vFlashCoRoutine, 0, uxIndex ); | ||||
|      } | ||||
|  } | ||||
|    </pre> | ||||
|  * \defgroup xCoRoutineCreate xCoRoutineCreate | ||||
|  * \ingroup Tasks | ||||
|  */ | ||||
| BaseType_t xCoRoutineCreate( crCOROUTINE_CODE pxCoRoutineCode, UBaseType_t uxPriority, UBaseType_t uxIndex ); | ||||
|  | ||||
|  | ||||
| /** | ||||
|  * croutine. h | ||||
|  *<pre> | ||||
|  void vCoRoutineSchedule( void );</pre> | ||||
|  * | ||||
|  * Run a co-routine. | ||||
|  * | ||||
|  * vCoRoutineSchedule() executes the highest priority co-routine that is able | ||||
|  * to run.  The co-routine will execute until it either blocks, yields or is | ||||
|  * preempted by a task.  Co-routines execute cooperatively so one | ||||
|  * co-routine cannot be preempted by another, but can be preempted by a task. | ||||
|  * | ||||
|  * If an application comprises of both tasks and co-routines then | ||||
|  * vCoRoutineSchedule should be called from the idle task (in an idle task | ||||
|  * hook). | ||||
|  * | ||||
|  * Example usage: | ||||
|    <pre> | ||||
|  // This idle task hook will schedule a co-routine each time it is called. | ||||
|  // The rest of the idle task will execute between co-routine calls. | ||||
|  void vApplicationIdleHook( void ) | ||||
|  { | ||||
| 	vCoRoutineSchedule(); | ||||
|  } | ||||
|  | ||||
|  // Alternatively, if you do not require any other part of the idle task to | ||||
|  // execute, the idle task hook can call vCoRoutineScheduler() within an | ||||
|  // infinite loop. | ||||
|  void vApplicationIdleHook( void ) | ||||
|  { | ||||
|     for( ;; ) | ||||
|     { | ||||
|         vCoRoutineSchedule(); | ||||
|     } | ||||
|  } | ||||
|  </pre> | ||||
|  * \defgroup vCoRoutineSchedule vCoRoutineSchedule | ||||
|  * \ingroup Tasks | ||||
|  */ | ||||
| void vCoRoutineSchedule( void ); | ||||
|  | ||||
| /** | ||||
|  * croutine. h | ||||
|  * <pre> | ||||
|  crSTART( CoRoutineHandle_t xHandle );</pre> | ||||
|  * | ||||
|  * This macro MUST always be called at the start of a co-routine function. | ||||
|  * | ||||
|  * Example usage: | ||||
|    <pre> | ||||
|  // Co-routine to be created. | ||||
|  void vACoRoutine( CoRoutineHandle_t xHandle, UBaseType_t uxIndex ) | ||||
|  { | ||||
|  // Variables in co-routines must be declared static if they must maintain value across a blocking call. | ||||
|  static int32_t ulAVariable; | ||||
|  | ||||
|      // Must start every co-routine with a call to crSTART(); | ||||
|      crSTART( xHandle ); | ||||
|  | ||||
|      for( ;; ) | ||||
|      { | ||||
|           // Co-routine functionality goes here. | ||||
|      } | ||||
|  | ||||
|      // Must end every co-routine with a call to crEND(); | ||||
|      crEND(); | ||||
|  }</pre> | ||||
|  * \defgroup crSTART crSTART | ||||
|  * \ingroup Tasks | ||||
|  */ | ||||
| #define crSTART( pxCRCB ) switch( ( ( CRCB_t * )( pxCRCB ) )->uxState ) { case 0: | ||||
|  | ||||
| /** | ||||
|  * croutine. h | ||||
|  * <pre> | ||||
|  crEND();</pre> | ||||
|  * | ||||
|  * This macro MUST always be called at the end of a co-routine function. | ||||
|  * | ||||
|  * Example usage: | ||||
|    <pre> | ||||
|  // Co-routine to be created. | ||||
|  void vACoRoutine( CoRoutineHandle_t xHandle, UBaseType_t uxIndex ) | ||||
|  { | ||||
|  // Variables in co-routines must be declared static if they must maintain value across a blocking call. | ||||
|  static int32_t ulAVariable; | ||||
|  | ||||
|      // Must start every co-routine with a call to crSTART(); | ||||
|      crSTART( xHandle ); | ||||
|  | ||||
|      for( ;; ) | ||||
|      { | ||||
|           // Co-routine functionality goes here. | ||||
|      } | ||||
|  | ||||
|      // Must end every co-routine with a call to crEND(); | ||||
|      crEND(); | ||||
|  }</pre> | ||||
|  * \defgroup crSTART crSTART | ||||
|  * \ingroup Tasks | ||||
|  */ | ||||
| #define crEND() } | ||||
|  | ||||
| /* | ||||
|  * These macros are intended for internal use by the co-routine implementation | ||||
|  * only.  The macros should not be used directly by application writers. | ||||
|  */ | ||||
| #define crSET_STATE0( xHandle ) ( ( CRCB_t * )( xHandle ) )->uxState = (__LINE__ * 2); return; case (__LINE__ * 2): | ||||
| #define crSET_STATE1( xHandle ) ( ( CRCB_t * )( xHandle ) )->uxState = ((__LINE__ * 2)+1); return; case ((__LINE__ * 2)+1): | ||||
|  | ||||
| /** | ||||
|  * croutine. h | ||||
|  *<pre> | ||||
|  crDELAY( CoRoutineHandle_t xHandle, TickType_t xTicksToDelay );</pre> | ||||
|  * | ||||
|  * Delay a co-routine for a fixed period of time. | ||||
|  * | ||||
|  * crDELAY can only be called from the co-routine function itself - not | ||||
|  * from within a function called by the co-routine function.  This is because | ||||
|  * co-routines do not maintain their own stack. | ||||
|  * | ||||
|  * @param xHandle The handle of the co-routine to delay.  This is the xHandle | ||||
|  * parameter of the co-routine function. | ||||
|  * | ||||
|  * @param xTickToDelay The number of ticks that the co-routine should delay | ||||
|  * for.  The actual amount of time this equates to is defined by | ||||
|  * configTICK_RATE_HZ (set in FreeRTOSConfig.h).  The constant portTICK_PERIOD_MS | ||||
|  * can be used to convert ticks to milliseconds. | ||||
|  * | ||||
|  * Example usage: | ||||
|    <pre> | ||||
|  // Co-routine to be created. | ||||
|  void vACoRoutine( CoRoutineHandle_t xHandle, UBaseType_t uxIndex ) | ||||
|  { | ||||
|  // Variables in co-routines must be declared static if they must maintain value across a blocking call. | ||||
|  // This may not be necessary for const variables. | ||||
|  // We are to delay for 200ms. | ||||
|  static const xTickType xDelayTime = 200 / portTICK_PERIOD_MS; | ||||
|  | ||||
|      // Must start every co-routine with a call to crSTART(); | ||||
|      crSTART( xHandle ); | ||||
|  | ||||
|      for( ;; ) | ||||
|      { | ||||
|         // Delay for 200ms. | ||||
|         crDELAY( xHandle, xDelayTime ); | ||||
|  | ||||
|         // Do something here. | ||||
|      } | ||||
|  | ||||
|      // Must end every co-routine with a call to crEND(); | ||||
|      crEND(); | ||||
|  }</pre> | ||||
|  * \defgroup crDELAY crDELAY | ||||
|  * \ingroup Tasks | ||||
|  */ | ||||
| #define crDELAY( xHandle, xTicksToDelay )												\ | ||||
| 	if( ( xTicksToDelay ) > 0 )															\ | ||||
| 	{																					\ | ||||
| 		vCoRoutineAddToDelayedList( ( xTicksToDelay ), NULL );							\ | ||||
| 	}																					\ | ||||
| 	crSET_STATE0( ( xHandle ) ); | ||||
|  | ||||
| /** | ||||
|  * <pre> | ||||
|  crQUEUE_SEND( | ||||
|                   CoRoutineHandle_t xHandle, | ||||
|                   QueueHandle_t pxQueue, | ||||
|                   void *pvItemToQueue, | ||||
|                   TickType_t xTicksToWait, | ||||
|                   BaseType_t *pxResult | ||||
|              )</pre> | ||||
|  * | ||||
|  * The macro's crQUEUE_SEND() and crQUEUE_RECEIVE() are the co-routine | ||||
|  * equivalent to the xQueueSend() and xQueueReceive() functions used by tasks. | ||||
|  * | ||||
|  * crQUEUE_SEND and crQUEUE_RECEIVE can only be used from a co-routine whereas | ||||
|  * xQueueSend() and xQueueReceive() can only be used from tasks. | ||||
|  * | ||||
|  * crQUEUE_SEND can only be called from the co-routine function itself - not | ||||
|  * from within a function called by the co-routine function.  This is because | ||||
|  * co-routines do not maintain their own stack. | ||||
|  * | ||||
|  * See the co-routine section of the WEB documentation for information on | ||||
|  * passing data between tasks and co-routines and between ISR's and | ||||
|  * co-routines. | ||||
|  * | ||||
|  * @param xHandle The handle of the calling co-routine.  This is the xHandle | ||||
|  * parameter of the co-routine function. | ||||
|  * | ||||
|  * @param pxQueue The handle of the queue on which the data will be posted. | ||||
|  * The handle is obtained as the return value when the queue is created using | ||||
|  * the xQueueCreate() API function. | ||||
|  * | ||||
|  * @param pvItemToQueue A pointer to the data being posted onto the queue. | ||||
|  * The number of bytes of each queued item is specified when the queue is | ||||
|  * created.  This number of bytes is copied from pvItemToQueue into the queue | ||||
|  * itself. | ||||
|  * | ||||
|  * @param xTickToDelay The number of ticks that the co-routine should block | ||||
|  * to wait for space to become available on the queue, should space not be | ||||
|  * available immediately. The actual amount of time this equates to is defined | ||||
|  * by configTICK_RATE_HZ (set in FreeRTOSConfig.h).  The constant | ||||
|  * portTICK_PERIOD_MS can be used to convert ticks to milliseconds (see example | ||||
|  * below). | ||||
|  * | ||||
|  * @param pxResult The variable pointed to by pxResult will be set to pdPASS if | ||||
|  * data was successfully posted onto the queue, otherwise it will be set to an | ||||
|  * error defined within ProjDefs.h. | ||||
|  * | ||||
|  * Example usage: | ||||
|    <pre> | ||||
|  // Co-routine function that blocks for a fixed period then posts a number onto | ||||
|  // a queue. | ||||
|  static void prvCoRoutineFlashTask( CoRoutineHandle_t xHandle, UBaseType_t uxIndex ) | ||||
|  { | ||||
|  // Variables in co-routines must be declared static if they must maintain value across a blocking call. | ||||
|  static BaseType_t xNumberToPost = 0; | ||||
|  static BaseType_t xResult; | ||||
|  | ||||
|     // Co-routines must begin with a call to crSTART(). | ||||
|     crSTART( xHandle ); | ||||
|  | ||||
|     for( ;; ) | ||||
|     { | ||||
|         // This assumes the queue has already been created. | ||||
|         crQUEUE_SEND( xHandle, xCoRoutineQueue, &xNumberToPost, NO_DELAY, &xResult ); | ||||
|  | ||||
|         if( xResult != pdPASS ) | ||||
|         { | ||||
|             // The message was not posted! | ||||
|         } | ||||
|  | ||||
|         // Increment the number to be posted onto the queue. | ||||
|         xNumberToPost++; | ||||
|  | ||||
|         // Delay for 100 ticks. | ||||
|         crDELAY( xHandle, 100 ); | ||||
|     } | ||||
|  | ||||
|     // Co-routines must end with a call to crEND(). | ||||
|     crEND(); | ||||
|  }</pre> | ||||
|  * \defgroup crQUEUE_SEND crQUEUE_SEND | ||||
|  * \ingroup Tasks | ||||
|  */ | ||||
| #define crQUEUE_SEND( xHandle, pxQueue, pvItemToQueue, xTicksToWait, pxResult )			\ | ||||
| {																						\ | ||||
| 	*( pxResult ) = xQueueCRSend( ( pxQueue) , ( pvItemToQueue) , ( xTicksToWait ) );	\ | ||||
| 	if( *( pxResult ) == errQUEUE_BLOCKED )												\ | ||||
| 	{																					\ | ||||
| 		crSET_STATE0( ( xHandle ) );													\ | ||||
| 		*pxResult = xQueueCRSend( ( pxQueue ), ( pvItemToQueue ), 0 );					\ | ||||
| 	}																					\ | ||||
| 	if( *pxResult == errQUEUE_YIELD )													\ | ||||
| 	{																					\ | ||||
| 		crSET_STATE1( ( xHandle ) );													\ | ||||
| 		*pxResult = pdPASS;																\ | ||||
| 	}																					\ | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * croutine. h | ||||
|  * <pre> | ||||
|   crQUEUE_RECEIVE( | ||||
|                      CoRoutineHandle_t xHandle, | ||||
|                      QueueHandle_t pxQueue, | ||||
|                      void *pvBuffer, | ||||
|                      TickType_t xTicksToWait, | ||||
|                      BaseType_t *pxResult | ||||
|                  )</pre> | ||||
|  * | ||||
|  * The macro's crQUEUE_SEND() and crQUEUE_RECEIVE() are the co-routine | ||||
|  * equivalent to the xQueueSend() and xQueueReceive() functions used by tasks. | ||||
|  * | ||||
|  * crQUEUE_SEND and crQUEUE_RECEIVE can only be used from a co-routine whereas | ||||
|  * xQueueSend() and xQueueReceive() can only be used from tasks. | ||||
|  * | ||||
|  * crQUEUE_RECEIVE can only be called from the co-routine function itself - not | ||||
|  * from within a function called by the co-routine function.  This is because | ||||
|  * co-routines do not maintain their own stack. | ||||
|  * | ||||
|  * See the co-routine section of the WEB documentation for information on | ||||
|  * passing data between tasks and co-routines and between ISR's and | ||||
|  * co-routines. | ||||
|  * | ||||
|  * @param xHandle The handle of the calling co-routine.  This is the xHandle | ||||
|  * parameter of the co-routine function. | ||||
|  * | ||||
|  * @param pxQueue The handle of the queue from which the data will be received. | ||||
|  * The handle is obtained as the return value when the queue is created using | ||||
|  * the xQueueCreate() API function. | ||||
|  * | ||||
|  * @param pvBuffer The buffer into which the received item is to be copied. | ||||
|  * The number of bytes of each queued item is specified when the queue is | ||||
|  * created.  This number of bytes is copied into pvBuffer. | ||||
|  * | ||||
|  * @param xTickToDelay The number of ticks that the co-routine should block | ||||
|  * to wait for data to become available from the queue, should data not be | ||||
|  * available immediately. The actual amount of time this equates to is defined | ||||
|  * by configTICK_RATE_HZ (set in FreeRTOSConfig.h).  The constant | ||||
|  * portTICK_PERIOD_MS can be used to convert ticks to milliseconds (see the | ||||
|  * crQUEUE_SEND example). | ||||
|  * | ||||
|  * @param pxResult The variable pointed to by pxResult will be set to pdPASS if | ||||
|  * data was successfully retrieved from the queue, otherwise it will be set to | ||||
|  * an error code as defined within ProjDefs.h. | ||||
|  * | ||||
|  * Example usage: | ||||
|  <pre> | ||||
|  // A co-routine receives the number of an LED to flash from a queue.  It | ||||
|  // blocks on the queue until the number is received. | ||||
|  static void prvCoRoutineFlashWorkTask( CoRoutineHandle_t xHandle, UBaseType_t uxIndex ) | ||||
|  { | ||||
|  // Variables in co-routines must be declared static if they must maintain value across a blocking call. | ||||
|  static BaseType_t xResult; | ||||
|  static UBaseType_t uxLEDToFlash; | ||||
|  | ||||
|     // All co-routines must start with a call to crSTART(). | ||||
|     crSTART( xHandle ); | ||||
|  | ||||
|     for( ;; ) | ||||
|     { | ||||
|         // Wait for data to become available on the queue. | ||||
|         crQUEUE_RECEIVE( xHandle, xCoRoutineQueue, &uxLEDToFlash, portMAX_DELAY, &xResult ); | ||||
|  | ||||
|         if( xResult == pdPASS ) | ||||
|         { | ||||
|             // We received the LED to flash - flash it! | ||||
|             vParTestToggleLED( uxLEDToFlash ); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     crEND(); | ||||
|  }</pre> | ||||
|  * \defgroup crQUEUE_RECEIVE crQUEUE_RECEIVE | ||||
|  * \ingroup Tasks | ||||
|  */ | ||||
| #define crQUEUE_RECEIVE( xHandle, pxQueue, pvBuffer, xTicksToWait, pxResult )			\ | ||||
| {																						\ | ||||
| 	*( pxResult ) = xQueueCRReceive( ( pxQueue) , ( pvBuffer ), ( xTicksToWait ) );		\ | ||||
| 	if( *( pxResult ) == errQUEUE_BLOCKED ) 											\ | ||||
| 	{																					\ | ||||
| 		crSET_STATE0( ( xHandle ) );													\ | ||||
| 		*( pxResult ) = xQueueCRReceive( ( pxQueue) , ( pvBuffer ), 0 );				\ | ||||
| 	}																					\ | ||||
| 	if( *( pxResult ) == errQUEUE_YIELD )												\ | ||||
| 	{																					\ | ||||
| 		crSET_STATE1( ( xHandle ) );													\ | ||||
| 		*( pxResult ) = pdPASS;															\ | ||||
| 	}																					\ | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * croutine. h | ||||
|  * <pre> | ||||
|   crQUEUE_SEND_FROM_ISR( | ||||
|                             QueueHandle_t pxQueue, | ||||
|                             void *pvItemToQueue, | ||||
|                             BaseType_t xCoRoutinePreviouslyWoken | ||||
|                        )</pre> | ||||
|  * | ||||
|  * The macro's crQUEUE_SEND_FROM_ISR() and crQUEUE_RECEIVE_FROM_ISR() are the | ||||
|  * co-routine equivalent to the xQueueSendFromISR() and xQueueReceiveFromISR() | ||||
|  * functions used by tasks. | ||||
|  * | ||||
|  * crQUEUE_SEND_FROM_ISR() and crQUEUE_RECEIVE_FROM_ISR() can only be used to | ||||
|  * pass data between a co-routine and and ISR, whereas xQueueSendFromISR() and | ||||
|  * xQueueReceiveFromISR() can only be used to pass data between a task and and | ||||
|  * ISR. | ||||
|  * | ||||
|  * crQUEUE_SEND_FROM_ISR can only be called from an ISR to send data to a queue | ||||
|  * that is being used from within a co-routine. | ||||
|  * | ||||
|  * See the co-routine section of the WEB documentation for information on | ||||
|  * passing data between tasks and co-routines and between ISR's and | ||||
|  * co-routines. | ||||
|  * | ||||
|  * @param xQueue The handle to the queue on which the item is to be posted. | ||||
|  * | ||||
|  * @param pvItemToQueue A pointer to the item that is to be placed on the | ||||
|  * queue.  The size of the items the queue will hold was defined when the | ||||
|  * queue was created, so this many bytes will be copied from pvItemToQueue | ||||
|  * into the queue storage area. | ||||
|  * | ||||
|  * @param xCoRoutinePreviouslyWoken This is included so an ISR can post onto | ||||
|  * the same queue multiple times from a single interrupt.  The first call | ||||
|  * should always pass in pdFALSE.  Subsequent calls should pass in | ||||
|  * the value returned from the previous call. | ||||
|  * | ||||
|  * @return pdTRUE if a co-routine was woken by posting onto the queue.  This is | ||||
|  * used by the ISR to determine if a context switch may be required following | ||||
|  * the ISR. | ||||
|  * | ||||
|  * Example usage: | ||||
|  <pre> | ||||
|  // A co-routine that blocks on a queue waiting for characters to be received. | ||||
|  static void vReceivingCoRoutine( CoRoutineHandle_t xHandle, UBaseType_t uxIndex ) | ||||
|  { | ||||
|  char cRxedChar; | ||||
|  BaseType_t xResult; | ||||
|  | ||||
|      // All co-routines must start with a call to crSTART(). | ||||
|      crSTART( xHandle ); | ||||
|  | ||||
|      for( ;; ) | ||||
|      { | ||||
|          // Wait for data to become available on the queue.  This assumes the | ||||
|          // queue xCommsRxQueue has already been created! | ||||
|          crQUEUE_RECEIVE( xHandle, xCommsRxQueue, &uxLEDToFlash, portMAX_DELAY, &xResult ); | ||||
|  | ||||
|          // Was a character received? | ||||
|          if( xResult == pdPASS ) | ||||
|          { | ||||
|              // Process the character here. | ||||
|          } | ||||
|      } | ||||
|  | ||||
|      // All co-routines must end with a call to crEND(). | ||||
|      crEND(); | ||||
|  } | ||||
|  | ||||
|  // An ISR that uses a queue to send characters received on a serial port to | ||||
|  // a co-routine. | ||||
|  void vUART_ISR( void ) | ||||
|  { | ||||
|  char cRxedChar; | ||||
|  BaseType_t xCRWokenByPost = pdFALSE; | ||||
|  | ||||
|      // We loop around reading characters until there are none left in the UART. | ||||
|      while( UART_RX_REG_NOT_EMPTY() ) | ||||
|      { | ||||
|          // Obtain the character from the UART. | ||||
|          cRxedChar = UART_RX_REG; | ||||
|  | ||||
|          // Post the character onto a queue.  xCRWokenByPost will be pdFALSE | ||||
|          // the first time around the loop.  If the post causes a co-routine | ||||
|          // to be woken (unblocked) then xCRWokenByPost will be set to pdTRUE. | ||||
|          // In this manner we can ensure that if more than one co-routine is | ||||
|          // blocked on the queue only one is woken by this ISR no matter how | ||||
|          // many characters are posted to the queue. | ||||
|          xCRWokenByPost = crQUEUE_SEND_FROM_ISR( xCommsRxQueue, &cRxedChar, xCRWokenByPost ); | ||||
|      } | ||||
|  }</pre> | ||||
|  * \defgroup crQUEUE_SEND_FROM_ISR crQUEUE_SEND_FROM_ISR | ||||
|  * \ingroup Tasks | ||||
|  */ | ||||
| #define crQUEUE_SEND_FROM_ISR( pxQueue, pvItemToQueue, xCoRoutinePreviouslyWoken ) xQueueCRSendFromISR( ( pxQueue ), ( pvItemToQueue ), ( xCoRoutinePreviouslyWoken ) ) | ||||
|  | ||||
|  | ||||
| /** | ||||
|  * croutine. h | ||||
|  * <pre> | ||||
|   crQUEUE_SEND_FROM_ISR( | ||||
|                             QueueHandle_t pxQueue, | ||||
|                             void *pvBuffer, | ||||
|                             BaseType_t * pxCoRoutineWoken | ||||
|                        )</pre> | ||||
|  * | ||||
|  * The macro's crQUEUE_SEND_FROM_ISR() and crQUEUE_RECEIVE_FROM_ISR() are the | ||||
|  * co-routine equivalent to the xQueueSendFromISR() and xQueueReceiveFromISR() | ||||
|  * functions used by tasks. | ||||
|  * | ||||
|  * crQUEUE_SEND_FROM_ISR() and crQUEUE_RECEIVE_FROM_ISR() can only be used to | ||||
|  * pass data between a co-routine and and ISR, whereas xQueueSendFromISR() and | ||||
|  * xQueueReceiveFromISR() can only be used to pass data between a task and and | ||||
|  * ISR. | ||||
|  * | ||||
|  * crQUEUE_RECEIVE_FROM_ISR can only be called from an ISR to receive data | ||||
|  * from a queue that is being used from within a co-routine (a co-routine | ||||
|  * posted to the queue). | ||||
|  * | ||||
|  * See the co-routine section of the WEB documentation for information on | ||||
|  * passing data between tasks and co-routines and between ISR's and | ||||
|  * co-routines. | ||||
|  * | ||||
|  * @param xQueue The handle to the queue on which the item is to be posted. | ||||
|  * | ||||
|  * @param pvBuffer A pointer to a buffer into which the received item will be | ||||
|  * placed.  The size of the items the queue will hold was defined when the | ||||
|  * queue was created, so this many bytes will be copied from the queue into | ||||
|  * pvBuffer. | ||||
|  * | ||||
|  * @param pxCoRoutineWoken A co-routine may be blocked waiting for space to become | ||||
|  * available on the queue.  If crQUEUE_RECEIVE_FROM_ISR causes such a | ||||
|  * co-routine to unblock *pxCoRoutineWoken will get set to pdTRUE, otherwise | ||||
|  * *pxCoRoutineWoken will remain unchanged. | ||||
|  * | ||||
|  * @return pdTRUE an item was successfully received from the queue, otherwise | ||||
|  * pdFALSE. | ||||
|  * | ||||
|  * Example usage: | ||||
|  <pre> | ||||
|  // A co-routine that posts a character to a queue then blocks for a fixed | ||||
|  // period.  The character is incremented each time. | ||||
|  static void vSendingCoRoutine( CoRoutineHandle_t xHandle, UBaseType_t uxIndex ) | ||||
|  { | ||||
|  // cChar holds its value while this co-routine is blocked and must therefore | ||||
|  // be declared static. | ||||
|  static char cCharToTx = 'a'; | ||||
|  BaseType_t xResult; | ||||
|  | ||||
|      // All co-routines must start with a call to crSTART(). | ||||
|      crSTART( xHandle ); | ||||
|  | ||||
|      for( ;; ) | ||||
|      { | ||||
|          // Send the next character to the queue. | ||||
|          crQUEUE_SEND( xHandle, xCoRoutineQueue, &cCharToTx, NO_DELAY, &xResult ); | ||||
|  | ||||
|          if( xResult == pdPASS ) | ||||
|          { | ||||
|              // The character was successfully posted to the queue. | ||||
|          } | ||||
| 		 else | ||||
| 		 { | ||||
| 			// Could not post the character to the queue. | ||||
| 		 } | ||||
|  | ||||
|          // Enable the UART Tx interrupt to cause an interrupt in this | ||||
| 		 // hypothetical UART.  The interrupt will obtain the character | ||||
| 		 // from the queue and send it. | ||||
| 		 ENABLE_RX_INTERRUPT(); | ||||
|  | ||||
| 		 // Increment to the next character then block for a fixed period. | ||||
| 		 // cCharToTx will maintain its value across the delay as it is | ||||
| 		 // declared static. | ||||
| 		 cCharToTx++; | ||||
| 		 if( cCharToTx > 'x' ) | ||||
| 		 { | ||||
| 			cCharToTx = 'a'; | ||||
| 		 } | ||||
| 		 crDELAY( 100 ); | ||||
|      } | ||||
|  | ||||
|      // All co-routines must end with a call to crEND(). | ||||
|      crEND(); | ||||
|  } | ||||
|  | ||||
|  // An ISR that uses a queue to receive characters to send on a UART. | ||||
|  void vUART_ISR( void ) | ||||
|  { | ||||
|  char cCharToTx; | ||||
|  BaseType_t xCRWokenByPost = pdFALSE; | ||||
|  | ||||
|      while( UART_TX_REG_EMPTY() ) | ||||
|      { | ||||
|          // Are there any characters in the queue waiting to be sent? | ||||
| 		 // xCRWokenByPost will automatically be set to pdTRUE if a co-routine | ||||
| 		 // is woken by the post - ensuring that only a single co-routine is | ||||
| 		 // woken no matter how many times we go around this loop. | ||||
|          if( crQUEUE_RECEIVE_FROM_ISR( pxQueue, &cCharToTx, &xCRWokenByPost ) ) | ||||
| 		 { | ||||
| 			 SEND_CHARACTER( cCharToTx ); | ||||
| 		 } | ||||
|      } | ||||
|  }</pre> | ||||
|  * \defgroup crQUEUE_RECEIVE_FROM_ISR crQUEUE_RECEIVE_FROM_ISR | ||||
|  * \ingroup Tasks | ||||
|  */ | ||||
| #define crQUEUE_RECEIVE_FROM_ISR( pxQueue, pvBuffer, pxCoRoutineWoken ) xQueueCRReceiveFromISR( ( pxQueue ), ( pvBuffer ), ( pxCoRoutineWoken ) ) | ||||
|  | ||||
| /* | ||||
|  * This function is intended for internal use by the co-routine macros only. | ||||
|  * The macro nature of the co-routine implementation requires that the | ||||
|  * prototype appears here.  The function should not be used by application | ||||
|  * writers. | ||||
|  * | ||||
|  * Removes the current co-routine from its ready list and places it in the | ||||
|  * appropriate delayed list. | ||||
|  */ | ||||
| void vCoRoutineAddToDelayedList( TickType_t xTicksToDelay, List_t *pxEventList ); | ||||
|  | ||||
| /* | ||||
|  * This function is intended for internal use by the queue implementation only. | ||||
|  * The function should not be used by application writers. | ||||
|  * | ||||
|  * Removes the highest priority co-routine from the event list and places it in | ||||
|  * the pending ready list. | ||||
|  */ | ||||
| BaseType_t xCoRoutineRemoveFromEventList( const List_t *pxEventList ); | ||||
|  | ||||
| #ifdef __cplusplus | ||||
| } | ||||
| #endif | ||||
|  | ||||
| #endif /* CO_ROUTINE_H */ | ||||
| @@ -0,0 +1,278 @@ | ||||
| /* | ||||
|  * FreeRTOS Kernel V10.2.1 | ||||
|  * Copyright (C) 2019 Amazon.com, Inc. or its affiliates.  All Rights Reserved. | ||||
|  * | ||||
|  * Permission is hereby granted, free of charge, to any person obtaining a copy of | ||||
|  * this software and associated documentation files (the "Software"), to deal in | ||||
|  * the Software without restriction, including without limitation the rights to | ||||
|  * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of | ||||
|  * the Software, and to permit persons to whom the Software is furnished to do so, | ||||
|  * subject to the following conditions: | ||||
|  * | ||||
|  * The above copyright notice and this permission notice shall be included in all | ||||
|  * copies or substantial portions of the Software. | ||||
|  * | ||||
|  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
|  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS | ||||
|  * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR | ||||
|  * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER | ||||
|  * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN | ||||
|  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. | ||||
|  * | ||||
|  * http://www.FreeRTOS.org | ||||
|  * http://aws.amazon.com/freertos | ||||
|  * | ||||
|  * 1 tab == 4 spaces! | ||||
|  */ | ||||
|  | ||||
| #ifndef DEPRECATED_DEFINITIONS_H | ||||
| #define DEPRECATED_DEFINITIONS_H | ||||
|  | ||||
|  | ||||
| /* Each FreeRTOS port has a unique portmacro.h header file.  Originally a | ||||
| pre-processor definition was used to ensure the pre-processor found the correct | ||||
| portmacro.h file for the port being used.  That scheme was deprecated in favour | ||||
| of setting the compiler's include path such that it found the correct | ||||
| portmacro.h file - removing the need for the constant and allowing the | ||||
| portmacro.h file to be located anywhere in relation to the port being used.  The | ||||
| definitions below remain in the code for backward compatibility only.  New | ||||
| projects should not use them. */ | ||||
|  | ||||
| #ifdef OPEN_WATCOM_INDUSTRIAL_PC_PORT | ||||
| 	#include "..\..\Source\portable\owatcom\16bitdos\pc\portmacro.h" | ||||
| 	typedef void ( __interrupt __far *pxISR )(); | ||||
| #endif | ||||
|  | ||||
| #ifdef OPEN_WATCOM_FLASH_LITE_186_PORT | ||||
| 	#include "..\..\Source\portable\owatcom\16bitdos\flsh186\portmacro.h" | ||||
| 	typedef void ( __interrupt __far *pxISR )(); | ||||
| #endif | ||||
|  | ||||
| #ifdef GCC_MEGA_AVR | ||||
| 	#include "../portable/GCC/ATMega323/portmacro.h" | ||||
| #endif | ||||
|  | ||||
| #ifdef IAR_MEGA_AVR | ||||
| 	#include "../portable/IAR/ATMega323/portmacro.h" | ||||
| #endif | ||||
|  | ||||
| #ifdef MPLAB_PIC24_PORT | ||||
| 	#include "../../Source/portable/MPLAB/PIC24_dsPIC/portmacro.h" | ||||
| #endif | ||||
|  | ||||
| #ifdef MPLAB_DSPIC_PORT | ||||
| 	#include "../../Source/portable/MPLAB/PIC24_dsPIC/portmacro.h" | ||||
| #endif | ||||
|  | ||||
| #ifdef MPLAB_PIC18F_PORT | ||||
| 	#include "../../Source/portable/MPLAB/PIC18F/portmacro.h" | ||||
| #endif | ||||
|  | ||||
| #ifdef MPLAB_PIC32MX_PORT | ||||
| 	#include "../../Source/portable/MPLAB/PIC32MX/portmacro.h" | ||||
| #endif | ||||
|  | ||||
| #ifdef _FEDPICC | ||||
| 	#include "libFreeRTOS/Include/portmacro.h" | ||||
| #endif | ||||
|  | ||||
| #ifdef SDCC_CYGNAL | ||||
| 	#include "../../Source/portable/SDCC/Cygnal/portmacro.h" | ||||
| #endif | ||||
|  | ||||
| #ifdef GCC_ARM7 | ||||
| 	#include "../../Source/portable/GCC/ARM7_LPC2000/portmacro.h" | ||||
| #endif | ||||
|  | ||||
| #ifdef GCC_ARM7_ECLIPSE | ||||
| 	#include "portmacro.h" | ||||
| #endif | ||||
|  | ||||
| #ifdef ROWLEY_LPC23xx | ||||
| 	#include "../../Source/portable/GCC/ARM7_LPC23xx/portmacro.h" | ||||
| #endif | ||||
|  | ||||
| #ifdef IAR_MSP430 | ||||
| 	#include "..\..\Source\portable\IAR\MSP430\portmacro.h" | ||||
| #endif | ||||
|  | ||||
| #ifdef GCC_MSP430 | ||||
| 	#include "../../Source/portable/GCC/MSP430F449/portmacro.h" | ||||
| #endif | ||||
|  | ||||
| #ifdef ROWLEY_MSP430 | ||||
| 	#include "../../Source/portable/Rowley/MSP430F449/portmacro.h" | ||||
| #endif | ||||
|  | ||||
| #ifdef ARM7_LPC21xx_KEIL_RVDS | ||||
| 	#include "..\..\Source\portable\RVDS\ARM7_LPC21xx\portmacro.h" | ||||
| #endif | ||||
|  | ||||
| #ifdef SAM7_GCC | ||||
| 	#include "../../Source/portable/GCC/ARM7_AT91SAM7S/portmacro.h" | ||||
| #endif | ||||
|  | ||||
| #ifdef SAM7_IAR | ||||
| 	#include "..\..\Source\portable\IAR\AtmelSAM7S64\portmacro.h" | ||||
| #endif | ||||
|  | ||||
| #ifdef SAM9XE_IAR | ||||
| 	#include "..\..\Source\portable\IAR\AtmelSAM9XE\portmacro.h" | ||||
| #endif | ||||
|  | ||||
| #ifdef LPC2000_IAR | ||||
| 	#include "..\..\Source\portable\IAR\LPC2000\portmacro.h" | ||||
| #endif | ||||
|  | ||||
| #ifdef STR71X_IAR | ||||
| 	#include "..\..\Source\portable\IAR\STR71x\portmacro.h" | ||||
| #endif | ||||
|  | ||||
| #ifdef STR75X_IAR | ||||
| 	#include "..\..\Source\portable\IAR\STR75x\portmacro.h" | ||||
| #endif | ||||
|  | ||||
| #ifdef STR75X_GCC | ||||
| 	#include "..\..\Source\portable\GCC\STR75x\portmacro.h" | ||||
| #endif | ||||
|  | ||||
| #ifdef STR91X_IAR | ||||
| 	#include "..\..\Source\portable\IAR\STR91x\portmacro.h" | ||||
| #endif | ||||
|  | ||||
| #ifdef GCC_H8S | ||||
| 	#include "../../Source/portable/GCC/H8S2329/portmacro.h" | ||||
| #endif | ||||
|  | ||||
| #ifdef GCC_AT91FR40008 | ||||
| 	#include "../../Source/portable/GCC/ARM7_AT91FR40008/portmacro.h" | ||||
| #endif | ||||
|  | ||||
| #ifdef RVDS_ARMCM3_LM3S102 | ||||
| 	#include "../../Source/portable/RVDS/ARM_CM3/portmacro.h" | ||||
| #endif | ||||
|  | ||||
| #ifdef GCC_ARMCM3_LM3S102 | ||||
| 	#include "../../Source/portable/GCC/ARM_CM3/portmacro.h" | ||||
| #endif | ||||
|  | ||||
| #ifdef GCC_ARMCM3 | ||||
| 	#include "../../Source/portable/GCC/ARM_CM3/portmacro.h" | ||||
| #endif | ||||
|  | ||||
| #ifdef IAR_ARM_CM3 | ||||
| 	#include "../../Source/portable/IAR/ARM_CM3/portmacro.h" | ||||
| #endif | ||||
|  | ||||
| #ifdef IAR_ARMCM3_LM | ||||
| 	#include "../../Source/portable/IAR/ARM_CM3/portmacro.h" | ||||
| #endif | ||||
|  | ||||
| #ifdef HCS12_CODE_WARRIOR | ||||
| 	#include "../../Source/portable/CodeWarrior/HCS12/portmacro.h" | ||||
| #endif | ||||
|  | ||||
| #ifdef MICROBLAZE_GCC | ||||
| 	#include "../../Source/portable/GCC/MicroBlaze/portmacro.h" | ||||
| #endif | ||||
|  | ||||
| #ifdef TERN_EE | ||||
| 	#include "..\..\Source\portable\Paradigm\Tern_EE\small\portmacro.h" | ||||
| #endif | ||||
|  | ||||
| #ifdef GCC_HCS12 | ||||
| 	#include "../../Source/portable/GCC/HCS12/portmacro.h" | ||||
| #endif | ||||
|  | ||||
| #ifdef GCC_MCF5235 | ||||
|     #include "../../Source/portable/GCC/MCF5235/portmacro.h" | ||||
| #endif | ||||
|  | ||||
| #ifdef COLDFIRE_V2_GCC | ||||
| 	#include "../../../Source/portable/GCC/ColdFire_V2/portmacro.h" | ||||
| #endif | ||||
|  | ||||
| #ifdef COLDFIRE_V2_CODEWARRIOR | ||||
| 	#include "../../Source/portable/CodeWarrior/ColdFire_V2/portmacro.h" | ||||
| #endif | ||||
|  | ||||
| #ifdef GCC_PPC405 | ||||
| 	#include "../../Source/portable/GCC/PPC405_Xilinx/portmacro.h" | ||||
| #endif | ||||
|  | ||||
| #ifdef GCC_PPC440 | ||||
| 	#include "../../Source/portable/GCC/PPC440_Xilinx/portmacro.h" | ||||
| #endif | ||||
|  | ||||
| #ifdef _16FX_SOFTUNE | ||||
| 	#include "..\..\Source\portable\Softune\MB96340\portmacro.h" | ||||
| #endif | ||||
|  | ||||
| #ifdef BCC_INDUSTRIAL_PC_PORT | ||||
| 	/* A short file name has to be used in place of the normal | ||||
| 	FreeRTOSConfig.h when using the Borland compiler. */ | ||||
| 	#include "frconfig.h" | ||||
| 	#include "..\portable\BCC\16BitDOS\PC\prtmacro.h" | ||||
|     typedef void ( __interrupt __far *pxISR )(); | ||||
| #endif | ||||
|  | ||||
| #ifdef BCC_FLASH_LITE_186_PORT | ||||
| 	/* A short file name has to be used in place of the normal | ||||
| 	FreeRTOSConfig.h when using the Borland compiler. */ | ||||
| 	#include "frconfig.h" | ||||
| 	#include "..\portable\BCC\16BitDOS\flsh186\prtmacro.h" | ||||
|     typedef void ( __interrupt __far *pxISR )(); | ||||
| #endif | ||||
|  | ||||
| #ifdef __GNUC__ | ||||
|    #ifdef __AVR32_AVR32A__ | ||||
| 	   #include "portmacro.h" | ||||
|    #endif | ||||
| #endif | ||||
|  | ||||
| #ifdef __ICCAVR32__ | ||||
|    #ifdef __CORE__ | ||||
|       #if __CORE__ == __AVR32A__ | ||||
| 	      #include "portmacro.h" | ||||
|       #endif | ||||
|    #endif | ||||
| #endif | ||||
|  | ||||
| #ifdef __91467D | ||||
| 	#include "portmacro.h" | ||||
| #endif | ||||
|  | ||||
| #ifdef __96340 | ||||
| 	#include "portmacro.h" | ||||
| #endif | ||||
|  | ||||
|  | ||||
| #ifdef __IAR_V850ES_Fx3__ | ||||
| 	#include "../../Source/portable/IAR/V850ES/portmacro.h" | ||||
| #endif | ||||
|  | ||||
| #ifdef __IAR_V850ES_Jx3__ | ||||
| 	#include "../../Source/portable/IAR/V850ES/portmacro.h" | ||||
| #endif | ||||
|  | ||||
| #ifdef __IAR_V850ES_Jx3_L__ | ||||
| 	#include "../../Source/portable/IAR/V850ES/portmacro.h" | ||||
| #endif | ||||
|  | ||||
| #ifdef __IAR_V850ES_Jx2__ | ||||
| 	#include "../../Source/portable/IAR/V850ES/portmacro.h" | ||||
| #endif | ||||
|  | ||||
| #ifdef __IAR_V850ES_Hx2__ | ||||
| 	#include "../../Source/portable/IAR/V850ES/portmacro.h" | ||||
| #endif | ||||
|  | ||||
| #ifdef __IAR_78K0R_Kx3__ | ||||
| 	#include "../../Source/portable/IAR/78K0R/portmacro.h" | ||||
| #endif | ||||
|  | ||||
| #ifdef __IAR_78K0R_Kx3L__ | ||||
| 	#include "../../Source/portable/IAR/78K0R/portmacro.h" | ||||
| #endif | ||||
|  | ||||
| #endif /* DEPRECATED_DEFINITIONS_H */ | ||||
| @@ -0,0 +1,697 @@ | ||||
| /* | ||||
|  * FreeRTOS Kernel V10.2.1 | ||||
|  * Copyright (C) 2019 Amazon.com, Inc. or its affiliates.  All Rights Reserved. | ||||
|  * | ||||
|  * Permission is hereby granted, free of charge, to any person obtaining a copy of | ||||
|  * this software and associated documentation files (the "Software"), to deal in | ||||
|  * the Software without restriction, including without limitation the rights to | ||||
|  * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of | ||||
|  * the Software, and to permit persons to whom the Software is furnished to do so, | ||||
|  * subject to the following conditions: | ||||
|  * | ||||
|  * The above copyright notice and this permission notice shall be included in all | ||||
|  * copies or substantial portions of the Software. | ||||
|  * | ||||
|  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
|  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS | ||||
|  * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR | ||||
|  * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER | ||||
|  * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN | ||||
|  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. | ||||
|  * | ||||
|  * http://www.FreeRTOS.org | ||||
|  * http://aws.amazon.com/freertos | ||||
|  * | ||||
|  * 1 tab == 4 spaces! | ||||
|  */ | ||||
|  | ||||
| #ifndef EVENT_GROUPS_H | ||||
| #define EVENT_GROUPS_H | ||||
|  | ||||
| #ifndef INC_FREERTOS_H | ||||
| 	#error "include FreeRTOS.h" must appear in source files before "include event_groups.h" | ||||
| #endif | ||||
|  | ||||
| /* FreeRTOS includes. */ | ||||
| #include "timers.h" | ||||
|  | ||||
| #ifdef __cplusplus | ||||
| extern "C" { | ||||
| #endif | ||||
|  | ||||
| /** | ||||
|  * An event group is a collection of bits to which an application can assign a | ||||
|  * meaning.  For example, an application may create an event group to convey | ||||
|  * the status of various CAN bus related events in which bit 0 might mean "A CAN | ||||
|  * message has been received and is ready for processing", bit 1 might mean "The | ||||
|  * application has queued a message that is ready for sending onto the CAN | ||||
|  * network", and bit 2 might mean "It is time to send a SYNC message onto the | ||||
|  * CAN network" etc.  A task can then test the bit values to see which events | ||||
|  * are active, and optionally enter the Blocked state to wait for a specified | ||||
|  * bit or a group of specified bits to be active.  To continue the CAN bus | ||||
|  * example, a CAN controlling task can enter the Blocked state (and therefore | ||||
|  * not consume any processing time) until either bit 0, bit 1 or bit 2 are | ||||
|  * active, at which time the bit that was actually active would inform the task | ||||
|  * which action it had to take (process a received message, send a message, or | ||||
|  * send a SYNC). | ||||
|  * | ||||
|  * The event groups implementation contains intelligence to avoid race | ||||
|  * conditions that would otherwise occur were an application to use a simple | ||||
|  * variable for the same purpose.  This is particularly important with respect | ||||
|  * to when a bit within an event group is to be cleared, and when bits have to | ||||
|  * be set and then tested atomically - as is the case where event groups are | ||||
|  * used to create a synchronisation point between multiple tasks (a | ||||
|  * 'rendezvous'). | ||||
|  * | ||||
|  */ | ||||
|  | ||||
|  | ||||
|  | ||||
| /** | ||||
|  * event_groups.h | ||||
|  * | ||||
|  * Type by which event groups are referenced.  For example, a call to | ||||
|  * xEventGroupCreate() returns an EventGroupHandle_t variable that can then | ||||
|  * be used as a parameter to other event group functions. | ||||
|  * | ||||
|  * \defgroup EventGroupHandle_t EventGroupHandle_t | ||||
|  * \ingroup EventGroup | ||||
|  */ | ||||
| struct EventGroupDef_t; | ||||
| //typedef struct EventGroupDef_t * EventGroupHandle_t; | ||||
| typedef void * EventGroupHandle_t; | ||||
|  | ||||
| /* | ||||
|  * The type that holds event bits always matches TickType_t - therefore the | ||||
|  * number of bits it holds is set by configUSE_16_BIT_TICKS (16 bits if set to 1, | ||||
|  * 32 bits if set to 0. | ||||
|  * | ||||
|  * \defgroup EventBits_t EventBits_t | ||||
|  * \ingroup EventGroup | ||||
|  */ | ||||
| typedef TickType_t EventBits_t; | ||||
|  | ||||
| /** | ||||
|  * | ||||
|  * | ||||
|  * Create a new event group. | ||||
|  * | ||||
|  * Internally, within the FreeRTOS implementation, event groups use a [small] | ||||
|  * block of memory, in which the event group's structure is stored.  If an event | ||||
|  * groups is created using xEventGropuCreate() then the required memory is | ||||
|  * automatically dynamically allocated inside the xEventGroupCreate() function. | ||||
|  * (see http://www.freertos.org/a00111.html).  If an event group is created | ||||
|  * using xEventGropuCreateStatic() then the application writer must instead | ||||
|  * provide the memory that will get used by the event group. | ||||
|  * xEventGroupCreateStatic() therefore allows an event group to be created | ||||
|  * without using any dynamic memory allocation. | ||||
|  * | ||||
|  * Although event groups are not related to ticks, for internal implementation | ||||
|  * reasons the number of bits available for use in an event group is dependent | ||||
|  * on the configUSE_16_BIT_TICKS setting in FreeRTOSConfig.h.  If | ||||
|  * configUSE_16_BIT_TICKS is 1 then each event group contains 8 usable bits (bit | ||||
|  * 0 to bit 7).  If configUSE_16_BIT_TICKS is set to 0 then each event group has | ||||
|  * 24 usable bits (bit 0 to bit 23).  The EventBits_t type is used to store | ||||
|  * event bits within an event group. | ||||
|  * | ||||
|  * @return If the event group was created then a handle to the event group is | ||||
|  * returned.  If there was insufficient FreeRTOS heap available to create the | ||||
|  * event group then NULL is returned.  See http://www.freertos.org/a00111.html | ||||
|  * | ||||
|  * Example usage: | ||||
|  * @code{c} | ||||
|  * 	// Declare a variable to hold the created event group. | ||||
|  * 	EventGroupHandle_t xCreatedEventGroup; | ||||
|  * | ||||
|  * 	// Attempt to create the event group. | ||||
|  * 	xCreatedEventGroup = xEventGroupCreate(); | ||||
|  * | ||||
|  * 	// Was the event group created successfully? | ||||
|  * 	if( xCreatedEventGroup == NULL ) | ||||
|  * 	{ | ||||
|  * 		// The event group was not created because there was insufficient | ||||
|  * 		// FreeRTOS heap available. | ||||
|  * 	} | ||||
|  * 	else | ||||
|  * 	{ | ||||
|  * 		// The event group was created. | ||||
|  * 	} | ||||
|  * @endcode | ||||
|  * \ingroup EventGroup | ||||
|  */ | ||||
| #if( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) | ||||
| 	EventGroupHandle_t xEventGroupCreate( void ) PRIVILEGED_FUNCTION; | ||||
| #endif | ||||
|  | ||||
| /** | ||||
|  * Create a new event group. | ||||
|  * | ||||
|  * Internally, within the FreeRTOS implementation, event groups use a [small] | ||||
|  * block of memory, in which the event group's structure is stored.  If an event | ||||
|  * groups is created using xEventGropuCreate() then the required memory is | ||||
|  * automatically dynamically allocated inside the xEventGroupCreate() function. | ||||
|  * (see http://www.freertos.org/a00111.html).  If an event group is created | ||||
|  * using xEventGropuCreateStatic() then the application writer must instead | ||||
|  * provide the memory that will get used by the event group. | ||||
|  * xEventGroupCreateStatic() therefore allows an event group to be created | ||||
|  * without using any dynamic memory allocation. | ||||
|  * | ||||
|  * Although event groups are not related to ticks, for internal implementation | ||||
|  * reasons the number of bits available for use in an event group is dependent | ||||
|  * on the configUSE_16_BIT_TICKS setting in FreeRTOSConfig.h.  If | ||||
|  * configUSE_16_BIT_TICKS is 1 then each event group contains 8 usable bits (bit | ||||
|  * 0 to bit 7).  If configUSE_16_BIT_TICKS is set to 0 then each event group has | ||||
|  * 24 usable bits (bit 0 to bit 23).  The EventBits_t type is used to store | ||||
|  * event bits within an event group. | ||||
|  * | ||||
|  * @param pxEventGroupBuffer pxEventGroupBuffer must point to a variable of type | ||||
|  * StaticEventGroup_t, which will be then be used to hold the event group's data | ||||
|  * structures, removing the need for the memory to be allocated dynamically. | ||||
|  * | ||||
|  * @return If the event group was created then a handle to the event group is | ||||
|  * returned.  If pxEventGroupBuffer was NULL then NULL is returned. | ||||
|  * | ||||
|  * Example usage: | ||||
|  * @code{c} | ||||
|  * 	// StaticEventGroup_t is a publicly accessible structure that has the same | ||||
|  * 	// size and alignment requirements as the real event group structure.  It is | ||||
|  * 	// provided as a mechanism for applications to know the size of the event | ||||
|  * 	// group (which is dependent on the architecture and configuration file | ||||
|  * 	// settings) without breaking the strict data hiding policy by exposing the | ||||
|  * 	// real event group internals.  This StaticEventGroup_t variable is passed | ||||
|  * 	// into the xSemaphoreCreateEventGroupStatic() function and is used to store | ||||
|  * 	// the event group's data structures | ||||
|  * 	StaticEventGroup_t xEventGroupBuffer; | ||||
|  * | ||||
|  * 	// Create the event group without dynamically allocating any memory. | ||||
|  * 	xEventGroup = xEventGroupCreateStatic( &xEventGroupBuffer ); | ||||
|  * @endcode | ||||
|  */ | ||||
| #if( configSUPPORT_STATIC_ALLOCATION == 1 ) | ||||
| 	EventGroupHandle_t xEventGroupCreateStatic( StaticEventGroup_t *pxEventGroupBuffer ) PRIVILEGED_FUNCTION; | ||||
| #endif | ||||
|  | ||||
| /** | ||||
|  * [Potentially] block to wait for one or more bits to be set within a | ||||
|  * previously created event group. | ||||
|  * | ||||
|  * This function cannot be called from an interrupt. | ||||
|  * | ||||
|  * @param xEventGroup The event group in which the bits are being tested.  The | ||||
|  * event group must have previously been created using a call to | ||||
|  * xEventGroupCreate(). | ||||
|  * | ||||
|  * @param uxBitsToWaitFor A bitwise value that indicates the bit or bits to test | ||||
|  * inside the event group.  For example, to wait for bit 0 and/or bit 2 set | ||||
|  * uxBitsToWaitFor to 0x05.  To wait for bits 0 and/or bit 1 and/or bit 2 set | ||||
|  * uxBitsToWaitFor to 0x07.  Etc. | ||||
|  * | ||||
|  * @param xClearOnExit If xClearOnExit is set to pdTRUE then any bits within | ||||
|  * uxBitsToWaitFor that are set within the event group will be cleared before | ||||
|  * xEventGroupWaitBits() returns if the wait condition was met (if the function | ||||
|  * returns for a reason other than a timeout).  If xClearOnExit is set to | ||||
|  * pdFALSE then the bits set in the event group are not altered when the call to | ||||
|  * xEventGroupWaitBits() returns. | ||||
|  * | ||||
|  * @param xWaitForAllBits If xWaitForAllBits is set to pdTRUE then | ||||
|  * xEventGroupWaitBits() will return when either all the bits in uxBitsToWaitFor | ||||
|  * are set or the specified block time expires.  If xWaitForAllBits is set to | ||||
|  * pdFALSE then xEventGroupWaitBits() will return when any one of the bits set | ||||
|  * in uxBitsToWaitFor is set or the specified block time expires.  The block | ||||
|  * time is specified by the xTicksToWait parameter. | ||||
|  * | ||||
|  * @param xTicksToWait The maximum amount of time (specified in 'ticks') to wait | ||||
|  * for one/all (depending on the xWaitForAllBits value) of the bits specified by | ||||
|  * uxBitsToWaitFor to become set. | ||||
|  * | ||||
|  * @return The value of the event group at the time either the bits being waited | ||||
|  * for became set, or the block time expired.  Test the return value to know | ||||
|  * which bits were set.  If xEventGroupWaitBits() returned because its timeout | ||||
|  * expired then not all the bits being waited for will be set.  If | ||||
|  * xEventGroupWaitBits() returned because the bits it was waiting for were set | ||||
|  * then the returned value is the event group value before any bits were | ||||
|  * automatically cleared in the case that xClearOnExit parameter was set to | ||||
|  * pdTRUE. | ||||
|  * | ||||
|  * Example usage: | ||||
|  * @code{c} | ||||
|  *    #define BIT_0	( 1 << 0 ) | ||||
|  *    #define BIT_4	( 1 << 4 ) | ||||
|  * | ||||
|  *    void aFunction( EventGroupHandle_t xEventGroup ) | ||||
|  *    { | ||||
|  *    EventBits_t uxBits; | ||||
|  *    const TickType_t xTicksToWait = 100 / portTICK_PERIOD_MS; | ||||
|  * | ||||
|  * 		// Wait a maximum of 100ms for either bit 0 or bit 4 to be set within | ||||
|  * 		// the event group.  Clear the bits before exiting. | ||||
|  * 		uxBits = xEventGroupWaitBits( | ||||
|  * 					xEventGroup,	// The event group being tested. | ||||
|  * 					BIT_0 | BIT_4,	// The bits within the event group to wait for. | ||||
|  * 					pdTRUE,			// BIT_0 and BIT_4 should be cleared before returning. | ||||
|  * 					pdFALSE,		// Don't wait for both bits, either bit will do. | ||||
|  * 					xTicksToWait );	// Wait a maximum of 100ms for either bit to be set. | ||||
|  * | ||||
|  * 		if( ( uxBits & ( BIT_0 | BIT_4 ) ) == ( BIT_0 | BIT_4 ) ) | ||||
|  * 		{ | ||||
|  * 			// xEventGroupWaitBits() returned because both bits were set. | ||||
|  * 		} | ||||
|  * 		else if( ( uxBits & BIT_0 ) != 0 ) | ||||
|  * 		{ | ||||
|  * 			// xEventGroupWaitBits() returned because just BIT_0 was set. | ||||
|  * 		} | ||||
|  * 		else if( ( uxBits & BIT_4 ) != 0 ) | ||||
|  * 		{ | ||||
|  * 			// xEventGroupWaitBits() returned because just BIT_4 was set. | ||||
|  * 		} | ||||
|  * 		else | ||||
|  * 		{ | ||||
|  * 			// xEventGroupWaitBits() returned because xTicksToWait ticks passed | ||||
|  * 			// without either BIT_0 or BIT_4 becoming set. | ||||
|  * 		} | ||||
|  *    } | ||||
|  * @endcode{c} | ||||
|  * \ingroup EventGroup | ||||
|  */ | ||||
| EventBits_t xEventGroupWaitBits( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToWaitFor, const BaseType_t xClearOnExit, const BaseType_t xWaitForAllBits, TickType_t xTicksToWait ) PRIVILEGED_FUNCTION; | ||||
|  | ||||
| /** | ||||
|  * | ||||
|  * Clear bits within an event group.  This function cannot be called from an | ||||
|  * interrupt. | ||||
|  * | ||||
|  * @param xEventGroup The event group in which the bits are to be cleared. | ||||
|  * | ||||
|  * @param uxBitsToClear A bitwise value that indicates the bit or bits to clear | ||||
|  * in the event group.  For example, to clear bit 3 only, set uxBitsToClear to | ||||
|  * 0x08.  To clear bit 3 and bit 0 set uxBitsToClear to 0x09. | ||||
|  * | ||||
|  * @return The value of the event group before the specified bits were cleared. | ||||
|  * | ||||
|  * Example usage: | ||||
|  * @code{c} | ||||
|  *    #define BIT_0	( 1 << 0 ) | ||||
|  *    #define BIT_4	( 1 << 4 ) | ||||
|  * | ||||
|  *    void aFunction( EventGroupHandle_t xEventGroup ) | ||||
|  *    { | ||||
|  *    EventBits_t uxBits; | ||||
|  * | ||||
|  * 		// Clear bit 0 and bit 4 in xEventGroup. | ||||
|  * 		uxBits = xEventGroupClearBits( | ||||
|  * 								xEventGroup,	// The event group being updated. | ||||
|  * 								BIT_0 | BIT_4 );// The bits being cleared. | ||||
|  * | ||||
|  * 		if( ( uxBits & ( BIT_0 | BIT_4 ) ) == ( BIT_0 | BIT_4 ) ) | ||||
|  * 		{ | ||||
|  * 			// Both bit 0 and bit 4 were set before xEventGroupClearBits() was | ||||
|  * 			// called.  Both will now be clear (not set). | ||||
|  * 		} | ||||
|  * 		else if( ( uxBits & BIT_0 ) != 0 ) | ||||
|  * 		{ | ||||
|  * 			// Bit 0 was set before xEventGroupClearBits() was called.  It will | ||||
|  * 			// now be clear. | ||||
|  * 		} | ||||
|  * 		else if( ( uxBits & BIT_4 ) != 0 ) | ||||
|  * 		{ | ||||
|  * 			// Bit 4 was set before xEventGroupClearBits() was called.  It will | ||||
|  * 			// now be clear. | ||||
|  * 		} | ||||
|  * 		else | ||||
|  * 		{ | ||||
|  * 			// Neither bit 0 nor bit 4 were set in the first place. | ||||
|  * 		} | ||||
|  *    } | ||||
|  * @endcode | ||||
|  * \ingroup EventGroup | ||||
|  */ | ||||
| EventBits_t xEventGroupClearBits( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToClear ) PRIVILEGED_FUNCTION; | ||||
|  | ||||
| /** | ||||
|  * | ||||
|  * A version of xEventGroupClearBits() that can be called from an interrupt. | ||||
|  * | ||||
|  * Setting bits in an event group is not a deterministic operation because there | ||||
|  * are an unknown number of tasks that may be waiting for the bit or bits being | ||||
|  * set.  FreeRTOS does not allow nondeterministic operations to be performed | ||||
|  * while interrupts are disabled, so protects event groups that are accessed | ||||
|  * from tasks by suspending the scheduler rather than disabling interrupts.  As | ||||
|  * a result event groups cannot be accessed directly from an interrupt service | ||||
|  * routine.  Therefore xEventGroupClearBitsFromISR() sends a message to the | ||||
|  * timer task to have the clear operation performed in the context of the timer | ||||
|  * task. | ||||
|  * | ||||
|  * @param xEventGroup The event group in which the bits are to be cleared. | ||||
|  * | ||||
|  * @param uxBitsToClear A bitwise value that indicates the bit or bits to clear. | ||||
|  * For example, to clear bit 3 only, set uxBitsToClear to 0x08.  To clear bit 3 | ||||
|  * and bit 0 set uxBitsToClear to 0x09. | ||||
|  * | ||||
|  * @return If the request to execute the function was posted successfully then | ||||
|  * pdPASS is returned, otherwise pdFALSE is returned.  pdFALSE will be returned | ||||
|  * if the timer service queue was full. | ||||
|  * | ||||
|  * Example usage: | ||||
|  * @code{c} | ||||
|  *    #define BIT_0	( 1 << 0 ) | ||||
|  *    #define BIT_4	( 1 << 4 ) | ||||
|  * | ||||
|  *    // An event group which it is assumed has already been created by a call to | ||||
|  *    // xEventGroupCreate(). | ||||
|  *    EventGroupHandle_t xEventGroup; | ||||
|  * | ||||
|  *    void anInterruptHandler( void ) | ||||
|  *    { | ||||
|  * 		// Clear bit 0 and bit 4 in xEventGroup. | ||||
|  * 		xResult = xEventGroupClearBitsFromISR( | ||||
|  * 							xEventGroup,	 // The event group being updated. | ||||
|  * 							BIT_0 | BIT_4 ); // The bits being set. | ||||
|  * | ||||
|  * 		if( xResult == pdPASS ) | ||||
|  * 		{ | ||||
|  * 			// The message was posted successfully. | ||||
|  * 		} | ||||
|  *   } | ||||
|  * @endcode | ||||
|  * \ingroup EventGroup | ||||
|  */ | ||||
| #if( configUSE_TRACE_FACILITY == 1 ) | ||||
| 	BaseType_t xEventGroupClearBitsFromISR( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToClear ) PRIVILEGED_FUNCTION; | ||||
| #else | ||||
| 	#define xEventGroupClearBitsFromISR( xEventGroup, uxBitsToClear ) xTimerPendFunctionCallFromISR( vEventGroupClearBitsCallback, ( void * ) xEventGroup, ( uint32_t ) uxBitsToClear, NULL ) | ||||
| #endif | ||||
|  | ||||
| /** | ||||
|  * | ||||
|  * Set bits within an event group. | ||||
|  * This function cannot be called from an interrupt.  xEventGroupSetBitsFromISR() | ||||
|  * is a version that can be called from an interrupt. | ||||
|  * | ||||
|  * Setting bits in an event group will automatically unblock tasks that are | ||||
|  * blocked waiting for the bits. | ||||
|  * | ||||
|  * @param xEventGroup The event group in which the bits are to be set. | ||||
|  * | ||||
|  * @param uxBitsToSet A bitwise value that indicates the bit or bits to set. | ||||
|  * For example, to set bit 3 only, set uxBitsToSet to 0x08.  To set bit 3 | ||||
|  * and bit 0 set uxBitsToSet to 0x09. | ||||
|  * | ||||
|  * @return The value of the event group at the time the call to | ||||
|  * xEventGroupSetBits() returns.  There are two reasons why the returned value | ||||
|  * might have the bits specified by the uxBitsToSet parameter cleared.  First, | ||||
|  * if setting a bit results in a task that was waiting for the bit leaving the | ||||
|  * blocked state then it is possible the bit will be cleared automatically | ||||
|  * (see the xClearBitOnExit parameter of xEventGroupWaitBits()).  Second, any | ||||
|  * unblocked (or otherwise Ready state) task that has a priority above that of | ||||
|  * the task that called xEventGroupSetBits() will execute and may change the | ||||
|  * event group value before the call to xEventGroupSetBits() returns. | ||||
|  * | ||||
|  * Example usage: | ||||
|  * @code{c} | ||||
|  *    #define BIT_0	( 1 << 0 ) | ||||
|  *    #define BIT_4	( 1 << 4 ) | ||||
|  * | ||||
|  *    void aFunction( EventGroupHandle_t xEventGroup ) | ||||
|  *    { | ||||
|  *    EventBits_t uxBits; | ||||
|  * | ||||
|  * 		// Set bit 0 and bit 4 in xEventGroup. | ||||
|  * 		uxBits = xEventGroupSetBits( | ||||
|  * 							xEventGroup,	// The event group being updated. | ||||
|  * 							BIT_0 | BIT_4 );// The bits being set. | ||||
|  * | ||||
|  * 		if( ( uxBits & ( BIT_0 | BIT_4 ) ) == ( BIT_0 | BIT_4 ) ) | ||||
|  * 		{ | ||||
|  * 			// Both bit 0 and bit 4 remained set when the function returned. | ||||
|  * 		} | ||||
|  * 		else if( ( uxBits & BIT_0 ) != 0 ) | ||||
|  * 		{ | ||||
|  * 			// Bit 0 remained set when the function returned, but bit 4 was | ||||
|  * 			// cleared.  It might be that bit 4 was cleared automatically as a | ||||
|  * 			// task that was waiting for bit 4 was removed from the Blocked | ||||
|  * 			// state. | ||||
|  * 		} | ||||
|  * 		else if( ( uxBits & BIT_4 ) != 0 ) | ||||
|  * 		{ | ||||
|  * 			// Bit 4 remained set when the function returned, but bit 0 was | ||||
|  * 			// cleared.  It might be that bit 0 was cleared automatically as a | ||||
|  * 			// task that was waiting for bit 0 was removed from the Blocked | ||||
|  * 			// state. | ||||
|  * 		} | ||||
|  * 		else | ||||
|  * 		{ | ||||
|  * 			// Neither bit 0 nor bit 4 remained set.  It might be that a task | ||||
|  * 			// was waiting for both of the bits to be set, and the bits were | ||||
|  * 			// cleared as the task left the Blocked state. | ||||
|  * 		} | ||||
|  *    } | ||||
|  * @endcode{c} | ||||
|  * \ingroup EventGroup | ||||
|  */ | ||||
| EventBits_t xEventGroupSetBits( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToSet ) PRIVILEGED_FUNCTION; | ||||
|  | ||||
| /** | ||||
|  * | ||||
|  * A version of xEventGroupSetBits() that can be called from an interrupt. | ||||
|  * | ||||
|  * Setting bits in an event group is not a deterministic operation because there | ||||
|  * are an unknown number of tasks that may be waiting for the bit or bits being | ||||
|  * set.  FreeRTOS does not allow nondeterministic operations to be performed in | ||||
|  * interrupts or from critical sections.  Therefore xEventGroupSetBitsFromISR() | ||||
|  * sends a message to the timer task to have the set operation performed in the | ||||
|  * context of the timer task - where a scheduler lock is used in place of a | ||||
|  * critical section. | ||||
|  * | ||||
|  * @param xEventGroup The event group in which the bits are to be set. | ||||
|  * | ||||
|  * @param uxBitsToSet A bitwise value that indicates the bit or bits to set. | ||||
|  * For example, to set bit 3 only, set uxBitsToSet to 0x08.  To set bit 3 | ||||
|  * and bit 0 set uxBitsToSet to 0x09. | ||||
|  * | ||||
|  * @param pxHigherPriorityTaskWoken As mentioned above, calling this function | ||||
|  * will result in a message being sent to the timer daemon task.  If the | ||||
|  * priority of the timer daemon task is higher than the priority of the | ||||
|  * currently running task (the task the interrupt interrupted) then | ||||
|  * *pxHigherPriorityTaskWoken will be set to pdTRUE by | ||||
|  * xEventGroupSetBitsFromISR(), indicating that a context switch should be | ||||
|  * requested before the interrupt exits.  For that reason | ||||
|  * *pxHigherPriorityTaskWoken must be initialised to pdFALSE.  See the | ||||
|  * example code below. | ||||
|  * | ||||
|  * @return If the request to execute the function was posted successfully then | ||||
|  * pdPASS is returned, otherwise pdFALSE is returned.  pdFALSE will be returned | ||||
|  * if the timer service queue was full. | ||||
|  * | ||||
|  * Example usage: | ||||
|  * @code{c} | ||||
|  *    #define BIT_0	( 1 << 0 ) | ||||
|  *    #define BIT_4	( 1 << 4 ) | ||||
|  * | ||||
|  *    // An event group which it is assumed has already been created by a call to | ||||
|  *    // xEventGroupCreate(). | ||||
|  *    EventGroupHandle_t xEventGroup; | ||||
|  * | ||||
|  *    void anInterruptHandler( void ) | ||||
|  *    { | ||||
|  *    BaseType_t xHigherPriorityTaskWoken, xResult; | ||||
|  * | ||||
|  * 		// xHigherPriorityTaskWoken must be initialised to pdFALSE. | ||||
|  * 		xHigherPriorityTaskWoken = pdFALSE; | ||||
|  * | ||||
|  * 		// Set bit 0 and bit 4 in xEventGroup. | ||||
|  * 		xResult = xEventGroupSetBitsFromISR( | ||||
|  * 							xEventGroup,	// The event group being updated. | ||||
|  * 							BIT_0 | BIT_4   // The bits being set. | ||||
|  * 							&xHigherPriorityTaskWoken ); | ||||
|  * | ||||
|  * 		// Was the message posted successfully? | ||||
|  * 		if( xResult == pdPASS ) | ||||
|  * 		{ | ||||
|  * 			// If xHigherPriorityTaskWoken is now set to pdTRUE then a context | ||||
|  * 			// switch should be requested.  The macro used is port specific and | ||||
|  * 			// will be either portYIELD_FROM_ISR() or portEND_SWITCHING_ISR() - | ||||
|  * 			// refer to the documentation page for the port being used. | ||||
|  * 			portYIELD_FROM_ISR( xHigherPriorityTaskWoken ); | ||||
|  * 		} | ||||
|  *   } | ||||
|  * @endcode | ||||
|  * \ingroup EventGroup | ||||
|  */ | ||||
| #if( configUSE_TRACE_FACILITY == 1 ) | ||||
| 	BaseType_t xEventGroupSetBitsFromISR( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToSet, BaseType_t *pxHigherPriorityTaskWoken ) PRIVILEGED_FUNCTION; | ||||
| #else | ||||
| 	#define xEventGroupSetBitsFromISR( xEventGroup, uxBitsToSet, pxHigherPriorityTaskWoken ) xTimerPendFunctionCallFromISR( vEventGroupSetBitsCallback, ( void * ) xEventGroup, ( uint32_t ) uxBitsToSet, pxHigherPriorityTaskWoken ) | ||||
| #endif | ||||
|  | ||||
| /** | ||||
|  * | ||||
|  * Atomically set bits within an event group, then wait for a combination of | ||||
|  * bits to be set within the same event group.  This functionality is typically | ||||
|  * used to synchronise multiple tasks, where each task has to wait for the other | ||||
|  * tasks to reach a synchronisation point before proceeding. | ||||
|  * | ||||
|  * This function cannot be used from an interrupt. | ||||
|  * | ||||
|  * The function will return before its block time expires if the bits specified | ||||
|  * by the uxBitsToWait parameter are set, or become set within that time.  In | ||||
|  * this case all the bits specified by uxBitsToWait will be automatically | ||||
|  * cleared before the function returns. | ||||
|  * | ||||
|  * @param xEventGroup The event group in which the bits are being tested.  The | ||||
|  * event group must have previously been created using a call to | ||||
|  * xEventGroupCreate(). | ||||
|  * | ||||
|  * @param uxBitsToSet The bits to set in the event group before determining | ||||
|  * if, and possibly waiting for, all the bits specified by the uxBitsToWait | ||||
|  * parameter are set. | ||||
|  * | ||||
|  * @param uxBitsToWaitFor A bitwise value that indicates the bit or bits to test | ||||
|  * inside the event group.  For example, to wait for bit 0 and bit 2 set | ||||
|  * uxBitsToWaitFor to 0x05.  To wait for bits 0 and bit 1 and bit 2 set | ||||
|  * uxBitsToWaitFor to 0x07.  Etc. | ||||
|  * | ||||
|  * @param xTicksToWait The maximum amount of time (specified in 'ticks') to wait | ||||
|  * for all of the bits specified by uxBitsToWaitFor to become set. | ||||
|  * | ||||
|  * @return The value of the event group at the time either the bits being waited | ||||
|  * for became set, or the block time expired.  Test the return value to know | ||||
|  * which bits were set.  If xEventGroupSync() returned because its timeout | ||||
|  * expired then not all the bits being waited for will be set.  If | ||||
|  * xEventGroupSync() returned because all the bits it was waiting for were | ||||
|  * set then the returned value is the event group value before any bits were | ||||
|  * automatically cleared. | ||||
|  * | ||||
|  * Example usage: | ||||
|  * @code{c} | ||||
|  *  // Bits used by the three tasks. | ||||
|  *  #define TASK_0_BIT		( 1 << 0 ) | ||||
|  *  #define TASK_1_BIT		( 1 << 1 ) | ||||
|  *  #define TASK_2_BIT		( 1 << 2 ) | ||||
|  * | ||||
|  *  #define ALL_SYNC_BITS ( TASK_0_BIT | TASK_1_BIT | TASK_2_BIT ) | ||||
|  * | ||||
|  *  // Use an event group to synchronise three tasks.  It is assumed this event | ||||
|  *  // group has already been created elsewhere. | ||||
|  *  EventGroupHandle_t xEventBits; | ||||
|  * | ||||
|  *  void vTask0( void *pvParameters ) | ||||
|  *  { | ||||
|  *  EventBits_t uxReturn; | ||||
|  *  TickType_t xTicksToWait = 100 / portTICK_PERIOD_MS; | ||||
|  * | ||||
|  * 	 for( ;; ) | ||||
|  * 	 { | ||||
|  * 		// Perform task functionality here. | ||||
|  * | ||||
|  * 		// Set bit 0 in the event flag to note this task has reached the | ||||
|  * 		// sync point.  The other two tasks will set the other two bits defined | ||||
|  * 		// by ALL_SYNC_BITS.  All three tasks have reached the synchronisation | ||||
|  * 		// point when all the ALL_SYNC_BITS are set.  Wait a maximum of 100ms | ||||
|  * 		// for this to happen. | ||||
|  * 		uxReturn = xEventGroupSync( xEventBits, TASK_0_BIT, ALL_SYNC_BITS, xTicksToWait ); | ||||
|  * | ||||
|  * 		if( ( uxReturn & ALL_SYNC_BITS ) == ALL_SYNC_BITS ) | ||||
|  * 		{ | ||||
|  * 			// All three tasks reached the synchronisation point before the call | ||||
|  * 			// to xEventGroupSync() timed out. | ||||
|  * 		} | ||||
|  * 	  } | ||||
|  *  } | ||||
|  * | ||||
|  *  void vTask1( void *pvParameters ) | ||||
|  *  { | ||||
|  * 	 for( ;; ) | ||||
|  * 	 { | ||||
|  * 		// Perform task functionality here. | ||||
|  * | ||||
|  * 		// Set bit 1 in the event flag to note this task has reached the | ||||
|  * 		// synchronisation point.  The other two tasks will set the other two | ||||
|  * 		// bits defined by ALL_SYNC_BITS.  All three tasks have reached the | ||||
|  * 		// synchronisation point when all the ALL_SYNC_BITS are set.  Wait | ||||
|  * 		// indefinitely for this to happen. | ||||
|  * 		xEventGroupSync( xEventBits, TASK_1_BIT, ALL_SYNC_BITS, portMAX_DELAY ); | ||||
|  * | ||||
|  * 		// xEventGroupSync() was called with an indefinite block time, so | ||||
|  * 		// this task will only reach here if the syncrhonisation was made by all | ||||
|  * 		// three tasks, so there is no need to test the return value. | ||||
|  * 	 } | ||||
|  *  } | ||||
|  * | ||||
|  *  void vTask2( void *pvParameters ) | ||||
|  *  { | ||||
|  * 	 for( ;; ) | ||||
|  * 	 { | ||||
|  * 		// Perform task functionality here. | ||||
|  * | ||||
|  * 		// Set bit 2 in the event flag to note this task has reached the | ||||
|  * 		// synchronisation point.  The other two tasks will set the other two | ||||
|  * 		// bits defined by ALL_SYNC_BITS.  All three tasks have reached the | ||||
|  * 		// synchronisation point when all the ALL_SYNC_BITS are set.  Wait | ||||
|  * 		// indefinitely for this to happen. | ||||
|  * 		xEventGroupSync( xEventBits, TASK_2_BIT, ALL_SYNC_BITS, portMAX_DELAY ); | ||||
|  * | ||||
|  * 		// xEventGroupSync() was called with an indefinite block time, so | ||||
|  * 		// this task will only reach here if the syncrhonisation was made by all | ||||
|  * 		// three tasks, so there is no need to test the return value. | ||||
|  * 		} | ||||
|  *  } | ||||
|  * | ||||
|  * @endcode | ||||
|  * \ingroup EventGroup | ||||
|  */ | ||||
| EventBits_t xEventGroupSync( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToSet, const EventBits_t uxBitsToWaitFor, TickType_t xTicksToWait ) PRIVILEGED_FUNCTION; | ||||
|  | ||||
|  | ||||
| /** | ||||
|  * | ||||
|  * Returns the current value of the bits in an event group.  This function | ||||
|  * cannot be used from an interrupt. | ||||
|  * | ||||
|  * @param xEventGroup The event group being queried. | ||||
|  * | ||||
|  * @return The event group bits at the time xEventGroupGetBits() was called. | ||||
|  * | ||||
|  * \ingroup EventGroup | ||||
|  */ | ||||
| #define xEventGroupGetBits( xEventGroup ) xEventGroupClearBits( xEventGroup, 0 ) | ||||
|  | ||||
| /** | ||||
|  * | ||||
|  * A version of xEventGroupGetBits() that can be called from an ISR. | ||||
|  * | ||||
|  * @param xEventGroup The event group being queried. | ||||
|  * | ||||
|  * @return The event group bits at the time xEventGroupGetBitsFromISR() was called. | ||||
|  * | ||||
|  * \ingroup EventGroup | ||||
|  */ | ||||
| EventBits_t xEventGroupGetBitsFromISR( EventGroupHandle_t xEventGroup ) PRIVILEGED_FUNCTION; | ||||
|  | ||||
| /** | ||||
|  * Delete an event group that was previously created by a call to | ||||
|  * xEventGroupCreate().  Tasks that are blocked on the event group will be | ||||
|  * unblocked and obtain 0 as the event group's value. | ||||
|  * | ||||
|  * @param xEventGroup The event group being deleted. | ||||
|  */ | ||||
| void vEventGroupDelete( EventGroupHandle_t xEventGroup ) PRIVILEGED_FUNCTION; | ||||
|  | ||||
| /** @cond */ | ||||
|  | ||||
| /* For internal use only. */ | ||||
| void vEventGroupSetBitsCallback( void *pvEventGroup, const uint32_t ulBitsToSet ) PRIVILEGED_FUNCTION; | ||||
| void vEventGroupClearBitsCallback( void *pvEventGroup, const uint32_t ulBitsToClear ) PRIVILEGED_FUNCTION; | ||||
|  | ||||
|  | ||||
| #if (configUSE_TRACE_FACILITY == 1) | ||||
| 	UBaseType_t uxEventGroupGetNumber( void* xEventGroup ) PRIVILEGED_FUNCTION; | ||||
| 	void vEventGroupSetNumber( void* xEventGroup, UBaseType_t uxEventGroupNumber ) PRIVILEGED_FUNCTION; | ||||
| #endif | ||||
|  | ||||
| /** @endcond */ | ||||
|  | ||||
| #ifdef __cplusplus | ||||
| } | ||||
| #endif | ||||
|  | ||||
| #endif /* EVENT_GROUPS_H */ | ||||
							
								
								
									
										411
									
								
								tools/sdk/esp32c3/include/freertos/include/freertos/list.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										411
									
								
								tools/sdk/esp32c3/include/freertos/include/freertos/list.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,411 @@ | ||||
| /* | ||||
|  * FreeRTOS Kernel V10.2.1 | ||||
|  * Copyright (C) 2019 Amazon.com, Inc. or its affiliates.  All Rights Reserved. | ||||
|  * | ||||
|  * Permission is hereby granted, free of charge, to any person obtaining a copy of | ||||
|  * this software and associated documentation files (the "Software"), to deal in | ||||
|  * the Software without restriction, including without limitation the rights to | ||||
|  * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of | ||||
|  * the Software, and to permit persons to whom the Software is furnished to do so, | ||||
|  * subject to the following conditions: | ||||
|  * | ||||
|  * The above copyright notice and this permission notice shall be included in all | ||||
|  * copies or substantial portions of the Software. | ||||
|  * | ||||
|  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
|  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS | ||||
|  * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR | ||||
|  * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER | ||||
|  * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN | ||||
|  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. | ||||
|  * | ||||
|  * http://www.FreeRTOS.org | ||||
|  * http://aws.amazon.com/freertos | ||||
|  * | ||||
|  * 1 tab == 4 spaces! | ||||
|  */ | ||||
|  | ||||
| /* | ||||
|  * This is the list implementation used by the scheduler.  While it is tailored | ||||
|  * heavily for the schedulers needs, it is also available for use by | ||||
|  * application code. | ||||
|  * | ||||
|  * list_ts can only store pointers to list_item_ts.  Each ListItem_t contains a | ||||
|  * numeric value (xItemValue).  Most of the time the lists are sorted in | ||||
|  * descending item value order. | ||||
|  * | ||||
|  * Lists are created already containing one list item.  The value of this | ||||
|  * item is the maximum possible that can be stored, it is therefore always at | ||||
|  * the end of the list and acts as a marker.  The list member pxHead always | ||||
|  * points to this marker - even though it is at the tail of the list.  This | ||||
|  * is because the tail contains a wrap back pointer to the true head of | ||||
|  * the list. | ||||
|  * | ||||
|  * In addition to it's value, each list item contains a pointer to the next | ||||
|  * item in the list (pxNext), a pointer to the list it is in (pxContainer) | ||||
|  * and a pointer to back to the object that contains it.  These later two | ||||
|  * pointers are included for efficiency of list manipulation.  There is | ||||
|  * effectively a two way link between the object containing the list item and | ||||
|  * the list item itself. | ||||
|  * | ||||
|  * | ||||
|  * \page ListIntroduction List Implementation | ||||
|  * \ingroup FreeRTOSIntro | ||||
|  */ | ||||
|  | ||||
| #ifndef INC_FREERTOS_H | ||||
| 	#error FreeRTOS.h must be included before list.h | ||||
| #endif | ||||
|  | ||||
| #ifndef LIST_H | ||||
| #define LIST_H | ||||
|  | ||||
| /* | ||||
|  * The list structure members are modified from within interrupts, and therefore | ||||
|  * by rights should be declared volatile.  However, they are only modified in a | ||||
|  * functionally atomic way (within critical sections of with the scheduler | ||||
|  * suspended) and are either passed by reference into a function or indexed via | ||||
|  * a volatile variable.  Therefore, in all use cases tested so far, the volatile | ||||
|  * qualifier can be omitted in order to provide a moderate performance | ||||
|  * improvement without adversely affecting functional behaviour.  The assembly | ||||
|  * instructions generated by the IAR, ARM and GCC compilers when the respective | ||||
|  * compiler's options were set for maximum optimisation has been inspected and | ||||
|  * deemed to be as intended.  That said, as compiler technology advances, and | ||||
|  * especially if aggressive cross module optimisation is used (a use case that | ||||
|  * has not been exercised to any great extend) then it is feasible that the | ||||
|  * volatile qualifier will be needed for correct optimisation.  It is expected | ||||
|  * that a compiler removing essential code because, without the volatile | ||||
|  * qualifier on the list structure members and with aggressive cross module | ||||
|  * optimisation, the compiler deemed the code unnecessary will result in | ||||
|  * complete and obvious failure of the scheduler.  If this is ever experienced | ||||
|  * then the volatile qualifier can be inserted in the relevant places within the | ||||
|  * list structures by simply defining configLIST_VOLATILE to volatile in | ||||
|  * FreeRTOSConfig.h (as per the example at the bottom of this comment block). | ||||
|  * If configLIST_VOLATILE is not defined then the preprocessor directives below | ||||
|  * will simply #define configLIST_VOLATILE away completely. | ||||
|  * | ||||
|  * To use volatile list structure members then add the following line to | ||||
|  * FreeRTOSConfig.h (without the quotes): | ||||
|  * "#define configLIST_VOLATILE volatile" | ||||
|  */ | ||||
| #ifndef configLIST_VOLATILE | ||||
| 	#define configLIST_VOLATILE | ||||
| #endif /* configSUPPORT_CROSS_MODULE_OPTIMISATION */ | ||||
|  | ||||
| #ifdef __cplusplus | ||||
| extern "C" { | ||||
| #endif | ||||
|  | ||||
| /* Macros that can be used to place known values within the list structures, | ||||
| then check that the known values do not get corrupted during the execution of | ||||
| the application.   These may catch the list data structures being overwritten in | ||||
| memory.  They will not catch data errors caused by incorrect configuration or | ||||
| use of FreeRTOS.*/ | ||||
| #if( configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES == 0 ) | ||||
| 	/* Define the macros to do nothing. */ | ||||
| 	#define listFIRST_LIST_ITEM_INTEGRITY_CHECK_VALUE | ||||
| 	#define listSECOND_LIST_ITEM_INTEGRITY_CHECK_VALUE | ||||
| 	#define listFIRST_LIST_INTEGRITY_CHECK_VALUE | ||||
| 	#define listSECOND_LIST_INTEGRITY_CHECK_VALUE | ||||
| 	#define listSET_FIRST_LIST_ITEM_INTEGRITY_CHECK_VALUE( pxItem ) | ||||
| 	#define listSET_SECOND_LIST_ITEM_INTEGRITY_CHECK_VALUE( pxItem ) | ||||
| 	#define listSET_LIST_INTEGRITY_CHECK_1_VALUE( pxList ) | ||||
| 	#define listSET_LIST_INTEGRITY_CHECK_2_VALUE( pxList ) | ||||
| 	#define listTEST_LIST_ITEM_INTEGRITY( pxItem ) | ||||
| 	#define listTEST_LIST_INTEGRITY( pxList ) | ||||
| #else | ||||
| 	/* Define macros that add new members into the list structures. */ | ||||
| 	#define listFIRST_LIST_ITEM_INTEGRITY_CHECK_VALUE				TickType_t xListItemIntegrityValue1; | ||||
| 	#define listSECOND_LIST_ITEM_INTEGRITY_CHECK_VALUE				TickType_t xListItemIntegrityValue2; | ||||
| 	#define listFIRST_LIST_INTEGRITY_CHECK_VALUE					TickType_t xListIntegrityValue1; | ||||
| 	#define listSECOND_LIST_INTEGRITY_CHECK_VALUE					TickType_t xListIntegrityValue2; | ||||
|  | ||||
| 	/* Define macros that set the new structure members to known values. */ | ||||
| 	#define listSET_FIRST_LIST_ITEM_INTEGRITY_CHECK_VALUE( pxItem )		( pxItem )->xListItemIntegrityValue1 = pdINTEGRITY_CHECK_VALUE | ||||
| 	#define listSET_SECOND_LIST_ITEM_INTEGRITY_CHECK_VALUE( pxItem )	( pxItem )->xListItemIntegrityValue2 = pdINTEGRITY_CHECK_VALUE | ||||
| 	#define listSET_LIST_INTEGRITY_CHECK_1_VALUE( pxList )		( pxList )->xListIntegrityValue1 = pdINTEGRITY_CHECK_VALUE | ||||
| 	#define listSET_LIST_INTEGRITY_CHECK_2_VALUE( pxList )		( pxList )->xListIntegrityValue2 = pdINTEGRITY_CHECK_VALUE | ||||
|  | ||||
| 	/* Define macros that will assert if one of the structure members does not | ||||
| 	contain its expected value. */ | ||||
| 	#define listTEST_LIST_ITEM_INTEGRITY( pxItem )		configASSERT( ( ( pxItem )->xListItemIntegrityValue1 == pdINTEGRITY_CHECK_VALUE ) && ( ( pxItem )->xListItemIntegrityValue2 == pdINTEGRITY_CHECK_VALUE ) ) | ||||
| 	#define listTEST_LIST_INTEGRITY( pxList )			configASSERT( ( ( pxList )->xListIntegrityValue1 == pdINTEGRITY_CHECK_VALUE ) && ( ( pxList )->xListIntegrityValue2 == pdINTEGRITY_CHECK_VALUE ) ) | ||||
| #endif /* configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES */ | ||||
|  | ||||
|  | ||||
| /* | ||||
|  * Definition of the only type of object that a list can contain. | ||||
|  */ | ||||
| struct xLIST; | ||||
| struct xLIST_ITEM | ||||
| { | ||||
| 	listFIRST_LIST_ITEM_INTEGRITY_CHECK_VALUE			/*< Set to a known value if configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES is set to 1. */ | ||||
| 	configLIST_VOLATILE TickType_t xItemValue;			/*< The value being listed.  In most cases this is used to sort the list in descending order. */ | ||||
| 	struct xLIST_ITEM * configLIST_VOLATILE pxNext;		/*< Pointer to the next ListItem_t in the list. */ | ||||
| 	struct xLIST_ITEM * configLIST_VOLATILE pxPrevious;	/*< Pointer to the previous ListItem_t in the list. */ | ||||
| 	void * pvOwner;										/*< Pointer to the object (normally a TCB) that contains the list item.  There is therefore a two way link between the object containing the list item and the list item itself. */ | ||||
| 	struct xLIST * configLIST_VOLATILE pxContainer;		/*< Pointer to the list in which this list item is placed (if any). */ | ||||
| 	listSECOND_LIST_ITEM_INTEGRITY_CHECK_VALUE			/*< Set to a known value if configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES is set to 1. */ | ||||
| }; | ||||
| typedef struct xLIST_ITEM ListItem_t;					/* For some reason lint wants this as two separate definitions. */ | ||||
|  | ||||
| struct xMINI_LIST_ITEM | ||||
| { | ||||
| 	listFIRST_LIST_ITEM_INTEGRITY_CHECK_VALUE			/*< Set to a known value if configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES is set to 1. */ | ||||
| 	configLIST_VOLATILE TickType_t xItemValue; | ||||
| 	struct xLIST_ITEM * configLIST_VOLATILE pxNext; | ||||
| 	struct xLIST_ITEM * configLIST_VOLATILE pxPrevious; | ||||
| }; | ||||
| typedef struct xMINI_LIST_ITEM MiniListItem_t; | ||||
|  | ||||
| /* | ||||
|  * Definition of the type of queue used by the scheduler. | ||||
|  */ | ||||
| typedef struct xLIST | ||||
| { | ||||
| 	listFIRST_LIST_INTEGRITY_CHECK_VALUE				/*< Set to a known value if configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES is set to 1. */ | ||||
| 	volatile UBaseType_t uxNumberOfItems; | ||||
| 	ListItem_t * configLIST_VOLATILE pxIndex;			/*< Used to walk through the list.  Points to the last item returned by a call to listGET_OWNER_OF_NEXT_ENTRY (). */ | ||||
| 	MiniListItem_t xListEnd;							/*< List item that contains the maximum possible item value meaning it is always at the end of the list and is therefore used as a marker. */ | ||||
| 	listSECOND_LIST_INTEGRITY_CHECK_VALUE				/*< Set to a known value if configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES is set to 1. */ | ||||
| } List_t; | ||||
|  | ||||
| /* | ||||
|  * Access macro to set the owner of a list item.  The owner of a list item | ||||
|  * is the object (usually a TCB) that contains the list item. | ||||
|  * | ||||
|  * \page listSET_LIST_ITEM_OWNER listSET_LIST_ITEM_OWNER | ||||
|  * \ingroup LinkedList | ||||
|  */ | ||||
| #define listSET_LIST_ITEM_OWNER( pxListItem, pxOwner )		( ( pxListItem )->pvOwner = ( void * ) ( pxOwner ) ) | ||||
|  | ||||
| /* | ||||
|  * Access macro to get the owner of a list item.  The owner of a list item | ||||
|  * is the object (usually a TCB) that contains the list item. | ||||
|  * | ||||
|  * \page listGET_LIST_ITEM_OWNER listSET_LIST_ITEM_OWNER | ||||
|  * \ingroup LinkedList | ||||
|  */ | ||||
| #define listGET_LIST_ITEM_OWNER( pxListItem )	( ( pxListItem )->pvOwner ) | ||||
|  | ||||
| /* | ||||
|  * Access macro to set the value of the list item.  In most cases the value is | ||||
|  * used to sort the list in descending order. | ||||
|  * | ||||
|  * \page listSET_LIST_ITEM_VALUE listSET_LIST_ITEM_VALUE | ||||
|  * \ingroup LinkedList | ||||
|  */ | ||||
| #define listSET_LIST_ITEM_VALUE( pxListItem, xValue )	( ( pxListItem )->xItemValue = ( xValue ) ) | ||||
|  | ||||
| /* | ||||
|  * Access macro to retrieve the value of the list item.  The value can | ||||
|  * represent anything - for example the priority of a task, or the time at | ||||
|  * which a task should be unblocked. | ||||
|  * | ||||
|  * \page listGET_LIST_ITEM_VALUE listGET_LIST_ITEM_VALUE | ||||
|  * \ingroup LinkedList | ||||
|  */ | ||||
| #define listGET_LIST_ITEM_VALUE( pxListItem )	( ( pxListItem )->xItemValue ) | ||||
|  | ||||
| /* | ||||
|  * Access macro to retrieve the value of the list item at the head of a given | ||||
|  * list. | ||||
|  * | ||||
|  * \page listGET_LIST_ITEM_VALUE listGET_LIST_ITEM_VALUE | ||||
|  * \ingroup LinkedList | ||||
|  */ | ||||
| #define listGET_ITEM_VALUE_OF_HEAD_ENTRY( pxList )	( ( ( pxList )->xListEnd ).pxNext->xItemValue ) | ||||
|  | ||||
| /* | ||||
|  * Return the list item at the head of the list. | ||||
|  * | ||||
|  * \page listGET_HEAD_ENTRY listGET_HEAD_ENTRY | ||||
|  * \ingroup LinkedList | ||||
|  */ | ||||
| #define listGET_HEAD_ENTRY( pxList )	( ( ( pxList )->xListEnd ).pxNext ) | ||||
|  | ||||
| /* | ||||
|  * Return the next list item. | ||||
|  * | ||||
|  * \page listGET_NEXT listGET_NEXT | ||||
|  * \ingroup LinkedList | ||||
|  */ | ||||
| #define listGET_NEXT( pxListItem )	( ( pxListItem )->pxNext ) | ||||
|  | ||||
| /* | ||||
|  * Return the list item that marks the end of the list | ||||
|  * | ||||
|  * \page listGET_END_MARKER listGET_END_MARKER | ||||
|  * \ingroup LinkedList | ||||
|  */ | ||||
| #define listGET_END_MARKER( pxList )	( ( ListItem_t const * ) ( &( ( pxList )->xListEnd ) ) ) | ||||
|  | ||||
| /* | ||||
|  * Access macro to determine if a list contains any items.  The macro will | ||||
|  * only have the value true if the list is empty. | ||||
|  * | ||||
|  * \page listLIST_IS_EMPTY listLIST_IS_EMPTY | ||||
|  * \ingroup LinkedList | ||||
|  */ | ||||
| #define listLIST_IS_EMPTY( pxList )	( ( ( pxList )->uxNumberOfItems == ( UBaseType_t ) 0 ) ? pdTRUE : pdFALSE ) | ||||
|  | ||||
| /* | ||||
|  * Access macro to return the number of items in the list. | ||||
|  */ | ||||
| #define listCURRENT_LIST_LENGTH( pxList )	( ( pxList )->uxNumberOfItems ) | ||||
|  | ||||
| /* | ||||
|  * Access function to obtain the owner of the next entry in a list. | ||||
|  * | ||||
|  * The list member pxIndex is used to walk through a list.  Calling | ||||
|  * listGET_OWNER_OF_NEXT_ENTRY increments pxIndex to the next item in the list | ||||
|  * and returns that entry's pxOwner parameter.  Using multiple calls to this | ||||
|  * function it is therefore possible to move through every item contained in | ||||
|  * a list. | ||||
|  * | ||||
|  * The pxOwner parameter of a list item is a pointer to the object that owns | ||||
|  * the list item.  In the scheduler this is normally a task control block. | ||||
|  * The pxOwner parameter effectively creates a two way link between the list | ||||
|  * item and its owner. | ||||
|  * | ||||
|  * @param pxTCB pxTCB is set to the address of the owner of the next list item. | ||||
|  * @param pxList The list from which the next item owner is to be returned. | ||||
|  * | ||||
|  * \page listGET_OWNER_OF_NEXT_ENTRY listGET_OWNER_OF_NEXT_ENTRY | ||||
|  * \ingroup LinkedList | ||||
|  */ | ||||
| #define listGET_OWNER_OF_NEXT_ENTRY( pxTCB, pxList )										\ | ||||
| {																							\ | ||||
| List_t * const pxConstList = ( pxList );													\ | ||||
| 	/* Increment the index to the next item and return the item, ensuring */				\ | ||||
| 	/* we don't return the marker used at the end of the list.  */							\ | ||||
| 	( pxConstList )->pxIndex = ( pxConstList )->pxIndex->pxNext;							\ | ||||
| 	if( ( void * ) ( pxConstList )->pxIndex == ( void * ) &( ( pxConstList )->xListEnd ) )	\ | ||||
| 	{																						\ | ||||
| 		( pxConstList )->pxIndex = ( pxConstList )->pxIndex->pxNext;						\ | ||||
| 	}																						\ | ||||
| 	( pxTCB ) = ( pxConstList )->pxIndex->pvOwner;											\ | ||||
| } | ||||
|  | ||||
|  | ||||
| /* | ||||
|  * Access function to obtain the owner of the first entry in a list.  Lists | ||||
|  * are normally sorted in ascending item value order. | ||||
|  * | ||||
|  * This function returns the pxOwner member of the first item in the list. | ||||
|  * The pxOwner parameter of a list item is a pointer to the object that owns | ||||
|  * the list item.  In the scheduler this is normally a task control block. | ||||
|  * The pxOwner parameter effectively creates a two way link between the list | ||||
|  * item and its owner. | ||||
|  * | ||||
|  * @param pxList The list from which the owner of the head item is to be | ||||
|  * returned. | ||||
|  * | ||||
|  * \page listGET_OWNER_OF_HEAD_ENTRY listGET_OWNER_OF_HEAD_ENTRY | ||||
|  * \ingroup LinkedList | ||||
|  */ | ||||
| #define listGET_OWNER_OF_HEAD_ENTRY( pxList )  ( (&( ( pxList )->xListEnd ))->pxNext->pvOwner ) | ||||
|  | ||||
| /* | ||||
|  * Check to see if a list item is within a list.  The list item maintains a | ||||
|  * "container" pointer that points to the list it is in.  All this macro does | ||||
|  * is check to see if the container and the list match. | ||||
|  * | ||||
|  * @param pxList The list we want to know if the list item is within. | ||||
|  * @param pxListItem The list item we want to know if is in the list. | ||||
|  * @return pdTRUE if the list item is in the list, otherwise pdFALSE. | ||||
|  */ | ||||
| #define listIS_CONTAINED_WITHIN( pxList, pxListItem ) ( ( ( pxListItem )->pxContainer == ( pxList ) ) ? ( pdTRUE ) : ( pdFALSE ) ) | ||||
|  | ||||
| /* | ||||
|  * Return the list a list item is contained within (referenced from). | ||||
|  * | ||||
|  * @param pxListItem The list item being queried. | ||||
|  * @return A pointer to the List_t object that references the pxListItem | ||||
|  */ | ||||
| #define listLIST_ITEM_CONTAINER( pxListItem ) ( ( pxListItem )->pxContainer ) | ||||
|  | ||||
| /* | ||||
|  * This provides a crude means of knowing if a list has been initialised, as | ||||
|  * pxList->xListEnd.xItemValue is set to portMAX_DELAY by the vListInitialise() | ||||
|  * function. | ||||
|  */ | ||||
| #define listLIST_IS_INITIALISED( pxList ) ( ( pxList )->xListEnd.xItemValue == portMAX_DELAY ) | ||||
|  | ||||
| /* | ||||
|  * Must be called before a list is used!  This initialises all the members | ||||
|  * of the list structure and inserts the xListEnd item into the list as a | ||||
|  * marker to the back of the list. | ||||
|  * | ||||
|  * @param pxList Pointer to the list being initialised. | ||||
|  * | ||||
|  * \page vListInitialise vListInitialise | ||||
|  * \ingroup LinkedList | ||||
|  */ | ||||
| void vListInitialise( List_t * const pxList ) PRIVILEGED_FUNCTION; | ||||
|  | ||||
| /* | ||||
|  * Must be called before a list item is used.  This sets the list container to | ||||
|  * null so the item does not think that it is already contained in a list. | ||||
|  * | ||||
|  * @param pxItem Pointer to the list item being initialised. | ||||
|  * | ||||
|  * \page vListInitialiseItem vListInitialiseItem | ||||
|  * \ingroup LinkedList | ||||
|  */ | ||||
| void vListInitialiseItem( ListItem_t * const pxItem ) PRIVILEGED_FUNCTION; | ||||
|  | ||||
| /* | ||||
|  * Insert a list item into a list.  The item will be inserted into the list in | ||||
|  * a position determined by its item value (descending item value order). | ||||
|  * | ||||
|  * @param pxList The list into which the item is to be inserted. | ||||
|  * | ||||
|  * @param pxNewListItem The item that is to be placed in the list. | ||||
|  * | ||||
|  * \page vListInsert vListInsert | ||||
|  * \ingroup LinkedList | ||||
|  */ | ||||
| void vListInsert( List_t * const pxList, ListItem_t * const pxNewListItem ) PRIVILEGED_FUNCTION; | ||||
|  | ||||
| /* | ||||
|  * Insert a list item into a list.  The item will be inserted in a position | ||||
|  * such that it will be the last item within the list returned by multiple | ||||
|  * calls to listGET_OWNER_OF_NEXT_ENTRY. | ||||
|  * | ||||
|  * The list member pxIndex is used to walk through a list.  Calling | ||||
|  * listGET_OWNER_OF_NEXT_ENTRY increments pxIndex to the next item in the list. | ||||
|  * Placing an item in a list using vListInsertEnd effectively places the item | ||||
|  * in the list position pointed to by pxIndex.  This means that every other | ||||
|  * item within the list will be returned by listGET_OWNER_OF_NEXT_ENTRY before | ||||
|  * the pxIndex parameter again points to the item being inserted. | ||||
|  * | ||||
|  * @param pxList The list into which the item is to be inserted. | ||||
|  * | ||||
|  * @param pxNewListItem The list item to be inserted into the list. | ||||
|  * | ||||
|  * \page vListInsertEnd vListInsertEnd | ||||
|  * \ingroup LinkedList | ||||
|  */ | ||||
| void vListInsertEnd( List_t * const pxList, ListItem_t * const pxNewListItem ) PRIVILEGED_FUNCTION; | ||||
|  | ||||
| /* | ||||
|  * Remove an item from a list.  The list item has a pointer to the list that | ||||
|  * it is in, so only the list item need be passed into the function. | ||||
|  * | ||||
|  * @param uxListRemove The item to be removed.  The item will remove itself from | ||||
|  * the list pointed to by it's pxContainer parameter. | ||||
|  * | ||||
|  * @return The number of items that remain in the list after the list item has | ||||
|  * been removed. | ||||
|  * | ||||
|  * \page uxListRemove uxListRemove | ||||
|  * \ingroup LinkedList | ||||
|  */ | ||||
| UBaseType_t uxListRemove( ListItem_t * const pxItemToRemove ) PRIVILEGED_FUNCTION; | ||||
|  | ||||
| #ifdef __cplusplus | ||||
| } | ||||
| #endif | ||||
|  | ||||
| #endif | ||||
| @@ -0,0 +1,702 @@ | ||||
| /* | ||||
|  * FreeRTOS Kernel V10.2.1 | ||||
|  * Copyright (C) 2019 Amazon.com, Inc. or its affiliates.  All Rights Reserved. | ||||
|  * | ||||
|  * Permission is hereby granted, free of charge, to any person obtaining a copy of | ||||
|  * this software and associated documentation files (the "Software"), to deal in | ||||
|  * the Software without restriction, including without limitation the rights to | ||||
|  * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of | ||||
|  * the Software, and to permit persons to whom the Software is furnished to do so, | ||||
|  * subject to the following conditions: | ||||
|  * | ||||
|  * The above copyright notice and this permission notice shall be included in all | ||||
|  * copies or substantial portions of the Software. | ||||
|  * | ||||
|  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
|  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS | ||||
|  * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR | ||||
|  * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER | ||||
|  * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN | ||||
|  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. | ||||
|  * | ||||
|  * http://www.FreeRTOS.org | ||||
|  * http://aws.amazon.com/freertos | ||||
|  * | ||||
|  * 1 tab == 4 spaces! | ||||
|  */ | ||||
|  | ||||
|  | ||||
| /* | ||||
|  * Message buffers build functionality on top of FreeRTOS stream buffers. | ||||
|  * Whereas stream buffers are used to send a continuous stream of data from one | ||||
|  * task or interrupt to another, message buffers are used to send variable | ||||
|  * length discrete messages from one task or interrupt to another.  Their | ||||
|  * implementation is light weight, making them particularly suited for interrupt | ||||
|  * to task and core to core communication scenarios. | ||||
|  * | ||||
|  * ***NOTE***:  Uniquely among FreeRTOS objects, the stream buffer | ||||
|  * implementation (so also the message buffer implementation, as message buffers | ||||
|  * are built on top of stream buffers) assumes there is only one task or | ||||
|  * interrupt that will write to the buffer (the writer), and only one task or | ||||
|  * interrupt that will read from the buffer (the reader).  It is safe for the | ||||
|  * writer and reader to be different tasks or interrupts, but, unlike other | ||||
|  * FreeRTOS objects, it is not safe to have multiple different writers or | ||||
|  * multiple different readers.  If there are to be multiple different writers | ||||
|  * then the application writer must place each call to a writing API function | ||||
|  * (such as xMessageBufferSend()) inside a critical section and set the send | ||||
|  * block time to 0.  Likewise, if there are to be multiple different readers | ||||
|  * then the application writer must place each call to a reading API function | ||||
|  * (such as xMessageBufferRead()) inside a critical section and set the receive | ||||
|  * timeout to 0. | ||||
|  * | ||||
|  * Message buffers hold variable length messages.  To enable that, when a | ||||
|  * message is written to the message buffer an additional sizeof( size_t ) bytes | ||||
|  * are also written to store the message's length (that happens internally, with | ||||
|  * the API function).  sizeof( size_t ) is typically 4 bytes on a 32-bit | ||||
|  * architecture, so writing a 10 byte message to a message buffer on a 32-bit | ||||
|  * architecture will actually reduce the available space in the message buffer | ||||
|  * by 14 bytes (10 byte are used by the message, and 4 bytes to hold the length | ||||
|  * of the message). | ||||
|  */ | ||||
|  | ||||
| #ifndef FREERTOS_MESSAGE_BUFFER_H | ||||
| #define FREERTOS_MESSAGE_BUFFER_H | ||||
|  | ||||
| #ifndef INC_FREERTOS_H | ||||
| 	#error "include FreeRTOS.h must appear in source files before include message_buffer.h" | ||||
| #endif | ||||
|  | ||||
| /* Message buffers are built onto of stream buffers. */ | ||||
| #include "stream_buffer.h" | ||||
|  | ||||
| #if defined( __cplusplus ) | ||||
| extern "C" { | ||||
| #endif | ||||
|  | ||||
| /** | ||||
|  * Type by which message buffers are referenced.  For example, a call to | ||||
|  * xMessageBufferCreate() returns an MessageBufferHandle_t variable that can | ||||
|  * then be used as a parameter to xMessageBufferSend(), xMessageBufferReceive(), | ||||
|  * etc. | ||||
|  */ | ||||
| typedef void * MessageBufferHandle_t; | ||||
|  | ||||
| /*-----------------------------------------------------------*/ | ||||
|  | ||||
| /** | ||||
|  * Creates a new message buffer using dynamically allocated memory.  See | ||||
|  * xMessageBufferCreateStatic() for a version that uses statically allocated | ||||
|  * memory (memory that is allocated at compile time). | ||||
|  * | ||||
|  * configSUPPORT_DYNAMIC_ALLOCATION must be set to 1 or left undefined in | ||||
|  * FreeRTOSConfig.h for xMessageBufferCreate() to be available. | ||||
|  * | ||||
|  * @param xBufferSizeBytes The total number of bytes (not messages) the message | ||||
|  * buffer will be able to hold at any one time.  When a message is written to | ||||
|  * the message buffer an additional sizeof( size_t ) bytes are also written to | ||||
|  * store the message's length.  sizeof( size_t ) is typically 4 bytes on a | ||||
|  * 32-bit architecture, so on most 32-bit architectures a 10 byte message will | ||||
|  * take up 14 bytes of message buffer space. | ||||
|  * | ||||
|  * @return If NULL is returned, then the message buffer cannot be created | ||||
|  * because there is insufficient heap memory available for FreeRTOS to allocate | ||||
|  * the message buffer data structures and storage area.  A non-NULL value being | ||||
|  * returned indicates that the message buffer has been created successfully - | ||||
|  * the returned value should be stored as the handle to the created message | ||||
|  * buffer. | ||||
|  * | ||||
|  * Example use: | ||||
|  * @code{c} | ||||
|  * | ||||
|  * void vAFunction( void ) | ||||
|  * { | ||||
|  * MessageBufferHandle_t xMessageBuffer; | ||||
|  * const size_t xMessageBufferSizeBytes = 100; | ||||
|  * | ||||
|  *   // Create a message buffer that can hold 100 bytes.  The memory used to hold | ||||
|  *   // both the message buffer structure and the messages themselves is allocated | ||||
|  *   // dynamically.  Each message added to the buffer consumes an additional 4 | ||||
|  *   // bytes which are used to hold the lengh of the message. | ||||
|  *   xMessageBuffer = xMessageBufferCreate( xMessageBufferSizeBytes ); | ||||
|  * | ||||
|  *   if( xMessageBuffer == NULL ) | ||||
|  *   { | ||||
|  *       // There was not enough heap memory space available to create the | ||||
|  *       // message buffer. | ||||
|  *   } | ||||
|  *   else | ||||
|  *   { | ||||
|  *       // The message buffer was created successfully and can now be used. | ||||
|  *   } | ||||
|  * | ||||
|  * @endcode | ||||
|  * \ingroup MessageBufferManagement | ||||
|  */ | ||||
| #define xMessageBufferCreate( xBufferSizeBytes ) ( MessageBufferHandle_t ) xStreamBufferGenericCreate( xBufferSizeBytes, ( size_t ) 0, pdTRUE ) | ||||
|  | ||||
| /** | ||||
|  * Creates a new message buffer using statically allocated memory.  See | ||||
|  * xMessageBufferCreate() for a version that uses dynamically allocated memory. | ||||
|  * | ||||
|  * @param xBufferSizeBytes The size, in bytes, of the buffer pointed to by the | ||||
|  * pucMessageBufferStorageArea parameter.  When a message is written to the | ||||
|  * message buffer an additional sizeof( size_t ) bytes are also written to store | ||||
|  * the message's length.  sizeof( size_t ) is typically 4 bytes on a 32-bit | ||||
|  * architecture, so on most 32-bit architecture a 10 byte message will take up | ||||
|  * 14 bytes of message buffer space.  The maximum number of bytes that can be | ||||
|  * stored in the message buffer is actually (xBufferSizeBytes - 1). | ||||
|  * | ||||
|  * @param pucMessageBufferStorageArea Must point to a uint8_t array that is at | ||||
|  * least xBufferSizeBytes + 1 big.  This is the array to which messages are | ||||
|  * copied when they are written to the message buffer. | ||||
|  * | ||||
|  * @param pxStaticMessageBuffer Must point to a variable of type | ||||
|  * StaticMessageBuffer_t, which will be used to hold the message buffer's data | ||||
|  * structure. | ||||
|  * | ||||
|  * @return If the message buffer is created successfully then a handle to the | ||||
|  * created message buffer is returned. If either pucMessageBufferStorageArea or | ||||
|  * pxStaticmessageBuffer are NULL then NULL is returned. | ||||
|  * | ||||
|  * Example use: | ||||
|  * @code{c} | ||||
|  * | ||||
|  * // Used to dimension the array used to hold the messages.  The available space | ||||
|  * // will actually be one less than this, so 999. | ||||
|  * #define STORAGE_SIZE_BYTES 1000 | ||||
|  * | ||||
|  * // Defines the memory that will actually hold the messages within the message | ||||
|  * // buffer. | ||||
|  * static uint8_t ucStorageBuffer[ STORAGE_SIZE_BYTES ]; | ||||
|  * | ||||
|  * // The variable used to hold the message buffer structure. | ||||
|  * StaticMessageBuffer_t xMessageBufferStruct; | ||||
|  * | ||||
|  * void MyFunction( void ) | ||||
|  * { | ||||
|  * MessageBufferHandle_t xMessageBuffer; | ||||
|  * | ||||
|  *   xMessageBuffer = xMessageBufferCreateStatic( sizeof( ucBufferStorage ), | ||||
|  *                                                ucBufferStorage, | ||||
|  *                                                &xMessageBufferStruct ); | ||||
|  * | ||||
|  *   // As neither the pucMessageBufferStorageArea or pxStaticMessageBuffer | ||||
|  *   // parameters were NULL, xMessageBuffer will not be NULL, and can be used to | ||||
|  *   // reference the created message buffer in other message buffer API calls. | ||||
|  * | ||||
|  *   // Other code that uses the message buffer can go here. | ||||
|  * } | ||||
|  * | ||||
|  * @endcode | ||||
|  * \ingroup MessageBufferManagement | ||||
|  */ | ||||
| #define xMessageBufferCreateStatic( xBufferSizeBytes, pucMessageBufferStorageArea, pxStaticMessageBuffer ) ( MessageBufferHandle_t ) xStreamBufferGenericCreateStatic( xBufferSizeBytes, 0, pdTRUE, pucMessageBufferStorageArea, pxStaticMessageBuffer ) | ||||
|  | ||||
| /** | ||||
|  * Sends a discrete message to the message buffer.  The message can be any | ||||
|  * length that fits within the buffer's free space, and is copied into the | ||||
|  * buffer. | ||||
|  * | ||||
|  * ***NOTE***:  Uniquely among FreeRTOS objects, the stream buffer | ||||
|  * implementation (so also the message buffer implementation, as message buffers | ||||
|  * are built on top of stream buffers) assumes there is only one task or | ||||
|  * interrupt that will write to the buffer (the writer), and only one task or | ||||
|  * interrupt that will read from the buffer (the reader).  It is safe for the | ||||
|  * writer and reader to be different tasks or interrupts, but, unlike other | ||||
|  * FreeRTOS objects, it is not safe to have multiple different writers or | ||||
|  * multiple different readers.  If there are to be multiple different writers | ||||
|  * then the application writer must place each call to a writing API function | ||||
|  * (such as xMessageBufferSend()) inside a critical section and set the send | ||||
|  * block time to 0.  Likewise, if there are to be multiple different readers | ||||
|  * then the application writer must place each call to a reading API function | ||||
|  * (such as xMessageBufferRead()) inside a critical section and set the receive | ||||
|  * block time to 0. | ||||
|  * | ||||
|  * Use xMessageBufferSend() to write to a message buffer from a task.  Use | ||||
|  * xMessageBufferSendFromISR() to write to a message buffer from an interrupt | ||||
|  * service routine (ISR). | ||||
|  * | ||||
|  * @param xMessageBuffer The handle of the message buffer to which a message is | ||||
|  * being sent. | ||||
|  * | ||||
|  * @param pvTxData A pointer to the message that is to be copied into the | ||||
|  * message buffer. | ||||
|  * | ||||
|  * @param xDataLengthBytes The length of the message.  That is, the number of | ||||
|  * bytes to copy from pvTxData into the message buffer.  When a message is | ||||
|  * written to the message buffer an additional sizeof( size_t ) bytes are also | ||||
|  * written to store the message's length.  sizeof( size_t ) is typically 4 bytes | ||||
|  * on a 32-bit architecture, so on most 32-bit architecture setting | ||||
|  * xDataLengthBytes to 20 will reduce the free space in the message buffer by 24 | ||||
|  * bytes (20 bytes of message data and 4 bytes to hold the message length). | ||||
|  * | ||||
|  * @param xTicksToWait The maximum amount of time the calling task should remain | ||||
|  * in the Blocked state to wait for enough space to become available in the | ||||
|  * message buffer, should the message buffer have insufficient space when | ||||
|  * xMessageBufferSend() is called.  The calling task will never block if | ||||
|  * xTicksToWait is zero.  The block time is specified in tick periods, so the | ||||
|  * absolute time it represents is dependent on the tick frequency.  The macro | ||||
|  * pdMS_TO_TICKS() can be used to convert a time specified in milliseconds into | ||||
|  * a time specified in ticks.  Setting xTicksToWait to portMAX_DELAY will cause | ||||
|  * the task to wait indefinitely (without timing out), provided | ||||
|  * INCLUDE_vTaskSuspend is set to 1 in FreeRTOSConfig.h.  Tasks do not use any | ||||
|  * CPU time when they are in the Blocked state. | ||||
|  * | ||||
|  * @return The number of bytes written to the message buffer.  If the call to | ||||
|  * xMessageBufferSend() times out before there was enough space to write the | ||||
|  * message into the message buffer then zero is returned.  If the call did not | ||||
|  * time out then xDataLengthBytes is returned. | ||||
|  * | ||||
|  * Example use: | ||||
|  * @code{c} | ||||
|  * void vAFunction( MessageBufferHandle_t xMessageBuffer ) | ||||
|  * { | ||||
|  * size_t xBytesSent; | ||||
|  * uint8_t ucArrayToSend[] = { 0, 1, 2, 3 }; | ||||
|  * char *pcStringToSend = "String to send"; | ||||
|  * const TickType_t x100ms = pdMS_TO_TICKS( 100 ); | ||||
|  * | ||||
|  *   // Send an array to the message buffer, blocking for a maximum of 100ms to | ||||
|  *   // wait for enough space to be available in the message buffer. | ||||
|  *   xBytesSent = xMessageBufferSend( xMessageBuffer, ( void * ) ucArrayToSend, sizeof( ucArrayToSend ), x100ms ); | ||||
|  * | ||||
|  *   if( xBytesSent != sizeof( ucArrayToSend ) ) | ||||
|  *   { | ||||
|  *       // The call to xMessageBufferSend() times out before there was enough | ||||
|  *       // space in the buffer for the data to be written. | ||||
|  *   } | ||||
|  * | ||||
|  *   // Send the string to the message buffer.  Return immediately if there is | ||||
|  *   // not enough space in the buffer. | ||||
|  *   xBytesSent = xMessageBufferSend( xMessageBuffer, ( void * ) pcStringToSend, strlen( pcStringToSend ), 0 ); | ||||
|  * | ||||
|  *   if( xBytesSent != strlen( pcStringToSend ) ) | ||||
|  *   { | ||||
|  *       // The string could not be added to the message buffer because there was | ||||
|  *       // not enough free space in the buffer. | ||||
|  *   } | ||||
|  * } | ||||
|  * @endcode | ||||
|  * \ingroup MessageBufferManagement | ||||
|  */ | ||||
| #define xMessageBufferSend( xMessageBuffer, pvTxData, xDataLengthBytes, xTicksToWait ) xStreamBufferSend( ( StreamBufferHandle_t ) xMessageBuffer, pvTxData, xDataLengthBytes, xTicksToWait ) | ||||
|  | ||||
| /** | ||||
|  * Interrupt safe version of the API function that sends a discrete message to | ||||
|  * the message buffer.  The message can be any length that fits within the | ||||
|  * buffer's free space, and is copied into the buffer. | ||||
|  * | ||||
|  * ***NOTE***:  Uniquely among FreeRTOS objects, the stream buffer | ||||
|  * implementation (so also the message buffer implementation, as message buffers | ||||
|  * are built on top of stream buffers) assumes there is only one task or | ||||
|  * interrupt that will write to the buffer (the writer), and only one task or | ||||
|  * interrupt that will read from the buffer (the reader).  It is safe for the | ||||
|  * writer and reader to be different tasks or interrupts, but, unlike other | ||||
|  * FreeRTOS objects, it is not safe to have multiple different writers or | ||||
|  * multiple different readers.  If there are to be multiple different writers | ||||
|  * then the application writer must place each call to a writing API function | ||||
|  * (such as xMessageBufferSend()) inside a critical section and set the send | ||||
|  * block time to 0.  Likewise, if there are to be multiple different readers | ||||
|  * then the application writer must place each call to a reading API function | ||||
|  * (such as xMessageBufferRead()) inside a critical section and set the receive | ||||
|  * block time to 0. | ||||
|  * | ||||
|  * Use xMessageBufferSend() to write to a message buffer from a task.  Use | ||||
|  * xMessageBufferSendFromISR() to write to a message buffer from an interrupt | ||||
|  * service routine (ISR). | ||||
|  * | ||||
|  * @param xMessageBuffer The handle of the message buffer to which a message is | ||||
|  * being sent. | ||||
|  * | ||||
|  * @param pvTxData A pointer to the message that is to be copied into the | ||||
|  * message buffer. | ||||
|  * | ||||
|  * @param xDataLengthBytes The length of the message.  That is, the number of | ||||
|  * bytes to copy from pvTxData into the message buffer.  When a message is | ||||
|  * written to the message buffer an additional sizeof( size_t ) bytes are also | ||||
|  * written to store the message's length.  sizeof( size_t ) is typically 4 bytes | ||||
|  * on a 32-bit architecture, so on most 32-bit architecture setting | ||||
|  * xDataLengthBytes to 20 will reduce the free space in the message buffer by 24 | ||||
|  * bytes (20 bytes of message data and 4 bytes to hold the message length). | ||||
|  * | ||||
|  * @param pxHigherPriorityTaskWoken  It is possible that a message buffer will | ||||
|  * have a task blocked on it waiting for data.  Calling | ||||
|  * xMessageBufferSendFromISR() can make data available, and so cause a task that | ||||
|  * was waiting for data to leave the Blocked state.  If calling | ||||
|  * xMessageBufferSendFromISR() causes a task to leave the Blocked state, and the | ||||
|  * unblocked task has a priority higher than the currently executing task (the | ||||
|  * task that was interrupted), then, internally, xMessageBufferSendFromISR() | ||||
|  * will set *pxHigherPriorityTaskWoken to pdTRUE.  If | ||||
|  * xMessageBufferSendFromISR() sets this value to pdTRUE, then normally a | ||||
|  * context switch should be performed before the interrupt is exited.  This will | ||||
|  * ensure that the interrupt returns directly to the highest priority Ready | ||||
|  * state task.  *pxHigherPriorityTaskWoken should be set to pdFALSE before it | ||||
|  * is passed into the function.  See the code example below for an example. | ||||
|  * | ||||
|  * @return The number of bytes actually written to the message buffer.  If the | ||||
|  * message buffer didn't have enough free space for the message to be stored | ||||
|  * then 0 is returned, otherwise xDataLengthBytes is returned. | ||||
|  * | ||||
|  * Example use: | ||||
|  * @code{c} | ||||
|  * // A message buffer that has already been created. | ||||
|  * MessageBufferHandle_t xMessageBuffer; | ||||
|  * | ||||
|  * void vAnInterruptServiceRoutine( void ) | ||||
|  * { | ||||
|  * size_t xBytesSent; | ||||
|  * char *pcStringToSend = "String to send"; | ||||
|  * BaseType_t xHigherPriorityTaskWoken = pdFALSE; // Initialised to pdFALSE. | ||||
|  * | ||||
|  *   // Attempt to send the string to the message buffer. | ||||
|  *   xBytesSent = xMessageBufferSendFromISR( xMessageBuffer, | ||||
|  *                                           ( void * ) pcStringToSend, | ||||
|  *                                           strlen( pcStringToSend ), | ||||
|  *                                           &xHigherPriorityTaskWoken ); | ||||
|  * | ||||
|  *   if( xBytesSent != strlen( pcStringToSend ) ) | ||||
|  *   { | ||||
|  *       // The string could not be added to the message buffer because there was | ||||
|  *       // not enough free space in the buffer. | ||||
|  *   } | ||||
|  * | ||||
|  *   // If xHigherPriorityTaskWoken was set to pdTRUE inside | ||||
|  *   // xMessageBufferSendFromISR() then a task that has a priority above the | ||||
|  *   // priority of the currently executing task was unblocked and a context | ||||
|  *   // switch should be performed to ensure the ISR returns to the unblocked | ||||
|  *   // task.  In most FreeRTOS ports this is done by simply passing | ||||
|  *   // xHigherPriorityTaskWoken into portYIELD_FROM_ISR(), which will test the | ||||
|  *   // variables value, and perform the context switch if necessary.  Check the | ||||
|  *   // documentation for the port in use for port specific instructions. | ||||
|  *   portYIELD_FROM_ISR( xHigherPriorityTaskWoken ); | ||||
|  * } | ||||
|  * @endcode | ||||
|  * \ingroup MessageBufferManagement | ||||
|  */ | ||||
| #define xMessageBufferSendFromISR( xMessageBuffer, pvTxData, xDataLengthBytes, pxHigherPriorityTaskWoken ) xStreamBufferSendFromISR( ( StreamBufferHandle_t ) xMessageBuffer, pvTxData, xDataLengthBytes, pxHigherPriorityTaskWoken ) | ||||
|  | ||||
| /** | ||||
|  * Receives a discrete message from a message buffer.  Messages can be of | ||||
|  * variable length and are copied out of the buffer. | ||||
|  * | ||||
|  * ***NOTE***:  Uniquely among FreeRTOS objects, the stream buffer | ||||
|  * implementation (so also the message buffer implementation, as message buffers | ||||
|  * are built on top of stream buffers) assumes there is only one task or | ||||
|  * interrupt that will write to the buffer (the writer), and only one task or | ||||
|  * interrupt that will read from the buffer (the reader).  It is safe for the | ||||
|  * writer and reader to be different tasks or interrupts, but, unlike other | ||||
|  * FreeRTOS objects, it is not safe to have multiple different writers or | ||||
|  * multiple different readers.  If there are to be multiple different writers | ||||
|  * then the application writer must place each call to a writing API function | ||||
|  * (such as xMessageBufferSend()) inside a critical section and set the send | ||||
|  * block time to 0.  Likewise, if there are to be multiple different readers | ||||
|  * then the application writer must place each call to a reading API function | ||||
|  * (such as xMessageBufferRead()) inside a critical section and set the receive | ||||
|  * block time to 0. | ||||
|  * | ||||
|  * Use xMessageBufferReceive() to read from a message buffer from a task.  Use | ||||
|  * xMessageBufferReceiveFromISR() to read from a message buffer from an | ||||
|  * interrupt service routine (ISR). | ||||
|  * | ||||
|  * @param xMessageBuffer The handle of the message buffer from which a message | ||||
|  * is being received. | ||||
|  * | ||||
|  * @param pvRxData A pointer to the buffer into which the received message is | ||||
|  * to be copied. | ||||
|  * | ||||
|  * @param xBufferLengthBytes The length of the buffer pointed to by the pvRxData | ||||
|  * parameter.  This sets the maximum length of the message that can be received. | ||||
|  * If xBufferLengthBytes is too small to hold the next message then the message | ||||
|  * will be left in the message buffer and 0 will be returned. | ||||
|  * | ||||
|  * @param xTicksToWait The maximum amount of time the task should remain in the | ||||
|  * Blocked state to wait for a message, should the message buffer be empty. | ||||
|  * xMessageBufferReceive() will return immediately if xTicksToWait is zero and | ||||
|  * the message buffer is empty.  The block time is specified in tick periods, so | ||||
|  * the absolute time it represents is dependent on the tick frequency.  The | ||||
|  * macro pdMS_TO_TICKS() can be used to convert a time specified in milliseconds | ||||
|  * into a time specified in ticks.  Setting xTicksToWait to portMAX_DELAY will | ||||
|  * cause the task to wait indefinitely (without timing out), provided | ||||
|  * INCLUDE_vTaskSuspend is set to 1 in FreeRTOSConfig.h.  Tasks do not use any | ||||
|  * CPU time when they are in the Blocked state. | ||||
|  * | ||||
|  * @return The length, in bytes, of the message read from the message buffer, if | ||||
|  * any.  If xMessageBufferReceive() times out before a message became available | ||||
|  * then zero is returned.  If the length of the message is greater than | ||||
|  * xBufferLengthBytes then the message will be left in the message buffer and | ||||
|  * zero is returned. | ||||
|  * | ||||
|  * Example use: | ||||
|  * @code{c} | ||||
|  * void vAFunction( MessageBuffer_t xMessageBuffer ) | ||||
|  * { | ||||
|  * uint8_t ucRxData[ 20 ]; | ||||
|  * size_t xReceivedBytes; | ||||
|  * const TickType_t xBlockTime = pdMS_TO_TICKS( 20 ); | ||||
|  * | ||||
|  *   // Receive the next message from the message buffer.  Wait in the Blocked | ||||
|  *   // state (so not using any CPU processing time) for a maximum of 100ms for | ||||
|  *   // a message to become available. | ||||
|  *   xReceivedBytes = xMessageBufferReceive( xMessageBuffer, | ||||
|  *                                           ( void * ) ucRxData, | ||||
|  *                                           sizeof( ucRxData ), | ||||
|  *                                           xBlockTime ); | ||||
|  * | ||||
|  *   if( xReceivedBytes > 0 ) | ||||
|  *   { | ||||
|  *       // A ucRxData contains a message that is xReceivedBytes long.  Process | ||||
|  *       // the message here.... | ||||
|  *   } | ||||
|  * } | ||||
|  * @endcode | ||||
|  * \ingroup MessageBufferManagement | ||||
|  */ | ||||
| #define xMessageBufferReceive( xMessageBuffer, pvRxData, xBufferLengthBytes, xTicksToWait ) xStreamBufferReceive( ( StreamBufferHandle_t ) xMessageBuffer, pvRxData, xBufferLengthBytes, xTicksToWait ) | ||||
|  | ||||
|  | ||||
| /** | ||||
|  * An interrupt safe version of the API function that receives a discrete | ||||
|  * message from a message buffer.  Messages can be of variable length and are | ||||
|  * copied out of the buffer. | ||||
|  * | ||||
|  * ***NOTE***:  Uniquely among FreeRTOS objects, the stream buffer | ||||
|  * implementation (so also the message buffer implementation, as message buffers | ||||
|  * are built on top of stream buffers) assumes there is only one task or | ||||
|  * interrupt that will write to the buffer (the writer), and only one task or | ||||
|  * interrupt that will read from the buffer (the reader).  It is safe for the | ||||
|  * writer and reader to be different tasks or interrupts, but, unlike other | ||||
|  * FreeRTOS objects, it is not safe to have multiple different writers or | ||||
|  * multiple different readers.  If there are to be multiple different writers | ||||
|  * then the application writer must place each call to a writing API function | ||||
|  * (such as xMessageBufferSend()) inside a critical section and set the send | ||||
|  * block time to 0.  Likewise, if there are to be multiple different readers | ||||
|  * then the application writer must place each call to a reading API function | ||||
|  * (such as xMessageBufferRead()) inside a critical section and set the receive | ||||
|  * block time to 0. | ||||
|  * | ||||
|  * Use xMessageBufferReceive() to read from a message buffer from a task.  Use | ||||
|  * xMessageBufferReceiveFromISR() to read from a message buffer from an | ||||
|  * interrupt service routine (ISR). | ||||
|  * | ||||
|  * @param xMessageBuffer The handle of the message buffer from which a message | ||||
|  * is being received. | ||||
|  * | ||||
|  * @param pvRxData A pointer to the buffer into which the received message is | ||||
|  * to be copied. | ||||
|  * | ||||
|  * @param xBufferLengthBytes The length of the buffer pointed to by the pvRxData | ||||
|  * parameter.  This sets the maximum length of the message that can be received. | ||||
|  * If xBufferLengthBytes is too small to hold the next message then the message | ||||
|  * will be left in the message buffer and 0 will be returned. | ||||
|  * | ||||
|  * @param pxHigherPriorityTaskWoken  It is possible that a message buffer will | ||||
|  * have a task blocked on it waiting for space to become available.  Calling | ||||
|  * xMessageBufferReceiveFromISR() can make space available, and so cause a task | ||||
|  * that is waiting for space to leave the Blocked state.  If calling | ||||
|  * xMessageBufferReceiveFromISR() causes a task to leave the Blocked state, and | ||||
|  * the unblocked task has a priority higher than the currently executing task | ||||
|  * (the task that was interrupted), then, internally, | ||||
|  * xMessageBufferReceiveFromISR() will set *pxHigherPriorityTaskWoken to pdTRUE. | ||||
|  * If xMessageBufferReceiveFromISR() sets this value to pdTRUE, then normally a | ||||
|  * context switch should be performed before the interrupt is exited.  That will | ||||
|  * ensure the interrupt returns directly to the highest priority Ready state | ||||
|  * task.  *pxHigherPriorityTaskWoken should be set to pdFALSE before it is | ||||
|  * passed into the function.  See the code example below for an example. | ||||
|  * | ||||
|  * @return The length, in bytes, of the message read from the message buffer, if | ||||
|  * any. | ||||
|  * | ||||
|  * Example use: | ||||
|  * @code{c} | ||||
|  * // A message buffer that has already been created. | ||||
|  * MessageBuffer_t xMessageBuffer; | ||||
|  * | ||||
|  * void vAnInterruptServiceRoutine( void ) | ||||
|  * { | ||||
|  * uint8_t ucRxData[ 20 ]; | ||||
|  * size_t xReceivedBytes; | ||||
|  * BaseType_t xHigherPriorityTaskWoken = pdFALSE;  // Initialised to pdFALSE. | ||||
|  * | ||||
|  *   // Receive the next message from the message buffer. | ||||
|  *   xReceivedBytes = xMessageBufferReceiveFromISR( xMessageBuffer, | ||||
|  *                                                 ( void * ) ucRxData, | ||||
|  *                                                 sizeof( ucRxData ), | ||||
|  *                                                 &xHigherPriorityTaskWoken ); | ||||
|  * | ||||
|  *   if( xReceivedBytes > 0 ) | ||||
|  *   { | ||||
|  *       // A ucRxData contains a message that is xReceivedBytes long.  Process | ||||
|  *       // the message here.... | ||||
|  *   } | ||||
|  * | ||||
|  *   // If xHigherPriorityTaskWoken was set to pdTRUE inside | ||||
|  *   // xMessageBufferReceiveFromISR() then a task that has a priority above the | ||||
|  *   // priority of the currently executing task was unblocked and a context | ||||
|  *   // switch should be performed to ensure the ISR returns to the unblocked | ||||
|  *   // task.  In most FreeRTOS ports this is done by simply passing | ||||
|  *   // xHigherPriorityTaskWoken into portYIELD_FROM_ISR(), which will test the | ||||
|  *   // variables value, and perform the context switch if necessary.  Check the | ||||
|  *   // documentation for the port in use for port specific instructions. | ||||
|  *   portYIELD_FROM_ISR( xHigherPriorityTaskWoken ); | ||||
|  * } | ||||
|  * @endcode | ||||
|  * \ingroup MessageBufferManagement | ||||
|  */ | ||||
| #define xMessageBufferReceiveFromISR( xMessageBuffer, pvRxData, xBufferLengthBytes, pxHigherPriorityTaskWoken ) xStreamBufferReceiveFromISR( ( StreamBufferHandle_t ) xMessageBuffer, pvRxData, xBufferLengthBytes, pxHigherPriorityTaskWoken ) | ||||
|  | ||||
| /** | ||||
|  * Deletes a message buffer that was previously created using a call to | ||||
|  * xMessageBufferCreate() or xMessageBufferCreateStatic().  If the message | ||||
|  * buffer was created using dynamic memory (that is, by xMessageBufferCreate()), | ||||
|  * then the allocated memory is freed. | ||||
|  * | ||||
|  * A message buffer handle must not be used after the message buffer has been | ||||
|  * deleted. | ||||
|  * | ||||
|  * @param xMessageBuffer The handle of the message buffer to be deleted. | ||||
|  * | ||||
|  */ | ||||
| #define vMessageBufferDelete( xMessageBuffer ) vStreamBufferDelete( ( StreamBufferHandle_t ) xMessageBuffer ) | ||||
|  | ||||
| /** | ||||
|  * Tests to see if a message buffer is full.  A message buffer is full if it | ||||
|  * cannot accept any more messages, of any size, until space is made available | ||||
|  * by a message being removed from the message buffer. | ||||
|  * | ||||
|  * @param xMessageBuffer The handle of the message buffer being queried. | ||||
|  * | ||||
|  * @return If the message buffer referenced by xMessageBuffer is full then | ||||
|  * pdTRUE is returned.  Otherwise pdFALSE is returned. | ||||
|  */ | ||||
| #define xMessageBufferIsFull( xMessageBuffer ) xStreamBufferIsFull( ( StreamBufferHandle_t ) xMessageBuffer ) | ||||
|  | ||||
| /** | ||||
|  * Tests to see if a message buffer is empty (does not contain any messages). | ||||
|  * | ||||
|  * @param xMessageBuffer The handle of the message buffer being queried. | ||||
|  * | ||||
|  * @return If the message buffer referenced by xMessageBuffer is empty then | ||||
|  * pdTRUE is returned.  Otherwise pdFALSE is returned. | ||||
|  * | ||||
|  */ | ||||
| #define xMessageBufferIsEmpty( xMessageBuffer ) xStreamBufferIsEmpty( ( StreamBufferHandle_t ) xMessageBuffer ) | ||||
|  | ||||
| /** | ||||
|  * Resets a message buffer to its initial empty state, discarding any message it | ||||
|  * contained. | ||||
|  * | ||||
|  * A message buffer can only be reset if there are no tasks blocked on it. | ||||
|  * | ||||
|  * @param xMessageBuffer The handle of the message buffer being reset. | ||||
|  * | ||||
|  * @return If the message buffer was reset then pdPASS is returned.  If the | ||||
|  * message buffer could not be reset because either there was a task blocked on | ||||
|  * the message queue to wait for space to become available, or to wait for a | ||||
|  * a message to be available, then pdFAIL is returned. | ||||
|  * | ||||
|  * \ingroup MessageBufferManagement | ||||
|  */ | ||||
| #define xMessageBufferReset( xMessageBuffer ) xStreamBufferReset( ( StreamBufferHandle_t ) xMessageBuffer ) | ||||
|  | ||||
|  | ||||
| /** | ||||
|  * Returns the number of bytes of free space in the message buffer. | ||||
|  * | ||||
|  * @param xMessageBuffer The handle of the message buffer being queried. | ||||
|  * | ||||
|  * @return The number of bytes that can be written to the message buffer before | ||||
|  * the message buffer would be full.  When a message is written to the message | ||||
|  * buffer an additional sizeof( size_t ) bytes are also written to store the | ||||
|  * message's length.  sizeof( size_t ) is typically 4 bytes on a 32-bit | ||||
|  * architecture, so if xMessageBufferSpacesAvailable() returns 10, then the size | ||||
|  * of the largest message that can be written to the message buffer is 6 bytes. | ||||
|  * | ||||
|  * \ingroup MessageBufferManagement | ||||
|  */ | ||||
| #define xMessageBufferSpaceAvailable( xMessageBuffer ) xStreamBufferSpacesAvailable( ( StreamBufferHandle_t ) xMessageBuffer ) | ||||
| #define xMessageBufferSpacesAvailable( xMessageBuffer ) xStreamBufferSpacesAvailable( ( StreamBufferHandle_t ) xMessageBuffer ) /* Corrects typo in original macro name. */ | ||||
|  | ||||
| /** | ||||
|  * Returns the length (in bytes) of the next message in a message buffer. | ||||
|  * Useful if xMessageBufferReceive() returned 0 because the size of the buffer | ||||
|  * passed into xMessageBufferReceive() was too small to hold the next message. | ||||
|  * | ||||
|  * @param xMessageBuffer The handle of the message buffer being queried. | ||||
|  * | ||||
|  * @return The length (in bytes) of the next message in the message buffer, or 0 | ||||
|  * if the message buffer is empty. | ||||
|  * | ||||
|  * \ingroup MessageBufferManagement | ||||
|  */ | ||||
| #define xMessageBufferNextLengthBytes( xMessageBuffer ) xStreamBufferNextMessageLengthBytes( ( StreamBufferHandle_t ) xMessageBuffer ) PRIVILEGED_FUNCTION; | ||||
|  | ||||
| /** | ||||
|  * For advanced users only. | ||||
|  * | ||||
|  * The sbSEND_COMPLETED() macro is called from within the FreeRTOS APIs when | ||||
|  * data is sent to a message buffer or stream buffer.  If there was a task that | ||||
|  * was blocked on the message or stream buffer waiting for data to arrive then | ||||
|  * the sbSEND_COMPLETED() macro sends a notification to the task to remove it | ||||
|  * from the Blocked state.  xMessageBufferSendCompletedFromISR() does the same | ||||
|  * thing.  It is provided to enable application writers to implement their own | ||||
|  * version of sbSEND_COMPLETED(), and MUST NOT BE USED AT ANY OTHER TIME. | ||||
|  * | ||||
|  * See the example implemented in FreeRTOS/Demo/Minimal/MessageBufferAMP.c for | ||||
|  * additional information. | ||||
|  * | ||||
|  * @param xMessageBuffer The handle of the stream buffer to which data was | ||||
|  * written. | ||||
|  * | ||||
|  * @param pxHigherPriorityTaskWoken *pxHigherPriorityTaskWoken should be | ||||
|  * initialised to pdFALSE before it is passed into | ||||
|  * xMessageBufferSendCompletedFromISR().  If calling | ||||
|  * xMessageBufferSendCompletedFromISR() removes a task from the Blocked state, | ||||
|  * and the task has a priority above the priority of the currently running task, | ||||
|  * then *pxHigherPriorityTaskWoken will get set to pdTRUE indicating that a | ||||
|  * context switch should be performed before exiting the ISR. | ||||
|  * | ||||
|  * @return If a task was removed from the Blocked state then pdTRUE is returned. | ||||
|  * Otherwise pdFALSE is returned. | ||||
|  * | ||||
|  * \ingroup StreamBufferManagement | ||||
|  */ | ||||
| #define xMessageBufferSendCompletedFromISR( xMessageBuffer, pxHigherPriorityTaskWoken ) xStreamBufferSendCompletedFromISR( ( StreamBufferHandle_t ) xMessageBuffer, pxHigherPriorityTaskWoken ) | ||||
|  | ||||
| /** | ||||
|  * For advanced users only. | ||||
|  * | ||||
|  * The sbRECEIVE_COMPLETED() macro is called from within the FreeRTOS APIs when | ||||
|  * data is read out of a message buffer or stream buffer.  If there was a task | ||||
|  * that was blocked on the message or stream buffer waiting for data to arrive | ||||
|  * then the sbRECEIVE_COMPLETED() macro sends a notification to the task to | ||||
|  * remove it from the Blocked state.  xMessageBufferReceiveCompletedFromISR() | ||||
|  * does the same thing.  It is provided to enable application writers to | ||||
|  * implement their own version of sbRECEIVE_COMPLETED(), and MUST NOT BE USED AT | ||||
|  * ANY OTHER TIME. | ||||
|  * | ||||
|  * See the example implemented in FreeRTOS/Demo/Minimal/MessageBufferAMP.c for | ||||
|  * additional information. | ||||
|  * | ||||
|  * @param xMessageBuffer The handle of the stream buffer from which data was | ||||
|  * read. | ||||
|  * | ||||
|  * @param pxHigherPriorityTaskWoken *pxHigherPriorityTaskWoken should be | ||||
|  * initialised to pdFALSE before it is passed into | ||||
|  * xMessageBufferReceiveCompletedFromISR().  If calling | ||||
|  * xMessageBufferReceiveCompletedFromISR() removes a task from the Blocked state, | ||||
|  * and the task has a priority above the priority of the currently running task, | ||||
|  * then *pxHigherPriorityTaskWoken will get set to pdTRUE indicating that a | ||||
|  * context switch should be performed before exiting the ISR. | ||||
|  * | ||||
|  * @return If a task was removed from the Blocked state then pdTRUE is returned. | ||||
|  * Otherwise pdFALSE is returned. | ||||
|  * | ||||
|  * \ingroup StreamBufferManagement | ||||
|  */ | ||||
| #define xMessageBufferReceiveCompletedFromISR( xMessageBuffer, pxHigherPriorityTaskWoken ) xStreamBufferReceiveCompletedFromISR( ( StreamBufferHandle_t ) xMessageBuffer, pxHigherPriorityTaskWoken ) | ||||
|  | ||||
| #if defined( __cplusplus ) | ||||
| } /* extern "C" */ | ||||
| #endif | ||||
|  | ||||
| #endif	/* !defined( FREERTOS_MESSAGE_BUFFER_H ) */ | ||||
| @@ -0,0 +1,186 @@ | ||||
| /* | ||||
|  * FreeRTOS Kernel V10.2.1 | ||||
|  * Copyright (C) 2019 Amazon.com, Inc. or its affiliates.  All Rights Reserved. | ||||
|  * | ||||
|  * Permission is hereby granted, free of charge, to any person obtaining a copy of | ||||
|  * this software and associated documentation files (the "Software"), to deal in | ||||
|  * the Software without restriction, including without limitation the rights to | ||||
|  * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of | ||||
|  * the Software, and to permit persons to whom the Software is furnished to do so, | ||||
|  * subject to the following conditions: | ||||
|  * | ||||
|  * The above copyright notice and this permission notice shall be included in all | ||||
|  * copies or substantial portions of the Software. | ||||
|  * | ||||
|  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
|  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS | ||||
|  * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR | ||||
|  * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER | ||||
|  * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN | ||||
|  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. | ||||
|  * | ||||
|  * http://www.FreeRTOS.org | ||||
|  * http://aws.amazon.com/freertos | ||||
|  * | ||||
|  * 1 tab == 4 spaces! | ||||
|  */ | ||||
|  | ||||
| #ifndef MPU_WRAPPERS_H | ||||
| #define MPU_WRAPPERS_H | ||||
|  | ||||
| /* This file redefines API functions to be called through a wrapper macro, but | ||||
| only for ports that are using the MPU. */ | ||||
| #if portUSING_MPU_WRAPPERS | ||||
|  | ||||
| 	/* MPU_WRAPPERS_INCLUDED_FROM_API_FILE will be defined when this file is | ||||
| 	included from queue.c or task.c to prevent it from having an effect within | ||||
| 	those files. */ | ||||
| 	#ifndef MPU_WRAPPERS_INCLUDED_FROM_API_FILE | ||||
|  | ||||
| 		/* | ||||
| 		 * Map standard (non MPU) API functions to equivalents that start | ||||
| 		 * "MPU_".  This will cause the application code to call the MPU_ | ||||
| 		 * version, which wraps the non-MPU version with privilege promoting | ||||
| 		 * then demoting code, so the kernel code always runs will full | ||||
| 		 * privileges. | ||||
| 		 */ | ||||
|  | ||||
| 		/* Map standard tasks.h API functions to the MPU equivalents. */ | ||||
| 		#define xTaskCreate								MPU_xTaskCreate | ||||
| 		#define xTaskCreateStatic						MPU_xTaskCreateStatic | ||||
| 		#define xTaskCreateRestricted					MPU_xTaskCreateRestricted | ||||
| 		#define vTaskAllocateMPURegions					MPU_vTaskAllocateMPURegions | ||||
| 		#define vTaskDelete								MPU_vTaskDelete | ||||
| 		#define vTaskDelay								MPU_vTaskDelay | ||||
| 		#define vTaskDelayUntil							MPU_vTaskDelayUntil | ||||
| 		#define xTaskAbortDelay							MPU_xTaskAbortDelay | ||||
| 		#define uxTaskPriorityGet						MPU_uxTaskPriorityGet | ||||
| 		#define eTaskGetState							MPU_eTaskGetState | ||||
| 		#define vTaskGetInfo							MPU_vTaskGetInfo | ||||
| 		#define vTaskPrioritySet						MPU_vTaskPrioritySet | ||||
| 		#define vTaskSuspend							MPU_vTaskSuspend | ||||
| 		#define vTaskResume								MPU_vTaskResume | ||||
| 		#define vTaskSuspendAll							MPU_vTaskSuspendAll | ||||
| 		#define xTaskResumeAll							MPU_xTaskResumeAll | ||||
| 		#define xTaskGetTickCount						MPU_xTaskGetTickCount | ||||
| 		#define uxTaskGetNumberOfTasks					MPU_uxTaskGetNumberOfTasks | ||||
| 		#define pcTaskGetName							MPU_pcTaskGetName | ||||
| 		#define xTaskGetHandle							MPU_xTaskGetHandle | ||||
| 		#define uxTaskGetStackHighWaterMark				MPU_uxTaskGetStackHighWaterMark | ||||
| 		#define uxTaskGetStackHighWaterMark2			MPU_uxTaskGetStackHighWaterMark2 | ||||
| 		#define vTaskSetApplicationTaskTag				MPU_vTaskSetApplicationTaskTag | ||||
| 		#define xTaskGetApplicationTaskTag				MPU_xTaskGetApplicationTaskTag | ||||
| 		// #define vTaskSetThreadLocalStoragePointer		MPU_vTaskSetThreadLocalStoragePointer | ||||
| 		// #define pvTaskGetThreadLocalStoragePointer		MPU_pvTaskGetThreadLocalStoragePointer | ||||
| 		#define xTaskCallApplicationTaskHook			MPU_xTaskCallApplicationTaskHook | ||||
| 		#define xTaskGetIdleTaskHandle					MPU_xTaskGetIdleTaskHandle | ||||
| 		#define uxTaskGetSystemState					MPU_uxTaskGetSystemState | ||||
| 		#define vTaskList								MPU_vTaskList | ||||
| 		#define vTaskGetRunTimeStats					MPU_vTaskGetRunTimeStats | ||||
| 		#define ulTaskGetIdleRunTimeCounter				MPU_ulTaskGetIdleRunTimeCounter | ||||
| 		#define xTaskGenericNotify						MPU_xTaskGenericNotify | ||||
| 		#define xTaskNotifyWait							MPU_xTaskNotifyWait | ||||
| 		#define ulTaskNotifyTake						MPU_ulTaskNotifyTake | ||||
| 		#define xTaskNotifyStateClear					MPU_xTaskNotifyStateClear | ||||
| 		#define xTaskCatchUpTicks						MPU_xTaskCatchUpTicks | ||||
|  | ||||
| 		#define xTaskGetCurrentTaskHandle				MPU_xTaskGetCurrentTaskHandle | ||||
| 		#define vTaskSetTimeOutState					MPU_vTaskSetTimeOutState | ||||
| 		#define xTaskCheckForTimeOut					MPU_xTaskCheckForTimeOut | ||||
| 		#define xTaskGetSchedulerState					MPU_xTaskGetSchedulerState | ||||
|  | ||||
| 		/* Map standard queue.h API functions to the MPU equivalents. */ | ||||
| 		#define xQueueGenericSend						MPU_xQueueGenericSend | ||||
| 		#define xQueueReceive							MPU_xQueueReceive | ||||
| 		#define xQueuePeek								MPU_xQueuePeek | ||||
| 		#define xQueueSemaphoreTake						MPU_xQueueSemaphoreTake | ||||
| 		#define uxQueueMessagesWaiting					MPU_uxQueueMessagesWaiting | ||||
| 		#define uxQueueSpacesAvailable					MPU_uxQueueSpacesAvailable | ||||
| 		#define vQueueDelete							MPU_vQueueDelete | ||||
| 		#define xQueueCreateMutex						MPU_xQueueCreateMutex | ||||
| 		#define xQueueCreateMutexStatic					MPU_xQueueCreateMutexStatic | ||||
| 		#define xQueueCreateCountingSemaphore			MPU_xQueueCreateCountingSemaphore | ||||
| 		#define xQueueCreateCountingSemaphoreStatic		MPU_xQueueCreateCountingSemaphoreStatic | ||||
| 		#define xQueueGetMutexHolder					MPU_xQueueGetMutexHolder | ||||
| 		#define xQueueTakeMutexRecursive				MPU_xQueueTakeMutexRecursive | ||||
| 		#define xQueueGiveMutexRecursive				MPU_xQueueGiveMutexRecursive | ||||
| 		#define xQueueGenericCreate						MPU_xQueueGenericCreate | ||||
| 		#define xQueueGenericCreateStatic				MPU_xQueueGenericCreateStatic | ||||
| 		#define xQueueCreateSet							MPU_xQueueCreateSet | ||||
| 		#define xQueueAddToSet							MPU_xQueueAddToSet | ||||
| 		#define xQueueRemoveFromSet						MPU_xQueueRemoveFromSet | ||||
| 		#define xQueueSelectFromSet						MPU_xQueueSelectFromSet | ||||
| 		#define xQueueGenericReset						MPU_xQueueGenericReset | ||||
|  | ||||
| 		#if( configQUEUE_REGISTRY_SIZE > 0 ) | ||||
| 			#define vQueueAddToRegistry						MPU_vQueueAddToRegistry | ||||
| 			#define vQueueUnregisterQueue					MPU_vQueueUnregisterQueue | ||||
| 			#define pcQueueGetName							MPU_pcQueueGetName | ||||
| 		#endif | ||||
|  | ||||
| 		/* Map standard timer.h API functions to the MPU equivalents. */ | ||||
| 		#define xTimerCreate							MPU_xTimerCreate | ||||
| 		#define xTimerCreateStatic						MPU_xTimerCreateStatic | ||||
| 		#define pvTimerGetTimerID						MPU_pvTimerGetTimerID | ||||
| 		#define vTimerSetTimerID						MPU_vTimerSetTimerID | ||||
| 		#define xTimerIsTimerActive						MPU_xTimerIsTimerActive | ||||
| 		#define xTimerGetTimerDaemonTaskHandle			MPU_xTimerGetTimerDaemonTaskHandle | ||||
| 		#define xTimerPendFunctionCall					MPU_xTimerPendFunctionCall | ||||
| 		#define pcTimerGetName							MPU_pcTimerGetName | ||||
| 		#define vTimerSetReloadMode						MPU_vTimerSetReloadMode | ||||
| 		#define xTimerGetPeriod							MPU_xTimerGetPeriod | ||||
| 		#define xTimerGetExpiryTime						MPU_xTimerGetExpiryTime | ||||
| 		#define xTimerGenericCommand					MPU_xTimerGenericCommand | ||||
|  | ||||
| 		/* Map standard event_group.h API functions to the MPU equivalents. */ | ||||
| 		#define xEventGroupCreate						MPU_xEventGroupCreate | ||||
| 		#define xEventGroupCreateStatic					MPU_xEventGroupCreateStatic | ||||
| 		#define xEventGroupWaitBits						MPU_xEventGroupWaitBits | ||||
| 		#define xEventGroupClearBits					MPU_xEventGroupClearBits | ||||
| 		#define xEventGroupSetBits						MPU_xEventGroupSetBits | ||||
| 		#define xEventGroupSync							MPU_xEventGroupSync | ||||
| 		#define vEventGroupDelete						MPU_vEventGroupDelete | ||||
|  | ||||
| 		/* Map standard message/stream_buffer.h API functions to the MPU | ||||
| 		equivalents. */ | ||||
| 		#define xStreamBufferSend						MPU_xStreamBufferSend | ||||
| 		#define xStreamBufferReceive					MPU_xStreamBufferReceive | ||||
| 		#define xStreamBufferNextMessageLengthBytes		MPU_xStreamBufferNextMessageLengthBytes | ||||
| 		#define vStreamBufferDelete						MPU_vStreamBufferDelete | ||||
| 		#define xStreamBufferIsFull						MPU_xStreamBufferIsFull | ||||
| 		#define xStreamBufferIsEmpty					MPU_xStreamBufferIsEmpty | ||||
| 		#define xStreamBufferReset						MPU_xStreamBufferReset | ||||
| 		#define xStreamBufferSpacesAvailable			MPU_xStreamBufferSpacesAvailable | ||||
| 		#define xStreamBufferBytesAvailable				MPU_xStreamBufferBytesAvailable | ||||
| 		#define xStreamBufferSetTriggerLevel			MPU_xStreamBufferSetTriggerLevel | ||||
| 		#define xStreamBufferGenericCreate				MPU_xStreamBufferGenericCreate | ||||
| 		#define xStreamBufferGenericCreateStatic		MPU_xStreamBufferGenericCreateStatic | ||||
|  | ||||
|  | ||||
| 		/* Remove the privileged function macro, but keep the PRIVILEGED_DATA | ||||
| 		macro so applications can place data in privileged access sections | ||||
| 		(useful when using statically allocated objects). */ | ||||
| 		#define PRIVILEGED_FUNCTION | ||||
| 		#define PRIVILEGED_DATA __attribute__((section("privileged_data"))) | ||||
| 		#define FREERTOS_SYSTEM_CALL | ||||
|  | ||||
| 	#else /* MPU_WRAPPERS_INCLUDED_FROM_API_FILE */ | ||||
|  | ||||
| 		/* Ensure API functions go in the privileged execution section. */ | ||||
| 		#define PRIVILEGED_FUNCTION __attribute__((section("privileged_functions"))) | ||||
| 		#define PRIVILEGED_DATA __attribute__((section("privileged_data"))) | ||||
| 		#define FREERTOS_SYSTEM_CALL __attribute__((section( "freertos_system_calls"))) | ||||
|  | ||||
| 	#endif /* MPU_WRAPPERS_INCLUDED_FROM_API_FILE */ | ||||
|  | ||||
| #else /* portUSING_MPU_WRAPPERS */ | ||||
|  | ||||
| 	#define PRIVILEGED_FUNCTION | ||||
| 	#define PRIVILEGED_DATA | ||||
| 	#define FREERTOS_SYSTEM_CALL | ||||
| 	#define portUSING_MPU_WRAPPERS 0 | ||||
|  | ||||
| #endif /* portUSING_MPU_WRAPPERS */ | ||||
|  | ||||
|  | ||||
| #endif /* MPU_WRAPPERS_H */ | ||||
							
								
								
									
										203
									
								
								tools/sdk/esp32c3/include/freertos/include/freertos/portable.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										203
									
								
								tools/sdk/esp32c3/include/freertos/include/freertos/portable.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,203 @@ | ||||
| /* | ||||
|  * FreeRTOS Kernel V10.2.1 | ||||
|  * Copyright (C) 2019 Amazon.com, Inc. or its affiliates.  All Rights Reserved. | ||||
|  * | ||||
|  * Permission is hereby granted, free of charge, to any person obtaining a copy of | ||||
|  * this software and associated documentation files (the "Software"), to deal in | ||||
|  * the Software without restriction, including without limitation the rights to | ||||
|  * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of | ||||
|  * the Software, and to permit persons to whom the Software is furnished to do so, | ||||
|  * subject to the following conditions: | ||||
|  * | ||||
|  * The above copyright notice and this permission notice shall be included in all | ||||
|  * copies or substantial portions of the Software. | ||||
|  * | ||||
|  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
|  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS | ||||
|  * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR | ||||
|  * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER | ||||
|  * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN | ||||
|  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. | ||||
|  * | ||||
|  * http://www.FreeRTOS.org | ||||
|  * http://aws.amazon.com/freertos | ||||
|  * | ||||
|  * 1 tab == 4 spaces! | ||||
|  */ | ||||
|  | ||||
| /*----------------------------------------------------------- | ||||
|  * Portable layer API.  Each function must be defined for each port. | ||||
|  *----------------------------------------------------------*/ | ||||
|  | ||||
| #ifndef PORTABLE_H | ||||
| #define PORTABLE_H | ||||
|  | ||||
| /* Each FreeRTOS port has a unique portmacro.h header file.  Originally a | ||||
| pre-processor definition was used to ensure the pre-processor found the correct | ||||
| portmacro.h file for the port being used.  That scheme was deprecated in favour | ||||
| of setting the compiler's include path such that it found the correct | ||||
| portmacro.h file - removing the need for the constant and allowing the | ||||
| portmacro.h file to be located anywhere in relation to the port being used. | ||||
| Purely for reasons of backward compatibility the old method is still valid, but | ||||
| to make it clear that new projects should not use it, support for the port | ||||
| specific constants has been moved into the deprecated_definitions.h header | ||||
| file. */ | ||||
| #include "deprecated_definitions.h" | ||||
|  | ||||
| /* If portENTER_CRITICAL is not defined then including deprecated_definitions.h | ||||
| did not result in a portmacro.h header file being included - and it should be | ||||
| included here.  In this case the path to the correct portmacro.h header file | ||||
| must be set in the compiler's include path. */ | ||||
| #ifndef portENTER_CRITICAL | ||||
| 	#include "freertos/portmacro.h" | ||||
| #endif | ||||
|  | ||||
| #if portBYTE_ALIGNMENT == 32 | ||||
| 	#define portBYTE_ALIGNMENT_MASK ( 0x001f ) | ||||
| #endif | ||||
|  | ||||
| #if portBYTE_ALIGNMENT == 16 | ||||
| 	#define portBYTE_ALIGNMENT_MASK ( 0x000f ) | ||||
| #endif | ||||
|  | ||||
| #if portBYTE_ALIGNMENT == 8 | ||||
| 	#define portBYTE_ALIGNMENT_MASK ( 0x0007 ) | ||||
| #endif | ||||
|  | ||||
| #if portBYTE_ALIGNMENT == 4 | ||||
| 	#define portBYTE_ALIGNMENT_MASK	( 0x0003 ) | ||||
| #endif | ||||
|  | ||||
| #if portBYTE_ALIGNMENT == 2 | ||||
| 	#define portBYTE_ALIGNMENT_MASK	( 0x0001 ) | ||||
| #endif | ||||
|  | ||||
| #if portBYTE_ALIGNMENT == 1 | ||||
| 	#define portBYTE_ALIGNMENT_MASK	( 0x0000 ) | ||||
| #endif | ||||
|  | ||||
| #ifndef portBYTE_ALIGNMENT_MASK | ||||
| 	#error "Invalid portBYTE_ALIGNMENT definition" | ||||
| #endif | ||||
|  | ||||
| #ifndef portNUM_CONFIGURABLE_REGIONS | ||||
| 	#define portNUM_CONFIGURABLE_REGIONS 1 | ||||
| #endif | ||||
|  | ||||
| #ifndef portHAS_STACK_OVERFLOW_CHECKING | ||||
| 	#define portHAS_STACK_OVERFLOW_CHECKING 0 | ||||
| #endif | ||||
|  | ||||
| #ifndef portARCH_NAME | ||||
| 	#define portARCH_NAME NULL | ||||
| #endif | ||||
|  | ||||
| #ifdef __cplusplus | ||||
| extern "C" { | ||||
| #endif | ||||
|  | ||||
| #include "mpu_wrappers.h" | ||||
|  | ||||
| /* | ||||
|  * Setup the stack of a new task so it is ready to be placed under the | ||||
|  * scheduler control.  The registers have to be placed on the stack in | ||||
|  * the order that the port expects to find them. | ||||
|  * | ||||
|  */ | ||||
| #if( portUSING_MPU_WRAPPERS == 1 ) | ||||
| 	#if( portHAS_STACK_OVERFLOW_CHECKING == 1 ) | ||||
| 		StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, StackType_t *pxEndOfStack, TaskFunction_t pxCode, void *pvParameters, BaseType_t xRunPrivileged ) PRIVILEGED_FUNCTION; | ||||
| 	#else | ||||
| 		StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters, BaseType_t xRunPrivileged ) PRIVILEGED_FUNCTION; | ||||
| 	#endif | ||||
| #else | ||||
| 	#if( portHAS_STACK_OVERFLOW_CHECKING == 1 ) | ||||
| 		StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, StackType_t *pxEndOfStack, TaskFunction_t pxCode, void *pvParameters ) PRIVILEGED_FUNCTION; | ||||
| 	#else | ||||
| 		StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters ) PRIVILEGED_FUNCTION; | ||||
| 	#endif | ||||
| #endif | ||||
|  | ||||
| #ifdef configUSE_FREERTOS_PROVIDED_HEAP | ||||
|  | ||||
| /* Used by heap_5.c to define the start address and size of each memory region | ||||
| that together comprise the total FreeRTOS heap space. */ | ||||
| typedef struct HeapRegion | ||||
| { | ||||
| 	uint8_t *pucStartAddress; | ||||
| 	size_t xSizeInBytes; | ||||
| } HeapRegion_t; | ||||
|  | ||||
| /* Used to pass information about the heap out of vPortGetHeapStats(). */ | ||||
| typedef struct xHeapStats | ||||
| { | ||||
| 	size_t xAvailableHeapSpaceInBytes;		/* The total heap size currently available - this is the sum of all the free blocks, not the largest block that can be allocated. */ | ||||
| 	size_t xSizeOfLargestFreeBlockInBytes; 	/* The maximum size, in bytes, of all the free blocks within the heap at the time vPortGetHeapStats() is called. */ | ||||
| 	size_t xSizeOfSmallestFreeBlockInBytes; /* The minimum size, in bytes, of all the free blocks within the heap at the time vPortGetHeapStats() is called. */ | ||||
| 	size_t xNumberOfFreeBlocks;				/* The number of free memory blocks within the heap at the time vPortGetHeapStats() is called. */ | ||||
| 	size_t xMinimumEverFreeBytesRemaining;	/* The minimum amount of total free memory (sum of all free blocks) there has been in the heap since the system booted. */ | ||||
| 	size_t xNumberOfSuccessfulAllocations;	/* The number of calls to pvPortMalloc() that have returned a valid memory block. */ | ||||
| 	size_t xNumberOfSuccessfulFrees;		/* The number of calls to vPortFree() that has successfully freed a block of memory. */ | ||||
| } HeapStats_t; | ||||
|  | ||||
| /* | ||||
|  * Used to define multiple heap regions for use by heap_5.c.  This function | ||||
|  * must be called before any calls to pvPortMalloc() - not creating a task, | ||||
|  * queue, semaphore, mutex, software timer, event group, etc. will result in | ||||
|  * pvPortMalloc being called. | ||||
|  * | ||||
|  * pxHeapRegions passes in an array of HeapRegion_t structures - each of which | ||||
|  * defines a region of memory that can be used as the heap.  The array is | ||||
|  * terminated by a HeapRegions_t structure that has a size of 0.  The region | ||||
|  * with the lowest start address must appear first in the array. | ||||
|  */ | ||||
| void vPortDefineHeapRegions( const HeapRegion_t * const pxHeapRegions ) PRIVILEGED_FUNCTION; | ||||
|  | ||||
| /* | ||||
|  * Returns a HeapStats_t structure filled with information about the current | ||||
|  * heap state. | ||||
|  */ | ||||
| void vPortGetHeapStats( HeapStats_t *pxHeapStats ); | ||||
| /* | ||||
|  * Map to the memory management routines required for the port. | ||||
|  */ | ||||
| void *pvPortMalloc( size_t xSize ) PRIVILEGED_FUNCTION; | ||||
| void vPortFree( void *pv ) PRIVILEGED_FUNCTION; | ||||
| void vPortInitialiseBlocks( void ) PRIVILEGED_FUNCTION; | ||||
| size_t xPortGetFreeHeapSize( void ) PRIVILEGED_FUNCTION; | ||||
| size_t xPortGetMinimumEverFreeHeapSize( void ) PRIVILEGED_FUNCTION; | ||||
|  | ||||
| #else  // configUSE_FREERTOS_PROVIDED_HEAP | ||||
|  | ||||
| /* | ||||
|  * Map to the memory management routines required for the port. | ||||
|  * | ||||
|  * Note that libc standard malloc/free are also available for | ||||
|  * non-FreeRTOS-specific code, and behave the same as | ||||
|  * pvPortMalloc()/vPortFree(). | ||||
|  */ | ||||
| #define pvPortMalloc malloc | ||||
| #define vPortFree free | ||||
| #define xPortGetFreeHeapSize esp_get_free_heap_size | ||||
| #define xPortGetMinimumEverFreeHeapSize esp_get_minimum_free_heap_size | ||||
|  | ||||
| #endif | ||||
|  | ||||
| /* | ||||
|  * Setup the hardware ready for the scheduler to take control.  This generally | ||||
|  * sets up a tick interrupt and sets timers for the correct tick frequency. | ||||
|  */ | ||||
| BaseType_t xPortStartScheduler( void ) PRIVILEGED_FUNCTION; | ||||
|  | ||||
| /* | ||||
|  * Undo any hardware/ISR setup that was performed by xPortStartScheduler() so | ||||
|  * the hardware is left in its original condition after the scheduler stops | ||||
|  * executing. | ||||
|  */ | ||||
| void vPortEndScheduler( void ) PRIVILEGED_FUNCTION; | ||||
|  | ||||
| #ifdef __cplusplus | ||||
| } | ||||
| #endif | ||||
|  | ||||
| #endif /* PORTABLE_H */ | ||||
							
								
								
									
										126
									
								
								tools/sdk/esp32c3/include/freertos/include/freertos/projdefs.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										126
									
								
								tools/sdk/esp32c3/include/freertos/include/freertos/projdefs.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,126 @@ | ||||
| /* | ||||
|  * FreeRTOS Kernel V10.2.1 | ||||
|  * Copyright (C) 2019 Amazon.com, Inc. or its affiliates.  All Rights Reserved. | ||||
|  * | ||||
|  * Permission is hereby granted, free of charge, to any person obtaining a copy of | ||||
|  * this software and associated documentation files (the "Software"), to deal in | ||||
|  * the Software without restriction, including without limitation the rights to | ||||
|  * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of | ||||
|  * the Software, and to permit persons to whom the Software is furnished to do so, | ||||
|  * subject to the following conditions: | ||||
|  * | ||||
|  * The above copyright notice and this permission notice shall be included in all | ||||
|  * copies or substantial portions of the Software. | ||||
|  * | ||||
|  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
|  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS | ||||
|  * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR | ||||
|  * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER | ||||
|  * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN | ||||
|  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. | ||||
|  * | ||||
|  * http://www.FreeRTOS.org | ||||
|  * http://aws.amazon.com/freertos | ||||
|  * | ||||
|  * 1 tab == 4 spaces! | ||||
|  */ | ||||
|  | ||||
| #ifndef PROJDEFS_H | ||||
| #define PROJDEFS_H | ||||
|  | ||||
| /* | ||||
|  * Defines the prototype to which task functions must conform.  Defined in this | ||||
|  * file to ensure the type is known before portable.h is included. | ||||
|  */ | ||||
| typedef void (*TaskFunction_t)( void * ); | ||||
|  | ||||
| /* Converts a time in milliseconds to a time in ticks.  This macro can be | ||||
| overridden by a macro of the same name defined in FreeRTOSConfig.h in case the | ||||
| definition here is not suitable for your application. */ | ||||
| #ifndef pdMS_TO_TICKS | ||||
| 	#define pdMS_TO_TICKS( xTimeInMs ) ( ( TickType_t ) ( ( ( TickType_t ) ( xTimeInMs ) * ( TickType_t ) configTICK_RATE_HZ ) / ( TickType_t ) 1000 ) ) | ||||
| #endif | ||||
|  | ||||
| #ifndef pdTICKS_TO_MS | ||||
| 	#define pdTICKS_TO_MS( xTicks )   ( ( uint32_t ) ( xTicks ) * 1000 / configTICK_RATE_HZ ) | ||||
| #endif | ||||
|  | ||||
|  | ||||
| #define pdFALSE			( ( BaseType_t ) 0 ) | ||||
| #define pdTRUE			( ( BaseType_t ) 1 ) | ||||
|  | ||||
| #define pdPASS			( pdTRUE ) | ||||
| #define pdFAIL			( pdFALSE ) | ||||
| #define errQUEUE_EMPTY	( ( BaseType_t ) 0 ) | ||||
| #define errQUEUE_FULL	( ( BaseType_t ) 0 ) | ||||
|  | ||||
| /* FreeRTOS error definitions. */ | ||||
| #define errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY	( -1 ) | ||||
| #define errQUEUE_BLOCKED						( -4 ) | ||||
| #define errQUEUE_YIELD							( -5 ) | ||||
|  | ||||
| /* Macros used for basic data corruption checks. */ | ||||
| #ifndef configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES | ||||
| 	#define configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES 0 | ||||
| #endif | ||||
|  | ||||
| #if( configUSE_16_BIT_TICKS == 1 ) | ||||
| 	#define pdINTEGRITY_CHECK_VALUE 0x5a5a | ||||
| #else | ||||
| 	#define pdINTEGRITY_CHECK_VALUE 0x5a5a5a5aUL | ||||
| #endif | ||||
|  | ||||
| /* The following errno values are used by FreeRTOS+ components, not FreeRTOS | ||||
| itself. */ | ||||
| #define pdFREERTOS_ERRNO_NONE			0	/* No errors */ | ||||
| #define	pdFREERTOS_ERRNO_ENOENT			2	/* No such file or directory */ | ||||
| #define	pdFREERTOS_ERRNO_EINTR			4	/* Interrupted system call */ | ||||
| #define	pdFREERTOS_ERRNO_EIO			5	/* I/O error */ | ||||
| #define	pdFREERTOS_ERRNO_ENXIO			6	/* No such device or address */ | ||||
| #define	pdFREERTOS_ERRNO_EBADF			9	/* Bad file number */ | ||||
| #define	pdFREERTOS_ERRNO_EAGAIN			11	/* No more processes */ | ||||
| #define	pdFREERTOS_ERRNO_EWOULDBLOCK	11	/* Operation would block */ | ||||
| #define	pdFREERTOS_ERRNO_ENOMEM			12	/* Not enough memory */ | ||||
| #define	pdFREERTOS_ERRNO_EACCES			13	/* Permission denied */ | ||||
| #define	pdFREERTOS_ERRNO_EFAULT			14	/* Bad address */ | ||||
| #define	pdFREERTOS_ERRNO_EBUSY			16	/* Mount device busy */ | ||||
| #define	pdFREERTOS_ERRNO_EEXIST			17	/* File exists */ | ||||
| #define	pdFREERTOS_ERRNO_EXDEV			18	/* Cross-device link */ | ||||
| #define	pdFREERTOS_ERRNO_ENODEV			19	/* No such device */ | ||||
| #define	pdFREERTOS_ERRNO_ENOTDIR		20	/* Not a directory */ | ||||
| #define	pdFREERTOS_ERRNO_EISDIR			21	/* Is a directory */ | ||||
| #define	pdFREERTOS_ERRNO_EINVAL			22	/* Invalid argument */ | ||||
| #define	pdFREERTOS_ERRNO_ENOSPC			28	/* No space left on device */ | ||||
| #define	pdFREERTOS_ERRNO_ESPIPE			29	/* Illegal seek */ | ||||
| #define	pdFREERTOS_ERRNO_EROFS			30	/* Read only file system */ | ||||
| #define	pdFREERTOS_ERRNO_EUNATCH		42	/* Protocol driver not attached */ | ||||
| #define	pdFREERTOS_ERRNO_EBADE			50	/* Invalid exchange */ | ||||
| #define	pdFREERTOS_ERRNO_EFTYPE			79	/* Inappropriate file type or format */ | ||||
| #define	pdFREERTOS_ERRNO_ENMFILE		89	/* No more files */ | ||||
| #define	pdFREERTOS_ERRNO_ENOTEMPTY		90	/* Directory not empty */ | ||||
| #define	pdFREERTOS_ERRNO_ENAMETOOLONG 	91	/* File or path name too long */ | ||||
| #define	pdFREERTOS_ERRNO_EOPNOTSUPP		95	/* Operation not supported on transport endpoint */ | ||||
| #define	pdFREERTOS_ERRNO_ENOBUFS		105	/* No buffer space available */ | ||||
| #define	pdFREERTOS_ERRNO_ENOPROTOOPT	109	/* Protocol not available */ | ||||
| #define	pdFREERTOS_ERRNO_EADDRINUSE		112	/* Address already in use */ | ||||
| #define	pdFREERTOS_ERRNO_ETIMEDOUT		116	/* Connection timed out */ | ||||
| #define	pdFREERTOS_ERRNO_EINPROGRESS	119	/* Connection already in progress */ | ||||
| #define	pdFREERTOS_ERRNO_EALREADY		120	/* Socket already connected */ | ||||
| #define	pdFREERTOS_ERRNO_EADDRNOTAVAIL 	125	/* Address not available */ | ||||
| #define	pdFREERTOS_ERRNO_EISCONN		127	/* Socket is already connected */ | ||||
| #define	pdFREERTOS_ERRNO_ENOTCONN		128	/* Socket is not connected */ | ||||
| #define	pdFREERTOS_ERRNO_ENOMEDIUM		135	/* No medium inserted */ | ||||
| #define	pdFREERTOS_ERRNO_EILSEQ			138	/* An invalid UTF-16 sequence was encountered. */ | ||||
| #define	pdFREERTOS_ERRNO_ECANCELED		140	/* Operation canceled. */ | ||||
|  | ||||
| /* The following endian values are used by FreeRTOS+ components, not FreeRTOS | ||||
| itself. */ | ||||
| #define pdFREERTOS_LITTLE_ENDIAN		0 | ||||
| #define pdFREERTOS_BIG_ENDIAN			1 | ||||
|  | ||||
| /* Re-defining endian values for generic naming. */ | ||||
| #define pdLITTLE_ENDIAN					pdFREERTOS_LITTLE_ENDIAN | ||||
| #define pdBIG_ENDIAN					pdFREERTOS_BIG_ENDIAN | ||||
|  | ||||
|  | ||||
| #endif /* PROJDEFS_H */ | ||||
							
								
								
									
										1480
									
								
								tools/sdk/esp32c3/include/freertos/include/freertos/queue.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1480
									
								
								tools/sdk/esp32c3/include/freertos/include/freertos/queue.h
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										1093
									
								
								tools/sdk/esp32c3/include/freertos/include/freertos/semphr.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1093
									
								
								tools/sdk/esp32c3/include/freertos/include/freertos/semphr.h
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @@ -0,0 +1,140 @@ | ||||
| /* | ||||
|  * FreeRTOS Kernel V10.2.1 | ||||
|  * Copyright (C) 2019 Amazon.com, Inc. or its affiliates.  All Rights Reserved. | ||||
|  * | ||||
|  * Permission is hereby granted, free of charge, to any person obtaining a copy of | ||||
|  * this software and associated documentation files (the "Software"), to deal in | ||||
|  * the Software without restriction, including without limitation the rights to | ||||
|  * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of | ||||
|  * the Software, and to permit persons to whom the Software is furnished to do so, | ||||
|  * subject to the following conditions: | ||||
|  * | ||||
|  * The above copyright notice and this permission notice shall be included in all | ||||
|  * copies or substantial portions of the Software. | ||||
|  * | ||||
|  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
|  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS | ||||
|  * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR | ||||
|  * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER | ||||
|  * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN | ||||
|  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. | ||||
|  * | ||||
|  * http://www.FreeRTOS.org | ||||
|  * http://aws.amazon.com/freertos | ||||
|  * | ||||
|  * 1 tab == 4 spaces! | ||||
|  */ | ||||
|  | ||||
| #ifndef STACK_MACROS_H | ||||
| #define STACK_MACROS_H | ||||
|  | ||||
| /* | ||||
|  * Call the stack overflow hook function if the stack of the task being swapped | ||||
|  * out is currently overflowed, or looks like it might have overflowed in the | ||||
|  * past. | ||||
|  * | ||||
|  * Setting configCHECK_FOR_STACK_OVERFLOW to 1 will cause the macro to check | ||||
|  * the current stack state only - comparing the current top of stack value to | ||||
|  * the stack limit.  Setting configCHECK_FOR_STACK_OVERFLOW to greater than 1 | ||||
|  * will also cause the last few stack bytes to be checked to ensure the value | ||||
|  * to which the bytes were set when the task was created have not been | ||||
|  * overwritten.  Note this second test does not guarantee that an overflowed | ||||
|  * stack will always be recognised. | ||||
|  */ | ||||
|  | ||||
| /*-----------------------------------------------------------*/ | ||||
|  | ||||
| #if( configCHECK_FOR_STACK_OVERFLOW == 0 ) | ||||
|  | ||||
| 	/* FreeRTOSConfig.h is not set to check for stack overflows. */ | ||||
| 	#define taskFIRST_CHECK_FOR_STACK_OVERFLOW() | ||||
| 	#define taskSECOND_CHECK_FOR_STACK_OVERFLOW() | ||||
|  | ||||
| #endif /* configCHECK_FOR_STACK_OVERFLOW == 0 */ | ||||
| /*-----------------------------------------------------------*/ | ||||
|  | ||||
| #if( configCHECK_FOR_STACK_OVERFLOW == 1 ) | ||||
|  | ||||
| 	/* FreeRTOSConfig.h is only set to use the first method of | ||||
| 	overflow checking. */ | ||||
| 	#define taskSECOND_CHECK_FOR_STACK_OVERFLOW() | ||||
|  | ||||
| #endif | ||||
| /*-----------------------------------------------------------*/ | ||||
|  | ||||
| #if( ( configCHECK_FOR_STACK_OVERFLOW > 0 ) && ( portSTACK_GROWTH < 0 ) ) | ||||
|  | ||||
| 	/* Only the current stack state is to be checked. */ | ||||
| 	#define taskFIRST_CHECK_FOR_STACK_OVERFLOW()														\ | ||||
| 	{																									\ | ||||
| 		/* Is the currently saved stack pointer within the stack limit? */								\ | ||||
| 		if( pxCurrentTCB[ xPortGetCoreID() ]->pxTopOfStack <= pxCurrentTCB[ xPortGetCoreID() ]->pxStack )										\ | ||||
| 		{																								\ | ||||
| 			vApplicationStackOverflowHook( ( TaskHandle_t ) pxCurrentTCB[ xPortGetCoreID() ], pxCurrentTCB[ xPortGetCoreID() ]->pcTaskName );	\ | ||||
| 		}																								\ | ||||
| 	} | ||||
|  | ||||
| #endif /* configCHECK_FOR_STACK_OVERFLOW > 0 */ | ||||
| /*-----------------------------------------------------------*/ | ||||
|  | ||||
| #if( ( configCHECK_FOR_STACK_OVERFLOW > 0 ) && ( portSTACK_GROWTH > 0 ) ) | ||||
|  | ||||
| 	/* Only the current stack state is to be checked. */ | ||||
| 	#define taskFIRST_CHECK_FOR_STACK_OVERFLOW()														\ | ||||
| 	{																									\ | ||||
| 																										\ | ||||
| 		/* Is the currently saved stack pointer within the stack limit? */								\ | ||||
| 		if( pxCurrentTCB[ xPortGetCoreID() ]->pxTopOfStack >= pxCurrentTCB[ xPortGetCoreID() ]->pxEndOfStack )									\ | ||||
| 		{																								\ | ||||
| 			vApplicationStackOverflowHook( ( TaskHandle_t ) pxCurrentTCB[ xPortGetCoreID() ], pxCurrentTCB[ xPortGetCoreID() ]->pcTaskName );	\ | ||||
| 		}																								\ | ||||
| 	} | ||||
|  | ||||
| #endif /* configCHECK_FOR_STACK_OVERFLOW == 1 */ | ||||
| /*-----------------------------------------------------------*/ | ||||
|  | ||||
| #if( ( configCHECK_FOR_STACK_OVERFLOW > 1 ) && ( portSTACK_GROWTH < 0 ) ) | ||||
|  | ||||
| 	#define taskSECOND_CHECK_FOR_STACK_OVERFLOW()																						\ | ||||
| 	{																																	\ | ||||
| 	static const uint8_t ucExpectedStackBytes[] = {	tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE,		\ | ||||
| 													tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE,		\ | ||||
| 													tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE,		\ | ||||
| 													tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE,		\ | ||||
| 													tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE };	\ | ||||
| 																																		\ | ||||
| 																																		\ | ||||
| 		/* Has the extremity of the task stack ever been written over? */																\ | ||||
| 		if( memcmp( ( void * ) pxCurrentTCB[ xPortGetCoreID() ]->pxStack, ( void * ) ucExpectedStackBytes, sizeof( ucExpectedStackBytes ) ) != 0 )			\ | ||||
| 		{																																\ | ||||
| 			vApplicationStackOverflowHook( ( TaskHandle_t ) pxCurrentTCB[ xPortGetCoreID() ], pxCurrentTCB[ xPortGetCoreID() ]->pcTaskName );									\ | ||||
| 		}																																\ | ||||
| 	} | ||||
|  | ||||
| #endif /* #if( configCHECK_FOR_STACK_OVERFLOW > 1 ) */ | ||||
| /*-----------------------------------------------------------*/ | ||||
|  | ||||
| #if( ( configCHECK_FOR_STACK_OVERFLOW > 1 ) && ( portSTACK_GROWTH > 0 ) ) | ||||
|  | ||||
| 	#define taskSECOND_CHECK_FOR_STACK_OVERFLOW()																						\ | ||||
| 	{																																	\ | ||||
| 	int8_t *pcEndOfStack = ( int8_t * ) pxCurrentTCB[ xPortGetCoreID() ]->pxEndOfStack;																		\ | ||||
| 	static const uint8_t ucExpectedStackBytes[] = {	tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE,		\ | ||||
| 													tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE,		\ | ||||
| 													tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE,		\ | ||||
| 													tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE,		\ | ||||
| 													tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE };	\ | ||||
| 																																		\ | ||||
| 																																		\ | ||||
| 		pcEndOfStack -= sizeof( ucExpectedStackBytes );																					\ | ||||
| 																																		\ | ||||
| 		/* Has the extremity of the task stack ever been written over? */																\ | ||||
| 		if( memcmp( ( void * ) pcEndOfStack, ( void * ) ucExpectedStackBytes, sizeof( ucExpectedStackBytes ) ) != 0 )					\ | ||||
| 		{																																\ | ||||
| 			vApplicationStackOverflowHook( ( TaskHandle_t ) pxCurrentTCB[ xPortGetCoreID() ], pxCurrentTCB[ xPortGetCoreID() ]->pcTaskName );									\ | ||||
| 		}																																\ | ||||
| 	} | ||||
|  | ||||
| #endif /* #if( configCHECK_FOR_STACK_OVERFLOW > 1 ) */ | ||||
|  | ||||
| #endif /* STACK_MACROS_H */ | ||||
| @@ -0,0 +1,745 @@ | ||||
| /* | ||||
|  * FreeRTOS Kernel V10.2.1 | ||||
|  * Copyright (C) 2019 Amazon.com, Inc. or its affiliates.  All Rights Reserved. | ||||
|  * | ||||
|  * Permission is hereby granted, free of charge, to any person obtaining a copy of | ||||
|  * this software and associated documentation files (the "Software"), to deal in | ||||
|  * the Software without restriction, including without limitation the rights to | ||||
|  * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of | ||||
|  * the Software, and to permit persons to whom the Software is furnished to do so, | ||||
|  * subject to the following conditions: | ||||
|  * | ||||
|  * The above copyright notice and this permission notice shall be included in all | ||||
|  * copies or substantial portions of the Software. | ||||
|  * | ||||
|  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
|  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS | ||||
|  * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR | ||||
|  * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER | ||||
|  * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN | ||||
|  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. | ||||
|  * | ||||
|  * http://www.FreeRTOS.org | ||||
|  * http://aws.amazon.com/freertos | ||||
|  * | ||||
|  * 1 tab == 4 spaces! | ||||
|  */ | ||||
|  | ||||
| /* | ||||
|  * Stream buffers are used to send a continuous stream of data from one task or | ||||
|  * interrupt to another.  Their implementation is light weight, making them | ||||
|  * particularly suited for interrupt to task and core to core communication | ||||
|  * scenarios. | ||||
|  * | ||||
|  * ***NOTE***:  Uniquely among FreeRTOS objects, the stream buffer | ||||
|  * implementation (so also the message buffer implementation, as message buffers | ||||
|  * are built on top of stream buffers) assumes there is only one task or | ||||
|  * interrupt that will write to the buffer (the writer), and only one task or | ||||
|  * interrupt that will read from the buffer (the reader).  It is safe for the | ||||
|  * writer and reader to be different tasks or interrupts, but, unlike other | ||||
|  * FreeRTOS objects, it is not safe to have multiple different writers or | ||||
|  * multiple different readers.  If there are to be multiple different writers | ||||
|  * then the application writer must place each call to a writing API function | ||||
|  * (such as xStreamBufferSend()) inside a critical section and set the send | ||||
|  * block time to 0.  Likewise, if there are to be multiple different readers | ||||
|  * then the application writer must place each call to a reading API function | ||||
|  * (such as xStreamBufferRead()) inside a critical section section and set the | ||||
|  * receive block time to 0. | ||||
|  * | ||||
|  */ | ||||
|  | ||||
| #ifndef STREAM_BUFFER_H | ||||
| #define STREAM_BUFFER_H | ||||
|  | ||||
| #ifndef INC_FREERTOS_H | ||||
| 	#error "include FreeRTOS.h must appear in source files before include stream_buffer.h" | ||||
| #endif | ||||
|  | ||||
| #if defined( __cplusplus ) | ||||
| extern "C" { | ||||
| #endif | ||||
|  | ||||
| /** | ||||
|  * Type by which stream buffers are referenced.  For example, a call to | ||||
|  * xStreamBufferCreate() returns an StreamBufferHandle_t variable that can | ||||
|  * then be used as a parameter to xStreamBufferSend(), xStreamBufferReceive(), | ||||
|  * etc. | ||||
|  */ | ||||
| struct StreamBufferDef_t; | ||||
| typedef struct StreamBufferDef_t * StreamBufferHandle_t; | ||||
|  | ||||
| /** | ||||
|  * Creates a new stream buffer using dynamically allocated memory.  See | ||||
|  * xStreamBufferCreateStatic() for a version that uses statically allocated | ||||
|  * memory (memory that is allocated at compile time). | ||||
|  * | ||||
|  * configSUPPORT_DYNAMIC_ALLOCATION must be set to 1 or left undefined in | ||||
|  * FreeRTOSConfig.h for xStreamBufferCreate() to be available. | ||||
|  * | ||||
|  * @param xBufferSizeBytes The total number of bytes the stream buffer will be | ||||
|  * able to hold at any one time. | ||||
|  * | ||||
|  * @param xTriggerLevelBytes The number of bytes that must be in the stream | ||||
|  * buffer before a task that is blocked on the stream buffer to wait for data is | ||||
|  * moved out of the blocked state.  For example, if a task is blocked on a read | ||||
|  * of an empty stream buffer that has a trigger level of 1 then the task will be | ||||
|  * unblocked when a single byte is written to the buffer or the task's block | ||||
|  * time expires.  As another example, if a task is blocked on a read of an empty | ||||
|  * stream buffer that has a trigger level of 10 then the task will not be | ||||
|  * unblocked until the stream buffer contains at least 10 bytes or the task's | ||||
|  * block time expires.  If a reading task's block time expires before the | ||||
|  * trigger level is reached then the task will still receive however many bytes | ||||
|  * are actually available.  Setting a trigger level of 0 will result in a | ||||
|  * trigger level of 1 being used.  It is not valid to specify a trigger level | ||||
|  * that is greater than the buffer size. | ||||
|  * | ||||
|  * @return If NULL is returned, then the stream buffer cannot be created | ||||
|  * because there is insufficient heap memory available for FreeRTOS to allocate | ||||
|  * the stream buffer data structures and storage area.  A non-NULL value being | ||||
|  * returned indicates that the stream buffer has been created successfully - | ||||
|  * the returned value should be stored as the handle to the created stream | ||||
|  * buffer. | ||||
|  * | ||||
|  * Example use: | ||||
|  * @code{c} | ||||
|  * | ||||
|  *   void vAFunction( void ) | ||||
|  *       { | ||||
|  *       StreamBufferHandle_t xStreamBuffer; | ||||
|  *       const size_t xStreamBufferSizeBytes = 100, xTriggerLevel = 10; | ||||
|  * | ||||
|  *           // Create a stream buffer that can hold 100 bytes.  The memory used to hold | ||||
|  *           // both the stream buffer structure and the data in the stream buffer is | ||||
|  *           // allocated dynamically. | ||||
|  *           xStreamBuffer = xStreamBufferCreate( xStreamBufferSizeBytes, xTriggerLevel ); | ||||
|  * | ||||
|  *           if( xStreamBuffer == NULL ) | ||||
|  *           { | ||||
|  *              // There was not enough heap memory space available to create the | ||||
|  *              // stream buffer. | ||||
|  *           } | ||||
|  *           else | ||||
|  *           { | ||||
|  *               // The stream buffer was created successfully and can now be used. | ||||
|  *           } | ||||
|  *       } | ||||
|  * @endcode | ||||
|  * \ingroup StreamBufferManagement | ||||
|  */ | ||||
| #define xStreamBufferCreate( xBufferSizeBytes, xTriggerLevelBytes ) xStreamBufferGenericCreate( xBufferSizeBytes, xTriggerLevelBytes, pdFALSE ) | ||||
|  | ||||
| /** | ||||
|  * Creates a new stream buffer using statically allocated memory.  See | ||||
|  * xStreamBufferCreate() for a version that uses dynamically allocated memory. | ||||
|  * | ||||
|  * configSUPPORT_STATIC_ALLOCATION must be set to 1 in FreeRTOSConfig.h for | ||||
|  * xStreamBufferCreateStatic() to be available. | ||||
|  * | ||||
|  * @param xBufferSizeBytes The size, in bytes, of the buffer pointed to by the | ||||
|  * pucStreamBufferStorageArea parameter. | ||||
|  * | ||||
|  * @param xTriggerLevelBytes The number of bytes that must be in the stream | ||||
|  * buffer before a task that is blocked on the stream buffer to wait for data is | ||||
|  * moved out of the blocked state.  For example, if a task is blocked on a read | ||||
|  * of an empty stream buffer that has a trigger level of 1 then the task will be | ||||
|  * unblocked when a single byte is written to the buffer or the task's block | ||||
|  * time expires.  As another example, if a task is blocked on a read of an empty | ||||
|  * stream buffer that has a trigger level of 10 then the task will not be | ||||
|  * unblocked until the stream buffer contains at least 10 bytes or the task's | ||||
|  * block time expires.  If a reading task's block time expires before the | ||||
|  * trigger level is reached then the task will still receive however many bytes | ||||
|  * are actually available.  Setting a trigger level of 0 will result in a | ||||
|  * trigger level of 1 being used.  It is not valid to specify a trigger level | ||||
|  * that is greater than the buffer size. | ||||
|  * | ||||
|  * @param pucStreamBufferStorageArea Must point to a uint8_t array that is at | ||||
|  * least xBufferSizeBytes + 1 big.  This is the array to which streams are | ||||
|  * copied when they are written to the stream buffer. | ||||
|  * | ||||
|  * @param pxStaticStreamBuffer Must point to a variable of type | ||||
|  * StaticStreamBuffer_t, which will be used to hold the stream buffer's data | ||||
|  * structure. | ||||
|  * | ||||
|  * @return If the stream buffer is created successfully then a handle to the | ||||
|  * created stream buffer is returned. If either pucStreamBufferStorageArea or | ||||
|  * pxStaticstreamBuffer are NULL then NULL is returned. | ||||
|  * | ||||
|  * Example use: | ||||
|  * @code{c} | ||||
|  * | ||||
|  *       // Used to dimension the array used to hold the streams.  The available space | ||||
|  *       // will actually be one less than this, so 999. | ||||
|  *       #define STORAGE_SIZE_BYTES 1000 | ||||
|  * | ||||
|  *       // Defines the memory that will actually hold the streams within the stream | ||||
|  *       // buffer. | ||||
|  *       static uint8_t ucStorageBuffer[ STORAGE_SIZE_BYTES ]; | ||||
|  * | ||||
|  *       // The variable used to hold the stream buffer structure. | ||||
|  *       StaticStreamBuffer_t xStreamBufferStruct; | ||||
|  * | ||||
|  *       void MyFunction( void ) | ||||
|  *       { | ||||
|  *       StreamBufferHandle_t xStreamBuffer; | ||||
|  *       const size_t xTriggerLevel = 1; | ||||
|  * | ||||
|  *           xStreamBuffer = xStreamBufferCreateStatic( sizeof( ucBufferStorage ), | ||||
|  *                                                      xTriggerLevel, | ||||
|  *                                                      ucBufferStorage, | ||||
|  *                                                      &xStreamBufferStruct ); | ||||
|  * | ||||
|  *           // As neither the pucStreamBufferStorageArea or pxStaticStreamBuffer | ||||
|  *           // parameters were NULL, xStreamBuffer will not be NULL, and can be used to | ||||
|  *           // reference the created stream buffer in other stream buffer API calls. | ||||
|  * | ||||
|  *           // Other code that uses the stream buffer can go here. | ||||
|  *       } | ||||
|  * | ||||
|  * @endcode | ||||
|  * \ingroup StreamBufferManagement | ||||
|  */ | ||||
| #define xStreamBufferCreateStatic( xBufferSizeBytes, xTriggerLevelBytes, pucStreamBufferStorageArea, pxStaticStreamBuffer ) xStreamBufferGenericCreateStatic( xBufferSizeBytes, xTriggerLevelBytes, pdFALSE, pucStreamBufferStorageArea, pxStaticStreamBuffer ) | ||||
|  | ||||
| /** | ||||
|  * Sends bytes to a stream buffer.  The bytes are copied into the stream buffer. | ||||
|  * | ||||
|  * ***NOTE***:  Uniquely among FreeRTOS objects, the stream buffer | ||||
|  * implementation (so also the message buffer implementation, as message buffers | ||||
|  * are built on top of stream buffers) assumes there is only one task or | ||||
|  * interrupt that will write to the buffer (the writer), and only one task or | ||||
|  * interrupt that will read from the buffer (the reader).  It is safe for the | ||||
|  * writer and reader to be different tasks or interrupts, but, unlike other | ||||
|  * FreeRTOS objects, it is not safe to have multiple different writers or | ||||
|  * multiple different readers.  If there are to be multiple different writers | ||||
|  * then the application writer must place each call to a writing API function | ||||
|  * (such as xStreamBufferSend()) inside a critical section and set the send | ||||
|  * block time to 0.  Likewise, if there are to be multiple different readers | ||||
|  * then the application writer must place each call to a reading API function | ||||
|  * (such as xStreamBufferRead()) inside a critical section and set the receive | ||||
|  * block time to 0. | ||||
|  * | ||||
|  * Use xStreamBufferSend() to write to a stream buffer from a task.  Use | ||||
|  * xStreamBufferSendFromISR() to write to a stream buffer from an interrupt | ||||
|  * service routine (ISR). | ||||
|  * | ||||
|  * @param xStreamBuffer The handle of the stream buffer to which a stream is | ||||
|  * being sent. | ||||
|  * | ||||
|  * @param pvTxData A pointer to the buffer that holds the bytes to be copied | ||||
|  * into the stream buffer. | ||||
|  * | ||||
|  * @param xDataLengthBytes   The maximum number of bytes to copy from pvTxData | ||||
|  * into the stream buffer. | ||||
|  * | ||||
|  * @param xTicksToWait The maximum amount of time the task should remain in the | ||||
|  * Blocked state to wait for enough space to become available in the stream | ||||
|  * buffer, should the stream buffer contain too little space to hold the | ||||
|  * another xDataLengthBytes bytes.  The block time is specified in tick periods, | ||||
|  * so the absolute time it represents is dependent on the tick frequency.  The | ||||
|  * macro pdMS_TO_TICKS() can be used to convert a time specified in milliseconds | ||||
|  * into a time specified in ticks.  Setting xTicksToWait to portMAX_DELAY will | ||||
|  * cause the task to wait indefinitely (without timing out), provided | ||||
|  * INCLUDE_vTaskSuspend is set to 1 in FreeRTOSConfig.h.  If a task times out | ||||
|  * before it can write all xDataLengthBytes into the buffer it will still write | ||||
|  * as many bytes as possible.  A task does not use any CPU time when it is in | ||||
|  * the blocked state. | ||||
|  * | ||||
|  * @return The number of bytes written to the stream buffer.  If a task times | ||||
|  * out before it can write all xDataLengthBytes into the buffer it will still | ||||
|  * write as many bytes as possible. | ||||
|  * | ||||
|  * Example use: | ||||
|  * @code{c} | ||||
|  *       void vAFunction( StreamBufferHandle_t xStreamBuffer ) | ||||
|  *       { | ||||
|  *       size_t xBytesSent; | ||||
|  *       uint8_t ucArrayToSend[] = { 0, 1, 2, 3 }; | ||||
|  *       char *pcStringToSend = "String to send"; | ||||
|  *       const TickType_t x100ms = pdMS_TO_TICKS( 100 ); | ||||
|  * | ||||
|  *           // Send an array to the stream buffer, blocking for a maximum of 100ms to | ||||
|  *           // wait for enough space to be available in the stream buffer. | ||||
|  *           xBytesSent = xStreamBufferSend( xStreamBuffer, ( void * ) ucArrayToSend, sizeof( ucArrayToSend ), x100ms ); | ||||
|  * | ||||
|  *           if( xBytesSent != sizeof( ucArrayToSend ) ) | ||||
|  *           { | ||||
|  *              // The call to xStreamBufferSend() times out before there was enough | ||||
|  *              // space in the buffer for the data to be written, but it did | ||||
|  *              // successfully write xBytesSent bytes. | ||||
|  *           } | ||||
|  * | ||||
|  *           // Send the string to the stream buffer.  Return immediately if there is not | ||||
|  *           // enough space in the buffer. | ||||
|  *           xBytesSent = xStreamBufferSend( xStreamBuffer, ( void * ) pcStringToSend, strlen( pcStringToSend ), 0 ); | ||||
|  * | ||||
|  *           if( xBytesSent != strlen( pcStringToSend ) ) | ||||
|  *           { | ||||
|  *              // The entire string could not be added to the stream buffer because | ||||
|  *              // there was not enough free space in the buffer, but xBytesSent bytes | ||||
|  *              // were sent.  Could try again to send the remaining bytes. | ||||
|  *           } | ||||
|  *       } | ||||
|  * @endcode | ||||
|  * \ingroup StreamBufferManagement | ||||
|  */ | ||||
| size_t xStreamBufferSend( StreamBufferHandle_t xStreamBuffer, | ||||
| 						  const void *pvTxData, | ||||
| 						  size_t xDataLengthBytes, | ||||
| 						  TickType_t xTicksToWait ) PRIVILEGED_FUNCTION; | ||||
|  | ||||
| /** | ||||
|  * Interrupt safe version of the API function that sends a stream of bytes to | ||||
|  * the stream buffer. | ||||
|  * | ||||
|  * ***NOTE***:  Uniquely among FreeRTOS objects, the stream buffer | ||||
|  * implementation (so also the message buffer implementation, as message buffers | ||||
|  * are built on top of stream buffers) assumes there is only one task or | ||||
|  * interrupt that will write to the buffer (the writer), and only one task or | ||||
|  * interrupt that will read from the buffer (the reader).  It is safe for the | ||||
|  * writer and reader to be different tasks or interrupts, but, unlike other | ||||
|  * FreeRTOS objects, it is not safe to have multiple different writers or | ||||
|  * multiple different readers.  If there are to be multiple different writers | ||||
|  * then the application writer must place each call to a writing API function | ||||
|  * (such as xStreamBufferSend()) inside a critical section and set the send | ||||
|  * block time to 0.  Likewise, if there are to be multiple different readers | ||||
|  * then the application writer must place each call to a reading API function | ||||
|  * (such as xStreamBufferRead()) inside a critical section and set the receive | ||||
|  * block time to 0. | ||||
|  * | ||||
|  * Use xStreamBufferSend() to write to a stream buffer from a task.  Use | ||||
|  * xStreamBufferSendFromISR() to write to a stream buffer from an interrupt | ||||
|  * service routine (ISR). | ||||
|  * | ||||
|  * @param xStreamBuffer The handle of the stream buffer to which a stream is | ||||
|  * being sent. | ||||
|  * | ||||
|  * @param pvTxData A pointer to the data that is to be copied into the stream | ||||
|  * buffer. | ||||
|  * | ||||
|  * @param xDataLengthBytes The maximum number of bytes to copy from pvTxData | ||||
|  * into the stream buffer. | ||||
|  * | ||||
|  * @param pxHigherPriorityTaskWoken  It is possible that a stream buffer will | ||||
|  * have a task blocked on it waiting for data.  Calling | ||||
|  * xStreamBufferSendFromISR() can make data available, and so cause a task that | ||||
|  * was waiting for data to leave the Blocked state.  If calling | ||||
|  * xStreamBufferSendFromISR() causes a task to leave the Blocked state, and the | ||||
|  * unblocked task has a priority higher than the currently executing task (the | ||||
|  * task that was interrupted), then, internally, xStreamBufferSendFromISR() | ||||
|  * will set *pxHigherPriorityTaskWoken to pdTRUE.  If | ||||
|  * xStreamBufferSendFromISR() sets this value to pdTRUE, then normally a | ||||
|  * context switch should be performed before the interrupt is exited.  This will | ||||
|  * ensure that the interrupt returns directly to the highest priority Ready | ||||
|  * state task.  *pxHigherPriorityTaskWoken should be set to pdFALSE before it | ||||
|  * is passed into the function.  See the example code below for an example. | ||||
|  * | ||||
|  * @return The number of bytes actually written to the stream buffer, which will | ||||
|  * be less than xDataLengthBytes if the stream buffer didn't have enough free | ||||
|  * space for all the bytes to be written. | ||||
|  * | ||||
|  * Example use: | ||||
|  * @code{c} | ||||
|  *   //A stream buffer that has already been created. | ||||
|  *   StreamBufferHandle_t xStreamBuffer; | ||||
|  * | ||||
|  *   void vAnInterruptServiceRoutine( void ) | ||||
|  *   { | ||||
|  *   size_t xBytesSent; | ||||
|  *   char *pcStringToSend = "String to send"; | ||||
|  *   BaseType_t xHigherPriorityTaskWoken = pdFALSE; // Initialised to pdFALSE. | ||||
|  * | ||||
|  *       // Attempt to send the string to the stream buffer. | ||||
|  *       xBytesSent = xStreamBufferSendFromISR( xStreamBuffer, | ||||
|  *                                           ( void * ) pcStringToSend, | ||||
|  *                                           strlen( pcStringToSend ), | ||||
|  *                                           &xHigherPriorityTaskWoken ); | ||||
|  * | ||||
|  *       if( xBytesSent != strlen( pcStringToSend ) ) | ||||
|  *       { | ||||
|  *           // There was not enough free space in the stream buffer for the entire | ||||
|  *           // string to be written, ut xBytesSent bytes were written. | ||||
|  *       } | ||||
|  * | ||||
|  *       // If xHigherPriorityTaskWoken was set to pdTRUE inside | ||||
|  *       // xStreamBufferSendFromISR() then a task that has a priority above the | ||||
|  *       // priority of the currently executing task was unblocked and a context | ||||
|  *       // switch should be performed to ensure the ISR returns to the unblocked | ||||
|  *       // task.  In most FreeRTOS ports this is done by simply passing | ||||
|  *       // xHigherPriorityTaskWoken into taskYIELD_FROM_ISR(), which will test the | ||||
|  *       // variables value, and perform the context switch if necessary.  Check the | ||||
|  *       // documentation for the port in use for port specific instructions. | ||||
|  *       taskYIELD_FROM_ISR( xHigherPriorityTaskWoken ); | ||||
|  *   } | ||||
|  * @endcode | ||||
|  * \ingroup StreamBufferManagement | ||||
|  */ | ||||
| size_t xStreamBufferSendFromISR( StreamBufferHandle_t xStreamBuffer, | ||||
| 								 const void *pvTxData, | ||||
| 								 size_t xDataLengthBytes, | ||||
| 								 BaseType_t * const pxHigherPriorityTaskWoken ) PRIVILEGED_FUNCTION; | ||||
|  | ||||
| /** | ||||
|  * Receives bytes from a stream buffer. | ||||
|  * | ||||
|  * ***NOTE***:  Uniquely among FreeRTOS objects, the stream buffer | ||||
|  * implementation (so also the message buffer implementation, as message buffers | ||||
|  * are built on top of stream buffers) assumes there is only one task or | ||||
|  * interrupt that will write to the buffer (the writer), and only one task or | ||||
|  * interrupt that will read from the buffer (the reader).  It is safe for the | ||||
|  * writer and reader to be different tasks or interrupts, but, unlike other | ||||
|  * FreeRTOS objects, it is not safe to have multiple different writers or | ||||
|  * multiple different readers.  If there are to be multiple different writers | ||||
|  * then the application writer must place each call to a writing API function | ||||
|  * (such as xStreamBufferSend()) inside a critical section and set the send | ||||
|  * block time to 0.  Likewise, if there are to be multiple different readers | ||||
|  * then the application writer must place each call to a reading API function | ||||
|  * (such as xStreamBufferRead()) inside a critical section and set the receive | ||||
|  * block time to 0. | ||||
|  * | ||||
|  * Use xStreamBufferReceive() to read from a stream buffer from a task.  Use | ||||
|  * xStreamBufferReceiveFromISR() to read from a stream buffer from an | ||||
|  * interrupt service routine (ISR). | ||||
|  * | ||||
|  * @param xStreamBuffer The handle of the stream buffer from which bytes are to | ||||
|  * be received. | ||||
|  * | ||||
|  * @param pvRxData A pointer to the buffer into which the received bytes will be | ||||
|  * copied. | ||||
|  * | ||||
|  * @param xBufferLengthBytes The length of the buffer pointed to by the | ||||
|  * pvRxData parameter.  This sets the maximum number of bytes to receive in one | ||||
|  * call.  xStreamBufferReceive will return as many bytes as possible up to a | ||||
|  * maximum set by xBufferLengthBytes. | ||||
|  * | ||||
|  * @param xTicksToWait The maximum amount of time the task should remain in the | ||||
|  * Blocked state to wait for data to become available if the stream buffer is | ||||
|  * empty.  xStreamBufferReceive() will return immediately if xTicksToWait is | ||||
|  * zero.  The block time is specified in tick periods, so the absolute time it | ||||
|  * represents is dependent on the tick frequency.  The macro pdMS_TO_TICKS() can | ||||
|  * be used to convert a time specified in milliseconds into a time specified in | ||||
|  * ticks.  Setting xTicksToWait to portMAX_DELAY will cause the task to wait | ||||
|  * indefinitely (without timing out), provided INCLUDE_vTaskSuspend is set to 1 | ||||
|  * in FreeRTOSConfig.h.  A task does not use any CPU time when it is in the | ||||
|  * Blocked state. | ||||
|  * | ||||
|  * @return The number of bytes actually read from the stream buffer, which will | ||||
|  * be less than xBufferLengthBytes if the call to xStreamBufferReceive() timed | ||||
|  * out before xBufferLengthBytes were available. | ||||
|  * | ||||
|  * Example use: | ||||
|  * @code{c} | ||||
|  *   void vAFunction( StreamBuffer_t xStreamBuffer ) | ||||
|  *   { | ||||
|  *   uint8_t ucRxData[ 20 ]; | ||||
|  *   size_t xReceivedBytes; | ||||
|  *   const TickType_t xBlockTime = pdMS_TO_TICKS( 20 ); | ||||
|  * | ||||
|  *       // Receive up to another sizeof( ucRxData ) bytes from the stream buffer. | ||||
|  *       // Wait in the Blocked state (so not using any CPU processing time) for a | ||||
|  *       // maximum of 100ms for the full sizeof( ucRxData ) number of bytes to be | ||||
|  *       // available. | ||||
|  *       xReceivedBytes = xStreamBufferReceive( xStreamBuffer, | ||||
|  *                                           ( void * ) ucRxData, | ||||
|  *                                           sizeof( ucRxData ), | ||||
|  *                                           xBlockTime ); | ||||
|  * | ||||
|  *       if( xReceivedBytes > 0 ) | ||||
|  *       { | ||||
|  *           // A ucRxData contains another xRecievedBytes bytes of data, which can | ||||
|  *           // be processed here.... | ||||
|  *       } | ||||
|  *   } | ||||
|  * @endcode | ||||
|  * \ingroup StreamBufferManagement | ||||
|  */ | ||||
| size_t xStreamBufferReceive( StreamBufferHandle_t xStreamBuffer, | ||||
| 							 void *pvRxData, | ||||
| 							 size_t xBufferLengthBytes, | ||||
| 							 TickType_t xTicksToWait ) PRIVILEGED_FUNCTION; | ||||
|  | ||||
|  | ||||
| /** | ||||
|  * An interrupt safe version of the API function that receives bytes from a | ||||
|  * stream buffer. | ||||
|  * | ||||
|  * Use xStreamBufferReceive() to read bytes from a stream buffer from a task. | ||||
|  * Use xStreamBufferReceiveFromISR() to read bytes from a stream buffer from an | ||||
|  * interrupt service routine (ISR). | ||||
|  * | ||||
|  * @param xStreamBuffer The handle of the stream buffer from which a stream | ||||
|  * is being received. | ||||
|  * | ||||
|  * @param pvRxData A pointer to the buffer into which the received bytes are | ||||
|  * copied. | ||||
|  * | ||||
|  * @param xBufferLengthBytes The length of the buffer pointed to by the | ||||
|  * pvRxData parameter.  This sets the maximum number of bytes to receive in one | ||||
|  * call.  xStreamBufferReceive will return as many bytes as possible up to a | ||||
|  * maximum set by xBufferLengthBytes. | ||||
|  * | ||||
|  * @param pxHigherPriorityTaskWoken  It is possible that a stream buffer will | ||||
|  * have a task blocked on it waiting for space to become available.  Calling | ||||
|  * xStreamBufferReceiveFromISR() can make space available, and so cause a task | ||||
|  * that is waiting for space to leave the Blocked state.  If calling | ||||
|  * xStreamBufferReceiveFromISR() causes a task to leave the Blocked state, and | ||||
|  * the unblocked task has a priority higher than the currently executing task | ||||
|  * (the task that was interrupted), then, internally, | ||||
|  * xStreamBufferReceiveFromISR() will set *pxHigherPriorityTaskWoken to pdTRUE. | ||||
|  * If xStreamBufferReceiveFromISR() sets this value to pdTRUE, then normally a | ||||
|  * context switch should be performed before the interrupt is exited.  That will | ||||
|  * ensure the interrupt returns directly to the highest priority Ready state | ||||
|  * task.  *pxHigherPriorityTaskWoken should be set to pdFALSE before it is | ||||
|  * passed into the function.  See the code example below for an example. | ||||
|  * | ||||
|  * @return The number of bytes read from the stream buffer, if any. | ||||
|  * | ||||
|  * Example use: | ||||
|  * @code{c} | ||||
|  *   // A stream buffer that has already been created. | ||||
|  *   StreamBuffer_t xStreamBuffer; | ||||
|  * | ||||
|  *   void vAnInterruptServiceRoutine( void ) | ||||
|  *   { | ||||
|  *   uint8_t ucRxData[ 20 ]; | ||||
|  *   size_t xReceivedBytes; | ||||
|  *   BaseType_t xHigherPriorityTaskWoken = pdFALSE;  // Initialised to pdFALSE. | ||||
|  * | ||||
|  *       // Receive the next stream from the stream buffer. | ||||
|  *       xReceivedBytes = xStreamBufferReceiveFromISR( xStreamBuffer, | ||||
|  *                                                   ( void * ) ucRxData, | ||||
|  *                                                   sizeof( ucRxData ), | ||||
|  *                                                   &xHigherPriorityTaskWoken ); | ||||
|  * | ||||
|  *       if( xReceivedBytes > 0 ) | ||||
|  *       { | ||||
|  *           // ucRxData contains xReceivedBytes read from the stream buffer. | ||||
|  *           // Process the stream here.... | ||||
|  *       } | ||||
|  * | ||||
|  *       // If xHigherPriorityTaskWoken was set to pdTRUE inside | ||||
|  *       // xStreamBufferReceiveFromISR() then a task that has a priority above the | ||||
|  *       // priority of the currently executing task was unblocked and a context | ||||
|  *       // switch should be performed to ensure the ISR returns to the unblocked | ||||
|  *       // task.  In most FreeRTOS ports this is done by simply passing | ||||
|  *       // xHigherPriorityTaskWoken into taskYIELD_FROM_ISR(), which will test the | ||||
|  *       // variables value, and perform the context switch if necessary.  Check the | ||||
|  *       // documentation for the port in use for port specific instructions. | ||||
|  *       taskYIELD_FROM_ISR( xHigherPriorityTaskWoken ); | ||||
|  *   } | ||||
|  * @endcode | ||||
|  * \ingroup StreamBufferManagement | ||||
|  */ | ||||
| size_t xStreamBufferReceiveFromISR( StreamBufferHandle_t xStreamBuffer, | ||||
| 									void *pvRxData, | ||||
| 									size_t xBufferLengthBytes, | ||||
| 									BaseType_t * const pxHigherPriorityTaskWoken ) PRIVILEGED_FUNCTION; | ||||
|  | ||||
| /** | ||||
|  * Deletes a stream buffer that was previously created using a call to | ||||
|  * xStreamBufferCreate() or xStreamBufferCreateStatic().  If the stream | ||||
|  * buffer was created using dynamic memory (that is, by xStreamBufferCreate()), | ||||
|  * then the allocated memory is freed. | ||||
|  * | ||||
|  * A stream buffer handle must not be used after the stream buffer has been | ||||
|  * deleted. | ||||
|  * | ||||
|  * @param xStreamBuffer The handle of the stream buffer to be deleted. | ||||
|  * | ||||
|  * \ingroup StreamBufferManagement | ||||
|  */ | ||||
| void vStreamBufferDelete( StreamBufferHandle_t xStreamBuffer ) PRIVILEGED_FUNCTION; | ||||
|  | ||||
| /** | ||||
|  * Queries a stream buffer to see if it is full.  A stream buffer is full if it | ||||
|  * does not have any free space, and therefore cannot accept any more data. | ||||
|  * | ||||
|  * @param xStreamBuffer The handle of the stream buffer being queried. | ||||
|  * | ||||
|  * @return If the stream buffer is full then pdTRUE is returned.  Otherwise | ||||
|  * pdFALSE is returned. | ||||
|  * | ||||
|  * \ingroup StreamBufferManagement | ||||
|  */ | ||||
| BaseType_t xStreamBufferIsFull( StreamBufferHandle_t xStreamBuffer ) PRIVILEGED_FUNCTION; | ||||
|  | ||||
| /** | ||||
|  * Queries a stream buffer to see if it is empty.  A stream buffer is empty if | ||||
|  * it does not contain any data. | ||||
|  * | ||||
|  * @param xStreamBuffer The handle of the stream buffer being queried. | ||||
|  * | ||||
|  * @return If the stream buffer is empty then pdTRUE is returned.  Otherwise | ||||
|  * pdFALSE is returned. | ||||
|  * | ||||
|  * \ingroup StreamBufferManagement | ||||
|  */ | ||||
| BaseType_t xStreamBufferIsEmpty( StreamBufferHandle_t xStreamBuffer ) PRIVILEGED_FUNCTION; | ||||
|  | ||||
| /** | ||||
|  * Resets a stream buffer to its initial, empty, state.  Any data that was in | ||||
|  * the stream buffer is discarded.  A stream buffer can only be reset if there | ||||
|  * are no tasks blocked waiting to either send to or receive from the stream | ||||
|  * buffer. | ||||
|  * | ||||
|  * @param xStreamBuffer The handle of the stream buffer being reset. | ||||
|  * | ||||
|  * @return If the stream buffer is reset then pdPASS is returned.  If there was | ||||
|  * a task blocked waiting to send to or read from the stream buffer then the | ||||
|  * stream buffer is not reset and pdFAIL is returned. | ||||
|  * | ||||
|  * \ingroup StreamBufferManagement | ||||
|  */ | ||||
| BaseType_t xStreamBufferReset( StreamBufferHandle_t xStreamBuffer ) PRIVILEGED_FUNCTION; | ||||
|  | ||||
| /** | ||||
|  * Queries a stream buffer to see how much free space it contains, which is | ||||
|  * equal to the amount of data that can be sent to the stream buffer before it | ||||
|  * is full. | ||||
|  * | ||||
|  * @param xStreamBuffer The handle of the stream buffer being queried. | ||||
|  * | ||||
|  * @return The number of bytes that can be written to the stream buffer before | ||||
|  * the stream buffer would be full. | ||||
|  * | ||||
|  * \defgroup xStreamBufferSpacesAvailable xStreamBufferSpacesAvailable | ||||
|  * \ingroup StreamBufferManagement | ||||
|  */ | ||||
| size_t xStreamBufferSpacesAvailable( StreamBufferHandle_t xStreamBuffer ) PRIVILEGED_FUNCTION; | ||||
|  | ||||
| /** | ||||
|  * Queries a stream buffer to see how much data it contains, which is equal to | ||||
|  * the number of bytes that can be read from the stream buffer before the stream | ||||
|  * buffer would be empty. | ||||
|  * | ||||
|  * @param xStreamBuffer The handle of the stream buffer being queried. | ||||
|  * | ||||
|  * @return The number of bytes that can be read from the stream buffer before | ||||
|  * the stream buffer would be empty. | ||||
|  * | ||||
|  * \defgroup xStreamBufferBytesAvailable xStreamBufferBytesAvailable | ||||
|  * \ingroup StreamBufferManagement | ||||
|  */ | ||||
| size_t xStreamBufferBytesAvailable( StreamBufferHandle_t xStreamBuffer ) PRIVILEGED_FUNCTION; | ||||
|  | ||||
| /** | ||||
|  * A stream buffer's trigger level is the number of bytes that must be in the | ||||
|  * stream buffer before a task that is blocked on the stream buffer to | ||||
|  * wait for data is moved out of the blocked state.  For example, if a task is | ||||
|  * blocked on a read of an empty stream buffer that has a trigger level of 1 | ||||
|  * then the task will be unblocked when a single byte is written to the buffer | ||||
|  * or the task's block time expires.  As another example, if a task is blocked | ||||
|  * on a read of an empty stream buffer that has a trigger level of 10 then the | ||||
|  * task will not be unblocked until the stream buffer contains at least 10 bytes | ||||
|  * or the task's block time expires.  If a reading task's block time expires | ||||
|  * before the trigger level is reached then the task will still receive however | ||||
|  * many bytes are actually available.  Setting a trigger level of 0 will result | ||||
|  * in a trigger level of 1 being used.  It is not valid to specify a trigger | ||||
|  * level that is greater than the buffer size. | ||||
|  * | ||||
|  * A trigger level is set when the stream buffer is created, and can be modified | ||||
|  * using xStreamBufferSetTriggerLevel(). | ||||
|  * | ||||
|  * @param xStreamBuffer The handle of the stream buffer being updated. | ||||
|  * | ||||
|  * @param xTriggerLevel The new trigger level for the stream buffer. | ||||
|  * | ||||
|  * @return If xTriggerLevel was less than or equal to the stream buffer's length | ||||
|  * then the trigger level will be updated and pdTRUE is returned.  Otherwise | ||||
|  * pdFALSE is returned. | ||||
|  * | ||||
|  * \ingroup StreamBufferManagement | ||||
|  */ | ||||
| BaseType_t xStreamBufferSetTriggerLevel( StreamBufferHandle_t xStreamBuffer, size_t xTriggerLevel ) PRIVILEGED_FUNCTION; | ||||
|  | ||||
| /** | ||||
|  * For advanced users only. | ||||
|  * | ||||
|  * The sbSEND_COMPLETED() macro is called from within the FreeRTOS APIs when | ||||
|  * data is sent to a message buffer or stream buffer.  If there was a task that | ||||
|  * was blocked on the message or stream buffer waiting for data to arrive then | ||||
|  * the sbSEND_COMPLETED() macro sends a notification to the task to remove it | ||||
|  * from the Blocked state.  xStreamBufferSendCompletedFromISR() does the same | ||||
|  * thing.  It is provided to enable application writers to implement their own | ||||
|  * version of sbSEND_COMPLETED(), and MUST NOT BE USED AT ANY OTHER TIME. | ||||
|  * | ||||
|  * See the example implemented in FreeRTOS/Demo/Minimal/MessageBufferAMP.c for | ||||
|  * additional information. | ||||
|  * | ||||
|  * @param xStreamBuffer The handle of the stream buffer to which data was | ||||
|  * written. | ||||
|  * | ||||
|  * @param pxHigherPriorityTaskWoken *pxHigherPriorityTaskWoken should be | ||||
|  * initialised to pdFALSE before it is passed into | ||||
|  * xStreamBufferSendCompletedFromISR().  If calling | ||||
|  * xStreamBufferSendCompletedFromISR() removes a task from the Blocked state, | ||||
|  * and the task has a priority above the priority of the currently running task, | ||||
|  * then *pxHigherPriorityTaskWoken will get set to pdTRUE indicating that a | ||||
|  * context switch should be performed before exiting the ISR. | ||||
|  * | ||||
|  * @return If a task was removed from the Blocked state then pdTRUE is returned. | ||||
|  * Otherwise pdFALSE is returned. | ||||
|  * | ||||
|  * \ingroup StreamBufferManagement | ||||
|  */ | ||||
| BaseType_t xStreamBufferSendCompletedFromISR( StreamBufferHandle_t xStreamBuffer, BaseType_t *pxHigherPriorityTaskWoken ) PRIVILEGED_FUNCTION; | ||||
|  | ||||
| /** | ||||
|  * For advanced users only. | ||||
|  * | ||||
|  * The sbRECEIVE_COMPLETED() macro is called from within the FreeRTOS APIs when | ||||
|  * data is read out of a message buffer or stream buffer.  If there was a task | ||||
|  * that was blocked on the message or stream buffer waiting for data to arrive | ||||
|  * then the sbRECEIVE_COMPLETED() macro sends a notification to the task to | ||||
|  * remove it from the Blocked state.  xStreamBufferReceiveCompletedFromISR() | ||||
|  * does the same thing.  It is provided to enable application writers to | ||||
|  * implement their own version of sbRECEIVE_COMPLETED(), and MUST NOT BE USED AT | ||||
|  * ANY OTHER TIME. | ||||
|  * | ||||
|  * See the example implemented in FreeRTOS/Demo/Minimal/MessageBufferAMP.c for | ||||
|  * additional information. | ||||
|  * | ||||
|  * @param xStreamBuffer The handle of the stream buffer from which data was | ||||
|  * read. | ||||
|  * | ||||
|  * @param pxHigherPriorityTaskWoken *pxHigherPriorityTaskWoken should be | ||||
|  * initialised to pdFALSE before it is passed into | ||||
|  * xStreamBufferReceiveCompletedFromISR().  If calling | ||||
|  * xStreamBufferReceiveCompletedFromISR() removes a task from the Blocked state, | ||||
|  * and the task has a priority above the priority of the currently running task, | ||||
|  * then *pxHigherPriorityTaskWoken will get set to pdTRUE indicating that a | ||||
|  * context switch should be performed before exiting the ISR. | ||||
|  * | ||||
|  * @return If a task was removed from the Blocked state then pdTRUE is returned. | ||||
|  * Otherwise pdFALSE is returned. | ||||
|  * | ||||
|  * \ingroup StreamBufferManagement | ||||
|  */ | ||||
| BaseType_t xStreamBufferReceiveCompletedFromISR( StreamBufferHandle_t xStreamBuffer, BaseType_t *pxHigherPriorityTaskWoken ) PRIVILEGED_FUNCTION; | ||||
|  | ||||
| /** @cond */ | ||||
| /* Functions below here are not part of the public API. */ | ||||
| StreamBufferHandle_t xStreamBufferGenericCreate( size_t xBufferSizeBytes, | ||||
| 												 size_t xTriggerLevelBytes, | ||||
| 												 BaseType_t xIsMessageBuffer ) PRIVILEGED_FUNCTION; | ||||
|  | ||||
| StreamBufferHandle_t xStreamBufferGenericCreateStatic( size_t xBufferSizeBytes, | ||||
| 													   size_t xTriggerLevelBytes, | ||||
| 													   BaseType_t xIsMessageBuffer, | ||||
| 													   uint8_t * const pucStreamBufferStorageArea, | ||||
| 													   StaticStreamBuffer_t * const pxStaticStreamBuffer ) PRIVILEGED_FUNCTION; | ||||
|  | ||||
| size_t xStreamBufferNextMessageLengthBytes( StreamBufferHandle_t xStreamBuffer ) PRIVILEGED_FUNCTION; | ||||
|  | ||||
| #if( configUSE_TRACE_FACILITY == 1 ) | ||||
| 	void vStreamBufferSetStreamBufferNumber( StreamBufferHandle_t xStreamBuffer, UBaseType_t uxStreamBufferNumber ) PRIVILEGED_FUNCTION; | ||||
| 	UBaseType_t uxStreamBufferGetStreamBufferNumber( StreamBufferHandle_t xStreamBuffer ) PRIVILEGED_FUNCTION; | ||||
| 	uint8_t ucStreamBufferGetStreamBufferType( StreamBufferHandle_t xStreamBuffer ) PRIVILEGED_FUNCTION; | ||||
| #endif | ||||
|  | ||||
| /** @endcond */ | ||||
|  | ||||
| #if defined( __cplusplus ) | ||||
| } | ||||
| #endif | ||||
|  | ||||
| #endif	/* !defined( STREAM_BUFFER_H ) */ | ||||
							
								
								
									
										2563
									
								
								tools/sdk/esp32c3/include/freertos/include/freertos/task.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										2563
									
								
								tools/sdk/esp32c3/include/freertos/include/freertos/task.h
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										1249
									
								
								tools/sdk/esp32c3/include/freertos/include/freertos/timers.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1249
									
								
								tools/sdk/esp32c3/include/freertos/include/freertos/timers.h
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
		Reference in New Issue
	
	Block a user