Fix definition of tskSTATIC_AND_DYNAMIC_ALLOCATION_POSSIBLE

tskSTATIC_AND_DYNAMIC_ALLOCATION_POSSIBLE was not correctly defined resulting in
dynamically allocated TCB not being freed when MPU was enabled. This commit fixes
the definition to ensure that dynamically allocated RAM (Stack and TCB) is freed
always.
diff --git a/FreeRTOS/Source/include/FreeRTOS.h b/FreeRTOS/Source/include/FreeRTOS.h
index e599b01..ac4f3f0 100644
--- a/FreeRTOS/Source/include/FreeRTOS.h
+++ b/FreeRTOS/Source/include/FreeRTOS.h
@@ -954,6 +954,51 @@
 	#define configUSE_TASK_FPU_SUPPORT 1

 #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

@@ -1038,7 +1083,7 @@
 		uint32_t 		ulDummy18;

 		uint8_t 		ucDummy19;

 	#endif

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

+	#if ( tskSTATIC_AND_DYNAMIC_ALLOCATION_POSSIBLE != 0 )

 		uint8_t			uxDummy20;

 	#endif

 

diff --git a/FreeRTOS/Source/tasks.c b/FreeRTOS/Source/tasks.c
index 2842d9e..5a61f98 100644
--- a/FreeRTOS/Source/tasks.c
+++ b/FreeRTOS/Source/tasks.c
@@ -75,24 +75,6 @@
  */

 #define tskSTACK_FILL_BYTE	( 0xa5U )

 

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

-!!!NOTE!!! If the definition of tskSTATIC_AND_DYNAMIC_ALLOCATION_POSSIBLE is

-changed then the definition of StaticTask_t must also be updated. */

-#define tskSTATIC_AND_DYNAMIC_ALLOCATION_POSSIBLE	( ( configSUPPORT_STATIC_ALLOCATION == 1 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) )

 #define tskDYNAMICALLY_ALLOCATED_STACK_AND_TCB 		( ( uint8_t ) 0 )

 #define tskSTATICALLY_ALLOCATED_STACK_ONLY 			( ( uint8_t ) 1 )

 #define tskSTATICALLY_ALLOCATED_STACK_AND_TCB		( ( uint8_t ) 2 )

@@ -326,7 +308,7 @@
 		volatile uint8_t ucNotifyState;

 	#endif

 

-	/* See the comments above the definition of

+	/* See the comments in FreeRTOS.h with the definition of

 	tskSTATIC_AND_DYNAMIC_ALLOCATION_POSSIBLE. */

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

@@ -631,7 +613,7 @@
 				task was created statically in case the task is later deleted. */

 				pxNewTCB->ucStaticallyAllocated = tskSTATICALLY_ALLOCATED_STACK_AND_TCB;

 			}

-			#endif /* configSUPPORT_DYNAMIC_ALLOCATION */

+			#endif /* tskSTATIC_AND_DYNAMIC_ALLOCATION_POSSIBLE */

 

 			prvInitialiseNewTask( pxTaskCode, pcName, ulStackDepth, pvParameters, uxPriority, &xReturn, pxNewTCB, NULL );

 			prvAddNewTaskToReadyList( pxNewTCB );

@@ -673,7 +655,7 @@
 				task was created statically in case the task is later deleted. */

 				pxNewTCB->ucStaticallyAllocated = tskSTATICALLY_ALLOCATED_STACK_AND_TCB;

 			}

-			#endif /* configSUPPORT_DYNAMIC_ALLOCATION */

+			#endif /* tskSTATIC_AND_DYNAMIC_ALLOCATION_POSSIBLE */

 

 			prvInitialiseNewTask(	pxTaskDefinition->pvTaskCode,

 									pxTaskDefinition->pcName,

@@ -714,14 +696,14 @@
 				/* Store the stack location in the TCB. */

 				pxNewTCB->pxStack = pxTaskDefinition->puxStackBuffer;

 

-				#if( configSUPPORT_STATIC_ALLOCATION == 1 )

+				#if( tskSTATIC_AND_DYNAMIC_ALLOCATION_POSSIBLE != 0 )

 				{

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

 					this task had a statically allocated stack in case it is

 					later deleted.  The TCB was allocated dynamically. */

 					pxNewTCB->ucStaticallyAllocated = tskSTATICALLY_ALLOCATED_STACK_ONLY;

 				}

-				#endif

+				#endif /* tskSTATIC_AND_DYNAMIC_ALLOCATION_POSSIBLE */

 

 				prvInitialiseNewTask(	pxTaskDefinition->pvTaskCode,

 										pxTaskDefinition->pcName,

@@ -818,7 +800,7 @@
 				task was created dynamically in case it is later deleted. */

 				pxNewTCB->ucStaticallyAllocated = tskDYNAMICALLY_ALLOCATED_STACK_AND_TCB;

 			}

-			#endif /* configSUPPORT_STATIC_ALLOCATION */

+			#endif /* tskSTATIC_AND_DYNAMIC_ALLOCATION_POSSIBLE */

 

 			prvInitialiseNewTask( pxTaskCode, pcName, ( uint32_t ) usStackDepth, pvParameters, uxPriority, pxCreatedTask, pxNewTCB, NULL );

 			prvAddNewTaskToReadyList( pxNewTCB );