diff --git a/190725_FreeRTOS_IoT_Libs_Task_Pool_and_MQTT_Preview/FreeRTOS/Source/portable/CCS/ARM_CM3/port.c b/190725_FreeRTOS_IoT_Libs_Task_Pool_and_MQTT_Preview/FreeRTOS/Source/portable/CCS/ARM_CM3/port.c
new file mode 100644
index 0000000..a159ab2
--- /dev/null
+++ b/190725_FreeRTOS_IoT_Libs_Task_Pool_and_MQTT_Preview/FreeRTOS/Source/portable/CCS/ARM_CM3/port.c
@@ -0,0 +1,621 @@
+/*

+ * FreeRTOS Kernel V10.2.1

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

+ *

+ * Permission is hereby granted, free of charge, to any person obtaining a copy of

+ * this software and associated documentation files (the "Software"), to deal in

+ * the Software without restriction, including without limitation the rights to

+ * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of

+ * the Software, and to permit persons to whom the Software is furnished to do so,

+ * subject to the following conditions:

+ *

+ * The above copyright notice and this permission notice shall be included in all

+ * copies or substantial portions of the Software.

+ *

+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR

+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS

+ * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR

+ * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER

+ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN

+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

+ *

+ * http://www.FreeRTOS.org

+ * http://aws.amazon.com/freertos

+ *

+ * 1 tab == 4 spaces!

+ */

+

+/*-----------------------------------------------------------

+ * Implementation of functions defined in portable.h for the ARM CM4F port.

+ *----------------------------------------------------------*/

+

+/* Scheduler includes. */

+#include "FreeRTOS.h"

+#include "task.h"

+

+#if( configMAX_SYSCALL_INTERRUPT_PRIORITY == 0 )

+	#error configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to 0.  See http://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html

+#endif

+

+#ifndef configSYSTICK_CLOCK_HZ

+	#define configSYSTICK_CLOCK_HZ configCPU_CLOCK_HZ

+	/* Ensure the SysTick is clocked at the same frequency as the core. */

+	#define portNVIC_SYSTICK_CLK_BIT	( 1UL << 2UL )

+#else

+	/* The way the SysTick is clocked is not modified in case it is not the same

+	as the core. */

+	#define portNVIC_SYSTICK_CLK_BIT	( 0 )

+#endif

+

+/* Constants required to manipulate the core.  Registers first... */

+#define portNVIC_SYSTICK_CTRL_REG			( * ( ( volatile uint32_t * ) 0xe000e010 ) )

+#define portNVIC_SYSTICK_LOAD_REG			( * ( ( volatile uint32_t * ) 0xe000e014 ) )

+#define portNVIC_SYSTICK_CURRENT_VALUE_REG	( * ( ( volatile uint32_t * ) 0xe000e018 ) )

+#define portNVIC_SYSPRI2_REG				( * ( ( volatile uint32_t * ) 0xe000ed20 ) )

+/* ...then bits in the registers. */

+#define portNVIC_SYSTICK_INT_BIT			( 1UL << 1UL )

+#define portNVIC_SYSTICK_ENABLE_BIT			( 1UL << 0UL )

+#define portNVIC_SYSTICK_COUNT_FLAG_BIT		( 1UL << 16UL )

+#define portNVIC_PENDSVCLEAR_BIT 			( 1UL << 27UL )

+#define portNVIC_PEND_SYSTICK_CLEAR_BIT		( 1UL << 25UL )

+

+#define portNVIC_PENDSV_PRI					( ( ( uint32_t ) configKERNEL_INTERRUPT_PRIORITY ) << 16UL )

+#define portNVIC_SYSTICK_PRI				( ( ( uint32_t ) configKERNEL_INTERRUPT_PRIORITY ) << 24UL )

+

+/* Constants required to check the validity of an interrupt priority. */

+#define portFIRST_USER_INTERRUPT_NUMBER		( 16 )

+#define portNVIC_IP_REGISTERS_OFFSET_16 	( 0xE000E3F0 )

+#define portAIRCR_REG						( * ( ( volatile uint32_t * ) 0xE000ED0C ) )

+#define portMAX_8_BIT_VALUE					( ( uint8_t ) 0xff )

+#define portTOP_BIT_OF_BYTE					( ( uint8_t ) 0x80 )

+#define portMAX_PRIGROUP_BITS				( ( uint8_t ) 7 )

+#define portPRIORITY_GROUP_MASK				( 0x07UL << 8UL )

+#define portPRIGROUP_SHIFT					( 8UL )

+

+/* Masks off all bits but the VECTACTIVE bits in the ICSR register. */

+#define portVECTACTIVE_MASK					( 0xFFUL )

+

+/* Constants required to set up the initial stack. */

+#define portINITIAL_XPSR					( 0x01000000 )

+

+/* The systick is a 24-bit counter. */

+#define portMAX_24_BIT_NUMBER				( 0xffffffUL )

+

+/* A fiddle factor to estimate the number of SysTick counts that would have

+occurred while the SysTick counter is stopped during tickless idle

+calculations. */

+#define portMISSED_COUNTS_FACTOR			( 45UL )

+

+/* For strict compliance with the Cortex-M spec the task start address should

+have bit-0 clear, as it is loaded into the PC on exit from an ISR. */

+#define portSTART_ADDRESS_MASK		( ( StackType_t ) 0xfffffffeUL )

+

+/*

+ * Setup the timer to generate the tick interrupts.  The implementation in this

+ * file is weak to allow application writers to change the timer used to

+ * generate the tick interrupt.

+ */

+void vPortSetupTimerInterrupt( void );

+

+/*

+ * Exception handlers.

+ */

+void xPortSysTickHandler( void );

+

+/*

+ * Start first task is a separate function so it can be tested in isolation.

+ */

+extern void vPortStartFirstTask( void );

+

+/*

+ * Used to catch tasks that attempt to return from their implementing function.

+ */

+static void prvTaskExitError( void );

+

+/*-----------------------------------------------------------*/

+

+/* Required to allow portasm.asm access the configMAX_SYSCALL_INTERRUPT_PRIORITY

+setting. */

+const uint32_t ulMaxSyscallInterruptPriority = configMAX_SYSCALL_INTERRUPT_PRIORITY;

+

+/* Each task maintains its own interrupt status in the critical nesting

+variable. */

+static UBaseType_t uxCriticalNesting = 0xaaaaaaaa;

+

+/*

+ * The number of SysTick increments that make up one tick period.

+ */

+#if( configUSE_TICKLESS_IDLE == 1 )

+	static uint32_t ulTimerCountsForOneTick = 0;

+#endif /* configUSE_TICKLESS_IDLE */

+

+/*

+ * The maximum number of tick periods that can be suppressed is limited by the

+ * 24 bit resolution of the SysTick timer.

+ */

+#if( configUSE_TICKLESS_IDLE == 1 )

+	static uint32_t xMaximumPossibleSuppressedTicks = 0;

+#endif /* configUSE_TICKLESS_IDLE */

+

+/*

+ * Compensate for the CPU cycles that pass while the SysTick is stopped (low

+ * power functionality only.

+ */

+#if( configUSE_TICKLESS_IDLE == 1 )

+	static uint32_t ulStoppedTimerCompensation = 0;

+#endif /* configUSE_TICKLESS_IDLE */

+

+/*

+ * Used by the portASSERT_IF_INTERRUPT_PRIORITY_INVALID() macro to ensure

+ * FreeRTOS API functions are not called from interrupts that have been assigned

+ * a priority above configMAX_SYSCALL_INTERRUPT_PRIORITY.

+ */

+#if ( configASSERT_DEFINED == 1 )

+	 static uint8_t ucMaxSysCallPriority = 0;

+	 static uint32_t ulMaxPRIGROUPValue = 0;

+	 static const volatile uint8_t * const pcInterruptPriorityRegisters = ( uint8_t * ) portNVIC_IP_REGISTERS_OFFSET_16;

+#endif /* configASSERT_DEFINED */

+

+/*-----------------------------------------------------------*/

+

+/*

+ * See header file for description.

+ */

+StackType_t * pxPortInitialiseStack( StackType_t * pxTopOfStack,

+                                     TaskFunction_t pxCode,

+                                     void * pvParameters )

+{

+	/* Simulate the stack frame as it would be created by a context switch

+	interrupt. */

+

+	/* Offset added to account for the way the MCU uses the stack on entry/exit

+	of interrupts, and to ensure alignment. */

+	pxTopOfStack--;

+

+	*pxTopOfStack = portINITIAL_XPSR;	/* xPSR */

+	pxTopOfStack--;

+	*pxTopOfStack = ( ( StackType_t ) pxCode ) & portSTART_ADDRESS_MASK;	/* PC */

+	pxTopOfStack--;

+	*pxTopOfStack = ( StackType_t ) prvTaskExitError;	/* LR */

+

+	/* Save code space by skipping register initialisation. */

+	pxTopOfStack -= 5;	/* R12, R3, R2 and R1. */

+	*pxTopOfStack = ( StackType_t ) pvParameters;	/* R0 */

+

+	pxTopOfStack -= 8;	/* R11, R10, R9, R8, R7, R6, R5 and R4. */

+

+	return pxTopOfStack;

+}

+/*-----------------------------------------------------------*/

+

+static void prvTaskExitError( void )

+{

+	/* A function that implements a task must not exit or attempt to return to

+	its caller as there is nothing to return to.  If a task wants to exit it

+	should instead call vTaskDelete( NULL ).

+

+	Artificially force an assert() to be triggered if configASSERT() is

+	defined, then stop here so application writers can catch the error. */

+	configASSERT( uxCriticalNesting == ~0UL );

+	portDISABLE_INTERRUPTS();

+	for( ;; );

+}

+/*-----------------------------------------------------------*/

+

+/*

+ * See header file for description.

+ */

+BaseType_t xPortStartScheduler( void )

+{

+	#if( configASSERT_DEFINED == 1 )

+	{

+		volatile uint32_t ulOriginalPriority;

+		volatile uint8_t * const pucFirstUserPriorityRegister = ( uint8_t * ) ( portNVIC_IP_REGISTERS_OFFSET_16 + portFIRST_USER_INTERRUPT_NUMBER );

+		volatile uint8_t ucMaxPriorityValue;

+

+		/* Determine the maximum priority from which ISR safe FreeRTOS API

+		functions can be called.  ISR safe functions are those that end in

+		"FromISR".  FreeRTOS maintains separate thread and ISR API functions to

+		ensure interrupt entry is as fast and simple as possible.

+

+		Save the interrupt priority value that is about to be clobbered. */

+		ulOriginalPriority = *pucFirstUserPriorityRegister;

+

+		/* Determine the number of priority bits available.  First write to all

+		possible bits. */

+		*pucFirstUserPriorityRegister = portMAX_8_BIT_VALUE;

+

+		/* Read the value back to see how many bits stuck. */

+		ucMaxPriorityValue = *pucFirstUserPriorityRegister;

+

+		/* Use the same mask on the maximum system call priority. */

+		ucMaxSysCallPriority = configMAX_SYSCALL_INTERRUPT_PRIORITY & ucMaxPriorityValue;

+

+		/* Calculate the maximum acceptable priority group value for the number

+		of bits read back. */

+		ulMaxPRIGROUPValue = portMAX_PRIGROUP_BITS;

+		while( ( ucMaxPriorityValue & portTOP_BIT_OF_BYTE ) == portTOP_BIT_OF_BYTE )

+		{

+			ulMaxPRIGROUPValue--;

+			ucMaxPriorityValue <<= ( uint8_t ) 0x01;

+		}

+

+		#ifdef __NVIC_PRIO_BITS

+		{

+			/* Check the CMSIS configuration that defines the number of

+			priority bits matches the number of priority bits actually queried

+			from the hardware. */

+			configASSERT( ( portMAX_PRIGROUP_BITS - ulMaxPRIGROUPValue ) == __NVIC_PRIO_BITS );

+		}

+		#endif

+

+		#ifdef configPRIO_BITS

+		{

+			/* Check the FreeRTOS configuration that defines the number of

+			priority bits matches the number of priority bits actually queried

+			from the hardware. */

+			configASSERT( ( portMAX_PRIGROUP_BITS - ulMaxPRIGROUPValue ) == configPRIO_BITS );

+		}

+		#endif

+

+		/* Shift the priority group value back to its position within the AIRCR

+		register. */

+		ulMaxPRIGROUPValue <<= portPRIGROUP_SHIFT;

+		ulMaxPRIGROUPValue &= portPRIORITY_GROUP_MASK;

+

+		/* Restore the clobbered interrupt priority register to its original

+		value. */

+		*pucFirstUserPriorityRegister = ulOriginalPriority;

+	}

+	#endif /* conifgASSERT_DEFINED */

+

+	/* Make PendSV and SysTick the lowest priority interrupts. */

+	portNVIC_SYSPRI2_REG |= portNVIC_PENDSV_PRI;

+	portNVIC_SYSPRI2_REG |= portNVIC_SYSTICK_PRI;

+

+	/* Start the timer that generates the tick ISR.  Interrupts are disabled

+	here already. */

+	vPortSetupTimerInterrupt();

+

+	/* Initialise the critical nesting count ready for the first task. */

+	uxCriticalNesting = 0;

+

+	/* Start the first task. */

+	vPortStartFirstTask();

+

+	/* Should not get here! */

+	return 0;

+}

+/*-----------------------------------------------------------*/

+

+void vPortEndScheduler( void )

+{

+	/* Not implemented in ports where there is nothing to return to.

+	Artificially force an assert. */

+	configASSERT( uxCriticalNesting == 1000UL );

+}

+/*-----------------------------------------------------------*/

+

+void vPortEnterCritical( void )

+{

+	portDISABLE_INTERRUPTS();

+	uxCriticalNesting++;

+

+	/* This is not the interrupt safe version of the enter critical function so

+	assert() if it is being called from an interrupt context.  Only API

+	functions that end in "FromISR" can be used in an interrupt.  Only assert if

+	the critical nesting count is 1 to protect against recursive calls if the

+	assert function also uses a critical section. */

+	if( uxCriticalNesting == 1 )

+	{

+		configASSERT( ( portNVIC_INT_CTRL_REG & portVECTACTIVE_MASK ) == 0 );

+	}

+}

+/*-----------------------------------------------------------*/

+

+void vPortExitCritical( void )

+{

+	configASSERT( uxCriticalNesting );

+	uxCriticalNesting--;

+	if( uxCriticalNesting == 0 )

+	{

+		portENABLE_INTERRUPTS();

+	}

+}

+/*-----------------------------------------------------------*/

+

+void xPortSysTickHandler( void )

+{

+	/* The SysTick runs at the lowest interrupt priority, so when this interrupt

+	executes all interrupts must be unmasked.  There is therefore no need to

+	save and then restore the interrupt mask value as its value is already

+	known. */

+	( void ) portSET_INTERRUPT_MASK_FROM_ISR();

+	{

+		/* Increment the RTOS tick. */

+		if( xTaskIncrementTick() != pdFALSE )

+		{

+			/* A context switch is required.  Context switching is performed in

+			the PendSV interrupt.  Pend the PendSV interrupt. */

+			portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT;

+		}

+	}

+	portCLEAR_INTERRUPT_MASK_FROM_ISR( 0 );

+}

+/*-----------------------------------------------------------*/

+

+#if( configUSE_TICKLESS_IDLE == 1 )

+

+	#pragma WEAK( vPortSuppressTicksAndSleep )

+	void vPortSuppressTicksAndSleep( TickType_t xExpectedIdleTime )

+	{

+	uint32_t ulReloadValue, ulCompleteTickPeriods, ulCompletedSysTickDecrements;

+	TickType_t xModifiableIdleTime;

+

+		/* Make sure the SysTick reload value does not overflow the counter. */

+		if( xExpectedIdleTime > xMaximumPossibleSuppressedTicks )

+		{

+			xExpectedIdleTime = xMaximumPossibleSuppressedTicks;

+		}

+

+		/* Stop the SysTick momentarily.  The time the SysTick is stopped for

+		is accounted for as best it can be, but using the tickless mode will

+		inevitably result in some tiny drift of the time maintained by the

+		kernel with respect to calendar time. */

+		portNVIC_SYSTICK_CTRL_REG &= ~portNVIC_SYSTICK_ENABLE_BIT;

+

+		/* Calculate the reload value required to wait xExpectedIdleTime

+		tick periods.  -1 is used because this code will execute part way

+		through one of the tick periods. */

+		ulReloadValue = portNVIC_SYSTICK_CURRENT_VALUE_REG + ( ulTimerCountsForOneTick * ( xExpectedIdleTime - 1UL ) );

+		if( ulReloadValue > ulStoppedTimerCompensation )

+		{

+			ulReloadValue -= ulStoppedTimerCompensation;

+		}

+

+		/* Enter a critical section but don't use the taskENTER_CRITICAL()

+		method as that will mask interrupts that should exit sleep mode. */

+		__asm( "	cpsid i" );

+		__asm( "	dsb" );

+		__asm( "	isb" );

+

+

+		/* If a context switch is pending or a task is waiting for the scheduler

+		to be unsuspended then abandon the low power entry. */

+		if( eTaskConfirmSleepModeStatus() == eAbortSleep )

+		{

+			/* Restart from whatever is left in the count register to complete

+			this tick period. */

+			portNVIC_SYSTICK_LOAD_REG = portNVIC_SYSTICK_CURRENT_VALUE_REG;

+

+			/* Restart SysTick. */

+			portNVIC_SYSTICK_CTRL_REG |= portNVIC_SYSTICK_ENABLE_BIT;

+

+			/* Reset the reload register to the value required for normal tick

+			periods. */

+			portNVIC_SYSTICK_LOAD_REG = ulTimerCountsForOneTick - 1UL;

+

+			/* Re-enable interrupts - see comments above __disable_interrupt()

+			call above. */

+			__asm( "	cpsie i" );

+		}

+		else

+		{

+			/* Set the new reload value. */

+			portNVIC_SYSTICK_LOAD_REG = ulReloadValue;

+

+			/* Clear the SysTick count flag and set the count value back to

+			zero. */

+			portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL;

+

+			/* Restart SysTick. */

+			portNVIC_SYSTICK_CTRL_REG |= portNVIC_SYSTICK_ENABLE_BIT;

+

+			/* Sleep until something happens.  configPRE_SLEEP_PROCESSING() can

+			set its parameter to 0 to indicate that its implementation contains

+			its own wait for interrupt or wait for event instruction, and so wfi

+			should not be executed again.  However, the original expected idle

+			time variable must remain unmodified, so a copy is taken. */

+			xModifiableIdleTime = xExpectedIdleTime;

+			configPRE_SLEEP_PROCESSING( xModifiableIdleTime );

+			if( xModifiableIdleTime > 0 )

+			{

+				__asm( "	dsb" );

+				__asm( "	wfi" );

+				__asm( "	isb" );

+			}

+			configPOST_SLEEP_PROCESSING( xExpectedIdleTime );

+

+			/* Re-enable interrupts to allow the interrupt that brought the MCU

+			out of sleep mode to execute immediately.  see comments above

+			__disable_interrupt() call above. */

+			__asm( "	cpsie i" );

+			__asm( "	dsb" );

+			__asm( "	isb" );

+

+			/* Disable interrupts again because the clock is about to be stopped

+			and interrupts that execute while the clock is stopped will increase

+			any slippage between the time maintained by the RTOS and calendar

+			time. */

+			__asm( "	cpsid i" );

+			__asm( "	dsb" );

+			__asm( "	isb" );

+

+			/* Disable the SysTick clock without reading the

+			portNVIC_SYSTICK_CTRL_REG register to ensure the

+			portNVIC_SYSTICK_COUNT_FLAG_BIT is not cleared if it is set.  Again,

+			the time the SysTick is stopped for is accounted for as best it can

+			be, but using the tickless mode will inevitably result in some tiny

+			drift of the time maintained by the kernel with respect to calendar

+			time*/

+			portNVIC_SYSTICK_CTRL_REG = ( portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT );

+

+			/* Determine if the SysTick clock has already counted to zero and

+			been set back to the current reload value (the reload back being

+			correct for the entire expected idle time) or if the SysTick is yet

+			to count to zero (in which case an interrupt other than the SysTick

+			must have brought the system out of sleep mode). */

+			if( ( portNVIC_SYSTICK_CTRL_REG & portNVIC_SYSTICK_COUNT_FLAG_BIT ) != 0 )

+			{

+				uint32_t ulCalculatedLoadValue;

+

+				/* The tick interrupt is already pending, and the SysTick count

+				reloaded with ulReloadValue.  Reset the

+				portNVIC_SYSTICK_LOAD_REG with whatever remains of this tick

+				period. */

+				ulCalculatedLoadValue = ( ulTimerCountsForOneTick - 1UL ) - ( ulReloadValue - portNVIC_SYSTICK_CURRENT_VALUE_REG );

+

+				/* Don't allow a tiny value, or values that have somehow

+				underflowed because the post sleep hook did something

+				that took too long. */

+				if( ( ulCalculatedLoadValue < ulStoppedTimerCompensation ) || ( ulCalculatedLoadValue > ulTimerCountsForOneTick ) )

+				{

+					ulCalculatedLoadValue = ( ulTimerCountsForOneTick - 1UL );

+				}

+

+				portNVIC_SYSTICK_LOAD_REG = ulCalculatedLoadValue;

+

+				/* As the pending tick will be processed as soon as this

+				function exits, the tick value maintained by the tick is stepped

+				forward by one less than the time spent waiting. */

+				ulCompleteTickPeriods = xExpectedIdleTime - 1UL;

+			}

+			else

+			{

+				/* Something other than the tick interrupt ended the sleep.

+				Work out how long the sleep lasted rounded to complete tick

+				periods (not the ulReload value which accounted for part

+				ticks). */

+				ulCompletedSysTickDecrements = ( xExpectedIdleTime * ulTimerCountsForOneTick ) - portNVIC_SYSTICK_CURRENT_VALUE_REG;

+

+				/* How many complete tick periods passed while the processor

+				was waiting? */

+				ulCompleteTickPeriods = ulCompletedSysTickDecrements / ulTimerCountsForOneTick;

+

+				/* The reload value is set to whatever fraction of a single tick

+				period remains. */

+				portNVIC_SYSTICK_LOAD_REG = ( ( ulCompleteTickPeriods + 1UL ) * ulTimerCountsForOneTick ) - ulCompletedSysTickDecrements;

+			}

+

+			/* Restart SysTick so it runs from portNVIC_SYSTICK_LOAD_REG

+			again, then set portNVIC_SYSTICK_LOAD_REG back to its standard

+			value. */

+			portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL;

+			portNVIC_SYSTICK_CTRL_REG |= portNVIC_SYSTICK_ENABLE_BIT;

+			vTaskStepTick( ulCompleteTickPeriods );

+			portNVIC_SYSTICK_LOAD_REG = ulTimerCountsForOneTick - 1UL;

+

+			/* Exit with interrpts enabled. */

+			__asm( "	cpsie i" );

+		}

+	}

+

+#endif /* configUSE_TICKLESS_IDLE */

+/*-----------------------------------------------------------*/

+

+/*

+ * Setup the systick timer to generate the tick interrupts at the required

+ * frequency.

+ */

+#pragma WEAK( vPortSetupTimerInterrupt )

+void vPortSetupTimerInterrupt( void )

+{

+	/* Calculate the constants required to configure the tick interrupt. */

+	#if( configUSE_TICKLESS_IDLE == 1 )

+	{

+		ulTimerCountsForOneTick = ( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ );

+		xMaximumPossibleSuppressedTicks = portMAX_24_BIT_NUMBER / ulTimerCountsForOneTick;

+		ulStoppedTimerCompensation = portMISSED_COUNTS_FACTOR / ( configCPU_CLOCK_HZ / configSYSTICK_CLOCK_HZ );

+	}

+	#endif /* configUSE_TICKLESS_IDLE */

+

+	/* Stop and clear the SysTick. */

+	portNVIC_SYSTICK_CTRL_REG = 0UL;

+	portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL;

+

+	/* Configure SysTick to interrupt at the requested rate. */

+	portNVIC_SYSTICK_LOAD_REG = ( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ ) - 1UL;

+	portNVIC_SYSTICK_CTRL_REG = ( portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT );

+}

+/*-----------------------------------------------------------*/

+

+#if( configASSERT_DEFINED == 1 )

+

+	void vPortValidateInterruptPriority( void )

+	{

+	extern uint32_t ulPortGetIPSR( void );

+	uint32_t ulCurrentInterrupt;

+	uint8_t ucCurrentPriority;

+

+		ulCurrentInterrupt = ulPortGetIPSR();

+

+		/* Is the interrupt number a user defined interrupt? */

+		if( ulCurrentInterrupt >= portFIRST_USER_INTERRUPT_NUMBER )

+		{

+			/* Look up the interrupt's priority. */

+			ucCurrentPriority = pcInterruptPriorityRegisters[ ulCurrentInterrupt ];

+

+			/* The following assertion will fail if a service routine (ISR) for

+			an interrupt that has been assigned a priority above

+			configMAX_SYSCALL_INTERRUPT_PRIORITY calls an ISR safe FreeRTOS API

+			function.  ISR safe FreeRTOS API functions must *only* be called

+			from interrupts that have been assigned a priority at or below

+			configMAX_SYSCALL_INTERRUPT_PRIORITY.

+

+			Numerically low interrupt priority numbers represent logically high

+			interrupt priorities, therefore the priority of the interrupt must

+			be set to a value equal to or numerically *higher* than

+			configMAX_SYSCALL_INTERRUPT_PRIORITY.

+

+			Interrupts that	use the FreeRTOS API must not be left at their

+			default priority of	zero as that is the highest possible priority,

+			which is guaranteed to be above configMAX_SYSCALL_INTERRUPT_PRIORITY,

+			and	therefore also guaranteed to be invalid.

+

+			FreeRTOS maintains separate thread and ISR API functions to ensure

+			interrupt entry is as fast and simple as possible.

+

+			The following links provide detailed information:

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

+			http://www.freertos.org/FAQHelp.html */

+			configASSERT( ucCurrentPriority >= ucMaxSysCallPriority );

+		}

+

+		/* Priority grouping:  The interrupt controller (NVIC) allows the bits

+		that define each interrupt's priority to be split between bits that

+		define the interrupt's pre-emption priority bits and bits that define

+		the interrupt's sub-priority.  For simplicity all bits must be defined

+		to be pre-emption priority bits.  The following assertion will fail if

+		this is not the case (if some bits represent a sub-priority).

+

+		If the application only uses CMSIS libraries for interrupt

+		configuration then the correct setting can be achieved on all Cortex-M

+		devices by calling NVIC_SetPriorityGrouping( 0 ); before starting the

+		scheduler.  Note however that some vendor specific peripheral libraries

+		assume a non-zero priority group setting, in which cases using a value

+		of zero will result in unpredictable behaviour. */

+		configASSERT( ( portAIRCR_REG & portPRIORITY_GROUP_MASK ) <= ulMaxPRIGROUPValue );

+	}

+

+#endif /* configASSERT_DEFINED */

+

+

+

+

+

+

+

+

+

+

+

+

+

+

+

+

+

+

+

+

+

diff --git a/190725_FreeRTOS_IoT_Libs_Task_Pool_and_MQTT_Preview/FreeRTOS/Source/portable/CCS/ARM_CM3/portasm.asm b/190725_FreeRTOS_IoT_Libs_Task_Pool_and_MQTT_Preview/FreeRTOS/Source/portable/CCS/ARM_CM3/portasm.asm
new file mode 100644
index 0000000..f792963
--- /dev/null
+++ b/190725_FreeRTOS_IoT_Libs_Task_Pool_and_MQTT_Preview/FreeRTOS/Source/portable/CCS/ARM_CM3/portasm.asm
@@ -0,0 +1,144 @@
+;/*

+; * FreeRTOS Kernel V10.2.1

+; * Copyright (C) 2019 Amazon.com, Inc. or its affiliates.  All Rights Reserved.

+; *

+; * Permission is hereby granted, free of charge, to any person obtaining a copy of

+; * this software and associated documentation files (the "Software"), to deal in

+; * the Software without restriction, including without limitation the rights to

+; * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of

+; * the Software, and to permit persons to whom the Software is furnished to do so,

+; * subject to the following conditions:

+; *

+; * The above copyright notice and this permission notice shall be included in all

+; * copies or substantial portions of the Software.

+; *

+; * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR

+; * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS

+; * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR

+; * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER

+; * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN

+; * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

+; *

+; * http://www.FreeRTOS.org

+; * http://aws.amazon.com/freertos

+; *

+; * 1 tab == 4 spaces!

+; */

+

+	.thumb

+

+	.ref pxCurrentTCB

+	.ref vTaskSwitchContext

+	.ref ulMaxSyscallInterruptPriority

+

+	.def xPortPendSVHandler

+	.def ulPortGetIPSR

+	.def vPortSVCHandler

+	.def vPortStartFirstTask

+

+NVICOffsetConst:					.word 	0xE000ED08

+CPACRConst:							.word 	0xE000ED88

+pxCurrentTCBConst:					.word	pxCurrentTCB

+ulMaxSyscallInterruptPriorityConst: .word ulMaxSyscallInterruptPriority

+

+; -----------------------------------------------------------

+

+	.align 4

+ulPortGetIPSR: .asmfunc

+ 	mrs r0, ipsr

+ 	bx r14

+ 	.endasmfunc

+ ; -----------------------------------------------------------

+

+	.align 4

+vPortSetInterruptMask: .asmfunc

+	push {r0}

+	ldr r0, ulMaxSyscallInterruptPriorityConst

+	msr basepri, r0

+	pop {r0}

+	bx r14

+	.endasmfunc

+; -----------------------------------------------------------

+

+	.align 4

+xPortPendSVHandler: .asmfunc

+	mrs r0, psp

+	isb

+

+	;/* Get the location of the current TCB. */

+	ldr	r3, pxCurrentTCBConst

+	ldr	r2, [r3]

+

+	;/* Save the core registers. */

+	stmdb r0!, {r4-r11}

+

+	;/* Save the new top of stack into the first member of the TCB. */

+	str r0, [r2]

+

+	stmdb sp!, {r3, r14}

+	ldr r0, ulMaxSyscallInterruptPriorityConst

+	ldr r1, [r0]

+	msr basepri, r1

+	dsb

+	isb

+	bl vTaskSwitchContext

+	mov r0, #0

+	msr basepri, r0

+	ldmia sp!, {r3, r14}

+

+	;/* The first item in pxCurrentTCB is the task top of stack. */

+	ldr r1, [r3]

+	ldr r0, [r1]

+

+	;/* Pop the core registers. */

+	ldmia r0!, {r4-r11}

+

+	msr psp, r0

+	isb

+	bx r14

+	.endasmfunc

+

+; -----------------------------------------------------------

+

+	.align 4

+vPortSVCHandler: .asmfunc

+	;/* Get the location of the current TCB. */

+	ldr	r3, pxCurrentTCBConst

+	ldr r1, [r3]

+	ldr r0, [r1]

+	;/* Pop the core registers. */

+	ldmia r0!, {r4-r11}

+	msr psp, r0

+	isb

+	mov r0, #0

+	msr	basepri, r0

+	orr r14, #0xd

+	bx r14

+	.endasmfunc

+

+; -----------------------------------------------------------

+

+	.align 4

+vPortStartFirstTask: .asmfunc

+	;/* Use the NVIC offset register to locate the stack. */

+	ldr r0, NVICOffsetConst

+	ldr r0, [r0]

+	ldr r0, [r0]

+	;/* Set the msp back to the start of the stack. */

+	msr msp, r0

+	;/* Clear the bit that indicates the FPU is in use in case the FPU was used

+	;before the scheduler was started - which would otherwise result in the

+	;unnecessary leaving of space in the SVC stack for lazy saving of FPU

+	;registers. */

+	mov r0, #0

+	msr control, r0

+	;/* Call SVC to start the first task. */

+	cpsie i

+	cpsie f

+	dsb

+	isb

+	svc #0

+	.endasmfunc

+

+; -----------------------------------------------------------

+

diff --git a/190725_FreeRTOS_IoT_Libs_Task_Pool_and_MQTT_Preview/FreeRTOS/Source/portable/CCS/ARM_CM3/portmacro.h b/190725_FreeRTOS_IoT_Libs_Task_Pool_and_MQTT_Preview/FreeRTOS/Source/portable/CCS/ARM_CM3/portmacro.h
new file mode 100644
index 0000000..a73c5eb
--- /dev/null
+++ b/190725_FreeRTOS_IoT_Libs_Task_Pool_and_MQTT_Preview/FreeRTOS/Source/portable/CCS/ARM_CM3/portmacro.h
@@ -0,0 +1,171 @@
+/*

+ * FreeRTOS Kernel V10.2.1

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

+ *

+ * Permission is hereby granted, free of charge, to any person obtaining a copy of

+ * this software and associated documentation files (the "Software"), to deal in

+ * the Software without restriction, including without limitation the rights to

+ * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of

+ * the Software, and to permit persons to whom the Software is furnished to do so,

+ * subject to the following conditions:

+ *

+ * The above copyright notice and this permission notice shall be included in all

+ * copies or substantial portions of the Software.

+ *

+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR

+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS

+ * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR

+ * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER

+ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN

+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

+ *

+ * http://www.FreeRTOS.org

+ * http://aws.amazon.com/freertos

+ *

+ * 1 tab == 4 spaces!

+ */

+

+

+#ifndef PORTMACRO_H

+#define PORTMACRO_H

+

+#ifdef __cplusplus

+extern "C" {

+#endif

+

+/*-----------------------------------------------------------

+ * Port specific definitions.

+ *

+ * The settings in this file configure FreeRTOS correctly for the

+ * given hardware and compiler.

+ *

+ * These settings should not be altered.

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

+ */

+

+/* Type definitions. */

+#define portCHAR		char

+#define portFLOAT		float

+#define portDOUBLE		double

+#define portLONG		long

+#define portSHORT		short

+#define portSTACK_TYPE	uint32_t

+#define portBASE_TYPE	long

+

+typedef portSTACK_TYPE StackType_t;

+typedef long BaseType_t;

+typedef unsigned long UBaseType_t;

+

+#if( configUSE_16_BIT_TICKS == 1 )

+	typedef uint16_t TickType_t;

+	#define portMAX_DELAY ( TickType_t ) 0xffff

+#else

+	typedef uint32_t TickType_t;

+	#define portMAX_DELAY ( TickType_t ) 0xffffffffUL

+

+	/* 32-bit tick type on a 32-bit architecture, so reads of the tick count do

+	not need to be guarded with a critical section. */

+	#define portTICK_TYPE_IS_ATOMIC 1

+#endif

+/*-----------------------------------------------------------*/

+

+/* Architecture specifics. */

+#define portSTACK_GROWTH			( -1 )

+#define portTICK_PERIOD_MS			( ( TickType_t ) 1000 / configTICK_RATE_HZ )

+#define portBYTE_ALIGNMENT			8

+

+/*-----------------------------------------------------------*/

+

+/* Compiler directives. */

+#define portWEAK_SYMBOL				__attribute__((weak))

+

+/*-----------------------------------------------------------*/

+

+/* Scheduler utilities. */

+#define portYIELD()											\

+{															\

+	/* Set a PendSV to request a context switch. */			\

+	portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT;			\

+	__asm( "	dsb" );										\

+	__asm( "	isb" );										\

+}

+

+#define portNVIC_INT_CTRL_REG		( * ( ( volatile uint32_t * ) 0xe000ed04 ) )

+#define portNVIC_PENDSVSET_BIT		( 1UL << 28UL )

+#define portEND_SWITCHING_ISR( xSwitchRequired ) if( xSwitchRequired != pdFALSE ) portYIELD()

+#define portYIELD_FROM_ISR( x ) portEND_SWITCHING_ISR( x )

+

+/*-----------------------------------------------------------*/

+

+/* Architecture specific optimisations. */

+#ifndef configUSE_PORT_OPTIMISED_TASK_SELECTION

+	#define configUSE_PORT_OPTIMISED_TASK_SELECTION 1

+#endif

+

+#if configUSE_PORT_OPTIMISED_TASK_SELECTION == 1

+

+	/* Check the configuration. */

+	#if( configMAX_PRIORITIES > 32 )

+		#error configUSE_PORT_OPTIMISED_TASK_SELECTION can only be set to 1 when configMAX_PRIORITIES is less than or equal to 32.  It is very rare that a system requires more than 10 to 15 difference priorities as tasks that share a priority will time slice.

+	#endif

+

+	/* Store/clear the ready priorities in a bit map. */

+	#define portRECORD_READY_PRIORITY( uxPriority, uxReadyPriorities ) ( uxReadyPriorities ) |= ( 1UL << ( uxPriority ) )

+	#define portRESET_READY_PRIORITY( uxPriority, uxReadyPriorities ) ( uxReadyPriorities ) &= ~( 1UL << ( uxPriority ) )

+

+	/*-----------------------------------------------------------*/

+

+	#define portGET_HIGHEST_PRIORITY( uxTopPriority, uxReadyPriorities ) uxTopPriority = ( 31 - __clz( ( uxReadyPriorities ) ) )

+

+#endif /* configUSE_PORT_OPTIMISED_TASK_SELECTION */

+/*-----------------------------------------------------------*/

+

+/* Critical section management. */

+extern void vPortEnterCritical( void );

+extern void vPortExitCritical( void );

+

+#define portDISABLE_INTERRUPTS()										\

+{																		\

+	_set_interrupt_priority( configMAX_SYSCALL_INTERRUPT_PRIORITY );	\

+	__asm( "	dsb" );													\

+	__asm( "	isb" );													\

+}

+

+#define portENABLE_INTERRUPTS()					_set_interrupt_priority( 0 )

+#define portENTER_CRITICAL()					vPortEnterCritical()

+#define portEXIT_CRITICAL()						vPortExitCritical()

+#define portSET_INTERRUPT_MASK_FROM_ISR()		_set_interrupt_priority( configMAX_SYSCALL_INTERRUPT_PRIORITY ); __asm( "	dsb" ); __asm( "	isb" )

+#define portCLEAR_INTERRUPT_MASK_FROM_ISR(x)	_set_interrupt_priority( x )

+/*-----------------------------------------------------------*/

+

+/* Tickless idle/low power functionality. */

+#ifndef portSUPPRESS_TICKS_AND_SLEEP

+	extern void vPortSuppressTicksAndSleep( TickType_t xExpectedIdleTime );

+	#define portSUPPRESS_TICKS_AND_SLEEP( xExpectedIdleTime ) vPortSuppressTicksAndSleep( xExpectedIdleTime )

+#endif

+

+/*-----------------------------------------------------------*/

+

+/* Task function macros as described on the FreeRTOS.org WEB site.  These are

+not necessary for to use this port.  They are defined so the common demo files

+(which build with all the ports) will build. */

+#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void *pvParameters )

+#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void *pvParameters )

+/*-----------------------------------------------------------*/

+

+#ifdef configASSERT

+	void vPortValidateInterruptPriority( void );

+	#define portASSERT_IF_INTERRUPT_PRIORITY_INVALID() 	vPortValidateInterruptPriority()

+#endif

+

+/* portNOP() is not required by this port. */

+#define portNOP()

+

+/*-----------------------------------------------------------*/

+

+#ifdef __cplusplus

+}

+#endif

+

+#endif /* PORTMACRO_H */

+

diff --git a/190725_FreeRTOS_IoT_Libs_Task_Pool_and_MQTT_Preview/FreeRTOS/Source/portable/CCS/ARM_CM4F/port.c b/190725_FreeRTOS_IoT_Libs_Task_Pool_and_MQTT_Preview/FreeRTOS/Source/portable/CCS/ARM_CM4F/port.c
new file mode 100644
index 0000000..452aafc
--- /dev/null
+++ b/190725_FreeRTOS_IoT_Libs_Task_Pool_and_MQTT_Preview/FreeRTOS/Source/portable/CCS/ARM_CM4F/port.c
@@ -0,0 +1,644 @@
+/*

+ * FreeRTOS Kernel V10.2.1

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

+ *

+ * Permission is hereby granted, free of charge, to any person obtaining a copy of

+ * this software and associated documentation files (the "Software"), to deal in

+ * the Software without restriction, including without limitation the rights to

+ * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of

+ * the Software, and to permit persons to whom the Software is furnished to do so,

+ * subject to the following conditions:

+ *

+ * The above copyright notice and this permission notice shall be included in all

+ * copies or substantial portions of the Software.

+ *

+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR

+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS

+ * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR

+ * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER

+ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN

+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

+ *

+ * http://www.FreeRTOS.org

+ * http://aws.amazon.com/freertos

+ *

+ * 1 tab == 4 spaces!

+ */

+

+/*-----------------------------------------------------------

+ * Implementation of functions defined in portable.h for the ARM CM4F port.

+ *----------------------------------------------------------*/

+

+/* Scheduler includes. */

+#include "FreeRTOS.h"

+#include "task.h"

+

+#ifndef __TI_VFP_SUPPORT__

+	#error This port can only be used when the project options are configured to enable hardware floating point support.

+#endif

+

+#if( configMAX_SYSCALL_INTERRUPT_PRIORITY == 0 )

+	#error configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to 0.  See http://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html

+#endif

+

+#ifndef configSYSTICK_CLOCK_HZ

+	#define configSYSTICK_CLOCK_HZ configCPU_CLOCK_HZ

+	/* Ensure the SysTick is clocked at the same frequency as the core. */

+	#define portNVIC_SYSTICK_CLK_BIT	( 1UL << 2UL )

+#else

+	/* The way the SysTick is clocked is not modified in case it is not the same

+	as the core. */

+	#define portNVIC_SYSTICK_CLK_BIT	( 0 )

+#endif

+

+/* Constants required to manipulate the core.  Registers first... */

+#define portNVIC_SYSTICK_CTRL_REG			( * ( ( volatile uint32_t * ) 0xe000e010 ) )

+#define portNVIC_SYSTICK_LOAD_REG			( * ( ( volatile uint32_t * ) 0xe000e014 ) )

+#define portNVIC_SYSTICK_CURRENT_VALUE_REG	( * ( ( volatile uint32_t * ) 0xe000e018 ) )

+#define portNVIC_SYSPRI2_REG				( * ( ( volatile uint32_t * ) 0xe000ed20 ) )

+/* ...then bits in the registers. */

+#define portNVIC_SYSTICK_INT_BIT			( 1UL << 1UL )

+#define portNVIC_SYSTICK_ENABLE_BIT			( 1UL << 0UL )

+#define portNVIC_SYSTICK_COUNT_FLAG_BIT		( 1UL << 16UL )

+#define portNVIC_PENDSVCLEAR_BIT 			( 1UL << 27UL )

+#define portNVIC_PEND_SYSTICK_CLEAR_BIT		( 1UL << 25UL )

+

+#define portNVIC_PENDSV_PRI					( ( ( uint32_t ) configKERNEL_INTERRUPT_PRIORITY ) << 16UL )

+#define portNVIC_SYSTICK_PRI				( ( ( uint32_t ) configKERNEL_INTERRUPT_PRIORITY ) << 24UL )

+

+/* Constants required to check the validity of an interrupt priority. */

+#define portFIRST_USER_INTERRUPT_NUMBER		( 16 )

+#define portNVIC_IP_REGISTERS_OFFSET_16 	( 0xE000E3F0 )

+#define portAIRCR_REG						( * ( ( volatile uint32_t * ) 0xE000ED0C ) )

+#define portMAX_8_BIT_VALUE					( ( uint8_t ) 0xff )

+#define portTOP_BIT_OF_BYTE					( ( uint8_t ) 0x80 )

+#define portMAX_PRIGROUP_BITS				( ( uint8_t ) 7 )

+#define portPRIORITY_GROUP_MASK				( 0x07UL << 8UL )

+#define portPRIGROUP_SHIFT					( 8UL )

+

+/* Masks off all bits but the VECTACTIVE bits in the ICSR register. */

+#define portVECTACTIVE_MASK					( 0xFFUL )

+

+/* Constants required to manipulate the VFP. */

+#define portFPCCR							( ( volatile uint32_t * ) 0xe000ef34 ) /* Floating point context control register. */

+#define portASPEN_AND_LSPEN_BITS			( 0x3UL << 30UL )

+

+/* Constants required to set up the initial stack. */

+#define portINITIAL_XPSR					( 0x01000000 )

+#define portINITIAL_EXC_RETURN				( 0xfffffffd )

+

+/* The systick is a 24-bit counter. */

+#define portMAX_24_BIT_NUMBER				( 0xffffffUL )

+

+/* A fiddle factor to estimate the number of SysTick counts that would have

+occurred while the SysTick counter is stopped during tickless idle

+calculations. */

+#define portMISSED_COUNTS_FACTOR			( 45UL )

+

+/* For strict compliance with the Cortex-M spec the task start address should

+have bit-0 clear, as it is loaded into the PC on exit from an ISR. */

+#define portSTART_ADDRESS_MASK		( ( StackType_t ) 0xfffffffeUL )

+

+/*

+ * Setup the timer to generate the tick interrupts.  The implementation in this

+ * file is weak to allow application writers to change the timer used to

+ * generate the tick interrupt.

+ */

+void vPortSetupTimerInterrupt( void );

+

+/*

+ * Exception handlers.

+ */

+void xPortSysTickHandler( void );

+

+/*

+ * Start first task is a separate function so it can be tested in isolation.

+ */

+extern void vPortStartFirstTask( void );

+

+/*

+ * Turn the VFP on.

+ */

+extern void vPortEnableVFP( void );

+

+/*

+ * Used to catch tasks that attempt to return from their implementing function.

+ */

+static void prvTaskExitError( void );

+

+/*-----------------------------------------------------------*/

+

+/* Required to allow portasm.asm access the configMAX_SYSCALL_INTERRUPT_PRIORITY

+setting. */

+const uint32_t ulMaxSyscallInterruptPriority = configMAX_SYSCALL_INTERRUPT_PRIORITY;

+

+/* Each task maintains its own interrupt status in the critical nesting

+variable. */

+static UBaseType_t uxCriticalNesting = 0xaaaaaaaa;

+

+/*

+ * The number of SysTick increments that make up one tick period.

+ */

+#if( configUSE_TICKLESS_IDLE == 1 )

+	static uint32_t ulTimerCountsForOneTick = 0;

+#endif /* configUSE_TICKLESS_IDLE */

+

+/*

+ * The maximum number of tick periods that can be suppressed is limited by the

+ * 24 bit resolution of the SysTick timer.

+ */

+#if( configUSE_TICKLESS_IDLE == 1 )

+	static uint32_t xMaximumPossibleSuppressedTicks = 0;

+#endif /* configUSE_TICKLESS_IDLE */

+

+/*

+ * Compensate for the CPU cycles that pass while the SysTick is stopped (low

+ * power functionality only.

+ */

+#if( configUSE_TICKLESS_IDLE == 1 )

+	static uint32_t ulStoppedTimerCompensation = 0;

+#endif /* configUSE_TICKLESS_IDLE */

+

+/*

+ * Used by the portASSERT_IF_INTERRUPT_PRIORITY_INVALID() macro to ensure

+ * FreeRTOS API functions are not called from interrupts that have been assigned

+ * a priority above configMAX_SYSCALL_INTERRUPT_PRIORITY.

+ */

+#if ( configASSERT_DEFINED == 1 )

+	 static uint8_t ucMaxSysCallPriority = 0;

+	 static uint32_t ulMaxPRIGROUPValue = 0;

+	 static const volatile uint8_t * const pcInterruptPriorityRegisters = ( uint8_t * ) portNVIC_IP_REGISTERS_OFFSET_16;

+#endif /* configASSERT_DEFINED */

+

+/*-----------------------------------------------------------*/

+

+/*

+ * See header file for description.

+ */

+StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters )

+{

+	/* Simulate the stack frame as it would be created by a context switch

+	interrupt. */

+

+	/* Offset added to account for the way the MCU uses the stack on entry/exit

+	of interrupts, and to ensure alignment. */

+	pxTopOfStack--;

+

+	*pxTopOfStack = portINITIAL_XPSR;	/* xPSR */

+	pxTopOfStack--;

+	*pxTopOfStack = ( ( StackType_t ) pxCode ) & portSTART_ADDRESS_MASK;	/* PC */

+	pxTopOfStack--;

+	*pxTopOfStack = ( StackType_t ) prvTaskExitError;	/* LR */

+

+	/* Save code space by skipping register initialisation. */

+	pxTopOfStack -= 5;	/* R12, R3, R2 and R1. */

+	*pxTopOfStack = ( StackType_t ) pvParameters;	/* R0 */

+

+	/* A save method is being used that requires each task to maintain its

+	own exec return value. */

+	pxTopOfStack--;

+	*pxTopOfStack = portINITIAL_EXC_RETURN;

+

+	pxTopOfStack -= 8;	/* R11, R10, R9, R8, R7, R6, R5 and R4. */

+

+	return pxTopOfStack;

+}

+/*-----------------------------------------------------------*/

+

+static void prvTaskExitError( void )

+{

+	/* A function that implements a task must not exit or attempt to return to

+	its caller as there is nothing to return to.  If a task wants to exit it

+	should instead call vTaskDelete( NULL ).

+

+	Artificially force an assert() to be triggered if configASSERT() is

+	defined, then stop here so application writers can catch the error. */

+	configASSERT( uxCriticalNesting == ~0UL );

+	portDISABLE_INTERRUPTS();

+	for( ;; );

+}

+/*-----------------------------------------------------------*/

+

+/*

+ * See header file for description.

+ */

+BaseType_t xPortStartScheduler( void )

+{

+	#if( configASSERT_DEFINED == 1 )

+	{

+		volatile uint32_t ulOriginalPriority;

+		volatile uint8_t * const pucFirstUserPriorityRegister = ( uint8_t * ) ( portNVIC_IP_REGISTERS_OFFSET_16 + portFIRST_USER_INTERRUPT_NUMBER );

+		volatile uint8_t ucMaxPriorityValue;

+

+		/* Determine the maximum priority from which ISR safe FreeRTOS API

+		functions can be called.  ISR safe functions are those that end in

+		"FromISR".  FreeRTOS maintains separate thread and ISR API functions to

+		ensure interrupt entry is as fast and simple as possible.

+

+		Save the interrupt priority value that is about to be clobbered. */

+		ulOriginalPriority = *pucFirstUserPriorityRegister;

+

+		/* Determine the number of priority bits available.  First write to all

+		possible bits. */

+		*pucFirstUserPriorityRegister = portMAX_8_BIT_VALUE;

+

+		/* Read the value back to see how many bits stuck. */

+		ucMaxPriorityValue = *pucFirstUserPriorityRegister;

+

+		/* Use the same mask on the maximum system call priority. */

+		ucMaxSysCallPriority = configMAX_SYSCALL_INTERRUPT_PRIORITY & ucMaxPriorityValue;

+

+		/* Calculate the maximum acceptable priority group value for the number

+		of bits read back. */

+		ulMaxPRIGROUPValue = portMAX_PRIGROUP_BITS;

+		while( ( ucMaxPriorityValue & portTOP_BIT_OF_BYTE ) == portTOP_BIT_OF_BYTE )

+		{

+			ulMaxPRIGROUPValue--;

+			ucMaxPriorityValue <<= ( uint8_t ) 0x01;

+		}

+

+		#ifdef __NVIC_PRIO_BITS

+		{

+			/* Check the CMSIS configuration that defines the number of

+			priority bits matches the number of priority bits actually queried

+			from the hardware. */

+			configASSERT( ( portMAX_PRIGROUP_BITS - ulMaxPRIGROUPValue ) == __NVIC_PRIO_BITS );

+		}

+		#endif

+		

+		#ifdef configPRIO_BITS

+		{

+			/* Check the FreeRTOS configuration that defines the number of

+			priority bits matches the number of priority bits actually queried

+			from the hardware. */

+			configASSERT( ( portMAX_PRIGROUP_BITS - ulMaxPRIGROUPValue ) == configPRIO_BITS );

+		}

+		#endif

+

+		/* Shift the priority group value back to its position within the AIRCR

+		register. */

+		ulMaxPRIGROUPValue <<= portPRIGROUP_SHIFT;

+		ulMaxPRIGROUPValue &= portPRIORITY_GROUP_MASK;

+

+		/* Restore the clobbered interrupt priority register to its original

+		value. */

+		*pucFirstUserPriorityRegister = ulOriginalPriority;

+	}

+	#endif /* conifgASSERT_DEFINED */

+

+	/* Make PendSV and SysTick the lowest priority interrupts. */

+	portNVIC_SYSPRI2_REG |= portNVIC_PENDSV_PRI;

+	portNVIC_SYSPRI2_REG |= portNVIC_SYSTICK_PRI;

+

+	/* Start the timer that generates the tick ISR.  Interrupts are disabled

+	here already. */

+	vPortSetupTimerInterrupt();

+

+	/* Initialise the critical nesting count ready for the first task. */

+	uxCriticalNesting = 0;

+

+	/* Ensure the VFP is enabled - it should be anyway. */

+	vPortEnableVFP();

+

+	/* Lazy save always. */

+	*( portFPCCR ) |= portASPEN_AND_LSPEN_BITS;

+

+	/* Start the first task. */

+	vPortStartFirstTask();

+

+	/* Should not get here! */

+	return 0;

+}

+/*-----------------------------------------------------------*/

+

+void vPortEndScheduler( void )

+{

+	/* Not implemented in ports where there is nothing to return to.

+	Artificially force an assert. */

+	configASSERT( uxCriticalNesting == 1000UL );

+}

+/*-----------------------------------------------------------*/

+

+void vPortEnterCritical( void )

+{

+	portDISABLE_INTERRUPTS();

+	uxCriticalNesting++;

+

+	/* This is not the interrupt safe version of the enter critical function so

+	assert() if it is being called from an interrupt context.  Only API

+	functions that end in "FromISR" can be used in an interrupt.  Only assert if

+	the critical nesting count is 1 to protect against recursive calls if the

+	assert function also uses a critical section. */

+	if( uxCriticalNesting == 1 )

+	{

+		configASSERT( ( portNVIC_INT_CTRL_REG & portVECTACTIVE_MASK ) == 0 );

+	}

+}

+/*-----------------------------------------------------------*/

+

+void vPortExitCritical( void )

+{

+	configASSERT( uxCriticalNesting );

+	uxCriticalNesting--;

+	if( uxCriticalNesting == 0 )

+	{

+		portENABLE_INTERRUPTS();

+	}

+}

+/*-----------------------------------------------------------*/

+

+void xPortSysTickHandler( void )

+{

+	/* The SysTick runs at the lowest interrupt priority, so when this interrupt

+	executes all interrupts must be unmasked.  There is therefore no need to

+	save and then restore the interrupt mask value as its value is already

+	known. */

+	( void ) portSET_INTERRUPT_MASK_FROM_ISR();

+	{

+		/* Increment the RTOS tick. */

+		if( xTaskIncrementTick() != pdFALSE )

+		{

+			/* A context switch is required.  Context switching is performed in

+			the PendSV interrupt.  Pend the PendSV interrupt. */

+			portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT;

+		}

+	}

+	portCLEAR_INTERRUPT_MASK_FROM_ISR( 0 );

+}

+/*-----------------------------------------------------------*/

+

+#if( configUSE_TICKLESS_IDLE == 1 )

+

+	#pragma WEAK( vPortSuppressTicksAndSleep )

+	void vPortSuppressTicksAndSleep( TickType_t xExpectedIdleTime )

+	{

+	uint32_t ulReloadValue, ulCompleteTickPeriods, ulCompletedSysTickDecrements;

+	TickType_t xModifiableIdleTime;

+

+		/* Make sure the SysTick reload value does not overflow the counter. */

+		if( xExpectedIdleTime > xMaximumPossibleSuppressedTicks )

+		{

+			xExpectedIdleTime = xMaximumPossibleSuppressedTicks;

+		}

+

+		/* Stop the SysTick momentarily.  The time the SysTick is stopped for

+		is accounted for as best it can be, but using the tickless mode will

+		inevitably result in some tiny drift of the time maintained by the

+		kernel with respect to calendar time. */

+		portNVIC_SYSTICK_CTRL_REG &= ~portNVIC_SYSTICK_ENABLE_BIT;

+

+		/* Calculate the reload value required to wait xExpectedIdleTime

+		tick periods.  -1 is used because this code will execute part way

+		through one of the tick periods. */

+		ulReloadValue = portNVIC_SYSTICK_CURRENT_VALUE_REG + ( ulTimerCountsForOneTick * ( xExpectedIdleTime - 1UL ) );

+		if( ulReloadValue > ulStoppedTimerCompensation )

+		{

+			ulReloadValue -= ulStoppedTimerCompensation;

+		}

+

+		/* Enter a critical section but don't use the taskENTER_CRITICAL()

+		method as that will mask interrupts that should exit sleep mode. */

+		__asm( "	cpsid i" );

+		__asm( "	dsb" );

+		__asm( "	isb" );

+

+

+		/* If a context switch is pending or a task is waiting for the scheduler

+		to be unsuspended then abandon the low power entry. */

+		if( eTaskConfirmSleepModeStatus() == eAbortSleep )

+		{

+			/* Restart from whatever is left in the count register to complete

+			this tick period. */

+			portNVIC_SYSTICK_LOAD_REG = portNVIC_SYSTICK_CURRENT_VALUE_REG;

+

+			/* Restart SysTick. */

+			portNVIC_SYSTICK_CTRL_REG |= portNVIC_SYSTICK_ENABLE_BIT;

+

+			/* Reset the reload register to the value required for normal tick

+			periods. */

+			portNVIC_SYSTICK_LOAD_REG = ulTimerCountsForOneTick - 1UL;

+

+			/* Re-enable interrupts - see comments above __disable_interrupt()

+			call above. */

+			__asm( "	cpsie i" );

+		}

+		else

+		{

+			/* Set the new reload value. */

+			portNVIC_SYSTICK_LOAD_REG = ulReloadValue;

+

+			/* Clear the SysTick count flag and set the count value back to

+			zero. */

+			portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL;

+

+			/* Restart SysTick. */

+			portNVIC_SYSTICK_CTRL_REG |= portNVIC_SYSTICK_ENABLE_BIT;

+

+			/* Sleep until something happens.  configPRE_SLEEP_PROCESSING() can

+			set its parameter to 0 to indicate that its implementation contains

+			its own wait for interrupt or wait for event instruction, and so wfi

+			should not be executed again.  However, the original expected idle

+			time variable must remain unmodified, so a copy is taken. */

+			xModifiableIdleTime = xExpectedIdleTime;

+			configPRE_SLEEP_PROCESSING( xModifiableIdleTime );

+			if( xModifiableIdleTime > 0 )

+			{

+				__asm( "	dsb" );

+				__asm( "	wfi" );

+				__asm( "	isb" );

+			}

+			configPOST_SLEEP_PROCESSING( xExpectedIdleTime );

+

+			/* Re-enable interrupts to allow the interrupt that brought the MCU

+			out of sleep mode to execute immediately.  see comments above

+			__disable_interrupt() call above. */

+			__asm( "	cpsie i" );

+			__asm( "	dsb" );

+			__asm( "	isb" );

+

+			/* Disable interrupts again because the clock is about to be stopped

+			and interrupts that execute while the clock is stopped will increase

+			any slippage between the time maintained by the RTOS and calendar

+			time. */

+			__asm( "	cpsid i" );

+			__asm( "	dsb" );

+			__asm( "	isb" );

+

+			/* Disable the SysTick clock without reading the

+			portNVIC_SYSTICK_CTRL_REG register to ensure the

+			portNVIC_SYSTICK_COUNT_FLAG_BIT is not cleared if it is set.  Again,

+			the time the SysTick is stopped for is accounted for as best it can

+			be, but using the tickless mode will inevitably result in some tiny

+			drift of the time maintained by the kernel with respect to calendar

+			time*/

+			portNVIC_SYSTICK_CTRL_REG = ( portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT );

+

+			/* Determine if the SysTick clock has already counted to zero and

+			been set back to the current reload value (the reload back being

+			correct for the entire expected idle time) or if the SysTick is yet

+			to count to zero (in which case an interrupt other than the SysTick

+			must have brought the system out of sleep mode). */

+			if( ( portNVIC_SYSTICK_CTRL_REG & portNVIC_SYSTICK_COUNT_FLAG_BIT ) != 0 )

+			{

+				uint32_t ulCalculatedLoadValue;

+

+				/* The tick interrupt is already pending, and the SysTick count

+				reloaded with ulReloadValue.  Reset the

+				portNVIC_SYSTICK_LOAD_REG with whatever remains of this tick

+				period. */

+				ulCalculatedLoadValue = ( ulTimerCountsForOneTick - 1UL ) - ( ulReloadValue - portNVIC_SYSTICK_CURRENT_VALUE_REG );

+

+				/* Don't allow a tiny value, or values that have somehow

+				underflowed because the post sleep hook did something

+				that took too long. */

+				if( ( ulCalculatedLoadValue < ulStoppedTimerCompensation ) || ( ulCalculatedLoadValue > ulTimerCountsForOneTick ) )

+				{

+					ulCalculatedLoadValue = ( ulTimerCountsForOneTick - 1UL );

+				}

+

+				portNVIC_SYSTICK_LOAD_REG = ulCalculatedLoadValue;

+

+				/* As the pending tick will be processed as soon as this

+				function exits, the tick value maintained by the tick is stepped

+				forward by one less than the time spent waiting. */

+				ulCompleteTickPeriods = xExpectedIdleTime - 1UL;

+			}

+			else

+			{

+				/* Something other than the tick interrupt ended the sleep.

+				Work out how long the sleep lasted rounded to complete tick

+				periods (not the ulReload value which accounted for part

+				ticks). */

+				ulCompletedSysTickDecrements = ( xExpectedIdleTime * ulTimerCountsForOneTick ) - portNVIC_SYSTICK_CURRENT_VALUE_REG;

+

+				/* How many complete tick periods passed while the processor

+				was waiting? */

+				ulCompleteTickPeriods = ulCompletedSysTickDecrements / ulTimerCountsForOneTick;

+

+				/* The reload value is set to whatever fraction of a single tick

+				period remains. */

+				portNVIC_SYSTICK_LOAD_REG = ( ( ulCompleteTickPeriods + 1UL ) * ulTimerCountsForOneTick ) - ulCompletedSysTickDecrements;

+			}

+

+			/* Restart SysTick so it runs from portNVIC_SYSTICK_LOAD_REG

+			again, then set portNVIC_SYSTICK_LOAD_REG back to its standard

+			value. */

+			portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL;

+			portNVIC_SYSTICK_CTRL_REG |= portNVIC_SYSTICK_ENABLE_BIT;

+			vTaskStepTick( ulCompleteTickPeriods );

+			portNVIC_SYSTICK_LOAD_REG = ulTimerCountsForOneTick - 1UL;

+

+			/* Exit with interrpts enabled. */

+			__asm( "	cpsie i" );

+		}

+	}

+

+#endif /* configUSE_TICKLESS_IDLE */

+/*-----------------------------------------------------------*/

+

+/*

+ * Setup the systick timer to generate the tick interrupts at the required

+ * frequency.

+ */

+#pragma WEAK( vPortSetupTimerInterrupt )

+void vPortSetupTimerInterrupt( void )

+{

+	/* Calculate the constants required to configure the tick interrupt. */

+	#if( configUSE_TICKLESS_IDLE == 1 )

+	{

+		ulTimerCountsForOneTick = ( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ );

+		xMaximumPossibleSuppressedTicks = portMAX_24_BIT_NUMBER / ulTimerCountsForOneTick;

+		ulStoppedTimerCompensation = portMISSED_COUNTS_FACTOR / ( configCPU_CLOCK_HZ / configSYSTICK_CLOCK_HZ );

+	}

+	#endif /* configUSE_TICKLESS_IDLE */

+

+	/* Stop and clear the SysTick. */

+	portNVIC_SYSTICK_CTRL_REG = 0UL;

+	portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL;

+

+	/* Configure SysTick to interrupt at the requested rate. */

+	portNVIC_SYSTICK_LOAD_REG = ( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ ) - 1UL;

+	portNVIC_SYSTICK_CTRL_REG = ( portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT );

+}

+/*-----------------------------------------------------------*/

+

+#if( configASSERT_DEFINED == 1 )

+

+	void vPortValidateInterruptPriority( void )

+	{

+	extern uint32_t ulPortGetIPSR( void );

+	uint32_t ulCurrentInterrupt;

+	uint8_t ucCurrentPriority;

+

+		ulCurrentInterrupt = ulPortGetIPSR();

+

+		/* Is the interrupt number a user defined interrupt? */

+		if( ulCurrentInterrupt >= portFIRST_USER_INTERRUPT_NUMBER )

+		{

+			/* Look up the interrupt's priority. */

+			ucCurrentPriority = pcInterruptPriorityRegisters[ ulCurrentInterrupt ];

+

+			/* The following assertion will fail if a service routine (ISR) for

+			an interrupt that has been assigned a priority above

+			configMAX_SYSCALL_INTERRUPT_PRIORITY calls an ISR safe FreeRTOS API

+			function.  ISR safe FreeRTOS API functions must *only* be called

+			from interrupts that have been assigned a priority at or below

+			configMAX_SYSCALL_INTERRUPT_PRIORITY.

+

+			Numerically low interrupt priority numbers represent logically high

+			interrupt priorities, therefore the priority of the interrupt must

+			be set to a value equal to or numerically *higher* than

+			configMAX_SYSCALL_INTERRUPT_PRIORITY.

+

+			Interrupts that	use the FreeRTOS API must not be left at their

+			default priority of	zero as that is the highest possible priority,

+			which is guaranteed to be above configMAX_SYSCALL_INTERRUPT_PRIORITY,

+			and	therefore also guaranteed to be invalid.

+

+			FreeRTOS maintains separate thread and ISR API functions to ensure

+			interrupt entry is as fast and simple as possible.

+

+			The following links provide detailed information:

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

+			http://www.freertos.org/FAQHelp.html */

+			configASSERT( ucCurrentPriority >= ucMaxSysCallPriority );

+		}

+

+		/* Priority grouping:  The interrupt controller (NVIC) allows the bits

+		that define each interrupt's priority to be split between bits that

+		define the interrupt's pre-emption priority bits and bits that define

+		the interrupt's sub-priority.  For simplicity all bits must be defined

+		to be pre-emption priority bits.  The following assertion will fail if

+		this is not the case (if some bits represent a sub-priority).

+

+		If the application only uses CMSIS libraries for interrupt

+		configuration then the correct setting can be achieved on all Cortex-M

+		devices by calling NVIC_SetPriorityGrouping( 0 ); before starting the

+		scheduler.  Note however that some vendor specific peripheral libraries

+		assume a non-zero priority group setting, in which cases using a value

+		of zero will result in unpredictable behaviour. */

+		configASSERT( ( portAIRCR_REG & portPRIORITY_GROUP_MASK ) <= ulMaxPRIGROUPValue );

+	}

+

+#endif /* configASSERT_DEFINED */

+

+

+

+

+

+

+

+

+

+

+

+

+

+

+

+

+

+

+

+

+

diff --git a/190725_FreeRTOS_IoT_Libs_Task_Pool_and_MQTT_Preview/FreeRTOS/Source/portable/CCS/ARM_CM4F/portasm.asm b/190725_FreeRTOS_IoT_Libs_Task_Pool_and_MQTT_Preview/FreeRTOS/Source/portable/CCS/ARM_CM4F/portasm.asm
new file mode 100644
index 0000000..347fe84
--- /dev/null
+++ b/190725_FreeRTOS_IoT_Libs_Task_Pool_and_MQTT_Preview/FreeRTOS/Source/portable/CCS/ARM_CM4F/portasm.asm
@@ -0,0 +1,171 @@
+;/*

+; * FreeRTOS Kernel V10.2.1

+; * Copyright (C) 2019 Amazon.com, Inc. or its affiliates.  All Rights Reserved.

+; *

+; * Permission is hereby granted, free of charge, to any person obtaining a copy of

+; * this software and associated documentation files (the "Software"), to deal in

+; * the Software without restriction, including without limitation the rights to

+; * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of

+; * the Software, and to permit persons to whom the Software is furnished to do so,

+; * subject to the following conditions:

+; *

+; * The above copyright notice and this permission notice shall be included in all

+; * copies or substantial portions of the Software.

+; *

+; * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR

+; * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS

+; * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR

+; * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER

+; * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN

+; * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

+; *

+; * http://www.FreeRTOS.org

+; * http://aws.amazon.com/freertos

+; *

+; * 1 tab == 4 spaces!

+; */

+

+	.thumb

+

+	.ref pxCurrentTCB

+	.ref vTaskSwitchContext

+	.ref ulMaxSyscallInterruptPriority

+

+	.def xPortPendSVHandler

+	.def ulPortGetIPSR

+	.def vPortSVCHandler

+	.def vPortStartFirstTask

+	.def vPortEnableVFP

+

+NVICOffsetConst:					.word 	0xE000ED08

+CPACRConst:							.word 	0xE000ED88

+pxCurrentTCBConst:					.word	pxCurrentTCB

+ulMaxSyscallInterruptPriorityConst: .word ulMaxSyscallInterruptPriority

+

+; -----------------------------------------------------------

+

+	.align 4

+ulPortGetIPSR: .asmfunc

+ 	mrs r0, ipsr

+ 	bx r14

+ 	.endasmfunc

+ ; -----------------------------------------------------------

+

+	.align 4

+vPortSetInterruptMask: .asmfunc

+	push {r0}

+	ldr r0, ulMaxSyscallInterruptPriorityConst

+	msr basepri, r0

+	pop {r0}

+	bx r14

+	.endasmfunc

+; -----------------------------------------------------------

+

+	.align 4

+xPortPendSVHandler: .asmfunc

+	mrs r0, psp

+	isb

+

+	;/* Get the location of the current TCB. */

+	ldr	r3, pxCurrentTCBConst

+	ldr	r2, [r3]

+

+	;/* Is the task using the FPU context?  If so, push high vfp registers. */

+	tst r14, #0x10

+	it eq

+	vstmdbeq r0!, {s16-s31}

+

+	;/* Save the core registers. */

+	stmdb r0!, {r4-r11, r14}

+

+	;/* Save the new top of stack into the first member of the TCB. */

+	str r0, [r2]

+

+	stmdb sp!, {r0, r3}

+	ldr r0, ulMaxSyscallInterruptPriorityConst

+	ldr r1, [r0]

+	msr basepri, r1

+	dsb

+	isb

+	bl vTaskSwitchContext

+	mov r0, #0

+	msr basepri, r0

+	ldmia sp!, {r0, r3}

+

+	;/* The first item in pxCurrentTCB is the task top of stack. */

+	ldr r1, [r3]

+	ldr r0, [r1]

+

+	;/* Pop the core registers. */

+	ldmia r0!, {r4-r11, r14}

+

+	;/* Is the task using the FPU context?  If so, pop the high vfp registers

+	;too. */

+	tst r14, #0x10

+	it eq

+	vldmiaeq r0!, {s16-s31}

+

+	msr psp, r0

+	isb

+	bx r14

+	.endasmfunc

+

+; -----------------------------------------------------------

+

+	.align 4

+vPortSVCHandler: .asmfunc

+	;/* Get the location of the current TCB. */

+	ldr	r3, pxCurrentTCBConst

+	ldr r1, [r3]

+	ldr r0, [r1]

+	;/* Pop the core registers. */

+	ldmia r0!, {r4-r11, r14}

+	msr psp, r0

+	isb

+	mov r0, #0

+	msr	basepri, r0

+	bx r14

+	.endasmfunc

+

+; -----------------------------------------------------------

+

+	.align 4

+vPortStartFirstTask: .asmfunc

+	;/* Use the NVIC offset register to locate the stack. */

+	ldr r0, NVICOffsetConst

+	ldr r0, [r0]

+	ldr r0, [r0]

+	;/* Set the msp back to the start of the stack. */

+	msr msp, r0

+	;/* Clear the bit that indicates the FPU is in use in case the FPU was used

+	;before the scheduler was started - which would otherwise result in the

+	;unnecessary leaving of space in the SVC stack for lazy saving of FPU

+	;registers. */

+	mov r0, #0

+	msr control, r0

+	;/* Call SVC to start the first task. */

+	cpsie i

+	cpsie f

+	dsb

+	isb

+	svc #0

+	.endasmfunc

+

+; -----------------------------------------------------------

+

+	.align 4

+vPortEnableVFP: .asmfunc

+	;/* The FPU enable bits are in the CPACR. */

+	ldr.w r0, CPACRConst

+	ldr	r1, [r0]

+

+	;/* Enable CP10 and CP11 coprocessors, then save back. */

+	orr	r1, r1, #( 0xf << 20 )

+	str r1, [r0]

+	bx	r14

+	.endasmfunc

+

+	.end

+

+; -----------------------------------------------------------

+

diff --git a/190725_FreeRTOS_IoT_Libs_Task_Pool_and_MQTT_Preview/FreeRTOS/Source/portable/CCS/ARM_CM4F/portmacro.h b/190725_FreeRTOS_IoT_Libs_Task_Pool_and_MQTT_Preview/FreeRTOS/Source/portable/CCS/ARM_CM4F/portmacro.h
new file mode 100644
index 0000000..a94ec7d
--- /dev/null
+++ b/190725_FreeRTOS_IoT_Libs_Task_Pool_and_MQTT_Preview/FreeRTOS/Source/portable/CCS/ARM_CM4F/portmacro.h
@@ -0,0 +1,165 @@
+/*

+ * FreeRTOS Kernel V10.2.1

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

+ *

+ * Permission is hereby granted, free of charge, to any person obtaining a copy of

+ * this software and associated documentation files (the "Software"), to deal in

+ * the Software without restriction, including without limitation the rights to

+ * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of

+ * the Software, and to permit persons to whom the Software is furnished to do so,

+ * subject to the following conditions:

+ *

+ * The above copyright notice and this permission notice shall be included in all

+ * copies or substantial portions of the Software.

+ *

+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR

+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS

+ * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR

+ * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER

+ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN

+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

+ *

+ * http://www.FreeRTOS.org

+ * http://aws.amazon.com/freertos

+ *

+ * 1 tab == 4 spaces!

+ */

+

+

+#ifndef PORTMACRO_H

+#define PORTMACRO_H

+

+#ifdef __cplusplus

+extern "C" {

+#endif

+

+/*-----------------------------------------------------------

+ * Port specific definitions.

+ *

+ * The settings in this file configure FreeRTOS correctly for the

+ * given hardware and compiler.

+ *

+ * These settings should not be altered.

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

+ */

+

+/* Type definitions. */

+#define portCHAR		char

+#define portFLOAT		float

+#define portDOUBLE		double

+#define portLONG		long

+#define portSHORT		short

+#define portSTACK_TYPE	uint32_t

+#define portBASE_TYPE	long

+

+typedef portSTACK_TYPE StackType_t;

+typedef long BaseType_t;

+typedef unsigned long UBaseType_t;

+

+#if( configUSE_16_BIT_TICKS == 1 )

+	typedef uint16_t TickType_t;

+	#define portMAX_DELAY ( TickType_t ) 0xffff

+#else

+	typedef uint32_t TickType_t;

+	#define portMAX_DELAY ( TickType_t ) 0xffffffffUL

+

+	/* 32-bit tick type on a 32-bit architecture, so reads of the tick count do

+	not need to be guarded with a critical section. */

+	#define portTICK_TYPE_IS_ATOMIC 1

+#endif

+/*-----------------------------------------------------------*/

+

+/* Architecture specifics. */

+#define portSTACK_GROWTH			( -1 )

+#define portTICK_PERIOD_MS			( ( TickType_t ) 1000 / configTICK_RATE_HZ )

+#define portBYTE_ALIGNMENT			8

+/*-----------------------------------------------------------*/

+

+/* Scheduler utilities. */

+#define portYIELD()											\

+{															\

+	/* Set a PendSV to request a context switch. */			\

+	portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT;			\

+	__asm( "	dsb" );										\

+	__asm( "	isb" );										\

+}

+

+#define portNVIC_INT_CTRL_REG		( * ( ( volatile uint32_t * ) 0xe000ed04 ) )

+#define portNVIC_PENDSVSET_BIT		( 1UL << 28UL )

+#define portEND_SWITCHING_ISR( xSwitchRequired ) if( xSwitchRequired != pdFALSE ) portYIELD()

+#define portYIELD_FROM_ISR( x ) portEND_SWITCHING_ISR( x )

+

+/*-----------------------------------------------------------*/

+

+/* Architecture specific optimisations. */

+#ifndef configUSE_PORT_OPTIMISED_TASK_SELECTION

+	#define configUSE_PORT_OPTIMISED_TASK_SELECTION 1

+#endif

+

+#if configUSE_PORT_OPTIMISED_TASK_SELECTION == 1

+

+	/* Check the configuration. */

+	#if( configMAX_PRIORITIES > 32 )

+		#error configUSE_PORT_OPTIMISED_TASK_SELECTION can only be set to 1 when configMAX_PRIORITIES is less than or equal to 32.  It is very rare that a system requires more than 10 to 15 difference priorities as tasks that share a priority will time slice.

+	#endif

+

+	/* Store/clear the ready priorities in a bit map. */

+	#define portRECORD_READY_PRIORITY( uxPriority, uxReadyPriorities ) ( uxReadyPriorities ) |= ( 1UL << ( uxPriority ) )

+	#define portRESET_READY_PRIORITY( uxPriority, uxReadyPriorities ) ( uxReadyPriorities ) &= ~( 1UL << ( uxPriority ) )

+

+	/*-----------------------------------------------------------*/

+

+	#define portGET_HIGHEST_PRIORITY( uxTopPriority, uxReadyPriorities ) uxTopPriority = ( 31 - __clz( ( uxReadyPriorities ) ) )

+

+#endif /* configUSE_PORT_OPTIMISED_TASK_SELECTION */

+/*-----------------------------------------------------------*/

+

+/* Critical section management. */

+extern void vPortEnterCritical( void );

+extern void vPortExitCritical( void );

+

+#define portDISABLE_INTERRUPTS()										\

+{																		\

+	_set_interrupt_priority( configMAX_SYSCALL_INTERRUPT_PRIORITY );	\

+	__asm( "	dsb" );													\

+	__asm( "	isb" );													\

+}

+

+#define portENABLE_INTERRUPTS()					_set_interrupt_priority( 0 )

+#define portENTER_CRITICAL()					vPortEnterCritical()

+#define portEXIT_CRITICAL()						vPortExitCritical()

+#define portSET_INTERRUPT_MASK_FROM_ISR()		_set_interrupt_priority( configMAX_SYSCALL_INTERRUPT_PRIORITY ); __asm( "	dsb" ); __asm( "	isb" )

+#define portCLEAR_INTERRUPT_MASK_FROM_ISR(x)	_set_interrupt_priority( x )

+/*-----------------------------------------------------------*/

+

+/* Tickless idle/low power functionality. */

+#ifndef portSUPPRESS_TICKS_AND_SLEEP

+	extern void vPortSuppressTicksAndSleep( TickType_t xExpectedIdleTime );

+	#define portSUPPRESS_TICKS_AND_SLEEP( xExpectedIdleTime ) vPortSuppressTicksAndSleep( xExpectedIdleTime )

+#endif

+

+/*-----------------------------------------------------------*/

+

+/* Task function macros as described on the FreeRTOS.org WEB site.  These are

+not necessary for to use this port.  They are defined so the common demo files

+(which build with all the ports) will build. */

+#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void *pvParameters )

+#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void *pvParameters )

+/*-----------------------------------------------------------*/

+

+#ifdef configASSERT

+	void vPortValidateInterruptPriority( void );

+	#define portASSERT_IF_INTERRUPT_PRIORITY_INVALID() 	vPortValidateInterruptPriority()

+#endif

+

+/* portNOP() is not required by this port. */

+#define portNOP()

+

+/*-----------------------------------------------------------*/

+

+#ifdef __cplusplus

+}

+#endif

+

+#endif /* PORTMACRO_H */

+

diff --git a/190725_FreeRTOS_IoT_Libs_Task_Pool_and_MQTT_Preview/FreeRTOS/Source/portable/CCS/ARM_Cortex-R4/port.c b/190725_FreeRTOS_IoT_Libs_Task_Pool_and_MQTT_Preview/FreeRTOS/Source/portable/CCS/ARM_Cortex-R4/port.c
new file mode 100644
index 0000000..31904d4
--- /dev/null
+++ b/190725_FreeRTOS_IoT_Libs_Task_Pool_and_MQTT_Preview/FreeRTOS/Source/portable/CCS/ARM_Cortex-R4/port.c
@@ -0,0 +1,312 @@
+/*

+ * FreeRTOS Kernel V10.2.1

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

+ *

+ * Permission is hereby granted, free of charge, to any person obtaining a copy of

+ * this software and associated documentation files (the "Software"), to deal in

+ * the Software without restriction, including without limitation the rights to

+ * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of

+ * the Software, and to permit persons to whom the Software is furnished to do so,

+ * subject to the following conditions:

+ *

+ * The above copyright notice and this permission notice shall be included in all

+ * copies or substantial portions of the Software.

+ *

+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR

+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS

+ * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR

+ * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER

+ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN

+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

+ *

+ * http://www.FreeRTOS.org

+ * http://aws.amazon.com/freertos

+ *

+ * 1 tab == 4 spaces!

+ */

+

+/* FreeRTOS includes. */

+#include "FreeRTOS.h"

+#include "task.h"

+

+/*-----------------------------------------------------------*/

+

+/* Count of the critical section nesting depth. */

+uint32_t ulCriticalNesting = 9999;

+

+/*-----------------------------------------------------------*/

+

+/* Registers required to configure the RTI. */

+#define portRTI_GCTRL_REG  		( * ( ( volatile uint32_t * ) 0xFFFFFC00 ) )

+#define portRTI_TBCTRL_REG  	( * ( ( volatile uint32_t * ) 0xFFFFFC04 ) )

+#define portRTI_COMPCTRL_REG  	( * ( ( volatile uint32_t * ) 0xFFFFFC0C ) )

+#define portRTI_CNT0_FRC0_REG  	( * ( ( volatile uint32_t * ) 0xFFFFFC10 ) )

+#define portRTI_CNT0_UC0_REG  	( * ( ( volatile uint32_t * ) 0xFFFFFC14 ) )

+#define portRTI_CNT0_CPUC0_REG  ( * ( ( volatile uint32_t * ) 0xFFFFFC18 ) )

+#define portRTI_CNT0_COMP0_REG  ( * ( ( volatile uint32_t * ) 0xFFFFFC50 ) )

+#define portRTI_CNT0_UDCP0_REG  ( * ( ( volatile uint32_t * ) 0xFFFFFC54 ) )

+#define portRTI_SETINTENA_REG  	( * ( ( volatile uint32_t * ) 0xFFFFFC80 ) )

+#define portRTI_CLEARINTENA_REG ( * ( ( volatile uint32_t * ) 0xFFFFFC84 ) )

+#define portRTI_INTFLAG_REG  	( * ( ( volatile uint32_t * ) 0xFFFFFC88 ) )

+

+

+/* Constants required to set up the initial stack of each task. */

+#define portINITIAL_SPSR	   	( ( StackType_t ) 0x1F )

+#define portINITIAL_FPSCR	  	( ( StackType_t ) 0x00 )

+#define portINSTRUCTION_SIZE   	( ( StackType_t ) 0x04 )

+#define portTHUMB_MODE_BIT		( ( StackType_t ) 0x20 )

+

+/* The number of words on the stack frame between the saved Top Of Stack and

+R0 (in which the parameters are passed. */

+#define portSPACE_BETWEEN_TOS_AND_PARAMETERS	( 12 )

+

+/*-----------------------------------------------------------*/

+

+/* vPortStartFirstSTask() is defined in portASM.asm */

+extern void vPortStartFirstTask( void );

+

+/*-----------------------------------------------------------*/

+

+/* Saved as part of the task context.  Set to pdFALSE if the task does not

+require an FPU context. */

+uint32_t ulTaskHasFPUContext = 0;

+

+/*-----------------------------------------------------------*/

+

+

+/*

+ * See header file for description.

+ */

+StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters )

+{

+StackType_t *pxOriginalTOS;

+

+	pxOriginalTOS = pxTopOfStack;

+

+	#if __TI_VFP_SUPPORT__

+	{

+		/* Ensure the stack is correctly aligned on exit. */

+		pxTopOfStack--;

+	}

+	#endif

+

+	/* Setup the initial stack of the task.  The stack is set exactly as

+	expected by the portRESTORE_CONTEXT() macro. */

+

+	/* First on the stack is the return address - which is the start of the as

+	the task has not executed yet.  The offset is added to make the return

+	address appear as it would within an IRQ ISR. */

+	*pxTopOfStack = ( StackType_t ) pxCode + portINSTRUCTION_SIZE;

+	pxTopOfStack--;

+

+	*pxTopOfStack = ( StackType_t ) 0x00000000;	/* R14 */

+	pxTopOfStack--;

+	*pxTopOfStack = ( StackType_t ) pxOriginalTOS; /* Stack used when task starts goes in R13. */

+	pxTopOfStack--;

+

+	#ifdef portPRELOAD_TASK_REGISTERS

+	{

+		*pxTopOfStack = ( StackType_t ) 0x12121212;	/* R12 */

+		pxTopOfStack--;

+		*pxTopOfStack = ( StackType_t ) 0x11111111;	/* R11 */

+		pxTopOfStack--;

+		*pxTopOfStack = ( StackType_t ) 0x10101010;	/* R10 */

+		pxTopOfStack--;

+		*pxTopOfStack = ( StackType_t ) 0x09090909;	/* R9 */

+		pxTopOfStack--;

+		*pxTopOfStack = ( StackType_t ) 0x08080808;	/* R8 */

+		pxTopOfStack--;

+		*pxTopOfStack = ( StackType_t ) 0x07070707;	/* R7 */

+		pxTopOfStack--;

+		*pxTopOfStack = ( StackType_t ) 0x06060606;	/* R6 */

+		pxTopOfStack--;

+		*pxTopOfStack = ( StackType_t ) 0x05050505;	/* R5 */

+		pxTopOfStack--;

+		*pxTopOfStack = ( StackType_t ) 0x04040404;	/* R4 */

+		pxTopOfStack--;

+		*pxTopOfStack = ( StackType_t ) 0x03030303;	/* R3 */

+		pxTopOfStack--;

+		*pxTopOfStack = ( StackType_t ) 0x02020202;	/* R2 */

+		pxTopOfStack--;

+		*pxTopOfStack = ( StackType_t ) 0x01010101;	/* R1 */

+		pxTopOfStack--;

+	}

+	#else

+	{

+		pxTopOfStack -= portSPACE_BETWEEN_TOS_AND_PARAMETERS;

+	}

+	#endif

+

+	/* Function parameters are passed in R0. */

+	*pxTopOfStack = ( StackType_t ) pvParameters; /* R0 */

+	pxTopOfStack--;

+

+	/* Set the status register for system mode, with interrupts enabled. */

+	*pxTopOfStack = ( StackType_t ) ( ( _get_CPSR() & ~0xFF ) | portINITIAL_SPSR );

+

+	if( ( ( uint32_t ) pxCode & 0x01UL ) != 0x00 )

+	{

+		/* The task will start in thumb mode. */

+		*pxTopOfStack |= portTHUMB_MODE_BIT;

+	}

+

+	#ifdef __TI_VFP_SUPPORT__

+	{

+		pxTopOfStack--;

+

+		/* The last thing on the stack is the tasks ulUsingFPU value, which by

+		default is set to indicate that the stack frame does not include FPU

+		registers. */

+		*pxTopOfStack = pdFALSE;

+	}

+	#endif

+

+	return pxTopOfStack;

+}

+/*-----------------------------------------------------------*/

+

+static void prvSetupTimerInterrupt(void)

+{

+	/* Disable timer 0. */

+	portRTI_GCTRL_REG &= 0xFFFFFFFEUL;

+

+	/* Use the internal counter. */

+	portRTI_TBCTRL_REG = 0x00000000U;

+

+	/* COMPSEL0 will use the RTIFRC0 counter. */

+	portRTI_COMPCTRL_REG = 0x00000000U;

+

+	/* Initialise the counter and the prescale counter registers. */

+	portRTI_CNT0_UC0_REG =  0x00000000U;

+	portRTI_CNT0_FRC0_REG =  0x00000000U;

+

+	/* Set Prescalar for RTI clock. */

+	portRTI_CNT0_CPUC0_REG = 0x00000001U;

+	portRTI_CNT0_COMP0_REG = ( configCPU_CLOCK_HZ / 2 ) / configTICK_RATE_HZ;

+	portRTI_CNT0_UDCP0_REG = ( configCPU_CLOCK_HZ / 2 ) / configTICK_RATE_HZ;

+

+	/* Clear interrupts. */

+	portRTI_INTFLAG_REG =  0x0007000FU;

+	portRTI_CLEARINTENA_REG	= 0x00070F0FU;

+

+	/* Enable the compare 0 interrupt. */

+	portRTI_SETINTENA_REG = 0x00000001U;

+	portRTI_GCTRL_REG |= 0x00000001U;

+}

+/*-----------------------------------------------------------*/

+

+/*

+ * See header file for description.

+ */

+BaseType_t xPortStartScheduler(void)

+{

+	/* Start the timer that generates the tick ISR. */

+	prvSetupTimerInterrupt();

+

+	/* Reset the critical section nesting count read to execute the first task. */

+	ulCriticalNesting = 0;

+

+	/* Start the first task.  This is done from portASM.asm as ARM mode must be

+	used. */

+	vPortStartFirstTask();

+

+	/* Should not get here! */

+	return pdFAIL;

+}

+/*-----------------------------------------------------------*/

+

+/*

+ * See header file for description.

+ */

+void vPortEndScheduler(void)

+{

+	/* Not implemented in ports where there is nothing to return to.

+	Artificially force an assert. */

+	configASSERT( ulCriticalNesting == 1000UL );

+}

+/*-----------------------------------------------------------*/

+

+#if configUSE_PREEMPTION == 0

+

+	/* The cooperative scheduler requires a normal IRQ service routine to

+	 * simply increment the system tick. */

+	__interrupt void vPortNonPreemptiveTick( void )

+	{

+		/* clear clock interrupt flag */

+		portRTI_INTFLAG_REG = 0x00000001;

+

+		/* Increment the tick count - this may make a delaying task ready

+		to run - but a context switch is not performed. */

+		xTaskIncrementTick();

+	}

+

+ #else

+

+	/*

+	 **************************************************************************

+	 * The preemptive scheduler ISR is written in assembler and can be found

+	 * in the portASM.asm file. This will only get used if portUSE_PREEMPTION

+	 * is set to 1 in portmacro.h

+	 **************************************************************************

+	 */

+	void vPortPreemptiveTick( void );

+

+#endif

+/*-----------------------------------------------------------*/

+

+

+/*

+ * Disable interrupts, and keep a count of the nesting depth.

+ */

+void vPortEnterCritical( void )

+{

+	/* Disable interrupts as per portDISABLE_INTERRUPTS(); */

+	portDISABLE_INTERRUPTS();

+

+	/* Now interrupts are disabled ulCriticalNesting can be accessed

+	directly.  Increment ulCriticalNesting to keep a count of how many times

+	portENTER_CRITICAL() has been called. */

+	ulCriticalNesting++;

+}

+/*-----------------------------------------------------------*/

+

+/*

+ * Decrement the critical nesting count, and if it has reached zero, re-enable

+ * interrupts.

+ */

+void vPortExitCritical( void )

+{

+	if( ulCriticalNesting > 0 )

+	{

+		/* Decrement the nesting count as we are leaving a critical section. */

+		ulCriticalNesting--;

+

+		/* If the nesting level has reached zero then interrupts should be

+		re-enabled. */

+		if( ulCriticalNesting == 0 )

+		{

+			/* Enable interrupts as per portENABLE_INTERRUPTS(). */

+			portENABLE_INTERRUPTS();

+		}

+	}

+}

+/*-----------------------------------------------------------*/

+

+#if __TI_VFP_SUPPORT__

+

+	void vPortTaskUsesFPU( void )

+	{

+	extern void vPortInitialiseFPSCR( void );

+

+		/* A task is registering the fact that it needs an FPU context.  Set the

+		FPU flag (saved as part of the task context. */

+		ulTaskHasFPUContext = pdTRUE;

+

+		/* Initialise the floating point status register. */

+		vPortInitialiseFPSCR();

+	}

+

+#endif /* __TI_VFP_SUPPORT__ */

+

+/*-----------------------------------------------------------*/

+

diff --git a/190725_FreeRTOS_IoT_Libs_Task_Pool_and_MQTT_Preview/FreeRTOS/Source/portable/CCS/ARM_Cortex-R4/portASM.asm b/190725_FreeRTOS_IoT_Libs_Task_Pool_and_MQTT_Preview/FreeRTOS/Source/portable/CCS/ARM_Cortex-R4/portASM.asm
new file mode 100644
index 0000000..fa13b18
--- /dev/null
+++ b/190725_FreeRTOS_IoT_Libs_Task_Pool_and_MQTT_Preview/FreeRTOS/Source/portable/CCS/ARM_Cortex-R4/portASM.asm
@@ -0,0 +1,229 @@
+;/*

+; * FreeRTOS Kernel V10.2.1

+; * Copyright (C) 2019 Amazon.com, Inc. or its affiliates.  All Rights Reserved.

+; *

+; * Permission is hereby granted, free of charge, to any person obtaining a copy of

+; * this software and associated documentation files (the "Software"), to deal in

+; * the Software without restriction, including without limitation the rights to

+; * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of

+; * the Software, and to permit persons to whom the Software is furnished to do so,

+; * subject to the following conditions:

+; *

+; * The above copyright notice and this permission notice shall be included in all

+; * copies or substantial portions of the Software.

+; *

+; * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR

+; * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS

+; * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR

+; * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER

+; * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN

+; * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

+; *

+; * http://www.FreeRTOS.org

+; * http://aws.amazon.com/freertos

+; *

+; * 1 tab == 4 spaces!

+; */

+

+        .text

+        .arm

+        .ref vTaskSwitchContext

+        .ref xTaskIncrementTick

+        .ref ulTaskHasFPUContext

+		.ref pxCurrentTCB

+

+;/*-----------------------------------------------------------*/

+;

+; Save Task Context

+;

+portSAVE_CONTEXT .macro

+		DSB

+

+		; Push R0 as we are going to use it

+		STMDB	SP!, {R0}

+

+		; Set R0 to point to the task stack pointer.

+		STMDB	SP,{SP}^

+		SUB	SP, SP, #4

+		LDMIA	SP!,{R0}

+

+		; Push the return address onto the stack.

+		STMDB	R0!, {LR}

+

+		; Now LR has been saved, it can be used instead of R0.

+		MOV	LR, R0

+

+		; Pop R0 so it can be saved onto the task stack.

+		LDMIA	SP!, {R0}

+

+		; Push all the system mode registers onto the task stack.

+		STMDB	LR,{R0-LR}^

+		SUB	LR, LR, #60

+

+		; Push the SPSR onto the task stack.

+		MRS	R0, SPSR

+		STMDB	LR!, {R0}

+

+    .if (__TI_VFP_SUPPORT__)

+		;Determine if the task maintains an FPU context.

+		LDR	R0, ulFPUContextConst

+		LDR	R0, [R0]

+

+		; Test the flag

+		CMP		R0, #0

+

+		; If the task is not using a floating point context then skip the

+		; saving of the FPU registers.

+		BEQ		$+16

+		FSTMDBD	LR!, {D0-D15}

+		FMRX    R1,  FPSCR

+		STMFD   LR!, {R1}

+

+		; Save the flag

+		STMDB	LR!, {R0}

+	.endif

+

+		; Store the new top of stack for the task.

+		LDR	R0, pxCurrentTCBConst

+		LDR	R0, [R0]

+		STR	LR, [R0]

+

+        .endm

+

+;/*-----------------------------------------------------------*/

+;

+; Restore Task Context

+;

+portRESTORE_CONTEXT .macro

+		LDR		R0, pxCurrentTCBConst

+		LDR		R0, [R0]

+		LDR		LR, [R0]

+

+	.if (__TI_VFP_SUPPORT__)

+		; The floating point context flag is the first thing on the stack.

+		LDR		R0, ulFPUContextConst

+		LDMFD	LR!, {R1}

+		STR		R1, [R0]

+

+		; Test the flag

+		CMP		R1, #0

+

+		; If the task is not using a floating point context then skip the

+		; VFP register loads.

+		BEQ		$+16

+

+		; Restore the floating point context.

+		LDMFD   LR!, {R0}

+		FLDMIAD	LR!, {D0-D15}

+		FMXR    FPSCR, R0

+	.endif

+

+		; Get the SPSR from the stack.

+		LDMFD	LR!, {R0}

+		MSR		SPSR_CSXF, R0

+

+		; Restore all system mode registers for the task.

+		LDMFD	LR, {R0-R14}^

+

+		; Restore the return address.

+		LDR		LR, [LR, #+60]

+

+		; And return - correcting the offset in the LR to obtain the

+		; correct address.

+		SUBS	PC, LR, #4

+        .endm

+

+;/*-----------------------------------------------------------*/

+; Start the first task by restoring its context.

+

+        .def vPortStartFirstTask

+

+vPortStartFirstTask:

+        portRESTORE_CONTEXT

+

+;/*-----------------------------------------------------------*/

+; Yield to another task.

+

+        .def vPortYieldProcessor

+

+vPortYieldProcessor:

+		; Within an IRQ ISR the link register has an offset from the true return

+		; address.  SWI doesn't do this. Add the offset manually so the ISR

+		; return code can be used.

+        ADD     LR, LR, #4

+

+        ; First save the context of the current task.

+        portSAVE_CONTEXT

+

+        ; Select the next task to execute. */

+        BL      vTaskSwitchContext

+

+        ; Restore the context of the task selected to execute.

+        portRESTORE_CONTEXT

+

+;/*-----------------------------------------------------------*/

+; Yield to another task from within the FreeRTOS API

+

+		.def vPortYeildWithinAPI

+

+vPortYeildWithinAPI:

+		; Save the context of the current task.

+

+        portSAVE_CONTEXT

+		; Clear SSI flag.

+		MOVW    R0, #0xFFF4

+		MOVT 	R0, #0xFFFF

+		LDR     R0, [R0]

+

+		; Select the next task to execute. */

+        BL      vTaskSwitchContext

+

+        ; Restore the context of the task selected to execute.

+        portRESTORE_CONTEXT

+

+;/*-----------------------------------------------------------*/

+; Preemptive Tick

+

+        .def vPortPreemptiveTick

+

+vPortPreemptiveTick:

+

+		; Save the context of the current task.

+        portSAVE_CONTEXT

+

+        ; Clear interrupt flag

+        MOVW    R0, #0xFC88

+        MOVT    R0, #0xFFFF

+        MOV     R1, #1

+        STR     R1, [R0]

+

+        ; Increment the tick count, making any adjustments to the blocked lists

+        ; that may be necessary.

+        BL      xTaskIncrementTick

+

+        ; Select the next task to execute.

+        CMP	R0, #0

+        BLNE    vTaskSwitchContext

+

+        ; Restore the context of the task selected to execute.

+        portRESTORE_CONTEXT

+

+;-------------------------------------------------------------------------------

+

+	.if (__TI_VFP_SUPPORT__)

+

+		.def vPortInitialiseFPSCR

+

+vPortInitialiseFPSCR:

+

+		MOV		R0, #0

+		FMXR    FPSCR, R0

+		BX		LR

+

+	.endif ;__TI_VFP_SUPPORT__

+

+

+pxCurrentTCBConst	.word	pxCurrentTCB

+ulFPUContextConst 	.word   ulTaskHasFPUContext

+;-------------------------------------------------------------------------------

+

diff --git a/190725_FreeRTOS_IoT_Libs_Task_Pool_and_MQTT_Preview/FreeRTOS/Source/portable/CCS/ARM_Cortex-R4/portmacro.h b/190725_FreeRTOS_IoT_Libs_Task_Pool_and_MQTT_Preview/FreeRTOS/Source/portable/CCS/ARM_Cortex-R4/portmacro.h
new file mode 100644
index 0000000..1257b7d
--- /dev/null
+++ b/190725_FreeRTOS_IoT_Libs_Task_Pool_and_MQTT_Preview/FreeRTOS/Source/portable/CCS/ARM_Cortex-R4/portmacro.h
@@ -0,0 +1,117 @@
+/*

+ * FreeRTOS Kernel V10.2.1

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

+ *

+ * Permission is hereby granted, free of charge, to any person obtaining a copy of

+ * this software and associated documentation files (the "Software"), to deal in

+ * the Software without restriction, including without limitation the rights to

+ * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of

+ * the Software, and to permit persons to whom the Software is furnished to do so,

+ * subject to the following conditions:

+ *

+ * The above copyright notice and this permission notice shall be included in all

+ * copies or substantial portions of the Software.

+ *

+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR

+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS

+ * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR

+ * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER

+ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN

+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

+ *

+ * http://www.FreeRTOS.org

+ * http://aws.amazon.com/freertos

+ *

+ * 1 tab == 4 spaces!

+ */

+

+#ifndef __PORTMACRO_H__

+#define __PORTMACRO_H__

+

+/*-----------------------------------------------------------

+ * Port specific definitions.

+ *

+ * The settings in this file configure FreeRTOS correctly for the

+ * given hardware and compiler.

+ *

+ * These settings should not be altered.

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

+ */

+

+/* Type definitions. */

+#define portCHAR        char

+#define portFLOAT       float

+#define portDOUBLE      double

+#define portLONG        long

+#define portSHORT       short

+#define portSTACK_TYPE  uint32_t

+#define portBASE_TYPE   long

+

+typedef portSTACK_TYPE StackType_t;

+typedef long BaseType_t;

+typedef unsigned long UBaseType_t;

+

+#if (configUSE_16_BIT_TICKS == 1)

+    typedef uint16_t TickType_t;

+    #define portMAX_DELAY (TickType_t) 0xFFFF

+#else

+    typedef uint32_t TickType_t;

+    #define portMAX_DELAY (TickType_t) 0xFFFFFFFFF

+

+	/* 32-bit tick type on a 32-bit architecture, so reads of the tick count do

+	not need to be guarded with a critical section. */

+	#define portTICK_TYPE_IS_ATOMIC 1

+#endif

+

+

+/* Architecture specifics. */

+#define portSTACK_GROWTH    (-1)

+#define portTICK_PERIOD_MS    ((TickType_t) 1000 / configTICK_RATE_HZ)

+#define portBYTE_ALIGNMENT  8

+

+/* Critical section handling. */

+extern void vPortEnterCritical(void);

+extern void vPortExitCritical(void);

+#define portENTER_CRITICAL()		vPortEnterCritical()

+#define portEXIT_CRITICAL()			vPortExitCritical()

+#define portDISABLE_INTERRUPTS()	asm( " CPSID I" )

+#define portENABLE_INTERRUPTS()		asm( " CPSIE I" )

+

+/* Scheduler utilities. */

+#pragma SWI_ALIAS( vPortYield, 0 )

+extern void vPortYield( void );

+#define portYIELD()             	vPortYield()

+#define portSYS_SSIR1_REG			( * ( ( volatile uint32_t * ) 0xFFFFFFB0 ) )

+#define portSYS_SSIR1_SSKEY			( 0x7500UL )

+#define portYIELD_WITHIN_API()		{ portSYS_SSIR1_REG = portSYS_SSIR1_SSKEY;  asm( " DSB " ); asm( " ISB " ); }

+#define portYIELD_FROM_ISR( x )		if( x != pdFALSE ){ portSYS_SSIR1_REG = portSYS_SSIR1_SSKEY;  ( void ) portSYS_SSIR1_REG; }

+

+#ifndef configUSE_PORT_OPTIMISED_TASK_SELECTION

+	#define configUSE_PORT_OPTIMISED_TASK_SELECTION 1

+#endif

+

+/* Architecture specific optimisations. */

+#if configUSE_PORT_OPTIMISED_TASK_SELECTION == 1

+

+	/* Check the configuration. */

+	#if( configMAX_PRIORITIES > 32 )

+		#error configUSE_PORT_OPTIMISED_TASK_SELECTION can only be set to 1 when configMAX_PRIORITIES is less than or equal to 32.  It is very rare that a system requires more than 10 to 15 difference priorities as tasks that share a priority will time slice.

+	#endif

+

+	/* Store/clear the ready priorities in a bit map. */

+	#define portRECORD_READY_PRIORITY( uxPriority, uxReadyPriorities ) ( uxReadyPriorities ) |= ( 1UL << ( uxPriority ) )

+	#define portRESET_READY_PRIORITY( uxPriority, uxReadyPriorities ) ( uxReadyPriorities ) &= ~( 1UL << ( uxPriority ) )

+

+	/*-----------------------------------------------------------*/

+

+	#define portGET_HIGHEST_PRIORITY( uxTopPriority, uxReadyPriorities ) uxTopPriority = ( 31 - __clz( ( uxReadyPriorities ) ) )

+

+#endif /* configUSE_PORT_OPTIMISED_TASK_SELECTION */

+

+

+/* Task function macros as described on the FreeRTOS.org WEB site. */

+#define portTASK_FUNCTION(vFunction, pvParameters)       void vFunction(void *pvParameters)

+#define portTASK_FUNCTION_PROTO(vFunction, pvParameters) void vFunction(void *pvParameters)

+

+#endif /* __PORTMACRO_H__ */

+

diff --git a/190725_FreeRTOS_IoT_Libs_Task_Pool_and_MQTT_Preview/FreeRTOS/Source/portable/CCS/MSP430X/data_model.h b/190725_FreeRTOS_IoT_Libs_Task_Pool_and_MQTT_Preview/FreeRTOS/Source/portable/CCS/MSP430X/data_model.h
new file mode 100644
index 0000000..018a4b0
--- /dev/null
+++ b/190725_FreeRTOS_IoT_Libs_Task_Pool_and_MQTT_Preview/FreeRTOS/Source/portable/CCS/MSP430X/data_model.h
@@ -0,0 +1,53 @@
+;/*

+; * FreeRTOS Kernel V10.2.1

+; * Copyright (C) 2019 Amazon.com, Inc. or its affiliates.  All Rights Reserved.

+; *

+; * Permission is hereby granted, free of charge, to any person obtaining a copy of

+; * this software and associated documentation files (the "Software"), to deal in

+; * the Software without restriction, including without limitation the rights to

+; * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of

+; * the Software, and to permit persons to whom the Software is furnished to do so,

+; * subject to the following conditions:

+; *

+; * The above copyright notice and this permission notice shall be included in all

+; * copies or substantial portions of the Software.

+; *

+; * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR

+; * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS

+; * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR

+; * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER

+; * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN

+; * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

+; *

+; * http://www.FreeRTOS.org

+; * http://aws.amazon.com/freertos

+; *

+; * 1 tab == 4 spaces!

+; */

+

+	.if $DEFINED( __LARGE_DATA_MODEL__ )

+		.define "pushm.a", pushm_x

+		.define "popm.a", popm_x

+		.define "push.a", push_x

+		.define "pop.a", pop_x

+		.define "mov.a", mov_x

+	.else

+		.define "pushm.w", pushm_x

+		.define "popm.w", popm_x

+		.define "push.w", push_x

+		.define "pop.w", pop_x

+		.define "mov.w", mov_x

+	.endif

+

+	.if $DEFINED( __LARGE_CODE_MODEL__ )

+		.define "calla", call_x

+		.define "reta", ret_x

+	.else

+		.define "call", call_x

+		.define "ret", ret_x

+	.endif

+

+

+

+

+

diff --git a/190725_FreeRTOS_IoT_Libs_Task_Pool_and_MQTT_Preview/FreeRTOS/Source/portable/CCS/MSP430X/port.c b/190725_FreeRTOS_IoT_Libs_Task_Pool_and_MQTT_Preview/FreeRTOS/Source/portable/CCS/MSP430X/port.c
new file mode 100644
index 0000000..c9087ff
--- /dev/null
+++ b/190725_FreeRTOS_IoT_Libs_Task_Pool_and_MQTT_Preview/FreeRTOS/Source/portable/CCS/MSP430X/port.c
@@ -0,0 +1,187 @@
+/*

+ * FreeRTOS Kernel V10.2.1

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

+ *

+ * Permission is hereby granted, free of charge, to any person obtaining a copy of

+ * this software and associated documentation files (the "Software"), to deal in

+ * the Software without restriction, including without limitation the rights to

+ * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of

+ * the Software, and to permit persons to whom the Software is furnished to do so,

+ * subject to the following conditions:

+ *

+ * The above copyright notice and this permission notice shall be included in all

+ * copies or substantial portions of the Software.

+ *

+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR

+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS

+ * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR

+ * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER

+ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN

+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

+ *

+ * http://www.FreeRTOS.org

+ * http://aws.amazon.com/freertos

+ *

+ * 1 tab == 4 spaces!

+ */

+

+/* Scheduler includes. */

+#include "FreeRTOS.h"

+#include "task.h"

+

+/*-----------------------------------------------------------

+ * Implementation of functions defined in portable.h for the MSP430X port.

+ *----------------------------------------------------------*/

+

+/* Constants required for hardware setup.  The tick ISR runs off the ACLK,

+not the MCLK. */

+#define portACLK_FREQUENCY_HZ			( ( TickType_t ) 32768 )

+#define portINITIAL_CRITICAL_NESTING	( ( uint16_t ) 10 )

+#define portFLAGS_INT_ENABLED			( ( StackType_t ) 0x08 )

+

+/* We require the address of the pxCurrentTCB variable, but don't want to know

+any details of its type. */

+typedef void TCB_t;

+extern volatile TCB_t * volatile pxCurrentTCB;

+

+/* Each task maintains a count of the critical section nesting depth.  Each

+time a critical section is entered the count is incremented.  Each time a

+critical section is exited the count is decremented - with interrupts only

+being re-enabled if the count is zero.

+

+usCriticalNesting will get set to zero when the scheduler starts, but must

+not be initialised to zero as this will cause problems during the startup

+sequence. */

+volatile uint16_t usCriticalNesting = portINITIAL_CRITICAL_NESTING;

+/*-----------------------------------------------------------*/

+

+

+/*

+ * Sets up the periodic ISR used for the RTOS tick.  This uses timer 0, but

+ * could have alternatively used the watchdog timer or timer 1.

+ */

+void vPortSetupTimerInterrupt( void );

+/*-----------------------------------------------------------*/

+

+/*

+ * Initialise the stack of a task to look exactly as if a call to

+ * portSAVE_CONTEXT had been called.

+ *

+ * See the header file portable.h.

+ */

+StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters )

+{

+uint16_t *pusTopOfStack;

+uint32_t *pulTopOfStack, ulTemp;

+

+	/*

+		Place a few bytes of known values on the bottom of the stack.

+		This is just useful for debugging and can be included if required.

+

+		*pxTopOfStack = ( StackType_t ) 0x1111;

+		pxTopOfStack--;

+		*pxTopOfStack = ( StackType_t ) 0x2222;

+		pxTopOfStack--;

+		*pxTopOfStack = ( StackType_t ) 0x3333;

+		pxTopOfStack--;

+	*/

+

+	/* Data types are need either 16 bits or 32 bits depending on the data 

+	and code model used. */

+	if( sizeof( pxCode ) == sizeof( uint16_t ) )

+	{

+		pusTopOfStack = ( uint16_t * ) pxTopOfStack;

+		ulTemp = ( uint32_t ) pxCode;

+		*pusTopOfStack = ( uint16_t ) ulTemp;

+	}

+	else

+	{

+		/* Make room for a 20 bit value stored as a 32 bit value. */

+		pusTopOfStack = ( uint16_t * ) pxTopOfStack;		

+		pusTopOfStack--;

+		pulTopOfStack = ( uint32_t * ) pusTopOfStack;

+		*pulTopOfStack = ( uint32_t ) pxCode;

+	}

+

+	pusTopOfStack--;

+	*pusTopOfStack = portFLAGS_INT_ENABLED;

+	pusTopOfStack -= ( sizeof( StackType_t ) / 2 );

+	

+	/* From here on the size of stacked items depends on the memory model. */

+	pxTopOfStack = ( StackType_t * ) pusTopOfStack;

+

+	/* Next the general purpose registers. */

+	#ifdef PRELOAD_REGISTER_VALUES

+		*pxTopOfStack = ( StackType_t ) 0xffff;

+		pxTopOfStack--;

+		*pxTopOfStack = ( StackType_t ) 0xeeee;

+		pxTopOfStack--;

+		*pxTopOfStack = ( StackType_t ) 0xdddd;

+		pxTopOfStack--;

+		*pxTopOfStack = ( StackType_t ) pvParameters;

+		pxTopOfStack--;

+		*pxTopOfStack = ( StackType_t ) 0xbbbb;

+		pxTopOfStack--;

+		*pxTopOfStack = ( StackType_t ) 0xaaaa;

+		pxTopOfStack--;

+		*pxTopOfStack = ( StackType_t ) 0x9999;

+		pxTopOfStack--;

+		*pxTopOfStack = ( StackType_t ) 0x8888;

+		pxTopOfStack--;	

+		*pxTopOfStack = ( StackType_t ) 0x5555;

+		pxTopOfStack--;

+		*pxTopOfStack = ( StackType_t ) 0x6666;

+		pxTopOfStack--;

+		*pxTopOfStack = ( StackType_t ) 0x5555;

+		pxTopOfStack--;

+		*pxTopOfStack = ( StackType_t ) 0x4444;

+		pxTopOfStack--;

+	#else

+		pxTopOfStack -= 3;

+		*pxTopOfStack = ( StackType_t ) pvParameters;

+		pxTopOfStack -= 9;

+	#endif

+

+	/* A variable is used to keep track of the critical section nesting.

+	This variable has to be stored as part of the task context and is

+	initially set to zero. */

+	*pxTopOfStack = ( StackType_t ) portNO_CRITICAL_SECTION_NESTING;	

+

+	/* Return a pointer to the top of the stack we have generated so this can

+	be stored in the task control block for the task. */

+	return pxTopOfStack;

+}

+/*-----------------------------------------------------------*/

+

+void vPortEndScheduler( void )

+{

+	/* It is unlikely that the MSP430 port will get stopped.  If required simply

+	disable the tick interrupt here. */

+}

+/*-----------------------------------------------------------*/

+

+/*

+ * Hardware initialisation to generate the RTOS tick.

+ */

+void vPortSetupTimerInterrupt( void )

+{

+	vApplicationSetupTimerInterrupt();

+}

+/*-----------------------------------------------------------*/

+

+#pragma vector=configTICK_VECTOR

+interrupt void vTickISREntry( void )

+{

+extern void vPortTickISR( void );

+

+	__bic_SR_register_on_exit( SCG1 + SCG0 + OSCOFF + CPUOFF );

+	#if configUSE_PREEMPTION == 1

+		extern void vPortPreemptiveTickISR( void );

+		vPortPreemptiveTickISR();

+	#else

+		extern void vPortCooperativeTickISR( void );

+		vPortCooperativeTickISR();

+	#endif

+}

+

+	

diff --git a/190725_FreeRTOS_IoT_Libs_Task_Pool_and_MQTT_Preview/FreeRTOS/Source/portable/CCS/MSP430X/portext.asm b/190725_FreeRTOS_IoT_Libs_Task_Pool_and_MQTT_Preview/FreeRTOS/Source/portable/CCS/MSP430X/portext.asm
new file mode 100644
index 0000000..9e29a5d
--- /dev/null
+++ b/190725_FreeRTOS_IoT_Libs_Task_Pool_and_MQTT_Preview/FreeRTOS/Source/portable/CCS/MSP430X/portext.asm
@@ -0,0 +1,159 @@
+;/*

+; * FreeRTOS Kernel V10.2.1

+; * Copyright (C) 2019 Amazon.com, Inc. or its affiliates.  All Rights Reserved.

+; *

+; * Permission is hereby granted, free of charge, to any person obtaining a copy of

+; * this software and associated documentation files (the "Software"), to deal in

+; * the Software without restriction, including without limitation the rights to

+; * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of

+; * the Software, and to permit persons to whom the Software is furnished to do so,

+; * subject to the following conditions:

+; *

+; * The above copyright notice and this permission notice shall be included in all

+; * copies or substantial portions of the Software.

+; *

+; * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR

+; * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS

+; * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR

+; * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER

+; * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN

+; * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

+; *

+; * http://www.FreeRTOS.org

+; * http://aws.amazon.com/freertos

+; *

+; * 1 tab == 4 spaces!

+; */

+

+; * The definition of the "register test" tasks, as described at the top of

+; * main.c

+

+	.include data_model.h

+

+	.global xTaskIncrementTick

+	.global vTaskSwitchContext

+	.global vPortSetupTimerInterrupt

+	.global pxCurrentTCB

+	.global usCriticalNesting

+

+	.def vPortPreemptiveTickISR

+	.def vPortCooperativeTickISR

+	.def vPortYield

+	.def xPortStartScheduler

+

+;-----------------------------------------------------------

+

+portSAVE_CONTEXT .macro

+

+	;Save the remaining registers.

+	pushm_x	#12, r15

+	mov.w	&usCriticalNesting, r14

+	push_x r14

+	mov_x	&pxCurrentTCB, r12

+	mov_x	sp, 0( r12 )

+	.endm

+;-----------------------------------------------------------

+

+portRESTORE_CONTEXT .macro

+

+	mov_x	&pxCurrentTCB, r12

+	mov_x	@r12, sp

+	pop_x	r15

+	mov.w	r15, &usCriticalNesting

+	popm_x	#12, r15

+	nop

+	pop.w	sr

+	nop

+	ret_x

+	.endm

+;-----------------------------------------------------------

+

+;*

+;* The RTOS tick ISR.

+;*

+;* If the cooperative scheduler is in use this simply increments the tick

+;* count.

+;*

+;* If the preemptive scheduler is in use a context switch can also occur.

+;*/

+

+	.text

+	.align 2

+

+vPortPreemptiveTickISR: .asmfunc

+

+	; The sr is not saved in portSAVE_CONTEXT() because vPortYield() needs

+	;to save it manually before it gets modified (interrupts get disabled).

+	push.w sr

+	portSAVE_CONTEXT

+

+	call_x	#xTaskIncrementTick

+	call_x	#vTaskSwitchContext

+

+	portRESTORE_CONTEXT

+	.endasmfunc

+;-----------------------------------------------------------

+

+	.align 2

+

+vPortCooperativeTickISR: .asmfunc

+

+	; The sr is not saved in portSAVE_CONTEXT() because vPortYield() needs

+	;to save it manually before it gets modified (interrupts get disabled).

+	push.w sr

+	portSAVE_CONTEXT

+

+	call_x	#xTaskIncrementTick

+

+	portRESTORE_CONTEXT

+

+	.endasmfunc

+;-----------------------------------------------------------

+

+;

+; Manual context switch called by the portYIELD() macro.

+;

+

+	.align 2

+

+vPortYield: .asmfunc

+

+	; The sr needs saving before it is modified.

+	push.w	sr

+

+	; Now the SR is stacked we can disable interrupts.

+	dint

+	nop

+

+	; Save the context of the current task.

+	portSAVE_CONTEXT

+

+	; Select the next task to run.

+	call_x	#vTaskSwitchContext

+

+	; Restore the context of the new task.

+	portRESTORE_CONTEXT

+	.endasmfunc

+;-----------------------------------------------------------

+

+

+;

+; Start off the scheduler by initialising the RTOS tick timer, then restoring

+; the context of the first task.

+;

+

+	.align 2

+

+xPortStartScheduler: .asmfunc

+

+	; Setup the hardware to generate the tick.  Interrupts are disabled

+	; when this function is called.

+	call_x	#vPortSetupTimerInterrupt

+

+	; Restore the context of the first task that is going to run.

+	portRESTORE_CONTEXT

+	.endasmfunc

+;-----------------------------------------------------------

+

+	.end

+

diff --git a/190725_FreeRTOS_IoT_Libs_Task_Pool_and_MQTT_Preview/FreeRTOS/Source/portable/CCS/MSP430X/portmacro.h b/190725_FreeRTOS_IoT_Libs_Task_Pool_and_MQTT_Preview/FreeRTOS/Source/portable/CCS/MSP430X/portmacro.h
new file mode 100644
index 0000000..3a46b01
--- /dev/null
+++ b/190725_FreeRTOS_IoT_Libs_Task_Pool_and_MQTT_Preview/FreeRTOS/Source/portable/CCS/MSP430X/portmacro.h
@@ -0,0 +1,143 @@
+/*

+ * FreeRTOS Kernel V10.2.1

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

+ *

+ * Permission is hereby granted, free of charge, to any person obtaining a copy of

+ * this software and associated documentation files (the "Software"), to deal in

+ * the Software without restriction, including without limitation the rights to

+ * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of

+ * the Software, and to permit persons to whom the Software is furnished to do so,

+ * subject to the following conditions:

+ *

+ * The above copyright notice and this permission notice shall be included in all

+ * copies or substantial portions of the Software.

+ *

+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR

+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS

+ * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR

+ * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER

+ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN

+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

+ *

+ * http://www.FreeRTOS.org

+ * http://aws.amazon.com/freertos

+ *

+ * 1 tab == 4 spaces!

+ */

+

+#ifndef PORTMACRO_H

+#define PORTMACRO_H

+

+/*-----------------------------------------------------------

+ * Port specific definitions.

+ *

+ * The settings in this file configure FreeRTOS correctly for the

+ * given hardware and compiler.

+ *

+ * These settings should not be altered.

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

+ */

+

+/* Hardware includes. */

+#include "msp430.h"

+

+/* Type definitions. */

+#define portCHAR		char

+#define portFLOAT		float

+#define portDOUBLE		double

+#define portLONG		long

+#define portSHORT		int

+#define portBASE_TYPE	portSHORT

+

+/* The stack type changes depending on the data model. */

+#ifdef __LARGE_DATA_MODEL__

+	#define portSTACK_TYPE uint32_t

+#else

+	#define portSTACK_TYPE uint16_t

+	#define portPOINTER_SIZE_TYPE uint16_t

+#endif

+

+typedef portSTACK_TYPE StackType_t;

+typedef short BaseType_t;

+typedef unsigned short UBaseType_t;

+

+#if( configUSE_16_BIT_TICKS == 1 )

+	typedef uint16_t TickType_t;

+	#define portMAX_DELAY ( TickType_t ) 0xffff

+#else

+	typedef uint32_t TickType_t;

+	#define portMAX_DELAY ( TickType_t ) 0xffffffffUL

+#endif

+

+/*-----------------------------------------------------------*/

+

+/* Interrupt control macros. */

+#define portDISABLE_INTERRUPTS()	_disable_interrupt(); _nop()

+#define portENABLE_INTERRUPTS()		_enable_interrupt(); _nop()

+/*-----------------------------------------------------------*/

+

+/* Critical section control macros. */

+#define portNO_CRITICAL_SECTION_NESTING		( ( uint16_t ) 0 )

+

+#define portENTER_CRITICAL()													\

+{																				\

+extern volatile uint16_t usCriticalNesting;										\

+																				\

+	portDISABLE_INTERRUPTS();													\

+																				\

+	/* Now interrupts are disabled usCriticalNesting can be accessed */			\

+	/* directly.  Increment ulCriticalNesting to keep a count of how many */	\

+	/* times portENTER_CRITICAL() has been called. */							\

+	usCriticalNesting++;														\

+}

+

+#define portEXIT_CRITICAL()														\

+{																				\

+extern volatile uint16_t usCriticalNesting;										\

+																				\

+	if( usCriticalNesting > portNO_CRITICAL_SECTION_NESTING )					\

+	{																			\

+		/* Decrement the nesting count as we are leaving a critical section. */	\

+		usCriticalNesting--;													\

+																				\

+		/* If the nesting level has reached zero then interrupts should be */	\

+		/* re-enabled. */														\

+		if( usCriticalNesting == portNO_CRITICAL_SECTION_NESTING )				\

+		{																		\

+			portENABLE_INTERRUPTS();											\

+		}																		\

+	}																			\

+}

+/*-----------------------------------------------------------*/

+

+/* Task utilities. */

+

+/*

+ * Manual context switch called by portYIELD or taskYIELD.

+ */

+extern void vPortYield( void );

+#define portYIELD() vPortYield()

+/*-----------------------------------------------------------*/

+

+/* Hardware specifics. */

+#define portBYTE_ALIGNMENT			2

+#define portSTACK_GROWTH			( -1 )

+#define portTICK_PERIOD_MS			( ( TickType_t ) 1000 / configTICK_RATE_HZ )

+#define portNOP()					__no_operation()

+/*-----------------------------------------------------------*/

+

+/* Task function macros as described on the FreeRTOS.org WEB site. */

+#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void *pvParameters )

+#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void *pvParameters )

+

+extern void vTaskSwitchContext( void );

+#define portYIELD_FROM_ISR( x ) if( x ) vPortYield()

+

+void vApplicationSetupTimerInterrupt( void );

+

+/* sizeof( int ) != sizeof( long ) so a full printf() library is required if

+run time stats information is to be displayed. */

+#define portLU_PRINTF_SPECIFIER_REQUIRED

+

+#endif /* PORTMACRO_H */

+