summaryrefslogtreecommitdiff
path: root/FreeRTOS/Demo/AVR_Dx_Atmel_Studio/RTOSDemo
diff options
context:
space:
mode:
Diffstat (limited to 'FreeRTOS/Demo/AVR_Dx_Atmel_Studio/RTOSDemo')
-rw-r--r--FreeRTOS/Demo/AVR_Dx_Atmel_Studio/RTOSDemo/FreeRTOSConfig.h132
-rw-r--r--FreeRTOS/Demo/AVR_Dx_Atmel_Studio/RTOSDemo/ParTest/partest.c88
-rw-r--r--FreeRTOS/Demo/AVR_Dx_Atmel_Studio/RTOSDemo/RTOSDemo.componentinfo.xml86
-rw-r--r--FreeRTOS/Demo/AVR_Dx_Atmel_Studio/RTOSDemo/RTOSDemo.cproj383
-rw-r--r--FreeRTOS/Demo/AVR_Dx_Atmel_Studio/RTOSDemo/clk_config.h72
-rw-r--r--FreeRTOS/Demo/AVR_Dx_Atmel_Studio/RTOSDemo/main.c94
-rw-r--r--FreeRTOS/Demo/AVR_Dx_Atmel_Studio/RTOSDemo/main_blinky.c177
-rw-r--r--FreeRTOS/Demo/AVR_Dx_Atmel_Studio/RTOSDemo/main_full.c107
-rw-r--r--FreeRTOS/Demo/AVR_Dx_Atmel_Studio/RTOSDemo/main_minimal.c160
-rw-r--r--FreeRTOS/Demo/AVR_Dx_Atmel_Studio/RTOSDemo/regtest.c382
-rw-r--r--FreeRTOS/Demo/AVR_Dx_Atmel_Studio/RTOSDemo/regtest.h34
-rw-r--r--FreeRTOS/Demo/AVR_Dx_Atmel_Studio/RTOSDemo/serial/serial.c150
12 files changed, 1865 insertions, 0 deletions
diff --git a/FreeRTOS/Demo/AVR_Dx_Atmel_Studio/RTOSDemo/FreeRTOSConfig.h b/FreeRTOS/Demo/AVR_Dx_Atmel_Studio/RTOSDemo/FreeRTOSConfig.h
new file mode 100644
index 000000000..7dec85baf
--- /dev/null
+++ b/FreeRTOS/Demo/AVR_Dx_Atmel_Studio/RTOSDemo/FreeRTOSConfig.h
@@ -0,0 +1,132 @@
+/*
+ * FreeRTOS Kernel V10.0.0
+ * Copyright (C) 2017 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. If you wish to use our Amazon
+ * FreeRTOS name, please do so in a fair use way that does not cause confusion.
+ *
+ * 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 FREERTOS_CONFIG_H
+#define FREERTOS_CONFIG_H
+
+/*
+ * #define TCB_t to avoid conflicts between the
+ * FreeRTOS task control block type (TCB_t) and the
+ * AVR Timer Counter B type (TCB_t)
+ */
+#define TCB_t avrTCB_t
+#include <avr/io.h>
+#undef TCB_t
+
+/*
+ * Timer instance | Value
+ * ----------------|---------
+ * TCB0 | 0
+ * TCB1 | 1
+ * TCB2 | 2
+ * TCB3 | 3
+ * TCB4 | 4
+ * RTC | 5
+ */
+
+#define configUSE_TIMER_INSTANCE 0
+#define configUSE_PREEMPTION 1
+
+/* NOTE: You can choose the following clock frequencies (Hz):
+24000000, 20000000, 16000000, 12000000, 10000000, 8000000,
+6000000, 5000000, 4000000, 3000000, 2000000, 1000000.
+For other frequency values, update clock_config.h with your own settings */
+#define configCPU_CLOCK_HZ 10000000
+
+#define configTICK_RATE_HZ 1000
+#define configMAX_PRIORITIES 4
+#define configMINIMAL_STACK_SIZE 120
+#define configMAX_TASK_NAME_LEN 8
+#define configUSE_16_BIT_TICKS 1
+#define configIDLE_SHOULD_YIELD 1
+#define configUSE_TASK_NOTIFICATIONS 1
+#define configUSE_MUTEXES 1
+#define configUSE_RECURSIVE_MUTEXES 1
+#define configUSE_COUNTING_SEMAPHORES 0
+#define configQUEUE_REGISTRY_SIZE 2
+#define configUSE_QUEUE_SETS 0
+#define configUSE_TIME_SLICING 1
+#define configUSE_NEWLIB_REENTRANT 0
+#define configENABLE_BACKWARD_COMPATIBILITY 0
+#define configNUM_THREAD_LOCAL_STORAGE_POINTERS 0
+
+/* Memory allocation related definitions. */
+#define configSUPPORT_STATIC_ALLOCATION 0
+#define configSUPPORT_DYNAMIC_ALLOCATION 1
+#define configTOTAL_HEAP_SIZE 0x1000
+#define configAPPLICATION_ALLOCATED_HEAP 0
+
+/* Hook function related definitions. */
+#define configUSE_IDLE_HOOK 1
+#define configUSE_TICK_HOOK 1
+#define configCHECK_FOR_STACK_OVERFLOW 0
+#define configUSE_MALLOC_FAILED_HOOK 0
+#define configUSE_DAEMON_TASK_STARTUP_HOOK 0
+
+/* Run time and task stats gathering related definitions. */
+#define configGENERATE_RUN_TIME_STATS 0
+#define configUSE_TRACE_FACILITY 0
+#define configUSE_STATS_FORMATTING_FUNCTIONS 0
+
+/* Co-routine related definitions. */
+#define configUSE_CO_ROUTINES 1
+#define configMAX_CO_ROUTINE_PRIORITIES 2
+
+/* Software timer related definitions. */
+#define configUSE_TIMERS 1
+#define configTIMER_TASK_PRIORITY ( configMAX_PRIORITIES - 1 )
+#define configTIMER_QUEUE_LENGTH 10
+#define configTIMER_TASK_STACK_DEPTH ( configMINIMAL_STACK_SIZE * 2 )
+
+/* Define to trap errors during development. */
+//#define configASSERT( x ) if( ( x ) == 0 ) { asm volatile ("cli"); while(1){ asm volatile ("BREAK"); } }
+
+/* Optional functions - most linkers will remove unused functions anyway. */
+#define INCLUDE_vTaskPrioritySet 1
+#define INCLUDE_uxTaskPriorityGet 0
+#define INCLUDE_vTaskDelete 0
+#define INCLUDE_vTaskSuspend 1
+#define INCLUDE_xResumeFromISR 0
+#define INCLUDE_vTaskDelayUntil 1
+#define INCLUDE_vTaskDelay 1
+#define INCLUDE_xTaskGetSchedulerState 0
+#define INCLUDE_xTaskGetCurrentTaskHandle 0
+#define INCLUDE_uxTaskGetStackHighWaterMark 0
+#define INCLUDE_xTaskGetIdleTaskHandle 0
+#define INCLUDE_eTaskGetState 0
+#define INCLUDE_xEventGroupSetBitFromISR 0
+#define INCLUDE_xTimerPendFunctionCall 0
+#define INCLUDE_xTaskAbortDelay 0
+#define INCLUDE_xTaskGetHandle 0
+#define INCLUDE_xTaskResumeFromISR 0
+
+#define pdMS_TO_TICKS(xTimeInMs) ((TickType_t)(((uint32_t)(xTimeInMs) * (uint32_t)configTICK_RATE_HZ) / (uint32_t)1000))
+
+#define recmuRECURSIVE_MUTEX_TEST_TASK_STACK_SIZE ( configMINIMAL_STACK_SIZE * 2 )
+
+#endif /* FREERTOS_CONFIG_H */
diff --git a/FreeRTOS/Demo/AVR_Dx_Atmel_Studio/RTOSDemo/ParTest/partest.c b/FreeRTOS/Demo/AVR_Dx_Atmel_Studio/RTOSDemo/ParTest/partest.c
new file mode 100644
index 000000000..59560cd61
--- /dev/null
+++ b/FreeRTOS/Demo/AVR_Dx_Atmel_Studio/RTOSDemo/ParTest/partest.c
@@ -0,0 +1,88 @@
+/*
+ * FreeRTOS Kernel V10.3.0
+ * Copyright (C) 2020 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!
+ */
+
+#include "FreeRTOS.h"
+#include "task.h"
+#include "partest.h"
+
+/*-----------------------------------------------------------
+ * Simple parallel port IO routines.
+ *-----------------------------------------------------------*/
+
+#define partstALL_BITS_OUTPUT ( ( unsigned char ) 0xff )
+#define partstALL_OUTPUTS_OFF ( ( unsigned char ) 0xff )
+#define partstMAX_OUTPUT_LED ( ( unsigned char ) 7 )
+
+/*-----------------------------------------------------------*/
+
+void vParTestInitialise( void )
+{
+ PORTC.DIRSET = partstALL_BITS_OUTPUT;
+ PORTC.OUTCLR = partstALL_OUTPUTS_OFF;
+}
+/*-----------------------------------------------------------*/
+
+void vParTestSetLED( UBaseType_t uxLED, BaseType_t xValue )
+{
+unsigned char ucBit = ( unsigned char ) 1;
+
+ if( uxLED <= partstMAX_OUTPUT_LED )
+ {
+ ucBit <<= uxLED;
+
+ vTaskSuspendAll();
+ {
+ if( xValue == pdTRUE )
+ {
+ PORTC.OUTSET = ucBit;
+ }
+ else
+ {
+ PORTC.OUTCLR = ucBit;
+ }
+
+ }
+ xTaskResumeAll();
+ }
+}
+/*-----------------------------------------------------------*/
+
+void vParTestToggleLED( UBaseType_t uxLED )
+{
+unsigned char ucBit;
+
+ if( uxLED <= partstMAX_OUTPUT_LED )
+ {
+ ucBit = ( ( unsigned char ) 1 ) << uxLED;
+
+ vTaskSuspendAll();
+ {
+ PORTC.OUTTGL = ucBit;
+ }
+ xTaskResumeAll();
+ }
+} \ No newline at end of file
diff --git a/FreeRTOS/Demo/AVR_Dx_Atmel_Studio/RTOSDemo/RTOSDemo.componentinfo.xml b/FreeRTOS/Demo/AVR_Dx_Atmel_Studio/RTOSDemo/RTOSDemo.componentinfo.xml
new file mode 100644
index 000000000..0de37c77c
--- /dev/null
+++ b/FreeRTOS/Demo/AVR_Dx_Atmel_Studio/RTOSDemo/RTOSDemo.componentinfo.xml
@@ -0,0 +1,86 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Store xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="AtmelPackComponentManagement">
+ <ProjectComponents>
+ <ProjectComponent z:Id="i1" xmlns:z="http://schemas.microsoft.com/2003/10/Serialization/">
+ <CApiVersion></CApiVersion>
+ <CBundle></CBundle>
+ <CClass>Device</CClass>
+ <CGroup>Startup</CGroup>
+ <CSub></CSub>
+ <CVariant></CVariant>
+ <CVendor>Atmel</CVendor>
+ <CVersion>1.2.0</CVersion>
+ <DefaultRepoPath>C:/Program Files (x86)\Atmel\Studio\7.0\Packs</DefaultRepoPath>
+ <DependentComponents xmlns:d4p1="http://schemas.microsoft.com/2003/10/Serialization/Arrays" />
+ <Description></Description>
+ <Files xmlns:d4p1="http://schemas.microsoft.com/2003/10/Serialization/Arrays">
+ <d4p1:anyType i:type="FileInfo">
+ <AbsolutePath>C:/Program Files (x86)\Atmel\Studio\7.0\Packs\Atmel\AVR-Dx_DFP\1.2.56\include</AbsolutePath>
+ <Attribute></Attribute>
+ <Category>include</Category>
+ <Condition>C</Condition>
+ <FileContentHash i:nil="true" />
+ <FileVersion></FileVersion>
+ <Name>include</Name>
+ <SelectString></SelectString>
+ <SourcePath></SourcePath>
+ </d4p1:anyType>
+ <d4p1:anyType i:type="FileInfo">
+ <AbsolutePath>C:/Program Files (x86)\Atmel\Studio\7.0\Packs\Atmel\AVR-Dx_DFP\1.2.56\include\avr\ioavr128da48.h</AbsolutePath>
+ <Attribute></Attribute>
+ <Category>header</Category>
+ <Condition>C</Condition>
+ <FileContentHash>eBF2rQUT5y0eCTjfyvG0Jw==</FileContentHash>
+ <FileVersion></FileVersion>
+ <Name>include/avr/ioavr128da48.h</Name>
+ <SelectString></SelectString>
+ <SourcePath></SourcePath>
+ </d4p1:anyType>
+ <d4p1:anyType i:type="FileInfo">
+ <AbsolutePath>C:/Program Files (x86)\Atmel\Studio\7.0\Packs\Atmel\AVR-Dx_DFP\1.2.56\templates\main.c</AbsolutePath>
+ <Attribute>template</Attribute>
+ <Category>source</Category>
+ <Condition>C Exe</Condition>
+ <FileContentHash>KjvOcFWd++tbnsEMfVPd/w==</FileContentHash>
+ <FileVersion></FileVersion>
+ <Name>templates/main.c</Name>
+ <SelectString>Main file (.c)</SelectString>
+ <SourcePath></SourcePath>
+ </d4p1:anyType>
+ <d4p1:anyType i:type="FileInfo">
+ <AbsolutePath>C:/Program Files (x86)\Atmel\Studio\7.0\Packs\Atmel\AVR-Dx_DFP\1.2.56\templates\main.cpp</AbsolutePath>
+ <Attribute>template</Attribute>
+ <Category>source</Category>
+ <Condition>C Exe</Condition>
+ <FileContentHash>mkKaE95TOoATsuBGv6jmxg==</FileContentHash>
+ <FileVersion></FileVersion>
+ <Name>templates/main.cpp</Name>
+ <SelectString>Main file (.cpp)</SelectString>
+ <SourcePath></SourcePath>
+ </d4p1:anyType>
+ <d4p1:anyType i:type="FileInfo">
+ <AbsolutePath>C:/Program Files (x86)\Atmel\Studio\7.0\Packs\Atmel\AVR-Dx_DFP\1.2.56\gcc\dev\avr128da48</AbsolutePath>
+ <Attribute></Attribute>
+ <Category>libraryPrefix</Category>
+ <Condition>GCC</Condition>
+ <FileContentHash i:nil="true" />
+ <FileVersion></FileVersion>
+ <Name>gcc/dev/avr128da48</Name>
+ <SelectString></SelectString>
+ <SourcePath></SourcePath>
+ </d4p1:anyType>
+ </Files>
+ <PackName>AVR-Dx_DFP</PackName>
+ <PackPath>C:/Program Files (x86)/Atmel/Studio/7.0/Packs/Atmel/AVR-Dx_DFP/1.2.56/Atmel.AVR-Dx_DFP.pdsc</PackPath>
+ <PackVersion>1.2.56</PackVersion>
+ <PresentInProject>true</PresentInProject>
+ <ReferenceConditionId>AVR128DA48</ReferenceConditionId>
+ <RteComponents xmlns:d4p1="http://schemas.microsoft.com/2003/10/Serialization/Arrays">
+ <d4p1:string></d4p1:string>
+ </RteComponents>
+ <Status>Resolved</Status>
+ <VersionMode>Fixed</VersionMode>
+ <IsComponentInAtProject>true</IsComponentInAtProject>
+ </ProjectComponent>
+ </ProjectComponents>
+</Store> \ No newline at end of file
diff --git a/FreeRTOS/Demo/AVR_Dx_Atmel_Studio/RTOSDemo/RTOSDemo.cproj b/FreeRTOS/Demo/AVR_Dx_Atmel_Studio/RTOSDemo/RTOSDemo.cproj
new file mode 100644
index 000000000..1a35dbaca
--- /dev/null
+++ b/FreeRTOS/Demo/AVR_Dx_Atmel_Studio/RTOSDemo/RTOSDemo.cproj
@@ -0,0 +1,383 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="14.0">
+ <PropertyGroup>
+ <SchemaVersion>2.0</SchemaVersion>
+ <ProjectVersion>7.0</ProjectVersion>
+ <ToolchainName>com.Atmel.AVRGCC8.C</ToolchainName>
+ <ProjectGuid>dce6c7e3-ee26-4d79-826b-08594b9ad897</ProjectGuid>
+ <avrdevice>AVR128DA48</avrdevice>
+ <avrdeviceseries>none</avrdeviceseries>
+ <OutputType>Executable</OutputType>
+ <Language>C</Language>
+ <OutputFileName>$(MSBuildProjectName)</OutputFileName>
+ <OutputFileExtension>.elf</OutputFileExtension>
+ <OutputDirectory>$(MSBuildProjectDirectory)\$(Configuration)</OutputDirectory>
+ <AssemblyName>AVRDx_BlinkyDemo</AssemblyName>
+ <Name>RTOSDemo</Name>
+ <RootNamespace>AVRDx_BlinkyDemo</RootNamespace>
+ <ToolchainFlavour>Native</ToolchainFlavour>
+ <KeepTimersRunning>true</KeepTimersRunning>
+ <OverrideVtor>false</OverrideVtor>
+ <CacheFlash>true</CacheFlash>
+ <ProgFlashFromRam>true</ProgFlashFromRam>
+ <RamSnippetAddress>0x20000000</RamSnippetAddress>
+ <UncachedRange />
+ <preserveEEPROM>true</preserveEEPROM>
+ <OverrideVtorValue>exception_table</OverrideVtorValue>
+ <BootSegment>2</BootSegment>
+ <ResetRule>0</ResetRule>
+ <eraseonlaunchrule>0</eraseonlaunchrule>
+ <EraseKey />
+ <AsfFrameworkConfig>
+ <framework-data xmlns="">
+ <options />
+ <configurations />
+ <files />
+ <documentation help="" />
+ <offline-documentation help="" />
+ <dependencies>
+ <content-extension eid="atmel.asf" uuidref="Atmel.ASF" version="3.47.0" />
+ </dependencies>
+ </framework-data>
+ </AsfFrameworkConfig>
+ <avrtool>com.atmel.avrdbg.tool.nedbg</avrtool>
+ <avrtoolserialnumber>MCHP3280031800000581</avrtoolserialnumber>
+ <avrdeviceexpectedsignature>0x1E9708</avrdeviceexpectedsignature>
+ <avrtoolinterface>UPDI</avrtoolinterface>
+ <com_atmel_avrdbg_tool_nedbg>
+ <ToolOptions>
+ <InterfaceProperties>
+ <UpdiClock>750000</UpdiClock>
+ </InterfaceProperties>
+ <InterfaceName>UPDI</InterfaceName>
+ </ToolOptions>
+ <ToolType>com.atmel.avrdbg.tool.nedbg</ToolType>
+ <ToolNumber>MCHP3280031800000581</ToolNumber>
+ <ToolName>nEDBG</ToolName>
+ </com_atmel_avrdbg_tool_nedbg>
+ <avrtoolinterfaceclock>750000</avrtoolinterfaceclock>
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)' == 'Release' ">
+ <ToolchainSettings>
+ <AvrGcc>
+ <avrgcc.common.Device>-mmcu=avr128da48 -B "%24(PackRepoDir)\Atmel\AVR-Dx_DFP\1.2.56\gcc\dev\avr128da48"</avrgcc.common.Device>
+ <avrgcc.common.outputfiles.hex>True</avrgcc.common.outputfiles.hex>
+ <avrgcc.common.outputfiles.lss>True</avrgcc.common.outputfiles.lss>
+ <avrgcc.common.outputfiles.eep>True</avrgcc.common.outputfiles.eep>
+ <avrgcc.common.outputfiles.srec>True</avrgcc.common.outputfiles.srec>
+ <avrgcc.common.outputfiles.usersignatures>False</avrgcc.common.outputfiles.usersignatures>
+ <avrgcc.compiler.general.ChangeDefaultCharTypeUnsigned>True</avrgcc.compiler.general.ChangeDefaultCharTypeUnsigned>
+ <avrgcc.compiler.general.ChangeDefaultBitFieldUnsigned>True</avrgcc.compiler.general.ChangeDefaultBitFieldUnsigned>
+ <avrgcc.compiler.symbols.DefSymbols>
+ <ListValues>
+ <Value>NDEBUG</Value>
+ </ListValues>
+ </avrgcc.compiler.symbols.DefSymbols>
+ <avrgcc.compiler.directories.IncludePaths>
+ <ListValues>
+ <Value>%24(PackRepoDir)\Atmel\AVR-Dx_DFP\1.2.56\include</Value>
+ </ListValues>
+ </avrgcc.compiler.directories.IncludePaths>
+ <avrgcc.compiler.optimization.level>Optimize for size (-Os)</avrgcc.compiler.optimization.level>
+ <avrgcc.compiler.optimization.PackStructureMembers>True</avrgcc.compiler.optimization.PackStructureMembers>
+ <avrgcc.compiler.optimization.AllocateBytesNeededForEnum>True</avrgcc.compiler.optimization.AllocateBytesNeededForEnum>
+ <avrgcc.compiler.warnings.AllWarnings>True</avrgcc.compiler.warnings.AllWarnings>
+ <avrgcc.linker.libraries.Libraries>
+ <ListValues>
+ <Value>libm</Value>
+ </ListValues>
+ </avrgcc.linker.libraries.Libraries>
+ <avrgcc.assembler.general.IncludePaths>
+ <ListValues>
+ <Value>%24(PackRepoDir)\Atmel\AVR-Dx_DFP\1.2.56\include</Value>
+ </ListValues>
+ </avrgcc.assembler.general.IncludePaths>
+</AvrGcc>
+ </ToolchainSettings>
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)' == 'Debug' ">
+ <ToolchainSettings>
+ <AvrGcc>
+ <avrgcc.common.Device>-mmcu=avr128da48 -B "%24(PackRepoDir)\Atmel\AVR-Dx_DFP\1.2.56\gcc\dev\avr128da48"</avrgcc.common.Device>
+ <avrgcc.common.outputfiles.hex>True</avrgcc.common.outputfiles.hex>
+ <avrgcc.common.outputfiles.lss>True</avrgcc.common.outputfiles.lss>
+ <avrgcc.common.outputfiles.eep>True</avrgcc.common.outputfiles.eep>
+ <avrgcc.common.outputfiles.srec>True</avrgcc.common.outputfiles.srec>
+ <avrgcc.common.outputfiles.usersignatures>False</avrgcc.common.outputfiles.usersignatures>
+ <avrgcc.compiler.general.ChangeDefaultCharTypeUnsigned>True</avrgcc.compiler.general.ChangeDefaultCharTypeUnsigned>
+ <avrgcc.compiler.general.ChangeDefaultBitFieldUnsigned>True</avrgcc.compiler.general.ChangeDefaultBitFieldUnsigned>
+ <avrgcc.compiler.symbols.DefSymbols>
+ <ListValues>
+ <Value>DEBUG</Value>
+ </ListValues>
+ </avrgcc.compiler.symbols.DefSymbols>
+ <avrgcc.compiler.directories.IncludePaths>
+ <ListValues>
+ <Value>../../../../Source</Value>
+ <Value>../../../../Source/portable/MemMang</Value>
+ <Value>../../../../Source/portable/GCC/AVR_AVRDx</Value>
+ <Value>../../../../Source/include</Value>
+ <Value>../../../Common/include</Value>
+ <Value>../../../Common/Minimal</Value>
+ <Value>../../../Common/Full</Value>
+ <Value>../ParTest</Value>
+ <Value>../serial</Value>
+ <Value>..</Value>
+ <Value>%24(PackRepoDir)\Atmel\AVR-Dx_DFP\1.2.56\include</Value>
+ </ListValues>
+ </avrgcc.compiler.directories.IncludePaths>
+ <avrgcc.compiler.optimization.level>Optimize for size (-Os)</avrgcc.compiler.optimization.level>
+ <avrgcc.compiler.optimization.PackStructureMembers>True</avrgcc.compiler.optimization.PackStructureMembers>
+ <avrgcc.compiler.optimization.AllocateBytesNeededForEnum>True</avrgcc.compiler.optimization.AllocateBytesNeededForEnum>
+ <avrgcc.compiler.optimization.DebugLevel>Default (-g2)</avrgcc.compiler.optimization.DebugLevel>
+ <avrgcc.compiler.warnings.AllWarnings>True</avrgcc.compiler.warnings.AllWarnings>
+ <avrgcc.linker.libraries.Libraries>
+ <ListValues>
+ <Value>libm</Value>
+ </ListValues>
+ </avrgcc.linker.libraries.Libraries>
+ <avrgcc.assembler.general.IncludePaths>
+ <ListValues>
+ <Value>%24(PackRepoDir)\Atmel\AVR-Dx_DFP\1.2.56\include</Value>
+ </ListValues>
+ </avrgcc.assembler.general.IncludePaths>
+ <avrgcc.assembler.debugging.DebugLevel>Default (-Wa,-g)</avrgcc.assembler.debugging.DebugLevel>
+</AvrGcc>
+ </ToolchainSettings>
+ </PropertyGroup>
+ <ItemGroup>
+ <Compile Include="clk_config.h">
+ <SubType>compile</SubType>
+ </Compile>
+ <Compile Include="FreeRTOSConfig.h">
+ <SubType>compile</SubType>
+ </Compile>
+ <Compile Include="..\..\..\Source\croutine.c">
+ <SubType>compile</SubType>
+ <Link>freeRTOS\croutine.c</Link>
+ </Compile>
+ <Compile Include="..\..\..\Source\event_groups.c">
+ <SubType>compile</SubType>
+ <Link>freeRTOS\event_groups.c</Link>
+ </Compile>
+ <Compile Include="..\..\..\Source\list.c">
+ <SubType>compile</SubType>
+ <Link>freeRTOS\list.c</Link>
+ </Compile>
+ <Compile Include="..\..\..\Source\queue.c">
+ <SubType>compile</SubType>
+ <Link>freeRTOS\queue.c</Link>
+ </Compile>
+ <Compile Include="..\..\..\Source\stream_buffer.c">
+ <SubType>compile</SubType>
+ <Link>freeRTOS\stream_buffer.c</Link>
+ </Compile>
+ <Compile Include="..\..\..\Source\tasks.c">
+ <SubType>compile</SubType>
+ <Link>freeRTOS\tasks.c</Link>
+ </Compile>
+ <Compile Include="..\..\..\Source\timers.c">
+ <SubType>compile</SubType>
+ <Link>freeRTOS\timers.c</Link>
+ </Compile>
+ <Compile Include="..\..\..\Source\portable\MemMang\heap_1.c">
+ <SubType>compile</SubType>
+ <Link>freeRTOS\portable\MemMang\heap_1.c</Link>
+ </Compile>
+ <Compile Include="..\..\..\Source\portable\GCC\AVR_AVRDx\port.c">
+ <SubType>compile</SubType>
+ <Link>freeRTOS\portable\GCC\AVR_AVRDx\port.c</Link>
+ </Compile>
+ <Compile Include="..\..\..\Source\portable\GCC\AVR_AVRDx\portmacro.h">
+ <SubType>compile</SubType>
+ <Link>freeRTOS\portable\GCC\AVR_AVRDx\portmacro.h</Link>
+ </Compile>
+ <Compile Include="..\..\..\Source\portable\GCC\AVR_AVRDx\porthardware.h">
+ <SubType>compile</SubType>
+ <Link>freeRTOS\portable\GCC\AVR_AVRDx\porthardware.h</Link>
+ </Compile>
+ <Compile Include="..\..\..\Source\include\atomic.h">
+ <SubType>compile</SubType>
+ <Link>freeRTOS\include\atomic.h</Link>
+ </Compile>
+ <Compile Include="..\..\..\Source\include\croutine.h">
+ <SubType>compile</SubType>
+ <Link>freeRTOS\include\croutine.h</Link>
+ </Compile>
+ <Compile Include="..\..\..\Source\include\deprecated_definitions.h">
+ <SubType>compile</SubType>
+ <Link>freeRTOS\include\deprecated_definitions.h</Link>
+ </Compile>
+ <Compile Include="..\..\..\Source\include\event_groups.h">
+ <SubType>compile</SubType>
+ <Link>freeRTOS\include\event_groups.h</Link>
+ </Compile>
+ <Compile Include="..\..\..\Source\include\FreeRTOS.h">
+ <SubType>compile</SubType>
+ <Link>freeRTOS\include\FreeRTOS.h</Link>
+ </Compile>
+ <Compile Include="..\..\..\Source\include\list.h">
+ <SubType>compile</SubType>
+ <Link>freeRTOS\include\list.h</Link>
+ </Compile>
+ <Compile Include="..\..\..\Source\include\message_buffer.h">
+ <SubType>compile</SubType>
+ <Link>freeRTOS\include\message_buffer.h</Link>
+ </Compile>
+ <Compile Include="..\..\..\Source\include\mpu_prototypes.h">
+ <SubType>compile</SubType>
+ <Link>freeRTOS\include\mpu_prototypes.h</Link>
+ </Compile>
+ <Compile Include="..\..\..\Source\include\mpu_wrappers.h">
+ <SubType>compile</SubType>
+ <Link>freeRTOS\include\mpu_wrappers.h</Link>
+ </Compile>
+ <Compile Include="..\..\..\Source\include\portable.h">
+ <SubType>compile</SubType>
+ <Link>freeRTOS\include\portable.h</Link>
+ </Compile>
+ <Compile Include="..\..\..\Source\include\projdefs.h">
+ <SubType>compile</SubType>
+ <Link>freeRTOS\include\projdefs.h</Link>
+ </Compile>
+ <Compile Include="..\..\..\Source\include\queue.h">
+ <SubType>compile</SubType>
+ <Link>freeRTOS\include\queue.h</Link>
+ </Compile>
+ <Compile Include="..\..\..\Source\include\semphr.h">
+ <SubType>compile</SubType>
+ <Link>freeRTOS\include\semphr.h</Link>
+ </Compile>
+ <Compile Include="..\..\..\Source\include\stack_macros.h">
+ <SubType>compile</SubType>
+ <Link>freeRTOS\include\stack_macros.h</Link>
+ </Compile>
+ <Compile Include="..\..\..\Source\include\StackMacros.h">
+ <SubType>compile</SubType>
+ <Link>freeRTOS\include\StackMacros.h</Link>
+ </Compile>
+ <Compile Include="..\..\..\Source\include\stream_buffer.h">
+ <SubType>compile</SubType>
+ <Link>freeRTOS\include\stream_buffer.h</Link>
+ </Compile>
+ <Compile Include="..\..\..\Source\include\task.h">
+ <SubType>compile</SubType>
+ <Link>freeRTOS\include\task.h</Link>
+ </Compile>
+ <Compile Include="..\..\..\Source\include\timers.h">
+ <SubType>compile</SubType>
+ <Link>freeRTOS\include\timers.h</Link>
+ </Compile>
+ <Compile Include="main.c">
+ <SubType>compile</SubType>
+ </Compile>
+ <Compile Include="main_blinky.c">
+ <SubType>compile</SubType>
+ </Compile>
+ <Compile Include="main_full.c">
+ <SubType>compile</SubType>
+ </Compile>
+ <Compile Include="main_minimal.c">
+ <SubType>compile</SubType>
+ </Compile>
+ <Compile Include="ParTest\partest.c">
+ <SubType>compile</SubType>
+ </Compile>
+ <Compile Include="regtest.c">
+ <SubType>compile</SubType>
+ </Compile>
+ <Compile Include="regtest.h">
+ <SubType>compile</SubType>
+ </Compile>
+ <Compile Include="serial\serial.c">
+ <SubType>compile</SubType>
+ </Compile>
+ <Compile Include="..\..\..\Demo\Common\include\comtest.h">
+ <SubType>compile</SubType>
+ <Link>Common\include\comtest.h</Link>
+ </Compile>
+ <Compile Include="..\..\..\Demo\Common\Minimal\comtest.c">
+ <SubType>compile</SubType>
+ <Link>Common\Minimal\comtest.c</Link>
+ </Compile>
+ <Compile Include="..\..\..\Demo\Common\include\integer.h">
+ <SubType>compile</SubType>
+ <Link>Common\include\integer.h</Link>
+ </Compile>
+ <Compile Include="..\..\..\Demo\Common\Minimal\integer.c">
+ <SubType>compile</SubType>
+ <Link>Common\Minimal\integer.c</Link>
+ </Compile>
+ <Compile Include="..\..\..\Demo\Common\include\PollQ.h">
+ <SubType>compile</SubType>
+ <Link>Common\include\PollQ.h</Link>
+ </Compile>
+ <Compile Include="..\..\..\Demo\Common\Minimal\PollQ.c">
+ <SubType>compile</SubType>
+ <Link>Common\Minimal\PollQ.c</Link>
+ </Compile>
+ <Compile Include="..\..\..\Demo\Common\include\crflash.h">
+ <SubType>compile</SubType>
+ <Link>Common\include\crflash.h</Link>
+ </Compile>
+ <Compile Include="..\..\..\Demo\Common\Minimal\crflash.c">
+ <SubType>compile</SubType>
+ <Link>Common\Minimal\crflash.c</Link>
+ </Compile>
+ <Compile Include="..\..\..\Demo\Common\include\serial.h">
+ <SubType>compile</SubType>
+ <Link>Common\include\serial.h</Link>
+ </Compile>
+ <Compile Include="..\..\..\Demo\Common\include\partest.h">
+ <SubType>compile</SubType>
+ <Link>Common\include\comtest.h</Link>
+ </Compile>
+ <Compile Include="..\..\..\Demo\Common\include\recmutex.h">
+ <SubType>compile</SubType>
+ <Link>Common\include\recmutex.h</Link>
+ </Compile>
+ <Compile Include="..\..\..\Demo\Common\Minimal\recmutex.c">
+ <SubType>compile</SubType>
+ <Link>Common\Minimal\recmutex.c</Link>
+ </Compile>
+ <Compile Include="..\..\..\Demo\Common\include\TaskNotify.h">
+ <SubType>compile</SubType>
+ <Link>Common\include\TaskNotify.h</Link>
+ </Compile>
+ <Compile Include="..\..\..\Demo\Common\Minimal\TaskNotify.c">
+ <SubType>compile</SubType>
+ <Link>Common\Minimal\TaskNotify.c</Link>
+ </Compile>
+ <Compile Include="..\..\..\Demo\Common\include\semtest.h">
+ <SubType>compile</SubType>
+ <Link>Common\include\semtest.h</Link>
+ </Compile>
+ <Compile Include="..\..\..\Demo\Common\Full\semtest.c">
+ <SubType>compile</SubType>
+ <Link>Common\Full\semtest.c</Link>
+ </Compile>
+ <Compile Include="..\..\..\Demo\Common\include\print.h">
+ <SubType>compile</SubType>
+ <Link>Common\include\print.h</Link>
+ </Compile>
+ <Compile Include="..\..\..\Demo\Common\Full\print.c">
+ <SubType>compile</SubType>
+ <Link>Common\Full\print.c</Link>
+ </Compile>
+ </ItemGroup>
+ <ItemGroup>
+ <Folder Include="freeRTOS\" />
+ <Folder Include="freeRTOS\include" />
+ <Folder Include="freeRTOS\portable" />
+ <Folder Include="freeRTOS\portable\GCC" />
+ <Folder Include="freeRTOS\portable\GCC\AVR_AVRDx" />
+ <Folder Include="freeRTOS\portable\MemMang" />
+ <Folder Include="serial" />
+ <Folder Include="ParTest" />
+ <Folder Include="Common\" />
+ <Folder Include="Common\include" />
+ <Folder Include="Common\Minimal" />
+ <Folder Include="Common\Full" />
+ </ItemGroup>
+ <Import Project="$(AVRSTUDIO_EXE_PATH)\\Vs\\Compiler.targets" />
+</Project> \ No newline at end of file
diff --git a/FreeRTOS/Demo/AVR_Dx_Atmel_Studio/RTOSDemo/clk_config.h b/FreeRTOS/Demo/AVR_Dx_Atmel_Studio/RTOSDemo/clk_config.h
new file mode 100644
index 000000000..a66236c4e
--- /dev/null
+++ b/FreeRTOS/Demo/AVR_Dx_Atmel_Studio/RTOSDemo/clk_config.h
@@ -0,0 +1,72 @@
+#ifndef CLK_CONFIG_H_
+#define CLK_CONFIG_H_
+
+#include "FreeRTOSConfig.h"
+
+#if (configCPU_CLOCK_HZ == 24000000)
+
+ #define CLK_init() _PROTECTED_WRITE(CLKCTRL.OSCHFCTRLA, CLKCTRL_FREQSEL_24M_gc);
+
+#elif (configCPU_CLOCK_HZ == 20000000)
+
+ #define CLK_init() _PROTECTED_WRITE(CLKCTRL.OSCHFCTRLA, CLKCTRL_FREQSEL_20M_gc);
+
+#elif (configCPU_CLOCK_HZ == 16000000)
+
+ #define CLK_init() _PROTECTED_WRITE(CLKCTRL.OSCHFCTRLA, CLKCTRL_FREQSEL_16M_gc);
+
+#elif (configCPU_CLOCK_HZ == 12000000)
+
+ #define CLK_init() _PROTECTED_WRITE(CLKCTRL.OSCHFCTRLA, CLKCTRL_FREQSEL_12M_gc);
+
+#elif (configCPU_CLOCK_HZ == 10000000)
+
+ #define CLK_init() { \
+ _PROTECTED_WRITE(CLKCTRL.OSCHFCTRLA, CLKCTRL_FREQSEL_20M_gc);\
+ _PROTECTED_WRITE(CLKCTRL.MCLKCTRLB, CLKCTRL_PDIV_2X_gc | CLKCTRL_PEN_bm); \
+ }
+
+#elif (configCPU_CLOCK_HZ == 8000000)
+
+ #define CLK_init() _PROTECTED_WRITE(CLKCTRL.OSCHFCTRLA, CLKCTRL_FREQSEL_8M_gc);
+
+#elif (configCPU_CLOCK_HZ == 6000000)
+
+ #define CLK_init() { \
+ _PROTECTED_WRITE(CLKCTRL.OSCHFCTRLA, CLKCTRL_FREQSEL_12M_gc);\
+ _PROTECTED_WRITE(CLKCTRL.MCLKCTRLB, CLKCTRL_PDIV_2X_gc | CLKCTRL_PEN_bm); \
+ }
+
+#elif (configCPU_CLOCK_HZ == 5000000)
+
+ #define CLK_init() { \
+ _PROTECTED_WRITE(CLKCTRL.OSCHFCTRLA, CLKCTRL_FREQSEL_20M_gc);\
+ _PROTECTED_WRITE(CLKCTRL.MCLKCTRLB, CLKCTRL_PDIV_4X_gc | CLKCTRL_PEN_bm); \
+ }
+
+#elif (configCPU_CLOCK_HZ == 4000000)
+
+ #define CLK_init() _PROTECTED_WRITE(CLKCTRL.OSCHFCTRLA, CLKCTRL_FREQSEL_4M_gc);
+
+#elif (configCPU_CLOCK_HZ == 3000000)
+
+ #define CLK_init() { \
+ _PROTECTED_WRITE(CLKCTRL.OSCHFCTRLA, CLKCTRL_FREQSEL_12M_gc);\
+ _PROTECTED_WRITE(CLKCTRL.MCLKCTRLB, CLKCTRL_PDIV_4X_gc | CLKCTRL_PEN_bm); \
+ }
+
+#elif (configCPU_CLOCK_HZ == 2000000)
+
+ #define CLK_init() _PROTECTED_WRITE(CLKCTRL.OSCHFCTRLA, CLKCTRL_FREQSEL_2M_gc);
+
+#elif (configCPU_CLOCK_HZ == 1000000)
+
+ #define CLK_init() _PROTECTED_WRITE(CLKCTRL.OSCHFCTRLA, CLKCTRL_FREQSEL_1M_gc);
+
+#else
+
+ #error The selected clock frequency is not supported. Choose a value from the NOTE in FreeRTOSConfig.h.
+
+#endif
+
+#endif /* CLK_CONFIG_H_ */ \ No newline at end of file
diff --git a/FreeRTOS/Demo/AVR_Dx_Atmel_Studio/RTOSDemo/main.c b/FreeRTOS/Demo/AVR_Dx_Atmel_Studio/RTOSDemo/main.c
new file mode 100644
index 000000000..aa2dd84d9
--- /dev/null
+++ b/FreeRTOS/Demo/AVR_Dx_Atmel_Studio/RTOSDemo/main.c
@@ -0,0 +1,94 @@
+/*
+(C) 2020 Microchip Technology Inc. and its subsidiaries.
+
+Subject to your compliance with these terms, you may use Microchip software and
+any derivatives exclusively with Microchip products. It is your responsibility
+to comply with third party license terms applicable to your use of third party
+software (including open source software) that may accompany Microchip software.
+
+THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, WHETHER EXPRESS,
+IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY IMPLIED WARRANTIES
+OF NON-INFRINGEMENT, MERCHANTABILITY, AND FITNESS FOR A PARTICULAR PURPOSE.
+IN NO EVENT WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE,
+INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER
+RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF
+THE POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT ALLOWED
+BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN ANY WAY RELATED TO THIS
+SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, THAT YOU HAVE PAID DIRECTLY
+TO MICROCHIP FOR THIS SOFTWARE.
+*/
+
+#include <avr/io.h>
+#include "FreeRTOS.h"
+#include "clk_config.h"
+
+#define mainSELECTED_APPLICATION 0
+
+/* Configure the hardware as necessary to run this demo. */
+static void prvSetupHardware( void );
+
+#if ( mainSELECTED_APPLICATION == 0 )
+extern void main_blinky( void );
+extern void init_blinky( void );
+#elif ( mainSELECTED_APPLICATION == 1 )
+extern void main_minimal( void );
+extern void init_minimal( void );
+#elif ( mainSELECTED_APPLICATION == 2 )
+extern void main_full( void );
+extern void init_full( void );
+#else
+#error Invalid mainSELECTED_APPLICATION setting. See the comments at the top of this file and above the mainSELECTED_APPLICATION definition.
+#endif
+
+int main( void )
+{
+ prvSetupHardware();
+
+#if ( mainSELECTED_APPLICATION == 0 )
+ main_blinky();
+#elif ( mainSELECTED_APPLICATION == 1 )
+ main_minimal();
+#elif ( mainSELECTED_APPLICATION == 2 )
+ main_full();
+#endif
+
+ return 0;
+}
+
+static void prvSetupHardware( void )
+{
+ /* Ensure no interrupts execute while the scheduler is in an inconsistent
+ state. Interrupts are automatically enabled when the scheduler is
+ started. */
+ portDISABLE_INTERRUPTS();
+
+ CLK_init();
+
+#if ( mainSELECTED_APPLICATION == 0 )
+ init_blinky();
+#elif ( mainSELECTED_APPLICATION == 1 )
+ init_minimal();
+#elif ( mainSELECTED_APPLICATION == 2 )
+ init_full();
+#endif
+}
+
+/* vApplicationStackOverflowHook is called when a stack overflow occurs.
+This is usefull in application development, for debugging. To use this
+hook, uncomment it, and set configCHECK_FOR_STACK_OVERFLOW to 1 in
+"FreeRTOSConfig.h" header file. */
+
+// void vApplicationStackOverflowHook(TaskHandle_t *pxTask, signed char *pcTaskName )
+// {
+// for( ;; );
+// }
+
+/* vApplicationMallocFailedHook is called when memorry allocation fails.
+This is usefull in application development, for debugging. To use this
+hook, uncomment it, and set configUSE_MALLOC_FAILED_HOOK to 1 in
+"FreeRTOSConfig.h" header file. */
+
+// void vApplicationMallocFailedHook( void )
+// {
+// for( ;; );
+// }
diff --git a/FreeRTOS/Demo/AVR_Dx_Atmel_Studio/RTOSDemo/main_blinky.c b/FreeRTOS/Demo/AVR_Dx_Atmel_Studio/RTOSDemo/main_blinky.c
new file mode 100644
index 000000000..117a35499
--- /dev/null
+++ b/FreeRTOS/Demo/AVR_Dx_Atmel_Studio/RTOSDemo/main_blinky.c
@@ -0,0 +1,177 @@
+/*
+ * FreeRTOS Kernel V10.3.1
+ * Copyright (C) 2020 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!
+ */
+
+/******************************************************************************
+ *
+ * main_blinky() creates one queue, and two tasks. It then starts the
+ * scheduler.
+ *
+ * The Queue Send Task:
+ * The queue send task is implemented by the prvQueueSendTask() function in
+ * this file. prvQueueSendTask() sits in a loop that causes it to repeatedly
+ * block for 200 milliseconds, before sending the value 100 to the queue that
+ * was created within main_blinky(). Once the value is sent, the task loops
+ * back around to block for another 200 milliseconds...and so on.
+ *
+ * The Queue Receive Task:
+ * The queue receive task is implemented by the prvQueueReceiveTask() function
+ * in this file. prvQueueReceiveTask() sits in a loop where it repeatedly
+ * blocks on attempts to read data from the queue that was created within
+ * main_blinky(). When data is received, the task checks the value of the
+ * data, and if the value equals the expected 100, toggles an LED. The 'block
+ * time' parameter passed to the queue receive function specifies that the
+ * task should be held in the Blocked state indefinitely to wait for data to
+ * be available on the queue. The queue receive task will only leave the
+ * Blocked state when the queue send task writes to the queue. As the queue
+ * send task writes to the queue every 200 milliseconds, the queue receive
+ * task leaves the Blocked state every 200 milliseconds, and therefore toggles
+ * the LED every 200 milliseconds.
+ */
+
+#include <avr/io.h>
+
+/* Scheduler include files. */
+#include "FreeRTOS.h"
+#include "task.h"
+#include "semphr.h"
+
+/* Priorities at which the tasks are created. */
+#define mainQUEUE_RECEIVE_TASK_PRIORITY ( tskIDLE_PRIORITY + 2 )
+#define mainQUEUE_SEND_TASK_PRIORITY ( tskIDLE_PRIORITY + 1 )
+
+/* The rate at which data is sent to the queue. The 200ms value is converted
+to ticks using the portTICK_PERIOD_MS constant. */
+#define mainQUEUE_SEND_FREQUENCY_MS ( 200 / portTICK_PERIOD_MS )
+
+/* The number of items the queue can hold. This is 1 as the receive task
+will remove items as they are added, meaning the send task should always find
+the queue empty. */
+#define mainQUEUE_LENGTH ( 1 )
+
+/*-----------------------------------------------------------*/
+
+/*
+ * The tasks as described in the comments at the top of this file.
+ */
+static void prvQueueReceiveTask( void *pvParameters );
+static void prvQueueSendTask( void *pvParameters );
+
+/*-----------------------------------------------------------*/
+
+/* The queue used by both tasks. */
+static QueueHandle_t xQueue = NULL;
+
+void main_blinky( void )
+{
+ /* Create the queue. */
+ xQueue = xQueueCreate( mainQUEUE_LENGTH, sizeof( uint32_t ) );
+
+ if( xQueue != NULL )
+ {
+ /* Start the two tasks as described in the comments at the top of this
+ file. */
+ xTaskCreate( prvQueueReceiveTask, /* The function that implements the task. */
+ "Rx", /* The text name assigned to the task - for debug only as it is not used by the kernel. */
+ configMINIMAL_STACK_SIZE, /* The size of the stack to allocate to the task. */
+ NULL, /* The parameter passed to the task - not used in this case. */
+ mainQUEUE_RECEIVE_TASK_PRIORITY, /* The priority assigned to the task. */
+ NULL ); /* The task handle is not required, so NULL is passed. */
+
+ xTaskCreate( prvQueueSendTask, "TX", configMINIMAL_STACK_SIZE, NULL, mainQUEUE_SEND_TASK_PRIORITY, NULL );
+
+ /* Start the tasks and timer running. */
+ vTaskStartScheduler();
+ }
+
+ /* If all is well, the scheduler will now be running, and the following
+ line will never be reached. If the following line does execute, then
+ there was either insufficient FreeRTOS heap memory available for the idle
+ and/or timer tasks to be created, or vTaskStartScheduler() was called from
+ User mode. See the memory management section on the FreeRTOS web site for
+ more details on the FreeRTOS heap http://www.freertos.org/a00111.html. The
+ mode from which main() is called is set in the C start up code and must be
+ a privileged mode (not user mode). */
+ for( ;; );
+}
+
+void init_blinky( void )
+{
+ /* Set PC6 as output. */
+ PORTC.DIRSET = PIN6_bm;
+}
+
+static void prvQueueSendTask( void *pvParameters )
+{
+TickType_t xNextWakeTime;
+const unsigned long ulValueToSend = 100UL;
+
+ /* Remove compiler warning about unused parameter. */
+ ( void ) pvParameters;
+
+ /* Initialise xNextWakeTime - this only needs to be done once. */
+ xNextWakeTime = xTaskGetTickCount();
+
+ for( ;; )
+ {
+ /* Place this task in the blocked state until it is time to run again. */
+ vTaskDelayUntil( &xNextWakeTime, mainQUEUE_SEND_FREQUENCY_MS );
+
+ /* Send to the queue - causing the queue receive task to unblock and
+ toggle the LED. 0 is used as the block time so the sending operation
+ will not block - it shouldn't need to block as the queue should always
+ be empty at this point in the code. */
+ xQueueSend( xQueue, &ulValueToSend, 0U );
+ }
+}
+/*-----------------------------------------------------------*/
+
+static void prvQueueReceiveTask( void *pvParameters )
+{
+unsigned long ulReceivedValue;
+const unsigned long ulExpectedValue = 100UL;
+
+ /* Remove compiler warning about unused parameter. */
+ ( void ) pvParameters;
+
+ for( ;; )
+ {
+ /* Wait until something arrives in the queue - this task will block
+ indefinitely provided INCLUDE_vTaskSuspend is set to 1 in
+ FreeRTOSConfig.h. */
+ xQueueReceive( xQueue, &ulReceivedValue, portMAX_DELAY );
+
+ /* To get here something must have been received from the queue, but
+ is it the expected value? If it is, toggle the LED. */
+ if( ulReceivedValue == ulExpectedValue )
+ {
+ /* Toggle LED on pin PC6. */
+ PORTC.OUTTGL |= PIN6_bm;
+ ulReceivedValue = 0U;
+ }
+ }
+}
+
diff --git a/FreeRTOS/Demo/AVR_Dx_Atmel_Studio/RTOSDemo/main_full.c b/FreeRTOS/Demo/AVR_Dx_Atmel_Studio/RTOSDemo/main_full.c
new file mode 100644
index 000000000..8f18a0c33
--- /dev/null
+++ b/FreeRTOS/Demo/AVR_Dx_Atmel_Studio/RTOSDemo/main_full.c
@@ -0,0 +1,107 @@
+#include "FreeRTOS.h"
+#include "task.h"
+#include "partest.h"
+#include "semtest.h"
+#include "TaskNotify.h"
+#include "regtest.h"
+#include "recmutex.h"
+
+#define mainSEM_TEST_PRIORITY ( tskIDLE_PRIORITY + 1UL )
+#define mainCHECK_TASK_PRIORITY ( configMAX_PRIORITIES - 1 )
+
+/* The period between executions of the check task. */
+#define mainCHECK_PERIOD ( ( TickType_t ) 3000 / portTICK_PERIOD_MS )
+
+/* LED that is toggled by the check task. The check task periodically checks
+that all the other tasks are operating without error. If no errors are found
+the LED is toggled. If an error is found at any time the LED is never toggles
+again. */
+#define mainCHECK_TASK_LED ( 6 )
+
+/* The check task, as described at the top of this file. */
+static void prvCheckTask( void *pvParameters );
+
+void main_full( void )
+{
+ vStartSemaphoreTasks(mainSEM_TEST_PRIORITY);
+ vStartTaskNotifyTask();
+ vStartRegTestTasks();
+ vStartRecursiveMutexTasks();
+
+ /* Create the task that performs the 'check' functionality, as described at
+ the top of this file. */
+ xTaskCreate( prvCheckTask, "Check", configMINIMAL_STACK_SIZE, NULL, mainCHECK_TASK_PRIORITY, NULL );
+
+ vTaskStartScheduler();
+
+ /* If all is well, the scheduler will now be running, and the following
+ line will never be reached. If the following line does execute, then
+ there was either insufficient FreeRTOS heap memory available for the idle
+ and/or timer tasks to be created, or vTaskStartScheduler() was called from
+ User mode. See the memory management section on the FreeRTOS web site for
+ more details on the FreeRTOS heap http://www.freertos.org/a00111.html. The
+ mode from which main() is called is set in the C start up code and must be
+ a privileged mode (not user mode). */
+ for( ;; );
+}
+
+void init_full( void )
+{
+ vParTestInitialise();
+}
+
+static void prvCheckTask( void *pvParameters )
+{
+TickType_t xLastExecutionTime;
+unsigned long ulErrorFound = pdFALSE;
+
+ /* Just to stop compiler warnings. */
+ ( void ) pvParameters;
+
+ /* Initialise xLastExecutionTime so the first call to vTaskDelayUntil()
+ works correctly. */
+ xLastExecutionTime = xTaskGetTickCount();
+
+ /* Cycle for ever, delaying then checking all the other tasks are still
+ operating without error. The onboard LED is toggled on each iteration
+ unless an error occurred. */
+ for( ;; )
+ {
+ /* Delay until it is time to execute again. */
+ vTaskDelayUntil( &xLastExecutionTime, mainCHECK_PERIOD );
+
+ /* Check all the demo tasks (other than the flash tasks) to ensure
+ that they are all still running, and that none have detected an error. */
+ if( xAreSemaphoreTasksStillRunning() != pdTRUE )
+ {
+ ulErrorFound |= 1UL << 0UL;
+ }
+
+ if( xAreTaskNotificationTasksStillRunning() != pdTRUE )
+ {
+ ulErrorFound |= 1UL << 1UL;
+ }
+
+ if( xAreRegTestTasksStillRunning() != pdTRUE )
+ {
+ ulErrorFound |= 1UL << 2UL;
+ }
+
+ if ( xAreRecursiveMutexTasksStillRunning() != pdTRUE )
+ {
+ ulErrorFound |= 1UL << 3UL;
+ }
+
+ if( ulErrorFound == pdFALSE )
+ {
+ /* Toggle the LED if everything is okay so we know if an error occurs even if not
+ using console IO. */
+ vParTestToggleLED( mainCHECK_TASK_LED );
+ }
+ }
+}
+
+void vApplicationTickHook( void )
+{
+ xNotifyTaskFromISR();
+}
diff --git a/FreeRTOS/Demo/AVR_Dx_Atmel_Studio/RTOSDemo/main_minimal.c b/FreeRTOS/Demo/AVR_Dx_Atmel_Studio/RTOSDemo/main_minimal.c
new file mode 100644
index 000000000..8e1e8adeb
--- /dev/null
+++ b/FreeRTOS/Demo/AVR_Dx_Atmel_Studio/RTOSDemo/main_minimal.c
@@ -0,0 +1,160 @@
+#include <avr/eeprom.h>
+
+#include "FreeRTOS.h"
+#include "task.h"
+#include "croutine.h"
+#include "PollQ.h"
+#include "integer.h"
+#include "serial.h"
+#include "comtest.h"
+#include "crflash.h"
+#include "partest.h"
+#include "regtest.h"
+
+/* Priority definitions for most of the tasks in the demo application. Some
+tasks just use the idle priority. */
+#define mainCOM_TEST_PRIORITY ( tskIDLE_PRIORITY + 2 )
+#define mainQUEUE_POLL_PRIORITY ( tskIDLE_PRIORITY + 2 )
+#define mainCHECK_TASK_PRIORITY ( tskIDLE_PRIORITY + 3 )
+
+/* Baud rate used by the serial port tasks. */
+#define mainCOM_TEST_BAUD_RATE ( ( unsigned long ) 9600 )
+
+/* LED used by the serial port tasks. This is toggled on each character Tx,
+and mainCOM_TEST_LED + 1 is toggles on each character Rx. */
+#define mainCOM_TEST_LED ( 7 )
+
+/* LED that is toggled by the check task. The check task periodically checks
+that all the other tasks are operating without error. If no errors are found
+the LED is toggled. If an error is found at any time the LED is never toggles
+again. */
+#define mainCHECK_TASK_LED ( 6 )
+
+/* The period between executions of the check task. */
+#define mainCHECK_PERIOD ( ( TickType_t ) 1000 / portTICK_PERIOD_MS )
+
+/* An address in the EEPROM used to count resets. This is used to check that
+the demo application is not unexpectedly resetting. */
+#define mainRESET_COUNT_ADDRESS ( 0x1400 )
+
+/* The number of coroutines to create. */
+#define mainNUM_FLASH_COROUTINES ( 3 )
+
+/*
+ * The task function for the "Check" task.
+ */
+static void vErrorChecks( void *pvParameters );
+
+/*
+ * Checks the unique counts of other tasks to ensure they are still operational.
+ * Flashes an LED if everything is okay.
+ */
+static void prvCheckOtherTasksAreStillRunning( void );
+
+/*
+ * Called on boot to increment a count stored in the EEPROM. This is used to
+ * ensure the CPU does not reset unexpectedly.
+ */
+static void prvIncrementResetCount( void );
+
+void main_minimal( void )
+{
+ prvIncrementResetCount();
+
+ /* Create the standard demo tasks. */
+ vStartIntegerMathTasks( tskIDLE_PRIORITY );
+ vAltStartComTestTasks( mainCOM_TEST_PRIORITY, mainCOM_TEST_BAUD_RATE, mainCOM_TEST_LED );
+ vStartPolledQueueTasks( mainQUEUE_POLL_PRIORITY );
+ vStartRegTestTasks();
+
+ /* Create the tasks defined within this file. */
+ xTaskCreate( vErrorChecks, "Check", configMINIMAL_STACK_SIZE, NULL, mainCHECK_TASK_PRIORITY, NULL );
+
+ /* Create the co-routines that flash the LED's. */
+ vStartFlashCoRoutines( mainNUM_FLASH_COROUTINES );
+
+ /* In this port, to use preemptive scheduler define configUSE_PREEMPTION
+ as 1 in portmacro.h. To use the cooperative scheduler define
+ configUSE_PREEMPTION as 0. */
+ vTaskStartScheduler();
+}
+
+void init_minimal( void )
+{
+ /* Configure UART pins: PC1 Rx, PC0 Tx */
+ PORTC.DIR &= ~PIN0_bm;
+ PORTC.DIR |= PIN1_bm;
+
+ vParTestInitialise();
+}
+
+static void vErrorChecks( void *pvParameters )
+{
+static volatile unsigned long ulDummyVariable = 3UL;
+
+ /* The parameters are not used. */
+ ( void ) pvParameters;
+
+ /* Cycle for ever, delaying then checking all the other tasks are still
+ operating without error. */
+ for( ;; )
+ {
+ vTaskDelay( mainCHECK_PERIOD );
+
+ /* Perform a bit of 32bit maths to ensure the registers used by the
+ integer tasks get some exercise. The result here is not important -
+ see the demo application documentation for more info. */
+ ulDummyVariable *= 3;
+
+ prvCheckOtherTasksAreStillRunning();
+ }
+}
+/*-----------------------------------------------------------*/
+
+static void prvCheckOtherTasksAreStillRunning( void )
+{
+static portBASE_TYPE xErrorHasOccurred = pdFALSE;
+
+ if( xAreIntegerMathsTaskStillRunning() != pdTRUE )
+ {
+ xErrorHasOccurred = pdTRUE;
+ }
+
+ if( xAreComTestTasksStillRunning() != pdTRUE )
+ {
+ xErrorHasOccurred = pdTRUE;
+ }
+
+ if( xArePollingQueuesStillRunning() != pdTRUE )
+ {
+ xErrorHasOccurred = pdTRUE;
+ }
+
+ if( xAreRegTestTasksStillRunning() != pdTRUE )
+ {
+ xErrorHasOccurred = pdTRUE;
+ }
+
+ if( xErrorHasOccurred == pdFALSE )
+ {
+ /* Toggle the LED if everything is okay so we know if an error occurs even if not
+ using console IO. */
+ vParTestToggleLED( mainCHECK_TASK_LED );
+ }
+}
+/*-----------------------------------------------------------*/
+
+static void prvIncrementResetCount( void )
+{
+unsigned char ucResetCount;
+
+ eeprom_read_block( &ucResetCount, ( void * ) mainRESET_COUNT_ADDRESS, sizeof( ucResetCount ) );
+ ucResetCount++;
+ eeprom_write_byte( ( void * ) mainRESET_COUNT_ADDRESS, ucResetCount );
+}
+/*-----------------------------------------------------------*/
+
+void vApplicationIdleHook( void )
+{
+ vCoRoutineSchedule();
+}
diff --git a/FreeRTOS/Demo/AVR_Dx_Atmel_Studio/RTOSDemo/regtest.c b/FreeRTOS/Demo/AVR_Dx_Atmel_Studio/RTOSDemo/regtest.c
new file mode 100644
index 000000000..300b85b28
--- /dev/null
+++ b/FreeRTOS/Demo/AVR_Dx_Atmel_Studio/RTOSDemo/regtest.c
@@ -0,0 +1,382 @@
+/*
+ * FreeRTOS Kernel V10.3.0
+ * Copyright (C) 2020 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 include files. */
+#include "FreeRTOS.h"
+#include "task.h"
+
+/* Demo file headers. */
+#include "regtest.h"
+
+/* Test tasks that sets registers to known values, then checks to ensure the
+values remain as expected. Test 1 and test 2 use different values. */
+static void prvRegisterCheck1( void *pvParameters );
+static void prvRegisterCheck2( void *pvParameters );
+
+/* Set to a non zero value should an error be found. */
+portBASE_TYPE xRegTestError = pdFALSE;
+
+/*-----------------------------------------------------------*/
+
+void vStartRegTestTasks( void )
+{
+ xTaskCreate( prvRegisterCheck1, "Reg1", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY, NULL );
+ xTaskCreate( prvRegisterCheck2, "Reg2", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY, NULL );
+}
+/*-----------------------------------------------------------*/
+
+portBASE_TYPE xAreRegTestTasksStillRunning( void )
+{
+portBASE_TYPE xReturn;
+
+ /* If a register was found to contain an unexpected value then the
+ xRegTestError variable would have been set to a non zero value. */
+ if( xRegTestError == pdFALSE )
+ {
+ xReturn = pdTRUE;
+ }
+ else
+ {
+ xReturn = pdFALSE;
+ }
+
+ return xReturn;
+}
+/*-----------------------------------------------------------*/
+
+static void prvRegisterCheck1( void *pvParameters )
+{
+ ( void ) pvParameters;
+
+ for( ;; )
+ {
+ asm( "LDI r31, 5" );
+ asm( "MOV r0, r31" );
+ asm( "LDI r31, 6" );
+ asm( "MOV r1, r31" );
+ asm( "LDI r31, 7" );
+ asm( "MOV r2, r31" );
+ asm( "LDI r31, 8" );
+ asm( "MOV r3, r31" );
+ asm( "LDI r31, 9" );
+ asm( "MOV r4, r31" );
+ asm( "LDI r31, 10" );
+ asm( "MOV r5, r31" );
+ asm( "LDI r31, 11" );
+ asm( "MOV r6, r31" );
+ asm( "LDI r31, 12" );
+ asm( "MOV r7, r31" );
+ asm( "LDI r31, 13" );
+ asm( "MOV r8, r31" );
+ asm( "LDI r31, 14" );
+ asm( "MOV r9, r31" );
+ asm( "LDI r31, 15" );
+ asm( "MOV r10, r31" );
+ asm( "LDI r31, 16" );
+ asm( "MOV r11, r31" );
+ asm( "LDI r31, 17" );
+ asm( "MOV r12, r31" );
+ asm( "LDI r31, 18" );
+ asm( "MOV r13, r31" );
+ asm( "LDI r31, 19" );
+ asm( "MOV r14, r31" );
+ asm( "LDI r31, 20" );
+ asm( "MOV r15, r31" );
+ asm( "LDI r16, 21" );
+ asm( "LDI r17, 22" );
+ asm( "LDI r18, 23" );
+ asm( "LDI r19, 24" );
+ asm( "LDI r20, 25" );
+ asm( "LDI r21, 26" );
+ asm( "LDI r22, 27" );
+ asm( "LDI r23, 28" );
+ asm( "LDI r24, 29" );
+ asm( "LDI r25, 30" );
+ asm( "LDI r26, 31" );
+ asm( "LDI r27, 32" );
+ asm( "LDI r28, 33" );
+ asm( "LDI r29, 34" );
+ asm( "LDI r30, 35" );
+
+ taskYIELD();
+
+ asm( "CPI r31, 20" );
+ asm( "BREQ no_err_1" );
+ asm( "STS xRegTestError, r0" );
+ asm( "no_err_1:" );
+ asm( "LDI r31, 5" );
+ asm( "CPSE r31, r0" );
+ asm( "STS xRegTestError, r0" );
+ asm( "LDI r31, 6" );
+ asm( "CPSE r31, r1" );
+ asm( "STS xRegTestError, r0" );
+ asm( "LDI r31, 7" );
+ asm( "CPSE r31, r2" );
+ asm( "STS xRegTestError, r0" );
+ asm( "LDI r31, 8" );
+ asm( "CPSE r31, r3" );
+ asm( "STS xRegTestError, r0" );
+ asm( "LDI r31, 9" );
+ asm( "CPSE r31, r4" );
+ asm( "STS xRegTestError, r0" );
+ asm( "LDI r31, 10" );
+ asm( "CPSE r31, r5" );
+ asm( "STS xRegTestError, r0" );
+ asm( "LDI r31, 11" );
+ asm( "CPSE r31, r6" );
+ asm( "STS xRegTestError, r0" );
+ asm( "LDI r31, 12" );
+ asm( "CPSE r31, r7" );
+ asm( "STS xRegTestError, r0" );
+ asm( "LDI r31, 13" );
+ asm( "CPSE r31, r8" );
+ asm( "STS xRegTestError, r0" );
+ asm( "LDI r31, 14" );
+ asm( "CPSE r31, r9" );
+ asm( "STS xRegTestError, r0" );
+ asm( "LDI r31, 15" );
+ asm( "CPSE r31, r10" );
+ asm( "STS xRegTestError, r0" );
+ asm( "LDI r31, 16" );
+ asm( "CPSE r31, r11" );
+ asm( "STS xRegTestError, r0" );
+ asm( "LDI r31, 17" );
+ asm( "CPSE r31, r12" );
+ asm( "STS xRegTestError, r0" );
+ asm( "LDI r31, 18" );
+ asm( "CPSE r31, r13" );
+ asm( "STS xRegTestError, r0" );
+ asm( "LDI r31, 19" );
+ asm( "CPSE r31, r14" );
+ asm( "STS xRegTestError, r0" );
+ asm( "LDI r31, 20" );
+ asm( "CPSE r31, r15" );
+ asm( "STS xRegTestError, r0" );
+ asm( "LDI r31, 21" );
+ asm( "CPSE r31, r16" );
+ asm( "STS xRegTestError, r0" );
+ asm( "LDI r31, 22" );
+ asm( "CPSE r31, r17" );
+ asm( "STS xRegTestError, r0" );
+ asm( "LDI r31, 23" );
+ asm( "CPSE r31, r18" );
+ asm( "STS xRegTestError, r0" );
+ asm( "LDI r31, 24" );
+ asm( "CPSE r31, r19" );
+ asm( "STS xRegTestError, r0" );
+ asm( "LDI r31, 25" );
+ asm( "CPSE r31, r20" );
+ asm( "STS xRegTestError, r0" );
+ asm( "LDI r31, 26" );
+ asm( "CPSE r31, r21" );
+ asm( "STS xRegTestError, r0" );
+ asm( "LDI r31, 27" );
+ asm( "CPSE r31, r22" );
+ asm( "STS xRegTestError, r0" );
+ asm( "LDI r31, 28" );
+ asm( "CPSE r31, r23" );
+ asm( "STS xRegTestError, r0" );
+ asm( "LDI r31, 29" );
+ asm( "CPSE r31, r24" );
+ asm( "STS xRegTestError, r0" );
+ asm( "LDI r31, 30" );
+ asm( "CPSE r31, r25" );
+ asm( "STS xRegTestError, r0" );
+ asm( "LDI r31, 31" );
+ asm( "CPSE r31, r26" );
+ asm( "STS xRegTestError, r0" );
+ asm( "LDI r31, 32" );
+ asm( "CPSE r31, r27" );
+ asm( "STS xRegTestError, r0" );
+ asm( "LDI r31, 33" );
+ asm( "CPSE r31, r28" );
+ asm( "STS xRegTestError, r0" );
+ asm( "LDI r31, 34" );
+ asm( "CPSE r31, r29" );
+ asm( "STS xRegTestError, r0" );
+ asm( "LDI r31, 35" );
+ asm( "CPSE r31, r30" );
+ asm( "STS xRegTestError, r0" );
+ }
+}
+/*-----------------------------------------------------------*/
+
+static void prvRegisterCheck2( void *pvParameters )
+{
+ ( void ) pvParameters;
+
+ for( ;; )
+ {
+ asm( "LDI r31, 1" );
+ asm( "MOV r0, r31" );
+ asm( "LDI r31, 2" );
+ asm( "MOV r1, r31" );
+ asm( "LDI r31, 3" );
+ asm( "MOV r2, r31" );
+ asm( "LDI r31, 4" );
+ asm( "MOV r3, r31" );
+ asm( "LDI r31, 5" );
+ asm( "MOV r4, r31" );
+ asm( "LDI r31, 6" );
+ asm( "MOV r5, r31" );
+ asm( "LDI r31, 7" );
+ asm( "MOV r6, r31" );
+ asm( "LDI r31, 8" );
+ asm( "MOV r7, r31" );
+ asm( "LDI r31, 9" );
+ asm( "MOV r8, r31" );
+ asm( "LDI r31, 10" );
+ asm( "MOV r9, r31" );
+ asm( "LDI r31, 11" );
+ asm( "MOV r10, r31" );
+ asm( "LDI r31, 12" );
+ asm( "MOV r11, r31" );
+ asm( "LDI r31, 13" );
+ asm( "MOV r12, r31" );
+ asm( "LDI r31, 14" );
+ asm( "MOV r13, r31" );
+ asm( "LDI r31, 15" );
+ asm( "MOV r14, r31" );
+ asm( "LDI r31, 16" );
+ asm( "MOV r15, r31" );
+ asm( "LDI r16, 17" );
+ asm( "LDI r17, 18" );
+ asm( "LDI r18, 19" );
+ asm( "LDI r19, 20" );
+ asm( "LDI r20, 21" );
+ asm( "LDI r21, 22" );
+ asm( "LDI r22, 23" );
+ asm( "LDI r23, 24" );
+ asm( "LDI r24, 25" );
+ asm( "LDI r25, 26" );
+ asm( "LDI r26, 27" );
+ asm( "LDI r27, 28" );
+ asm( "LDI r28, 29" );
+ asm( "LDI r29, 30" );
+ asm( "LDI r30, 31" );
+
+ taskYIELD();
+
+ asm( "CPI r31, 16" );
+ asm( "BREQ no_err_2" );
+ asm( "STS xRegTestError, r0" );
+ asm( "no_err_2:" );
+ asm( "LDI r31, 1" );
+ asm( "CPSE r31, r0" );
+ asm( "STS xRegTestError, r0" );
+ asm( "LDI r31, 2" );
+ asm( "CPSE r31, r1" );
+ asm( "STS xRegTestError, r0" );
+ asm( "LDI r31, 3" );
+ asm( "CPSE r31, r2" );
+ asm( "STS xRegTestError, r0" );
+ asm( "LDI r31, 4" );
+ asm( "CPSE r31, r3" );
+ asm( "STS xRegTestError, r0" );
+ asm( "LDI r31, 5" );
+ asm( "CPSE r31, r4" );
+ asm( "STS xRegTestError, r0" );
+ asm( "LDI r31, 6" );
+ asm( "CPSE r31, r5" );
+ asm( "STS xRegTestError, r0" );
+ asm( "LDI r31, 7" );
+ asm( "CPSE r31, r6" );
+ asm( "STS xRegTestError, r0" );
+ asm( "LDI r31, 8" );
+ asm( "CPSE r31, r7" );
+ asm( "STS xRegTestError, r0" );
+ asm( "LDI r31, 9" );
+ asm( "CPSE r31, r8" );
+ asm( "STS xRegTestError, r0" );
+ asm( "LDI r31, 10" );
+ asm( "CPSE r31, r9" );
+ asm( "STS xRegTestError, r0" );
+ asm( "LDI r31, 11" );
+ asm( "CPSE r31, r10" );
+ asm( "STS xRegTestError, r0" );
+ asm( "LDI r31, 12" );
+ asm( "CPSE r31, r11" );
+ asm( "STS xRegTestError, r0" );
+ asm( "LDI r31, 13" );
+ asm( "CPSE r31, r12" );
+ asm( "STS xRegTestError, r0" );
+ asm( "LDI r31, 14" );
+ asm( "CPSE r31, r13" );
+ asm( "STS xRegTestError, r0" );
+ asm( "LDI r31, 15" );
+ asm( "CPSE r31, r14" );
+ asm( "STS xRegTestError, r0" );
+ asm( "LDI r31, 16" );
+ asm( "CPSE r31, r15" );
+ asm( "STS xRegTestError, r0" );
+ asm( "LDI r31, 17" );
+ asm( "CPSE r31, r16" );
+ asm( "STS xRegTestError, r0" );
+ asm( "LDI r31, 18" );
+ asm( "CPSE r31, r17" );
+ asm( "STS xRegTestError, r0" );
+ asm( "LDI r31, 19" );
+ asm( "CPSE r31, r18" );
+ asm( "STS xRegTestError, r0" );
+ asm( "LDI r31, 20" );
+ asm( "CPSE r31, r19" );
+ asm( "STS xRegTestError, r0" );
+ asm( "LDI r31, 21" );
+ asm( "CPSE r31, r20" );
+ asm( "STS xRegTestError, r0" );
+ asm( "LDI r31, 22" );
+ asm( "CPSE r31, r21" );
+ asm( "STS xRegTestError, r0" );
+ asm( "LDI r31, 23" );
+ asm( "CPSE r31, r22" );
+ asm( "STS xRegTestError, r0" );
+ asm( "LDI r31, 24" );
+ asm( "CPSE r31, r23" );
+ asm( "STS xRegTestError, r0" );
+ asm( "LDI r31, 25" );
+ asm( "CPSE r31, r24" );
+ asm( "STS xRegTestError, r0" );
+ asm( "LDI r31, 26" );
+ asm( "CPSE r31, r25" );
+ asm( "STS xRegTestError, r0" );
+ asm( "LDI r31, 27" );
+ asm( "CPSE r31, r26" );
+ asm( "STS xRegTestError, r0" );
+ asm( "LDI r31, 28" );
+ asm( "CPSE r31, r27" );
+ asm( "STS xRegTestError, r0" );
+ asm( "LDI r31, 29" );
+ asm( "CPSE r31, r28" );
+ asm( "STS xRegTestError, r0" );
+ asm( "LDI r31, 30" );
+ asm( "CPSE r31, r29" );
+ asm( "STS xRegTestError, r0" );
+ asm( "LDI r31, 31" );
+ asm( "CPSE r31, r30" );
+ asm( "STS xRegTestError, r0" );
+ }
+}
diff --git a/FreeRTOS/Demo/AVR_Dx_Atmel_Studio/RTOSDemo/regtest.h b/FreeRTOS/Demo/AVR_Dx_Atmel_Studio/RTOSDemo/regtest.h
new file mode 100644
index 000000000..365eecc16
--- /dev/null
+++ b/FreeRTOS/Demo/AVR_Dx_Atmel_Studio/RTOSDemo/regtest.h
@@ -0,0 +1,34 @@
+/*
+ * FreeRTOS Kernel V10.3.0
+ * Copyright (C) 2020 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 REG_TEST_H
+#define REG_TEST_H
+
+void vStartRegTestTasks( void );
+portBASE_TYPE xAreRegTestTasksStillRunning( void );
+
+#endif \ No newline at end of file
diff --git a/FreeRTOS/Demo/AVR_Dx_Atmel_Studio/RTOSDemo/serial/serial.c b/FreeRTOS/Demo/AVR_Dx_Atmel_Studio/RTOSDemo/serial/serial.c
new file mode 100644
index 000000000..59ccbbec5
--- /dev/null
+++ b/FreeRTOS/Demo/AVR_Dx_Atmel_Studio/RTOSDemo/serial/serial.c
@@ -0,0 +1,150 @@
+/*
+ * FreeRTOS Kernel V10.3.1
+ * Copyright (C) 2020 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!
+ */
+
+
+/* BASIC INTERRUPT DRIVEN SERIAL PORT DRIVER FOR IAR AVR PORT. */
+
+#include <stdlib.h>
+#include "FreeRTOS.h"
+#include "queue.h"
+#include "task.h"
+#include "serial.h"
+#include <avr/interrupt.h>
+
+#define USART_BAUD_RATE(BAUD_RATE) ((float)(configCPU_CLOCK_HZ * 64 / (16 * (float)BAUD_RATE)) + 0.5)
+
+static QueueHandle_t xRxedChars;
+static QueueHandle_t xCharsForTx;
+
+#define vInterruptOn() USART1.CTRLA |= (1 << USART_DREIE_bp)
+
+#define vInterruptOff() USART1.CTRLA &= ~(1 << USART_DREIE_bp)
+
+xComPortHandle xSerialPortInitMinimal( unsigned long ulWantedBaud, unsigned portBASE_TYPE uxQueueLength )
+{
+ portENTER_CRITICAL();
+ {
+ /* Create the queues used by the com test task. */
+ xRxedChars = xQueueCreate( uxQueueLength, ( unsigned portBASE_TYPE ) sizeof( signed char ) );
+ xCharsForTx = xQueueCreate( uxQueueLength, ( unsigned portBASE_TYPE ) sizeof( signed char ) );
+
+ USART1.BAUD = (uint16_t)USART_BAUD_RATE(ulWantedBaud); /* set baud rate register */
+
+ USART1.CTRLA = 1 << USART_LBME_bp /* Loop-back Mode Enable: enabled */
+ | USART_RS485_OFF_gc /* RS485 Mode disabled */
+ | 1 << USART_RXCIE_bp; /* Receive Complete Interrupt Enable: enabled */
+
+ USART1.CTRLB = 1 << USART_RXEN_bp /* Reciever enable: enabled */
+ | USART_RXMODE_NORMAL_gc /* Normal mode */
+ | 1 << USART_TXEN_bp; /* Transmitter Enable: enabled */
+ }
+
+ portEXIT_CRITICAL();
+
+ /* Unlike other ports, this serial code does not allow for more than one
+ com port. We therefore don't return a pointer to a port structure and can
+ instead just return NULL. */
+ return NULL;
+}
+/*-----------------------------------------------------------*/
+
+signed portBASE_TYPE xSerialGetChar( xComPortHandle pxPort, signed char *pcRxedChar, TickType_t xBlockTime )
+{
+ /* Get the next character from the buffer. Return false if no characters
+ are available, or arrive before xBlockTime expires. */
+ if( xQueueReceive( xRxedChars, pcRxedChar, xBlockTime ) )
+ {
+ return pdTRUE;
+ }
+ else
+ {
+ return pdFALSE;
+ }
+}
+/*-----------------------------------------------------------*/
+
+signed portBASE_TYPE xSerialPutChar( xComPortHandle pxPort, signed char cOutChar, TickType_t xBlockTime )
+{
+ /* Return false if after the block time there is no room on the Tx queue. */
+ if( xQueueSend( xCharsForTx, &cOutChar, xBlockTime ) != pdPASS )
+ {
+ return pdFAIL;
+ }
+
+ vInterruptOn();
+
+ return pdPASS;
+}
+/*-----------------------------------------------------------*/
+
+void vSerialClose( xComPortHandle xPort )
+{
+ /* Turn off the interrupts. We may also want to delete the queues and/or
+ re-install the original ISR. */
+
+ portENTER_CRITICAL();
+ {
+ vInterruptOff();
+ USART1.CTRLB &= (1 << USART_RXEN_bp);
+ }
+ portEXIT_CRITICAL();
+}
+/*-----------------------------------------------------------*/
+
+ISR(USART1_RXC_vect)
+{
+signed char ucChar, xHigherPriorityTaskWoken = pdFALSE;
+
+ /* Get the character and post it on the queue of Rxed characters.
+ If the post causes a task to wake force a context switch as the woken task
+ may have a higher priority than the task we have interrupted. */
+ ucChar = USART1.RXDATAL;
+
+ xQueueSendFromISR( xRxedChars, &ucChar, &xHigherPriorityTaskWoken );
+
+ if( xHigherPriorityTaskWoken != pdFALSE )
+ {
+ portYIELD_FROM_ISR();
+ }
+
+}
+
+ISR(USART1_DRE_vect)
+{
+signed char cChar, cTaskWoken = pdFALSE;
+
+ if( xQueueReceiveFromISR( xCharsForTx, &cChar, &cTaskWoken ) == pdTRUE )
+ {
+ /* Send the next character queued for Tx. */
+ USART1.TXDATAL = cChar;
+ }
+ else
+ {
+ /* Queue empty, nothing to send. */
+ vInterruptOff();
+ }
+}