diff options
Diffstat (limited to 'FreeRTOS/Demo/AVR_Dx_Atmel_Studio/RTOSDemo')
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(); + } +} |
