commit
28eae75b21
@ -1,243 +0,0 @@
|
|||||||
<?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.crt.advproject.config.exe.debug.1459795002">
|
|
||||||
<storageModule buildSystemId="org.eclipse.cdt.managedbuilder.core.configurationDataProvider" id="com.crt.advproject.config.exe.debug.1459795002" moduleId="org.eclipse.cdt.core.settings" name="Debug">
|
|
||||||
<externalSettings/>
|
|
||||||
<extensions>
|
|
||||||
<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="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 moduleId="cdtBuildSystem" version="4.0.0">
|
|
||||||
<configuration artifactExtension="axf" artifactName="${ProjName}" buildArtefactType="org.eclipse.cdt.build.core.buildArtefactType.exe" buildProperties="org.eclipse.cdt.build.core.buildArtefactType=org.eclipse.cdt.build.core.buildArtefactType.exe" cleanCommand="rm -rf" description="Debug build" errorParsers="org.eclipse.cdt.core.CWDLocator;org.eclipse.cdt.core.GmakeErrorParser;org.eclipse.cdt.core.GCCErrorParser;org.eclipse.cdt.core.GLDErrorParser;org.eclipse.cdt.core.GASErrorParser" id="com.crt.advproject.config.exe.debug.1459795002" name="Debug" parent="com.crt.advproject.config.exe.debug" postannouncebuildStep="Performing post-build steps" postbuildStep="arm-none-eabi-size "${BuildArtifactFileName}"; # arm-none-eabi-objcopy -O binary "${BuildArtifactFileName}" "${BuildArtifactFileBaseName}.bin" ; checksum -p ${TargetChip} -d "${BuildArtifactFileBaseName}.bin"; ">
|
|
||||||
<folderInfo id="com.crt.advproject.config.exe.debug.1459795002." name="/" resourcePath="">
|
|
||||||
<toolChain id="com.crt.advproject.toolchain.exe.debug.442948681" name="Code Red MCU Tools" superClass="com.crt.advproject.toolchain.exe.debug">
|
|
||||||
<targetPlatform binaryParser="org.eclipse.cdt.core.ELF;org.eclipse.cdt.core.GNU_ELF" id="com.crt.advproject.platform.exe.debug.1950213124" name="ARM-based MCU (Debug)" superClass="com.crt.advproject.platform.exe.debug"/>
|
|
||||||
<builder buildPath="${workspace_loc:/freertos_blinky}/Debug" id="com.crt.advproject.builder.exe.debug.663820658" keepEnvironmentInBuildfile="false" managedBuildOn="true" name="Gnu Make Builder" superClass="com.crt.advproject.builder.exe.debug"/>
|
|
||||||
<tool id="com.crt.advproject.cpp.exe.debug.829489589" name="MCU C++ Compiler" superClass="com.crt.advproject.cpp.exe.debug">
|
|
||||||
<option id="com.crt.advproject.cpp.hdrlib.1429955141" superClass="com.crt.advproject.cpp.hdrlib" useByScannerDiscovery="false"/>
|
|
||||||
<option id="gnu.cpp.compiler.option.preprocessor.def.880776425" superClass="gnu.cpp.compiler.option.preprocessor.def" useByScannerDiscovery="false"/>
|
|
||||||
<option id="com.crt.advproject.cpp.fpu.1443305049" superClass="com.crt.advproject.cpp.fpu" useByScannerDiscovery="true"/>
|
|
||||||
</tool>
|
|
||||||
<tool id="com.crt.advproject.gcc.exe.debug.1215512120" name="MCU C Compiler" superClass="com.crt.advproject.gcc.exe.debug">
|
|
||||||
<option id="com.crt.advproject.gcc.arch.1109364070" name="Architecture" superClass="com.crt.advproject.gcc.arch" useByScannerDiscovery="true" value="com.crt.advproject.gcc.target.cm0" valueType="enumerated"/>
|
|
||||||
<option id="com.crt.advproject.gcc.thumb.1807124856" name="Thumb mode" superClass="com.crt.advproject.gcc.thumb" useByScannerDiscovery="false" value="true" valueType="boolean"/>
|
|
||||||
<option id="com.crt.advproject.gcc.hdrlib.1996203239" name="Use headers for C library" superClass="com.crt.advproject.gcc.hdrlib" useByScannerDiscovery="false" value="com.crt.advproject.gcc.hdrlib.codered" valueType="enumerated"/>
|
|
||||||
<option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="gnu.c.compiler.option.preprocessor.def.symbols.2030244760" name="Defined symbols (-D)" superClass="gnu.c.compiler.option.preprocessor.def.symbols" useByScannerDiscovery="false" valueType="definedSymbols">
|
|
||||||
<listOptionValue builtIn="false" value="__REDLIB__"/>
|
|
||||||
<listOptionValue builtIn="false" value="DEBUG"/>
|
|
||||||
<listOptionValue builtIn="false" value="__CODE_RED"/>
|
|
||||||
<listOptionValue builtIn="false" value="__USE_LPCOPEN"/>
|
|
||||||
<listOptionValue builtIn="false" value="__MTB_BUFFER_SIZE=256"/>
|
|
||||||
<listOptionValue builtIn="false" value="CORE_M0PLUS"/>
|
|
||||||
<listOptionValue builtIn="false" value="__USE_ROMDIVIDE"/>
|
|
||||||
</option>
|
|
||||||
<option id="gnu.c.compiler.option.misc.other.817719932" name="Other flags" superClass="gnu.c.compiler.option.misc.other" useByScannerDiscovery="false" value="-c -fmessage-length=0 -fno-builtin -ffunction-sections -fdata-sections" valueType="string"/>
|
|
||||||
<option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="gnu.c.compiler.option.include.paths.995129009" superClass="gnu.c.compiler.option.include.paths" useByScannerDiscovery="false" valueType="includePath">
|
|
||||||
<listOptionValue builtIn="false" value=""${workspace_loc:/lpc_chip_11u6x/inc}""/>
|
|
||||||
<listOptionValue builtIn="false" value=""${workspace_loc:/lpc_board_nxp_lpcxpresso_11u68/inc}""/>
|
|
||||||
<listOptionValue builtIn="false" value=""${workspace_loc:/${ProjName}/example/inc}""/>
|
|
||||||
<listOptionValue builtIn="false" value=""${workspace_loc:/${ProjName}/freertos/inc}""/>
|
|
||||||
</option>
|
|
||||||
<option id="com.crt.advproject.gcc.fpu.254185411" superClass="com.crt.advproject.gcc.fpu" useByScannerDiscovery="true"/>
|
|
||||||
<inputType id="com.crt.advproject.compiler.input.756127691" superClass="com.crt.advproject.compiler.input"/>
|
|
||||||
</tool>
|
|
||||||
<tool id="com.crt.advproject.gas.exe.debug.1223846629" name="MCU Assembler" superClass="com.crt.advproject.gas.exe.debug">
|
|
||||||
<option id="com.crt.advproject.gas.arch.969996421" name="Architecture" superClass="com.crt.advproject.gas.arch" value="com.crt.advproject.gas.target.cm0" valueType="enumerated"/>
|
|
||||||
<option id="com.crt.advproject.gas.thumb.989839612" name="Thumb mode" superClass="com.crt.advproject.gas.thumb" value="true" valueType="boolean"/>
|
|
||||||
<option id="gnu.both.asm.option.flags.crt.1839060425" name="Assembler flags" superClass="gnu.both.asm.option.flags.crt" value="-c -x assembler-with-cpp -D__REDLIB__ -DDEBUG -D__CODE_RED -D__USE_ROMDIVIDE" valueType="string"/>
|
|
||||||
<option id="com.crt.advproject.gas.hdrlib.820856899" name="Use headers for C library" superClass="com.crt.advproject.gas.hdrlib" value="com.crt.advproject.gas.hdrlib.codered" valueType="enumerated"/>
|
|
||||||
<option id="com.crt.advproject.gas.fpu.1918502252" superClass="com.crt.advproject.gas.fpu"/>
|
|
||||||
<inputType id="cdt.managedbuild.tool.gnu.assembler.input.1748153386" superClass="cdt.managedbuild.tool.gnu.assembler.input"/>
|
|
||||||
<inputType id="com.crt.advproject.assembler.input.857339304" name="Additional Assembly Source Files" superClass="com.crt.advproject.assembler.input"/>
|
|
||||||
</tool>
|
|
||||||
<tool id="com.crt.advproject.link.cpp.exe.debug.319073369" name="MCU C++ Linker" superClass="com.crt.advproject.link.cpp.exe.debug">
|
|
||||||
<option id="com.crt.advproject.link.cpp.hdrlib.564041152" superClass="com.crt.advproject.link.cpp.hdrlib"/>
|
|
||||||
<option id="com.crt.advproject.link.cpp.fpu.521453089" superClass="com.crt.advproject.link.cpp.fpu"/>
|
|
||||||
</tool>
|
|
||||||
<tool id="com.crt.advproject.link.exe.debug.598155174" name="MCU Linker" superClass="com.crt.advproject.link.exe.debug">
|
|
||||||
<option id="com.crt.advproject.link.arch.1529814578" name="Architecture" superClass="com.crt.advproject.link.arch" value="com.crt.advproject.link.target.cm0" valueType="enumerated"/>
|
|
||||||
<option id="com.crt.advproject.link.thumb.334753588" name="Thumb mode" superClass="com.crt.advproject.link.thumb" value="true" valueType="boolean"/>
|
|
||||||
<option id="com.crt.advproject.link.script.2087898660" name="Linker script" superClass="com.crt.advproject.link.script" value=""freertos_blinky_Debug.ld"" valueType="string"/>
|
|
||||||
<option id="com.crt.advproject.link.manage.472540449" name="Manage linker script" superClass="com.crt.advproject.link.manage" value="true" valueType="boolean"/>
|
|
||||||
<option id="gnu.c.link.option.nostdlibs.1671639399" name="No startup or default libs (-nostdlib)" superClass="gnu.c.link.option.nostdlibs" value="true" valueType="boolean"/>
|
|
||||||
<option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="gnu.c.link.option.other.1148332340" name="Other options (-Xlinker [option])" superClass="gnu.c.link.option.other" valueType="stringList">
|
|
||||||
<listOptionValue builtIn="false" value="-Map="${BuildArtifactFileBaseName}.map""/>
|
|
||||||
<listOptionValue builtIn="false" value="--gc-sections"/>
|
|
||||||
<listOptionValue builtIn="false" value="--allow-multiple-definition"/>
|
|
||||||
</option>
|
|
||||||
<option id="com.crt.advproject.link.gcc.hdrlib.31944501" name="Use C library" superClass="com.crt.advproject.link.gcc.hdrlib" value="com.crt.advproject.gcc.link.hdrlib.codered.nohost" valueType="enumerated"/>
|
|
||||||
<option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="gnu.c.link.option.libs.1777900537" superClass="gnu.c.link.option.libs" valueType="libs">
|
|
||||||
<listOptionValue builtIn="false" value="lpc_board_nxp_lpcxpresso_11u68"/>
|
|
||||||
<listOptionValue builtIn="false" value="lpc_chip_11u6x"/>
|
|
||||||
</option>
|
|
||||||
<option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="gnu.c.link.option.paths.342534108" superClass="gnu.c.link.option.paths" valueType="libPaths">
|
|
||||||
<listOptionValue builtIn="false" value=""${workspace_loc:/lpc_chip_11u6x/Debug}""/>
|
|
||||||
<listOptionValue builtIn="false" value=""${workspace_loc:/lpc_board_nxp_lpcxpresso_11u68/Debug}""/>
|
|
||||||
</option>
|
|
||||||
<option id="com.crt.advproject.link.crpenable.1996839843" superClass="com.crt.advproject.link.crpenable" value="true" valueType="boolean"/>
|
|
||||||
<option id="com.crt.advproject.link.memory.load.image.1047595195" superClass="com.crt.advproject.link.memory.load.image" value="" valueType="string"/>
|
|
||||||
<option defaultValue="com.crt.advproject.heapAndStack.lpcXpressoStyle" id="com.crt.advproject.link.memory.heapAndStack.style.179008518" superClass="com.crt.advproject.link.memory.heapAndStack.style" valueType="enumerated"/>
|
|
||||||
<option id="com.crt.advproject.link.memory.heapAndStack.2000509721" superClass="com.crt.advproject.link.memory.heapAndStack" value="&Heap:Default;Post Data;Default&Stack:Default;End;Default" valueType="string"/>
|
|
||||||
<option id="com.crt.advproject.link.memory.data.1401038872" superClass="com.crt.advproject.link.memory.data" value="" valueType="string"/>
|
|
||||||
<option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="true" id="com.crt.advproject.link.memory.sections.512861770" superClass="com.crt.advproject.link.memory.sections" valueType="stringList"/>
|
|
||||||
<option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="true" id="com.crt.advproject.link.gcc.multicore.master.userobjs.610407313" superClass="com.crt.advproject.link.gcc.multicore.master.userobjs" valueType="userObjs"/>
|
|
||||||
<option id="com.crt.advproject.link.gcc.multicore.slave.1584641977" superClass="com.crt.advproject.link.gcc.multicore.slave"/>
|
|
||||||
<option id="com.crt.advproject.link.fpu.1392554303" superClass="com.crt.advproject.link.fpu"/>
|
|
||||||
<inputType id="cdt.managedbuild.tool.gnu.c.linker.input.1962010354" superClass="cdt.managedbuild.tool.gnu.c.linker.input">
|
|
||||||
<additionalInput kind="additionalinputdependency" paths="$(USER_OBJS)"/>
|
|
||||||
<additionalInput kind="additionalinput" paths="$(LIBS)"/>
|
|
||||||
</inputType>
|
|
||||||
</tool>
|
|
||||||
<tool id="com.crt.advproject.tool.debug.debug.380111787" name="MCU Debugger" superClass="com.crt.advproject.tool.debug.debug"/>
|
|
||||||
</toolChain>
|
|
||||||
</folderInfo>
|
|
||||||
<sourceEntries>
|
|
||||||
<entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="example"/>
|
|
||||||
<entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="freertos"/>
|
|
||||||
</sourceEntries>
|
|
||||||
</configuration>
|
|
||||||
</storageModule>
|
|
||||||
<storageModule moduleId="org.eclipse.cdt.core.externalSettings"/>
|
|
||||||
</cconfiguration>
|
|
||||||
<cconfiguration id="com.crt.advproject.config.exe.release.1808819930">
|
|
||||||
<storageModule buildSystemId="org.eclipse.cdt.managedbuilder.core.configurationDataProvider" id="com.crt.advproject.config.exe.release.1808819930" moduleId="org.eclipse.cdt.core.settings" name="Release">
|
|
||||||
<externalSettings/>
|
|
||||||
<extensions>
|
|
||||||
<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="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 moduleId="cdtBuildSystem" version="4.0.0">
|
|
||||||
<configuration artifactExtension="axf" artifactName="${ProjName}" buildArtefactType="org.eclipse.cdt.build.core.buildArtefactType.exe" buildProperties="org.eclipse.cdt.build.core.buildArtefactType=org.eclipse.cdt.build.core.buildArtefactType.exe" cleanCommand="rm -rf" description="Release build" errorParsers="org.eclipse.cdt.core.CWDLocator;org.eclipse.cdt.core.GmakeErrorParser;org.eclipse.cdt.core.GCCErrorParser;org.eclipse.cdt.core.GLDErrorParser;org.eclipse.cdt.core.GASErrorParser" id="com.crt.advproject.config.exe.release.1808819930" name="Release" parent="com.crt.advproject.config.exe.release" postannouncebuildStep="Performing post-build steps" postbuildStep="arm-none-eabi-size "${BuildArtifactFileName}"; # arm-none-eabi-objcopy -O binary "${BuildArtifactFileName}" "${BuildArtifactFileBaseName}.bin" ; checksum -p ${TargetChip} -d "${BuildArtifactFileBaseName}.bin"; ">
|
|
||||||
<folderInfo id="com.crt.advproject.config.exe.release.1808819930." name="/" resourcePath="">
|
|
||||||
<toolChain id="com.crt.advproject.toolchain.exe.release.640454823" name="Code Red MCU Tools" superClass="com.crt.advproject.toolchain.exe.release">
|
|
||||||
<targetPlatform binaryParser="org.eclipse.cdt.core.ELF;org.eclipse.cdt.core.GNU_ELF" id="com.crt.advproject.platform.exe.release.254763124" name="ARM-based MCU (Release)" superClass="com.crt.advproject.platform.exe.release"/>
|
|
||||||
<builder buildPath="${workspace_loc:/freertos_blinky}/Release" id="com.crt.advproject.builder.exe.release.433185346" keepEnvironmentInBuildfile="false" managedBuildOn="true" name="Gnu Make Builder" superClass="com.crt.advproject.builder.exe.release"/>
|
|
||||||
<tool id="com.crt.advproject.cpp.exe.release.2046064843" name="MCU C++ Compiler" superClass="com.crt.advproject.cpp.exe.release"/>
|
|
||||||
<tool id="com.crt.advproject.gcc.exe.release.1651756455" name="MCU C Compiler" superClass="com.crt.advproject.gcc.exe.release">
|
|
||||||
<option id="com.crt.advproject.gcc.arch.701264651" name="Architecture" superClass="com.crt.advproject.gcc.arch" useByScannerDiscovery="true" value="com.crt.advproject.gcc.target.cm0" valueType="enumerated"/>
|
|
||||||
<option id="com.crt.advproject.gcc.thumb.947475273" name="Thumb mode" superClass="com.crt.advproject.gcc.thumb" useByScannerDiscovery="false" value="true" valueType="boolean"/>
|
|
||||||
<option id="com.crt.advproject.gcc.hdrlib.1468029541" name="Use headers for C library" superClass="com.crt.advproject.gcc.hdrlib" useByScannerDiscovery="false" value="com.crt.advproject.gcc.hdrlib.codered" valueType="enumerated"/>
|
|
||||||
<option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="gnu.c.compiler.option.preprocessor.def.symbols.2144250084" name="Defined symbols (-D)" superClass="gnu.c.compiler.option.preprocessor.def.symbols" useByScannerDiscovery="false" valueType="definedSymbols">
|
|
||||||
<listOptionValue builtIn="false" value="__REDLIB__"/>
|
|
||||||
<listOptionValue builtIn="false" value="NDEBUG"/>
|
|
||||||
<listOptionValue builtIn="false" value="__CODE_RED"/>
|
|
||||||
<listOptionValue builtIn="false" value="__USE_LPCOPEN"/>
|
|
||||||
<listOptionValue builtIn="false" value="__MTB_BUFFER_SIZE=256"/>
|
|
||||||
<listOptionValue builtIn="false" value="CORE_M0PLUS"/>
|
|
||||||
<listOptionValue builtIn="false" value="__USE_ROMDIVIDE"/>
|
|
||||||
</option>
|
|
||||||
<option id="gnu.c.compiler.option.misc.other.679723876" name="Other flags" superClass="gnu.c.compiler.option.misc.other" useByScannerDiscovery="false" value="-c -fmessage-length=0 -fno-builtin -ffunction-sections -fdata-sections" valueType="string"/>
|
|
||||||
<option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="gnu.c.compiler.option.include.paths.59978103" superClass="gnu.c.compiler.option.include.paths" useByScannerDiscovery="false" valueType="includePath">
|
|
||||||
<listOptionValue builtIn="false" value=""${workspace_loc:/lpc_chip_11u6x/inc}""/>
|
|
||||||
<listOptionValue builtIn="false" value=""${workspace_loc:/lpc_board_nxp_lpcxpresso_11u68/inc}""/>
|
|
||||||
<listOptionValue builtIn="false" value=""${workspace_loc:/${ProjName}/example/inc}""/>
|
|
||||||
<listOptionValue builtIn="false" value=""${workspace_loc:/${ProjName}/freertos/inc}""/>
|
|
||||||
</option>
|
|
||||||
<inputType id="com.crt.advproject.compiler.input.488975194" superClass="com.crt.advproject.compiler.input"/>
|
|
||||||
</tool>
|
|
||||||
<tool id="com.crt.advproject.gas.exe.release.662855901" name="MCU Assembler" superClass="com.crt.advproject.gas.exe.release">
|
|
||||||
<option id="com.crt.advproject.gas.arch.1186250123" name="Architecture" superClass="com.crt.advproject.gas.arch" value="com.crt.advproject.gas.target.cm0" valueType="enumerated"/>
|
|
||||||
<option id="com.crt.advproject.gas.thumb.259667181" name="Thumb mode" superClass="com.crt.advproject.gas.thumb" value="true" valueType="boolean"/>
|
|
||||||
<option id="gnu.both.asm.option.flags.crt.1854960567" name="Assembler flags" superClass="gnu.both.asm.option.flags.crt" value="-c -x assembler-with-cpp -D__REDLIB__ -DNDEBUG -D__CODE_RED -D__USE_ROMDIVIDE" valueType="string"/>
|
|
||||||
<option id="com.crt.advproject.gas.hdrlib.274459864" name="Use headers for C library" superClass="com.crt.advproject.gas.hdrlib" value="com.crt.advproject.gas.hdrlib.codered" valueType="enumerated"/>
|
|
||||||
<inputType id="cdt.managedbuild.tool.gnu.assembler.input.2045176055" superClass="cdt.managedbuild.tool.gnu.assembler.input"/>
|
|
||||||
<inputType id="com.crt.advproject.assembler.input.645861710" name="Additional Assembly Source Files" superClass="com.crt.advproject.assembler.input"/>
|
|
||||||
</tool>
|
|
||||||
<tool id="com.crt.advproject.link.cpp.exe.release.1548456173" name="MCU C++ Linker" superClass="com.crt.advproject.link.cpp.exe.release"/>
|
|
||||||
<tool id="com.crt.advproject.link.exe.release.1353963226" name="MCU Linker" superClass="com.crt.advproject.link.exe.release">
|
|
||||||
<option id="com.crt.advproject.link.arch.727676326" name="Architecture" superClass="com.crt.advproject.link.arch" value="com.crt.advproject.link.target.cm0" valueType="enumerated"/>
|
|
||||||
<option id="com.crt.advproject.link.thumb.261827422" name="Thumb mode" superClass="com.crt.advproject.link.thumb" value="true" valueType="boolean"/>
|
|
||||||
<option id="com.crt.advproject.link.script.1363957572" name="Linker script" superClass="com.crt.advproject.link.script" value=""freertos_blinky_Release.ld"" valueType="string"/>
|
|
||||||
<option id="com.crt.advproject.link.manage.452003858" name="Manage linker script" superClass="com.crt.advproject.link.manage" value="true" valueType="boolean"/>
|
|
||||||
<option id="gnu.c.link.option.nostdlibs.1581274372" name="No startup or default libs (-nostdlib)" superClass="gnu.c.link.option.nostdlibs" value="true" valueType="boolean"/>
|
|
||||||
<option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="gnu.c.link.option.other.1252702335" name="Other options (-Xlinker [option])" superClass="gnu.c.link.option.other" valueType="stringList">
|
|
||||||
<listOptionValue builtIn="false" value="-Map="${BuildArtifactFileBaseName}.map""/>
|
|
||||||
<listOptionValue builtIn="false" value="--gc-sections"/>
|
|
||||||
<listOptionValue builtIn="false" value="--allow-multiple-definition"/>
|
|
||||||
</option>
|
|
||||||
<option id="com.crt.advproject.link.gcc.hdrlib.509277898" name="Use C library" superClass="com.crt.advproject.link.gcc.hdrlib" value="com.crt.advproject.gcc.link.hdrlib.codered.nohost" valueType="enumerated"/>
|
|
||||||
<option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="gnu.c.link.option.libs.822367365" superClass="gnu.c.link.option.libs" valueType="libs">
|
|
||||||
<listOptionValue builtIn="false" value="lpc_board_nxp_lpcxpresso_11u68"/>
|
|
||||||
<listOptionValue builtIn="false" value="lpc_chip_11u6x"/>
|
|
||||||
</option>
|
|
||||||
<option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="gnu.c.link.option.paths.2096413413" superClass="gnu.c.link.option.paths" valueType="libPaths">
|
|
||||||
<listOptionValue builtIn="false" value=""${workspace_loc:/lpc_chip_11u6x/Release}""/>
|
|
||||||
<listOptionValue builtIn="false" value=""${workspace_loc:/lpc_board_nxp_lpcxpresso_11u68/Release}""/>
|
|
||||||
</option>
|
|
||||||
<option id="com.crt.advproject.link.crpenable.1842466510" superClass="com.crt.advproject.link.crpenable" value="true" valueType="boolean"/>
|
|
||||||
<option id="com.crt.advproject.link.memory.load.image.1386933128" superClass="com.crt.advproject.link.memory.load.image" value="" valueType="string"/>
|
|
||||||
<option defaultValue="com.crt.advproject.heapAndStack.lpcXpressoStyle" id="com.crt.advproject.link.memory.heapAndStack.style.724371726" superClass="com.crt.advproject.link.memory.heapAndStack.style" valueType="enumerated"/>
|
|
||||||
<option id="com.crt.advproject.link.memory.heapAndStack.670155944" superClass="com.crt.advproject.link.memory.heapAndStack" value="&Heap:Default;Post Data;Default&Stack:Default;End;Default" valueType="string"/>
|
|
||||||
<option id="com.crt.advproject.link.memory.data.678494733" superClass="com.crt.advproject.link.memory.data" value="" valueType="string"/>
|
|
||||||
<option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="true" id="com.crt.advproject.link.memory.sections.1947562022" superClass="com.crt.advproject.link.memory.sections" valueType="stringList"/>
|
|
||||||
<option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="true" id="com.crt.advproject.link.gcc.multicore.master.userobjs.1393697549" superClass="com.crt.advproject.link.gcc.multicore.master.userobjs" valueType="userObjs"/>
|
|
||||||
<option id="com.crt.advproject.link.gcc.multicore.slave.404809911" superClass="com.crt.advproject.link.gcc.multicore.slave"/>
|
|
||||||
<inputType id="cdt.managedbuild.tool.gnu.c.linker.input.1492299302" superClass="cdt.managedbuild.tool.gnu.c.linker.input">
|
|
||||||
<additionalInput kind="additionalinputdependency" paths="$(USER_OBJS)"/>
|
|
||||||
<additionalInput kind="additionalinput" paths="$(LIBS)"/>
|
|
||||||
</inputType>
|
|
||||||
</tool>
|
|
||||||
<tool id="com.crt.advproject.tool.debug.release.1694478261" name="MCU Debugger" superClass="com.crt.advproject.tool.debug.release"/>
|
|
||||||
</toolChain>
|
|
||||||
</folderInfo>
|
|
||||||
<sourceEntries>
|
|
||||||
<entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="example"/>
|
|
||||||
<entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="freertos"/>
|
|
||||||
</sourceEntries>
|
|
||||||
</configuration>
|
|
||||||
</storageModule>
|
|
||||||
<storageModule moduleId="org.eclipse.cdt.core.externalSettings"/>
|
|
||||||
</cconfiguration>
|
|
||||||
</storageModule>
|
|
||||||
<storageModule moduleId="cdtBuildSystem" version="4.0.0">
|
|
||||||
<project id="freertos_blinky.com.crt.advproject.projecttype.exe.505153989" name="Executable" projectType="com.crt.advproject.projecttype.exe"/>
|
|
||||||
</storageModule>
|
|
||||||
<storageModule moduleId="scannerConfiguration">
|
|
||||||
<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId=""/>
|
|
||||||
</storageModule>
|
|
||||||
<storageModule moduleId="org.eclipse.cdt.core.LanguageSettingsProviders"/>
|
|
||||||
<storageModule moduleId="com.crt.config">
|
|
||||||
<projectStorage><?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<TargetConfig>
|
|
||||||
<Properties property_2="LPC11U6x_256K.cfx" property_3="NXP" property_4="LPC11U68" property_count="5" version="100300"/>
|
|
||||||
<infoList vendor="NXP">
|
|
||||||
<info chip="LPC11U68" flash_driver="LPC11U6x_256K.cfx" match_id="0x0" name="LPC11U68" stub="crt_emu_cm3_gen">
|
|
||||||
<chip>
|
|
||||||
<name>LPC11U68</name>
|
|
||||||
<family>LPC11U6x</family>
|
|
||||||
<vendor>NXP (formerly Philips)</vendor>
|
|
||||||
<reset board="None" core="Real" sys="Real"/>
|
|
||||||
<clock changeable="TRUE" freq="12MHz" is_accurate="TRUE"/>
|
|
||||||
<memory can_program="true" id="Flash" is_ro="true" type="Flash"/>
|
|
||||||
<memory id="RAM" type="RAM"/>
|
|
||||||
<memory id="Periph" is_volatile="true" type="Peripheral"/>
|
|
||||||
<memoryInstance derived_from="Flash" id="MFlash256" location="0x0" size="0x40000"/>
|
|
||||||
<memoryInstance derived_from="RAM" id="Ram0_32" location="0x10000000" size="0x8000"/>
|
|
||||||
<memoryInstance derived_from="RAM" id="Ram1_2" location="0x20000000" size="0x800"/>
|
|
||||||
<memoryInstance derived_from="RAM" id="Ram2USB_2" location="0x20004000" size="0x800"/>
|
|
||||||
</chip>
|
|
||||||
<processor>
|
|
||||||
<name gcc_name="cortex-m0">Cortex-M0</name>
|
|
||||||
<family>Cortex-M</family>
|
|
||||||
</processor>
|
|
||||||
</info>
|
|
||||||
</infoList>
|
|
||||||
</TargetConfig></projectStorage>
|
|
||||||
</storageModule>
|
|
||||||
<storageModule moduleId="refreshScope"/>
|
|
||||||
<storageModule moduleId="org.eclipse.cdt.make.core.buildtargets"/>
|
|
||||||
<storageModule moduleId="com.crt.advproject"/>
|
|
||||||
</cproject>
|
|
||||||
1
source/freertos_blinky/.gitignore
vendored
1
source/freertos_blinky/.gitignore
vendored
@ -1 +0,0 @@
|
|||||||
/Debug/
|
|
||||||
@ -1,28 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<projectDescription>
|
|
||||||
<name>freertos_blinky</name>
|
|
||||||
<comment></comment>
|
|
||||||
<projects>
|
|
||||||
<project>lpc_chip_11u6x</project>
|
|
||||||
<project>lpc_board_nxp_lpcxpresso_11u68</project>
|
|
||||||
</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>org.eclipse.cdt.managedbuilder.core.managedBuildNature</nature>
|
|
||||||
<nature>org.eclipse.cdt.managedbuilder.core.ScannerConfigNature</nature>
|
|
||||||
</natures>
|
|
||||||
</projectDescription>
|
|
||||||
@ -1,25 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
|
||||||
<project>
|
|
||||||
<configuration id="com.crt.advproject.config.exe.debug.1459795002" name="Debug">
|
|
||||||
<extension point="org.eclipse.cdt.core.LanguageSettingsProvider">
|
|
||||||
<provider copy-of="extension" id="org.eclipse.cdt.ui.UserLanguageSettingsProvider"/>
|
|
||||||
<provider class="org.eclipse.cdt.managedbuilder.language.settings.providers.GCCBuildCommandParser" id="com.crt.advproject.GCCBuildCommandParser" keep-relative-paths="false" name="MCU GCC Build Output Parser" parameter="(arm-none-eabi-gcc)|(arm-none-eabi-[gc]\+\+)|(gcc)|([gc]\+\+)|(clang)" prefer-non-shared="true"/>
|
|
||||||
<provider class="com.crt.advproject.specs.MCUGCCBuiltinSpecsDetector" console="false" env-hash="386763370355595576" id="com.crt.advproject.GCCBuildSpecCompilerParser" keep-relative-paths="false" name="MCU GCC Built-in Compiler Parser" parameter="${COMMAND} ${FLAGS} -E -P -v -dD "${INPUTS}"" prefer-non-shared="true">
|
|
||||||
<language-scope id="org.eclipse.cdt.core.gcc"/>
|
|
||||||
<language-scope id="org.eclipse.cdt.core.g++"/>
|
|
||||||
</provider>
|
|
||||||
<provider-reference id="org.eclipse.cdt.managedbuilder.core.MBSLanguageSettingsProvider" ref="shared-provider"/>
|
|
||||||
</extension>
|
|
||||||
</configuration>
|
|
||||||
<configuration id="com.crt.advproject.config.exe.release.1808819930" name="Release">
|
|
||||||
<extension point="org.eclipse.cdt.core.LanguageSettingsProvider">
|
|
||||||
<provider copy-of="extension" id="org.eclipse.cdt.ui.UserLanguageSettingsProvider"/>
|
|
||||||
<provider copy-of="extension" id="com.crt.advproject.GCCBuildCommandParser"/>
|
|
||||||
<provider class="com.crt.advproject.specs.MCUGCCBuiltinSpecsDetector" console="false" env-hash="390275856303024536" id="com.crt.advproject.GCCBuildSpecCompilerParser" keep-relative-paths="false" name="MCU GCC Built-in Compiler Parser" parameter="${COMMAND} ${FLAGS} -E -P -v -dD "${INPUTS}"" prefer-non-shared="true">
|
|
||||||
<language-scope id="org.eclipse.cdt.core.gcc"/>
|
|
||||||
<language-scope id="org.eclipse.cdt.core.g++"/>
|
|
||||||
</provider>
|
|
||||||
<provider-reference id="org.eclipse.cdt.managedbuilder.core.MBSLanguageSettingsProvider" ref="shared-provider"/>
|
|
||||||
</extension>
|
|
||||||
</configuration>
|
|
||||||
</project>
|
|
||||||
@ -1,158 +0,0 @@
|
|||||||
/*
|
|
||||||
FreeRTOS V7.1.0 - Copyright (C) 2011 Real Time Engineers Ltd.
|
|
||||||
|
|
||||||
|
|
||||||
***************************************************************************
|
|
||||||
* *
|
|
||||||
* FreeRTOS tutorial books are available in pdf and paperback. *
|
|
||||||
* Complete, revised, and edited pdf reference manuals are also *
|
|
||||||
* available. *
|
|
||||||
* *
|
|
||||||
* Purchasing FreeRTOS documentation will not only help you, by *
|
|
||||||
* ensuring you get running as quickly as possible and with an *
|
|
||||||
* in-depth knowledge of how to use FreeRTOS, it will also help *
|
|
||||||
* the FreeRTOS project to continue with its mission of providing *
|
|
||||||
* professional grade, cross platform, de facto standard solutions *
|
|
||||||
* for microcontrollers - completely free of charge! *
|
|
||||||
* *
|
|
||||||
* >>> See http://www.FreeRTOS.org/Documentation for details. <<< *
|
|
||||||
* *
|
|
||||||
* Thank you for using FreeRTOS, and thank you for your support! *
|
|
||||||
* *
|
|
||||||
***************************************************************************
|
|
||||||
|
|
||||||
|
|
||||||
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. See the GNU General Public License for
|
|
||||||
more details. You should have received a copy of the GNU General Public
|
|
||||||
License and the FreeRTOS license exception along with FreeRTOS; if not it
|
|
||||||
can be viewed here: http://www.freertos.org/a00114.html and also obtained
|
|
||||||
by writing to Richard Barry, contact details for whom are available on the
|
|
||||||
FreeRTOS WEB site.
|
|
||||||
|
|
||||||
1 tab == 4 spaces!
|
|
||||||
|
|
||||||
http://www.FreeRTOS.org - Documentation, latest information, license and
|
|
||||||
contact details.
|
|
||||||
|
|
||||||
http://www.SafeRTOS.com - A version that is certified for use in safety
|
|
||||||
critical systems.
|
|
||||||
|
|
||||||
http://www.OpenRTOS.com - Commercial support, development, porting,
|
|
||||||
licensing and training services.
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
#ifndef FREERTOS_CONFIG_H
|
|
||||||
#define FREERTOS_CONFIG_H
|
|
||||||
|
|
||||||
#ifndef __IASMARM__
|
|
||||||
/* For SystemCoreClock */
|
|
||||||
#include "board.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*-----------------------------------------------------------
|
|
||||||
* 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.
|
|
||||||
*----------------------------------------------------------*/
|
|
||||||
|
|
||||||
#define configUSE_PREEMPTION 1
|
|
||||||
#define configUSE_IDLE_HOOK 1
|
|
||||||
#define configUSE_TICK_HOOK 0
|
|
||||||
#define configCPU_CLOCK_HZ ( SystemCoreClock )
|
|
||||||
#define configTICK_RATE_HZ ( ( portTickType ) 1000 )
|
|
||||||
#define configMAX_PRIORITIES ( ( unsigned portBASE_TYPE ) 8 )
|
|
||||||
#define configMINIMAL_STACK_SIZE ( ( unsigned short ) 64 )
|
|
||||||
#define configTOTAL_HEAP_SIZE ( ( size_t ) ( 1024 + 512) )
|
|
||||||
#define configMAX_TASK_NAME_LEN ( 10 )
|
|
||||||
#define configUSE_TRACE_FACILITY 1
|
|
||||||
#define configUSE_16_BIT_TICKS 0
|
|
||||||
#define configIDLE_SHOULD_YIELD 1
|
|
||||||
#define configUSE_MUTEXES 1
|
|
||||||
#define configQUEUE_REGISTRY_SIZE 8
|
|
||||||
#define configCHECK_FOR_STACK_OVERFLOW 2
|
|
||||||
#define configUSE_RECURSIVE_MUTEXES 1
|
|
||||||
#define configUSE_MALLOC_FAILED_HOOK 1
|
|
||||||
#define configUSE_APPLICATION_TASK_TAG 0
|
|
||||||
#define configUSE_COUNTING_SEMAPHORES 1
|
|
||||||
#define configGENERATE_RUN_TIME_STATS 0
|
|
||||||
#define configUSE_TICKLESS_IDLE 1
|
|
||||||
|
|
||||||
|
|
||||||
/* Co-routine definitions. */
|
|
||||||
#define configUSE_CO_ROUTINES 0
|
|
||||||
#define configMAX_CO_ROUTINE_PRIORITIES ( 2 )
|
|
||||||
|
|
||||||
/* Software timer definitions. This example uses I2C to write to the LEDs. As
|
|
||||||
this takes a finite time, and because a timer callback writes to an LED, the
|
|
||||||
priority of the timer task is kept to a minimum to ensure it does not disrupt
|
|
||||||
test tasks that check their own execution times. */
|
|
||||||
#define configUSE_TIMERS 0
|
|
||||||
#define configTIMER_TASK_PRIORITY ( 0 )
|
|
||||||
#define configTIMER_QUEUE_LENGTH 5
|
|
||||||
#define configTIMER_TASK_STACK_DEPTH ( configMINIMAL_STACK_SIZE * 2 )
|
|
||||||
|
|
||||||
/* Set the following definitions to 1 to include the API function, or zero
|
|
||||||
to exclude the API function. */
|
|
||||||
#define INCLUDE_vTaskPrioritySet 1
|
|
||||||
#define INCLUDE_uxTaskPriorityGet 1
|
|
||||||
#define INCLUDE_vTaskDelete 1
|
|
||||||
#define INCLUDE_vTaskCleanUpResources 1
|
|
||||||
#define INCLUDE_vTaskSuspend 1
|
|
||||||
#define INCLUDE_vTaskDelayUntil 1
|
|
||||||
#define INCLUDE_vTaskDelay 1
|
|
||||||
#define INCLUDE_xTaskGetCurrentTaskHandle 1
|
|
||||||
|
|
||||||
/* 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 5 /* 32 priority levels */
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* The lowest interrupt priority that can be used in a call to a "set priority"
|
|
||||||
function. */
|
|
||||||
#define configLIBRARY_LOWEST_INTERRUPT_PRIORITY 0x1f
|
|
||||||
|
|
||||||
/* 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 5
|
|
||||||
|
|
||||||
/* 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) )
|
|
||||||
#define configMAX_SYSCALL_INTERRUPT_PRIORITY ( configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )
|
|
||||||
|
|
||||||
/* Normal assert() semantics without relying on the provision of an assert.h
|
|
||||||
header file. */
|
|
||||||
#define configASSERT( x ) if( ( x ) == 0 ) { taskDISABLE_INTERRUPTS(); for( ;; ); }
|
|
||||||
|
|
||||||
#define configUSE_CUSTOM_TICK 0
|
|
||||||
|
|
||||||
/* Definitions that map the FreeRTOS port interrupt handlers to their CMSIS
|
|
||||||
standard names - or at least those used in the unmodified vector table. */
|
|
||||||
#define vPortSVCHandler SVC_Handler
|
|
||||||
#define xPortPendSVHandler PendSV_Handler
|
|
||||||
#define xPortSysTickHandler SysTick_Handler
|
|
||||||
|
|
||||||
#endif /* FREERTOS_CONFIG_H */
|
|
||||||
|
|
||||||
@ -1,93 +0,0 @@
|
|||||||
//*****************************************************************************
|
|
||||||
// aeabi_romdiv_patch.s
|
|
||||||
// - Provides "patch" versions of the aeabi integer divide functions to
|
|
||||||
// replace the standard ones pulled in from the C library, which vector
|
|
||||||
// integer divides onto the rom division functions contained in
|
|
||||||
// specific NXP MCUs such as LPC11Uxx and LPC12xx.
|
|
||||||
// - Note that this patching will only occur if "__USE_ROMDIVIDE" is
|
|
||||||
// defined for the project build for both the compiler and assembler.
|
|
||||||
//*****************************************************************************
|
|
||||||
//
|
|
||||||
// Copyright(C) NXP Semiconductors, 2013
|
|
||||||
// All rights reserved.
|
|
||||||
//
|
|
||||||
// Software that is described herein is for illustrative purposes only
|
|
||||||
// which provides customers with programming information regarding the
|
|
||||||
// LPC products. This software is supplied "AS IS" without any warranties of
|
|
||||||
// any kind, and NXP Semiconductors and its licensor disclaim any and
|
|
||||||
// all warranties, express or implied, including all implied warranties of
|
|
||||||
// merchantability, fitness for a particular purpose and non-infringement of
|
|
||||||
// intellectual property rights. NXP Semiconductors assumes no responsibility
|
|
||||||
// or liability for the use of the software, conveys no license or rights under any
|
|
||||||
// patent, copyright, mask work right, or any other intellectual property rights in
|
|
||||||
// or to any products. NXP Semiconductors reserves the right to make changes
|
|
||||||
// in the software without notification. NXP Semiconductors also makes no
|
|
||||||
// representation or warranty that such application will be suitable for the
|
|
||||||
// specified use without further testing or modification.
|
|
||||||
//
|
|
||||||
// Permission to use, copy, modify, and distribute this software and its
|
|
||||||
// documentation is hereby granted, under NXP Semiconductors' and its
|
|
||||||
// licensor's relevant copyrights in the software, without fee, provided that it
|
|
||||||
// is used in conjunction with NXP Semiconductors microcontrollers. This
|
|
||||||
// copyright, permission, and disclaimer notice must appear in all copies of
|
|
||||||
// this code.
|
|
||||||
//*****************************************************************************
|
|
||||||
#if defined(__USE_ROMDIVIDE)
|
|
||||||
|
|
||||||
// Note that the romdivide "divmod" functions are not actually called from
|
|
||||||
// the below code, as these functions are actually just wrappers to the
|
|
||||||
// main romdivide "div" functions which push the quotient and remainder onto
|
|
||||||
// the stack, so as to be compatible with the way that C returns structures.
|
|
||||||
//
|
|
||||||
// This is not needed for the aeabi "divmod" functions, as the compiler
|
|
||||||
// automatically generates code that handles the return values being passed
|
|
||||||
// back in registers when it generates inline calls to __aeabi_idivmod and
|
|
||||||
// __aeabi_uidivmod routines.
|
|
||||||
|
|
||||||
.syntax unified
|
|
||||||
.text
|
|
||||||
|
|
||||||
// ========= __aeabi_idiv & __aeabi_idivmod =========
|
|
||||||
.align 2
|
|
||||||
.section .text.__aeabi_idiv
|
|
||||||
|
|
||||||
.global __aeabi_idiv
|
|
||||||
.set __aeabi_idivmod, __aeabi_idiv // make __aeabi_uidivmod an alias
|
|
||||||
.global __aeabi_idivmod
|
|
||||||
.global pDivRom_idiv // pointer to the romdivide 'idiv' functione
|
|
||||||
.func
|
|
||||||
.thumb_func
|
|
||||||
.type __aeabi_idiv, %function
|
|
||||||
|
|
||||||
__aeabi_idiv:
|
|
||||||
push {r4, lr}
|
|
||||||
ldr r3, =pDivRom_idiv
|
|
||||||
ldr r3, [r3, #0] // Load address of function
|
|
||||||
blx r3 // Call divide function
|
|
||||||
pop {r4, pc}
|
|
||||||
|
|
||||||
.endfunc
|
|
||||||
|
|
||||||
// ======== __aeabi_uidiv & __aeabi_uidivmod ========
|
|
||||||
.align 2
|
|
||||||
|
|
||||||
.section .text.__aeabi_uidiv
|
|
||||||
|
|
||||||
.global __aeabi_uidiv
|
|
||||||
.set __aeabi_uidivmod, __aeabi_uidiv // make __aeabi_uidivmod an alias
|
|
||||||
.global __aeabi_uidivmod
|
|
||||||
.global pDivRom_uidiv // pointer to the romdivide 'uidiv' function
|
|
||||||
.func
|
|
||||||
.thumb_func
|
|
||||||
.type __aeabi_uidiv, %function
|
|
||||||
|
|
||||||
__aeabi_uidiv:
|
|
||||||
push {r4, lr}
|
|
||||||
ldr r3, =pDivRom_uidiv
|
|
||||||
ldr r3, [r3, #0] // Load address of function
|
|
||||||
blx r3 // Call divide function
|
|
||||||
pop {r4, pc}
|
|
||||||
|
|
||||||
.endfunc
|
|
||||||
|
|
||||||
#endif // (__USE_ROMDIVIDE)
|
|
||||||
@ -1,352 +0,0 @@
|
|||||||
//*****************************************************************************
|
|
||||||
// LPC11U6x Microcontroller Startup code for use with LPCXpresso IDE
|
|
||||||
//
|
|
||||||
// Version : 140113
|
|
||||||
//*****************************************************************************
|
|
||||||
//
|
|
||||||
// Copyright(C) NXP Semiconductors, 2014
|
|
||||||
// All rights reserved.
|
|
||||||
//
|
|
||||||
// Software that is described herein is for illustrative purposes only
|
|
||||||
// which provides customers with programming information regarding the
|
|
||||||
// LPC products. This software is supplied "AS IS" without any warranties of
|
|
||||||
// any kind, and NXP Semiconductors and its licensor disclaim any and
|
|
||||||
// all warranties, express or implied, including all implied warranties of
|
|
||||||
// merchantability, fitness for a particular purpose and non-infringement of
|
|
||||||
// intellectual property rights. NXP Semiconductors assumes no responsibility
|
|
||||||
// or liability for the use of the software, conveys no license or rights under any
|
|
||||||
// patent, copyright, mask work right, or any other intellectual property rights in
|
|
||||||
// or to any products. NXP Semiconductors reserves the right to make changes
|
|
||||||
// in the software without notification. NXP Semiconductors also makes no
|
|
||||||
// representation or warranty that such application will be suitable for the
|
|
||||||
// specified use without further testing or modification.
|
|
||||||
//
|
|
||||||
// Permission to use, copy, modify, and distribute this software and its
|
|
||||||
// documentation is hereby granted, under NXP Semiconductors' and its
|
|
||||||
// licensor's relevant copyrights in the software, without fee, provided that it
|
|
||||||
// is used in conjunction with NXP Semiconductors microcontrollers. This
|
|
||||||
// copyright, permission, and disclaimer notice must appear in all copies of
|
|
||||||
// this code.
|
|
||||||
//*****************************************************************************
|
|
||||||
|
|
||||||
#if defined (__cplusplus)
|
|
||||||
#ifdef __REDLIB__
|
|
||||||
#error Redlib does not support C++
|
|
||||||
#else
|
|
||||||
//*****************************************************************************
|
|
||||||
//
|
|
||||||
// The entry point for the C++ library startup
|
|
||||||
//
|
|
||||||
//*****************************************************************************
|
|
||||||
extern "C" {
|
|
||||||
extern void __libc_init_array(void);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define WEAK __attribute__ ((weak))
|
|
||||||
#define ALIAS(f) __attribute__ ((weak, alias (#f)))
|
|
||||||
|
|
||||||
//*****************************************************************************
|
|
||||||
#if defined (__cplusplus)
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
//*****************************************************************************
|
|
||||||
#if defined (__USE_CMSIS) || defined (__USE_LPCOPEN)
|
|
||||||
// Declaration of external SystemInit function
|
|
||||||
extern void SystemInit(void);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// Patch the AEABI integer divide functions to use MCU's romdivide library
|
|
||||||
#ifdef __USE_ROMDIVIDE
|
|
||||||
// Location in memory that holds the address of the ROM Driver table
|
|
||||||
#define PTR_ROM_DRIVER_TABLE ((unsigned int *)(0x1FFF1FF8))
|
|
||||||
// Variables to store addresses of idiv and udiv functions within MCU ROM
|
|
||||||
unsigned int *pDivRom_idiv;
|
|
||||||
unsigned int *pDivRom_uidiv;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
//*****************************************************************************
|
|
||||||
//
|
|
||||||
// Forward declaration of the default handlers. These are aliased.
|
|
||||||
// When the application defines a handler (with the same name), this will
|
|
||||||
// automatically take precedence over these weak definitions
|
|
||||||
//
|
|
||||||
//*****************************************************************************
|
|
||||||
void ResetISR(void);
|
|
||||||
WEAK void NMI_Handler(void);
|
|
||||||
WEAK void HardFault_Handler(void);
|
|
||||||
WEAK void SVC_Handler(void);
|
|
||||||
WEAK void PendSV_Handler(void);
|
|
||||||
WEAK void SysTick_Handler(void);
|
|
||||||
WEAK void IntDefaultHandler(void);
|
|
||||||
//*****************************************************************************
|
|
||||||
//
|
|
||||||
// Forward declaration of the specific IRQ handlers. These are aliased
|
|
||||||
// to the IntDefaultHandler, which is a 'forever' loop. When the application
|
|
||||||
// defines a handler (with the same name), this will automatically take
|
|
||||||
// precedence over these weak definitions
|
|
||||||
//
|
|
||||||
//*****************************************************************************
|
|
||||||
void PIN_INT0_IRQHandler (void) ALIAS(IntDefaultHandler);
|
|
||||||
void PIN_INT1_IRQHandler (void) ALIAS(IntDefaultHandler);
|
|
||||||
void PIN_INT2_IRQHandler (void) ALIAS(IntDefaultHandler);
|
|
||||||
void PIN_INT3_IRQHandler (void) ALIAS(IntDefaultHandler);
|
|
||||||
void PIN_INT4_IRQHandler (void) ALIAS(IntDefaultHandler);
|
|
||||||
void PIN_INT5_IRQHandler (void) ALIAS(IntDefaultHandler);
|
|
||||||
void PIN_INT6_IRQHandler (void) ALIAS(IntDefaultHandler);
|
|
||||||
void PIN_INT7_IRQHandler (void) ALIAS(IntDefaultHandler);
|
|
||||||
void GINT0_IRQHandler (void) ALIAS(IntDefaultHandler);
|
|
||||||
void GINT1_IRQHandler (void) ALIAS(IntDefaultHandler);
|
|
||||||
void I2C1_IRQHandler (void) ALIAS(IntDefaultHandler);
|
|
||||||
void USART1_4_IRQHandler (void) ALIAS(IntDefaultHandler);
|
|
||||||
void USART2_3_IRQHandler (void) ALIAS(IntDefaultHandler);
|
|
||||||
void SCT0_1_IRQHandler (void) ALIAS(IntDefaultHandler);
|
|
||||||
void SSP1_IRQHandler (void) ALIAS(IntDefaultHandler);
|
|
||||||
void I2C0_IRQHandler (void) ALIAS(IntDefaultHandler);
|
|
||||||
void TIMER16_0_IRQHandler (void) ALIAS(IntDefaultHandler);
|
|
||||||
void TIMER16_1_IRQHandler (void) ALIAS(IntDefaultHandler);
|
|
||||||
void TIMER32_0_IRQHandler (void) ALIAS(IntDefaultHandler);
|
|
||||||
void TIMER32_1_IRQHandler (void) ALIAS(IntDefaultHandler);
|
|
||||||
void SSP0_IRQHandler (void) ALIAS(IntDefaultHandler);
|
|
||||||
void USART0_IRQHandler (void) ALIAS(IntDefaultHandler);
|
|
||||||
void USB_IRQHandler (void) ALIAS(IntDefaultHandler);
|
|
||||||
void USB_FIQHandler (void) ALIAS(IntDefaultHandler);
|
|
||||||
void ADCA_IRQHandler (void) ALIAS(IntDefaultHandler);
|
|
||||||
void RTC_IRQHandler (void) ALIAS(IntDefaultHandler);
|
|
||||||
void BOD_WDT_IRQHandler (void) ALIAS(IntDefaultHandler);
|
|
||||||
void FMC_IRQHandler (void) ALIAS(IntDefaultHandler);
|
|
||||||
void DMA_IRQHandler (void) ALIAS(IntDefaultHandler);
|
|
||||||
void ADCB_IRQHandler (void) ALIAS(IntDefaultHandler);
|
|
||||||
void USBWakeup_IRQHandler (void) ALIAS(IntDefaultHandler);
|
|
||||||
|
|
||||||
//*****************************************************************************
|
|
||||||
// The entry point for the application.
|
|
||||||
// __main() is the entry point for redlib based applications
|
|
||||||
// main() is the entry point for newlib based applications
|
|
||||||
//*****************************************************************************
|
|
||||||
#if defined (__REDLIB__)
|
|
||||||
extern void __main(void);
|
|
||||||
#endif
|
|
||||||
extern int main(void);
|
|
||||||
//*****************************************************************************
|
|
||||||
//
|
|
||||||
// External declaration for the pointer to the stack top from the Linker Script
|
|
||||||
//
|
|
||||||
//*****************************************************************************
|
|
||||||
extern void _vStackTop(void);
|
|
||||||
|
|
||||||
//*****************************************************************************
|
|
||||||
#if defined (__cplusplus)
|
|
||||||
} // extern "C"
|
|
||||||
#endif
|
|
||||||
//*****************************************************************************
|
|
||||||
//
|
|
||||||
// The vector table. Note that the proper constructs must be placed on this to
|
|
||||||
// ensure that it ends up at physical address 0x0000.0000.
|
|
||||||
//
|
|
||||||
//*****************************************************************************
|
|
||||||
extern void (* const g_pfnVectors[])(void);
|
|
||||||
__attribute__ ((section(".isr_vector")))
|
|
||||||
void (* const g_pfnVectors[])(void) = {
|
|
||||||
&_vStackTop, // The initial stack pointer
|
|
||||||
ResetISR, // The reset handler
|
|
||||||
NMI_Handler, // The NMI handler
|
|
||||||
HardFault_Handler, // The hard fault handler
|
|
||||||
0, // Reserved
|
|
||||||
0, // Reserved
|
|
||||||
0, // Reserved
|
|
||||||
0, // Reserved
|
|
||||||
0, // Reserved
|
|
||||||
0, // Reserved
|
|
||||||
0, // Reserved
|
|
||||||
SVC_Handler, // SVCall handler
|
|
||||||
0, // Reserved
|
|
||||||
0, // Reserved
|
|
||||||
PendSV_Handler, // The PendSV handler
|
|
||||||
SysTick_Handler, // The SysTick handler
|
|
||||||
|
|
||||||
// LPC11U6x specific handlers
|
|
||||||
PIN_INT0_IRQHandler, // 0 - GPIO pin interrupt 0
|
|
||||||
PIN_INT1_IRQHandler, // 1 - GPIO pin interrupt 1
|
|
||||||
PIN_INT2_IRQHandler, // 2 - GPIO pin interrupt 2
|
|
||||||
PIN_INT3_IRQHandler, // 3 - GPIO pin interrupt 3
|
|
||||||
PIN_INT4_IRQHandler, // 4 - GPIO pin interrupt 4
|
|
||||||
PIN_INT5_IRQHandler, // 5 - GPIO pin interrupt 5
|
|
||||||
PIN_INT6_IRQHandler, // 6 - GPIO pin interrupt 6
|
|
||||||
PIN_INT7_IRQHandler, // 7 - GPIO pin interrupt 7
|
|
||||||
GINT0_IRQHandler, // 8 - GPIO GROUP0 interrupt
|
|
||||||
GINT1_IRQHandler, // 9 - GPIO GROUP1 interrupt
|
|
||||||
I2C1_IRQHandler, // 10 - I2C1
|
|
||||||
USART1_4_IRQHandler, // 11 - combined USART1 & 4 interrupt
|
|
||||||
USART2_3_IRQHandler, // 12 - combined USART2 & 3 interrupt
|
|
||||||
SCT0_1_IRQHandler, // 13 - combined SCT0 and 1 interrupt
|
|
||||||
SSP1_IRQHandler, // 14 - SPI/SSP1 Interrupt
|
|
||||||
I2C0_IRQHandler, // 15 - I2C0
|
|
||||||
TIMER16_0_IRQHandler, // 16 - CT16B0 (16-bit Timer 0)
|
|
||||||
TIMER16_1_IRQHandler, // 17 - CT16B1 (16-bit Timer 1)
|
|
||||||
TIMER32_0_IRQHandler, // 18 - CT32B0 (32-bit Timer 0)
|
|
||||||
TIMER32_1_IRQHandler, // 19 - CT32B1 (32-bit Timer 1)
|
|
||||||
SSP0_IRQHandler, // 20 - SPI/SSP0 Interrupt
|
|
||||||
USART0_IRQHandler, // 21 - USART0
|
|
||||||
USB_IRQHandler, // 22 - USB IRQ
|
|
||||||
USB_FIQHandler, // 23 - USB FIQ
|
|
||||||
ADCA_IRQHandler, // 24 - ADC A(A/D Converter)
|
|
||||||
RTC_IRQHandler, // 25 - Real Time CLock interrpt
|
|
||||||
BOD_WDT_IRQHandler, // 25 - Combined Brownout/Watchdog interrupt
|
|
||||||
FMC_IRQHandler, // 27 - IP2111 Flash Memory Controller
|
|
||||||
DMA_IRQHandler, // 28 - DMA interrupt
|
|
||||||
ADCB_IRQHandler, // 24 - ADC B (A/D Converter)
|
|
||||||
USBWakeup_IRQHandler, // 30 - USB wake-up interrupt
|
|
||||||
0, // 31 - Reserved
|
|
||||||
};
|
|
||||||
|
|
||||||
//*****************************************************************************
|
|
||||||
// Functions to carry out the initialization of RW and BSS data sections. These
|
|
||||||
// are written as separate functions rather than being inlined within the
|
|
||||||
// ResetISR() function in order to cope with MCUs with multiple banks of
|
|
||||||
// memory.
|
|
||||||
//*****************************************************************************
|
|
||||||
__attribute__ ((section(".after_vectors")))
|
|
||||||
void data_init(unsigned int romstart, unsigned int start, unsigned int len) {
|
|
||||||
unsigned int *pulDest = (unsigned int*) start;
|
|
||||||
unsigned int *pulSrc = (unsigned int*) romstart;
|
|
||||||
unsigned int loop;
|
|
||||||
for (loop = 0; loop < len; loop = loop + 4)
|
|
||||||
*pulDest++ = *pulSrc++;
|
|
||||||
}
|
|
||||||
|
|
||||||
__attribute__ ((section(".after_vectors")))
|
|
||||||
void bss_init(unsigned int start, unsigned int len) {
|
|
||||||
unsigned int *pulDest = (unsigned int*) start;
|
|
||||||
unsigned int loop;
|
|
||||||
for (loop = 0; loop < len; loop = loop + 4)
|
|
||||||
*pulDest++ = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
//*****************************************************************************
|
|
||||||
// The following symbols are constructs generated by the linker, indicating
|
|
||||||
// the location of various points in the "Global Section Table". This table is
|
|
||||||
// created by the linker via the Code Red managed linker script mechanism. It
|
|
||||||
// contains the load address, execution address and length of each RW data
|
|
||||||
// section and the execution and length of each BSS (zero initialized) section.
|
|
||||||
//*****************************************************************************
|
|
||||||
extern unsigned int __data_section_table;
|
|
||||||
extern unsigned int __data_section_table_end;
|
|
||||||
extern unsigned int __bss_section_table;
|
|
||||||
extern unsigned int __bss_section_table_end;
|
|
||||||
|
|
||||||
//*****************************************************************************
|
|
||||||
// Reset entry point for your code.
|
|
||||||
// Sets up a simple runtime environment and initializes the C/C++
|
|
||||||
// library.
|
|
||||||
//*****************************************************************************
|
|
||||||
__attribute__ ((section(".after_vectors")))
|
|
||||||
void
|
|
||||||
ResetISR(void) {
|
|
||||||
|
|
||||||
// Optionally enable RAM banks that may be off by default at reset
|
|
||||||
#if !defined (DONT_ENABLE_DISABLED_RAMBANKS)
|
|
||||||
volatile unsigned int *SYSCON_SYSAHBCLKCTRL = (unsigned int *) 0x40048080;
|
|
||||||
// Ensure that RAM1(26) and USBSRAM(27) bits in SYSAHBCLKCTRL are set
|
|
||||||
*SYSCON_SYSAHBCLKCTRL |= (1 << 26) | (1 <<27);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
//
|
|
||||||
// Copy the data sections from flash to SRAM.
|
|
||||||
//
|
|
||||||
unsigned int LoadAddr, ExeAddr, SectionLen;
|
|
||||||
unsigned int *SectionTableAddr;
|
|
||||||
|
|
||||||
// Load base address of Global Section Table
|
|
||||||
SectionTableAddr = &__data_section_table;
|
|
||||||
|
|
||||||
// Copy the data sections from flash to SRAM.
|
|
||||||
while (SectionTableAddr < &__data_section_table_end) {
|
|
||||||
LoadAddr = *SectionTableAddr++;
|
|
||||||
ExeAddr = *SectionTableAddr++;
|
|
||||||
SectionLen = *SectionTableAddr++;
|
|
||||||
data_init(LoadAddr, ExeAddr, SectionLen);
|
|
||||||
}
|
|
||||||
// At this point, SectionTableAddr = &__bss_section_table;
|
|
||||||
// Zero fill the bss segment
|
|
||||||
while (SectionTableAddr < &__bss_section_table_end) {
|
|
||||||
ExeAddr = *SectionTableAddr++;
|
|
||||||
SectionLen = *SectionTableAddr++;
|
|
||||||
bss_init(ExeAddr, SectionLen);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Patch the AEABI integer divide functions to use MCU's romdivide library
|
|
||||||
#ifdef __USE_ROMDIVIDE
|
|
||||||
// Get address of Integer division routines function table in ROM
|
|
||||||
unsigned int *div_ptr = (unsigned int *)((unsigned int *)*(PTR_ROM_DRIVER_TABLE))[4];
|
|
||||||
// Get addresses of integer divide routines in ROM
|
|
||||||
// These address are then used by the code in aeabi_romdiv_patch.s
|
|
||||||
pDivRom_idiv = (unsigned int *)div_ptr[0];
|
|
||||||
pDivRom_uidiv = (unsigned int *)div_ptr[1];
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined (__USE_CMSIS) || defined (__USE_LPCOPEN)
|
|
||||||
SystemInit();
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined (__cplusplus)
|
|
||||||
//
|
|
||||||
// Call C++ library initialisation
|
|
||||||
//
|
|
||||||
__libc_init_array();
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined (__REDLIB__)
|
|
||||||
// Call the Redlib library, which in turn calls main()
|
|
||||||
__main() ;
|
|
||||||
#else
|
|
||||||
main();
|
|
||||||
#endif
|
|
||||||
//
|
|
||||||
// main() shouldn't return, but if it does, we'll just enter an infinite loop
|
|
||||||
//
|
|
||||||
while (1) {
|
|
||||||
;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//*****************************************************************************
|
|
||||||
// Default exception handlers. Override the ones here by defining your own
|
|
||||||
// handler routines in your application code.
|
|
||||||
//*****************************************************************************
|
|
||||||
__attribute__ ((section(".after_vectors")))
|
|
||||||
void NMI_Handler(void)
|
|
||||||
{ while(1) { }
|
|
||||||
}
|
|
||||||
__attribute__ ((section(".after_vectors")))
|
|
||||||
void HardFault_Handler(void)
|
|
||||||
{ while(1) { }
|
|
||||||
}
|
|
||||||
|
|
||||||
__attribute__ ((section(".after_vectors")))
|
|
||||||
void SVC_Handler(void)
|
|
||||||
{ while(1) { }
|
|
||||||
}
|
|
||||||
|
|
||||||
__attribute__ ((section(".after_vectors")))
|
|
||||||
void PendSV_Handler(void)
|
|
||||||
{ while(1) { }
|
|
||||||
}
|
|
||||||
|
|
||||||
__attribute__ ((section(".after_vectors")))
|
|
||||||
void SysTick_Handler(void)
|
|
||||||
{ while(1) { }
|
|
||||||
}
|
|
||||||
|
|
||||||
//*****************************************************************************
|
|
||||||
//
|
|
||||||
// Processor ends up here if an unexpected interrupt occurs or a specific
|
|
||||||
// handler is not present in the application code.
|
|
||||||
//
|
|
||||||
//*****************************************************************************
|
|
||||||
__attribute__ ((section(".after_vectors")))
|
|
||||||
void IntDefaultHandler(void)
|
|
||||||
{ while(1) { }
|
|
||||||
}
|
|
||||||
@ -1,14 +0,0 @@
|
|||||||
/*
|
|
||||||
* crp.c
|
|
||||||
* Source file to create CRP word expected by Code Red linker
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifdef __CODE_RED
|
|
||||||
#include <NXP/crp.h>
|
|
||||||
|
|
||||||
// Variable to store CRP value in. Will be placed automatically
|
|
||||||
// by the linker when "Enable Code Read Protect" selected.
|
|
||||||
// See crp.h header for more information
|
|
||||||
__CRP const unsigned int CRP_WORD = CRP_NO_CRP ;
|
|
||||||
|
|
||||||
#endif
|
|
||||||
@ -1,120 +0,0 @@
|
|||||||
/*
|
|
||||||
* @brief FreeRTOS Blinky example
|
|
||||||
*
|
|
||||||
* @note
|
|
||||||
* Copyright(C) NXP Semiconductors, 2013
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* @par
|
|
||||||
* Software that is described herein is for illustrative purposes only
|
|
||||||
* which provides customers with programming information regarding the
|
|
||||||
* LPC products. This software is supplied "AS IS" without any warranties of
|
|
||||||
* any kind, and NXP Semiconductors and its licensor disclaim any and
|
|
||||||
* all warranties, express or implied, including all implied warranties of
|
|
||||||
* merchantability, fitness for a particular purpose and non-infringement of
|
|
||||||
* intellectual property rights. NXP Semiconductors assumes no responsibility
|
|
||||||
* or liability for the use of the software, conveys no license or rights under any
|
|
||||||
* patent, copyright, mask work right, or any other intellectual property rights in
|
|
||||||
* or to any products. NXP Semiconductors reserves the right to make changes
|
|
||||||
* in the software without notification. NXP Semiconductors also makes no
|
|
||||||
* representation or warranty that such application will be suitable for the
|
|
||||||
* specified use without further testing or modification.
|
|
||||||
*
|
|
||||||
* @par
|
|
||||||
* Permission to use, copy, modify, and distribute this software and its
|
|
||||||
* documentation is hereby granted, under NXP Semiconductors' and its
|
|
||||||
* licensor's relevant copyrights in the software, without fee, provided that it
|
|
||||||
* is used in conjunction with NXP Semiconductors microcontrollers. This
|
|
||||||
* copyright, permission, and disclaimer notice must appear in all copies of
|
|
||||||
* this code.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "board.h"
|
|
||||||
#include "FreeRTOS.h"
|
|
||||||
#include "task.h"
|
|
||||||
|
|
||||||
/*****************************************************************************
|
|
||||||
* Private types/enumerations/variables
|
|
||||||
****************************************************************************/
|
|
||||||
|
|
||||||
/*****************************************************************************
|
|
||||||
* Public types/enumerations/variables
|
|
||||||
****************************************************************************/
|
|
||||||
|
|
||||||
/*****************************************************************************
|
|
||||||
* Private functions
|
|
||||||
****************************************************************************/
|
|
||||||
|
|
||||||
/* Sets up system hardware */
|
|
||||||
static void prvSetupHardware(void)
|
|
||||||
{
|
|
||||||
SystemCoreClockUpdate();
|
|
||||||
Board_Init();
|
|
||||||
}
|
|
||||||
|
|
||||||
/* LED0 toggle thread */
|
|
||||||
static void vLEDTask0(void *pvParameters) {
|
|
||||||
bool LedState = false;
|
|
||||||
while (1) {
|
|
||||||
Board_LED_Set(0, LedState);
|
|
||||||
LedState = (bool) !LedState;
|
|
||||||
|
|
||||||
vTaskDelay(configTICK_RATE_HZ / 2);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* LED1 toggle thread */
|
|
||||||
static void vLEDTask1(void *pvParameters) {
|
|
||||||
bool LedState = false;
|
|
||||||
while (1) {
|
|
||||||
Board_LED_Set(1, LedState);
|
|
||||||
LedState = (bool) !LedState;
|
|
||||||
|
|
||||||
vTaskDelay(configTICK_RATE_HZ * 2);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* LED2 toggle thread */
|
|
||||||
static void vLEDTask2(void *pvParameters) {
|
|
||||||
bool LedState = false;
|
|
||||||
while (1) {
|
|
||||||
Board_LED_Set(2, LedState);
|
|
||||||
LedState = (bool) !LedState;
|
|
||||||
|
|
||||||
vTaskDelay(configTICK_RATE_HZ);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*****************************************************************************
|
|
||||||
* Public functions
|
|
||||||
****************************************************************************/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief main routine for FreeRTOS blinky example
|
|
||||||
* @return Nothing, function should not exit
|
|
||||||
*/
|
|
||||||
int main(void)
|
|
||||||
{
|
|
||||||
prvSetupHardware();
|
|
||||||
|
|
||||||
/* LED1 toggle thread */
|
|
||||||
xTaskCreate(vLEDTask1, (signed char *) "vTaskLed1",
|
|
||||||
configMINIMAL_STACK_SIZE, NULL, (tskIDLE_PRIORITY + 1UL),
|
|
||||||
(xTaskHandle *) NULL);
|
|
||||||
|
|
||||||
/* LED2 toggle thread */
|
|
||||||
xTaskCreate(vLEDTask2, (signed char *) "vTaskLed2",
|
|
||||||
configMINIMAL_STACK_SIZE, NULL, (tskIDLE_PRIORITY + 1UL),
|
|
||||||
(xTaskHandle *) NULL);
|
|
||||||
|
|
||||||
/* LED0 toggle thread */
|
|
||||||
xTaskCreate(vLEDTask0, (signed char *) "vTaskLed0",
|
|
||||||
configMINIMAL_STACK_SIZE, NULL, (tskIDLE_PRIORITY + 1UL),
|
|
||||||
(xTaskHandle *) NULL);
|
|
||||||
|
|
||||||
/* Start the scheduler */
|
|
||||||
vTaskStartScheduler();
|
|
||||||
|
|
||||||
/* Should never arrive here */
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
@ -1,86 +0,0 @@
|
|||||||
//*****************************************************************************
|
|
||||||
// +--+
|
|
||||||
// | ++----+
|
|
||||||
// +-++ |
|
|
||||||
// | |
|
|
||||||
// +-+--+ |
|
|
||||||
// | +--+--+
|
|
||||||
// +----+ Copyright (c) 2013 Code Red Technologies Ltd.
|
|
||||||
//
|
|
||||||
// mtb.c
|
|
||||||
//
|
|
||||||
// Optionally defines an array to be used as a buffer for Micro Trace
|
|
||||||
// Buffer (MTB) instruction trace on Cortex-M0+ parts
|
|
||||||
//
|
|
||||||
// Version : 130502
|
|
||||||
//
|
|
||||||
// Software License Agreement
|
|
||||||
//
|
|
||||||
// The software is owned by Code Red Technologies and/or its suppliers, and is
|
|
||||||
// protected under applicable copyright laws. All rights are reserved. Any
|
|
||||||
// use in violation of the foregoing restrictions may subject the user to criminal
|
|
||||||
// sanctions under applicable laws, as well as to civil liability for the breach
|
|
||||||
// of the terms and conditions of this license.
|
|
||||||
//
|
|
||||||
// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED
|
|
||||||
// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF
|
|
||||||
// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE.
|
|
||||||
// USE OF THIS SOFTWARE FOR COMMERCIAL DEVELOPMENT AND/OR EDUCATION IS SUBJECT
|
|
||||||
// TO A CURRENT END USER LICENSE AGREEMENT (COMMERCIAL OR EDUCATIONAL) WITH
|
|
||||||
// CODE RED TECHNOLOGIES LTD.
|
|
||||||
//
|
|
||||||
//*****************************************************************************
|
|
||||||
|
|
||||||
/*******************************************************************
|
|
||||||
* Symbols controlling behavior of this code...
|
|
||||||
*
|
|
||||||
* __MTB_DISABLE
|
|
||||||
* If this symbol is defined, then the buffer array for the MTB
|
|
||||||
* will not be created.
|
|
||||||
*
|
|
||||||
* __MTB_BUFFER_SIZE
|
|
||||||
* Symbol specifying the sizer of the buffer array for the MTB.
|
|
||||||
* This must be a power of 2 in size, and fit into the available
|
|
||||||
* RAM. The MTB buffer will also be aligned to its 'size'
|
|
||||||
* boundary and be placed at the start of a RAM bank (which
|
|
||||||
* should ensure minimal or zero padding due to alignment).
|
|
||||||
*
|
|
||||||
* __MTB_RAM_BANK
|
|
||||||
* Allows MTB Buffer to be placed into specific RAM bank. When
|
|
||||||
* this is not defined, the "default" (first if there are
|
|
||||||
* several) RAM bank is used.
|
|
||||||
*******************************************************************/
|
|
||||||
|
|
||||||
// Ignore with none Code Red tools
|
|
||||||
#if defined (__CODE_RED)
|
|
||||||
|
|
||||||
// Allow MTB to be removed by setting a define (via command line)
|
|
||||||
#if !defined (__MTB_DISABLE)
|
|
||||||
|
|
||||||
// Allow for MTB buffer size being set by define set via command line
|
|
||||||
// Otherwise provide small default buffer
|
|
||||||
#if !defined (__MTB_BUFFER_SIZE)
|
|
||||||
#define __MTB_BUFFER_SIZE 128
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// Check that buffer size requested is >0 bytes in size
|
|
||||||
#if (__MTB_BUFFER_SIZE > 0)
|
|
||||||
// Pull in MTB related macros
|
|
||||||
#include <cr_mtb_buffer.h>
|
|
||||||
|
|
||||||
// Check if MYTB buffer is to be placed in specific RAM bank
|
|
||||||
#if defined(__MTB_RAM_BANK)
|
|
||||||
// Place MTB buffer into explicit bank of RAM
|
|
||||||
__CR_MTB_BUFFER_EXT(__MTB_BUFFER_SIZE,__MTB_RAM_BANK);
|
|
||||||
#else
|
|
||||||
// Place MTB buffer into 'default' bank of RAM
|
|
||||||
__CR_MTB_BUFFER(__MTB_BUFFER_SIZE);
|
|
||||||
|
|
||||||
#endif // defined(__MTB_RAM_BANK)
|
|
||||||
|
|
||||||
#endif // (__MTB_BUFFER_SIZE > 0)
|
|
||||||
|
|
||||||
#endif // !defined (__MTB_DISABLE)
|
|
||||||
|
|
||||||
#endif // defined (__CODE_RED)
|
|
||||||
|
|
||||||
@ -1,60 +0,0 @@
|
|||||||
/*
|
|
||||||
* @brief Common SystemInit function for LPC11u6x chips
|
|
||||||
*
|
|
||||||
* @note
|
|
||||||
* Copyright(C) NXP Semiconductors, 2013
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* @par
|
|
||||||
* Software that is described herein is for illustrative purposes only
|
|
||||||
* which provides customers with programming information regarding the
|
|
||||||
* LPC products. This software is supplied "AS IS" without any warranties of
|
|
||||||
* any kind, and NXP Semiconductors and its licensor disclaim any and
|
|
||||||
* all warranties, express or implied, including all implied warranties of
|
|
||||||
* merchantability, fitness for a particular purpose and non-infringement of
|
|
||||||
* intellectual property rights. NXP Semiconductors assumes no responsibility
|
|
||||||
* or liability for the use of the software, conveys no license or rights under any
|
|
||||||
* patent, copyright, mask work right, or any other intellectual property rights in
|
|
||||||
* or to any products. NXP Semiconductors reserves the right to make changes
|
|
||||||
* in the software without notification. NXP Semiconductors also makes no
|
|
||||||
* representation or warranty that such application will be suitable for the
|
|
||||||
* specified use without further testing or modification.
|
|
||||||
*
|
|
||||||
* @par
|
|
||||||
* Permission to use, copy, modify, and distribute this software and its
|
|
||||||
* documentation is hereby granted, under NXP Semiconductors' and its
|
|
||||||
* licensor's relevant copyrights in the software, without fee, provided that it
|
|
||||||
* is used in conjunction with NXP Semiconductors microcontrollers. This
|
|
||||||
* copyright, permission, and disclaimer notice must appear in all copies of
|
|
||||||
* this code.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "board.h"
|
|
||||||
|
|
||||||
/*****************************************************************************
|
|
||||||
* Private types/enumerations/variables
|
|
||||||
****************************************************************************/
|
|
||||||
|
|
||||||
/*****************************************************************************
|
|
||||||
* Public types/enumerations/variables
|
|
||||||
****************************************************************************/
|
|
||||||
|
|
||||||
/*****************************************************************************
|
|
||||||
* Private functions
|
|
||||||
****************************************************************************/
|
|
||||||
|
|
||||||
/*****************************************************************************
|
|
||||||
* Public functions
|
|
||||||
****************************************************************************/
|
|
||||||
|
|
||||||
/* Set up and initialize hardware prior to call to main */
|
|
||||||
void SystemInit(void)
|
|
||||||
{
|
|
||||||
#if defined(NO_BOARD_LIB)
|
|
||||||
/* Chip specific SystemInit */
|
|
||||||
Chip_SystemInit();
|
|
||||||
#else
|
|
||||||
/* Setup system clocking and muxing */
|
|
||||||
Board_SystemInit();
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
@ -1,621 +0,0 @@
|
|||||||
/*
|
|
||||||
FreeRTOS V7.5.3 - Copyright (C) 2013 Real Time Engineers Ltd.
|
|
||||||
All rights reserved
|
|
||||||
|
|
||||||
VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION.
|
|
||||||
|
|
||||||
***************************************************************************
|
|
||||||
* *
|
|
||||||
* FreeRTOS provides completely free yet professionally developed, *
|
|
||||||
* robust, strictly quality controlled, supported, and cross *
|
|
||||||
* platform software that has become a de facto standard. *
|
|
||||||
* *
|
|
||||||
* Help yourself get started quickly and support the FreeRTOS *
|
|
||||||
* project by purchasing a FreeRTOS tutorial book, reference *
|
|
||||||
* manual, or both from: http://www.FreeRTOS.org/Documentation *
|
|
||||||
* *
|
|
||||||
* Thank you! *
|
|
||||||
* *
|
|
||||||
***************************************************************************
|
|
||||||
|
|
||||||
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 from the following
|
|
||||||
link: http://www.freertos.org/a00114.html
|
|
||||||
|
|
||||||
1 tab == 4 spaces!
|
|
||||||
|
|
||||||
***************************************************************************
|
|
||||||
* *
|
|
||||||
* Having a problem? Start by reading the FAQ "My application does *
|
|
||||||
* not run, what could be wrong?" *
|
|
||||||
* *
|
|
||||||
* http://www.FreeRTOS.org/FAQHelp.html *
|
|
||||||
* *
|
|
||||||
***************************************************************************
|
|
||||||
|
|
||||||
http://www.FreeRTOS.org - Documentation, books, training, latest versions,
|
|
||||||
license and Real Time Engineers Ltd. contact details.
|
|
||||||
|
|
||||||
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.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High
|
|
||||||
Integrity Systems to sell under the OpenRTOS brand. Low cost OpenRTOS
|
|
||||||
licenses offer ticketed support, indemnification and 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 INC_FREERTOS_H
|
|
||||||
#define INC_FREERTOS_H
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Include the generic headers required for the FreeRTOS port being used.
|
|
||||||
*/
|
|
||||||
#include <stddef.h>
|
|
||||||
|
|
||||||
/* Basic FreeRTOS definitions. */
|
|
||||||
#include "projdefs.h"
|
|
||||||
|
|
||||||
/* Application specific configuration options. */
|
|
||||||
#include "FreeRTOSConfig.h"
|
|
||||||
|
|
||||||
/* configUSE_PORT_OPTIMISED_TASK_SELECTION must be defined before portable.h
|
|
||||||
is included as it is used by the port layer. */
|
|
||||||
#ifndef configUSE_PORT_OPTIMISED_TASK_SELECTION
|
|
||||||
#define configUSE_PORT_OPTIMISED_TASK_SELECTION 0
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Definitions specific to the port being used. */
|
|
||||||
#include "portable.h"
|
|
||||||
|
|
||||||
|
|
||||||
/* Defines the prototype to which the application task hook function must
|
|
||||||
conform. */
|
|
||||||
typedef portBASE_TYPE (*pdTASK_HOOK_CODE)( void * );
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Check all the required application specific macros have been defined.
|
|
||||||
* These macros are application specific and (as downloaded) are defined
|
|
||||||
* within FreeRTOSConfig.h.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef configUSE_PREEMPTION
|
|
||||||
#error Missing definition: configUSE_PREEMPTION should be defined in FreeRTOSConfig.h as either 1 or 0. See the Configuration section of the FreeRTOS API documentation for details.
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef configUSE_IDLE_HOOK
|
|
||||||
#error Missing definition: configUSE_IDLE_HOOK should be defined in FreeRTOSConfig.h as either 1 or 0. See the Configuration section of the FreeRTOS API documentation for details.
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef configUSE_TICK_HOOK
|
|
||||||
#error Missing definition: configUSE_TICK_HOOK should be defined in FreeRTOSConfig.h as either 1 or 0. See the Configuration section of the FreeRTOS API documentation for details.
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef configUSE_CO_ROUTINES
|
|
||||||
#error Missing definition: configUSE_CO_ROUTINES should be defined in FreeRTOSConfig.h as either 1 or 0. See the Configuration section of the FreeRTOS API documentation for details.
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef INCLUDE_vTaskPrioritySet
|
|
||||||
#error Missing definition: INCLUDE_vTaskPrioritySet should be defined in FreeRTOSConfig.h as either 1 or 0. See the Configuration section of the FreeRTOS API documentation for details.
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef INCLUDE_uxTaskPriorityGet
|
|
||||||
#error Missing definition: INCLUDE_uxTaskPriorityGet should be defined in FreeRTOSConfig.h as either 1 or 0. See the Configuration section of the FreeRTOS API documentation for details.
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef INCLUDE_vTaskDelete
|
|
||||||
#error Missing definition: INCLUDE_vTaskDelete should be defined in FreeRTOSConfig.h as either 1 or 0. See the Configuration section of the FreeRTOS API documentation for details.
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef INCLUDE_vTaskSuspend
|
|
||||||
#error Missing definition: INCLUDE_vTaskSuspend should be defined in FreeRTOSConfig.h as either 1 or 0. See the Configuration section of the FreeRTOS API documentation for details.
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef INCLUDE_vTaskDelayUntil
|
|
||||||
#error Missing definition: INCLUDE_vTaskDelayUntil should be defined in FreeRTOSConfig.h as either 1 or 0. See the Configuration section of the FreeRTOS API documentation for details.
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef INCLUDE_vTaskDelay
|
|
||||||
#error Missing definition: INCLUDE_vTaskDelay should be defined in FreeRTOSConfig.h as either 1 or 0. See the Configuration section of the FreeRTOS API documentation for details.
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef configUSE_16_BIT_TICKS
|
|
||||||
#error Missing definition: configUSE_16_BIT_TICKS should be defined in FreeRTOSConfig.h as either 1 or 0. See the Configuration section of the FreeRTOS API documentation for details.
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef INCLUDE_xTaskGetIdleTaskHandle
|
|
||||||
#define INCLUDE_xTaskGetIdleTaskHandle 0
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef INCLUDE_xTimerGetTimerDaemonTaskHandle
|
|
||||||
#define INCLUDE_xTimerGetTimerDaemonTaskHandle 0
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef INCLUDE_xQueueGetMutexHolder
|
|
||||||
#define INCLUDE_xQueueGetMutexHolder 0
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef INCLUDE_xSemaphoreGetMutexHolder
|
|
||||||
#define INCLUDE_xSemaphoreGetMutexHolder INCLUDE_xQueueGetMutexHolder
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef INCLUDE_pcTaskGetTaskName
|
|
||||||
#define INCLUDE_pcTaskGetTaskName 0
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef configUSE_APPLICATION_TASK_TAG
|
|
||||||
#define configUSE_APPLICATION_TASK_TAG 0
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef INCLUDE_uxTaskGetStackHighWaterMark
|
|
||||||
#define INCLUDE_uxTaskGetStackHighWaterMark 0
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef INCLUDE_eTaskGetState
|
|
||||||
#define INCLUDE_eTaskGetState 0
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef configUSE_RECURSIVE_MUTEXES
|
|
||||||
#define configUSE_RECURSIVE_MUTEXES 0
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef configUSE_MUTEXES
|
|
||||||
#define configUSE_MUTEXES 0
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef configUSE_TIMERS
|
|
||||||
#define configUSE_TIMERS 0
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef configUSE_COUNTING_SEMAPHORES
|
|
||||||
#define configUSE_COUNTING_SEMAPHORES 0
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef configUSE_ALTERNATIVE_API
|
|
||||||
#define configUSE_ALTERNATIVE_API 0
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef portCRITICAL_NESTING_IN_TCB
|
|
||||||
#define portCRITICAL_NESTING_IN_TCB 0
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef configMAX_TASK_NAME_LEN
|
|
||||||
#define configMAX_TASK_NAME_LEN 16
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef configIDLE_SHOULD_YIELD
|
|
||||||
#define configIDLE_SHOULD_YIELD 1
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if configMAX_TASK_NAME_LEN < 1
|
|
||||||
#error configMAX_TASK_NAME_LEN must be set to a minimum of 1 in FreeRTOSConfig.h
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef INCLUDE_xTaskResumeFromISR
|
|
||||||
#define INCLUDE_xTaskResumeFromISR 1
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef configASSERT
|
|
||||||
#define configASSERT( x )
|
|
||||||
#define configASSERT_DEFINED 0
|
|
||||||
#else
|
|
||||||
#define configASSERT_DEFINED 1
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* The timers module relies on xTaskGetSchedulerState(). */
|
|
||||||
#if configUSE_TIMERS == 1
|
|
||||||
|
|
||||||
#ifndef configTIMER_TASK_PRIORITY
|
|
||||||
#error If configUSE_TIMERS is set to 1 then configTIMER_TASK_PRIORITY must also be defined.
|
|
||||||
#endif /* configTIMER_TASK_PRIORITY */
|
|
||||||
|
|
||||||
#ifndef configTIMER_QUEUE_LENGTH
|
|
||||||
#error If configUSE_TIMERS is set to 1 then configTIMER_QUEUE_LENGTH must also be defined.
|
|
||||||
#endif /* configTIMER_QUEUE_LENGTH */
|
|
||||||
|
|
||||||
#ifndef configTIMER_TASK_STACK_DEPTH
|
|
||||||
#error If configUSE_TIMERS is set to 1 then configTIMER_TASK_STACK_DEPTH must also be defined.
|
|
||||||
#endif /* configTIMER_TASK_STACK_DEPTH */
|
|
||||||
|
|
||||||
#endif /* configUSE_TIMERS */
|
|
||||||
|
|
||||||
#ifndef INCLUDE_xTaskGetSchedulerState
|
|
||||||
#define INCLUDE_xTaskGetSchedulerState 0
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef INCLUDE_xTaskGetCurrentTaskHandle
|
|
||||||
#define INCLUDE_xTaskGetCurrentTaskHandle 0
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
#ifndef portSET_INTERRUPT_MASK_FROM_ISR
|
|
||||||
#define portSET_INTERRUPT_MASK_FROM_ISR() 0
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef portCLEAR_INTERRUPT_MASK_FROM_ISR
|
|
||||||
#define portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedStatusValue ) ( void ) uxSavedStatusValue
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef portCLEAN_UP_TCB
|
|
||||||
#define portCLEAN_UP_TCB( pxTCB ) ( void ) pxTCB
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef portSETUP_TCB
|
|
||||||
#define portSETUP_TCB( pxTCB ) ( void ) pxTCB
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef configQUEUE_REGISTRY_SIZE
|
|
||||||
#define configQUEUE_REGISTRY_SIZE 0U
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if ( configQUEUE_REGISTRY_SIZE < 1 )
|
|
||||||
#define vQueueAddToRegistry( xQueue, pcName )
|
|
||||||
#define vQueueUnregisterQueue( xQueue )
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef portPOINTER_SIZE_TYPE
|
|
||||||
#define portPOINTER_SIZE_TYPE unsigned long
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Remove any unused trace macros. */
|
|
||||||
#ifndef traceSTART
|
|
||||||
/* Used to perform any necessary initialisation - for example, open a file
|
|
||||||
into which trace is to be written. */
|
|
||||||
#define traceSTART()
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef traceEND
|
|
||||||
/* Use to close a trace, for example close a file into which trace has been
|
|
||||||
written. */
|
|
||||||
#define traceEND()
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef traceTASK_SWITCHED_IN
|
|
||||||
/* Called after a task has been selected to run. pxCurrentTCB holds a pointer
|
|
||||||
to the task control block of the selected task. */
|
|
||||||
#define traceTASK_SWITCHED_IN()
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef traceINCREASE_TICK_COUNT
|
|
||||||
/* Called before stepping the tick count after waking from tickless idle
|
|
||||||
sleep. */
|
|
||||||
#define traceINCREASE_TICK_COUNT( x )
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef traceLOW_POWER_IDLE_BEGIN
|
|
||||||
/* Called immediately before entering tickless idle. */
|
|
||||||
#define traceLOW_POWER_IDLE_BEGIN()
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef traceLOW_POWER_IDLE_END
|
|
||||||
/* Called when returning to the Idle task after a tickless idle. */
|
|
||||||
#define traceLOW_POWER_IDLE_END()
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef traceTASK_SWITCHED_OUT
|
|
||||||
/* Called before a task has been selected to run. pxCurrentTCB holds a pointer
|
|
||||||
to the task control block of the task being switched out. */
|
|
||||||
#define traceTASK_SWITCHED_OUT()
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef traceTASK_PRIORITY_INHERIT
|
|
||||||
/* Called when a task attempts to take a mutex that is already held by a
|
|
||||||
lower priority task. pxTCBOfMutexHolder is a pointer to the TCB of the task
|
|
||||||
that holds the mutex. uxInheritedPriority is the priority the mutex holder
|
|
||||||
will inherit (the priority of the task that is attempting to obtain the
|
|
||||||
muted. */
|
|
||||||
#define traceTASK_PRIORITY_INHERIT( pxTCBOfMutexHolder, uxInheritedPriority )
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef traceTASK_PRIORITY_DISINHERIT
|
|
||||||
/* Called when a task releases a mutex, the holding of which had resulted in
|
|
||||||
the task inheriting the priority of a higher priority task.
|
|
||||||
pxTCBOfMutexHolder is a pointer to the TCB of the task that is releasing the
|
|
||||||
mutex. uxOriginalPriority is the task's configured (base) priority. */
|
|
||||||
#define traceTASK_PRIORITY_DISINHERIT( pxTCBOfMutexHolder, uxOriginalPriority )
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef traceBLOCKING_ON_QUEUE_RECEIVE
|
|
||||||
/* Task is about to block because it cannot read from a
|
|
||||||
queue/mutex/semaphore. pxQueue is a pointer to the queue/mutex/semaphore
|
|
||||||
upon which the read was attempted. pxCurrentTCB points to the TCB of the
|
|
||||||
task that attempted the read. */
|
|
||||||
#define traceBLOCKING_ON_QUEUE_RECEIVE( pxQueue )
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef traceBLOCKING_ON_QUEUE_SEND
|
|
||||||
/* Task is about to block because it cannot write to a
|
|
||||||
queue/mutex/semaphore. pxQueue is a pointer to the queue/mutex/semaphore
|
|
||||||
upon which the write was attempted. pxCurrentTCB points to the TCB of the
|
|
||||||
task that attempted the write. */
|
|
||||||
#define traceBLOCKING_ON_QUEUE_SEND( pxQueue )
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef configCHECK_FOR_STACK_OVERFLOW
|
|
||||||
#define configCHECK_FOR_STACK_OVERFLOW 0
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* The following event macros are embedded in the kernel API calls. */
|
|
||||||
|
|
||||||
#ifndef traceMOVED_TASK_TO_READY_STATE
|
|
||||||
#define traceMOVED_TASK_TO_READY_STATE( pxTCB )
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef traceQUEUE_CREATE
|
|
||||||
#define traceQUEUE_CREATE( pxNewQueue )
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef traceQUEUE_CREATE_FAILED
|
|
||||||
#define traceQUEUE_CREATE_FAILED( ucQueueType )
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef traceCREATE_MUTEX
|
|
||||||
#define traceCREATE_MUTEX( pxNewQueue )
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef traceCREATE_MUTEX_FAILED
|
|
||||||
#define traceCREATE_MUTEX_FAILED()
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef traceGIVE_MUTEX_RECURSIVE
|
|
||||||
#define traceGIVE_MUTEX_RECURSIVE( pxMutex )
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef traceGIVE_MUTEX_RECURSIVE_FAILED
|
|
||||||
#define traceGIVE_MUTEX_RECURSIVE_FAILED( pxMutex )
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef traceTAKE_MUTEX_RECURSIVE
|
|
||||||
#define traceTAKE_MUTEX_RECURSIVE( pxMutex )
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef traceTAKE_MUTEX_RECURSIVE_FAILED
|
|
||||||
#define traceTAKE_MUTEX_RECURSIVE_FAILED( pxMutex )
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef traceCREATE_COUNTING_SEMAPHORE
|
|
||||||
#define traceCREATE_COUNTING_SEMAPHORE()
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef traceCREATE_COUNTING_SEMAPHORE_FAILED
|
|
||||||
#define traceCREATE_COUNTING_SEMAPHORE_FAILED()
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef traceQUEUE_SEND
|
|
||||||
#define traceQUEUE_SEND( pxQueue )
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef traceQUEUE_SEND_FAILED
|
|
||||||
#define traceQUEUE_SEND_FAILED( pxQueue )
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef traceQUEUE_RECEIVE
|
|
||||||
#define traceQUEUE_RECEIVE( pxQueue )
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef traceQUEUE_PEEK
|
|
||||||
#define traceQUEUE_PEEK( pxQueue )
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef traceQUEUE_PEEK_FROM_ISR
|
|
||||||
#define traceQUEUE_PEEK_FROM_ISR( pxQueue )
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef traceQUEUE_RECEIVE_FAILED
|
|
||||||
#define traceQUEUE_RECEIVE_FAILED( pxQueue )
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef traceQUEUE_SEND_FROM_ISR
|
|
||||||
#define traceQUEUE_SEND_FROM_ISR( pxQueue )
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef traceQUEUE_SEND_FROM_ISR_FAILED
|
|
||||||
#define traceQUEUE_SEND_FROM_ISR_FAILED( pxQueue )
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef traceQUEUE_RECEIVE_FROM_ISR
|
|
||||||
#define traceQUEUE_RECEIVE_FROM_ISR( pxQueue )
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef traceQUEUE_RECEIVE_FROM_ISR_FAILED
|
|
||||||
#define traceQUEUE_RECEIVE_FROM_ISR_FAILED( pxQueue )
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef traceQUEUE_PEEK_FROM_ISR_FAILED
|
|
||||||
#define traceQUEUE_PEEK_FROM_ISR_FAILED( pxQueue )
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef traceQUEUE_DELETE
|
|
||||||
#define traceQUEUE_DELETE( pxQueue )
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef traceTASK_CREATE
|
|
||||||
#define traceTASK_CREATE( pxNewTCB )
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef traceTASK_CREATE_FAILED
|
|
||||||
#define traceTASK_CREATE_FAILED()
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef traceTASK_DELETE
|
|
||||||
#define traceTASK_DELETE( pxTaskToDelete )
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef traceTASK_DELAY_UNTIL
|
|
||||||
#define traceTASK_DELAY_UNTIL()
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef traceTASK_DELAY
|
|
||||||
#define traceTASK_DELAY()
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef traceTASK_PRIORITY_SET
|
|
||||||
#define traceTASK_PRIORITY_SET( pxTask, uxNewPriority )
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef traceTASK_SUSPEND
|
|
||||||
#define traceTASK_SUSPEND( pxTaskToSuspend )
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef traceTASK_RESUME
|
|
||||||
#define traceTASK_RESUME( pxTaskToResume )
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef traceTASK_RESUME_FROM_ISR
|
|
||||||
#define traceTASK_RESUME_FROM_ISR( pxTaskToResume )
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef traceTASK_INCREMENT_TICK
|
|
||||||
#define traceTASK_INCREMENT_TICK( xTickCount )
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef traceTIMER_CREATE
|
|
||||||
#define traceTIMER_CREATE( pxNewTimer )
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef traceTIMER_CREATE_FAILED
|
|
||||||
#define traceTIMER_CREATE_FAILED()
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef traceTIMER_COMMAND_SEND
|
|
||||||
#define traceTIMER_COMMAND_SEND( xTimer, xMessageID, xMessageValueValue, xReturn )
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef traceTIMER_EXPIRED
|
|
||||||
#define traceTIMER_EXPIRED( pxTimer )
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef traceTIMER_COMMAND_RECEIVED
|
|
||||||
#define traceTIMER_COMMAND_RECEIVED( pxTimer, xMessageID, xMessageValue )
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef traceMALLOC
|
|
||||||
#define traceMALLOC( pvAddress, uiSize )
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef traceFREE
|
|
||||||
#define traceFREE( pvAddress, uiSize )
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef configGENERATE_RUN_TIME_STATS
|
|
||||||
#define configGENERATE_RUN_TIME_STATS 0
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if ( configGENERATE_RUN_TIME_STATS == 1 )
|
|
||||||
|
|
||||||
#ifndef portCONFIGURE_TIMER_FOR_RUN_TIME_STATS
|
|
||||||
#error If configGENERATE_RUN_TIME_STATS is defined then portCONFIGURE_TIMER_FOR_RUN_TIME_STATS must also be defined. portCONFIGURE_TIMER_FOR_RUN_TIME_STATS should call a port layer function to setup a peripheral timer/counter that can then be used as the run time counter time base.
|
|
||||||
#endif /* portCONFIGURE_TIMER_FOR_RUN_TIME_STATS */
|
|
||||||
|
|
||||||
#ifndef portGET_RUN_TIME_COUNTER_VALUE
|
|
||||||
#ifndef portALT_GET_RUN_TIME_COUNTER_VALUE
|
|
||||||
#error If configGENERATE_RUN_TIME_STATS is defined then either portGET_RUN_TIME_COUNTER_VALUE or portALT_GET_RUN_TIME_COUNTER_VALUE must also be defined. See the examples provided and the FreeRTOS web site for more information.
|
|
||||||
#endif /* portALT_GET_RUN_TIME_COUNTER_VALUE */
|
|
||||||
#endif /* portGET_RUN_TIME_COUNTER_VALUE */
|
|
||||||
|
|
||||||
#endif /* configGENERATE_RUN_TIME_STATS */
|
|
||||||
|
|
||||||
#ifndef portCONFIGURE_TIMER_FOR_RUN_TIME_STATS
|
|
||||||
#define portCONFIGURE_TIMER_FOR_RUN_TIME_STATS()
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef configUSE_MALLOC_FAILED_HOOK
|
|
||||||
#define configUSE_MALLOC_FAILED_HOOK 0
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef portPRIVILEGE_BIT
|
|
||||||
#define portPRIVILEGE_BIT ( ( unsigned portBASE_TYPE ) 0x00 )
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef portYIELD_WITHIN_API
|
|
||||||
#define portYIELD_WITHIN_API portYIELD
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef pvPortMallocAligned
|
|
||||||
#define pvPortMallocAligned( x, puxStackBuffer ) ( ( ( puxStackBuffer ) == NULL ) ? ( pvPortMalloc( ( x ) ) ) : ( puxStackBuffer ) )
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef vPortFreeAligned
|
|
||||||
#define vPortFreeAligned( pvBlockToFree ) vPortFree( pvBlockToFree )
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef portSUPPRESS_TICKS_AND_SLEEP
|
|
||||||
#define portSUPPRESS_TICKS_AND_SLEEP( xExpectedIdleTime )
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef configEXPECTED_IDLE_TIME_BEFORE_SLEEP
|
|
||||||
#define configEXPECTED_IDLE_TIME_BEFORE_SLEEP 2
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if configEXPECTED_IDLE_TIME_BEFORE_SLEEP < 2
|
|
||||||
#error configEXPECTED_IDLE_TIME_BEFORE_SLEEP must not be less than 2
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef configUSE_TICKLESS_IDLE
|
|
||||||
#define configUSE_TICKLESS_IDLE 0
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef configPRE_SLEEP_PROCESSING
|
|
||||||
#define configPRE_SLEEP_PROCESSING( x )
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef configPOST_SLEEP_PROCESSING
|
|
||||||
#define configPOST_SLEEP_PROCESSING( x )
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef configUSE_QUEUE_SETS
|
|
||||||
#define configUSE_QUEUE_SETS 0
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef portTASK_USES_FLOATING_POINT
|
|
||||||
#define portTASK_USES_FLOATING_POINT()
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef configUSE_TIME_SLICING
|
|
||||||
#define configUSE_TIME_SLICING 1
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef configINCLUDE_APPLICATION_DEFINED_PRIVILEGED_FUNCTIONS
|
|
||||||
#define configINCLUDE_APPLICATION_DEFINED_PRIVILEGED_FUNCTIONS 0
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef configUSE_NEWLIB_REENTRANT
|
|
||||||
#define configUSE_NEWLIB_REENTRANT 0
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef configUSE_STATS_FORMATTING_FUNCTIONS
|
|
||||||
#define configUSE_STATS_FORMATTING_FUNCTIONS 0
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef portASSERT_IF_INTERRUPT_PRIORITY_INVALID
|
|
||||||
#define portASSERT_IF_INTERRUPT_PRIORITY_INVALID()
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* For backward compatability. */
|
|
||||||
#define eTaskStateGet eTaskGetState
|
|
||||||
|
|
||||||
#endif /* INC_FREERTOS_H */
|
|
||||||
|
|
||||||
@ -1,180 +0,0 @@
|
|||||||
/*
|
|
||||||
FreeRTOS V7.5.3 - Copyright (C) 2013 Real Time Engineers Ltd.
|
|
||||||
All rights reserved
|
|
||||||
|
|
||||||
VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION.
|
|
||||||
|
|
||||||
***************************************************************************
|
|
||||||
* *
|
|
||||||
* FreeRTOS provides completely free yet professionally developed, *
|
|
||||||
* robust, strictly quality controlled, supported, and cross *
|
|
||||||
* platform software that has become a de facto standard. *
|
|
||||||
* *
|
|
||||||
* Help yourself get started quickly and support the FreeRTOS *
|
|
||||||
* project by purchasing a FreeRTOS tutorial book, reference *
|
|
||||||
* manual, or both from: http://www.FreeRTOS.org/Documentation *
|
|
||||||
* *
|
|
||||||
* Thank you! *
|
|
||||||
* *
|
|
||||||
***************************************************************************
|
|
||||||
|
|
||||||
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 from the following
|
|
||||||
link: http://www.freertos.org/a00114.html
|
|
||||||
|
|
||||||
1 tab == 4 spaces!
|
|
||||||
|
|
||||||
***************************************************************************
|
|
||||||
* *
|
|
||||||
* Having a problem? Start by reading the FAQ "My application does *
|
|
||||||
* not run, what could be wrong?" *
|
|
||||||
* *
|
|
||||||
* http://www.FreeRTOS.org/FAQHelp.html *
|
|
||||||
* *
|
|
||||||
***************************************************************************
|
|
||||||
|
|
||||||
http://www.FreeRTOS.org - Documentation, books, training, latest versions,
|
|
||||||
license and Real Time Engineers Ltd. contact details.
|
|
||||||
|
|
||||||
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.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High
|
|
||||||
Integrity Systems to sell under the OpenRTOS brand. Low cost OpenRTOS
|
|
||||||
licenses offer ticketed support, indemnification and 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 STACK_MACROS_H
|
|
||||||
#define STACK_MACROS_H
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Call the stack overflow hook function if the stack of the task being swapped
|
|
||||||
* out is currently overflowed, or looks like it might have overflowed in the
|
|
||||||
* past.
|
|
||||||
*
|
|
||||||
* Setting configCHECK_FOR_STACK_OVERFLOW to 1 will cause the macro to check
|
|
||||||
* the current stack state only - comparing the current top of stack value to
|
|
||||||
* the stack limit. Setting configCHECK_FOR_STACK_OVERFLOW to greater than 1
|
|
||||||
* will also cause the last few stack bytes to be checked to ensure the value
|
|
||||||
* to which the bytes were set when the task was created have not been
|
|
||||||
* overwritten. Note this second test does not guarantee that an overflowed
|
|
||||||
* stack will always be recognised.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
#if( configCHECK_FOR_STACK_OVERFLOW == 0 )
|
|
||||||
|
|
||||||
/* FreeRTOSConfig.h is not set to check for stack overflows. */
|
|
||||||
#define taskFIRST_CHECK_FOR_STACK_OVERFLOW()
|
|
||||||
#define taskSECOND_CHECK_FOR_STACK_OVERFLOW()
|
|
||||||
|
|
||||||
#endif /* configCHECK_FOR_STACK_OVERFLOW == 0 */
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
#if( configCHECK_FOR_STACK_OVERFLOW == 1 )
|
|
||||||
|
|
||||||
/* FreeRTOSConfig.h is only set to use the first method of
|
|
||||||
overflow checking. */
|
|
||||||
#define taskSECOND_CHECK_FOR_STACK_OVERFLOW()
|
|
||||||
|
|
||||||
#endif
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
#if( ( configCHECK_FOR_STACK_OVERFLOW > 0 ) && ( portSTACK_GROWTH < 0 ) )
|
|
||||||
|
|
||||||
/* Only the current stack state is to be checked. */
|
|
||||||
#define taskFIRST_CHECK_FOR_STACK_OVERFLOW() \
|
|
||||||
{ \
|
|
||||||
/* Is the currently saved stack pointer within the stack limit? */ \
|
|
||||||
if( pxCurrentTCB->pxTopOfStack <= pxCurrentTCB->pxStack ) \
|
|
||||||
{ \
|
|
||||||
vApplicationStackOverflowHook( ( xTaskHandle ) pxCurrentTCB, pxCurrentTCB->pcTaskName ); \
|
|
||||||
} \
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* configCHECK_FOR_STACK_OVERFLOW > 0 */
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
#if( ( configCHECK_FOR_STACK_OVERFLOW > 0 ) && ( portSTACK_GROWTH > 0 ) )
|
|
||||||
|
|
||||||
/* Only the current stack state is to be checked. */
|
|
||||||
#define taskFIRST_CHECK_FOR_STACK_OVERFLOW() \
|
|
||||||
{ \
|
|
||||||
\
|
|
||||||
/* Is the currently saved stack pointer within the stack limit? */ \
|
|
||||||
if( pxCurrentTCB->pxTopOfStack >= pxCurrentTCB->pxEndOfStack ) \
|
|
||||||
{ \
|
|
||||||
vApplicationStackOverflowHook( ( xTaskHandle ) pxCurrentTCB, pxCurrentTCB->pcTaskName ); \
|
|
||||||
} \
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* configCHECK_FOR_STACK_OVERFLOW == 1 */
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
#if( ( configCHECK_FOR_STACK_OVERFLOW > 1 ) && ( portSTACK_GROWTH < 0 ) )
|
|
||||||
|
|
||||||
#define taskSECOND_CHECK_FOR_STACK_OVERFLOW() \
|
|
||||||
{ \
|
|
||||||
static const unsigned char ucExpectedStackBytes[] = { tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, \
|
|
||||||
tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, \
|
|
||||||
tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, \
|
|
||||||
tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, \
|
|
||||||
tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE }; \
|
|
||||||
\
|
|
||||||
\
|
|
||||||
/* Has the extremity of the task stack ever been written over? */ \
|
|
||||||
if( memcmp( ( void * ) pxCurrentTCB->pxStack, ( void * ) ucExpectedStackBytes, sizeof( ucExpectedStackBytes ) ) != 0 ) \
|
|
||||||
{ \
|
|
||||||
vApplicationStackOverflowHook( ( xTaskHandle ) pxCurrentTCB, pxCurrentTCB->pcTaskName ); \
|
|
||||||
} \
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* #if( configCHECK_FOR_STACK_OVERFLOW > 1 ) */
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
#if( ( configCHECK_FOR_STACK_OVERFLOW > 1 ) && ( portSTACK_GROWTH > 0 ) )
|
|
||||||
|
|
||||||
#define taskSECOND_CHECK_FOR_STACK_OVERFLOW() \
|
|
||||||
{ \
|
|
||||||
char *pcEndOfStack = ( char * ) pxCurrentTCB->pxEndOfStack; \
|
|
||||||
static const unsigned char ucExpectedStackBytes[] = { tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, \
|
|
||||||
tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, \
|
|
||||||
tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, \
|
|
||||||
tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, \
|
|
||||||
tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE }; \
|
|
||||||
\
|
|
||||||
\
|
|
||||||
pcEndOfStack -= sizeof( ucExpectedStackBytes ); \
|
|
||||||
\
|
|
||||||
/* Has the extremity of the task stack ever been written over? */ \
|
|
||||||
if( memcmp( ( void * ) pcEndOfStack, ( void * ) ucExpectedStackBytes, sizeof( ucExpectedStackBytes ) ) != 0 ) \
|
|
||||||
{ \
|
|
||||||
vApplicationStackOverflowHook( ( xTaskHandle ) pxCurrentTCB, pxCurrentTCB->pcTaskName ); \
|
|
||||||
} \
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* #if( configCHECK_FOR_STACK_OVERFLOW > 1 ) */
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
#endif /* STACK_MACROS_H */
|
|
||||||
|
|
||||||
@ -1,758 +0,0 @@
|
|||||||
/*
|
|
||||||
FreeRTOS V7.5.3 - Copyright (C) 2013 Real Time Engineers Ltd.
|
|
||||||
All rights reserved
|
|
||||||
|
|
||||||
VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION.
|
|
||||||
|
|
||||||
***************************************************************************
|
|
||||||
* *
|
|
||||||
* FreeRTOS provides completely free yet professionally developed, *
|
|
||||||
* robust, strictly quality controlled, supported, and cross *
|
|
||||||
* platform software that has become a de facto standard. *
|
|
||||||
* *
|
|
||||||
* Help yourself get started quickly and support the FreeRTOS *
|
|
||||||
* project by purchasing a FreeRTOS tutorial book, reference *
|
|
||||||
* manual, or both from: http://www.FreeRTOS.org/Documentation *
|
|
||||||
* *
|
|
||||||
* Thank you! *
|
|
||||||
* *
|
|
||||||
***************************************************************************
|
|
||||||
|
|
||||||
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 from the following
|
|
||||||
link: http://www.freertos.org/a00114.html
|
|
||||||
|
|
||||||
1 tab == 4 spaces!
|
|
||||||
|
|
||||||
***************************************************************************
|
|
||||||
* *
|
|
||||||
* Having a problem? Start by reading the FAQ "My application does *
|
|
||||||
* not run, what could be wrong?" *
|
|
||||||
* *
|
|
||||||
* http://www.FreeRTOS.org/FAQHelp.html *
|
|
||||||
* *
|
|
||||||
***************************************************************************
|
|
||||||
|
|
||||||
http://www.FreeRTOS.org - Documentation, books, training, latest versions,
|
|
||||||
license and Real Time Engineers Ltd. contact details.
|
|
||||||
|
|
||||||
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.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High
|
|
||||||
Integrity Systems to sell under the OpenRTOS brand. Low cost OpenRTOS
|
|
||||||
licenses offer ticketed support, indemnification and 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 CO_ROUTINE_H
|
|
||||||
#define CO_ROUTINE_H
|
|
||||||
|
|
||||||
#ifndef INC_FREERTOS_H
|
|
||||||
#error "include FreeRTOS.h must appear in source files before include croutine.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include "list.h"
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Used to hide the implementation of the co-routine control block. The
|
|
||||||
control block structure however has to be included in the header due to
|
|
||||||
the macro implementation of the co-routine functionality. */
|
|
||||||
typedef void * xCoRoutineHandle;
|
|
||||||
|
|
||||||
/* Defines the prototype to which co-routine functions must conform. */
|
|
||||||
typedef void (*crCOROUTINE_CODE)( xCoRoutineHandle, unsigned portBASE_TYPE );
|
|
||||||
|
|
||||||
typedef struct corCoRoutineControlBlock
|
|
||||||
{
|
|
||||||
crCOROUTINE_CODE pxCoRoutineFunction;
|
|
||||||
xListItem xGenericListItem; /*< List item used to place the CRCB in ready and blocked queues. */
|
|
||||||
xListItem xEventListItem; /*< List item used to place the CRCB in event lists. */
|
|
||||||
unsigned portBASE_TYPE uxPriority; /*< The priority of the co-routine in relation to other co-routines. */
|
|
||||||
unsigned portBASE_TYPE uxIndex; /*< Used to distinguish between co-routines when multiple co-routines use the same co-routine function. */
|
|
||||||
unsigned short uxState; /*< Used internally by the co-routine implementation. */
|
|
||||||
} corCRCB; /* Co-routine control block. Note must be identical in size down to uxPriority with tskTCB. */
|
|
||||||
|
|
||||||
/**
|
|
||||||
* croutine. h
|
|
||||||
*<pre>
|
|
||||||
portBASE_TYPE xCoRoutineCreate(
|
|
||||||
crCOROUTINE_CODE pxCoRoutineCode,
|
|
||||||
unsigned portBASE_TYPE uxPriority,
|
|
||||||
unsigned portBASE_TYPE uxIndex
|
|
||||||
);</pre>
|
|
||||||
*
|
|
||||||
* Create a new co-routine and add it to the list of co-routines that are
|
|
||||||
* ready to run.
|
|
||||||
*
|
|
||||||
* @param pxCoRoutineCode Pointer to the co-routine function. Co-routine
|
|
||||||
* functions require special syntax - see the co-routine section of the WEB
|
|
||||||
* documentation for more information.
|
|
||||||
*
|
|
||||||
* @param uxPriority The priority with respect to other co-routines at which
|
|
||||||
* the co-routine will run.
|
|
||||||
*
|
|
||||||
* @param uxIndex Used to distinguish between different co-routines that
|
|
||||||
* execute the same function. See the example below and the co-routine section
|
|
||||||
* of the WEB documentation for further information.
|
|
||||||
*
|
|
||||||
* @return pdPASS if the co-routine was successfully created and added to a ready
|
|
||||||
* list, otherwise an error code defined with ProjDefs.h.
|
|
||||||
*
|
|
||||||
* Example usage:
|
|
||||||
<pre>
|
|
||||||
// Co-routine to be created.
|
|
||||||
void vFlashCoRoutine( xCoRoutineHandle xHandle, unsigned portBASE_TYPE uxIndex )
|
|
||||||
{
|
|
||||||
// Variables in co-routines must be declared static if they must maintain value across a blocking call.
|
|
||||||
// This may not be necessary for const variables.
|
|
||||||
static const char cLedToFlash[ 2 ] = { 5, 6 };
|
|
||||||
static const portTickType uxFlashRates[ 2 ] = { 200, 400 };
|
|
||||||
|
|
||||||
// Must start every co-routine with a call to crSTART();
|
|
||||||
crSTART( xHandle );
|
|
||||||
|
|
||||||
for( ;; )
|
|
||||||
{
|
|
||||||
// This co-routine just delays for a fixed period, then toggles
|
|
||||||
// an LED. Two co-routines are created using this function, so
|
|
||||||
// the uxIndex parameter is used to tell the co-routine which
|
|
||||||
// LED to flash and how long to delay. This assumes xQueue has
|
|
||||||
// already been created.
|
|
||||||
vParTestToggleLED( cLedToFlash[ uxIndex ] );
|
|
||||||
crDELAY( xHandle, uxFlashRates[ uxIndex ] );
|
|
||||||
}
|
|
||||||
|
|
||||||
// Must end every co-routine with a call to crEND();
|
|
||||||
crEND();
|
|
||||||
}
|
|
||||||
|
|
||||||
// Function that creates two co-routines.
|
|
||||||
void vOtherFunction( void )
|
|
||||||
{
|
|
||||||
unsigned char ucParameterToPass;
|
|
||||||
xTaskHandle xHandle;
|
|
||||||
|
|
||||||
// Create two co-routines at priority 0. The first is given index 0
|
|
||||||
// so (from the code above) toggles LED 5 every 200 ticks. The second
|
|
||||||
// is given index 1 so toggles LED 6 every 400 ticks.
|
|
||||||
for( uxIndex = 0; uxIndex < 2; uxIndex++ )
|
|
||||||
{
|
|
||||||
xCoRoutineCreate( vFlashCoRoutine, 0, uxIndex );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</pre>
|
|
||||||
* \defgroup xCoRoutineCreate xCoRoutineCreate
|
|
||||||
* \ingroup Tasks
|
|
||||||
*/
|
|
||||||
signed portBASE_TYPE xCoRoutineCreate( crCOROUTINE_CODE pxCoRoutineCode, unsigned portBASE_TYPE uxPriority, unsigned portBASE_TYPE uxIndex );
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* croutine. h
|
|
||||||
*<pre>
|
|
||||||
void vCoRoutineSchedule( void );</pre>
|
|
||||||
*
|
|
||||||
* Run a co-routine.
|
|
||||||
*
|
|
||||||
* vCoRoutineSchedule() executes the highest priority co-routine that is able
|
|
||||||
* to run. The co-routine will execute until it either blocks, yields or is
|
|
||||||
* preempted by a task. Co-routines execute cooperatively so one
|
|
||||||
* co-routine cannot be preempted by another, but can be preempted by a task.
|
|
||||||
*
|
|
||||||
* If an application comprises of both tasks and co-routines then
|
|
||||||
* vCoRoutineSchedule should be called from the idle task (in an idle task
|
|
||||||
* hook).
|
|
||||||
*
|
|
||||||
* Example usage:
|
|
||||||
<pre>
|
|
||||||
// This idle task hook will schedule a co-routine each time it is called.
|
|
||||||
// The rest of the idle task will execute between co-routine calls.
|
|
||||||
void vApplicationIdleHook( void )
|
|
||||||
{
|
|
||||||
vCoRoutineSchedule();
|
|
||||||
}
|
|
||||||
|
|
||||||
// Alternatively, if you do not require any other part of the idle task to
|
|
||||||
// execute, the idle task hook can call vCoRoutineScheduler() within an
|
|
||||||
// infinite loop.
|
|
||||||
void vApplicationIdleHook( void )
|
|
||||||
{
|
|
||||||
for( ;; )
|
|
||||||
{
|
|
||||||
vCoRoutineSchedule();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</pre>
|
|
||||||
* \defgroup vCoRoutineSchedule vCoRoutineSchedule
|
|
||||||
* \ingroup Tasks
|
|
||||||
*/
|
|
||||||
void vCoRoutineSchedule( void );
|
|
||||||
|
|
||||||
/**
|
|
||||||
* croutine. h
|
|
||||||
* <pre>
|
|
||||||
crSTART( xCoRoutineHandle xHandle );</pre>
|
|
||||||
*
|
|
||||||
* This macro MUST always be called at the start of a co-routine function.
|
|
||||||
*
|
|
||||||
* Example usage:
|
|
||||||
<pre>
|
|
||||||
// Co-routine to be created.
|
|
||||||
void vACoRoutine( xCoRoutineHandle xHandle, unsigned portBASE_TYPE uxIndex )
|
|
||||||
{
|
|
||||||
// Variables in co-routines must be declared static if they must maintain value across a blocking call.
|
|
||||||
static long ulAVariable;
|
|
||||||
|
|
||||||
// Must start every co-routine with a call to crSTART();
|
|
||||||
crSTART( xHandle );
|
|
||||||
|
|
||||||
for( ;; )
|
|
||||||
{
|
|
||||||
// Co-routine functionality goes here.
|
|
||||||
}
|
|
||||||
|
|
||||||
// Must end every co-routine with a call to crEND();
|
|
||||||
crEND();
|
|
||||||
}</pre>
|
|
||||||
* \defgroup crSTART crSTART
|
|
||||||
* \ingroup Tasks
|
|
||||||
*/
|
|
||||||
#define crSTART( pxCRCB ) switch( ( ( corCRCB * )( pxCRCB ) )->uxState ) { case 0:
|
|
||||||
|
|
||||||
/**
|
|
||||||
* croutine. h
|
|
||||||
* <pre>
|
|
||||||
crEND();</pre>
|
|
||||||
*
|
|
||||||
* This macro MUST always be called at the end of a co-routine function.
|
|
||||||
*
|
|
||||||
* Example usage:
|
|
||||||
<pre>
|
|
||||||
// Co-routine to be created.
|
|
||||||
void vACoRoutine( xCoRoutineHandle xHandle, unsigned portBASE_TYPE uxIndex )
|
|
||||||
{
|
|
||||||
// Variables in co-routines must be declared static if they must maintain value across a blocking call.
|
|
||||||
static long ulAVariable;
|
|
||||||
|
|
||||||
// Must start every co-routine with a call to crSTART();
|
|
||||||
crSTART( xHandle );
|
|
||||||
|
|
||||||
for( ;; )
|
|
||||||
{
|
|
||||||
// Co-routine functionality goes here.
|
|
||||||
}
|
|
||||||
|
|
||||||
// Must end every co-routine with a call to crEND();
|
|
||||||
crEND();
|
|
||||||
}</pre>
|
|
||||||
* \defgroup crSTART crSTART
|
|
||||||
* \ingroup Tasks
|
|
||||||
*/
|
|
||||||
#define crEND() }
|
|
||||||
|
|
||||||
/*
|
|
||||||
* These macros are intended for internal use by the co-routine implementation
|
|
||||||
* only. The macros should not be used directly by application writers.
|
|
||||||
*/
|
|
||||||
#define crSET_STATE0( xHandle ) ( ( corCRCB * )( xHandle ) )->uxState = (__LINE__ * 2); return; case (__LINE__ * 2):
|
|
||||||
#define crSET_STATE1( xHandle ) ( ( corCRCB * )( xHandle ) )->uxState = ((__LINE__ * 2)+1); return; case ((__LINE__ * 2)+1):
|
|
||||||
|
|
||||||
/**
|
|
||||||
* croutine. h
|
|
||||||
*<pre>
|
|
||||||
crDELAY( xCoRoutineHandle xHandle, portTickType xTicksToDelay );</pre>
|
|
||||||
*
|
|
||||||
* Delay a co-routine for a fixed period of time.
|
|
||||||
*
|
|
||||||
* crDELAY can only be called from the co-routine function itself - not
|
|
||||||
* from within a function called by the co-routine function. This is because
|
|
||||||
* co-routines do not maintain their own stack.
|
|
||||||
*
|
|
||||||
* @param xHandle The handle of the co-routine to delay. This is the xHandle
|
|
||||||
* parameter of the co-routine function.
|
|
||||||
*
|
|
||||||
* @param xTickToDelay The number of ticks that the co-routine should delay
|
|
||||||
* for. The actual amount of time this equates to is defined by
|
|
||||||
* configTICK_RATE_HZ (set in FreeRTOSConfig.h). The constant portTICK_RATE_MS
|
|
||||||
* can be used to convert ticks to milliseconds.
|
|
||||||
*
|
|
||||||
* Example usage:
|
|
||||||
<pre>
|
|
||||||
// Co-routine to be created.
|
|
||||||
void vACoRoutine( xCoRoutineHandle xHandle, unsigned portBASE_TYPE uxIndex )
|
|
||||||
{
|
|
||||||
// Variables in co-routines must be declared static if they must maintain value across a blocking call.
|
|
||||||
// This may not be necessary for const variables.
|
|
||||||
// We are to delay for 200ms.
|
|
||||||
static const xTickType xDelayTime = 200 / portTICK_RATE_MS;
|
|
||||||
|
|
||||||
// Must start every co-routine with a call to crSTART();
|
|
||||||
crSTART( xHandle );
|
|
||||||
|
|
||||||
for( ;; )
|
|
||||||
{
|
|
||||||
// Delay for 200ms.
|
|
||||||
crDELAY( xHandle, xDelayTime );
|
|
||||||
|
|
||||||
// Do something here.
|
|
||||||
}
|
|
||||||
|
|
||||||
// Must end every co-routine with a call to crEND();
|
|
||||||
crEND();
|
|
||||||
}</pre>
|
|
||||||
* \defgroup crDELAY crDELAY
|
|
||||||
* \ingroup Tasks
|
|
||||||
*/
|
|
||||||
#define crDELAY( xHandle, xTicksToDelay ) \
|
|
||||||
if( ( xTicksToDelay ) > 0 ) \
|
|
||||||
{ \
|
|
||||||
vCoRoutineAddToDelayedList( ( xTicksToDelay ), NULL ); \
|
|
||||||
} \
|
|
||||||
crSET_STATE0( ( xHandle ) );
|
|
||||||
|
|
||||||
/**
|
|
||||||
* <pre>
|
|
||||||
crQUEUE_SEND(
|
|
||||||
xCoRoutineHandle xHandle,
|
|
||||||
xQueueHandle pxQueue,
|
|
||||||
void *pvItemToQueue,
|
|
||||||
portTickType xTicksToWait,
|
|
||||||
portBASE_TYPE *pxResult
|
|
||||||
)</pre>
|
|
||||||
*
|
|
||||||
* The macro's crQUEUE_SEND() and crQUEUE_RECEIVE() are the co-routine
|
|
||||||
* equivalent to the xQueueSend() and xQueueReceive() functions used by tasks.
|
|
||||||
*
|
|
||||||
* crQUEUE_SEND and crQUEUE_RECEIVE can only be used from a co-routine whereas
|
|
||||||
* xQueueSend() and xQueueReceive() can only be used from tasks.
|
|
||||||
*
|
|
||||||
* crQUEUE_SEND can only be called from the co-routine function itself - not
|
|
||||||
* from within a function called by the co-routine function. This is because
|
|
||||||
* co-routines do not maintain their own stack.
|
|
||||||
*
|
|
||||||
* See the co-routine section of the WEB documentation for information on
|
|
||||||
* passing data between tasks and co-routines and between ISR's and
|
|
||||||
* co-routines.
|
|
||||||
*
|
|
||||||
* @param xHandle The handle of the calling co-routine. This is the xHandle
|
|
||||||
* parameter of the co-routine function.
|
|
||||||
*
|
|
||||||
* @param pxQueue The handle of the queue on which the data will be posted.
|
|
||||||
* The handle is obtained as the return value when the queue is created using
|
|
||||||
* the xQueueCreate() API function.
|
|
||||||
*
|
|
||||||
* @param pvItemToQueue A pointer to the data being posted onto the queue.
|
|
||||||
* The number of bytes of each queued item is specified when the queue is
|
|
||||||
* created. This number of bytes is copied from pvItemToQueue into the queue
|
|
||||||
* itself.
|
|
||||||
*
|
|
||||||
* @param xTickToDelay The number of ticks that the co-routine should block
|
|
||||||
* to wait for space to become available on the queue, should space not be
|
|
||||||
* available immediately. The actual amount of time this equates to is defined
|
|
||||||
* by configTICK_RATE_HZ (set in FreeRTOSConfig.h). The constant
|
|
||||||
* portTICK_RATE_MS can be used to convert ticks to milliseconds (see example
|
|
||||||
* below).
|
|
||||||
*
|
|
||||||
* @param pxResult The variable pointed to by pxResult will be set to pdPASS if
|
|
||||||
* data was successfully posted onto the queue, otherwise it will be set to an
|
|
||||||
* error defined within ProjDefs.h.
|
|
||||||
*
|
|
||||||
* Example usage:
|
|
||||||
<pre>
|
|
||||||
// Co-routine function that blocks for a fixed period then posts a number onto
|
|
||||||
// a queue.
|
|
||||||
static void prvCoRoutineFlashTask( xCoRoutineHandle xHandle, unsigned portBASE_TYPE uxIndex )
|
|
||||||
{
|
|
||||||
// Variables in co-routines must be declared static if they must maintain value across a blocking call.
|
|
||||||
static portBASE_TYPE xNumberToPost = 0;
|
|
||||||
static portBASE_TYPE xResult;
|
|
||||||
|
|
||||||
// Co-routines must begin with a call to crSTART().
|
|
||||||
crSTART( xHandle );
|
|
||||||
|
|
||||||
for( ;; )
|
|
||||||
{
|
|
||||||
// This assumes the queue has already been created.
|
|
||||||
crQUEUE_SEND( xHandle, xCoRoutineQueue, &xNumberToPost, NO_DELAY, &xResult );
|
|
||||||
|
|
||||||
if( xResult != pdPASS )
|
|
||||||
{
|
|
||||||
// The message was not posted!
|
|
||||||
}
|
|
||||||
|
|
||||||
// Increment the number to be posted onto the queue.
|
|
||||||
xNumberToPost++;
|
|
||||||
|
|
||||||
// Delay for 100 ticks.
|
|
||||||
crDELAY( xHandle, 100 );
|
|
||||||
}
|
|
||||||
|
|
||||||
// Co-routines must end with a call to crEND().
|
|
||||||
crEND();
|
|
||||||
}</pre>
|
|
||||||
* \defgroup crQUEUE_SEND crQUEUE_SEND
|
|
||||||
* \ingroup Tasks
|
|
||||||
*/
|
|
||||||
#define crQUEUE_SEND( xHandle, pxQueue, pvItemToQueue, xTicksToWait, pxResult ) \
|
|
||||||
{ \
|
|
||||||
*( pxResult ) = xQueueCRSend( ( pxQueue) , ( pvItemToQueue) , ( xTicksToWait ) ); \
|
|
||||||
if( *( pxResult ) == errQUEUE_BLOCKED ) \
|
|
||||||
{ \
|
|
||||||
crSET_STATE0( ( xHandle ) ); \
|
|
||||||
*pxResult = xQueueCRSend( ( pxQueue ), ( pvItemToQueue ), 0 ); \
|
|
||||||
} \
|
|
||||||
if( *pxResult == errQUEUE_YIELD ) \
|
|
||||||
{ \
|
|
||||||
crSET_STATE1( ( xHandle ) ); \
|
|
||||||
*pxResult = pdPASS; \
|
|
||||||
} \
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* croutine. h
|
|
||||||
* <pre>
|
|
||||||
crQUEUE_RECEIVE(
|
|
||||||
xCoRoutineHandle xHandle,
|
|
||||||
xQueueHandle pxQueue,
|
|
||||||
void *pvBuffer,
|
|
||||||
portTickType xTicksToWait,
|
|
||||||
portBASE_TYPE *pxResult
|
|
||||||
)</pre>
|
|
||||||
*
|
|
||||||
* The macro's crQUEUE_SEND() and crQUEUE_RECEIVE() are the co-routine
|
|
||||||
* equivalent to the xQueueSend() and xQueueReceive() functions used by tasks.
|
|
||||||
*
|
|
||||||
* crQUEUE_SEND and crQUEUE_RECEIVE can only be used from a co-routine whereas
|
|
||||||
* xQueueSend() and xQueueReceive() can only be used from tasks.
|
|
||||||
*
|
|
||||||
* crQUEUE_RECEIVE can only be called from the co-routine function itself - not
|
|
||||||
* from within a function called by the co-routine function. This is because
|
|
||||||
* co-routines do not maintain their own stack.
|
|
||||||
*
|
|
||||||
* See the co-routine section of the WEB documentation for information on
|
|
||||||
* passing data between tasks and co-routines and between ISR's and
|
|
||||||
* co-routines.
|
|
||||||
*
|
|
||||||
* @param xHandle The handle of the calling co-routine. This is the xHandle
|
|
||||||
* parameter of the co-routine function.
|
|
||||||
*
|
|
||||||
* @param pxQueue The handle of the queue from which the data will be received.
|
|
||||||
* The handle is obtained as the return value when the queue is created using
|
|
||||||
* the xQueueCreate() API function.
|
|
||||||
*
|
|
||||||
* @param pvBuffer The buffer into which the received item is to be copied.
|
|
||||||
* The number of bytes of each queued item is specified when the queue is
|
|
||||||
* created. This number of bytes is copied into pvBuffer.
|
|
||||||
*
|
|
||||||
* @param xTickToDelay The number of ticks that the co-routine should block
|
|
||||||
* to wait for data to become available from the queue, should data not be
|
|
||||||
* available immediately. The actual amount of time this equates to is defined
|
|
||||||
* by configTICK_RATE_HZ (set in FreeRTOSConfig.h). The constant
|
|
||||||
* portTICK_RATE_MS can be used to convert ticks to milliseconds (see the
|
|
||||||
* crQUEUE_SEND example).
|
|
||||||
*
|
|
||||||
* @param pxResult The variable pointed to by pxResult will be set to pdPASS if
|
|
||||||
* data was successfully retrieved from the queue, otherwise it will be set to
|
|
||||||
* an error code as defined within ProjDefs.h.
|
|
||||||
*
|
|
||||||
* Example usage:
|
|
||||||
<pre>
|
|
||||||
// A co-routine receives the number of an LED to flash from a queue. It
|
|
||||||
// blocks on the queue until the number is received.
|
|
||||||
static void prvCoRoutineFlashWorkTask( xCoRoutineHandle xHandle, unsigned portBASE_TYPE uxIndex )
|
|
||||||
{
|
|
||||||
// Variables in co-routines must be declared static if they must maintain value across a blocking call.
|
|
||||||
static portBASE_TYPE xResult;
|
|
||||||
static unsigned portBASE_TYPE uxLEDToFlash;
|
|
||||||
|
|
||||||
// All co-routines must start with a call to crSTART().
|
|
||||||
crSTART( xHandle );
|
|
||||||
|
|
||||||
for( ;; )
|
|
||||||
{
|
|
||||||
// Wait for data to become available on the queue.
|
|
||||||
crQUEUE_RECEIVE( xHandle, xCoRoutineQueue, &uxLEDToFlash, portMAX_DELAY, &xResult );
|
|
||||||
|
|
||||||
if( xResult == pdPASS )
|
|
||||||
{
|
|
||||||
// We received the LED to flash - flash it!
|
|
||||||
vParTestToggleLED( uxLEDToFlash );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
crEND();
|
|
||||||
}</pre>
|
|
||||||
* \defgroup crQUEUE_RECEIVE crQUEUE_RECEIVE
|
|
||||||
* \ingroup Tasks
|
|
||||||
*/
|
|
||||||
#define crQUEUE_RECEIVE( xHandle, pxQueue, pvBuffer, xTicksToWait, pxResult ) \
|
|
||||||
{ \
|
|
||||||
*( pxResult ) = xQueueCRReceive( ( pxQueue) , ( pvBuffer ), ( xTicksToWait ) ); \
|
|
||||||
if( *( pxResult ) == errQUEUE_BLOCKED ) \
|
|
||||||
{ \
|
|
||||||
crSET_STATE0( ( xHandle ) ); \
|
|
||||||
*( pxResult ) = xQueueCRReceive( ( pxQueue) , ( pvBuffer ), 0 ); \
|
|
||||||
} \
|
|
||||||
if( *( pxResult ) == errQUEUE_YIELD ) \
|
|
||||||
{ \
|
|
||||||
crSET_STATE1( ( xHandle ) ); \
|
|
||||||
*( pxResult ) = pdPASS; \
|
|
||||||
} \
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* croutine. h
|
|
||||||
* <pre>
|
|
||||||
crQUEUE_SEND_FROM_ISR(
|
|
||||||
xQueueHandle pxQueue,
|
|
||||||
void *pvItemToQueue,
|
|
||||||
portBASE_TYPE xCoRoutinePreviouslyWoken
|
|
||||||
)</pre>
|
|
||||||
*
|
|
||||||
* The macro's crQUEUE_SEND_FROM_ISR() and crQUEUE_RECEIVE_FROM_ISR() are the
|
|
||||||
* co-routine equivalent to the xQueueSendFromISR() and xQueueReceiveFromISR()
|
|
||||||
* functions used by tasks.
|
|
||||||
*
|
|
||||||
* crQUEUE_SEND_FROM_ISR() and crQUEUE_RECEIVE_FROM_ISR() can only be used to
|
|
||||||
* pass data between a co-routine and and ISR, whereas xQueueSendFromISR() and
|
|
||||||
* xQueueReceiveFromISR() can only be used to pass data between a task and and
|
|
||||||
* ISR.
|
|
||||||
*
|
|
||||||
* crQUEUE_SEND_FROM_ISR can only be called from an ISR to send data to a queue
|
|
||||||
* that is being used from within a co-routine.
|
|
||||||
*
|
|
||||||
* See the co-routine section of the WEB documentation for information on
|
|
||||||
* passing data between tasks and co-routines and between ISR's and
|
|
||||||
* co-routines.
|
|
||||||
*
|
|
||||||
* @param xQueue The handle to the queue on which the item is to be posted.
|
|
||||||
*
|
|
||||||
* @param pvItemToQueue A pointer to the item that is to be placed on the
|
|
||||||
* queue. The size of the items the queue will hold was defined when the
|
|
||||||
* queue was created, so this many bytes will be copied from pvItemToQueue
|
|
||||||
* into the queue storage area.
|
|
||||||
*
|
|
||||||
* @param xCoRoutinePreviouslyWoken This is included so an ISR can post onto
|
|
||||||
* the same queue multiple times from a single interrupt. The first call
|
|
||||||
* should always pass in pdFALSE. Subsequent calls should pass in
|
|
||||||
* the value returned from the previous call.
|
|
||||||
*
|
|
||||||
* @return pdTRUE if a co-routine was woken by posting onto the queue. This is
|
|
||||||
* used by the ISR to determine if a context switch may be required following
|
|
||||||
* the ISR.
|
|
||||||
*
|
|
||||||
* Example usage:
|
|
||||||
<pre>
|
|
||||||
// A co-routine that blocks on a queue waiting for characters to be received.
|
|
||||||
static void vReceivingCoRoutine( xCoRoutineHandle xHandle, unsigned portBASE_TYPE uxIndex )
|
|
||||||
{
|
|
||||||
char cRxedChar;
|
|
||||||
portBASE_TYPE xResult;
|
|
||||||
|
|
||||||
// All co-routines must start with a call to crSTART().
|
|
||||||
crSTART( xHandle );
|
|
||||||
|
|
||||||
for( ;; )
|
|
||||||
{
|
|
||||||
// Wait for data to become available on the queue. This assumes the
|
|
||||||
// queue xCommsRxQueue has already been created!
|
|
||||||
crQUEUE_RECEIVE( xHandle, xCommsRxQueue, &uxLEDToFlash, portMAX_DELAY, &xResult );
|
|
||||||
|
|
||||||
// Was a character received?
|
|
||||||
if( xResult == pdPASS )
|
|
||||||
{
|
|
||||||
// Process the character here.
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// All co-routines must end with a call to crEND().
|
|
||||||
crEND();
|
|
||||||
}
|
|
||||||
|
|
||||||
// An ISR that uses a queue to send characters received on a serial port to
|
|
||||||
// a co-routine.
|
|
||||||
void vUART_ISR( void )
|
|
||||||
{
|
|
||||||
char cRxedChar;
|
|
||||||
portBASE_TYPE xCRWokenByPost = pdFALSE;
|
|
||||||
|
|
||||||
// We loop around reading characters until there are none left in the UART.
|
|
||||||
while( UART_RX_REG_NOT_EMPTY() )
|
|
||||||
{
|
|
||||||
// Obtain the character from the UART.
|
|
||||||
cRxedChar = UART_RX_REG;
|
|
||||||
|
|
||||||
// Post the character onto a queue. xCRWokenByPost will be pdFALSE
|
|
||||||
// the first time around the loop. If the post causes a co-routine
|
|
||||||
// to be woken (unblocked) then xCRWokenByPost will be set to pdTRUE.
|
|
||||||
// In this manner we can ensure that if more than one co-routine is
|
|
||||||
// blocked on the queue only one is woken by this ISR no matter how
|
|
||||||
// many characters are posted to the queue.
|
|
||||||
xCRWokenByPost = crQUEUE_SEND_FROM_ISR( xCommsRxQueue, &cRxedChar, xCRWokenByPost );
|
|
||||||
}
|
|
||||||
}</pre>
|
|
||||||
* \defgroup crQUEUE_SEND_FROM_ISR crQUEUE_SEND_FROM_ISR
|
|
||||||
* \ingroup Tasks
|
|
||||||
*/
|
|
||||||
#define crQUEUE_SEND_FROM_ISR( pxQueue, pvItemToQueue, xCoRoutinePreviouslyWoken ) xQueueCRSendFromISR( ( pxQueue ), ( pvItemToQueue ), ( xCoRoutinePreviouslyWoken ) )
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* croutine. h
|
|
||||||
* <pre>
|
|
||||||
crQUEUE_SEND_FROM_ISR(
|
|
||||||
xQueueHandle pxQueue,
|
|
||||||
void *pvBuffer,
|
|
||||||
portBASE_TYPE * pxCoRoutineWoken
|
|
||||||
)</pre>
|
|
||||||
*
|
|
||||||
* The macro's crQUEUE_SEND_FROM_ISR() and crQUEUE_RECEIVE_FROM_ISR() are the
|
|
||||||
* co-routine equivalent to the xQueueSendFromISR() and xQueueReceiveFromISR()
|
|
||||||
* functions used by tasks.
|
|
||||||
*
|
|
||||||
* crQUEUE_SEND_FROM_ISR() and crQUEUE_RECEIVE_FROM_ISR() can only be used to
|
|
||||||
* pass data between a co-routine and and ISR, whereas xQueueSendFromISR() and
|
|
||||||
* xQueueReceiveFromISR() can only be used to pass data between a task and and
|
|
||||||
* ISR.
|
|
||||||
*
|
|
||||||
* crQUEUE_RECEIVE_FROM_ISR can only be called from an ISR to receive data
|
|
||||||
* from a queue that is being used from within a co-routine (a co-routine
|
|
||||||
* posted to the queue).
|
|
||||||
*
|
|
||||||
* See the co-routine section of the WEB documentation for information on
|
|
||||||
* passing data between tasks and co-routines and between ISR's and
|
|
||||||
* co-routines.
|
|
||||||
*
|
|
||||||
* @param xQueue The handle to the queue on which the item is to be posted.
|
|
||||||
*
|
|
||||||
* @param pvBuffer A pointer to a buffer into which the received item will be
|
|
||||||
* placed. The size of the items the queue will hold was defined when the
|
|
||||||
* queue was created, so this many bytes will be copied from the queue into
|
|
||||||
* pvBuffer.
|
|
||||||
*
|
|
||||||
* @param pxCoRoutineWoken A co-routine may be blocked waiting for space to become
|
|
||||||
* available on the queue. If crQUEUE_RECEIVE_FROM_ISR causes such a
|
|
||||||
* co-routine to unblock *pxCoRoutineWoken will get set to pdTRUE, otherwise
|
|
||||||
* *pxCoRoutineWoken will remain unchanged.
|
|
||||||
*
|
|
||||||
* @return pdTRUE an item was successfully received from the queue, otherwise
|
|
||||||
* pdFALSE.
|
|
||||||
*
|
|
||||||
* Example usage:
|
|
||||||
<pre>
|
|
||||||
// A co-routine that posts a character to a queue then blocks for a fixed
|
|
||||||
// period. The character is incremented each time.
|
|
||||||
static void vSendingCoRoutine( xCoRoutineHandle xHandle, unsigned portBASE_TYPE uxIndex )
|
|
||||||
{
|
|
||||||
// cChar holds its value while this co-routine is blocked and must therefore
|
|
||||||
// be declared static.
|
|
||||||
static char cCharToTx = 'a';
|
|
||||||
portBASE_TYPE xResult;
|
|
||||||
|
|
||||||
// All co-routines must start with a call to crSTART().
|
|
||||||
crSTART( xHandle );
|
|
||||||
|
|
||||||
for( ;; )
|
|
||||||
{
|
|
||||||
// Send the next character to the queue.
|
|
||||||
crQUEUE_SEND( xHandle, xCoRoutineQueue, &cCharToTx, NO_DELAY, &xResult );
|
|
||||||
|
|
||||||
if( xResult == pdPASS )
|
|
||||||
{
|
|
||||||
// The character was successfully posted to the queue.
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// Could not post the character to the queue.
|
|
||||||
}
|
|
||||||
|
|
||||||
// Enable the UART Tx interrupt to cause an interrupt in this
|
|
||||||
// hypothetical UART. The interrupt will obtain the character
|
|
||||||
// from the queue and send it.
|
|
||||||
ENABLE_RX_INTERRUPT();
|
|
||||||
|
|
||||||
// Increment to the next character then block for a fixed period.
|
|
||||||
// cCharToTx will maintain its value across the delay as it is
|
|
||||||
// declared static.
|
|
||||||
cCharToTx++;
|
|
||||||
if( cCharToTx > 'x' )
|
|
||||||
{
|
|
||||||
cCharToTx = 'a';
|
|
||||||
}
|
|
||||||
crDELAY( 100 );
|
|
||||||
}
|
|
||||||
|
|
||||||
// All co-routines must end with a call to crEND().
|
|
||||||
crEND();
|
|
||||||
}
|
|
||||||
|
|
||||||
// An ISR that uses a queue to receive characters to send on a UART.
|
|
||||||
void vUART_ISR( void )
|
|
||||||
{
|
|
||||||
char cCharToTx;
|
|
||||||
portBASE_TYPE xCRWokenByPost = pdFALSE;
|
|
||||||
|
|
||||||
while( UART_TX_REG_EMPTY() )
|
|
||||||
{
|
|
||||||
// Are there any characters in the queue waiting to be sent?
|
|
||||||
// xCRWokenByPost will automatically be set to pdTRUE if a co-routine
|
|
||||||
// is woken by the post - ensuring that only a single co-routine is
|
|
||||||
// woken no matter how many times we go around this loop.
|
|
||||||
if( crQUEUE_RECEIVE_FROM_ISR( pxQueue, &cCharToTx, &xCRWokenByPost ) )
|
|
||||||
{
|
|
||||||
SEND_CHARACTER( cCharToTx );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}</pre>
|
|
||||||
* \defgroup crQUEUE_RECEIVE_FROM_ISR crQUEUE_RECEIVE_FROM_ISR
|
|
||||||
* \ingroup Tasks
|
|
||||||
*/
|
|
||||||
#define crQUEUE_RECEIVE_FROM_ISR( pxQueue, pvBuffer, pxCoRoutineWoken ) xQueueCRReceiveFromISR( ( pxQueue ), ( pvBuffer ), ( pxCoRoutineWoken ) )
|
|
||||||
|
|
||||||
/*
|
|
||||||
* This function is intended for internal use by the co-routine macros only.
|
|
||||||
* The macro nature of the co-routine implementation requires that the
|
|
||||||
* prototype appears here. The function should not be used by application
|
|
||||||
* writers.
|
|
||||||
*
|
|
||||||
* Removes the current co-routine from its ready list and places it in the
|
|
||||||
* appropriate delayed list.
|
|
||||||
*/
|
|
||||||
void vCoRoutineAddToDelayedList( portTickType xTicksToDelay, xList *pxEventList );
|
|
||||||
|
|
||||||
/*
|
|
||||||
* This function is intended for internal use by the queue implementation only.
|
|
||||||
* The function should not be used by application writers.
|
|
||||||
*
|
|
||||||
* Removes the highest priority co-routine from the event list and places it in
|
|
||||||
* the pending ready list.
|
|
||||||
*/
|
|
||||||
signed portBASE_TYPE xCoRoutineRemoveFromEventList( const xList *pxEventList );
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* CO_ROUTINE_H */
|
|
||||||
@ -1,379 +0,0 @@
|
|||||||
/*
|
|
||||||
FreeRTOS V7.5.3 - Copyright (C) 2013 Real Time Engineers Ltd.
|
|
||||||
All rights reserved
|
|
||||||
|
|
||||||
VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION.
|
|
||||||
|
|
||||||
***************************************************************************
|
|
||||||
* *
|
|
||||||
* FreeRTOS provides completely free yet professionally developed, *
|
|
||||||
* robust, strictly quality controlled, supported, and cross *
|
|
||||||
* platform software that has become a de facto standard. *
|
|
||||||
* *
|
|
||||||
* Help yourself get started quickly and support the FreeRTOS *
|
|
||||||
* project by purchasing a FreeRTOS tutorial book, reference *
|
|
||||||
* manual, or both from: http://www.FreeRTOS.org/Documentation *
|
|
||||||
* *
|
|
||||||
* Thank you! *
|
|
||||||
* *
|
|
||||||
***************************************************************************
|
|
||||||
|
|
||||||
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 from the following
|
|
||||||
link: http://www.freertos.org/a00114.html
|
|
||||||
|
|
||||||
1 tab == 4 spaces!
|
|
||||||
|
|
||||||
***************************************************************************
|
|
||||||
* *
|
|
||||||
* Having a problem? Start by reading the FAQ "My application does *
|
|
||||||
* not run, what could be wrong?" *
|
|
||||||
* *
|
|
||||||
* http://www.FreeRTOS.org/FAQHelp.html *
|
|
||||||
* *
|
|
||||||
***************************************************************************
|
|
||||||
|
|
||||||
http://www.FreeRTOS.org - Documentation, books, training, latest versions,
|
|
||||||
license and Real Time Engineers Ltd. contact details.
|
|
||||||
|
|
||||||
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.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High
|
|
||||||
Integrity Systems to sell under the OpenRTOS brand. Low cost OpenRTOS
|
|
||||||
licenses offer ticketed support, indemnification and 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 is the list implementation used by the scheduler. While it is tailored
|
|
||||||
* heavily for the schedulers needs, it is also available for use by
|
|
||||||
* application code.
|
|
||||||
*
|
|
||||||
* xLists can only store pointers to xListItems. Each xListItem contains a
|
|
||||||
* numeric value (xItemValue). Most of the time the lists are sorted in
|
|
||||||
* descending item value order.
|
|
||||||
*
|
|
||||||
* Lists are created already containing one list item. The value of this
|
|
||||||
* item is the maximum possible that can be stored, it is therefore always at
|
|
||||||
* the end of the list and acts as a marker. The list member pxHead always
|
|
||||||
* points to this marker - even though it is at the tail of the list. This
|
|
||||||
* is because the tail contains a wrap back pointer to the true head of
|
|
||||||
* the list.
|
|
||||||
*
|
|
||||||
* In addition to it's value, each list item contains a pointer to the next
|
|
||||||
* item in the list (pxNext), a pointer to the list it is in (pxContainer)
|
|
||||||
* and a pointer to back to the object that contains it. These later two
|
|
||||||
* pointers are included for efficiency of list manipulation. There is
|
|
||||||
* effectively a two way link between the object containing the list item and
|
|
||||||
* the list item itself.
|
|
||||||
*
|
|
||||||
*
|
|
||||||
* \page ListIntroduction List Implementation
|
|
||||||
* \ingroup FreeRTOSIntro
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
#ifndef LIST_H
|
|
||||||
#define LIST_H
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The list structure members are modified from within interrupts, and therefore
|
|
||||||
* by rights should be declared volatile. However, they are only modified in a
|
|
||||||
* functionally atomic way (within critical sections of with the scheduler
|
|
||||||
* suspended) and are either passed by reference into a function or indexed via
|
|
||||||
* a volatile variable. Therefore, in all use cases tested so far, the volatile
|
|
||||||
* qualifier can be omitted in order to provide a moderate performance
|
|
||||||
* improvement without adversely affecting functional behaviour. The assembly
|
|
||||||
* instructions generated by the IAR, ARM and GCC compilers when the respective
|
|
||||||
* compiler's options were set for maximum optimisation has been inspected and
|
|
||||||
* deemed to be as intended. That said, as compiler technology advances, and
|
|
||||||
* especially if aggressive cross module optimisation is used (a use case that
|
|
||||||
* has not been exercised to any great extend) then it is feasible that the
|
|
||||||
* volatile qualifier will be needed for correct optimisation. It is expected
|
|
||||||
* that a compiler removing essential code because, without the volatile
|
|
||||||
* qualifier on the list structure members and with aggressive cross module
|
|
||||||
* optimisation, the compiler deemed the code unnecessary will result in
|
|
||||||
* complete and obvious failure of the scheduler. If this is ever experienced
|
|
||||||
* then the volatile qualifier can be inserted in the relevant places within the
|
|
||||||
* list structures by simply defining configLIST_VOLATILE to volatile in
|
|
||||||
* FreeRTOSConfig.h (as per the example at the bottom of this comment block).
|
|
||||||
* If configLIST_VOLATILE is not defined then the preprocessor directives below
|
|
||||||
* will simply #define configLIST_VOLATILE away completely.
|
|
||||||
*
|
|
||||||
* To use volatile list structure members then add the following line to
|
|
||||||
* FreeRTOSConfig.h (without the quotes):
|
|
||||||
* "#define configLIST_VOLATILE volatile"
|
|
||||||
*/
|
|
||||||
#ifndef configLIST_VOLATILE
|
|
||||||
#define configLIST_VOLATILE
|
|
||||||
#endif /* configSUPPORT_CROSS_MODULE_OPTIMISATION */
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
/*
|
|
||||||
* Definition of the only type of object that a list can contain.
|
|
||||||
*/
|
|
||||||
struct xLIST_ITEM
|
|
||||||
{
|
|
||||||
configLIST_VOLATILE portTickType xItemValue; /*< The value being listed. In most cases this is used to sort the list in descending order. */
|
|
||||||
struct xLIST_ITEM * configLIST_VOLATILE pxNext; /*< Pointer to the next xListItem in the list. */
|
|
||||||
struct xLIST_ITEM * configLIST_VOLATILE pxPrevious;/*< Pointer to the previous xListItem in the list. */
|
|
||||||
void * pvOwner; /*< Pointer to the object (normally a TCB) that contains the list item. There is therefore a two way link between the object containing the list item and the list item itself. */
|
|
||||||
void * configLIST_VOLATILE pvContainer; /*< Pointer to the list in which this list item is placed (if any). */
|
|
||||||
};
|
|
||||||
typedef struct xLIST_ITEM xListItem; /* For some reason lint wants this as two separate definitions. */
|
|
||||||
|
|
||||||
struct xMINI_LIST_ITEM
|
|
||||||
{
|
|
||||||
configLIST_VOLATILE portTickType xItemValue;
|
|
||||||
struct xLIST_ITEM * configLIST_VOLATILE pxNext;
|
|
||||||
struct xLIST_ITEM * configLIST_VOLATILE pxPrevious;
|
|
||||||
};
|
|
||||||
typedef struct xMINI_LIST_ITEM xMiniListItem;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Definition of the type of queue used by the scheduler.
|
|
||||||
*/
|
|
||||||
typedef struct xLIST
|
|
||||||
{
|
|
||||||
configLIST_VOLATILE unsigned portBASE_TYPE uxNumberOfItems;
|
|
||||||
xListItem * configLIST_VOLATILE pxIndex; /*< Used to walk through the list. Points to the last item returned by a call to pvListGetOwnerOfNextEntry (). */
|
|
||||||
xMiniListItem xListEnd; /*< List item that contains the maximum possible item value meaning it is always at the end of the list and is therefore used as a marker. */
|
|
||||||
} xList;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Access macro to set the owner of a list item. The owner of a list item
|
|
||||||
* is the object (usually a TCB) that contains the list item.
|
|
||||||
*
|
|
||||||
* \page listSET_LIST_ITEM_OWNER listSET_LIST_ITEM_OWNER
|
|
||||||
* \ingroup LinkedList
|
|
||||||
*/
|
|
||||||
#define listSET_LIST_ITEM_OWNER( pxListItem, pxOwner ) ( ( pxListItem )->pvOwner = ( void * ) ( pxOwner ) )
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Access macro to get the owner of a list item. The owner of a list item
|
|
||||||
* is the object (usually a TCB) that contains the list item.
|
|
||||||
*
|
|
||||||
* \page listSET_LIST_ITEM_OWNER listSET_LIST_ITEM_OWNER
|
|
||||||
* \ingroup LinkedList
|
|
||||||
*/
|
|
||||||
#define listGET_LIST_ITEM_OWNER( pxListItem ) ( pxListItem )->pvOwner
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Access macro to set the value of the list item. In most cases the value is
|
|
||||||
* used to sort the list in descending order.
|
|
||||||
*
|
|
||||||
* \page listSET_LIST_ITEM_VALUE listSET_LIST_ITEM_VALUE
|
|
||||||
* \ingroup LinkedList
|
|
||||||
*/
|
|
||||||
#define listSET_LIST_ITEM_VALUE( pxListItem, xValue ) ( ( pxListItem )->xItemValue = ( xValue ) )
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Access macro to retrieve the value of the list item. The value can
|
|
||||||
* represent anything - for example a the priority of a task, or the time at
|
|
||||||
* which a task should be unblocked.
|
|
||||||
*
|
|
||||||
* \page listGET_LIST_ITEM_VALUE listGET_LIST_ITEM_VALUE
|
|
||||||
* \ingroup LinkedList
|
|
||||||
*/
|
|
||||||
#define listGET_LIST_ITEM_VALUE( pxListItem ) ( ( pxListItem )->xItemValue )
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Access macro the retrieve the value of the list item at the head of a given
|
|
||||||
* list.
|
|
||||||
*
|
|
||||||
* \page listGET_LIST_ITEM_VALUE listGET_LIST_ITEM_VALUE
|
|
||||||
* \ingroup LinkedList
|
|
||||||
*/
|
|
||||||
#define listGET_ITEM_VALUE_OF_HEAD_ENTRY( pxList ) ( (&( ( pxList )->xListEnd ))->pxNext->xItemValue )
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Access macro to determine if a list contains any items. The macro will
|
|
||||||
* only have the value true if the list is empty.
|
|
||||||
*
|
|
||||||
* \page listLIST_IS_EMPTY listLIST_IS_EMPTY
|
|
||||||
* \ingroup LinkedList
|
|
||||||
*/
|
|
||||||
#define listLIST_IS_EMPTY( pxList ) ( ( portBASE_TYPE ) ( ( pxList )->uxNumberOfItems == ( unsigned portBASE_TYPE ) 0 ) )
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Access macro to return the number of items in the list.
|
|
||||||
*/
|
|
||||||
#define listCURRENT_LIST_LENGTH( pxList ) ( ( pxList )->uxNumberOfItems )
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Access function to obtain the owner of the next entry in a list.
|
|
||||||
*
|
|
||||||
* The list member pxIndex is used to walk through a list. Calling
|
|
||||||
* listGET_OWNER_OF_NEXT_ENTRY increments pxIndex to the next item in the list
|
|
||||||
* and returns that entries pxOwner parameter. Using multiple calls to this
|
|
||||||
* function it is therefore possible to move through every item contained in
|
|
||||||
* a list.
|
|
||||||
*
|
|
||||||
* The pxOwner parameter of a list item is a pointer to the object that owns
|
|
||||||
* the list item. In the scheduler this is normally a task control block.
|
|
||||||
* The pxOwner parameter effectively creates a two way link between the list
|
|
||||||
* item and its owner.
|
|
||||||
*
|
|
||||||
* @param pxList The list from which the next item owner is to be returned.
|
|
||||||
*
|
|
||||||
* \page listGET_OWNER_OF_NEXT_ENTRY listGET_OWNER_OF_NEXT_ENTRY
|
|
||||||
* \ingroup LinkedList
|
|
||||||
*/
|
|
||||||
#define listGET_OWNER_OF_NEXT_ENTRY( pxTCB, pxList ) \
|
|
||||||
{ \
|
|
||||||
xList * const pxConstList = ( pxList ); \
|
|
||||||
/* Increment the index to the next item and return the item, ensuring */ \
|
|
||||||
/* we don't return the marker used at the end of the list. */ \
|
|
||||||
( pxConstList )->pxIndex = ( pxConstList )->pxIndex->pxNext; \
|
|
||||||
if( ( void * ) ( pxConstList )->pxIndex == ( void * ) &( ( pxConstList )->xListEnd ) ) \
|
|
||||||
{ \
|
|
||||||
( pxConstList )->pxIndex = ( pxConstList )->pxIndex->pxNext; \
|
|
||||||
} \
|
|
||||||
( pxTCB ) = ( pxConstList )->pxIndex->pvOwner; \
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Access function to obtain the owner of the first entry in a list. Lists
|
|
||||||
* are normally sorted in ascending item value order.
|
|
||||||
*
|
|
||||||
* This function returns the pxOwner member of the first item in the list.
|
|
||||||
* The pxOwner parameter of a list item is a pointer to the object that owns
|
|
||||||
* the list item. In the scheduler this is normally a task control block.
|
|
||||||
* The pxOwner parameter effectively creates a two way link between the list
|
|
||||||
* item and its owner.
|
|
||||||
*
|
|
||||||
* @param pxList The list from which the owner of the head item is to be
|
|
||||||
* returned.
|
|
||||||
*
|
|
||||||
* \page listGET_OWNER_OF_HEAD_ENTRY listGET_OWNER_OF_HEAD_ENTRY
|
|
||||||
* \ingroup LinkedList
|
|
||||||
*/
|
|
||||||
#define listGET_OWNER_OF_HEAD_ENTRY( pxList ) ( (&( ( pxList )->xListEnd ))->pxNext->pvOwner )
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Check to see if a list item is within a list. The list item maintains a
|
|
||||||
* "container" pointer that points to the list it is in. All this macro does
|
|
||||||
* is check to see if the container and the list match.
|
|
||||||
*
|
|
||||||
* @param pxList The list we want to know if the list item is within.
|
|
||||||
* @param pxListItem The list item we want to know if is in the list.
|
|
||||||
* @return pdTRUE is the list item is in the list, otherwise pdFALSE.
|
|
||||||
* pointer against
|
|
||||||
*/
|
|
||||||
#define listIS_CONTAINED_WITHIN( pxList, pxListItem ) ( ( portBASE_TYPE ) ( ( pxListItem )->pvContainer == ( void * ) ( pxList ) ) )
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Return the list a list item is contained within (referenced from).
|
|
||||||
*
|
|
||||||
* @param pxListItem The list item being queried.
|
|
||||||
* @return A pointer to the xList object that references the pxListItem
|
|
||||||
*/
|
|
||||||
#define listLIST_ITEM_CONTAINER( pxListItem ) ( ( pxListItem )->pvContainer )
|
|
||||||
|
|
||||||
/*
|
|
||||||
* This provides a crude means of knowing if a list has been initialised, as
|
|
||||||
* pxList->xListEnd.xItemValue is set to portMAX_DELAY by the vListInitialise()
|
|
||||||
* function.
|
|
||||||
*/
|
|
||||||
#define listLIST_IS_INITIALISED( pxList ) ( ( pxList )->xListEnd.xItemValue == portMAX_DELAY )
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Must be called before a list is used! This initialises all the members
|
|
||||||
* of the list structure and inserts the xListEnd item into the list as a
|
|
||||||
* marker to the back of the list.
|
|
||||||
*
|
|
||||||
* @param pxList Pointer to the list being initialised.
|
|
||||||
*
|
|
||||||
* \page vListInitialise vListInitialise
|
|
||||||
* \ingroup LinkedList
|
|
||||||
*/
|
|
||||||
void vListInitialise( xList * const pxList );
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Must be called before a list item is used. This sets the list container to
|
|
||||||
* null so the item does not think that it is already contained in a list.
|
|
||||||
*
|
|
||||||
* @param pxItem Pointer to the list item being initialised.
|
|
||||||
*
|
|
||||||
* \page vListInitialiseItem vListInitialiseItem
|
|
||||||
* \ingroup LinkedList
|
|
||||||
*/
|
|
||||||
void vListInitialiseItem( xListItem * const pxItem );
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Insert a list item into a list. The item will be inserted into the list in
|
|
||||||
* a position determined by its item value (descending item value order).
|
|
||||||
*
|
|
||||||
* @param pxList The list into which the item is to be inserted.
|
|
||||||
*
|
|
||||||
* @param pxNewListItem The item to that is to be placed in the list.
|
|
||||||
*
|
|
||||||
* \page vListInsert vListInsert
|
|
||||||
* \ingroup LinkedList
|
|
||||||
*/
|
|
||||||
void vListInsert( xList * const pxList, xListItem * const pxNewListItem );
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Insert a list item into a list. The item will be inserted in a position
|
|
||||||
* such that it will be the last item within the list returned by multiple
|
|
||||||
* calls to listGET_OWNER_OF_NEXT_ENTRY.
|
|
||||||
*
|
|
||||||
* The list member pvIndex is used to walk through a list. Calling
|
|
||||||
* listGET_OWNER_OF_NEXT_ENTRY increments pvIndex to the next item in the list.
|
|
||||||
* Placing an item in a list using vListInsertEnd effectively places the item
|
|
||||||
* in the list position pointed to by pvIndex. This means that every other
|
|
||||||
* item within the list will be returned by listGET_OWNER_OF_NEXT_ENTRY before
|
|
||||||
* the pvIndex parameter again points to the item being inserted.
|
|
||||||
*
|
|
||||||
* @param pxList The list into which the item is to be inserted.
|
|
||||||
*
|
|
||||||
* @param pxNewListItem The list item to be inserted into the list.
|
|
||||||
*
|
|
||||||
* \page vListInsertEnd vListInsertEnd
|
|
||||||
* \ingroup LinkedList
|
|
||||||
*/
|
|
||||||
void vListInsertEnd( xList * const pxList, xListItem * const pxNewListItem );
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Remove an item from a list. The list item has a pointer to the list that
|
|
||||||
* it is in, so only the list item need be passed into the function.
|
|
||||||
*
|
|
||||||
* @param uxListRemove The item to be removed. The item will remove itself from
|
|
||||||
* the list pointed to by it's pxContainer parameter.
|
|
||||||
*
|
|
||||||
* @return The number of items that remain in the list after the list item has
|
|
||||||
* been removed.
|
|
||||||
*
|
|
||||||
* \page uxListRemove uxListRemove
|
|
||||||
* \ingroup LinkedList
|
|
||||||
*/
|
|
||||||
unsigned portBASE_TYPE uxListRemove( xListItem * const pxItemToRemove );
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
@ -1,153 +0,0 @@
|
|||||||
/*
|
|
||||||
FreeRTOS V7.5.3 - Copyright (C) 2013 Real Time Engineers Ltd.
|
|
||||||
All rights reserved
|
|
||||||
|
|
||||||
VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION.
|
|
||||||
|
|
||||||
***************************************************************************
|
|
||||||
* *
|
|
||||||
* FreeRTOS provides completely free yet professionally developed, *
|
|
||||||
* robust, strictly quality controlled, supported, and cross *
|
|
||||||
* platform software that has become a de facto standard. *
|
|
||||||
* *
|
|
||||||
* Help yourself get started quickly and support the FreeRTOS *
|
|
||||||
* project by purchasing a FreeRTOS tutorial book, reference *
|
|
||||||
* manual, or both from: http://www.FreeRTOS.org/Documentation *
|
|
||||||
* *
|
|
||||||
* Thank you! *
|
|
||||||
* *
|
|
||||||
***************************************************************************
|
|
||||||
|
|
||||||
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 from the following
|
|
||||||
link: http://www.freertos.org/a00114.html
|
|
||||||
|
|
||||||
1 tab == 4 spaces!
|
|
||||||
|
|
||||||
***************************************************************************
|
|
||||||
* *
|
|
||||||
* Having a problem? Start by reading the FAQ "My application does *
|
|
||||||
* not run, what could be wrong?" *
|
|
||||||
* *
|
|
||||||
* http://www.FreeRTOS.org/FAQHelp.html *
|
|
||||||
* *
|
|
||||||
***************************************************************************
|
|
||||||
|
|
||||||
http://www.FreeRTOS.org - Documentation, books, training, latest versions,
|
|
||||||
license and Real Time Engineers Ltd. contact details.
|
|
||||||
|
|
||||||
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.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High
|
|
||||||
Integrity Systems to sell under the OpenRTOS brand. Low cost OpenRTOS
|
|
||||||
licenses offer ticketed support, indemnification and 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 MPU_WRAPPERS_H
|
|
||||||
#define MPU_WRAPPERS_H
|
|
||||||
|
|
||||||
/* This file redefines API functions to be called through a wrapper macro, but
|
|
||||||
only for ports that are using the MPU. */
|
|
||||||
#ifdef portUSING_MPU_WRAPPERS
|
|
||||||
|
|
||||||
/* MPU_WRAPPERS_INCLUDED_FROM_API_FILE will be defined when this file is
|
|
||||||
included from queue.c or task.c to prevent it from having an effect within
|
|
||||||
those files. */
|
|
||||||
#ifndef MPU_WRAPPERS_INCLUDED_FROM_API_FILE
|
|
||||||
|
|
||||||
#define xTaskGenericCreate MPU_xTaskGenericCreate
|
|
||||||
#define vTaskAllocateMPURegions MPU_vTaskAllocateMPURegions
|
|
||||||
#define vTaskDelete MPU_vTaskDelete
|
|
||||||
#define vTaskDelayUntil MPU_vTaskDelayUntil
|
|
||||||
#define vTaskDelay MPU_vTaskDelay
|
|
||||||
#define uxTaskPriorityGet MPU_uxTaskPriorityGet
|
|
||||||
#define vTaskPrioritySet MPU_vTaskPrioritySet
|
|
||||||
#define eTaskGetState MPU_eTaskGetState
|
|
||||||
#define vTaskSuspend MPU_vTaskSuspend
|
|
||||||
#define xTaskIsTaskSuspended MPU_xTaskIsTaskSuspended
|
|
||||||
#define vTaskResume MPU_vTaskResume
|
|
||||||
#define vTaskSuspendAll MPU_vTaskSuspendAll
|
|
||||||
#define xTaskResumeAll MPU_xTaskResumeAll
|
|
||||||
#define xTaskGetTickCount MPU_xTaskGetTickCount
|
|
||||||
#define uxTaskGetNumberOfTasks MPU_uxTaskGetNumberOfTasks
|
|
||||||
#define vTaskList MPU_vTaskList
|
|
||||||
#define vTaskGetRunTimeStats MPU_vTaskGetRunTimeStats
|
|
||||||
#define vTaskSetApplicationTaskTag MPU_vTaskSetApplicationTaskTag
|
|
||||||
#define xTaskGetApplicationTaskTag MPU_xTaskGetApplicationTaskTag
|
|
||||||
#define xTaskCallApplicationTaskHook MPU_xTaskCallApplicationTaskHook
|
|
||||||
#define uxTaskGetStackHighWaterMark MPU_uxTaskGetStackHighWaterMark
|
|
||||||
#define xTaskGetCurrentTaskHandle MPU_xTaskGetCurrentTaskHandle
|
|
||||||
#define xTaskGetSchedulerState MPU_xTaskGetSchedulerState
|
|
||||||
#define xTaskGetIdleTaskHandle MPU_xTaskGetIdleTaskHandle
|
|
||||||
#define uxTaskGetSystemState MPU_uxTaskGetSystemState
|
|
||||||
|
|
||||||
#define xQueueGenericCreate MPU_xQueueGenericCreate
|
|
||||||
#define xQueueCreateMutex MPU_xQueueCreateMutex
|
|
||||||
#define xQueueGiveMutexRecursive MPU_xQueueGiveMutexRecursive
|
|
||||||
#define xQueueTakeMutexRecursive MPU_xQueueTakeMutexRecursive
|
|
||||||
#define xQueueCreateCountingSemaphore MPU_xQueueCreateCountingSemaphore
|
|
||||||
#define xQueueGenericSend MPU_xQueueGenericSend
|
|
||||||
#define xQueueAltGenericSend MPU_xQueueAltGenericSend
|
|
||||||
#define xQueueAltGenericReceive MPU_xQueueAltGenericReceive
|
|
||||||
#define xQueueGenericReceive MPU_xQueueGenericReceive
|
|
||||||
#define uxQueueMessagesWaiting MPU_uxQueueMessagesWaiting
|
|
||||||
#define vQueueDelete MPU_vQueueDelete
|
|
||||||
#define xQueueGenericReset MPU_xQueueGenericReset
|
|
||||||
#define xQueueCreateSet MPU_xQueueCreateSet
|
|
||||||
#define xQueueSelectFromSet MPU_xQueueSelectFromSet
|
|
||||||
#define xQueueAddToSet MPU_xQueueAddToSet
|
|
||||||
#define xQueueRemoveFromSet MPU_xQueueRemoveFromSet
|
|
||||||
#define xQueuePeekFromISR MPU_xQueuePeekFromISR
|
|
||||||
|
|
||||||
#define pvPortMalloc MPU_pvPortMalloc
|
|
||||||
#define vPortFree MPU_vPortFree
|
|
||||||
#define xPortGetFreeHeapSize MPU_xPortGetFreeHeapSize
|
|
||||||
#define vPortInitialiseBlocks MPU_vPortInitialiseBlocks
|
|
||||||
|
|
||||||
#if configQUEUE_REGISTRY_SIZE > 0
|
|
||||||
#define vQueueAddToRegistry MPU_vQueueAddToRegistry
|
|
||||||
#define vQueueUnregisterQueue MPU_vQueueUnregisterQueue
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Remove the privileged function macro. */
|
|
||||||
#define PRIVILEGED_FUNCTION
|
|
||||||
|
|
||||||
#else /* MPU_WRAPPERS_INCLUDED_FROM_API_FILE */
|
|
||||||
|
|
||||||
/* Ensure API functions go in the privileged execution section. */
|
|
||||||
#define PRIVILEGED_FUNCTION __attribute__((section("privileged_functions")))
|
|
||||||
#define PRIVILEGED_DATA __attribute__((section("privileged_data")))
|
|
||||||
|
|
||||||
#endif /* MPU_WRAPPERS_INCLUDED_FROM_API_FILE */
|
|
||||||
|
|
||||||
#else /* portUSING_MPU_WRAPPERS */
|
|
||||||
|
|
||||||
#define PRIVILEGED_FUNCTION
|
|
||||||
#define PRIVILEGED_DATA
|
|
||||||
#define portUSING_MPU_WRAPPERS 0
|
|
||||||
|
|
||||||
#endif /* portUSING_MPU_WRAPPERS */
|
|
||||||
|
|
||||||
|
|
||||||
#endif /* MPU_WRAPPERS_H */
|
|
||||||
|
|
||||||
@ -1,402 +0,0 @@
|
|||||||
/*
|
|
||||||
FreeRTOS V7.5.3 - Copyright (C) 2013 Real Time Engineers Ltd.
|
|
||||||
All rights reserved
|
|
||||||
|
|
||||||
VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION.
|
|
||||||
|
|
||||||
***************************************************************************
|
|
||||||
* *
|
|
||||||
* FreeRTOS provides completely free yet professionally developed, *
|
|
||||||
* robust, strictly quality controlled, supported, and cross *
|
|
||||||
* platform software that has become a de facto standard. *
|
|
||||||
* *
|
|
||||||
* Help yourself get started quickly and support the FreeRTOS *
|
|
||||||
* project by purchasing a FreeRTOS tutorial book, reference *
|
|
||||||
* manual, or both from: http://www.FreeRTOS.org/Documentation *
|
|
||||||
* *
|
|
||||||
* Thank you! *
|
|
||||||
* *
|
|
||||||
***************************************************************************
|
|
||||||
|
|
||||||
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 from the following
|
|
||||||
link: http://www.freertos.org/a00114.html
|
|
||||||
|
|
||||||
1 tab == 4 spaces!
|
|
||||||
|
|
||||||
***************************************************************************
|
|
||||||
* *
|
|
||||||
* Having a problem? Start by reading the FAQ "My application does *
|
|
||||||
* not run, what could be wrong?" *
|
|
||||||
* *
|
|
||||||
* http://www.FreeRTOS.org/FAQHelp.html *
|
|
||||||
* *
|
|
||||||
***************************************************************************
|
|
||||||
|
|
||||||
http://www.FreeRTOS.org - Documentation, books, training, latest versions,
|
|
||||||
license and Real Time Engineers Ltd. contact details.
|
|
||||||
|
|
||||||
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.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High
|
|
||||||
Integrity Systems to sell under the OpenRTOS brand. Low cost OpenRTOS
|
|
||||||
licenses offer ticketed support, indemnification and 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!
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*-----------------------------------------------------------
|
|
||||||
* Portable layer API. Each function must be defined for each port.
|
|
||||||
*----------------------------------------------------------*/
|
|
||||||
|
|
||||||
#ifndef PORTABLE_H
|
|
||||||
#define PORTABLE_H
|
|
||||||
|
|
||||||
/* Include the macro file relevant to the port being used. */
|
|
||||||
|
|
||||||
#ifdef OPEN_WATCOM_INDUSTRIAL_PC_PORT
|
|
||||||
#include "..\..\Source\portable\owatcom\16bitdos\pc\portmacro.h"
|
|
||||||
typedef void ( __interrupt __far *pxISR )();
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef OPEN_WATCOM_FLASH_LITE_186_PORT
|
|
||||||
#include "..\..\Source\portable\owatcom\16bitdos\flsh186\portmacro.h"
|
|
||||||
typedef void ( __interrupt __far *pxISR )();
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef GCC_MEGA_AVR
|
|
||||||
#include "../portable/GCC/ATMega323/portmacro.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef IAR_MEGA_AVR
|
|
||||||
#include "../portable/IAR/ATMega323/portmacro.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef MPLAB_PIC24_PORT
|
|
||||||
#include "..\..\Source\portable\MPLAB\PIC24_dsPIC\portmacro.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef MPLAB_DSPIC_PORT
|
|
||||||
#include "..\..\Source\portable\MPLAB\PIC24_dsPIC\portmacro.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef MPLAB_PIC18F_PORT
|
|
||||||
#include "..\..\Source\portable\MPLAB\PIC18F\portmacro.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef MPLAB_PIC32MX_PORT
|
|
||||||
#include "..\..\Source\portable\MPLAB\PIC32MX\portmacro.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef _FEDPICC
|
|
||||||
#include "libFreeRTOS/Include/portmacro.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef SDCC_CYGNAL
|
|
||||||
#include "../../Source/portable/SDCC/Cygnal/portmacro.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef GCC_ARM7
|
|
||||||
#include "../../Source/portable/GCC/ARM7_LPC2000/portmacro.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef GCC_ARM7_ECLIPSE
|
|
||||||
#include "portmacro.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef ROWLEY_LPC23xx
|
|
||||||
#include "../../Source/portable/GCC/ARM7_LPC23xx/portmacro.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef IAR_MSP430
|
|
||||||
#include "..\..\Source\portable\IAR\MSP430\portmacro.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef GCC_MSP430
|
|
||||||
#include "../../Source/portable/GCC/MSP430F449/portmacro.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef ROWLEY_MSP430
|
|
||||||
#include "../../Source/portable/Rowley/MSP430F449/portmacro.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef ARM7_LPC21xx_KEIL_RVDS
|
|
||||||
#include "..\..\Source\portable\RVDS\ARM7_LPC21xx\portmacro.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef SAM7_GCC
|
|
||||||
#include "../../Source/portable/GCC/ARM7_AT91SAM7S/portmacro.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef SAM7_IAR
|
|
||||||
#include "..\..\Source\portable\IAR\AtmelSAM7S64\portmacro.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef SAM9XE_IAR
|
|
||||||
#include "..\..\Source\portable\IAR\AtmelSAM9XE\portmacro.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef LPC2000_IAR
|
|
||||||
#include "..\..\Source\portable\IAR\LPC2000\portmacro.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef STR71X_IAR
|
|
||||||
#include "..\..\Source\portable\IAR\STR71x\portmacro.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef STR75X_IAR
|
|
||||||
#include "..\..\Source\portable\IAR\STR75x\portmacro.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef STR75X_GCC
|
|
||||||
#include "..\..\Source\portable\GCC\STR75x\portmacro.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef STR91X_IAR
|
|
||||||
#include "..\..\Source\portable\IAR\STR91x\portmacro.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef GCC_H8S
|
|
||||||
#include "../../Source/portable/GCC/H8S2329/portmacro.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef GCC_AT91FR40008
|
|
||||||
#include "../../Source/portable/GCC/ARM7_AT91FR40008/portmacro.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef RVDS_ARMCM3_LM3S102
|
|
||||||
#include "../../Source/portable/RVDS/ARM_CM3/portmacro.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef GCC_ARMCM3_LM3S102
|
|
||||||
#include "../../Source/portable/GCC/ARM_CM3/portmacro.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef GCC_ARMCM3
|
|
||||||
#include "../../Source/portable/GCC/ARM_CM3/portmacro.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef IAR_ARM_CM3
|
|
||||||
#include "../../Source/portable/IAR/ARM_CM3/portmacro.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef IAR_ARMCM3_LM
|
|
||||||
#include "../../Source/portable/IAR/ARM_CM3/portmacro.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef HCS12_CODE_WARRIOR
|
|
||||||
#include "../../Source/portable/CodeWarrior/HCS12/portmacro.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef MICROBLAZE_GCC
|
|
||||||
#include "../../Source/portable/GCC/MicroBlaze/portmacro.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef TERN_EE
|
|
||||||
#include "..\..\Source\portable\Paradigm\Tern_EE\small\portmacro.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef GCC_HCS12
|
|
||||||
#include "../../Source/portable/GCC/HCS12/portmacro.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef GCC_MCF5235
|
|
||||||
#include "../../Source/portable/GCC/MCF5235/portmacro.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef COLDFIRE_V2_GCC
|
|
||||||
#include "../../../Source/portable/GCC/ColdFire_V2/portmacro.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef COLDFIRE_V2_CODEWARRIOR
|
|
||||||
#include "../../Source/portable/CodeWarrior/ColdFire_V2/portmacro.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef GCC_PPC405
|
|
||||||
#include "../../Source/portable/GCC/PPC405_Xilinx/portmacro.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef GCC_PPC440
|
|
||||||
#include "../../Source/portable/GCC/PPC440_Xilinx/portmacro.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef _16FX_SOFTUNE
|
|
||||||
#include "..\..\Source\portable\Softune\MB96340\portmacro.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef BCC_INDUSTRIAL_PC_PORT
|
|
||||||
/* A short file name has to be used in place of the normal
|
|
||||||
FreeRTOSConfig.h when using the Borland compiler. */
|
|
||||||
#include "frconfig.h"
|
|
||||||
#include "..\portable\BCC\16BitDOS\PC\prtmacro.h"
|
|
||||||
typedef void ( __interrupt __far *pxISR )();
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef BCC_FLASH_LITE_186_PORT
|
|
||||||
/* A short file name has to be used in place of the normal
|
|
||||||
FreeRTOSConfig.h when using the Borland compiler. */
|
|
||||||
#include "frconfig.h"
|
|
||||||
#include "..\portable\BCC\16BitDOS\flsh186\prtmacro.h"
|
|
||||||
typedef void ( __interrupt __far *pxISR )();
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef __GNUC__
|
|
||||||
#ifdef __AVR32_AVR32A__
|
|
||||||
#include "portmacro.h"
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef __ICCAVR32__
|
|
||||||
#ifdef __CORE__
|
|
||||||
#if __CORE__ == __AVR32A__
|
|
||||||
#include "portmacro.h"
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef __91467D
|
|
||||||
#include "portmacro.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef __96340
|
|
||||||
#include "portmacro.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef __IAR_V850ES_Fx3__
|
|
||||||
#include "../../Source/portable/IAR/V850ES/portmacro.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef __IAR_V850ES_Jx3__
|
|
||||||
#include "../../Source/portable/IAR/V850ES/portmacro.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef __IAR_V850ES_Jx3_L__
|
|
||||||
#include "../../Source/portable/IAR/V850ES/portmacro.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef __IAR_V850ES_Jx2__
|
|
||||||
#include "../../Source/portable/IAR/V850ES/portmacro.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef __IAR_V850ES_Hx2__
|
|
||||||
#include "../../Source/portable/IAR/V850ES/portmacro.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef __IAR_78K0R_Kx3__
|
|
||||||
#include "../../Source/portable/IAR/78K0R/portmacro.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef __IAR_78K0R_Kx3L__
|
|
||||||
#include "../../Source/portable/IAR/78K0R/portmacro.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Catch all to ensure portmacro.h is included in the build. Newer demos
|
|
||||||
have the path as part of the project options, rather than as relative from
|
|
||||||
the project location. If portENTER_CRITICAL() has not been defined then
|
|
||||||
portmacro.h has not yet been included - as every portmacro.h provides a
|
|
||||||
portENTER_CRITICAL() definition. Check the demo application for your demo
|
|
||||||
to find the path to the correct portmacro.h file. */
|
|
||||||
#ifndef portENTER_CRITICAL
|
|
||||||
#include "portmacro.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if portBYTE_ALIGNMENT == 8
|
|
||||||
#define portBYTE_ALIGNMENT_MASK ( 0x0007 )
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if portBYTE_ALIGNMENT == 4
|
|
||||||
#define portBYTE_ALIGNMENT_MASK ( 0x0003 )
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if portBYTE_ALIGNMENT == 2
|
|
||||||
#define portBYTE_ALIGNMENT_MASK ( 0x0001 )
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if portBYTE_ALIGNMENT == 1
|
|
||||||
#define portBYTE_ALIGNMENT_MASK ( 0x0000 )
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef portBYTE_ALIGNMENT_MASK
|
|
||||||
#error "Invalid portBYTE_ALIGNMENT definition"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef portNUM_CONFIGURABLE_REGIONS
|
|
||||||
#define portNUM_CONFIGURABLE_REGIONS 1
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include "mpu_wrappers.h"
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Setup the stack of a new task so it is ready to be placed under the
|
|
||||||
* scheduler control. The registers have to be placed on the stack in
|
|
||||||
* the order that the port expects to find them.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
#if( portUSING_MPU_WRAPPERS == 1 )
|
|
||||||
portSTACK_TYPE *pxPortInitialiseStack( portSTACK_TYPE *pxTopOfStack, pdTASK_CODE pxCode, void *pvParameters, portBASE_TYPE xRunPrivileged ) PRIVILEGED_FUNCTION;
|
|
||||||
#else
|
|
||||||
portSTACK_TYPE *pxPortInitialiseStack( portSTACK_TYPE *pxTopOfStack, pdTASK_CODE pxCode, void *pvParameters ) PRIVILEGED_FUNCTION;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Map to the memory management routines required for the port.
|
|
||||||
*/
|
|
||||||
void *pvPortMalloc( size_t xSize ) PRIVILEGED_FUNCTION;
|
|
||||||
void vPortFree( void *pv ) PRIVILEGED_FUNCTION;
|
|
||||||
void vPortInitialiseBlocks( void ) PRIVILEGED_FUNCTION;
|
|
||||||
size_t xPortGetFreeHeapSize( void ) PRIVILEGED_FUNCTION;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Setup the hardware ready for the scheduler to take control. This generally
|
|
||||||
* sets up a tick interrupt and sets timers for the correct tick frequency.
|
|
||||||
*/
|
|
||||||
portBASE_TYPE xPortStartScheduler( void ) PRIVILEGED_FUNCTION;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Undo any hardware/ISR setup that was performed by xPortStartScheduler() so
|
|
||||||
* the hardware is left in its original condition after the scheduler stops
|
|
||||||
* executing.
|
|
||||||
*/
|
|
||||||
void vPortEndScheduler( void ) PRIVILEGED_FUNCTION;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The structures and methods of manipulating the MPU are contained within the
|
|
||||||
* port layer.
|
|
||||||
*
|
|
||||||
* Fills the xMPUSettings structure with the memory region information
|
|
||||||
* contained in xRegions.
|
|
||||||
*/
|
|
||||||
#if( portUSING_MPU_WRAPPERS == 1 )
|
|
||||||
struct xMEMORY_REGION;
|
|
||||||
void vPortStoreTaskMPUSettings( xMPU_SETTINGS *xMPUSettings, const struct xMEMORY_REGION * const xRegions, portSTACK_TYPE *pxBottomOfStack, unsigned short usStackDepth ) PRIVILEGED_FUNCTION;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* PORTABLE_H */
|
|
||||||
|
|
||||||
@ -1,145 +0,0 @@
|
|||||||
/*
|
|
||||||
FreeRTOS V7.5.3 - Copyright (C) 2013 Real Time Engineers Ltd.
|
|
||||||
All rights reserved
|
|
||||||
|
|
||||||
VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION.
|
|
||||||
|
|
||||||
***************************************************************************
|
|
||||||
* *
|
|
||||||
* FreeRTOS provides completely free yet professionally developed, *
|
|
||||||
* robust, strictly quality controlled, supported, and cross *
|
|
||||||
* platform software that has become a de facto standard. *
|
|
||||||
* *
|
|
||||||
* Help yourself get started quickly and support the FreeRTOS *
|
|
||||||
* project by purchasing a FreeRTOS tutorial book, reference *
|
|
||||||
* manual, or both from: http://www.FreeRTOS.org/Documentation *
|
|
||||||
* *
|
|
||||||
* Thank you! *
|
|
||||||
* *
|
|
||||||
***************************************************************************
|
|
||||||
|
|
||||||
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 from the following
|
|
||||||
link: http://www.freertos.org/a00114.html
|
|
||||||
|
|
||||||
1 tab == 4 spaces!
|
|
||||||
|
|
||||||
***************************************************************************
|
|
||||||
* *
|
|
||||||
* Having a problem? Start by reading the FAQ "My application does *
|
|
||||||
* not run, what could be wrong?" *
|
|
||||||
* *
|
|
||||||
* http://www.FreeRTOS.org/FAQHelp.html *
|
|
||||||
* *
|
|
||||||
***************************************************************************
|
|
||||||
|
|
||||||
http://www.FreeRTOS.org - Documentation, books, training, latest versions,
|
|
||||||
license and Real Time Engineers Ltd. contact details.
|
|
||||||
|
|
||||||
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.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High
|
|
||||||
Integrity Systems to sell under the OpenRTOS brand. Low cost OpenRTOS
|
|
||||||
licenses offer ticketed support, indemnification and 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 PORTMACRO_H
|
|
||||||
#define PORTMACRO_H
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*-----------------------------------------------------------
|
|
||||||
* Port specific definitions.
|
|
||||||
*
|
|
||||||
* The settings in this file configure FreeRTOS correctly for the
|
|
||||||
* given hardware and compiler.
|
|
||||||
*
|
|
||||||
* These settings should not be altered.
|
|
||||||
*-----------------------------------------------------------
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Type definitions. */
|
|
||||||
#define portCHAR char
|
|
||||||
#define portFLOAT float
|
|
||||||
#define portDOUBLE double
|
|
||||||
#define portLONG long
|
|
||||||
#define portSHORT short
|
|
||||||
#define portSTACK_TYPE unsigned portLONG
|
|
||||||
#define portBASE_TYPE long
|
|
||||||
|
|
||||||
#if( configUSE_16_BIT_TICKS == 1 )
|
|
||||||
typedef unsigned portSHORT portTickType;
|
|
||||||
#define portMAX_DELAY ( portTickType ) 0xffff
|
|
||||||
#else
|
|
||||||
typedef unsigned portLONG portTickType;
|
|
||||||
#define portMAX_DELAY ( portTickType ) 0xffffffff
|
|
||||||
#endif
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
/* Architecture specifics. */
|
|
||||||
#define portSTACK_GROWTH ( -1 )
|
|
||||||
#define portTICK_RATE_MS ( ( portTickType ) 1000 / configTICK_RATE_HZ )
|
|
||||||
#define portBYTE_ALIGNMENT 8
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
|
|
||||||
/* Scheduler utilities. */
|
|
||||||
extern void vPortYield( void );
|
|
||||||
#define portNVIC_INT_CTRL_REG ( * ( ( volatile unsigned long * ) 0xe000ed04 ) )
|
|
||||||
#define portNVIC_PENDSVSET_BIT ( 1UL << 28UL )
|
|
||||||
#define portYIELD() vPortYield()
|
|
||||||
#define portEND_SWITCHING_ISR( xSwitchRequired ) if( xSwitchRequired ) portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT
|
|
||||||
#define portYIELD_FROM_ISR( x ) portEND_SWITCHING_ISR( x )
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
|
|
||||||
/* Critical section management. */
|
|
||||||
extern void vPortEnterCritical( void );
|
|
||||||
extern void vPortExitCritical( void );
|
|
||||||
extern unsigned long ulSetInterruptMaskFromISR( void ) __attribute__((naked));
|
|
||||||
extern void vClearInterruptMaskFromISR( unsigned long ulMask ) __attribute__((naked));
|
|
||||||
|
|
||||||
#define portSET_INTERRUPT_MASK_FROM_ISR() ulSetInterruptMaskFromISR()
|
|
||||||
#define portCLEAR_INTERRUPT_MASK_FROM_ISR(x) vClearInterruptMaskFromISR( x )
|
|
||||||
#define portDISABLE_INTERRUPTS() __asm volatile ( " cpsid i " )
|
|
||||||
#define portENABLE_INTERRUPTS() __asm volatile ( " cpsie i " )
|
|
||||||
#define portENTER_CRITICAL() vPortEnterCritical()
|
|
||||||
#define portEXIT_CRITICAL() vPortExitCritical()
|
|
||||||
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
/* Task function macros as described on the FreeRTOS.org WEB site. */
|
|
||||||
#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void *pvParameters )
|
|
||||||
#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void *pvParameters )
|
|
||||||
|
|
||||||
#define portNOP()
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* PORTMACRO_H */
|
|
||||||
|
|
||||||
@ -1,89 +0,0 @@
|
|||||||
/*
|
|
||||||
FreeRTOS V7.5.3 - Copyright (C) 2013 Real Time Engineers Ltd.
|
|
||||||
All rights reserved
|
|
||||||
|
|
||||||
VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION.
|
|
||||||
|
|
||||||
***************************************************************************
|
|
||||||
* *
|
|
||||||
* FreeRTOS provides completely free yet professionally developed, *
|
|
||||||
* robust, strictly quality controlled, supported, and cross *
|
|
||||||
* platform software that has become a de facto standard. *
|
|
||||||
* *
|
|
||||||
* Help yourself get started quickly and support the FreeRTOS *
|
|
||||||
* project by purchasing a FreeRTOS tutorial book, reference *
|
|
||||||
* manual, or both from: http://www.FreeRTOS.org/Documentation *
|
|
||||||
* *
|
|
||||||
* Thank you! *
|
|
||||||
* *
|
|
||||||
***************************************************************************
|
|
||||||
|
|
||||||
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 from the following
|
|
||||||
link: http://www.freertos.org/a00114.html
|
|
||||||
|
|
||||||
1 tab == 4 spaces!
|
|
||||||
|
|
||||||
***************************************************************************
|
|
||||||
* *
|
|
||||||
* Having a problem? Start by reading the FAQ "My application does *
|
|
||||||
* not run, what could be wrong?" *
|
|
||||||
* *
|
|
||||||
* http://www.FreeRTOS.org/FAQHelp.html *
|
|
||||||
* *
|
|
||||||
***************************************************************************
|
|
||||||
|
|
||||||
http://www.FreeRTOS.org - Documentation, books, training, latest versions,
|
|
||||||
license and Real Time Engineers Ltd. contact details.
|
|
||||||
|
|
||||||
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.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High
|
|
||||||
Integrity Systems to sell under the OpenRTOS brand. Low cost OpenRTOS
|
|
||||||
licenses offer ticketed support, indemnification and 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 PROJDEFS_H
|
|
||||||
#define PROJDEFS_H
|
|
||||||
|
|
||||||
/* Defines the prototype to which task functions must conform. */
|
|
||||||
typedef void (*pdTASK_CODE)( void * );
|
|
||||||
|
|
||||||
#define pdFALSE ( ( portBASE_TYPE ) 0 )
|
|
||||||
#define pdTRUE ( ( portBASE_TYPE ) 1 )
|
|
||||||
|
|
||||||
#define pdPASS ( pdTRUE )
|
|
||||||
#define pdFAIL ( pdFALSE )
|
|
||||||
#define errQUEUE_EMPTY ( ( portBASE_TYPE ) 0 )
|
|
||||||
#define errQUEUE_FULL ( ( portBASE_TYPE ) 0 )
|
|
||||||
|
|
||||||
/* Error definitions. */
|
|
||||||
#define errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY ( -1 )
|
|
||||||
#define errNO_TASK_TO_RUN ( -2 )
|
|
||||||
#define errQUEUE_BLOCKED ( -4 )
|
|
||||||
#define errQUEUE_YIELD ( -5 )
|
|
||||||
|
|
||||||
#endif /* PROJDEFS_H */
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
File diff suppressed because it is too large
Load Diff
@ -1,786 +0,0 @@
|
|||||||
/*
|
|
||||||
FreeRTOS V7.5.3 - Copyright (C) 2013 Real Time Engineers Ltd.
|
|
||||||
All rights reserved
|
|
||||||
|
|
||||||
VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION.
|
|
||||||
|
|
||||||
***************************************************************************
|
|
||||||
* *
|
|
||||||
* FreeRTOS provides completely free yet professionally developed, *
|
|
||||||
* robust, strictly quality controlled, supported, and cross *
|
|
||||||
* platform software that has become a de facto standard. *
|
|
||||||
* *
|
|
||||||
* Help yourself get started quickly and support the FreeRTOS *
|
|
||||||
* project by purchasing a FreeRTOS tutorial book, reference *
|
|
||||||
* manual, or both from: http://www.FreeRTOS.org/Documentation *
|
|
||||||
* *
|
|
||||||
* Thank you! *
|
|
||||||
* *
|
|
||||||
***************************************************************************
|
|
||||||
|
|
||||||
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 from the following
|
|
||||||
link: http://www.freertos.org/a00114.html
|
|
||||||
|
|
||||||
1 tab == 4 spaces!
|
|
||||||
|
|
||||||
***************************************************************************
|
|
||||||
* *
|
|
||||||
* Having a problem? Start by reading the FAQ "My application does *
|
|
||||||
* not run, what could be wrong?" *
|
|
||||||
* *
|
|
||||||
* http://www.FreeRTOS.org/FAQHelp.html *
|
|
||||||
* *
|
|
||||||
***************************************************************************
|
|
||||||
|
|
||||||
http://www.FreeRTOS.org - Documentation, books, training, latest versions,
|
|
||||||
license and Real Time Engineers Ltd. contact details.
|
|
||||||
|
|
||||||
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.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High
|
|
||||||
Integrity Systems to sell under the OpenRTOS brand. Low cost OpenRTOS
|
|
||||||
licenses offer ticketed support, indemnification and 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 SEMAPHORE_H
|
|
||||||
#define SEMAPHORE_H
|
|
||||||
|
|
||||||
#ifndef INC_FREERTOS_H
|
|
||||||
#error "include FreeRTOS.h" must appear in source files before "include semphr.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include "queue.h"
|
|
||||||
|
|
||||||
typedef xQueueHandle xSemaphoreHandle;
|
|
||||||
|
|
||||||
#define semBINARY_SEMAPHORE_QUEUE_LENGTH ( ( unsigned char ) 1U )
|
|
||||||
#define semSEMAPHORE_QUEUE_ITEM_LENGTH ( ( unsigned char ) 0U )
|
|
||||||
#define semGIVE_BLOCK_TIME ( ( portTickType ) 0U )
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* semphr. h
|
|
||||||
* <pre>vSemaphoreCreateBinary( xSemaphoreHandle xSemaphore )</pre>
|
|
||||||
*
|
|
||||||
* <i>Macro</i> that implements a semaphore by using the existing queue mechanism.
|
|
||||||
* The queue length is 1 as this is a binary semaphore. The data size is 0
|
|
||||||
* as we don't want to actually store any data - we just want to know if the
|
|
||||||
* queue is empty or full.
|
|
||||||
*
|
|
||||||
* This type of semaphore can be used for pure synchronisation between tasks or
|
|
||||||
* between an interrupt and a task. The semaphore need not be given back once
|
|
||||||
* obtained, so one task/interrupt can continuously 'give' the semaphore while
|
|
||||||
* another continuously 'takes' the semaphore. For this reason this type of
|
|
||||||
* semaphore does not use a priority inheritance mechanism. For an alternative
|
|
||||||
* that does use priority inheritance see xSemaphoreCreateMutex().
|
|
||||||
*
|
|
||||||
* @param xSemaphore Handle to the created semaphore. Should be of type xSemaphoreHandle.
|
|
||||||
*
|
|
||||||
* Example usage:
|
|
||||||
<pre>
|
|
||||||
xSemaphoreHandle xSemaphore;
|
|
||||||
|
|
||||||
void vATask( void * pvParameters )
|
|
||||||
{
|
|
||||||
// Semaphore cannot be used before a call to vSemaphoreCreateBinary ().
|
|
||||||
// This is a macro so pass the variable in directly.
|
|
||||||
vSemaphoreCreateBinary( xSemaphore );
|
|
||||||
|
|
||||||
if( xSemaphore != NULL )
|
|
||||||
{
|
|
||||||
// The semaphore was created successfully.
|
|
||||||
// The semaphore can now be used.
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</pre>
|
|
||||||
* \defgroup vSemaphoreCreateBinary vSemaphoreCreateBinary
|
|
||||||
* \ingroup Semaphores
|
|
||||||
*/
|
|
||||||
#define vSemaphoreCreateBinary( xSemaphore ) \
|
|
||||||
{ \
|
|
||||||
( xSemaphore ) = xQueueGenericCreate( ( unsigned portBASE_TYPE ) 1, semSEMAPHORE_QUEUE_ITEM_LENGTH, queueQUEUE_TYPE_BINARY_SEMAPHORE ); \
|
|
||||||
if( ( xSemaphore ) != NULL ) \
|
|
||||||
{ \
|
|
||||||
( void ) xSemaphoreGive( ( xSemaphore ) ); \
|
|
||||||
} \
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* semphr. h
|
|
||||||
* <pre>xSemaphoreTake(
|
|
||||||
* xSemaphoreHandle xSemaphore,
|
|
||||||
* portTickType xBlockTime
|
|
||||||
* )</pre>
|
|
||||||
*
|
|
||||||
* <i>Macro</i> to obtain a semaphore. The semaphore must have previously been
|
|
||||||
* created with a call to vSemaphoreCreateBinary(), xSemaphoreCreateMutex() or
|
|
||||||
* xSemaphoreCreateCounting().
|
|
||||||
*
|
|
||||||
* @param xSemaphore A handle to the semaphore being taken - obtained when
|
|
||||||
* the semaphore was created.
|
|
||||||
*
|
|
||||||
* @param xBlockTime The time in ticks to wait for the semaphore to become
|
|
||||||
* available. The macro portTICK_RATE_MS can be used to convert this to a
|
|
||||||
* real time. A block time of zero can be used to poll the semaphore. A block
|
|
||||||
* time of portMAX_DELAY can be used to block indefinitely (provided
|
|
||||||
* INCLUDE_vTaskSuspend is set to 1 in FreeRTOSConfig.h).
|
|
||||||
*
|
|
||||||
* @return pdTRUE if the semaphore was obtained. pdFALSE
|
|
||||||
* if xBlockTime expired without the semaphore becoming available.
|
|
||||||
*
|
|
||||||
* Example usage:
|
|
||||||
<pre>
|
|
||||||
xSemaphoreHandle xSemaphore = NULL;
|
|
||||||
|
|
||||||
// A task that creates a semaphore.
|
|
||||||
void vATask( void * pvParameters )
|
|
||||||
{
|
|
||||||
// Create the semaphore to guard a shared resource.
|
|
||||||
vSemaphoreCreateBinary( xSemaphore );
|
|
||||||
}
|
|
||||||
|
|
||||||
// A task that uses the semaphore.
|
|
||||||
void vAnotherTask( void * pvParameters )
|
|
||||||
{
|
|
||||||
// ... Do other things.
|
|
||||||
|
|
||||||
if( xSemaphore != NULL )
|
|
||||||
{
|
|
||||||
// See if we can obtain the semaphore. If the semaphore is not available
|
|
||||||
// wait 10 ticks to see if it becomes free.
|
|
||||||
if( xSemaphoreTake( xSemaphore, ( portTickType ) 10 ) == pdTRUE )
|
|
||||||
{
|
|
||||||
// We were able to obtain the semaphore and can now access the
|
|
||||||
// shared resource.
|
|
||||||
|
|
||||||
// ...
|
|
||||||
|
|
||||||
// We have finished accessing the shared resource. Release the
|
|
||||||
// semaphore.
|
|
||||||
xSemaphoreGive( xSemaphore );
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// We could not obtain the semaphore and can therefore not access
|
|
||||||
// the shared resource safely.
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</pre>
|
|
||||||
* \defgroup xSemaphoreTake xSemaphoreTake
|
|
||||||
* \ingroup Semaphores
|
|
||||||
*/
|
|
||||||
#define xSemaphoreTake( xSemaphore, xBlockTime ) xQueueGenericReceive( ( xQueueHandle ) ( xSemaphore ), NULL, ( xBlockTime ), pdFALSE )
|
|
||||||
|
|
||||||
/**
|
|
||||||
* semphr. h
|
|
||||||
* xSemaphoreTakeRecursive(
|
|
||||||
* xSemaphoreHandle xMutex,
|
|
||||||
* portTickType xBlockTime
|
|
||||||
* )
|
|
||||||
*
|
|
||||||
* <i>Macro</i> to recursively obtain, or 'take', a mutex type semaphore.
|
|
||||||
* The mutex must have previously been created using a call to
|
|
||||||
* xSemaphoreCreateRecursiveMutex();
|
|
||||||
*
|
|
||||||
* configUSE_RECURSIVE_MUTEXES must be set to 1 in FreeRTOSConfig.h for this
|
|
||||||
* macro to be available.
|
|
||||||
*
|
|
||||||
* This macro must not be used on mutexes created using xSemaphoreCreateMutex().
|
|
||||||
*
|
|
||||||
* A mutex used recursively can be 'taken' repeatedly by the owner. The mutex
|
|
||||||
* doesn't become available again until the owner has called
|
|
||||||
* xSemaphoreGiveRecursive() for each successful 'take' request. For example,
|
|
||||||
* if a task successfully 'takes' the same mutex 5 times then the mutex will
|
|
||||||
* not be available to any other task until it has also 'given' the mutex back
|
|
||||||
* exactly five times.
|
|
||||||
*
|
|
||||||
* @param xMutex A handle to the mutex being obtained. This is the
|
|
||||||
* handle returned by xSemaphoreCreateRecursiveMutex();
|
|
||||||
*
|
|
||||||
* @param xBlockTime The time in ticks to wait for the semaphore to become
|
|
||||||
* available. The macro portTICK_RATE_MS can be used to convert this to a
|
|
||||||
* real time. A block time of zero can be used to poll the semaphore. If
|
|
||||||
* the task already owns the semaphore then xSemaphoreTakeRecursive() will
|
|
||||||
* return immediately no matter what the value of xBlockTime.
|
|
||||||
*
|
|
||||||
* @return pdTRUE if the semaphore was obtained. pdFALSE if xBlockTime
|
|
||||||
* expired without the semaphore becoming available.
|
|
||||||
*
|
|
||||||
* Example usage:
|
|
||||||
<pre>
|
|
||||||
xSemaphoreHandle xMutex = NULL;
|
|
||||||
|
|
||||||
// A task that creates a mutex.
|
|
||||||
void vATask( void * pvParameters )
|
|
||||||
{
|
|
||||||
// Create the mutex to guard a shared resource.
|
|
||||||
xMutex = xSemaphoreCreateRecursiveMutex();
|
|
||||||
}
|
|
||||||
|
|
||||||
// A task that uses the mutex.
|
|
||||||
void vAnotherTask( void * pvParameters )
|
|
||||||
{
|
|
||||||
// ... Do other things.
|
|
||||||
|
|
||||||
if( xMutex != NULL )
|
|
||||||
{
|
|
||||||
// See if we can obtain the mutex. If the mutex is not available
|
|
||||||
// wait 10 ticks to see if it becomes free.
|
|
||||||
if( xSemaphoreTakeRecursive( xSemaphore, ( portTickType ) 10 ) == pdTRUE )
|
|
||||||
{
|
|
||||||
// We were able to obtain the mutex and can now access the
|
|
||||||
// shared resource.
|
|
||||||
|
|
||||||
// ...
|
|
||||||
// For some reason due to the nature of the code further calls to
|
|
||||||
// xSemaphoreTakeRecursive() are made on the same mutex. In real
|
|
||||||
// code these would not be just sequential calls as this would make
|
|
||||||
// no sense. Instead the calls are likely to be buried inside
|
|
||||||
// a more complex call structure.
|
|
||||||
xSemaphoreTakeRecursive( xMutex, ( portTickType ) 10 );
|
|
||||||
xSemaphoreTakeRecursive( xMutex, ( portTickType ) 10 );
|
|
||||||
|
|
||||||
// The mutex has now been 'taken' three times, so will not be
|
|
||||||
// available to another task until it has also been given back
|
|
||||||
// three times. Again it is unlikely that real code would have
|
|
||||||
// these calls sequentially, but instead buried in a more complex
|
|
||||||
// call structure. This is just for illustrative purposes.
|
|
||||||
xSemaphoreGiveRecursive( xMutex );
|
|
||||||
xSemaphoreGiveRecursive( xMutex );
|
|
||||||
xSemaphoreGiveRecursive( xMutex );
|
|
||||||
|
|
||||||
// Now the mutex can be taken by other tasks.
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// We could not obtain the mutex and can therefore not access
|
|
||||||
// the shared resource safely.
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</pre>
|
|
||||||
* \defgroup xSemaphoreTakeRecursive xSemaphoreTakeRecursive
|
|
||||||
* \ingroup Semaphores
|
|
||||||
*/
|
|
||||||
#define xSemaphoreTakeRecursive( xMutex, xBlockTime ) xQueueTakeMutexRecursive( ( xMutex ), ( xBlockTime ) )
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* xSemaphoreAltTake() is an alternative version of xSemaphoreTake().
|
|
||||||
*
|
|
||||||
* The source code that implements the alternative (Alt) API is much
|
|
||||||
* simpler because it executes everything from within a critical section.
|
|
||||||
* This is the approach taken by many other RTOSes, but FreeRTOS.org has the
|
|
||||||
* preferred fully featured API too. The fully featured API has more
|
|
||||||
* complex code that takes longer to execute, but makes much less use of
|
|
||||||
* critical sections. Therefore the alternative API sacrifices interrupt
|
|
||||||
* responsiveness to gain execution speed, whereas the fully featured API
|
|
||||||
* sacrifices execution speed to ensure better interrupt responsiveness.
|
|
||||||
*/
|
|
||||||
#define xSemaphoreAltTake( xSemaphore, xBlockTime ) xQueueAltGenericReceive( ( xQueueHandle ) ( xSemaphore ), NULL, ( xBlockTime ), pdFALSE )
|
|
||||||
|
|
||||||
/**
|
|
||||||
* semphr. h
|
|
||||||
* <pre>xSemaphoreGive( xSemaphoreHandle xSemaphore )</pre>
|
|
||||||
*
|
|
||||||
* <i>Macro</i> to release a semaphore. The semaphore must have previously been
|
|
||||||
* created with a call to vSemaphoreCreateBinary(), xSemaphoreCreateMutex() or
|
|
||||||
* xSemaphoreCreateCounting(). and obtained using sSemaphoreTake().
|
|
||||||
*
|
|
||||||
* This macro must not be used from an ISR. See xSemaphoreGiveFromISR () for
|
|
||||||
* an alternative which can be used from an ISR.
|
|
||||||
*
|
|
||||||
* This macro must also not be used on semaphores created using
|
|
||||||
* xSemaphoreCreateRecursiveMutex().
|
|
||||||
*
|
|
||||||
* @param xSemaphore A handle to the semaphore being released. This is the
|
|
||||||
* handle returned when the semaphore was created.
|
|
||||||
*
|
|
||||||
* @return pdTRUE if the semaphore was released. pdFALSE if an error occurred.
|
|
||||||
* Semaphores are implemented using queues. An error can occur if there is
|
|
||||||
* no space on the queue to post a message - indicating that the
|
|
||||||
* semaphore was not first obtained correctly.
|
|
||||||
*
|
|
||||||
* Example usage:
|
|
||||||
<pre>
|
|
||||||
xSemaphoreHandle xSemaphore = NULL;
|
|
||||||
|
|
||||||
void vATask( void * pvParameters )
|
|
||||||
{
|
|
||||||
// Create the semaphore to guard a shared resource.
|
|
||||||
vSemaphoreCreateBinary( xSemaphore );
|
|
||||||
|
|
||||||
if( xSemaphore != NULL )
|
|
||||||
{
|
|
||||||
if( xSemaphoreGive( xSemaphore ) != pdTRUE )
|
|
||||||
{
|
|
||||||
// We would expect this call to fail because we cannot give
|
|
||||||
// a semaphore without first "taking" it!
|
|
||||||
}
|
|
||||||
|
|
||||||
// Obtain the semaphore - don't block if the semaphore is not
|
|
||||||
// immediately available.
|
|
||||||
if( xSemaphoreTake( xSemaphore, ( portTickType ) 0 ) )
|
|
||||||
{
|
|
||||||
// We now have the semaphore and can access the shared resource.
|
|
||||||
|
|
||||||
// ...
|
|
||||||
|
|
||||||
// We have finished accessing the shared resource so can free the
|
|
||||||
// semaphore.
|
|
||||||
if( xSemaphoreGive( xSemaphore ) != pdTRUE )
|
|
||||||
{
|
|
||||||
// We would not expect this call to fail because we must have
|
|
||||||
// obtained the semaphore to get here.
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</pre>
|
|
||||||
* \defgroup xSemaphoreGive xSemaphoreGive
|
|
||||||
* \ingroup Semaphores
|
|
||||||
*/
|
|
||||||
#define xSemaphoreGive( xSemaphore ) xQueueGenericSend( ( xQueueHandle ) ( xSemaphore ), NULL, semGIVE_BLOCK_TIME, queueSEND_TO_BACK )
|
|
||||||
|
|
||||||
/**
|
|
||||||
* semphr. h
|
|
||||||
* <pre>xSemaphoreGiveRecursive( xSemaphoreHandle xMutex )</pre>
|
|
||||||
*
|
|
||||||
* <i>Macro</i> to recursively release, or 'give', a mutex type semaphore.
|
|
||||||
* The mutex must have previously been created using a call to
|
|
||||||
* xSemaphoreCreateRecursiveMutex();
|
|
||||||
*
|
|
||||||
* configUSE_RECURSIVE_MUTEXES must be set to 1 in FreeRTOSConfig.h for this
|
|
||||||
* macro to be available.
|
|
||||||
*
|
|
||||||
* This macro must not be used on mutexes created using xSemaphoreCreateMutex().
|
|
||||||
*
|
|
||||||
* A mutex used recursively can be 'taken' repeatedly by the owner. The mutex
|
|
||||||
* doesn't become available again until the owner has called
|
|
||||||
* xSemaphoreGiveRecursive() for each successful 'take' request. For example,
|
|
||||||
* if a task successfully 'takes' the same mutex 5 times then the mutex will
|
|
||||||
* not be available to any other task until it has also 'given' the mutex back
|
|
||||||
* exactly five times.
|
|
||||||
*
|
|
||||||
* @param xMutex A handle to the mutex being released, or 'given'. This is the
|
|
||||||
* handle returned by xSemaphoreCreateMutex();
|
|
||||||
*
|
|
||||||
* @return pdTRUE if the semaphore was given.
|
|
||||||
*
|
|
||||||
* Example usage:
|
|
||||||
<pre>
|
|
||||||
xSemaphoreHandle xMutex = NULL;
|
|
||||||
|
|
||||||
// A task that creates a mutex.
|
|
||||||
void vATask( void * pvParameters )
|
|
||||||
{
|
|
||||||
// Create the mutex to guard a shared resource.
|
|
||||||
xMutex = xSemaphoreCreateRecursiveMutex();
|
|
||||||
}
|
|
||||||
|
|
||||||
// A task that uses the mutex.
|
|
||||||
void vAnotherTask( void * pvParameters )
|
|
||||||
{
|
|
||||||
// ... Do other things.
|
|
||||||
|
|
||||||
if( xMutex != NULL )
|
|
||||||
{
|
|
||||||
// See if we can obtain the mutex. If the mutex is not available
|
|
||||||
// wait 10 ticks to see if it becomes free.
|
|
||||||
if( xSemaphoreTakeRecursive( xMutex, ( portTickType ) 10 ) == pdTRUE )
|
|
||||||
{
|
|
||||||
// We were able to obtain the mutex and can now access the
|
|
||||||
// shared resource.
|
|
||||||
|
|
||||||
// ...
|
|
||||||
// For some reason due to the nature of the code further calls to
|
|
||||||
// xSemaphoreTakeRecursive() are made on the same mutex. In real
|
|
||||||
// code these would not be just sequential calls as this would make
|
|
||||||
// no sense. Instead the calls are likely to be buried inside
|
|
||||||
// a more complex call structure.
|
|
||||||
xSemaphoreTakeRecursive( xMutex, ( portTickType ) 10 );
|
|
||||||
xSemaphoreTakeRecursive( xMutex, ( portTickType ) 10 );
|
|
||||||
|
|
||||||
// The mutex has now been 'taken' three times, so will not be
|
|
||||||
// available to another task until it has also been given back
|
|
||||||
// three times. Again it is unlikely that real code would have
|
|
||||||
// these calls sequentially, it would be more likely that the calls
|
|
||||||
// to xSemaphoreGiveRecursive() would be called as a call stack
|
|
||||||
// unwound. This is just for demonstrative purposes.
|
|
||||||
xSemaphoreGiveRecursive( xMutex );
|
|
||||||
xSemaphoreGiveRecursive( xMutex );
|
|
||||||
xSemaphoreGiveRecursive( xMutex );
|
|
||||||
|
|
||||||
// Now the mutex can be taken by other tasks.
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// We could not obtain the mutex and can therefore not access
|
|
||||||
// the shared resource safely.
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</pre>
|
|
||||||
* \defgroup xSemaphoreGiveRecursive xSemaphoreGiveRecursive
|
|
||||||
* \ingroup Semaphores
|
|
||||||
*/
|
|
||||||
#define xSemaphoreGiveRecursive( xMutex ) xQueueGiveMutexRecursive( ( xMutex ) )
|
|
||||||
|
|
||||||
/*
|
|
||||||
* xSemaphoreAltGive() is an alternative version of xSemaphoreGive().
|
|
||||||
*
|
|
||||||
* The source code that implements the alternative (Alt) API is much
|
|
||||||
* simpler because it executes everything from within a critical section.
|
|
||||||
* This is the approach taken by many other RTOSes, but FreeRTOS.org has the
|
|
||||||
* preferred fully featured API too. The fully featured API has more
|
|
||||||
* complex code that takes longer to execute, but makes much less use of
|
|
||||||
* critical sections. Therefore the alternative API sacrifices interrupt
|
|
||||||
* responsiveness to gain execution speed, whereas the fully featured API
|
|
||||||
* sacrifices execution speed to ensure better interrupt responsiveness.
|
|
||||||
*/
|
|
||||||
#define xSemaphoreAltGive( xSemaphore ) xQueueAltGenericSend( ( xQueueHandle ) ( xSemaphore ), NULL, semGIVE_BLOCK_TIME, queueSEND_TO_BACK )
|
|
||||||
|
|
||||||
/**
|
|
||||||
* semphr. h
|
|
||||||
* <pre>
|
|
||||||
xSemaphoreGiveFromISR(
|
|
||||||
xSemaphoreHandle xSemaphore,
|
|
||||||
signed portBASE_TYPE *pxHigherPriorityTaskWoken
|
|
||||||
)</pre>
|
|
||||||
*
|
|
||||||
* <i>Macro</i> to release a semaphore. The semaphore must have previously been
|
|
||||||
* created with a call to vSemaphoreCreateBinary() or xSemaphoreCreateCounting().
|
|
||||||
*
|
|
||||||
* Mutex type semaphores (those created using a call to xSemaphoreCreateMutex())
|
|
||||||
* must not be used with this macro.
|
|
||||||
*
|
|
||||||
* This macro can be used from an ISR.
|
|
||||||
*
|
|
||||||
* @param xSemaphore A handle to the semaphore being released. This is the
|
|
||||||
* handle returned when the semaphore was created.
|
|
||||||
*
|
|
||||||
* @param pxHigherPriorityTaskWoken xSemaphoreGiveFromISR() will set
|
|
||||||
* *pxHigherPriorityTaskWoken to pdTRUE if giving the semaphore caused a task
|
|
||||||
* to unblock, and the unblocked task has a priority higher than the currently
|
|
||||||
* running task. If xSemaphoreGiveFromISR() sets this value to pdTRUE then
|
|
||||||
* a context switch should be requested before the interrupt is exited.
|
|
||||||
*
|
|
||||||
* @return pdTRUE if the semaphore was successfully given, otherwise errQUEUE_FULL.
|
|
||||||
*
|
|
||||||
* Example usage:
|
|
||||||
<pre>
|
|
||||||
\#define LONG_TIME 0xffff
|
|
||||||
\#define TICKS_TO_WAIT 10
|
|
||||||
xSemaphoreHandle xSemaphore = NULL;
|
|
||||||
|
|
||||||
// Repetitive task.
|
|
||||||
void vATask( void * pvParameters )
|
|
||||||
{
|
|
||||||
for( ;; )
|
|
||||||
{
|
|
||||||
// We want this task to run every 10 ticks of a timer. The semaphore
|
|
||||||
// was created before this task was started.
|
|
||||||
|
|
||||||
// Block waiting for the semaphore to become available.
|
|
||||||
if( xSemaphoreTake( xSemaphore, LONG_TIME ) == pdTRUE )
|
|
||||||
{
|
|
||||||
// It is time to execute.
|
|
||||||
|
|
||||||
// ...
|
|
||||||
|
|
||||||
// We have finished our task. Return to the top of the loop where
|
|
||||||
// we will block on the semaphore until it is time to execute
|
|
||||||
// again. Note when using the semaphore for synchronisation with an
|
|
||||||
// ISR in this manner there is no need to 'give' the semaphore back.
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Timer ISR
|
|
||||||
void vTimerISR( void * pvParameters )
|
|
||||||
{
|
|
||||||
static unsigned char ucLocalTickCount = 0;
|
|
||||||
static signed portBASE_TYPE xHigherPriorityTaskWoken;
|
|
||||||
|
|
||||||
// A timer tick has occurred.
|
|
||||||
|
|
||||||
// ... Do other time functions.
|
|
||||||
|
|
||||||
// Is it time for vATask () to run?
|
|
||||||
xHigherPriorityTaskWoken = pdFALSE;
|
|
||||||
ucLocalTickCount++;
|
|
||||||
if( ucLocalTickCount >= TICKS_TO_WAIT )
|
|
||||||
{
|
|
||||||
// Unblock the task by releasing the semaphore.
|
|
||||||
xSemaphoreGiveFromISR( xSemaphore, &xHigherPriorityTaskWoken );
|
|
||||||
|
|
||||||
// Reset the count so we release the semaphore again in 10 ticks time.
|
|
||||||
ucLocalTickCount = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if( xHigherPriorityTaskWoken != pdFALSE )
|
|
||||||
{
|
|
||||||
// We can force a context switch here. Context switching from an
|
|
||||||
// ISR uses port specific syntax. Check the demo task for your port
|
|
||||||
// to find the syntax required.
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</pre>
|
|
||||||
* \defgroup xSemaphoreGiveFromISR xSemaphoreGiveFromISR
|
|
||||||
* \ingroup Semaphores
|
|
||||||
*/
|
|
||||||
#define xSemaphoreGiveFromISR( xSemaphore, pxHigherPriorityTaskWoken ) xQueueGenericSendFromISR( ( xQueueHandle ) ( xSemaphore ), NULL, ( pxHigherPriorityTaskWoken ), queueSEND_TO_BACK )
|
|
||||||
|
|
||||||
/**
|
|
||||||
* semphr. h
|
|
||||||
* <pre>
|
|
||||||
xSemaphoreTakeFromISR(
|
|
||||||
xSemaphoreHandle xSemaphore,
|
|
||||||
signed portBASE_TYPE *pxHigherPriorityTaskWoken
|
|
||||||
)</pre>
|
|
||||||
*
|
|
||||||
* <i>Macro</i> to take a semaphore from an ISR. The semaphore must have
|
|
||||||
* previously been created with a call to vSemaphoreCreateBinary() or
|
|
||||||
* xSemaphoreCreateCounting().
|
|
||||||
*
|
|
||||||
* Mutex type semaphores (those created using a call to xSemaphoreCreateMutex())
|
|
||||||
* must not be used with this macro.
|
|
||||||
*
|
|
||||||
* This macro can be used from an ISR, however taking a semaphore from an ISR
|
|
||||||
* is not a common operation. It is likely to only be useful when taking a
|
|
||||||
* counting semaphore when an interrupt is obtaining an object from a resource
|
|
||||||
* pool (when the semaphore count indicates the number of resources available).
|
|
||||||
*
|
|
||||||
* @param xSemaphore A handle to the semaphore being taken. This is the
|
|
||||||
* handle returned when the semaphore was created.
|
|
||||||
*
|
|
||||||
* @param pxHigherPriorityTaskWoken xSemaphoreTakeFromISR() will set
|
|
||||||
* *pxHigherPriorityTaskWoken to pdTRUE if taking the semaphore caused a task
|
|
||||||
* to unblock, and the unblocked task has a priority higher than the currently
|
|
||||||
* running task. If xSemaphoreTakeFromISR() sets this value to pdTRUE then
|
|
||||||
* a context switch should be requested before the interrupt is exited.
|
|
||||||
*
|
|
||||||
* @return pdTRUE if the semaphore was successfully taken, otherwise
|
|
||||||
* pdFALSE
|
|
||||||
*/
|
|
||||||
#define xSemaphoreTakeFromISR( xSemaphore, pxHigherPriorityTaskWoken ) xQueueReceiveFromISR( ( xQueueHandle ) ( xSemaphore ), NULL, ( pxHigherPriorityTaskWoken ) )
|
|
||||||
|
|
||||||
/**
|
|
||||||
* semphr. h
|
|
||||||
* <pre>xSemaphoreHandle xSemaphoreCreateMutex( void )</pre>
|
|
||||||
*
|
|
||||||
* <i>Macro</i> that implements a mutex semaphore by using the existing queue
|
|
||||||
* mechanism.
|
|
||||||
*
|
|
||||||
* Mutexes created using this macro can be accessed using the xSemaphoreTake()
|
|
||||||
* and xSemaphoreGive() macros. The xSemaphoreTakeRecursive() and
|
|
||||||
* xSemaphoreGiveRecursive() macros should not be used.
|
|
||||||
*
|
|
||||||
* This type of semaphore uses a priority inheritance mechanism so a task
|
|
||||||
* 'taking' a semaphore MUST ALWAYS 'give' the semaphore back once the
|
|
||||||
* semaphore it is no longer required.
|
|
||||||
*
|
|
||||||
* Mutex type semaphores cannot be used from within interrupt service routines.
|
|
||||||
*
|
|
||||||
* See vSemaphoreCreateBinary() for an alternative implementation that can be
|
|
||||||
* used for pure synchronisation (where one task or interrupt always 'gives' the
|
|
||||||
* semaphore and another always 'takes' the semaphore) and from within interrupt
|
|
||||||
* service routines.
|
|
||||||
*
|
|
||||||
* @return xSemaphore Handle to the created mutex semaphore. Should be of type
|
|
||||||
* xSemaphoreHandle.
|
|
||||||
*
|
|
||||||
* Example usage:
|
|
||||||
<pre>
|
|
||||||
xSemaphoreHandle xSemaphore;
|
|
||||||
|
|
||||||
void vATask( void * pvParameters )
|
|
||||||
{
|
|
||||||
// Semaphore cannot be used before a call to xSemaphoreCreateMutex().
|
|
||||||
// This is a macro so pass the variable in directly.
|
|
||||||
xSemaphore = xSemaphoreCreateMutex();
|
|
||||||
|
|
||||||
if( xSemaphore != NULL )
|
|
||||||
{
|
|
||||||
// The semaphore was created successfully.
|
|
||||||
// The semaphore can now be used.
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</pre>
|
|
||||||
* \defgroup vSemaphoreCreateMutex vSemaphoreCreateMutex
|
|
||||||
* \ingroup Semaphores
|
|
||||||
*/
|
|
||||||
#define xSemaphoreCreateMutex() xQueueCreateMutex( queueQUEUE_TYPE_MUTEX )
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* semphr. h
|
|
||||||
* <pre>xSemaphoreHandle xSemaphoreCreateRecursiveMutex( void )</pre>
|
|
||||||
*
|
|
||||||
* <i>Macro</i> that implements a recursive mutex by using the existing queue
|
|
||||||
* mechanism.
|
|
||||||
*
|
|
||||||
* Mutexes created using this macro can be accessed using the
|
|
||||||
* xSemaphoreTakeRecursive() and xSemaphoreGiveRecursive() macros. The
|
|
||||||
* xSemaphoreTake() and xSemaphoreGive() macros should not be used.
|
|
||||||
*
|
|
||||||
* A mutex used recursively can be 'taken' repeatedly by the owner. The mutex
|
|
||||||
* doesn't become available again until the owner has called
|
|
||||||
* xSemaphoreGiveRecursive() for each successful 'take' request. For example,
|
|
||||||
* if a task successfully 'takes' the same mutex 5 times then the mutex will
|
|
||||||
* not be available to any other task until it has also 'given' the mutex back
|
|
||||||
* exactly five times.
|
|
||||||
*
|
|
||||||
* This type of semaphore uses a priority inheritance mechanism so a task
|
|
||||||
* 'taking' a semaphore MUST ALWAYS 'give' the semaphore back once the
|
|
||||||
* semaphore it is no longer required.
|
|
||||||
*
|
|
||||||
* Mutex type semaphores cannot be used from within interrupt service routines.
|
|
||||||
*
|
|
||||||
* See vSemaphoreCreateBinary() for an alternative implementation that can be
|
|
||||||
* used for pure synchronisation (where one task or interrupt always 'gives' the
|
|
||||||
* semaphore and another always 'takes' the semaphore) and from within interrupt
|
|
||||||
* service routines.
|
|
||||||
*
|
|
||||||
* @return xSemaphore Handle to the created mutex semaphore. Should be of type
|
|
||||||
* xSemaphoreHandle.
|
|
||||||
*
|
|
||||||
* Example usage:
|
|
||||||
<pre>
|
|
||||||
xSemaphoreHandle xSemaphore;
|
|
||||||
|
|
||||||
void vATask( void * pvParameters )
|
|
||||||
{
|
|
||||||
// Semaphore cannot be used before a call to xSemaphoreCreateMutex().
|
|
||||||
// This is a macro so pass the variable in directly.
|
|
||||||
xSemaphore = xSemaphoreCreateRecursiveMutex();
|
|
||||||
|
|
||||||
if( xSemaphore != NULL )
|
|
||||||
{
|
|
||||||
// The semaphore was created successfully.
|
|
||||||
// The semaphore can now be used.
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</pre>
|
|
||||||
* \defgroup vSemaphoreCreateMutex vSemaphoreCreateMutex
|
|
||||||
* \ingroup Semaphores
|
|
||||||
*/
|
|
||||||
#define xSemaphoreCreateRecursiveMutex() xQueueCreateMutex( queueQUEUE_TYPE_RECURSIVE_MUTEX )
|
|
||||||
|
|
||||||
/**
|
|
||||||
* semphr. h
|
|
||||||
* <pre>xSemaphoreHandle xSemaphoreCreateCounting( unsigned portBASE_TYPE uxMaxCount, unsigned portBASE_TYPE uxInitialCount )</pre>
|
|
||||||
*
|
|
||||||
* <i>Macro</i> that creates a counting semaphore by using the existing
|
|
||||||
* queue mechanism.
|
|
||||||
*
|
|
||||||
* Counting semaphores are typically used for two things:
|
|
||||||
*
|
|
||||||
* 1) Counting events.
|
|
||||||
*
|
|
||||||
* In this usage scenario an event handler will 'give' a semaphore each time
|
|
||||||
* an event occurs (incrementing the semaphore count value), and a handler
|
|
||||||
* task will 'take' a semaphore each time it processes an event
|
|
||||||
* (decrementing the semaphore count value). The count value is therefore
|
|
||||||
* the difference between the number of events that have occurred and the
|
|
||||||
* number that have been processed. In this case it is desirable for the
|
|
||||||
* initial count value to be zero.
|
|
||||||
*
|
|
||||||
* 2) Resource management.
|
|
||||||
*
|
|
||||||
* In this usage scenario the count value indicates the number of resources
|
|
||||||
* available. To obtain control of a resource a task must first obtain a
|
|
||||||
* semaphore - decrementing the semaphore count value. When the count value
|
|
||||||
* reaches zero there are no free resources. When a task finishes with the
|
|
||||||
* resource it 'gives' the semaphore back - incrementing the semaphore count
|
|
||||||
* value. In this case it is desirable for the initial count value to be
|
|
||||||
* equal to the maximum count value, indicating that all resources are free.
|
|
||||||
*
|
|
||||||
* @param uxMaxCount The maximum count value that can be reached. When the
|
|
||||||
* semaphore reaches this value it can no longer be 'given'.
|
|
||||||
*
|
|
||||||
* @param uxInitialCount The count value assigned to the semaphore when it is
|
|
||||||
* created.
|
|
||||||
*
|
|
||||||
* @return Handle to the created semaphore. Null if the semaphore could not be
|
|
||||||
* created.
|
|
||||||
*
|
|
||||||
* Example usage:
|
|
||||||
<pre>
|
|
||||||
xSemaphoreHandle xSemaphore;
|
|
||||||
|
|
||||||
void vATask( void * pvParameters )
|
|
||||||
{
|
|
||||||
xSemaphoreHandle xSemaphore = NULL;
|
|
||||||
|
|
||||||
// Semaphore cannot be used before a call to xSemaphoreCreateCounting().
|
|
||||||
// The max value to which the semaphore can count should be 10, and the
|
|
||||||
// initial value assigned to the count should be 0.
|
|
||||||
xSemaphore = xSemaphoreCreateCounting( 10, 0 );
|
|
||||||
|
|
||||||
if( xSemaphore != NULL )
|
|
||||||
{
|
|
||||||
// The semaphore was created successfully.
|
|
||||||
// The semaphore can now be used.
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</pre>
|
|
||||||
* \defgroup xSemaphoreCreateCounting xSemaphoreCreateCounting
|
|
||||||
* \ingroup Semaphores
|
|
||||||
*/
|
|
||||||
#define xSemaphoreCreateCounting( uxMaxCount, uxInitialCount ) xQueueCreateCountingSemaphore( ( uxMaxCount ), ( uxInitialCount ) )
|
|
||||||
|
|
||||||
/**
|
|
||||||
* semphr. h
|
|
||||||
* <pre>void vSemaphoreDelete( xSemaphoreHandle xSemaphore );</pre>
|
|
||||||
*
|
|
||||||
* Delete a semaphore. This function must be used with care. For example,
|
|
||||||
* do not delete a mutex type semaphore if the mutex is held by a task.
|
|
||||||
*
|
|
||||||
* @param xSemaphore A handle to the semaphore to be deleted.
|
|
||||||
*
|
|
||||||
* \defgroup vSemaphoreDelete vSemaphoreDelete
|
|
||||||
* \ingroup Semaphores
|
|
||||||
*/
|
|
||||||
#define vSemaphoreDelete( xSemaphore ) vQueueDelete( ( xQueueHandle ) ( xSemaphore ) )
|
|
||||||
|
|
||||||
/**
|
|
||||||
* semphr.h
|
|
||||||
* <pre>xTaskHandle xSemaphoreGetMutexHolder( xSemaphoreHandle xMutex );</pre>
|
|
||||||
*
|
|
||||||
* If xMutex is indeed a mutex type semaphore, return the current mutex holder.
|
|
||||||
* If xMutex is not a mutex type semaphore, or the mutex is available (not held
|
|
||||||
* by a task), return NULL.
|
|
||||||
*
|
|
||||||
* Note: This Is is a good way of determining if the calling task is the mutex
|
|
||||||
* holder, but not a good way of determining the identity of the mutex holder as
|
|
||||||
* the holder may change between the function exiting and the returned value
|
|
||||||
* being tested.
|
|
||||||
*/
|
|
||||||
#define xSemaphoreGetMutexHolder( xSemaphore ) xQueueGetMutexHolder( ( xSemaphore ) )
|
|
||||||
|
|
||||||
#endif /* SEMAPHORE_H */
|
|
||||||
|
|
||||||
|
|
||||||
File diff suppressed because it is too large
Load Diff
@ -1,960 +0,0 @@
|
|||||||
/*
|
|
||||||
FreeRTOS V7.5.3 - Copyright (C) 2013 Real Time Engineers Ltd.
|
|
||||||
All rights reserved
|
|
||||||
|
|
||||||
VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION.
|
|
||||||
|
|
||||||
***************************************************************************
|
|
||||||
* *
|
|
||||||
* FreeRTOS provides completely free yet professionally developed, *
|
|
||||||
* robust, strictly quality controlled, supported, and cross *
|
|
||||||
* platform software that has become a de facto standard. *
|
|
||||||
* *
|
|
||||||
* Help yourself get started quickly and support the FreeRTOS *
|
|
||||||
* project by purchasing a FreeRTOS tutorial book, reference *
|
|
||||||
* manual, or both from: http://www.FreeRTOS.org/Documentation *
|
|
||||||
* *
|
|
||||||
* Thank you! *
|
|
||||||
* *
|
|
||||||
***************************************************************************
|
|
||||||
|
|
||||||
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 from the following
|
|
||||||
link: http://www.freertos.org/a00114.html
|
|
||||||
|
|
||||||
1 tab == 4 spaces!
|
|
||||||
|
|
||||||
***************************************************************************
|
|
||||||
* *
|
|
||||||
* Having a problem? Start by reading the FAQ "My application does *
|
|
||||||
* not run, what could be wrong?" *
|
|
||||||
* *
|
|
||||||
* http://www.FreeRTOS.org/FAQHelp.html *
|
|
||||||
* *
|
|
||||||
***************************************************************************
|
|
||||||
|
|
||||||
http://www.FreeRTOS.org - Documentation, books, training, latest versions,
|
|
||||||
license and Real Time Engineers Ltd. contact details.
|
|
||||||
|
|
||||||
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.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High
|
|
||||||
Integrity Systems to sell under the OpenRTOS brand. Low cost OpenRTOS
|
|
||||||
licenses offer ticketed support, indemnification and 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 TIMERS_H
|
|
||||||
#define TIMERS_H
|
|
||||||
|
|
||||||
#ifndef INC_FREERTOS_H
|
|
||||||
#error "include FreeRTOS.h must appear in source files before include timers.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*lint -e537 This headers are only multiply included if the application code
|
|
||||||
happens to also be including task.h. */
|
|
||||||
#include "task.h"
|
|
||||||
/*lint +e956 */
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* IDs for commands that can be sent/received on the timer queue. These are to
|
|
||||||
be used solely through the macros that make up the public software timer API,
|
|
||||||
as defined below. */
|
|
||||||
#define tmrCOMMAND_START ( ( portBASE_TYPE ) 0 )
|
|
||||||
#define tmrCOMMAND_STOP ( ( portBASE_TYPE ) 1 )
|
|
||||||
#define tmrCOMMAND_CHANGE_PERIOD ( ( portBASE_TYPE ) 2 )
|
|
||||||
#define tmrCOMMAND_DELETE ( ( portBASE_TYPE ) 3 )
|
|
||||||
|
|
||||||
/*-----------------------------------------------------------
|
|
||||||
* MACROS AND DEFINITIONS
|
|
||||||
*----------------------------------------------------------*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Type by which software timers are referenced. For example, a call to
|
|
||||||
* xTimerCreate() returns an xTimerHandle variable that can then be used to
|
|
||||||
* reference the subject timer in calls to other software timer API functions
|
|
||||||
* (for example, xTimerStart(), xTimerReset(), etc.).
|
|
||||||
*/
|
|
||||||
typedef void * xTimerHandle;
|
|
||||||
|
|
||||||
/* Define the prototype to which timer callback functions must conform. */
|
|
||||||
typedef void (*tmrTIMER_CALLBACK)( xTimerHandle xTimer );
|
|
||||||
|
|
||||||
/**
|
|
||||||
* xTimerHandle xTimerCreate( const signed char *pcTimerName,
|
|
||||||
* portTickType xTimerPeriodInTicks,
|
|
||||||
* unsigned portBASE_TYPE uxAutoReload,
|
|
||||||
* void * pvTimerID,
|
|
||||||
* tmrTIMER_CALLBACK pxCallbackFunction );
|
|
||||||
*
|
|
||||||
* Creates a new software timer instance. This allocates the storage required
|
|
||||||
* by the new timer, initialises the new timers internal state, and returns a
|
|
||||||
* handle by which the new timer can be referenced.
|
|
||||||
*
|
|
||||||
* Timers are created in the dormant state. The xTimerStart(), xTimerReset(),
|
|
||||||
* xTimerStartFromISR(), xTimerResetFromISR(), xTimerChangePeriod() and
|
|
||||||
* xTimerChangePeriodFromISR() API functions can all be used to transition a timer into the
|
|
||||||
* active state.
|
|
||||||
*
|
|
||||||
* @param pcTimerName A text name that is assigned to the timer. This is done
|
|
||||||
* purely to assist debugging. The kernel itself only ever references a timer by
|
|
||||||
* its handle, and never by its name.
|
|
||||||
*
|
|
||||||
* @param xTimerPeriodInTicks The timer period. The time is defined in tick periods so
|
|
||||||
* the constant portTICK_RATE_MS can be used to convert a time that has been
|
|
||||||
* specified in milliseconds. For example, if the timer must expire after 100
|
|
||||||
* ticks, then xTimerPeriodInTicks should be set to 100. Alternatively, if the timer
|
|
||||||
* must expire after 500ms, then xPeriod can be set to ( 500 / portTICK_RATE_MS )
|
|
||||||
* provided configTICK_RATE_HZ is less than or equal to 1000.
|
|
||||||
*
|
|
||||||
* @param uxAutoReload If uxAutoReload is set to pdTRUE then the timer will
|
|
||||||
* expire repeatedly with a frequency set by the xTimerPeriodInTicks parameter. If
|
|
||||||
* uxAutoReload is set to pdFALSE then the timer will be a one-shot timer and
|
|
||||||
* enter the dormant state after it expires.
|
|
||||||
*
|
|
||||||
* @param pvTimerID An identifier that is assigned to the timer being created.
|
|
||||||
* Typically this would be used in the timer callback function to identify which
|
|
||||||
* timer expired when the same callback function is assigned to more than one
|
|
||||||
* timer.
|
|
||||||
*
|
|
||||||
* @param pxCallbackFunction The function to call when the timer expires.
|
|
||||||
* Callback functions must have the prototype defined by tmrTIMER_CALLBACK,
|
|
||||||
* which is "void vCallbackFunction( xTimerHandle xTimer );".
|
|
||||||
*
|
|
||||||
* @return If the timer is successfully create then a handle to the newly
|
|
||||||
* created timer is returned. If the timer cannot be created (because either
|
|
||||||
* there is insufficient FreeRTOS heap remaining to allocate the timer
|
|
||||||
* structures, or the timer period was set to 0) then 0 is returned.
|
|
||||||
*
|
|
||||||
* Example usage:
|
|
||||||
* @verbatim
|
|
||||||
* #define NUM_TIMERS 5
|
|
||||||
*
|
|
||||||
* // An array to hold handles to the created timers.
|
|
||||||
* xTimerHandle xTimers[ NUM_TIMERS ];
|
|
||||||
*
|
|
||||||
* // An array to hold a count of the number of times each timer expires.
|
|
||||||
* long lExpireCounters[ NUM_TIMERS ] = { 0 };
|
|
||||||
*
|
|
||||||
* // Define a callback function that will be used by multiple timer instances.
|
|
||||||
* // The callback function does nothing but count the number of times the
|
|
||||||
* // associated timer expires, and stop the timer once the timer has expired
|
|
||||||
* // 10 times.
|
|
||||||
* void vTimerCallback( xTimerHandle pxTimer )
|
|
||||||
* {
|
|
||||||
* long lArrayIndex;
|
|
||||||
* const long xMaxExpiryCountBeforeStopping = 10;
|
|
||||||
*
|
|
||||||
* // Optionally do something if the pxTimer parameter is NULL.
|
|
||||||
* configASSERT( pxTimer );
|
|
||||||
*
|
|
||||||
* // Which timer expired?
|
|
||||||
* lArrayIndex = ( long ) pvTimerGetTimerID( pxTimer );
|
|
||||||
*
|
|
||||||
* // Increment the number of times that pxTimer has expired.
|
|
||||||
* lExpireCounters[ lArrayIndex ] += 1;
|
|
||||||
*
|
|
||||||
* // If the timer has expired 10 times then stop it from running.
|
|
||||||
* if( lExpireCounters[ lArrayIndex ] == xMaxExpiryCountBeforeStopping )
|
|
||||||
* {
|
|
||||||
* // Do not use a block time if calling a timer API function from a
|
|
||||||
* // timer callback function, as doing so could cause a deadlock!
|
|
||||||
* xTimerStop( pxTimer, 0 );
|
|
||||||
* }
|
|
||||||
* }
|
|
||||||
*
|
|
||||||
* void main( void )
|
|
||||||
* {
|
|
||||||
* long x;
|
|
||||||
*
|
|
||||||
* // Create then start some timers. Starting the timers before the scheduler
|
|
||||||
* // has been started means the timers will start running immediately that
|
|
||||||
* // the scheduler starts.
|
|
||||||
* for( x = 0; x < NUM_TIMERS; x++ )
|
|
||||||
* {
|
|
||||||
* xTimers[ x ] = xTimerCreate( "Timer", // Just a text name, not used by the kernel.
|
|
||||||
* ( 100 * x ), // The timer period in ticks.
|
|
||||||
* pdTRUE, // The timers will auto-reload themselves when they expire.
|
|
||||||
* ( void * ) x, // Assign each timer a unique id equal to its array index.
|
|
||||||
* vTimerCallback // Each timer calls the same callback when it expires.
|
|
||||||
* );
|
|
||||||
*
|
|
||||||
* if( xTimers[ x ] == NULL )
|
|
||||||
* {
|
|
||||||
* // The timer was not created.
|
|
||||||
* }
|
|
||||||
* else
|
|
||||||
* {
|
|
||||||
* // Start the timer. No block time is specified, and even if one was
|
|
||||||
* // it would be ignored because the scheduler has not yet been
|
|
||||||
* // started.
|
|
||||||
* if( xTimerStart( xTimers[ x ], 0 ) != pdPASS )
|
|
||||||
* {
|
|
||||||
* // The timer could not be set into the Active state.
|
|
||||||
* }
|
|
||||||
* }
|
|
||||||
* }
|
|
||||||
*
|
|
||||||
* // ...
|
|
||||||
* // Create tasks here.
|
|
||||||
* // ...
|
|
||||||
*
|
|
||||||
* // Starting the scheduler will start the timers running as they have already
|
|
||||||
* // been set into the active state.
|
|
||||||
* xTaskStartScheduler();
|
|
||||||
*
|
|
||||||
* // Should not reach here.
|
|
||||||
* for( ;; );
|
|
||||||
* }
|
|
||||||
* @endverbatim
|
|
||||||
*/
|
|
||||||
xTimerHandle xTimerCreate( const signed char * const pcTimerName, portTickType xTimerPeriodInTicks, unsigned portBASE_TYPE uxAutoReload, void * pvTimerID, tmrTIMER_CALLBACK pxCallbackFunction ) PRIVILEGED_FUNCTION;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* void *pvTimerGetTimerID( xTimerHandle xTimer );
|
|
||||||
*
|
|
||||||
* Returns the ID assigned to the timer.
|
|
||||||
*
|
|
||||||
* IDs are assigned to timers using the pvTimerID parameter of the call to
|
|
||||||
* xTimerCreated() that was used to create the timer.
|
|
||||||
*
|
|
||||||
* If the same callback function is assigned to multiple timers then the timer
|
|
||||||
* ID can be used within the callback function to identify which timer actually
|
|
||||||
* expired.
|
|
||||||
*
|
|
||||||
* @param xTimer The timer being queried.
|
|
||||||
*
|
|
||||||
* @return The ID assigned to the timer being queried.
|
|
||||||
*
|
|
||||||
* Example usage:
|
|
||||||
*
|
|
||||||
* See the xTimerCreate() API function example usage scenario.
|
|
||||||
*/
|
|
||||||
void *pvTimerGetTimerID( xTimerHandle xTimer ) PRIVILEGED_FUNCTION;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* portBASE_TYPE xTimerIsTimerActive( xTimerHandle xTimer );
|
|
||||||
*
|
|
||||||
* Queries a timer to see if it is active or dormant.
|
|
||||||
*
|
|
||||||
* A timer will be dormant if:
|
|
||||||
* 1) It has been created but not started, or
|
|
||||||
* 2) It is an expired on-shot timer that has not been restarted.
|
|
||||||
*
|
|
||||||
* Timers are created in the dormant state. The xTimerStart(), xTimerReset(),
|
|
||||||
* xTimerStartFromISR(), xTimerResetFromISR(), xTimerChangePeriod() and
|
|
||||||
* xTimerChangePeriodFromISR() API functions can all be used to transition a timer into the
|
|
||||||
* active state.
|
|
||||||
*
|
|
||||||
* @param xTimer The timer being queried.
|
|
||||||
*
|
|
||||||
* @return pdFALSE will be returned if the timer is dormant. A value other than
|
|
||||||
* pdFALSE will be returned if the timer is active.
|
|
||||||
*
|
|
||||||
* Example usage:
|
|
||||||
* @verbatim
|
|
||||||
* // This function assumes xTimer has already been created.
|
|
||||||
* void vAFunction( xTimerHandle xTimer )
|
|
||||||
* {
|
|
||||||
* if( xTimerIsTimerActive( xTimer ) != pdFALSE ) // or more simply and equivalently "if( xTimerIsTimerActive( xTimer ) )"
|
|
||||||
* {
|
|
||||||
* // xTimer is active, do something.
|
|
||||||
* }
|
|
||||||
* else
|
|
||||||
* {
|
|
||||||
* // xTimer is not active, do something else.
|
|
||||||
* }
|
|
||||||
* }
|
|
||||||
* @endverbatim
|
|
||||||
*/
|
|
||||||
portBASE_TYPE xTimerIsTimerActive( xTimerHandle xTimer ) PRIVILEGED_FUNCTION;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* xTimerGetTimerDaemonTaskHandle() is only available if
|
|
||||||
* INCLUDE_xTimerGetTimerDaemonTaskHandle is set to 1 in FreeRTOSConfig.h.
|
|
||||||
*
|
|
||||||
* Simply returns the handle of the timer service/daemon task. It it not valid
|
|
||||||
* to call xTimerGetTimerDaemonTaskHandle() before the scheduler has been started.
|
|
||||||
*/
|
|
||||||
xTaskHandle xTimerGetTimerDaemonTaskHandle( void );
|
|
||||||
|
|
||||||
/**
|
|
||||||
* portBASE_TYPE xTimerStart( xTimerHandle xTimer, portTickType xBlockTime );
|
|
||||||
*
|
|
||||||
* Timer functionality is provided by a timer service/daemon task. Many of the
|
|
||||||
* public FreeRTOS timer API functions send commands to the timer service task
|
|
||||||
* though a queue called the timer command queue. The timer command queue is
|
|
||||||
* private to the kernel itself and is not directly accessible to application
|
|
||||||
* code. The length of the timer command queue is set by the
|
|
||||||
* configTIMER_QUEUE_LENGTH configuration constant.
|
|
||||||
*
|
|
||||||
* xTimerStart() starts a timer that was previously created using the
|
|
||||||
* xTimerCreate() API function. If the timer had already been started and was
|
|
||||||
* already in the active state, then xTimerStart() has equivalent functionality
|
|
||||||
* to the xTimerReset() API function.
|
|
||||||
*
|
|
||||||
* Starting a timer ensures the timer is in the active state. If the timer
|
|
||||||
* is not stopped, deleted, or reset in the mean time, the callback function
|
|
||||||
* associated with the timer will get called 'n' ticks after xTimerStart() was
|
|
||||||
* called, where 'n' is the timers defined period.
|
|
||||||
*
|
|
||||||
* It is valid to call xTimerStart() before the scheduler has been started, but
|
|
||||||
* when this is done the timer will not actually start until the scheduler is
|
|
||||||
* started, and the timers expiry time will be relative to when the scheduler is
|
|
||||||
* started, not relative to when xTimerStart() was called.
|
|
||||||
*
|
|
||||||
* The configUSE_TIMERS configuration constant must be set to 1 for xTimerStart()
|
|
||||||
* to be available.
|
|
||||||
*
|
|
||||||
* @param xTimer The handle of the timer being started/restarted.
|
|
||||||
*
|
|
||||||
* @param xBlockTime Specifies the time, in ticks, that the calling task should
|
|
||||||
* be held in the Blocked state to wait for the start command to be successfully
|
|
||||||
* sent to the timer command queue, should the queue already be full when
|
|
||||||
* xTimerStart() was called. xBlockTime is ignored if xTimerStart() is called
|
|
||||||
* before the scheduler is started.
|
|
||||||
*
|
|
||||||
* @return pdFAIL will be returned if the start command could not be sent to
|
|
||||||
* the timer command queue even after xBlockTime ticks had passed. pdPASS will
|
|
||||||
* be returned if the command was successfully sent to the timer command queue.
|
|
||||||
* When the command is actually processed will depend on the priority of the
|
|
||||||
* timer service/daemon task relative to other tasks in the system, although the
|
|
||||||
* timers expiry time is relative to when xTimerStart() is actually called. The
|
|
||||||
* timer service/daemon task priority is set by the configTIMER_TASK_PRIORITY
|
|
||||||
* configuration constant.
|
|
||||||
*
|
|
||||||
* Example usage:
|
|
||||||
*
|
|
||||||
* See the xTimerCreate() API function example usage scenario.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
#define xTimerStart( xTimer, xBlockTime ) xTimerGenericCommand( ( xTimer ), tmrCOMMAND_START, ( xTaskGetTickCount() ), NULL, ( xBlockTime ) )
|
|
||||||
|
|
||||||
/**
|
|
||||||
* portBASE_TYPE xTimerStop( xTimerHandle xTimer, portTickType xBlockTime );
|
|
||||||
*
|
|
||||||
* Timer functionality is provided by a timer service/daemon task. Many of the
|
|
||||||
* public FreeRTOS timer API functions send commands to the timer service task
|
|
||||||
* though a queue called the timer command queue. The timer command queue is
|
|
||||||
* private to the kernel itself and is not directly accessible to application
|
|
||||||
* code. The length of the timer command queue is set by the
|
|
||||||
* configTIMER_QUEUE_LENGTH configuration constant.
|
|
||||||
*
|
|
||||||
* xTimerStop() stops a timer that was previously started using either of the
|
|
||||||
* The xTimerStart(), xTimerReset(), xTimerStartFromISR(), xTimerResetFromISR(),
|
|
||||||
* xTimerChangePeriod() or xTimerChangePeriodFromISR() API functions.
|
|
||||||
*
|
|
||||||
* Stopping a timer ensures the timer is not in the active state.
|
|
||||||
*
|
|
||||||
* The configUSE_TIMERS configuration constant must be set to 1 for xTimerStop()
|
|
||||||
* to be available.
|
|
||||||
*
|
|
||||||
* @param xTimer The handle of the timer being stopped.
|
|
||||||
*
|
|
||||||
* @param xBlockTime Specifies the time, in ticks, that the calling task should
|
|
||||||
* be held in the Blocked state to wait for the stop command to be successfully
|
|
||||||
* sent to the timer command queue, should the queue already be full when
|
|
||||||
* xTimerStop() was called. xBlockTime is ignored if xTimerStop() is called
|
|
||||||
* before the scheduler is started.
|
|
||||||
*
|
|
||||||
* @return pdFAIL will be returned if the stop command could not be sent to
|
|
||||||
* the timer command queue even after xBlockTime ticks had passed. pdPASS will
|
|
||||||
* be returned if the command was successfully sent to the timer command queue.
|
|
||||||
* When the command is actually processed will depend on the priority of the
|
|
||||||
* timer service/daemon task relative to other tasks in the system. The timer
|
|
||||||
* service/daemon task priority is set by the configTIMER_TASK_PRIORITY
|
|
||||||
* configuration constant.
|
|
||||||
*
|
|
||||||
* Example usage:
|
|
||||||
*
|
|
||||||
* See the xTimerCreate() API function example usage scenario.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
#define xTimerStop( xTimer, xBlockTime ) xTimerGenericCommand( ( xTimer ), tmrCOMMAND_STOP, 0U, NULL, ( xBlockTime ) )
|
|
||||||
|
|
||||||
/**
|
|
||||||
* portBASE_TYPE xTimerChangePeriod( xTimerHandle xTimer,
|
|
||||||
* portTickType xNewPeriod,
|
|
||||||
* portTickType xBlockTime );
|
|
||||||
*
|
|
||||||
* Timer functionality is provided by a timer service/daemon task. Many of the
|
|
||||||
* public FreeRTOS timer API functions send commands to the timer service task
|
|
||||||
* though a queue called the timer command queue. The timer command queue is
|
|
||||||
* private to the kernel itself and is not directly accessible to application
|
|
||||||
* code. The length of the timer command queue is set by the
|
|
||||||
* configTIMER_QUEUE_LENGTH configuration constant.
|
|
||||||
*
|
|
||||||
* xTimerChangePeriod() changes the period of a timer that was previously
|
|
||||||
* created using the xTimerCreate() API function.
|
|
||||||
*
|
|
||||||
* xTimerChangePeriod() can be called to change the period of an active or
|
|
||||||
* dormant state timer.
|
|
||||||
*
|
|
||||||
* The configUSE_TIMERS configuration constant must be set to 1 for
|
|
||||||
* xTimerChangePeriod() to be available.
|
|
||||||
*
|
|
||||||
* @param xTimer The handle of the timer that is having its period changed.
|
|
||||||
*
|
|
||||||
* @param xNewPeriod The new period for xTimer. Timer periods are specified in
|
|
||||||
* tick periods, so the constant portTICK_RATE_MS can be used to convert a time
|
|
||||||
* that has been specified in milliseconds. For example, if the timer must
|
|
||||||
* expire after 100 ticks, then xNewPeriod should be set to 100. Alternatively,
|
|
||||||
* if the timer must expire after 500ms, then xNewPeriod can be set to
|
|
||||||
* ( 500 / portTICK_RATE_MS ) provided configTICK_RATE_HZ is less than
|
|
||||||
* or equal to 1000.
|
|
||||||
*
|
|
||||||
* @param xBlockTime Specifies the time, in ticks, that the calling task should
|
|
||||||
* be held in the Blocked state to wait for the change period command to be
|
|
||||||
* successfully sent to the timer command queue, should the queue already be
|
|
||||||
* full when xTimerChangePeriod() was called. xBlockTime is ignored if
|
|
||||||
* xTimerChangePeriod() is called before the scheduler is started.
|
|
||||||
*
|
|
||||||
* @return pdFAIL will be returned if the change period command could not be
|
|
||||||
* sent to the timer command queue even after xBlockTime ticks had passed.
|
|
||||||
* pdPASS will be returned if the command was successfully sent to the timer
|
|
||||||
* command queue. When the command is actually processed will depend on the
|
|
||||||
* priority of the timer service/daemon task relative to other tasks in the
|
|
||||||
* system. The timer service/daemon task priority is set by the
|
|
||||||
* configTIMER_TASK_PRIORITY configuration constant.
|
|
||||||
*
|
|
||||||
* Example usage:
|
|
||||||
* @verbatim
|
|
||||||
* // This function assumes xTimer has already been created. If the timer
|
|
||||||
* // referenced by xTimer is already active when it is called, then the timer
|
|
||||||
* // is deleted. If the timer referenced by xTimer is not active when it is
|
|
||||||
* // called, then the period of the timer is set to 500ms and the timer is
|
|
||||||
* // started.
|
|
||||||
* void vAFunction( xTimerHandle xTimer )
|
|
||||||
* {
|
|
||||||
* if( xTimerIsTimerActive( xTimer ) != pdFALSE ) // or more simply and equivalently "if( xTimerIsTimerActive( xTimer ) )"
|
|
||||||
* {
|
|
||||||
* // xTimer is already active - delete it.
|
|
||||||
* xTimerDelete( xTimer );
|
|
||||||
* }
|
|
||||||
* else
|
|
||||||
* {
|
|
||||||
* // xTimer is not active, change its period to 500ms. This will also
|
|
||||||
* // cause the timer to start. Block for a maximum of 100 ticks if the
|
|
||||||
* // change period command cannot immediately be sent to the timer
|
|
||||||
* // command queue.
|
|
||||||
* if( xTimerChangePeriod( xTimer, 500 / portTICK_RATE_MS, 100 ) == pdPASS )
|
|
||||||
* {
|
|
||||||
* // The command was successfully sent.
|
|
||||||
* }
|
|
||||||
* else
|
|
||||||
* {
|
|
||||||
* // The command could not be sent, even after waiting for 100 ticks
|
|
||||||
* // to pass. Take appropriate action here.
|
|
||||||
* }
|
|
||||||
* }
|
|
||||||
* }
|
|
||||||
* @endverbatim
|
|
||||||
*/
|
|
||||||
#define xTimerChangePeriod( xTimer, xNewPeriod, xBlockTime ) xTimerGenericCommand( ( xTimer ), tmrCOMMAND_CHANGE_PERIOD, ( xNewPeriod ), NULL, ( xBlockTime ) )
|
|
||||||
|
|
||||||
/**
|
|
||||||
* portBASE_TYPE xTimerDelete( xTimerHandle xTimer, portTickType xBlockTime );
|
|
||||||
*
|
|
||||||
* Timer functionality is provided by a timer service/daemon task. Many of the
|
|
||||||
* public FreeRTOS timer API functions send commands to the timer service task
|
|
||||||
* though a queue called the timer command queue. The timer command queue is
|
|
||||||
* private to the kernel itself and is not directly accessible to application
|
|
||||||
* code. The length of the timer command queue is set by the
|
|
||||||
* configTIMER_QUEUE_LENGTH configuration constant.
|
|
||||||
*
|
|
||||||
* xTimerDelete() deletes a timer that was previously created using the
|
|
||||||
* xTimerCreate() API function.
|
|
||||||
*
|
|
||||||
* The configUSE_TIMERS configuration constant must be set to 1 for
|
|
||||||
* xTimerDelete() to be available.
|
|
||||||
*
|
|
||||||
* @param xTimer The handle of the timer being deleted.
|
|
||||||
*
|
|
||||||
* @param xBlockTime Specifies the time, in ticks, that the calling task should
|
|
||||||
* be held in the Blocked state to wait for the delete command to be
|
|
||||||
* successfully sent to the timer command queue, should the queue already be
|
|
||||||
* full when xTimerDelete() was called. xBlockTime is ignored if xTimerDelete()
|
|
||||||
* is called before the scheduler is started.
|
|
||||||
*
|
|
||||||
* @return pdFAIL will be returned if the delete command could not be sent to
|
|
||||||
* the timer command queue even after xBlockTime ticks had passed. pdPASS will
|
|
||||||
* be returned if the command was successfully sent to the timer command queue.
|
|
||||||
* When the command is actually processed will depend on the priority of the
|
|
||||||
* timer service/daemon task relative to other tasks in the system. The timer
|
|
||||||
* service/daemon task priority is set by the configTIMER_TASK_PRIORITY
|
|
||||||
* configuration constant.
|
|
||||||
*
|
|
||||||
* Example usage:
|
|
||||||
*
|
|
||||||
* See the xTimerChangePeriod() API function example usage scenario.
|
|
||||||
*/
|
|
||||||
#define xTimerDelete( xTimer, xBlockTime ) xTimerGenericCommand( ( xTimer ), tmrCOMMAND_DELETE, 0U, NULL, ( xBlockTime ) )
|
|
||||||
|
|
||||||
/**
|
|
||||||
* portBASE_TYPE xTimerReset( xTimerHandle xTimer, portTickType xBlockTime );
|
|
||||||
*
|
|
||||||
* Timer functionality is provided by a timer service/daemon task. Many of the
|
|
||||||
* public FreeRTOS timer API functions send commands to the timer service task
|
|
||||||
* though a queue called the timer command queue. The timer command queue is
|
|
||||||
* private to the kernel itself and is not directly accessible to application
|
|
||||||
* code. The length of the timer command queue is set by the
|
|
||||||
* configTIMER_QUEUE_LENGTH configuration constant.
|
|
||||||
*
|
|
||||||
* xTimerReset() re-starts a timer that was previously created using the
|
|
||||||
* xTimerCreate() API function. If the timer had already been started and was
|
|
||||||
* already in the active state, then xTimerReset() will cause the timer to
|
|
||||||
* re-evaluate its expiry time so that it is relative to when xTimerReset() was
|
|
||||||
* called. If the timer was in the dormant state then xTimerReset() has
|
|
||||||
* equivalent functionality to the xTimerStart() API function.
|
|
||||||
*
|
|
||||||
* Resetting a timer ensures the timer is in the active state. If the timer
|
|
||||||
* is not stopped, deleted, or reset in the mean time, the callback function
|
|
||||||
* associated with the timer will get called 'n' ticks after xTimerReset() was
|
|
||||||
* called, where 'n' is the timers defined period.
|
|
||||||
*
|
|
||||||
* It is valid to call xTimerReset() before the scheduler has been started, but
|
|
||||||
* when this is done the timer will not actually start until the scheduler is
|
|
||||||
* started, and the timers expiry time will be relative to when the scheduler is
|
|
||||||
* started, not relative to when xTimerReset() was called.
|
|
||||||
*
|
|
||||||
* The configUSE_TIMERS configuration constant must be set to 1 for xTimerReset()
|
|
||||||
* to be available.
|
|
||||||
*
|
|
||||||
* @param xTimer The handle of the timer being reset/started/restarted.
|
|
||||||
*
|
|
||||||
* @param xBlockTime Specifies the time, in ticks, that the calling task should
|
|
||||||
* be held in the Blocked state to wait for the reset command to be successfully
|
|
||||||
* sent to the timer command queue, should the queue already be full when
|
|
||||||
* xTimerReset() was called. xBlockTime is ignored if xTimerReset() is called
|
|
||||||
* before the scheduler is started.
|
|
||||||
*
|
|
||||||
* @return pdFAIL will be returned if the reset command could not be sent to
|
|
||||||
* the timer command queue even after xBlockTime ticks had passed. pdPASS will
|
|
||||||
* be returned if the command was successfully sent to the timer command queue.
|
|
||||||
* When the command is actually processed will depend on the priority of the
|
|
||||||
* timer service/daemon task relative to other tasks in the system, although the
|
|
||||||
* timers expiry time is relative to when xTimerStart() is actually called. The
|
|
||||||
* timer service/daemon task priority is set by the configTIMER_TASK_PRIORITY
|
|
||||||
* configuration constant.
|
|
||||||
*
|
|
||||||
* Example usage:
|
|
||||||
* @verbatim
|
|
||||||
* // When a key is pressed, an LCD back-light is switched on. If 5 seconds pass
|
|
||||||
* // without a key being pressed, then the LCD back-light is switched off. In
|
|
||||||
* // this case, the timer is a one-shot timer.
|
|
||||||
*
|
|
||||||
* xTimerHandle xBacklightTimer = NULL;
|
|
||||||
*
|
|
||||||
* // The callback function assigned to the one-shot timer. In this case the
|
|
||||||
* // parameter is not used.
|
|
||||||
* void vBacklightTimerCallback( xTimerHandle pxTimer )
|
|
||||||
* {
|
|
||||||
* // The timer expired, therefore 5 seconds must have passed since a key
|
|
||||||
* // was pressed. Switch off the LCD back-light.
|
|
||||||
* vSetBacklightState( BACKLIGHT_OFF );
|
|
||||||
* }
|
|
||||||
*
|
|
||||||
* // The key press event handler.
|
|
||||||
* void vKeyPressEventHandler( char cKey )
|
|
||||||
* {
|
|
||||||
* // Ensure the LCD back-light is on, then reset the timer that is
|
|
||||||
* // responsible for turning the back-light off after 5 seconds of
|
|
||||||
* // key inactivity. Wait 10 ticks for the command to be successfully sent
|
|
||||||
* // if it cannot be sent immediately.
|
|
||||||
* vSetBacklightState( BACKLIGHT_ON );
|
|
||||||
* if( xTimerReset( xBacklightTimer, 100 ) != pdPASS )
|
|
||||||
* {
|
|
||||||
* // The reset command was not executed successfully. Take appropriate
|
|
||||||
* // action here.
|
|
||||||
* }
|
|
||||||
*
|
|
||||||
* // Perform the rest of the key processing here.
|
|
||||||
* }
|
|
||||||
*
|
|
||||||
* void main( void )
|
|
||||||
* {
|
|
||||||
* long x;
|
|
||||||
*
|
|
||||||
* // Create then start the one-shot timer that is responsible for turning
|
|
||||||
* // the back-light off if no keys are pressed within a 5 second period.
|
|
||||||
* xBacklightTimer = xTimerCreate( "BacklightTimer", // Just a text name, not used by the kernel.
|
|
||||||
* ( 5000 / portTICK_RATE_MS), // The timer period in ticks.
|
|
||||||
* pdFALSE, // The timer is a one-shot timer.
|
|
||||||
* 0, // The id is not used by the callback so can take any value.
|
|
||||||
* vBacklightTimerCallback // The callback function that switches the LCD back-light off.
|
|
||||||
* );
|
|
||||||
*
|
|
||||||
* if( xBacklightTimer == NULL )
|
|
||||||
* {
|
|
||||||
* // The timer was not created.
|
|
||||||
* }
|
|
||||||
* else
|
|
||||||
* {
|
|
||||||
* // Start the timer. No block time is specified, and even if one was
|
|
||||||
* // it would be ignored because the scheduler has not yet been
|
|
||||||
* // started.
|
|
||||||
* if( xTimerStart( xBacklightTimer, 0 ) != pdPASS )
|
|
||||||
* {
|
|
||||||
* // The timer could not be set into the Active state.
|
|
||||||
* }
|
|
||||||
* }
|
|
||||||
*
|
|
||||||
* // ...
|
|
||||||
* // Create tasks here.
|
|
||||||
* // ...
|
|
||||||
*
|
|
||||||
* // Starting the scheduler will start the timer running as it has already
|
|
||||||
* // been set into the active state.
|
|
||||||
* xTaskStartScheduler();
|
|
||||||
*
|
|
||||||
* // Should not reach here.
|
|
||||||
* for( ;; );
|
|
||||||
* }
|
|
||||||
* @endverbatim
|
|
||||||
*/
|
|
||||||
#define xTimerReset( xTimer, xBlockTime ) xTimerGenericCommand( ( xTimer ), tmrCOMMAND_START, ( xTaskGetTickCount() ), NULL, ( xBlockTime ) )
|
|
||||||
|
|
||||||
/**
|
|
||||||
* portBASE_TYPE xTimerStartFromISR( xTimerHandle xTimer,
|
|
||||||
* portBASE_TYPE *pxHigherPriorityTaskWoken );
|
|
||||||
*
|
|
||||||
* A version of xTimerStart() that can be called from an interrupt service
|
|
||||||
* routine.
|
|
||||||
*
|
|
||||||
* @param xTimer The handle of the timer being started/restarted.
|
|
||||||
*
|
|
||||||
* @param pxHigherPriorityTaskWoken The timer service/daemon task spends most
|
|
||||||
* of its time in the Blocked state, waiting for messages to arrive on the timer
|
|
||||||
* command queue. Calling xTimerStartFromISR() writes a message to the timer
|
|
||||||
* command queue, so has the potential to transition the timer service/daemon
|
|
||||||
* task out of the Blocked state. If calling xTimerStartFromISR() causes the
|
|
||||||
* timer service/daemon task to leave the Blocked state, and the timer service/
|
|
||||||
* daemon task has a priority equal to or greater than the currently executing
|
|
||||||
* task (the task that was interrupted), then *pxHigherPriorityTaskWoken will
|
|
||||||
* get set to pdTRUE internally within the xTimerStartFromISR() function. If
|
|
||||||
* xTimerStartFromISR() sets this value to pdTRUE then a context switch should
|
|
||||||
* be performed before the interrupt exits.
|
|
||||||
*
|
|
||||||
* @return pdFAIL will be returned if the start command could not be sent to
|
|
||||||
* the timer command queue. pdPASS will be returned if the command was
|
|
||||||
* successfully sent to the timer command queue. When the command is actually
|
|
||||||
* processed will depend on the priority of the timer service/daemon task
|
|
||||||
* relative to other tasks in the system, although the timers expiry time is
|
|
||||||
* relative to when xTimerStartFromISR() is actually called. The timer service/daemon
|
|
||||||
* task priority is set by the configTIMER_TASK_PRIORITY configuration constant.
|
|
||||||
*
|
|
||||||
* Example usage:
|
|
||||||
* @verbatim
|
|
||||||
* // This scenario assumes xBacklightTimer has already been created. When a
|
|
||||||
* // key is pressed, an LCD back-light is switched on. If 5 seconds pass
|
|
||||||
* // without a key being pressed, then the LCD back-light is switched off. In
|
|
||||||
* // this case, the timer is a one-shot timer, and unlike the example given for
|
|
||||||
* // the xTimerReset() function, the key press event handler is an interrupt
|
|
||||||
* // service routine.
|
|
||||||
*
|
|
||||||
* // The callback function assigned to the one-shot timer. In this case the
|
|
||||||
* // parameter is not used.
|
|
||||||
* void vBacklightTimerCallback( xTimerHandle pxTimer )
|
|
||||||
* {
|
|
||||||
* // The timer expired, therefore 5 seconds must have passed since a key
|
|
||||||
* // was pressed. Switch off the LCD back-light.
|
|
||||||
* vSetBacklightState( BACKLIGHT_OFF );
|
|
||||||
* }
|
|
||||||
*
|
|
||||||
* // The key press interrupt service routine.
|
|
||||||
* void vKeyPressEventInterruptHandler( void )
|
|
||||||
* {
|
|
||||||
* portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE;
|
|
||||||
*
|
|
||||||
* // Ensure the LCD back-light is on, then restart the timer that is
|
|
||||||
* // responsible for turning the back-light off after 5 seconds of
|
|
||||||
* // key inactivity. This is an interrupt service routine so can only
|
|
||||||
* // call FreeRTOS API functions that end in "FromISR".
|
|
||||||
* vSetBacklightState( BACKLIGHT_ON );
|
|
||||||
*
|
|
||||||
* // xTimerStartFromISR() or xTimerResetFromISR() could be called here
|
|
||||||
* // as both cause the timer to re-calculate its expiry time.
|
|
||||||
* // xHigherPriorityTaskWoken was initialised to pdFALSE when it was
|
|
||||||
* // declared (in this function).
|
|
||||||
* if( xTimerStartFromISR( xBacklightTimer, &xHigherPriorityTaskWoken ) != pdPASS )
|
|
||||||
* {
|
|
||||||
* // The start command was not executed successfully. Take appropriate
|
|
||||||
* // action here.
|
|
||||||
* }
|
|
||||||
*
|
|
||||||
* // Perform the rest of the key processing here.
|
|
||||||
*
|
|
||||||
* // If xHigherPriorityTaskWoken equals pdTRUE, then a context switch
|
|
||||||
* // should be performed. The syntax required to perform a context switch
|
|
||||||
* // from inside an ISR varies from port to port, and from compiler to
|
|
||||||
* // compiler. Inspect the demos for the port you are using to find the
|
|
||||||
* // actual syntax required.
|
|
||||||
* if( xHigherPriorityTaskWoken != pdFALSE )
|
|
||||||
* {
|
|
||||||
* // Call the interrupt safe yield function here (actual function
|
|
||||||
* // depends on the FreeRTOS port being used.
|
|
||||||
* }
|
|
||||||
* }
|
|
||||||
* @endverbatim
|
|
||||||
*/
|
|
||||||
#define xTimerStartFromISR( xTimer, pxHigherPriorityTaskWoken ) xTimerGenericCommand( ( xTimer ), tmrCOMMAND_START, ( xTaskGetTickCountFromISR() ), ( pxHigherPriorityTaskWoken ), 0U )
|
|
||||||
|
|
||||||
/**
|
|
||||||
* portBASE_TYPE xTimerStopFromISR( xTimerHandle xTimer,
|
|
||||||
* portBASE_TYPE *pxHigherPriorityTaskWoken );
|
|
||||||
*
|
|
||||||
* A version of xTimerStop() that can be called from an interrupt service
|
|
||||||
* routine.
|
|
||||||
*
|
|
||||||
* @param xTimer The handle of the timer being stopped.
|
|
||||||
*
|
|
||||||
* @param pxHigherPriorityTaskWoken The timer service/daemon task spends most
|
|
||||||
* of its time in the Blocked state, waiting for messages to arrive on the timer
|
|
||||||
* command queue. Calling xTimerStopFromISR() writes a message to the timer
|
|
||||||
* command queue, so has the potential to transition the timer service/daemon
|
|
||||||
* task out of the Blocked state. If calling xTimerStopFromISR() causes the
|
|
||||||
* timer service/daemon task to leave the Blocked state, and the timer service/
|
|
||||||
* daemon task has a priority equal to or greater than the currently executing
|
|
||||||
* task (the task that was interrupted), then *pxHigherPriorityTaskWoken will
|
|
||||||
* get set to pdTRUE internally within the xTimerStopFromISR() function. If
|
|
||||||
* xTimerStopFromISR() sets this value to pdTRUE then a context switch should
|
|
||||||
* be performed before the interrupt exits.
|
|
||||||
*
|
|
||||||
* @return pdFAIL will be returned if the stop command could not be sent to
|
|
||||||
* the timer command queue. pdPASS will be returned if the command was
|
|
||||||
* successfully sent to the timer command queue. When the command is actually
|
|
||||||
* processed will depend on the priority of the timer service/daemon task
|
|
||||||
* relative to other tasks in the system. The timer service/daemon task
|
|
||||||
* priority is set by the configTIMER_TASK_PRIORITY configuration constant.
|
|
||||||
*
|
|
||||||
* Example usage:
|
|
||||||
* @verbatim
|
|
||||||
* // This scenario assumes xTimer has already been created and started. When
|
|
||||||
* // an interrupt occurs, the timer should be simply stopped.
|
|
||||||
*
|
|
||||||
* // The interrupt service routine that stops the timer.
|
|
||||||
* void vAnExampleInterruptServiceRoutine( void )
|
|
||||||
* {
|
|
||||||
* portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE;
|
|
||||||
*
|
|
||||||
* // The interrupt has occurred - simply stop the timer.
|
|
||||||
* // xHigherPriorityTaskWoken was set to pdFALSE where it was defined
|
|
||||||
* // (within this function). As this is an interrupt service routine, only
|
|
||||||
* // FreeRTOS API functions that end in "FromISR" can be used.
|
|
||||||
* if( xTimerStopFromISR( xTimer, &xHigherPriorityTaskWoken ) != pdPASS )
|
|
||||||
* {
|
|
||||||
* // The stop command was not executed successfully. Take appropriate
|
|
||||||
* // action here.
|
|
||||||
* }
|
|
||||||
*
|
|
||||||
* // If xHigherPriorityTaskWoken equals pdTRUE, then a context switch
|
|
||||||
* // should be performed. The syntax required to perform a context switch
|
|
||||||
* // from inside an ISR varies from port to port, and from compiler to
|
|
||||||
* // compiler. Inspect the demos for the port you are using to find the
|
|
||||||
* // actual syntax required.
|
|
||||||
* if( xHigherPriorityTaskWoken != pdFALSE )
|
|
||||||
* {
|
|
||||||
* // Call the interrupt safe yield function here (actual function
|
|
||||||
* // depends on the FreeRTOS port being used.
|
|
||||||
* }
|
|
||||||
* }
|
|
||||||
* @endverbatim
|
|
||||||
*/
|
|
||||||
#define xTimerStopFromISR( xTimer, pxHigherPriorityTaskWoken ) xTimerGenericCommand( ( xTimer ), tmrCOMMAND_STOP, 0, ( pxHigherPriorityTaskWoken ), 0U )
|
|
||||||
|
|
||||||
/**
|
|
||||||
* portBASE_TYPE xTimerChangePeriodFromISR( xTimerHandle xTimer,
|
|
||||||
* portTickType xNewPeriod,
|
|
||||||
* portBASE_TYPE *pxHigherPriorityTaskWoken );
|
|
||||||
*
|
|
||||||
* A version of xTimerChangePeriod() that can be called from an interrupt
|
|
||||||
* service routine.
|
|
||||||
*
|
|
||||||
* @param xTimer The handle of the timer that is having its period changed.
|
|
||||||
*
|
|
||||||
* @param xNewPeriod The new period for xTimer. Timer periods are specified in
|
|
||||||
* tick periods, so the constant portTICK_RATE_MS can be used to convert a time
|
|
||||||
* that has been specified in milliseconds. For example, if the timer must
|
|
||||||
* expire after 100 ticks, then xNewPeriod should be set to 100. Alternatively,
|
|
||||||
* if the timer must expire after 500ms, then xNewPeriod can be set to
|
|
||||||
* ( 500 / portTICK_RATE_MS ) provided configTICK_RATE_HZ is less than
|
|
||||||
* or equal to 1000.
|
|
||||||
*
|
|
||||||
* @param pxHigherPriorityTaskWoken The timer service/daemon task spends most
|
|
||||||
* of its time in the Blocked state, waiting for messages to arrive on the timer
|
|
||||||
* command queue. Calling xTimerChangePeriodFromISR() writes a message to the
|
|
||||||
* timer command queue, so has the potential to transition the timer service/
|
|
||||||
* daemon task out of the Blocked state. If calling xTimerChangePeriodFromISR()
|
|
||||||
* causes the timer service/daemon task to leave the Blocked state, and the
|
|
||||||
* timer service/daemon task has a priority equal to or greater than the
|
|
||||||
* currently executing task (the task that was interrupted), then
|
|
||||||
* *pxHigherPriorityTaskWoken will get set to pdTRUE internally within the
|
|
||||||
* xTimerChangePeriodFromISR() function. If xTimerChangePeriodFromISR() sets
|
|
||||||
* this value to pdTRUE then a context switch should be performed before the
|
|
||||||
* interrupt exits.
|
|
||||||
*
|
|
||||||
* @return pdFAIL will be returned if the command to change the timers period
|
|
||||||
* could not be sent to the timer command queue. pdPASS will be returned if the
|
|
||||||
* command was successfully sent to the timer command queue. When the command
|
|
||||||
* is actually processed will depend on the priority of the timer service/daemon
|
|
||||||
* task relative to other tasks in the system. The timer service/daemon task
|
|
||||||
* priority is set by the configTIMER_TASK_PRIORITY configuration constant.
|
|
||||||
*
|
|
||||||
* Example usage:
|
|
||||||
* @verbatim
|
|
||||||
* // This scenario assumes xTimer has already been created and started. When
|
|
||||||
* // an interrupt occurs, the period of xTimer should be changed to 500ms.
|
|
||||||
*
|
|
||||||
* // The interrupt service routine that changes the period of xTimer.
|
|
||||||
* void vAnExampleInterruptServiceRoutine( void )
|
|
||||||
* {
|
|
||||||
* portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE;
|
|
||||||
*
|
|
||||||
* // The interrupt has occurred - change the period of xTimer to 500ms.
|
|
||||||
* // xHigherPriorityTaskWoken was set to pdFALSE where it was defined
|
|
||||||
* // (within this function). As this is an interrupt service routine, only
|
|
||||||
* // FreeRTOS API functions that end in "FromISR" can be used.
|
|
||||||
* if( xTimerChangePeriodFromISR( xTimer, &xHigherPriorityTaskWoken ) != pdPASS )
|
|
||||||
* {
|
|
||||||
* // The command to change the timers period was not executed
|
|
||||||
* // successfully. Take appropriate action here.
|
|
||||||
* }
|
|
||||||
*
|
|
||||||
* // If xHigherPriorityTaskWoken equals pdTRUE, then a context switch
|
|
||||||
* // should be performed. The syntax required to perform a context switch
|
|
||||||
* // from inside an ISR varies from port to port, and from compiler to
|
|
||||||
* // compiler. Inspect the demos for the port you are using to find the
|
|
||||||
* // actual syntax required.
|
|
||||||
* if( xHigherPriorityTaskWoken != pdFALSE )
|
|
||||||
* {
|
|
||||||
* // Call the interrupt safe yield function here (actual function
|
|
||||||
* // depends on the FreeRTOS port being used.
|
|
||||||
* }
|
|
||||||
* }
|
|
||||||
* @endverbatim
|
|
||||||
*/
|
|
||||||
#define xTimerChangePeriodFromISR( xTimer, xNewPeriod, pxHigherPriorityTaskWoken ) xTimerGenericCommand( ( xTimer ), tmrCOMMAND_CHANGE_PERIOD, ( xNewPeriod ), ( pxHigherPriorityTaskWoken ), 0U )
|
|
||||||
|
|
||||||
/**
|
|
||||||
* portBASE_TYPE xTimerResetFromISR( xTimerHandle xTimer,
|
|
||||||
* portBASE_TYPE *pxHigherPriorityTaskWoken );
|
|
||||||
*
|
|
||||||
* A version of xTimerReset() that can be called from an interrupt service
|
|
||||||
* routine.
|
|
||||||
*
|
|
||||||
* @param xTimer The handle of the timer that is to be started, reset, or
|
|
||||||
* restarted.
|
|
||||||
*
|
|
||||||
* @param pxHigherPriorityTaskWoken The timer service/daemon task spends most
|
|
||||||
* of its time in the Blocked state, waiting for messages to arrive on the timer
|
|
||||||
* command queue. Calling xTimerResetFromISR() writes a message to the timer
|
|
||||||
* command queue, so has the potential to transition the timer service/daemon
|
|
||||||
* task out of the Blocked state. If calling xTimerResetFromISR() causes the
|
|
||||||
* timer service/daemon task to leave the Blocked state, and the timer service/
|
|
||||||
* daemon task has a priority equal to or greater than the currently executing
|
|
||||||
* task (the task that was interrupted), then *pxHigherPriorityTaskWoken will
|
|
||||||
* get set to pdTRUE internally within the xTimerResetFromISR() function. If
|
|
||||||
* xTimerResetFromISR() sets this value to pdTRUE then a context switch should
|
|
||||||
* be performed before the interrupt exits.
|
|
||||||
*
|
|
||||||
* @return pdFAIL will be returned if the reset command could not be sent to
|
|
||||||
* the timer command queue. pdPASS will be returned if the command was
|
|
||||||
* successfully sent to the timer command queue. When the command is actually
|
|
||||||
* processed will depend on the priority of the timer service/daemon task
|
|
||||||
* relative to other tasks in the system, although the timers expiry time is
|
|
||||||
* relative to when xTimerResetFromISR() is actually called. The timer service/daemon
|
|
||||||
* task priority is set by the configTIMER_TASK_PRIORITY configuration constant.
|
|
||||||
*
|
|
||||||
* Example usage:
|
|
||||||
* @verbatim
|
|
||||||
* // This scenario assumes xBacklightTimer has already been created. When a
|
|
||||||
* // key is pressed, an LCD back-light is switched on. If 5 seconds pass
|
|
||||||
* // without a key being pressed, then the LCD back-light is switched off. In
|
|
||||||
* // this case, the timer is a one-shot timer, and unlike the example given for
|
|
||||||
* // the xTimerReset() function, the key press event handler is an interrupt
|
|
||||||
* // service routine.
|
|
||||||
*
|
|
||||||
* // The callback function assigned to the one-shot timer. In this case the
|
|
||||||
* // parameter is not used.
|
|
||||||
* void vBacklightTimerCallback( xTimerHandle pxTimer )
|
|
||||||
* {
|
|
||||||
* // The timer expired, therefore 5 seconds must have passed since a key
|
|
||||||
* // was pressed. Switch off the LCD back-light.
|
|
||||||
* vSetBacklightState( BACKLIGHT_OFF );
|
|
||||||
* }
|
|
||||||
*
|
|
||||||
* // The key press interrupt service routine.
|
|
||||||
* void vKeyPressEventInterruptHandler( void )
|
|
||||||
* {
|
|
||||||
* portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE;
|
|
||||||
*
|
|
||||||
* // Ensure the LCD back-light is on, then reset the timer that is
|
|
||||||
* // responsible for turning the back-light off after 5 seconds of
|
|
||||||
* // key inactivity. This is an interrupt service routine so can only
|
|
||||||
* // call FreeRTOS API functions that end in "FromISR".
|
|
||||||
* vSetBacklightState( BACKLIGHT_ON );
|
|
||||||
*
|
|
||||||
* // xTimerStartFromISR() or xTimerResetFromISR() could be called here
|
|
||||||
* // as both cause the timer to re-calculate its expiry time.
|
|
||||||
* // xHigherPriorityTaskWoken was initialised to pdFALSE when it was
|
|
||||||
* // declared (in this function).
|
|
||||||
* if( xTimerResetFromISR( xBacklightTimer, &xHigherPriorityTaskWoken ) != pdPASS )
|
|
||||||
* {
|
|
||||||
* // The reset command was not executed successfully. Take appropriate
|
|
||||||
* // action here.
|
|
||||||
* }
|
|
||||||
*
|
|
||||||
* // Perform the rest of the key processing here.
|
|
||||||
*
|
|
||||||
* // If xHigherPriorityTaskWoken equals pdTRUE, then a context switch
|
|
||||||
* // should be performed. The syntax required to perform a context switch
|
|
||||||
* // from inside an ISR varies from port to port, and from compiler to
|
|
||||||
* // compiler. Inspect the demos for the port you are using to find the
|
|
||||||
* // actual syntax required.
|
|
||||||
* if( xHigherPriorityTaskWoken != pdFALSE )
|
|
||||||
* {
|
|
||||||
* // Call the interrupt safe yield function here (actual function
|
|
||||||
* // depends on the FreeRTOS port being used.
|
|
||||||
* }
|
|
||||||
* }
|
|
||||||
* @endverbatim
|
|
||||||
*/
|
|
||||||
#define xTimerResetFromISR( xTimer, pxHigherPriorityTaskWoken ) xTimerGenericCommand( ( xTimer ), tmrCOMMAND_START, ( xTaskGetTickCountFromISR() ), ( pxHigherPriorityTaskWoken ), 0U )
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Functions beyond this part are not part of the public API and are intended
|
|
||||||
* for use by the kernel only.
|
|
||||||
*/
|
|
||||||
portBASE_TYPE xTimerCreateTimerTask( void ) PRIVILEGED_FUNCTION;
|
|
||||||
portBASE_TYPE xTimerGenericCommand( xTimerHandle xTimer, portBASE_TYPE xCommandID, portTickType xOptionalValue, signed portBASE_TYPE *pxHigherPriorityTaskWoken, portTickType xBlockTime ) PRIVILEGED_FUNCTION;
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
#endif /* TIMERS_H */
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -1,94 +0,0 @@
|
|||||||
/*
|
|
||||||
* @brief Common FreeRTOS functions shared among platforms
|
|
||||||
*
|
|
||||||
* @note
|
|
||||||
* Copyright(C) NXP Semiconductors, 2012
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* @par
|
|
||||||
* Software that is described herein is for illustrative purposes only
|
|
||||||
* which provides customers with programming information regarding the
|
|
||||||
* LPC products. This software is supplied "AS IS" without any warranties of
|
|
||||||
* any kind, and NXP Semiconductors and its licensor disclaim any and
|
|
||||||
* all warranties, express or implied, including all implied warranties of
|
|
||||||
* merchantability, fitness for a particular purpose and non-infringement of
|
|
||||||
* intellectual property rights. NXP Semiconductors assumes no responsibility
|
|
||||||
* or liability for the use of the software, conveys no license or rights under any
|
|
||||||
* patent, copyright, mask work right, or any other intellectual property rights in
|
|
||||||
* or to any products. NXP Semiconductors reserves the right to make changes
|
|
||||||
* in the software without notification. NXP Semiconductors also makes no
|
|
||||||
* representation or warranty that such application will be suitable for the
|
|
||||||
* specified use without further testing or modification.
|
|
||||||
*
|
|
||||||
* @par
|
|
||||||
* Permission to use, copy, modify, and distribute this software and its
|
|
||||||
* documentation is hereby granted, under NXP Semiconductors' and its
|
|
||||||
* licensor's relevant copyrights in the software, without fee, provided that it
|
|
||||||
* is used in conjunction with NXP Semiconductors microcontrollers. This
|
|
||||||
* copyright, permission, and disclaimer notice must appear in all copies of
|
|
||||||
* this code.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "FreeRTOS.h"
|
|
||||||
#include "task.h"
|
|
||||||
#include "FreeRTOSCommonHooks.h"
|
|
||||||
|
|
||||||
#include "chip.h"
|
|
||||||
|
|
||||||
/*****************************************************************************
|
|
||||||
* Private types/enumerations/variables
|
|
||||||
****************************************************************************/
|
|
||||||
|
|
||||||
/*****************************************************************************
|
|
||||||
* Public types/enumerations/variables
|
|
||||||
****************************************************************************/
|
|
||||||
|
|
||||||
/*****************************************************************************
|
|
||||||
* Private functions
|
|
||||||
****************************************************************************/
|
|
||||||
|
|
||||||
/*****************************************************************************
|
|
||||||
* Public functions
|
|
||||||
****************************************************************************/
|
|
||||||
|
|
||||||
/* Delay for the specified number of milliSeconds */
|
|
||||||
void FreeRTOSDelay(uint32_t ms)
|
|
||||||
{
|
|
||||||
portTickType xDelayTime;
|
|
||||||
|
|
||||||
xDelayTime = xTaskGetTickCount();
|
|
||||||
vTaskDelayUntil(&xDelayTime, ms);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* FreeRTOS malloc fail hook */
|
|
||||||
void vApplicationMallocFailedHook(void)
|
|
||||||
{
|
|
||||||
DEBUGSTR("DIE:ERROR:FreeRTOS: Malloc Failure!\r\n");
|
|
||||||
taskDISABLE_INTERRUPTS();
|
|
||||||
for (;; ) {}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* FreeRTOS application idle hook */
|
|
||||||
void vApplicationIdleHook(void)
|
|
||||||
{
|
|
||||||
/* Best to sleep here until next systick */
|
|
||||||
__WFI();
|
|
||||||
}
|
|
||||||
|
|
||||||
/* FreeRTOS stack overflow hook */
|
|
||||||
void vApplicationStackOverflowHook(xTaskHandle pxTask, signed char *pcTaskName)
|
|
||||||
{
|
|
||||||
(void) pxTask;
|
|
||||||
(void) pcTaskName;
|
|
||||||
|
|
||||||
DEBUGOUT("DIE:ERROR:FreeRTOS: Stack overflow in task %s\r\n", pcTaskName);
|
|
||||||
/* 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. */
|
|
||||||
taskDISABLE_INTERRUPTS();
|
|
||||||
for (;; ) {}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* FreeRTOS application tick hook */
|
|
||||||
void vApplicationTickHook(void)
|
|
||||||
{}
|
|
||||||
@ -1,81 +0,0 @@
|
|||||||
/*
|
|
||||||
* @brief Common FreeRTOS functions shared among platforms
|
|
||||||
*
|
|
||||||
* @note
|
|
||||||
* Copyright(C) NXP Semiconductors, 2012
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* @par
|
|
||||||
* Software that is described herein is for illustrative purposes only
|
|
||||||
* which provides customers with programming information regarding the
|
|
||||||
* LPC products. This software is supplied "AS IS" without any warranties of
|
|
||||||
* any kind, and NXP Semiconductors and its licensor disclaim any and
|
|
||||||
* all warranties, express or implied, including all implied warranties of
|
|
||||||
* merchantability, fitness for a particular purpose and non-infringement of
|
|
||||||
* intellectual property rights. NXP Semiconductors assumes no responsibility
|
|
||||||
* or liability for the use of the software, conveys no license or rights under any
|
|
||||||
* patent, copyright, mask work right, or any other intellectual property rights in
|
|
||||||
* or to any products. NXP Semiconductors reserves the right to make changes
|
|
||||||
* in the software without notification. NXP Semiconductors also makes no
|
|
||||||
* representation or warranty that such application will be suitable for the
|
|
||||||
* specified use without further testing or modification.
|
|
||||||
*
|
|
||||||
* @par
|
|
||||||
* Permission to use, copy, modify, and distribute this software and its
|
|
||||||
* documentation is hereby granted, under NXP Semiconductors' and its
|
|
||||||
* licensor's relevant copyrights in the software, without fee, provided that it
|
|
||||||
* is used in conjunction with NXP Semiconductors microcontrollers. This
|
|
||||||
* copyright, permission, and disclaimer notice must appear in all copies of
|
|
||||||
* this code.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef __FREERTOSCOMMONHOOKS_H_
|
|
||||||
#define __FREERTOSCOMMONHOOKS_H_
|
|
||||||
|
|
||||||
/** @ingroup FreeRTOS_COMMON
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Delay for the specified number of milliSeconds
|
|
||||||
* @param ms : Delay in milliSeconds
|
|
||||||
* @return Nothing
|
|
||||||
* @note Delays the specified number of milliSeoconds using a task delay
|
|
||||||
*/
|
|
||||||
void FreeRTOSDelay(uint32_t ms);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief FreeRTOS malloc fail hook
|
|
||||||
* @return Nothing
|
|
||||||
* @note This function is alled when a malloc fails to allocate data.
|
|
||||||
*/
|
|
||||||
void vApplicationMallocFailedHook(void);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief FreeRTOS application idle hook
|
|
||||||
* @return Nothing
|
|
||||||
* @note Calls ARM Wait for Interrupt function to idle core
|
|
||||||
*/
|
|
||||||
void vApplicationIdleHook(void);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief FreeRTOS stack overflow hook
|
|
||||||
* @param pxTask : Task handle that overflowed stack
|
|
||||||
* @param pcTaskName : Task name that overflowed stack
|
|
||||||
* @return Nothing
|
|
||||||
* @note This function is alled when a stack overflow occurs.
|
|
||||||
*/
|
|
||||||
void vApplicationStackOverflowHook(xTaskHandle pxTask, signed char *pcTaskName);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief FreeRTOS application tick hook
|
|
||||||
* @return Nothing
|
|
||||||
* @note This just returns to the caller.
|
|
||||||
*/
|
|
||||||
void vApplicationTickHook(void);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
#endif /* __FREERTOSCOMMONHOOKS_H_ */
|
|
||||||
@ -1,131 +0,0 @@
|
|||||||
/*
|
|
||||||
FreeRTOS V7.5.3 - Copyright (C) 2013 Real Time Engineers Ltd.
|
|
||||||
All rights reserved
|
|
||||||
|
|
||||||
VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION.
|
|
||||||
|
|
||||||
***************************************************************************
|
|
||||||
* *
|
|
||||||
* FreeRTOS provides completely free yet professionally developed, *
|
|
||||||
* robust, strictly quality controlled, supported, and cross *
|
|
||||||
* platform software that has become a de facto standard. *
|
|
||||||
* *
|
|
||||||
* Help yourself get started quickly and support the FreeRTOS *
|
|
||||||
* project by purchasing a FreeRTOS tutorial book, reference *
|
|
||||||
* manual, or both from: http://www.FreeRTOS.org/Documentation *
|
|
||||||
* *
|
|
||||||
* Thank you! *
|
|
||||||
* *
|
|
||||||
***************************************************************************
|
|
||||||
|
|
||||||
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 from the following
|
|
||||||
link: http://www.freertos.org/a00114.html
|
|
||||||
|
|
||||||
1 tab == 4 spaces!
|
|
||||||
|
|
||||||
***************************************************************************
|
|
||||||
* *
|
|
||||||
* Having a problem? Start by reading the FAQ "My application does *
|
|
||||||
* not run, what could be wrong?" *
|
|
||||||
* *
|
|
||||||
* http://www.FreeRTOS.org/FAQHelp.html *
|
|
||||||
* *
|
|
||||||
***************************************************************************
|
|
||||||
|
|
||||||
http://www.FreeRTOS.org - Documentation, books, training, latest versions,
|
|
||||||
license and Real Time Engineers Ltd. contact details.
|
|
||||||
|
|
||||||
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.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High
|
|
||||||
Integrity Systems to sell under the OpenRTOS brand. Low cost OpenRTOS
|
|
||||||
licenses offer ticketed support, indemnification and 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!
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Implementation of pvPortMalloc() and vPortFree() that relies on the
|
|
||||||
* compilers own malloc() and free() implementations.
|
|
||||||
*
|
|
||||||
* This file can only be used if the linker is configured to to generate
|
|
||||||
* a heap memory area.
|
|
||||||
*
|
|
||||||
* See heap_1.c, heap_2.c and heap_4.c for alternative implementations, and the
|
|
||||||
* memory management pages of http://www.FreeRTOS.org for more information.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <stdlib.h>
|
|
||||||
|
|
||||||
/* Defining MPU_WRAPPERS_INCLUDED_FROM_API_FILE prevents task.h from redefining
|
|
||||||
all the API functions to use the MPU wrappers. That should only be done when
|
|
||||||
task.h is included from an application file. */
|
|
||||||
#define MPU_WRAPPERS_INCLUDED_FROM_API_FILE
|
|
||||||
|
|
||||||
#include "FreeRTOS.h"
|
|
||||||
#include "task.h"
|
|
||||||
|
|
||||||
#undef MPU_WRAPPERS_INCLUDED_FROM_API_FILE
|
|
||||||
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
void *pvPortMalloc( size_t xWantedSize )
|
|
||||||
{
|
|
||||||
void *pvReturn;
|
|
||||||
|
|
||||||
vTaskSuspendAll();
|
|
||||||
{
|
|
||||||
pvReturn = malloc( xWantedSize );
|
|
||||||
traceMALLOC( pvReturn, xWantedSize );
|
|
||||||
}
|
|
||||||
xTaskResumeAll();
|
|
||||||
|
|
||||||
#if( configUSE_MALLOC_FAILED_HOOK == 1 )
|
|
||||||
{
|
|
||||||
if( pvReturn == NULL )
|
|
||||||
{
|
|
||||||
extern void vApplicationMallocFailedHook( void );
|
|
||||||
vApplicationMallocFailedHook();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
return pvReturn;
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
void vPortFree( void *pv )
|
|
||||||
{
|
|
||||||
if( pv )
|
|
||||||
{
|
|
||||||
vTaskSuspendAll();
|
|
||||||
{
|
|
||||||
free( pv );
|
|
||||||
traceFREE( pv, 0 );
|
|
||||||
}
|
|
||||||
xTaskResumeAll();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -1,204 +0,0 @@
|
|||||||
/*
|
|
||||||
FreeRTOS V7.5.3 - Copyright (C) 2013 Real Time Engineers Ltd.
|
|
||||||
All rights reserved
|
|
||||||
|
|
||||||
VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION.
|
|
||||||
|
|
||||||
***************************************************************************
|
|
||||||
* *
|
|
||||||
* FreeRTOS provides completely free yet professionally developed, *
|
|
||||||
* robust, strictly quality controlled, supported, and cross *
|
|
||||||
* platform software that has become a de facto standard. *
|
|
||||||
* *
|
|
||||||
* Help yourself get started quickly and support the FreeRTOS *
|
|
||||||
* project by purchasing a FreeRTOS tutorial book, reference *
|
|
||||||
* manual, or both from: http://www.FreeRTOS.org/Documentation *
|
|
||||||
* *
|
|
||||||
* Thank you! *
|
|
||||||
* *
|
|
||||||
***************************************************************************
|
|
||||||
|
|
||||||
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 from the following
|
|
||||||
link: http://www.freertos.org/a00114.html
|
|
||||||
|
|
||||||
1 tab == 4 spaces!
|
|
||||||
|
|
||||||
***************************************************************************
|
|
||||||
* *
|
|
||||||
* Having a problem? Start by reading the FAQ "My application does *
|
|
||||||
* not run, what could be wrong?" *
|
|
||||||
* *
|
|
||||||
* http://www.FreeRTOS.org/FAQHelp.html *
|
|
||||||
* *
|
|
||||||
***************************************************************************
|
|
||||||
|
|
||||||
http://www.FreeRTOS.org - Documentation, books, training, latest versions,
|
|
||||||
license and Real Time Engineers Ltd. contact details.
|
|
||||||
|
|
||||||
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.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High
|
|
||||||
Integrity Systems to sell under the OpenRTOS brand. Low cost OpenRTOS
|
|
||||||
licenses offer ticketed support, indemnification and 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!
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include "FreeRTOS.h"
|
|
||||||
#include "list.h"
|
|
||||||
|
|
||||||
/*-----------------------------------------------------------
|
|
||||||
* PUBLIC LIST API documented in list.h
|
|
||||||
*----------------------------------------------------------*/
|
|
||||||
|
|
||||||
void vListInitialise( xList * const pxList )
|
|
||||||
{
|
|
||||||
/* The list structure contains a list item which is used to mark the
|
|
||||||
end of the list. To initialise the list the list end is inserted
|
|
||||||
as the only list entry. */
|
|
||||||
pxList->pxIndex = ( xListItem * ) &( pxList->xListEnd ); /*lint !e826 !e740 The mini list structure is used as the list end to save RAM. This is checked and valid. */
|
|
||||||
|
|
||||||
/* The list end value is the highest possible value in the list to
|
|
||||||
ensure it remains at the end of the list. */
|
|
||||||
pxList->xListEnd.xItemValue = portMAX_DELAY;
|
|
||||||
|
|
||||||
/* The list end next and previous pointers point to itself so we know
|
|
||||||
when the list is empty. */
|
|
||||||
pxList->xListEnd.pxNext = ( xListItem * ) &( pxList->xListEnd ); /*lint !e826 !e740 The mini list structure is used as the list end to save RAM. This is checked and valid. */
|
|
||||||
pxList->xListEnd.pxPrevious = ( xListItem * ) &( pxList->xListEnd );/*lint !e826 !e740 The mini list structure is used as the list end to save RAM. This is checked and valid. */
|
|
||||||
|
|
||||||
pxList->uxNumberOfItems = ( unsigned portBASE_TYPE ) 0U;
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
void vListInitialiseItem( xListItem * const pxItem )
|
|
||||||
{
|
|
||||||
/* Make sure the list item is not recorded as being on a list. */
|
|
||||||
pxItem->pvContainer = NULL;
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
void vListInsertEnd( xList * const pxList, xListItem * const pxNewListItem )
|
|
||||||
{
|
|
||||||
xListItem * pxIndex;
|
|
||||||
|
|
||||||
/* Insert a new list item into pxList, but rather than sort the list,
|
|
||||||
makes the new list item the last item to be removed by a call to
|
|
||||||
pvListGetOwnerOfNextEntry. */
|
|
||||||
pxIndex = pxList->pxIndex;
|
|
||||||
|
|
||||||
pxNewListItem->pxNext = pxIndex;
|
|
||||||
pxNewListItem->pxPrevious = pxIndex->pxPrevious;
|
|
||||||
pxIndex->pxPrevious->pxNext = pxNewListItem;
|
|
||||||
pxIndex->pxPrevious = pxNewListItem;
|
|
||||||
|
|
||||||
/* Remember which list the item is in. */
|
|
||||||
pxNewListItem->pvContainer = ( void * ) pxList;
|
|
||||||
|
|
||||||
( pxList->uxNumberOfItems )++;
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
void vListInsert( xList * const pxList, xListItem * const pxNewListItem )
|
|
||||||
{
|
|
||||||
xListItem *pxIterator;
|
|
||||||
portTickType xValueOfInsertion;
|
|
||||||
|
|
||||||
/* Insert the new list item into the list, sorted in ulListItem order. */
|
|
||||||
xValueOfInsertion = pxNewListItem->xItemValue;
|
|
||||||
|
|
||||||
/* If the list already contains a list item with the same item value then
|
|
||||||
the new list item should be placed after it. This ensures that TCB's which
|
|
||||||
are stored in ready lists (all of which have the same ulListItem value)
|
|
||||||
get an equal share of the CPU. However, if the xItemValue is the same as
|
|
||||||
the back marker the iteration loop below will not end. This means we need
|
|
||||||
to guard against this by checking the value first and modifying the
|
|
||||||
algorithm slightly if necessary. */
|
|
||||||
if( xValueOfInsertion == portMAX_DELAY )
|
|
||||||
{
|
|
||||||
pxIterator = pxList->xListEnd.pxPrevious;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
/* *** NOTE ***********************************************************
|
|
||||||
If you find your application is crashing here then likely causes are:
|
|
||||||
1) Stack overflow -
|
|
||||||
see http://www.freertos.org/Stacks-and-stack-overflow-checking.html
|
|
||||||
2) Incorrect interrupt priority assignment, especially on Cortex-M3
|
|
||||||
parts where numerically high priority values denote low actual
|
|
||||||
interrupt priories, which can seem counter intuitive. See
|
|
||||||
configMAX_SYSCALL_INTERRUPT_PRIORITY on http://www.freertos.org/a00110.html
|
|
||||||
3) Calling an API function from within a critical section or when
|
|
||||||
the scheduler is suspended, or calling an API function that does
|
|
||||||
not end in "FromISR" from an interrupt.
|
|
||||||
4) Using a queue or semaphore before it has been initialised or
|
|
||||||
before the scheduler has been started (are interrupts firing
|
|
||||||
before vTaskStartScheduler() has been called?).
|
|
||||||
See http://www.freertos.org/FAQHelp.html for more tips.
|
|
||||||
**********************************************************************/
|
|
||||||
|
|
||||||
for( pxIterator = ( xListItem * ) &( pxList->xListEnd ); pxIterator->pxNext->xItemValue <= xValueOfInsertion; pxIterator = pxIterator->pxNext ) /*lint !e826 !e740 The mini list structure is used as the list end to save RAM. This is checked and valid. */
|
|
||||||
{
|
|
||||||
/* There is nothing to do here, we are just iterating to the
|
|
||||||
wanted insertion position. */
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pxNewListItem->pxNext = pxIterator->pxNext;
|
|
||||||
pxNewListItem->pxNext->pxPrevious = pxNewListItem;
|
|
||||||
pxNewListItem->pxPrevious = pxIterator;
|
|
||||||
pxIterator->pxNext = pxNewListItem;
|
|
||||||
|
|
||||||
/* Remember which list the item is in. This allows fast removal of the
|
|
||||||
item later. */
|
|
||||||
pxNewListItem->pvContainer = ( void * ) pxList;
|
|
||||||
|
|
||||||
( pxList->uxNumberOfItems )++;
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
unsigned portBASE_TYPE uxListRemove( xListItem * const pxItemToRemove )
|
|
||||||
{
|
|
||||||
xList * pxList;
|
|
||||||
|
|
||||||
pxItemToRemove->pxNext->pxPrevious = pxItemToRemove->pxPrevious;
|
|
||||||
pxItemToRemove->pxPrevious->pxNext = pxItemToRemove->pxNext;
|
|
||||||
|
|
||||||
/* The list item knows which list it is in. Obtain the list from the list
|
|
||||||
item. */
|
|
||||||
pxList = ( xList * ) pxItemToRemove->pvContainer;
|
|
||||||
|
|
||||||
/* Make sure the index is left pointing to a valid item. */
|
|
||||||
if( pxList->pxIndex == pxItemToRemove )
|
|
||||||
{
|
|
||||||
pxList->pxIndex = pxItemToRemove->pxPrevious;
|
|
||||||
}
|
|
||||||
|
|
||||||
pxItemToRemove->pvContainer = NULL;
|
|
||||||
( pxList->uxNumberOfItems )--;
|
|
||||||
|
|
||||||
return pxList->uxNumberOfItems;
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
@ -1,366 +0,0 @@
|
|||||||
/*
|
|
||||||
FreeRTOS V7.5.3 - Copyright (C) 2013 Real Time Engineers Ltd.
|
|
||||||
All rights reserved
|
|
||||||
|
|
||||||
VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION.
|
|
||||||
|
|
||||||
***************************************************************************
|
|
||||||
* *
|
|
||||||
* FreeRTOS provides completely free yet professionally developed, *
|
|
||||||
* robust, strictly quality controlled, supported, and cross *
|
|
||||||
* platform software that has become a de facto standard. *
|
|
||||||
* *
|
|
||||||
* Help yourself get started quickly and support the FreeRTOS *
|
|
||||||
* project by purchasing a FreeRTOS tutorial book, reference *
|
|
||||||
* manual, or both from: http://www.FreeRTOS.org/Documentation *
|
|
||||||
* *
|
|
||||||
* Thank you! *
|
|
||||||
* *
|
|
||||||
***************************************************************************
|
|
||||||
|
|
||||||
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 from the following
|
|
||||||
link: http://www.freertos.org/a00114.html
|
|
||||||
|
|
||||||
1 tab == 4 spaces!
|
|
||||||
|
|
||||||
***************************************************************************
|
|
||||||
* *
|
|
||||||
* Having a problem? Start by reading the FAQ "My application does *
|
|
||||||
* not run, what could be wrong?" *
|
|
||||||
* *
|
|
||||||
* http://www.FreeRTOS.org/FAQHelp.html *
|
|
||||||
* *
|
|
||||||
***************************************************************************
|
|
||||||
|
|
||||||
http://www.FreeRTOS.org - Documentation, books, training, latest versions,
|
|
||||||
license and Real Time Engineers Ltd. contact details.
|
|
||||||
|
|
||||||
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.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High
|
|
||||||
Integrity Systems to sell under the OpenRTOS brand. Low cost OpenRTOS
|
|
||||||
licenses offer ticketed support, indemnification and 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!
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*-----------------------------------------------------------
|
|
||||||
* Implementation of functions defined in portable.h for the ARM CM0 port.
|
|
||||||
*----------------------------------------------------------*/
|
|
||||||
|
|
||||||
/* Scheduler includes. */
|
|
||||||
#include "FreeRTOS.h"
|
|
||||||
#include "task.h"
|
|
||||||
|
|
||||||
/* Constants required to manipulate the NVIC. */
|
|
||||||
#define portNVIC_SYSTICK_CTRL ( ( volatile unsigned long *) 0xe000e010 )
|
|
||||||
#define portNVIC_SYSTICK_LOAD ( ( volatile unsigned long *) 0xe000e014 )
|
|
||||||
#define portNVIC_INT_CTRL ( ( volatile unsigned long *) 0xe000ed04 )
|
|
||||||
#define portNVIC_SYSPRI2 ( ( volatile unsigned long *) 0xe000ed20 )
|
|
||||||
#define portNVIC_SYSTICK_CLK 0x00000004
|
|
||||||
#define portNVIC_SYSTICK_INT 0x00000002
|
|
||||||
#define portNVIC_SYSTICK_ENABLE 0x00000001
|
|
||||||
#define portNVIC_PENDSVSET 0x10000000
|
|
||||||
#define portMIN_INTERRUPT_PRIORITY ( 255UL )
|
|
||||||
#define portNVIC_PENDSV_PRI ( portMIN_INTERRUPT_PRIORITY << 16UL )
|
|
||||||
#define portNVIC_SYSTICK_PRI ( portMIN_INTERRUPT_PRIORITY << 24UL )
|
|
||||||
|
|
||||||
/* Constants required to set up the initial stack. */
|
|
||||||
#define portINITIAL_XPSR ( 0x01000000 )
|
|
||||||
|
|
||||||
/* Let the user override the pre-loading of the initial LR with the address of
|
|
||||||
prvTaskExitError() in case is messes up unwinding of the stack in the
|
|
||||||
debugger. */
|
|
||||||
#ifdef configTASK_RETURN_ADDRESS
|
|
||||||
#define portTASK_RETURN_ADDRESS configTASK_RETURN_ADDRESS
|
|
||||||
#else
|
|
||||||
#define portTASK_RETURN_ADDRESS prvTaskExitError
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Each task maintains its own interrupt status in the critical nesting
|
|
||||||
variable. */
|
|
||||||
static unsigned portBASE_TYPE uxCriticalNesting = 0xaaaaaaaa;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Setup the timer to generate the tick interrupts.
|
|
||||||
*/
|
|
||||||
static void prvSetupTimerInterrupt( void );
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Exception handlers.
|
|
||||||
*/
|
|
||||||
void xPortPendSVHandler( void ) __attribute__ (( naked ));
|
|
||||||
void xPortSysTickHandler( void );
|
|
||||||
void vPortSVCHandler( void ) __attribute__ (( naked ));
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Start first task is a separate function so it can be tested in isolation.
|
|
||||||
*/
|
|
||||||
static void vPortStartFirstTask( void ) __attribute__ (( naked ));
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Used to catch tasks that attempt to return from their implementing function.
|
|
||||||
*/
|
|
||||||
static void prvTaskExitError( void );
|
|
||||||
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* See header file for description.
|
|
||||||
*/
|
|
||||||
portSTACK_TYPE *pxPortInitialiseStack( portSTACK_TYPE *pxTopOfStack, pdTASK_CODE pxCode, void *pvParameters )
|
|
||||||
{
|
|
||||||
/* Simulate the stack frame as it would be created by a context switch
|
|
||||||
interrupt. */
|
|
||||||
pxTopOfStack--; /* Offset added to account for the way the MCU uses the stack on entry/exit of interrupts. */
|
|
||||||
*pxTopOfStack = portINITIAL_XPSR; /* xPSR */
|
|
||||||
pxTopOfStack--;
|
|
||||||
*pxTopOfStack = ( portSTACK_TYPE ) pxCode; /* PC */
|
|
||||||
pxTopOfStack--;
|
|
||||||
*pxTopOfStack = ( portSTACK_TYPE ) portTASK_RETURN_ADDRESS; /* LR */
|
|
||||||
pxTopOfStack -= 5; /* R12, R3, R2 and R1. */
|
|
||||||
*pxTopOfStack = ( portSTACK_TYPE ) pvParameters; /* R0 */
|
|
||||||
pxTopOfStack -= 8; /* R11..R4. */
|
|
||||||
|
|
||||||
return pxTopOfStack;
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
static void prvTaskExitError( void )
|
|
||||||
{
|
|
||||||
/* A function that implements a task must not exit or attempt to return to
|
|
||||||
its caller as there is nothing to return to. If a task wants to exit it
|
|
||||||
should instead call vTaskDelete( NULL ).
|
|
||||||
|
|
||||||
Artificially force an assert() to be triggered if configASSERT() is
|
|
||||||
defined, then stop here so application writers can catch the error. */
|
|
||||||
configASSERT( uxCriticalNesting == ~0UL );
|
|
||||||
portDISABLE_INTERRUPTS();
|
|
||||||
for( ;; );
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
void vPortSVCHandler( void )
|
|
||||||
{
|
|
||||||
__asm volatile (
|
|
||||||
" ldr r3, pxCurrentTCBConst2 \n" /* Restore the context. */
|
|
||||||
" ldr r1, [r3] \n" /* Use pxCurrentTCBConst to get the pxCurrentTCB address. */
|
|
||||||
" ldr r0, [r1] \n" /* The first item in pxCurrentTCB is the task top of stack. */
|
|
||||||
" add r0, r0, #16 \n" /* Move to the high registers. */
|
|
||||||
" ldmia r0!, {r4-r7} \n" /* Pop the high registers. */
|
|
||||||
" mov r8, r4 \n"
|
|
||||||
" mov r9, r5 \n"
|
|
||||||
" mov r10, r6 \n"
|
|
||||||
" mov r11, r7 \n"
|
|
||||||
" \n"
|
|
||||||
" msr psp, r0 \n" /* Remember the new top of stack for the task. */
|
|
||||||
" \n"
|
|
||||||
" sub r0, r0, #32 \n" /* Go back for the low registers that are not automatically restored. */
|
|
||||||
" ldmia r0!, {r4-r7} \n" /* Pop low registers. */
|
|
||||||
" mov r1, r14 \n" /* OR R14 with 0x0d. */
|
|
||||||
" movs r0, #0x0d \n"
|
|
||||||
" orr r1, r0 \n"
|
|
||||||
" bx r1 \n"
|
|
||||||
" \n"
|
|
||||||
" .align 2 \n"
|
|
||||||
"pxCurrentTCBConst2: .word pxCurrentTCB \n"
|
|
||||||
);
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
void vPortStartFirstTask( void )
|
|
||||||
{
|
|
||||||
/* The MSP stack is not reset as, unlike on M3/4 parts, there is no vector
|
|
||||||
table offset register that can be used to locate the initial stack value.
|
|
||||||
Not all M0 parts have the application vector table at address 0. */
|
|
||||||
__asm volatile(
|
|
||||||
" cpsie i \n" /* Globally enable interrupts. */
|
|
||||||
" svc 0 \n" /* System call to start first task. */
|
|
||||||
" nop \n"
|
|
||||||
);
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* See header file for description.
|
|
||||||
*/
|
|
||||||
portBASE_TYPE xPortStartScheduler( void )
|
|
||||||
{
|
|
||||||
/* Make PendSV, CallSV and SysTick the same priroity as the kernel. */
|
|
||||||
*(portNVIC_SYSPRI2) |= portNVIC_PENDSV_PRI;
|
|
||||||
*(portNVIC_SYSPRI2) |= portNVIC_SYSTICK_PRI;
|
|
||||||
|
|
||||||
/* Start the timer that generates the tick ISR. Interrupts are disabled
|
|
||||||
here already. */
|
|
||||||
prvSetupTimerInterrupt();
|
|
||||||
|
|
||||||
/* Initialise the critical nesting count ready for the first task. */
|
|
||||||
uxCriticalNesting = 0;
|
|
||||||
|
|
||||||
/* Start the first task. */
|
|
||||||
vPortStartFirstTask();
|
|
||||||
|
|
||||||
/* Should not get here! */
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
void vPortEndScheduler( void )
|
|
||||||
{
|
|
||||||
/* It is unlikely that the CM0 port will require this function as there
|
|
||||||
is nothing to return to. */
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
void vPortYield( void )
|
|
||||||
{
|
|
||||||
/* Set a PendSV to request a context switch. */
|
|
||||||
*( portNVIC_INT_CTRL ) = portNVIC_PENDSVSET;
|
|
||||||
|
|
||||||
/* Barriers are normally not required but do ensure the code is completely
|
|
||||||
within the specified behaviour for the architecture. */
|
|
||||||
__asm volatile( "dsb" );
|
|
||||||
__asm volatile( "isb" );
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
void vPortEnterCritical( void )
|
|
||||||
{
|
|
||||||
portDISABLE_INTERRUPTS();
|
|
||||||
uxCriticalNesting++;
|
|
||||||
__asm volatile( "dsb" );
|
|
||||||
__asm volatile( "isb" );
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
void vPortExitCritical( void )
|
|
||||||
{
|
|
||||||
uxCriticalNesting--;
|
|
||||||
if( uxCriticalNesting == 0 )
|
|
||||||
{
|
|
||||||
portENABLE_INTERRUPTS();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
unsigned long ulSetInterruptMaskFromISR( void )
|
|
||||||
{
|
|
||||||
__asm volatile(
|
|
||||||
" mrs r0, PRIMASK \n"
|
|
||||||
" cpsid i \n"
|
|
||||||
" bx lr "
|
|
||||||
);
|
|
||||||
|
|
||||||
/* To avoid compiler warnings. This line will never be reached. */
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
void vClearInterruptMaskFromISR( unsigned long ulMask )
|
|
||||||
{
|
|
||||||
__asm volatile(
|
|
||||||
" msr PRIMASK, r0 \n"
|
|
||||||
" bx lr "
|
|
||||||
);
|
|
||||||
|
|
||||||
/* Just to avoid compiler warning. */
|
|
||||||
( void ) ulMask;
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
void xPortPendSVHandler( void )
|
|
||||||
{
|
|
||||||
/* This is a naked function. */
|
|
||||||
|
|
||||||
__asm volatile
|
|
||||||
(
|
|
||||||
" mrs r0, psp \n"
|
|
||||||
" \n"
|
|
||||||
" ldr r3, pxCurrentTCBConst \n" /* Get the location of the current TCB. */
|
|
||||||
" ldr r2, [r3] \n"
|
|
||||||
" \n"
|
|
||||||
" sub r0, r0, #32 \n" /* Make space for the remaining low registers. */
|
|
||||||
" str r0, [r2] \n" /* Save the new top of stack. */
|
|
||||||
" stmia r0!, {r4-r7} \n" /* Store the low registers that are not saved automatically. */
|
|
||||||
" mov r4, r8 \n" /* Store the high registers. */
|
|
||||||
" mov r5, r9 \n"
|
|
||||||
" mov r6, r10 \n"
|
|
||||||
" mov r7, r11 \n"
|
|
||||||
" stmia r0!, {r4-r7} \n"
|
|
||||||
" \n"
|
|
||||||
" push {r3, r14} \n"
|
|
||||||
" cpsid i \n"
|
|
||||||
" bl vTaskSwitchContext \n"
|
|
||||||
" cpsie i \n"
|
|
||||||
" pop {r2, r3} \n" /* lr goes in r3. r2 now holds tcb pointer. */
|
|
||||||
" \n"
|
|
||||||
" ldr r1, [r2] \n"
|
|
||||||
" ldr r0, [r1] \n" /* The first item in pxCurrentTCB is the task top of stack. */
|
|
||||||
" add r0, r0, #16 \n" /* Move to the high registers. */
|
|
||||||
" ldmia r0!, {r4-r7} \n" /* Pop the high registers. */
|
|
||||||
" mov r8, r4 \n"
|
|
||||||
" mov r9, r5 \n"
|
|
||||||
" mov r10, r6 \n"
|
|
||||||
" mov r11, r7 \n"
|
|
||||||
" \n"
|
|
||||||
" msr psp, r0 \n" /* Remember the new top of stack for the task. */
|
|
||||||
" \n"
|
|
||||||
" sub r0, r0, #32 \n" /* Go back for the low registers that are not automatically restored. */
|
|
||||||
" ldmia r0!, {r4-r7} \n" /* Pop low registers. */
|
|
||||||
" \n"
|
|
||||||
" bx r3 \n"
|
|
||||||
" \n"
|
|
||||||
" .align 2 \n"
|
|
||||||
"pxCurrentTCBConst: .word pxCurrentTCB "
|
|
||||||
);
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
void xPortSysTickHandler( void )
|
|
||||||
{
|
|
||||||
unsigned long ulPreviousMask;
|
|
||||||
|
|
||||||
ulPreviousMask = portSET_INTERRUPT_MASK_FROM_ISR();
|
|
||||||
{
|
|
||||||
/* Increment the RTOS tick. */
|
|
||||||
if( xTaskIncrementTick() != pdFALSE )
|
|
||||||
{
|
|
||||||
/* Pend a context switch. */
|
|
||||||
*(portNVIC_INT_CTRL) = portNVIC_PENDSVSET;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
portCLEAR_INTERRUPT_MASK_FROM_ISR( ulPreviousMask );
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Setup the systick timer to generate the tick interrupts at the required
|
|
||||||
* frequency.
|
|
||||||
*/
|
|
||||||
void prvSetupTimerInterrupt( void )
|
|
||||||
{
|
|
||||||
/* Configure SysTick to interrupt at the requested rate. */
|
|
||||||
*(portNVIC_SYSTICK_LOAD) = ( configCPU_CLOCK_HZ / configTICK_RATE_HZ ) - 1UL;
|
|
||||||
*(portNVIC_SYSTICK_CTRL) = portNVIC_SYSTICK_CLK | portNVIC_SYSTICK_INT | portNVIC_SYSTICK_ENABLE;
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -1,12 +0,0 @@
|
|||||||
Example description
|
|
||||||
Welcome to the FreeRTOS basic blinky example. This example starts up
|
|
||||||
FreeRTOS and creates 3 tasks that blink LEDs at different rates.
|
|
||||||
|
|
||||||
Special connection requirements
|
|
||||||
There are no special connection requirements for this example.
|
|
||||||
|
|
||||||
|
|
||||||
Supported boards and board setup:
|
|
||||||
LPCOPEN_11U6X_BOARD_LPCXPRESSO_11U68
|
|
||||||
LPCOPEN_11U6X_BOARD_MANLEY_11U68
|
|
||||||
|
|
||||||
Loading…
x
Reference in New Issue
Block a user