Add Pearl Gecko demo.
Fix build error when configSUPPORT_STATIC_ALLOCATION and configNUM_THREAD_LOCAL_STORAGE_POINTERS were greater than zero at the same time. Allow the pdMS_TO_TICKS macro to be overridden by a definition in FreeRTOSConfig.h.pull/1/head
parent
780aa7e325
commit
c0abb762ff
@ -0,0 +1,109 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<?fileVersion 4.0.0?>
|
||||
|
||||
<cproject storage_type_id="org.eclipse.cdt.core.XmlProjectDescriptionStorage">
|
||||
<storageModule moduleId="org.eclipse.cdt.core.settings">
|
||||
<cconfiguration id="com.silabs.ide.si32.gcc.debug#com.silabs.ide.si32.gcc:4.8.3.20131129">
|
||||
<storageModule buildSystemId="org.eclipse.cdt.managedbuilder.core.configurationDataProvider" id="com.silabs.ide.si32.gcc.debug#com.silabs.ide.si32.gcc:4.8.3.20131129" moduleId="org.eclipse.cdt.core.settings" name="GNU ARM v4.8.3 - Debug">
|
||||
<macros>
|
||||
<stringMacro name="StudioToolchainPath" type="VALUE_PATH_DIR" value="${StudioToolchainPathFromID:com.silabs.ide.si32.gcc:4.8.3.20131129}"/>
|
||||
<stringMacro name="StudioSdkPath" type="VALUE_PATH_DIR" value="${StudioSdkPathFromID:com.silabs.sdk.si32.efm32.sls:2.0.10}"/>
|
||||
</macros>
|
||||
<externalSettings/>
|
||||
<extensions>
|
||||
<extension id="com.silabs.ide.debug.core.S37" point="org.eclipse.cdt.core.BinaryParser"/>
|
||||
<extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser"/>
|
||||
<extension id="org.eclipse.cdt.core.GNU_ELF" point="org.eclipse.cdt.core.BinaryParser"/>
|
||||
<extension id="com.silabs.ide.debug.core.BIN" point="org.eclipse.cdt.core.BinaryParser"/>
|
||||
<extension id="com.silabs.ide.debug.core.HEX" point="org.eclipse.cdt.core.BinaryParser"/>
|
||||
<extension id="org.eclipse.cdt.core.GmakeErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
|
||||
<extension id="org.eclipse.cdt.core.CWDLocator" point="org.eclipse.cdt.core.ErrorParser"/>
|
||||
<extension id="org.eclipse.cdt.core.GCCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
|
||||
<extension id="org.eclipse.cdt.core.GASErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
|
||||
<extension id="org.eclipse.cdt.core.GLDErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
|
||||
</extensions>
|
||||
</storageModule>
|
||||
<storageModule buildConfig.stockConfigId="com.silabs.ide.si32.gcc.debug#com.silabs.ide.si32.gcc:4.8.3.20131129" cppBuildConfig.builtinIncludes="studio:/sdk/kits/SLSTK3401A_EFM32PG/config/ studio:/sdk/CMSIS/Include/ studio:/sdk/emlib/inc/ studio:/sdk/kits/common/bsp/ studio:/sdk/kits/common/drivers/ studio:/sdk/Device/SiliconLabs/EFM32PG1B/Include/ studio:/sdk/kits/SLSTK3401A_EFM32PG/config/ studio:/sdk/CMSIS/Include/ studio:/sdk/emlib/inc/ studio:/sdk/kits/common/bsp/ studio:/sdk/kits/common/drivers/ studio:/sdk/Device/SiliconLabs/EFM32PG1B/Include/" cppBuildConfig.builtinLibraryFiles="" cppBuildConfig.builtinLibraryNames="" cppBuildConfig.builtinLibraryObjects="" cppBuildConfig.builtinLibraryPaths="" cppBuildConfig.builtinMacros="EFM32PG1B200F256GM48 EFM32PG1B200F256GM48 DEBUG" moduleId="com.silabs.ide.project.core" projectCommon.referencedModules="[{"module":"<project:MModule xmlns:project=\"http://www.silabs.com/sls/Project.ecore\" builtin=\"true\" id=\"com.silabs.ide.si32.sdk.efm32.v2.common.emlib\">\r\n <inclusions pattern=\"emlib/em_assert.c\"/>\r\n <inclusions pattern=\"emlib/em_system.c\"/>\r\n <inclusions pattern=\"emlib/em_cmu.c\"/>\r\n <inclusions pattern=\"emlib/em_emu.c\"/>\r\n <inclusions pattern=\"emlib/em_gpio.c\"/>\r\n</project:MModule>","builtinExcludes":[],"builtin":true,"builtinSources":["emlib/em_assert.c","emlib/em_cmu.c","emlib/em_emu.c","emlib/em_gpio.c","emlib/em_system.c"]},{"module":"<project:MModule xmlns:project=\"http://www.silabs.com/sls/Project.ecore\" builtin=\"true\" id=\"com.silabs.ide.si32.sdk.efm32.v2.part\">\r\n <inclusions pattern=\"CMSIS/.*/startup_.*_.*.s\"/>\r\n <inclusions pattern=\"CMSIS/.*/system_.*.c\"/>\r\n</project:MModule>","builtinExcludes":[],"builtin":true,"builtinSources":["CMSIS/efm32pg1b/startup_gcc_efm32pg1b.s","CMSIS/efm32pg1b/system_efm32pg1b.c"]},{"module":"<project:MModule xmlns:project=\"http://www.silabs.com/sls/Project.ecore\" builtin=\"true\" id=\"com.silabs.ide.si32.sdk.efm32.v2.common.CMSIS\">\r\n <exclusions pattern=\".*\"/>\r\n</project:MModule>","builtinExcludes":[],"builtin":true,"builtinSources":[]},{"module":"<project:MModule xmlns:project=\"http://www.silabs.com/sls/Project.ecore\" builtin=\"true\" id=\"com.silabs.ide.si32.sdk.efm32.v2.kit\">\r\n <exclusions pattern=\".*\"/>\r\n</project:MModule>","builtinExcludes":[],"builtin":true,"builtinSources":[]},{"module":"<project:MModule xmlns:project=\"http://www.silabs.com/sls/Project.ecore\" builtin=\"true\" id=\"com.silabs.ide.si32.sdk.efm32.v2.common.drivers\">\r\n <exclusions pattern=\".*\"/>\r\n</project:MModule>","builtinExcludes":[],"builtin":true,"builtinSources":[]},{"module":"<project:MModule xmlns:project=\"http://www.silabs.com/sls/Project.ecore\" builtin=\"true\" id=\"com.silabs.ide.si32.sdk.efm32.v2.common.bsp\">\r\n <inclusions pattern=\"BSP/bsp_stk_leds.c\"/>\r\n</project:MModule>","builtinExcludes":[],"builtin":true,"builtinSources":["BSP/bsp_stk_leds.c"]}]" projectCommon.toolchainId="com.silabs.ide.si32.gcc:4.8.3.20131129"/>
|
||||
<storageModule moduleId="cdtBuildSystem" version="4.0.0">
|
||||
<configuration artifactName="${ProjName}" buildArtefactType="org.eclipse.cdt.build.core.buildArtefactType.exe" buildProperties="org.eclipse.cdt.build.core.buildArtefactType=org.eclipse.cdt.build.core.buildArtefactType.exe" description="" id="com.silabs.ide.si32.gcc.debug#com.silabs.ide.si32.gcc:4.8.3.20131129" name="GNU ARM v4.8.3 - Debug" parent="com.silabs.ide.si32.gcc.cdt.managedbuild.config.gnu.exe">
|
||||
<folderInfo id="com.silabs.ide.si32.gcc.debug#com.silabs.ide.si32.gcc:4.8.3.20131129." name="/" resourcePath="">
|
||||
<toolChain id="com.silabs.ide.si32.gcc.cdt.managedbuild.toolchain.exe.1210947266" name="Si32 GNU ARM" superClass="com.silabs.ide.si32.gcc.cdt.managedbuild.toolchain.exe">
|
||||
<option id="com.silabs.ide.si32.gcc.cdt.managedbuild.toolchain.debug.level.1491015159" name="Debug Level" superClass="com.silabs.ide.si32.gcc.cdt.managedbuild.toolchain.debug.level" value="com.silabs.ide.si32.gcc.cdt.managedbuild.toolchain.debug.level.default" valueType="enumerated"/>
|
||||
<targetPlatform binaryParser="org.eclipse.cdt.core.ELF;org.eclipse.cdt.core.GNU_ELF;com.silabs.ide.debug.core.BIN;com.silabs.ide.debug.core.HEX;com.silabs.ide.debug.core.S37" id="com.silabs.ide.si32.gcc.cdt.managedbuild.target.gnu.platform.base.1072192348" isAbstract="false" name="Debug Platform" osList="win32,linux,macosx" superClass="com.silabs.ide.si32.gcc.cdt.managedbuild.target.gnu.platform.base"/>
|
||||
<builder buildPath="${workspace_loc:/RTOSDemo}/GNU ARM v4.8.3 - Debug" id="com.silabs.ide.si32.gcc.cdt.managedbuild.target.gnu.builder.base.1216179401" keepEnvironmentInBuildfile="false" managedBuildOn="true" name="Si32 GNU ARM Builder" parallelBuildOn="true" parallelizationNumber="optimal" superClass="com.silabs.ide.si32.gcc.cdt.managedbuild.target.gnu.builder.base"/>
|
||||
<tool id="com.silabs.ide.si32.gcc.cdt.managedbuild.tool.gnu.c.compiler.base.1347880376" name="GNU ARM C Compiler" superClass="com.silabs.ide.si32.gcc.cdt.managedbuild.tool.gnu.c.compiler.base">
|
||||
<option id="gnu.c.compiler.option.optimization.level.1992790616" name="Optimization Level" superClass="gnu.c.compiler.option.optimization.level" value="gnu.c.optimization.level.none" valueType="enumerated"/>
|
||||
<option id="com.silabs.ide.si32.gcc.cdt.managedbuild.tool.gnu.c.compiler.def.symbols.515358055" name="Defined symbols (-D)" superClass="com.silabs.ide.si32.gcc.cdt.managedbuild.tool.gnu.c.compiler.def.symbols" valueType="definedSymbols">
|
||||
<listOptionValue builtIn="false" value="DEBUG_EFM=1"/>
|
||||
<listOptionValue builtIn="false" value="SLEEP_LOWEST_ENERGY_MODE_DEFAULT=sleepEM2"/>
|
||||
<listOptionValue builtIn="false" value="EFM32PG1B200F256GM48=1"/>
|
||||
<listOptionValue builtIn="false" value="DEBUG=1"/>
|
||||
</option>
|
||||
<option id="com.silabs.ide.si32.gcc.cdt.managedbuild.tool.gnu.c.compiler.debug.builtin.1313176957" name="Always branch to builtin functions (-fno-builtin)" superClass="com.silabs.ide.si32.gcc.cdt.managedbuild.tool.gnu.c.compiler.debug.builtin" value="true" valueType="boolean"/>
|
||||
<option id="com.silabs.ide.si32.gcc.cdt.managedbuild.tool.gnu.c.compiler.debug.prolog.1172189815" name="Generate debugger-friendly prologs (-mno-sched-prolog)" superClass="com.silabs.ide.si32.gcc.cdt.managedbuild.tool.gnu.c.compiler.debug.prolog" value="true" valueType="boolean"/>
|
||||
<option id="gnu.c.compiler.option.include.paths.1242792235" name="Include paths (-I)" superClass="gnu.c.compiler.option.include.paths" valueType="includePath">
|
||||
<listOptionValue builtIn="false" value=""${StudioSdkPath}/kits/SLSTK3401A_EFM32PG/config""/>
|
||||
<listOptionValue builtIn="false" value=""${StudioSdkPath}/CMSIS/Include""/>
|
||||
<listOptionValue builtIn="false" value=""${StudioSdkPath}/emlib/inc""/>
|
||||
<listOptionValue builtIn="false" value=""${StudioSdkPath}/kits/common/bsp""/>
|
||||
<listOptionValue builtIn="false" value=""${StudioSdkPath}/kits/common/drivers""/>
|
||||
<listOptionValue builtIn="false" value=""${StudioSdkPath}/Device/SiliconLabs/EFM32PG1B/Include""/>
|
||||
<listOptionValue builtIn="false" value=""${workspace_loc:/${ProjName}}""/>
|
||||
<listOptionValue builtIn="false" value=""${workspace_loc:/${ProjName}/FreeRTOS_Source/include}""/>
|
||||
<listOptionValue builtIn="false" value=""${workspace_loc:/${ProjName}/FreeRTOS_Source/portable/GCC/ARM_CM3}""/>
|
||||
<listOptionValue builtIn="false" value=""${workspace_loc:/${ProjName}/Full_Demo/Standard_Demo_Tasks/include}""/>
|
||||
<listOptionValue builtIn="false" value=""${workspace_loc:/${ProjName}/SilLabs_Source/emdrv/sleep/inc}""/>
|
||||
</option>
|
||||
<option id="gnu.c.compiler.option.warnings.extrawarn.257881085" name="Extra warnings (-Wextra)" superClass="gnu.c.compiler.option.warnings.extrawarn" value="true" valueType="boolean"/>
|
||||
<inputType id="com.silabs.ide.si32.gcc.cdt.managedbuild.tool.gnu.c.compiler.input.1657907187" superClass="com.silabs.ide.si32.gcc.cdt.managedbuild.tool.gnu.c.compiler.input"/>
|
||||
</tool>
|
||||
<tool id="com.silabs.ide.si32.gcc.cdt.managedbuild.tool.gnu.cpp.compiler.base.404002511" name="GNU ARM C++ Compiler" superClass="com.silabs.ide.si32.gcc.cdt.managedbuild.tool.gnu.cpp.compiler.base">
|
||||
<option id="gnu.cpp.compiler.option.optimization.level.1331292595" name="Optimization Level" superClass="gnu.cpp.compiler.option.optimization.level" value="gnu.cpp.compiler.optimization.level.none" valueType="enumerated"/>
|
||||
<option id="com.silabs.ide.si32.gcc.cdt.managedbuild.tool.gnu.cpp.compiler.debug.builtin.1708445238" name="Always branch to builtin functions (-fno-builtin)" superClass="com.silabs.ide.si32.gcc.cdt.managedbuild.tool.gnu.cpp.compiler.debug.builtin" value="true" valueType="boolean"/>
|
||||
<option id="com.silabs.ide.si32.gcc.cdt.managedbuild.tool.gnu.cpp.compiler.debug.prolog.437089423" name="Generate debugger-friendly prologs (-mno-sched-prolog)" superClass="com.silabs.ide.si32.gcc.cdt.managedbuild.tool.gnu.cpp.compiler.debug.prolog" value="true" valueType="boolean"/>
|
||||
</tool>
|
||||
<tool id="com.silabs.ide.si32.gcc.cdt.managedbuild.tool.gnu.assembler.base.146600794" name="GNU ARM Assembler" superClass="com.silabs.ide.si32.gcc.cdt.managedbuild.tool.gnu.assembler.base">
|
||||
<option id="gnu.both.asm.option.include.paths.1966239528" name="Include paths (-I)" superClass="gnu.both.asm.option.include.paths" valueType="includePath">
|
||||
<listOptionValue builtIn="false" value=""${StudioSdkPath}/kits/SLSTK3401A_EFM32PG/examples/blink""/>
|
||||
<listOptionValue builtIn="false" value=""${StudioSdkPath}/kits/SLSTK3401A_EFM32PG/config""/>
|
||||
<listOptionValue builtIn="false" value=""${StudioSdkPath}/CMSIS/Include""/>
|
||||
<listOptionValue builtIn="false" value=""${StudioSdkPath}/emlib/inc""/>
|
||||
<listOptionValue builtIn="false" value=""${StudioSdkPath}/kits/common/bsp""/>
|
||||
<listOptionValue builtIn="false" value=""${StudioSdkPath}/kits/common/drivers""/>
|
||||
<listOptionValue builtIn="false" value=""${StudioSdkPath}/Device/SiliconLabs/EFM32PG1B/Include""/>
|
||||
</option>
|
||||
<option id="com.silabs.ide.si32.gcc.cdt.managedbuild.tool.gnu.as.def.symbols.2072246944" name="Defined symbols (-D)" superClass="com.silabs.ide.si32.gcc.cdt.managedbuild.tool.gnu.as.def.symbols" valueType="definedSymbols">
|
||||
<listOptionValue builtIn="false" value="EFM32PG1B200F256GM48=1"/>
|
||||
</option>
|
||||
<inputType id="cdt.managedbuild.tool.gnu.assembler.input.80652597" superClass="cdt.managedbuild.tool.gnu.assembler.input"/>
|
||||
</tool>
|
||||
<tool id="com.silabs.ide.si32.gcc.cdt.managedbuild.tool.gnu.c.linker.base.467472350" name="GNU ARM C Linker" superClass="com.silabs.ide.si32.gcc.cdt.managedbuild.tool.gnu.c.linker.base">
|
||||
<option id="com.silabs.ide.si32.gcc.cdt.managedbuild.tool.gnu.c.linker.nostdlibs.1491099628" name="No startup or default libs (-nostdlib)" superClass="com.silabs.ide.si32.gcc.cdt.managedbuild.tool.gnu.c.linker.nostdlibs" value="false" valueType="boolean"/>
|
||||
<option id="com.silabs.ide.si32.gcc.cdt.managedbuild.tool.gnu.c.linker.category.ordering.selection.1386626351" name="Linker input ordering" superClass="com.silabs.ide.si32.gcc.cdt.managedbuild.tool.gnu.c.linker.category.ordering.selection" value="./emlib/em_assert.o;./emlib/em_cmu.o;./emlib/em_emu.o;./emlib/em_gpio.o;./emlib/em_rtc.o;./emlib/em_system.o;./emdrv/sleep/src/sleep.o;./Low_Power_Demo/low_power_tick_management_RTC.o;./Low_Power_Demo/main_low_power.o;./Full_Demo/Standard_Demo_Tasks/EventGroupsDemo.o;./Full_Demo/Standard_Demo_Tasks/GenQTest.o;./Full_Demo/Standard_Demo_Tasks/StaticAllocation.o;./Full_Demo/Standard_Demo_Tasks/TaskNotify.o;./Full_Demo/Standard_Demo_Tasks/TimerDemo.o;./Full_Demo/Standard_Demo_Tasks/blocktim.o;./Full_Demo/Standard_Demo_Tasks/dynamic.o;./Full_Demo/Standard_Demo_Tasks/flop.o;./Full_Demo/Standard_Demo_Tasks/recmutex.o;./Full_Demo/Standard_Demo_Tasks/semtest.o;./Full_Demo/RegTest.o;./Full_Demo/main_full.o;./FreeRTOS_Source/portable/MemMang/heap_4.o;./FreeRTOS_Source/portable/GCC/ARM_CM3/port.o;./FreeRTOS_Source/event_groups.o;./FreeRTOS_Source/list.o;./FreeRTOS_Source/queue.o;./FreeRTOS_Source/tasks.o;./FreeRTOS_Source/timers.o;./CMSIS/efm32pg1b/startup_gcc_efm32pg1b.o;./CMSIS/efm32pg1b/system_efm32pg1b.o;./BSP/bsp_stk_leds.o;./main.o" valueType="string"/>
|
||||
<inputType id="cdt.managedbuild.tool.gnu.c.linker.input.673598100" superClass="cdt.managedbuild.tool.gnu.c.linker.input">
|
||||
<additionalInput kind="additionalinputdependency" paths="$(USER_OBJS)"/>
|
||||
<additionalInput kind="additionalinput" paths="$(LIBS)"/>
|
||||
</inputType>
|
||||
</tool>
|
||||
<tool id="com.silabs.ide.si32.gcc.cdt.managedbuild.tool.gnu.cpp.linker.base.737185930" name="GNU ARM C++ Linker" superClass="com.silabs.ide.si32.gcc.cdt.managedbuild.tool.gnu.cpp.linker.base"/>
|
||||
<tool id="com.silabs.ide.si32.gcc.cdt.managedbuild.tool.gnu.archiver.base.1305574197" name="GNU ARM Archiver" superClass="com.silabs.ide.si32.gcc.cdt.managedbuild.tool.gnu.archiver.base"/>
|
||||
</toolChain>
|
||||
</folderInfo>
|
||||
</configuration>
|
||||
</storageModule>
|
||||
<storageModule moduleId="org.eclipse.cdt.core.externalSettings"/>
|
||||
</cconfiguration>
|
||||
</storageModule>
|
||||
<storageModule moduleId="com.silabs.ide.project.core" projectCommon.buildArtifactType="EXE" projectCommon.kitId="com.silabs.kit.si32.efm32.efm32pg.slstk3401a" projectCommon.partId="com.silabs.mcu.si32.efm32.efm32pg1b.efm32pg1b200f256gm48" projectCommon.sdkId="com.silabs.sdk.si32.efm32.sls:2.0.10"/>
|
||||
<storageModule moduleId="cdtBuildSystem" version="4.0.0">
|
||||
<project id="RTOSDemo.com.silabs.ide.project.core.cdt.cdtMbsProjectType.476959829" name="SLS CDT Project" projectType="com.silabs.ide.project.core.cdt.cdtMbsProjectType"/>
|
||||
</storageModule>
|
||||
<storageModule moduleId="org.eclipse.cdt.core.LanguageSettingsProviders"/>
|
||||
<storageModule moduleId="scannerConfiguration">
|
||||
<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId=""/>
|
||||
<scannerConfigBuildInfo instanceId="com.silabs.ide.si32.gcc.debug#com.silabs.ide.si32.gcc:4.8.3.20131129;com.silabs.ide.si32.gcc.debug#com.silabs.ide.si32.gcc:4.8.3.20131129.;com.silabs.ide.si32.gcc.cdt.managedbuild.tool.gnu.c.compiler.base.1347880376;com.silabs.ide.si32.gcc.cdt.managedbuild.tool.gnu.c.compiler.input.1657907187">
|
||||
<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId=""/>
|
||||
</scannerConfigBuildInfo>
|
||||
</storageModule>
|
||||
<storageModule moduleId="refreshScope"/>
|
||||
</cproject>
|
@ -0,0 +1,241 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<projectDescription>
|
||||
<name>RTOSDemo</name>
|
||||
<comment></comment>
|
||||
<projects>
|
||||
</projects>
|
||||
<buildSpec>
|
||||
<buildCommand>
|
||||
<name>org.eclipse.cdt.managedbuilder.core.genmakebuilder</name>
|
||||
<triggers>clean,full,incremental,</triggers>
|
||||
<arguments>
|
||||
</arguments>
|
||||
</buildCommand>
|
||||
<buildCommand>
|
||||
<name>org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder</name>
|
||||
<triggers>full,incremental,</triggers>
|
||||
<arguments>
|
||||
</arguments>
|
||||
</buildCommand>
|
||||
</buildSpec>
|
||||
<natures>
|
||||
<nature>org.eclipse.cdt.core.cnature</nature>
|
||||
<nature>com.silabs.ide.project.core.SLSProjectNature</nature>
|
||||
<nature>org.eclipse.cdt.managedbuilder.core.managedBuildNature</nature>
|
||||
<nature>org.eclipse.cdt.managedbuilder.core.ScannerConfigNature</nature>
|
||||
</natures>
|
||||
<linkedResources>
|
||||
<link>
|
||||
<name>FreeRTOS_Source</name>
|
||||
<type>2</type>
|
||||
<locationURI>FREERTOS_ROOT/FreeRTOS/Source</locationURI>
|
||||
</link>
|
||||
<link>
|
||||
<name>Full_Demo/Standard_Demo_Tasks</name>
|
||||
<type>2</type>
|
||||
<locationURI>FREERTOS_ROOT/FreeRTOS/Demo/Common/Minimal</locationURI>
|
||||
</link>
|
||||
<link>
|
||||
<name>Full_Demo/Standard_Demo_Tasks/include</name>
|
||||
<type>2</type>
|
||||
<locationURI>FREERTOS_ROOT/FreeRTOS/Demo/Common/include</locationURI>
|
||||
</link>
|
||||
</linkedResources>
|
||||
<filteredResources>
|
||||
<filter>
|
||||
<id>1455990187566</id>
|
||||
<name>FreeRTOS_Source</name>
|
||||
<type>5</type>
|
||||
<matcher>
|
||||
<id>org.eclipse.ui.ide.multiFilter</id>
|
||||
<arguments>1.0-name-matches-false-false-event_groups.c</arguments>
|
||||
</matcher>
|
||||
</filter>
|
||||
<filter>
|
||||
<id>1455990187573</id>
|
||||
<name>FreeRTOS_Source</name>
|
||||
<type>5</type>
|
||||
<matcher>
|
||||
<id>org.eclipse.ui.ide.multiFilter</id>
|
||||
<arguments>1.0-name-matches-false-false-queue.c</arguments>
|
||||
</matcher>
|
||||
</filter>
|
||||
<filter>
|
||||
<id>1455990187577</id>
|
||||
<name>FreeRTOS_Source</name>
|
||||
<type>5</type>
|
||||
<matcher>
|
||||
<id>org.eclipse.ui.ide.multiFilter</id>
|
||||
<arguments>1.0-name-matches-false-false-tasks.c</arguments>
|
||||
</matcher>
|
||||
</filter>
|
||||
<filter>
|
||||
<id>1455990187582</id>
|
||||
<name>FreeRTOS_Source</name>
|
||||
<type>5</type>
|
||||
<matcher>
|
||||
<id>org.eclipse.ui.ide.multiFilter</id>
|
||||
<arguments>1.0-name-matches-false-false-timers.c</arguments>
|
||||
</matcher>
|
||||
</filter>
|
||||
<filter>
|
||||
<id>1455990187588</id>
|
||||
<name>FreeRTOS_Source</name>
|
||||
<type>9</type>
|
||||
<matcher>
|
||||
<id>org.eclipse.ui.ide.multiFilter</id>
|
||||
<arguments>1.0-name-matches-false-false-include</arguments>
|
||||
</matcher>
|
||||
</filter>
|
||||
<filter>
|
||||
<id>1455990187592</id>
|
||||
<name>FreeRTOS_Source</name>
|
||||
<type>9</type>
|
||||
<matcher>
|
||||
<id>org.eclipse.ui.ide.multiFilter</id>
|
||||
<arguments>1.0-name-matches-false-false-portable</arguments>
|
||||
</matcher>
|
||||
</filter>
|
||||
<filter>
|
||||
<id>1455990187597</id>
|
||||
<name>FreeRTOS_Source</name>
|
||||
<type>5</type>
|
||||
<matcher>
|
||||
<id>org.eclipse.ui.ide.multiFilter</id>
|
||||
<arguments>1.0-name-matches-false-false-list.c</arguments>
|
||||
</matcher>
|
||||
</filter>
|
||||
<filter>
|
||||
<id>0</id>
|
||||
<name>FreeRTOS_Source/portable</name>
|
||||
<type>9</type>
|
||||
<matcher>
|
||||
<id>org.eclipse.ui.ide.multiFilter</id>
|
||||
<arguments>1.0-name-matches-false-false-MemMang</arguments>
|
||||
</matcher>
|
||||
</filter>
|
||||
<filter>
|
||||
<id>0</id>
|
||||
<name>FreeRTOS_Source/portable</name>
|
||||
<type>9</type>
|
||||
<matcher>
|
||||
<id>org.eclipse.ui.ide.multiFilter</id>
|
||||
<arguments>1.0-name-matches-false-false-GCC</arguments>
|
||||
</matcher>
|
||||
</filter>
|
||||
<filter>
|
||||
<id>0</id>
|
||||
<name>Full_Demo/Standard_Demo_Tasks</name>
|
||||
<type>5</type>
|
||||
<matcher>
|
||||
<id>org.eclipse.ui.ide.multiFilter</id>
|
||||
<arguments>1.0-name-matches-false-false-flop.c</arguments>
|
||||
</matcher>
|
||||
</filter>
|
||||
<filter>
|
||||
<id>0</id>
|
||||
<name>Full_Demo/Standard_Demo_Tasks</name>
|
||||
<type>5</type>
|
||||
<matcher>
|
||||
<id>org.eclipse.ui.ide.multiFilter</id>
|
||||
<arguments>1.0-name-matches-false-false-dynamic.c</arguments>
|
||||
</matcher>
|
||||
</filter>
|
||||
<filter>
|
||||
<id>0</id>
|
||||
<name>Full_Demo/Standard_Demo_Tasks</name>
|
||||
<type>5</type>
|
||||
<matcher>
|
||||
<id>org.eclipse.ui.ide.multiFilter</id>
|
||||
<arguments>1.0-name-matches-false-false-blocktim.c</arguments>
|
||||
</matcher>
|
||||
</filter>
|
||||
<filter>
|
||||
<id>0</id>
|
||||
<name>Full_Demo/Standard_Demo_Tasks</name>
|
||||
<type>5</type>
|
||||
<matcher>
|
||||
<id>org.eclipse.ui.ide.multiFilter</id>
|
||||
<arguments>1.0-name-matches-false-false-GenQTest.c</arguments>
|
||||
</matcher>
|
||||
</filter>
|
||||
<filter>
|
||||
<id>0</id>
|
||||
<name>Full_Demo/Standard_Demo_Tasks</name>
|
||||
<type>5</type>
|
||||
<matcher>
|
||||
<id>org.eclipse.ui.ide.multiFilter</id>
|
||||
<arguments>1.0-name-matches-false-false-TimerDemo.c</arguments>
|
||||
</matcher>
|
||||
</filter>
|
||||
<filter>
|
||||
<id>0</id>
|
||||
<name>Full_Demo/Standard_Demo_Tasks</name>
|
||||
<type>5</type>
|
||||
<matcher>
|
||||
<id>org.eclipse.ui.ide.multiFilter</id>
|
||||
<arguments>1.0-name-matches-false-false-EventGroupsDemo.c</arguments>
|
||||
</matcher>
|
||||
</filter>
|
||||
<filter>
|
||||
<id>0</id>
|
||||
<name>Full_Demo/Standard_Demo_Tasks</name>
|
||||
<type>5</type>
|
||||
<matcher>
|
||||
<id>org.eclipse.ui.ide.multiFilter</id>
|
||||
<arguments>1.0-name-matches-false-false-TaskNotify.c</arguments>
|
||||
</matcher>
|
||||
</filter>
|
||||
<filter>
|
||||
<id>0</id>
|
||||
<name>Full_Demo/Standard_Demo_Tasks</name>
|
||||
<type>5</type>
|
||||
<matcher>
|
||||
<id>org.eclipse.ui.ide.multiFilter</id>
|
||||
<arguments>1.0-name-matches-false-false-recmutex.c</arguments>
|
||||
</matcher>
|
||||
</filter>
|
||||
<filter>
|
||||
<id>0</id>
|
||||
<name>Full_Demo/Standard_Demo_Tasks</name>
|
||||
<type>5</type>
|
||||
<matcher>
|
||||
<id>org.eclipse.ui.ide.multiFilter</id>
|
||||
<arguments>1.0-name-matches-false-false-semtest.c</arguments>
|
||||
</matcher>
|
||||
</filter>
|
||||
<filter>
|
||||
<id>0</id>
|
||||
<name>Full_Demo/Standard_Demo_Tasks</name>
|
||||
<type>5</type>
|
||||
<matcher>
|
||||
<id>org.eclipse.ui.ide.multiFilter</id>
|
||||
<arguments>1.0-name-matches-false-false-StaticAllocation.c</arguments>
|
||||
</matcher>
|
||||
</filter>
|
||||
<filter>
|
||||
<id>1455989277852</id>
|
||||
<name>FreeRTOS_Source/portable/GCC</name>
|
||||
<type>9</type>
|
||||
<matcher>
|
||||
<id>org.eclipse.ui.ide.multiFilter</id>
|
||||
<arguments>1.0-name-matches-false-false-ARM_CM3</arguments>
|
||||
</matcher>
|
||||
</filter>
|
||||
<filter>
|
||||
<id>1455989313240</id>
|
||||
<name>FreeRTOS_Source/portable/MemMang</name>
|
||||
<type>5</type>
|
||||
<matcher>
|
||||
<id>org.eclipse.ui.ide.multiFilter</id>
|
||||
<arguments>1.0-name-matches-false-false-heap_4.c</arguments>
|
||||
</matcher>
|
||||
</filter>
|
||||
</filteredResources>
|
||||
<variableList>
|
||||
<variable>
|
||||
<name>FREERTOS_ROOT</name>
|
||||
<value>$%7BPARENT-3-PROJECT_LOC%7D</value>
|
||||
</variable>
|
||||
</variableList>
|
||||
</projectDescription>
|
@ -0,0 +1,237 @@
|
||||
/*
|
||||
FreeRTOS V9.0.0rc1 - Copyright (C) 2016 Real Time Engineers Ltd.
|
||||
All rights reserved
|
||||
|
||||
VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION.
|
||||
|
||||
This file is part of the FreeRTOS distribution.
|
||||
|
||||
FreeRTOS is free software; you can redistribute it and/or modify it under
|
||||
the terms of the GNU General Public License (version 2) as published by the
|
||||
Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception.
|
||||
|
||||
***************************************************************************
|
||||
>>! NOTE: The modification to the GPL is included to allow you to !<<
|
||||
>>! distribute a combined work that includes FreeRTOS without being !<<
|
||||
>>! obliged to provide the source code for proprietary components !<<
|
||||
>>! outside of the FreeRTOS kernel. !<<
|
||||
***************************************************************************
|
||||
|
||||
FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY
|
||||
WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
|
||||
FOR A PARTICULAR PURPOSE. Full license text is available on the following
|
||||
link: http://www.freertos.org/a00114.html
|
||||
|
||||
***************************************************************************
|
||||
* *
|
||||
* FreeRTOS provides completely free yet professionally developed, *
|
||||
* robust, strictly quality controlled, supported, and cross *
|
||||
* platform software that is more than just the market leader, it *
|
||||
* is the industry's de facto standard. *
|
||||
* *
|
||||
* Help yourself get started quickly while simultaneously helping *
|
||||
* to support the FreeRTOS project by purchasing a FreeRTOS *
|
||||
* tutorial book, reference manual, or both: *
|
||||
* http://www.FreeRTOS.org/Documentation *
|
||||
* *
|
||||
***************************************************************************
|
||||
|
||||
http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading
|
||||
the FAQ page "My application does not run, what could be wrong?". Have you
|
||||
defined configASSERT()?
|
||||
|
||||
http://www.FreeRTOS.org/support - In return for receiving this top quality
|
||||
embedded software for free we request you assist our global community by
|
||||
participating in the support forum.
|
||||
|
||||
http://www.FreeRTOS.org/training - Investing in training allows your team to
|
||||
be as productive as possible as early as possible. Now you can receive
|
||||
FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers
|
||||
Ltd, and the world's leading authority on the world's leading RTOS.
|
||||
|
||||
http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products,
|
||||
including FreeRTOS+Trace - an indispensable productivity tool, a DOS
|
||||
compatible FAT file system, and our tiny thread aware UDP/IP stack.
|
||||
|
||||
http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate.
|
||||
Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS.
|
||||
|
||||
http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High
|
||||
Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS
|
||||
licenses offer ticketed support, indemnification and commercial middleware.
|
||||
|
||||
http://www.SafeRTOS.com - High Integrity Systems also provide a safety
|
||||
engineered and independently SIL3 certified version for use in safety and
|
||||
mission critical applications that require provable dependability.
|
||||
|
||||
1 tab == 4 spaces!
|
||||
*/
|
||||
|
||||
#ifndef FREERTOS_CONFIG_H
|
||||
#define FREERTOS_CONFIG_H
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#include "em_chip.h"
|
||||
#include "em_cmu.h"
|
||||
|
||||
/*-----------------------------------------------------------
|
||||
* Application specific definitions.
|
||||
*
|
||||
* These definitions should be adjusted for your particular hardware and
|
||||
* application requirements.
|
||||
*
|
||||
* THESE PARAMETERS ARE DESCRIBED WITHIN THE 'CONFIGURATION' SECTION OF THE
|
||||
* FreeRTOS API DOCUMENTATION AVAILABLE ON THE FreeRTOS.org WEB SITE.
|
||||
*
|
||||
* See http://www.freertos.org/a00110.html.
|
||||
*----------------------------------------------------------*/
|
||||
|
||||
|
||||
/* Set configCREATE_LOW_POWER_DEMO as follows:
|
||||
*
|
||||
* 0: Build the full test and demo application.
|
||||
* 1: Build the simple blinky tickless low power demo, generating the tick
|
||||
* interrupt from the RTCC. EM2 will be entered. The LXFO clock is used.
|
||||
* See the comments at the top of main.c, main_full.c and main_low_power.c for
|
||||
* more information.
|
||||
*/
|
||||
#define configCREATE_LOW_POWER_DEMO 1
|
||||
|
||||
/* Some configuration is dependent on the demo being built. */
|
||||
#if( configCREATE_LOW_POWER_DEMO == 0 )
|
||||
|
||||
/* Tickless mode is not used. */
|
||||
|
||||
/* Some of the standard demo test tasks assume a tick rate of 1KHz, even
|
||||
though that is faster than would normally be warranted by a real
|
||||
application. */
|
||||
#define configTICK_RATE_HZ ( 1000 )
|
||||
|
||||
/* The full demo always has tasks to run so the tick will never be turned
|
||||
off. The blinky demo will use the default tickless idle implementation to
|
||||
turn the tick off. */
|
||||
#define configUSE_TICKLESS_IDLE 0
|
||||
|
||||
/* Hook function related definitions. */
|
||||
#define configUSE_TICK_HOOK ( 1 )
|
||||
#define configCHECK_FOR_STACK_OVERFLOW ( 1 )
|
||||
#define configUSE_MALLOC_FAILED_HOOK ( 1 )
|
||||
#define configUSE_IDLE_HOOK ( 1 )
|
||||
|
||||
#define configENERGY_MODE ( sleepEM3 )
|
||||
|
||||
#else
|
||||
|
||||
/* Tickless idle mode, generating RTOS tick interrupts from the RTC, fed
|
||||
by the LXFO clock. */
|
||||
|
||||
/* The slow clock used to generate the tick interrupt in the low power demo
|
||||
runs at 32768/8=4096Hz. Ensure the tick rate is a multiple of the clock. */
|
||||
#define configTICK_RATE_HZ ( 128 )
|
||||
|
||||
/* The low power demo uses the tickless idle feature. */
|
||||
#define configUSE_TICKLESS_IDLE 1
|
||||
|
||||
/* Hook function related definitions. */
|
||||
#define configUSE_TICK_HOOK ( 0 )
|
||||
#define configCHECK_FOR_STACK_OVERFLOW ( 0 )
|
||||
#define configUSE_MALLOC_FAILED_HOOK ( 0 )
|
||||
#define configUSE_IDLE_HOOK ( 0 )
|
||||
|
||||
#endif
|
||||
|
||||
/* Main functions*/
|
||||
#define configUSE_PREEMPTION ( 1 )
|
||||
#define configUSE_PORT_OPTIMISED_TASK_SELECTION ( 1 )
|
||||
#define configSUPPORT_STATIC_ALLOCATION ( 1 )
|
||||
#define configCPU_CLOCK_HZ ( CMU_ClockFreqGet( cmuClock_CORE ) )
|
||||
#define configMAX_PRIORITIES ( 6 )
|
||||
#define configMINIMAL_STACK_SIZE (( unsigned short ) 130)
|
||||
#define configTOTAL_HEAP_SIZE (( size_t )(25000))
|
||||
#define configMAX_TASK_NAME_LEN ( 10 )
|
||||
#define configUSE_TRACE_FACILITY ( 0 )
|
||||
#define configUSE_16_BIT_TICKS ( 0 )
|
||||
#define configIDLE_SHOULD_YIELD ( 0 )
|
||||
#define configUSE_MUTEXES ( 1 )
|
||||
#define configUSE_RECURSIVE_MUTEXES ( 1 )
|
||||
#define configUSE_COUNTING_SEMAPHORES ( 1 )
|
||||
#define configUSE_ALTERNATIVE_API ( 0 )/* Deprecated! */
|
||||
#define configQUEUE_REGISTRY_SIZE ( 10 )
|
||||
#define configUSE_QUEUE_SETS ( 0 )
|
||||
|
||||
/* Run time stats gathering related definitions. */
|
||||
#define configGENERATE_RUN_TIME_STATS ( 0 )
|
||||
|
||||
/* Co-routine related definitions. */
|
||||
#define configUSE_CO_ROUTINES ( 0 )
|
||||
#define configMAX_CO_ROUTINE_PRIORITIES ( 1 )
|
||||
|
||||
/* Software timer related definitions. */
|
||||
#define configUSE_TIMERS ( 1 )
|
||||
#define configTIMER_TASK_PRIORITY ( configMAX_PRIORITIES - 1 ) /* Highest priority */
|
||||
#define configTIMER_QUEUE_LENGTH ( 10 )
|
||||
#define configTIMER_TASK_STACK_DEPTH ( configMINIMAL_STACK_SIZE )
|
||||
|
||||
/* Cortex-M specific definitions. */
|
||||
#ifdef __NVIC_PRIO_BITS
|
||||
/* __BVIC_PRIO_BITS will be specified when CMSIS is being used. */
|
||||
#define configPRIO_BITS __NVIC_PRIO_BITS
|
||||
#else
|
||||
#define configPRIO_BITS 3 /* 7 priority levels */
|
||||
#endif
|
||||
|
||||
/* The lowest interrupt priority that can be used in a call to a "set priority"
|
||||
function. */
|
||||
#define configLIBRARY_LOWEST_INTERRUPT_PRIORITY 0x07
|
||||
|
||||
/* The highest interrupt priority that can be used by any interrupt service
|
||||
routine that makes calls to interrupt safe FreeRTOS API functions. DO NOT CALL
|
||||
INTERRUPT SAFE FREERTOS API FUNCTIONS FROM ANY INTERRUPT THAT HAS A HIGHER
|
||||
PRIORITY THAN THIS! (higher priorities are lower numeric values. */
|
||||
#define configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY 0x05
|
||||
|
||||
/* Interrupt priorities used by the kernel port layer itself. These are generic
|
||||
to all Cortex-M ports, and do not rely on any particular library functions. */
|
||||
#define configKERNEL_INTERRUPT_PRIORITY ( configLIBRARY_LOWEST_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )
|
||||
/* !!!! configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to zero !!!!
|
||||
See http://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html. */
|
||||
#define configMAX_SYSCALL_INTERRUPT_PRIORITY ( configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )
|
||||
|
||||
|
||||
/* Optional functions - most linkers will remove unused functions anyway. */
|
||||
#define INCLUDE_vTaskPrioritySet ( 1 )
|
||||
#define INCLUDE_uxTaskPriorityGet ( 1 )
|
||||
#define INCLUDE_vTaskDelete ( 1 )
|
||||
#define INCLUDE_vTaskSuspend ( 1 )
|
||||
#define INCLUDE_xResumeFromISR ( 1 )
|
||||
#define INCLUDE_vTaskDelayUntil ( 1 )
|
||||
#define INCLUDE_vTaskDelay ( 1 )
|
||||
#define INCLUDE_xTaskGetSchedulerState ( 1 )
|
||||
#define INCLUDE_xTaskGetCurrentTaskHandle ( 1 )
|
||||
#define INCLUDE_uxTaskGetStackHighWaterMark ( 0 )
|
||||
#define INCLUDE_xTaskGetIdleTaskHandle ( 0 )
|
||||
#define INCLUDE_xTimerGetTimerDaemonTaskHandle ( 0 )
|
||||
#define INCLUDE_pcTaskGetTaskName ( 0 )
|
||||
#define INCLUDE_eTaskGetState ( 1 )
|
||||
#define INCLUDE_xTimerPendFunctionCall ( 1 )
|
||||
|
||||
/* Stop if an assertion fails. */
|
||||
#define configASSERT( x ) if( ( x ) == 0 ) { taskDISABLE_INTERRUPTS(); for( ;; ); }
|
||||
|
||||
/* Definitions that map the FreeRTOS port interrupt handlers to their CMSIS
|
||||
standard names. */
|
||||
#define vPortSVCHandler SVC_Handler
|
||||
#define xPortPendSVHandler PendSV_Handler
|
||||
#define xPortSysTickHandler SysTick_Handler
|
||||
|
||||
/* For the linker. */
|
||||
#define fabs __builtin_fabs
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
#endif /* FREERTOS_CONFIG_H */
|
||||
|
@ -0,0 +1,228 @@
|
||||
/*
|
||||
FreeRTOS V9.0.0rc1 - Copyright (C) 2016 Real Time Engineers Ltd.
|
||||
All rights reserved
|
||||
|
||||
VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION.
|
||||
|
||||
This file is part of the FreeRTOS distribution.
|
||||
|
||||
FreeRTOS is free software; you can redistribute it and/or modify it under
|
||||
the terms of the GNU General Public License (version 2) as published by the
|
||||
Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception.
|
||||
|
||||
***************************************************************************
|
||||
>>! NOTE: The modification to the GPL is included to allow you to !<<
|
||||
>>! distribute a combined work that includes FreeRTOS without being !<<
|
||||
>>! obliged to provide the source code for proprietary components !<<
|
||||
>>! outside of the FreeRTOS kernel. !<<
|
||||
***************************************************************************
|
||||
|
||||
FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY
|
||||
WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
|
||||
FOR A PARTICULAR PURPOSE. Full license text is available on the following
|
||||
link: http://www.freertos.org/a00114.html
|
||||
|
||||
***************************************************************************
|
||||
* *
|
||||
* FreeRTOS provides completely free yet professionally developed, *
|
||||
* robust, strictly quality controlled, supported, and cross *
|
||||
* platform software that is more than just the market leader, it *
|
||||
* is the industry's de facto standard. *
|
||||
* *
|
||||
* Help yourself get started quickly while simultaneously helping *
|
||||
* to support the FreeRTOS project by purchasing a FreeRTOS *
|
||||
* tutorial book, reference manual, or both: *
|
||||
* http://www.FreeRTOS.org/Documentation *
|
||||
* *
|
||||
***************************************************************************
|
||||
|
||||
http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading
|
||||
the FAQ page "My application does not run, what could be wrong?". Have you
|
||||
defined configASSERT()?
|
||||
|
||||
http://www.FreeRTOS.org/support - In return for receiving this top quality
|
||||
embedded software for free we request you assist our global community by
|
||||
participating in the support forum.
|
||||
|
||||
http://www.FreeRTOS.org/training - Investing in training allows your team to
|
||||
be as productive as possible as early as possible. Now you can receive
|
||||
FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers
|
||||
Ltd, and the world's leading authority on the world's leading RTOS.
|
||||
|
||||
http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products,
|
||||
including FreeRTOS+Trace - an indispensable productivity tool, a DOS
|
||||
compatible FAT file system, and our tiny thread aware UDP/IP stack.
|
||||
|
||||
http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate.
|
||||
Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS.
|
||||
|
||||
http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High
|
||||
Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS
|
||||
licenses offer ticketed support, indemnification and commercial middleware.
|
||||
|
||||
http://www.SafeRTOS.com - High Integrity Systems also provide a safety
|
||||
engineered and independently SIL3 certified version for use in safety and
|
||||
mission critical applications that require provable dependability.
|
||||
|
||||
1 tab == 4 spaces!
|
||||
*/
|
||||
|
||||
/*
|
||||
* "Reg test" tasks - These fill the registers with known values, then check
|
||||
* that each register maintains its expected value for the lifetime of the
|
||||
* task. Each task uses a different set of values. The reg test tasks execute
|
||||
* with a very low priority, so get preempted very frequently. A register
|
||||
* containing an unexpected value is indicative of an error in the context
|
||||
* switching mechanism.
|
||||
*/
|
||||
|
||||
void vRegTest1Implementation( void ) __attribute__ ((naked));
|
||||
void vRegTest2Implementation( void ) __attribute__ ((naked));
|
||||
|
||||
void vRegTest1Implementation( void )
|
||||
{
|
||||
__asm volatile
|
||||
(
|
||||
".extern ulRegTest1LoopCounter \n"
|
||||
"/* Fill the core registers with known values. */ \n"
|
||||
"mov r0, #100 \n"
|
||||
"mov r1, #101 \n"
|
||||
"mov r2, #102 \n"
|
||||
"mov r3, #103 \n"
|
||||
"mov r4, #104 \n"
|
||||
"mov r5, #105 \n"
|
||||
"mov r6, #106 \n"
|
||||
"mov r7, #107 \n"
|
||||
"mov r8, #108 \n"
|
||||
"mov r9, #109 \n"
|
||||
"mov r10, #110 \n"
|
||||
"mov r11, #111 \n"
|
||||
"mov r12, #112 \n"
|
||||
|
||||
"reg1_loop: \n"
|
||||
|
||||
"/* Check each register has maintained its expected value. */ \n"
|
||||
"cmp r0, #100 \n"
|
||||
"bne reg1_error_loop \n"
|
||||
"cmp r1, #101 \n"
|
||||
"bne reg1_error_loop \n"
|
||||
"cmp r2, #102 \n"
|
||||
"bne reg1_error_loop \n"
|
||||
"cmp r3, #103 \n"
|
||||
"bne reg1_error_loop \n"
|
||||
"cmp r4, #104 \n"
|
||||
"bne reg1_error_loop \n"
|
||||
"cmp r5, #105 \n"
|
||||
"bne reg1_error_loop \n"
|
||||
"cmp r6, #106 \n"
|
||||
"bne reg1_error_loop \n"
|
||||
"cmp r7, #107 \n"
|
||||
"bne reg1_error_loop \n"
|
||||
"cmp r8, #108 \n"
|
||||
"bne reg1_error_loop \n"
|
||||
"cmp r9, #109 \n"
|
||||
"bne reg1_error_loop \n"
|
||||
"cmp r10, #110 \n"
|
||||
"bne reg1_error_loop \n"
|
||||
"cmp r11, #111 \n"
|
||||
"bne reg1_error_loop \n"
|
||||
"cmp r12, #112 \n"
|
||||
"bne reg1_error_loop \n"
|
||||
|
||||
"/* Everything passed, increment the loop counter. */ \n"
|
||||
"push { r0-r1 } \n"
|
||||
"ldr r0, =ulRegTest1LoopCounter \n"
|
||||
"ldr r1, [r0] \n"
|
||||
"adds r1, r1, #1 \n"
|
||||
"str r1, [r0] \n"
|
||||
"pop { r0-r1 } \n"
|
||||
|
||||
"/* Start again. */ \n"
|
||||
"b reg1_loop \n"
|
||||
|
||||
"reg1_error_loop: \n"
|
||||
"/* If this line is hit then there was an error in a core register value. \n"
|
||||
"The loop ensures the loop counter stops incrementing. */ \n"
|
||||
"b reg1_error_loop \n"
|
||||
"nop "
|
||||
); /* __asm volatile. */
|
||||
}
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
void vRegTest2Implementation( void )
|
||||
{
|
||||
__asm volatile
|
||||
(
|
||||
".extern ulRegTest2LoopCounter \n"
|
||||
"/* Set all the core registers to known values. */ \n"
|
||||
"mov r0, #-1 \n"
|
||||
"mov r1, #1 \n"
|
||||
"mov r2, #2 \n"
|
||||
"mov r3, #3 \n"
|
||||
"mov r4, #4 \n"
|
||||
"mov r5, #5 \n"
|
||||
"mov r6, #6 \n"
|
||||
"mov r7, #7 \n"
|
||||
"mov r8, #8 \n"
|
||||
"mov r9, #9 \n"
|
||||
"mov r10, #10 \n"
|
||||
"mov r11, #11 \n"
|
||||
"mov r12, #12 \n"
|
||||
|
||||
"reg2_loop: \n"
|
||||
|
||||
"cmp r0, #-1 \n"
|
||||
"bne reg2_error_loop \n"
|
||||
"cmp r1, #1 \n"
|
||||
"bne reg2_error_loop \n"
|
||||
"cmp r2, #2 \n"
|
||||
"bne reg2_error_loop \n"
|
||||
"cmp r3, #3 \n"
|
||||
"bne reg2_error_loop \n"
|
||||
"cmp r4, #4 \n"
|
||||
"bne reg2_error_loop \n"
|
||||
"cmp r5, #5 \n"
|
||||
"bne reg2_error_loop \n"
|
||||
"cmp r6, #6 \n"
|
||||
"bne reg2_error_loop \n"
|
||||
"cmp r7, #7 \n"
|
||||
"bne reg2_error_loop \n"
|
||||
"cmp r8, #8 \n"
|
||||
"bne reg2_error_loop \n"
|
||||
"cmp r9, #9 \n"
|
||||
"bne reg2_error_loop \n"
|
||||
"cmp r10, #10 \n"
|
||||
"bne reg2_error_loop \n"
|
||||
"cmp r11, #11 \n"
|
||||
"bne reg2_error_loop \n"
|
||||
"cmp r12, #12 \n"
|
||||
"bne reg2_error_loop \n"
|
||||
|
||||
"/* Increment the loop counter to indicate this test is still functioning \n"
|
||||
"correctly. */ \n"
|
||||
"push { r0-r1 } \n"
|
||||
"ldr r0, =ulRegTest2LoopCounter \n"
|
||||
"ldr r1, [r0] \n"
|
||||
"adds r1, r1, #1 \n"
|
||||
"str r1, [r0] \n"
|
||||
|
||||
"/* Yield to increase test coverage. */ \n"
|
||||
"movs r0, #0x01 \n"
|
||||
"ldr r1, =0xe000ed04 /*NVIC_INT_CTRL */ \n"
|
||||
"lsl r0, r0, #28 /* Shift to PendSV bit */ \n"
|
||||
"str r0, [r1] \n"
|
||||
"dsb \n"
|
||||
|
||||
"pop { r0-r1 } \n"
|
||||
|
||||
"/* Start again. */ \n"
|
||||
"b reg2_loop \n"
|
||||
|
||||
"reg2_error_loop: \n"
|
||||
"/* If this line is hit then there was an error in a core register value. \n"
|
||||
"This loop ensures the loop counter variable stops incrementing. */ \n"
|
||||
"b reg2_error_loop \n"
|
||||
); /* __asm volatile */
|
||||
}
|
||||
/*-----------------------------------------------------------*/
|
||||
|
@ -0,0 +1,414 @@
|
||||
/*
|
||||
FreeRTOS V9.0.0rc1 - Copyright (C) 2016 Real Time Engineers Ltd.
|
||||
All rights reserved
|
||||
|
||||
VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION.
|
||||
|
||||
This file is part of the FreeRTOS distribution.
|
||||
|
||||
FreeRTOS is free software; you can redistribute it and/or modify it under
|
||||
the terms of the GNU General Public License (version 2) as published by the
|
||||
Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception.
|
||||
|
||||
***************************************************************************
|
||||
>>! NOTE: The modification to the GPL is included to allow you to !<<
|
||||
>>! distribute a combined work that includes FreeRTOS without being !<<
|
||||
>>! obliged to provide the source code for proprietary components !<<
|
||||
>>! outside of the FreeRTOS kernel. !<<
|
||||
***************************************************************************
|
||||
|
||||
FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY
|
||||
WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
|
||||
FOR A PARTICULAR PURPOSE. Full license text is available on the following
|
||||
link: http://www.freertos.org/a00114.html
|
||||
|
||||
***************************************************************************
|
||||
* *
|
||||
* FreeRTOS provides completely free yet professionally developed, *
|
||||
* robust, strictly quality controlled, supported, and cross *
|
||||
* platform software that is more than just the market leader, it *
|
||||
* is the industry's de facto standard. *
|
||||
* *
|
||||
* Help yourself get started quickly while simultaneously helping *
|
||||
* to support the FreeRTOS project by purchasing a FreeRTOS *
|
||||
* tutorial book, reference manual, or both: *
|
||||
* http://www.FreeRTOS.org/Documentation *
|
||||
* *
|
||||
***************************************************************************
|
||||
|
||||
http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading
|
||||
the FAQ page "My application does not run, what could be wrong?". Have you
|
||||
defined configASSERT()?
|
||||
|
||||
http://www.FreeRTOS.org/support - In return for receiving this top quality
|
||||
embedded software for free we request you assist our global community by
|
||||
participating in the support forum.
|
||||
|
||||
http://www.FreeRTOS.org/training - Investing in training allows your team to
|
||||
be as productive as possible as early as possible. Now you can receive
|
||||
FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers
|
||||
Ltd, and the world's leading authority on the world's leading RTOS.
|
||||
|
||||
http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products,
|
||||
including FreeRTOS+Trace - an indispensable productivity tool, a DOS
|
||||
compatible FAT file system, and our tiny thread aware UDP/IP stack.
|
||||
|
||||
http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate.
|
||||
Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS.
|
||||
|
||||
http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High
|
||||
Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS
|
||||
licenses offer ticketed support, indemnification and commercial middleware.
|
||||
|
||||
http://www.SafeRTOS.com - High Integrity Systems also provide a safety
|
||||
engineered and independently SIL3 certified version for use in safety and
|
||||
mission critical applications that require provable dependability.
|
||||
|
||||
1 tab == 4 spaces!
|
||||
*/
|
||||
|
||||
/******************************************************************************
|
||||
* NOTE 1: This project provides two demo applications. A simple blinky style
|
||||
* project that demonstrates the tickless low power features of FreeRTOS, and a
|
||||
* more comprehensive test and demo application. The configCREATE_LOW_POWER_DEMO
|
||||
* setting in FreeRTOSConifg.h is used to select between the two, and to select
|
||||
* the clock used when tickless mode is used. See the notes on using
|
||||
* conifgCREATE_LOW_POWER_DEMO in main.c. This file implements the
|
||||
* comprehensive test and demo version.
|
||||
*
|
||||
* NOTE 2: This file only contains the source code that is specific to the
|
||||
* full demo. Generic functions, such FreeRTOS hook functions, and functions
|
||||
* required to configure the hardware, are defined in main.c.
|
||||
*
|
||||
******************************************************************************
|
||||
*
|
||||
* main_full() creates all the demo application tasks and software timers, then
|
||||
* starts the scheduler. The web documentation provides more details of the
|
||||
* standard demo application tasks, which provide no particular functionality,
|
||||
* but do provide a good example of how to use the FreeRTOS API.
|
||||
*
|
||||
* In addition to the standard demo tasks, the following tasks and tests are
|
||||
* defined and/or created within this file:
|
||||
*
|
||||
* "Reg test" tasks - These fill both the core and floating point registers with
|
||||
* known values, then check that each register maintains its expected value for
|
||||
* the lifetime of the task. Each task uses a different set of values. The reg
|
||||
* test tasks execute with a very low priority, so get preempted very
|
||||
* frequently. A register containing an unexpected value is indicative of an
|
||||
* error in the context switching mechanism.
|
||||
*
|
||||
* "Check" task - The check task period is initially set to three seconds. The
|
||||
* task checks that all the standard demo tasks, and the register check tasks,
|
||||
* are not only still executing, but are executing without reporting any errors.
|
||||
* If the check task discovers that a task has either stalled, or reported an
|
||||
* error, then it changes its own execution period from the initial three
|
||||
* seconds, to just 200ms. The check task also toggles an LED each time it is
|
||||
* called. This provides a visual indication of the system status: If the LED
|
||||
* toggles every three seconds, then no issues have been discovered. If the LED
|
||||
* toggles every 200ms, then an issue has been discovered with at least one
|
||||
* task.
|
||||
*/
|
||||
|
||||
/* Standard includes. */
|
||||
#include <stdio.h>
|
||||
|
||||
/* Kernel includes. */
|
||||
#include "FreeRTOS.h"
|
||||
#include "task.h"
|
||||
#include "timers.h"
|
||||
#include "semphr.h"
|
||||
|
||||
/* SiLabs includes. */
|
||||
#include "bsp.h"
|
||||
|
||||
/* Standard demo application includes. */
|
||||
#include "flop.h"
|
||||
#include "semtest.h"
|
||||
#include "dynamic.h"
|
||||
#include "blocktim.h"
|
||||
#include "GenQTest.h"
|
||||
#include "recmutex.h"
|
||||
#include "TimerDemo.h"
|
||||
#include "EventGroupsDemo.h"
|
||||
#include "TaskNotify.h"
|
||||
#include "StaticAllocation.h"
|
||||
|
||||
/* Priorities for the demo application tasks. */
|
||||
#define mainSEM_TEST_PRIORITY ( tskIDLE_PRIORITY + 1UL )
|
||||
#define mainCREATOR_TASK_PRIORITY ( tskIDLE_PRIORITY + 3UL )
|
||||
#define mainFLOP_TASK_PRIORITY ( tskIDLE_PRIORITY )
|
||||
#define mainCHECK_TASK_PRIORITY ( configMAX_PRIORITIES - 1 )
|
||||
|
||||
/* A block time of zero simply means "don't block". */
|
||||
#define mainDONT_BLOCK ( 0UL )
|
||||
|
||||
/* The period after which the check timer will expire, in ms, provided no errors
|
||||
have been reported by any of the standard demo tasks. ms are converted to the
|
||||
equivalent in ticks using the portTICK_PERIOD_MS constant. */
|
||||
#define mainNO_ERROR_CHECK_TASK_PERIOD ( 3000UL / portTICK_PERIOD_MS )
|
||||
|
||||
/* The period at which the check timer will expire, in ms, if an error has been
|
||||
reported in one of the standard demo tasks. ms are converted to the equivalent
|
||||
in ticks using the portTICK_PERIOD_MS constant. */
|
||||
#define mainERROR_CHECK_TASK_PERIOD pdMS_TO_TICKS( 200UL )
|
||||
|
||||
/* Parameters that are passed into the register check tasks solely for the
|
||||
purpose of ensuring parameters are passed into tasks correctly. */
|
||||
#define mainREG_TEST_TASK_1_PARAMETER ( ( void * ) 0x12345678 )
|
||||
#define mainREG_TEST_TASK_2_PARAMETER ( ( void * ) 0x87654321 )
|
||||
|
||||
/* The base period used by the timer test tasks. */
|
||||
#define mainTIMER_TEST_PERIOD ( 50 )
|
||||
|
||||
/* The LED toggled by the check task. */
|
||||
#define mainTASK_LED ( 0 )
|
||||
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
/*
|
||||
* Called by main() to run the full demo (as opposed to the blinky demo) when
|
||||
* mainCREATE_LOW_POWER_DEMO is set to 0.
|
||||
*/
|
||||
void main_full( void );
|
||||
|
||||
/*
|
||||
* The check task, as described at the top of this file.
|
||||
*/
|
||||
static void prvCheckTask( void *pvParameters );
|
||||
|
||||
/*
|
||||
* Some of the tests and demo tasks executed by the full demo include
|
||||
* interaction from an interrupt - for which the tick interrupt is used via the
|
||||
* tick hook function.
|
||||
*/
|
||||
void vFullDemoTickHook( void );
|
||||
|
||||
/*
|
||||
* Register check tasks, and the tasks used to write over and check the contents
|
||||
* of the FPU registers, as described at the top of this file. The nature of
|
||||
* these files necessitates that they are written in an assembly file, but the
|
||||
* entry points are kept in the C file for the convenience of checking the task
|
||||
* parameter.
|
||||
*/
|
||||
static void prvRegTestTaskEntry1( void *pvParameters );
|
||||
extern void vRegTest1Implementation( void );
|
||||
static void prvRegTestTaskEntry2( void *pvParameters );
|
||||
extern void vRegTest2Implementation( void );
|
||||
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
/* The following two variables are used to communicate the status of the
|
||||
register check tasks to the check task. If the variables keep incrementing,
|
||||
then the register check tasks have not discovered any errors. If a variable
|
||||
stops incrementing, then an error has been found. */
|
||||
volatile unsigned long ulRegTest1LoopCounter = 0UL, ulRegTest2LoopCounter = 0UL;
|
||||
|
||||
/* The variable incremented in lieu of having a proper LED outout. */
|
||||
extern volatile uint32_t ulLED;
|
||||
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
void main_full( void )
|
||||
{
|
||||
/* Start all the other standard demo/test tasks. They have no particular
|
||||
functionality, but do demonstrate how to use the FreeRTOS API and test the
|
||||
kernel port. */
|
||||
vStartDynamicPriorityTasks();
|
||||
vCreateBlockTimeTasks();
|
||||
vStartGenericQueueTasks( tskIDLE_PRIORITY );
|
||||
vStartRecursiveMutexTasks();
|
||||
vStartSemaphoreTasks( mainSEM_TEST_PRIORITY );
|
||||
vStartMathTasks( mainFLOP_TASK_PRIORITY );
|
||||
vStartTimerDemoTask( mainTIMER_TEST_PERIOD );
|
||||
vStartEventGroupTasks();
|
||||
vStartTaskNotifyTask();
|
||||
vStartStaticallyAllocatedTasks();
|
||||
|
||||
/* Create the register check tasks, as described at the top of this file */
|
||||
xTaskCreate( prvRegTestTaskEntry1, "Reg1", configMINIMAL_STACK_SIZE, mainREG_TEST_TASK_1_PARAMETER, tskIDLE_PRIORITY, NULL );
|
||||
xTaskCreate( prvRegTestTaskEntry2, "Reg2", configMINIMAL_STACK_SIZE, mainREG_TEST_TASK_2_PARAMETER, tskIDLE_PRIORITY, NULL );
|
||||
|
||||
/* 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 );
|
||||
|
||||
/* Start the scheduler. */
|
||||
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 insufficient FreeRTOS heap memory available for the Idle and/or
|
||||
timer tasks to be created. See the memory management section on the
|
||||
FreeRTOS web site for more details on the FreeRTOS heap
|
||||
http://www.freertos.org/a00111.html. */
|
||||
for( ;; );
|
||||
}
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
static void prvCheckTask( void *pvParameters )
|
||||
{
|
||||
TickType_t xDelayPeriod = mainNO_ERROR_CHECK_TASK_PERIOD;
|
||||
TickType_t xLastExecutionTime;
|
||||
static unsigned long ulLastRegTest1Value = 0, ulLastRegTest2Value = 0;
|
||||
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.
|
||||
If an error is detected then the delay period is decreased from
|
||||
mainNO_ERROR_CHECK_TASK_PERIOD to mainERROR_CHECK_TASK_PERIOD. This has the
|
||||
effect of increasing the rate at which the onboard LED toggles, and in so
|
||||
doing gives visual feedback of the system status. */
|
||||
for( ;; )
|
||||
{
|
||||
/* Delay until it is time to execute again. */
|
||||
vTaskDelayUntil( &xLastExecutionTime, xDelayPeriod );
|
||||
|
||||
/* 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( xAreMathsTaskStillRunning() != pdTRUE )
|
||||
{
|
||||
ulErrorFound = 1UL << 1UL;
|
||||
}
|
||||
|
||||
if( xAreDynamicPriorityTasksStillRunning() != pdTRUE )
|
||||
{
|
||||
ulErrorFound = 1UL << 2UL;
|
||||
}
|
||||
|
||||
if( xAreStaticAllocationTasksStillRunning() != pdPASS )
|
||||
{
|
||||
ulErrorFound = 1UL << 3UL;
|
||||
}
|
||||
|
||||
if ( xAreBlockTimeTestTasksStillRunning() != pdTRUE )
|
||||
{
|
||||
ulErrorFound = 1UL << 4UL;
|
||||
}
|
||||
|
||||
if ( xAreGenericQueueTasksStillRunning() != pdTRUE )
|
||||
{
|
||||
ulErrorFound = 1UL << 5UL;
|
||||
}
|
||||
|
||||
if ( xAreRecursiveMutexTasksStillRunning() != pdTRUE )
|
||||
{
|
||||
ulErrorFound = 1UL << 6UL;
|
||||
}
|
||||
|
||||
if( xAreSemaphoreTasksStillRunning() != pdTRUE )
|
||||
{
|
||||
ulErrorFound = 1UL << 8UL;
|
||||
}
|
||||
|
||||
if( xAreTimerDemoTasksStillRunning( ( TickType_t ) xDelayPeriod ) != pdPASS )
|
||||
{
|
||||
ulErrorFound = 1UL << 9UL;
|
||||
}
|
||||
|
||||
if( xAreEventGroupTasksStillRunning() != pdPASS )
|
||||
{
|
||||
ulErrorFound = 1UL << 12UL;
|
||||
}
|
||||
|
||||
if( xAreTaskNotificationTasksStillRunning() != pdPASS )
|
||||
{
|
||||
ulErrorFound = 1UL << 14UL;
|
||||
}
|
||||
|
||||
/* Check that the register test 1 task is still running. */
|
||||
if( ulLastRegTest1Value == ulRegTest1LoopCounter )
|
||||
{
|
||||
ulErrorFound = 1UL << 15UL;
|
||||
}
|
||||
ulLastRegTest1Value = ulRegTest1LoopCounter;
|
||||
|
||||
/* Check that the register test 2 task is still running. */
|
||||
if( ulLastRegTest2Value == ulRegTest2LoopCounter )
|
||||
{
|
||||
ulErrorFound = 1UL << 16UL;
|
||||
}
|
||||
ulLastRegTest2Value = ulRegTest2LoopCounter;
|
||||
|
||||
/* Toggle the check LED to give an indication of the system status. If
|
||||
the LED toggles every mainNO_ERROR_CHECK_TASK_PERIOD milliseconds then
|
||||
everything is ok. A faster toggle indicates an error. */
|
||||
BSP_LedToggle( mainTASK_LED );
|
||||
|
||||
if( ulErrorFound != pdFALSE )
|
||||
{
|
||||
/* An error has been detected in one of the tasks - flash the LED
|
||||
at a higher frequency to give visible feedback that something has
|
||||
gone wrong. */
|
||||
xDelayPeriod = mainERROR_CHECK_TASK_PERIOD;
|
||||
}
|
||||
|
||||
configASSERT( ulErrorFound == pdFALSE );
|
||||
}
|
||||
}
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
static void prvRegTestTaskEntry1( void *pvParameters )
|
||||
{
|
||||
/* Although the regtest task is written in assembler, its entry point is
|
||||
written in C for convenience of checking the task parameter is being passed
|
||||
in correctly. */
|
||||
if( pvParameters == mainREG_TEST_TASK_1_PARAMETER )
|
||||
{
|
||||
/* Start the part of the test that is written in assembler. */
|
||||
vRegTest1Implementation();
|
||||
}
|
||||
|
||||
/* The following line will only execute if the task parameter is found to
|
||||
be incorrect. The check timer will detect that the regtest loop counter is
|
||||
not being incremented and flag an error. */
|
||||
vTaskDelete( NULL );
|
||||
}
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
static void prvRegTestTaskEntry2( void *pvParameters )
|
||||
{
|
||||
/* Although the regtest task is written in assembler, its entry point is
|
||||
written in C for convenience of checking the task parameter is being passed
|
||||
in correctly. */
|
||||
if( pvParameters == mainREG_TEST_TASK_2_PARAMETER )
|
||||
{
|
||||
/* Start the part of the test that is written in assembler. */
|
||||
vRegTest2Implementation();
|
||||
}
|
||||
|
||||
/* The following line will only execute if the task parameter is found to
|
||||
be incorrect. The check timer will detect that the regtest loop counter is
|
||||
not being incremented and flag an error. */
|
||||
vTaskDelete( NULL );
|
||||
}
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
void vFullDemoTickHook( void )
|
||||
{
|
||||
/* Some of the tests and demo tasks executed by the full demo include
|
||||
interaction from an interrupt - for which the tick interrupt is used via
|
||||
the tick hook function. */
|
||||
|
||||
/* The full demo includes a software timer demo/test that requires
|
||||
prodding periodically from the tick interrupt. */
|
||||
vTimerPeriodicISRTests();
|
||||
|
||||
/* Call the periodic event group from ISR demo. */
|
||||
vPeriodicEventGroupsProcessing();
|
||||
|
||||
/* Call the code that 'gives' a task notification from an ISR. */
|
||||
xNotifyTaskFromISR();
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -0,0 +1,382 @@
|
||||
/*
|
||||
FreeRTOS V9.0.0rc1 - Copyright (C) 2016 Real Time Engineers Ltd.
|
||||
All rights reserved
|
||||
|
||||
VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION.
|
||||
|
||||
This file is part of the FreeRTOS distribution.
|
||||
|
||||
FreeRTOS is free software; you can redistribute it and/or modify it under
|
||||
the terms of the GNU General Public License (version 2) as published by the
|
||||
Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception.
|
||||
|
||||
***************************************************************************
|
||||
>>! NOTE: The modification to the GPL is included to allow you to !<<
|
||||
>>! distribute a combined work that includes FreeRTOS without being !<<
|
||||
>>! obliged to provide the source code for proprietary components !<<
|
||||
>>! outside of the FreeRTOS kernel. !<<
|
||||
***************************************************************************
|
||||
|
||||
FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY
|
||||
WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
|
||||
FOR A PARTICULAR PURPOSE. Full license text is available on the following
|
||||
link: http://www.freertos.org/a00114.html
|
||||
|
||||
***************************************************************************
|
||||
* *
|
||||
* FreeRTOS provides completely free yet professionally developed, *
|
||||
* robust, strictly quality controlled, supported, and cross *
|
||||
* platform software that is more than just the market leader, it *
|
||||
* is the industry's de facto standard. *
|
||||
* *
|
||||
* Help yourself get started quickly while simultaneously helping *
|
||||
* to support the FreeRTOS project by purchasing a FreeRTOS *
|
||||
* tutorial book, reference manual, or both: *
|
||||
* http://www.FreeRTOS.org/Documentation *
|
||||
* *
|
||||
***************************************************************************
|
||||
|
||||
http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading
|
||||
the FAQ page "My application does not run, what could be wrong?". Have you
|
||||
defined configASSERT()?
|
||||
|
||||
http://www.FreeRTOS.org/support - In return for receiving this top quality
|
||||
embedded software for free we request you assist our global community by
|
||||
participating in the support forum.
|
||||
|
||||
http://www.FreeRTOS.org/training - Investing in training allows your team to
|
||||
be as productive as possible as early as possible. Now you can receive
|
||||
FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers
|
||||
Ltd, and the world's leading authority on the world's leading RTOS.
|
||||
|
||||
http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products,
|
||||
including FreeRTOS+Trace - an indispensable productivity tool, a DOS
|
||||
compatible FAT file system, and our tiny thread aware UDP/IP stack.
|
||||
|
||||
http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate.
|
||||
Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS.
|
||||
|
||||
http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High
|
||||
Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS
|
||||
licenses offer ticketed support, indemnification and commercial middleware.
|
||||
|
||||
http://www.SafeRTOS.com - High Integrity Systems also provide a safety
|
||||
engineered and independently SIL3 certified version for use in safety and
|
||||
mission critical applications that require provable dependability.
|
||||
|
||||
1 tab == 4 spaces!
|
||||
*/
|
||||
|
||||
/* Standard inlcludes. */
|
||||
#include <limits.h>
|
||||
|
||||
/* FreeRTOS includes. */
|
||||
#include "FreeRTOS.h"
|
||||
#include "task.h"
|
||||
|
||||
/* SiLabs library includes. */
|
||||
#include "em_cmu.h"
|
||||
#include "em_rtcc.h"
|
||||
#include "em_rmu.h"
|
||||
#include "em_int.h"
|
||||
#include "sleep.h"
|
||||
|
||||
/* SEE THE COMMENTS ABOVE THE DEFINITION OF configCREATE_LOW_POWER_DEMO IN
|
||||
FreeRTOSConfig.h
|
||||
This file contains functions that will override the default implementations
|
||||
in the RTOS port layer. Therefore only build this file if the low power demo
|
||||
is being built. */
|
||||
#if( configCREATE_LOW_POWER_DEMO == 1 )
|
||||
|
||||
/* The RTCC channel used to generate the tick interrupt. */
|
||||
#define lpRTCC_CHANNEL ( 1 )
|
||||
|
||||
/* 32768 clock divided by 1. Don't use a prescale if errata RTCC_E201
|
||||
applies. */
|
||||
#define mainTIMER_FREQUENCY_HZ ( 32768UL )
|
||||
|
||||
/*
|
||||
* The low power demo does not use the SysTick, so override the
|
||||
* vPortSetupTickInterrupt() function with an implementation that configures
|
||||
* a low power clock source. NOTE: This function name must not be changed as
|
||||
* it is called from the RTOS portable layer.
|
||||
*/
|
||||
void vPortSetupTimerInterrupt( void );
|
||||
|
||||
/*
|
||||
* Override the default definition of vPortSuppressTicksAndSleep() that is
|
||||
* weakly defined in the FreeRTOS Cortex-M port layer with a version that
|
||||
* manages the RTC clock, as the tick is generated from the low power RTC
|
||||
* and not the SysTick as would normally be the case on a Cortex-M.
|
||||
*/
|
||||
void vPortSuppressTicksAndSleep( TickType_t xExpectedIdleTime );
|
||||
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
/* Calculate how many clock increments make up a single tick period. */
|
||||
static const uint32_t ulReloadValueForOneTick = ( mainTIMER_FREQUENCY_HZ / configTICK_RATE_HZ );
|
||||
|
||||
/* Will hold the maximum number of ticks that can be suppressed. */
|
||||
static uint32_t xMaximumPossibleSuppressedTicks = 0;
|
||||
|
||||
/* Flag set from the tick interrupt to allow the sleep processing to know if
|
||||
sleep mode was exited because of a timer interrupt or a different interrupt. */
|
||||
static volatile uint32_t ulTickFlag = pdFALSE;
|
||||
|
||||
/* As the clock is only 32KHz, it is likely a value of 1 will be enough. */
|
||||
static const uint32_t ulStoppedTimerCompensation = 0UL;
|
||||
|
||||
/* RTCC configuration structures. */
|
||||
static const RTCC_Init_TypeDef xRTCInitStruct =
|
||||
{
|
||||
false, /* Don't start counting when init complete. */
|
||||
false, /* Disable counter during debug halt. */
|
||||
false, /* Don't care. */
|
||||
true, /* Enable counter wrap on ch. 1 CCV value. */
|
||||
rtccCntPresc_1, /* NOTE: Do not use a pre-scale if errata RTCC_E201 applies. */
|
||||
rtccCntTickPresc, /* Count using the clock input directly. */
|
||||
#if defined(_RTCC_CTRL_BUMODETSEN_MASK)
|
||||
false, /* Disable storing RTCC counter value in RTCC_CCV2 upon backup mode entry. */
|
||||
#endif
|
||||
false, /* Oscillator fail detection disabled. */
|
||||
rtccCntModeNormal, /* Use RTCC in normal mode (increment by 1 on each tick) and not in calendar mode. */
|
||||
false /* Don't care. */
|
||||
};
|
||||
|
||||
static const RTCC_CCChConf_TypeDef xRTCCChannel1InitStruct =
|
||||
{
|
||||
rtccCapComChModeCompare, /* Use Compare mode. */
|
||||
rtccCompMatchOutActionPulse,/* Don't care. */
|
||||
rtccPRSCh0, /* PRS not used. */
|
||||
rtccInEdgeNone, /* Capture Input not used. */
|
||||
rtccCompBaseCnt, /* Compare with Base CNT register. */
|
||||
0, /* Compare mask. */
|
||||
rtccDayCompareModeMonth /* Don't care. */
|
||||
};
|
||||
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
void vPortSetupTimerInterrupt( void )
|
||||
{
|
||||
/* Configure the RTCC to generate the RTOS tick interrupt. */
|
||||
|
||||
/* The maximum number of ticks that can be suppressed depends on the clock
|
||||
frequency. */
|
||||
xMaximumPossibleSuppressedTicks = ULONG_MAX / ulReloadValueForOneTick;
|
||||
|
||||
/* Ensure LE modules are accessible. */
|
||||
CMU_ClockEnable( cmuClock_CORELE, true );
|
||||
|
||||
/* Use LFXO. */
|
||||
CMU_ClockSelectSet( cmuClock_LFE, cmuSelect_LFXO );
|
||||
|
||||
/* Enable clock to the RTC module. */
|
||||
CMU_ClockEnable( cmuClock_RTCC, true );
|
||||
|
||||
/* Use channel 1 to generate the RTOS tick interrupt. */
|
||||
RTCC_ChannelCCVSet( lpRTCC_CHANNEL, ulReloadValueForOneTick );
|
||||
|
||||
RTCC_Init( &xRTCInitStruct );
|
||||
RTCC_ChannelInit( lpRTCC_CHANNEL, &xRTCCChannel1InitStruct );
|
||||
RTCC_EM4WakeupEnable( true );
|
||||
|
||||
/* Disable RTCC interrupt. */
|
||||
RTCC_IntDisable( _RTCC_IF_MASK );
|
||||
RTCC_IntClear( _RTCC_IF_MASK );
|
||||
RTCC->CNT = _RTCC_CNT_RESETVALUE;
|
||||
|
||||
/* The tick interrupt must be set to the lowest priority possible. */
|
||||
NVIC_SetPriority( RTCC_IRQn, configLIBRARY_LOWEST_INTERRUPT_PRIORITY );
|
||||
NVIC_ClearPendingIRQ( RTCC_IRQn );
|
||||
NVIC_EnableIRQ( RTCC_IRQn );
|
||||
RTCC_IntEnable( RTCC_IEN_CC1 );
|
||||
RTCC_Enable( true );
|
||||
}
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
void vPortSuppressTicksAndSleep( TickType_t xExpectedIdleTime )
|
||||
{
|
||||
uint32_t ulReloadValue, ulCompleteTickPeriods, ulCountBeforeSleep, ulCountAfterSleep;
|
||||
eSleepModeStatus eSleepAction;
|
||||
TickType_t xModifiableIdleTime;
|
||||
|
||||
/* THIS FUNCTION IS CALLED WITH THE SCHEDULER SUSPENDED. */
|
||||
|
||||
/* Make sure the RTC reload value does not overflow the counter. */
|
||||
if( xExpectedIdleTime > xMaximumPossibleSuppressedTicks )
|
||||
{
|
||||
xExpectedIdleTime = xMaximumPossibleSuppressedTicks;
|
||||
}
|
||||
|
||||
/* Calculate the reload value required to wait xExpectedIdleTime tick
|
||||
periods. */
|
||||
ulReloadValue = ulReloadValueForOneTick * xExpectedIdleTime;
|
||||
if( ulReloadValue > ulStoppedTimerCompensation )
|
||||
{
|
||||
/* Compensate for the fact that the RTC is going to be stopped
|
||||
momentarily. */
|
||||
ulReloadValue -= ulStoppedTimerCompensation;
|
||||
}
|
||||
|
||||
/* Stop the RTC momentarily. The time the RTC is stopped for is accounted
|
||||
for as best it can be, but using the tickless mode will inevitably result
|
||||
in some tiny drift of the time maintained by the kernel with respect to
|
||||
calendar time. The count is latched before stopping the timer as stopping
|
||||
the timer appears to clear the count. */
|
||||
ulCountBeforeSleep = RTCC_CounterGet();
|
||||
RTCC_Enable( false );
|
||||
|
||||
/* If this function is re-entered before one complete tick period then the
|
||||
reload value might be set to take into account a partial time slice, but
|
||||
just reading the count assumes it is counting up to a full ticks worth - so
|
||||
add in the difference if any. */
|
||||
ulCountBeforeSleep += ( ulReloadValueForOneTick - RTCC_ChannelCCVGet( lpRTCC_CHANNEL ) );
|
||||
|
||||
/* Enter a critical section but don't use the taskENTER_CRITICAL() method as
|
||||
that will mask interrupts that should exit sleep mode. */
|
||||
INT_Disable();
|
||||
__asm volatile( "dsb" );
|
||||
__asm volatile( "isb" );
|
||||
|
||||
/* The tick flag is set to false before sleeping. If it is true when sleep
|
||||
mode is exited then sleep mode was probably exited because the tick was
|
||||
suppressed for the entire xExpectedIdleTime period. */
|
||||
ulTickFlag = pdFALSE;
|
||||
|
||||
/* If a context switch is pending then abandon the low power entry as the
|
||||
context switch might have been pended by an external interrupt that requires
|
||||
processing. */
|
||||
eSleepAction = eTaskConfirmSleepModeStatus();
|
||||
if( eSleepAction == eAbortSleep )
|
||||
{
|
||||
/* Restart tick and count up to whatever was left of the current time
|
||||
slice. */
|
||||
RTCC_ChannelCCVSet( lpRTCC_CHANNEL, ( ulReloadValueForOneTick - ulCountBeforeSleep ) + ulStoppedTimerCompensation );
|
||||
RTCC_Enable( true );
|
||||
|
||||
/* Re-enable interrupts - see comments above the cpsid instruction()
|
||||
above. */
|
||||
INT_Enable();
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Adjust the reload value to take into account that the current time
|
||||
slice is already partially complete. */
|
||||
ulReloadValue -= ulCountBeforeSleep;
|
||||
RTCC_ChannelCCVSet( lpRTCC_CHANNEL, ulReloadValue );
|
||||
|
||||
/* Restart the RTC. */
|
||||
RTCC_Enable( true );
|
||||
|
||||
/* Allow the application to define some pre-sleep processing. */
|
||||
xModifiableIdleTime = xExpectedIdleTime;
|
||||
configPRE_SLEEP_PROCESSING( xModifiableIdleTime );
|
||||
|
||||
/* xExpectedIdleTime being set to 0 by configPRE_SLEEP_PROCESSING()
|
||||
means the application defined code has already executed the WAIT
|
||||
instruction. */
|
||||
if( xModifiableIdleTime > 0 )
|
||||
{
|
||||
__asm volatile( "dsb" );
|
||||
SLEEP_Sleep();
|
||||
__asm volatile( "isb" );
|
||||
}
|
||||
|
||||
/* Allow the application to define some post sleep processing. */
|
||||
configPOST_SLEEP_PROCESSING( xModifiableIdleTime );
|
||||
|
||||
/* Stop RTC. Again, the time the SysTick is stopped for is accounted
|
||||
for as best it can be, but using the tickless mode will inevitably
|
||||
result in some tiny drift of the time maintained by the kernel with
|
||||
respect to calendar time. The count value is latched before stopping
|
||||
the timer as stopping the timer appears to clear the count. */
|
||||
ulCountAfterSleep = RTCC_CounterGet();
|
||||
RTCC_Enable( false );
|
||||
|
||||
/* Re-enable interrupts - see comments above the cpsid instruction()
|
||||
above. */
|
||||
INT_Enable();
|
||||
__asm volatile( "dsb" );
|
||||
__asm volatile( "isb" );
|
||||
|
||||
if( ulTickFlag != pdFALSE )
|
||||
{
|
||||
/* The tick interrupt has already executed, although because this
|
||||
function is called with the scheduler suspended the actual tick
|
||||
processing will not occur until after this function has exited.
|
||||
Reset the reload value with whatever remains of this tick period. */
|
||||
ulReloadValue = ulReloadValueForOneTick - ulCountAfterSleep;
|
||||
RTCC_ChannelCCVSet( lpRTCC_CHANNEL, ulReloadValue );
|
||||
|
||||
/* The tick interrupt handler will already have pended the tick
|
||||
processing in the kernel. As the pending tick will be processed as
|
||||
soon as this function exits, the tick value maintained by the tick
|
||||
is stepped forward by one less than the time spent sleeping. The
|
||||
actual stepping of the tick appears later in this function. */
|
||||
ulCompleteTickPeriods = xExpectedIdleTime - 1UL;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Something other than the tick interrupt ended the sleep. How
|
||||
many complete tick periods passed while the processor was
|
||||
sleeping? Add back in the adjustment that was made to the reload
|
||||
value to account for the fact that a time slice was part way through
|
||||
when this function was called. */
|
||||
ulCountAfterSleep += ulCountBeforeSleep;
|
||||
ulCompleteTickPeriods = ulCountAfterSleep / ulReloadValueForOneTick;
|
||||
|
||||
/* The reload value is set to whatever fraction of a single tick
|
||||
period remains. */
|
||||
ulCountAfterSleep -= ( ulCompleteTickPeriods * ulReloadValueForOneTick );
|
||||
ulReloadValue = ulReloadValueForOneTick - ulCountAfterSleep;
|
||||
|
||||
if( ulReloadValue == 0 )
|
||||
{
|
||||
/* There is no fraction remaining. */
|
||||
ulReloadValue = ulReloadValueForOneTick;
|
||||
ulCompleteTickPeriods++;
|
||||
}
|
||||
|
||||
RTCC_ChannelCCVSet( lpRTCC_CHANNEL, ulReloadValue );
|
||||
}
|
||||
|
||||
/* Restart the RTC so it runs up to the alarm value. The alarm value
|
||||
will get set to the value required to generate exactly one tick period
|
||||
the next time the RTC interrupt executes. */
|
||||
RTCC_Enable( true );
|
||||
|
||||
/* Wind the tick forward by the number of tick periods that the CPU
|
||||
remained in a low power state. */
|
||||
vTaskStepTick( ulCompleteTickPeriods );
|
||||
}
|
||||
}
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
void RTCC_IRQHandler( void )
|
||||
{
|
||||
ulTickFlag = pdTRUE;
|
||||
|
||||
if( RTCC_ChannelCCVGet( lpRTCC_CHANNEL ) != ulReloadValueForOneTick )
|
||||
{
|
||||
/* Set RTC interrupt to one RTOS tick period. */
|
||||
RTCC_Enable( false );
|
||||
RTCC_ChannelCCVSet( lpRTCC_CHANNEL, ulReloadValueForOneTick );
|
||||
RTCC_Enable( true );
|
||||
}
|
||||
|
||||
RTCC_IntClear( _RTCC_IF_MASK );
|
||||
|
||||
/* Critical section which protect incrementing the tick*/
|
||||
portDISABLE_INTERRUPTS();
|
||||
{
|
||||
if( xTaskIncrementTick() != pdFALSE )
|
||||
{
|
||||
/* Pend a context switch. */
|
||||
portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT;
|
||||
}
|
||||
}
|
||||
portENABLE_INTERRUPTS();
|
||||
}
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
#endif /* ( configCREATE_LOW_POWER_DEMO == 1 ) */
|
@ -0,0 +1,236 @@
|
||||
/*
|
||||
FreeRTOS V9.0.0rc1 - Copyright (C) 2016 Real Time Engineers Ltd.
|
||||
All rights reserved
|
||||
|
||||
VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION.
|
||||
|
||||
This file is part of the FreeRTOS distribution.
|
||||
|
||||
FreeRTOS is free software; you can redistribute it and/or modify it under
|
||||
the terms of the GNU General Public License (version 2) as published by the
|
||||
Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception.
|
||||
|
||||
***************************************************************************
|
||||
>>! NOTE: The modification to the GPL is included to allow you to !<<
|
||||
>>! distribute a combined work that includes FreeRTOS without being !<<
|
||||
>>! obliged to provide the source code for proprietary components !<<
|
||||
>>! outside of the FreeRTOS kernel. !<<
|
||||
***************************************************************************
|
||||
|
||||
FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY
|
||||
WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
|
||||
FOR A PARTICULAR PURPOSE. Full license text is available on the following
|
||||
link: http://www.freertos.org/a00114.html
|
||||
|
||||
***************************************************************************
|
||||
* *
|
||||
* FreeRTOS provides completely free yet professionally developed, *
|
||||
* robust, strictly quality controlled, supported, and cross *
|
||||
* platform software that is more than just the market leader, it *
|
||||
* is the industry's de facto standard. *
|
||||
* *
|
||||
* Help yourself get started quickly while simultaneously helping *
|
||||
* to support the FreeRTOS project by purchasing a FreeRTOS *
|
||||
* tutorial book, reference manual, or both: *
|
||||
* http://www.FreeRTOS.org/Documentation *
|
||||
* *
|
||||
***************************************************************************
|
||||
|
||||
http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading
|
||||
the FAQ page "My application does not run, what could be wrong?". Have you
|
||||
defined configASSERT()?
|
||||
|
||||
http://www.FreeRTOS.org/support - In return for receiving this top quality
|
||||
embedded software for free we request you assist our global community by
|
||||
participating in the support forum.
|
||||
|
||||
http://www.FreeRTOS.org/training - Investing in training allows your team to
|
||||
be as productive as possible as early as possible. Now you can receive
|
||||
FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers
|
||||
Ltd, and the world's leading authority on the world's leading RTOS.
|
||||
|
||||
http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products,
|
||||
including FreeRTOS+Trace - an indispensable productivity tool, a DOS
|
||||
compatible FAT file system, and our tiny thread aware UDP/IP stack.
|
||||
|
||||
http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate.
|
||||
Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS.
|
||||
|
||||
http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High
|
||||
Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS
|
||||
licenses offer ticketed support, indemnification and commercial middleware.
|
||||
|
||||
http://www.SafeRTOS.com - High Integrity Systems also provide a safety
|
||||
engineered and independently SIL3 certified version for use in safety and
|
||||
mission critical applications that require provable dependability.
|
||||
|
||||
1 tab == 4 spaces!
|
||||
*/
|
||||
|
||||
/******************************************************************************
|
||||
* NOTE 1: This project provides two demo applications. A simple blinky demo
|
||||
* that demonstrates tickless low power operation, and a more comprehensive
|
||||
* test and demo application. The configCREATE_LOW_POWER_DEMO setting in
|
||||
* FreeRTOSConfig.h is used to select between the two, and to select the clock
|
||||
* used when tickless low power operation is demonstrated. See the notes on
|
||||
* using configCREATE_LOW_POWER_DEMO in main.c. This file implements the low
|
||||
* power version.
|
||||
*
|
||||
* NOTE 2: This file only contains the source code that is specific to the
|
||||
* low power demo. Generic functions, such FreeRTOS hook functions, and
|
||||
* functions required to configure the hardware are defined in main.c.
|
||||
******************************************************************************
|
||||
*
|
||||
* main_low_power() 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. It sends the value 100 to the queue every second.
|
||||
*
|
||||
* The Queue Receive Task:
|
||||
* The queue receive task is implemented by the prvQueueReceiveTask() function
|
||||
* in this file. prvQueueReceiveTask() blocks on the queue, blipping (quickly
|
||||
* turn on then off again) the LED each time it received the value 100 from the
|
||||
* queue send task. The queue send task writes to the queue every second, so
|
||||
* the LED will blip once a second.
|
||||
*
|
||||
* The RTOS tick is turned off when the queue send task and queue receive task
|
||||
* are both in the Blocked state.
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
/* Kernel includes. */
|
||||
#include "FreeRTOS.h"
|
||||
#include "task.h"
|
||||
#include "semphr.h"
|
||||
|
||||
/* SiLabs includes. */
|
||||
#include "bsp.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 pdMS_TO_TICKS( 1000 )
|
||||
|
||||
/* 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 LED toggled by the Rx task. */
|
||||
#define mainTASK_LED ( 0 )
|
||||
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
/*
|
||||
* Called by main when mainCREATE_LOW_POWER_DEMO is set to 1 in
|
||||
* main.c.
|
||||
*/
|
||||
void main_low_power( void );
|
||||
|
||||
/*
|
||||
* 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_low_power( 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 insufficient FreeRTOS heap memory available for the Idle and/or
|
||||
timer tasks to be created. See the memory management section on the
|
||||
FreeRTOS web site for more details on the FreeRTOS heap
|
||||
http://www.freertos.org/a00111.html. */
|
||||
for( ;; );
|
||||
}
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
static void prvQueueSendTask( void *pvParameters )
|
||||
{
|
||||
TickType_t xNextWakeTime;
|
||||
const uint32_t 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 )
|
||||
{
|
||||
uint32_t ulReceivedValue;
|
||||
const uint32_t ulExpectedValue = 100UL;
|
||||
const TickType_t xShortDelay = pdMS_TO_TICKS( 10 );
|
||||
|
||||
/* 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 )
|
||||
{
|
||||
/* Turn the LED on for a brief time only so it doens't distort the
|
||||
energy reading. */
|
||||
BSP_LedSet( mainTASK_LED );
|
||||
vTaskDelay( xShortDelay );
|
||||
BSP_LedClear( mainTASK_LED );
|
||||
ulReceivedValue = 0U;
|
||||
}
|
||||
}
|
||||
}
|
||||
/*-----------------------------------------------------------*/
|
||||
|
@ -0,0 +1,117 @@
|
||||
/***************************************************************************//**
|
||||
* @file
|
||||
* @brief Board support package API for GPIO leds on STK's.
|
||||
* @version 4.2.1
|
||||
*******************************************************************************
|
||||
* @section License
|
||||
* <b>(C) Copyright 2014 Silicon Labs, http://www.silabs.com</b>
|
||||
*******************************************************************************
|
||||
*
|
||||
* This file is licensed under the Silabs License Agreement. See the file
|
||||
* "Silabs_License_Agreement.txt" for details. Before using this software for
|
||||
* any purpose, you must agree to the terms of that agreement.
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
|
||||
|
||||
#include "em_device.h"
|
||||
#include "em_cmu.h"
|
||||
#include "em_gpio.h"
|
||||
#include "bsp.h"
|
||||
|
||||
#if defined( BSP_GPIO_LEDS )
|
||||
/** @cond DO_NOT_INCLUDE_WITH_DOXYGEN */
|
||||
|
||||
typedef struct
|
||||
{
|
||||
GPIO_Port_TypeDef port;
|
||||
unsigned int pin;
|
||||
} tLedArray;
|
||||
|
||||
static const tLedArray ledArray[ BSP_NO_OF_LEDS ] = BSP_GPIO_LEDARRAY_INIT;
|
||||
|
||||
int BSP_LedsInit(void)
|
||||
{
|
||||
int i;
|
||||
|
||||
CMU_ClockEnable(cmuClock_HFPER, true);
|
||||
CMU_ClockEnable(cmuClock_GPIO, true);
|
||||
for ( i=0; i<BSP_NO_OF_LEDS; i++ )
|
||||
{
|
||||
GPIO_PinModeSet(ledArray[i].port, ledArray[i].pin, gpioModePushPull, 0);
|
||||
}
|
||||
return BSP_STATUS_OK;
|
||||
}
|
||||
|
||||
uint32_t BSP_LedsGet(void)
|
||||
{
|
||||
int i;
|
||||
uint32_t retVal, mask;
|
||||
|
||||
for ( i=0, retVal=0, mask=0x1; i<BSP_NO_OF_LEDS; i++, mask <<= 1 )
|
||||
{
|
||||
if (GPIO_PinOutGet(ledArray[i].port, ledArray[i].pin))
|
||||
retVal |= mask;
|
||||
}
|
||||
return retVal;
|
||||
}
|
||||
|
||||
int BSP_LedsSet(uint32_t leds)
|
||||
{
|
||||
int i;
|
||||
uint32_t mask;
|
||||
|
||||
for ( i=0, mask=0x1; i<BSP_NO_OF_LEDS; i++, mask <<= 1 )
|
||||
{
|
||||
if ( leds & mask )
|
||||
GPIO_PinOutSet(ledArray[i].port, ledArray[i].pin);
|
||||
else
|
||||
GPIO_PinOutClear(ledArray[i].port, ledArray[i].pin);
|
||||
}
|
||||
return BSP_STATUS_OK;
|
||||
}
|
||||
|
||||
int BSP_LedClear(int ledNo)
|
||||
{
|
||||
if ((ledNo >= 0) && (ledNo < BSP_NO_OF_LEDS))
|
||||
{
|
||||
GPIO_PinOutClear(ledArray[ledNo].port, ledArray[ledNo].pin);
|
||||
return BSP_STATUS_OK;
|
||||
}
|
||||
return BSP_STATUS_ILLEGAL_PARAM;
|
||||
}
|
||||
|
||||
int BSP_LedGet(int ledNo)
|
||||
{
|
||||
int retVal = BSP_STATUS_ILLEGAL_PARAM;
|
||||
|
||||
if ((ledNo >= 0) && (ledNo < BSP_NO_OF_LEDS))
|
||||
{
|
||||
retVal = (int)GPIO_PinOutGet(ledArray[ledNo].port, ledArray[ledNo].pin);
|
||||
}
|
||||
return retVal;
|
||||
}
|
||||
|
||||
int BSP_LedSet(int ledNo)
|
||||
{
|
||||
if ((ledNo >= 0) && (ledNo < BSP_NO_OF_LEDS))
|
||||
{
|
||||
GPIO_PinOutSet(ledArray[ledNo].port, ledArray[ledNo].pin);
|
||||
return BSP_STATUS_OK;
|
||||
}
|
||||
return BSP_STATUS_ILLEGAL_PARAM;
|
||||
}
|
||||
|
||||
int BSP_LedToggle(int ledNo)
|
||||
{
|
||||
if ((ledNo >= 0) && (ledNo < BSP_NO_OF_LEDS))
|
||||
{
|
||||
GPIO_PinOutToggle(ledArray[ledNo].port, ledArray[ledNo].pin);
|
||||
return BSP_STATUS_OK;
|
||||
}
|
||||
return BSP_STATUS_ILLEGAL_PARAM;
|
||||
}
|
||||
|
||||
/** @endcond */
|
||||
#endif /* BSP_GPIO_LEDS */
|
@ -0,0 +1,317 @@
|
||||
/* @file startup_efm32pg1b.S
|
||||
* @brief startup file for Silicon Labs EFM32PG1B devices.
|
||||
* For use with GCC for ARM Embedded Processors
|
||||
* @version 4.2.1
|
||||
* Date: 12 June 2014
|
||||
*
|
||||
*/
|
||||
/* Copyright (c) 2011 - 2014 ARM LIMITED
|
||||
|
||||
All rights reserved.
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are met:
|
||||
- Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
- Redistributions in binary form must reproduce the above copyright
|
||||
notice, this list of conditions and the following disclaimer in the
|
||||
documentation and/or other materials provided with the distribution.
|
||||
- Neither the name of ARM nor the names of its contributors may be used
|
||||
to endorse or promote products derived from this software without
|
||||
specific prior written permission.
|
||||
*
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE
|
||||
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
POSSIBILITY OF SUCH DAMAGE.
|
||||
---------------------------------------------------------------------------*/
|
||||
|
||||
.syntax unified
|
||||
.arch armv7-m
|
||||
.section .stack
|
||||
.align 3
|
||||
#ifdef __STACK_SIZE
|
||||
.equ Stack_Size, __STACK_SIZE
|
||||
#else
|
||||
.equ Stack_Size, 0x00000400
|
||||
#endif
|
||||
.globl __StackTop
|
||||
.globl __StackLimit
|
||||
__StackLimit:
|
||||
.space Stack_Size
|
||||
.size __StackLimit, . - __StackLimit
|
||||
__StackTop:
|
||||
.size __StackTop, . - __StackTop
|
||||
|
||||
.section .heap
|
||||
.align 3
|
||||
#ifdef __HEAP_SIZE
|
||||
.equ Heap_Size, __HEAP_SIZE
|
||||
#else
|
||||
.equ Heap_Size, 0x00000C00
|
||||
#endif
|
||||
.globl __HeapBase
|
||||
.globl __HeapLimit
|
||||
__HeapBase:
|
||||
.if Heap_Size
|
||||
.space Heap_Size
|
||||
.endif
|
||||
.size __HeapBase, . - __HeapBase
|
||||
__HeapLimit:
|
||||
.size __HeapLimit, . - __HeapLimit
|
||||
|
||||
.section .vectors
|
||||
.align 2
|
||||
.globl __Vectors
|
||||
__Vectors:
|
||||
.long __StackTop /* Top of Stack */
|
||||
.long Reset_Handler /* Reset Handler */
|
||||
.long NMI_Handler /* NMI Handler */
|
||||
.long HardFault_Handler /* Hard Fault Handler */
|
||||
.long MemManage_Handler /* MPU Fault Handler */
|
||||
.long BusFault_Handler /* Bus Fault Handler */
|
||||
.long UsageFault_Handler /* Usage Fault Handler */
|
||||
.long Default_Handler /* Reserved */
|
||||
.long Default_Handler /* Reserved */
|
||||
.long Default_Handler /* Reserved */
|
||||
.long Default_Handler /* Reserved */
|
||||
.long SVC_Handler /* SVCall Handler */
|
||||
.long DebugMon_Handler /* Debug Monitor Handler */
|
||||
.long Default_Handler /* Reserved */
|
||||
.long PendSV_Handler /* PendSV Handler */
|
||||
.long SysTick_Handler /* SysTick Handler */
|
||||
|
||||
/* External interrupts */
|
||||
.long EMU_IRQHandler /* 0 - EMU */
|
||||
.long Default_Handler /* 1 - Reserved */
|
||||
.long WDOG0_IRQHandler /* 2 - WDOG0 */
|
||||
.long Default_Handler /* 3 - Reserved */
|
||||
.long Default_Handler /* 4 - Reserved */
|
||||
.long Default_Handler /* 5 - Reserved */
|
||||
.long Default_Handler /* 6 - Reserved */
|
||||
.long Default_Handler /* 7 - Reserved */
|
||||
.long LDMA_IRQHandler /* 8 - LDMA */
|
||||
.long GPIO_EVEN_IRQHandler /* 9 - GPIO_EVEN */
|
||||
.long TIMER0_IRQHandler /* 10 - TIMER0 */
|
||||
.long USART0_RX_IRQHandler /* 11 - USART0_RX */
|
||||
.long USART0_TX_IRQHandler /* 12 - USART0_TX */
|
||||
.long ACMP0_IRQHandler /* 13 - ACMP0 */
|
||||
.long ADC0_IRQHandler /* 14 - ADC0 */
|
||||
.long IDAC0_IRQHandler /* 15 - IDAC0 */
|
||||
.long I2C0_IRQHandler /* 16 - I2C0 */
|
||||
.long GPIO_ODD_IRQHandler /* 17 - GPIO_ODD */
|
||||
.long TIMER1_IRQHandler /* 18 - TIMER1 */
|
||||
.long USART1_RX_IRQHandler /* 19 - USART1_RX */
|
||||
.long USART1_TX_IRQHandler /* 20 - USART1_TX */
|
||||
.long LEUART0_IRQHandler /* 21 - LEUART0 */
|
||||
.long PCNT0_IRQHandler /* 22 - PCNT0 */
|
||||
.long CMU_IRQHandler /* 23 - CMU */
|
||||
.long MSC_IRQHandler /* 24 - MSC */
|
||||
.long CRYPTO_IRQHandler /* 25 - CRYPTO */
|
||||
.long LETIMER0_IRQHandler /* 26 - LETIMER0 */
|
||||
.long Default_Handler /* 27 - Reserved */
|
||||
.long Default_Handler /* 28 - Reserved */
|
||||
.long RTCC_IRQHandler /* 29 - RTCC */
|
||||
.long Default_Handler /* 30 - Reserved */
|
||||
.long CRYOTIMER_IRQHandler /* 31 - CRYOTIMER */
|
||||
.long Default_Handler /* 32 - Reserved */
|
||||
.long FPUEH_IRQHandler /* 33 - FPUEH */
|
||||
|
||||
|
||||
.size __Vectors, . - __Vectors
|
||||
|
||||
.text
|
||||
.thumb
|
||||
.thumb_func
|
||||
.align 2
|
||||
.globl Reset_Handler
|
||||
.type Reset_Handler, %function
|
||||
Reset_Handler:
|
||||
#ifndef __NO_SYSTEM_INIT
|
||||
ldr r0, =SystemInit
|
||||
blx r0
|
||||
#endif
|
||||
|
||||
/* Firstly it copies data from read only memory to RAM. There are two schemes
|
||||
* to copy. One can copy more than one sections. Another can only copy
|
||||
* one section. The former scheme needs more instructions and read-only
|
||||
* data to implement than the latter.
|
||||
* Macro __STARTUP_COPY_MULTIPLE is used to choose between two schemes. */
|
||||
|
||||
#ifdef __STARTUP_COPY_MULTIPLE
|
||||
/* Multiple sections scheme.
|
||||
*
|
||||
* Between symbol address __copy_table_start__ and __copy_table_end__,
|
||||
* there are array of triplets, each of which specify:
|
||||
* offset 0: LMA of start of a section to copy from
|
||||
* offset 4: VMA of start of a section to copy to
|
||||
* offset 8: size of the section to copy. Must be multiply of 4
|
||||
*
|
||||
* All addresses must be aligned to 4 bytes boundary.
|
||||
*/
|
||||
ldr r4, =__copy_table_start__
|
||||
ldr r5, =__copy_table_end__
|
||||
|
||||
.L_loop0:
|
||||
cmp r4, r5
|
||||
bge .L_loop0_done
|
||||
ldr r1, [r4]
|
||||
ldr r2, [r4, #4]
|
||||
ldr r3, [r4, #8]
|
||||
|
||||
.L_loop0_0:
|
||||
subs r3, #4
|
||||
ittt ge
|
||||
ldrge r0, [r1, r3]
|
||||
strge r0, [r2, r3]
|
||||
bge .L_loop0_0
|
||||
|
||||
adds r4, #12
|
||||
b .L_loop0
|
||||
|
||||
.L_loop0_done:
|
||||
#else
|
||||
/* Single section scheme.
|
||||
*
|
||||
* The ranges of copy from/to are specified by following symbols
|
||||
* __etext: LMA of start of the section to copy from. Usually end of text
|
||||
* __data_start__: VMA of start of the section to copy to
|
||||
* __data_end__: VMA of end of the section to copy to
|
||||
*
|
||||
* All addresses must be aligned to 4 bytes boundary.
|
||||
*/
|
||||
ldr r1, =__etext
|
||||
ldr r2, =__data_start__
|
||||
ldr r3, =__data_end__
|
||||
|
||||
.L_loop1:
|
||||
cmp r2, r3
|
||||
ittt lt
|
||||
ldrlt r0, [r1], #4
|
||||
strlt r0, [r2], #4
|
||||
blt .L_loop1
|
||||
#endif /*__STARTUP_COPY_MULTIPLE */
|
||||
|
||||
/* This part of work usually is done in C library startup code. Otherwise,
|
||||
* define this macro to enable it in this startup.
|
||||
*
|
||||
* There are two schemes too. One can clear multiple BSS sections. Another
|
||||
* can only clear one section. The former is more size expensive than the
|
||||
* latter.
|
||||
*
|
||||
* Define macro __STARTUP_CLEAR_BSS_MULTIPLE to choose the former.
|
||||
* Otherwise efine macro __STARTUP_CLEAR_BSS to choose the later.
|
||||
*/
|
||||
#ifdef __STARTUP_CLEAR_BSS_MULTIPLE
|
||||
/* Multiple sections scheme.
|
||||
*
|
||||
* Between symbol address __copy_table_start__ and __copy_table_end__,
|
||||
* there are array of tuples specifying:
|
||||
* offset 0: Start of a BSS section
|
||||
* offset 4: Size of this BSS section. Must be multiply of 4
|
||||
*/
|
||||
ldr r3, =__zero_table_start__
|
||||
ldr r4, =__zero_table_end__
|
||||
|
||||
.L_loop2:
|
||||
cmp r3, r4
|
||||
bge .L_loop2_done
|
||||
ldr r1, [r3]
|
||||
ldr r2, [r3, #4]
|
||||
movs r0, 0
|
||||
|
||||
.L_loop2_0:
|
||||
subs r2, #4
|
||||
itt ge
|
||||
strge r0, [r1, r2]
|
||||
bge .L_loop2_0
|
||||
adds r3, #8
|
||||
b .L_loop2
|
||||
.L_loop2_done:
|
||||
#elif defined (__STARTUP_CLEAR_BSS)
|
||||
/* Single BSS section scheme.
|
||||
*
|
||||
* The BSS section is specified by following symbols
|
||||
* __bss_start__: start of the BSS section.
|
||||
* __bss_end__: end of the BSS section.
|
||||
*
|
||||
* Both addresses must be aligned to 4 bytes boundary.
|
||||
*/
|
||||
ldr r1, =__bss_start__
|
||||
ldr r2, =__bss_end__
|
||||
|
||||
movs r0, 0
|
||||
.L_loop3:
|
||||
cmp r1, r2
|
||||
itt lt
|
||||
strlt r0, [r1], #4
|
||||
blt .L_loop3
|
||||
#endif /* __STARTUP_CLEAR_BSS_MULTIPLE || __STARTUP_CLEAR_BSS */
|
||||
|
||||
#ifndef __START
|
||||
#define __START _start
|
||||
#endif
|
||||
bl __START
|
||||
|
||||
.pool
|
||||
.size Reset_Handler, . - Reset_Handler
|
||||
|
||||
.align 1
|
||||
.thumb_func
|
||||
.weak Default_Handler
|
||||
.type Default_Handler, %function
|
||||
Default_Handler:
|
||||
b .
|
||||
.size Default_Handler, . - Default_Handler
|
||||
|
||||
/* Macro to define default handlers. Default handler
|
||||
* will be weak symbol and just dead loops. They can be
|
||||
* overwritten by other handlers */
|
||||
.macro def_irq_handler handler_name
|
||||
.weak \handler_name
|
||||
.set \handler_name, Default_Handler
|
||||
.endm
|
||||
|
||||
def_irq_handler NMI_Handler
|
||||
def_irq_handler HardFault_Handler
|
||||
def_irq_handler MemManage_Handler
|
||||
def_irq_handler BusFault_Handler
|
||||
def_irq_handler UsageFault_Handler
|
||||
def_irq_handler SVC_Handler
|
||||
def_irq_handler DebugMon_Handler
|
||||
def_irq_handler PendSV_Handler
|
||||
def_irq_handler SysTick_Handler
|
||||
|
||||
|
||||
def_irq_handler EMU_IRQHandler
|
||||
def_irq_handler WDOG0_IRQHandler
|
||||
def_irq_handler LDMA_IRQHandler
|
||||
def_irq_handler GPIO_EVEN_IRQHandler
|
||||
def_irq_handler TIMER0_IRQHandler
|
||||
def_irq_handler USART0_RX_IRQHandler
|
||||
def_irq_handler USART0_TX_IRQHandler
|
||||
def_irq_handler ACMP0_IRQHandler
|
||||
def_irq_handler ADC0_IRQHandler
|
||||
def_irq_handler IDAC0_IRQHandler
|
||||
def_irq_handler I2C0_IRQHandler
|
||||
def_irq_handler GPIO_ODD_IRQHandler
|
||||
def_irq_handler TIMER1_IRQHandler
|
||||
def_irq_handler USART1_RX_IRQHandler
|
||||
def_irq_handler USART1_TX_IRQHandler
|
||||
def_irq_handler LEUART0_IRQHandler
|
||||
def_irq_handler PCNT0_IRQHandler
|
||||
def_irq_handler CMU_IRQHandler
|
||||
def_irq_handler MSC_IRQHandler
|
||||
def_irq_handler CRYPTO_IRQHandler
|
||||
def_irq_handler LETIMER0_IRQHandler
|
||||
def_irq_handler RTCC_IRQHandler
|
||||
def_irq_handler CRYOTIMER_IRQHandler
|
||||
def_irq_handler FPUEH_IRQHandler
|
||||
|
||||
.end
|
@ -0,0 +1,383 @@
|
||||
/***************************************************************************//**
|
||||
* @file system_efm32pg1b.c
|
||||
* @brief CMSIS Cortex-M3/M4 System Layer for EFM32 devices.
|
||||
* @version 4.2.1
|
||||
******************************************************************************
|
||||
* @section License
|
||||
* <b>Copyright 2015 Silicon Laboratories, Inc. http://www.silabs.com</b>
|
||||
******************************************************************************
|
||||
*
|
||||
* Permission is granted to anyone to use this software for any purpose,
|
||||
* including commercial applications, and to alter it and redistribute it
|
||||
* freely, subject to the following restrictions:
|
||||
*
|
||||
* 1. The origin of this software must not be misrepresented; you must not
|
||||
* claim that you wrote the original software.@n
|
||||
* 2. Altered source versions must be plainly marked as such, and must not be
|
||||
* misrepresented as being the original software.@n
|
||||
* 3. This notice may not be removed or altered from any source distribution.
|
||||
*
|
||||
* DISCLAIMER OF WARRANTY/LIMITATION OF REMEDIES: Silicon Laboratories, Inc.
|
||||
* has no obligation to support this Software. Silicon Laboratories, Inc. is
|
||||
* providing the Software "AS IS", with no express or implied warranties of any
|
||||
* kind, including, but not limited to, any implied warranties of
|
||||
* merchantability or fitness for any particular purpose or warranties against
|
||||
* infringement of any proprietary rights of a third party.
|
||||
*
|
||||
* Silicon Laboratories, Inc. will not be liable for any consequential,
|
||||
* incidental, or special damages, or any other relief, or for any claim by
|
||||
* any third party, arising from your use of this Software.
|
||||
*
|
||||
*****************************************************************************/
|
||||
|
||||
#include <stdint.h>
|
||||
#include "em_device.h"
|
||||
|
||||
/*******************************************************************************
|
||||
****************************** DEFINES ************************************
|
||||
******************************************************************************/
|
||||
|
||||
/** LFRCO frequency, tuned to below frequency during manufacturing. */
|
||||
#define EFM32_LFRCO_FREQ (32768UL)
|
||||
#define EFM32_ULFRCO_FREQ (1000UL)
|
||||
|
||||
/*******************************************************************************
|
||||
************************** LOCAL VARIABLES ********************************
|
||||
******************************************************************************/
|
||||
|
||||
/* System oscillator frequencies. These frequencies are normally constant */
|
||||
/* for a target, but they are made configurable in order to allow run-time */
|
||||
/* handling of different boards. The crystal oscillator clocks can be set */
|
||||
/* compile time to a non-default value by defining respective EFM_nFXO_FREQ */
|
||||
/* values according to board design. By defining the EFM_nFXO_FREQ to 0, */
|
||||
/* one indicates that the oscillator is not present, in order to save some */
|
||||
/* SW footprint. */
|
||||
|
||||
#ifndef EFM32_HFRCO_MAX_FREQ
|
||||
#define EFM32_HFRCO_MAX_FREQ (38000000UL)
|
||||
#endif
|
||||
|
||||
#ifndef EFM32_HFXO_FREQ
|
||||
#define EFM32_HFXO_FREQ (40000000UL)
|
||||
#endif
|
||||
|
||||
#ifndef EFM32_HFRCO_STARTUP_FREQ
|
||||
#define EFM32_HFRCO_STARTUP_FREQ (19000000UL)
|
||||
#endif
|
||||
|
||||
|
||||
/* Do not define variable if HF crystal oscillator not present */
|
||||
#if (EFM32_HFXO_FREQ > 0UL)
|
||||
/** @cond DO_NOT_INCLUDE_WITH_DOXYGEN */
|
||||
/** System HFXO clock. */
|
||||
static uint32_t SystemHFXOClock = EFM32_HFXO_FREQ;
|
||||
/** @endcond (DO_NOT_INCLUDE_WITH_DOXYGEN) */
|
||||
#endif
|
||||
|
||||
#ifndef EFM32_LFXO_FREQ
|
||||
#define EFM32_LFXO_FREQ (EFM32_LFRCO_FREQ)
|
||||
#endif
|
||||
/* Do not define variable if LF crystal oscillator not present */
|
||||
#if (EFM32_LFXO_FREQ > 0UL)
|
||||
/** @cond DO_NOT_INCLUDE_WITH_DOXYGEN */
|
||||
/** System LFXO clock. */
|
||||
static uint32_t SystemLFXOClock = 32768UL;
|
||||
/** @endcond (DO_NOT_INCLUDE_WITH_DOXYGEN) */
|
||||
#endif
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
************************** GLOBAL VARIABLES *******************************
|
||||
******************************************************************************/
|
||||
|
||||
/**
|
||||
* @brief
|
||||
* System System Clock Frequency (Core Clock).
|
||||
*
|
||||
* @details
|
||||
* Required CMSIS global variable that must be kept up-to-date.
|
||||
*/
|
||||
uint32_t SystemCoreClock;
|
||||
|
||||
|
||||
/**
|
||||
* @brief
|
||||
* System HFRCO frequency
|
||||
*
|
||||
* @note
|
||||
* This is an EFM32 proprietary variable, not part of the CMSIS definition.
|
||||
*
|
||||
* @details
|
||||
* Frequency of the system HFRCO oscillator
|
||||
*/
|
||||
uint32_t SystemHfrcoFreq = EFM32_HFRCO_STARTUP_FREQ;
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
************************** GLOBAL FUNCTIONS *******************************
|
||||
******************************************************************************/
|
||||
|
||||
/***************************************************************************//**
|
||||
* @brief
|
||||
* Get the current core clock frequency.
|
||||
*
|
||||
* @details
|
||||
* Calculate and get the current core clock frequency based on the current
|
||||
* configuration. Assuming that the SystemCoreClock global variable is
|
||||
* maintained, the core clock frequency is stored in that variable as well.
|
||||
* This function will however calculate the core clock based on actual HW
|
||||
* configuration. It will also update the SystemCoreClock global variable.
|
||||
*
|
||||
* @note
|
||||
* This is an EFM32 proprietary function, not part of the CMSIS definition.
|
||||
*
|
||||
* @return
|
||||
* The current core clock frequency in Hz.
|
||||
******************************************************************************/
|
||||
uint32_t SystemCoreClockGet(void)
|
||||
{
|
||||
uint32_t ret;
|
||||
uint32_t presc;
|
||||
|
||||
ret = SystemHFClockGet();
|
||||
presc = (CMU->HFCOREPRESC & _CMU_HFCOREPRESC_PRESC_MASK) >>
|
||||
_CMU_HFCOREPRESC_PRESC_SHIFT;
|
||||
ret /= (presc + 1);
|
||||
|
||||
/* Keep CMSIS system clock variable up-to-date */
|
||||
SystemCoreClock = ret;
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
/***************************************************************************//**
|
||||
* @brief
|
||||
* Get the maximum core clock frequency.
|
||||
*
|
||||
* @note
|
||||
* This is an EFM32 proprietary function, not part of the CMSIS definition.
|
||||
*
|
||||
* @return
|
||||
* The maximum core clock frequency in Hz.
|
||||
******************************************************************************/
|
||||
uint32_t SystemMaxCoreClockGet(void)
|
||||
{
|
||||
return (EFM32_HFRCO_MAX_FREQ > EFM32_HFXO_FREQ ? \
|
||||
EFM32_HFRCO_MAX_FREQ : EFM32_HFXO_FREQ);
|
||||
}
|
||||
|
||||
|
||||
/***************************************************************************//**
|
||||
* @brief
|
||||
* Get the current HFCLK frequency.
|
||||
*
|
||||
* @note
|
||||
* This is an EFM32 proprietary function, not part of the CMSIS definition.
|
||||
*
|
||||
* @return
|
||||
* The current HFCLK frequency in Hz.
|
||||
******************************************************************************/
|
||||
uint32_t SystemHFClockGet(void)
|
||||
{
|
||||
uint32_t ret;
|
||||
|
||||
switch (CMU->HFCLKSTATUS & _CMU_HFCLKSTATUS_SELECTED_MASK)
|
||||
{
|
||||
case CMU_HFCLKSTATUS_SELECTED_LFXO:
|
||||
#if (EFM32_LFXO_FREQ > 0)
|
||||
ret = SystemLFXOClock;
|
||||
#else
|
||||
/* We should not get here, since core should not be clocked. May */
|
||||
/* be caused by a misconfiguration though. */
|
||||
ret = 0;
|
||||
#endif
|
||||
break;
|
||||
|
||||
case CMU_HFCLKSTATUS_SELECTED_LFRCO:
|
||||
ret = EFM32_LFRCO_FREQ;
|
||||
break;
|
||||
|
||||
case CMU_HFCLKSTATUS_SELECTED_HFXO:
|
||||
#if (EFM32_HFXO_FREQ > 0)
|
||||
ret = SystemHFXOClock;
|
||||
#else
|
||||
/* We should not get here, since core should not be clocked. May */
|
||||
/* be caused by a misconfiguration though. */
|
||||
ret = 0;
|
||||
#endif
|
||||
break;
|
||||
|
||||
default: /* CMU_HFCLKSTATUS_SELECTED_HFRCO */
|
||||
ret = SystemHfrcoFreq;
|
||||
break;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
/**************************************************************************//**
|
||||
* @brief
|
||||
* Get high frequency crystal oscillator clock frequency for target system.
|
||||
*
|
||||
* @note
|
||||
* This is an EFM32 proprietary function, not part of the CMSIS definition.
|
||||
*
|
||||
* @return
|
||||
* HFXO frequency in Hz.
|
||||
*****************************************************************************/
|
||||
uint32_t SystemHFXOClockGet(void)
|
||||
{
|
||||
/* External crystal oscillator present? */
|
||||
#if (EFM32_HFXO_FREQ > 0)
|
||||
return SystemHFXOClock;
|
||||
#else
|
||||
return 0;
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
/**************************************************************************//**
|
||||
* @brief
|
||||
* Set high frequency crystal oscillator clock frequency for target system.
|
||||
*
|
||||
* @note
|
||||
* This function is mainly provided for being able to handle target systems
|
||||
* with different HF crystal oscillator frequencies run-time. If used, it
|
||||
* should probably only be used once during system startup.
|
||||
*
|
||||
* @note
|
||||
* This is an EFM32 proprietary function, not part of the CMSIS definition.
|
||||
*
|
||||
* @param[in] freq
|
||||
* HFXO frequency in Hz used for target.
|
||||
*****************************************************************************/
|
||||
void SystemHFXOClockSet(uint32_t freq)
|
||||
{
|
||||
/* External crystal oscillator present? */
|
||||
#if (EFM32_HFXO_FREQ > 0)
|
||||
SystemHFXOClock = freq;
|
||||
|
||||
/* Update core clock frequency if HFXO is used to clock core */
|
||||
if ((CMU->HFCLKSTATUS & _CMU_HFCLKSTATUS_SELECTED_MASK) == CMU_HFCLKSTATUS_SELECTED_HFXO)
|
||||
{
|
||||
/* The function will update the global variable */
|
||||
SystemCoreClockGet();
|
||||
}
|
||||
#else
|
||||
(void)freq; /* Unused parameter */
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
/**************************************************************************//**
|
||||
* @brief
|
||||
* Initialize the system.
|
||||
*
|
||||
* @details
|
||||
* Do required generic HW system init.
|
||||
*
|
||||
* @note
|
||||
* This function is invoked during system init, before the main() routine
|
||||
* and any data has been initialized. For this reason, it cannot do any
|
||||
* initialization of variables etc.
|
||||
*****************************************************************************/
|
||||
void SystemInit(void)
|
||||
{
|
||||
#if (__FPU_PRESENT == 1)
|
||||
/* Set floating point coprosessor access mode. */
|
||||
SCB->CPACR |= ((3UL << 10 * 2) | /* set CP10 Full Access */
|
||||
(3UL << 11 * 2)); /* set CP11 Full Access */
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
/**************************************************************************//**
|
||||
* @brief
|
||||
* Get low frequency RC oscillator clock frequency for target system.
|
||||
*
|
||||
* @note
|
||||
* This is an EFM32 proprietary function, not part of the CMSIS definition.
|
||||
*
|
||||
* @return
|
||||
* LFRCO frequency in Hz.
|
||||
*****************************************************************************/
|
||||
uint32_t SystemLFRCOClockGet(void)
|
||||
{
|
||||
/* Currently we assume that this frequency is properly tuned during */
|
||||
/* manufacturing and is not changed after reset. If future requirements */
|
||||
/* for re-tuning by user, we can add support for that. */
|
||||
return EFM32_LFRCO_FREQ;
|
||||
}
|
||||
|
||||
|
||||
/**************************************************************************//**
|
||||
* @brief
|
||||
* Get ultra low frequency RC oscillator clock frequency for target system.
|
||||
*
|
||||
* @note
|
||||
* This is an EFM32 proprietary function, not part of the CMSIS definition.
|
||||
*
|
||||
* @return
|
||||
* ULFRCO frequency in Hz.
|
||||
*****************************************************************************/
|
||||
uint32_t SystemULFRCOClockGet(void)
|
||||
{
|
||||
/* The ULFRCO frequency is not tuned, and can be very inaccurate */
|
||||
return EFM32_ULFRCO_FREQ;
|
||||
}
|
||||
|
||||
|
||||
/**************************************************************************//**
|
||||
* @brief
|
||||
* Get low frequency crystal oscillator clock frequency for target system.
|
||||
*
|
||||
* @note
|
||||
* This is an EFM32 proprietary function, not part of the CMSIS definition.
|
||||
*
|
||||
* @return
|
||||
* LFXO frequency in Hz.
|
||||
*****************************************************************************/
|
||||
uint32_t SystemLFXOClockGet(void)
|
||||
{
|
||||
/* External crystal oscillator present? */
|
||||
#if (EFM32_LFXO_FREQ > 0)
|
||||
return SystemLFXOClock;
|
||||
#else
|
||||
return 0;
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
/**************************************************************************//**
|
||||
* @brief
|
||||
* Set low frequency crystal oscillator clock frequency for target system.
|
||||
*
|
||||
* @note
|
||||
* This function is mainly provided for being able to handle target systems
|
||||
* with different HF crystal oscillator frequencies run-time. If used, it
|
||||
* should probably only be used once during system startup.
|
||||
*
|
||||
* @note
|
||||
* This is an EFM32 proprietary function, not part of the CMSIS definition.
|
||||
*
|
||||
* @param[in] freq
|
||||
* LFXO frequency in Hz used for target.
|
||||
*****************************************************************************/
|
||||
void SystemLFXOClockSet(uint32_t freq)
|
||||
{
|
||||
/* External crystal oscillator present? */
|
||||
#if (EFM32_LFXO_FREQ > 0)
|
||||
SystemLFXOClock = freq;
|
||||
|
||||
/* Update core clock frequency if LFXO is used to clock core */
|
||||
if ((CMU->HFCLKSTATUS & _CMU_HFCLKSTATUS_SELECTED_MASK) == CMU_HFCLKSTATUS_SELECTED_LFXO)
|
||||
{
|
||||
/* The function will update the global variable */
|
||||
SystemCoreClockGet();
|
||||
}
|
||||
#else
|
||||
(void)freq; /* Unused parameter */
|
||||
#endif
|
||||
}
|
@ -0,0 +1,265 @@
|
||||
/***************************************************************************//**
|
||||
* @file sleep.h
|
||||
* @brief Energy Modes management driver
|
||||
* @version 4.2.1
|
||||
* @details
|
||||
* This is a energy modes management module consisting of sleep.c and sleep.h
|
||||
* source files. The main purpose of the module is to ease energy
|
||||
* optimization with a simple API. The module allows the system to always sleep
|
||||
* in the lowest possible energy mode. Users could set up callbacks that are
|
||||
* being called before and after each and every sleep. A counting semaphore is
|
||||
* available for each low energy mode (EM1/EM2/EM3) to protect certain system
|
||||
* states from being corrupted. This semaphore has limit set to maximum 255 locks.
|
||||
*
|
||||
* The module provides the following public API to the users:
|
||||
* SLEEP_Init()
|
||||
* SLEEP_Sleep()
|
||||
* SLEEP_SleepBlockBegin()
|
||||
* SLEEP_SleepBlockEnd()
|
||||
* SLEEP_ForceSleepInEM4()
|
||||
*
|
||||
*******************************************************************************
|
||||
* @section License
|
||||
* <b>(C) Copyright 2014 Silicon Labs, http://www.silabs.com</b>
|
||||
*******************************************************************************
|
||||
*
|
||||
* This file is licensed under the Silabs License Agreement. See the file
|
||||
* "Silabs_License_Agreement.txt" for details. Before using this software for
|
||||
* any purpose, you must agree to the terms of that agreement.
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
#ifndef __SLEEP_H
|
||||
#define __SLEEP_H
|
||||
|
||||
#include <stdint.h>
|
||||
#include <stdbool.h>
|
||||
|
||||
/* Device specific header file(s). */
|
||||
#include "em_device.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/***************************************************************************//**
|
||||
* @addtogroup EM_Drivers
|
||||
* @{
|
||||
******************************************************************************/
|
||||
|
||||
/***************************************************************************//**
|
||||
* @addtogroup SLEEP
|
||||
* @brief Energy Modes management driver.
|
||||
* @details
|
||||
* This is a energy modes management module consisting of sleep.c and sleep.h
|
||||
* source files. The main purpose of the module is to ease energy
|
||||
* optimization with a simple API. The module allows the system to always sleep
|
||||
* in the lowest possible energy mode. Users could set up callbacks that are
|
||||
* being called before and after each and every sleep. A counting semaphore is
|
||||
* available for each low energy mode (EM1/EM2/EM3) to protect certain system
|
||||
* states from being corrupted. This semaphore has limit set to maximum 255 locks.
|
||||
* @{
|
||||
******************************************************************************/
|
||||
|
||||
/*******************************************************************************
|
||||
******************************* MACROS ************************************
|
||||
******************************************************************************/
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
**************************** CONFIGURATION ********************************
|
||||
******************************************************************************/
|
||||
|
||||
/** Enable/disable the HW block for protecting accidental setting of low energy
|
||||
* modes (recommended to be set to true). */
|
||||
#ifndef SLEEP_HW_LOW_ENERGY_BLOCK_ENABLED
|
||||
#define SLEEP_HW_LOW_ENERGY_BLOCK_ENABLED true
|
||||
#endif
|
||||
|
||||
/** Enable/disable calling wakeup callback after EM4 reset. */
|
||||
#ifndef SLEEP_EM4_WAKEUP_CALLBACK_ENABLED
|
||||
#define SLEEP_EM4_WAKEUP_CALLBACK_ENABLED true
|
||||
#endif
|
||||
|
||||
/** Configure default lowest energy mode that the system can be set to.
|
||||
* Possible values:
|
||||
* @li sleepEM1 - EM1, the CPU core is turned off.
|
||||
* @li sleepEM2 - EM2, like EM1 + all HF clocks are turned off, LF clocks are on.
|
||||
* @li sleepEM3 - EM3, like EM2 + LF clocks are off, RAM retention, GPIO and ACMP
|
||||
* interrupt is on. */
|
||||
#ifndef SLEEP_LOWEST_ENERGY_MODE_DEFAULT
|
||||
#define SLEEP_LOWEST_ENERGY_MODE_DEFAULT sleepEM3
|
||||
#endif
|
||||
|
||||
/*******************************************************************************
|
||||
****************************** TYPEDEFS ***********************************
|
||||
******************************************************************************/
|
||||
|
||||
/** Status value used for showing the Energy Mode the device is currently in. */
|
||||
typedef enum
|
||||
{
|
||||
/** Status value for EM0. */
|
||||
sleepEM0 = 0,
|
||||
|
||||
/** Status value for EM1. */
|
||||
sleepEM1 = 1,
|
||||
|
||||
/** Status value for EM2. */
|
||||
sleepEM2 = 2,
|
||||
|
||||
/** Status value for EM3. */
|
||||
sleepEM3 = 3,
|
||||
|
||||
/** Status value for EM4. */
|
||||
sleepEM4 = 4
|
||||
} SLEEP_EnergyMode_t;
|
||||
|
||||
/** Callback function pointer type. */
|
||||
typedef void (*SLEEP_CbFuncPtr_t)(SLEEP_EnergyMode_t);
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
****************************** PROTOTYPES *********************************
|
||||
******************************************************************************/
|
||||
|
||||
/***************************************************************************//**
|
||||
* @brief
|
||||
* Initialize the Sleep module.
|
||||
*
|
||||
* @details
|
||||
* Use this function to initialize the Sleep module, should be called
|
||||
* only once! Pointers to sleep and wake-up callback functions shall be
|
||||
* provided when calling this function.
|
||||
* If SLEEP_EM4_WAKEUP_CALLBACK_ENABLED is set to true, this function checks
|
||||
* for the cause of the reset that implicitly called it and calls the wakeup
|
||||
* callback if the reset was a wakeup from EM4 (does not work on Gecko MCU).
|
||||
*
|
||||
* @param[in] pSleepCb
|
||||
* Pointer to the callback function that is being called before the device is
|
||||
* going to sleep.
|
||||
*
|
||||
* @param[in] pWakeUpCb
|
||||
* Pointer to the callback function that is being called after wake up.
|
||||
******************************************************************************/
|
||||
void SLEEP_Init(SLEEP_CbFuncPtr_t pSleepCb, SLEEP_CbFuncPtr_t pWakeUpCb);
|
||||
|
||||
/***************************************************************************//**
|
||||
* @brief
|
||||
* Gets the lowest energy mode that the system is allowed to be set to.
|
||||
*
|
||||
* @details
|
||||
* This function uses the low energy mode block counters to determine the
|
||||
* lowest possible that the system is allowed to be set to.
|
||||
*
|
||||
* @return
|
||||
* Lowest energy mode that the system can be set to. Possible values:
|
||||
* @li sleepEM0
|
||||
* @li sleepEM1
|
||||
* @li sleepEM2
|
||||
* @li sleepEM3
|
||||
******************************************************************************/
|
||||
SLEEP_EnergyMode_t SLEEP_LowestEnergyModeGet(void);
|
||||
|
||||
/***************************************************************************//**
|
||||
* @brief
|
||||
* Sets the system to sleep into the lowest possible energy mode.
|
||||
*
|
||||
* @details
|
||||
* This function takes care of the system states protected by the sleep block
|
||||
* provided by SLEEP_SleepBlockBegin() / SLEEP_SleepBlockEnd(). It allows
|
||||
* the system to go into the lowest possible energy mode that the device can
|
||||
* be set into at the time of the call of this function.
|
||||
* This function will not go lower than EM3 because leaving EM4 requires
|
||||
* resetting MCU. To enter into EM4 call SLEEP_ForceSleepInEM4().
|
||||
*
|
||||
* @return
|
||||
* Energy Mode that was entered. Possible values:
|
||||
* @li sleepEM0
|
||||
* @li sleepEM1
|
||||
* @li sleepEM2
|
||||
* @li sleepEM3
|
||||
******************************************************************************/
|
||||
SLEEP_EnergyMode_t SLEEP_Sleep(void);
|
||||
|
||||
|
||||
/***************************************************************************//**
|
||||
* @brief
|
||||
* Force the device to go to EM4 without doing any checks.
|
||||
*
|
||||
* @details
|
||||
* This function unblocks the low energy sleep block then goes to EM4.
|
||||
*
|
||||
* @note
|
||||
* Regular RAM is not retained in EM4 and the wake up causes a reset.
|
||||
* If the configuration option SLEEP_EM4_WAKEUP_CALLBACK_ENABLED is set to
|
||||
* true, the SLEEP_Init() function checks for the reset cause and calls the
|
||||
* EM4 wakeup callback.
|
||||
******************************************************************************/
|
||||
void SLEEP_ForceSleepInEM4(void);
|
||||
|
||||
|
||||
/***************************************************************************//**
|
||||
* @brief
|
||||
* Begin sleep block in the requested energy mode.
|
||||
*
|
||||
* @details
|
||||
* Blocking a critical system state from a certain energy mode makes sure that
|
||||
* the system is not set to that energy mode while the block is not being
|
||||
* released.
|
||||
* Every SLEEP_SleepBlockBegin() increases the corresponding counter and
|
||||
* every SLEEP_SleepBlockEnd() decreases it.
|
||||
*
|
||||
* Example:\code
|
||||
* SLEEP_SleepBlockBegin(sleepEM2); // do not allow EM2 or higher
|
||||
* // do some stuff that requires EM1 at least, like ADC sampling
|
||||
* SLEEP_SleepBlockEnd(sleepEM2); // remove restriction for EM2\endcode
|
||||
*
|
||||
* @note
|
||||
* Be aware that there is limit of maximum blocks nesting to 255.
|
||||
*
|
||||
* @param[in] eMode
|
||||
* Energy mode to begin to block. Possible values:
|
||||
* @li sleepEM1 - Begin to block the system from being set to EM1 (and EM2..4).
|
||||
* @li sleepEM2 - Begin to block the system from being set to EM2 (and EM3/EM4).
|
||||
* @li sleepEM3 - Begin to block the system from being set to EM3 (and EM4).
|
||||
******************************************************************************/
|
||||
void SLEEP_SleepBlockBegin(SLEEP_EnergyMode_t eMode);
|
||||
|
||||
|
||||
/***************************************************************************//**
|
||||
* @brief
|
||||
* End sleep block in the requested energy mode.
|
||||
*
|
||||
* @details
|
||||
* Release restriction for entering certain energy mode. Every call of this
|
||||
* function reduce blocking counter by 1. Once the counter for specific energy
|
||||
* mode is 0 and all counters for lower energy modes are 0 as well, using
|
||||
* particular energy mode is allowed.
|
||||
* Every SLEEP_SleepBlockBegin() increases the corresponding counter and
|
||||
* every SLEEP_SleepBlockEnd() decreases it.
|
||||
*
|
||||
* Example:\code
|
||||
* // at start all energy modes are allowed
|
||||
* SLEEP_SleepBlockBegin(sleepEM2); // EM2, EM3, EM4 are blocked
|
||||
* SLEEP_SleepBlockBegin(sleepEM1); // EM1, EM2, EM3, EM4 are blocked
|
||||
* SLEEP_SleepBlockBegin(sleepEM1); // EM1, EM2, EM3, EM4 are blocked
|
||||
* SLEEP_SleepBlockEnd(sleepEM2); // still EM1, EM2, EM3, EM4 are blocked
|
||||
* SLEEP_SleepBlockEnd(sleepEM1); // still EM1, EM2, EM3, EM4 are blocked
|
||||
* SLEEP_SleepBlockEnd(sleepEM1); // all energy modes are allowed now\endcode
|
||||
*
|
||||
* @param[in] eMode
|
||||
* Energy mode to end to block. Possible values:
|
||||
* @li sleepEM1 - End to block the system from being set to EM1 (and EM2..4).
|
||||
* @li sleepEM2 - End to block the system from being set to EM2 (and EM3/EM4).
|
||||
* @li sleepEM3 - End to block the system from being set to EM3 (and EM4).
|
||||
******************************************************************************/
|
||||
void SLEEP_SleepBlockEnd(SLEEP_EnergyMode_t eMode);
|
||||
|
||||
|
||||
/** @} (end addtogroup SLEEP) */
|
||||
/** @} (end addtogroup EM_Drivers) */
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
#endif /* __SLEEP_H */
|
@ -0,0 +1,427 @@
|
||||
/***************************************************************************//**
|
||||
* @file sleep.c
|
||||
* @brief Energy Modes management driver.
|
||||
* @version 4.2.1
|
||||
* @details
|
||||
* This is a energy modes management module consisting of sleep.c and sleep.h
|
||||
* source files. The main purpose of the module is to ease energy
|
||||
* optimization with a simple API. The module allows the system to always sleep
|
||||
* in the lowest possible energy mode. Users could set up callbacks that are
|
||||
* being called before and after each and every sleep. A counting semaphore is
|
||||
* available for each low energy mode (EM1/EM2/EM3) to protect certain system
|
||||
* states from being corrupted. This semaphore has limit set to maximum 255 locks.
|
||||
*
|
||||
* The module provides the following public API to the users:
|
||||
* SLEEP_Init()
|
||||
* SLEEP_Sleep()
|
||||
* SLEEP_SleepBlockBegin()
|
||||
* SLEEP_SleepBlockEnd()
|
||||
* SLEEP_ForceSleepInEM4()
|
||||
*
|
||||
*******************************************************************************
|
||||
* @section License
|
||||
* <b>(C) Copyright 2014 Silicon Labs, http://www.silabs.com</b>
|
||||
*******************************************************************************
|
||||
*
|
||||
* This file is licensed under the Silabs License Agreement. See the file
|
||||
* "Silabs_License_Agreement.txt" for details. Before using this software for
|
||||
* any purpose, you must agree to the terms of that agreement.
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
|
||||
/* Chip specific header file(s). */
|
||||
#include "em_device.h"
|
||||
#include "em_assert.h"
|
||||
#include "em_int.h"
|
||||
#include "em_rmu.h"
|
||||
#include "em_emu.h"
|
||||
|
||||
/* Module header file(s). */
|
||||
#include "sleep.h"
|
||||
|
||||
/* stdlib is needed for NULL definition */
|
||||
#include <stdlib.h>
|
||||
|
||||
/***************************************************************************//**
|
||||
* @addtogroup EM_Drivers
|
||||
* @{
|
||||
******************************************************************************/
|
||||
|
||||
/***************************************************************************//**
|
||||
* @addtogroup SLEEP
|
||||
* @brief Energy Modes management driver.
|
||||
* @details
|
||||
* This is a energy modes management module consisting of sleep.c and sleep.h
|
||||
* source files. The main purpose of the module is to ease energy
|
||||
* optimization with a simple API. The module allows the system to always sleep
|
||||
* in the lowest possible energy mode. Users could set up callbacks that are
|
||||
* being called before and after each and every sleep. A counting semaphore is
|
||||
* available for each low energy mode (EM1/EM2/EM3) to protect certain system
|
||||
* states from being corrupted. This semaphore has limit set to maximum 255 locks.
|
||||
* @{
|
||||
******************************************************************************/
|
||||
|
||||
/*******************************************************************************
|
||||
******************************* MACROS ************************************
|
||||
******************************************************************************/
|
||||
|
||||
/** @cond DO_NOT_INCLUDE_WITH_DOXYGEN */
|
||||
|
||||
/* Number of low energy modes (EM1, EM2, EM3). Note: EM4 sleep/wakeup is handled
|
||||
* differently therefore it is not part of the list! */
|
||||
#define SLEEP_NUMOF_LOW_ENERGY_MODES 3U
|
||||
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
****************************** TYPEDEFS ***********************************
|
||||
******************************************************************************/
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
****************************** CONSTANTS **********************************
|
||||
******************************************************************************/
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
******************************* STATICS ***********************************
|
||||
******************************************************************************/
|
||||
|
||||
/* Callback functions to call before and after sleep. */
|
||||
static SLEEP_CbFuncPtr_t sleepCallback = NULL;
|
||||
static SLEEP_CbFuncPtr_t wakeUpCallback = NULL;
|
||||
|
||||
/* Sleep block counter array representing the nested sleep blocks for the low
|
||||
* energy modes (EM1/EM2/EM3). Array index 0 corresponds to EM1, 1 to EM2 and 2
|
||||
* to EM3 accordingly.
|
||||
*
|
||||
* Note:
|
||||
* - EM4 sleep/wakeup is handled differently therefore it is not part of the
|
||||
* list!
|
||||
* - Max. number of sleep block nesting is 255. */
|
||||
static uint8_t sleepBlockCnt[SLEEP_NUMOF_LOW_ENERGY_MODES];
|
||||
|
||||
/*******************************************************************************
|
||||
****************************** PROTOTYPES *********************************
|
||||
******************************************************************************/
|
||||
|
||||
static void SLEEP_EnterEMx(SLEEP_EnergyMode_t eMode);
|
||||
//static SLEEP_EnergyMode_t SLEEP_LowestEnergyModeGet(void);
|
||||
|
||||
/** @endcond */
|
||||
|
||||
/*******************************************************************************
|
||||
*************************** GLOBAL FUNCTIONS ******************************
|
||||
******************************************************************************/
|
||||
|
||||
/***************************************************************************//**
|
||||
* @brief
|
||||
* Initialize the Sleep module.
|
||||
*
|
||||
* @details
|
||||
* Use this function to initialize the Sleep module, should be called
|
||||
* only once! Pointers to sleep and wake-up callback functions shall be
|
||||
* provided when calling this function.
|
||||
* If SLEEP_EM4_WAKEUP_CALLBACK_ENABLED is set to true, this function checks
|
||||
* for the cause of the reset that implicitly called it and calls the wakeup
|
||||
* callback if the reset was a wakeup from EM4 (does not work on Gecko MCU).
|
||||
*
|
||||
* @param[in] pSleepCb
|
||||
* Pointer to the callback function that is being called before the device is
|
||||
* going to sleep.
|
||||
*
|
||||
* @param[in] pWakeUpCb
|
||||
* Pointer to the callback function that is being called after wake up.
|
||||
******************************************************************************/
|
||||
void SLEEP_Init(SLEEP_CbFuncPtr_t pSleepCb, SLEEP_CbFuncPtr_t pWakeUpCb)
|
||||
{
|
||||
/* Initialize callback functions. */
|
||||
sleepCallback = pSleepCb;
|
||||
wakeUpCallback = pWakeUpCb;
|
||||
|
||||
/* Reset sleep block counters. Note: not using for() saves code! */
|
||||
sleepBlockCnt[0U] = 0U;
|
||||
sleepBlockCnt[1U] = 0U;
|
||||
sleepBlockCnt[2U] = 0U;
|
||||
|
||||
#if (SLEEP_EM4_WAKEUP_CALLBACK_ENABLED == true) && defined(RMU_RSTCAUSE_EM4WURST)
|
||||
/* Check if the Init() happened after an EM4 reset. */
|
||||
if (RMU_ResetCauseGet() & RMU_RSTCAUSE_EM4WURST)
|
||||
{
|
||||
/* Clear the cause of the reset. */
|
||||
RMU_ResetCauseClear();
|
||||
/* Call wakeup callback with EM4 parameter. */
|
||||
if (NULL != wakeUpCallback)
|
||||
{
|
||||
wakeUpCallback(sleepEM4);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
/***************************************************************************//**
|
||||
* @brief
|
||||
* Sets the system to sleep into the lowest possible energy mode.
|
||||
*
|
||||
* @details
|
||||
* This function takes care of the system states protected by the sleep block
|
||||
* provided by SLEEP_SleepBlockBegin() / SLEEP_SleepBlockEnd(). It allows
|
||||
* the system to go into the lowest possible energy mode that the device can
|
||||
* be set into at the time of the call of this function.
|
||||
* This function will not go lower than EM3 because leaving EM4 requires
|
||||
* resetting MCU. To enter into EM4 call SLEEP_ForceSleepInEM4().
|
||||
*
|
||||
* @return
|
||||
* Energy Mode that was entered. Possible values:
|
||||
* @li sleepEM0
|
||||
* @li sleepEM1
|
||||
* @li sleepEM2
|
||||
* @li sleepEM3
|
||||
******************************************************************************/
|
||||
SLEEP_EnergyMode_t SLEEP_Sleep(void)
|
||||
{
|
||||
SLEEP_EnergyMode_t allowedEM;
|
||||
|
||||
INT_Disable();
|
||||
|
||||
allowedEM = SLEEP_LowestEnergyModeGet();
|
||||
|
||||
if ((allowedEM >= sleepEM1) && (allowedEM <= sleepEM3))
|
||||
{
|
||||
SLEEP_EnterEMx(allowedEM);
|
||||
}
|
||||
else
|
||||
{
|
||||
allowedEM = sleepEM0;
|
||||
}
|
||||
|
||||
INT_Enable();
|
||||
|
||||
return(allowedEM);
|
||||
}
|
||||
|
||||
|
||||
/***************************************************************************//**
|
||||
* @brief
|
||||
* Force the device to go to EM4 without doing any checks.
|
||||
*
|
||||
* @details
|
||||
* This function unblocks the low energy sleep block then goes to EM4.
|
||||
*
|
||||
* @note
|
||||
* Regular RAM is not retained in EM4 and the wake up causes a reset.
|
||||
* If the configuration option SLEEP_EM4_WAKEUP_CALLBACK_ENABLED is set to
|
||||
* true, the SLEEP_Init() function checks for the reset cause and calls the
|
||||
* EM4 wakeup callback.
|
||||
******************************************************************************/
|
||||
void SLEEP_ForceSleepInEM4(void)
|
||||
{
|
||||
#if (SLEEP_HW_LOW_ENERGY_BLOCK_ENABLED == true)
|
||||
/* Unblock the EM2/EM3/EM4 block in the EMU. */
|
||||
EMU_EM2UnBlock();
|
||||
#endif
|
||||
|
||||
/* Request entering to EM4. */
|
||||
SLEEP_EnterEMx(sleepEM4);
|
||||
}
|
||||
|
||||
/***************************************************************************//**
|
||||
* @brief
|
||||
* Begin sleep block in the requested energy mode.
|
||||
*
|
||||
* @details
|
||||
* Blocking a critical system state from a certain energy mode makes sure that
|
||||
* the system is not set to that energy mode while the block is not being
|
||||
* released.
|
||||
* Every SLEEP_SleepBlockBegin() increases the corresponding counter and
|
||||
* every SLEEP_SleepBlockEnd() decreases it.
|
||||
*
|
||||
* Example:\code
|
||||
* SLEEP_SleepBlockBegin(sleepEM2); // do not allow EM2 or higher
|
||||
* // do some stuff that requires EM1 at least, like ADC sampling
|
||||
* SLEEP_SleepBlockEnd(sleepEM2); // remove restriction for EM2\endcode
|
||||
*
|
||||
* @note
|
||||
* Be aware that there is limit of maximum blocks nesting to 255.
|
||||
*
|
||||
* @param[in] eMode
|
||||
* Energy mode to begin to block. Possible values:
|
||||
* @li sleepEM1 - Begin to block the system from being set to EM1 (and EM2..4).
|
||||
* @li sleepEM2 - Begin to block the system from being set to EM2 (and EM3/EM4).
|
||||
* @li sleepEM3 - Begin to block the system from being set to EM3 (and EM4).
|
||||
******************************************************************************/
|
||||
void SLEEP_SleepBlockBegin(SLEEP_EnergyMode_t eMode)
|
||||
{
|
||||
EFM_ASSERT((eMode >= sleepEM1) && (eMode < sleepEM4));
|
||||
EFM_ASSERT((sleepBlockCnt[(uint8_t) eMode - 1U]) < 255U);
|
||||
|
||||
/* Increase the sleep block counter of the selected energy mode. */
|
||||
sleepBlockCnt[(uint8_t) eMode - 1U]++;
|
||||
|
||||
#if (SLEEP_HW_LOW_ENERGY_BLOCK_ENABLED == true)
|
||||
/* Block EM2/EM3 sleep if the EM2 block begins. */
|
||||
if (eMode == sleepEM2)
|
||||
{
|
||||
EMU_EM2Block();
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
/***************************************************************************//**
|
||||
* @brief
|
||||
* End sleep block in the requested energy mode.
|
||||
*
|
||||
* @details
|
||||
* Release restriction for entering certain energy mode. Every call of this
|
||||
* function reduce blocking counter by 1. Once the counter for specific energy
|
||||
* mode is 0 and all counters for lower energy modes are 0 as well, using
|
||||
* particular energy mode is allowed.
|
||||
* Every SLEEP_SleepBlockBegin() increases the corresponding counter and
|
||||
* every SLEEP_SleepBlockEnd() decreases it.
|
||||
*
|
||||
* Example:\code
|
||||
* // at start all energy modes are allowed
|
||||
* SLEEP_SleepBlockBegin(sleepEM2); // EM2, EM3, EM4 are blocked
|
||||
* SLEEP_SleepBlockBegin(sleepEM1); // EM1, EM2, EM3, EM4 are blocked
|
||||
* SLEEP_SleepBlockBegin(sleepEM1); // EM1, EM2, EM3, EM4 are blocked
|
||||
* SLEEP_SleepBlockEnd(sleepEM2); // still EM1, EM2, EM3, EM4 are blocked
|
||||
* SLEEP_SleepBlockEnd(sleepEM1); // still EM1, EM2, EM3, EM4 are blocked
|
||||
* SLEEP_SleepBlockEnd(sleepEM1); // all energy modes are allowed now\endcode
|
||||
*
|
||||
* @param[in] eMode
|
||||
* Energy mode to end to block. Possible values:
|
||||
* @li sleepEM1 - End to block the system from being set to EM1 (and EM2..4).
|
||||
* @li sleepEM2 - End to block the system from being set to EM2 (and EM3/EM4).
|
||||
* @li sleepEM3 - End to block the system from being set to EM3 (and EM4).
|
||||
******************************************************************************/
|
||||
void SLEEP_SleepBlockEnd(SLEEP_EnergyMode_t eMode)
|
||||
{
|
||||
EFM_ASSERT((eMode >= sleepEM1) && (eMode < sleepEM4));
|
||||
|
||||
/* Decrease the sleep block counter of the selected energy mode. */
|
||||
if (sleepBlockCnt[(uint8_t) eMode - 1U] > 0U)
|
||||
{
|
||||
sleepBlockCnt[(uint8_t) eMode - 1U]--;
|
||||
}
|
||||
|
||||
#if (SLEEP_HW_LOW_ENERGY_BLOCK_ENABLED == true)
|
||||
/* Check if the EM2/EM3 block should be unblocked in the EMU. */
|
||||
if (0U == sleepBlockCnt[(uint8_t) sleepEM2 - 1U])
|
||||
{
|
||||
EMU_EM2UnBlock();
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
/***************************************************************************//**
|
||||
* @brief
|
||||
* Gets the lowest energy mode that the system is allowed to be set to.
|
||||
*
|
||||
* @details
|
||||
* This function uses the low energy mode block counters to determine the
|
||||
* lowest possible that the system is allowed to be set to.
|
||||
*
|
||||
* @return
|
||||
* Lowest energy mode that the system can be set to. Possible values:
|
||||
* @li sleepEM0
|
||||
* @li sleepEM1
|
||||
* @li sleepEM2
|
||||
* @li sleepEM3
|
||||
******************************************************************************/
|
||||
SLEEP_EnergyMode_t SLEEP_LowestEnergyModeGet(void)
|
||||
{
|
||||
SLEEP_EnergyMode_t tmpLowestEM = sleepEM0;
|
||||
|
||||
/* Check which is the lowest energy mode that the system can be set to. */
|
||||
if (0U == sleepBlockCnt[(uint8_t) sleepEM1 - 1U])
|
||||
{
|
||||
tmpLowestEM = sleepEM1;
|
||||
if (0U == sleepBlockCnt[(uint8_t) sleepEM2 - 1U])
|
||||
{
|
||||
tmpLowestEM = sleepEM2;
|
||||
if (0U == sleepBlockCnt[(uint8_t) sleepEM3 - 1U])
|
||||
{
|
||||
tmpLowestEM = sleepEM3;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* Compare with the default lowest energy mode setting. */
|
||||
if (SLEEP_LOWEST_ENERGY_MODE_DEFAULT < tmpLowestEM)
|
||||
{
|
||||
tmpLowestEM = SLEEP_LOWEST_ENERGY_MODE_DEFAULT;
|
||||
}
|
||||
|
||||
return tmpLowestEM;
|
||||
}
|
||||
|
||||
/** @cond DO_NOT_INCLUDE_WITH_DOXYGEN */
|
||||
|
||||
/***************************************************************************//**
|
||||
* @brief
|
||||
* Call the callbacks and enter the requested energy mode.
|
||||
*
|
||||
* @details
|
||||
* This function is not part of the API, therefore it shall not be called by
|
||||
* the user directly as it doesn not have any checks if the system is ready
|
||||
* for sleep!
|
||||
*
|
||||
* @note
|
||||
* The EM4 wakeup callback is not being called from this function because
|
||||
* waking up from EM4 causes a reset.
|
||||
* If SLEEP_EM4_WAKEUP_CALLBACK_ENABLED is set to true, SLEEP_Init() function
|
||||
* checks for the cause of the reset and calls the wakeup callback if the
|
||||
* reset was a wakeup from EM4.
|
||||
******************************************************************************/
|
||||
static void SLEEP_EnterEMx(SLEEP_EnergyMode_t eMode)
|
||||
{
|
||||
EFM_ASSERT((eMode > sleepEM0) && (eMode <= sleepEM4));
|
||||
|
||||
/* Call sleepCallback() before going to sleep. */
|
||||
if (NULL != sleepCallback)
|
||||
{
|
||||
/* Call the callback before going to sleep. */
|
||||
sleepCallback(eMode);
|
||||
}
|
||||
|
||||
/* Enter the requested energy mode. */
|
||||
switch (eMode)
|
||||
{
|
||||
case sleepEM1:
|
||||
{
|
||||
EMU_EnterEM1();
|
||||
} break;
|
||||
|
||||
case sleepEM2:
|
||||
{
|
||||
EMU_EnterEM2(true);
|
||||
} break;
|
||||
|
||||
case sleepEM3:
|
||||
{
|
||||
EMU_EnterEM3(true);
|
||||
} break;
|
||||
|
||||
case sleepEM4:
|
||||
{
|
||||
EMU_EnterEM4();
|
||||
} break;
|
||||
|
||||
default:
|
||||
{
|
||||
/* Don't do anything, stay in EM0. */
|
||||
} break;
|
||||
}
|
||||
|
||||
/* Call the callback after waking up from sleep. */
|
||||
if (NULL != wakeUpCallback)
|
||||
{
|
||||
wakeUpCallback(eMode);
|
||||
}
|
||||
}
|
||||
/** @endcond */
|
||||
|
||||
/** @} (end addtogroup SLEEP */
|
||||
/** @} (end addtogroup EM_Drivers) */
|
@ -0,0 +1,69 @@
|
||||
/***************************************************************************//**
|
||||
* @file em_assert.c
|
||||
* @brief Assert API
|
||||
* @version 4.2.1
|
||||
*******************************************************************************
|
||||
* @section License
|
||||
* <b>(C) Copyright 2015 Silicon Labs, http://www.silabs.com</b>
|
||||
*******************************************************************************
|
||||
*
|
||||
* Permission is granted to anyone to use this software for any purpose,
|
||||
* including commercial applications, and to alter it and redistribute it
|
||||
* freely, subject to the following restrictions:
|
||||
*
|
||||
* 1. The origin of this software must not be misrepresented; you must not
|
||||
* claim that you wrote the original software.
|
||||
* 2. Altered source versions must be plainly marked as such, and must not be
|
||||
* misrepresented as being the original software.
|
||||
* 3. This notice may not be removed or altered from any source distribution.
|
||||
*
|
||||
* DISCLAIMER OF WARRANTY/LIMITATION OF REMEDIES: Silicon Labs has no
|
||||
* obligation to support this Software. Silicon Labs is providing the
|
||||
* Software "AS IS", with no express or implied warranties of any kind,
|
||||
* including, but not limited to, any implied warranties of merchantability
|
||||
* or fitness for any particular purpose or warranties against infringement
|
||||
* of any proprietary rights of a third party.
|
||||
*
|
||||
* Silicon Labs will not be liable for any consequential, incidental, or
|
||||
* special damages, or any other relief, or for any claim by any third party,
|
||||
* arising from your use of this Software.
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
|
||||
#include "em_assert.h"
|
||||
|
||||
#if defined(DEBUG_EFM)
|
||||
|
||||
/***************************************************************************//**
|
||||
* @brief
|
||||
* EFM internal assert handling.
|
||||
*
|
||||
* This function is invoked through EFM_ASSERT() macro usage only, it should
|
||||
* not be used explicitly.
|
||||
*
|
||||
* Currently this implementation only enters an indefinite loop, allowing
|
||||
* the use of a debugger to determine cause of failure. By defining
|
||||
* DEBUG_EFM_USER to the preprocessor for all files, a user defined version
|
||||
* of this function must be defined and will be invoked instead, possibly
|
||||
* providing output of assertion location.
|
||||
*
|
||||
* Please notice that this function is not used unless DEBUG_EFM is defined
|
||||
* during preprocessing of EFM_ASSERT() usage.
|
||||
*
|
||||
* @par file
|
||||
* Name of source file where assertion failed.
|
||||
*
|
||||
* @par line
|
||||
* Line number in source file where assertion failed.
|
||||
******************************************************************************/
|
||||
void assertEFM(const char *file, int line)
|
||||
{
|
||||
(void)file; /* Unused parameter */
|
||||
(void)line; /* Unused parameter */
|
||||
|
||||
while (1)
|
||||
;
|
||||
}
|
||||
|
||||
#endif /* DEBUG_EFM */
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,320 @@
|
||||
/***************************************************************************//**
|
||||
* @file em_gpio.c
|
||||
* @brief General Purpose IO (GPIO) peripheral API
|
||||
* devices.
|
||||
* @version 4.2.1
|
||||
*******************************************************************************
|
||||
* @section License
|
||||
* <b>(C) Copyright 2015 Silicon Labs, http://www.silabs.com</b>
|
||||
*******************************************************************************
|
||||
*
|
||||
* Permission is granted to anyone to use this software for any purpose,
|
||||
* including commercial applications, and to alter it and redistribute it
|
||||
* freely, subject to the following restrictions:
|
||||
*
|
||||
* 1. The origin of this software must not be misrepresented; you must not
|
||||
* claim that you wrote the original software.
|
||||
* 2. Altered source versions must be plainly marked as such, and must not be
|
||||
* misrepresented as being the original software.
|
||||
* 3. This notice may not be removed or altered from any source distribution.
|
||||
*
|
||||
* DISCLAIMER OF WARRANTY/LIMITATION OF REMEDIES: Silicon Labs has no
|
||||
* obligation to support this Software. Silicon Labs is providing the
|
||||
* Software "AS IS", with no express or implied warranties of any kind,
|
||||
* including, but not limited to, any implied warranties of merchantability
|
||||
* or fitness for any particular purpose or warranties against infringement
|
||||
* of any proprietary rights of a third party.
|
||||
*
|
||||
* Silicon Labs will not be liable for any consequential, incidental, or
|
||||
* special damages, or any other relief, or for any claim by any third party,
|
||||
* arising from your use of this Software.
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
|
||||
#include "em_gpio.h"
|
||||
|
||||
#if defined(GPIO_COUNT) && (GPIO_COUNT > 0)
|
||||
|
||||
/***************************************************************************//**
|
||||
* @addtogroup EM_Library
|
||||
* @{
|
||||
******************************************************************************/
|
||||
|
||||
/***************************************************************************//**
|
||||
* @addtogroup GPIO
|
||||
* @brief General Purpose Input/Output (GPIO) API
|
||||
* @{
|
||||
******************************************************************************/
|
||||
|
||||
/*******************************************************************************
|
||||
******************************* DEFINES ***********************************
|
||||
******************************************************************************/
|
||||
|
||||
/** @cond DO_NOT_INCLUDE_WITH_DOXYGEN */
|
||||
|
||||
/** Validation of pin typically usable in assert statements. */
|
||||
#define GPIO_DRIVEMODE_VALID(mode) ((mode) <= 3)
|
||||
#define GPIO_STRENGHT_VALID(strenght) (!((strenght) & \
|
||||
~(_GPIO_P_CTRL_DRIVESTRENGTH_MASK \
|
||||
| _GPIO_P_CTRL_DRIVESTRENGTHALT_MASK)))
|
||||
/** @endcond */
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
************************** GLOBAL FUNCTIONS *******************************
|
||||
******************************************************************************/
|
||||
|
||||
/***************************************************************************//**
|
||||
* @brief
|
||||
* Sets the pin location of the debug pins (Serial Wire interface).
|
||||
*
|
||||
* @note
|
||||
* Changing the pins used for debugging uncontrolled, may result in a lockout.
|
||||
*
|
||||
* @param[in] location
|
||||
* The debug pin location to use (0-3).
|
||||
******************************************************************************/
|
||||
void GPIO_DbgLocationSet(unsigned int location)
|
||||
{
|
||||
#if defined ( _GPIO_ROUTE_SWLOCATION_MASK )
|
||||
EFM_ASSERT(location < AFCHANLOC_MAX);
|
||||
|
||||
GPIO->ROUTE = (GPIO->ROUTE & ~_GPIO_ROUTE_SWLOCATION_MASK) |
|
||||
(location << _GPIO_ROUTE_SWLOCATION_SHIFT);
|
||||
#else
|
||||
(void)location;
|
||||
#endif
|
||||
}
|
||||
|
||||
#if defined (_GPIO_P_CTRL_DRIVEMODE_MASK)
|
||||
/***************************************************************************//**
|
||||
* @brief
|
||||
* Sets the drive mode for a GPIO port.
|
||||
*
|
||||
* @param[in] port
|
||||
* The GPIO port to access.
|
||||
*
|
||||
* @param[in] mode
|
||||
* Drive mode to use for port.
|
||||
******************************************************************************/
|
||||
void GPIO_DriveModeSet(GPIO_Port_TypeDef port, GPIO_DriveMode_TypeDef mode)
|
||||
{
|
||||
EFM_ASSERT(GPIO_PORT_VALID(port) && GPIO_DRIVEMODE_VALID(mode));
|
||||
|
||||
GPIO->P[port].CTRL = (GPIO->P[port].CTRL & ~(_GPIO_P_CTRL_DRIVEMODE_MASK))
|
||||
| (mode << _GPIO_P_CTRL_DRIVEMODE_SHIFT);
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
#if defined (_GPIO_P_CTRL_DRIVESTRENGTH_MASK)
|
||||
/***************************************************************************//**
|
||||
* @brief
|
||||
* Sets the drive strength for a GPIO port.
|
||||
*
|
||||
* @param[in] port
|
||||
* The GPIO port to access.
|
||||
*
|
||||
* @param[in] strength
|
||||
* Drive strength to use for port.
|
||||
******************************************************************************/
|
||||
void GPIO_DriveStrengthSet(GPIO_Port_TypeDef port,
|
||||
GPIO_DriveStrength_TypeDef strength)
|
||||
{
|
||||
EFM_ASSERT(GPIO_PORT_VALID(port) && GPIO_STRENGHT_VALID(strength));
|
||||
BUS_RegMaskedWrite(&GPIO->P[port].CTRL,
|
||||
_GPIO_P_CTRL_DRIVESTRENGTH_MASK | _GPIO_P_CTRL_DRIVESTRENGTHALT_MASK,
|
||||
strength);
|
||||
}
|
||||
#endif
|
||||
|
||||
/***************************************************************************//**
|
||||
* @brief
|
||||
* Configure GPIO interrupt.
|
||||
*
|
||||
* @details
|
||||
* If reconfiguring a GPIO interrupt that is already enabled, it is generally
|
||||
* recommended to disable it first, see GPIO_Disable().
|
||||
*
|
||||
* The actual GPIO interrupt handler must be in place before enabling the
|
||||
* interrupt.
|
||||
*
|
||||
* Notice that any pending interrupt for the selected pin is cleared by this
|
||||
* function.
|
||||
*
|
||||
* @note
|
||||
* A certain pin number can only be associated with one port. Ie, if GPIO
|
||||
* interrupt 1 is assigned to port A/pin 1, then it is not possibly to use
|
||||
* pin 1 from any other ports for interrupts. Please refer to the reference
|
||||
* manual.
|
||||
*
|
||||
* @param[in] port
|
||||
* The port to associate with @p pin.
|
||||
*
|
||||
* @param[in] pin
|
||||
* The GPIO interrupt number (= port pin).
|
||||
*
|
||||
* @param[in] risingEdge
|
||||
* Set to true if interrupts shall be enabled on rising edge, otherwise false.
|
||||
*
|
||||
* @param[in] fallingEdge
|
||||
* Set to true if interrupts shall be enabled on falling edge, otherwise false.
|
||||
*
|
||||
* @param[in] enable
|
||||
* Set to true if interrupt shall be enabled after configuration completed,
|
||||
* false to leave disabled. See GPIO_IntDisable() and GPIO_IntEnable().
|
||||
******************************************************************************/
|
||||
void GPIO_IntConfig(GPIO_Port_TypeDef port,
|
||||
unsigned int pin,
|
||||
bool risingEdge,
|
||||
bool fallingEdge,
|
||||
bool enable)
|
||||
{
|
||||
uint32_t tmp;
|
||||
|
||||
EFM_ASSERT(GPIO_PORT_PIN_VALID(port, pin));
|
||||
|
||||
/* There are two registers controlling the interrupt configuration:
|
||||
* The EXTIPSELL register controls pins 0-7 and EXTIPSELH controls
|
||||
* pins 8-15. */
|
||||
if (pin < 8)
|
||||
{
|
||||
BUS_RegMaskedWrite(&GPIO->EXTIPSELL,
|
||||
0xF << (4 * pin),
|
||||
port << (4 * pin));
|
||||
}
|
||||
else
|
||||
{
|
||||
tmp = pin - 8;
|
||||
BUS_RegMaskedWrite(&GPIO->EXTIPSELH,
|
||||
0xF << (4 * tmp),
|
||||
port << (4 * tmp));
|
||||
}
|
||||
|
||||
/* Enable/disable rising edge */
|
||||
BUS_RegBitWrite(&(GPIO->EXTIRISE), pin, risingEdge);
|
||||
|
||||
/* Enable/disable falling edge */
|
||||
BUS_RegBitWrite(&(GPIO->EXTIFALL), pin, fallingEdge);
|
||||
|
||||
/* Clear any pending interrupt */
|
||||
GPIO->IFC = 1 << pin;
|
||||
|
||||
/* Finally enable/disable interrupt */
|
||||
BUS_RegBitWrite(&(GPIO->IEN), pin, enable);
|
||||
}
|
||||
|
||||
|
||||
/***************************************************************************//**
|
||||
* @brief
|
||||
* Set the mode for a GPIO pin.
|
||||
*
|
||||
* @param[in] port
|
||||
* The GPIO port to access.
|
||||
*
|
||||
* @param[in] pin
|
||||
* The pin number in the port.
|
||||
*
|
||||
* @param[in] mode
|
||||
* The desired pin mode.
|
||||
*
|
||||
* @param[in] out
|
||||
* Value to set for pin in DOUT register. The DOUT setting is important for
|
||||
* even some input mode configurations, determining pull-up/down direction.
|
||||
******************************************************************************/
|
||||
void GPIO_PinModeSet(GPIO_Port_TypeDef port,
|
||||
unsigned int pin,
|
||||
GPIO_Mode_TypeDef mode,
|
||||
unsigned int out)
|
||||
{
|
||||
EFM_ASSERT(GPIO_PORT_PIN_VALID(port, pin));
|
||||
|
||||
/* If disabling pin, do not modify DOUT in order to reduce chance for */
|
||||
/* glitch/spike (may not be sufficient precaution in all use cases) */
|
||||
if (mode != gpioModeDisabled)
|
||||
{
|
||||
if (out)
|
||||
{
|
||||
GPIO_PinOutSet(port, pin);
|
||||
}
|
||||
else
|
||||
{
|
||||
GPIO_PinOutClear(port, pin);
|
||||
}
|
||||
}
|
||||
|
||||
/* There are two registers controlling the pins for each port. The MODEL
|
||||
* register controls pins 0-7 and MODEH controls pins 8-15. */
|
||||
if (pin < 8)
|
||||
{
|
||||
BUS_RegMaskedWrite(&GPIO->P[port].MODEL,
|
||||
0xF << (pin * 4),
|
||||
mode << (pin * 4));
|
||||
}
|
||||
else
|
||||
{
|
||||
BUS_RegMaskedWrite(&GPIO->P[port].MODEH,
|
||||
0xF << ((pin - 8) * 4),
|
||||
mode << ((pin - 8) * 4));
|
||||
}
|
||||
|
||||
if (mode == gpioModeDisabled)
|
||||
{
|
||||
if (out)
|
||||
{
|
||||
GPIO_PinOutSet(port, pin);
|
||||
}
|
||||
else
|
||||
{
|
||||
GPIO_PinOutClear(port, pin);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#if defined( _GPIO_EM4WUEN_MASK )
|
||||
/**************************************************************************//**
|
||||
* @brief
|
||||
* Enable GPIO pin wake-up from EM4. When the function exits,
|
||||
* EM4 mode can be safely entered.
|
||||
*
|
||||
* @note
|
||||
* It is assumed that the GPIO pin modes are set correctly.
|
||||
* Valid modes are @ref gpioModeInput and @ref gpioModeInputPull.
|
||||
*
|
||||
* @param[in] pinmask
|
||||
* Bitmask containing the bitwise logic OR of which GPIO pin(s) to enable.
|
||||
* Refer to Reference Manuals for pinmask to GPIO port/pin mapping.
|
||||
* @param[in] polaritymask
|
||||
* Bitmask containing the bitwise logic OR of GPIO pin(s) wake-up polarity.
|
||||
* Refer to Reference Manuals for pinmask to GPIO port/pin mapping.
|
||||
*****************************************************************************/
|
||||
void GPIO_EM4EnablePinWakeup(uint32_t pinmask, uint32_t polaritymask)
|
||||
{
|
||||
EFM_ASSERT((pinmask & ~_GPIO_EM4WUEN_MASK) == 0);
|
||||
|
||||
#if defined( _GPIO_EM4WUPOL_MASK )
|
||||
EFM_ASSERT((polaritymask & ~_GPIO_EM4WUPOL_MASK) == 0);
|
||||
GPIO->EM4WUPOL &= ~pinmask; /* Set wakeup polarity */
|
||||
GPIO->EM4WUPOL |= pinmask & polaritymask;
|
||||
#elif defined( _GPIO_EXTILEVEL_MASK )
|
||||
EFM_ASSERT((polaritymask & ~_GPIO_EXTILEVEL_MASK) == 0);
|
||||
GPIO->EXTILEVEL &= ~pinmask;
|
||||
GPIO->EXTILEVEL |= pinmask & polaritymask;
|
||||
#endif
|
||||
GPIO->EM4WUEN |= pinmask; /* Enable wakeup */
|
||||
|
||||
GPIO_EM4SetPinRetention(true); /* Enable pin retention */
|
||||
|
||||
#if defined( _GPIO_CMD_EM4WUCLR_MASK )
|
||||
GPIO->CMD = GPIO_CMD_EM4WUCLR; /* Clear wake-up logic */
|
||||
#elif defined( _GPIO_IFC_EM4WU_MASK )
|
||||
GPIO_IntClear(pinmask);
|
||||
#endif
|
||||
}
|
||||
#endif
|
||||
|
||||
/** @} (end addtogroup GPIO) */
|
||||
/** @} (end addtogroup EM_Library) */
|
||||
|
||||
#endif /* defined(GPIO_COUNT) && (GPIO_COUNT > 0) */
|
@ -0,0 +1,73 @@
|
||||
/**************************************************************************//**
|
||||
* @file em_int.c
|
||||
* @brief Interrupt enable/disable unit API
|
||||
* @version 4.2.1
|
||||
******************************************************************************
|
||||
* @section License
|
||||
* <b>(C) Copyright 2015 Silicon Labs, http://www.silabs.com</b>
|
||||
*******************************************************************************
|
||||
*
|
||||
* Permission is granted to anyone to use this software for any purpose,
|
||||
* including commercial applications, and to alter it and redistribute it
|
||||
* freely, subject to the following restrictions:
|
||||
*
|
||||
* 1. The origin of this software must not be misrepresented; you must not
|
||||
* claim that you wrote the original software.
|
||||
* 2. Altered source versions must be plainly marked as such, and must not be
|
||||
* misrepresented as being the original software.
|
||||
* 3. This notice may not be removed or altered from any source distribution.
|
||||
*
|
||||
* DISCLAIMER OF WARRANTY/LIMITATION OF REMEDIES: Silicon Labs has no
|
||||
* obligation to support this Software. Silicon Labs is providing the
|
||||
* Software "AS IS", with no express or implied warranties of any kind,
|
||||
* including, but not limited to, any implied warranties of merchantability
|
||||
* or fitness for any particular purpose or warranties against infringement
|
||||
* of any proprietary rights of a third party.
|
||||
*
|
||||
* Silicon Labs will not be liable for any consequential, incidental, or
|
||||
* special damages, or any other relief, or for any claim by any third party,
|
||||
* arising from your use of this Software.
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
#include <stdint.h>
|
||||
#include "em_int.h"
|
||||
|
||||
/***************************************************************************//**
|
||||
* @addtogroup EM_Library
|
||||
* @{
|
||||
******************************************************************************/
|
||||
|
||||
/***************************************************************************//**
|
||||
* @addtogroup INT
|
||||
* @brief Safe nesting of interrupt disable/enable API
|
||||
* @{
|
||||
* @details
|
||||
* This module contains functions to safely disable and enable interrupts
|
||||
* at CPU level. INT_Disable() disables interrupts globally and increments a lock
|
||||
* level counter (counting semaphore). INT_Enable() decrements the lock level
|
||||
* counter and enable interrupts if the counter reaches zero.
|
||||
*
|
||||
* These functions would normally be used to secure critical regions, and
|
||||
* to make sure that a critical section that calls into another critical
|
||||
* section does not unintentionally terminate the callee critical section.
|
||||
*
|
||||
* These functions should also be used inside interrupt handlers:
|
||||
* @verbatim
|
||||
* void SysTick_Handler(void)
|
||||
* {
|
||||
* INT_Disable();
|
||||
* .
|
||||
* .
|
||||
* .
|
||||
* INT_Enable();
|
||||
* }
|
||||
* @endverbatim
|
||||
******************************************************************************/
|
||||
|
||||
/** Interrupt lock level counter. Set to zero initially as we normally enter
|
||||
* main with interrupts enabled */
|
||||
uint32_t INT_LockCnt = 0;
|
||||
|
||||
/** @} (end addtogroup INT) */
|
||||
/** @} (end addtogroup EM_Library) */
|
@ -0,0 +1,180 @@
|
||||
/***************************************************************************//**
|
||||
* @file
|
||||
* @brief Real Time Counter with Calendar (RTCC) Peripheral API
|
||||
* @version 4.2.1
|
||||
*******************************************************************************
|
||||
* @section License
|
||||
* <b>(C) Copyright 2015 Silicon Labs, http://www.silabs.com</b>
|
||||
*******************************************************************************
|
||||
*
|
||||
* Permission is granted to anyone to use this software for any purpose,
|
||||
* including commercial applications, and to alter it and redistribute it
|
||||
* freely, subject to the following restrictions:
|
||||
*
|
||||
* 1. The origin of this software must not be misrepresented; you must not
|
||||
* claim that you wrote the original software.
|
||||
* 2. Altered source versions must be plainly marked as such, and must not be
|
||||
* misrepresented as being the original software.
|
||||
* 3. This notice may not be removed or altered from any source distribution.
|
||||
*
|
||||
* DISCLAIMER OF WARRANTY/LIMITATION OF REMEDIES: Silicon Labs has no
|
||||
* obligation to support this Software. Silicon Labs is providing the
|
||||
* Software "AS IS", with no express or implied warranties of any kind,
|
||||
* including, but not limited to, any implied warranties of merchantability
|
||||
* or fitness for any particular purpose or warranties against infringement
|
||||
* of any proprietary rights of a third party.
|
||||
*
|
||||
* Silicon Labs will not be liable for any consequential, incidental, or
|
||||
* special damages, or any other relief, or for any claim by any third party,
|
||||
* arising from your use of this Software.
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
#include "em_rtcc.h"
|
||||
#if defined( RTCC_COUNT ) && ( RTCC_COUNT == 1 )
|
||||
#include "em_bus.h"
|
||||
|
||||
/***************************************************************************//**
|
||||
* @addtogroup EM_Library
|
||||
* @{
|
||||
******************************************************************************/
|
||||
|
||||
/***************************************************************************//**
|
||||
* @addtogroup RTCC
|
||||
* @brief Real Time Counter (RTCC) Peripheral API
|
||||
* @{
|
||||
******************************************************************************/
|
||||
|
||||
/*******************************************************************************
|
||||
******************************* DEFINES ***********************************
|
||||
******************************************************************************/
|
||||
|
||||
/*******************************************************************************
|
||||
************************** LOCAL FUNCTIONS ********************************
|
||||
******************************************************************************/
|
||||
|
||||
/*******************************************************************************
|
||||
************************** GLOBAL FUNCTIONS *******************************
|
||||
******************************************************************************/
|
||||
|
||||
/***************************************************************************//**
|
||||
* @brief
|
||||
* Configure the selected capture/compare channel of the RTCC.
|
||||
*
|
||||
* @details
|
||||
* Use this function to configure a RTCC channel.
|
||||
* Select capture/compare mode, match output action, overflow output action
|
||||
* and PRS input configuration.
|
||||
* Refer to the configuration structure @ref RTCC_CCChConf_TypeDef for more
|
||||
* details.
|
||||
*
|
||||
* @param[in] ch
|
||||
* Channel selector.
|
||||
*
|
||||
* @param[in] confPtr
|
||||
* Pointer to configuration structure.
|
||||
******************************************************************************/
|
||||
void RTCC_ChannelInit( int ch, RTCC_CCChConf_TypeDef const *confPtr )
|
||||
{
|
||||
EFM_ASSERT( RTCC_CH_VALID( ch ) );
|
||||
EFM_ASSERT( (uint32_t)confPtr->compMask
|
||||
< ( _RTCC_CC_CTRL_COMPMASK_MASK >> _RTCC_CC_CTRL_COMPMASK_SHIFT )
|
||||
+ 1 );
|
||||
|
||||
/** Configure the selected capture/compare channel. */
|
||||
RTCC->CC[ch].CTRL = ( (uint32_t)confPtr->chMode << _RTCC_CC_CTRL_MODE_SHIFT )
|
||||
| ( (uint32_t)confPtr->compMatchOutAction << _RTCC_CC_CTRL_CMOA_SHIFT )
|
||||
| ( (uint32_t)confPtr->prsSel << _RTCC_CC_CTRL_PRSSEL_SHIFT )
|
||||
| ( (uint32_t)confPtr->inputEdgeSel << _RTCC_CC_CTRL_ICEDGE_SHIFT )
|
||||
| ( (uint32_t)confPtr->compBase << _RTCC_CC_CTRL_COMPBASE_SHIFT )
|
||||
| ( (uint32_t)confPtr->compMask << _RTCC_CC_CTRL_COMPMASK_SHIFT )
|
||||
| ( (uint32_t)confPtr->dayCompMode << _RTCC_CC_CTRL_DAYCC_SHIFT );
|
||||
}
|
||||
|
||||
/***************************************************************************//**
|
||||
* @brief
|
||||
* Enable/disable RTCC.
|
||||
*
|
||||
* @param[in] enable
|
||||
* True to enable RTCC, false to disable.
|
||||
******************************************************************************/
|
||||
void RTCC_Enable( bool enable )
|
||||
{
|
||||
/* Bitbanding the enable bit in the CTRL register (atomic). */
|
||||
BUS_RegBitWrite((&RTCC->CTRL), _RTCC_CTRL_ENABLE_SHIFT, enable);
|
||||
}
|
||||
|
||||
/***************************************************************************//**
|
||||
* @brief
|
||||
* Initialize RTCC.
|
||||
*
|
||||
* @details
|
||||
* Note that the compare values must be set separately with RTCC_CompareSet().
|
||||
* That should probably be done prior to the use of this function if
|
||||
* configuring the RTCC to start when initialization is completed.
|
||||
*
|
||||
* @param[in] init
|
||||
* Pointer to RTCC initialization structure.
|
||||
******************************************************************************/
|
||||
void RTCC_Init( const RTCC_Init_TypeDef *init )
|
||||
{
|
||||
RTCC->CTRL = ( (uint32_t)init->enable << _RTCC_CTRL_ENABLE_SHIFT )
|
||||
| ( (uint32_t)init->debugRun << _RTCC_CTRL_DEBUGRUN_SHIFT )
|
||||
| ( (uint32_t)init->precntWrapOnCCV0 << _RTCC_CTRL_PRECCV0TOP_SHIFT )
|
||||
| ( (uint32_t)init->cntWrapOnCCV1 << _RTCC_CTRL_CCV1TOP_SHIFT )
|
||||
| ( (uint32_t)init->presc << _RTCC_CTRL_CNTPRESC_SHIFT )
|
||||
| ( (uint32_t)init->prescMode << _RTCC_CTRL_CNTTICK_SHIFT )
|
||||
#if defined(_RTCC_CTRL_BUMODETSEN_MASK)
|
||||
| ( (uint32_t)init->enaBackupModeSet << _RTCC_CTRL_BUMODETSEN_SHIFT )
|
||||
#endif
|
||||
| ( (uint32_t)init->enaOSCFailDetect << _RTCC_CTRL_OSCFDETEN_SHIFT )
|
||||
| ( (uint32_t)init->cntMode << _RTCC_CTRL_CNTMODE_SHIFT )
|
||||
| ( (uint32_t)init->disLeapYearCorr << _RTCC_CTRL_LYEARCORRDIS_SHIFT );
|
||||
}
|
||||
|
||||
/***************************************************************************//**
|
||||
* @brief
|
||||
* Restore RTCC to its reset state.
|
||||
******************************************************************************/
|
||||
void RTCC_Reset( void )
|
||||
{
|
||||
int i;
|
||||
|
||||
/* Restore all RTCC registers to their default values. */
|
||||
RTCC_Unlock();
|
||||
RTCC->CTRL = _RTCC_CTRL_RESETVALUE;
|
||||
RTCC->PRECNT = _RTCC_PRECNT_RESETVALUE;
|
||||
RTCC->CNT = _RTCC_CNT_RESETVALUE;
|
||||
RTCC->TIME = _RTCC_TIME_RESETVALUE;
|
||||
RTCC->DATE = _RTCC_DATE_RESETVALUE;
|
||||
RTCC->IEN = _RTCC_IEN_RESETVALUE;
|
||||
RTCC->IFC = _RTCC_IFC_MASK;
|
||||
RTCC_StatusClear();
|
||||
RTCC->EM4WUEN = _RTCC_EM4WUEN_RESETVALUE;
|
||||
|
||||
for (i = 0; i < 3; i++)
|
||||
{
|
||||
RTCC->CC[i].CTRL = _RTCC_CC_CTRL_RESETVALUE;
|
||||
RTCC->CC[i].CCV = _RTCC_CC_CCV_RESETVALUE;
|
||||
RTCC->CC[i].TIME = _RTCC_CC_TIME_RESETVALUE;
|
||||
RTCC->CC[i].DATE = _RTCC_CC_DATE_RESETVALUE;
|
||||
}
|
||||
}
|
||||
|
||||
/***************************************************************************//**
|
||||
* @brief
|
||||
* Clear STATUS register.
|
||||
******************************************************************************/
|
||||
void RTCC_StatusClear( void )
|
||||
{
|
||||
while ( RTCC->SYNCBUSY & RTCC_SYNCBUSY_CMD )
|
||||
{
|
||||
// Wait for syncronization.
|
||||
}
|
||||
RTCC->CMD = RTCC_CMD_CLRSTATUS;
|
||||
}
|
||||
|
||||
/** @} (end addtogroup RTCC) */
|
||||
/** @} (end addtogroup EM_Library) */
|
||||
|
||||
#endif /* defined( RTCC_COUNT ) && ( RTCC_COUNT == 1 ) */
|
@ -0,0 +1,121 @@
|
||||
/***************************************************************************//**
|
||||
* @file em_system.c
|
||||
* @brief System Peripheral API
|
||||
* @version 4.2.1
|
||||
*******************************************************************************
|
||||
* @section License
|
||||
* <b>(C) Copyright 2015 Silicon Labs, http://www.silabs.com</b>
|
||||
*******************************************************************************
|
||||
*
|
||||
* Permission is granted to anyone to use this software for any purpose,
|
||||
* including commercial applications, and to alter it and redistribute it
|
||||
* freely, subject to the following restrictions:
|
||||
*
|
||||
* 1. The origin of this software must not be misrepresented; you must not
|
||||
* claim that you wrote the original software.
|
||||
* 2. Altered source versions must be plainly marked as such, and must not be
|
||||
* misrepresented as being the original software.
|
||||
* 3. This notice may not be removed or altered from any source distribution.
|
||||
*
|
||||
* DISCLAIMER OF WARRANTY/LIMITATION OF REMEDIES: Silicon Labs has no
|
||||
* obligation to support this Software. Silicon Labs is providing the
|
||||
* Software "AS IS", with no express or implied warranties of any kind,
|
||||
* including, but not limited to, any implied warranties of merchantability
|
||||
* or fitness for any particular purpose or warranties against infringement
|
||||
* of any proprietary rights of a third party.
|
||||
*
|
||||
* Silicon Labs will not be liable for any consequential, incidental, or
|
||||
* special damages, or any other relief, or for any claim by any third party,
|
||||
* arising from your use of this Software.
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
#include "em_system.h"
|
||||
#include "em_assert.h"
|
||||
|
||||
/***************************************************************************//**
|
||||
* @addtogroup EM_Library
|
||||
* @{
|
||||
******************************************************************************/
|
||||
|
||||
/***************************************************************************//**
|
||||
* @addtogroup SYSTEM
|
||||
* @brief System Peripheral API
|
||||
* @{
|
||||
******************************************************************************/
|
||||
|
||||
/*******************************************************************************
|
||||
************************** GLOBAL FUNCTIONS *******************************
|
||||
******************************************************************************/
|
||||
|
||||
/***************************************************************************//**
|
||||
* @brief
|
||||
* Get chip major/minor revision.
|
||||
*
|
||||
* @param[out] rev
|
||||
* Location to place chip revision info.
|
||||
******************************************************************************/
|
||||
void SYSTEM_ChipRevisionGet(SYSTEM_ChipRevision_TypeDef *rev)
|
||||
{
|
||||
uint8_t tmp;
|
||||
|
||||
EFM_ASSERT(rev);
|
||||
|
||||
/* CHIP FAMILY bit [5:2] */
|
||||
tmp = (((ROMTABLE->PID1 & _ROMTABLE_PID1_FAMILYMSB_MASK) >> _ROMTABLE_PID1_FAMILYMSB_SHIFT) << 2);
|
||||
/* CHIP FAMILY bit [1:0] */
|
||||
tmp |= ((ROMTABLE->PID0 & _ROMTABLE_PID0_FAMILYLSB_MASK) >> _ROMTABLE_PID0_FAMILYLSB_SHIFT);
|
||||
rev->family = tmp;
|
||||
|
||||
/* CHIP MAJOR bit [3:0] */
|
||||
rev->major = (ROMTABLE->PID0 & _ROMTABLE_PID0_REVMAJOR_MASK) >> _ROMTABLE_PID0_REVMAJOR_SHIFT;
|
||||
|
||||
/* CHIP MINOR bit [7:4] */
|
||||
tmp = (((ROMTABLE->PID2 & _ROMTABLE_PID2_REVMINORMSB_MASK) >> _ROMTABLE_PID2_REVMINORMSB_SHIFT) << 4);
|
||||
/* CHIP MINOR bit [3:0] */
|
||||
tmp |= ((ROMTABLE->PID3 & _ROMTABLE_PID3_REVMINORLSB_MASK) >> _ROMTABLE_PID3_REVMINORLSB_SHIFT);
|
||||
rev->minor = tmp;
|
||||
}
|
||||
|
||||
|
||||
#if defined(CALIBRATE)
|
||||
/***************************************************************************//**
|
||||
* @brief
|
||||
* Get factory calibration value for a given peripheral register.
|
||||
*
|
||||
* @param[in] regAddress
|
||||
* Address of register to get a calibration value for.
|
||||
*
|
||||
* @return
|
||||
* Calibration value for the requested register.
|
||||
******************************************************************************/
|
||||
uint32_t SYSTEM_GetCalibrationValue(volatile uint32_t *regAddress)
|
||||
{
|
||||
int regCount;
|
||||
CALIBRATE_TypeDef *p;
|
||||
|
||||
regCount = 1;
|
||||
p = CALIBRATE;
|
||||
|
||||
for (;; )
|
||||
{
|
||||
if ((regCount > CALIBRATE_MAX_REGISTERS) ||
|
||||
(p->VALUE == 0xFFFFFFFF))
|
||||
{
|
||||
EFM_ASSERT(false);
|
||||
return 0; /* End of device calibration table reached. */
|
||||
}
|
||||
|
||||
if (p->ADDRESS == (uint32_t)regAddress)
|
||||
{
|
||||
return p->VALUE; /* Calibration value found ! */
|
||||
}
|
||||
|
||||
p++;
|
||||
regCount++;
|
||||
}
|
||||
}
|
||||
#endif /* defined (CALIBRATE) */
|
||||
|
||||
/** @} (end addtogroup SYSTEM) */
|
||||
/** @} (end addtogroup EM_Library) */
|
@ -0,0 +1,255 @@
|
||||
/*
|
||||
FreeRTOS V9.0.0rc1 - Copyright (C) 2016 Real Time Engineers Ltd.
|
||||
All rights reserved
|
||||
|
||||
VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION.
|
||||
|
||||
This file is part of the FreeRTOS distribution.
|
||||
|
||||
FreeRTOS is free software; you can redistribute it and/or modify it under
|
||||
the terms of the GNU General Public License (version 2) as published by the
|
||||
Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception.
|
||||
|
||||
***************************************************************************
|
||||
>>! NOTE: The modification to the GPL is included to allow you to !<<
|
||||
>>! distribute a combined work that includes FreeRTOS without being !<<
|
||||
>>! obliged to provide the source code for proprietary components !<<
|
||||
>>! outside of the FreeRTOS kernel. !<<
|
||||
***************************************************************************
|
||||
|
||||
FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY
|
||||
WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
|
||||
FOR A PARTICULAR PURPOSE. Full license text is available on the following
|
||||
link: http://www.freertos.org/a00114.html
|
||||
|
||||
***************************************************************************
|
||||
* *
|
||||
* FreeRTOS provides completely free yet professionally developed, *
|
||||
* robust, strictly quality controlled, supported, and cross *
|
||||
* platform software that is more than just the market leader, it *
|
||||
* is the industry's de facto standard. *
|
||||
* *
|
||||
* Help yourself get started quickly while simultaneously helping *
|
||||
* to support the FreeRTOS project by purchasing a FreeRTOS *
|
||||
* tutorial book, reference manual, or both: *
|
||||
* http://www.FreeRTOS.org/Documentation *
|
||||
* *
|
||||
***************************************************************************
|
||||
|
||||
http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading
|
||||
the FAQ page "My application does not run, what could be wrong?". Have you
|
||||
defined configASSERT()?
|
||||
|
||||
http://www.FreeRTOS.org/support - In return for receiving this top quality
|
||||
embedded software for free we request you assist our global community by
|
||||
participating in the support forum.
|
||||
|
||||
http://www.FreeRTOS.org/training - Investing in training allows your team to
|
||||
be as productive as possible as early as possible. Now you can receive
|
||||
FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers
|
||||
Ltd, and the world's leading authority on the world's leading RTOS.
|
||||
|
||||
http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products,
|
||||
including FreeRTOS+Trace - an indispensable productivity tool, a DOS
|
||||
compatible FAT file system, and our tiny thread aware UDP/IP stack.
|
||||
|
||||
http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate.
|
||||
Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS.
|
||||
|
||||
http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High
|
||||
Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS
|
||||
licenses offer ticketed support, indemnification and commercial middleware.
|
||||
|
||||
http://www.SafeRTOS.com - High Integrity Systems also provide a safety
|
||||
engineered and independently SIL3 certified version for use in safety and
|
||||
mission critical applications that require provable dependability.
|
||||
|
||||
1 tab == 4 spaces!
|
||||
*/
|
||||
|
||||
/******************************************************************************
|
||||
* This project provides two demo applications. A simple blinky style project
|
||||
* that demonstrates low power tickless functionality, and a more comprehensive
|
||||
* test and demo application. The configCREATE_LOW_POWER_DEMO setting, which is
|
||||
* defined in FreeRTOSConfig.h, is used to select between the two, and to select
|
||||
* the clock used when demonstrating tickless functionality.
|
||||
*
|
||||
* The simply blinky low power demo is implemented and described in
|
||||
* main_low_power.c. The more comprehensive test and demo application is
|
||||
* implemented and described in main_full.c.
|
||||
*
|
||||
* This file implements the code that is not demo specific, including the
|
||||
* hardware setup and standard FreeRTOS hook functions.
|
||||
*
|
||||
* ENSURE TO READ THE DOCUMENTATION PAGE FOR THIS PORT AND DEMO APPLICATION ON
|
||||
* THE http://www.FreeRTOS.org WEB SITE FOR FULL INFORMATION ON USING THIS DEMO
|
||||
* APPLICATION, AND ITS ASSOCIATE FreeRTOS ARCHITECTURE PORT!
|
||||
*
|
||||
*/
|
||||
|
||||
/* FreeRTOS includes. */
|
||||
#include "FreeRTOS.h"
|
||||
#include "task.h"
|
||||
|
||||
/* SiLabs includes. */
|
||||
#include "em_emu.h"
|
||||
#include "bsp.h"
|
||||
#include "bsp_trace.h"
|
||||
#include "sleep.h"
|
||||
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
/*
|
||||
* Configure the hardware as necessary to run this demo.
|
||||
*/
|
||||
static void prvSetupHardware( void );
|
||||
|
||||
/*
|
||||
* main_low_power() is used when configCREATE_LOW_POWER_DEMO is set to 1.
|
||||
* main_full() is used when configCREATE_LOW_POWER_DEMO is set to 0.
|
||||
*/
|
||||
#if( configCREATE_LOW_POWER_DEMO != 0 )
|
||||
extern void main_low_power( void );
|
||||
#else
|
||||
extern void main_full( void );
|
||||
#endif /* #if configCREATE_LOW_POWER_DEMO == 1 */
|
||||
|
||||
/* Prototypes for the standard FreeRTOS callback/hook functions implemented
|
||||
within this file. */
|
||||
void vApplicationMallocFailedHook( void );
|
||||
void vApplicationIdleHook( void );
|
||||
void vApplicationStackOverflowHook( TaskHandle_t pxTask, char *pcTaskName );
|
||||
void vApplicationTickHook( void );
|
||||
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
int main( void )
|
||||
{
|
||||
/* Configure the hardware ready to run the demo. */
|
||||
prvSetupHardware();
|
||||
|
||||
/* The mainCREATE_LOW_POWER_DEMO setting is described at the top
|
||||
of this file. */
|
||||
#if( configCREATE_LOW_POWER_DEMO != 0 )
|
||||
{
|
||||
main_low_power();
|
||||
}
|
||||
#else
|
||||
{
|
||||
main_full();
|
||||
}
|
||||
#endif
|
||||
|
||||
/* Should not get here. */
|
||||
return 0;
|
||||
}
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
static void prvSetupHardware( void )
|
||||
{
|
||||
EMU_DCDCInit_TypeDef xDCDInit = EMU_DCDCINIT_STK_DEFAULT;
|
||||
CMU_HFXOInit_TypeDef xHFXOInit = CMU_HFXOINIT_STK_DEFAULT;
|
||||
|
||||
/* Chip errata */
|
||||
CHIP_Init();
|
||||
|
||||
/* Init DCDC regulator and HFXO with kit specific parameters */
|
||||
EMU_DCDCInit( &xDCDInit );
|
||||
CMU_HFXOInit( &xHFXOInit );
|
||||
|
||||
/* Switch HFCLK to HFXO and disable HFRCO */
|
||||
CMU_ClockSelectSet( cmuClock_HF, cmuSelect_HFXO );
|
||||
CMU_OscillatorEnable( cmuOsc_HFRCO, false, false );
|
||||
|
||||
/* Initialize LED driver. */
|
||||
BSP_LedsInit();
|
||||
BSP_LedSet( 0 );
|
||||
BSP_LedClear( 1 );
|
||||
}
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
void vApplicationMallocFailedHook( void )
|
||||
{
|
||||
/* Called if a call to pvPortMalloc() fails because there is insufficient
|
||||
free memory available in the FreeRTOS heap. pvPortMalloc() is called
|
||||
internally by FreeRTOS API functions that create tasks, queues, software
|
||||
timers, and semaphores. The size of the FreeRTOS heap is set by the
|
||||
configTOTAL_HEAP_SIZE configuration constant in FreeRTOSConfig.h. */
|
||||
|
||||
/* Force an assert. */
|
||||
configASSERT( ( volatile void * ) NULL );
|
||||
}
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
void vApplicationStackOverflowHook( TaskHandle_t pxTask, char *pcTaskName )
|
||||
{
|
||||
( void ) pcTaskName;
|
||||
( void ) pxTask;
|
||||
|
||||
/* Run time stack overflow checking is performed if
|
||||
configCHECK_FOR_STACK_OVERFLOW is defined to 1 or 2. This hook
|
||||
function is called if a stack overflow is detected. */
|
||||
|
||||
/* Force an assert. */
|
||||
configASSERT( ( volatile void * ) NULL );
|
||||
}
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
void vApplicationIdleHook( void )
|
||||
{
|
||||
volatile size_t xFreeHeapSpace;
|
||||
|
||||
/* This is just a trivial example of an idle hook. It is called on each
|
||||
cycle of the idle task. It must *NOT* attempt to block. In this case the
|
||||
idle task just queries the amount of FreeRTOS heap that remains. See the
|
||||
memory management section on the http://www.FreeRTOS.org web site for memory
|
||||
management options. If there is a lot of heap memory free then the
|
||||
configTOTAL_HEAP_SIZE value in FreeRTOSConfig.h can be reduced to free up
|
||||
RAM. */
|
||||
xFreeHeapSpace = xPortGetFreeHeapSize();
|
||||
|
||||
/* Remove compiler warning about xFreeHeapSpace being set but never used. */
|
||||
( void ) xFreeHeapSpace;
|
||||
}
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
void vApplicationTickHook( void )
|
||||
{
|
||||
/* The full demo includes tests that run from the tick hook. */
|
||||
#if( configCREATE_LOW_POWER_DEMO == 0 )
|
||||
{
|
||||
extern void vFullDemoTickHook( void );
|
||||
|
||||
/* Some of the tests and demo tasks executed by the full demo include
|
||||
interaction from an interrupt - for which the tick interrupt is used
|
||||
via the tick hook function. */
|
||||
vFullDemoTickHook();
|
||||
}
|
||||
#endif
|
||||
}
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
void vApplicationGetIdleTaskMemory( StaticTask_t **ppxIdleTaskTCBBuffer, StackType_t **ppxIdleTaskStackBuffer, uint16_t *pusIdleTaskStackSize )
|
||||
{
|
||||
/* configUSE_STATIC_ALLOCATION is set to 1, so the application has the
|
||||
opportunity to supply the buffers that will be used by the Idle task as its
|
||||
stack and to hold its TCB. If these are set to NULL then the buffers will
|
||||
be allocated dynamically, just as if xTaskCreate() had been called. */
|
||||
*ppxIdleTaskTCBBuffer = NULL;
|
||||
*ppxIdleTaskStackBuffer = NULL;
|
||||
*pusIdleTaskStackSize = configMINIMAL_STACK_SIZE; /* In words. NOT in bytes! */
|
||||
}
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
void vApplicationGetTimerTaskMemory( StaticTask_t **ppxTimerTaskTCBBuffer, StackType_t **ppxTimerTaskStackBuffer, uint16_t *pusTimerTaskStackSize )
|
||||
{
|
||||
/* configUSE_STATIC_ALLOCATION is set to 1, so the application has the
|
||||
opportunity to supply the buffers that will be used by the Timer/RTOS daemon
|
||||
task as its stack and to hold its TCB. If these are set to NULL then the
|
||||
buffers will be allocated dynamically, just as if xTaskCreate() had been
|
||||
called. */
|
||||
*ppxTimerTaskTCBBuffer = NULL;
|
||||
*ppxTimerTaskStackBuffer = NULL;
|
||||
*pusTimerTaskStackSize = configTIMER_TASK_STACK_DEPTH; /* In words. NOT in bytes! */
|
||||
}
|
||||
/*-----------------------------------------------------------*/
|
@ -0,0 +1,5 @@
|
||||
[{000214A0-0000-0000-C000-000000000046}]
|
||||
Prop3=19,2
|
||||
[InternetShortcut]
|
||||
URL=http://www.freertos.org/FreeRTOS-V9.html
|
||||
IDList=
|
Loading…
Reference in New Issue