First pass at updating from MISRA 2004 to MISRA 2012:
Updated pvContainer member of list items to List_t * rather than void * as they are always contained in a list if anywhere.
Made EventGroupHandle_t typesafe pointer to forward referenced struct rather than void pointer.
Made TaskHandle_t typesafe pointer to forward referenced struct, rather than a void pointer.

diff --git a/FreeRTOS/Source/croutine.c b/FreeRTOS/Source/croutine.c
index b995073..13c1633 100644
--- a/FreeRTOS/Source/croutine.c
+++ b/FreeRTOS/Source/croutine.c
@@ -260,7 +260,7 @@
 				( void ) uxListRemove( &( pxCRCB->xGenericListItem ) );

 

 				/* Is the co-routine waiting on an event also? */

-				if( pxCRCB->xEventListItem.pvContainer )

+				if( pxCRCB->xEventListItem.pxContainer )

 				{

 					( void ) uxListRemove( &( pxCRCB->xEventListItem ) );

 				}

diff --git a/FreeRTOS/Source/event_groups.c b/FreeRTOS/Source/event_groups.c
index 4257950..97bf966 100644
--- a/FreeRTOS/Source/event_groups.c
+++ b/FreeRTOS/Source/event_groups.c
@@ -39,11 +39,11 @@
 #include "timers.h"

 #include "event_groups.h"

 

-/* Lint e961 and e750 are suppressed as a MISRA exception justified because the

-MPU ports require MPU_WRAPPERS_INCLUDED_FROM_API_FILE to be defined for the

-header files above, but not in this file, in order to generate the correct

-privileged Vs unprivileged linkage and placement. */

-#undef MPU_WRAPPERS_INCLUDED_FROM_API_FILE /*lint !e961 !e750. */

+/* Lint e961, e750 and e9021 are suppressed as a MISRA exception justified

+because the MPU ports require MPU_WRAPPERS_INCLUDED_FROM_API_FILE to be defined

+for the header files above, but not in this file, in order to generate the

+correct privileged Vs unprivileged linkage and placement. */

+#undef MPU_WRAPPERS_INCLUDED_FROM_API_FILE /*lint !e961 !e750 !e9021 See comment above. */

 

 /* The following bit fields convey control information in a task's event list

 item value.  It is important they don't clash with the

@@ -60,7 +60,7 @@
 	#define eventEVENT_BITS_CONTROL_BYTES	0xff000000UL

 #endif

 

-typedef struct xEventGroupDefinition

+typedef struct xEventGroup

 {

 	EventBits_t uxEventBits;

 	List_t xTasksWaitingForBits;		/*< List of tasks waiting for a bit to be set. */

@@ -104,11 +104,11 @@
 			event group structure. */

 			volatile size_t xSize = sizeof( StaticEventGroup_t );

 			configASSERT( xSize == sizeof( EventGroup_t ) );

-		}

+		} /*lint !e529 xSize is referenced if configASSERT() is defined. */

 		#endif /* configASSERT_DEFINED */

 

 		/* The user has provided a statically allocated event group - use it. */

-		pxEventBits = ( EventGroup_t * ) pxEventGroupBuffer; /*lint !e740 EventGroup_t and StaticEventGroup_t are guaranteed to have the same size and alignment requirement - checked by configASSERT(). */

+		pxEventBits = ( EventGroup_t * ) pxEventGroupBuffer; /*lint !e740 !e9087 EventGroup_t and StaticEventGroup_t are deliberately aliased for data hiding purposes and guaranteed to have the same size and alignment requirement - checked by configASSERT(). */

 

 		if( pxEventBits != NULL )

 		{

@@ -128,10 +128,13 @@
 		}

 		else

 		{

+			/* xEventGroupCreateStatic should only ever be called with

+			pxEventGroupBuffer pointing to a pre-allocated (compile time

+			allocated) StaticEventGroup_t variable. */

 			traceEVENT_GROUP_CREATE_FAILED();

 		}

 

-		return ( EventGroupHandle_t ) pxEventBits;

+		return ( EventGroupHandle_t ) pxEventBits; /*lint !e9087 EventGroup_t and StaticEventGroup_t are deliberately aliased for data hiding purposes and guaranteed to have the same size and alignment requirement - checked by configASSERT(). */

 	}

 

 #endif /* configSUPPORT_STATIC_ALLOCATION */

@@ -143,8 +146,20 @@
 	{

 	EventGroup_t *pxEventBits;

 

-		/* Allocate the event group. */

-		pxEventBits = ( EventGroup_t * ) pvPortMalloc( sizeof( EventGroup_t ) );

+		/* Allocate the event group.  Justification for MISRA deviation as

+		follows:  pvPortMalloc() always ensures returned memory blocks are

+		aligned per the requirements of the MCU stack.  In this case

+		pvPortMalloc() must return a pointer that is guaranteed to meet the

+		alignment requirements of the EventGroup_t structure - which (if you

+		follow it through) is the alignment requirements of the TickType_t type

+		(EventBits_t being of TickType_t itself).  Therefore, whenever the

+		stack alignment requirements are greater than or equal to the

+		TickType_t alignment requirements the cast is safe.  In other cases,

+		where the natural word size of the architecture is less than

+		sizeof( TickType_t ), the TickType_t variables will be accessed in two

+		or more reads operations, and the alignment requirements is only that

+		of each individual read. */

+		pxEventBits = ( EventGroup_t * ) pvPortMalloc( sizeof( EventGroup_t ) ); /*lint !e9087 !e9079 see comment above. */

 

 		if( pxEventBits != NULL )

 		{

@@ -164,10 +179,10 @@
 		}

 		else

 		{

-			traceEVENT_GROUP_CREATE_FAILED();

+			traceEVENT_GROUP_CREATE_FAILED(); /*lint !e9063 Else branch only exists to allow tracing and does not generate code if trace macros are not defined. */

 		}

 

-		return ( EventGroupHandle_t ) pxEventBits;

+		return ( EventGroupHandle_t ) pxEventBits; /*lint !e9087 EventGroupHandle_t is a pointer to an EventGroup_t, but EventGroupHandle_t is kept opaque outside of this file for data hiding purposes. */

 	}

 

 #endif /* configSUPPORT_DYNAMIC_ALLOCATION */

@@ -176,7 +191,7 @@
 EventBits_t xEventGroupSync( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToSet, const EventBits_t uxBitsToWaitFor, TickType_t xTicksToWait )

 {

 EventBits_t uxOriginalBitValue, uxReturn;

-EventGroup_t *pxEventBits = ( EventGroup_t * ) xEventGroup;

+EventGroup_t *pxEventBits = ( EventGroup_t * ) xEventGroup; /*lint !e9087 !e9079 EventGroupHandle_t is a pointer to an EventGroup_t.  It is opaque outside of this file for data hiding purposes. */

 BaseType_t xAlreadyYielded;

 BaseType_t xTimeoutOccurred = pdFALSE;

 

@@ -295,7 +310,7 @@
 

 EventBits_t xEventGroupWaitBits( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToWaitFor, const BaseType_t xClearOnExit, const BaseType_t xWaitForAllBits, TickType_t xTicksToWait )

 {

-EventGroup_t *pxEventBits = ( EventGroup_t * ) xEventGroup;

+EventGroup_t *pxEventBits = ( EventGroup_t * ) xEventGroup; /*lint !e9087 !e9079 EventGroupHandle_t is a pointer to an EventGroup_t.  It is opaque outside of this file for data hiding purposes. */

 EventBits_t uxReturn, uxControlBits = 0;

 BaseType_t xWaitConditionMet, xAlreadyYielded;

 BaseType_t xTimeoutOccurred = pdFALSE;

@@ -445,7 +460,7 @@
 

 EventBits_t xEventGroupClearBits( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToClear )

 {

-EventGroup_t *pxEventBits = ( EventGroup_t * ) xEventGroup;

+EventGroup_t *pxEventBits = ( EventGroup_t * ) xEventGroup; /*lint !e9087 !e9079 EventGroupHandle_t is a pointer to an EventGroup_t, but EventGroupHandle_t is kept opaque outside of this file for data hiding purposes. */

 EventBits_t uxReturn;

 

 	/* Check the user is not attempting to clear the bits used by the kernel

@@ -477,7 +492,7 @@
 		BaseType_t xReturn;

 

 		traceEVENT_GROUP_CLEAR_BITS_FROM_ISR( xEventGroup, uxBitsToClear );

-		xReturn = xTimerPendFunctionCallFromISR( vEventGroupClearBitsCallback, ( void * ) xEventGroup, ( uint32_t ) uxBitsToClear, NULL );

+		xReturn = xTimerPendFunctionCallFromISR( vEventGroupClearBitsCallback, ( void * ) xEventGroup, ( uint32_t ) uxBitsToClear, NULL ); /*lint !e9087 Can't avoid cast to void* as a generic callback function not specific to this use case. Callback casts back to original type so safe. */

 

 		return xReturn;

 	}

@@ -488,7 +503,7 @@
 EventBits_t xEventGroupGetBitsFromISR( EventGroupHandle_t xEventGroup )

 {

 UBaseType_t uxSavedInterruptStatus;

-EventGroup_t *pxEventBits = ( EventGroup_t * ) xEventGroup;

+EventGroup_t const * const pxEventBits = ( EventGroup_t * ) xEventGroup; /*lint !e9087 !e9079 EventGroupHandle_t is a pointer to an EventGroup_t, but EventGroupHandle_t is kept opaque outside of this file for data hiding purposes. */

 EventBits_t uxReturn;

 

 	uxSavedInterruptStatus = portSET_INTERRUPT_MASK_FROM_ISR();

@@ -498,16 +513,16 @@
 	portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedInterruptStatus );

 

 	return uxReturn;

-}

+} /*lint !e818 EventGroupHandle_t is a typedef used in other functions to so can't be pointer to const. */

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

 

 EventBits_t xEventGroupSetBits( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToSet )

 {

 ListItem_t *pxListItem, *pxNext;

 ListItem_t const *pxListEnd;

-List_t *pxList;

+List_t const * pxList;

 EventBits_t uxBitsToClear = 0, uxBitsWaitedFor, uxControlBits;

-EventGroup_t *pxEventBits = ( EventGroup_t * ) xEventGroup;

+EventGroup_t *pxEventBits = ( EventGroup_t * ) xEventGroup; /*lint !e9087 !e9079 EventGroupHandle_t is a pointer to an EventGroup_t, but EventGroupHandle_t is kept opaque outside of this file for data hiding purposes. */

 BaseType_t xMatchFound = pdFALSE;

 

 	/* Check the user is not attempting to set the bits used by the kernel

@@ -516,7 +531,7 @@
 	configASSERT( ( uxBitsToSet & eventEVENT_BITS_CONTROL_BYTES ) == 0 );

 

 	pxList = &( pxEventBits->xTasksWaitingForBits );

-	pxListEnd = listGET_END_MARKER( pxList ); /*lint !e826 !e740 The mini list structure is used as the list end to save RAM.  This is checked and valid. */

+	pxListEnd = listGET_END_MARKER( pxList ); /*lint !e826 !e740 !e9087 The mini list structure is used as the list end to save RAM.  This is checked and valid. */

 	vTaskSuspendAll();

 	{

 		traceEVENT_GROUP_SET_BITS( xEventGroup, uxBitsToSet );

@@ -597,7 +612,7 @@
 

 void vEventGroupDelete( EventGroupHandle_t xEventGroup )

 {

-EventGroup_t *pxEventBits = ( EventGroup_t * ) xEventGroup;

+EventGroup_t *pxEventBits = ( EventGroup_t * ) xEventGroup; /*lint !e9087 !e9079 EventGroupHandle_t is a pointer to an EventGroup_t, but EventGroupHandle_t is kept opaque outside of this file for data hiding purposes. */

 const List_t *pxTasksWaitingForBits = &( pxEventBits->xTasksWaitingForBits );

 

 	vTaskSuspendAll();

@@ -641,7 +656,7 @@
 an interrupt. */

 void vEventGroupSetBitsCallback( void *pvEventGroup, const uint32_t ulBitsToSet )

 {

-	( void ) xEventGroupSetBits( pvEventGroup, ( EventBits_t ) ulBitsToSet );

+	( void ) xEventGroupSetBits( pvEventGroup, ( EventBits_t ) ulBitsToSet ); /*lint !e9079 Can't avoid cast to void* as a generic timer callback prototype. Callback casts back to original type so safe. */

 }

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

 

@@ -649,7 +664,7 @@
 an interrupt. */

 void vEventGroupClearBitsCallback( void *pvEventGroup, const uint32_t ulBitsToClear )

 {

-	( void ) xEventGroupClearBits( pvEventGroup, ( EventBits_t ) ulBitsToClear );

+	( void ) xEventGroupClearBits( pvEventGroup, ( EventBits_t ) ulBitsToClear ); /*lint !e9079 Can't avoid cast to void* as a generic timer callback prototype. Callback casts back to original type so safe. */

 }

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

 

@@ -695,7 +710,7 @@
 	BaseType_t xReturn;

 

 		traceEVENT_GROUP_SET_BITS_FROM_ISR( xEventGroup, uxBitsToSet );

-		xReturn = xTimerPendFunctionCallFromISR( vEventGroupSetBitsCallback, ( void * ) xEventGroup, ( uint32_t ) uxBitsToSet, pxHigherPriorityTaskWoken );

+		xReturn = xTimerPendFunctionCallFromISR( vEventGroupSetBitsCallback, ( void * ) xEventGroup, ( uint32_t ) uxBitsToSet, pxHigherPriorityTaskWoken ); /*lint !e9087 Can't avoid cast to void* as a generic callback function not specific to this use case. Callback casts back to original type so safe. */

 

 		return xReturn;

 	}

@@ -708,7 +723,7 @@
 	UBaseType_t uxEventGroupGetNumber( void* xEventGroup )

 	{

 	UBaseType_t xReturn;

-	EventGroup_t *pxEventBits = ( EventGroup_t * ) xEventGroup;

+	EventGroup_t const *pxEventBits = ( EventGroup_t * ) xEventGroup; /*lint !e9087 !e9079 EventGroupHandle_t is a pointer to an EventGroup_t, but EventGroupHandle_t is kept opaque outside of this file for data hiding purposes. */

 

 		if( xEventGroup == NULL )

 		{

@@ -729,7 +744,7 @@
 

 	void vEventGroupSetNumber( void * xEventGroup, UBaseType_t uxEventGroupNumber )

 	{

-		( ( EventGroup_t * ) xEventGroup )->uxEventGroupNumber = uxEventGroupNumber;

+		( ( EventGroup_t * ) xEventGroup )->uxEventGroupNumber = uxEventGroupNumber; /*lint !e9087 !e9079 EventGroupHandle_t is a pointer to an EventGroup_t, but EventGroupHandle_t is kept opaque outside of this file for data hiding purposes. */

 	}

 

 #endif /* configUSE_TRACE_FACILITY */

diff --git a/FreeRTOS/Source/include/event_groups.h b/FreeRTOS/Source/include/event_groups.h
index 5064404..b93c0ec 100644
--- a/FreeRTOS/Source/include/event_groups.h
+++ b/FreeRTOS/Source/include/event_groups.h
@@ -78,7 +78,8 @@
  * \defgroup EventGroupHandle_t EventGroupHandle_t

  * \ingroup EventGroup

  */

-typedef void * EventGroupHandle_t;

+struct xEventGroup;

+typedef struct xEventGroup * EventGroupHandle_t;

 

 /*

  * The type that holds event bits always matches TickType_t - therefore the

@@ -404,7 +405,7 @@
  * \ingroup EventGroup

  */

 #if( configUSE_TRACE_FACILITY == 1 )

-	BaseType_t xEventGroupClearBitsFromISR( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToSet ) PRIVILEGED_FUNCTION;

+	BaseType_t xEventGroupClearBitsFromISR( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToClear ) PRIVILEGED_FUNCTION;

 #else

 	#define xEventGroupClearBitsFromISR( xEventGroup, uxBitsToClear ) xTimerPendFunctionCallFromISR( vEventGroupClearBitsCallback, ( void * ) xEventGroup, ( uint32_t ) uxBitsToClear, NULL )

 #endif

diff --git a/FreeRTOS/Source/include/list.h b/FreeRTOS/Source/include/list.h
index 431443f..2ec4a67 100644
--- a/FreeRTOS/Source/include/list.h
+++ b/FreeRTOS/Source/include/list.h
@@ -136,6 +136,7 @@
 /*

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

@@ -143,7 +144,7 @@
 	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. */

-	void * configLIST_VOLATILE pvContainer;				/*< Pointer to the list in which this list item is placed (if any). */

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

@@ -246,7 +247,7 @@
  * \page listLIST_IS_EMPTY listLIST_IS_EMPTY

  * \ingroup LinkedList

  */

-#define listLIST_IS_EMPTY( pxList )	( ( BaseType_t ) ( ( pxList )->uxNumberOfItems == ( UBaseType_t ) 0 ) )

+#define listLIST_IS_EMPTY( pxList )	( ( ( pxList )->uxNumberOfItems == ( UBaseType_t ) 0 ) ? pdTRUE : pdFALSE )

 

 /*

  * Access macro to return the number of items in the list.

@@ -314,7 +315,7 @@
  * @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 ) ( ( BaseType_t ) ( ( pxListItem )->pvContainer == ( void * ) ( pxList ) ) )

+#define listIS_CONTAINED_WITHIN( pxList, pxListItem ) ( ( ( pxListItem )->pxContainer == ( pxList ) ) ? pdTRUE : pdFALSE )

 

 /*

  * Return the list a list item is contained within (referenced from).

@@ -322,7 +323,7 @@
  * @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 )->pvContainer )

+#define listLIST_ITEM_CONTAINER( pxListItem ) ( ( pxListItem )->pxContainer )

 

 /*

  * This provides a crude means of knowing if a list has been initialised, as

diff --git a/FreeRTOS/Source/include/mpu_prototypes.h b/FreeRTOS/Source/include/mpu_prototypes.h
index d015cf7..6b87221 100644
--- a/FreeRTOS/Source/include/mpu_prototypes.h
+++ b/FreeRTOS/Source/include/mpu_prototypes.h
@@ -47,7 +47,7 @@
 void MPU_vTaskDelay( const TickType_t xTicksToDelay );

 void MPU_vTaskDelayUntil( TickType_t * const pxPreviousWakeTime, const TickType_t xTimeIncrement );

 BaseType_t MPU_xTaskAbortDelay( TaskHandle_t xTask );

-UBaseType_t MPU_uxTaskPriorityGet( TaskHandle_t xTask );

+UBaseType_t MPU_uxTaskPriorityGet( const TaskHandle_t xTask );

 eTaskState MPU_eTaskGetState( TaskHandle_t xTask );

 void MPU_vTaskGetInfo( TaskHandle_t xTask, TaskStatus_t *pxTaskStatus, BaseType_t xGetFreeStackSpace, eTaskState eState );

 void MPU_vTaskPrioritySet( TaskHandle_t xTask, UBaseType_t uxNewPriority );

diff --git a/FreeRTOS/Source/include/task.h b/FreeRTOS/Source/include/task.h
index 979cc4d..7d0bf1f 100644
--- a/FreeRTOS/Source/include/task.h
+++ b/FreeRTOS/Source/include/task.h
@@ -58,7 +58,8 @@
  * \defgroup TaskHandle_t TaskHandle_t

  * \ingroup Tasks

  */

-typedef void * TaskHandle_t;

+struct xTaskControlBlock;

+typedef struct xTaskControlBlock* TaskHandle_t;

 

 /*

  * Defines the prototype to which the application task hook function must

@@ -74,7 +75,7 @@
 	eBlocked,		/* The task being queried is in the Blocked state. */

 	eSuspended,		/* The task being queried is in the Suspended state, or is in the Blocked state with an infinite time out. */

 	eDeleted,		/* The task being queried has been deleted, but its TCB has not yet been freed. */

-	eInvalid			/* Used as an 'invalid state' value. */

+	eInvalid		/* Used as an 'invalid state' value. */

 } eTaskState;

 

 /* Actions that can be performed when vTaskNotify() is called. */

@@ -834,7 +835,7 @@
 

 /**

  * task. h

- * <pre>UBaseType_t uxTaskPriorityGet( TaskHandle_t xTask );</pre>

+ * <pre>UBaseType_t uxTaskPriorityGet( const TaskHandle_t xTask );</pre>

  *

  * INCLUDE_uxTaskPriorityGet must be defined as 1 for this function to be available.

  * See the configuration section for more information.

@@ -877,15 +878,15 @@
  * \defgroup uxTaskPriorityGet uxTaskPriorityGet

  * \ingroup TaskCtrl

  */

-UBaseType_t uxTaskPriorityGet( TaskHandle_t xTask ) PRIVILEGED_FUNCTION;

+UBaseType_t uxTaskPriorityGet( const TaskHandle_t xTask ) PRIVILEGED_FUNCTION;

 

 /**

  * task. h

- * <pre>UBaseType_t uxTaskPriorityGetFromISR( TaskHandle_t xTask );</pre>

+ * <pre>UBaseType_t uxTaskPriorityGetFromISR( const TaskHandle_t xTask );</pre>

  *

  * A version of uxTaskPriorityGet() that can be used from an ISR.

  */

-UBaseType_t uxTaskPriorityGetFromISR( TaskHandle_t xTask ) PRIVILEGED_FUNCTION;

+UBaseType_t uxTaskPriorityGetFromISR( const TaskHandle_t xTask ) PRIVILEGED_FUNCTION;

 

 /**

  * task. h

diff --git a/FreeRTOS/Source/list.c b/FreeRTOS/Source/list.c
index 88191c5..7d88ec9 100644
--- a/FreeRTOS/Source/list.c
+++ b/FreeRTOS/Source/list.c
@@ -39,7 +39,7 @@
 	/* The list structure contains a list item which is used to mark the

 	end of the list.  To initialise the list the list end is inserted

 	as the only list entry. */

-	pxList->pxIndex = ( ListItem_t * ) &( pxList->xListEnd );			/*lint !e826 !e740 The mini list structure is used as the list end to save RAM.  This is checked and valid. */

+	pxList->pxIndex = ( ListItem_t * ) &( pxList->xListEnd );			/*lint !e826 !e740 !e9087 The mini list structure is used as the list end to save RAM.  This is checked and valid. */

 

 	/* The list end value is the highest possible value in the list to

 	ensure it remains at the end of the list. */

@@ -47,8 +47,8 @@
 

 	/* The list end next and previous pointers point to itself so we know

 	when the list is empty. */

-	pxList->xListEnd.pxNext = ( ListItem_t * ) &( pxList->xListEnd );	/*lint !e826 !e740 The mini list structure is used as the list end to save RAM.  This is checked and valid. */

-	pxList->xListEnd.pxPrevious = ( ListItem_t * ) &( pxList->xListEnd );/*lint !e826 !e740 The mini list structure is used as the list end to save RAM.  This is checked and valid. */

+	pxList->xListEnd.pxNext = ( ListItem_t * ) &( pxList->xListEnd );	/*lint !e826 !e740 !e9087 The mini list structure is used as the list end to save RAM.  This is checked and valid. */

+	pxList->xListEnd.pxPrevious = ( ListItem_t * ) &( pxList->xListEnd );/*lint !e826 !e740 !e9087 The mini list structure is used as the list end to save RAM.  This is checked and valid. */

 

 	pxList->uxNumberOfItems = ( UBaseType_t ) 0U;

 

@@ -62,7 +62,7 @@
 void vListInitialiseItem( ListItem_t * const pxItem )

 {

 	/* Make sure the list item is not recorded as being on a list. */

-	pxItem->pvContainer = NULL;

+	pxItem->pxContainer = NULL;

 

 	/* Write known values into the list item if

 	configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES is set to 1. */

@@ -94,7 +94,7 @@
 	pxIndex->pxPrevious = pxNewListItem;

 

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

-	pxNewListItem->pvContainer = ( void * ) pxList;

+	pxNewListItem->pxContainer = pxList;

 

 	( pxList->uxNumberOfItems )++;

 }

@@ -127,18 +127,18 @@
 	{

 		/* *** NOTE ***********************************************************

 		If you find your application is crashing here then likely causes are

-		listed below.  In addition see http://www.freertos.org/FAQHelp.html for

+		listed below.  In addition see https://www.freertos.org/FAQHelp.html for

 		more tips, and ensure configASSERT() is defined!

-		http://www.freertos.org/a00110.html#configASSERT

+		https://www.freertos.org/a00110.html#configASSERT

 

 			1) Stack overflow -

-			   see http://www.freertos.org/Stacks-and-stack-overflow-checking.html

+			   see https://www.freertos.org/Stacks-and-stack-overflow-checking.html

 			2) Incorrect interrupt priority assignment, especially on Cortex-M

 			   parts where numerically high priority values denote low actual

 			   interrupt priorities, which can seem counter intuitive.  See

-			   http://www.freertos.org/RTOS-Cortex-M3-M4.html and the definition

+			   https://www.freertos.org/RTOS-Cortex-M3-M4.html and the definition

 			   of configMAX_SYSCALL_INTERRUPT_PRIORITY on

-			   http://www.freertos.org/a00110.html

+			   https://www.freertos.org/a00110.html

 			3) Calling an API function from within a critical section or when

 			   the scheduler is suspended, or calling an API function that does

 			   not end in "FromISR" from an interrupt.

@@ -147,7 +147,7 @@
 			   before vTaskStartScheduler() has been called?).

 		**********************************************************************/

 

-		for( pxIterator = ( ListItem_t * ) &( pxList->xListEnd ); pxIterator->pxNext->xItemValue <= xValueOfInsertion; pxIterator = pxIterator->pxNext ) /*lint !e826 !e740 The mini list structure is used as the list end to save RAM.  This is checked and valid. */

+		for( pxIterator = ( ListItem_t * ) &( pxList->xListEnd ); pxIterator->pxNext->xItemValue <= xValueOfInsertion; pxIterator = pxIterator->pxNext ) /*lint !e826 !e740 !e9087 The mini list structure is used as the list end to save RAM.  This is checked and valid. *//*lint !e440 The iterator moves to a different value, not xValueOfInsertion. */

 		{

 			/* There is nothing to do here, just iterating to the wanted

 			insertion position. */

@@ -161,7 +161,7 @@
 

 	/* Remember which list the item is in.  This allows fast removal of the

 	item later. */

-	pxNewListItem->pvContainer = ( void * ) pxList;

+	pxNewListItem->pxContainer = pxList;

 

 	( pxList->uxNumberOfItems )++;

 }

@@ -171,7 +171,7 @@
 {

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

 item. */

-List_t * const pxList = ( List_t * ) pxItemToRemove->pvContainer;

+List_t * const pxList = pxItemToRemove->pxContainer;

 

 	pxItemToRemove->pxNext->pxPrevious = pxItemToRemove->pxPrevious;

 	pxItemToRemove->pxPrevious->pxNext = pxItemToRemove->pxNext;

@@ -189,7 +189,7 @@
 		mtCOVERAGE_TEST_MARKER();

 	}

 

-	pxItemToRemove->pvContainer = NULL;

+	pxItemToRemove->pxContainer = NULL;

 	( pxList->uxNumberOfItems )--;

 

 	return pxList->uxNumberOfItems;

diff --git a/FreeRTOS/Source/portable/Common/mpu_wrappers.c b/FreeRTOS/Source/portable/Common/mpu_wrappers.c
index 5bdbc10..b08a834 100644
--- a/FreeRTOS/Source/portable/Common/mpu_wrappers.c
+++ b/FreeRTOS/Source/portable/Common/mpu_wrappers.c
@@ -163,7 +163,7 @@
 /*-----------------------------------------------------------*/

 

 #if ( INCLUDE_uxTaskPriorityGet == 1 )

-	UBaseType_t MPU_uxTaskPriorityGet( TaskHandle_t pxTask )

+	UBaseType_t MPU_uxTaskPriorityGet( const TaskHandle_t pxTask )

 	{

 	UBaseType_t uxReturn;

 	BaseType_t xRunningPrivileged = xPortRaisePrivilege();

diff --git a/FreeRTOS/Source/tasks.c b/FreeRTOS/Source/tasks.c
index 41c47f8..3a262fd 100644
--- a/FreeRTOS/Source/tasks.c
+++ b/FreeRTOS/Source/tasks.c
@@ -40,11 +40,11 @@
 #include "timers.h"

 #include "stack_macros.h"

 

-/* Lint e961 and e750 are suppressed as a MISRA exception justified because the

-MPU ports require MPU_WRAPPERS_INCLUDED_FROM_API_FILE to be defined for the

-header files above, but not in this file, in order to generate the correct

-privileged Vs unprivileged linkage and placement. */

-#undef MPU_WRAPPERS_INCLUDED_FROM_API_FILE /*lint !e961 !e750. */

+/* Lint e9021, e961 and e750 are suppressed as a MISRA exception justified

+because the MPU ports require MPU_WRAPPERS_INCLUDED_FROM_API_FILE to be defined

+for the header files above, but not in this file, in order to generate the

+correct privileged Vs unprivileged linkage and placement. */

+#undef MPU_WRAPPERS_INCLUDED_FROM_API_FILE /*lint !e961 !e750 !e9021. */

 

 /* Set configUSE_STATS_FORMATTING_FUNCTIONS to 2 to include the stats formatting

 functions but without including stdio.h here. */

@@ -245,7 +245,7 @@
  * task should be used in place of the parameter.  This macro simply checks to

  * see if the parameter is NULL and returns a pointer to the appropriate TCB.

  */

-#define prvGetTCBFromHandle( pxHandle ) ( ( ( pxHandle ) == NULL ) ? ( TCB_t * ) pxCurrentTCB : ( TCB_t * ) ( pxHandle ) )

+#define prvGetTCBFromHandle( pxHandle ) ( ( ( pxHandle ) == NULL ) ? pxCurrentTCB : ( pxHandle ) )

 

 /* The item value of the event list item is normally used to hold the priority

 of the task to which it belongs (coded to allow it to be held in reverse

@@ -266,7 +266,7 @@
  * and stores task state information, including a pointer to the task's context

  * (the task's run time environment, including register values)

  */

-typedef struct tskTaskControlBlock

+typedef struct xTaskControlBlock

 {

 	volatile StackType_t	*pxTopOfStack;	/*< Points to the location of the last item placed on the tasks stack.  THIS MUST BE THE FIRST MEMBER OF THE TCB STRUCT. */

 

@@ -328,7 +328,7 @@
 

 	/* See the comments above the definition of

 	tskSTATIC_AND_DYNAMIC_ALLOCATION_POSSIBLE. */

-	#if( tskSTATIC_AND_DYNAMIC_ALLOCATION_POSSIBLE != 0 ) /*lint !e731 Macro has been consolidated for readability reasons. */

+	#if( tskSTATIC_AND_DYNAMIC_ALLOCATION_POSSIBLE != 0 ) /*lint !e731 !e9029 Macro has been consolidated for readability reasons. */

 		uint8_t	ucStaticallyAllocated; 		/*< Set to pdTRUE if the task is a statically allocated to ensure no attempt is made to free the memory. */

 	#endif

 

@@ -344,13 +344,10 @@
 

 /*lint -save -e956 A manual analysis and inspection has been used to determine

 which static variables must be declared volatile. */

-

 PRIVILEGED_DATA TCB_t * volatile pxCurrentTCB = NULL;

 

 /* Lists for ready and blocked tasks. --------------------*/

 PRIVILEGED_DATA static List_t pxReadyTasksLists[ configMAX_PRIORITIES ];/*< Prioritised ready tasks. */

-PRIVILEGED_DATA static List_t xDelayedTaskList1;						/*< Delayed tasks. */

-PRIVILEGED_DATA static List_t xDelayedTaskList2;						/*< Delayed tasks (two lists are used - one for delays that have overflowed the current tick count. */

 PRIVILEGED_DATA static List_t * volatile pxDelayedTaskList;				/*< Points to the delayed task list currently being used. */

 PRIVILEGED_DATA static List_t * volatile pxOverflowDelayedTaskList;		/*< Points to the delayed task list currently being used to hold tasks that have overflowed the current tick count. */

 PRIVILEGED_DATA static List_t xPendingReadyList;						/*< Tasks that have been readied while the scheduler was suspended.  They will be moved to the ready list when the scheduler is resumed. */

@@ -390,13 +387,6 @@
 accessed from a critical section. */

 PRIVILEGED_DATA static volatile UBaseType_t uxSchedulerSuspended	= ( UBaseType_t ) pdFALSE;

 

-#if ( configGENERATE_RUN_TIME_STATS == 1 )

-

-	PRIVILEGED_DATA static uint32_t ulTaskSwitchedInTime = 0UL;	/*< Holds the value of a timer/counter the last time a task was switched in. */

-	PRIVILEGED_DATA static uint32_t ulTotalRunTime = 0UL;		/*< Holds the total amount of execution time as defined by the run time counter clock. */

-

-#endif

-

 /*lint -restore */

 

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

@@ -410,13 +400,13 @@
 

 #if( configUSE_TICK_HOOK > 0 )

 

-	extern void vApplicationTickHook( void );

+	extern void vApplicationTickHook( void ); /*lint !e526 Symbol not defined as it is an application callback. */

 

 #endif

 

 #if( configSUPPORT_STATIC_ALLOCATION == 1 )

 

-	extern void vApplicationGetIdleTaskMemory( StaticTask_t **ppxIdleTaskTCBBuffer, StackType_t **ppxIdleTaskStackBuffer, uint32_t *pulIdleTaskStackSize );

+	extern void vApplicationGetIdleTaskMemory( StaticTask_t **ppxIdleTaskTCBBuffer, StackType_t **ppxIdleTaskStackBuffer, uint32_t *pulIdleTaskStackSize ); /*lint !e526 Symbol not defined as it is an application callback. */

 

 #endif

 

@@ -599,6 +589,7 @@
 			structure. */

 			volatile size_t xSize = sizeof( StaticTask_t );

 			configASSERT( xSize == sizeof( TCB_t ) );

+			( void ) xSize; /* Prevent lint warning when configASSERT() is not used. */

 		}

 		#endif /* configASSERT_DEFINED */

 

@@ -607,10 +598,10 @@
 		{

 			/* The memory used for the task's TCB and stack are passed into this

 			function - use them. */

-			pxNewTCB = ( TCB_t * ) pxTaskBuffer; /*lint !e740 Unusual cast is ok as the structures are designed to have the same alignment, and the size is checked by an assert. */

+			pxNewTCB = ( TCB_t * ) pxTaskBuffer; /*lint !e740 !e9087 Unusual cast is ok as the structures are designed to have the same alignment, and the size is checked by an assert. */

 			pxNewTCB->pxStack = ( StackType_t * ) puxStackBuffer;

 

-			#if( tskSTATIC_AND_DYNAMIC_ALLOCATION_POSSIBLE != 0 ) /*lint !e731 Macro has been consolidated for readability reasons. */

+			#if( tskSTATIC_AND_DYNAMIC_ALLOCATION_POSSIBLE != 0 ) /*lint !e731 !e9029 Macro has been consolidated for readability reasons. */

 			{

 				/* Tasks can be created statically or dynamically, so note this

 				task was created statically in case the task is later deleted. */

@@ -769,12 +760,12 @@
 		StackType_t *pxStack;

 

 			/* Allocate space for the stack used by the task being created. */

-			pxStack = ( StackType_t * ) pvPortMalloc( ( ( ( size_t ) usStackDepth ) * sizeof( StackType_t ) ) ); /*lint !e961 MISRA exception as the casts are only redundant for some ports. */

+			pxStack = pvPortMalloc( ( ( ( size_t ) usStackDepth ) * sizeof( StackType_t ) ) ); /*lint !e9079 All values returned by pvPortMalloc() have at least the alignment required by the MCU's stack and this allocation is the stack. */

 

 			if( pxStack != NULL )

 			{

 				/* Allocate space for the TCB. */

-				pxNewTCB = ( TCB_t * ) pvPortMalloc( sizeof( TCB_t ) ); /*lint !e961 MISRA exception as the casts are only redundant for some paths. */

+				pxNewTCB = ( TCB_t * ) pvPortMalloc( sizeof( TCB_t ) ); /*lint !e9087 !e9079 All values returned by pvPortMalloc() have at least the alignment required by the MCU's stack, and the first member of TCB_t is always a pointer to the task's stack. */

 

 				if( pxNewTCB != NULL )

 				{

@@ -797,7 +788,7 @@
 

 		if( pxNewTCB != NULL )

 		{

-			#if( tskSTATIC_AND_DYNAMIC_ALLOCATION_POSSIBLE != 0 ) /*lint !e731 Macro has been consolidated for readability reasons. */

+			#if( tskSTATIC_AND_DYNAMIC_ALLOCATION_POSSIBLE != 0 ) /*lint !e9029 !e731 Macro has been consolidated for readability reasons. */

 			{

 				/* Tasks can be created statically or dynamically, so note this

 				task was created dynamically in case it is later deleted. */

@@ -862,8 +853,8 @@
 	by the port. */

 	#if( portSTACK_GROWTH < 0 )

 	{

-		pxTopOfStack = pxNewTCB->pxStack + ( ulStackDepth - ( uint32_t ) 1 );

-		pxTopOfStack = ( StackType_t * ) ( ( ( portPOINTER_SIZE_TYPE ) pxTopOfStack ) & ( ~( ( portPOINTER_SIZE_TYPE ) portBYTE_ALIGNMENT_MASK ) ) ); /*lint !e923 MISRA exception.  Avoiding casts between pointers and integers is not practical.  Size differences accounted for using portPOINTER_SIZE_TYPE type. */

+		pxTopOfStack = &( pxNewTCB->pxStack[ ulStackDepth - ( uint32_t ) 1 ] );

+		pxTopOfStack = ( StackType_t * ) ( ( ( portPOINTER_SIZE_TYPE ) pxTopOfStack ) & ( ~( ( portPOINTER_SIZE_TYPE ) portBYTE_ALIGNMENT_MASK ) ) ); /*lint !e923 !e9033 !e9078 MISRA exception.  Avoiding casts between pointers and integers is not practical.  Size differences accounted for using portPOINTER_SIZE_TYPE type.  Checked by assert(). */

 

 		/* Check the alignment of the calculated top of stack is correct. */

 		configASSERT( ( ( ( portPOINTER_SIZE_TYPE ) pxTopOfStack & ( portPOINTER_SIZE_TYPE ) portBYTE_ALIGNMENT_MASK ) == 0UL ) );

@@ -897,7 +888,7 @@
 		/* Don't copy all configMAX_TASK_NAME_LEN if the string is shorter than

 		configMAX_TASK_NAME_LEN characters just in case the memory after the

 		string is not accessible (extremely unlikely). */

-		if( pcName[ x ] == 0x00 )

+		if( pcName[ x ] == ( char ) 0x00 )

 		{

 			break;

 		}

@@ -1013,7 +1004,7 @@
 	}

 	#endif /* portUSING_MPU_WRAPPERS */

 

-	if( ( void * ) pxCreatedTask != NULL )

+	if( pxCreatedTask != NULL )

 	{

 		/* Pass the handle out in an anonymous way.  The handle can be used to

 		change the created task's priority, delete the created task, etc.*/

@@ -1335,8 +1326,8 @@
 	eTaskState eTaskGetState( TaskHandle_t xTask )

 	{

 	eTaskState eReturn;

-	List_t *pxStateList;

-	const TCB_t * const pxTCB = ( TCB_t * ) xTask;

+	List_t const * pxStateList, *pxDelayedList, *pxOverflowedDelayedList;

+	const TCB_t * const pxTCB = xTask;

 

 		configASSERT( pxTCB );

 

@@ -1349,11 +1340,13 @@
 		{

 			taskENTER_CRITICAL();

 			{

-				pxStateList = ( List_t * ) listLIST_ITEM_CONTAINER( &( pxTCB->xStateListItem ) );

+				pxStateList = listLIST_ITEM_CONTAINER( &( pxTCB->xStateListItem ) );

+				pxDelayedList = pxDelayedTaskList;

+				pxOverflowedDelayedList = pxOverflowDelayedTaskList;

 			}

 			taskEXIT_CRITICAL();

 

-			if( ( pxStateList == pxDelayedTaskList ) || ( pxStateList == pxOverflowDelayedTaskList ) )

+			if( ( pxStateList == pxDelayedList ) || ( pxStateList == pxOverflowedDelayedList ) )

 			{

 				/* The task being queried is referenced from one of the Blocked

 				lists. */

@@ -1422,15 +1415,15 @@
 

 #if ( INCLUDE_uxTaskPriorityGet == 1 )

 

-	UBaseType_t uxTaskPriorityGet( TaskHandle_t xTask )

+	UBaseType_t uxTaskPriorityGet( const TaskHandle_t xTask )

 	{

-	TCB_t *pxTCB;

+	TCB_t const *pxTCB;

 	UBaseType_t uxReturn;

 

 		taskENTER_CRITICAL();

 		{

-			/* If null is passed in here then it is the priority of the that

-			called uxTaskPriorityGet() that is being queried. */

+			/* If null is passed in here then it is the priority of the task

+			that called uxTaskPriorityGet() that is being queried. */

 			pxTCB = prvGetTCBFromHandle( xTask );

 			uxReturn = pxTCB->uxPriority;

 		}

@@ -1444,9 +1437,9 @@
 

 #if ( INCLUDE_uxTaskPriorityGet == 1 )

 

-	UBaseType_t uxTaskPriorityGetFromISR( TaskHandle_t xTask )

+	UBaseType_t uxTaskPriorityGetFromISR( const TaskHandle_t xTask )

 	{

-	TCB_t *pxTCB;

+	TCB_t const *pxTCB;

 	UBaseType_t uxReturn, uxSavedInterruptState;

 

 		/* RTOS ports that support interrupt nesting have the concept of a

@@ -1464,7 +1457,7 @@
 		separate interrupt safe API to ensure interrupt entry is as fast and as

 		simple as possible.  More information (albeit Cortex-M specific) is

 		provided on the following link:

-		http://www.freertos.org/RTOS-Cortex-M3-M4.html */

+		https://www.freertos.org/RTOS-Cortex-M3-M4.html */

 		portASSERT_IF_INTERRUPT_PRIORITY_INVALID();

 

 		uxSavedInterruptState = portSET_INTERRUPT_MASK_FROM_ISR();

@@ -1724,7 +1717,7 @@
 				/* The scheduler is not running, but the task that was pointed

 				to by pxCurrentTCB has just been suspended and pxCurrentTCB

 				must be adjusted to point to a different task. */

-				if( listCURRENT_LIST_LENGTH( &xSuspendedTaskList ) == uxCurrentNumberOfTasks )

+				if( listCURRENT_LIST_LENGTH( &xSuspendedTaskList ) == uxCurrentNumberOfTasks ) /*lint !e931 Right has no side effect, just volatile. */

 				{

 					/* No other tasks are ready, so set pxCurrentTCB back to

 					NULL so when the next task is created pxCurrentTCB will

@@ -1752,7 +1745,7 @@
 	static BaseType_t prvTaskIsTaskSuspended( const TaskHandle_t xTask )

 	{

 	BaseType_t xReturn = pdFALSE;

-	const TCB_t * const pxTCB = ( TCB_t * ) xTask;

+	const TCB_t * const pxTCB = xTask;

 

 		/* Accesses xPendingReadyList so must be called from a critical

 		section. */

@@ -1797,14 +1790,14 @@
 

 	void vTaskResume( TaskHandle_t xTaskToResume )

 	{

-	TCB_t * const pxTCB = ( TCB_t * ) xTaskToResume;

+	TCB_t * const pxTCB = xTaskToResume;

 

 		/* It does not make sense to resume the calling task. */

 		configASSERT( xTaskToResume );

 

 		/* The parameter cannot be NULL as it is impossible to resume the

 		currently executing task. */

-		if( ( pxTCB != NULL ) && ( pxTCB != pxCurrentTCB ) )

+		if( ( pxTCB != pxCurrentTCB ) && ( pxTCB != NULL ) )

 		{

 			taskENTER_CRITICAL();

 			{

@@ -1852,7 +1845,7 @@
 	BaseType_t xTaskResumeFromISR( TaskHandle_t xTaskToResume )

 	{

 	BaseType_t xYieldRequired = pdFALSE;

-	TCB_t * const pxTCB = ( TCB_t * ) xTaskToResume;

+	TCB_t * const pxTCB = xTaskToResume;

 	UBaseType_t uxSavedInterruptStatus;

 

 		configASSERT( xTaskToResume );

@@ -1872,7 +1865,7 @@
 		separate interrupt safe API to ensure interrupt entry is as fast and as

 		simple as possible.  More information (albeit Cortex-M specific) is

 		provided on the following link:

-		http://www.freertos.org/RTOS-Cortex-M3-M4.html */

+		https://www.freertos.org/RTOS-Cortex-M3-M4.html */

 		portASSERT_IF_INTERRUPT_PRIORITY_INVALID();

 

 		uxSavedInterruptStatus = portSET_INTERRUPT_MASK_FROM_ISR();

@@ -1937,7 +1930,7 @@
 												configIDLE_TASK_NAME,

 												ulIdleTaskStackSize,

 												( void * ) NULL, /*lint !e961.  The cast is not redundant for all compilers. */

-												( tskIDLE_PRIORITY | portPRIVILEGE_BIT ),

+												portPRIVILEGE_BIT, /* In effect ( tskIDLE_PRIORITY | portPRIVILEGE_BIT ), but tskIDLE_PRIORITY is zero. */

 												pxIdleTaskStackBuffer,

 												pxIdleTaskTCBBuffer ); /*lint !e961 MISRA exception, justified as it is not a redundant explicit cast to all supported compilers. */

 

@@ -1957,7 +1950,7 @@
 								configIDLE_TASK_NAME,

 								configMINIMAL_STACK_SIZE,

 								( void * ) NULL,

-								( tskIDLE_PRIORITY | portPRIVILEGE_BIT ),

+								portPRIVILEGE_BIT, /* In effect ( tskIDLE_PRIORITY | portPRIVILEGE_BIT ), but tskIDLE_PRIORITY is zero. */

 								&xIdleTaskHandle ); /*lint !e961 MISRA exception, justified as it is not a redundant explicit cast to all supported compilers. */

 	}

 	#endif /* configSUPPORT_STATIC_ALLOCATION */

@@ -2151,7 +2144,7 @@
 				appropriate ready list. */

 				while( listLIST_IS_EMPTY( &xPendingReadyList ) == pdFALSE )

 				{

-					pxTCB = ( TCB_t * ) listGET_OWNER_OF_HEAD_ENTRY( ( &xPendingReadyList ) );

+					pxTCB = listGET_OWNER_OF_HEAD_ENTRY( ( &xPendingReadyList ) ); /*lint !e9079 void * is used as this macro is used with timers and co-routines too.  Alignment is known to be fine as the type of the pointer stored and retrieved is the same. */

 					( void ) uxListRemove( &( pxTCB->xEventListItem ) );

 					( void ) uxListRemove( &( pxTCB->xStateListItem ) );

 					prvAddTaskToReadyList( pxTCB );

@@ -2268,7 +2261,7 @@
 	system call	interrupt priority.  FreeRTOS maintains a separate interrupt

 	safe API to ensure interrupt entry is as fast and as simple as possible.

 	More information (albeit Cortex-M specific) is provided on the following

-	link: http://www.freertos.org/RTOS-Cortex-M3-M4.html */

+	link: https://www.freertos.org/RTOS-Cortex-M3-M4.html */

 	portASSERT_IF_INTERRUPT_PRIORITY_INVALID();

 

 	uxSavedInterruptStatus = portTICK_TYPE_SET_INTERRUPT_MASK_FROM_ISR();

@@ -2308,19 +2301,21 @@
 	TCB_t *pxNextTCB, *pxFirstTCB, *pxReturn = NULL;

 	UBaseType_t x;

 	char cNextChar;

+	BaseType_t xBreakLoop;

 

 		/* This function is called with the scheduler suspended. */

 

 		if( listCURRENT_LIST_LENGTH( pxList ) > ( UBaseType_t ) 0 )

 		{

-			listGET_OWNER_OF_NEXT_ENTRY( pxFirstTCB, pxList );

+			listGET_OWNER_OF_NEXT_ENTRY( pxFirstTCB, pxList );  /*lint !e9079 void * is used as this macro is used with timers and co-routines too.  Alignment is known to be fine as the type of the pointer stored and retrieved is the same. */

 

 			do

 			{

-				listGET_OWNER_OF_NEXT_ENTRY( pxNextTCB, pxList );

+				listGET_OWNER_OF_NEXT_ENTRY( pxNextTCB, pxList ); /*lint !e9079 void * is used as this macro is used with timers and co-routines too.  Alignment is known to be fine as the type of the pointer stored and retrieved is the same. */

 

 				/* Check each character in the name looking for a match or

 				mismatch. */

+				xBreakLoop = pdFALSE;

 				for( x = ( UBaseType_t ) 0; x < ( UBaseType_t ) configMAX_TASK_NAME_LEN; x++ )

 				{

 					cNextChar = pxNextTCB->pcTaskName[ x ];

@@ -2328,19 +2323,24 @@
 					if( cNextChar != pcNameToQuery[ x ] )

 					{

 						/* Characters didn't match. */

-						break;

+						xBreakLoop = pdTRUE;

 					}

-					else if( cNextChar == 0x00 )

+					else if( cNextChar == ( char ) 0x00 )

 					{

 						/* Both strings terminated, a match must have been

 						found. */

 						pxReturn = pxNextTCB;

-						break;

+						xBreakLoop = pdTRUE;

 					}

 					else

 					{

 						mtCOVERAGE_TEST_MARKER();

 					}

+

+					if( xBreakLoop != pdFALSE )

+					{

+						break;

+					}

 				}

 

 				if( pxReturn != NULL )

@@ -2421,7 +2421,7 @@
 		}

 		( void ) xTaskResumeAll();

 

-		return ( TaskHandle_t ) pxTCB;

+		return pxTCB;

 	}

 

 #endif /* INCLUDE_xTaskGetHandle */

@@ -2537,7 +2537,7 @@
 

 	BaseType_t xTaskAbortDelay( TaskHandle_t xTask )

 	{

-	TCB_t *pxTCB = ( TCB_t * ) xTask;

+	TCB_t *pxTCB = xTask;

 	BaseType_t xReturn;

 

 		configASSERT( pxTCB );

@@ -2662,7 +2662,7 @@
 					item at the head of the delayed list.  This is the time

 					at which the task at the head of the delayed list must

 					be removed from the Blocked state. */

-					pxTCB = ( TCB_t * ) listGET_OWNER_OF_HEAD_ENTRY( pxDelayedTaskList );

+					pxTCB = listGET_OWNER_OF_HEAD_ENTRY( pxDelayedTaskList ); /*lint !e9079 void * is used as this macro is used with timers and co-routines too.  Alignment is known to be fine as the type of the pointer stored and retrieved is the same. */

 					xItemValue = listGET_LIST_ITEM_VALUE( &( pxTCB->xStateListItem ) );

 

 					if( xConstTickCount < xItemValue )

@@ -2673,7 +2673,7 @@
 						state -	so record the item value in

 						xNextTaskUnblockTime. */

 						xNextTaskUnblockTime = xItemValue;

-						break;

+						break; /*lint !e9011 Code structure here is deedmed easier to understand with multiple breaks. */

 					}

 					else

 					{

@@ -2795,7 +2795,7 @@
 		}

 		else

 		{

-			xTCB = ( TCB_t * ) xTask;

+			xTCB = xTask;

 		}

 

 		/* Save the hook function in the TCB.  A critical section is required as

@@ -2855,7 +2855,7 @@
 		}

 		else

 		{

-			xTCB = ( TCB_t * ) xTask;

+			xTCB = xTask;

 		}

 

 		if( xTCB->pxTaskTag != NULL )

@@ -2888,6 +2888,9 @@
 

 		#if ( configGENERATE_RUN_TIME_STATS == 1 )

 		{

+			PRIVILEGED_DATA static uint32_t ulTaskSwitchedInTime = 0UL;	/*< Holds the value of a timer/counter the last time a task was switched in. */

+			PRIVILEGED_DATA static uint32_t ulTotalRunTime = 0UL;		/*< Holds the total amount of execution time as defined by the run time counter clock. */

+

 				#ifdef portALT_GET_RUN_TIME_COUNTER_VALUE

 					portALT_GET_RUN_TIME_COUNTER_VALUE( ulTotalRunTime );

 				#else

@@ -2918,7 +2921,7 @@
 

 		/* Select a new task to run using either the generic C or port

 		optimised asm code. */

-		taskSELECT_HIGHEST_PRIORITY_TASK();

+		taskSELECT_HIGHEST_PRIORITY_TASK(); /*lint !e9079 void * is used as this macro is used with timers and co-routines too.  Alignment is known to be fine as the type of the pointer stored and retrieved is the same. */

 		traceTASK_SWITCHED_IN();

 

 		#if ( configUSE_NEWLIB_REENTRANT == 1 )

@@ -3024,7 +3027,7 @@
 

 	This function assumes that a check has already been made to ensure that

 	pxEventList is not empty. */

-	pxUnblockedTCB = ( TCB_t * ) listGET_OWNER_OF_HEAD_ENTRY( pxEventList );

+	pxUnblockedTCB = listGET_OWNER_OF_HEAD_ENTRY( pxEventList ); /*lint !e9079 void * is used as this macro is used with timers and co-routines too.  Alignment is known to be fine as the type of the pointer stored and retrieved is the same. */

 	configASSERT( pxUnblockedTCB );

 	( void ) uxListRemove( &( pxUnblockedTCB->xEventListItem ) );

 

@@ -3087,7 +3090,7 @@
 

 	/* Remove the event list form the event flag.  Interrupts do not access

 	event flags. */

-	pxUnblockedTCB = ( TCB_t * ) listGET_LIST_ITEM_OWNER( pxEventListItem );

+	pxUnblockedTCB = listGET_LIST_ITEM_OWNER( pxEventListItem ); /*lint !e9079 void * is used as this macro is used with timers and co-routines too.  Alignment is known to be fine as the type of the pointer stored and retrieved is the same. */

 	configASSERT( pxUnblockedTCB );

 	( void ) uxListRemove( pxEventListItem );

 

@@ -3142,7 +3145,7 @@
 		const TickType_t xElapsedTime = xConstTickCount - pxTimeOut->xTimeOnEntering;

 

 		#if( INCLUDE_xTaskAbortDelay == 1 )

-			if( pxCurrentTCB->ucDelayAborted != pdFALSE )

+			if( pxCurrentTCB->ucDelayAborted != ( uint8_t ) pdFALSE )

 			{

 				/* The delay was aborted, which is not the same as a time out,

 				but has the same result. */

@@ -3202,7 +3205,7 @@
 	UBaseType_t uxTaskGetTaskNumber( TaskHandle_t xTask )

 	{

 	UBaseType_t uxReturn;

-	TCB_t *pxTCB;

+	TCB_t const *pxTCB;

 

 		if( xTask != NULL )

 		{

@@ -3224,7 +3227,7 @@
 

 	void vTaskSetTaskNumber( TaskHandle_t xTask, const UBaseType_t uxHandle )

 	{

-	TCB_t *pxTCB;

+	TCB_t * pxTCB;

 

 		if( xTask != NULL )

 		{

@@ -3461,6 +3464,8 @@
 static void prvInitialiseTaskLists( void )

 {

 UBaseType_t uxPriority;

+PRIVILEGED_DATA static List_t xDelayedTaskList1;	/*< Delayed tasks. */

+PRIVILEGED_DATA static List_t xDelayedTaskList2;	/*< Delayed tasks (two lists are used - one for delays that have overflowed the current tick count. */

 

 	for( uxPriority = ( UBaseType_t ) 0U; uxPriority < ( UBaseType_t ) configMAX_PRIORITIES; uxPriority++ )

 	{

@@ -3505,7 +3510,7 @@
 		{

 			taskENTER_CRITICAL();

 			{

-				pxTCB = ( TCB_t * ) listGET_OWNER_OF_HEAD_ENTRY( ( &xTasksWaitingTermination ) );

+				pxTCB = listGET_OWNER_OF_HEAD_ENTRY( ( &xTasksWaitingTermination ) ); /*lint !e9079 void * is used as this macro is used with timers and co-routines too.  Alignment is known to be fine as the type of the pointer stored and retrieved is the same. */

 				( void ) uxListRemove( &( pxTCB->xStateListItem ) );

 				--uxCurrentNumberOfTasks;

 				--uxDeletedTasksWaitingCleanUp;

@@ -3624,7 +3629,7 @@
 

 		if( listCURRENT_LIST_LENGTH( pxList ) > ( UBaseType_t ) 0 )

 		{

-			listGET_OWNER_OF_NEXT_ENTRY( pxFirstTCB, pxList );

+			listGET_OWNER_OF_NEXT_ENTRY( pxFirstTCB, pxList ); /*lint !e9079 void * is used as this macro is used with timers and co-routines too.  Alignment is known to be fine as the type of the pointer stored and retrieved is the same. */

 

 			/* Populate an TaskStatus_t structure within the

 			pxTaskStatusArray array for each task that is referenced from

@@ -3632,7 +3637,7 @@
 			meaning of each TaskStatus_t structure member. */

 			do

 			{

-				listGET_OWNER_OF_NEXT_ENTRY( pxNextTCB, pxList );

+				listGET_OWNER_OF_NEXT_ENTRY( pxNextTCB, pxList ); /*lint !e9079 void * is used as this macro is used with timers and co-routines too.  Alignment is known to be fine as the type of the pointer stored and retrieved is the same. */

 				vTaskGetInfo( ( TaskHandle_t ) pxNextTCB, &( pxTaskStatusArray[ uxTask ] ), pdTRUE, eState );

 				uxTask++;

 			} while( pxNextTCB != pxFirstTCB );

@@ -3720,7 +3725,7 @@
 			vPortFree( pxTCB->pxStack );

 			vPortFree( pxTCB );

 		}

-		#elif( tskSTATIC_AND_DYNAMIC_ALLOCATION_POSSIBLE != 0 ) /*lint !e731 Macro has been consolidated for readability reasons. */

+		#elif( tskSTATIC_AND_DYNAMIC_ALLOCATION_POSSIBLE != 0 ) /*lint !e731 !e9029 Macro has been consolidated for readability reasons. */

 		{

 			/* The task could have been allocated statically or dynamically, so

 			check what was statically allocated before trying to free the

@@ -3770,7 +3775,7 @@
 		the item at the head of the delayed list.  This is the time at

 		which the task at the head of the delayed list should be removed

 		from the Blocked state. */

-		( pxTCB ) = ( TCB_t * ) listGET_OWNER_OF_HEAD_ENTRY( pxDelayedTaskList );

+		( pxTCB ) = listGET_OWNER_OF_HEAD_ENTRY( pxDelayedTaskList ); /*lint !e9079 void * is used as this macro is used with timers and co-routines too.  Alignment is known to be fine as the type of the pointer stored and retrieved is the same. */

 		xNextTaskUnblockTime = listGET_LIST_ITEM_VALUE( &( ( pxTCB )->xStateListItem ) );

 	}

 }

@@ -3825,7 +3830,7 @@
 

 	BaseType_t xTaskPriorityInherit( TaskHandle_t const pxMutexHolder )

 	{

-	TCB_t * const pxMutexHolderTCB = ( TCB_t * ) pxMutexHolder;

+	TCB_t * const pxMutexHolderTCB = pxMutexHolder;

 	BaseType_t xReturn = pdFALSE;

 

 		/* If the mutex was given back by an interrupt while the queue was

@@ -3912,7 +3917,7 @@
 

 	BaseType_t xTaskPriorityDisinherit( TaskHandle_t const pxMutexHolder )

 	{

-	TCB_t * const pxTCB = ( TCB_t * ) pxMutexHolder;

+	TCB_t * const pxTCB = pxMutexHolder;

 	BaseType_t xReturn = pdFALSE;

 

 		if( pxMutexHolder != NULL )

@@ -3992,7 +3997,7 @@
 

 	void vTaskPriorityDisinheritAfterTimeout( TaskHandle_t const pxMutexHolder, UBaseType_t uxHighestPriorityWaitingTask )

 	{

-	TCB_t * const pxTCB = ( TCB_t * ) pxMutexHolder;

+	TCB_t * const pxTCB = pxMutexHolder;

 	UBaseType_t uxPriorityUsedOnEntry, uxPriorityToUse;

 	const UBaseType_t uxOnlyOneMutexHeld = ( UBaseType_t ) 1;

 

@@ -4170,7 +4175,7 @@
 		}

 

 		/* Terminate. */

-		pcBuffer[ x ] = 0x00;

+		pcBuffer[ x ] = ( char ) 0x00;

 

 		/* Return the new end of string. */

 		return &( pcBuffer[ x ] );

@@ -4184,7 +4189,7 @@
 	void vTaskList( char * pcWriteBuffer )

 	{

 	TaskStatus_t *pxTaskStatusArray;

-	volatile UBaseType_t uxArraySize, x;

+	UBaseType_t uxArraySize, x;

 	char cStatus;

 

 		/*

@@ -4213,7 +4218,7 @@
 

 

 		/* Make sure the write buffer does not contain a string. */

-		*pcWriteBuffer = 0x00;

+		*pcWriteBuffer = ( char ) 0x00;

 

 		/* Take a snapshot of the number of tasks in case it changes while this

 		function is executing. */

@@ -4222,7 +4227,7 @@
 		/* Allocate an array index for each task.  NOTE!  if

 		configSUPPORT_DYNAMIC_ALLOCATION is set to 0 then pvPortMalloc() will

 		equate to NULL. */

-		pxTaskStatusArray = pvPortMalloc( uxCurrentNumberOfTasks * sizeof( TaskStatus_t ) );

+		pxTaskStatusArray = pvPortMalloc( uxCurrentNumberOfTasks * sizeof( TaskStatus_t ) ); /*lint !e9079 All values returned by pvPortMalloc() have at least the alignment required by the MCU's stack and this allocation allocates a struct that has the alignment requirements of a pointer. */

 

 		if( pxTaskStatusArray != NULL )

 		{

@@ -4249,9 +4254,10 @@
 					case eDeleted:		cStatus = tskDELETED_CHAR;

 										break;

 

+					case eInvalid:		/* Fall through. */

 					default:			/* Should not get here, but it is included

 										to prevent static checking errors. */

-										cStatus = 0x00;

+										cStatus = ( char ) 0x00;

 										break;

 				}

 

@@ -4260,8 +4266,8 @@
 				pcWriteBuffer = prvWriteNameToBuffer( pcWriteBuffer, pxTaskStatusArray[ x ].pcTaskName );

 

 				/* Write the rest of the string. */

-				sprintf( pcWriteBuffer, "\t%c\t%u\t%u\t%u\r\n", cStatus, ( unsigned int ) pxTaskStatusArray[ x ].uxCurrentPriority, ( unsigned int ) pxTaskStatusArray[ x ].usStackHighWaterMark, ( unsigned int ) pxTaskStatusArray[ x ].xTaskNumber );

-				pcWriteBuffer += strlen( pcWriteBuffer );

+				sprintf( pcWriteBuffer, "\t%c\t%u\t%u\t%u\r\n", cStatus, ( unsigned int ) pxTaskStatusArray[ x ].uxCurrentPriority, ( unsigned int ) pxTaskStatusArray[ x ].usStackHighWaterMark, ( unsigned int ) pxTaskStatusArray[ x ].xTaskNumber ); /*lint !e586 sprintf() allowed as this is compiled with many compilers and this is a utility function only - not part of the core kernel implementation. */

+				pcWriteBuffer += strlen( pcWriteBuffer ); /*lint !e9016 Pointer arithmetic ok on char pointers. */

 			}

 

 			/* Free the array again.  NOTE!  If configSUPPORT_DYNAMIC_ALLOCATION

@@ -4282,7 +4288,7 @@
 	void vTaskGetRunTimeStats( char *pcWriteBuffer )

 	{

 	TaskStatus_t *pxTaskStatusArray;

-	volatile UBaseType_t uxArraySize, x;

+	UBaseType_t uxArraySize, x;

 	uint32_t ulTotalTime, ulStatsAsPercentage;

 

 		#if( configUSE_TRACE_FACILITY != 1 )

@@ -4317,7 +4323,7 @@
 		 */

 

 		/* Make sure the write buffer does not contain a string. */

-		*pcWriteBuffer = 0x00;

+		*pcWriteBuffer = ( char ) 0x00;

 

 		/* Take a snapshot of the number of tasks in case it changes while this

 		function is executing. */

@@ -4326,7 +4332,7 @@
 		/* Allocate an array index for each task.  NOTE!  If

 		configSUPPORT_DYNAMIC_ALLOCATION is set to 0 then pvPortMalloc() will

 		equate to NULL. */

-		pxTaskStatusArray = pvPortMalloc( uxCurrentNumberOfTasks * sizeof( TaskStatus_t ) );

+		pxTaskStatusArray = pvPortMalloc( uxCurrentNumberOfTasks * sizeof( TaskStatus_t ) ); /*lint !e9079 All values returned by pvPortMalloc() have at least the alignment required by the MCU's stack and this allocation allocates a struct that has the alignment requirements of a pointer. */

 

 		if( pxTaskStatusArray != NULL )

 		{

@@ -4337,7 +4343,7 @@
 			ulTotalTime /= 100UL;

 

 			/* Avoid divide by zero errors. */

-			if( ulTotalTime > 0 )

+			if( ulTotalTime > 0UL )

 			{

 				/* Create a human readable table from the binary data. */

 				for( x = 0; x < uxArraySize; x++ )

@@ -4362,7 +4368,7 @@
 						{

 							/* sizeof( int ) == sizeof( long ) so a smaller

 							printf() library can be used. */

-							sprintf( pcWriteBuffer, "\t%u\t\t%u%%\r\n", ( unsigned int ) pxTaskStatusArray[ x ].ulRunTimeCounter, ( unsigned int ) ulStatsAsPercentage );

+							sprintf( pcWriteBuffer, "\t%u\t\t%u%%\r\n", ( unsigned int ) pxTaskStatusArray[ x ].ulRunTimeCounter, ( unsigned int ) ulStatsAsPercentage ); /*lint !e586 sprintf() allowed as this is compiled with many compilers and this is a utility function only - not part of the core kernel implementation. */

 						}

 						#endif

 					}

@@ -4378,12 +4384,12 @@
 						{

 							/* sizeof( int ) == sizeof( long ) so a smaller

 							printf() library can be used. */

-							sprintf( pcWriteBuffer, "\t%u\t\t<1%%\r\n", ( unsigned int ) pxTaskStatusArray[ x ].ulRunTimeCounter );

+							sprintf( pcWriteBuffer, "\t%u\t\t<1%%\r\n", ( unsigned int ) pxTaskStatusArray[ x ].ulRunTimeCounter ); /*lint !e586 sprintf() allowed as this is compiled with many compilers and this is a utility function only - not part of the core kernel implementation. */

 						}

 						#endif

 					}

 

-					pcWriteBuffer += strlen( pcWriteBuffer );

+					pcWriteBuffer += strlen( pcWriteBuffer ); /*lint !e9016 Pointer arithmetic ok on char pointers. */

 				}

 			}

 			else

@@ -4635,6 +4641,13 @@
 					/* The task is being notified without its notify value being

 					updated. */

 					break;

+

+				default:

+					/* Should not get here if all enums are handled.

+					Artificially force an assert. */

+					configASSERT( ( volatile uint32_t ) 0 );

+

+					break;

 			}

 

 			traceTASK_NOTIFY();

@@ -4760,6 +4773,12 @@
 					/* The task is being notified without its notify value being

 					updated. */

 					break;

+

+				default:

+					/* Should not get here if all enums are handled.

+					Artificially force an assert. */

+					configASSERT( ( volatile uint32_t ) 0 );

+					break;

 			}

 

 			traceTASK_NOTIFY_FROM_ISR();

@@ -4950,7 +4969,7 @@
 	{

 		/* The current task must be in a ready list, so there is no need to

 		check, and the port reset macro can be called directly. */

-		portRESET_READY_PRIORITY( pxCurrentTCB->uxPriority, uxTopReadyPriority );

+		portRESET_READY_PRIORITY( pxCurrentTCB->uxPriority, uxTopReadyPriority ); /*lint !e931 pxCurrentTCB cannot change as it is the calling task.  pxCurrentTCB->uxPriority and uxTopReadyPriority cannot change as called with scheduler suspended or in a critical section. */

 	}

 	else

 	{