Normalize line endings and whitespace in source files
diff --git a/include/FreeRTOS.h b/include/FreeRTOS.h
index e2ef042..e7d779a 100644
--- a/include/FreeRTOS.h
+++ b/include/FreeRTOS.h
@@ -1,1433 +1,1433 @@
-/*

- * FreeRTOS Kernel <DEVELOPMENT BRANCH>

- * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.

- *

- * SPDX-License-Identifier: MIT

- *

- * 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.

- *

- * https://www.FreeRTOS.org

- * https://github.com/FreeRTOS

- *

- */

-

-#ifndef INC_FREERTOS_H

-#define INC_FREERTOS_H

-

-/*

- * Include the generic headers required for the FreeRTOS port being used.

- */

-#include <stddef.h>

-

-/*

- * If stdint.h cannot be located then:

- *   + If using GCC ensure the -nostdint options is *not* being used.

- *   + Ensure the project's include path includes the directory in which your

- *     compiler stores stdint.h.

- *   + Set any compiler options necessary for it to support C99, as technically

- *     stdint.h is only mandatory with C99 (FreeRTOS does not require C99 in any

- *     other way).

- *   + The FreeRTOS download includes a simple stdint.h definition that can be

- *     used in cases where none is provided by the compiler.  The files only

- *     contains the typedefs required to build FreeRTOS.  Read the instructions

- *     in FreeRTOS/source/stdint.readme for more information.

- */

-#include <stdint.h> /* READ COMMENT ABOVE. */

-

-/* *INDENT-OFF* */

-#ifdef __cplusplus

-    extern "C" {

-#endif

-/* *INDENT-ON* */

-

-/* Application specific configuration options. */

-#include "FreeRTOSConfig.h"

-

-/* Basic FreeRTOS definitions. */

-#include "projdefs.h"

-

-/* Definitions specific to the port being used. */

-#include "portable.h"

-

-/* Must be defaulted before configUSE_NEWLIB_REENTRANT is used below. */

-#ifndef configUSE_NEWLIB_REENTRANT

-    #define configUSE_NEWLIB_REENTRANT    0

-#endif

-

-/* Required if struct _reent is used. */

-#if ( configUSE_NEWLIB_REENTRANT == 1 )

-

-/* Note Newlib support has been included by popular demand, but is not

- * used by the FreeRTOS maintainers themselves.  FreeRTOS is not

- * responsible for resulting newlib operation.  User must be familiar with

- * newlib and must provide system-wide implementations of the necessary

- * stubs. Be warned that (at the time of writing) the current newlib design

- * implements a system-wide malloc() that must be provided with locks.

- *

- * See the third party link http://www.nadler.com/embedded/newlibAndFreeRTOS.html

- * for additional information. */

-    #include <reent.h>

-

-    #define configUSE_C_RUNTIME_TLS_SUPPORT    1

-

-    #ifndef configTLS_BLOCK_TYPE

-        #define configTLS_BLOCK_TYPE           struct _reent

-    #endif

-

-    #ifndef configINIT_TLS_BLOCK

-        #define configINIT_TLS_BLOCK( xTLSBlock )    _REENT_INIT_PTR( &( xTLSBlock ) )

-    #endif

-

-    #ifndef configSET_TLS_BLOCK

-        #define configSET_TLS_BLOCK( xTLSBlock )    ( _impure_ptr = &( xTLSBlock ) )

-    #endif

-

-    #ifndef configDEINIT_TLS_BLOCK

-        #define configDEINIT_TLS_BLOCK( xTLSBlock )    _reclaim_reent( &( xTLSBlock ) )

-    #endif

-#endif /* if ( configUSE_NEWLIB_REENTRANT == 1 ) */

-

-#ifndef configUSE_C_RUNTIME_TLS_SUPPORT

-    #define configUSE_C_RUNTIME_TLS_SUPPORT    0

-#endif

-

-#if ( ( configUSE_NEWLIB_REENTRANT == 0 ) && ( configUSE_C_RUNTIME_TLS_SUPPORT == 1 ) )

-

-    #ifndef configTLS_BLOCK_TYPE

-        #error Missing definition:  configTLS_BLOCK_TYPE must be defined in FreeRTOSConfig.h when configUSE_C_RUNTIME_TLS_SUPPORT is set to 1.

-    #endif

-

-    #ifndef configINIT_TLS_BLOCK

-        #error Missing definition:  configINIT_TLS_BLOCK must be defined in FreeRTOSConfig.h when configUSE_C_RUNTIME_TLS_SUPPORT is set to 1.

-    #endif

-

-    #ifndef configSET_TLS_BLOCK

-        #error Missing definition:  configSET_TLS_BLOCK must be defined in FreeRTOSConfig.h when configUSE_C_RUNTIME_TLS_SUPPORT is set to 1.

-    #endif

-

-    #ifndef configDEINIT_TLS_BLOCK

-        #error Missing definition:  configDEINIT_TLS_BLOCK must be defined in FreeRTOSConfig.h when configUSE_C_RUNTIME_TLS_SUPPORT is set to 1.

-    #endif

-#endif /* if ( ( configUSE_NEWLIB_REENTRANT == 0 ) && ( configUSE_C_RUNTIME_TLS_SUPPORT == 1 ) ) */

-

-/*

- * Check all the required application specific macros have been defined.

- * These macros are application specific and (as downloaded) are defined

- * within FreeRTOSConfig.h.

- */

-

-#ifndef configMINIMAL_STACK_SIZE

-    #error Missing definition:  configMINIMAL_STACK_SIZE must be defined in FreeRTOSConfig.h.  configMINIMAL_STACK_SIZE defines the size (in words) of the stack allocated to the idle task.  Refer to the demo project provided for your port for a suitable value.

-#endif

-

-#ifndef configMAX_PRIORITIES

-    #error Missing definition:  configMAX_PRIORITIES must be defined in FreeRTOSConfig.h.  See the Configuration section of the FreeRTOS API documentation for details.

-#endif

-

-#if configMAX_PRIORITIES < 1

-    #error configMAX_PRIORITIES must be defined to be greater than or equal to 1.

-#endif

-

-#ifndef configUSE_PREEMPTION

-    #error Missing definition:  configUSE_PREEMPTION must be defined in FreeRTOSConfig.h as either 1 or 0.  See the Configuration section of the FreeRTOS API documentation for details.

-#endif

-

-#ifndef configUSE_IDLE_HOOK

-    #error Missing definition:  configUSE_IDLE_HOOK must be defined in FreeRTOSConfig.h as either 1 or 0.  See the Configuration section of the FreeRTOS API documentation for details.

-#endif

-

-#ifndef configUSE_TICK_HOOK

-    #error Missing definition:  configUSE_TICK_HOOK must be defined in FreeRTOSConfig.h as either 1 or 0.  See the Configuration section of the FreeRTOS API documentation for details.

-#endif

-

-#ifndef configUSE_16_BIT_TICKS

-    #error Missing definition:  configUSE_16_BIT_TICKS must be defined in FreeRTOSConfig.h as either 1 or 0.  See the Configuration section of the FreeRTOS API documentation for details.

-#endif

-

-#ifndef INCLUDE_vTaskPrioritySet

-    #define INCLUDE_vTaskPrioritySet    0

-#endif

-

-#ifndef INCLUDE_uxTaskPriorityGet

-    #define INCLUDE_uxTaskPriorityGet    0

-#endif

-

-#ifndef INCLUDE_vTaskDelete

-    #define INCLUDE_vTaskDelete    0

-#endif

-

-#ifndef INCLUDE_vTaskSuspend

-    #define INCLUDE_vTaskSuspend    0

-#endif

-

-#ifdef INCLUDE_xTaskDelayUntil

-    #ifdef INCLUDE_vTaskDelayUntil

-

-/* INCLUDE_vTaskDelayUntil was replaced by INCLUDE_xTaskDelayUntil.  Backward

- * compatibility is maintained if only one or the other is defined, but

- * there is a conflict if both are defined. */

-        #error INCLUDE_vTaskDelayUntil and INCLUDE_xTaskDelayUntil are both defined.  INCLUDE_vTaskDelayUntil is no longer required and should be removed

-    #endif

-#endif

-

-#ifndef INCLUDE_xTaskDelayUntil

-    #ifdef INCLUDE_vTaskDelayUntil

-

-/* If INCLUDE_vTaskDelayUntil is set but INCLUDE_xTaskDelayUntil is not then

- * the project's FreeRTOSConfig.h probably pre-dates the introduction of

- * xTaskDelayUntil and setting INCLUDE_xTaskDelayUntil to whatever

- * INCLUDE_vTaskDelayUntil is set to will ensure backward compatibility.

- */

-        #define INCLUDE_xTaskDelayUntil    INCLUDE_vTaskDelayUntil

-    #endif

-#endif

-

-#ifndef INCLUDE_xTaskDelayUntil

-    #define INCLUDE_xTaskDelayUntil    0

-#endif

-

-#ifndef INCLUDE_vTaskDelay

-    #define INCLUDE_vTaskDelay    0

-#endif

-

-#ifndef INCLUDE_xTaskGetIdleTaskHandle

-    #define INCLUDE_xTaskGetIdleTaskHandle    0

-#endif

-

-#ifndef INCLUDE_xTaskAbortDelay

-    #define INCLUDE_xTaskAbortDelay    0

-#endif

-

-#ifndef INCLUDE_xQueueGetMutexHolder

-    #define INCLUDE_xQueueGetMutexHolder    0

-#endif

-

-#ifndef INCLUDE_xSemaphoreGetMutexHolder

-    #define INCLUDE_xSemaphoreGetMutexHolder    INCLUDE_xQueueGetMutexHolder

-#endif

-

-#ifndef INCLUDE_xTaskGetHandle

-    #define INCLUDE_xTaskGetHandle    0

-#endif

-

-#ifndef INCLUDE_uxTaskGetStackHighWaterMark

-    #define INCLUDE_uxTaskGetStackHighWaterMark    0

-#endif

-

-#ifndef INCLUDE_uxTaskGetStackHighWaterMark2

-    #define INCLUDE_uxTaskGetStackHighWaterMark2    0

-#endif

-

-#ifndef INCLUDE_eTaskGetState

-    #define INCLUDE_eTaskGetState    0

-#endif

-

-#ifndef INCLUDE_xTaskResumeFromISR

-    #define INCLUDE_xTaskResumeFromISR    1

-#endif

-

-#ifndef INCLUDE_xTimerPendFunctionCall

-    #define INCLUDE_xTimerPendFunctionCall    0

-#endif

-

-#ifndef INCLUDE_xTaskGetSchedulerState

-    #define INCLUDE_xTaskGetSchedulerState    0

-#endif

-

-#ifndef INCLUDE_xTaskGetCurrentTaskHandle

-    #define INCLUDE_xTaskGetCurrentTaskHandle    1

-#endif

-

-#if ( defined( configUSE_CO_ROUTINES ) && configUSE_CO_ROUTINES != 0 )

-    #warning Co-routines have been removed from FreeRTOS-Kernel versions released after V10.5.1. You can view previous versions of the FreeRTOS Kernel at github.com/freertos/freertos-kernel/tree/V10.5.1 .

-#endif

-

-#ifndef configUSE_DAEMON_TASK_STARTUP_HOOK

-    #define configUSE_DAEMON_TASK_STARTUP_HOOK    0

-#endif

-

-#ifndef configUSE_APPLICATION_TASK_TAG

-    #define configUSE_APPLICATION_TASK_TAG    0

-#endif

-

-#ifndef configNUM_THREAD_LOCAL_STORAGE_POINTERS

-    #define configNUM_THREAD_LOCAL_STORAGE_POINTERS    0

-#endif

-

-#ifndef configUSE_RECURSIVE_MUTEXES

-    #define configUSE_RECURSIVE_MUTEXES    0

-#endif

-

-#ifndef configUSE_MUTEXES

-    #define configUSE_MUTEXES    0

-#endif

-

-#ifndef configUSE_TIMERS

-    #define configUSE_TIMERS    0

-#endif

-

-#ifndef configUSE_COUNTING_SEMAPHORES

-    #define configUSE_COUNTING_SEMAPHORES    0

-#endif

-

-#ifndef configUSE_ALTERNATIVE_API

-    #define configUSE_ALTERNATIVE_API    0

-#endif

-

-#ifndef portCRITICAL_NESTING_IN_TCB

-    #define portCRITICAL_NESTING_IN_TCB    0

-#endif

-

-#ifndef configMAX_TASK_NAME_LEN

-    #define configMAX_TASK_NAME_LEN    16

-#endif

-

-#ifndef configIDLE_SHOULD_YIELD

-    #define configIDLE_SHOULD_YIELD    1

-#endif

-

-#if configMAX_TASK_NAME_LEN < 1

-    #error configMAX_TASK_NAME_LEN must be set to a minimum of 1 in FreeRTOSConfig.h

-#endif

-

-#ifndef configASSERT

-    #define configASSERT( x )

-    #define configASSERT_DEFINED    0

-#else

-    #define configASSERT_DEFINED    1

-#endif

-

-/* configPRECONDITION should be defined as configASSERT.

- * The CBMC proofs need a way to track assumptions and assertions.

- * A configPRECONDITION statement should express an implicit invariant or

- * assumption made.  A configASSERT statement should express an invariant that must

- * hold explicit before calling the code. */

-#ifndef configPRECONDITION

-    #define configPRECONDITION( X )    configASSERT( X )

-    #define configPRECONDITION_DEFINED    0

-#else

-    #define configPRECONDITION_DEFINED    1

-#endif

-

-#ifndef portMEMORY_BARRIER

-    #define portMEMORY_BARRIER()

-#endif

-

-#ifndef portSOFTWARE_BARRIER

-    #define portSOFTWARE_BARRIER()

-#endif

-

-/* The timers module relies on xTaskGetSchedulerState(). */

-#if configUSE_TIMERS == 1

-

-    #ifndef configTIMER_TASK_PRIORITY

-        #error If configUSE_TIMERS is set to 1 then configTIMER_TASK_PRIORITY must also be defined.

-    #endif /* configTIMER_TASK_PRIORITY */

-

-    #ifndef configTIMER_QUEUE_LENGTH

-        #error If configUSE_TIMERS is set to 1 then configTIMER_QUEUE_LENGTH must also be defined.

-    #endif /* configTIMER_QUEUE_LENGTH */

-

-    #ifndef configTIMER_TASK_STACK_DEPTH

-        #error If configUSE_TIMERS is set to 1 then configTIMER_TASK_STACK_DEPTH must also be defined.

-    #endif /* configTIMER_TASK_STACK_DEPTH */

-

-#endif /* configUSE_TIMERS */

-

-#ifndef portSET_INTERRUPT_MASK_FROM_ISR

-    #define portSET_INTERRUPT_MASK_FROM_ISR()    0

-#endif

-

-#ifndef portCLEAR_INTERRUPT_MASK_FROM_ISR

-    #define portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedStatusValue )    ( void ) ( uxSavedStatusValue )

-#endif

-

-#ifndef portCLEAN_UP_TCB

-    #define portCLEAN_UP_TCB( pxTCB )    ( void ) ( pxTCB )

-#endif

-

-#ifndef portPRE_TASK_DELETE_HOOK

-    #define portPRE_TASK_DELETE_HOOK( pvTaskToDelete, pxYieldPending )

-#endif

-

-#ifndef portSETUP_TCB

-    #define portSETUP_TCB( pxTCB )    ( void ) ( pxTCB )

-#endif

-

-#ifndef configQUEUE_REGISTRY_SIZE

-    #define configQUEUE_REGISTRY_SIZE    0U

-#endif

-

-#if ( configQUEUE_REGISTRY_SIZE < 1 )

-    #define vQueueAddToRegistry( xQueue, pcName )

-    #define vQueueUnregisterQueue( xQueue )

-    #define pcQueueGetName( xQueue )

-#endif

-

-#ifndef configUSE_MINI_LIST_ITEM

-    #define configUSE_MINI_LIST_ITEM    1

-#endif

-

-#ifndef portPOINTER_SIZE_TYPE

-    #define portPOINTER_SIZE_TYPE    uint32_t

-#endif

-

-/* Remove any unused trace macros. */

-#ifndef traceSTART

-

-/* Used to perform any necessary initialisation - for example, open a file

- * into which trace is to be written. */

-    #define traceSTART()

-#endif

-

-#ifndef traceEND

-

-/* Use to close a trace, for example close a file into which trace has been

- * written. */

-    #define traceEND()

-#endif

-

-#ifndef traceTASK_SWITCHED_IN

-

-/* Called after a task has been selected to run.  pxCurrentTCB holds a pointer

- * to the task control block of the selected task. */

-    #define traceTASK_SWITCHED_IN()

-#endif

-

-#ifndef traceINCREASE_TICK_COUNT

-

-/* Called before stepping the tick count after waking from tickless idle

- * sleep. */

-    #define traceINCREASE_TICK_COUNT( x )

-#endif

-

-#ifndef traceLOW_POWER_IDLE_BEGIN

-    /* Called immediately before entering tickless idle. */

-    #define traceLOW_POWER_IDLE_BEGIN()

-#endif

-

-#ifndef traceLOW_POWER_IDLE_END

-    /* Called when returning to the Idle task after a tickless idle. */

-    #define traceLOW_POWER_IDLE_END()

-#endif

-

-#ifndef traceTASK_SWITCHED_OUT

-

-/* Called before a task has been selected to run.  pxCurrentTCB holds a pointer

- * to the task control block of the task being switched out. */

-    #define traceTASK_SWITCHED_OUT()

-#endif

-

-#ifndef traceTASK_PRIORITY_INHERIT

-

-/* Called when a task attempts to take a mutex that is already held by a

- * lower priority task.  pxTCBOfMutexHolder is a pointer to the TCB of the task

- * that holds the mutex.  uxInheritedPriority is the priority the mutex holder

- * will inherit (the priority of the task that is attempting to obtain the

- * muted. */

-    #define traceTASK_PRIORITY_INHERIT( pxTCBOfMutexHolder, uxInheritedPriority )

-#endif

-

-#ifndef traceTASK_PRIORITY_DISINHERIT

-

-/* Called when a task releases a mutex, the holding of which had resulted in

- * the task inheriting the priority of a higher priority task.

- * pxTCBOfMutexHolder is a pointer to the TCB of the task that is releasing the

- * mutex.  uxOriginalPriority is the task's configured (base) priority. */

-    #define traceTASK_PRIORITY_DISINHERIT( pxTCBOfMutexHolder, uxOriginalPriority )

-#endif

-

-#ifndef traceBLOCKING_ON_QUEUE_RECEIVE

-

-/* Task is about to block because it cannot read from a

- * queue/mutex/semaphore.  pxQueue is a pointer to the queue/mutex/semaphore

- * upon which the read was attempted.  pxCurrentTCB points to the TCB of the

- * task that attempted the read. */

-    #define traceBLOCKING_ON_QUEUE_RECEIVE( pxQueue )

-#endif

-

-#ifndef traceBLOCKING_ON_QUEUE_PEEK

-

-/* Task is about to block because it cannot read from a

- * queue/mutex/semaphore.  pxQueue is a pointer to the queue/mutex/semaphore

- * upon which the read was attempted.  pxCurrentTCB points to the TCB of the

- * task that attempted the read. */

-    #define traceBLOCKING_ON_QUEUE_PEEK( pxQueue )

-#endif

-

-#ifndef traceBLOCKING_ON_QUEUE_SEND

-

-/* Task is about to block because it cannot write to a

- * queue/mutex/semaphore.  pxQueue is a pointer to the queue/mutex/semaphore

- * upon which the write was attempted.  pxCurrentTCB points to the TCB of the

- * task that attempted the write. */

-    #define traceBLOCKING_ON_QUEUE_SEND( pxQueue )

-#endif

-

-#ifndef configCHECK_FOR_STACK_OVERFLOW

-    #define configCHECK_FOR_STACK_OVERFLOW    0

-#endif

-

-#ifndef configRECORD_STACK_HIGH_ADDRESS

-    #define configRECORD_STACK_HIGH_ADDRESS    0

-#endif

-

-#ifndef configINCLUDE_FREERTOS_TASK_C_ADDITIONS_H

-    #define configINCLUDE_FREERTOS_TASK_C_ADDITIONS_H    0

-#endif

-

-/* The following event macros are embedded in the kernel API calls. */

-

-#ifndef traceMOVED_TASK_TO_READY_STATE

-    #define traceMOVED_TASK_TO_READY_STATE( pxTCB )

-#endif

-

-#ifndef tracePOST_MOVED_TASK_TO_READY_STATE

-    #define tracePOST_MOVED_TASK_TO_READY_STATE( pxTCB )

-#endif

-

-#ifndef traceQUEUE_CREATE

-    #define traceQUEUE_CREATE( pxNewQueue )

-#endif

-

-#ifndef traceQUEUE_CREATE_FAILED

-    #define traceQUEUE_CREATE_FAILED( ucQueueType )

-#endif

-

-#ifndef traceCREATE_MUTEX

-    #define traceCREATE_MUTEX( pxNewQueue )

-#endif

-

-#ifndef traceCREATE_MUTEX_FAILED

-    #define traceCREATE_MUTEX_FAILED()

-#endif

-

-#ifndef traceGIVE_MUTEX_RECURSIVE

-    #define traceGIVE_MUTEX_RECURSIVE( pxMutex )

-#endif

-

-#ifndef traceGIVE_MUTEX_RECURSIVE_FAILED

-    #define traceGIVE_MUTEX_RECURSIVE_FAILED( pxMutex )

-#endif

-

-#ifndef traceTAKE_MUTEX_RECURSIVE

-    #define traceTAKE_MUTEX_RECURSIVE( pxMutex )

-#endif

-

-#ifndef traceTAKE_MUTEX_RECURSIVE_FAILED

-    #define traceTAKE_MUTEX_RECURSIVE_FAILED( pxMutex )

-#endif

-

-#ifndef traceCREATE_COUNTING_SEMAPHORE

-    #define traceCREATE_COUNTING_SEMAPHORE()

-#endif

-

-#ifndef traceCREATE_COUNTING_SEMAPHORE_FAILED

-    #define traceCREATE_COUNTING_SEMAPHORE_FAILED()

-#endif

-

-#ifndef traceQUEUE_SET_SEND

-    #define traceQUEUE_SET_SEND    traceQUEUE_SEND

-#endif

-

-#ifndef traceQUEUE_SEND

-    #define traceQUEUE_SEND( pxQueue )

-#endif

-

-#ifndef traceQUEUE_SEND_FAILED

-    #define traceQUEUE_SEND_FAILED( pxQueue )

-#endif

-

-#ifndef traceQUEUE_RECEIVE

-    #define traceQUEUE_RECEIVE( pxQueue )

-#endif

-

-#ifndef traceQUEUE_PEEK

-    #define traceQUEUE_PEEK( pxQueue )

-#endif

-

-#ifndef traceQUEUE_PEEK_FAILED

-    #define traceQUEUE_PEEK_FAILED( pxQueue )

-#endif

-

-#ifndef traceQUEUE_PEEK_FROM_ISR

-    #define traceQUEUE_PEEK_FROM_ISR( pxQueue )

-#endif

-

-#ifndef traceQUEUE_RECEIVE_FAILED

-    #define traceQUEUE_RECEIVE_FAILED( pxQueue )

-#endif

-

-#ifndef traceQUEUE_SEND_FROM_ISR

-    #define traceQUEUE_SEND_FROM_ISR( pxQueue )

-#endif

-

-#ifndef traceQUEUE_SEND_FROM_ISR_FAILED

-    #define traceQUEUE_SEND_FROM_ISR_FAILED( pxQueue )

-#endif

-

-#ifndef traceQUEUE_RECEIVE_FROM_ISR

-    #define traceQUEUE_RECEIVE_FROM_ISR( pxQueue )

-#endif

-

-#ifndef traceQUEUE_RECEIVE_FROM_ISR_FAILED

-    #define traceQUEUE_RECEIVE_FROM_ISR_FAILED( pxQueue )

-#endif

-

-#ifndef traceQUEUE_PEEK_FROM_ISR_FAILED

-    #define traceQUEUE_PEEK_FROM_ISR_FAILED( pxQueue )

-#endif

-

-#ifndef traceQUEUE_DELETE

-    #define traceQUEUE_DELETE( pxQueue )

-#endif

-

-#ifndef traceTASK_CREATE

-    #define traceTASK_CREATE( pxNewTCB )

-#endif

-

-#ifndef traceTASK_CREATE_FAILED

-    #define traceTASK_CREATE_FAILED()

-#endif

-

-#ifndef traceTASK_DELETE

-    #define traceTASK_DELETE( pxTaskToDelete )

-#endif

-

-#ifndef traceTASK_DELAY_UNTIL

-    #define traceTASK_DELAY_UNTIL( x )

-#endif

-

-#ifndef traceTASK_DELAY

-    #define traceTASK_DELAY()

-#endif

-

-#ifndef traceTASK_PRIORITY_SET

-    #define traceTASK_PRIORITY_SET( pxTask, uxNewPriority )

-#endif

-

-#ifndef traceTASK_SUSPEND

-    #define traceTASK_SUSPEND( pxTaskToSuspend )

-#endif

-

-#ifndef traceTASK_RESUME

-    #define traceTASK_RESUME( pxTaskToResume )

-#endif

-

-#ifndef traceTASK_RESUME_FROM_ISR

-    #define traceTASK_RESUME_FROM_ISR( pxTaskToResume )

-#endif

-

-#ifndef traceTASK_INCREMENT_TICK

-    #define traceTASK_INCREMENT_TICK( xTickCount )

-#endif

-

-#ifndef traceTIMER_CREATE

-    #define traceTIMER_CREATE( pxNewTimer )

-#endif

-

-#ifndef traceTIMER_CREATE_FAILED

-    #define traceTIMER_CREATE_FAILED()

-#endif

-

-#ifndef traceTIMER_COMMAND_SEND

-    #define traceTIMER_COMMAND_SEND( xTimer, xMessageID, xMessageValueValue, xReturn )

-#endif

-

-#ifndef traceTIMER_EXPIRED

-    #define traceTIMER_EXPIRED( pxTimer )

-#endif

-

-#ifndef traceTIMER_COMMAND_RECEIVED

-    #define traceTIMER_COMMAND_RECEIVED( pxTimer, xMessageID, xMessageValue )

-#endif

-

-#ifndef traceMALLOC

-    #define traceMALLOC( pvAddress, uiSize )

-#endif

-

-#ifndef traceFREE

-    #define traceFREE( pvAddress, uiSize )

-#endif

-

-#ifndef traceEVENT_GROUP_CREATE

-    #define traceEVENT_GROUP_CREATE( xEventGroup )

-#endif

-

-#ifndef traceEVENT_GROUP_CREATE_FAILED

-    #define traceEVENT_GROUP_CREATE_FAILED()

-#endif

-

-#ifndef traceEVENT_GROUP_SYNC_BLOCK

-    #define traceEVENT_GROUP_SYNC_BLOCK( xEventGroup, uxBitsToSet, uxBitsToWaitFor )

-#endif

-

-#ifndef traceEVENT_GROUP_SYNC_END

-    #define traceEVENT_GROUP_SYNC_END( xEventGroup, uxBitsToSet, uxBitsToWaitFor, xTimeoutOccurred )    ( void ) ( xTimeoutOccurred )

-#endif

-

-#ifndef traceEVENT_GROUP_WAIT_BITS_BLOCK

-    #define traceEVENT_GROUP_WAIT_BITS_BLOCK( xEventGroup, uxBitsToWaitFor )

-#endif

-

-#ifndef traceEVENT_GROUP_WAIT_BITS_END

-    #define traceEVENT_GROUP_WAIT_BITS_END( xEventGroup, uxBitsToWaitFor, xTimeoutOccurred )    ( void ) ( xTimeoutOccurred )

-#endif

-

-#ifndef traceEVENT_GROUP_CLEAR_BITS

-    #define traceEVENT_GROUP_CLEAR_BITS( xEventGroup, uxBitsToClear )

-#endif

-

-#ifndef traceEVENT_GROUP_CLEAR_BITS_FROM_ISR

-    #define traceEVENT_GROUP_CLEAR_BITS_FROM_ISR( xEventGroup, uxBitsToClear )

-#endif

-

-#ifndef traceEVENT_GROUP_SET_BITS

-    #define traceEVENT_GROUP_SET_BITS( xEventGroup, uxBitsToSet )

-#endif

-

-#ifndef traceEVENT_GROUP_SET_BITS_FROM_ISR

-    #define traceEVENT_GROUP_SET_BITS_FROM_ISR( xEventGroup, uxBitsToSet )

-#endif

-

-#ifndef traceEVENT_GROUP_DELETE

-    #define traceEVENT_GROUP_DELETE( xEventGroup )

-#endif

-

-#ifndef tracePEND_FUNC_CALL

-    #define tracePEND_FUNC_CALL( xFunctionToPend, pvParameter1, ulParameter2, ret )

-#endif

-

-#ifndef tracePEND_FUNC_CALL_FROM_ISR

-    #define tracePEND_FUNC_CALL_FROM_ISR( xFunctionToPend, pvParameter1, ulParameter2, ret )

-#endif

-

-#ifndef traceQUEUE_REGISTRY_ADD

-    #define traceQUEUE_REGISTRY_ADD( xQueue, pcQueueName )

-#endif

-

-#ifndef traceTASK_NOTIFY_TAKE_BLOCK

-    #define traceTASK_NOTIFY_TAKE_BLOCK( uxIndexToWait )

-#endif

-

-#ifndef traceTASK_NOTIFY_TAKE

-    #define traceTASK_NOTIFY_TAKE( uxIndexToWait )

-#endif

-

-#ifndef traceTASK_NOTIFY_WAIT_BLOCK

-    #define traceTASK_NOTIFY_WAIT_BLOCK( uxIndexToWait )

-#endif

-

-#ifndef traceTASK_NOTIFY_WAIT

-    #define traceTASK_NOTIFY_WAIT( uxIndexToWait )

-#endif

-

-#ifndef traceTASK_NOTIFY

-    #define traceTASK_NOTIFY( uxIndexToNotify )

-#endif

-

-#ifndef traceTASK_NOTIFY_FROM_ISR

-    #define traceTASK_NOTIFY_FROM_ISR( uxIndexToNotify )

-#endif

-

-#ifndef traceTASK_NOTIFY_GIVE_FROM_ISR

-    #define traceTASK_NOTIFY_GIVE_FROM_ISR( uxIndexToNotify )

-#endif

-

-#ifndef traceSTREAM_BUFFER_CREATE_FAILED

-    #define traceSTREAM_BUFFER_CREATE_FAILED( xIsMessageBuffer )

-#endif

-

-#ifndef traceSTREAM_BUFFER_CREATE_STATIC_FAILED

-    #define traceSTREAM_BUFFER_CREATE_STATIC_FAILED( xReturn, xIsMessageBuffer )

-#endif

-

-#ifndef traceSTREAM_BUFFER_CREATE

-    #define traceSTREAM_BUFFER_CREATE( pxStreamBuffer, xIsMessageBuffer )

-#endif

-

-#ifndef traceSTREAM_BUFFER_DELETE

-    #define traceSTREAM_BUFFER_DELETE( xStreamBuffer )

-#endif

-

-#ifndef traceSTREAM_BUFFER_RESET

-    #define traceSTREAM_BUFFER_RESET( xStreamBuffer )

-#endif

-

-#ifndef traceBLOCKING_ON_STREAM_BUFFER_SEND

-    #define traceBLOCKING_ON_STREAM_BUFFER_SEND( xStreamBuffer )

-#endif

-

-#ifndef traceSTREAM_BUFFER_SEND

-    #define traceSTREAM_BUFFER_SEND( xStreamBuffer, xBytesSent )

-#endif

-

-#ifndef traceSTREAM_BUFFER_SEND_FAILED

-    #define traceSTREAM_BUFFER_SEND_FAILED( xStreamBuffer )

-#endif

-

-#ifndef traceSTREAM_BUFFER_SEND_FROM_ISR

-    #define traceSTREAM_BUFFER_SEND_FROM_ISR( xStreamBuffer, xBytesSent )

-#endif

-

-#ifndef traceBLOCKING_ON_STREAM_BUFFER_RECEIVE

-    #define traceBLOCKING_ON_STREAM_BUFFER_RECEIVE( xStreamBuffer )

-#endif

-

-#ifndef traceSTREAM_BUFFER_RECEIVE

-    #define traceSTREAM_BUFFER_RECEIVE( xStreamBuffer, xReceivedLength )

-#endif

-

-#ifndef traceSTREAM_BUFFER_RECEIVE_FAILED

-    #define traceSTREAM_BUFFER_RECEIVE_FAILED( xStreamBuffer )

-#endif

-

-#ifndef traceSTREAM_BUFFER_RECEIVE_FROM_ISR

-    #define traceSTREAM_BUFFER_RECEIVE_FROM_ISR( xStreamBuffer, xReceivedLength )

-#endif

-

-#ifndef configGENERATE_RUN_TIME_STATS

-    #define configGENERATE_RUN_TIME_STATS    0

-#endif

-

-#if ( configGENERATE_RUN_TIME_STATS == 1 )

-

-    #ifndef portCONFIGURE_TIMER_FOR_RUN_TIME_STATS

-        #error If configGENERATE_RUN_TIME_STATS is defined then portCONFIGURE_TIMER_FOR_RUN_TIME_STATS must also be defined.  portCONFIGURE_TIMER_FOR_RUN_TIME_STATS should call a port layer function to setup a peripheral timer/counter that can then be used as the run time counter time base.

-    #endif /* portCONFIGURE_TIMER_FOR_RUN_TIME_STATS */

-

-    #ifndef portGET_RUN_TIME_COUNTER_VALUE

-        #ifndef portALT_GET_RUN_TIME_COUNTER_VALUE

-            #error If configGENERATE_RUN_TIME_STATS is defined then either portGET_RUN_TIME_COUNTER_VALUE or portALT_GET_RUN_TIME_COUNTER_VALUE must also be defined.  See the examples provided and the FreeRTOS web site for more information.

-        #endif /* portALT_GET_RUN_TIME_COUNTER_VALUE */

-    #endif /* portGET_RUN_TIME_COUNTER_VALUE */

-

-#endif /* configGENERATE_RUN_TIME_STATS */

-

-#ifndef portCONFIGURE_TIMER_FOR_RUN_TIME_STATS

-    #define portCONFIGURE_TIMER_FOR_RUN_TIME_STATS()

-#endif

-

-#ifndef configUSE_MALLOC_FAILED_HOOK

-    #define configUSE_MALLOC_FAILED_HOOK    0

-#endif

-

-#ifndef portPRIVILEGE_BIT

-    #define portPRIVILEGE_BIT    ( ( UBaseType_t ) 0x00 )

-#endif

-

-#ifndef portYIELD_WITHIN_API

-    #define portYIELD_WITHIN_API    portYIELD

-#endif

-

-#ifndef portSUPPRESS_TICKS_AND_SLEEP

-    #define portSUPPRESS_TICKS_AND_SLEEP( xExpectedIdleTime )

-#endif

-

-#ifndef configEXPECTED_IDLE_TIME_BEFORE_SLEEP

-    #define configEXPECTED_IDLE_TIME_BEFORE_SLEEP    2

-#endif

-

-#if configEXPECTED_IDLE_TIME_BEFORE_SLEEP < 2

-    #error configEXPECTED_IDLE_TIME_BEFORE_SLEEP must not be less than 2

-#endif

-

-#ifndef configUSE_TICKLESS_IDLE

-    #define configUSE_TICKLESS_IDLE    0

-#endif

-

-#ifndef configPRE_SUPPRESS_TICKS_AND_SLEEP_PROCESSING

-    #define configPRE_SUPPRESS_TICKS_AND_SLEEP_PROCESSING( x )

-#endif

-

-#ifndef configPRE_SLEEP_PROCESSING

-    #define configPRE_SLEEP_PROCESSING( x )

-#endif

-

-#ifndef configPOST_SLEEP_PROCESSING

-    #define configPOST_SLEEP_PROCESSING( x )

-#endif

-

-#ifndef configUSE_QUEUE_SETS

-    #define configUSE_QUEUE_SETS    0

-#endif

-

-#ifndef portTASK_USES_FLOATING_POINT

-    #define portTASK_USES_FLOATING_POINT()

-#endif

-

-#ifndef portALLOCATE_SECURE_CONTEXT

-    #define portALLOCATE_SECURE_CONTEXT( ulSecureStackSize )

-#endif

-

-#ifndef portDONT_DISCARD

-    #define portDONT_DISCARD

-#endif

-

-#ifndef configUSE_TIME_SLICING

-    #define configUSE_TIME_SLICING    1

-#endif

-

-#ifndef configINCLUDE_APPLICATION_DEFINED_PRIVILEGED_FUNCTIONS

-    #define configINCLUDE_APPLICATION_DEFINED_PRIVILEGED_FUNCTIONS    0

-#endif

-

-#ifndef configUSE_STATS_FORMATTING_FUNCTIONS

-    #define configUSE_STATS_FORMATTING_FUNCTIONS    0

-#endif

-

-#ifndef portASSERT_IF_INTERRUPT_PRIORITY_INVALID

-    #define portASSERT_IF_INTERRUPT_PRIORITY_INVALID()

-#endif

-

-#ifndef configUSE_TRACE_FACILITY

-    #define configUSE_TRACE_FACILITY    0

-#endif

-

-#ifndef mtCOVERAGE_TEST_MARKER

-    #define mtCOVERAGE_TEST_MARKER()

-#endif

-

-#ifndef mtCOVERAGE_TEST_DELAY

-    #define mtCOVERAGE_TEST_DELAY()

-#endif

-

-#ifndef portASSERT_IF_IN_ISR

-    #define portASSERT_IF_IN_ISR()

-#endif

-

-#ifndef configUSE_PORT_OPTIMISED_TASK_SELECTION

-    #define configUSE_PORT_OPTIMISED_TASK_SELECTION    0

-#endif

-

-#ifndef configAPPLICATION_ALLOCATED_HEAP

-    #define configAPPLICATION_ALLOCATED_HEAP    0

-#endif

-

-#ifndef configUSE_TASK_NOTIFICATIONS

-    #define configUSE_TASK_NOTIFICATIONS    1

-#endif

-

-#ifndef configTASK_NOTIFICATION_ARRAY_ENTRIES

-    #define configTASK_NOTIFICATION_ARRAY_ENTRIES    1

-#endif

-

-#if configTASK_NOTIFICATION_ARRAY_ENTRIES < 1

-    #error configTASK_NOTIFICATION_ARRAY_ENTRIES must be at least 1

-#endif

-

-#ifndef configUSE_POSIX_ERRNO

-    #define configUSE_POSIX_ERRNO    0

-#endif

-

-#ifndef configUSE_SB_COMPLETED_CALLBACK

-

-/* By default per-instance callbacks are not enabled for stream buffer or message buffer. */

-    #define configUSE_SB_COMPLETED_CALLBACK    0

-#endif

-

-#ifndef portTICK_TYPE_IS_ATOMIC

-    #define portTICK_TYPE_IS_ATOMIC    0

-#endif

-

-#ifndef configSUPPORT_STATIC_ALLOCATION

-    /* Defaults to 0 for backward compatibility. */

-    #define configSUPPORT_STATIC_ALLOCATION    0

-#endif

-

-#ifndef configSUPPORT_DYNAMIC_ALLOCATION

-    /* Defaults to 1 for backward compatibility. */

-    #define configSUPPORT_DYNAMIC_ALLOCATION    1

-#endif

-

-#if ( ( configUSE_STATS_FORMATTING_FUNCTIONS > 0 ) && ( configSUPPORT_DYNAMIC_ALLOCATION != 1 ) )

-    #error configUSE_STATS_FORMATTING_FUNCTIONS cannot be used without dynamic allocation, but configSUPPORT_DYNAMIC_ALLOCATION is not set to 1.

-#endif

-

-#if ( configUSE_STATS_FORMATTING_FUNCTIONS > 0 )

-    #if ( ( configUSE_TRACE_FACILITY != 1 ) && ( configGENERATE_RUN_TIME_STATS != 1 ) )

-        #error configUSE_STATS_FORMATTING_FUNCTIONS is 1 but the functions it enables are not used because neither configUSE_TRACE_FACILITY or configGENERATE_RUN_TIME_STATS are 1.  Set configUSE_STATS_FORMATTING_FUNCTIONS to 0 in FreeRTOSConfig.h.

-    #endif

-#endif

-

-#ifndef configSTACK_DEPTH_TYPE

-

-/* Defaults to uint16_t for backward compatibility, but can be overridden

- * in FreeRTOSConfig.h if uint16_t is too restrictive. */

-    #define configSTACK_DEPTH_TYPE    uint16_t

-#endif

-

-#ifndef configRUN_TIME_COUNTER_TYPE

-

-/* Defaults to uint32_t for backward compatibility, but can be overridden in

- * FreeRTOSConfig.h if uint32_t is too restrictive. */

-

-    #define configRUN_TIME_COUNTER_TYPE    uint32_t

-#endif

-

-#ifndef configMESSAGE_BUFFER_LENGTH_TYPE

-

-/* Defaults to size_t for backward compatibility, but can be overridden

- * in FreeRTOSConfig.h if lengths will always be less than the number of bytes

- * in a size_t. */

-    #define configMESSAGE_BUFFER_LENGTH_TYPE    size_t

-#endif

-

-/* Sanity check the configuration. */

-#if ( ( configSUPPORT_STATIC_ALLOCATION == 0 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 0 ) )

-    #error configSUPPORT_STATIC_ALLOCATION and configSUPPORT_DYNAMIC_ALLOCATION cannot both be 0, but can both be 1.

-#endif

-

-#if ( ( configUSE_RECURSIVE_MUTEXES == 1 ) && ( configUSE_MUTEXES != 1 ) )

-    #error configUSE_MUTEXES must be set to 1 to use recursive mutexes

-#endif

-

-#ifndef configINITIAL_TICK_COUNT

-    #define configINITIAL_TICK_COUNT    0

-#endif

-

-#if ( portTICK_TYPE_IS_ATOMIC == 0 )

-

-/* Either variables of tick type cannot be read atomically, or

- * portTICK_TYPE_IS_ATOMIC was not set - map the critical sections used when

- * the tick count is returned to the standard critical section macros. */

-    #define portTICK_TYPE_ENTER_CRITICAL()                      portENTER_CRITICAL()

-    #define portTICK_TYPE_EXIT_CRITICAL()                       portEXIT_CRITICAL()

-    #define portTICK_TYPE_SET_INTERRUPT_MASK_FROM_ISR()         portSET_INTERRUPT_MASK_FROM_ISR()

-    #define portTICK_TYPE_CLEAR_INTERRUPT_MASK_FROM_ISR( x )    portCLEAR_INTERRUPT_MASK_FROM_ISR( ( x ) )

-#else

-

-/* The tick type can be read atomically, so critical sections used when the

- * tick count is returned can be defined away. */

-    #define portTICK_TYPE_ENTER_CRITICAL()

-    #define portTICK_TYPE_EXIT_CRITICAL()

-    #define portTICK_TYPE_SET_INTERRUPT_MASK_FROM_ISR()         0

-    #define portTICK_TYPE_CLEAR_INTERRUPT_MASK_FROM_ISR( x )    ( void ) ( x )

-#endif /* if ( portTICK_TYPE_IS_ATOMIC == 0 ) */

-

-/* Definitions to allow backward compatibility with FreeRTOS versions prior to

- * V8 if desired. */

-#ifndef configENABLE_BACKWARD_COMPATIBILITY

-    #define configENABLE_BACKWARD_COMPATIBILITY    1

-#endif

-

-#ifndef configPRINTF

-

-/* configPRINTF() was not defined, so define it away to nothing.  To use

- * configPRINTF() then define it as follows (where MyPrintFunction() is

- * provided by the application writer):

- *

- * void MyPrintFunction(const char *pcFormat, ... );

- #define configPRINTF( X )   MyPrintFunction X

- *

- * Then call like a standard printf() function, but placing brackets around

- * all parameters so they are passed as a single parameter.  For example:

- * configPRINTF( ("Value = %d", MyVariable) ); */

-    #define configPRINTF( X )

-#endif

-

-#ifndef configMAX

-

-/* The application writer has not provided their own MAX macro, so define

- * the following generic implementation. */

-    #define configMAX( a, b )    ( ( ( a ) > ( b ) ) ? ( a ) : ( b ) )

-#endif

-

-#ifndef configMIN

-

-/* The application writer has not provided their own MIN macro, so define

- * the following generic implementation. */

-    #define configMIN( a, b )    ( ( ( a ) < ( b ) ) ? ( a ) : ( b ) )

-#endif

-

-#if configENABLE_BACKWARD_COMPATIBILITY == 1

-    #define eTaskStateGet                 eTaskGetState

-    #define portTickType                  TickType_t

-    #define xTaskHandle                   TaskHandle_t

-    #define xQueueHandle                  QueueHandle_t

-    #define xSemaphoreHandle              SemaphoreHandle_t

-    #define xQueueSetHandle               QueueSetHandle_t

-    #define xQueueSetMemberHandle         QueueSetMemberHandle_t

-    #define xTimeOutType                  TimeOut_t

-    #define xMemoryRegion                 MemoryRegion_t

-    #define xTaskParameters               TaskParameters_t

-    #define xTaskStatusType               TaskStatus_t

-    #define xTimerHandle                  TimerHandle_t

-    #define pdTASK_HOOK_CODE              TaskHookFunction_t

-    #define portTICK_RATE_MS              portTICK_PERIOD_MS

-    #define pcTaskGetTaskName             pcTaskGetName

-    #define pcTimerGetTimerName           pcTimerGetName

-    #define pcQueueGetQueueName           pcQueueGetName

-    #define vTaskGetTaskInfo              vTaskGetInfo

-    #define xTaskGetIdleRunTimeCounter    ulTaskGetIdleRunTimeCounter

-

-/* Backward compatibility within the scheduler code only - these definitions

- * are not really required but are included for completeness. */

-    #define tmrTIMER_CALLBACK             TimerCallbackFunction_t

-    #define pdTASK_CODE                   TaskFunction_t

-    #define xListItem                     ListItem_t

-    #define xList                         List_t

-

-/* For libraries that break the list data hiding, and access list structure

- * members directly (which is not supposed to be done). */

-    #define pxContainer                   pvContainer

-#endif /* configENABLE_BACKWARD_COMPATIBILITY */

-

-#if ( configUSE_ALTERNATIVE_API != 0 )

-    #error The alternative API was deprecated some time ago, and was removed in FreeRTOS V9.0 0

-#endif

-

-/* Set configUSE_TASK_FPU_SUPPORT to 0 to omit floating point support even

- * if floating point hardware is otherwise supported by the FreeRTOS port in use.

- * This constant is not supported by all FreeRTOS ports that include floating

- * point support. */

-#ifndef configUSE_TASK_FPU_SUPPORT

-    #define configUSE_TASK_FPU_SUPPORT    1

-#endif

-

-/* Set configENABLE_MPU to 1 to enable MPU support and 0 to disable it. This is

- * currently used in ARMv8M ports. */

-#ifndef configENABLE_MPU

-    #define configENABLE_MPU    0

-#endif

-

-/* Set configENABLE_FPU to 1 to enable FPU support and 0 to disable it. This is

- * currently used in ARMv8M ports. */

-#ifndef configENABLE_FPU

-    #define configENABLE_FPU    1

-#endif

-

-/* Set configENABLE_MVE to 1 to enable MVE support and 0 to disable it. This is

- * currently used in ARMv8M ports. */

-#ifndef configENABLE_MVE

-    #define configENABLE_MVE    0

-#endif

-

-/* Set configENABLE_TRUSTZONE to 1 enable TrustZone support and 0 to disable it.

- * This is currently used in ARMv8M ports. */

-#ifndef configENABLE_TRUSTZONE

-    #define configENABLE_TRUSTZONE    1

-#endif

-

-/* Set configRUN_FREERTOS_SECURE_ONLY to 1 to run the FreeRTOS ARMv8M port on

- * the Secure Side only. */

-#ifndef configRUN_FREERTOS_SECURE_ONLY

-    #define configRUN_FREERTOS_SECURE_ONLY    0

-#endif

-

-#ifndef configRUN_ADDITIONAL_TESTS

-    #define configRUN_ADDITIONAL_TESTS    0

-#endif

-

-

-/* Sometimes the FreeRTOSConfig.h settings only allow a task to be created using

- * dynamically allocated RAM, in which case when any task is deleted it is known

- * that both the task's stack and TCB need to be freed.  Sometimes the

- * FreeRTOSConfig.h settings only allow a task to be created using statically

- * allocated RAM, in which case when any task is deleted it is known that neither

- * the task's stack or TCB should be freed.  Sometimes the FreeRTOSConfig.h

- * settings allow a task to be created using either statically or dynamically

- * allocated RAM, in which case a member of the TCB is used to record whether the

- * stack and/or TCB were allocated statically or dynamically, so when a task is

- * deleted the RAM that was allocated dynamically is freed again and no attempt is

- * made to free the RAM that was allocated statically.

- * tskSTATIC_AND_DYNAMIC_ALLOCATION_POSSIBLE is only true if it is possible for a

- * task to be created using either statically or dynamically allocated RAM.  Note

- * that if portUSING_MPU_WRAPPERS is 1 then a protected task can be created with

- * a statically allocated stack and a dynamically allocated TCB.

- *

- * The following table lists various combinations of portUSING_MPU_WRAPPERS,

- * configSUPPORT_DYNAMIC_ALLOCATION and configSUPPORT_STATIC_ALLOCATION and

- * when it is possible to have both static and dynamic allocation:

- *  +-----+---------+--------+-----------------------------+-----------------------------------+------------------+-----------+

- * | MPU | Dynamic | Static |     Available Functions     |       Possible Allocations        | Both Dynamic and | Need Free |

- * |     |         |        |                             |                                   | Static Possible  |           |

- * +-----+---------+--------+-----------------------------+-----------------------------------+------------------+-----------+

- * | 0   | 0       | 1      | xTaskCreateStatic           | TCB - Static, Stack - Static      | No               | No        |

- * +-----|---------|--------|-----------------------------|-----------------------------------|------------------|-----------|

- * | 0   | 1       | 0      | xTaskCreate                 | TCB - Dynamic, Stack - Dynamic    | No               | Yes       |

- * +-----|---------|--------|-----------------------------|-----------------------------------|------------------|-----------|

- * | 0   | 1       | 1      | xTaskCreate,                | 1. TCB - Dynamic, Stack - Dynamic | Yes              | Yes       |

- * |     |         |        | xTaskCreateStatic           | 2. TCB - Static, Stack - Static   |                  |           |

- * +-----|---------|--------|-----------------------------|-----------------------------------|------------------|-----------|

- * | 1   | 0       | 1      | xTaskCreateStatic,          | TCB - Static, Stack - Static      | No               | No        |

- * |     |         |        | xTaskCreateRestrictedStatic |                                   |                  |           |

- * +-----|---------|--------|-----------------------------|-----------------------------------|------------------|-----------|

- * | 1   | 1       | 0      | xTaskCreate,                | 1. TCB - Dynamic, Stack - Dynamic | Yes              | Yes       |

- * |     |         |        | xTaskCreateRestricted       | 2. TCB - Dynamic, Stack - Static  |                  |           |

- * +-----|---------|--------|-----------------------------|-----------------------------------|------------------|-----------|

- * | 1   | 1       | 1      | xTaskCreate,                | 1. TCB - Dynamic, Stack - Dynamic | Yes              | Yes       |

- * |     |         |        | xTaskCreateStatic,          | 2. TCB - Dynamic, Stack - Static  |                  |           |

- * |     |         |        | xTaskCreateRestricted,      | 3. TCB - Static, Stack - Static   |                  |           |

- * |     |         |        | xTaskCreateRestrictedStatic |                                   |                  |           |

- * +-----+---------+--------+-----------------------------+-----------------------------------+------------------+-----------+

- */

-#define tskSTATIC_AND_DYNAMIC_ALLOCATION_POSSIBLE                                                                                     \

-    ( ( ( portUSING_MPU_WRAPPERS == 0 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) && ( configSUPPORT_STATIC_ALLOCATION == 1 ) ) || \

-      ( ( portUSING_MPU_WRAPPERS == 1 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) ) )

-

-/*

- * In line with software engineering best practice, FreeRTOS implements a strict

- * data hiding policy, so the real structures used by FreeRTOS to maintain the

- * state of tasks, queues, semaphores, etc. are not accessible to the application

- * code.  However, if the application writer wants to statically allocate such

- * an object then the size of the object needs to be known.  Dummy structures

- * that are guaranteed to have the same size and alignment requirements of the

- * real objects are used for this purpose.  The dummy list and list item

- * structures below are used for inclusion in such a dummy structure.

- */

-struct xSTATIC_LIST_ITEM

-{

-    #if ( configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES == 1 )

-        TickType_t xDummy1;

-    #endif

-    TickType_t xDummy2;

-    void * pvDummy3[ 4 ];

-    #if ( configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES == 1 )

-        TickType_t xDummy4;

-    #endif

-};

-typedef struct xSTATIC_LIST_ITEM StaticListItem_t;

-

-#if ( configUSE_MINI_LIST_ITEM == 1 )

-    /* See the comments above the struct xSTATIC_LIST_ITEM definition. */

-    struct xSTATIC_MINI_LIST_ITEM

-    {

-        #if ( configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES == 1 )

-            TickType_t xDummy1;

-        #endif

-        TickType_t xDummy2;

-        void * pvDummy3[ 2 ];

-    };

-    typedef struct xSTATIC_MINI_LIST_ITEM StaticMiniListItem_t;

-#else /* if ( configUSE_MINI_LIST_ITEM == 1 ) */

-    typedef struct xSTATIC_LIST_ITEM      StaticMiniListItem_t;

-#endif /* if ( configUSE_MINI_LIST_ITEM == 1 ) */

-

-/* See the comments above the struct xSTATIC_LIST_ITEM definition. */

-typedef struct xSTATIC_LIST

-{

-    #if ( configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES == 1 )

-        TickType_t xDummy1;

-    #endif

-    UBaseType_t uxDummy2;

-    void * pvDummy3;

-    StaticMiniListItem_t xDummy4;

-    #if ( configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES == 1 )

-        TickType_t xDummy5;

-    #endif

-} StaticList_t;

-

-/*

- * In line with software engineering best practice, especially when supplying a

- * library that is likely to change in future versions, FreeRTOS implements a

- * strict data hiding policy.  This means the Task structure used internally by

- * FreeRTOS is not accessible to application code.  However, if the application

- * writer wants to statically allocate the memory required to create a task then

- * the size of the task object needs to be known.  The StaticTask_t structure

- * below is provided for this purpose.  Its sizes and alignment requirements are

- * guaranteed to match those of the genuine structure, no matter which

- * architecture is being used, and no matter how the values in FreeRTOSConfig.h

- * are set.  Its contents are somewhat obfuscated in the hope users will

- * recognise that it would be unwise to make direct use of the structure members.

- */

-typedef struct xSTATIC_TCB

-{

-    void * pxDummy1;

-    #if ( portUSING_MPU_WRAPPERS == 1 )

-        xMPU_SETTINGS xDummy2;

-    #endif

-    StaticListItem_t xDummy3[ 2 ];

-    UBaseType_t uxDummy5;

-    void * pxDummy6;

-    uint8_t ucDummy7[ configMAX_TASK_NAME_LEN ];

-    #if ( ( portSTACK_GROWTH > 0 ) || ( configRECORD_STACK_HIGH_ADDRESS == 1 ) )

-        void * pxDummy8;

-    #endif

-    #if ( portCRITICAL_NESTING_IN_TCB == 1 )

-        UBaseType_t uxDummy9;

-    #endif

-    #if ( configUSE_TRACE_FACILITY == 1 )

-        UBaseType_t uxDummy10[ 2 ];

-    #endif

-    #if ( configUSE_MUTEXES == 1 )

-        UBaseType_t uxDummy12[ 2 ];

-    #endif

-    #if ( configUSE_APPLICATION_TASK_TAG == 1 )

-        void * pxDummy14;

-    #endif

-    #if ( configNUM_THREAD_LOCAL_STORAGE_POINTERS > 0 )

-        void * pvDummy15[ configNUM_THREAD_LOCAL_STORAGE_POINTERS ];

-    #endif

-    #if ( configGENERATE_RUN_TIME_STATS == 1 )

-        configRUN_TIME_COUNTER_TYPE ulDummy16;

-    #endif

-    #if ( ( configUSE_NEWLIB_REENTRANT == 1 ) || ( configUSE_C_RUNTIME_TLS_SUPPORT == 1 ) )

-        configTLS_BLOCK_TYPE xDummy17;

-    #endif

-    #if ( configUSE_TASK_NOTIFICATIONS == 1 )

-        uint32_t ulDummy18[ configTASK_NOTIFICATION_ARRAY_ENTRIES ];

-        uint8_t ucDummy19[ configTASK_NOTIFICATION_ARRAY_ENTRIES ];

-    #endif

-    #if ( tskSTATIC_AND_DYNAMIC_ALLOCATION_POSSIBLE != 0 )

-        uint8_t uxDummy20;

-    #endif

-

-    #if ( INCLUDE_xTaskAbortDelay == 1 )

-        uint8_t ucDummy21;

-    #endif

-    #if ( configUSE_POSIX_ERRNO == 1 )

-        int iDummy22;

-    #endif

-} StaticTask_t;

-

-/*

- * In line with software engineering best practice, especially when supplying a

- * library that is likely to change in future versions, FreeRTOS implements a

- * strict data hiding policy.  This means the Queue structure used internally by

- * FreeRTOS is not accessible to application code.  However, if the application

- * writer wants to statically allocate the memory required to create a queue

- * then the size of the queue object needs to be known.  The StaticQueue_t

- * structure below is provided for this purpose.  Its sizes and alignment

- * requirements are guaranteed to match those of the genuine structure, no

- * matter which architecture is being used, and no matter how the values in

- * FreeRTOSConfig.h are set.  Its contents are somewhat obfuscated in the hope

- * users will recognise that it would be unwise to make direct use of the

- * structure members.

- */

-typedef struct xSTATIC_QUEUE

-{

-    void * pvDummy1[ 3 ];

-

-    union

-    {

-        void * pvDummy2;

-        UBaseType_t uxDummy2;

-    } u;

-

-    StaticList_t xDummy3[ 2 ];

-    UBaseType_t uxDummy4[ 3 ];

-    uint8_t ucDummy5[ 2 ];

-

-    #if ( ( configSUPPORT_STATIC_ALLOCATION == 1 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) )

-        uint8_t ucDummy6;

-    #endif

-

-    #if ( configUSE_QUEUE_SETS == 1 )

-        void * pvDummy7;

-    #endif

-

-    #if ( configUSE_TRACE_FACILITY == 1 )

-        UBaseType_t uxDummy8;

-        uint8_t ucDummy9;

-    #endif

-} StaticQueue_t;

-typedef StaticQueue_t StaticSemaphore_t;

-

-/*

- * In line with software engineering best practice, especially when supplying a

- * library that is likely to change in future versions, FreeRTOS implements a

- * strict data hiding policy.  This means the event group structure used

- * internally by FreeRTOS is not accessible to application code.  However, if

- * the application writer wants to statically allocate the memory required to

- * create an event group then the size of the event group object needs to be

- * know.  The StaticEventGroup_t structure below is provided for this purpose.

- * Its sizes and alignment requirements are guaranteed to match those of the

- * genuine structure, no matter which architecture is being used, and no matter

- * how the values in FreeRTOSConfig.h are set.  Its contents are somewhat

- * obfuscated in the hope users will recognise that it would be unwise to make

- * direct use of the structure members.

- */

-typedef struct xSTATIC_EVENT_GROUP

-{

-    TickType_t xDummy1;

-    StaticList_t xDummy2;

-

-    #if ( configUSE_TRACE_FACILITY == 1 )

-        UBaseType_t uxDummy3;

-    #endif

-

-    #if ( ( configSUPPORT_STATIC_ALLOCATION == 1 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) )

-        uint8_t ucDummy4;

-    #endif

-} StaticEventGroup_t;

-

-/*

- * In line with software engineering best practice, especially when supplying a

- * library that is likely to change in future versions, FreeRTOS implements a

- * strict data hiding policy.  This means the software timer structure used

- * internally by FreeRTOS is not accessible to application code.  However, if

- * the application writer wants to statically allocate the memory required to

- * create a software timer then the size of the queue object needs to be known.

- * The StaticTimer_t structure below is provided for this purpose.  Its sizes

- * and alignment requirements are guaranteed to match those of the genuine

- * structure, no matter which architecture is being used, and no matter how the

- * values in FreeRTOSConfig.h are set.  Its contents are somewhat obfuscated in

- * the hope users will recognise that it would be unwise to make direct use of

- * the structure members.

- */

-typedef struct xSTATIC_TIMER

-{

-    void * pvDummy1;

-    StaticListItem_t xDummy2;

-    TickType_t xDummy3;

-    void * pvDummy5;

-    TaskFunction_t pvDummy6;

-    #if ( configUSE_TRACE_FACILITY == 1 )

-        UBaseType_t uxDummy7;

-    #endif

-    uint8_t ucDummy8;

-} StaticTimer_t;

-

-/*

- * In line with software engineering best practice, especially when supplying a

- * library that is likely to change in future versions, FreeRTOS implements a

- * strict data hiding policy.  This means the stream buffer structure used

- * internally by FreeRTOS is not accessible to application code.  However, if

- * the application writer wants to statically allocate the memory required to

- * create a stream buffer then the size of the stream buffer object needs to be

- * known.  The StaticStreamBuffer_t structure below is provided for this

- * purpose.  Its size and alignment requirements are guaranteed to match those

- * of the genuine structure, no matter which architecture is being used, and

- * no matter how the values in FreeRTOSConfig.h are set.  Its contents are

- * somewhat obfuscated in the hope users will recognise that it would be unwise

- * to make direct use of the structure members.

- */

-typedef struct xSTATIC_STREAM_BUFFER

-{

-    size_t uxDummy1[ 4 ];

-    void * pvDummy2[ 3 ];

-    uint8_t ucDummy3;

-    #if ( configUSE_TRACE_FACILITY == 1 )

-        UBaseType_t uxDummy4;

-    #endif

-    #if ( configUSE_SB_COMPLETED_CALLBACK == 1 )

-        void * pvDummy5[ 2 ];

-    #endif

-} StaticStreamBuffer_t;

-

-/* Message buffers are built on stream buffers. */

-typedef StaticStreamBuffer_t StaticMessageBuffer_t;

-

-/* *INDENT-OFF* */

-#ifdef __cplusplus

-    }

-#endif

-/* *INDENT-ON* */

-

-#endif /* INC_FREERTOS_H */

+/*
+ * FreeRTOS Kernel <DEVELOPMENT BRANCH>
+ * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.
+ *
+ * SPDX-License-Identifier: MIT
+ *
+ * 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.
+ *
+ * https://www.FreeRTOS.org
+ * https://github.com/FreeRTOS
+ *
+ */
+
+#ifndef INC_FREERTOS_H
+#define INC_FREERTOS_H
+
+/*
+ * Include the generic headers required for the FreeRTOS port being used.
+ */
+#include <stddef.h>
+
+/*
+ * If stdint.h cannot be located then:
+ *   + If using GCC ensure the -nostdint options is *not* being used.
+ *   + Ensure the project's include path includes the directory in which your
+ *     compiler stores stdint.h.
+ *   + Set any compiler options necessary for it to support C99, as technically
+ *     stdint.h is only mandatory with C99 (FreeRTOS does not require C99 in any
+ *     other way).
+ *   + The FreeRTOS download includes a simple stdint.h definition that can be
+ *     used in cases where none is provided by the compiler.  The files only
+ *     contains the typedefs required to build FreeRTOS.  Read the instructions
+ *     in FreeRTOS/source/stdint.readme for more information.
+ */
+#include <stdint.h> /* READ COMMENT ABOVE. */
+
+/* *INDENT-OFF* */
+#ifdef __cplusplus
+    extern "C" {
+#endif
+/* *INDENT-ON* */
+
+/* Application specific configuration options. */
+#include "FreeRTOSConfig.h"
+
+/* Basic FreeRTOS definitions. */
+#include "projdefs.h"
+
+/* Definitions specific to the port being used. */
+#include "portable.h"
+
+/* Must be defaulted before configUSE_NEWLIB_REENTRANT is used below. */
+#ifndef configUSE_NEWLIB_REENTRANT
+    #define configUSE_NEWLIB_REENTRANT    0
+#endif
+
+/* Required if struct _reent is used. */
+#if ( configUSE_NEWLIB_REENTRANT == 1 )
+
+/* Note Newlib support has been included by popular demand, but is not
+ * used by the FreeRTOS maintainers themselves.  FreeRTOS is not
+ * responsible for resulting newlib operation.  User must be familiar with
+ * newlib and must provide system-wide implementations of the necessary
+ * stubs. Be warned that (at the time of writing) the current newlib design
+ * implements a system-wide malloc() that must be provided with locks.
+ *
+ * See the third party link http://www.nadler.com/embedded/newlibAndFreeRTOS.html
+ * for additional information. */
+    #include <reent.h>
+
+    #define configUSE_C_RUNTIME_TLS_SUPPORT    1
+
+    #ifndef configTLS_BLOCK_TYPE
+        #define configTLS_BLOCK_TYPE           struct _reent
+    #endif
+
+    #ifndef configINIT_TLS_BLOCK
+        #define configINIT_TLS_BLOCK( xTLSBlock )    _REENT_INIT_PTR( &( xTLSBlock ) )
+    #endif
+
+    #ifndef configSET_TLS_BLOCK
+        #define configSET_TLS_BLOCK( xTLSBlock )    ( _impure_ptr = &( xTLSBlock ) )
+    #endif
+
+    #ifndef configDEINIT_TLS_BLOCK
+        #define configDEINIT_TLS_BLOCK( xTLSBlock )    _reclaim_reent( &( xTLSBlock ) )
+    #endif
+#endif /* if ( configUSE_NEWLIB_REENTRANT == 1 ) */
+
+#ifndef configUSE_C_RUNTIME_TLS_SUPPORT
+    #define configUSE_C_RUNTIME_TLS_SUPPORT    0
+#endif
+
+#if ( ( configUSE_NEWLIB_REENTRANT == 0 ) && ( configUSE_C_RUNTIME_TLS_SUPPORT == 1 ) )
+
+    #ifndef configTLS_BLOCK_TYPE
+        #error Missing definition:  configTLS_BLOCK_TYPE must be defined in FreeRTOSConfig.h when configUSE_C_RUNTIME_TLS_SUPPORT is set to 1.
+    #endif
+
+    #ifndef configINIT_TLS_BLOCK
+        #error Missing definition:  configINIT_TLS_BLOCK must be defined in FreeRTOSConfig.h when configUSE_C_RUNTIME_TLS_SUPPORT is set to 1.
+    #endif
+
+    #ifndef configSET_TLS_BLOCK
+        #error Missing definition:  configSET_TLS_BLOCK must be defined in FreeRTOSConfig.h when configUSE_C_RUNTIME_TLS_SUPPORT is set to 1.
+    #endif
+
+    #ifndef configDEINIT_TLS_BLOCK
+        #error Missing definition:  configDEINIT_TLS_BLOCK must be defined in FreeRTOSConfig.h when configUSE_C_RUNTIME_TLS_SUPPORT is set to 1.
+    #endif
+#endif /* if ( ( configUSE_NEWLIB_REENTRANT == 0 ) && ( configUSE_C_RUNTIME_TLS_SUPPORT == 1 ) ) */
+
+/*
+ * Check all the required application specific macros have been defined.
+ * These macros are application specific and (as downloaded) are defined
+ * within FreeRTOSConfig.h.
+ */
+
+#ifndef configMINIMAL_STACK_SIZE
+    #error Missing definition:  configMINIMAL_STACK_SIZE must be defined in FreeRTOSConfig.h.  configMINIMAL_STACK_SIZE defines the size (in words) of the stack allocated to the idle task.  Refer to the demo project provided for your port for a suitable value.
+#endif
+
+#ifndef configMAX_PRIORITIES
+    #error Missing definition:  configMAX_PRIORITIES must be defined in FreeRTOSConfig.h.  See the Configuration section of the FreeRTOS API documentation for details.
+#endif
+
+#if configMAX_PRIORITIES < 1
+    #error configMAX_PRIORITIES must be defined to be greater than or equal to 1.
+#endif
+
+#ifndef configUSE_PREEMPTION
+    #error Missing definition:  configUSE_PREEMPTION must be defined in FreeRTOSConfig.h as either 1 or 0.  See the Configuration section of the FreeRTOS API documentation for details.
+#endif
+
+#ifndef configUSE_IDLE_HOOK
+    #error Missing definition:  configUSE_IDLE_HOOK must be defined in FreeRTOSConfig.h as either 1 or 0.  See the Configuration section of the FreeRTOS API documentation for details.
+#endif
+
+#ifndef configUSE_TICK_HOOK
+    #error Missing definition:  configUSE_TICK_HOOK must be defined in FreeRTOSConfig.h as either 1 or 0.  See the Configuration section of the FreeRTOS API documentation for details.
+#endif
+
+#ifndef configUSE_16_BIT_TICKS
+    #error Missing definition:  configUSE_16_BIT_TICKS must be defined in FreeRTOSConfig.h as either 1 or 0.  See the Configuration section of the FreeRTOS API documentation for details.
+#endif
+
+#ifndef INCLUDE_vTaskPrioritySet
+    #define INCLUDE_vTaskPrioritySet    0
+#endif
+
+#ifndef INCLUDE_uxTaskPriorityGet
+    #define INCLUDE_uxTaskPriorityGet    0
+#endif
+
+#ifndef INCLUDE_vTaskDelete
+    #define INCLUDE_vTaskDelete    0
+#endif
+
+#ifndef INCLUDE_vTaskSuspend
+    #define INCLUDE_vTaskSuspend    0
+#endif
+
+#ifdef INCLUDE_xTaskDelayUntil
+    #ifdef INCLUDE_vTaskDelayUntil
+
+/* INCLUDE_vTaskDelayUntil was replaced by INCLUDE_xTaskDelayUntil.  Backward
+ * compatibility is maintained if only one or the other is defined, but
+ * there is a conflict if both are defined. */
+        #error INCLUDE_vTaskDelayUntil and INCLUDE_xTaskDelayUntil are both defined.  INCLUDE_vTaskDelayUntil is no longer required and should be removed
+    #endif
+#endif
+
+#ifndef INCLUDE_xTaskDelayUntil
+    #ifdef INCLUDE_vTaskDelayUntil
+
+/* If INCLUDE_vTaskDelayUntil is set but INCLUDE_xTaskDelayUntil is not then
+ * the project's FreeRTOSConfig.h probably pre-dates the introduction of
+ * xTaskDelayUntil and setting INCLUDE_xTaskDelayUntil to whatever
+ * INCLUDE_vTaskDelayUntil is set to will ensure backward compatibility.
+ */
+        #define INCLUDE_xTaskDelayUntil    INCLUDE_vTaskDelayUntil
+    #endif
+#endif
+
+#ifndef INCLUDE_xTaskDelayUntil
+    #define INCLUDE_xTaskDelayUntil    0
+#endif
+
+#ifndef INCLUDE_vTaskDelay
+    #define INCLUDE_vTaskDelay    0
+#endif
+
+#ifndef INCLUDE_xTaskGetIdleTaskHandle
+    #define INCLUDE_xTaskGetIdleTaskHandle    0
+#endif
+
+#ifndef INCLUDE_xTaskAbortDelay
+    #define INCLUDE_xTaskAbortDelay    0
+#endif
+
+#ifndef INCLUDE_xQueueGetMutexHolder
+    #define INCLUDE_xQueueGetMutexHolder    0
+#endif
+
+#ifndef INCLUDE_xSemaphoreGetMutexHolder
+    #define INCLUDE_xSemaphoreGetMutexHolder    INCLUDE_xQueueGetMutexHolder
+#endif
+
+#ifndef INCLUDE_xTaskGetHandle
+    #define INCLUDE_xTaskGetHandle    0
+#endif
+
+#ifndef INCLUDE_uxTaskGetStackHighWaterMark
+    #define INCLUDE_uxTaskGetStackHighWaterMark    0
+#endif
+
+#ifndef INCLUDE_uxTaskGetStackHighWaterMark2
+    #define INCLUDE_uxTaskGetStackHighWaterMark2    0
+#endif
+
+#ifndef INCLUDE_eTaskGetState
+    #define INCLUDE_eTaskGetState    0
+#endif
+
+#ifndef INCLUDE_xTaskResumeFromISR
+    #define INCLUDE_xTaskResumeFromISR    1
+#endif
+
+#ifndef INCLUDE_xTimerPendFunctionCall
+    #define INCLUDE_xTimerPendFunctionCall    0
+#endif
+
+#ifndef INCLUDE_xTaskGetSchedulerState
+    #define INCLUDE_xTaskGetSchedulerState    0
+#endif
+
+#ifndef INCLUDE_xTaskGetCurrentTaskHandle
+    #define INCLUDE_xTaskGetCurrentTaskHandle    1
+#endif
+
+#if ( defined( configUSE_CO_ROUTINES ) && configUSE_CO_ROUTINES != 0 )
+    #warning Co-routines have been removed from FreeRTOS-Kernel versions released after V10.5.1. You can view previous versions of the FreeRTOS Kernel at github.com/freertos/freertos-kernel/tree/V10.5.1 .
+#endif
+
+#ifndef configUSE_DAEMON_TASK_STARTUP_HOOK
+    #define configUSE_DAEMON_TASK_STARTUP_HOOK    0
+#endif
+
+#ifndef configUSE_APPLICATION_TASK_TAG
+    #define configUSE_APPLICATION_TASK_TAG    0
+#endif
+
+#ifndef configNUM_THREAD_LOCAL_STORAGE_POINTERS
+    #define configNUM_THREAD_LOCAL_STORAGE_POINTERS    0
+#endif
+
+#ifndef configUSE_RECURSIVE_MUTEXES
+    #define configUSE_RECURSIVE_MUTEXES    0
+#endif
+
+#ifndef configUSE_MUTEXES
+    #define configUSE_MUTEXES    0
+#endif
+
+#ifndef configUSE_TIMERS
+    #define configUSE_TIMERS    0
+#endif
+
+#ifndef configUSE_COUNTING_SEMAPHORES
+    #define configUSE_COUNTING_SEMAPHORES    0
+#endif
+
+#ifndef configUSE_ALTERNATIVE_API
+    #define configUSE_ALTERNATIVE_API    0
+#endif
+
+#ifndef portCRITICAL_NESTING_IN_TCB
+    #define portCRITICAL_NESTING_IN_TCB    0
+#endif
+
+#ifndef configMAX_TASK_NAME_LEN
+    #define configMAX_TASK_NAME_LEN    16
+#endif
+
+#ifndef configIDLE_SHOULD_YIELD
+    #define configIDLE_SHOULD_YIELD    1
+#endif
+
+#if configMAX_TASK_NAME_LEN < 1
+    #error configMAX_TASK_NAME_LEN must be set to a minimum of 1 in FreeRTOSConfig.h
+#endif
+
+#ifndef configASSERT
+    #define configASSERT( x )
+    #define configASSERT_DEFINED    0
+#else
+    #define configASSERT_DEFINED    1
+#endif
+
+/* configPRECONDITION should be defined as configASSERT.
+ * The CBMC proofs need a way to track assumptions and assertions.
+ * A configPRECONDITION statement should express an implicit invariant or
+ * assumption made.  A configASSERT statement should express an invariant that must
+ * hold explicit before calling the code. */
+#ifndef configPRECONDITION
+    #define configPRECONDITION( X )    configASSERT( X )
+    #define configPRECONDITION_DEFINED    0
+#else
+    #define configPRECONDITION_DEFINED    1
+#endif
+
+#ifndef portMEMORY_BARRIER
+    #define portMEMORY_BARRIER()
+#endif
+
+#ifndef portSOFTWARE_BARRIER
+    #define portSOFTWARE_BARRIER()
+#endif
+
+/* The timers module relies on xTaskGetSchedulerState(). */
+#if configUSE_TIMERS == 1
+
+    #ifndef configTIMER_TASK_PRIORITY
+        #error If configUSE_TIMERS is set to 1 then configTIMER_TASK_PRIORITY must also be defined.
+    #endif /* configTIMER_TASK_PRIORITY */
+
+    #ifndef configTIMER_QUEUE_LENGTH
+        #error If configUSE_TIMERS is set to 1 then configTIMER_QUEUE_LENGTH must also be defined.
+    #endif /* configTIMER_QUEUE_LENGTH */
+
+    #ifndef configTIMER_TASK_STACK_DEPTH
+        #error If configUSE_TIMERS is set to 1 then configTIMER_TASK_STACK_DEPTH must also be defined.
+    #endif /* configTIMER_TASK_STACK_DEPTH */
+
+#endif /* configUSE_TIMERS */
+
+#ifndef portSET_INTERRUPT_MASK_FROM_ISR
+    #define portSET_INTERRUPT_MASK_FROM_ISR()    0
+#endif
+
+#ifndef portCLEAR_INTERRUPT_MASK_FROM_ISR
+    #define portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedStatusValue )    ( void ) ( uxSavedStatusValue )
+#endif
+
+#ifndef portCLEAN_UP_TCB
+    #define portCLEAN_UP_TCB( pxTCB )    ( void ) ( pxTCB )
+#endif
+
+#ifndef portPRE_TASK_DELETE_HOOK
+    #define portPRE_TASK_DELETE_HOOK( pvTaskToDelete, pxYieldPending )
+#endif
+
+#ifndef portSETUP_TCB
+    #define portSETUP_TCB( pxTCB )    ( void ) ( pxTCB )
+#endif
+
+#ifndef configQUEUE_REGISTRY_SIZE
+    #define configQUEUE_REGISTRY_SIZE    0U
+#endif
+
+#if ( configQUEUE_REGISTRY_SIZE < 1 )
+    #define vQueueAddToRegistry( xQueue, pcName )
+    #define vQueueUnregisterQueue( xQueue )
+    #define pcQueueGetName( xQueue )
+#endif
+
+#ifndef configUSE_MINI_LIST_ITEM
+    #define configUSE_MINI_LIST_ITEM    1
+#endif
+
+#ifndef portPOINTER_SIZE_TYPE
+    #define portPOINTER_SIZE_TYPE    uint32_t
+#endif
+
+/* Remove any unused trace macros. */
+#ifndef traceSTART
+
+/* Used to perform any necessary initialisation - for example, open a file
+ * into which trace is to be written. */
+    #define traceSTART()
+#endif
+
+#ifndef traceEND
+
+/* Use to close a trace, for example close a file into which trace has been
+ * written. */
+    #define traceEND()
+#endif
+
+#ifndef traceTASK_SWITCHED_IN
+
+/* Called after a task has been selected to run.  pxCurrentTCB holds a pointer
+ * to the task control block of the selected task. */
+    #define traceTASK_SWITCHED_IN()
+#endif
+
+#ifndef traceINCREASE_TICK_COUNT
+
+/* Called before stepping the tick count after waking from tickless idle
+ * sleep. */
+    #define traceINCREASE_TICK_COUNT( x )
+#endif
+
+#ifndef traceLOW_POWER_IDLE_BEGIN
+    /* Called immediately before entering tickless idle. */
+    #define traceLOW_POWER_IDLE_BEGIN()
+#endif
+
+#ifndef traceLOW_POWER_IDLE_END
+    /* Called when returning to the Idle task after a tickless idle. */
+    #define traceLOW_POWER_IDLE_END()
+#endif
+
+#ifndef traceTASK_SWITCHED_OUT
+
+/* Called before a task has been selected to run.  pxCurrentTCB holds a pointer
+ * to the task control block of the task being switched out. */
+    #define traceTASK_SWITCHED_OUT()
+#endif
+
+#ifndef traceTASK_PRIORITY_INHERIT
+
+/* Called when a task attempts to take a mutex that is already held by a
+ * lower priority task.  pxTCBOfMutexHolder is a pointer to the TCB of the task
+ * that holds the mutex.  uxInheritedPriority is the priority the mutex holder
+ * will inherit (the priority of the task that is attempting to obtain the
+ * muted. */
+    #define traceTASK_PRIORITY_INHERIT( pxTCBOfMutexHolder, uxInheritedPriority )
+#endif
+
+#ifndef traceTASK_PRIORITY_DISINHERIT
+
+/* Called when a task releases a mutex, the holding of which had resulted in
+ * the task inheriting the priority of a higher priority task.
+ * pxTCBOfMutexHolder is a pointer to the TCB of the task that is releasing the
+ * mutex.  uxOriginalPriority is the task's configured (base) priority. */
+    #define traceTASK_PRIORITY_DISINHERIT( pxTCBOfMutexHolder, uxOriginalPriority )
+#endif
+
+#ifndef traceBLOCKING_ON_QUEUE_RECEIVE
+
+/* Task is about to block because it cannot read from a
+ * queue/mutex/semaphore.  pxQueue is a pointer to the queue/mutex/semaphore
+ * upon which the read was attempted.  pxCurrentTCB points to the TCB of the
+ * task that attempted the read. */
+    #define traceBLOCKING_ON_QUEUE_RECEIVE( pxQueue )
+#endif
+
+#ifndef traceBLOCKING_ON_QUEUE_PEEK
+
+/* Task is about to block because it cannot read from a
+ * queue/mutex/semaphore.  pxQueue is a pointer to the queue/mutex/semaphore
+ * upon which the read was attempted.  pxCurrentTCB points to the TCB of the
+ * task that attempted the read. */
+    #define traceBLOCKING_ON_QUEUE_PEEK( pxQueue )
+#endif
+
+#ifndef traceBLOCKING_ON_QUEUE_SEND
+
+/* Task is about to block because it cannot write to a
+ * queue/mutex/semaphore.  pxQueue is a pointer to the queue/mutex/semaphore
+ * upon which the write was attempted.  pxCurrentTCB points to the TCB of the
+ * task that attempted the write. */
+    #define traceBLOCKING_ON_QUEUE_SEND( pxQueue )
+#endif
+
+#ifndef configCHECK_FOR_STACK_OVERFLOW
+    #define configCHECK_FOR_STACK_OVERFLOW    0
+#endif
+
+#ifndef configRECORD_STACK_HIGH_ADDRESS
+    #define configRECORD_STACK_HIGH_ADDRESS    0
+#endif
+
+#ifndef configINCLUDE_FREERTOS_TASK_C_ADDITIONS_H
+    #define configINCLUDE_FREERTOS_TASK_C_ADDITIONS_H    0
+#endif
+
+/* The following event macros are embedded in the kernel API calls. */
+
+#ifndef traceMOVED_TASK_TO_READY_STATE
+    #define traceMOVED_TASK_TO_READY_STATE( pxTCB )
+#endif
+
+#ifndef tracePOST_MOVED_TASK_TO_READY_STATE
+    #define tracePOST_MOVED_TASK_TO_READY_STATE( pxTCB )
+#endif
+
+#ifndef traceQUEUE_CREATE
+    #define traceQUEUE_CREATE( pxNewQueue )
+#endif
+
+#ifndef traceQUEUE_CREATE_FAILED
+    #define traceQUEUE_CREATE_FAILED( ucQueueType )
+#endif
+
+#ifndef traceCREATE_MUTEX
+    #define traceCREATE_MUTEX( pxNewQueue )
+#endif
+
+#ifndef traceCREATE_MUTEX_FAILED
+    #define traceCREATE_MUTEX_FAILED()
+#endif
+
+#ifndef traceGIVE_MUTEX_RECURSIVE
+    #define traceGIVE_MUTEX_RECURSIVE( pxMutex )
+#endif
+
+#ifndef traceGIVE_MUTEX_RECURSIVE_FAILED
+    #define traceGIVE_MUTEX_RECURSIVE_FAILED( pxMutex )
+#endif
+
+#ifndef traceTAKE_MUTEX_RECURSIVE
+    #define traceTAKE_MUTEX_RECURSIVE( pxMutex )
+#endif
+
+#ifndef traceTAKE_MUTEX_RECURSIVE_FAILED
+    #define traceTAKE_MUTEX_RECURSIVE_FAILED( pxMutex )
+#endif
+
+#ifndef traceCREATE_COUNTING_SEMAPHORE
+    #define traceCREATE_COUNTING_SEMAPHORE()
+#endif
+
+#ifndef traceCREATE_COUNTING_SEMAPHORE_FAILED
+    #define traceCREATE_COUNTING_SEMAPHORE_FAILED()
+#endif
+
+#ifndef traceQUEUE_SET_SEND
+    #define traceQUEUE_SET_SEND    traceQUEUE_SEND
+#endif
+
+#ifndef traceQUEUE_SEND
+    #define traceQUEUE_SEND( pxQueue )
+#endif
+
+#ifndef traceQUEUE_SEND_FAILED
+    #define traceQUEUE_SEND_FAILED( pxQueue )
+#endif
+
+#ifndef traceQUEUE_RECEIVE
+    #define traceQUEUE_RECEIVE( pxQueue )
+#endif
+
+#ifndef traceQUEUE_PEEK
+    #define traceQUEUE_PEEK( pxQueue )
+#endif
+
+#ifndef traceQUEUE_PEEK_FAILED
+    #define traceQUEUE_PEEK_FAILED( pxQueue )
+#endif
+
+#ifndef traceQUEUE_PEEK_FROM_ISR
+    #define traceQUEUE_PEEK_FROM_ISR( pxQueue )
+#endif
+
+#ifndef traceQUEUE_RECEIVE_FAILED
+    #define traceQUEUE_RECEIVE_FAILED( pxQueue )
+#endif
+
+#ifndef traceQUEUE_SEND_FROM_ISR
+    #define traceQUEUE_SEND_FROM_ISR( pxQueue )
+#endif
+
+#ifndef traceQUEUE_SEND_FROM_ISR_FAILED
+    #define traceQUEUE_SEND_FROM_ISR_FAILED( pxQueue )
+#endif
+
+#ifndef traceQUEUE_RECEIVE_FROM_ISR
+    #define traceQUEUE_RECEIVE_FROM_ISR( pxQueue )
+#endif
+
+#ifndef traceQUEUE_RECEIVE_FROM_ISR_FAILED
+    #define traceQUEUE_RECEIVE_FROM_ISR_FAILED( pxQueue )
+#endif
+
+#ifndef traceQUEUE_PEEK_FROM_ISR_FAILED
+    #define traceQUEUE_PEEK_FROM_ISR_FAILED( pxQueue )
+#endif
+
+#ifndef traceQUEUE_DELETE
+    #define traceQUEUE_DELETE( pxQueue )
+#endif
+
+#ifndef traceTASK_CREATE
+    #define traceTASK_CREATE( pxNewTCB )
+#endif
+
+#ifndef traceTASK_CREATE_FAILED
+    #define traceTASK_CREATE_FAILED()
+#endif
+
+#ifndef traceTASK_DELETE
+    #define traceTASK_DELETE( pxTaskToDelete )
+#endif
+
+#ifndef traceTASK_DELAY_UNTIL
+    #define traceTASK_DELAY_UNTIL( x )
+#endif
+
+#ifndef traceTASK_DELAY
+    #define traceTASK_DELAY()
+#endif
+
+#ifndef traceTASK_PRIORITY_SET
+    #define traceTASK_PRIORITY_SET( pxTask, uxNewPriority )
+#endif
+
+#ifndef traceTASK_SUSPEND
+    #define traceTASK_SUSPEND( pxTaskToSuspend )
+#endif
+
+#ifndef traceTASK_RESUME
+    #define traceTASK_RESUME( pxTaskToResume )
+#endif
+
+#ifndef traceTASK_RESUME_FROM_ISR
+    #define traceTASK_RESUME_FROM_ISR( pxTaskToResume )
+#endif
+
+#ifndef traceTASK_INCREMENT_TICK
+    #define traceTASK_INCREMENT_TICK( xTickCount )
+#endif
+
+#ifndef traceTIMER_CREATE
+    #define traceTIMER_CREATE( pxNewTimer )
+#endif
+
+#ifndef traceTIMER_CREATE_FAILED
+    #define traceTIMER_CREATE_FAILED()
+#endif
+
+#ifndef traceTIMER_COMMAND_SEND
+    #define traceTIMER_COMMAND_SEND( xTimer, xMessageID, xMessageValueValue, xReturn )
+#endif
+
+#ifndef traceTIMER_EXPIRED
+    #define traceTIMER_EXPIRED( pxTimer )
+#endif
+
+#ifndef traceTIMER_COMMAND_RECEIVED
+    #define traceTIMER_COMMAND_RECEIVED( pxTimer, xMessageID, xMessageValue )
+#endif
+
+#ifndef traceMALLOC
+    #define traceMALLOC( pvAddress, uiSize )
+#endif
+
+#ifndef traceFREE
+    #define traceFREE( pvAddress, uiSize )
+#endif
+
+#ifndef traceEVENT_GROUP_CREATE
+    #define traceEVENT_GROUP_CREATE( xEventGroup )
+#endif
+
+#ifndef traceEVENT_GROUP_CREATE_FAILED
+    #define traceEVENT_GROUP_CREATE_FAILED()
+#endif
+
+#ifndef traceEVENT_GROUP_SYNC_BLOCK
+    #define traceEVENT_GROUP_SYNC_BLOCK( xEventGroup, uxBitsToSet, uxBitsToWaitFor )
+#endif
+
+#ifndef traceEVENT_GROUP_SYNC_END
+    #define traceEVENT_GROUP_SYNC_END( xEventGroup, uxBitsToSet, uxBitsToWaitFor, xTimeoutOccurred )    ( void ) ( xTimeoutOccurred )
+#endif
+
+#ifndef traceEVENT_GROUP_WAIT_BITS_BLOCK
+    #define traceEVENT_GROUP_WAIT_BITS_BLOCK( xEventGroup, uxBitsToWaitFor )
+#endif
+
+#ifndef traceEVENT_GROUP_WAIT_BITS_END
+    #define traceEVENT_GROUP_WAIT_BITS_END( xEventGroup, uxBitsToWaitFor, xTimeoutOccurred )    ( void ) ( xTimeoutOccurred )
+#endif
+
+#ifndef traceEVENT_GROUP_CLEAR_BITS
+    #define traceEVENT_GROUP_CLEAR_BITS( xEventGroup, uxBitsToClear )
+#endif
+
+#ifndef traceEVENT_GROUP_CLEAR_BITS_FROM_ISR
+    #define traceEVENT_GROUP_CLEAR_BITS_FROM_ISR( xEventGroup, uxBitsToClear )
+#endif
+
+#ifndef traceEVENT_GROUP_SET_BITS
+    #define traceEVENT_GROUP_SET_BITS( xEventGroup, uxBitsToSet )
+#endif
+
+#ifndef traceEVENT_GROUP_SET_BITS_FROM_ISR
+    #define traceEVENT_GROUP_SET_BITS_FROM_ISR( xEventGroup, uxBitsToSet )
+#endif
+
+#ifndef traceEVENT_GROUP_DELETE
+    #define traceEVENT_GROUP_DELETE( xEventGroup )
+#endif
+
+#ifndef tracePEND_FUNC_CALL
+    #define tracePEND_FUNC_CALL( xFunctionToPend, pvParameter1, ulParameter2, ret )
+#endif
+
+#ifndef tracePEND_FUNC_CALL_FROM_ISR
+    #define tracePEND_FUNC_CALL_FROM_ISR( xFunctionToPend, pvParameter1, ulParameter2, ret )
+#endif
+
+#ifndef traceQUEUE_REGISTRY_ADD
+    #define traceQUEUE_REGISTRY_ADD( xQueue, pcQueueName )
+#endif
+
+#ifndef traceTASK_NOTIFY_TAKE_BLOCK
+    #define traceTASK_NOTIFY_TAKE_BLOCK( uxIndexToWait )
+#endif
+
+#ifndef traceTASK_NOTIFY_TAKE
+    #define traceTASK_NOTIFY_TAKE( uxIndexToWait )
+#endif
+
+#ifndef traceTASK_NOTIFY_WAIT_BLOCK
+    #define traceTASK_NOTIFY_WAIT_BLOCK( uxIndexToWait )
+#endif
+
+#ifndef traceTASK_NOTIFY_WAIT
+    #define traceTASK_NOTIFY_WAIT( uxIndexToWait )
+#endif
+
+#ifndef traceTASK_NOTIFY
+    #define traceTASK_NOTIFY( uxIndexToNotify )
+#endif
+
+#ifndef traceTASK_NOTIFY_FROM_ISR
+    #define traceTASK_NOTIFY_FROM_ISR( uxIndexToNotify )
+#endif
+
+#ifndef traceTASK_NOTIFY_GIVE_FROM_ISR
+    #define traceTASK_NOTIFY_GIVE_FROM_ISR( uxIndexToNotify )
+#endif
+
+#ifndef traceSTREAM_BUFFER_CREATE_FAILED
+    #define traceSTREAM_BUFFER_CREATE_FAILED( xIsMessageBuffer )
+#endif
+
+#ifndef traceSTREAM_BUFFER_CREATE_STATIC_FAILED
+    #define traceSTREAM_BUFFER_CREATE_STATIC_FAILED( xReturn, xIsMessageBuffer )
+#endif
+
+#ifndef traceSTREAM_BUFFER_CREATE
+    #define traceSTREAM_BUFFER_CREATE( pxStreamBuffer, xIsMessageBuffer )
+#endif
+
+#ifndef traceSTREAM_BUFFER_DELETE
+    #define traceSTREAM_BUFFER_DELETE( xStreamBuffer )
+#endif
+
+#ifndef traceSTREAM_BUFFER_RESET
+    #define traceSTREAM_BUFFER_RESET( xStreamBuffer )
+#endif
+
+#ifndef traceBLOCKING_ON_STREAM_BUFFER_SEND
+    #define traceBLOCKING_ON_STREAM_BUFFER_SEND( xStreamBuffer )
+#endif
+
+#ifndef traceSTREAM_BUFFER_SEND
+    #define traceSTREAM_BUFFER_SEND( xStreamBuffer, xBytesSent )
+#endif
+
+#ifndef traceSTREAM_BUFFER_SEND_FAILED
+    #define traceSTREAM_BUFFER_SEND_FAILED( xStreamBuffer )
+#endif
+
+#ifndef traceSTREAM_BUFFER_SEND_FROM_ISR
+    #define traceSTREAM_BUFFER_SEND_FROM_ISR( xStreamBuffer, xBytesSent )
+#endif
+
+#ifndef traceBLOCKING_ON_STREAM_BUFFER_RECEIVE
+    #define traceBLOCKING_ON_STREAM_BUFFER_RECEIVE( xStreamBuffer )
+#endif
+
+#ifndef traceSTREAM_BUFFER_RECEIVE
+    #define traceSTREAM_BUFFER_RECEIVE( xStreamBuffer, xReceivedLength )
+#endif
+
+#ifndef traceSTREAM_BUFFER_RECEIVE_FAILED
+    #define traceSTREAM_BUFFER_RECEIVE_FAILED( xStreamBuffer )
+#endif
+
+#ifndef traceSTREAM_BUFFER_RECEIVE_FROM_ISR
+    #define traceSTREAM_BUFFER_RECEIVE_FROM_ISR( xStreamBuffer, xReceivedLength )
+#endif
+
+#ifndef configGENERATE_RUN_TIME_STATS
+    #define configGENERATE_RUN_TIME_STATS    0
+#endif
+
+#if ( configGENERATE_RUN_TIME_STATS == 1 )
+
+    #ifndef portCONFIGURE_TIMER_FOR_RUN_TIME_STATS
+        #error If configGENERATE_RUN_TIME_STATS is defined then portCONFIGURE_TIMER_FOR_RUN_TIME_STATS must also be defined.  portCONFIGURE_TIMER_FOR_RUN_TIME_STATS should call a port layer function to setup a peripheral timer/counter that can then be used as the run time counter time base.
+    #endif /* portCONFIGURE_TIMER_FOR_RUN_TIME_STATS */
+
+    #ifndef portGET_RUN_TIME_COUNTER_VALUE
+        #ifndef portALT_GET_RUN_TIME_COUNTER_VALUE
+            #error If configGENERATE_RUN_TIME_STATS is defined then either portGET_RUN_TIME_COUNTER_VALUE or portALT_GET_RUN_TIME_COUNTER_VALUE must also be defined.  See the examples provided and the FreeRTOS web site for more information.
+        #endif /* portALT_GET_RUN_TIME_COUNTER_VALUE */
+    #endif /* portGET_RUN_TIME_COUNTER_VALUE */
+
+#endif /* configGENERATE_RUN_TIME_STATS */
+
+#ifndef portCONFIGURE_TIMER_FOR_RUN_TIME_STATS
+    #define portCONFIGURE_TIMER_FOR_RUN_TIME_STATS()
+#endif
+
+#ifndef configUSE_MALLOC_FAILED_HOOK
+    #define configUSE_MALLOC_FAILED_HOOK    0
+#endif
+
+#ifndef portPRIVILEGE_BIT
+    #define portPRIVILEGE_BIT    ( ( UBaseType_t ) 0x00 )
+#endif
+
+#ifndef portYIELD_WITHIN_API
+    #define portYIELD_WITHIN_API    portYIELD
+#endif
+
+#ifndef portSUPPRESS_TICKS_AND_SLEEP
+    #define portSUPPRESS_TICKS_AND_SLEEP( xExpectedIdleTime )
+#endif
+
+#ifndef configEXPECTED_IDLE_TIME_BEFORE_SLEEP
+    #define configEXPECTED_IDLE_TIME_BEFORE_SLEEP    2
+#endif
+
+#if configEXPECTED_IDLE_TIME_BEFORE_SLEEP < 2
+    #error configEXPECTED_IDLE_TIME_BEFORE_SLEEP must not be less than 2
+#endif
+
+#ifndef configUSE_TICKLESS_IDLE
+    #define configUSE_TICKLESS_IDLE    0
+#endif
+
+#ifndef configPRE_SUPPRESS_TICKS_AND_SLEEP_PROCESSING
+    #define configPRE_SUPPRESS_TICKS_AND_SLEEP_PROCESSING( x )
+#endif
+
+#ifndef configPRE_SLEEP_PROCESSING
+    #define configPRE_SLEEP_PROCESSING( x )
+#endif
+
+#ifndef configPOST_SLEEP_PROCESSING
+    #define configPOST_SLEEP_PROCESSING( x )
+#endif
+
+#ifndef configUSE_QUEUE_SETS
+    #define configUSE_QUEUE_SETS    0
+#endif
+
+#ifndef portTASK_USES_FLOATING_POINT
+    #define portTASK_USES_FLOATING_POINT()
+#endif
+
+#ifndef portALLOCATE_SECURE_CONTEXT
+    #define portALLOCATE_SECURE_CONTEXT( ulSecureStackSize )
+#endif
+
+#ifndef portDONT_DISCARD
+    #define portDONT_DISCARD
+#endif
+
+#ifndef configUSE_TIME_SLICING
+    #define configUSE_TIME_SLICING    1
+#endif
+
+#ifndef configINCLUDE_APPLICATION_DEFINED_PRIVILEGED_FUNCTIONS
+    #define configINCLUDE_APPLICATION_DEFINED_PRIVILEGED_FUNCTIONS    0
+#endif
+
+#ifndef configUSE_STATS_FORMATTING_FUNCTIONS
+    #define configUSE_STATS_FORMATTING_FUNCTIONS    0
+#endif
+
+#ifndef portASSERT_IF_INTERRUPT_PRIORITY_INVALID
+    #define portASSERT_IF_INTERRUPT_PRIORITY_INVALID()
+#endif
+
+#ifndef configUSE_TRACE_FACILITY
+    #define configUSE_TRACE_FACILITY    0
+#endif
+
+#ifndef mtCOVERAGE_TEST_MARKER
+    #define mtCOVERAGE_TEST_MARKER()
+#endif
+
+#ifndef mtCOVERAGE_TEST_DELAY
+    #define mtCOVERAGE_TEST_DELAY()
+#endif
+
+#ifndef portASSERT_IF_IN_ISR
+    #define portASSERT_IF_IN_ISR()
+#endif
+
+#ifndef configUSE_PORT_OPTIMISED_TASK_SELECTION
+    #define configUSE_PORT_OPTIMISED_TASK_SELECTION    0
+#endif
+
+#ifndef configAPPLICATION_ALLOCATED_HEAP
+    #define configAPPLICATION_ALLOCATED_HEAP    0
+#endif
+
+#ifndef configUSE_TASK_NOTIFICATIONS
+    #define configUSE_TASK_NOTIFICATIONS    1
+#endif
+
+#ifndef configTASK_NOTIFICATION_ARRAY_ENTRIES
+    #define configTASK_NOTIFICATION_ARRAY_ENTRIES    1
+#endif
+
+#if configTASK_NOTIFICATION_ARRAY_ENTRIES < 1
+    #error configTASK_NOTIFICATION_ARRAY_ENTRIES must be at least 1
+#endif
+
+#ifndef configUSE_POSIX_ERRNO
+    #define configUSE_POSIX_ERRNO    0
+#endif
+
+#ifndef configUSE_SB_COMPLETED_CALLBACK
+
+/* By default per-instance callbacks are not enabled for stream buffer or message buffer. */
+    #define configUSE_SB_COMPLETED_CALLBACK    0
+#endif
+
+#ifndef portTICK_TYPE_IS_ATOMIC
+    #define portTICK_TYPE_IS_ATOMIC    0
+#endif
+
+#ifndef configSUPPORT_STATIC_ALLOCATION
+    /* Defaults to 0 for backward compatibility. */
+    #define configSUPPORT_STATIC_ALLOCATION    0
+#endif
+
+#ifndef configSUPPORT_DYNAMIC_ALLOCATION
+    /* Defaults to 1 for backward compatibility. */
+    #define configSUPPORT_DYNAMIC_ALLOCATION    1
+#endif
+
+#if ( ( configUSE_STATS_FORMATTING_FUNCTIONS > 0 ) && ( configSUPPORT_DYNAMIC_ALLOCATION != 1 ) )
+    #error configUSE_STATS_FORMATTING_FUNCTIONS cannot be used without dynamic allocation, but configSUPPORT_DYNAMIC_ALLOCATION is not set to 1.
+#endif
+
+#if ( configUSE_STATS_FORMATTING_FUNCTIONS > 0 )
+    #if ( ( configUSE_TRACE_FACILITY != 1 ) && ( configGENERATE_RUN_TIME_STATS != 1 ) )
+        #error configUSE_STATS_FORMATTING_FUNCTIONS is 1 but the functions it enables are not used because neither configUSE_TRACE_FACILITY or configGENERATE_RUN_TIME_STATS are 1.  Set configUSE_STATS_FORMATTING_FUNCTIONS to 0 in FreeRTOSConfig.h.
+    #endif
+#endif
+
+#ifndef configSTACK_DEPTH_TYPE
+
+/* Defaults to uint16_t for backward compatibility, but can be overridden
+ * in FreeRTOSConfig.h if uint16_t is too restrictive. */
+    #define configSTACK_DEPTH_TYPE    uint16_t
+#endif
+
+#ifndef configRUN_TIME_COUNTER_TYPE
+
+/* Defaults to uint32_t for backward compatibility, but can be overridden in
+ * FreeRTOSConfig.h if uint32_t is too restrictive. */
+
+    #define configRUN_TIME_COUNTER_TYPE    uint32_t
+#endif
+
+#ifndef configMESSAGE_BUFFER_LENGTH_TYPE
+
+/* Defaults to size_t for backward compatibility, but can be overridden
+ * in FreeRTOSConfig.h if lengths will always be less than the number of bytes
+ * in a size_t. */
+    #define configMESSAGE_BUFFER_LENGTH_TYPE    size_t
+#endif
+
+/* Sanity check the configuration. */
+#if ( ( configSUPPORT_STATIC_ALLOCATION == 0 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 0 ) )
+    #error configSUPPORT_STATIC_ALLOCATION and configSUPPORT_DYNAMIC_ALLOCATION cannot both be 0, but can both be 1.
+#endif
+
+#if ( ( configUSE_RECURSIVE_MUTEXES == 1 ) && ( configUSE_MUTEXES != 1 ) )
+    #error configUSE_MUTEXES must be set to 1 to use recursive mutexes
+#endif
+
+#ifndef configINITIAL_TICK_COUNT
+    #define configINITIAL_TICK_COUNT    0
+#endif
+
+#if ( portTICK_TYPE_IS_ATOMIC == 0 )
+
+/* Either variables of tick type cannot be read atomically, or
+ * portTICK_TYPE_IS_ATOMIC was not set - map the critical sections used when
+ * the tick count is returned to the standard critical section macros. */
+    #define portTICK_TYPE_ENTER_CRITICAL()                      portENTER_CRITICAL()
+    #define portTICK_TYPE_EXIT_CRITICAL()                       portEXIT_CRITICAL()
+    #define portTICK_TYPE_SET_INTERRUPT_MASK_FROM_ISR()         portSET_INTERRUPT_MASK_FROM_ISR()
+    #define portTICK_TYPE_CLEAR_INTERRUPT_MASK_FROM_ISR( x )    portCLEAR_INTERRUPT_MASK_FROM_ISR( ( x ) )
+#else
+
+/* The tick type can be read atomically, so critical sections used when the
+ * tick count is returned can be defined away. */
+    #define portTICK_TYPE_ENTER_CRITICAL()
+    #define portTICK_TYPE_EXIT_CRITICAL()
+    #define portTICK_TYPE_SET_INTERRUPT_MASK_FROM_ISR()         0
+    #define portTICK_TYPE_CLEAR_INTERRUPT_MASK_FROM_ISR( x )    ( void ) ( x )
+#endif /* if ( portTICK_TYPE_IS_ATOMIC == 0 ) */
+
+/* Definitions to allow backward compatibility with FreeRTOS versions prior to
+ * V8 if desired. */
+#ifndef configENABLE_BACKWARD_COMPATIBILITY
+    #define configENABLE_BACKWARD_COMPATIBILITY    1
+#endif
+
+#ifndef configPRINTF
+
+/* configPRINTF() was not defined, so define it away to nothing.  To use
+ * configPRINTF() then define it as follows (where MyPrintFunction() is
+ * provided by the application writer):
+ *
+ * void MyPrintFunction(const char *pcFormat, ... );
+ #define configPRINTF( X )   MyPrintFunction X
+ *
+ * Then call like a standard printf() function, but placing brackets around
+ * all parameters so they are passed as a single parameter.  For example:
+ * configPRINTF( ("Value = %d", MyVariable) ); */
+    #define configPRINTF( X )
+#endif
+
+#ifndef configMAX
+
+/* The application writer has not provided their own MAX macro, so define
+ * the following generic implementation. */
+    #define configMAX( a, b )    ( ( ( a ) > ( b ) ) ? ( a ) : ( b ) )
+#endif
+
+#ifndef configMIN
+
+/* The application writer has not provided their own MIN macro, so define
+ * the following generic implementation. */
+    #define configMIN( a, b )    ( ( ( a ) < ( b ) ) ? ( a ) : ( b ) )
+#endif
+
+#if configENABLE_BACKWARD_COMPATIBILITY == 1
+    #define eTaskStateGet                 eTaskGetState
+    #define portTickType                  TickType_t
+    #define xTaskHandle                   TaskHandle_t
+    #define xQueueHandle                  QueueHandle_t
+    #define xSemaphoreHandle              SemaphoreHandle_t
+    #define xQueueSetHandle               QueueSetHandle_t
+    #define xQueueSetMemberHandle         QueueSetMemberHandle_t
+    #define xTimeOutType                  TimeOut_t
+    #define xMemoryRegion                 MemoryRegion_t
+    #define xTaskParameters               TaskParameters_t
+    #define xTaskStatusType               TaskStatus_t
+    #define xTimerHandle                  TimerHandle_t
+    #define pdTASK_HOOK_CODE              TaskHookFunction_t
+    #define portTICK_RATE_MS              portTICK_PERIOD_MS
+    #define pcTaskGetTaskName             pcTaskGetName
+    #define pcTimerGetTimerName           pcTimerGetName
+    #define pcQueueGetQueueName           pcQueueGetName
+    #define vTaskGetTaskInfo              vTaskGetInfo
+    #define xTaskGetIdleRunTimeCounter    ulTaskGetIdleRunTimeCounter
+
+/* Backward compatibility within the scheduler code only - these definitions
+ * are not really required but are included for completeness. */
+    #define tmrTIMER_CALLBACK             TimerCallbackFunction_t
+    #define pdTASK_CODE                   TaskFunction_t
+    #define xListItem                     ListItem_t
+    #define xList                         List_t
+
+/* For libraries that break the list data hiding, and access list structure
+ * members directly (which is not supposed to be done). */
+    #define pxContainer                   pvContainer
+#endif /* configENABLE_BACKWARD_COMPATIBILITY */
+
+#if ( configUSE_ALTERNATIVE_API != 0 )
+    #error The alternative API was deprecated some time ago, and was removed in FreeRTOS V9.0 0
+#endif
+
+/* Set configUSE_TASK_FPU_SUPPORT to 0 to omit floating point support even
+ * if floating point hardware is otherwise supported by the FreeRTOS port in use.
+ * This constant is not supported by all FreeRTOS ports that include floating
+ * point support. */
+#ifndef configUSE_TASK_FPU_SUPPORT
+    #define configUSE_TASK_FPU_SUPPORT    1
+#endif
+
+/* Set configENABLE_MPU to 1 to enable MPU support and 0 to disable it. This is
+ * currently used in ARMv8M ports. */
+#ifndef configENABLE_MPU
+    #define configENABLE_MPU    0
+#endif
+
+/* Set configENABLE_FPU to 1 to enable FPU support and 0 to disable it. This is
+ * currently used in ARMv8M ports. */
+#ifndef configENABLE_FPU
+    #define configENABLE_FPU    1
+#endif
+
+/* Set configENABLE_MVE to 1 to enable MVE support and 0 to disable it. This is
+ * currently used in ARMv8M ports. */
+#ifndef configENABLE_MVE
+    #define configENABLE_MVE    0
+#endif
+
+/* Set configENABLE_TRUSTZONE to 1 enable TrustZone support and 0 to disable it.
+ * This is currently used in ARMv8M ports. */
+#ifndef configENABLE_TRUSTZONE
+    #define configENABLE_TRUSTZONE    1
+#endif
+
+/* Set configRUN_FREERTOS_SECURE_ONLY to 1 to run the FreeRTOS ARMv8M port on
+ * the Secure Side only. */
+#ifndef configRUN_FREERTOS_SECURE_ONLY
+    #define configRUN_FREERTOS_SECURE_ONLY    0
+#endif
+
+#ifndef configRUN_ADDITIONAL_TESTS
+    #define configRUN_ADDITIONAL_TESTS    0
+#endif
+
+
+/* Sometimes the FreeRTOSConfig.h settings only allow a task to be created using
+ * dynamically allocated RAM, in which case when any task is deleted it is known
+ * that both the task's stack and TCB need to be freed.  Sometimes the
+ * FreeRTOSConfig.h settings only allow a task to be created using statically
+ * allocated RAM, in which case when any task is deleted it is known that neither
+ * the task's stack or TCB should be freed.  Sometimes the FreeRTOSConfig.h
+ * settings allow a task to be created using either statically or dynamically
+ * allocated RAM, in which case a member of the TCB is used to record whether the
+ * stack and/or TCB were allocated statically or dynamically, so when a task is
+ * deleted the RAM that was allocated dynamically is freed again and no attempt is
+ * made to free the RAM that was allocated statically.
+ * tskSTATIC_AND_DYNAMIC_ALLOCATION_POSSIBLE is only true if it is possible for a
+ * task to be created using either statically or dynamically allocated RAM.  Note
+ * that if portUSING_MPU_WRAPPERS is 1 then a protected task can be created with
+ * a statically allocated stack and a dynamically allocated TCB.
+ *
+ * The following table lists various combinations of portUSING_MPU_WRAPPERS,
+ * configSUPPORT_DYNAMIC_ALLOCATION and configSUPPORT_STATIC_ALLOCATION and
+ * when it is possible to have both static and dynamic allocation:
+ *  +-----+---------+--------+-----------------------------+-----------------------------------+------------------+-----------+
+ * | MPU | Dynamic | Static |     Available Functions     |       Possible Allocations        | Both Dynamic and | Need Free |
+ * |     |         |        |                             |                                   | Static Possible  |           |
+ * +-----+---------+--------+-----------------------------+-----------------------------------+------------------+-----------+
+ * | 0   | 0       | 1      | xTaskCreateStatic           | TCB - Static, Stack - Static      | No               | No        |
+ * +-----|---------|--------|-----------------------------|-----------------------------------|------------------|-----------|
+ * | 0   | 1       | 0      | xTaskCreate                 | TCB - Dynamic, Stack - Dynamic    | No               | Yes       |
+ * +-----|---------|--------|-----------------------------|-----------------------------------|------------------|-----------|
+ * | 0   | 1       | 1      | xTaskCreate,                | 1. TCB - Dynamic, Stack - Dynamic | Yes              | Yes       |
+ * |     |         |        | xTaskCreateStatic           | 2. TCB - Static, Stack - Static   |                  |           |
+ * +-----|---------|--------|-----------------------------|-----------------------------------|------------------|-----------|
+ * | 1   | 0       | 1      | xTaskCreateStatic,          | TCB - Static, Stack - Static      | No               | No        |
+ * |     |         |        | xTaskCreateRestrictedStatic |                                   |                  |           |
+ * +-----|---------|--------|-----------------------------|-----------------------------------|------------------|-----------|
+ * | 1   | 1       | 0      | xTaskCreate,                | 1. TCB - Dynamic, Stack - Dynamic | Yes              | Yes       |
+ * |     |         |        | xTaskCreateRestricted       | 2. TCB - Dynamic, Stack - Static  |                  |           |
+ * +-----|---------|--------|-----------------------------|-----------------------------------|------------------|-----------|
+ * | 1   | 1       | 1      | xTaskCreate,                | 1. TCB - Dynamic, Stack - Dynamic | Yes              | Yes       |
+ * |     |         |        | xTaskCreateStatic,          | 2. TCB - Dynamic, Stack - Static  |                  |           |
+ * |     |         |        | xTaskCreateRestricted,      | 3. TCB - Static, Stack - Static   |                  |           |
+ * |     |         |        | xTaskCreateRestrictedStatic |                                   |                  |           |
+ * +-----+---------+--------+-----------------------------+-----------------------------------+------------------+-----------+
+ */
+#define tskSTATIC_AND_DYNAMIC_ALLOCATION_POSSIBLE                                                                                     \
+    ( ( ( portUSING_MPU_WRAPPERS == 0 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) && ( configSUPPORT_STATIC_ALLOCATION == 1 ) ) || \
+      ( ( portUSING_MPU_WRAPPERS == 1 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) ) )
+
+/*
+ * In line with software engineering best practice, FreeRTOS implements a strict
+ * data hiding policy, so the real structures used by FreeRTOS to maintain the
+ * state of tasks, queues, semaphores, etc. are not accessible to the application
+ * code.  However, if the application writer wants to statically allocate such
+ * an object then the size of the object needs to be known.  Dummy structures
+ * that are guaranteed to have the same size and alignment requirements of the
+ * real objects are used for this purpose.  The dummy list and list item
+ * structures below are used for inclusion in such a dummy structure.
+ */
+struct xSTATIC_LIST_ITEM
+{
+    #if ( configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES == 1 )
+        TickType_t xDummy1;
+    #endif
+    TickType_t xDummy2;
+    void * pvDummy3[ 4 ];
+    #if ( configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES == 1 )
+        TickType_t xDummy4;
+    #endif
+};
+typedef struct xSTATIC_LIST_ITEM StaticListItem_t;
+
+#if ( configUSE_MINI_LIST_ITEM == 1 )
+    /* See the comments above the struct xSTATIC_LIST_ITEM definition. */
+    struct xSTATIC_MINI_LIST_ITEM
+    {
+        #if ( configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES == 1 )
+            TickType_t xDummy1;
+        #endif
+        TickType_t xDummy2;
+        void * pvDummy3[ 2 ];
+    };
+    typedef struct xSTATIC_MINI_LIST_ITEM StaticMiniListItem_t;
+#else /* if ( configUSE_MINI_LIST_ITEM == 1 ) */
+    typedef struct xSTATIC_LIST_ITEM      StaticMiniListItem_t;
+#endif /* if ( configUSE_MINI_LIST_ITEM == 1 ) */
+
+/* See the comments above the struct xSTATIC_LIST_ITEM definition. */
+typedef struct xSTATIC_LIST
+{
+    #if ( configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES == 1 )
+        TickType_t xDummy1;
+    #endif
+    UBaseType_t uxDummy2;
+    void * pvDummy3;
+    StaticMiniListItem_t xDummy4;
+    #if ( configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES == 1 )
+        TickType_t xDummy5;
+    #endif
+} StaticList_t;
+
+/*
+ * In line with software engineering best practice, especially when supplying a
+ * library that is likely to change in future versions, FreeRTOS implements a
+ * strict data hiding policy.  This means the Task structure used internally by
+ * FreeRTOS is not accessible to application code.  However, if the application
+ * writer wants to statically allocate the memory required to create a task then
+ * the size of the task object needs to be known.  The StaticTask_t structure
+ * below is provided for this purpose.  Its sizes and alignment requirements are
+ * guaranteed to match those of the genuine structure, no matter which
+ * architecture is being used, and no matter how the values in FreeRTOSConfig.h
+ * are set.  Its contents are somewhat obfuscated in the hope users will
+ * recognise that it would be unwise to make direct use of the structure members.
+ */
+typedef struct xSTATIC_TCB
+{
+    void * pxDummy1;
+    #if ( portUSING_MPU_WRAPPERS == 1 )
+        xMPU_SETTINGS xDummy2;
+    #endif
+    StaticListItem_t xDummy3[ 2 ];
+    UBaseType_t uxDummy5;
+    void * pxDummy6;
+    uint8_t ucDummy7[ configMAX_TASK_NAME_LEN ];
+    #if ( ( portSTACK_GROWTH > 0 ) || ( configRECORD_STACK_HIGH_ADDRESS == 1 ) )
+        void * pxDummy8;
+    #endif
+    #if ( portCRITICAL_NESTING_IN_TCB == 1 )
+        UBaseType_t uxDummy9;
+    #endif
+    #if ( configUSE_TRACE_FACILITY == 1 )
+        UBaseType_t uxDummy10[ 2 ];
+    #endif
+    #if ( configUSE_MUTEXES == 1 )
+        UBaseType_t uxDummy12[ 2 ];
+    #endif
+    #if ( configUSE_APPLICATION_TASK_TAG == 1 )
+        void * pxDummy14;
+    #endif
+    #if ( configNUM_THREAD_LOCAL_STORAGE_POINTERS > 0 )
+        void * pvDummy15[ configNUM_THREAD_LOCAL_STORAGE_POINTERS ];
+    #endif
+    #if ( configGENERATE_RUN_TIME_STATS == 1 )
+        configRUN_TIME_COUNTER_TYPE ulDummy16;
+    #endif
+    #if ( ( configUSE_NEWLIB_REENTRANT == 1 ) || ( configUSE_C_RUNTIME_TLS_SUPPORT == 1 ) )
+        configTLS_BLOCK_TYPE xDummy17;
+    #endif
+    #if ( configUSE_TASK_NOTIFICATIONS == 1 )
+        uint32_t ulDummy18[ configTASK_NOTIFICATION_ARRAY_ENTRIES ];
+        uint8_t ucDummy19[ configTASK_NOTIFICATION_ARRAY_ENTRIES ];
+    #endif
+    #if ( tskSTATIC_AND_DYNAMIC_ALLOCATION_POSSIBLE != 0 )
+        uint8_t uxDummy20;
+    #endif
+
+    #if ( INCLUDE_xTaskAbortDelay == 1 )
+        uint8_t ucDummy21;
+    #endif
+    #if ( configUSE_POSIX_ERRNO == 1 )
+        int iDummy22;
+    #endif
+} StaticTask_t;
+
+/*
+ * In line with software engineering best practice, especially when supplying a
+ * library that is likely to change in future versions, FreeRTOS implements a
+ * strict data hiding policy.  This means the Queue structure used internally by
+ * FreeRTOS is not accessible to application code.  However, if the application
+ * writer wants to statically allocate the memory required to create a queue
+ * then the size of the queue object needs to be known.  The StaticQueue_t
+ * structure below is provided for this purpose.  Its sizes and alignment
+ * requirements are guaranteed to match those of the genuine structure, no
+ * matter which architecture is being used, and no matter how the values in
+ * FreeRTOSConfig.h are set.  Its contents are somewhat obfuscated in the hope
+ * users will recognise that it would be unwise to make direct use of the
+ * structure members.
+ */
+typedef struct xSTATIC_QUEUE
+{
+    void * pvDummy1[ 3 ];
+
+    union
+    {
+        void * pvDummy2;
+        UBaseType_t uxDummy2;
+    } u;
+
+    StaticList_t xDummy3[ 2 ];
+    UBaseType_t uxDummy4[ 3 ];
+    uint8_t ucDummy5[ 2 ];
+
+    #if ( ( configSUPPORT_STATIC_ALLOCATION == 1 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) )
+        uint8_t ucDummy6;
+    #endif
+
+    #if ( configUSE_QUEUE_SETS == 1 )
+        void * pvDummy7;
+    #endif
+
+    #if ( configUSE_TRACE_FACILITY == 1 )
+        UBaseType_t uxDummy8;
+        uint8_t ucDummy9;
+    #endif
+} StaticQueue_t;
+typedef StaticQueue_t StaticSemaphore_t;
+
+/*
+ * In line with software engineering best practice, especially when supplying a
+ * library that is likely to change in future versions, FreeRTOS implements a
+ * strict data hiding policy.  This means the event group structure used
+ * internally by FreeRTOS is not accessible to application code.  However, if
+ * the application writer wants to statically allocate the memory required to
+ * create an event group then the size of the event group object needs to be
+ * know.  The StaticEventGroup_t structure below is provided for this purpose.
+ * Its sizes and alignment requirements are guaranteed to match those of the
+ * genuine structure, no matter which architecture is being used, and no matter
+ * how the values in FreeRTOSConfig.h are set.  Its contents are somewhat
+ * obfuscated in the hope users will recognise that it would be unwise to make
+ * direct use of the structure members.
+ */
+typedef struct xSTATIC_EVENT_GROUP
+{
+    TickType_t xDummy1;
+    StaticList_t xDummy2;
+
+    #if ( configUSE_TRACE_FACILITY == 1 )
+        UBaseType_t uxDummy3;
+    #endif
+
+    #if ( ( configSUPPORT_STATIC_ALLOCATION == 1 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) )
+        uint8_t ucDummy4;
+    #endif
+} StaticEventGroup_t;
+
+/*
+ * In line with software engineering best practice, especially when supplying a
+ * library that is likely to change in future versions, FreeRTOS implements a
+ * strict data hiding policy.  This means the software timer structure used
+ * internally by FreeRTOS is not accessible to application code.  However, if
+ * the application writer wants to statically allocate the memory required to
+ * create a software timer then the size of the queue object needs to be known.
+ * The StaticTimer_t structure below is provided for this purpose.  Its sizes
+ * and alignment requirements are guaranteed to match those of the genuine
+ * structure, no matter which architecture is being used, and no matter how the
+ * values in FreeRTOSConfig.h are set.  Its contents are somewhat obfuscated in
+ * the hope users will recognise that it would be unwise to make direct use of
+ * the structure members.
+ */
+typedef struct xSTATIC_TIMER
+{
+    void * pvDummy1;
+    StaticListItem_t xDummy2;
+    TickType_t xDummy3;
+    void * pvDummy5;
+    TaskFunction_t pvDummy6;
+    #if ( configUSE_TRACE_FACILITY == 1 )
+        UBaseType_t uxDummy7;
+    #endif
+    uint8_t ucDummy8;
+} StaticTimer_t;
+
+/*
+ * In line with software engineering best practice, especially when supplying a
+ * library that is likely to change in future versions, FreeRTOS implements a
+ * strict data hiding policy.  This means the stream buffer structure used
+ * internally by FreeRTOS is not accessible to application code.  However, if
+ * the application writer wants to statically allocate the memory required to
+ * create a stream buffer then the size of the stream buffer object needs to be
+ * known.  The StaticStreamBuffer_t structure below is provided for this
+ * purpose.  Its size and alignment requirements are guaranteed to match those
+ * of the genuine structure, no matter which architecture is being used, and
+ * no matter how the values in FreeRTOSConfig.h are set.  Its contents are
+ * somewhat obfuscated in the hope users will recognise that it would be unwise
+ * to make direct use of the structure members.
+ */
+typedef struct xSTATIC_STREAM_BUFFER
+{
+    size_t uxDummy1[ 4 ];
+    void * pvDummy2[ 3 ];
+    uint8_t ucDummy3;
+    #if ( configUSE_TRACE_FACILITY == 1 )
+        UBaseType_t uxDummy4;
+    #endif
+    #if ( configUSE_SB_COMPLETED_CALLBACK == 1 )
+        void * pvDummy5[ 2 ];
+    #endif
+} StaticStreamBuffer_t;
+
+/* Message buffers are built on stream buffers. */
+typedef StaticStreamBuffer_t StaticMessageBuffer_t;
+
+/* *INDENT-OFF* */
+#ifdef __cplusplus
+    }
+#endif
+/* *INDENT-ON* */
+
+#endif /* INC_FREERTOS_H */
diff --git a/include/StackMacros.h b/include/StackMacros.h
index 46707b9..b8ed92e 100644
--- a/include/StackMacros.h
+++ b/include/StackMacros.h
@@ -1,34 +1,34 @@
-/*

- * FreeRTOS Kernel <DEVELOPMENT BRANCH>

- * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.

- *

- * SPDX-License-Identifier: MIT

- *

- * 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.

- *

- * https://www.FreeRTOS.org

- * https://github.com/FreeRTOS

- *

- */

-

-

-#ifndef _MSC_VER /* Visual Studio doesn't support #warning. */

-    #warning The name of this file has changed to stack_macros.h.  Please update your code accordingly.  This source file (which has the original name) will be removed in a future release.

-#endif

-

-#include "stack_macros.h"

+/*
+ * FreeRTOS Kernel <DEVELOPMENT BRANCH>
+ * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.
+ *
+ * SPDX-License-Identifier: MIT
+ *
+ * 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.
+ *
+ * https://www.FreeRTOS.org
+ * https://github.com/FreeRTOS
+ *
+ */
+
+
+#ifndef _MSC_VER /* Visual Studio doesn't support #warning. */
+    #warning The name of this file has changed to stack_macros.h.  Please update your code accordingly.  This source file (which has the original name) will be removed in a future release.
+#endif
+
+#include "stack_macros.h"
diff --git a/include/atomic.h b/include/atomic.h
index 3a81af6..8feb652 100644
--- a/include/atomic.h
+++ b/include/atomic.h
@@ -1,419 +1,419 @@
-/*

- * FreeRTOS Kernel <DEVELOPMENT BRANCH>

- * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.

- *

- * SPDX-License-Identifier: MIT

- *

- * 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.

- *

- * https://www.FreeRTOS.org

- * https://github.com/FreeRTOS

- *

- */

-

-/**

- * @file atomic.h

- * @brief FreeRTOS atomic operation support.

- *

- * This file implements atomic functions by disabling interrupts globally.

- * Implementations with architecture specific atomic instructions can 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>

-

-/* *INDENT-OFF* */

-#ifdef __cplusplus

-    extern "C" {

-#endif

-/* *INDENT-ON* */

-

-/*

- * 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 considered as performance optimization

- * for atomic.  Thus, if portFORCE_INLINE is not provided by portmacro.h,

- * instead of resulting error, simply define it away.

- */

-#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] pulDestination  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 *pulDestination with ulExchange, if previous

- *       *pulDestination value equals ulComparand.

- */

-static portFORCE_INLINE uint32_t Atomic_CompareAndSwap_u32( uint32_t volatile * pulDestination,

-                                                            uint32_t ulExchange,

-                                                            uint32_t ulComparand )

-{

-    uint32_t ulReturnValue;

-

-    ATOMIC_ENTER_CRITICAL();

-    {

-        if( *pulDestination == ulComparand )

-        {

-            *pulDestination = ulExchange;

-            ulReturnValue = ATOMIC_COMPARE_AND_SWAP_SUCCESS;

-        }

-        else

-        {

-            ulReturnValue = ATOMIC_COMPARE_AND_SWAP_FAILURE;

-        }

-    }

-    ATOMIC_EXIT_CRITICAL();

-

-    return ulReturnValue;

-}

-/*-----------------------------------------------------------*/

-

-/**

- * Atomic swap (pointers)

- *

- * @brief Atomically sets the address pointed to by *ppvDestination to the value

- *        of *pvExchange.

- *

- * @param[in, out] ppvDestination  Pointer to memory location from where a pointer

- *                                 value is to be loaded and written back to.

- * @param[in] pvExchange           Pointer value to be written to *ppvDestination.

- *

- * @return The initial value of *ppvDestination.

- */

-static portFORCE_INLINE void * Atomic_SwapPointers_p32( void * volatile * ppvDestination,

-                                                        void * pvExchange )

-{

-    void * pReturnValue;

-

-    ATOMIC_ENTER_CRITICAL();

-    {

-        pReturnValue = *ppvDestination;

-        *ppvDestination = pvExchange;

-    }

-    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] ppvDestination  Pointer to memory location from where a pointer

- *                                 value is to be loaded and checked.

- * @param[in] pvExchange           If condition meets, write this value to memory.

- * @param[in] pvComparand          Swap condition.

- *

- * @return Unsigned integer of value 1 or 0. 1 for swapped, 0 for not swapped.

- *

- * @note This function only swaps *ppvDestination with pvExchange, if previous

- *       *ppvDestination value equals pvComparand.

- */

-static portFORCE_INLINE uint32_t Atomic_CompareAndSwapPointers_p32( void * volatile * ppvDestination,

-                                                                    void * pvExchange,

-                                                                    void * pvComparand )

-{

-    uint32_t ulReturnValue = ATOMIC_COMPARE_AND_SWAP_FAILURE;

-

-    ATOMIC_ENTER_CRITICAL();

-    {

-        if( *ppvDestination == pvComparand )

-        {

-            *ppvDestination = pvExchange;

-            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] pulAddend  Pointer to memory location from where value is to be

- *                         loaded and written back to.

- * @param[in] ulCount      Value to be added to *pulAddend.

- *

- * @return previous *pulAddend value.

- */

-static portFORCE_INLINE uint32_t Atomic_Add_u32( uint32_t volatile * pulAddend,

-                                                 uint32_t ulCount )

-{

-    uint32_t ulCurrent;

-

-    ATOMIC_ENTER_CRITICAL();

-    {

-        ulCurrent = *pulAddend;

-        *pulAddend += ulCount;

-    }

-    ATOMIC_EXIT_CRITICAL();

-

-    return ulCurrent;

-}

-/*-----------------------------------------------------------*/

-

-/**

- * Atomic subtract

- *

- * @brief Atomically subtracts count from the value of the specified pointer

- *        pointers to.

- *

- * @param[in,out] pulAddend  Pointer to memory location from where value is to be

- *                         loaded and written back to.

- * @param[in] ulCount      Value to be subtract from *pulAddend.

- *

- * @return previous *pulAddend value.

- */

-static portFORCE_INLINE uint32_t Atomic_Subtract_u32( uint32_t volatile * pulAddend,

-                                                      uint32_t ulCount )

-{

-    uint32_t ulCurrent;

-

-    ATOMIC_ENTER_CRITICAL();

-    {

-        ulCurrent = *pulAddend;

-        *pulAddend -= ulCount;

-    }

-    ATOMIC_EXIT_CRITICAL();

-

-    return ulCurrent;

-}

-/*-----------------------------------------------------------*/

-

-/**

- * Atomic increment

- *

- * @brief Atomically increments the value of the specified pointer points to.

- *

- * @param[in,out] pulAddend  Pointer to memory location from where value is to be

- *                         loaded and written back to.

- *

- * @return *pulAddend value before increment.

- */

-static portFORCE_INLINE uint32_t Atomic_Increment_u32( uint32_t volatile * pulAddend )

-{

-    uint32_t ulCurrent;

-

-    ATOMIC_ENTER_CRITICAL();

-    {

-        ulCurrent = *pulAddend;

-        *pulAddend += 1;

-    }

-    ATOMIC_EXIT_CRITICAL();

-

-    return ulCurrent;

-}

-/*-----------------------------------------------------------*/

-

-/**

- * Atomic decrement

- *

- * @brief Atomically decrements the value of the specified pointer points to

- *

- * @param[in,out] pulAddend  Pointer to memory location from where value is to be

- *                         loaded and written back to.

- *

- * @return *pulAddend value before decrement.

- */

-static portFORCE_INLINE uint32_t Atomic_Decrement_u32( uint32_t volatile * pulAddend )

-{

-    uint32_t ulCurrent;

-

-    ATOMIC_ENTER_CRITICAL();

-    {

-        ulCurrent = *pulAddend;

-        *pulAddend -= 1;

-    }

-    ATOMIC_EXIT_CRITICAL();

-

-    return ulCurrent;

-}

-

-/*----------------------------- Bitwise Logical ------------------------------*/

-

-/**

- * Atomic OR

- *

- * @brief Performs an atomic OR operation on the specified values.

- *

- * @param [in, out] pulDestination  Pointer to memory location from where value is

- *                                to be loaded and written back to.

- * @param [in] ulValue            Value to be ORed with *pulDestination.

- *

- * @return The original value of *pulDestination.

- */

-static portFORCE_INLINE uint32_t Atomic_OR_u32( uint32_t volatile * pulDestination,

-                                                uint32_t ulValue )

-{

-    uint32_t ulCurrent;

-

-    ATOMIC_ENTER_CRITICAL();

-    {

-        ulCurrent = *pulDestination;

-        *pulDestination |= ulValue;

-    }

-    ATOMIC_EXIT_CRITICAL();

-

-    return ulCurrent;

-}

-/*-----------------------------------------------------------*/

-

-/**

- * Atomic AND

- *

- * @brief Performs an atomic AND operation on the specified values.

- *

- * @param [in, out] pulDestination  Pointer to memory location from where value is

- *                                to be loaded and written back to.

- * @param [in] ulValue            Value to be ANDed with *pulDestination.

- *

- * @return The original value of *pulDestination.

- */

-static portFORCE_INLINE uint32_t Atomic_AND_u32( uint32_t volatile * pulDestination,

-                                                 uint32_t ulValue )

-{

-    uint32_t ulCurrent;

-

-    ATOMIC_ENTER_CRITICAL();

-    {

-        ulCurrent = *pulDestination;

-        *pulDestination &= ulValue;

-    }

-    ATOMIC_EXIT_CRITICAL();

-

-    return ulCurrent;

-}

-/*-----------------------------------------------------------*/

-

-/**

- * Atomic NAND

- *

- * @brief Performs an atomic NAND operation on the specified values.

- *

- * @param [in, out] pulDestination  Pointer to memory location from where value is

- *                                to be loaded and written back to.

- * @param [in] ulValue            Value to be NANDed with *pulDestination.

- *

- * @return The original value of *pulDestination.

- */

-static portFORCE_INLINE uint32_t Atomic_NAND_u32( uint32_t volatile * pulDestination,

-                                                  uint32_t ulValue )

-{

-    uint32_t ulCurrent;

-

-    ATOMIC_ENTER_CRITICAL();

-    {

-        ulCurrent = *pulDestination;

-        *pulDestination = ~( ulCurrent & ulValue );

-    }

-    ATOMIC_EXIT_CRITICAL();

-

-    return ulCurrent;

-}

-/*-----------------------------------------------------------*/

-

-/**

- * Atomic XOR

- *

- * @brief Performs an atomic XOR operation on the specified values.

- *

- * @param [in, out] pulDestination  Pointer to memory location from where value is

- *                                to be loaded and written back to.

- * @param [in] ulValue            Value to be XORed with *pulDestination.

- *

- * @return The original value of *pulDestination.

- */

-static portFORCE_INLINE uint32_t Atomic_XOR_u32( uint32_t volatile * pulDestination,

-                                                 uint32_t ulValue )

-{

-    uint32_t ulCurrent;

-

-    ATOMIC_ENTER_CRITICAL();

-    {

-        ulCurrent = *pulDestination;

-        *pulDestination ^= ulValue;

-    }

-    ATOMIC_EXIT_CRITICAL();

-

-    return ulCurrent;

-}

-

-/* *INDENT-OFF* */

-#ifdef __cplusplus

-    }

-#endif

-/* *INDENT-ON* */

-

-#endif /* ATOMIC_H */

+/*
+ * FreeRTOS Kernel <DEVELOPMENT BRANCH>
+ * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.
+ *
+ * SPDX-License-Identifier: MIT
+ *
+ * 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.
+ *
+ * https://www.FreeRTOS.org
+ * https://github.com/FreeRTOS
+ *
+ */
+
+/**
+ * @file atomic.h
+ * @brief FreeRTOS atomic operation support.
+ *
+ * This file implements atomic functions by disabling interrupts globally.
+ * Implementations with architecture specific atomic instructions can 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>
+
+/* *INDENT-OFF* */
+#ifdef __cplusplus
+    extern "C" {
+#endif
+/* *INDENT-ON* */
+
+/*
+ * 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 considered as performance optimization
+ * for atomic.  Thus, if portFORCE_INLINE is not provided by portmacro.h,
+ * instead of resulting error, simply define it away.
+ */
+#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] pulDestination  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 *pulDestination with ulExchange, if previous
+ *       *pulDestination value equals ulComparand.
+ */
+static portFORCE_INLINE uint32_t Atomic_CompareAndSwap_u32( uint32_t volatile * pulDestination,
+                                                            uint32_t ulExchange,
+                                                            uint32_t ulComparand )
+{
+    uint32_t ulReturnValue;
+
+    ATOMIC_ENTER_CRITICAL();
+    {
+        if( *pulDestination == ulComparand )
+        {
+            *pulDestination = ulExchange;
+            ulReturnValue = ATOMIC_COMPARE_AND_SWAP_SUCCESS;
+        }
+        else
+        {
+            ulReturnValue = ATOMIC_COMPARE_AND_SWAP_FAILURE;
+        }
+    }
+    ATOMIC_EXIT_CRITICAL();
+
+    return ulReturnValue;
+}
+/*-----------------------------------------------------------*/
+
+/**
+ * Atomic swap (pointers)
+ *
+ * @brief Atomically sets the address pointed to by *ppvDestination to the value
+ *        of *pvExchange.
+ *
+ * @param[in, out] ppvDestination  Pointer to memory location from where a pointer
+ *                                 value is to be loaded and written back to.
+ * @param[in] pvExchange           Pointer value to be written to *ppvDestination.
+ *
+ * @return The initial value of *ppvDestination.
+ */
+static portFORCE_INLINE void * Atomic_SwapPointers_p32( void * volatile * ppvDestination,
+                                                        void * pvExchange )
+{
+    void * pReturnValue;
+
+    ATOMIC_ENTER_CRITICAL();
+    {
+        pReturnValue = *ppvDestination;
+        *ppvDestination = pvExchange;
+    }
+    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] ppvDestination  Pointer to memory location from where a pointer
+ *                                 value is to be loaded and checked.
+ * @param[in] pvExchange           If condition meets, write this value to memory.
+ * @param[in] pvComparand          Swap condition.
+ *
+ * @return Unsigned integer of value 1 or 0. 1 for swapped, 0 for not swapped.
+ *
+ * @note This function only swaps *ppvDestination with pvExchange, if previous
+ *       *ppvDestination value equals pvComparand.
+ */
+static portFORCE_INLINE uint32_t Atomic_CompareAndSwapPointers_p32( void * volatile * ppvDestination,
+                                                                    void * pvExchange,
+                                                                    void * pvComparand )
+{
+    uint32_t ulReturnValue = ATOMIC_COMPARE_AND_SWAP_FAILURE;
+
+    ATOMIC_ENTER_CRITICAL();
+    {
+        if( *ppvDestination == pvComparand )
+        {
+            *ppvDestination = pvExchange;
+            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] pulAddend  Pointer to memory location from where value is to be
+ *                         loaded and written back to.
+ * @param[in] ulCount      Value to be added to *pulAddend.
+ *
+ * @return previous *pulAddend value.
+ */
+static portFORCE_INLINE uint32_t Atomic_Add_u32( uint32_t volatile * pulAddend,
+                                                 uint32_t ulCount )
+{
+    uint32_t ulCurrent;
+
+    ATOMIC_ENTER_CRITICAL();
+    {
+        ulCurrent = *pulAddend;
+        *pulAddend += ulCount;
+    }
+    ATOMIC_EXIT_CRITICAL();
+
+    return ulCurrent;
+}
+/*-----------------------------------------------------------*/
+
+/**
+ * Atomic subtract
+ *
+ * @brief Atomically subtracts count from the value of the specified pointer
+ *        pointers to.
+ *
+ * @param[in,out] pulAddend  Pointer to memory location from where value is to be
+ *                         loaded and written back to.
+ * @param[in] ulCount      Value to be subtract from *pulAddend.
+ *
+ * @return previous *pulAddend value.
+ */
+static portFORCE_INLINE uint32_t Atomic_Subtract_u32( uint32_t volatile * pulAddend,
+                                                      uint32_t ulCount )
+{
+    uint32_t ulCurrent;
+
+    ATOMIC_ENTER_CRITICAL();
+    {
+        ulCurrent = *pulAddend;
+        *pulAddend -= ulCount;
+    }
+    ATOMIC_EXIT_CRITICAL();
+
+    return ulCurrent;
+}
+/*-----------------------------------------------------------*/
+
+/**
+ * Atomic increment
+ *
+ * @brief Atomically increments the value of the specified pointer points to.
+ *
+ * @param[in,out] pulAddend  Pointer to memory location from where value is to be
+ *                         loaded and written back to.
+ *
+ * @return *pulAddend value before increment.
+ */
+static portFORCE_INLINE uint32_t Atomic_Increment_u32( uint32_t volatile * pulAddend )
+{
+    uint32_t ulCurrent;
+
+    ATOMIC_ENTER_CRITICAL();
+    {
+        ulCurrent = *pulAddend;
+        *pulAddend += 1;
+    }
+    ATOMIC_EXIT_CRITICAL();
+
+    return ulCurrent;
+}
+/*-----------------------------------------------------------*/
+
+/**
+ * Atomic decrement
+ *
+ * @brief Atomically decrements the value of the specified pointer points to
+ *
+ * @param[in,out] pulAddend  Pointer to memory location from where value is to be
+ *                         loaded and written back to.
+ *
+ * @return *pulAddend value before decrement.
+ */
+static portFORCE_INLINE uint32_t Atomic_Decrement_u32( uint32_t volatile * pulAddend )
+{
+    uint32_t ulCurrent;
+
+    ATOMIC_ENTER_CRITICAL();
+    {
+        ulCurrent = *pulAddend;
+        *pulAddend -= 1;
+    }
+    ATOMIC_EXIT_CRITICAL();
+
+    return ulCurrent;
+}
+
+/*----------------------------- Bitwise Logical ------------------------------*/
+
+/**
+ * Atomic OR
+ *
+ * @brief Performs an atomic OR operation on the specified values.
+ *
+ * @param [in, out] pulDestination  Pointer to memory location from where value is
+ *                                to be loaded and written back to.
+ * @param [in] ulValue            Value to be ORed with *pulDestination.
+ *
+ * @return The original value of *pulDestination.
+ */
+static portFORCE_INLINE uint32_t Atomic_OR_u32( uint32_t volatile * pulDestination,
+                                                uint32_t ulValue )
+{
+    uint32_t ulCurrent;
+
+    ATOMIC_ENTER_CRITICAL();
+    {
+        ulCurrent = *pulDestination;
+        *pulDestination |= ulValue;
+    }
+    ATOMIC_EXIT_CRITICAL();
+
+    return ulCurrent;
+}
+/*-----------------------------------------------------------*/
+
+/**
+ * Atomic AND
+ *
+ * @brief Performs an atomic AND operation on the specified values.
+ *
+ * @param [in, out] pulDestination  Pointer to memory location from where value is
+ *                                to be loaded and written back to.
+ * @param [in] ulValue            Value to be ANDed with *pulDestination.
+ *
+ * @return The original value of *pulDestination.
+ */
+static portFORCE_INLINE uint32_t Atomic_AND_u32( uint32_t volatile * pulDestination,
+                                                 uint32_t ulValue )
+{
+    uint32_t ulCurrent;
+
+    ATOMIC_ENTER_CRITICAL();
+    {
+        ulCurrent = *pulDestination;
+        *pulDestination &= ulValue;
+    }
+    ATOMIC_EXIT_CRITICAL();
+
+    return ulCurrent;
+}
+/*-----------------------------------------------------------*/
+
+/**
+ * Atomic NAND
+ *
+ * @brief Performs an atomic NAND operation on the specified values.
+ *
+ * @param [in, out] pulDestination  Pointer to memory location from where value is
+ *                                to be loaded and written back to.
+ * @param [in] ulValue            Value to be NANDed with *pulDestination.
+ *
+ * @return The original value of *pulDestination.
+ */
+static portFORCE_INLINE uint32_t Atomic_NAND_u32( uint32_t volatile * pulDestination,
+                                                  uint32_t ulValue )
+{
+    uint32_t ulCurrent;
+
+    ATOMIC_ENTER_CRITICAL();
+    {
+        ulCurrent = *pulDestination;
+        *pulDestination = ~( ulCurrent & ulValue );
+    }
+    ATOMIC_EXIT_CRITICAL();
+
+    return ulCurrent;
+}
+/*-----------------------------------------------------------*/
+
+/**
+ * Atomic XOR
+ *
+ * @brief Performs an atomic XOR operation on the specified values.
+ *
+ * @param [in, out] pulDestination  Pointer to memory location from where value is
+ *                                to be loaded and written back to.
+ * @param [in] ulValue            Value to be XORed with *pulDestination.
+ *
+ * @return The original value of *pulDestination.
+ */
+static portFORCE_INLINE uint32_t Atomic_XOR_u32( uint32_t volatile * pulDestination,
+                                                 uint32_t ulValue )
+{
+    uint32_t ulCurrent;
+
+    ATOMIC_ENTER_CRITICAL();
+    {
+        ulCurrent = *pulDestination;
+        *pulDestination ^= ulValue;
+    }
+    ATOMIC_EXIT_CRITICAL();
+
+    return ulCurrent;
+}
+
+/* *INDENT-OFF* */
+#ifdef __cplusplus
+    }
+#endif
+/* *INDENT-ON* */
+
+#endif /* ATOMIC_H */
diff --git a/include/deprecated_definitions.h b/include/deprecated_definitions.h
index 7dce7be..b046711 100644
--- a/include/deprecated_definitions.h
+++ b/include/deprecated_definitions.h
@@ -1,281 +1,281 @@
-/*

- * FreeRTOS Kernel <DEVELOPMENT BRANCH>

- * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.

- *

- * SPDX-License-Identifier: MIT

- *

- * 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.

- *

- * https://www.FreeRTOS.org

- * https://github.com/FreeRTOS

- *

- */

-

-#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 */

+/*
+ * FreeRTOS Kernel <DEVELOPMENT BRANCH>
+ * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.
+ *
+ * SPDX-License-Identifier: MIT
+ *
+ * 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.
+ *
+ * https://www.FreeRTOS.org
+ * https://github.com/FreeRTOS
+ *
+ */
+
+#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 */
diff --git a/include/list.h b/include/list.h
index 05ab221..11241b6 100644
--- a/include/list.h
+++ b/include/list.h
@@ -1,503 +1,503 @@
-/*

- * FreeRTOS Kernel <DEVELOPMENT BRANCH>

- * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.

- *

- * SPDX-License-Identifier: MIT

- *

- * 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.

- *

- * https://www.FreeRTOS.org

- * https://github.com/FreeRTOS

- *

- */

-

-/*

- * 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

- * ascending 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 LIST_H

-#define LIST_H

-

-#ifndef INC_FREERTOS_H

-    #error "FreeRTOS.h must be included before list.h"

-#endif

-

-/*

- * 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 */

-

-/* *INDENT-OFF* */

-#ifdef __cplusplus

-    extern "C" {

-#endif

-/* *INDENT-ON* */

-

-/* 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 /* if ( configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES == 0 ) */

-    /* 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 ascending 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. */

-

-#if ( configUSE_MINI_LIST_ITEM == 1 )

-    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;

-#else

-    typedef struct xLIST_ITEM      MiniListItem_t;

-#endif

-

-/*

- * 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 ascending 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;                                         \

-    }

-

-/*

- * Version of uxListRemove() that does not return a value.  Provided as a slight

- * optimisation for xTaskIncrementTick() by being inline.

- *

- * 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 listREMOVE_ITEM listREMOVE_ITEM

- * \ingroup LinkedList

- */

-#define listREMOVE_ITEM( pxItemToRemove ) \

-    {                                     \

-        /* The list item knows which list it is in.  Obtain the list from the list \

-         * item. */                                                              \

-        List_t * const pxList = ( pxItemToRemove )->pxContainer;                 \

-                                                                                 \

-        ( pxItemToRemove )->pxNext->pxPrevious = ( pxItemToRemove )->pxPrevious; \

-        ( pxItemToRemove )->pxPrevious->pxNext = ( pxItemToRemove )->pxNext;     \

-        /* Make sure the index is left pointing to a valid item. */              \

-        if( pxList->pxIndex == ( pxItemToRemove ) )                              \

-        {                                                                        \

-            pxList->pxIndex = ( pxItemToRemove )->pxPrevious;                    \

-        }                                                                        \

-                                                                                 \

-        ( pxItemToRemove )->pxContainer = NULL;                                  \

-        ( pxList->uxNumberOfItems )--;                                           \

-    }

-

-/*

- * Inline version of vListInsertEnd() to provide slight optimisation for

- * xTaskIncrementTick().

- *

- * 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 listINSERT_END listINSERT_END

- * \ingroup LinkedList

- */

-#define listINSERT_END( pxList, pxNewListItem )           \

-    {                                                     \

-        ListItem_t * const pxIndex = ( pxList )->pxIndex; \

-                                                          \

-        /* Only effective when configASSERT() is also defined, these tests may catch \

-         * the list data structures being overwritten in memory.  They will not catch \

-         * data errors caused by incorrect configuration or use of FreeRTOS. */ \

-        listTEST_LIST_INTEGRITY( ( pxList ) );                                  \

-        listTEST_LIST_ITEM_INTEGRITY( ( pxNewListItem ) );                      \

-                                                                                \

-        /* Insert a new list item into ( pxList ), but rather than sort the list, \

-         * makes the new list item the last item to be removed by a call to \

-         * listGET_OWNER_OF_NEXT_ENTRY(). */                 \

-        ( pxNewListItem )->pxNext = pxIndex;                 \

-        ( pxNewListItem )->pxPrevious = pxIndex->pxPrevious; \

-                                                             \

-        pxIndex->pxPrevious->pxNext = ( pxNewListItem );     \

-        pxIndex->pxPrevious = ( pxNewListItem );             \

-                                                             \

-        /* Remember which list the item is in. */            \

-        ( pxNewListItem )->pxContainer = ( pxList );         \

-                                                             \

-        ( ( pxList )->uxNumberOfItems )++;                   \

-    }

-

-/*

- * 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 (ascending 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;

-

-/* *INDENT-OFF* */

-#ifdef __cplusplus

-    }

-#endif

-/* *INDENT-ON* */

-

-#endif /* ifndef LIST_H */

+/*
+ * FreeRTOS Kernel <DEVELOPMENT BRANCH>
+ * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.
+ *
+ * SPDX-License-Identifier: MIT
+ *
+ * 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.
+ *
+ * https://www.FreeRTOS.org
+ * https://github.com/FreeRTOS
+ *
+ */
+
+/*
+ * 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
+ * ascending 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 LIST_H
+#define LIST_H
+
+#ifndef INC_FREERTOS_H
+    #error "FreeRTOS.h must be included before list.h"
+#endif
+
+/*
+ * 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 */
+
+/* *INDENT-OFF* */
+#ifdef __cplusplus
+    extern "C" {
+#endif
+/* *INDENT-ON* */
+
+/* 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 /* if ( configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES == 0 ) */
+    /* 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 ascending 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. */
+
+#if ( configUSE_MINI_LIST_ITEM == 1 )
+    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;
+#else
+    typedef struct xLIST_ITEM      MiniListItem_t;
+#endif
+
+/*
+ * 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 ascending 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;                                         \
+    }
+
+/*
+ * Version of uxListRemove() that does not return a value.  Provided as a slight
+ * optimisation for xTaskIncrementTick() by being inline.
+ *
+ * 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 listREMOVE_ITEM listREMOVE_ITEM
+ * \ingroup LinkedList
+ */
+#define listREMOVE_ITEM( pxItemToRemove ) \
+    {                                     \
+        /* The list item knows which list it is in.  Obtain the list from the list \
+         * item. */                                                              \
+        List_t * const pxList = ( pxItemToRemove )->pxContainer;                 \
+                                                                                 \
+        ( pxItemToRemove )->pxNext->pxPrevious = ( pxItemToRemove )->pxPrevious; \
+        ( pxItemToRemove )->pxPrevious->pxNext = ( pxItemToRemove )->pxNext;     \
+        /* Make sure the index is left pointing to a valid item. */              \
+        if( pxList->pxIndex == ( pxItemToRemove ) )                              \
+        {                                                                        \
+            pxList->pxIndex = ( pxItemToRemove )->pxPrevious;                    \
+        }                                                                        \
+                                                                                 \
+        ( pxItemToRemove )->pxContainer = NULL;                                  \
+        ( pxList->uxNumberOfItems )--;                                           \
+    }
+
+/*
+ * Inline version of vListInsertEnd() to provide slight optimisation for
+ * xTaskIncrementTick().
+ *
+ * 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 listINSERT_END listINSERT_END
+ * \ingroup LinkedList
+ */
+#define listINSERT_END( pxList, pxNewListItem )           \
+    {                                                     \
+        ListItem_t * const pxIndex = ( pxList )->pxIndex; \
+                                                          \
+        /* Only effective when configASSERT() is also defined, these tests may catch \
+         * the list data structures being overwritten in memory.  They will not catch \
+         * data errors caused by incorrect configuration or use of FreeRTOS. */ \
+        listTEST_LIST_INTEGRITY( ( pxList ) );                                  \
+        listTEST_LIST_ITEM_INTEGRITY( ( pxNewListItem ) );                      \
+                                                                                \
+        /* Insert a new list item into ( pxList ), but rather than sort the list, \
+         * makes the new list item the last item to be removed by a call to \
+         * listGET_OWNER_OF_NEXT_ENTRY(). */                 \
+        ( pxNewListItem )->pxNext = pxIndex;                 \
+        ( pxNewListItem )->pxPrevious = pxIndex->pxPrevious; \
+                                                             \
+        pxIndex->pxPrevious->pxNext = ( pxNewListItem );     \
+        pxIndex->pxPrevious = ( pxNewListItem );             \
+                                                             \
+        /* Remember which list the item is in. */            \
+        ( pxNewListItem )->pxContainer = ( pxList );         \
+                                                             \
+        ( ( pxList )->uxNumberOfItems )++;                   \
+    }
+
+/*
+ * 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 (ascending 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;
+
+/* *INDENT-OFF* */
+#ifdef __cplusplus
+    }
+#endif
+/* *INDENT-ON* */
+
+#endif /* ifndef LIST_H */
diff --git a/include/message_buffer.h b/include/message_buffer.h
index 32e0514..b56dd35 100644
--- a/include/message_buffer.h
+++ b/include/message_buffer.h
@@ -1,856 +1,856 @@
-/*

- * FreeRTOS Kernel <DEVELOPMENT BRANCH>

- * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.

- *

- * SPDX-License-Identifier: MIT

- *

- * 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.

- *

- * https://www.FreeRTOS.org

- * https://github.com/FreeRTOS

- *

- */

-

-

-/*

- * 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"

-

-/* *INDENT-OFF* */

-#if defined( __cplusplus )

-    extern "C" {

-#endif

-/* *INDENT-ON* */

-

-/**

- * 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. Message buffer is essentially built as a stream buffer hence its handle

- * is also set to same type as a stream buffer handle.

- */

-typedef StreamBufferHandle_t MessageBufferHandle_t;

-

-/*-----------------------------------------------------------*/

-

-/**

- * message_buffer.h

- *

- * @code{c}

- * MessageBufferHandle_t xMessageBufferCreate( size_t xBufferSizeBytes );

- * @endcode

- *

- * 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.

- *

- * @param pxSendCompletedCallback Callback invoked when a send operation to the

- * message buffer is complete. If the parameter is NULL or xMessageBufferCreate()

- * is called without the parameter, then it will use the default implementation

- * provided by sbSEND_COMPLETED macro. To enable the callback,

- * configUSE_SB_COMPLETED_CALLBACK must be set to 1 in FreeRTOSConfig.h.

- *

- * @param pxReceiveCompletedCallback Callback invoked when a receive operation from

- * the message buffer is complete. If the parameter is NULL or xMessageBufferCreate()

- * is called without the parameter, it will use the default implementation provided

- * by sbRECEIVE_COMPLETED macro. To enable the callback,

- * configUSE_SB_COMPLETED_CALLBACK must be set to 1 in FreeRTOSConfig.h.

- *

- * @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 length 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

- * \defgroup xMessageBufferCreate xMessageBufferCreate

- * \ingroup MessageBufferManagement

- */

-#define xMessageBufferCreate( xBufferSizeBytes ) \

-    xStreamBufferGenericCreate( ( xBufferSizeBytes ), ( size_t ) 0, pdTRUE, NULL, NULL )

-

-#if ( configUSE_SB_COMPLETED_CALLBACK == 1 )

-    #define xMessageBufferCreateWithCallback( xBufferSizeBytes, pxSendCompletedCallback, pxReceiveCompletedCallback ) \

-    xStreamBufferGenericCreate( ( xBufferSizeBytes ), ( size_t ) 0, pdTRUE, ( pxSendCompletedCallback ), ( pxReceiveCompletedCallback ) )

-#endif

-

-/**

- * message_buffer.h

- *

- * @code{c}

- * MessageBufferHandle_t xMessageBufferCreateStatic( size_t xBufferSizeBytes,

- *                                                uint8_t *pucMessageBufferStorageArea,

- *                                                StaticMessageBuffer_t *pxStaticMessageBuffer );

- * @endcode

- * 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 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.

- *

- * @param pxSendCompletedCallback Callback invoked when a new message is sent to the message buffer.

- * If the parameter is NULL or xMessageBufferCreate() is called without the parameter, then it will use the default

- * implementation provided by sbSEND_COMPLETED macro. To enable the callback,

- * configUSE_SB_COMPLETED_CALLBACK must be set to 1 in FreeRTOSConfig.h.

- *

- * @param pxReceiveCompletedCallback Callback invoked when a message is read from a

- * message buffer. If the parameter is NULL or xMessageBufferCreate() is called without the parameter, it will

- * use the default implementation provided by sbRECEIVE_COMPLETED macro. To enable the callback,

- * configUSE_SB_COMPLETED_CALLBACK must be set to 1 in FreeRTOSConfig.h.

- *

- * @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( ucStorageBuffer ),

- *                                               ucStorageBuffer,

- *                                               &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

- * \defgroup xMessageBufferCreateStatic xMessageBufferCreateStatic

- * \ingroup MessageBufferManagement

- */

-#define xMessageBufferCreateStatic( xBufferSizeBytes, pucMessageBufferStorageArea, pxStaticMessageBuffer ) \

-    xStreamBufferGenericCreateStatic( ( xBufferSizeBytes ), 0, pdTRUE, ( pucMessageBufferStorageArea ), ( pxStaticMessageBuffer ), NULL, NULL )

-

-#if ( configUSE_SB_COMPLETED_CALLBACK == 1 )

-    #define xMessageBufferCreateStaticWithCallback( xBufferSizeBytes, pucMessageBufferStorageArea, pxStaticMessageBuffer, pxSendCompletedCallback, pxReceiveCompletedCallback ) \

-    xStreamBufferGenericCreateStatic( ( xBufferSizeBytes ), 0, pdTRUE, ( pucMessageBufferStorageArea ), ( pxStaticMessageBuffer ), ( pxSendCompletedCallback ), ( pxReceiveCompletedCallback ) )

-#endif

-

-/**

- * message_buffer.h

- *

- * @code{c}

- * size_t xMessageBufferSend( MessageBufferHandle_t xMessageBuffer,

- *                         const void *pvTxData,

- *                         size_t xDataLengthBytes,

- *                         TickType_t xTicksToWait );

- * @endcode

- *

- * 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

- * \defgroup xMessageBufferSend xMessageBufferSend

- * \ingroup MessageBufferManagement

- */

-#define xMessageBufferSend( xMessageBuffer, pvTxData, xDataLengthBytes, xTicksToWait ) \

-    xStreamBufferSend( ( xMessageBuffer ), ( pvTxData ), ( xDataLengthBytes ), ( xTicksToWait ) )

-

-/**

- * message_buffer.h

- *

- * @code{c}

- * size_t xMessageBufferSendFromISR( MessageBufferHandle_t xMessageBuffer,

- *                                const void *pvTxData,

- *                                size_t xDataLengthBytes,

- *                                BaseType_t *pxHigherPriorityTaskWoken );

- * @endcode

- *

- * 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

- * \defgroup xMessageBufferSendFromISR xMessageBufferSendFromISR

- * \ingroup MessageBufferManagement

- */

-#define xMessageBufferSendFromISR( xMessageBuffer, pvTxData, xDataLengthBytes, pxHigherPriorityTaskWoken ) \

-    xStreamBufferSendFromISR( ( xMessageBuffer ), ( pvTxData ), ( xDataLengthBytes ), ( pxHigherPriorityTaskWoken ) )

-

-/**

- * message_buffer.h

- *

- * @code{c}

- * size_t xMessageBufferReceive( MessageBufferHandle_t xMessageBuffer,

- *                            void *pvRxData,

- *                            size_t xBufferLengthBytes,

- *                            TickType_t xTicksToWait );

- * @endcode

- *

- * 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

- * \defgroup xMessageBufferReceive xMessageBufferReceive

- * \ingroup MessageBufferManagement

- */

-#define xMessageBufferReceive( xMessageBuffer, pvRxData, xBufferLengthBytes, xTicksToWait ) \

-    xStreamBufferReceive( ( xMessageBuffer ), ( pvRxData ), ( xBufferLengthBytes ), ( xTicksToWait ) )

-

-

-/**

- * message_buffer.h

- *

- * @code{c}

- * size_t xMessageBufferReceiveFromISR( MessageBufferHandle_t xMessageBuffer,

- *                                   void *pvRxData,

- *                                   size_t xBufferLengthBytes,

- *                                   BaseType_t *pxHigherPriorityTaskWoken );

- * @endcode

- *

- * 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

- * \defgroup xMessageBufferReceiveFromISR xMessageBufferReceiveFromISR

- * \ingroup MessageBufferManagement

- */

-#define xMessageBufferReceiveFromISR( xMessageBuffer, pvRxData, xBufferLengthBytes, pxHigherPriorityTaskWoken ) \

-    xStreamBufferReceiveFromISR( ( xMessageBuffer ), ( pvRxData ), ( xBufferLengthBytes ), ( pxHigherPriorityTaskWoken ) )

-

-/**

- * message_buffer.h

- *

- * @code{c}

- * void vMessageBufferDelete( MessageBufferHandle_t xMessageBuffer );

- * @endcode

- *

- * 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( xMessageBuffer )

-

-/**

- * message_buffer.h

- * @code{c}

- * BaseType_t xMessageBufferIsFull( MessageBufferHandle_t xMessageBuffer );

- * @endcode

- *

- * 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( xMessageBuffer )

-

-/**

- * message_buffer.h

- * @code{c}

- * BaseType_t xMessageBufferIsEmpty( MessageBufferHandle_t xMessageBuffer );

- * @endcode

- *

- * 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( xMessageBuffer )

-

-/**

- * message_buffer.h

- * @code{c}

- * BaseType_t xMessageBufferReset( MessageBufferHandle_t xMessageBuffer );

- * @endcode

- *

- * 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.

- *

- * \defgroup xMessageBufferReset xMessageBufferReset

- * \ingroup MessageBufferManagement

- */

-#define xMessageBufferReset( xMessageBuffer ) \

-    xStreamBufferReset( xMessageBuffer )

-

-

-/**

- * message_buffer.h

- * @code{c}

- * size_t xMessageBufferSpaceAvailable( MessageBufferHandle_t xMessageBuffer );

- * @endcode

- * 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.

- *

- * \defgroup xMessageBufferSpaceAvailable xMessageBufferSpaceAvailable

- * \ingroup MessageBufferManagement

- */

-#define xMessageBufferSpaceAvailable( xMessageBuffer ) \

-    xStreamBufferSpacesAvailable( xMessageBuffer )

-#define xMessageBufferSpacesAvailable( xMessageBuffer ) \

-    xStreamBufferSpacesAvailable( xMessageBuffer ) /* Corrects typo in original macro name. */

-

-/**

- * message_buffer.h

- * @code{c}

- * size_t xMessageBufferNextLengthBytes( MessageBufferHandle_t xMessageBuffer );

- * @endcode

- * 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.

- *

- * \defgroup xMessageBufferNextLengthBytes xMessageBufferNextLengthBytes

- * \ingroup MessageBufferManagement

- */

-#define xMessageBufferNextLengthBytes( xMessageBuffer ) \

-    xStreamBufferNextMessageLengthBytes( xMessageBuffer ) PRIVILEGED_FUNCTION;

-

-/**

- * message_buffer.h

- *

- * @code{c}

- * BaseType_t xMessageBufferSendCompletedFromISR( MessageBufferHandle_t xMessageBuffer, BaseType_t *pxHigherPriorityTaskWoken );

- * @endcode

- *

- * 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.

- *

- * \defgroup xMessageBufferSendCompletedFromISR xMessageBufferSendCompletedFromISR

- * \ingroup StreamBufferManagement

- */

-#define xMessageBufferSendCompletedFromISR( xMessageBuffer, pxHigherPriorityTaskWoken ) \

-    xStreamBufferSendCompletedFromISR( ( xMessageBuffer ), ( pxHigherPriorityTaskWoken ) )

-

-/**

- * message_buffer.h

- *

- * @code{c}

- * BaseType_t xMessageBufferReceiveCompletedFromISR( MessageBufferHandle_t xMessageBuffer, BaseType_t *pxHigherPriorityTaskWoken );

- * @endcode

- *

- * 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.

- *

- * \defgroup xMessageBufferReceiveCompletedFromISR xMessageBufferReceiveCompletedFromISR

- * \ingroup StreamBufferManagement

- */

-#define xMessageBufferReceiveCompletedFromISR( xMessageBuffer, pxHigherPriorityTaskWoken ) \

-    xStreamBufferReceiveCompletedFromISR( ( xMessageBuffer ), ( pxHigherPriorityTaskWoken ) )

-

-/* *INDENT-OFF* */

-#if defined( __cplusplus )

-    } /* extern "C" */

-#endif

-/* *INDENT-ON* */

-

-#endif /* !defined( FREERTOS_MESSAGE_BUFFER_H ) */

+/*
+ * FreeRTOS Kernel <DEVELOPMENT BRANCH>
+ * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.
+ *
+ * SPDX-License-Identifier: MIT
+ *
+ * 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.
+ *
+ * https://www.FreeRTOS.org
+ * https://github.com/FreeRTOS
+ *
+ */
+
+
+/*
+ * 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"
+
+/* *INDENT-OFF* */
+#if defined( __cplusplus )
+    extern "C" {
+#endif
+/* *INDENT-ON* */
+
+/**
+ * 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. Message buffer is essentially built as a stream buffer hence its handle
+ * is also set to same type as a stream buffer handle.
+ */
+typedef StreamBufferHandle_t MessageBufferHandle_t;
+
+/*-----------------------------------------------------------*/
+
+/**
+ * message_buffer.h
+ *
+ * @code{c}
+ * MessageBufferHandle_t xMessageBufferCreate( size_t xBufferSizeBytes );
+ * @endcode
+ *
+ * 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.
+ *
+ * @param pxSendCompletedCallback Callback invoked when a send operation to the
+ * message buffer is complete. If the parameter is NULL or xMessageBufferCreate()
+ * is called without the parameter, then it will use the default implementation
+ * provided by sbSEND_COMPLETED macro. To enable the callback,
+ * configUSE_SB_COMPLETED_CALLBACK must be set to 1 in FreeRTOSConfig.h.
+ *
+ * @param pxReceiveCompletedCallback Callback invoked when a receive operation from
+ * the message buffer is complete. If the parameter is NULL or xMessageBufferCreate()
+ * is called without the parameter, it will use the default implementation provided
+ * by sbRECEIVE_COMPLETED macro. To enable the callback,
+ * configUSE_SB_COMPLETED_CALLBACK must be set to 1 in FreeRTOSConfig.h.
+ *
+ * @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 length 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
+ * \defgroup xMessageBufferCreate xMessageBufferCreate
+ * \ingroup MessageBufferManagement
+ */
+#define xMessageBufferCreate( xBufferSizeBytes ) \
+    xStreamBufferGenericCreate( ( xBufferSizeBytes ), ( size_t ) 0, pdTRUE, NULL, NULL )
+
+#if ( configUSE_SB_COMPLETED_CALLBACK == 1 )
+    #define xMessageBufferCreateWithCallback( xBufferSizeBytes, pxSendCompletedCallback, pxReceiveCompletedCallback ) \
+    xStreamBufferGenericCreate( ( xBufferSizeBytes ), ( size_t ) 0, pdTRUE, ( pxSendCompletedCallback ), ( pxReceiveCompletedCallback ) )
+#endif
+
+/**
+ * message_buffer.h
+ *
+ * @code{c}
+ * MessageBufferHandle_t xMessageBufferCreateStatic( size_t xBufferSizeBytes,
+ *                                                uint8_t *pucMessageBufferStorageArea,
+ *                                                StaticMessageBuffer_t *pxStaticMessageBuffer );
+ * @endcode
+ * 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 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.
+ *
+ * @param pxSendCompletedCallback Callback invoked when a new message is sent to the message buffer.
+ * If the parameter is NULL or xMessageBufferCreate() is called without the parameter, then it will use the default
+ * implementation provided by sbSEND_COMPLETED macro. To enable the callback,
+ * configUSE_SB_COMPLETED_CALLBACK must be set to 1 in FreeRTOSConfig.h.
+ *
+ * @param pxReceiveCompletedCallback Callback invoked when a message is read from a
+ * message buffer. If the parameter is NULL or xMessageBufferCreate() is called without the parameter, it will
+ * use the default implementation provided by sbRECEIVE_COMPLETED macro. To enable the callback,
+ * configUSE_SB_COMPLETED_CALLBACK must be set to 1 in FreeRTOSConfig.h.
+ *
+ * @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( ucStorageBuffer ),
+ *                                               ucStorageBuffer,
+ *                                               &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
+ * \defgroup xMessageBufferCreateStatic xMessageBufferCreateStatic
+ * \ingroup MessageBufferManagement
+ */
+#define xMessageBufferCreateStatic( xBufferSizeBytes, pucMessageBufferStorageArea, pxStaticMessageBuffer ) \
+    xStreamBufferGenericCreateStatic( ( xBufferSizeBytes ), 0, pdTRUE, ( pucMessageBufferStorageArea ), ( pxStaticMessageBuffer ), NULL, NULL )
+
+#if ( configUSE_SB_COMPLETED_CALLBACK == 1 )
+    #define xMessageBufferCreateStaticWithCallback( xBufferSizeBytes, pucMessageBufferStorageArea, pxStaticMessageBuffer, pxSendCompletedCallback, pxReceiveCompletedCallback ) \
+    xStreamBufferGenericCreateStatic( ( xBufferSizeBytes ), 0, pdTRUE, ( pucMessageBufferStorageArea ), ( pxStaticMessageBuffer ), ( pxSendCompletedCallback ), ( pxReceiveCompletedCallback ) )
+#endif
+
+/**
+ * message_buffer.h
+ *
+ * @code{c}
+ * size_t xMessageBufferSend( MessageBufferHandle_t xMessageBuffer,
+ *                         const void *pvTxData,
+ *                         size_t xDataLengthBytes,
+ *                         TickType_t xTicksToWait );
+ * @endcode
+ *
+ * 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
+ * \defgroup xMessageBufferSend xMessageBufferSend
+ * \ingroup MessageBufferManagement
+ */
+#define xMessageBufferSend( xMessageBuffer, pvTxData, xDataLengthBytes, xTicksToWait ) \
+    xStreamBufferSend( ( xMessageBuffer ), ( pvTxData ), ( xDataLengthBytes ), ( xTicksToWait ) )
+
+/**
+ * message_buffer.h
+ *
+ * @code{c}
+ * size_t xMessageBufferSendFromISR( MessageBufferHandle_t xMessageBuffer,
+ *                                const void *pvTxData,
+ *                                size_t xDataLengthBytes,
+ *                                BaseType_t *pxHigherPriorityTaskWoken );
+ * @endcode
+ *
+ * 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
+ * \defgroup xMessageBufferSendFromISR xMessageBufferSendFromISR
+ * \ingroup MessageBufferManagement
+ */
+#define xMessageBufferSendFromISR( xMessageBuffer, pvTxData, xDataLengthBytes, pxHigherPriorityTaskWoken ) \
+    xStreamBufferSendFromISR( ( xMessageBuffer ), ( pvTxData ), ( xDataLengthBytes ), ( pxHigherPriorityTaskWoken ) )
+
+/**
+ * message_buffer.h
+ *
+ * @code{c}
+ * size_t xMessageBufferReceive( MessageBufferHandle_t xMessageBuffer,
+ *                            void *pvRxData,
+ *                            size_t xBufferLengthBytes,
+ *                            TickType_t xTicksToWait );
+ * @endcode
+ *
+ * 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
+ * \defgroup xMessageBufferReceive xMessageBufferReceive
+ * \ingroup MessageBufferManagement
+ */
+#define xMessageBufferReceive( xMessageBuffer, pvRxData, xBufferLengthBytes, xTicksToWait ) \
+    xStreamBufferReceive( ( xMessageBuffer ), ( pvRxData ), ( xBufferLengthBytes ), ( xTicksToWait ) )
+
+
+/**
+ * message_buffer.h
+ *
+ * @code{c}
+ * size_t xMessageBufferReceiveFromISR( MessageBufferHandle_t xMessageBuffer,
+ *                                   void *pvRxData,
+ *                                   size_t xBufferLengthBytes,
+ *                                   BaseType_t *pxHigherPriorityTaskWoken );
+ * @endcode
+ *
+ * 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
+ * \defgroup xMessageBufferReceiveFromISR xMessageBufferReceiveFromISR
+ * \ingroup MessageBufferManagement
+ */
+#define xMessageBufferReceiveFromISR( xMessageBuffer, pvRxData, xBufferLengthBytes, pxHigherPriorityTaskWoken ) \
+    xStreamBufferReceiveFromISR( ( xMessageBuffer ), ( pvRxData ), ( xBufferLengthBytes ), ( pxHigherPriorityTaskWoken ) )
+
+/**
+ * message_buffer.h
+ *
+ * @code{c}
+ * void vMessageBufferDelete( MessageBufferHandle_t xMessageBuffer );
+ * @endcode
+ *
+ * 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( xMessageBuffer )
+
+/**
+ * message_buffer.h
+ * @code{c}
+ * BaseType_t xMessageBufferIsFull( MessageBufferHandle_t xMessageBuffer );
+ * @endcode
+ *
+ * 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( xMessageBuffer )
+
+/**
+ * message_buffer.h
+ * @code{c}
+ * BaseType_t xMessageBufferIsEmpty( MessageBufferHandle_t xMessageBuffer );
+ * @endcode
+ *
+ * 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( xMessageBuffer )
+
+/**
+ * message_buffer.h
+ * @code{c}
+ * BaseType_t xMessageBufferReset( MessageBufferHandle_t xMessageBuffer );
+ * @endcode
+ *
+ * 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.
+ *
+ * \defgroup xMessageBufferReset xMessageBufferReset
+ * \ingroup MessageBufferManagement
+ */
+#define xMessageBufferReset( xMessageBuffer ) \
+    xStreamBufferReset( xMessageBuffer )
+
+
+/**
+ * message_buffer.h
+ * @code{c}
+ * size_t xMessageBufferSpaceAvailable( MessageBufferHandle_t xMessageBuffer );
+ * @endcode
+ * 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.
+ *
+ * \defgroup xMessageBufferSpaceAvailable xMessageBufferSpaceAvailable
+ * \ingroup MessageBufferManagement
+ */
+#define xMessageBufferSpaceAvailable( xMessageBuffer ) \
+    xStreamBufferSpacesAvailable( xMessageBuffer )
+#define xMessageBufferSpacesAvailable( xMessageBuffer ) \
+    xStreamBufferSpacesAvailable( xMessageBuffer ) /* Corrects typo in original macro name. */
+
+/**
+ * message_buffer.h
+ * @code{c}
+ * size_t xMessageBufferNextLengthBytes( MessageBufferHandle_t xMessageBuffer );
+ * @endcode
+ * 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.
+ *
+ * \defgroup xMessageBufferNextLengthBytes xMessageBufferNextLengthBytes
+ * \ingroup MessageBufferManagement
+ */
+#define xMessageBufferNextLengthBytes( xMessageBuffer ) \
+    xStreamBufferNextMessageLengthBytes( xMessageBuffer ) PRIVILEGED_FUNCTION;
+
+/**
+ * message_buffer.h
+ *
+ * @code{c}
+ * BaseType_t xMessageBufferSendCompletedFromISR( MessageBufferHandle_t xMessageBuffer, BaseType_t *pxHigherPriorityTaskWoken );
+ * @endcode
+ *
+ * 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.
+ *
+ * \defgroup xMessageBufferSendCompletedFromISR xMessageBufferSendCompletedFromISR
+ * \ingroup StreamBufferManagement
+ */
+#define xMessageBufferSendCompletedFromISR( xMessageBuffer, pxHigherPriorityTaskWoken ) \
+    xStreamBufferSendCompletedFromISR( ( xMessageBuffer ), ( pxHigherPriorityTaskWoken ) )
+
+/**
+ * message_buffer.h
+ *
+ * @code{c}
+ * BaseType_t xMessageBufferReceiveCompletedFromISR( MessageBufferHandle_t xMessageBuffer, BaseType_t *pxHigherPriorityTaskWoken );
+ * @endcode
+ *
+ * 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.
+ *
+ * \defgroup xMessageBufferReceiveCompletedFromISR xMessageBufferReceiveCompletedFromISR
+ * \ingroup StreamBufferManagement
+ */
+#define xMessageBufferReceiveCompletedFromISR( xMessageBuffer, pxHigherPriorityTaskWoken ) \
+    xStreamBufferReceiveCompletedFromISR( ( xMessageBuffer ), ( pxHigherPriorityTaskWoken ) )
+
+/* *INDENT-OFF* */
+#if defined( __cplusplus )
+    } /* extern "C" */
+#endif
+/* *INDENT-ON* */
+
+#endif /* !defined( FREERTOS_MESSAGE_BUFFER_H ) */
diff --git a/include/mpu_prototypes.h b/include/mpu_prototypes.h
index 1893db8..08fa051 100644
--- a/include/mpu_prototypes.h
+++ b/include/mpu_prototypes.h
@@ -1,264 +1,264 @@
-/*

- * FreeRTOS Kernel <DEVELOPMENT BRANCH>

- * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.

- *

- * SPDX-License-Identifier: MIT

- *

- * 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.

- *

- * https://www.FreeRTOS.org

- * https://github.com/FreeRTOS

- *

- */

-

-/*

- * When the MPU is used the standard (non MPU) API functions are mapped to

- * equivalents that start "MPU_", the prototypes for which are defined in this

- * header files.  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.

- */

-

-

-#ifndef MPU_PROTOTYPES_H

-#define MPU_PROTOTYPES_H

-

-/* MPU versions of task.h API functions. */

-BaseType_t MPU_xTaskCreate( TaskFunction_t pxTaskCode,

-                            const char * const pcName,

-                            const uint16_t usStackDepth,

-                            void * const pvParameters,

-                            UBaseType_t uxPriority,

-                            TaskHandle_t * const pxCreatedTask ) FREERTOS_SYSTEM_CALL;

-TaskHandle_t MPU_xTaskCreateStatic( TaskFunction_t pxTaskCode,

-                                    const char * const pcName,

-                                    const uint32_t ulStackDepth,

-                                    void * const pvParameters,

-                                    UBaseType_t uxPriority,

-                                    StackType_t * const puxStackBuffer,

-                                    StaticTask_t * const pxTaskBuffer ) FREERTOS_SYSTEM_CALL;

-void MPU_vTaskDelete( TaskHandle_t xTaskToDelete ) FREERTOS_SYSTEM_CALL;

-void MPU_vTaskDelay( const TickType_t xTicksToDelay ) FREERTOS_SYSTEM_CALL;

-BaseType_t MPU_xTaskDelayUntil( TickType_t * const pxPreviousWakeTime,

-                                const TickType_t xTimeIncrement ) FREERTOS_SYSTEM_CALL;

-BaseType_t MPU_xTaskAbortDelay( TaskHandle_t xTask ) FREERTOS_SYSTEM_CALL;

-UBaseType_t MPU_uxTaskPriorityGet( const TaskHandle_t xTask ) FREERTOS_SYSTEM_CALL;

-eTaskState MPU_eTaskGetState( TaskHandle_t xTask ) FREERTOS_SYSTEM_CALL;

-void MPU_vTaskGetInfo( TaskHandle_t xTask,

-                       TaskStatus_t * pxTaskStatus,

-                       BaseType_t xGetFreeStackSpace,

-                       eTaskState eState ) FREERTOS_SYSTEM_CALL;

-void MPU_vTaskPrioritySet( TaskHandle_t xTask,

-                           UBaseType_t uxNewPriority ) FREERTOS_SYSTEM_CALL;

-void MPU_vTaskSuspend( TaskHandle_t xTaskToSuspend ) FREERTOS_SYSTEM_CALL;

-void MPU_vTaskResume( TaskHandle_t xTaskToResume ) FREERTOS_SYSTEM_CALL;

-void MPU_vTaskStartScheduler( void ) FREERTOS_SYSTEM_CALL;

-void MPU_vTaskSuspendAll( void ) FREERTOS_SYSTEM_CALL;

-BaseType_t MPU_xTaskResumeAll( void ) FREERTOS_SYSTEM_CALL;

-TickType_t MPU_xTaskGetTickCount( void ) FREERTOS_SYSTEM_CALL;

-UBaseType_t MPU_uxTaskGetNumberOfTasks( void ) FREERTOS_SYSTEM_CALL;

-char * MPU_pcTaskGetName( TaskHandle_t xTaskToQuery ) FREERTOS_SYSTEM_CALL;

-TaskHandle_t MPU_xTaskGetHandle( const char * pcNameToQuery ) FREERTOS_SYSTEM_CALL;

-UBaseType_t MPU_uxTaskGetStackHighWaterMark( TaskHandle_t xTask ) FREERTOS_SYSTEM_CALL;

-configSTACK_DEPTH_TYPE MPU_uxTaskGetStackHighWaterMark2( TaskHandle_t xTask ) FREERTOS_SYSTEM_CALL;

-void MPU_vTaskSetApplicationTaskTag( TaskHandle_t xTask,

-                                     TaskHookFunction_t pxHookFunction ) FREERTOS_SYSTEM_CALL;

-TaskHookFunction_t MPU_xTaskGetApplicationTaskTag( TaskHandle_t xTask ) FREERTOS_SYSTEM_CALL;

-void MPU_vTaskSetThreadLocalStoragePointer( TaskHandle_t xTaskToSet,

-                                            BaseType_t xIndex,

-                                            void * pvValue ) FREERTOS_SYSTEM_CALL;

-void * MPU_pvTaskGetThreadLocalStoragePointer( TaskHandle_t xTaskToQuery,

-                                               BaseType_t xIndex ) FREERTOS_SYSTEM_CALL;

-BaseType_t MPU_xTaskCallApplicationTaskHook( TaskHandle_t xTask,

-                                             void * pvParameter ) FREERTOS_SYSTEM_CALL;

-TaskHandle_t MPU_xTaskGetIdleTaskHandle( void ) FREERTOS_SYSTEM_CALL;

-UBaseType_t MPU_uxTaskGetSystemState( TaskStatus_t * const pxTaskStatusArray,

-                                      const UBaseType_t uxArraySize,

-                                      configRUN_TIME_COUNTER_TYPE * const pulTotalRunTime ) FREERTOS_SYSTEM_CALL;

-configRUN_TIME_COUNTER_TYPE MPU_ulTaskGetIdleRunTimeCounter( void ) FREERTOS_SYSTEM_CALL;

-configRUN_TIME_COUNTER_TYPE MPU_ulTaskGetIdleRunTimePercent( void ) FREERTOS_SYSTEM_CALL;

-void MPU_vTaskList( char * pcWriteBuffer ) FREERTOS_SYSTEM_CALL;

-void MPU_vTaskGetRunTimeStats( char * pcWriteBuffer ) FREERTOS_SYSTEM_CALL;

-BaseType_t MPU_xTaskGenericNotify( TaskHandle_t xTaskToNotify,

-                                   UBaseType_t uxIndexToNotify,

-                                   uint32_t ulValue,

-                                   eNotifyAction eAction,

-                                   uint32_t * pulPreviousNotificationValue ) FREERTOS_SYSTEM_CALL;

-BaseType_t MPU_xTaskGenericNotifyWait( UBaseType_t uxIndexToWaitOn,

-                                       uint32_t ulBitsToClearOnEntry,

-                                       uint32_t ulBitsToClearOnExit,

-                                       uint32_t * pulNotificationValue,

-                                       TickType_t xTicksToWait ) FREERTOS_SYSTEM_CALL;

-uint32_t MPU_ulTaskGenericNotifyTake( UBaseType_t uxIndexToWaitOn,

-                                      BaseType_t xClearCountOnExit,

-                                      TickType_t xTicksToWait ) FREERTOS_SYSTEM_CALL;

-BaseType_t MPU_xTaskGenericNotifyStateClear( TaskHandle_t xTask,

-                                             UBaseType_t uxIndexToClear ) FREERTOS_SYSTEM_CALL;

-uint32_t MPU_ulTaskGenericNotifyValueClear( TaskHandle_t xTask,

-                                            UBaseType_t uxIndexToClear,

-                                            uint32_t ulBitsToClear ) FREERTOS_SYSTEM_CALL;

-BaseType_t MPU_xTaskIncrementTick( void ) FREERTOS_SYSTEM_CALL;

-TaskHandle_t MPU_xTaskGetCurrentTaskHandle( void ) FREERTOS_SYSTEM_CALL;

-void MPU_vTaskSetTimeOutState( TimeOut_t * const pxTimeOut ) FREERTOS_SYSTEM_CALL;

-BaseType_t MPU_xTaskCheckForTimeOut( TimeOut_t * const pxTimeOut,

-                                     TickType_t * const pxTicksToWait ) FREERTOS_SYSTEM_CALL;

-void MPU_vTaskMissedYield( void ) FREERTOS_SYSTEM_CALL;

-BaseType_t MPU_xTaskGetSchedulerState( void ) FREERTOS_SYSTEM_CALL;

-BaseType_t MPU_xTaskCatchUpTicks( TickType_t xTicksToCatchUp ) FREERTOS_SYSTEM_CALL;

-

-/* MPU versions of queue.h API functions. */

-BaseType_t MPU_xQueueGenericSend( QueueHandle_t xQueue,

-                                  const void * const pvItemToQueue,

-                                  TickType_t xTicksToWait,

-                                  const BaseType_t xCopyPosition ) FREERTOS_SYSTEM_CALL;

-BaseType_t MPU_xQueueReceive( QueueHandle_t xQueue,

-                              void * const pvBuffer,

-                              TickType_t xTicksToWait ) FREERTOS_SYSTEM_CALL;

-BaseType_t MPU_xQueuePeek( QueueHandle_t xQueue,

-                           void * const pvBuffer,

-                           TickType_t xTicksToWait ) FREERTOS_SYSTEM_CALL;

-BaseType_t MPU_xQueueSemaphoreTake( QueueHandle_t xQueue,

-                                    TickType_t xTicksToWait ) FREERTOS_SYSTEM_CALL;

-UBaseType_t MPU_uxQueueMessagesWaiting( const QueueHandle_t xQueue ) FREERTOS_SYSTEM_CALL;

-UBaseType_t MPU_uxQueueSpacesAvailable( const QueueHandle_t xQueue ) FREERTOS_SYSTEM_CALL;

-void MPU_vQueueDelete( QueueHandle_t xQueue ) FREERTOS_SYSTEM_CALL;

-QueueHandle_t MPU_xQueueCreateMutex( const uint8_t ucQueueType ) FREERTOS_SYSTEM_CALL;

-QueueHandle_t MPU_xQueueCreateMutexStatic( const uint8_t ucQueueType,

-                                           StaticQueue_t * pxStaticQueue ) FREERTOS_SYSTEM_CALL;

-QueueHandle_t MPU_xQueueCreateCountingSemaphore( const UBaseType_t uxMaxCount,

-                                                 const UBaseType_t uxInitialCount ) FREERTOS_SYSTEM_CALL;

-QueueHandle_t MPU_xQueueCreateCountingSemaphoreStatic( const UBaseType_t uxMaxCount,

-                                                       const UBaseType_t uxInitialCount,

-                                                       StaticQueue_t * pxStaticQueue ) FREERTOS_SYSTEM_CALL;

-TaskHandle_t MPU_xQueueGetMutexHolder( QueueHandle_t xSemaphore ) FREERTOS_SYSTEM_CALL;

-BaseType_t MPU_xQueueTakeMutexRecursive( QueueHandle_t xMutex,

-                                         TickType_t xTicksToWait ) FREERTOS_SYSTEM_CALL;

-BaseType_t MPU_xQueueGiveMutexRecursive( QueueHandle_t pxMutex ) FREERTOS_SYSTEM_CALL;

-void MPU_vQueueAddToRegistry( QueueHandle_t xQueue,

-                              const char * pcName ) FREERTOS_SYSTEM_CALL;

-void MPU_vQueueUnregisterQueue( QueueHandle_t xQueue ) FREERTOS_SYSTEM_CALL;

-const char * MPU_pcQueueGetName( QueueHandle_t xQueue ) FREERTOS_SYSTEM_CALL;

-QueueHandle_t MPU_xQueueGenericCreate( const UBaseType_t uxQueueLength,

-                                       const UBaseType_t uxItemSize,

-                                       const uint8_t ucQueueType ) FREERTOS_SYSTEM_CALL;

-QueueHandle_t MPU_xQueueGenericCreateStatic( const UBaseType_t uxQueueLength,

-                                             const UBaseType_t uxItemSize,

-                                             uint8_t * pucQueueStorage,

-                                             StaticQueue_t * pxStaticQueue,

-                                             const uint8_t ucQueueType ) FREERTOS_SYSTEM_CALL;

-QueueSetHandle_t MPU_xQueueCreateSet( const UBaseType_t uxEventQueueLength ) FREERTOS_SYSTEM_CALL;

-BaseType_t MPU_xQueueAddToSet( QueueSetMemberHandle_t xQueueOrSemaphore,

-                               QueueSetHandle_t xQueueSet ) FREERTOS_SYSTEM_CALL;

-BaseType_t MPU_xQueueRemoveFromSet( QueueSetMemberHandle_t xQueueOrSemaphore,

-                                    QueueSetHandle_t xQueueSet ) FREERTOS_SYSTEM_CALL;

-QueueSetMemberHandle_t MPU_xQueueSelectFromSet( QueueSetHandle_t xQueueSet,

-                                                const TickType_t xTicksToWait ) FREERTOS_SYSTEM_CALL;

-BaseType_t MPU_xQueueGenericReset( QueueHandle_t xQueue,

-                                   BaseType_t xNewQueue ) FREERTOS_SYSTEM_CALL;

-void MPU_vQueueSetQueueNumber( QueueHandle_t xQueue,

-                               UBaseType_t uxQueueNumber ) FREERTOS_SYSTEM_CALL;

-UBaseType_t MPU_uxQueueGetQueueNumber( QueueHandle_t xQueue ) FREERTOS_SYSTEM_CALL;

-uint8_t MPU_ucQueueGetQueueType( QueueHandle_t xQueue ) FREERTOS_SYSTEM_CALL;

-

-/* MPU versions of timers.h API functions. */

-TimerHandle_t MPU_xTimerCreate( const char * const pcTimerName,

-                                const TickType_t xTimerPeriodInTicks,

-                                const UBaseType_t uxAutoReload,

-                                void * const pvTimerID,

-                                TimerCallbackFunction_t pxCallbackFunction ) FREERTOS_SYSTEM_CALL;

-TimerHandle_t MPU_xTimerCreateStatic( const char * const pcTimerName,

-                                      const TickType_t xTimerPeriodInTicks,

-                                      const UBaseType_t uxAutoReload,

-                                      void * const pvTimerID,

-                                      TimerCallbackFunction_t pxCallbackFunction,

-                                      StaticTimer_t * pxTimerBuffer ) FREERTOS_SYSTEM_CALL;

-void * MPU_pvTimerGetTimerID( const TimerHandle_t xTimer ) FREERTOS_SYSTEM_CALL;

-void MPU_vTimerSetTimerID( TimerHandle_t xTimer,

-                           void * pvNewID ) FREERTOS_SYSTEM_CALL;

-BaseType_t MPU_xTimerIsTimerActive( TimerHandle_t xTimer ) FREERTOS_SYSTEM_CALL;

-TaskHandle_t MPU_xTimerGetTimerDaemonTaskHandle( void ) FREERTOS_SYSTEM_CALL;

-BaseType_t MPU_xTimerPendFunctionCall( PendedFunction_t xFunctionToPend,

-                                       void * pvParameter1,

-                                       uint32_t ulParameter2,

-                                       TickType_t xTicksToWait ) FREERTOS_SYSTEM_CALL;

-const char * MPU_pcTimerGetName( TimerHandle_t xTimer ) FREERTOS_SYSTEM_CALL;

-void MPU_vTimerSetReloadMode( TimerHandle_t xTimer,

-                              const UBaseType_t uxAutoReload ) FREERTOS_SYSTEM_CALL;

-UBaseType_t MPU_uxTimerGetReloadMode( TimerHandle_t xTimer ) FREERTOS_SYSTEM_CALL;

-TickType_t MPU_xTimerGetPeriod( TimerHandle_t xTimer ) FREERTOS_SYSTEM_CALL;

-TickType_t MPU_xTimerGetExpiryTime( TimerHandle_t xTimer ) FREERTOS_SYSTEM_CALL;

-BaseType_t MPU_xTimerCreateTimerTask( void ) FREERTOS_SYSTEM_CALL;

-BaseType_t MPU_xTimerGenericCommand( TimerHandle_t xTimer,

-                                     const BaseType_t xCommandID,

-                                     const TickType_t xOptionalValue,

-                                     BaseType_t * const pxHigherPriorityTaskWoken,

-                                     const TickType_t xTicksToWait ) FREERTOS_SYSTEM_CALL;

-

-/* MPU versions of event_group.h API functions. */

-EventGroupHandle_t MPU_xEventGroupCreate( void ) FREERTOS_SYSTEM_CALL;

-EventGroupHandle_t MPU_xEventGroupCreateStatic( StaticEventGroup_t * pxEventGroupBuffer ) FREERTOS_SYSTEM_CALL;

-EventBits_t MPU_xEventGroupWaitBits( EventGroupHandle_t xEventGroup,

-                                     const EventBits_t uxBitsToWaitFor,

-                                     const BaseType_t xClearOnExit,

-                                     const BaseType_t xWaitForAllBits,

-                                     TickType_t xTicksToWait ) FREERTOS_SYSTEM_CALL;

-EventBits_t MPU_xEventGroupClearBits( EventGroupHandle_t xEventGroup,

-                                      const EventBits_t uxBitsToClear ) FREERTOS_SYSTEM_CALL;

-EventBits_t MPU_xEventGroupSetBits( EventGroupHandle_t xEventGroup,

-                                    const EventBits_t uxBitsToSet ) FREERTOS_SYSTEM_CALL;

-EventBits_t MPU_xEventGroupSync( EventGroupHandle_t xEventGroup,

-                                 const EventBits_t uxBitsToSet,

-                                 const EventBits_t uxBitsToWaitFor,

-                                 TickType_t xTicksToWait ) FREERTOS_SYSTEM_CALL;

-void MPU_vEventGroupDelete( EventGroupHandle_t xEventGroup ) FREERTOS_SYSTEM_CALL;

-UBaseType_t MPU_uxEventGroupGetNumber( void * xEventGroup ) FREERTOS_SYSTEM_CALL;

-

-/* MPU versions of message/stream_buffer.h API functions. */

-size_t MPU_xStreamBufferSend( StreamBufferHandle_t xStreamBuffer,

-                              const void * pvTxData,

-                              size_t xDataLengthBytes,

-                              TickType_t xTicksToWait ) FREERTOS_SYSTEM_CALL;

-size_t MPU_xStreamBufferReceive( StreamBufferHandle_t xStreamBuffer,

-                                 void * pvRxData,

-                                 size_t xBufferLengthBytes,

-                                 TickType_t xTicksToWait ) FREERTOS_SYSTEM_CALL;

-size_t MPU_xStreamBufferNextMessageLengthBytes( StreamBufferHandle_t xStreamBuffer ) FREERTOS_SYSTEM_CALL;

-void MPU_vStreamBufferDelete( StreamBufferHandle_t xStreamBuffer ) FREERTOS_SYSTEM_CALL;

-BaseType_t MPU_xStreamBufferIsFull( StreamBufferHandle_t xStreamBuffer ) FREERTOS_SYSTEM_CALL;

-BaseType_t MPU_xStreamBufferIsEmpty( StreamBufferHandle_t xStreamBuffer ) FREERTOS_SYSTEM_CALL;

-BaseType_t MPU_xStreamBufferReset( StreamBufferHandle_t xStreamBuffer ) FREERTOS_SYSTEM_CALL;

-size_t MPU_xStreamBufferSpacesAvailable( StreamBufferHandle_t xStreamBuffer ) FREERTOS_SYSTEM_CALL;

-size_t MPU_xStreamBufferBytesAvailable( StreamBufferHandle_t xStreamBuffer ) FREERTOS_SYSTEM_CALL;

-BaseType_t MPU_xStreamBufferSetTriggerLevel( StreamBufferHandle_t xStreamBuffer,

-                                             size_t xTriggerLevel ) FREERTOS_SYSTEM_CALL;

-StreamBufferHandle_t MPU_xStreamBufferGenericCreate( size_t xBufferSizeBytes,

-                                                     size_t xTriggerLevelBytes,

-                                                     BaseType_t xIsMessageBuffer,

-                                                     StreamBufferCallbackFunction_t pxSendCompletedCallback,

-                                                     StreamBufferCallbackFunction_t pxReceiveCompletedCallback ) FREERTOS_SYSTEM_CALL;

-StreamBufferHandle_t MPU_xStreamBufferGenericCreateStatic( size_t xBufferSizeBytes,

-                                                           size_t xTriggerLevelBytes,

-                                                           BaseType_t xIsMessageBuffer,

-                                                           uint8_t * const pucStreamBufferStorageArea,

-                                                           StaticStreamBuffer_t * const pxStaticStreamBuffer,

-                                                           StreamBufferCallbackFunction_t pxSendCompletedCallback,

-                                                           StreamBufferCallbackFunction_t pxReceiveCompletedCallback ) FREERTOS_SYSTEM_CALL;

-

-

-

-#endif /* MPU_PROTOTYPES_H */

+/*
+ * FreeRTOS Kernel <DEVELOPMENT BRANCH>
+ * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.
+ *
+ * SPDX-License-Identifier: MIT
+ *
+ * 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.
+ *
+ * https://www.FreeRTOS.org
+ * https://github.com/FreeRTOS
+ *
+ */
+
+/*
+ * When the MPU is used the standard (non MPU) API functions are mapped to
+ * equivalents that start "MPU_", the prototypes for which are defined in this
+ * header files.  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.
+ */
+
+
+#ifndef MPU_PROTOTYPES_H
+#define MPU_PROTOTYPES_H
+
+/* MPU versions of task.h API functions. */
+BaseType_t MPU_xTaskCreate( TaskFunction_t pxTaskCode,
+                            const char * const pcName,
+                            const uint16_t usStackDepth,
+                            void * const pvParameters,
+                            UBaseType_t uxPriority,
+                            TaskHandle_t * const pxCreatedTask ) FREERTOS_SYSTEM_CALL;
+TaskHandle_t MPU_xTaskCreateStatic( TaskFunction_t pxTaskCode,
+                                    const char * const pcName,
+                                    const uint32_t ulStackDepth,
+                                    void * const pvParameters,
+                                    UBaseType_t uxPriority,
+                                    StackType_t * const puxStackBuffer,
+                                    StaticTask_t * const pxTaskBuffer ) FREERTOS_SYSTEM_CALL;
+void MPU_vTaskDelete( TaskHandle_t xTaskToDelete ) FREERTOS_SYSTEM_CALL;
+void MPU_vTaskDelay( const TickType_t xTicksToDelay ) FREERTOS_SYSTEM_CALL;
+BaseType_t MPU_xTaskDelayUntil( TickType_t * const pxPreviousWakeTime,
+                                const TickType_t xTimeIncrement ) FREERTOS_SYSTEM_CALL;
+BaseType_t MPU_xTaskAbortDelay( TaskHandle_t xTask ) FREERTOS_SYSTEM_CALL;
+UBaseType_t MPU_uxTaskPriorityGet( const TaskHandle_t xTask ) FREERTOS_SYSTEM_CALL;
+eTaskState MPU_eTaskGetState( TaskHandle_t xTask ) FREERTOS_SYSTEM_CALL;
+void MPU_vTaskGetInfo( TaskHandle_t xTask,
+                       TaskStatus_t * pxTaskStatus,
+                       BaseType_t xGetFreeStackSpace,
+                       eTaskState eState ) FREERTOS_SYSTEM_CALL;
+void MPU_vTaskPrioritySet( TaskHandle_t xTask,
+                           UBaseType_t uxNewPriority ) FREERTOS_SYSTEM_CALL;
+void MPU_vTaskSuspend( TaskHandle_t xTaskToSuspend ) FREERTOS_SYSTEM_CALL;
+void MPU_vTaskResume( TaskHandle_t xTaskToResume ) FREERTOS_SYSTEM_CALL;
+void MPU_vTaskStartScheduler( void ) FREERTOS_SYSTEM_CALL;
+void MPU_vTaskSuspendAll( void ) FREERTOS_SYSTEM_CALL;
+BaseType_t MPU_xTaskResumeAll( void ) FREERTOS_SYSTEM_CALL;
+TickType_t MPU_xTaskGetTickCount( void ) FREERTOS_SYSTEM_CALL;
+UBaseType_t MPU_uxTaskGetNumberOfTasks( void ) FREERTOS_SYSTEM_CALL;
+char * MPU_pcTaskGetName( TaskHandle_t xTaskToQuery ) FREERTOS_SYSTEM_CALL;
+TaskHandle_t MPU_xTaskGetHandle( const char * pcNameToQuery ) FREERTOS_SYSTEM_CALL;
+UBaseType_t MPU_uxTaskGetStackHighWaterMark( TaskHandle_t xTask ) FREERTOS_SYSTEM_CALL;
+configSTACK_DEPTH_TYPE MPU_uxTaskGetStackHighWaterMark2( TaskHandle_t xTask ) FREERTOS_SYSTEM_CALL;
+void MPU_vTaskSetApplicationTaskTag( TaskHandle_t xTask,
+                                     TaskHookFunction_t pxHookFunction ) FREERTOS_SYSTEM_CALL;
+TaskHookFunction_t MPU_xTaskGetApplicationTaskTag( TaskHandle_t xTask ) FREERTOS_SYSTEM_CALL;
+void MPU_vTaskSetThreadLocalStoragePointer( TaskHandle_t xTaskToSet,
+                                            BaseType_t xIndex,
+                                            void * pvValue ) FREERTOS_SYSTEM_CALL;
+void * MPU_pvTaskGetThreadLocalStoragePointer( TaskHandle_t xTaskToQuery,
+                                               BaseType_t xIndex ) FREERTOS_SYSTEM_CALL;
+BaseType_t MPU_xTaskCallApplicationTaskHook( TaskHandle_t xTask,
+                                             void * pvParameter ) FREERTOS_SYSTEM_CALL;
+TaskHandle_t MPU_xTaskGetIdleTaskHandle( void ) FREERTOS_SYSTEM_CALL;
+UBaseType_t MPU_uxTaskGetSystemState( TaskStatus_t * const pxTaskStatusArray,
+                                      const UBaseType_t uxArraySize,
+                                      configRUN_TIME_COUNTER_TYPE * const pulTotalRunTime ) FREERTOS_SYSTEM_CALL;
+configRUN_TIME_COUNTER_TYPE MPU_ulTaskGetIdleRunTimeCounter( void ) FREERTOS_SYSTEM_CALL;
+configRUN_TIME_COUNTER_TYPE MPU_ulTaskGetIdleRunTimePercent( void ) FREERTOS_SYSTEM_CALL;
+void MPU_vTaskList( char * pcWriteBuffer ) FREERTOS_SYSTEM_CALL;
+void MPU_vTaskGetRunTimeStats( char * pcWriteBuffer ) FREERTOS_SYSTEM_CALL;
+BaseType_t MPU_xTaskGenericNotify( TaskHandle_t xTaskToNotify,
+                                   UBaseType_t uxIndexToNotify,
+                                   uint32_t ulValue,
+                                   eNotifyAction eAction,
+                                   uint32_t * pulPreviousNotificationValue ) FREERTOS_SYSTEM_CALL;
+BaseType_t MPU_xTaskGenericNotifyWait( UBaseType_t uxIndexToWaitOn,
+                                       uint32_t ulBitsToClearOnEntry,
+                                       uint32_t ulBitsToClearOnExit,
+                                       uint32_t * pulNotificationValue,
+                                       TickType_t xTicksToWait ) FREERTOS_SYSTEM_CALL;
+uint32_t MPU_ulTaskGenericNotifyTake( UBaseType_t uxIndexToWaitOn,
+                                      BaseType_t xClearCountOnExit,
+                                      TickType_t xTicksToWait ) FREERTOS_SYSTEM_CALL;
+BaseType_t MPU_xTaskGenericNotifyStateClear( TaskHandle_t xTask,
+                                             UBaseType_t uxIndexToClear ) FREERTOS_SYSTEM_CALL;
+uint32_t MPU_ulTaskGenericNotifyValueClear( TaskHandle_t xTask,
+                                            UBaseType_t uxIndexToClear,
+                                            uint32_t ulBitsToClear ) FREERTOS_SYSTEM_CALL;
+BaseType_t MPU_xTaskIncrementTick( void ) FREERTOS_SYSTEM_CALL;
+TaskHandle_t MPU_xTaskGetCurrentTaskHandle( void ) FREERTOS_SYSTEM_CALL;
+void MPU_vTaskSetTimeOutState( TimeOut_t * const pxTimeOut ) FREERTOS_SYSTEM_CALL;
+BaseType_t MPU_xTaskCheckForTimeOut( TimeOut_t * const pxTimeOut,
+                                     TickType_t * const pxTicksToWait ) FREERTOS_SYSTEM_CALL;
+void MPU_vTaskMissedYield( void ) FREERTOS_SYSTEM_CALL;
+BaseType_t MPU_xTaskGetSchedulerState( void ) FREERTOS_SYSTEM_CALL;
+BaseType_t MPU_xTaskCatchUpTicks( TickType_t xTicksToCatchUp ) FREERTOS_SYSTEM_CALL;
+
+/* MPU versions of queue.h API functions. */
+BaseType_t MPU_xQueueGenericSend( QueueHandle_t xQueue,
+                                  const void * const pvItemToQueue,
+                                  TickType_t xTicksToWait,
+                                  const BaseType_t xCopyPosition ) FREERTOS_SYSTEM_CALL;
+BaseType_t MPU_xQueueReceive( QueueHandle_t xQueue,
+                              void * const pvBuffer,
+                              TickType_t xTicksToWait ) FREERTOS_SYSTEM_CALL;
+BaseType_t MPU_xQueuePeek( QueueHandle_t xQueue,
+                           void * const pvBuffer,
+                           TickType_t xTicksToWait ) FREERTOS_SYSTEM_CALL;
+BaseType_t MPU_xQueueSemaphoreTake( QueueHandle_t xQueue,
+                                    TickType_t xTicksToWait ) FREERTOS_SYSTEM_CALL;
+UBaseType_t MPU_uxQueueMessagesWaiting( const QueueHandle_t xQueue ) FREERTOS_SYSTEM_CALL;
+UBaseType_t MPU_uxQueueSpacesAvailable( const QueueHandle_t xQueue ) FREERTOS_SYSTEM_CALL;
+void MPU_vQueueDelete( QueueHandle_t xQueue ) FREERTOS_SYSTEM_CALL;
+QueueHandle_t MPU_xQueueCreateMutex( const uint8_t ucQueueType ) FREERTOS_SYSTEM_CALL;
+QueueHandle_t MPU_xQueueCreateMutexStatic( const uint8_t ucQueueType,
+                                           StaticQueue_t * pxStaticQueue ) FREERTOS_SYSTEM_CALL;
+QueueHandle_t MPU_xQueueCreateCountingSemaphore( const UBaseType_t uxMaxCount,
+                                                 const UBaseType_t uxInitialCount ) FREERTOS_SYSTEM_CALL;
+QueueHandle_t MPU_xQueueCreateCountingSemaphoreStatic( const UBaseType_t uxMaxCount,
+                                                       const UBaseType_t uxInitialCount,
+                                                       StaticQueue_t * pxStaticQueue ) FREERTOS_SYSTEM_CALL;
+TaskHandle_t MPU_xQueueGetMutexHolder( QueueHandle_t xSemaphore ) FREERTOS_SYSTEM_CALL;
+BaseType_t MPU_xQueueTakeMutexRecursive( QueueHandle_t xMutex,
+                                         TickType_t xTicksToWait ) FREERTOS_SYSTEM_CALL;
+BaseType_t MPU_xQueueGiveMutexRecursive( QueueHandle_t pxMutex ) FREERTOS_SYSTEM_CALL;
+void MPU_vQueueAddToRegistry( QueueHandle_t xQueue,
+                              const char * pcName ) FREERTOS_SYSTEM_CALL;
+void MPU_vQueueUnregisterQueue( QueueHandle_t xQueue ) FREERTOS_SYSTEM_CALL;
+const char * MPU_pcQueueGetName( QueueHandle_t xQueue ) FREERTOS_SYSTEM_CALL;
+QueueHandle_t MPU_xQueueGenericCreate( const UBaseType_t uxQueueLength,
+                                       const UBaseType_t uxItemSize,
+                                       const uint8_t ucQueueType ) FREERTOS_SYSTEM_CALL;
+QueueHandle_t MPU_xQueueGenericCreateStatic( const UBaseType_t uxQueueLength,
+                                             const UBaseType_t uxItemSize,
+                                             uint8_t * pucQueueStorage,
+                                             StaticQueue_t * pxStaticQueue,
+                                             const uint8_t ucQueueType ) FREERTOS_SYSTEM_CALL;
+QueueSetHandle_t MPU_xQueueCreateSet( const UBaseType_t uxEventQueueLength ) FREERTOS_SYSTEM_CALL;
+BaseType_t MPU_xQueueAddToSet( QueueSetMemberHandle_t xQueueOrSemaphore,
+                               QueueSetHandle_t xQueueSet ) FREERTOS_SYSTEM_CALL;
+BaseType_t MPU_xQueueRemoveFromSet( QueueSetMemberHandle_t xQueueOrSemaphore,
+                                    QueueSetHandle_t xQueueSet ) FREERTOS_SYSTEM_CALL;
+QueueSetMemberHandle_t MPU_xQueueSelectFromSet( QueueSetHandle_t xQueueSet,
+                                                const TickType_t xTicksToWait ) FREERTOS_SYSTEM_CALL;
+BaseType_t MPU_xQueueGenericReset( QueueHandle_t xQueue,
+                                   BaseType_t xNewQueue ) FREERTOS_SYSTEM_CALL;
+void MPU_vQueueSetQueueNumber( QueueHandle_t xQueue,
+                               UBaseType_t uxQueueNumber ) FREERTOS_SYSTEM_CALL;
+UBaseType_t MPU_uxQueueGetQueueNumber( QueueHandle_t xQueue ) FREERTOS_SYSTEM_CALL;
+uint8_t MPU_ucQueueGetQueueType( QueueHandle_t xQueue ) FREERTOS_SYSTEM_CALL;
+
+/* MPU versions of timers.h API functions. */
+TimerHandle_t MPU_xTimerCreate( const char * const pcTimerName,
+                                const TickType_t xTimerPeriodInTicks,
+                                const UBaseType_t uxAutoReload,
+                                void * const pvTimerID,
+                                TimerCallbackFunction_t pxCallbackFunction ) FREERTOS_SYSTEM_CALL;
+TimerHandle_t MPU_xTimerCreateStatic( const char * const pcTimerName,
+                                      const TickType_t xTimerPeriodInTicks,
+                                      const UBaseType_t uxAutoReload,
+                                      void * const pvTimerID,
+                                      TimerCallbackFunction_t pxCallbackFunction,
+                                      StaticTimer_t * pxTimerBuffer ) FREERTOS_SYSTEM_CALL;
+void * MPU_pvTimerGetTimerID( const TimerHandle_t xTimer ) FREERTOS_SYSTEM_CALL;
+void MPU_vTimerSetTimerID( TimerHandle_t xTimer,
+                           void * pvNewID ) FREERTOS_SYSTEM_CALL;
+BaseType_t MPU_xTimerIsTimerActive( TimerHandle_t xTimer ) FREERTOS_SYSTEM_CALL;
+TaskHandle_t MPU_xTimerGetTimerDaemonTaskHandle( void ) FREERTOS_SYSTEM_CALL;
+BaseType_t MPU_xTimerPendFunctionCall( PendedFunction_t xFunctionToPend,
+                                       void * pvParameter1,
+                                       uint32_t ulParameter2,
+                                       TickType_t xTicksToWait ) FREERTOS_SYSTEM_CALL;
+const char * MPU_pcTimerGetName( TimerHandle_t xTimer ) FREERTOS_SYSTEM_CALL;
+void MPU_vTimerSetReloadMode( TimerHandle_t xTimer,
+                              const UBaseType_t uxAutoReload ) FREERTOS_SYSTEM_CALL;
+UBaseType_t MPU_uxTimerGetReloadMode( TimerHandle_t xTimer ) FREERTOS_SYSTEM_CALL;
+TickType_t MPU_xTimerGetPeriod( TimerHandle_t xTimer ) FREERTOS_SYSTEM_CALL;
+TickType_t MPU_xTimerGetExpiryTime( TimerHandle_t xTimer ) FREERTOS_SYSTEM_CALL;
+BaseType_t MPU_xTimerCreateTimerTask( void ) FREERTOS_SYSTEM_CALL;
+BaseType_t MPU_xTimerGenericCommand( TimerHandle_t xTimer,
+                                     const BaseType_t xCommandID,
+                                     const TickType_t xOptionalValue,
+                                     BaseType_t * const pxHigherPriorityTaskWoken,
+                                     const TickType_t xTicksToWait ) FREERTOS_SYSTEM_CALL;
+
+/* MPU versions of event_group.h API functions. */
+EventGroupHandle_t MPU_xEventGroupCreate( void ) FREERTOS_SYSTEM_CALL;
+EventGroupHandle_t MPU_xEventGroupCreateStatic( StaticEventGroup_t * pxEventGroupBuffer ) FREERTOS_SYSTEM_CALL;
+EventBits_t MPU_xEventGroupWaitBits( EventGroupHandle_t xEventGroup,
+                                     const EventBits_t uxBitsToWaitFor,
+                                     const BaseType_t xClearOnExit,
+                                     const BaseType_t xWaitForAllBits,
+                                     TickType_t xTicksToWait ) FREERTOS_SYSTEM_CALL;
+EventBits_t MPU_xEventGroupClearBits( EventGroupHandle_t xEventGroup,
+                                      const EventBits_t uxBitsToClear ) FREERTOS_SYSTEM_CALL;
+EventBits_t MPU_xEventGroupSetBits( EventGroupHandle_t xEventGroup,
+                                    const EventBits_t uxBitsToSet ) FREERTOS_SYSTEM_CALL;
+EventBits_t MPU_xEventGroupSync( EventGroupHandle_t xEventGroup,
+                                 const EventBits_t uxBitsToSet,
+                                 const EventBits_t uxBitsToWaitFor,
+                                 TickType_t xTicksToWait ) FREERTOS_SYSTEM_CALL;
+void MPU_vEventGroupDelete( EventGroupHandle_t xEventGroup ) FREERTOS_SYSTEM_CALL;
+UBaseType_t MPU_uxEventGroupGetNumber( void * xEventGroup ) FREERTOS_SYSTEM_CALL;
+
+/* MPU versions of message/stream_buffer.h API functions. */
+size_t MPU_xStreamBufferSend( StreamBufferHandle_t xStreamBuffer,
+                              const void * pvTxData,
+                              size_t xDataLengthBytes,
+                              TickType_t xTicksToWait ) FREERTOS_SYSTEM_CALL;
+size_t MPU_xStreamBufferReceive( StreamBufferHandle_t xStreamBuffer,
+                                 void * pvRxData,
+                                 size_t xBufferLengthBytes,
+                                 TickType_t xTicksToWait ) FREERTOS_SYSTEM_CALL;
+size_t MPU_xStreamBufferNextMessageLengthBytes( StreamBufferHandle_t xStreamBuffer ) FREERTOS_SYSTEM_CALL;
+void MPU_vStreamBufferDelete( StreamBufferHandle_t xStreamBuffer ) FREERTOS_SYSTEM_CALL;
+BaseType_t MPU_xStreamBufferIsFull( StreamBufferHandle_t xStreamBuffer ) FREERTOS_SYSTEM_CALL;
+BaseType_t MPU_xStreamBufferIsEmpty( StreamBufferHandle_t xStreamBuffer ) FREERTOS_SYSTEM_CALL;
+BaseType_t MPU_xStreamBufferReset( StreamBufferHandle_t xStreamBuffer ) FREERTOS_SYSTEM_CALL;
+size_t MPU_xStreamBufferSpacesAvailable( StreamBufferHandle_t xStreamBuffer ) FREERTOS_SYSTEM_CALL;
+size_t MPU_xStreamBufferBytesAvailable( StreamBufferHandle_t xStreamBuffer ) FREERTOS_SYSTEM_CALL;
+BaseType_t MPU_xStreamBufferSetTriggerLevel( StreamBufferHandle_t xStreamBuffer,
+                                             size_t xTriggerLevel ) FREERTOS_SYSTEM_CALL;
+StreamBufferHandle_t MPU_xStreamBufferGenericCreate( size_t xBufferSizeBytes,
+                                                     size_t xTriggerLevelBytes,
+                                                     BaseType_t xIsMessageBuffer,
+                                                     StreamBufferCallbackFunction_t pxSendCompletedCallback,
+                                                     StreamBufferCallbackFunction_t pxReceiveCompletedCallback ) FREERTOS_SYSTEM_CALL;
+StreamBufferHandle_t MPU_xStreamBufferGenericCreateStatic( size_t xBufferSizeBytes,
+                                                           size_t xTriggerLevelBytes,
+                                                           BaseType_t xIsMessageBuffer,
+                                                           uint8_t * const pucStreamBufferStorageArea,
+                                                           StaticStreamBuffer_t * const pxStaticStreamBuffer,
+                                                           StreamBufferCallbackFunction_t pxSendCompletedCallback,
+                                                           StreamBufferCallbackFunction_t pxReceiveCompletedCallback ) FREERTOS_SYSTEM_CALL;
+
+
+
+#endif /* MPU_PROTOTYPES_H */
diff --git a/include/mpu_wrappers.h b/include/mpu_wrappers.h
index b355ae4..fb8aedf 100644
--- a/include/mpu_wrappers.h
+++ b/include/mpu_wrappers.h
@@ -1,184 +1,184 @@
-/*

- * FreeRTOS Kernel <DEVELOPMENT BRANCH>

- * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.

- *

- * SPDX-License-Identifier: MIT

- *

- * 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.

- *

- * https://www.FreeRTOS.org

- * https://github.com/FreeRTOS

- *

- */

-

-#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 == 1 )

-

-/* 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 task.h API functions to the MPU equivalents. */

-        #define xTaskCreate                            MPU_xTaskCreate

-        #define xTaskCreateStatic                      MPU_xTaskCreateStatic

-        #define vTaskDelete                            MPU_vTaskDelete

-        #define vTaskDelay                             MPU_vTaskDelay

-        #define xTaskDelayUntil                        MPU_xTaskDelayUntil

-        #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 ulTaskGetIdleRunTimePercent            MPU_ulTaskGetIdleRunTimePercent

-        #define xTaskGenericNotify                     MPU_xTaskGenericNotify

-        #define xTaskGenericNotifyWait                 MPU_xTaskGenericNotifyWait

-        #define ulTaskGenericNotifyTake                MPU_ulTaskGenericNotifyTake

-        #define xTaskGenericNotifyStateClear           MPU_xTaskGenericNotifyStateClear

-        #define ulTaskGenericNotifyValueClear          MPU_ulTaskGenericNotifyValueClear

-        #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 pvTimerGetTimerID                      MPU_pvTimerGetTimerID

-        #define vTimerSetTimerID                       MPU_vTimerSetTimerID

-        #define xTimerIsTimerActive                    MPU_xTimerIsTimerActive

-        #define xTimerGetTimerDaemonTaskHandle         MPU_xTimerGetTimerDaemonTaskHandle

-        #define pcTimerGetName                         MPU_pcTimerGetName

-        #define vTimerSetReloadMode                    MPU_vTimerSetReloadMode

-        #define uxTimerGetReloadMode                   MPU_uxTimerGetReloadMode

-        #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

-

-#endif /* portUSING_MPU_WRAPPERS */

-

-

-#endif /* MPU_WRAPPERS_H */

+/*
+ * FreeRTOS Kernel <DEVELOPMENT BRANCH>
+ * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.
+ *
+ * SPDX-License-Identifier: MIT
+ *
+ * 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.
+ *
+ * https://www.FreeRTOS.org
+ * https://github.com/FreeRTOS
+ *
+ */
+
+#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 == 1 )
+
+/* 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 task.h API functions to the MPU equivalents. */
+        #define xTaskCreate                            MPU_xTaskCreate
+        #define xTaskCreateStatic                      MPU_xTaskCreateStatic
+        #define vTaskDelete                            MPU_vTaskDelete
+        #define vTaskDelay                             MPU_vTaskDelay
+        #define xTaskDelayUntil                        MPU_xTaskDelayUntil
+        #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 ulTaskGetIdleRunTimePercent            MPU_ulTaskGetIdleRunTimePercent
+        #define xTaskGenericNotify                     MPU_xTaskGenericNotify
+        #define xTaskGenericNotifyWait                 MPU_xTaskGenericNotifyWait
+        #define ulTaskGenericNotifyTake                MPU_ulTaskGenericNotifyTake
+        #define xTaskGenericNotifyStateClear           MPU_xTaskGenericNotifyStateClear
+        #define ulTaskGenericNotifyValueClear          MPU_ulTaskGenericNotifyValueClear
+        #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 pvTimerGetTimerID                      MPU_pvTimerGetTimerID
+        #define vTimerSetTimerID                       MPU_vTimerSetTimerID
+        #define xTimerIsTimerActive                    MPU_xTimerIsTimerActive
+        #define xTimerGetTimerDaemonTaskHandle         MPU_xTimerGetTimerDaemonTaskHandle
+        #define pcTimerGetName                         MPU_pcTimerGetName
+        #define vTimerSetReloadMode                    MPU_vTimerSetReloadMode
+        #define uxTimerGetReloadMode                   MPU_uxTimerGetReloadMode
+        #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
+
+#endif /* portUSING_MPU_WRAPPERS */
+
+
+#endif /* MPU_WRAPPERS_H */
diff --git a/include/portable.h b/include/portable.h
index d0c3b90..52d5434 100644
--- a/include/portable.h
+++ b/include/portable.h
@@ -1,238 +1,238 @@
-/*

- * FreeRTOS Kernel <DEVELOPMENT BRANCH>

- * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.

- *

- * SPDX-License-Identifier: MIT

- *

- * 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.

- *

- * https://www.FreeRTOS.org

- * https://github.com/FreeRTOS

- *

- */

-

-/*-----------------------------------------------------------

-* 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 "portmacro.h"

-#endif

-

-#if portBYTE_ALIGNMENT == 32

-    #define portBYTE_ALIGNMENT_MASK    ( 0x001f )

-#elif portBYTE_ALIGNMENT == 16

-    #define portBYTE_ALIGNMENT_MASK    ( 0x000f )

-#elif portBYTE_ALIGNMENT == 8

-    #define portBYTE_ALIGNMENT_MASK    ( 0x0007 )

-#elif portBYTE_ALIGNMENT == 4

-    #define portBYTE_ALIGNMENT_MASK    ( 0x0003 )

-#elif portBYTE_ALIGNMENT == 2

-    #define portBYTE_ALIGNMENT_MASK    ( 0x0001 )

-#elif portBYTE_ALIGNMENT == 1

-    #define portBYTE_ALIGNMENT_MASK    ( 0x0000 )

-#else /* if portBYTE_ALIGNMENT == 32 */

-    #error "Invalid portBYTE_ALIGNMENT definition"

-#endif /* if portBYTE_ALIGNMENT == 32 */

-

-#ifndef portUSING_MPU_WRAPPERS

-    #define portUSING_MPU_WRAPPERS    0

-#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

-

-#ifndef configSTACK_ALLOCATION_FROM_SEPARATE_HEAP

-    /* Defaults to 0 for backward compatibility. */

-    #define configSTACK_ALLOCATION_FROM_SEPARATE_HEAP    0

-#endif

-

-/* *INDENT-OFF* */

-#ifdef __cplusplus

-    extern "C" {

-#endif

-/* *INDENT-ON* */

-

-#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 ( portUSING_MPU_WRAPPERS == 1 ) */

-    #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 /* if ( portUSING_MPU_WRAPPERS == 1 ) */

-

-/* 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 * pvPortCalloc( size_t xNum,

-                     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;

-

-#if ( configSTACK_ALLOCATION_FROM_SEPARATE_HEAP == 1 )

-    void * pvPortMallocStack( size_t xSize ) PRIVILEGED_FUNCTION;

-    void vPortFreeStack( void * pv ) PRIVILEGED_FUNCTION;

-#else

-    #define pvPortMallocStack    pvPortMalloc

-    #define vPortFreeStack       vPortFree

-#endif

-

-#if ( configUSE_MALLOC_FAILED_HOOK == 1 )

-

-/**

- * task.h

- * @code{c}

- * void vApplicationMallocFailedHook( void )

- * @endcode

- *

- * This hook function is called when allocation failed.

- */

-    void vApplicationMallocFailedHook( void ); /*lint !e526 Symbol not defined as it is an application callback. */

-#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;

-

-/*

- * The structures and methods of manipulating the MPU are contained within the

- * port layer.

- *

- * Fills the xMPUSettings structure with the memory region information

- * contained in xRegions.

- */

-#if ( portUSING_MPU_WRAPPERS == 1 )

-    struct xMEMORY_REGION;

-    void vPortStoreTaskMPUSettings( xMPU_SETTINGS * xMPUSettings,

-                                    const struct xMEMORY_REGION * const xRegions,

-                                    StackType_t * pxBottomOfStack,

-                                    uint32_t ulStackDepth ) PRIVILEGED_FUNCTION;

-#endif

-

-/* *INDENT-OFF* */

-#ifdef __cplusplus

-    }

-#endif

-/* *INDENT-ON* */

-

-#endif /* PORTABLE_H */

+/*
+ * FreeRTOS Kernel <DEVELOPMENT BRANCH>
+ * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.
+ *
+ * SPDX-License-Identifier: MIT
+ *
+ * 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.
+ *
+ * https://www.FreeRTOS.org
+ * https://github.com/FreeRTOS
+ *
+ */
+
+/*-----------------------------------------------------------
+* 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 "portmacro.h"
+#endif
+
+#if portBYTE_ALIGNMENT == 32
+    #define portBYTE_ALIGNMENT_MASK    ( 0x001f )
+#elif portBYTE_ALIGNMENT == 16
+    #define portBYTE_ALIGNMENT_MASK    ( 0x000f )
+#elif portBYTE_ALIGNMENT == 8
+    #define portBYTE_ALIGNMENT_MASK    ( 0x0007 )
+#elif portBYTE_ALIGNMENT == 4
+    #define portBYTE_ALIGNMENT_MASK    ( 0x0003 )
+#elif portBYTE_ALIGNMENT == 2
+    #define portBYTE_ALIGNMENT_MASK    ( 0x0001 )
+#elif portBYTE_ALIGNMENT == 1
+    #define portBYTE_ALIGNMENT_MASK    ( 0x0000 )
+#else /* if portBYTE_ALIGNMENT == 32 */
+    #error "Invalid portBYTE_ALIGNMENT definition"
+#endif /* if portBYTE_ALIGNMENT == 32 */
+
+#ifndef portUSING_MPU_WRAPPERS
+    #define portUSING_MPU_WRAPPERS    0
+#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
+
+#ifndef configSTACK_ALLOCATION_FROM_SEPARATE_HEAP
+    /* Defaults to 0 for backward compatibility. */
+    #define configSTACK_ALLOCATION_FROM_SEPARATE_HEAP    0
+#endif
+
+/* *INDENT-OFF* */
+#ifdef __cplusplus
+    extern "C" {
+#endif
+/* *INDENT-ON* */
+
+#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 ( portUSING_MPU_WRAPPERS == 1 ) */
+    #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 /* if ( portUSING_MPU_WRAPPERS == 1 ) */
+
+/* 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 * pvPortCalloc( size_t xNum,
+                     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;
+
+#if ( configSTACK_ALLOCATION_FROM_SEPARATE_HEAP == 1 )
+    void * pvPortMallocStack( size_t xSize ) PRIVILEGED_FUNCTION;
+    void vPortFreeStack( void * pv ) PRIVILEGED_FUNCTION;
+#else
+    #define pvPortMallocStack    pvPortMalloc
+    #define vPortFreeStack       vPortFree
+#endif
+
+#if ( configUSE_MALLOC_FAILED_HOOK == 1 )
+
+/**
+ * task.h
+ * @code{c}
+ * void vApplicationMallocFailedHook( void )
+ * @endcode
+ *
+ * This hook function is called when allocation failed.
+ */
+    void vApplicationMallocFailedHook( void ); /*lint !e526 Symbol not defined as it is an application callback. */
+#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;
+
+/*
+ * The structures and methods of manipulating the MPU are contained within the
+ * port layer.
+ *
+ * Fills the xMPUSettings structure with the memory region information
+ * contained in xRegions.
+ */
+#if ( portUSING_MPU_WRAPPERS == 1 )
+    struct xMEMORY_REGION;
+    void vPortStoreTaskMPUSettings( xMPU_SETTINGS * xMPUSettings,
+                                    const struct xMEMORY_REGION * const xRegions,
+                                    StackType_t * pxBottomOfStack,
+                                    uint32_t ulStackDepth ) PRIVILEGED_FUNCTION;
+#endif
+
+/* *INDENT-OFF* */
+#ifdef __cplusplus
+    }
+#endif
+/* *INDENT-ON* */
+
+#endif /* PORTABLE_H */
diff --git a/include/projdefs.h b/include/projdefs.h
index 9701e4b..b4b8c14 100644
--- a/include/projdefs.h
+++ b/include/projdefs.h
@@ -1,122 +1,122 @@
-/*

- * FreeRTOS Kernel <DEVELOPMENT BRANCH>

- * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.

- *

- * SPDX-License-Identifier: MIT

- *

- * 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.

- *

- * https://www.FreeRTOS.org

- * https://github.com/FreeRTOS

- *

- */

-

-#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 ) 1000U ) )

-#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 */

+/*
+ * FreeRTOS Kernel <DEVELOPMENT BRANCH>
+ * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.
+ *
+ * SPDX-License-Identifier: MIT
+ *
+ * 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.
+ *
+ * https://www.FreeRTOS.org
+ * https://github.com/FreeRTOS
+ *
+ */
+
+#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 ) 1000U ) )
+#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 */
diff --git a/include/semphr.h b/include/semphr.h
index b8575b9..c2206fa 100644
--- a/include/semphr.h
+++ b/include/semphr.h
@@ -1,1193 +1,1193 @@
-/*

- * FreeRTOS Kernel <DEVELOPMENT BRANCH>

- * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.

- *

- * SPDX-License-Identifier: MIT

- *

- * 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.

- *

- * https://www.FreeRTOS.org

- * https://github.com/FreeRTOS

- *

- */

-

-#ifndef SEMAPHORE_H

-#define SEMAPHORE_H

-

-#ifndef INC_FREERTOS_H

-    #error "include FreeRTOS.h" must appear in source files before "include semphr.h"

-#endif

-

-#include "queue.h"

-

-typedef QueueHandle_t SemaphoreHandle_t;

-

-#define semBINARY_SEMAPHORE_QUEUE_LENGTH    ( ( uint8_t ) 1U )

-#define semSEMAPHORE_QUEUE_ITEM_LENGTH      ( ( uint8_t ) 0U )

-#define semGIVE_BLOCK_TIME                  ( ( TickType_t ) 0U )

-

-

-/**

- * semphr. h

- * @code{c}

- * vSemaphoreCreateBinary( SemaphoreHandle_t xSemaphore );

- * @endcode

- *

- * In many usage scenarios it is faster and more memory efficient to use a

- * direct to task notification in place of a binary semaphore!

- * https://www.FreeRTOS.org/RTOS-task-notifications.html

- *

- * This old vSemaphoreCreateBinary() macro is now deprecated in favour of the

- * xSemaphoreCreateBinary() function.  Note that binary semaphores created using

- * the vSemaphoreCreateBinary() macro are created in a state such that the

- * first call to 'take' the semaphore would pass, whereas binary semaphores

- * created using xSemaphoreCreateBinary() are created in a state such that the

- * the semaphore must first be 'given' before it can be 'taken'.

- *

- * <i>Macro</i> that implements a semaphore by using the existing queue mechanism.

- * The queue length is 1 as this is a binary semaphore.  The data size is 0

- * as we don't want to actually store any data - we just want to know if the

- * queue is empty or full.

- *

- * This type of semaphore can be used for pure synchronisation between tasks or

- * between an interrupt and a task.  The semaphore need not be given back once

- * obtained, so one task/interrupt can continuously 'give' the semaphore while

- * another continuously 'takes' the semaphore.  For this reason this type of

- * semaphore does not use a priority inheritance mechanism.  For an alternative

- * that does use priority inheritance see xSemaphoreCreateMutex().

- *

- * @param xSemaphore Handle to the created semaphore.  Should be of type SemaphoreHandle_t.

- *

- * Example usage:

- * @code{c}

- * SemaphoreHandle_t xSemaphore = NULL;

- *

- * void vATask( void * pvParameters )

- * {

- *  // Semaphore cannot be used before a call to vSemaphoreCreateBinary ().

- *  // This is a macro so pass the variable in directly.

- *  vSemaphoreCreateBinary( xSemaphore );

- *

- *  if( xSemaphore != NULL )

- *  {

- *      // The semaphore was created successfully.

- *      // The semaphore can now be used.

- *  }

- * }

- * @endcode

- * \defgroup vSemaphoreCreateBinary vSemaphoreCreateBinary

- * \ingroup Semaphores

- */

-#if ( configSUPPORT_DYNAMIC_ALLOCATION == 1 )

-    #define vSemaphoreCreateBinary( xSemaphore )                                                                                     \

-    {                                                                                                                                \

-        ( xSemaphore ) = xQueueGenericCreate( ( UBaseType_t ) 1, semSEMAPHORE_QUEUE_ITEM_LENGTH, queueQUEUE_TYPE_BINARY_SEMAPHORE ); \

-        if( ( xSemaphore ) != NULL )                                                                                                 \

-        {                                                                                                                            \

-            ( void ) xSemaphoreGive( ( xSemaphore ) );                                                                               \

-        }                                                                                                                            \

-    }

-#endif

-

-/**

- * semphr. h

- * @code{c}

- * SemaphoreHandle_t xSemaphoreCreateBinary( void );

- * @endcode

- *

- * Creates a new binary semaphore instance, and returns a handle by which the

- * new semaphore can be referenced.

- *

- * In many usage scenarios it is faster and more memory efficient to use a

- * direct to task notification in place of a binary semaphore!

- * https://www.FreeRTOS.org/RTOS-task-notifications.html

- *

- * Internally, within the FreeRTOS implementation, binary semaphores use a block

- * of memory, in which the semaphore structure is stored.  If a binary semaphore

- * is created using xSemaphoreCreateBinary() then the required memory is

- * automatically dynamically allocated inside the xSemaphoreCreateBinary()

- * function.  (see https://www.FreeRTOS.org/a00111.html).  If a binary semaphore

- * is created using xSemaphoreCreateBinaryStatic() then the application writer

- * must provide the memory.  xSemaphoreCreateBinaryStatic() therefore allows a

- * binary semaphore to be created without using any dynamic memory allocation.

- *

- * The old vSemaphoreCreateBinary() macro is now deprecated in favour of this

- * xSemaphoreCreateBinary() function.  Note that binary semaphores created using

- * the vSemaphoreCreateBinary() macro are created in a state such that the

- * first call to 'take' the semaphore would pass, whereas binary semaphores

- * created using xSemaphoreCreateBinary() are created in a state such that the

- * the semaphore must first be 'given' before it can be 'taken'.

- *

- * This type of semaphore can be used for pure synchronisation between tasks or

- * between an interrupt and a task.  The semaphore need not be given back once

- * obtained, so one task/interrupt can continuously 'give' the semaphore while

- * another continuously 'takes' the semaphore.  For this reason this type of

- * semaphore does not use a priority inheritance mechanism.  For an alternative

- * that does use priority inheritance see xSemaphoreCreateMutex().

- *

- * @return Handle to the created semaphore, or NULL if the memory required to

- * hold the semaphore's data structures could not be allocated.

- *

- * Example usage:

- * @code{c}

- * SemaphoreHandle_t xSemaphore = NULL;

- *

- * void vATask( void * pvParameters )

- * {

- *  // Semaphore cannot be used before a call to xSemaphoreCreateBinary().

- *  // This is a macro so pass the variable in directly.

- *  xSemaphore = xSemaphoreCreateBinary();

- *

- *  if( xSemaphore != NULL )

- *  {

- *      // The semaphore was created successfully.

- *      // The semaphore can now be used.

- *  }

- * }

- * @endcode

- * \defgroup xSemaphoreCreateBinary xSemaphoreCreateBinary

- * \ingroup Semaphores

- */

-#if ( configSUPPORT_DYNAMIC_ALLOCATION == 1 )

-    #define xSemaphoreCreateBinary()    xQueueGenericCreate( ( UBaseType_t ) 1, semSEMAPHORE_QUEUE_ITEM_LENGTH, queueQUEUE_TYPE_BINARY_SEMAPHORE )

-#endif

-

-/**

- * semphr. h

- * @code{c}

- * SemaphoreHandle_t xSemaphoreCreateBinaryStatic( StaticSemaphore_t *pxSemaphoreBuffer );

- * @endcode

- *

- * Creates a new binary semaphore instance, and returns a handle by which the

- * new semaphore can be referenced.

- *

- * NOTE: In many usage scenarios it is faster and more memory efficient to use a

- * direct to task notification in place of a binary semaphore!

- * https://www.FreeRTOS.org/RTOS-task-notifications.html

- *

- * Internally, within the FreeRTOS implementation, binary semaphores use a block

- * of memory, in which the semaphore structure is stored.  If a binary semaphore

- * is created using xSemaphoreCreateBinary() then the required memory is

- * automatically dynamically allocated inside the xSemaphoreCreateBinary()

- * function.  (see https://www.FreeRTOS.org/a00111.html).  If a binary semaphore

- * is created using xSemaphoreCreateBinaryStatic() then the application writer

- * must provide the memory.  xSemaphoreCreateBinaryStatic() therefore allows a

- * binary semaphore to be created without using any dynamic memory allocation.

- *

- * This type of semaphore can be used for pure synchronisation between tasks or

- * between an interrupt and a task.  The semaphore need not be given back once

- * obtained, so one task/interrupt can continuously 'give' the semaphore while

- * another continuously 'takes' the semaphore.  For this reason this type of

- * semaphore does not use a priority inheritance mechanism.  For an alternative

- * that does use priority inheritance see xSemaphoreCreateMutex().

- *

- * @param pxSemaphoreBuffer Must point to a variable of type StaticSemaphore_t,

- * which will then be used to hold the semaphore's data structure, removing the

- * need for the memory to be allocated dynamically.

- *

- * @return If the semaphore is created then a handle to the created semaphore is

- * returned.  If pxSemaphoreBuffer is NULL then NULL is returned.

- *

- * Example usage:

- * @code{c}

- * SemaphoreHandle_t xSemaphore = NULL;

- * StaticSemaphore_t xSemaphoreBuffer;

- *

- * void vATask( void * pvParameters )

- * {

- *  // Semaphore cannot be used before a call to xSemaphoreCreateBinary().

- *  // The semaphore's data structures will be placed in the xSemaphoreBuffer

- *  // variable, the address of which is passed into the function.  The

- *  // function's parameter is not NULL, so the function will not attempt any

- *  // dynamic memory allocation, and therefore the function will not return

- *  // return NULL.

- *  xSemaphore = xSemaphoreCreateBinary( &xSemaphoreBuffer );

- *

- *  // Rest of task code goes here.

- * }

- * @endcode

- * \defgroup xSemaphoreCreateBinaryStatic xSemaphoreCreateBinaryStatic

- * \ingroup Semaphores

- */

-#if ( configSUPPORT_STATIC_ALLOCATION == 1 )

-    #define xSemaphoreCreateBinaryStatic( pxStaticSemaphore )    xQueueGenericCreateStatic( ( UBaseType_t ) 1, semSEMAPHORE_QUEUE_ITEM_LENGTH, NULL, ( pxStaticSemaphore ), queueQUEUE_TYPE_BINARY_SEMAPHORE )

-#endif /* configSUPPORT_STATIC_ALLOCATION */

-

-/**

- * semphr. h

- * @code{c}

- * xSemaphoreTake(

- *                   SemaphoreHandle_t xSemaphore,

- *                   TickType_t xBlockTime

- *               );

- * @endcode

- *

- * <i>Macro</i> to obtain a semaphore.  The semaphore must have previously been

- * created with a call to xSemaphoreCreateBinary(), xSemaphoreCreateMutex() or

- * xSemaphoreCreateCounting().

- *

- * @param xSemaphore A handle to the semaphore being taken - obtained when

- * the semaphore was created.

- *

- * @param xBlockTime The time in ticks to wait for the semaphore to become

- * available.  The macro portTICK_PERIOD_MS can be used to convert this to a

- * real time.  A block time of zero can be used to poll the semaphore.  A block

- * time of portMAX_DELAY can be used to block indefinitely (provided

- * INCLUDE_vTaskSuspend is set to 1 in FreeRTOSConfig.h).

- *

- * @return pdTRUE if the semaphore was obtained.  pdFALSE

- * if xBlockTime expired without the semaphore becoming available.

- *

- * Example usage:

- * @code{c}

- * SemaphoreHandle_t xSemaphore = NULL;

- *

- * // A task that creates a semaphore.

- * void vATask( void * pvParameters )

- * {

- *  // Create the semaphore to guard a shared resource.

- *  xSemaphore = xSemaphoreCreateBinary();

- * }

- *

- * // A task that uses the semaphore.

- * void vAnotherTask( void * pvParameters )

- * {

- *  // ... Do other things.

- *

- *  if( xSemaphore != NULL )

- *  {

- *      // See if we can obtain the semaphore.  If the semaphore is not available

- *      // wait 10 ticks to see if it becomes free.

- *      if( xSemaphoreTake( xSemaphore, ( TickType_t ) 10 ) == pdTRUE )

- *      {

- *          // We were able to obtain the semaphore and can now access the

- *          // shared resource.

- *

- *          // ...

- *

- *          // We have finished accessing the shared resource.  Release the

- *          // semaphore.

- *          xSemaphoreGive( xSemaphore );

- *      }

- *      else

- *      {

- *          // We could not obtain the semaphore and can therefore not access

- *          // the shared resource safely.

- *      }

- *  }

- * }

- * @endcode

- * \defgroup xSemaphoreTake xSemaphoreTake

- * \ingroup Semaphores

- */

-#define xSemaphoreTake( xSemaphore, xBlockTime )    xQueueSemaphoreTake( ( xSemaphore ), ( xBlockTime ) )

-

-/**

- * semphr. h

- * @code{c}

- * xSemaphoreTakeRecursive(

- *                          SemaphoreHandle_t xMutex,

- *                          TickType_t xBlockTime

- *                        );

- * @endcode

- *

- * <i>Macro</i> to recursively obtain, or 'take', a mutex type semaphore.

- * The mutex must have previously been created using a call to

- * xSemaphoreCreateRecursiveMutex();

- *

- * configUSE_RECURSIVE_MUTEXES must be set to 1 in FreeRTOSConfig.h for this

- * macro to be available.

- *

- * This macro must not be used on mutexes created using xSemaphoreCreateMutex().

- *

- * A mutex used recursively can be 'taken' repeatedly by the owner. The mutex

- * doesn't become available again until the owner has called

- * xSemaphoreGiveRecursive() for each successful 'take' request.  For example,

- * if a task successfully 'takes' the same mutex 5 times then the mutex will

- * not be available to any other task until it has also  'given' the mutex back

- * exactly five times.

- *

- * @param xMutex A handle to the mutex being obtained.  This is the

- * handle returned by xSemaphoreCreateRecursiveMutex();

- *

- * @param xBlockTime The time in ticks to wait for the semaphore to become

- * available.  The macro portTICK_PERIOD_MS can be used to convert this to a

- * real time.  A block time of zero can be used to poll the semaphore.  If

- * the task already owns the semaphore then xSemaphoreTakeRecursive() will

- * return immediately no matter what the value of xBlockTime.

- *

- * @return pdTRUE if the semaphore was obtained.  pdFALSE if xBlockTime

- * expired without the semaphore becoming available.

- *

- * Example usage:

- * @code{c}

- * SemaphoreHandle_t xMutex = NULL;

- *

- * // A task that creates a mutex.

- * void vATask( void * pvParameters )

- * {

- *  // Create the mutex to guard a shared resource.

- *  xMutex = xSemaphoreCreateRecursiveMutex();

- * }

- *

- * // A task that uses the mutex.

- * void vAnotherTask( void * pvParameters )

- * {

- *  // ... Do other things.

- *

- *  if( xMutex != NULL )

- *  {

- *      // See if we can obtain the mutex.  If the mutex is not available

- *      // wait 10 ticks to see if it becomes free.

- *      if( xSemaphoreTakeRecursive( xSemaphore, ( TickType_t ) 10 ) == pdTRUE )

- *      {

- *          // We were able to obtain the mutex and can now access the

- *          // shared resource.

- *

- *          // ...

- *          // For some reason due to the nature of the code further calls to

- *          // xSemaphoreTakeRecursive() are made on the same mutex.  In real

- *          // code these would not be just sequential calls as this would make

- *          // no sense.  Instead the calls are likely to be buried inside

- *          // a more complex call structure.

- *          xSemaphoreTakeRecursive( xMutex, ( TickType_t ) 10 );

- *          xSemaphoreTakeRecursive( xMutex, ( TickType_t ) 10 );

- *

- *          // The mutex has now been 'taken' three times, so will not be

- *          // available to another task until it has also been given back

- *          // three times.  Again it is unlikely that real code would have

- *          // these calls sequentially, but instead buried in a more complex

- *          // call structure.  This is just for illustrative purposes.

- *          xSemaphoreGiveRecursive( xMutex );

- *          xSemaphoreGiveRecursive( xMutex );

- *          xSemaphoreGiveRecursive( xMutex );

- *

- *          // Now the mutex can be taken by other tasks.

- *      }

- *      else

- *      {

- *          // We could not obtain the mutex and can therefore not access

- *          // the shared resource safely.

- *      }

- *  }

- * }

- * @endcode

- * \defgroup xSemaphoreTakeRecursive xSemaphoreTakeRecursive

- * \ingroup Semaphores

- */

-#if ( configUSE_RECURSIVE_MUTEXES == 1 )

-    #define xSemaphoreTakeRecursive( xMutex, xBlockTime )    xQueueTakeMutexRecursive( ( xMutex ), ( xBlockTime ) )

-#endif

-

-/**

- * semphr. h

- * @code{c}

- * xSemaphoreGive( SemaphoreHandle_t xSemaphore );

- * @endcode

- *

- * <i>Macro</i> to release a semaphore.  The semaphore must have previously been

- * created with a call to xSemaphoreCreateBinary(), xSemaphoreCreateMutex() or

- * xSemaphoreCreateCounting(). and obtained using sSemaphoreTake().

- *

- * This macro must not be used from an ISR.  See xSemaphoreGiveFromISR () for

- * an alternative which can be used from an ISR.

- *

- * This macro must also not be used on semaphores created using

- * xSemaphoreCreateRecursiveMutex().

- *

- * @param xSemaphore A handle to the semaphore being released.  This is the

- * handle returned when the semaphore was created.

- *

- * @return pdTRUE if the semaphore was released.  pdFALSE if an error occurred.

- * Semaphores are implemented using queues.  An error can occur if there is

- * no space on the queue to post a message - indicating that the

- * semaphore was not first obtained correctly.

- *

- * Example usage:

- * @code{c}

- * SemaphoreHandle_t xSemaphore = NULL;

- *

- * void vATask( void * pvParameters )

- * {

- *  // Create the semaphore to guard a shared resource.

- *  xSemaphore = vSemaphoreCreateBinary();

- *

- *  if( xSemaphore != NULL )

- *  {

- *      if( xSemaphoreGive( xSemaphore ) != pdTRUE )

- *      {

- *          // We would expect this call to fail because we cannot give

- *          // a semaphore without first "taking" it!

- *      }

- *

- *      // Obtain the semaphore - don't block if the semaphore is not

- *      // immediately available.

- *      if( xSemaphoreTake( xSemaphore, ( TickType_t ) 0 ) )

- *      {

- *          // We now have the semaphore and can access the shared resource.

- *

- *          // ...

- *

- *          // We have finished accessing the shared resource so can free the

- *          // semaphore.

- *          if( xSemaphoreGive( xSemaphore ) != pdTRUE )

- *          {

- *              // We would not expect this call to fail because we must have

- *              // obtained the semaphore to get here.

- *          }

- *      }

- *  }

- * }

- * @endcode

- * \defgroup xSemaphoreGive xSemaphoreGive

- * \ingroup Semaphores

- */

-#define xSemaphoreGive( xSemaphore )    xQueueGenericSend( ( QueueHandle_t ) ( xSemaphore ), NULL, semGIVE_BLOCK_TIME, queueSEND_TO_BACK )

-

-/**

- * semphr. h

- * @code{c}

- * xSemaphoreGiveRecursive( SemaphoreHandle_t xMutex );

- * @endcode

- *

- * <i>Macro</i> to recursively release, or 'give', a mutex type semaphore.

- * The mutex must have previously been created using a call to

- * xSemaphoreCreateRecursiveMutex();

- *

- * configUSE_RECURSIVE_MUTEXES must be set to 1 in FreeRTOSConfig.h for this

- * macro to be available.

- *

- * This macro must not be used on mutexes created using xSemaphoreCreateMutex().

- *

- * A mutex used recursively can be 'taken' repeatedly by the owner. The mutex

- * doesn't become available again until the owner has called

- * xSemaphoreGiveRecursive() for each successful 'take' request.  For example,

- * if a task successfully 'takes' the same mutex 5 times then the mutex will

- * not be available to any other task until it has also  'given' the mutex back

- * exactly five times.

- *

- * @param xMutex A handle to the mutex being released, or 'given'.  This is the

- * handle returned by xSemaphoreCreateMutex();

- *

- * @return pdTRUE if the semaphore was given.

- *

- * Example usage:

- * @code{c}

- * SemaphoreHandle_t xMutex = NULL;

- *

- * // A task that creates a mutex.

- * void vATask( void * pvParameters )

- * {

- *  // Create the mutex to guard a shared resource.

- *  xMutex = xSemaphoreCreateRecursiveMutex();

- * }

- *

- * // A task that uses the mutex.

- * void vAnotherTask( void * pvParameters )

- * {

- *  // ... Do other things.

- *

- *  if( xMutex != NULL )

- *  {

- *      // See if we can obtain the mutex.  If the mutex is not available

- *      // wait 10 ticks to see if it becomes free.

- *      if( xSemaphoreTakeRecursive( xMutex, ( TickType_t ) 10 ) == pdTRUE )

- *      {

- *          // We were able to obtain the mutex and can now access the

- *          // shared resource.

- *

- *          // ...

- *          // For some reason due to the nature of the code further calls to

- *          // xSemaphoreTakeRecursive() are made on the same mutex.  In real

- *          // code these would not be just sequential calls as this would make

- *          // no sense.  Instead the calls are likely to be buried inside

- *          // a more complex call structure.

- *          xSemaphoreTakeRecursive( xMutex, ( TickType_t ) 10 );

- *          xSemaphoreTakeRecursive( xMutex, ( TickType_t ) 10 );

- *

- *          // The mutex has now been 'taken' three times, so will not be

- *          // available to another task until it has also been given back

- *          // three times.  Again it is unlikely that real code would have

- *          // these calls sequentially, it would be more likely that the calls

- *          // to xSemaphoreGiveRecursive() would be called as a call stack

- *          // unwound.  This is just for demonstrative purposes.

- *          xSemaphoreGiveRecursive( xMutex );

- *          xSemaphoreGiveRecursive( xMutex );

- *          xSemaphoreGiveRecursive( xMutex );

- *

- *          // Now the mutex can be taken by other tasks.

- *      }

- *      else

- *      {

- *          // We could not obtain the mutex and can therefore not access

- *          // the shared resource safely.

- *      }

- *  }

- * }

- * @endcode

- * \defgroup xSemaphoreGiveRecursive xSemaphoreGiveRecursive

- * \ingroup Semaphores

- */

-#if ( configUSE_RECURSIVE_MUTEXES == 1 )

-    #define xSemaphoreGiveRecursive( xMutex )    xQueueGiveMutexRecursive( ( xMutex ) )

-#endif

-

-/**

- * semphr. h

- * @code{c}

- * xSemaphoreGiveFromISR(

- *                        SemaphoreHandle_t xSemaphore,

- *                        BaseType_t *pxHigherPriorityTaskWoken

- *                    );

- * @endcode

- *

- * <i>Macro</i> to  release a semaphore.  The semaphore must have previously been

- * created with a call to xSemaphoreCreateBinary() or xSemaphoreCreateCounting().

- *

- * Mutex type semaphores (those created using a call to xSemaphoreCreateMutex())

- * must not be used with this macro.

- *

- * This macro can be used from an ISR.

- *

- * @param xSemaphore A handle to the semaphore being released.  This is the

- * handle returned when the semaphore was created.

- *

- * @param pxHigherPriorityTaskWoken xSemaphoreGiveFromISR() will set

- * *pxHigherPriorityTaskWoken to pdTRUE if giving the semaphore caused a task

- * to unblock, and the unblocked task has a priority higher than the currently

- * running task.  If xSemaphoreGiveFromISR() sets this value to pdTRUE then

- * a context switch should be requested before the interrupt is exited.

- *

- * @return pdTRUE if the semaphore was successfully given, otherwise errQUEUE_FULL.

- *

- * Example usage:

- * @code{c}

- \#define LONG_TIME 0xffff

- \#define TICKS_TO_WAIT 10

- * SemaphoreHandle_t xSemaphore = NULL;

- *

- * // Repetitive task.

- * void vATask( void * pvParameters )

- * {

- *  for( ;; )

- *  {

- *      // We want this task to run every 10 ticks of a timer.  The semaphore

- *      // was created before this task was started.

- *

- *      // Block waiting for the semaphore to become available.

- *      if( xSemaphoreTake( xSemaphore, LONG_TIME ) == pdTRUE )

- *      {

- *          // It is time to execute.

- *

- *          // ...

- *

- *          // We have finished our task.  Return to the top of the loop where

- *          // we will block on the semaphore until it is time to execute

- *          // again.  Note when using the semaphore for synchronisation with an

- *          // ISR in this manner there is no need to 'give' the semaphore back.

- *      }

- *  }

- * }

- *

- * // Timer ISR

- * void vTimerISR( void * pvParameters )

- * {

- * static uint8_t ucLocalTickCount = 0;

- * static BaseType_t xHigherPriorityTaskWoken;

- *

- *  // A timer tick has occurred.

- *

- *  // ... Do other time functions.

- *

- *  // Is it time for vATask () to run?

- *  xHigherPriorityTaskWoken = pdFALSE;

- *  ucLocalTickCount++;

- *  if( ucLocalTickCount >= TICKS_TO_WAIT )

- *  {

- *      // Unblock the task by releasing the semaphore.

- *      xSemaphoreGiveFromISR( xSemaphore, &xHigherPriorityTaskWoken );

- *

- *      // Reset the count so we release the semaphore again in 10 ticks time.

- *      ucLocalTickCount = 0;

- *  }

- *

- *  if( xHigherPriorityTaskWoken != pdFALSE )

- *  {

- *      // We can force a context switch here.  Context switching from an

- *      // ISR uses port specific syntax.  Check the demo task for your port

- *      // to find the syntax required.

- *  }

- * }

- * @endcode

- * \defgroup xSemaphoreGiveFromISR xSemaphoreGiveFromISR

- * \ingroup Semaphores

- */

-#define xSemaphoreGiveFromISR( xSemaphore, pxHigherPriorityTaskWoken )    xQueueGiveFromISR( ( QueueHandle_t ) ( xSemaphore ), ( pxHigherPriorityTaskWoken ) )

-

-/**

- * semphr. h

- * @code{c}

- * xSemaphoreTakeFromISR(

- *                        SemaphoreHandle_t xSemaphore,

- *                        BaseType_t *pxHigherPriorityTaskWoken

- *                    );

- * @endcode

- *

- * <i>Macro</i> to  take a semaphore from an ISR.  The semaphore must have

- * previously been created with a call to xSemaphoreCreateBinary() or

- * xSemaphoreCreateCounting().

- *

- * Mutex type semaphores (those created using a call to xSemaphoreCreateMutex())

- * must not be used with this macro.

- *

- * This macro can be used from an ISR, however taking a semaphore from an ISR

- * is not a common operation.  It is likely to only be useful when taking a

- * counting semaphore when an interrupt is obtaining an object from a resource

- * pool (when the semaphore count indicates the number of resources available).

- *

- * @param xSemaphore A handle to the semaphore being taken.  This is the

- * handle returned when the semaphore was created.

- *

- * @param pxHigherPriorityTaskWoken xSemaphoreTakeFromISR() will set

- * *pxHigherPriorityTaskWoken to pdTRUE if taking the semaphore caused a task

- * to unblock, and the unblocked task has a priority higher than the currently

- * running task.  If xSemaphoreTakeFromISR() sets this value to pdTRUE then

- * a context switch should be requested before the interrupt is exited.

- *

- * @return pdTRUE if the semaphore was successfully taken, otherwise

- * pdFALSE

- */

-#define xSemaphoreTakeFromISR( xSemaphore, pxHigherPriorityTaskWoken )    xQueueReceiveFromISR( ( QueueHandle_t ) ( xSemaphore ), NULL, ( pxHigherPriorityTaskWoken ) )

-

-/**

- * semphr. h

- * @code{c}

- * SemaphoreHandle_t xSemaphoreCreateMutex( void );

- * @endcode

- *

- * Creates a new mutex type semaphore instance, and returns a handle by which

- * the new mutex can be referenced.

- *

- * Internally, within the FreeRTOS implementation, mutex semaphores use a block

- * of memory, in which the mutex structure is stored.  If a mutex is created

- * using xSemaphoreCreateMutex() then the required memory is automatically

- * dynamically allocated inside the xSemaphoreCreateMutex() function.  (see

- * https://www.FreeRTOS.org/a00111.html).  If a mutex is created using

- * xSemaphoreCreateMutexStatic() then the application writer must provided the

- * memory.  xSemaphoreCreateMutexStatic() therefore allows a mutex to be created

- * without using any dynamic memory allocation.

- *

- * Mutexes created using this function can be accessed using the xSemaphoreTake()

- * and xSemaphoreGive() macros.  The xSemaphoreTakeRecursive() and

- * xSemaphoreGiveRecursive() macros must not be used.

- *

- * This type of semaphore uses a priority inheritance mechanism so a task

- * 'taking' a semaphore MUST ALWAYS 'give' the semaphore back once the

- * semaphore it is no longer required.

- *

- * Mutex type semaphores cannot be used from within interrupt service routines.

- *

- * See xSemaphoreCreateBinary() for an alternative implementation that can be

- * used for pure synchronisation (where one task or interrupt always 'gives' the

- * semaphore and another always 'takes' the semaphore) and from within interrupt

- * service routines.

- *

- * @return If the mutex was successfully created then a handle to the created

- * semaphore is returned.  If there was not enough heap to allocate the mutex

- * data structures then NULL is returned.

- *

- * Example usage:

- * @code{c}

- * SemaphoreHandle_t xSemaphore;

- *

- * void vATask( void * pvParameters )

- * {

- *  // Semaphore cannot be used before a call to xSemaphoreCreateMutex().

- *  // This is a macro so pass the variable in directly.

- *  xSemaphore = xSemaphoreCreateMutex();

- *

- *  if( xSemaphore != NULL )

- *  {

- *      // The semaphore was created successfully.

- *      // The semaphore can now be used.

- *  }

- * }

- * @endcode

- * \defgroup xSemaphoreCreateMutex xSemaphoreCreateMutex

- * \ingroup Semaphores

- */

-#if ( ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) && ( configUSE_MUTEXES == 1 ) )

-    #define xSemaphoreCreateMutex()    xQueueCreateMutex( queueQUEUE_TYPE_MUTEX )

-#endif

-

-/**

- * semphr. h

- * @code{c}

- * SemaphoreHandle_t xSemaphoreCreateMutexStatic( StaticSemaphore_t *pxMutexBuffer );

- * @endcode

- *

- * Creates a new mutex type semaphore instance, and returns a handle by which

- * the new mutex can be referenced.

- *

- * Internally, within the FreeRTOS implementation, mutex semaphores use a block

- * of memory, in which the mutex structure is stored.  If a mutex is created

- * using xSemaphoreCreateMutex() then the required memory is automatically

- * dynamically allocated inside the xSemaphoreCreateMutex() function.  (see

- * https://www.FreeRTOS.org/a00111.html).  If a mutex is created using

- * xSemaphoreCreateMutexStatic() then the application writer must provided the

- * memory.  xSemaphoreCreateMutexStatic() therefore allows a mutex to be created

- * without using any dynamic memory allocation.

- *

- * Mutexes created using this function can be accessed using the xSemaphoreTake()

- * and xSemaphoreGive() macros.  The xSemaphoreTakeRecursive() and

- * xSemaphoreGiveRecursive() macros must not be used.

- *

- * This type of semaphore uses a priority inheritance mechanism so a task

- * 'taking' a semaphore MUST ALWAYS 'give' the semaphore back once the

- * semaphore it is no longer required.

- *

- * Mutex type semaphores cannot be used from within interrupt service routines.

- *

- * See xSemaphoreCreateBinary() for an alternative implementation that can be

- * used for pure synchronisation (where one task or interrupt always 'gives' the

- * semaphore and another always 'takes' the semaphore) and from within interrupt

- * service routines.

- *

- * @param pxMutexBuffer Must point to a variable of type StaticSemaphore_t,

- * which will be used to hold the mutex's data structure, removing the need for

- * the memory to be allocated dynamically.

- *

- * @return If the mutex was successfully created then a handle to the created

- * mutex is returned.  If pxMutexBuffer was NULL then NULL is returned.

- *

- * Example usage:

- * @code{c}

- * SemaphoreHandle_t xSemaphore;

- * StaticSemaphore_t xMutexBuffer;

- *

- * void vATask( void * pvParameters )

- * {

- *  // A mutex cannot be used before it has been created.  xMutexBuffer is

- *  // into xSemaphoreCreateMutexStatic() so no dynamic memory allocation is

- *  // attempted.

- *  xSemaphore = xSemaphoreCreateMutexStatic( &xMutexBuffer );

- *

- *  // As no dynamic memory allocation was performed, xSemaphore cannot be NULL,

- *  // so there is no need to check it.

- * }

- * @endcode

- * \defgroup xSemaphoreCreateMutexStatic xSemaphoreCreateMutexStatic

- * \ingroup Semaphores

- */

-#if ( ( configSUPPORT_STATIC_ALLOCATION == 1 ) && ( configUSE_MUTEXES == 1 ) )

-    #define xSemaphoreCreateMutexStatic( pxMutexBuffer )    xQueueCreateMutexStatic( queueQUEUE_TYPE_MUTEX, ( pxMutexBuffer ) )

-#endif

-

-

-/**

- * semphr. h

- * @code{c}

- * SemaphoreHandle_t xSemaphoreCreateRecursiveMutex( void );

- * @endcode

- *

- * Creates a new recursive mutex type semaphore instance, and returns a handle

- * by which the new recursive mutex can be referenced.

- *

- * Internally, within the FreeRTOS implementation, recursive mutexes use a block

- * of memory, in which the mutex structure is stored.  If a recursive mutex is

- * created using xSemaphoreCreateRecursiveMutex() then the required memory is

- * automatically dynamically allocated inside the

- * xSemaphoreCreateRecursiveMutex() function.  (see

- * https://www.FreeRTOS.org/a00111.html).  If a recursive mutex is created using

- * xSemaphoreCreateRecursiveMutexStatic() then the application writer must

- * provide the memory that will get used by the mutex.

- * xSemaphoreCreateRecursiveMutexStatic() therefore allows a recursive mutex to

- * be created without using any dynamic memory allocation.

- *

- * Mutexes created using this macro can be accessed using the

- * xSemaphoreTakeRecursive() and xSemaphoreGiveRecursive() macros.  The

- * xSemaphoreTake() and xSemaphoreGive() macros must not be used.

- *

- * A mutex used recursively can be 'taken' repeatedly by the owner. The mutex

- * doesn't become available again until the owner has called

- * xSemaphoreGiveRecursive() for each successful 'take' request.  For example,

- * if a task successfully 'takes' the same mutex 5 times then the mutex will

- * not be available to any other task until it has also  'given' the mutex back

- * exactly five times.

- *

- * This type of semaphore uses a priority inheritance mechanism so a task

- * 'taking' a semaphore MUST ALWAYS 'give' the semaphore back once the

- * semaphore it is no longer required.

- *

- * Mutex type semaphores cannot be used from within interrupt service routines.

- *

- * See xSemaphoreCreateBinary() for an alternative implementation that can be

- * used for pure synchronisation (where one task or interrupt always 'gives' the

- * semaphore and another always 'takes' the semaphore) and from within interrupt

- * service routines.

- *

- * @return xSemaphore Handle to the created mutex semaphore.  Should be of type

- * SemaphoreHandle_t.

- *

- * Example usage:

- * @code{c}

- * SemaphoreHandle_t xSemaphore;

- *

- * void vATask( void * pvParameters )

- * {

- *  // Semaphore cannot be used before a call to xSemaphoreCreateMutex().

- *  // This is a macro so pass the variable in directly.

- *  xSemaphore = xSemaphoreCreateRecursiveMutex();

- *

- *  if( xSemaphore != NULL )

- *  {

- *      // The semaphore was created successfully.

- *      // The semaphore can now be used.

- *  }

- * }

- * @endcode

- * \defgroup xSemaphoreCreateRecursiveMutex xSemaphoreCreateRecursiveMutex

- * \ingroup Semaphores

- */

-#if ( ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) && ( configUSE_RECURSIVE_MUTEXES == 1 ) )

-    #define xSemaphoreCreateRecursiveMutex()    xQueueCreateMutex( queueQUEUE_TYPE_RECURSIVE_MUTEX )

-#endif

-

-/**

- * semphr. h

- * @code{c}

- * SemaphoreHandle_t xSemaphoreCreateRecursiveMutexStatic( StaticSemaphore_t *pxMutexBuffer );

- * @endcode

- *

- * Creates a new recursive mutex type semaphore instance, and returns a handle

- * by which the new recursive mutex can be referenced.

- *

- * Internally, within the FreeRTOS implementation, recursive mutexes use a block

- * of memory, in which the mutex structure is stored.  If a recursive mutex is

- * created using xSemaphoreCreateRecursiveMutex() then the required memory is

- * automatically dynamically allocated inside the

- * xSemaphoreCreateRecursiveMutex() function.  (see

- * https://www.FreeRTOS.org/a00111.html).  If a recursive mutex is created using

- * xSemaphoreCreateRecursiveMutexStatic() then the application writer must

- * provide the memory that will get used by the mutex.

- * xSemaphoreCreateRecursiveMutexStatic() therefore allows a recursive mutex to

- * be created without using any dynamic memory allocation.

- *

- * Mutexes created using this macro can be accessed using the

- * xSemaphoreTakeRecursive() and xSemaphoreGiveRecursive() macros.  The

- * xSemaphoreTake() and xSemaphoreGive() macros must not be used.

- *

- * A mutex used recursively can be 'taken' repeatedly by the owner. The mutex

- * doesn't become available again until the owner has called

- * xSemaphoreGiveRecursive() for each successful 'take' request.  For example,

- * if a task successfully 'takes' the same mutex 5 times then the mutex will

- * not be available to any other task until it has also  'given' the mutex back

- * exactly five times.

- *

- * This type of semaphore uses a priority inheritance mechanism so a task

- * 'taking' a semaphore MUST ALWAYS 'give' the semaphore back once the

- * semaphore it is no longer required.

- *

- * Mutex type semaphores cannot be used from within interrupt service routines.

- *

- * See xSemaphoreCreateBinary() for an alternative implementation that can be

- * used for pure synchronisation (where one task or interrupt always 'gives' the

- * semaphore and another always 'takes' the semaphore) and from within interrupt

- * service routines.

- *

- * @param pxMutexBuffer Must point to a variable of type StaticSemaphore_t,

- * which will then be used to hold the recursive mutex's data structure,

- * removing the need for the memory to be allocated dynamically.

- *

- * @return If the recursive mutex was successfully created then a handle to the

- * created recursive mutex is returned.  If pxMutexBuffer was NULL then NULL is

- * returned.

- *

- * Example usage:

- * @code{c}

- * SemaphoreHandle_t xSemaphore;

- * StaticSemaphore_t xMutexBuffer;

- *

- * void vATask( void * pvParameters )

- * {

- *  // A recursive semaphore cannot be used before it is created.  Here a

- *  // recursive mutex is created using xSemaphoreCreateRecursiveMutexStatic().

- *  // The address of xMutexBuffer is passed into the function, and will hold

- *  // the mutexes data structures - so no dynamic memory allocation will be

- *  // attempted.

- *  xSemaphore = xSemaphoreCreateRecursiveMutexStatic( &xMutexBuffer );

- *

- *  // As no dynamic memory allocation was performed, xSemaphore cannot be NULL,

- *  // so there is no need to check it.

- * }

- * @endcode

- * \defgroup xSemaphoreCreateRecursiveMutexStatic xSemaphoreCreateRecursiveMutexStatic

- * \ingroup Semaphores

- */

-#if ( ( configSUPPORT_STATIC_ALLOCATION == 1 ) && ( configUSE_RECURSIVE_MUTEXES == 1 ) )

-    #define xSemaphoreCreateRecursiveMutexStatic( pxStaticSemaphore )    xQueueCreateMutexStatic( queueQUEUE_TYPE_RECURSIVE_MUTEX, ( pxStaticSemaphore ) )

-#endif /* configSUPPORT_STATIC_ALLOCATION */

-

-/**

- * semphr. h

- * @code{c}

- * SemaphoreHandle_t xSemaphoreCreateCounting( UBaseType_t uxMaxCount, UBaseType_t uxInitialCount );

- * @endcode

- *

- * Creates a new counting semaphore instance, and returns a handle by which the

- * new counting semaphore can be referenced.

- *

- * In many usage scenarios it is faster and more memory efficient to use a

- * direct to task notification in place of a counting semaphore!

- * https://www.FreeRTOS.org/RTOS-task-notifications.html

- *

- * Internally, within the FreeRTOS implementation, counting semaphores use a

- * block of memory, in which the counting semaphore structure is stored.  If a

- * counting semaphore is created using xSemaphoreCreateCounting() then the

- * required memory is automatically dynamically allocated inside the

- * xSemaphoreCreateCounting() function.  (see

- * https://www.FreeRTOS.org/a00111.html).  If a counting semaphore is created

- * using xSemaphoreCreateCountingStatic() then the application writer can

- * instead optionally provide the memory that will get used by the counting

- * semaphore.  xSemaphoreCreateCountingStatic() therefore allows a counting

- * semaphore to be created without using any dynamic memory allocation.

- *

- * Counting semaphores are typically used for two things:

- *

- * 1) Counting events.

- *

- *    In this usage scenario an event handler will 'give' a semaphore each time

- *    an event occurs (incrementing the semaphore count value), and a handler

- *    task will 'take' a semaphore each time it processes an event

- *    (decrementing the semaphore count value).  The count value is therefore

- *    the difference between the number of events that have occurred and the

- *    number that have been processed.  In this case it is desirable for the

- *    initial count value to be zero.

- *

- * 2) Resource management.

- *

- *    In this usage scenario the count value indicates the number of resources

- *    available.  To obtain control of a resource a task must first obtain a

- *    semaphore - decrementing the semaphore count value.  When the count value

- *    reaches zero there are no free resources.  When a task finishes with the

- *    resource it 'gives' the semaphore back - incrementing the semaphore count

- *    value.  In this case it is desirable for the initial count value to be

- *    equal to the maximum count value, indicating that all resources are free.

- *

- * @param uxMaxCount The maximum count value that can be reached.  When the

- *        semaphore reaches this value it can no longer be 'given'.

- *

- * @param uxInitialCount The count value assigned to the semaphore when it is

- *        created.

- *

- * @return Handle to the created semaphore.  Null if the semaphore could not be

- *         created.

- *

- * Example usage:

- * @code{c}

- * SemaphoreHandle_t xSemaphore;

- *

- * void vATask( void * pvParameters )

- * {

- * SemaphoreHandle_t xSemaphore = NULL;

- *

- *  // Semaphore cannot be used before a call to xSemaphoreCreateCounting().

- *  // The max value to which the semaphore can count should be 10, and the

- *  // initial value assigned to the count should be 0.

- *  xSemaphore = xSemaphoreCreateCounting( 10, 0 );

- *

- *  if( xSemaphore != NULL )

- *  {

- *      // The semaphore was created successfully.

- *      // The semaphore can now be used.

- *  }

- * }

- * @endcode

- * \defgroup xSemaphoreCreateCounting xSemaphoreCreateCounting

- * \ingroup Semaphores

- */

-#if ( configSUPPORT_DYNAMIC_ALLOCATION == 1 )

-    #define xSemaphoreCreateCounting( uxMaxCount, uxInitialCount )    xQueueCreateCountingSemaphore( ( uxMaxCount ), ( uxInitialCount ) )

-#endif

-

-/**

- * semphr. h

- * @code{c}

- * SemaphoreHandle_t xSemaphoreCreateCountingStatic( UBaseType_t uxMaxCount, UBaseType_t uxInitialCount, StaticSemaphore_t *pxSemaphoreBuffer );

- * @endcode

- *

- * Creates a new counting semaphore instance, and returns a handle by which the

- * new counting semaphore can be referenced.

- *

- * In many usage scenarios it is faster and more memory efficient to use a

- * direct to task notification in place of a counting semaphore!

- * https://www.FreeRTOS.org/RTOS-task-notifications.html

- *

- * Internally, within the FreeRTOS implementation, counting semaphores use a

- * block of memory, in which the counting semaphore structure is stored.  If a

- * counting semaphore is created using xSemaphoreCreateCounting() then the

- * required memory is automatically dynamically allocated inside the

- * xSemaphoreCreateCounting() function.  (see

- * https://www.FreeRTOS.org/a00111.html).  If a counting semaphore is created

- * using xSemaphoreCreateCountingStatic() then the application writer must

- * provide the memory.  xSemaphoreCreateCountingStatic() therefore allows a

- * counting semaphore to be created without using any dynamic memory allocation.

- *

- * Counting semaphores are typically used for two things:

- *

- * 1) Counting events.

- *

- *    In this usage scenario an event handler will 'give' a semaphore each time

- *    an event occurs (incrementing the semaphore count value), and a handler

- *    task will 'take' a semaphore each time it processes an event

- *    (decrementing the semaphore count value).  The count value is therefore

- *    the difference between the number of events that have occurred and the

- *    number that have been processed.  In this case it is desirable for the

- *    initial count value to be zero.

- *

- * 2) Resource management.

- *

- *    In this usage scenario the count value indicates the number of resources

- *    available.  To obtain control of a resource a task must first obtain a

- *    semaphore - decrementing the semaphore count value.  When the count value

- *    reaches zero there are no free resources.  When a task finishes with the

- *    resource it 'gives' the semaphore back - incrementing the semaphore count

- *    value.  In this case it is desirable for the initial count value to be

- *    equal to the maximum count value, indicating that all resources are free.

- *

- * @param uxMaxCount The maximum count value that can be reached.  When the

- *        semaphore reaches this value it can no longer be 'given'.

- *

- * @param uxInitialCount The count value assigned to the semaphore when it is

- *        created.

- *

- * @param pxSemaphoreBuffer Must point to a variable of type StaticSemaphore_t,

- * which will then be used to hold the semaphore's data structure, removing the

- * need for the memory to be allocated dynamically.

- *

- * @return If the counting semaphore was successfully created then a handle to

- * the created counting semaphore is returned.  If pxSemaphoreBuffer was NULL

- * then NULL is returned.

- *

- * Example usage:

- * @code{c}

- * SemaphoreHandle_t xSemaphore;

- * StaticSemaphore_t xSemaphoreBuffer;

- *

- * void vATask( void * pvParameters )

- * {

- * SemaphoreHandle_t xSemaphore = NULL;

- *

- *  // Counting semaphore cannot be used before they have been created.  Create

- *  // a counting semaphore using xSemaphoreCreateCountingStatic().  The max

- *  // value to which the semaphore can count is 10, and the initial value

- *  // assigned to the count will be 0.  The address of xSemaphoreBuffer is

- *  // passed in and will be used to hold the semaphore structure, so no dynamic

- *  // memory allocation will be used.

- *  xSemaphore = xSemaphoreCreateCounting( 10, 0, &xSemaphoreBuffer );

- *

- *  // No memory allocation was attempted so xSemaphore cannot be NULL, so there

- *  // is no need to check its value.

- * }

- * @endcode

- * \defgroup xSemaphoreCreateCountingStatic xSemaphoreCreateCountingStatic

- * \ingroup Semaphores

- */

-#if ( configSUPPORT_STATIC_ALLOCATION == 1 )

-    #define xSemaphoreCreateCountingStatic( uxMaxCount, uxInitialCount, pxSemaphoreBuffer )    xQueueCreateCountingSemaphoreStatic( ( uxMaxCount ), ( uxInitialCount ), ( pxSemaphoreBuffer ) )

-#endif /* configSUPPORT_STATIC_ALLOCATION */

-

-/**

- * semphr. h

- * @code{c}

- * void vSemaphoreDelete( SemaphoreHandle_t xSemaphore );

- * @endcode

- *

- * Delete a semaphore.  This function must be used with care.  For example,

- * do not delete a mutex type semaphore if the mutex is held by a task.

- *

- * @param xSemaphore A handle to the semaphore to be deleted.

- *

- * \defgroup vSemaphoreDelete vSemaphoreDelete

- * \ingroup Semaphores

- */

-#define vSemaphoreDelete( xSemaphore )    vQueueDelete( ( QueueHandle_t ) ( xSemaphore ) )

-

-/**

- * semphr.h

- * @code{c}

- * TaskHandle_t xSemaphoreGetMutexHolder( SemaphoreHandle_t xMutex );

- * @endcode

- *

- * If xMutex is indeed a mutex type semaphore, return the current mutex holder.

- * If xMutex is not a mutex type semaphore, or the mutex is available (not held

- * by a task), return NULL.

- *

- * Note: This is a good way of determining if the calling task is the mutex

- * holder, but not a good way of determining the identity of the mutex holder as

- * the holder may change between the function exiting and the returned value

- * being tested.

- */

-#if ( ( configUSE_MUTEXES == 1 ) && ( INCLUDE_xSemaphoreGetMutexHolder == 1 ) )

-    #define xSemaphoreGetMutexHolder( xSemaphore )    xQueueGetMutexHolder( ( xSemaphore ) )

-#endif

-

-/**

- * semphr.h

- * @code{c}

- * TaskHandle_t xSemaphoreGetMutexHolderFromISR( SemaphoreHandle_t xMutex );

- * @endcode

- *

- * If xMutex is indeed a mutex type semaphore, return the current mutex holder.

- * If xMutex is not a mutex type semaphore, or the mutex is available (not held

- * by a task), return NULL.

- *

- */

-#if ( ( configUSE_MUTEXES == 1 ) && ( INCLUDE_xSemaphoreGetMutexHolder == 1 ) )

-    #define xSemaphoreGetMutexHolderFromISR( xSemaphore )    xQueueGetMutexHolderFromISR( ( xSemaphore ) )

-#endif

-

-/**

- * semphr.h

- * @code{c}

- * UBaseType_t uxSemaphoreGetCount( SemaphoreHandle_t xSemaphore );

- * @endcode

- *

- * If the semaphore is a counting semaphore then uxSemaphoreGetCount() returns

- * its current count value.  If the semaphore is a binary semaphore then

- * uxSemaphoreGetCount() returns 1 if the semaphore is available, and 0 if the

- * semaphore is not available.

- *

- */

-#define uxSemaphoreGetCount( xSemaphore )           uxQueueMessagesWaiting( ( QueueHandle_t ) ( xSemaphore ) )

-

-/**

- * semphr.h

- * @code{c}

- * UBaseType_t uxSemaphoreGetCountFromISR( SemaphoreHandle_t xSemaphore );

- * @endcode

- *

- * If the semaphore is a counting semaphore then uxSemaphoreGetCountFromISR() returns

- * its current count value.  If the semaphore is a binary semaphore then

- * uxSemaphoreGetCountFromISR() returns 1 if the semaphore is available, and 0 if the

- * semaphore is not available.

- *

- */

-#define uxSemaphoreGetCountFromISR( xSemaphore )    uxQueueMessagesWaitingFromISR( ( QueueHandle_t ) ( xSemaphore ) )

-

-#endif /* SEMAPHORE_H */

+/*
+ * FreeRTOS Kernel <DEVELOPMENT BRANCH>
+ * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.
+ *
+ * SPDX-License-Identifier: MIT
+ *
+ * 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.
+ *
+ * https://www.FreeRTOS.org
+ * https://github.com/FreeRTOS
+ *
+ */
+
+#ifndef SEMAPHORE_H
+#define SEMAPHORE_H
+
+#ifndef INC_FREERTOS_H
+    #error "include FreeRTOS.h" must appear in source files before "include semphr.h"
+#endif
+
+#include "queue.h"
+
+typedef QueueHandle_t SemaphoreHandle_t;
+
+#define semBINARY_SEMAPHORE_QUEUE_LENGTH    ( ( uint8_t ) 1U )
+#define semSEMAPHORE_QUEUE_ITEM_LENGTH      ( ( uint8_t ) 0U )
+#define semGIVE_BLOCK_TIME                  ( ( TickType_t ) 0U )
+
+
+/**
+ * semphr. h
+ * @code{c}
+ * vSemaphoreCreateBinary( SemaphoreHandle_t xSemaphore );
+ * @endcode
+ *
+ * In many usage scenarios it is faster and more memory efficient to use a
+ * direct to task notification in place of a binary semaphore!
+ * https://www.FreeRTOS.org/RTOS-task-notifications.html
+ *
+ * This old vSemaphoreCreateBinary() macro is now deprecated in favour of the
+ * xSemaphoreCreateBinary() function.  Note that binary semaphores created using
+ * the vSemaphoreCreateBinary() macro are created in a state such that the
+ * first call to 'take' the semaphore would pass, whereas binary semaphores
+ * created using xSemaphoreCreateBinary() are created in a state such that the
+ * the semaphore must first be 'given' before it can be 'taken'.
+ *
+ * <i>Macro</i> that implements a semaphore by using the existing queue mechanism.
+ * The queue length is 1 as this is a binary semaphore.  The data size is 0
+ * as we don't want to actually store any data - we just want to know if the
+ * queue is empty or full.
+ *
+ * This type of semaphore can be used for pure synchronisation between tasks or
+ * between an interrupt and a task.  The semaphore need not be given back once
+ * obtained, so one task/interrupt can continuously 'give' the semaphore while
+ * another continuously 'takes' the semaphore.  For this reason this type of
+ * semaphore does not use a priority inheritance mechanism.  For an alternative
+ * that does use priority inheritance see xSemaphoreCreateMutex().
+ *
+ * @param xSemaphore Handle to the created semaphore.  Should be of type SemaphoreHandle_t.
+ *
+ * Example usage:
+ * @code{c}
+ * SemaphoreHandle_t xSemaphore = NULL;
+ *
+ * void vATask( void * pvParameters )
+ * {
+ *  // Semaphore cannot be used before a call to vSemaphoreCreateBinary ().
+ *  // This is a macro so pass the variable in directly.
+ *  vSemaphoreCreateBinary( xSemaphore );
+ *
+ *  if( xSemaphore != NULL )
+ *  {
+ *      // The semaphore was created successfully.
+ *      // The semaphore can now be used.
+ *  }
+ * }
+ * @endcode
+ * \defgroup vSemaphoreCreateBinary vSemaphoreCreateBinary
+ * \ingroup Semaphores
+ */
+#if ( configSUPPORT_DYNAMIC_ALLOCATION == 1 )
+    #define vSemaphoreCreateBinary( xSemaphore )                                                                                     \
+    {                                                                                                                                \
+        ( xSemaphore ) = xQueueGenericCreate( ( UBaseType_t ) 1, semSEMAPHORE_QUEUE_ITEM_LENGTH, queueQUEUE_TYPE_BINARY_SEMAPHORE ); \
+        if( ( xSemaphore ) != NULL )                                                                                                 \
+        {                                                                                                                            \
+            ( void ) xSemaphoreGive( ( xSemaphore ) );                                                                               \
+        }                                                                                                                            \
+    }
+#endif
+
+/**
+ * semphr. h
+ * @code{c}
+ * SemaphoreHandle_t xSemaphoreCreateBinary( void );
+ * @endcode
+ *
+ * Creates a new binary semaphore instance, and returns a handle by which the
+ * new semaphore can be referenced.
+ *
+ * In many usage scenarios it is faster and more memory efficient to use a
+ * direct to task notification in place of a binary semaphore!
+ * https://www.FreeRTOS.org/RTOS-task-notifications.html
+ *
+ * Internally, within the FreeRTOS implementation, binary semaphores use a block
+ * of memory, in which the semaphore structure is stored.  If a binary semaphore
+ * is created using xSemaphoreCreateBinary() then the required memory is
+ * automatically dynamically allocated inside the xSemaphoreCreateBinary()
+ * function.  (see https://www.FreeRTOS.org/a00111.html).  If a binary semaphore
+ * is created using xSemaphoreCreateBinaryStatic() then the application writer
+ * must provide the memory.  xSemaphoreCreateBinaryStatic() therefore allows a
+ * binary semaphore to be created without using any dynamic memory allocation.
+ *
+ * The old vSemaphoreCreateBinary() macro is now deprecated in favour of this
+ * xSemaphoreCreateBinary() function.  Note that binary semaphores created using
+ * the vSemaphoreCreateBinary() macro are created in a state such that the
+ * first call to 'take' the semaphore would pass, whereas binary semaphores
+ * created using xSemaphoreCreateBinary() are created in a state such that the
+ * the semaphore must first be 'given' before it can be 'taken'.
+ *
+ * This type of semaphore can be used for pure synchronisation between tasks or
+ * between an interrupt and a task.  The semaphore need not be given back once
+ * obtained, so one task/interrupt can continuously 'give' the semaphore while
+ * another continuously 'takes' the semaphore.  For this reason this type of
+ * semaphore does not use a priority inheritance mechanism.  For an alternative
+ * that does use priority inheritance see xSemaphoreCreateMutex().
+ *
+ * @return Handle to the created semaphore, or NULL if the memory required to
+ * hold the semaphore's data structures could not be allocated.
+ *
+ * Example usage:
+ * @code{c}
+ * SemaphoreHandle_t xSemaphore = NULL;
+ *
+ * void vATask( void * pvParameters )
+ * {
+ *  // Semaphore cannot be used before a call to xSemaphoreCreateBinary().
+ *  // This is a macro so pass the variable in directly.
+ *  xSemaphore = xSemaphoreCreateBinary();
+ *
+ *  if( xSemaphore != NULL )
+ *  {
+ *      // The semaphore was created successfully.
+ *      // The semaphore can now be used.
+ *  }
+ * }
+ * @endcode
+ * \defgroup xSemaphoreCreateBinary xSemaphoreCreateBinary
+ * \ingroup Semaphores
+ */
+#if ( configSUPPORT_DYNAMIC_ALLOCATION == 1 )
+    #define xSemaphoreCreateBinary()    xQueueGenericCreate( ( UBaseType_t ) 1, semSEMAPHORE_QUEUE_ITEM_LENGTH, queueQUEUE_TYPE_BINARY_SEMAPHORE )
+#endif
+
+/**
+ * semphr. h
+ * @code{c}
+ * SemaphoreHandle_t xSemaphoreCreateBinaryStatic( StaticSemaphore_t *pxSemaphoreBuffer );
+ * @endcode
+ *
+ * Creates a new binary semaphore instance, and returns a handle by which the
+ * new semaphore can be referenced.
+ *
+ * NOTE: In many usage scenarios it is faster and more memory efficient to use a
+ * direct to task notification in place of a binary semaphore!
+ * https://www.FreeRTOS.org/RTOS-task-notifications.html
+ *
+ * Internally, within the FreeRTOS implementation, binary semaphores use a block
+ * of memory, in which the semaphore structure is stored.  If a binary semaphore
+ * is created using xSemaphoreCreateBinary() then the required memory is
+ * automatically dynamically allocated inside the xSemaphoreCreateBinary()
+ * function.  (see https://www.FreeRTOS.org/a00111.html).  If a binary semaphore
+ * is created using xSemaphoreCreateBinaryStatic() then the application writer
+ * must provide the memory.  xSemaphoreCreateBinaryStatic() therefore allows a
+ * binary semaphore to be created without using any dynamic memory allocation.
+ *
+ * This type of semaphore can be used for pure synchronisation between tasks or
+ * between an interrupt and a task.  The semaphore need not be given back once
+ * obtained, so one task/interrupt can continuously 'give' the semaphore while
+ * another continuously 'takes' the semaphore.  For this reason this type of
+ * semaphore does not use a priority inheritance mechanism.  For an alternative
+ * that does use priority inheritance see xSemaphoreCreateMutex().
+ *
+ * @param pxSemaphoreBuffer Must point to a variable of type StaticSemaphore_t,
+ * which will then be used to hold the semaphore's data structure, removing the
+ * need for the memory to be allocated dynamically.
+ *
+ * @return If the semaphore is created then a handle to the created semaphore is
+ * returned.  If pxSemaphoreBuffer is NULL then NULL is returned.
+ *
+ * Example usage:
+ * @code{c}
+ * SemaphoreHandle_t xSemaphore = NULL;
+ * StaticSemaphore_t xSemaphoreBuffer;
+ *
+ * void vATask( void * pvParameters )
+ * {
+ *  // Semaphore cannot be used before a call to xSemaphoreCreateBinary().
+ *  // The semaphore's data structures will be placed in the xSemaphoreBuffer
+ *  // variable, the address of which is passed into the function.  The
+ *  // function's parameter is not NULL, so the function will not attempt any
+ *  // dynamic memory allocation, and therefore the function will not return
+ *  // return NULL.
+ *  xSemaphore = xSemaphoreCreateBinary( &xSemaphoreBuffer );
+ *
+ *  // Rest of task code goes here.
+ * }
+ * @endcode
+ * \defgroup xSemaphoreCreateBinaryStatic xSemaphoreCreateBinaryStatic
+ * \ingroup Semaphores
+ */
+#if ( configSUPPORT_STATIC_ALLOCATION == 1 )
+    #define xSemaphoreCreateBinaryStatic( pxStaticSemaphore )    xQueueGenericCreateStatic( ( UBaseType_t ) 1, semSEMAPHORE_QUEUE_ITEM_LENGTH, NULL, ( pxStaticSemaphore ), queueQUEUE_TYPE_BINARY_SEMAPHORE )
+#endif /* configSUPPORT_STATIC_ALLOCATION */
+
+/**
+ * semphr. h
+ * @code{c}
+ * xSemaphoreTake(
+ *                   SemaphoreHandle_t xSemaphore,
+ *                   TickType_t xBlockTime
+ *               );
+ * @endcode
+ *
+ * <i>Macro</i> to obtain a semaphore.  The semaphore must have previously been
+ * created with a call to xSemaphoreCreateBinary(), xSemaphoreCreateMutex() or
+ * xSemaphoreCreateCounting().
+ *
+ * @param xSemaphore A handle to the semaphore being taken - obtained when
+ * the semaphore was created.
+ *
+ * @param xBlockTime The time in ticks to wait for the semaphore to become
+ * available.  The macro portTICK_PERIOD_MS can be used to convert this to a
+ * real time.  A block time of zero can be used to poll the semaphore.  A block
+ * time of portMAX_DELAY can be used to block indefinitely (provided
+ * INCLUDE_vTaskSuspend is set to 1 in FreeRTOSConfig.h).
+ *
+ * @return pdTRUE if the semaphore was obtained.  pdFALSE
+ * if xBlockTime expired without the semaphore becoming available.
+ *
+ * Example usage:
+ * @code{c}
+ * SemaphoreHandle_t xSemaphore = NULL;
+ *
+ * // A task that creates a semaphore.
+ * void vATask( void * pvParameters )
+ * {
+ *  // Create the semaphore to guard a shared resource.
+ *  xSemaphore = xSemaphoreCreateBinary();
+ * }
+ *
+ * // A task that uses the semaphore.
+ * void vAnotherTask( void * pvParameters )
+ * {
+ *  // ... Do other things.
+ *
+ *  if( xSemaphore != NULL )
+ *  {
+ *      // See if we can obtain the semaphore.  If the semaphore is not available
+ *      // wait 10 ticks to see if it becomes free.
+ *      if( xSemaphoreTake( xSemaphore, ( TickType_t ) 10 ) == pdTRUE )
+ *      {
+ *          // We were able to obtain the semaphore and can now access the
+ *          // shared resource.
+ *
+ *          // ...
+ *
+ *          // We have finished accessing the shared resource.  Release the
+ *          // semaphore.
+ *          xSemaphoreGive( xSemaphore );
+ *      }
+ *      else
+ *      {
+ *          // We could not obtain the semaphore and can therefore not access
+ *          // the shared resource safely.
+ *      }
+ *  }
+ * }
+ * @endcode
+ * \defgroup xSemaphoreTake xSemaphoreTake
+ * \ingroup Semaphores
+ */
+#define xSemaphoreTake( xSemaphore, xBlockTime )    xQueueSemaphoreTake( ( xSemaphore ), ( xBlockTime ) )
+
+/**
+ * semphr. h
+ * @code{c}
+ * xSemaphoreTakeRecursive(
+ *                          SemaphoreHandle_t xMutex,
+ *                          TickType_t xBlockTime
+ *                        );
+ * @endcode
+ *
+ * <i>Macro</i> to recursively obtain, or 'take', a mutex type semaphore.
+ * The mutex must have previously been created using a call to
+ * xSemaphoreCreateRecursiveMutex();
+ *
+ * configUSE_RECURSIVE_MUTEXES must be set to 1 in FreeRTOSConfig.h for this
+ * macro to be available.
+ *
+ * This macro must not be used on mutexes created using xSemaphoreCreateMutex().
+ *
+ * A mutex used recursively can be 'taken' repeatedly by the owner. The mutex
+ * doesn't become available again until the owner has called
+ * xSemaphoreGiveRecursive() for each successful 'take' request.  For example,
+ * if a task successfully 'takes' the same mutex 5 times then the mutex will
+ * not be available to any other task until it has also  'given' the mutex back
+ * exactly five times.
+ *
+ * @param xMutex A handle to the mutex being obtained.  This is the
+ * handle returned by xSemaphoreCreateRecursiveMutex();
+ *
+ * @param xBlockTime The time in ticks to wait for the semaphore to become
+ * available.  The macro portTICK_PERIOD_MS can be used to convert this to a
+ * real time.  A block time of zero can be used to poll the semaphore.  If
+ * the task already owns the semaphore then xSemaphoreTakeRecursive() will
+ * return immediately no matter what the value of xBlockTime.
+ *
+ * @return pdTRUE if the semaphore was obtained.  pdFALSE if xBlockTime
+ * expired without the semaphore becoming available.
+ *
+ * Example usage:
+ * @code{c}
+ * SemaphoreHandle_t xMutex = NULL;
+ *
+ * // A task that creates a mutex.
+ * void vATask( void * pvParameters )
+ * {
+ *  // Create the mutex to guard a shared resource.
+ *  xMutex = xSemaphoreCreateRecursiveMutex();
+ * }
+ *
+ * // A task that uses the mutex.
+ * void vAnotherTask( void * pvParameters )
+ * {
+ *  // ... Do other things.
+ *
+ *  if( xMutex != NULL )
+ *  {
+ *      // See if we can obtain the mutex.  If the mutex is not available
+ *      // wait 10 ticks to see if it becomes free.
+ *      if( xSemaphoreTakeRecursive( xSemaphore, ( TickType_t ) 10 ) == pdTRUE )
+ *      {
+ *          // We were able to obtain the mutex and can now access the
+ *          // shared resource.
+ *
+ *          // ...
+ *          // For some reason due to the nature of the code further calls to
+ *          // xSemaphoreTakeRecursive() are made on the same mutex.  In real
+ *          // code these would not be just sequential calls as this would make
+ *          // no sense.  Instead the calls are likely to be buried inside
+ *          // a more complex call structure.
+ *          xSemaphoreTakeRecursive( xMutex, ( TickType_t ) 10 );
+ *          xSemaphoreTakeRecursive( xMutex, ( TickType_t ) 10 );
+ *
+ *          // The mutex has now been 'taken' three times, so will not be
+ *          // available to another task until it has also been given back
+ *          // three times.  Again it is unlikely that real code would have
+ *          // these calls sequentially, but instead buried in a more complex
+ *          // call structure.  This is just for illustrative purposes.
+ *          xSemaphoreGiveRecursive( xMutex );
+ *          xSemaphoreGiveRecursive( xMutex );
+ *          xSemaphoreGiveRecursive( xMutex );
+ *
+ *          // Now the mutex can be taken by other tasks.
+ *      }
+ *      else
+ *      {
+ *          // We could not obtain the mutex and can therefore not access
+ *          // the shared resource safely.
+ *      }
+ *  }
+ * }
+ * @endcode
+ * \defgroup xSemaphoreTakeRecursive xSemaphoreTakeRecursive
+ * \ingroup Semaphores
+ */
+#if ( configUSE_RECURSIVE_MUTEXES == 1 )
+    #define xSemaphoreTakeRecursive( xMutex, xBlockTime )    xQueueTakeMutexRecursive( ( xMutex ), ( xBlockTime ) )
+#endif
+
+/**
+ * semphr. h
+ * @code{c}
+ * xSemaphoreGive( SemaphoreHandle_t xSemaphore );
+ * @endcode
+ *
+ * <i>Macro</i> to release a semaphore.  The semaphore must have previously been
+ * created with a call to xSemaphoreCreateBinary(), xSemaphoreCreateMutex() or
+ * xSemaphoreCreateCounting(). and obtained using sSemaphoreTake().
+ *
+ * This macro must not be used from an ISR.  See xSemaphoreGiveFromISR () for
+ * an alternative which can be used from an ISR.
+ *
+ * This macro must also not be used on semaphores created using
+ * xSemaphoreCreateRecursiveMutex().
+ *
+ * @param xSemaphore A handle to the semaphore being released.  This is the
+ * handle returned when the semaphore was created.
+ *
+ * @return pdTRUE if the semaphore was released.  pdFALSE if an error occurred.
+ * Semaphores are implemented using queues.  An error can occur if there is
+ * no space on the queue to post a message - indicating that the
+ * semaphore was not first obtained correctly.
+ *
+ * Example usage:
+ * @code{c}
+ * SemaphoreHandle_t xSemaphore = NULL;
+ *
+ * void vATask( void * pvParameters )
+ * {
+ *  // Create the semaphore to guard a shared resource.
+ *  xSemaphore = vSemaphoreCreateBinary();
+ *
+ *  if( xSemaphore != NULL )
+ *  {
+ *      if( xSemaphoreGive( xSemaphore ) != pdTRUE )
+ *      {
+ *          // We would expect this call to fail because we cannot give
+ *          // a semaphore without first "taking" it!
+ *      }
+ *
+ *      // Obtain the semaphore - don't block if the semaphore is not
+ *      // immediately available.
+ *      if( xSemaphoreTake( xSemaphore, ( TickType_t ) 0 ) )
+ *      {
+ *          // We now have the semaphore and can access the shared resource.
+ *
+ *          // ...
+ *
+ *          // We have finished accessing the shared resource so can free the
+ *          // semaphore.
+ *          if( xSemaphoreGive( xSemaphore ) != pdTRUE )
+ *          {
+ *              // We would not expect this call to fail because we must have
+ *              // obtained the semaphore to get here.
+ *          }
+ *      }
+ *  }
+ * }
+ * @endcode
+ * \defgroup xSemaphoreGive xSemaphoreGive
+ * \ingroup Semaphores
+ */
+#define xSemaphoreGive( xSemaphore )    xQueueGenericSend( ( QueueHandle_t ) ( xSemaphore ), NULL, semGIVE_BLOCK_TIME, queueSEND_TO_BACK )
+
+/**
+ * semphr. h
+ * @code{c}
+ * xSemaphoreGiveRecursive( SemaphoreHandle_t xMutex );
+ * @endcode
+ *
+ * <i>Macro</i> to recursively release, or 'give', a mutex type semaphore.
+ * The mutex must have previously been created using a call to
+ * xSemaphoreCreateRecursiveMutex();
+ *
+ * configUSE_RECURSIVE_MUTEXES must be set to 1 in FreeRTOSConfig.h for this
+ * macro to be available.
+ *
+ * This macro must not be used on mutexes created using xSemaphoreCreateMutex().
+ *
+ * A mutex used recursively can be 'taken' repeatedly by the owner. The mutex
+ * doesn't become available again until the owner has called
+ * xSemaphoreGiveRecursive() for each successful 'take' request.  For example,
+ * if a task successfully 'takes' the same mutex 5 times then the mutex will
+ * not be available to any other task until it has also  'given' the mutex back
+ * exactly five times.
+ *
+ * @param xMutex A handle to the mutex being released, or 'given'.  This is the
+ * handle returned by xSemaphoreCreateMutex();
+ *
+ * @return pdTRUE if the semaphore was given.
+ *
+ * Example usage:
+ * @code{c}
+ * SemaphoreHandle_t xMutex = NULL;
+ *
+ * // A task that creates a mutex.
+ * void vATask( void * pvParameters )
+ * {
+ *  // Create the mutex to guard a shared resource.
+ *  xMutex = xSemaphoreCreateRecursiveMutex();
+ * }
+ *
+ * // A task that uses the mutex.
+ * void vAnotherTask( void * pvParameters )
+ * {
+ *  // ... Do other things.
+ *
+ *  if( xMutex != NULL )
+ *  {
+ *      // See if we can obtain the mutex.  If the mutex is not available
+ *      // wait 10 ticks to see if it becomes free.
+ *      if( xSemaphoreTakeRecursive( xMutex, ( TickType_t ) 10 ) == pdTRUE )
+ *      {
+ *          // We were able to obtain the mutex and can now access the
+ *          // shared resource.
+ *
+ *          // ...
+ *          // For some reason due to the nature of the code further calls to
+ *          // xSemaphoreTakeRecursive() are made on the same mutex.  In real
+ *          // code these would not be just sequential calls as this would make
+ *          // no sense.  Instead the calls are likely to be buried inside
+ *          // a more complex call structure.
+ *          xSemaphoreTakeRecursive( xMutex, ( TickType_t ) 10 );
+ *          xSemaphoreTakeRecursive( xMutex, ( TickType_t ) 10 );
+ *
+ *          // The mutex has now been 'taken' three times, so will not be
+ *          // available to another task until it has also been given back
+ *          // three times.  Again it is unlikely that real code would have
+ *          // these calls sequentially, it would be more likely that the calls
+ *          // to xSemaphoreGiveRecursive() would be called as a call stack
+ *          // unwound.  This is just for demonstrative purposes.
+ *          xSemaphoreGiveRecursive( xMutex );
+ *          xSemaphoreGiveRecursive( xMutex );
+ *          xSemaphoreGiveRecursive( xMutex );
+ *
+ *          // Now the mutex can be taken by other tasks.
+ *      }
+ *      else
+ *      {
+ *          // We could not obtain the mutex and can therefore not access
+ *          // the shared resource safely.
+ *      }
+ *  }
+ * }
+ * @endcode
+ * \defgroup xSemaphoreGiveRecursive xSemaphoreGiveRecursive
+ * \ingroup Semaphores
+ */
+#if ( configUSE_RECURSIVE_MUTEXES == 1 )
+    #define xSemaphoreGiveRecursive( xMutex )    xQueueGiveMutexRecursive( ( xMutex ) )
+#endif
+
+/**
+ * semphr. h
+ * @code{c}
+ * xSemaphoreGiveFromISR(
+ *                        SemaphoreHandle_t xSemaphore,
+ *                        BaseType_t *pxHigherPriorityTaskWoken
+ *                    );
+ * @endcode
+ *
+ * <i>Macro</i> to  release a semaphore.  The semaphore must have previously been
+ * created with a call to xSemaphoreCreateBinary() or xSemaphoreCreateCounting().
+ *
+ * Mutex type semaphores (those created using a call to xSemaphoreCreateMutex())
+ * must not be used with this macro.
+ *
+ * This macro can be used from an ISR.
+ *
+ * @param xSemaphore A handle to the semaphore being released.  This is the
+ * handle returned when the semaphore was created.
+ *
+ * @param pxHigherPriorityTaskWoken xSemaphoreGiveFromISR() will set
+ * *pxHigherPriorityTaskWoken to pdTRUE if giving the semaphore caused a task
+ * to unblock, and the unblocked task has a priority higher than the currently
+ * running task.  If xSemaphoreGiveFromISR() sets this value to pdTRUE then
+ * a context switch should be requested before the interrupt is exited.
+ *
+ * @return pdTRUE if the semaphore was successfully given, otherwise errQUEUE_FULL.
+ *
+ * Example usage:
+ * @code{c}
+ \#define LONG_TIME 0xffff
+ \#define TICKS_TO_WAIT 10
+ * SemaphoreHandle_t xSemaphore = NULL;
+ *
+ * // Repetitive task.
+ * void vATask( void * pvParameters )
+ * {
+ *  for( ;; )
+ *  {
+ *      // We want this task to run every 10 ticks of a timer.  The semaphore
+ *      // was created before this task was started.
+ *
+ *      // Block waiting for the semaphore to become available.
+ *      if( xSemaphoreTake( xSemaphore, LONG_TIME ) == pdTRUE )
+ *      {
+ *          // It is time to execute.
+ *
+ *          // ...
+ *
+ *          // We have finished our task.  Return to the top of the loop where
+ *          // we will block on the semaphore until it is time to execute
+ *          // again.  Note when using the semaphore for synchronisation with an
+ *          // ISR in this manner there is no need to 'give' the semaphore back.
+ *      }
+ *  }
+ * }
+ *
+ * // Timer ISR
+ * void vTimerISR( void * pvParameters )
+ * {
+ * static uint8_t ucLocalTickCount = 0;
+ * static BaseType_t xHigherPriorityTaskWoken;
+ *
+ *  // A timer tick has occurred.
+ *
+ *  // ... Do other time functions.
+ *
+ *  // Is it time for vATask () to run?
+ *  xHigherPriorityTaskWoken = pdFALSE;
+ *  ucLocalTickCount++;
+ *  if( ucLocalTickCount >= TICKS_TO_WAIT )
+ *  {
+ *      // Unblock the task by releasing the semaphore.
+ *      xSemaphoreGiveFromISR( xSemaphore, &xHigherPriorityTaskWoken );
+ *
+ *      // Reset the count so we release the semaphore again in 10 ticks time.
+ *      ucLocalTickCount = 0;
+ *  }
+ *
+ *  if( xHigherPriorityTaskWoken != pdFALSE )
+ *  {
+ *      // We can force a context switch here.  Context switching from an
+ *      // ISR uses port specific syntax.  Check the demo task for your port
+ *      // to find the syntax required.
+ *  }
+ * }
+ * @endcode
+ * \defgroup xSemaphoreGiveFromISR xSemaphoreGiveFromISR
+ * \ingroup Semaphores
+ */
+#define xSemaphoreGiveFromISR( xSemaphore, pxHigherPriorityTaskWoken )    xQueueGiveFromISR( ( QueueHandle_t ) ( xSemaphore ), ( pxHigherPriorityTaskWoken ) )
+
+/**
+ * semphr. h
+ * @code{c}
+ * xSemaphoreTakeFromISR(
+ *                        SemaphoreHandle_t xSemaphore,
+ *                        BaseType_t *pxHigherPriorityTaskWoken
+ *                    );
+ * @endcode
+ *
+ * <i>Macro</i> to  take a semaphore from an ISR.  The semaphore must have
+ * previously been created with a call to xSemaphoreCreateBinary() or
+ * xSemaphoreCreateCounting().
+ *
+ * Mutex type semaphores (those created using a call to xSemaphoreCreateMutex())
+ * must not be used with this macro.
+ *
+ * This macro can be used from an ISR, however taking a semaphore from an ISR
+ * is not a common operation.  It is likely to only be useful when taking a
+ * counting semaphore when an interrupt is obtaining an object from a resource
+ * pool (when the semaphore count indicates the number of resources available).
+ *
+ * @param xSemaphore A handle to the semaphore being taken.  This is the
+ * handle returned when the semaphore was created.
+ *
+ * @param pxHigherPriorityTaskWoken xSemaphoreTakeFromISR() will set
+ * *pxHigherPriorityTaskWoken to pdTRUE if taking the semaphore caused a task
+ * to unblock, and the unblocked task has a priority higher than the currently
+ * running task.  If xSemaphoreTakeFromISR() sets this value to pdTRUE then
+ * a context switch should be requested before the interrupt is exited.
+ *
+ * @return pdTRUE if the semaphore was successfully taken, otherwise
+ * pdFALSE
+ */
+#define xSemaphoreTakeFromISR( xSemaphore, pxHigherPriorityTaskWoken )    xQueueReceiveFromISR( ( QueueHandle_t ) ( xSemaphore ), NULL, ( pxHigherPriorityTaskWoken ) )
+
+/**
+ * semphr. h
+ * @code{c}
+ * SemaphoreHandle_t xSemaphoreCreateMutex( void );
+ * @endcode
+ *
+ * Creates a new mutex type semaphore instance, and returns a handle by which
+ * the new mutex can be referenced.
+ *
+ * Internally, within the FreeRTOS implementation, mutex semaphores use a block
+ * of memory, in which the mutex structure is stored.  If a mutex is created
+ * using xSemaphoreCreateMutex() then the required memory is automatically
+ * dynamically allocated inside the xSemaphoreCreateMutex() function.  (see
+ * https://www.FreeRTOS.org/a00111.html).  If a mutex is created using
+ * xSemaphoreCreateMutexStatic() then the application writer must provided the
+ * memory.  xSemaphoreCreateMutexStatic() therefore allows a mutex to be created
+ * without using any dynamic memory allocation.
+ *
+ * Mutexes created using this function can be accessed using the xSemaphoreTake()
+ * and xSemaphoreGive() macros.  The xSemaphoreTakeRecursive() and
+ * xSemaphoreGiveRecursive() macros must not be used.
+ *
+ * This type of semaphore uses a priority inheritance mechanism so a task
+ * 'taking' a semaphore MUST ALWAYS 'give' the semaphore back once the
+ * semaphore it is no longer required.
+ *
+ * Mutex type semaphores cannot be used from within interrupt service routines.
+ *
+ * See xSemaphoreCreateBinary() for an alternative implementation that can be
+ * used for pure synchronisation (where one task or interrupt always 'gives' the
+ * semaphore and another always 'takes' the semaphore) and from within interrupt
+ * service routines.
+ *
+ * @return If the mutex was successfully created then a handle to the created
+ * semaphore is returned.  If there was not enough heap to allocate the mutex
+ * data structures then NULL is returned.
+ *
+ * Example usage:
+ * @code{c}
+ * SemaphoreHandle_t xSemaphore;
+ *
+ * void vATask( void * pvParameters )
+ * {
+ *  // Semaphore cannot be used before a call to xSemaphoreCreateMutex().
+ *  // This is a macro so pass the variable in directly.
+ *  xSemaphore = xSemaphoreCreateMutex();
+ *
+ *  if( xSemaphore != NULL )
+ *  {
+ *      // The semaphore was created successfully.
+ *      // The semaphore can now be used.
+ *  }
+ * }
+ * @endcode
+ * \defgroup xSemaphoreCreateMutex xSemaphoreCreateMutex
+ * \ingroup Semaphores
+ */
+#if ( ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) && ( configUSE_MUTEXES == 1 ) )
+    #define xSemaphoreCreateMutex()    xQueueCreateMutex( queueQUEUE_TYPE_MUTEX )
+#endif
+
+/**
+ * semphr. h
+ * @code{c}
+ * SemaphoreHandle_t xSemaphoreCreateMutexStatic( StaticSemaphore_t *pxMutexBuffer );
+ * @endcode
+ *
+ * Creates a new mutex type semaphore instance, and returns a handle by which
+ * the new mutex can be referenced.
+ *
+ * Internally, within the FreeRTOS implementation, mutex semaphores use a block
+ * of memory, in which the mutex structure is stored.  If a mutex is created
+ * using xSemaphoreCreateMutex() then the required memory is automatically
+ * dynamically allocated inside the xSemaphoreCreateMutex() function.  (see
+ * https://www.FreeRTOS.org/a00111.html).  If a mutex is created using
+ * xSemaphoreCreateMutexStatic() then the application writer must provided the
+ * memory.  xSemaphoreCreateMutexStatic() therefore allows a mutex to be created
+ * without using any dynamic memory allocation.
+ *
+ * Mutexes created using this function can be accessed using the xSemaphoreTake()
+ * and xSemaphoreGive() macros.  The xSemaphoreTakeRecursive() and
+ * xSemaphoreGiveRecursive() macros must not be used.
+ *
+ * This type of semaphore uses a priority inheritance mechanism so a task
+ * 'taking' a semaphore MUST ALWAYS 'give' the semaphore back once the
+ * semaphore it is no longer required.
+ *
+ * Mutex type semaphores cannot be used from within interrupt service routines.
+ *
+ * See xSemaphoreCreateBinary() for an alternative implementation that can be
+ * used for pure synchronisation (where one task or interrupt always 'gives' the
+ * semaphore and another always 'takes' the semaphore) and from within interrupt
+ * service routines.
+ *
+ * @param pxMutexBuffer Must point to a variable of type StaticSemaphore_t,
+ * which will be used to hold the mutex's data structure, removing the need for
+ * the memory to be allocated dynamically.
+ *
+ * @return If the mutex was successfully created then a handle to the created
+ * mutex is returned.  If pxMutexBuffer was NULL then NULL is returned.
+ *
+ * Example usage:
+ * @code{c}
+ * SemaphoreHandle_t xSemaphore;
+ * StaticSemaphore_t xMutexBuffer;
+ *
+ * void vATask( void * pvParameters )
+ * {
+ *  // A mutex cannot be used before it has been created.  xMutexBuffer is
+ *  // into xSemaphoreCreateMutexStatic() so no dynamic memory allocation is
+ *  // attempted.
+ *  xSemaphore = xSemaphoreCreateMutexStatic( &xMutexBuffer );
+ *
+ *  // As no dynamic memory allocation was performed, xSemaphore cannot be NULL,
+ *  // so there is no need to check it.
+ * }
+ * @endcode
+ * \defgroup xSemaphoreCreateMutexStatic xSemaphoreCreateMutexStatic
+ * \ingroup Semaphores
+ */
+#if ( ( configSUPPORT_STATIC_ALLOCATION == 1 ) && ( configUSE_MUTEXES == 1 ) )
+    #define xSemaphoreCreateMutexStatic( pxMutexBuffer )    xQueueCreateMutexStatic( queueQUEUE_TYPE_MUTEX, ( pxMutexBuffer ) )
+#endif
+
+
+/**
+ * semphr. h
+ * @code{c}
+ * SemaphoreHandle_t xSemaphoreCreateRecursiveMutex( void );
+ * @endcode
+ *
+ * Creates a new recursive mutex type semaphore instance, and returns a handle
+ * by which the new recursive mutex can be referenced.
+ *
+ * Internally, within the FreeRTOS implementation, recursive mutexes use a block
+ * of memory, in which the mutex structure is stored.  If a recursive mutex is
+ * created using xSemaphoreCreateRecursiveMutex() then the required memory is
+ * automatically dynamically allocated inside the
+ * xSemaphoreCreateRecursiveMutex() function.  (see
+ * https://www.FreeRTOS.org/a00111.html).  If a recursive mutex is created using
+ * xSemaphoreCreateRecursiveMutexStatic() then the application writer must
+ * provide the memory that will get used by the mutex.
+ * xSemaphoreCreateRecursiveMutexStatic() therefore allows a recursive mutex to
+ * be created without using any dynamic memory allocation.
+ *
+ * Mutexes created using this macro can be accessed using the
+ * xSemaphoreTakeRecursive() and xSemaphoreGiveRecursive() macros.  The
+ * xSemaphoreTake() and xSemaphoreGive() macros must not be used.
+ *
+ * A mutex used recursively can be 'taken' repeatedly by the owner. The mutex
+ * doesn't become available again until the owner has called
+ * xSemaphoreGiveRecursive() for each successful 'take' request.  For example,
+ * if a task successfully 'takes' the same mutex 5 times then the mutex will
+ * not be available to any other task until it has also  'given' the mutex back
+ * exactly five times.
+ *
+ * This type of semaphore uses a priority inheritance mechanism so a task
+ * 'taking' a semaphore MUST ALWAYS 'give' the semaphore back once the
+ * semaphore it is no longer required.
+ *
+ * Mutex type semaphores cannot be used from within interrupt service routines.
+ *
+ * See xSemaphoreCreateBinary() for an alternative implementation that can be
+ * used for pure synchronisation (where one task or interrupt always 'gives' the
+ * semaphore and another always 'takes' the semaphore) and from within interrupt
+ * service routines.
+ *
+ * @return xSemaphore Handle to the created mutex semaphore.  Should be of type
+ * SemaphoreHandle_t.
+ *
+ * Example usage:
+ * @code{c}
+ * SemaphoreHandle_t xSemaphore;
+ *
+ * void vATask( void * pvParameters )
+ * {
+ *  // Semaphore cannot be used before a call to xSemaphoreCreateMutex().
+ *  // This is a macro so pass the variable in directly.
+ *  xSemaphore = xSemaphoreCreateRecursiveMutex();
+ *
+ *  if( xSemaphore != NULL )
+ *  {
+ *      // The semaphore was created successfully.
+ *      // The semaphore can now be used.
+ *  }
+ * }
+ * @endcode
+ * \defgroup xSemaphoreCreateRecursiveMutex xSemaphoreCreateRecursiveMutex
+ * \ingroup Semaphores
+ */
+#if ( ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) && ( configUSE_RECURSIVE_MUTEXES == 1 ) )
+    #define xSemaphoreCreateRecursiveMutex()    xQueueCreateMutex( queueQUEUE_TYPE_RECURSIVE_MUTEX )
+#endif
+
+/**
+ * semphr. h
+ * @code{c}
+ * SemaphoreHandle_t xSemaphoreCreateRecursiveMutexStatic( StaticSemaphore_t *pxMutexBuffer );
+ * @endcode
+ *
+ * Creates a new recursive mutex type semaphore instance, and returns a handle
+ * by which the new recursive mutex can be referenced.
+ *
+ * Internally, within the FreeRTOS implementation, recursive mutexes use a block
+ * of memory, in which the mutex structure is stored.  If a recursive mutex is
+ * created using xSemaphoreCreateRecursiveMutex() then the required memory is
+ * automatically dynamically allocated inside the
+ * xSemaphoreCreateRecursiveMutex() function.  (see
+ * https://www.FreeRTOS.org/a00111.html).  If a recursive mutex is created using
+ * xSemaphoreCreateRecursiveMutexStatic() then the application writer must
+ * provide the memory that will get used by the mutex.
+ * xSemaphoreCreateRecursiveMutexStatic() therefore allows a recursive mutex to
+ * be created without using any dynamic memory allocation.
+ *
+ * Mutexes created using this macro can be accessed using the
+ * xSemaphoreTakeRecursive() and xSemaphoreGiveRecursive() macros.  The
+ * xSemaphoreTake() and xSemaphoreGive() macros must not be used.
+ *
+ * A mutex used recursively can be 'taken' repeatedly by the owner. The mutex
+ * doesn't become available again until the owner has called
+ * xSemaphoreGiveRecursive() for each successful 'take' request.  For example,
+ * if a task successfully 'takes' the same mutex 5 times then the mutex will
+ * not be available to any other task until it has also  'given' the mutex back
+ * exactly five times.
+ *
+ * This type of semaphore uses a priority inheritance mechanism so a task
+ * 'taking' a semaphore MUST ALWAYS 'give' the semaphore back once the
+ * semaphore it is no longer required.
+ *
+ * Mutex type semaphores cannot be used from within interrupt service routines.
+ *
+ * See xSemaphoreCreateBinary() for an alternative implementation that can be
+ * used for pure synchronisation (where one task or interrupt always 'gives' the
+ * semaphore and another always 'takes' the semaphore) and from within interrupt
+ * service routines.
+ *
+ * @param pxMutexBuffer Must point to a variable of type StaticSemaphore_t,
+ * which will then be used to hold the recursive mutex's data structure,
+ * removing the need for the memory to be allocated dynamically.
+ *
+ * @return If the recursive mutex was successfully created then a handle to the
+ * created recursive mutex is returned.  If pxMutexBuffer was NULL then NULL is
+ * returned.
+ *
+ * Example usage:
+ * @code{c}
+ * SemaphoreHandle_t xSemaphore;
+ * StaticSemaphore_t xMutexBuffer;
+ *
+ * void vATask( void * pvParameters )
+ * {
+ *  // A recursive semaphore cannot be used before it is created.  Here a
+ *  // recursive mutex is created using xSemaphoreCreateRecursiveMutexStatic().
+ *  // The address of xMutexBuffer is passed into the function, and will hold
+ *  // the mutexes data structures - so no dynamic memory allocation will be
+ *  // attempted.
+ *  xSemaphore = xSemaphoreCreateRecursiveMutexStatic( &xMutexBuffer );
+ *
+ *  // As no dynamic memory allocation was performed, xSemaphore cannot be NULL,
+ *  // so there is no need to check it.
+ * }
+ * @endcode
+ * \defgroup xSemaphoreCreateRecursiveMutexStatic xSemaphoreCreateRecursiveMutexStatic
+ * \ingroup Semaphores
+ */
+#if ( ( configSUPPORT_STATIC_ALLOCATION == 1 ) && ( configUSE_RECURSIVE_MUTEXES == 1 ) )
+    #define xSemaphoreCreateRecursiveMutexStatic( pxStaticSemaphore )    xQueueCreateMutexStatic( queueQUEUE_TYPE_RECURSIVE_MUTEX, ( pxStaticSemaphore ) )
+#endif /* configSUPPORT_STATIC_ALLOCATION */
+
+/**
+ * semphr. h
+ * @code{c}
+ * SemaphoreHandle_t xSemaphoreCreateCounting( UBaseType_t uxMaxCount, UBaseType_t uxInitialCount );
+ * @endcode
+ *
+ * Creates a new counting semaphore instance, and returns a handle by which the
+ * new counting semaphore can be referenced.
+ *
+ * In many usage scenarios it is faster and more memory efficient to use a
+ * direct to task notification in place of a counting semaphore!
+ * https://www.FreeRTOS.org/RTOS-task-notifications.html
+ *
+ * Internally, within the FreeRTOS implementation, counting semaphores use a
+ * block of memory, in which the counting semaphore structure is stored.  If a
+ * counting semaphore is created using xSemaphoreCreateCounting() then the
+ * required memory is automatically dynamically allocated inside the
+ * xSemaphoreCreateCounting() function.  (see
+ * https://www.FreeRTOS.org/a00111.html).  If a counting semaphore is created
+ * using xSemaphoreCreateCountingStatic() then the application writer can
+ * instead optionally provide the memory that will get used by the counting
+ * semaphore.  xSemaphoreCreateCountingStatic() therefore allows a counting
+ * semaphore to be created without using any dynamic memory allocation.
+ *
+ * Counting semaphores are typically used for two things:
+ *
+ * 1) Counting events.
+ *
+ *    In this usage scenario an event handler will 'give' a semaphore each time
+ *    an event occurs (incrementing the semaphore count value), and a handler
+ *    task will 'take' a semaphore each time it processes an event
+ *    (decrementing the semaphore count value).  The count value is therefore
+ *    the difference between the number of events that have occurred and the
+ *    number that have been processed.  In this case it is desirable for the
+ *    initial count value to be zero.
+ *
+ * 2) Resource management.
+ *
+ *    In this usage scenario the count value indicates the number of resources
+ *    available.  To obtain control of a resource a task must first obtain a
+ *    semaphore - decrementing the semaphore count value.  When the count value
+ *    reaches zero there are no free resources.  When a task finishes with the
+ *    resource it 'gives' the semaphore back - incrementing the semaphore count
+ *    value.  In this case it is desirable for the initial count value to be
+ *    equal to the maximum count value, indicating that all resources are free.
+ *
+ * @param uxMaxCount The maximum count value that can be reached.  When the
+ *        semaphore reaches this value it can no longer be 'given'.
+ *
+ * @param uxInitialCount The count value assigned to the semaphore when it is
+ *        created.
+ *
+ * @return Handle to the created semaphore.  Null if the semaphore could not be
+ *         created.
+ *
+ * Example usage:
+ * @code{c}
+ * SemaphoreHandle_t xSemaphore;
+ *
+ * void vATask( void * pvParameters )
+ * {
+ * SemaphoreHandle_t xSemaphore = NULL;
+ *
+ *  // Semaphore cannot be used before a call to xSemaphoreCreateCounting().
+ *  // The max value to which the semaphore can count should be 10, and the
+ *  // initial value assigned to the count should be 0.
+ *  xSemaphore = xSemaphoreCreateCounting( 10, 0 );
+ *
+ *  if( xSemaphore != NULL )
+ *  {
+ *      // The semaphore was created successfully.
+ *      // The semaphore can now be used.
+ *  }
+ * }
+ * @endcode
+ * \defgroup xSemaphoreCreateCounting xSemaphoreCreateCounting
+ * \ingroup Semaphores
+ */
+#if ( configSUPPORT_DYNAMIC_ALLOCATION == 1 )
+    #define xSemaphoreCreateCounting( uxMaxCount, uxInitialCount )    xQueueCreateCountingSemaphore( ( uxMaxCount ), ( uxInitialCount ) )
+#endif
+
+/**
+ * semphr. h
+ * @code{c}
+ * SemaphoreHandle_t xSemaphoreCreateCountingStatic( UBaseType_t uxMaxCount, UBaseType_t uxInitialCount, StaticSemaphore_t *pxSemaphoreBuffer );
+ * @endcode
+ *
+ * Creates a new counting semaphore instance, and returns a handle by which the
+ * new counting semaphore can be referenced.
+ *
+ * In many usage scenarios it is faster and more memory efficient to use a
+ * direct to task notification in place of a counting semaphore!
+ * https://www.FreeRTOS.org/RTOS-task-notifications.html
+ *
+ * Internally, within the FreeRTOS implementation, counting semaphores use a
+ * block of memory, in which the counting semaphore structure is stored.  If a
+ * counting semaphore is created using xSemaphoreCreateCounting() then the
+ * required memory is automatically dynamically allocated inside the
+ * xSemaphoreCreateCounting() function.  (see
+ * https://www.FreeRTOS.org/a00111.html).  If a counting semaphore is created
+ * using xSemaphoreCreateCountingStatic() then the application writer must
+ * provide the memory.  xSemaphoreCreateCountingStatic() therefore allows a
+ * counting semaphore to be created without using any dynamic memory allocation.
+ *
+ * Counting semaphores are typically used for two things:
+ *
+ * 1) Counting events.
+ *
+ *    In this usage scenario an event handler will 'give' a semaphore each time
+ *    an event occurs (incrementing the semaphore count value), and a handler
+ *    task will 'take' a semaphore each time it processes an event
+ *    (decrementing the semaphore count value).  The count value is therefore
+ *    the difference between the number of events that have occurred and the
+ *    number that have been processed.  In this case it is desirable for the
+ *    initial count value to be zero.
+ *
+ * 2) Resource management.
+ *
+ *    In this usage scenario the count value indicates the number of resources
+ *    available.  To obtain control of a resource a task must first obtain a
+ *    semaphore - decrementing the semaphore count value.  When the count value
+ *    reaches zero there are no free resources.  When a task finishes with the
+ *    resource it 'gives' the semaphore back - incrementing the semaphore count
+ *    value.  In this case it is desirable for the initial count value to be
+ *    equal to the maximum count value, indicating that all resources are free.
+ *
+ * @param uxMaxCount The maximum count value that can be reached.  When the
+ *        semaphore reaches this value it can no longer be 'given'.
+ *
+ * @param uxInitialCount The count value assigned to the semaphore when it is
+ *        created.
+ *
+ * @param pxSemaphoreBuffer Must point to a variable of type StaticSemaphore_t,
+ * which will then be used to hold the semaphore's data structure, removing the
+ * need for the memory to be allocated dynamically.
+ *
+ * @return If the counting semaphore was successfully created then a handle to
+ * the created counting semaphore is returned.  If pxSemaphoreBuffer was NULL
+ * then NULL is returned.
+ *
+ * Example usage:
+ * @code{c}
+ * SemaphoreHandle_t xSemaphore;
+ * StaticSemaphore_t xSemaphoreBuffer;
+ *
+ * void vATask( void * pvParameters )
+ * {
+ * SemaphoreHandle_t xSemaphore = NULL;
+ *
+ *  // Counting semaphore cannot be used before they have been created.  Create
+ *  // a counting semaphore using xSemaphoreCreateCountingStatic().  The max
+ *  // value to which the semaphore can count is 10, and the initial value
+ *  // assigned to the count will be 0.  The address of xSemaphoreBuffer is
+ *  // passed in and will be used to hold the semaphore structure, so no dynamic
+ *  // memory allocation will be used.
+ *  xSemaphore = xSemaphoreCreateCounting( 10, 0, &xSemaphoreBuffer );
+ *
+ *  // No memory allocation was attempted so xSemaphore cannot be NULL, so there
+ *  // is no need to check its value.
+ * }
+ * @endcode
+ * \defgroup xSemaphoreCreateCountingStatic xSemaphoreCreateCountingStatic
+ * \ingroup Semaphores
+ */
+#if ( configSUPPORT_STATIC_ALLOCATION == 1 )
+    #define xSemaphoreCreateCountingStatic( uxMaxCount, uxInitialCount, pxSemaphoreBuffer )    xQueueCreateCountingSemaphoreStatic( ( uxMaxCount ), ( uxInitialCount ), ( pxSemaphoreBuffer ) )
+#endif /* configSUPPORT_STATIC_ALLOCATION */
+
+/**
+ * semphr. h
+ * @code{c}
+ * void vSemaphoreDelete( SemaphoreHandle_t xSemaphore );
+ * @endcode
+ *
+ * Delete a semaphore.  This function must be used with care.  For example,
+ * do not delete a mutex type semaphore if the mutex is held by a task.
+ *
+ * @param xSemaphore A handle to the semaphore to be deleted.
+ *
+ * \defgroup vSemaphoreDelete vSemaphoreDelete
+ * \ingroup Semaphores
+ */
+#define vSemaphoreDelete( xSemaphore )    vQueueDelete( ( QueueHandle_t ) ( xSemaphore ) )
+
+/**
+ * semphr.h
+ * @code{c}
+ * TaskHandle_t xSemaphoreGetMutexHolder( SemaphoreHandle_t xMutex );
+ * @endcode
+ *
+ * If xMutex is indeed a mutex type semaphore, return the current mutex holder.
+ * If xMutex is not a mutex type semaphore, or the mutex is available (not held
+ * by a task), return NULL.
+ *
+ * Note: This is a good way of determining if the calling task is the mutex
+ * holder, but not a good way of determining the identity of the mutex holder as
+ * the holder may change between the function exiting and the returned value
+ * being tested.
+ */
+#if ( ( configUSE_MUTEXES == 1 ) && ( INCLUDE_xSemaphoreGetMutexHolder == 1 ) )
+    #define xSemaphoreGetMutexHolder( xSemaphore )    xQueueGetMutexHolder( ( xSemaphore ) )
+#endif
+
+/**
+ * semphr.h
+ * @code{c}
+ * TaskHandle_t xSemaphoreGetMutexHolderFromISR( SemaphoreHandle_t xMutex );
+ * @endcode
+ *
+ * If xMutex is indeed a mutex type semaphore, return the current mutex holder.
+ * If xMutex is not a mutex type semaphore, or the mutex is available (not held
+ * by a task), return NULL.
+ *
+ */
+#if ( ( configUSE_MUTEXES == 1 ) && ( INCLUDE_xSemaphoreGetMutexHolder == 1 ) )
+    #define xSemaphoreGetMutexHolderFromISR( xSemaphore )    xQueueGetMutexHolderFromISR( ( xSemaphore ) )
+#endif
+
+/**
+ * semphr.h
+ * @code{c}
+ * UBaseType_t uxSemaphoreGetCount( SemaphoreHandle_t xSemaphore );
+ * @endcode
+ *
+ * If the semaphore is a counting semaphore then uxSemaphoreGetCount() returns
+ * its current count value.  If the semaphore is a binary semaphore then
+ * uxSemaphoreGetCount() returns 1 if the semaphore is available, and 0 if the
+ * semaphore is not available.
+ *
+ */
+#define uxSemaphoreGetCount( xSemaphore )           uxQueueMessagesWaiting( ( QueueHandle_t ) ( xSemaphore ) )
+
+/**
+ * semphr.h
+ * @code{c}
+ * UBaseType_t uxSemaphoreGetCountFromISR( SemaphoreHandle_t xSemaphore );
+ * @endcode
+ *
+ * If the semaphore is a counting semaphore then uxSemaphoreGetCountFromISR() returns
+ * its current count value.  If the semaphore is a binary semaphore then
+ * uxSemaphoreGetCountFromISR() returns 1 if the semaphore is available, and 0 if the
+ * semaphore is not available.
+ *
+ */
+#define uxSemaphoreGetCountFromISR( xSemaphore )    uxQueueMessagesWaitingFromISR( ( QueueHandle_t ) ( xSemaphore ) )
+
+#endif /* SEMAPHORE_H */
diff --git a/include/stack_macros.h b/include/stack_macros.h
index 6894a3e..9b36959 100644
--- a/include/stack_macros.h
+++ b/include/stack_macros.h
@@ -1,137 +1,137 @@
-/*

- * FreeRTOS Kernel <DEVELOPMENT BRANCH>

- * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.

- *

- * SPDX-License-Identifier: MIT

- *

- * 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.

- *

- * https://www.FreeRTOS.org

- * https://github.com/FreeRTOS

- *

- */

-

-#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.

- */

-

-/*-----------------------------------------------------------*/

-

-/*

- * portSTACK_LIMIT_PADDING is a number of extra words to consider to be in

- * use on the stack.

- */

-#ifndef portSTACK_LIMIT_PADDING

-    #define portSTACK_LIMIT_PADDING    0

-#endif

-

-#if ( ( configCHECK_FOR_STACK_OVERFLOW == 1 ) && ( portSTACK_GROWTH < 0 ) )

-

-/* Only the current stack state is to be checked. */

-    #define taskCHECK_FOR_STACK_OVERFLOW()                                                            \

-    {                                                                                                 \

-        /* Is the currently saved stack pointer within the stack limit? */                            \

-        if( pxCurrentTCB->pxTopOfStack <= pxCurrentTCB->pxStack + portSTACK_LIMIT_PADDING )           \

-        {                                                                                             \

-            vApplicationStackOverflowHook( ( TaskHandle_t ) pxCurrentTCB, pxCurrentTCB->pcTaskName ); \

-        }                                                                                             \

-    }

-

-#endif /* configCHECK_FOR_STACK_OVERFLOW == 1 */

-/*-----------------------------------------------------------*/

-

-#if ( ( configCHECK_FOR_STACK_OVERFLOW == 1 ) && ( portSTACK_GROWTH > 0 ) )

-

-/* Only the current stack state is to be checked. */

-    #define taskCHECK_FOR_STACK_OVERFLOW()                                                            \

-    {                                                                                                 \

-                                                                                                      \

-        /* Is the currently saved stack pointer within the stack limit? */                            \

-        if( pxCurrentTCB->pxTopOfStack >= pxCurrentTCB->pxEndOfStack - portSTACK_LIMIT_PADDING )      \

-        {                                                                                             \

-            vApplicationStackOverflowHook( ( TaskHandle_t ) pxCurrentTCB, pxCurrentTCB->pcTaskName ); \

-        }                                                                                             \

-    }

-

-#endif /* configCHECK_FOR_STACK_OVERFLOW == 1 */

-/*-----------------------------------------------------------*/

-

-#if ( ( configCHECK_FOR_STACK_OVERFLOW > 1 ) && ( portSTACK_GROWTH < 0 ) )

-

-    #define taskCHECK_FOR_STACK_OVERFLOW()                                                            \

-    {                                                                                                 \

-        const uint32_t * const pulStack = ( uint32_t * ) pxCurrentTCB->pxStack;                       \

-        const uint32_t ulCheckValue = ( uint32_t ) 0xa5a5a5a5;                                        \

-                                                                                                      \

-        if( ( pulStack[ 0 ] != ulCheckValue ) ||                                                      \

-            ( pulStack[ 1 ] != ulCheckValue ) ||                                                      \

-            ( pulStack[ 2 ] != ulCheckValue ) ||                                                      \

-            ( pulStack[ 3 ] != ulCheckValue ) )                                                       \

-        {                                                                                             \

-            vApplicationStackOverflowHook( ( TaskHandle_t ) pxCurrentTCB, pxCurrentTCB->pcTaskName ); \

-        }                                                                                             \

-    }

-

-#endif /* #if( configCHECK_FOR_STACK_OVERFLOW > 1 ) */

-/*-----------------------------------------------------------*/

-

-#if ( ( configCHECK_FOR_STACK_OVERFLOW > 1 ) && ( portSTACK_GROWTH > 0 ) )

-

-    #define taskCHECK_FOR_STACK_OVERFLOW()                                                                                                \

-    {                                                                                                                                     \

-        int8_t * pcEndOfStack = ( int8_t * ) pxCurrentTCB->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, pxCurrentTCB->pcTaskName );                                     \

-        }                                                                                                                                 \

-    }

-

-#endif /* #if( configCHECK_FOR_STACK_OVERFLOW > 1 ) */

-/*-----------------------------------------------------------*/

-

-/* Remove stack overflow macro if not being used. */

-#ifndef taskCHECK_FOR_STACK_OVERFLOW

-    #define taskCHECK_FOR_STACK_OVERFLOW()

-#endif

-

-

-

-#endif /* STACK_MACROS_H */

+/*
+ * FreeRTOS Kernel <DEVELOPMENT BRANCH>
+ * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.
+ *
+ * SPDX-License-Identifier: MIT
+ *
+ * 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.
+ *
+ * https://www.FreeRTOS.org
+ * https://github.com/FreeRTOS
+ *
+ */
+
+#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.
+ */
+
+/*-----------------------------------------------------------*/
+
+/*
+ * portSTACK_LIMIT_PADDING is a number of extra words to consider to be in
+ * use on the stack.
+ */
+#ifndef portSTACK_LIMIT_PADDING
+    #define portSTACK_LIMIT_PADDING    0
+#endif
+
+#if ( ( configCHECK_FOR_STACK_OVERFLOW == 1 ) && ( portSTACK_GROWTH < 0 ) )
+
+/* Only the current stack state is to be checked. */
+    #define taskCHECK_FOR_STACK_OVERFLOW()                                                            \
+    {                                                                                                 \
+        /* Is the currently saved stack pointer within the stack limit? */                            \
+        if( pxCurrentTCB->pxTopOfStack <= pxCurrentTCB->pxStack + portSTACK_LIMIT_PADDING )           \
+        {                                                                                             \
+            vApplicationStackOverflowHook( ( TaskHandle_t ) pxCurrentTCB, pxCurrentTCB->pcTaskName ); \
+        }                                                                                             \
+    }
+
+#endif /* configCHECK_FOR_STACK_OVERFLOW == 1 */
+/*-----------------------------------------------------------*/
+
+#if ( ( configCHECK_FOR_STACK_OVERFLOW == 1 ) && ( portSTACK_GROWTH > 0 ) )
+
+/* Only the current stack state is to be checked. */
+    #define taskCHECK_FOR_STACK_OVERFLOW()                                                            \
+    {                                                                                                 \
+                                                                                                      \
+        /* Is the currently saved stack pointer within the stack limit? */                            \
+        if( pxCurrentTCB->pxTopOfStack >= pxCurrentTCB->pxEndOfStack - portSTACK_LIMIT_PADDING )      \
+        {                                                                                             \
+            vApplicationStackOverflowHook( ( TaskHandle_t ) pxCurrentTCB, pxCurrentTCB->pcTaskName ); \
+        }                                                                                             \
+    }
+
+#endif /* configCHECK_FOR_STACK_OVERFLOW == 1 */
+/*-----------------------------------------------------------*/
+
+#if ( ( configCHECK_FOR_STACK_OVERFLOW > 1 ) && ( portSTACK_GROWTH < 0 ) )
+
+    #define taskCHECK_FOR_STACK_OVERFLOW()                                                            \
+    {                                                                                                 \
+        const uint32_t * const pulStack = ( uint32_t * ) pxCurrentTCB->pxStack;                       \
+        const uint32_t ulCheckValue = ( uint32_t ) 0xa5a5a5a5;                                        \
+                                                                                                      \
+        if( ( pulStack[ 0 ] != ulCheckValue ) ||                                                      \
+            ( pulStack[ 1 ] != ulCheckValue ) ||                                                      \
+            ( pulStack[ 2 ] != ulCheckValue ) ||                                                      \
+            ( pulStack[ 3 ] != ulCheckValue ) )                                                       \
+        {                                                                                             \
+            vApplicationStackOverflowHook( ( TaskHandle_t ) pxCurrentTCB, pxCurrentTCB->pcTaskName ); \
+        }                                                                                             \
+    }
+
+#endif /* #if( configCHECK_FOR_STACK_OVERFLOW > 1 ) */
+/*-----------------------------------------------------------*/
+
+#if ( ( configCHECK_FOR_STACK_OVERFLOW > 1 ) && ( portSTACK_GROWTH > 0 ) )
+
+    #define taskCHECK_FOR_STACK_OVERFLOW()                                                                                                \
+    {                                                                                                                                     \
+        int8_t * pcEndOfStack = ( int8_t * ) pxCurrentTCB->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, pxCurrentTCB->pcTaskName );                                     \
+        }                                                                                                                                 \
+    }
+
+#endif /* #if( configCHECK_FOR_STACK_OVERFLOW > 1 ) */
+/*-----------------------------------------------------------*/
+
+/* Remove stack overflow macro if not being used. */
+#ifndef taskCHECK_FOR_STACK_OVERFLOW
+    #define taskCHECK_FOR_STACK_OVERFLOW()
+#endif
+
+
+
+#endif /* STACK_MACROS_H */
diff --git a/include/stdint.readme b/include/stdint.readme
index 4cc32cb..5c9d192 100644
--- a/include/stdint.readme
+++ b/include/stdint.readme
@@ -1,58 +1,58 @@
-/*

- * FreeRTOS Kernel <DEVELOPMENT BRANCH>

- * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.

- *

- * SPDX-License-Identifier: MIT

- *

- * 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.

- *

- * https://www.FreeRTOS.org

- * https://github.com/FreeRTOS

- *

- */

-

-#ifndef FREERTOS_STDINT

-#define FREERTOS_STDINT

-

-/*******************************************************************************

- * THIS IS NOT A FULL stdint.h IMPLEMENTATION - It only contains the definitions

- * necessary to build the FreeRTOS code.  It is provided to allow FreeRTOS to be

- * built using compilers that do not provide their own stdint.h definition.

- *

- * To use this file:

- *

- *    1) Copy this file into the directory that contains your FreeRTOSConfig.h

- *       header file, as that directory will already be in the compiler's include

- *       path.

- *

- *    2) Rename the copied file stdint.h.

- *

- */

-

-typedef signed char int8_t;

-typedef unsigned char uint8_t;

-typedef short int16_t;

-typedef unsigned short uint16_t;

-typedef long int32_t;

-typedef unsigned long uint32_t;

-

-#ifndef SIZE_MAX

-    #define SIZE_MAX    ( ( size_t ) -1 )

-#endif

-

-#endif /* FREERTOS_STDINT */

+/*
+ * FreeRTOS Kernel <DEVELOPMENT BRANCH>
+ * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.
+ *
+ * SPDX-License-Identifier: MIT
+ *
+ * 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.
+ *
+ * https://www.FreeRTOS.org
+ * https://github.com/FreeRTOS
+ *
+ */
+
+#ifndef FREERTOS_STDINT
+#define FREERTOS_STDINT
+
+/*******************************************************************************
+ * THIS IS NOT A FULL stdint.h IMPLEMENTATION - It only contains the definitions
+ * necessary to build the FreeRTOS code.  It is provided to allow FreeRTOS to be
+ * built using compilers that do not provide their own stdint.h definition.
+ *
+ * To use this file:
+ *
+ *    1) Copy this file into the directory that contains your FreeRTOSConfig.h
+ *       header file, as that directory will already be in the compiler's include
+ *       path.
+ *
+ *    2) Rename the copied file stdint.h.
+ *
+ */
+
+typedef signed char int8_t;
+typedef unsigned char uint8_t;
+typedef short int16_t;
+typedef unsigned short uint16_t;
+typedef long int32_t;
+typedef unsigned long uint32_t;
+
+#ifndef SIZE_MAX
+    #define SIZE_MAX    ( ( size_t ) -1 )
+#endif
+
+#endif /* FREERTOS_STDINT */
diff --git a/include/stream_buffer.h b/include/stream_buffer.h
index 7ab409d..d65ed9e 100644
--- a/include/stream_buffer.h
+++ b/include/stream_buffer.h
@@ -1,913 +1,913 @@
-/*

- * FreeRTOS Kernel <DEVELOPMENT BRANCH>

- * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.

- *

- * SPDX-License-Identifier: MIT

- *

- * 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.

- *

- * https://www.FreeRTOS.org

- * https://github.com/FreeRTOS

- *

- */

-

-/*

- * 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 xStreamBufferReceive()) 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

-

-/* *INDENT-OFF* */

-#if defined( __cplusplus )

-    extern "C" {

-#endif

-/* *INDENT-ON* */

-

-/**

- * 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;

-

-/**

- *  Type used as a stream buffer's optional callback.

- */

-typedef void (* StreamBufferCallbackFunction_t)( StreamBufferHandle_t xStreamBuffer,

-                                                 BaseType_t xIsInsideISR,

-                                                 BaseType_t * const pxHigherPriorityTaskWoken );

-

-/**

- * stream_buffer.h

- *

- * @code{c}

- * StreamBufferHandle_t xStreamBufferCreate( size_t xBufferSizeBytes, size_t xTriggerLevelBytes );

- * @endcode

- *

- * 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.

- *

- * @param pxSendCompletedCallback Callback invoked when number of bytes at least equal to

- * trigger level is sent to the stream buffer. If the parameter is NULL, it will use the default

- * implementation provided by sbSEND_COMPLETED macro. To enable the callback,

- * configUSE_SB_COMPLETED_CALLBACK must be set to 1 in FreeRTOSConfig.h.

- *

- * @param pxReceiveCompletedCallback Callback invoked when more than zero bytes are read from a

- * stream buffer. If the parameter is NULL, it will use the default

- * implementation provided by sbRECEIVE_COMPLETED macro. To enable the callback,

- * configUSE_SB_COMPLETED_CALLBACK must be set to 1 in FreeRTOSConfig.h.

- *

- * @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

- * \defgroup xStreamBufferCreate xStreamBufferCreate

- * \ingroup StreamBufferManagement

- */

-

-#define xStreamBufferCreate( xBufferSizeBytes, xTriggerLevelBytes ) \

-    xStreamBufferGenericCreate( ( xBufferSizeBytes ), ( xTriggerLevelBytes ), pdFALSE, NULL, NULL )

-

-#if ( configUSE_SB_COMPLETED_CALLBACK == 1 )

-    #define xStreamBufferCreateWithCallback( xBufferSizeBytes, xTriggerLevelBytes, pxSendCompletedCallback, pxReceiveCompletedCallback ) \

-    xStreamBufferGenericCreate( ( xBufferSizeBytes ), ( xTriggerLevelBytes ), pdFALSE, ( pxSendCompletedCallback ), ( pxReceiveCompletedCallback ) )

-#endif

-

-/**

- * stream_buffer.h

- *

- * @code{c}

- * StreamBufferHandle_t xStreamBufferCreateStatic( size_t xBufferSizeBytes,

- *                                              size_t xTriggerLevelBytes,

- *                                              uint8_t *pucStreamBufferStorageArea,

- *                                              StaticStreamBuffer_t *pxStaticStreamBuffer );

- * @endcode

- * 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 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.

- *

- * @param pxSendCompletedCallback Callback invoked when number of bytes at least equal to

- * trigger level is sent to the stream buffer. If the parameter is NULL, it will use the default

- * implementation provided by sbSEND_COMPLETED macro. To enable the callback,

- * configUSE_SB_COMPLETED_CALLBACK must be set to 1 in FreeRTOSConfig.h.

- *

- * @param pxReceiveCompletedCallback Callback invoked when more than zero bytes are read from a

- * stream buffer. If the parameter is NULL, it will use the default

- * implementation provided by sbRECEIVE_COMPLETED macro. To enable the callback,

- * configUSE_SB_COMPLETED_CALLBACK must be set to 1 in FreeRTOSConfig.h.

- *

- * @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( ucStorageBuffer ),

- *                                             xTriggerLevel,

- *                                             ucStorageBuffer,

- *                                             &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

- * \defgroup xStreamBufferCreateStatic xStreamBufferCreateStatic

- * \ingroup StreamBufferManagement

- */

-

-#define xStreamBufferCreateStatic( xBufferSizeBytes, xTriggerLevelBytes, pucStreamBufferStorageArea, pxStaticStreamBuffer ) \

-    xStreamBufferGenericCreateStatic( ( xBufferSizeBytes ), ( xTriggerLevelBytes ), pdFALSE, ( pucStreamBufferStorageArea ), ( pxStaticStreamBuffer ), NULL, NULL )

-

-#if ( configUSE_SB_COMPLETED_CALLBACK == 1 )

-    #define xStreamBufferCreateStaticWithCallback( xBufferSizeBytes, xTriggerLevelBytes, pucStreamBufferStorageArea, pxStaticStreamBuffer, pxSendCompletedCallback, pxReceiveCompletedCallback ) \

-    xStreamBufferGenericCreateStatic( ( xBufferSizeBytes ), ( xTriggerLevelBytes ), pdFALSE, ( pucStreamBufferStorageArea ), ( pxStaticStreamBuffer ), ( pxSendCompletedCallback ), ( pxReceiveCompletedCallback ) )

-#endif

-

-/**

- * stream_buffer.h

- *

- * @code{c}

- * size_t xStreamBufferSend( StreamBufferHandle_t xStreamBuffer,

- *                        const void *pvTxData,

- *                        size_t xDataLengthBytes,

- *                        TickType_t xTicksToWait );

- * @endcode

- *

- * 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 xStreamBufferReceive()) 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

- * \defgroup xStreamBufferSend xStreamBufferSend

- * \ingroup StreamBufferManagement

- */

-size_t xStreamBufferSend( StreamBufferHandle_t xStreamBuffer,

-                          const void * pvTxData,

-                          size_t xDataLengthBytes,

-                          TickType_t xTicksToWait ) PRIVILEGED_FUNCTION;

-

-/**

- * stream_buffer.h

- *

- * @code{c}

- * size_t xStreamBufferSendFromISR( StreamBufferHandle_t xStreamBuffer,

- *                               const void *pvTxData,

- *                               size_t xDataLengthBytes,

- *                               BaseType_t *pxHigherPriorityTaskWoken );

- * @endcode

- *

- * 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 xStreamBufferReceive()) 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 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

- * \defgroup xStreamBufferSendFromISR xStreamBufferSendFromISR

- * \ingroup StreamBufferManagement

- */

-size_t xStreamBufferSendFromISR( StreamBufferHandle_t xStreamBuffer,

-                                 const void * pvTxData,

-                                 size_t xDataLengthBytes,

-                                 BaseType_t * const pxHigherPriorityTaskWoken ) PRIVILEGED_FUNCTION;

-

-/**

- * stream_buffer.h

- *

- * @code{c}

- * size_t xStreamBufferReceive( StreamBufferHandle_t xStreamBuffer,

- *                           void *pvRxData,

- *                           size_t xBufferLengthBytes,

- *                           TickType_t xTicksToWait );

- * @endcode

- *

- * 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 xStreamBufferReceive()) 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 xReceivedBytes bytes of data, which can

- *      // be processed here....

- *  }

- * }

- * @endcode

- * \defgroup xStreamBufferReceive xStreamBufferReceive

- * \ingroup StreamBufferManagement

- */

-size_t xStreamBufferReceive( StreamBufferHandle_t xStreamBuffer,

-                             void * pvRxData,

-                             size_t xBufferLengthBytes,

-                             TickType_t xTicksToWait ) PRIVILEGED_FUNCTION;

-

-/**

- * stream_buffer.h

- *

- * @code{c}

- * size_t xStreamBufferReceiveFromISR( StreamBufferHandle_t xStreamBuffer,

- *                                  void *pvRxData,

- *                                  size_t xBufferLengthBytes,

- *                                  BaseType_t *pxHigherPriorityTaskWoken );

- * @endcode

- *

- * 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 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

- * \defgroup xStreamBufferReceiveFromISR xStreamBufferReceiveFromISR

- * \ingroup StreamBufferManagement

- */

-size_t xStreamBufferReceiveFromISR( StreamBufferHandle_t xStreamBuffer,

-                                    void * pvRxData,

-                                    size_t xBufferLengthBytes,

-                                    BaseType_t * const pxHigherPriorityTaskWoken ) PRIVILEGED_FUNCTION;

-

-/**

- * stream_buffer.h

- *

- * @code{c}

- * void vStreamBufferDelete( StreamBufferHandle_t xStreamBuffer );

- * @endcode

- *

- * 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.

- *

- * \defgroup vStreamBufferDelete vStreamBufferDelete

- * \ingroup StreamBufferManagement

- */

-void vStreamBufferDelete( StreamBufferHandle_t xStreamBuffer ) PRIVILEGED_FUNCTION;

-

-/**

- * stream_buffer.h

- *

- * @code{c}

- * BaseType_t xStreamBufferIsFull( StreamBufferHandle_t xStreamBuffer );

- * @endcode

- *

- * 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.

- *

- * \defgroup xStreamBufferIsFull xStreamBufferIsFull

- * \ingroup StreamBufferManagement

- */

-BaseType_t xStreamBufferIsFull( StreamBufferHandle_t xStreamBuffer ) PRIVILEGED_FUNCTION;

-

-/**

- * stream_buffer.h

- *

- * @code{c}

- * BaseType_t xStreamBufferIsEmpty( StreamBufferHandle_t xStreamBuffer );

- * @endcode

- *

- * 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.

- *

- * \defgroup xStreamBufferIsEmpty xStreamBufferIsEmpty

- * \ingroup StreamBufferManagement

- */

-BaseType_t xStreamBufferIsEmpty( StreamBufferHandle_t xStreamBuffer ) PRIVILEGED_FUNCTION;

-

-/**

- * stream_buffer.h

- *

- * @code{c}

- * BaseType_t xStreamBufferReset( StreamBufferHandle_t xStreamBuffer );

- * @endcode

- *

- * 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.

- *

- * \defgroup xStreamBufferReset xStreamBufferReset

- * \ingroup StreamBufferManagement

- */

-BaseType_t xStreamBufferReset( StreamBufferHandle_t xStreamBuffer ) PRIVILEGED_FUNCTION;

-

-/**

- * stream_buffer.h

- *

- * @code{c}

- * size_t xStreamBufferSpacesAvailable( StreamBufferHandle_t xStreamBuffer );

- * @endcode

- *

- * 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;

-

-/**

- * stream_buffer.h

- *

- * @code{c}

- * size_t xStreamBufferBytesAvailable( StreamBufferHandle_t xStreamBuffer );

- * @endcode

- *

- * 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;

-

-/**

- * stream_buffer.h

- *

- * @code{c}

- * BaseType_t xStreamBufferSetTriggerLevel( StreamBufferHandle_t xStreamBuffer, size_t xTriggerLevel );

- * @endcode

- *

- * 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.

- *

- * \defgroup xStreamBufferSetTriggerLevel xStreamBufferSetTriggerLevel

- * \ingroup StreamBufferManagement

- */

-BaseType_t xStreamBufferSetTriggerLevel( StreamBufferHandle_t xStreamBuffer,

-                                         size_t xTriggerLevel ) PRIVILEGED_FUNCTION;

-

-/**

- * stream_buffer.h

- *

- * @code{c}

- * BaseType_t xStreamBufferSendCompletedFromISR( StreamBufferHandle_t xStreamBuffer, BaseType_t *pxHigherPriorityTaskWoken );

- * @endcode

- *

- * 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.

- *

- * \defgroup xStreamBufferSendCompletedFromISR xStreamBufferSendCompletedFromISR

- * \ingroup StreamBufferManagement

- */

-BaseType_t xStreamBufferSendCompletedFromISR( StreamBufferHandle_t xStreamBuffer,

-                                              BaseType_t * pxHigherPriorityTaskWoken ) PRIVILEGED_FUNCTION;

-

-/**

- * stream_buffer.h

- *

- * @code{c}

- * BaseType_t xStreamBufferReceiveCompletedFromISR( StreamBufferHandle_t xStreamBuffer, BaseType_t *pxHigherPriorityTaskWoken );

- * @endcode

- *

- * 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.

- *

- * \defgroup xStreamBufferReceiveCompletedFromISR xStreamBufferReceiveCompletedFromISR

- * \ingroup StreamBufferManagement

- */

-BaseType_t xStreamBufferReceiveCompletedFromISR( StreamBufferHandle_t xStreamBuffer,

-                                                 BaseType_t * pxHigherPriorityTaskWoken ) PRIVILEGED_FUNCTION;

-

-/* Functions below here are not part of the public API. */

-StreamBufferHandle_t xStreamBufferGenericCreate( size_t xBufferSizeBytes,

-                                                 size_t xTriggerLevelBytes,

-                                                 BaseType_t xIsMessageBuffer,

-                                                 StreamBufferCallbackFunction_t pxSendCompletedCallback,

-                                                 StreamBufferCallbackFunction_t pxReceiveCompletedCallback ) PRIVILEGED_FUNCTION;

-

-

-StreamBufferHandle_t xStreamBufferGenericCreateStatic( size_t xBufferSizeBytes,

-                                                       size_t xTriggerLevelBytes,

-                                                       BaseType_t xIsMessageBuffer,

-                                                       uint8_t * const pucStreamBufferStorageArea,

-                                                       StaticStreamBuffer_t * const pxStaticStreamBuffer,

-                                                       StreamBufferCallbackFunction_t pxSendCompletedCallback,

-                                                       StreamBufferCallbackFunction_t pxReceiveCompletedCallback ) 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

-

-/* *INDENT-OFF* */

-#if defined( __cplusplus )

-    }

-#endif

-/* *INDENT-ON* */

-

-#endif /* !defined( STREAM_BUFFER_H ) */

+/*
+ * FreeRTOS Kernel <DEVELOPMENT BRANCH>
+ * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.
+ *
+ * SPDX-License-Identifier: MIT
+ *
+ * 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.
+ *
+ * https://www.FreeRTOS.org
+ * https://github.com/FreeRTOS
+ *
+ */
+
+/*
+ * 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 xStreamBufferReceive()) 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
+
+/* *INDENT-OFF* */
+#if defined( __cplusplus )
+    extern "C" {
+#endif
+/* *INDENT-ON* */
+
+/**
+ * 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;
+
+/**
+ *  Type used as a stream buffer's optional callback.
+ */
+typedef void (* StreamBufferCallbackFunction_t)( StreamBufferHandle_t xStreamBuffer,
+                                                 BaseType_t xIsInsideISR,
+                                                 BaseType_t * const pxHigherPriorityTaskWoken );
+
+/**
+ * stream_buffer.h
+ *
+ * @code{c}
+ * StreamBufferHandle_t xStreamBufferCreate( size_t xBufferSizeBytes, size_t xTriggerLevelBytes );
+ * @endcode
+ *
+ * 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.
+ *
+ * @param pxSendCompletedCallback Callback invoked when number of bytes at least equal to
+ * trigger level is sent to the stream buffer. If the parameter is NULL, it will use the default
+ * implementation provided by sbSEND_COMPLETED macro. To enable the callback,
+ * configUSE_SB_COMPLETED_CALLBACK must be set to 1 in FreeRTOSConfig.h.
+ *
+ * @param pxReceiveCompletedCallback Callback invoked when more than zero bytes are read from a
+ * stream buffer. If the parameter is NULL, it will use the default
+ * implementation provided by sbRECEIVE_COMPLETED macro. To enable the callback,
+ * configUSE_SB_COMPLETED_CALLBACK must be set to 1 in FreeRTOSConfig.h.
+ *
+ * @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
+ * \defgroup xStreamBufferCreate xStreamBufferCreate
+ * \ingroup StreamBufferManagement
+ */
+
+#define xStreamBufferCreate( xBufferSizeBytes, xTriggerLevelBytes ) \
+    xStreamBufferGenericCreate( ( xBufferSizeBytes ), ( xTriggerLevelBytes ), pdFALSE, NULL, NULL )
+
+#if ( configUSE_SB_COMPLETED_CALLBACK == 1 )
+    #define xStreamBufferCreateWithCallback( xBufferSizeBytes, xTriggerLevelBytes, pxSendCompletedCallback, pxReceiveCompletedCallback ) \
+    xStreamBufferGenericCreate( ( xBufferSizeBytes ), ( xTriggerLevelBytes ), pdFALSE, ( pxSendCompletedCallback ), ( pxReceiveCompletedCallback ) )
+#endif
+
+/**
+ * stream_buffer.h
+ *
+ * @code{c}
+ * StreamBufferHandle_t xStreamBufferCreateStatic( size_t xBufferSizeBytes,
+ *                                              size_t xTriggerLevelBytes,
+ *                                              uint8_t *pucStreamBufferStorageArea,
+ *                                              StaticStreamBuffer_t *pxStaticStreamBuffer );
+ * @endcode
+ * 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 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.
+ *
+ * @param pxSendCompletedCallback Callback invoked when number of bytes at least equal to
+ * trigger level is sent to the stream buffer. If the parameter is NULL, it will use the default
+ * implementation provided by sbSEND_COMPLETED macro. To enable the callback,
+ * configUSE_SB_COMPLETED_CALLBACK must be set to 1 in FreeRTOSConfig.h.
+ *
+ * @param pxReceiveCompletedCallback Callback invoked when more than zero bytes are read from a
+ * stream buffer. If the parameter is NULL, it will use the default
+ * implementation provided by sbRECEIVE_COMPLETED macro. To enable the callback,
+ * configUSE_SB_COMPLETED_CALLBACK must be set to 1 in FreeRTOSConfig.h.
+ *
+ * @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( ucStorageBuffer ),
+ *                                             xTriggerLevel,
+ *                                             ucStorageBuffer,
+ *                                             &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
+ * \defgroup xStreamBufferCreateStatic xStreamBufferCreateStatic
+ * \ingroup StreamBufferManagement
+ */
+
+#define xStreamBufferCreateStatic( xBufferSizeBytes, xTriggerLevelBytes, pucStreamBufferStorageArea, pxStaticStreamBuffer ) \
+    xStreamBufferGenericCreateStatic( ( xBufferSizeBytes ), ( xTriggerLevelBytes ), pdFALSE, ( pucStreamBufferStorageArea ), ( pxStaticStreamBuffer ), NULL, NULL )
+
+#if ( configUSE_SB_COMPLETED_CALLBACK == 1 )
+    #define xStreamBufferCreateStaticWithCallback( xBufferSizeBytes, xTriggerLevelBytes, pucStreamBufferStorageArea, pxStaticStreamBuffer, pxSendCompletedCallback, pxReceiveCompletedCallback ) \
+    xStreamBufferGenericCreateStatic( ( xBufferSizeBytes ), ( xTriggerLevelBytes ), pdFALSE, ( pucStreamBufferStorageArea ), ( pxStaticStreamBuffer ), ( pxSendCompletedCallback ), ( pxReceiveCompletedCallback ) )
+#endif
+
+/**
+ * stream_buffer.h
+ *
+ * @code{c}
+ * size_t xStreamBufferSend( StreamBufferHandle_t xStreamBuffer,
+ *                        const void *pvTxData,
+ *                        size_t xDataLengthBytes,
+ *                        TickType_t xTicksToWait );
+ * @endcode
+ *
+ * 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 xStreamBufferReceive()) 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
+ * \defgroup xStreamBufferSend xStreamBufferSend
+ * \ingroup StreamBufferManagement
+ */
+size_t xStreamBufferSend( StreamBufferHandle_t xStreamBuffer,
+                          const void * pvTxData,
+                          size_t xDataLengthBytes,
+                          TickType_t xTicksToWait ) PRIVILEGED_FUNCTION;
+
+/**
+ * stream_buffer.h
+ *
+ * @code{c}
+ * size_t xStreamBufferSendFromISR( StreamBufferHandle_t xStreamBuffer,
+ *                               const void *pvTxData,
+ *                               size_t xDataLengthBytes,
+ *                               BaseType_t *pxHigherPriorityTaskWoken );
+ * @endcode
+ *
+ * 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 xStreamBufferReceive()) 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 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
+ * \defgroup xStreamBufferSendFromISR xStreamBufferSendFromISR
+ * \ingroup StreamBufferManagement
+ */
+size_t xStreamBufferSendFromISR( StreamBufferHandle_t xStreamBuffer,
+                                 const void * pvTxData,
+                                 size_t xDataLengthBytes,
+                                 BaseType_t * const pxHigherPriorityTaskWoken ) PRIVILEGED_FUNCTION;
+
+/**
+ * stream_buffer.h
+ *
+ * @code{c}
+ * size_t xStreamBufferReceive( StreamBufferHandle_t xStreamBuffer,
+ *                           void *pvRxData,
+ *                           size_t xBufferLengthBytes,
+ *                           TickType_t xTicksToWait );
+ * @endcode
+ *
+ * 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 xStreamBufferReceive()) 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 xReceivedBytes bytes of data, which can
+ *      // be processed here....
+ *  }
+ * }
+ * @endcode
+ * \defgroup xStreamBufferReceive xStreamBufferReceive
+ * \ingroup StreamBufferManagement
+ */
+size_t xStreamBufferReceive( StreamBufferHandle_t xStreamBuffer,
+                             void * pvRxData,
+                             size_t xBufferLengthBytes,
+                             TickType_t xTicksToWait ) PRIVILEGED_FUNCTION;
+
+/**
+ * stream_buffer.h
+ *
+ * @code{c}
+ * size_t xStreamBufferReceiveFromISR( StreamBufferHandle_t xStreamBuffer,
+ *                                  void *pvRxData,
+ *                                  size_t xBufferLengthBytes,
+ *                                  BaseType_t *pxHigherPriorityTaskWoken );
+ * @endcode
+ *
+ * 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 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
+ * \defgroup xStreamBufferReceiveFromISR xStreamBufferReceiveFromISR
+ * \ingroup StreamBufferManagement
+ */
+size_t xStreamBufferReceiveFromISR( StreamBufferHandle_t xStreamBuffer,
+                                    void * pvRxData,
+                                    size_t xBufferLengthBytes,
+                                    BaseType_t * const pxHigherPriorityTaskWoken ) PRIVILEGED_FUNCTION;
+
+/**
+ * stream_buffer.h
+ *
+ * @code{c}
+ * void vStreamBufferDelete( StreamBufferHandle_t xStreamBuffer );
+ * @endcode
+ *
+ * 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.
+ *
+ * \defgroup vStreamBufferDelete vStreamBufferDelete
+ * \ingroup StreamBufferManagement
+ */
+void vStreamBufferDelete( StreamBufferHandle_t xStreamBuffer ) PRIVILEGED_FUNCTION;
+
+/**
+ * stream_buffer.h
+ *
+ * @code{c}
+ * BaseType_t xStreamBufferIsFull( StreamBufferHandle_t xStreamBuffer );
+ * @endcode
+ *
+ * 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.
+ *
+ * \defgroup xStreamBufferIsFull xStreamBufferIsFull
+ * \ingroup StreamBufferManagement
+ */
+BaseType_t xStreamBufferIsFull( StreamBufferHandle_t xStreamBuffer ) PRIVILEGED_FUNCTION;
+
+/**
+ * stream_buffer.h
+ *
+ * @code{c}
+ * BaseType_t xStreamBufferIsEmpty( StreamBufferHandle_t xStreamBuffer );
+ * @endcode
+ *
+ * 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.
+ *
+ * \defgroup xStreamBufferIsEmpty xStreamBufferIsEmpty
+ * \ingroup StreamBufferManagement
+ */
+BaseType_t xStreamBufferIsEmpty( StreamBufferHandle_t xStreamBuffer ) PRIVILEGED_FUNCTION;
+
+/**
+ * stream_buffer.h
+ *
+ * @code{c}
+ * BaseType_t xStreamBufferReset( StreamBufferHandle_t xStreamBuffer );
+ * @endcode
+ *
+ * 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.
+ *
+ * \defgroup xStreamBufferReset xStreamBufferReset
+ * \ingroup StreamBufferManagement
+ */
+BaseType_t xStreamBufferReset( StreamBufferHandle_t xStreamBuffer ) PRIVILEGED_FUNCTION;
+
+/**
+ * stream_buffer.h
+ *
+ * @code{c}
+ * size_t xStreamBufferSpacesAvailable( StreamBufferHandle_t xStreamBuffer );
+ * @endcode
+ *
+ * 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;
+
+/**
+ * stream_buffer.h
+ *
+ * @code{c}
+ * size_t xStreamBufferBytesAvailable( StreamBufferHandle_t xStreamBuffer );
+ * @endcode
+ *
+ * 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;
+
+/**
+ * stream_buffer.h
+ *
+ * @code{c}
+ * BaseType_t xStreamBufferSetTriggerLevel( StreamBufferHandle_t xStreamBuffer, size_t xTriggerLevel );
+ * @endcode
+ *
+ * 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.
+ *
+ * \defgroup xStreamBufferSetTriggerLevel xStreamBufferSetTriggerLevel
+ * \ingroup StreamBufferManagement
+ */
+BaseType_t xStreamBufferSetTriggerLevel( StreamBufferHandle_t xStreamBuffer,
+                                         size_t xTriggerLevel ) PRIVILEGED_FUNCTION;
+
+/**
+ * stream_buffer.h
+ *
+ * @code{c}
+ * BaseType_t xStreamBufferSendCompletedFromISR( StreamBufferHandle_t xStreamBuffer, BaseType_t *pxHigherPriorityTaskWoken );
+ * @endcode
+ *
+ * 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.
+ *
+ * \defgroup xStreamBufferSendCompletedFromISR xStreamBufferSendCompletedFromISR
+ * \ingroup StreamBufferManagement
+ */
+BaseType_t xStreamBufferSendCompletedFromISR( StreamBufferHandle_t xStreamBuffer,
+                                              BaseType_t * pxHigherPriorityTaskWoken ) PRIVILEGED_FUNCTION;
+
+/**
+ * stream_buffer.h
+ *
+ * @code{c}
+ * BaseType_t xStreamBufferReceiveCompletedFromISR( StreamBufferHandle_t xStreamBuffer, BaseType_t *pxHigherPriorityTaskWoken );
+ * @endcode
+ *
+ * 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.
+ *
+ * \defgroup xStreamBufferReceiveCompletedFromISR xStreamBufferReceiveCompletedFromISR
+ * \ingroup StreamBufferManagement
+ */
+BaseType_t xStreamBufferReceiveCompletedFromISR( StreamBufferHandle_t xStreamBuffer,
+                                                 BaseType_t * pxHigherPriorityTaskWoken ) PRIVILEGED_FUNCTION;
+
+/* Functions below here are not part of the public API. */
+StreamBufferHandle_t xStreamBufferGenericCreate( size_t xBufferSizeBytes,
+                                                 size_t xTriggerLevelBytes,
+                                                 BaseType_t xIsMessageBuffer,
+                                                 StreamBufferCallbackFunction_t pxSendCompletedCallback,
+                                                 StreamBufferCallbackFunction_t pxReceiveCompletedCallback ) PRIVILEGED_FUNCTION;
+
+
+StreamBufferHandle_t xStreamBufferGenericCreateStatic( size_t xBufferSizeBytes,
+                                                       size_t xTriggerLevelBytes,
+                                                       BaseType_t xIsMessageBuffer,
+                                                       uint8_t * const pucStreamBufferStorageArea,
+                                                       StaticStreamBuffer_t * const pxStaticStreamBuffer,
+                                                       StreamBufferCallbackFunction_t pxSendCompletedCallback,
+                                                       StreamBufferCallbackFunction_t pxReceiveCompletedCallback ) 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
+
+/* *INDENT-OFF* */
+#if defined( __cplusplus )
+    }
+#endif
+/* *INDENT-ON* */
+
+#endif /* !defined( STREAM_BUFFER_H ) */