Save local changes (4 yrs later)
This commit is contained in:
parent
4e9d7b1334
commit
8111d591cb
60 changed files with 2039 additions and 279 deletions
36
.cproject
36
.cproject
|
@ -19,13 +19,13 @@
|
||||||
<toolChain id="com.st.stm32cube.ide.mcu.gnu.managedbuild.toolchain.exe.debug.532628310" name="MCU ARM GCC" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.toolchain.exe.debug">
|
<toolChain id="com.st.stm32cube.ide.mcu.gnu.managedbuild.toolchain.exe.debug.532628310" name="MCU ARM GCC" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.toolchain.exe.debug">
|
||||||
<option id="com.st.stm32cube.ide.mcu.option.internal.toolchain.type.652511941" name="Internal Toolchain Type" superClass="com.st.stm32cube.ide.mcu.option.internal.toolchain.type" useByScannerDiscovery="false" value="com.st.stm32cube.ide.mcu.gnu.managedbuild.toolchain.base.gnu-tools-for-stm32" valueType="string"/>
|
<option id="com.st.stm32cube.ide.mcu.option.internal.toolchain.type.652511941" name="Internal Toolchain Type" superClass="com.st.stm32cube.ide.mcu.option.internal.toolchain.type" useByScannerDiscovery="false" value="com.st.stm32cube.ide.mcu.gnu.managedbuild.toolchain.base.gnu-tools-for-stm32" valueType="string"/>
|
||||||
<option id="com.st.stm32cube.ide.mcu.option.internal.toolchain.version.1135102548" name="Internal Toolchain Version" superClass="com.st.stm32cube.ide.mcu.option.internal.toolchain.version" useByScannerDiscovery="false" value="7-2018-q2-update" valueType="string"/>
|
<option id="com.st.stm32cube.ide.mcu.option.internal.toolchain.version.1135102548" name="Internal Toolchain Version" superClass="com.st.stm32cube.ide.mcu.option.internal.toolchain.version" useByScannerDiscovery="false" value="7-2018-q2-update" valueType="string"/>
|
||||||
<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_mcu.600661023" name="Mcu" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_mcu" useByScannerDiscovery="true" value="STM32F407VETx" valueType="string"/>
|
<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_mcu.600661023" name="MCU" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_mcu" useByScannerDiscovery="true" value="STM32F407VETx" valueType="string"/>
|
||||||
<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_cpuid.613077227" name="CpuId" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_cpuid" useByScannerDiscovery="false" value="0" valueType="string"/>
|
<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_cpuid.613077227" name="CPU" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_cpuid" useByScannerDiscovery="false" value="0" valueType="string"/>
|
||||||
<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_coreid.1956238722" name="CpuCoreId" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_coreid" useByScannerDiscovery="false" value="0" valueType="string"/>
|
<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_coreid.1956238722" name="Core" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_coreid" useByScannerDiscovery="false" value="0" valueType="string"/>
|
||||||
<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.fpu.1705263492" name="Floating-point unit" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.fpu" useByScannerDiscovery="true" value="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.fpu.value.fpv4-sp-d16" valueType="enumerated"/>
|
<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.fpu.1705263492" name="Floating-point unit" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.fpu" useByScannerDiscovery="true" value="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.fpu.value.fpv4-sp-d16" valueType="enumerated"/>
|
||||||
<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.floatabi.1475171026" name="Floating-point ABI" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.floatabi" useByScannerDiscovery="true" value="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.floatabi.value.hard" valueType="enumerated"/>
|
<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.floatabi.1475171026" name="Floating-point ABI" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.floatabi" useByScannerDiscovery="true" value="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.floatabi.value.hard" valueType="enumerated"/>
|
||||||
<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_board.190661663" name="Board" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_board" useByScannerDiscovery="false" value="genericBoard" valueType="string"/>
|
<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_board.190661663" name="Board" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_board" useByScannerDiscovery="false" value="genericBoard" valueType="string"/>
|
||||||
<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.defaults.1164886640" name="Defaults" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.defaults" useByScannerDiscovery="false" value="com.st.stm32cube.ide.common.services.build.inputs.revA.1.0.5 || Debug || true || Executable || com.st.stm32cube.ide.mcu.gnu.managedbuild.toolchain.base.gnu-tools-for-stm32 || STM32F407VETx || 0 || 0 || arm-none-eabi- || ${gnu_tools_for_stm32_compiler_path} || ../Inc | ../Drivers/CMSIS/Include | ../Drivers/STM32F4xx_HAL_Driver/Inc | ../Drivers/CMSIS/Device/ST/STM32F4xx/Include | ../Drivers/STM32F4xx_HAL_Driver/Inc/Legacy || ../ || || USE_HAL_DRIVER | USE_FULL_LL_DRIVER | STM32F407xx || || Drivers | Src | Startup || || || ${workspace_loc:/${ProjName}/STM32F407VETX_FLASH.ld} || true || NonSecure || || secure_nsclib.o || || None || " valueType="string"/>
|
<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.defaults.1164886640" name="Defaults" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.defaults" useByScannerDiscovery="false" value="com.st.stm32cube.ide.common.services.build.inputs.revA.1.0.5 || Debug || true || Executable || com.st.stm32cube.ide.mcu.gnu.managedbuild.toolchain.base.gnu-tools-for-stm32 || STM32F407VETx || 0 || 0 || arm-none-eabi- || ${gnu_tools_for_stm32_compiler_path} || ../Middlewares/Third_Party/FreeRTOS/Source/include | ../Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F | ../Drivers/CMSIS/Include | ../Drivers/STM32F4xx_HAL_Driver/Inc | ../Drivers/CMSIS/Device/ST/STM32F4xx/Include | ../Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS_V2 | ../Drivers/STM32F4xx_HAL_Driver/Inc/Legacy | ../Core/Inc || ../ || || USE_HAL_DRIVER | USE_FULL_LL_DRIVER | STM32F407xx || || Drivers | Core/Startup | Middlewares | Core || || || ${workspace_loc:/${ProjName}/STM32F407VETX_FLASH.ld} || true || NonSecure || || secure_nsclib.o || || None || " valueType="string"/>
|
||||||
<targetPlatform archList="all" binaryParser="org.eclipse.cdt.core.ELF" id="com.st.stm32cube.ide.mcu.gnu.managedbuild.targetplatform.1035939565" isAbstract="false" osList="all" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.targetplatform"/>
|
<targetPlatform archList="all" binaryParser="org.eclipse.cdt.core.ELF" id="com.st.stm32cube.ide.mcu.gnu.managedbuild.targetplatform.1035939565" isAbstract="false" osList="all" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.targetplatform"/>
|
||||||
<builder buildPath="${workspace_loc:/F407_test}/Debug" id="com.st.stm32cube.ide.mcu.gnu.managedbuild.builder.1825032861" keepEnvironmentInBuildfile="false" managedBuildOn="true" name="Gnu Make Builder" parallelBuildOn="true" parallelizationNumber="optimal" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.builder"/>
|
<builder buildPath="${workspace_loc:/F407_test}/Debug" id="com.st.stm32cube.ide.mcu.gnu.managedbuild.builder.1825032861" keepEnvironmentInBuildfile="false" managedBuildOn="true" name="Gnu Make Builder" parallelBuildOn="true" parallelizationNumber="optimal" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.builder"/>
|
||||||
<tool id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.assembler.1085634518" name="MCU GCC Assembler" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.assembler">
|
<tool id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.assembler.1085634518" name="MCU GCC Assembler" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.assembler">
|
||||||
|
@ -33,7 +33,7 @@
|
||||||
<option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.assembler.option.includepaths.1727002756" name="Include paths (-I)" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.assembler.option.includepaths" valueType="includePath">
|
<option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.assembler.option.includepaths.1727002756" name="Include paths (-I)" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.assembler.option.includepaths" valueType="includePath">
|
||||||
<listOptionValue builtIn="false" value="../"/>
|
<listOptionValue builtIn="false" value="../"/>
|
||||||
</option>
|
</option>
|
||||||
<option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.assembler.option.definedsymbols.1852778643" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.assembler.option.definedsymbols" valueType="definedSymbols">
|
<option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.assembler.option.definedsymbols.1852778643" name="Define symbols (-D)" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.assembler.option.definedsymbols" valueType="definedSymbols">
|
||||||
<listOptionValue builtIn="false" value="DEBUG"/>
|
<listOptionValue builtIn="false" value="DEBUG"/>
|
||||||
</option>
|
</option>
|
||||||
<inputType id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.assembler.input.372114373" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.assembler.input"/>
|
<inputType id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.assembler.input.372114373" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.assembler.input"/>
|
||||||
|
@ -48,7 +48,6 @@
|
||||||
<listOptionValue builtIn="false" value="STM32F407xx"/>
|
<listOptionValue builtIn="false" value="STM32F407xx"/>
|
||||||
</option>
|
</option>
|
||||||
<option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.option.includepaths.1950099691" name="Include paths (-I)" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.option.includepaths" useByScannerDiscovery="false" valueType="includePath">
|
<option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.option.includepaths.1950099691" name="Include paths (-I)" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.option.includepaths" useByScannerDiscovery="false" valueType="includePath">
|
||||||
<listOptionValue builtIn="false" value="../Inc"/>
|
|
||||||
<listOptionValue builtIn="false" value="../Drivers/CMSIS/Include"/>
|
<listOptionValue builtIn="false" value="../Drivers/CMSIS/Include"/>
|
||||||
<listOptionValue builtIn="false" value="../Drivers/STM32F4xx_HAL_Driver/Inc"/>
|
<listOptionValue builtIn="false" value="../Drivers/STM32F4xx_HAL_Driver/Inc"/>
|
||||||
<listOptionValue builtIn="false" value="../Drivers/CMSIS/Device/ST/STM32F4xx/Include"/>
|
<listOptionValue builtIn="false" value="../Drivers/CMSIS/Device/ST/STM32F4xx/Include"/>
|
||||||
|
@ -59,6 +58,7 @@
|
||||||
<listOptionValue builtIn="false" value="../Middlewares/Third_Party/FreeRTOS/Source/include"/>
|
<listOptionValue builtIn="false" value="../Middlewares/Third_Party/FreeRTOS/Source/include"/>
|
||||||
<listOptionValue builtIn="false" value="../Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS_V2"/>
|
<listOptionValue builtIn="false" value="../Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS_V2"/>
|
||||||
<listOptionValue builtIn="false" value="../Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F"/>
|
<listOptionValue builtIn="false" value="../Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F"/>
|
||||||
|
<listOptionValue builtIn="false" value="../Core/Inc"/>
|
||||||
</option>
|
</option>
|
||||||
<inputType id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.input.c.1241302501" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.input.c"/>
|
<inputType id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.input.c.1241302501" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.input.c"/>
|
||||||
</tool>
|
</tool>
|
||||||
|
@ -66,7 +66,6 @@
|
||||||
<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.cpp.compiler.option.debuglevel.255026093" name="Debug level" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.cpp.compiler.option.debuglevel" useByScannerDiscovery="false" value="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.cpp.compiler.option.debuglevel.value.g3" valueType="enumerated"/>
|
<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.cpp.compiler.option.debuglevel.255026093" name="Debug level" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.cpp.compiler.option.debuglevel" useByScannerDiscovery="false" value="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.cpp.compiler.option.debuglevel.value.g3" valueType="enumerated"/>
|
||||||
<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.cpp.compiler.option.optimization.level.1414906794" name="Optimization level" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.cpp.compiler.option.optimization.level" useByScannerDiscovery="false"/>
|
<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.cpp.compiler.option.optimization.level.1414906794" name="Optimization level" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.cpp.compiler.option.optimization.level" useByScannerDiscovery="false"/>
|
||||||
<option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.cpp.compiler.option.includepaths.310754502" name="Include paths (-I)" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.cpp.compiler.option.includepaths" useByScannerDiscovery="false" valueType="includePath">
|
<option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.cpp.compiler.option.includepaths.310754502" name="Include paths (-I)" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.cpp.compiler.option.includepaths" useByScannerDiscovery="false" valueType="includePath">
|
||||||
<listOptionValue builtIn="false" value="../Inc"/>
|
|
||||||
<listOptionValue builtIn="false" value="../Drivers/CMSIS/Include"/>
|
<listOptionValue builtIn="false" value="../Drivers/CMSIS/Include"/>
|
||||||
<listOptionValue builtIn="false" value="../Drivers/STM32F4xx_HAL_Driver/Inc"/>
|
<listOptionValue builtIn="false" value="../Drivers/STM32F4xx_HAL_Driver/Inc"/>
|
||||||
<listOptionValue builtIn="false" value="../Drivers/CMSIS/Device/ST/STM32F4xx/Include"/>
|
<listOptionValue builtIn="false" value="../Drivers/CMSIS/Device/ST/STM32F4xx/Include"/>
|
||||||
|
@ -77,6 +76,7 @@
|
||||||
<listOptionValue builtIn="false" value="../Middlewares/Third_Party/FreeRTOS/Source/include"/>
|
<listOptionValue builtIn="false" value="../Middlewares/Third_Party/FreeRTOS/Source/include"/>
|
||||||
<listOptionValue builtIn="false" value="../Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS_V2"/>
|
<listOptionValue builtIn="false" value="../Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS_V2"/>
|
||||||
<listOptionValue builtIn="false" value="../Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F"/>
|
<listOptionValue builtIn="false" value="../Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F"/>
|
||||||
|
<listOptionValue builtIn="false" value="../Core/Inc"/>
|
||||||
</option>
|
</option>
|
||||||
<option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.cpp.compiler.option.definedsymbols.1413855680" name="Define symbols (-D)" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.cpp.compiler.option.definedsymbols" useByScannerDiscovery="false" valueType="definedSymbols">
|
<option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.cpp.compiler.option.definedsymbols.1413855680" name="Define symbols (-D)" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.cpp.compiler.option.definedsymbols" useByScannerDiscovery="false" valueType="definedSymbols">
|
||||||
<listOptionValue builtIn="false" value="USE_HAL_DRIVER"/>
|
<listOptionValue builtIn="false" value="USE_HAL_DRIVER"/>
|
||||||
|
@ -112,12 +112,11 @@
|
||||||
</toolChain>
|
</toolChain>
|
||||||
</folderInfo>
|
</folderInfo>
|
||||||
<sourceEntries>
|
<sourceEntries>
|
||||||
<entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="Startup"/>
|
|
||||||
<entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="App"/>
|
<entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="App"/>
|
||||||
<entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="Src"/>
|
<entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="Core"/>
|
||||||
<entry excluding="test" flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="platforms"/>
|
<entry excluding="test" flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="platforms"/>
|
||||||
<entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="components"/>
|
|
||||||
<entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="Middlewares"/>
|
<entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="Middlewares"/>
|
||||||
|
<entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="components"/>
|
||||||
<entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="Drivers"/>
|
<entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="Drivers"/>
|
||||||
</sourceEntries>
|
</sourceEntries>
|
||||||
</configuration>
|
</configuration>
|
||||||
|
@ -142,13 +141,13 @@
|
||||||
<toolChain id="com.st.stm32cube.ide.mcu.gnu.managedbuild.toolchain.exe.release.1251221725" name="MCU ARM GCC" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.toolchain.exe.release">
|
<toolChain id="com.st.stm32cube.ide.mcu.gnu.managedbuild.toolchain.exe.release.1251221725" name="MCU ARM GCC" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.toolchain.exe.release">
|
||||||
<option id="com.st.stm32cube.ide.mcu.option.internal.toolchain.type.417538228" name="Internal Toolchain Type" superClass="com.st.stm32cube.ide.mcu.option.internal.toolchain.type" useByScannerDiscovery="false" value="com.st.stm32cube.ide.mcu.gnu.managedbuild.toolchain.base.gnu-tools-for-stm32" valueType="string"/>
|
<option id="com.st.stm32cube.ide.mcu.option.internal.toolchain.type.417538228" name="Internal Toolchain Type" superClass="com.st.stm32cube.ide.mcu.option.internal.toolchain.type" useByScannerDiscovery="false" value="com.st.stm32cube.ide.mcu.gnu.managedbuild.toolchain.base.gnu-tools-for-stm32" valueType="string"/>
|
||||||
<option id="com.st.stm32cube.ide.mcu.option.internal.toolchain.version.1941725420" name="Internal Toolchain Version" superClass="com.st.stm32cube.ide.mcu.option.internal.toolchain.version" useByScannerDiscovery="false" value="7-2018-q2-update" valueType="string"/>
|
<option id="com.st.stm32cube.ide.mcu.option.internal.toolchain.version.1941725420" name="Internal Toolchain Version" superClass="com.st.stm32cube.ide.mcu.option.internal.toolchain.version" useByScannerDiscovery="false" value="7-2018-q2-update" valueType="string"/>
|
||||||
<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_mcu.389674656" name="Mcu" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_mcu" useByScannerDiscovery="true" value="STM32F407VETx" valueType="string"/>
|
<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_mcu.389674656" name="MCU" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_mcu" useByScannerDiscovery="true" value="STM32F407VETx" valueType="string"/>
|
||||||
<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_cpuid.129373496" name="CpuId" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_cpuid" useByScannerDiscovery="false" value="0" valueType="string"/>
|
<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_cpuid.129373496" name="CPU" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_cpuid" useByScannerDiscovery="false" value="0" valueType="string"/>
|
||||||
<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_coreid.1772175990" name="CpuCoreId" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_coreid" useByScannerDiscovery="false" value="0" valueType="string"/>
|
<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_coreid.1772175990" name="Core" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_coreid" useByScannerDiscovery="false" value="0" valueType="string"/>
|
||||||
<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.fpu.190418178" name="Floating-point unit" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.fpu" useByScannerDiscovery="true" value="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.fpu.value.fpv4-sp-d16" valueType="enumerated"/>
|
<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.fpu.190418178" name="Floating-point unit" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.fpu" useByScannerDiscovery="true" value="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.fpu.value.fpv4-sp-d16" valueType="enumerated"/>
|
||||||
<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.floatabi.477944895" name="Floating-point ABI" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.floatabi" useByScannerDiscovery="true" value="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.floatabi.value.hard" valueType="enumerated"/>
|
<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.floatabi.477944895" name="Floating-point ABI" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.floatabi" useByScannerDiscovery="true" value="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.floatabi.value.hard" valueType="enumerated"/>
|
||||||
<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_board.1490958290" name="Board" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_board" useByScannerDiscovery="false" value="genericBoard" valueType="string"/>
|
<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_board.1490958290" name="Board" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_board" useByScannerDiscovery="false" value="genericBoard" valueType="string"/>
|
||||||
<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.defaults.1454046747" name="Defaults" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.defaults" useByScannerDiscovery="false" value="com.st.stm32cube.ide.common.services.build.inputs.revA.1.0.5 || Release || false || Executable || com.st.stm32cube.ide.mcu.gnu.managedbuild.toolchain.base.gnu-tools-for-stm32 || STM32F407VETx || 0 || 0 || arm-none-eabi- || ${gnu_tools_for_stm32_compiler_path} || ../Inc | ../Drivers/CMSIS/Include | ../Drivers/STM32F4xx_HAL_Driver/Inc | ../Drivers/CMSIS/Device/ST/STM32F4xx/Include | ../Drivers/STM32F4xx_HAL_Driver/Inc/Legacy || ../ || || USE_HAL_DRIVER | USE_FULL_LL_DRIVER | STM32F407xx || || Drivers | Src | Startup || || || ${workspace_loc:/${ProjName}/STM32F407VETX_FLASH.ld} || true || NonSecure || || secure_nsclib.o || || None || " valueType="string"/>
|
<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.defaults.1454046747" name="Defaults" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.defaults" useByScannerDiscovery="false" value="com.st.stm32cube.ide.common.services.build.inputs.revA.1.0.5 || Release || false || Executable || com.st.stm32cube.ide.mcu.gnu.managedbuild.toolchain.base.gnu-tools-for-stm32 || STM32F407VETx || 0 || 0 || arm-none-eabi- || ${gnu_tools_for_stm32_compiler_path} || ../Middlewares/Third_Party/FreeRTOS/Source/include | ../Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F | ../Drivers/CMSIS/Include | ../Drivers/STM32F4xx_HAL_Driver/Inc | ../Drivers/CMSIS/Device/ST/STM32F4xx/Include | ../Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS_V2 | ../Drivers/STM32F4xx_HAL_Driver/Inc/Legacy | ../Core/Inc || ../ || || USE_HAL_DRIVER | USE_FULL_LL_DRIVER | STM32F407xx || || Drivers | Core/Startup | Middlewares | Core || || || ${workspace_loc:/${ProjName}/STM32F407VETX_FLASH.ld} || true || NonSecure || || secure_nsclib.o || || None || " valueType="string"/>
|
||||||
<targetPlatform archList="all" binaryParser="org.eclipse.cdt.core.ELF" id="com.st.stm32cube.ide.mcu.gnu.managedbuild.targetplatform.572225395" isAbstract="false" osList="all" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.targetplatform"/>
|
<targetPlatform archList="all" binaryParser="org.eclipse.cdt.core.ELF" id="com.st.stm32cube.ide.mcu.gnu.managedbuild.targetplatform.572225395" isAbstract="false" osList="all" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.targetplatform"/>
|
||||||
<builder buildPath="${workspace_loc:/F407_test}/Release" id="com.st.stm32cube.ide.mcu.gnu.managedbuild.builder.152384211" keepEnvironmentInBuildfile="false" managedBuildOn="true" name="Gnu Make Builder" parallelBuildOn="true" parallelizationNumber="optimal" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.builder"/>
|
<builder buildPath="${workspace_loc:/F407_test}/Release" id="com.st.stm32cube.ide.mcu.gnu.managedbuild.builder.152384211" keepEnvironmentInBuildfile="false" managedBuildOn="true" name="Gnu Make Builder" parallelBuildOn="true" parallelizationNumber="optimal" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.builder"/>
|
||||||
<tool id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.assembler.403368501" name="MCU GCC Assembler" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.assembler">
|
<tool id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.assembler.403368501" name="MCU GCC Assembler" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.assembler">
|
||||||
|
@ -168,7 +167,6 @@
|
||||||
<listOptionValue builtIn="false" value="STM32F407xx"/>
|
<listOptionValue builtIn="false" value="STM32F407xx"/>
|
||||||
</option>
|
</option>
|
||||||
<option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.option.includepaths.871297842" name="Include paths (-I)" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.option.includepaths" useByScannerDiscovery="false" valueType="includePath">
|
<option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.option.includepaths.871297842" name="Include paths (-I)" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.option.includepaths" useByScannerDiscovery="false" valueType="includePath">
|
||||||
<listOptionValue builtIn="false" value="../Inc"/>
|
|
||||||
<listOptionValue builtIn="false" value="../Drivers/CMSIS/Include"/>
|
<listOptionValue builtIn="false" value="../Drivers/CMSIS/Include"/>
|
||||||
<listOptionValue builtIn="false" value="../Drivers/STM32F4xx_HAL_Driver/Inc"/>
|
<listOptionValue builtIn="false" value="../Drivers/STM32F4xx_HAL_Driver/Inc"/>
|
||||||
<listOptionValue builtIn="false" value="../Drivers/CMSIS/Device/ST/STM32F4xx/Include"/>
|
<listOptionValue builtIn="false" value="../Drivers/CMSIS/Device/ST/STM32F4xx/Include"/>
|
||||||
|
@ -179,6 +177,7 @@
|
||||||
<listOptionValue builtIn="false" value="../Middlewares/Third_Party/FreeRTOS/Source/include"/>
|
<listOptionValue builtIn="false" value="../Middlewares/Third_Party/FreeRTOS/Source/include"/>
|
||||||
<listOptionValue builtIn="false" value="../Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS_V2"/>
|
<listOptionValue builtIn="false" value="../Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS_V2"/>
|
||||||
<listOptionValue builtIn="false" value="../Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F"/>
|
<listOptionValue builtIn="false" value="../Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F"/>
|
||||||
|
<listOptionValue builtIn="false" value="../Core/Inc"/>
|
||||||
</option>
|
</option>
|
||||||
<inputType id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.input.c.2118994447" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.input.c"/>
|
<inputType id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.input.c.2118994447" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.input.c"/>
|
||||||
</tool>
|
</tool>
|
||||||
|
@ -186,7 +185,6 @@
|
||||||
<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.cpp.compiler.option.debuglevel.1023736404" name="Debug level" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.cpp.compiler.option.debuglevel" useByScannerDiscovery="false" value="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.cpp.compiler.option.debuglevel.value.g0" valueType="enumerated"/>
|
<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.cpp.compiler.option.debuglevel.1023736404" name="Debug level" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.cpp.compiler.option.debuglevel" useByScannerDiscovery="false" value="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.cpp.compiler.option.debuglevel.value.g0" valueType="enumerated"/>
|
||||||
<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.cpp.compiler.option.optimization.level.777129193" name="Optimization level" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.cpp.compiler.option.optimization.level" useByScannerDiscovery="false" value="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.cpp.compiler.option.optimization.level.value.o3" valueType="enumerated"/>
|
<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.cpp.compiler.option.optimization.level.777129193" name="Optimization level" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.cpp.compiler.option.optimization.level" useByScannerDiscovery="false" value="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.cpp.compiler.option.optimization.level.value.o3" valueType="enumerated"/>
|
||||||
<option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.cpp.compiler.option.includepaths.1813982806" name="Include paths (-I)" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.cpp.compiler.option.includepaths" useByScannerDiscovery="false" valueType="includePath">
|
<option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.cpp.compiler.option.includepaths.1813982806" name="Include paths (-I)" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.cpp.compiler.option.includepaths" useByScannerDiscovery="false" valueType="includePath">
|
||||||
<listOptionValue builtIn="false" value="../Inc"/>
|
|
||||||
<listOptionValue builtIn="false" value="../Drivers/CMSIS/Include"/>
|
<listOptionValue builtIn="false" value="../Drivers/CMSIS/Include"/>
|
||||||
<listOptionValue builtIn="false" value="../Drivers/STM32F4xx_HAL_Driver/Inc"/>
|
<listOptionValue builtIn="false" value="../Drivers/STM32F4xx_HAL_Driver/Inc"/>
|
||||||
<listOptionValue builtIn="false" value="../Drivers/CMSIS/Device/ST/STM32F4xx/Include"/>
|
<listOptionValue builtIn="false" value="../Drivers/CMSIS/Device/ST/STM32F4xx/Include"/>
|
||||||
|
@ -197,6 +195,7 @@
|
||||||
<listOptionValue builtIn="false" value="../Middlewares/Third_Party/FreeRTOS/Source/include"/>
|
<listOptionValue builtIn="false" value="../Middlewares/Third_Party/FreeRTOS/Source/include"/>
|
||||||
<listOptionValue builtIn="false" value="../Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS_V2"/>
|
<listOptionValue builtIn="false" value="../Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS_V2"/>
|
||||||
<listOptionValue builtIn="false" value="../Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F"/>
|
<listOptionValue builtIn="false" value="../Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F"/>
|
||||||
|
<listOptionValue builtIn="false" value="../Core/Inc"/>
|
||||||
</option>
|
</option>
|
||||||
<option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.cpp.compiler.option.definedsymbols.1891229407" name="Define symbols (-D)" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.cpp.compiler.option.definedsymbols" useByScannerDiscovery="false" valueType="definedSymbols">
|
<option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.cpp.compiler.option.definedsymbols.1891229407" name="Define symbols (-D)" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.cpp.compiler.option.definedsymbols" useByScannerDiscovery="false" valueType="definedSymbols">
|
||||||
<listOptionValue builtIn="false" value="USE_HAL_DRIVER"/>
|
<listOptionValue builtIn="false" value="USE_HAL_DRIVER"/>
|
||||||
|
@ -232,12 +231,11 @@
|
||||||
</toolChain>
|
</toolChain>
|
||||||
</folderInfo>
|
</folderInfo>
|
||||||
<sourceEntries>
|
<sourceEntries>
|
||||||
<entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="Startup"/>
|
|
||||||
<entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="App"/>
|
<entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="App"/>
|
||||||
<entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="Src"/>
|
<entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="Core"/>
|
||||||
<entry excluding="test" flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="platforms"/>
|
<entry excluding="test" flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="platforms"/>
|
||||||
<entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="components"/>
|
|
||||||
<entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="Middlewares"/>
|
<entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="Middlewares"/>
|
||||||
|
<entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="components"/>
|
||||||
<entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="Drivers"/>
|
<entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="Drivers"/>
|
||||||
</sourceEntries>
|
</sourceEntries>
|
||||||
</configuration>
|
</configuration>
|
||||||
|
|
41
.mxproject
41
.mxproject
File diff suppressed because one or more lines are too long
|
@ -52,6 +52,10 @@
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
extern uint32_t SystemCoreClock;
|
extern uint32_t SystemCoreClock;
|
||||||
#endif
|
#endif
|
||||||
|
#ifndef CMSIS_device_header
|
||||||
|
#define CMSIS_device_header "stm32f4xx.h"
|
||||||
|
#endif /* CMSIS_device_header */
|
||||||
|
|
||||||
#define configENABLE_FPU 0
|
#define configENABLE_FPU 0
|
||||||
#define configENABLE_MPU 0
|
#define configENABLE_MPU 0
|
||||||
|
|
||||||
|
@ -89,6 +93,17 @@
|
||||||
#define configTIMER_QUEUE_LENGTH 10
|
#define configTIMER_QUEUE_LENGTH 10
|
||||||
#define configTIMER_TASK_STACK_DEPTH 256
|
#define configTIMER_TASK_STACK_DEPTH 256
|
||||||
|
|
||||||
|
/* The following flag must be enabled only when using newlib */
|
||||||
|
#define configUSE_NEWLIB_REENTRANT 1
|
||||||
|
|
||||||
|
/* CMSIS-RTOS V2 flags */
|
||||||
|
#define configUSE_OS2_THREAD_SUSPEND_RESUME 1
|
||||||
|
#define configUSE_OS2_THREAD_ENUMERATE 1
|
||||||
|
#define configUSE_OS2_EVENTFLAGS_FROM_ISR 1
|
||||||
|
#define configUSE_OS2_THREAD_FLAGS 1
|
||||||
|
#define configUSE_OS2_TIMER 1
|
||||||
|
#define configUSE_OS2_MUTEX 1
|
||||||
|
|
||||||
/* Set the following definitions to 1 to include the API function, or zero
|
/* Set the following definitions to 1 to include the API function, or zero
|
||||||
to exclude the API function. */
|
to exclude the API function. */
|
||||||
#define INCLUDE_vTaskPrioritySet 1
|
#define INCLUDE_vTaskPrioritySet 1
|
||||||
|
@ -102,6 +117,7 @@ to exclude the API function. */
|
||||||
#define INCLUDE_xTimerPendFunctionCall 1
|
#define INCLUDE_xTimerPendFunctionCall 1
|
||||||
#define INCLUDE_xQueueGetMutexHolder 1
|
#define INCLUDE_xQueueGetMutexHolder 1
|
||||||
#define INCLUDE_uxTaskGetStackHighWaterMark 1
|
#define INCLUDE_uxTaskGetStackHighWaterMark 1
|
||||||
|
#define INCLUDE_xTaskGetCurrentTaskHandle 1
|
||||||
#define INCLUDE_eTaskGetState 1
|
#define INCLUDE_eTaskGetState 1
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -146,10 +162,9 @@ standard names. */
|
||||||
#define vPortSVCHandler SVC_Handler
|
#define vPortSVCHandler SVC_Handler
|
||||||
#define xPortPendSVHandler PendSV_Handler
|
#define xPortPendSVHandler PendSV_Handler
|
||||||
|
|
||||||
/* IMPORTANT: This define is commented when used with STM32Cube firmware, when the timebase source is SysTick,
|
/* IMPORTANT: After 10.3.1 update, Systick_Handler comes from NVIC (if SYS timebase = systick), otherwise from cmsis_os2.c */
|
||||||
to prevent overwriting SysTick_Handler defined within STM32Cube HAL */
|
|
||||||
|
|
||||||
#define xPortSysTickHandler SysTick_Handler
|
#define USE_CUSTOM_SYSTICK_HANDLER_IMPLEMENTATION 0
|
||||||
|
|
||||||
/* USER CODE BEGIN Defines */
|
/* USER CODE BEGIN Defines */
|
||||||
/* Section where parameter definitions can be added (for instance, to override default ones in FreeRTOS.h) */
|
/* Section where parameter definitions can be added (for instance, to override default ones in FreeRTOS.h) */
|
|
@ -82,13 +82,13 @@ void MX_DMA_Init(void)
|
||||||
|
|
||||||
/* DMA interrupt init */
|
/* DMA interrupt init */
|
||||||
/* DMA2_Stream2_IRQn interrupt configuration */
|
/* DMA2_Stream2_IRQn interrupt configuration */
|
||||||
NVIC_SetPriority(DMA2_Stream2_IRQn, NVIC_EncodePriority(NVIC_GetPriorityGrouping(),0, 0));
|
NVIC_SetPriority(DMA2_Stream2_IRQn, NVIC_EncodePriority(NVIC_GetPriorityGrouping(),5, 0));
|
||||||
NVIC_EnableIRQ(DMA2_Stream2_IRQn);
|
NVIC_EnableIRQ(DMA2_Stream2_IRQn);
|
||||||
/* DMA2_Stream4_IRQn interrupt configuration */
|
/* DMA2_Stream4_IRQn interrupt configuration */
|
||||||
NVIC_SetPriority(DMA2_Stream4_IRQn, NVIC_EncodePriority(NVIC_GetPriorityGrouping(),0, 0));
|
NVIC_SetPriority(DMA2_Stream4_IRQn, NVIC_EncodePriority(NVIC_GetPriorityGrouping(),5, 0));
|
||||||
NVIC_EnableIRQ(DMA2_Stream4_IRQn);
|
NVIC_EnableIRQ(DMA2_Stream4_IRQn);
|
||||||
/* DMA2_Stream7_IRQn interrupt configuration */
|
/* DMA2_Stream7_IRQn interrupt configuration */
|
||||||
NVIC_SetPriority(DMA2_Stream7_IRQn, NVIC_EncodePriority(NVIC_GetPriorityGrouping(),0, 0));
|
NVIC_SetPriority(DMA2_Stream7_IRQn, NVIC_EncodePriority(NVIC_GetPriorityGrouping(),5, 0));
|
||||||
NVIC_EnableIRQ(DMA2_Stream7_IRQn);
|
NVIC_EnableIRQ(DMA2_Stream7_IRQn);
|
||||||
|
|
||||||
}
|
}
|
|
@ -53,8 +53,8 @@
|
||||||
osThreadId_t defaultTaskHandle;
|
osThreadId_t defaultTaskHandle;
|
||||||
const osThreadAttr_t defaultTask_attributes = {
|
const osThreadAttr_t defaultTask_attributes = {
|
||||||
.name = "defaultTask",
|
.name = "defaultTask",
|
||||||
|
.stack_size = 384 * 4,
|
||||||
.priority = (osPriority_t) osPriorityNormal,
|
.priority = (osPriority_t) osPriorityNormal,
|
||||||
.stack_size = 384 * 4
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Private function prototypes -----------------------------------------------*/
|
/* Private function prototypes -----------------------------------------------*/
|
||||||
|
@ -100,6 +100,10 @@ void MX_FREERTOS_Init(void) {
|
||||||
/* add threads, ... */
|
/* add threads, ... */
|
||||||
/* USER CODE END RTOS_THREADS */
|
/* USER CODE END RTOS_THREADS */
|
||||||
|
|
||||||
|
/* USER CODE BEGIN RTOS_EVENTS */
|
||||||
|
/* add events, ... */
|
||||||
|
/* USER CODE END RTOS_EVENTS */
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* USER CODE BEGIN Header_StartDefaultTask */
|
/* USER CODE BEGIN Header_StartDefaultTask */
|
|
@ -100,9 +100,10 @@ int main(void)
|
||||||
MX_CRC_Init();
|
MX_CRC_Init();
|
||||||
MX_SPI2_Init();
|
MX_SPI2_Init();
|
||||||
/* USER CODE BEGIN 2 */
|
/* USER CODE BEGIN 2 */
|
||||||
/* USER CODE END 2 */
|
|
||||||
MainLoop();
|
MainLoop();
|
||||||
|
|
||||||
|
/* USER CODE END 2 */
|
||||||
|
|
||||||
/* Init scheduler */
|
/* Init scheduler */
|
||||||
osKernelInitialize(); /* Call init function for freertos objects (in freertos.c) */
|
osKernelInitialize(); /* Call init function for freertos objects (in freertos.c) */
|
||||||
MX_FREERTOS_Init();
|
MX_FREERTOS_Init();
|
|
@ -71,6 +71,8 @@ void HAL_MspInit(void)
|
||||||
__HAL_RCC_PWR_CLK_ENABLE();
|
__HAL_RCC_PWR_CLK_ENABLE();
|
||||||
|
|
||||||
/* System interrupt init*/
|
/* System interrupt init*/
|
||||||
|
/* PendSV_IRQn interrupt configuration */
|
||||||
|
HAL_NVIC_SetPriority(PendSV_IRQn, 15, 0);
|
||||||
|
|
||||||
/* USER CODE BEGIN MspInit 1 */
|
/* USER CODE BEGIN MspInit 1 */
|
||||||
|
|
|
@ -50,6 +50,7 @@ HAL_StatusTypeDef HAL_InitTick(uint32_t TickPriority)
|
||||||
|
|
||||||
/* Enable the TIM6 global Interrupt */
|
/* Enable the TIM6 global Interrupt */
|
||||||
HAL_NVIC_EnableIRQ(TIM6_DAC_IRQn);
|
HAL_NVIC_EnableIRQ(TIM6_DAC_IRQn);
|
||||||
|
|
||||||
/* Enable TIM6 clock */
|
/* Enable TIM6 clock */
|
||||||
__HAL_RCC_TIM6_CLK_ENABLE();
|
__HAL_RCC_TIM6_CLK_ENABLE();
|
||||||
|
|
||||||
|
@ -58,9 +59,8 @@ HAL_StatusTypeDef HAL_InitTick(uint32_t TickPriority)
|
||||||
|
|
||||||
/* Compute TIM6 clock */
|
/* Compute TIM6 clock */
|
||||||
uwTimclock = 2*HAL_RCC_GetPCLK1Freq();
|
uwTimclock = 2*HAL_RCC_GetPCLK1Freq();
|
||||||
|
|
||||||
/* Compute the prescaler value to have TIM6 counter clock equal to 1MHz */
|
/* Compute the prescaler value to have TIM6 counter clock equal to 1MHz */
|
||||||
uwPrescalerValue = (uint32_t) ((uwTimclock / 1000000) - 1);
|
uwPrescalerValue = (uint32_t) ((uwTimclock / 1000000U) - 1U);
|
||||||
|
|
||||||
/* Initialize TIM6 */
|
/* Initialize TIM6 */
|
||||||
htim6.Instance = TIM6;
|
htim6.Instance = TIM6;
|
||||||
|
@ -71,10 +71,11 @@ HAL_StatusTypeDef HAL_InitTick(uint32_t TickPriority)
|
||||||
+ ClockDivision = 0
|
+ ClockDivision = 0
|
||||||
+ Counter direction = Up
|
+ Counter direction = Up
|
||||||
*/
|
*/
|
||||||
htim6.Init.Period = (1000000 / 1000) - 1;
|
htim6.Init.Period = (1000000U / 1000U) - 1U;
|
||||||
htim6.Init.Prescaler = uwPrescalerValue;
|
htim6.Init.Prescaler = uwPrescalerValue;
|
||||||
htim6.Init.ClockDivision = 0;
|
htim6.Init.ClockDivision = 0;
|
||||||
htim6.Init.CounterMode = TIM_COUNTERMODE_UP;
|
htim6.Init.CounterMode = TIM_COUNTERMODE_UP;
|
||||||
|
|
||||||
if(HAL_TIM_Base_Init(&htim6) == HAL_OK)
|
if(HAL_TIM_Base_Init(&htim6) == HAL_OK)
|
||||||
{
|
{
|
||||||
/* Start the TIM time Base generation in interrupt mode */
|
/* Start the TIM time Base generation in interrupt mode */
|
|
@ -94,7 +94,7 @@ void MX_USART1_UART_Init(void)
|
||||||
LL_DMA_DisableFifoMode(DMA2, LL_DMA_STREAM_7);
|
LL_DMA_DisableFifoMode(DMA2, LL_DMA_STREAM_7);
|
||||||
|
|
||||||
/* USART1 interrupt Init */
|
/* USART1 interrupt Init */
|
||||||
NVIC_SetPriority(USART1_IRQn, NVIC_EncodePriority(NVIC_GetPriorityGrouping(),0, 0));
|
NVIC_SetPriority(USART1_IRQn, NVIC_EncodePriority(NVIC_GetPriorityGrouping(),5, 0));
|
||||||
NVIC_EnableIRQ(USART1_IRQn);
|
NVIC_EnableIRQ(USART1_IRQn);
|
||||||
|
|
||||||
/* USER CODE BEGIN USART1_Init 1 */
|
/* USER CODE BEGIN USART1_Init 1 */
|
|
@ -37,9 +37,10 @@ Dma.USART1_TX.2.PeriphInc=DMA_PINC_DISABLE
|
||||||
Dma.USART1_TX.2.Priority=DMA_PRIORITY_LOW
|
Dma.USART1_TX.2.Priority=DMA_PRIORITY_LOW
|
||||||
Dma.USART1_TX.2.RequestParameters=Instance,Direction,PeriphInc,MemInc,PeriphDataAlignment,MemDataAlignment,Mode,Priority,FIFOMode
|
Dma.USART1_TX.2.RequestParameters=Instance,Direction,PeriphInc,MemInc,PeriphDataAlignment,MemDataAlignment,Mode,Priority,FIFOMode
|
||||||
FREERTOS.FootprintOK=true
|
FREERTOS.FootprintOK=true
|
||||||
FREERTOS.IPParameters=Tasks01,configMINIMAL_STACK_SIZE,FootprintOK
|
FREERTOS.IPParameters=Tasks01,configMINIMAL_STACK_SIZE,FootprintOK,configUSE_NEWLIB_REENTRANT
|
||||||
FREERTOS.Tasks01=defaultTask,24,384,StartDefaultTask,Default,NULL,Dynamic,NULL,NULL
|
FREERTOS.Tasks01=defaultTask,24,384,StartDefaultTask,Default,NULL,Dynamic,NULL,NULL
|
||||||
FREERTOS.configMINIMAL_STACK_SIZE=128
|
FREERTOS.configMINIMAL_STACK_SIZE=128
|
||||||
|
FREERTOS.configUSE_NEWLIB_REENTRANT=1
|
||||||
FSMC.AddressSetupTime1=1
|
FSMC.AddressSetupTime1=1
|
||||||
FSMC.BusTurnAroundDuration1=0
|
FSMC.BusTurnAroundDuration1=0
|
||||||
FSMC.DataSetupTime1=4
|
FSMC.DataSetupTime1=4
|
||||||
|
@ -107,25 +108,25 @@ Mcu.UserName=STM32F407VETx
|
||||||
MxCube.Version=6.3.0
|
MxCube.Version=6.3.0
|
||||||
MxDb.Version=DB.6.0.30
|
MxDb.Version=DB.6.0.30
|
||||||
NVIC.BusFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false
|
NVIC.BusFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false
|
||||||
NVIC.DMA2_Stream2_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:true
|
NVIC.DMA2_Stream2_IRQn=true\:5\:0\:false\:false\:true\:false\:false\:true
|
||||||
NVIC.DMA2_Stream4_IRQn=true\:0\:0\:false\:false\:true\:false\:true\:true
|
NVIC.DMA2_Stream4_IRQn=true\:5\:0\:false\:false\:true\:false\:true\:true
|
||||||
NVIC.DMA2_Stream7_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:true
|
NVIC.DMA2_Stream7_IRQn=true\:5\:0\:false\:false\:true\:false\:false\:true
|
||||||
NVIC.DebugMonitor_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false
|
NVIC.DebugMonitor_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false
|
||||||
NVIC.ForceEnableDMAVector=true
|
NVIC.ForceEnableDMAVector=true
|
||||||
NVIC.HardFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false
|
NVIC.HardFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false
|
||||||
NVIC.MemoryManagement_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false
|
NVIC.MemoryManagement_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false
|
||||||
NVIC.NonMaskableInt_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false
|
NVIC.NonMaskableInt_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false
|
||||||
NVIC.PendSV_IRQn=true\:0\:0\:false\:false\:false\:false\:false\:false
|
NVIC.PendSV_IRQn=true\:15\:0\:false\:false\:false\:false\:false\:false
|
||||||
NVIC.PriorityGroup=NVIC_PRIORITYGROUP_4
|
NVIC.PriorityGroup=NVIC_PRIORITYGROUP_4
|
||||||
NVIC.SVCall_IRQn=true\:0\:0\:false\:false\:false\:false\:false\:false
|
NVIC.SVCall_IRQn=true\:0\:0\:false\:false\:false\:false\:false\:false
|
||||||
NVIC.SavedPendsvIrqHandlerGenerated=true
|
NVIC.SavedPendsvIrqHandlerGenerated=true
|
||||||
NVIC.SavedSvcallIrqHandlerGenerated=true
|
NVIC.SavedSvcallIrqHandlerGenerated=true
|
||||||
NVIC.SavedSystickIrqHandlerGenerated=true
|
NVIC.SavedSystickIrqHandlerGenerated=true
|
||||||
NVIC.SysTick_IRQn=true\:0\:0\:false\:false\:false\:false\:false\:false
|
NVIC.SysTick_IRQn=true\:15\:0\:false\:false\:false\:false\:false\:false
|
||||||
NVIC.TIM6_DAC_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:true
|
NVIC.TIM6_DAC_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:true
|
||||||
NVIC.TimeBase=TIM6_DAC_IRQn
|
NVIC.TimeBase=TIM6_DAC_IRQn
|
||||||
NVIC.TimeBaseIP=TIM6
|
NVIC.TimeBaseIP=TIM6
|
||||||
NVIC.USART1_IRQn=true\:0\:0\:false\:false\:true\:false\:true\:true
|
NVIC.USART1_IRQn=true\:5\:0\:false\:false\:true\:false\:true\:true
|
||||||
NVIC.UsageFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false
|
NVIC.UsageFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false
|
||||||
PA10.Mode=Asynchronous
|
PA10.Mode=Asynchronous
|
||||||
PA10.Signal=USART1_RX
|
PA10.Signal=USART1_RX
|
||||||
|
@ -236,7 +237,7 @@ ProjectManager.HeapSize=0x200
|
||||||
ProjectManager.KeepUserCode=true
|
ProjectManager.KeepUserCode=true
|
||||||
ProjectManager.LastFirmware=true
|
ProjectManager.LastFirmware=true
|
||||||
ProjectManager.LibraryCopy=1
|
ProjectManager.LibraryCopy=1
|
||||||
ProjectManager.MainLocation=Src
|
ProjectManager.MainLocation=Core/Src
|
||||||
ProjectManager.NoMain=false
|
ProjectManager.NoMain=false
|
||||||
ProjectManager.PreviousToolchain=
|
ProjectManager.PreviousToolchain=
|
||||||
ProjectManager.ProjectBuild=false
|
ProjectManager.ProjectBuild=false
|
||||||
|
|
|
@ -1,6 +1,5 @@
|
||||||
/* --------------------------------------------------------------------------
|
/* --------------------------------------------------------------------------
|
||||||
* Portions Copyright © 2019 STMicroelectronics International N.V. All rights reserved.
|
* Copyright (c) 2013-2020 Arm Limited. All rights reserved.
|
||||||
* Copyright (c) 2013-2019 Arm Limited. All rights reserved.
|
|
||||||
*
|
*
|
||||||
* SPDX-License-Identifier: Apache-2.0
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
*
|
*
|
||||||
|
@ -24,13 +23,16 @@
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
#include "cmsis_os2.h" // ::CMSIS:RTOS2
|
#include "cmsis_os2.h" // ::CMSIS:RTOS2
|
||||||
#include "cmsis_compiler.h"
|
#include "cmsis_compiler.h" // Compiler agnostic definitions
|
||||||
|
|
||||||
#include "FreeRTOS.h" // ARM.FreeRTOS::RTOS:Core
|
#include "FreeRTOS.h" // ARM.FreeRTOS::RTOS:Core
|
||||||
#include "task.h" // ARM.FreeRTOS::RTOS:Core
|
#include "task.h" // ARM.FreeRTOS::RTOS:Core
|
||||||
#include "event_groups.h" // ARM.FreeRTOS::RTOS:Event Groups
|
#include "event_groups.h" // ARM.FreeRTOS::RTOS:Event Groups
|
||||||
#include "semphr.h" // ARM.FreeRTOS::RTOS:Core
|
#include "semphr.h" // ARM.FreeRTOS::RTOS:Core
|
||||||
|
|
||||||
|
#include "freertos_mpool.h" // osMemoryPool definitions
|
||||||
|
#include "freertos_os2.h" // Configuration check and setup
|
||||||
|
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
#ifndef __ARM_ARCH_6M__
|
#ifndef __ARM_ARCH_6M__
|
||||||
#define __ARM_ARCH_6M__ 0
|
#define __ARM_ARCH_6M__ 0
|
||||||
|
@ -73,7 +75,9 @@
|
||||||
#define IS_IRQ_MODE() (__get_IPSR() != 0U)
|
#define IS_IRQ_MODE() (__get_IPSR() != 0U)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define IS_IRQ() (IS_IRQ_MODE() || (IS_IRQ_MASKED() && (KernelState == osKernelRunning)))
|
#define IS_IRQ() IS_IRQ_MODE()
|
||||||
|
|
||||||
|
#define SVCall_IRQ_NBR (IRQn_Type) -5 /* SVCall_IRQ_NBR added as SV_Call handler name is not the same for CM0 and for all other CMx */
|
||||||
|
|
||||||
/* Limits */
|
/* Limits */
|
||||||
#define MAX_BITS_TASK_NOTIFY 31U
|
#define MAX_BITS_TASK_NOTIFY 31U
|
||||||
|
@ -108,7 +112,7 @@ static osKernelState_t KernelState = osKernelInactive;
|
||||||
definition configHEAP_5_REGIONS as parameter. Overriding configHEAP_5_REGIONS
|
definition configHEAP_5_REGIONS as parameter. Overriding configHEAP_5_REGIONS
|
||||||
is possible by defining it globally or in FreeRTOSConfig.h.
|
is possible by defining it globally or in FreeRTOSConfig.h.
|
||||||
*/
|
*/
|
||||||
#if defined(USE_FREERTOS_HEAP_5)
|
#if defined(USE_FreeRTOS_HEAP_5)
|
||||||
#if (configAPPLICATION_ALLOCATED_HEAP == 0)
|
#if (configAPPLICATION_ALLOCATED_HEAP == 0)
|
||||||
/*
|
/*
|
||||||
FreeRTOS heap is not defined by the application.
|
FreeRTOS heap is not defined by the application.
|
||||||
|
@ -138,7 +142,7 @@ static osKernelState_t KernelState = osKernelInactive;
|
||||||
*/
|
*/
|
||||||
#define HEAP_5_REGION_SETUP 0
|
#define HEAP_5_REGION_SETUP 0
|
||||||
#endif /* configAPPLICATION_ALLOCATED_HEAP */
|
#endif /* configAPPLICATION_ALLOCATED_HEAP */
|
||||||
#endif /* USE_FREERTOS_HEAP_5 */
|
#endif /* USE_FreeRTOS_HEAP_5 */
|
||||||
|
|
||||||
#if defined(SysTick)
|
#if defined(SysTick)
|
||||||
#undef SysTick_Handler
|
#undef SysTick_Handler
|
||||||
|
@ -151,6 +155,7 @@ extern void xPortSysTickHandler (void);
|
||||||
/*
|
/*
|
||||||
SysTick handler implementation that also clears overflow flag.
|
SysTick handler implementation that also clears overflow flag.
|
||||||
*/
|
*/
|
||||||
|
#if (USE_CUSTOM_SYSTICK_HANDLER_IMPLEMENTATION == 0)
|
||||||
void SysTick_Handler (void) {
|
void SysTick_Handler (void) {
|
||||||
/* Clear overflow flag */
|
/* Clear overflow flag */
|
||||||
SysTick->CTRL;
|
SysTick->CTRL;
|
||||||
|
@ -160,6 +165,7 @@ void SysTick_Handler (void) {
|
||||||
xPortSysTickHandler();
|
xPortSysTickHandler();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
#endif /* SysTick */
|
#endif /* SysTick */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -170,16 +176,23 @@ __STATIC_INLINE void SVC_Setup (void) {
|
||||||
/* Service Call interrupt might be configured before kernel start */
|
/* Service Call interrupt might be configured before kernel start */
|
||||||
/* and when its priority is lower or equal to BASEPRI, svc intruction */
|
/* and when its priority is lower or equal to BASEPRI, svc intruction */
|
||||||
/* causes a Hard Fault. */
|
/* causes a Hard Fault. */
|
||||||
|
NVIC_SetPriority (SVCall_IRQ_NBR, 0U);
|
||||||
/*
|
|
||||||
* the call below has introduced a regression compared to revious release
|
|
||||||
* The issue was logged under:https://github.com/ARM-software/CMSIS-FreeRTOS/issues/35
|
|
||||||
* until it is correctly fixed, the code below is commented
|
|
||||||
*/
|
|
||||||
/* NVIC_SetPriority (SVCall_IRQn, 0U); */
|
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
Function macro used to retrieve semaphore count from ISR
|
||||||
|
*/
|
||||||
|
#ifndef uxSemaphoreGetCountFromISR
|
||||||
|
#define uxSemaphoreGetCountFromISR( xSemaphore ) uxQueueMessagesWaitingFromISR( ( QueueHandle_t ) ( xSemaphore ) )
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Get OS Tick count value */
|
||||||
|
static uint32_t OS_Tick_GetCount (void);
|
||||||
|
/* Get OS Tick overflow status */
|
||||||
|
static uint32_t OS_Tick_GetOverflow (void);
|
||||||
|
/* Get OS Tick interval */
|
||||||
|
static uint32_t OS_Tick_GetInterval (void);
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
osStatus_t osKernelInitialize (void) {
|
osStatus_t osKernelInitialize (void) {
|
||||||
|
@ -190,7 +203,10 @@ osStatus_t osKernelInitialize (void) {
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
if (KernelState == osKernelInactive) {
|
if (KernelState == osKernelInactive) {
|
||||||
#if defined(USE_FREERTOS_HEAP_5) && (HEAP_5_REGION_SETUP == 1)
|
#if defined(USE_TRACE_EVENT_RECORDER)
|
||||||
|
EvrFreeRTOSSetup(0U);
|
||||||
|
#endif
|
||||||
|
#if defined(USE_FreeRTOS_HEAP_5) && (HEAP_5_REGION_SETUP == 1)
|
||||||
vPortDefineHeapRegions (configHEAP_5_REGIONS);
|
vPortDefineHeapRegions (configHEAP_5_REGIONS);
|
||||||
#endif
|
#endif
|
||||||
KernelState = osKernelReady;
|
KernelState = osKernelReady;
|
||||||
|
@ -380,6 +396,22 @@ uint32_t osKernelGetTickFreq (void) {
|
||||||
return (configTICK_RATE_HZ);
|
return (configTICK_RATE_HZ);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Get OS Tick count value */
|
||||||
|
static uint32_t OS_Tick_GetCount (void) {
|
||||||
|
uint32_t load = SysTick->LOAD;
|
||||||
|
return (load - SysTick->VAL);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Get OS Tick overflow status */
|
||||||
|
static uint32_t OS_Tick_GetOverflow (void) {
|
||||||
|
return ((SysTick->CTRL >> 16) & 1U);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Get OS Tick interval */
|
||||||
|
static uint32_t OS_Tick_GetInterval (void) {
|
||||||
|
return (SysTick->LOAD + 1U);
|
||||||
|
}
|
||||||
|
|
||||||
uint32_t osKernelGetSysTimerCount (void) {
|
uint32_t osKernelGetSysTimerCount (void) {
|
||||||
uint32_t irqmask = IS_IRQ_MASKED();
|
uint32_t irqmask = IS_IRQ_MASKED();
|
||||||
TickType_t ticks;
|
TickType_t ticks;
|
||||||
|
@ -388,8 +420,14 @@ uint32_t osKernelGetSysTimerCount (void) {
|
||||||
__disable_irq();
|
__disable_irq();
|
||||||
|
|
||||||
ticks = xTaskGetTickCount();
|
ticks = xTaskGetTickCount();
|
||||||
|
val = OS_Tick_GetCount();
|
||||||
|
|
||||||
|
if (OS_Tick_GetOverflow() != 0U) {
|
||||||
|
val = OS_Tick_GetCount();
|
||||||
|
ticks++;
|
||||||
|
}
|
||||||
|
val += ticks * OS_Tick_GetInterval();
|
||||||
|
|
||||||
val = ticks * ( configCPU_CLOCK_HZ / configTICK_RATE_HZ );
|
|
||||||
if (irqmask == 0U) {
|
if (irqmask == 0U) {
|
||||||
__enable_irq();
|
__enable_irq();
|
||||||
}
|
}
|
||||||
|
@ -452,14 +490,18 @@ osThreadId_t osThreadNew (osThreadFunc_t func, void *argument, const osThreadAtt
|
||||||
}
|
}
|
||||||
|
|
||||||
if (mem == 1) {
|
if (mem == 1) {
|
||||||
hTask = xTaskCreateStatic ((TaskFunction_t)func, name, stack, argument, prio, (StackType_t *)attr->stack_mem,
|
#if (configSUPPORT_STATIC_ALLOCATION == 1)
|
||||||
(StaticTask_t *)attr->cb_mem);
|
hTask = xTaskCreateStatic ((TaskFunction_t)func, name, stack, argument, prio, (StackType_t *)attr->stack_mem,
|
||||||
|
(StaticTask_t *)attr->cb_mem);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
if (mem == 0) {
|
if (mem == 0) {
|
||||||
if (xTaskCreate ((TaskFunction_t)func, name, (uint16_t)stack, argument, prio, &hTask) != pdPASS) {
|
#if (configSUPPORT_DYNAMIC_ALLOCATION == 1)
|
||||||
hTask = NULL;
|
if (xTaskCreate ((TaskFunction_t)func, name, (uint16_t)stack, argument, prio, &hTask) != pdPASS) {
|
||||||
}
|
hTask = NULL;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -517,7 +559,7 @@ uint32_t osThreadGetStackSpace (osThreadId_t thread_id) {
|
||||||
if (IS_IRQ() || (hTask == NULL)) {
|
if (IS_IRQ() || (hTask == NULL)) {
|
||||||
sz = 0U;
|
sz = 0U;
|
||||||
} else {
|
} else {
|
||||||
sz = (uint32_t)uxTaskGetStackHighWaterMark (hTask);
|
sz = (uint32_t)(uxTaskGetStackHighWaterMark(hTask) * sizeof(StackType_t));
|
||||||
}
|
}
|
||||||
|
|
||||||
return (sz);
|
return (sz);
|
||||||
|
@ -548,7 +590,7 @@ osPriority_t osThreadGetPriority (osThreadId_t thread_id) {
|
||||||
if (IS_IRQ() || (hTask == NULL)) {
|
if (IS_IRQ() || (hTask == NULL)) {
|
||||||
prio = osPriorityError;
|
prio = osPriorityError;
|
||||||
} else {
|
} else {
|
||||||
prio = (osPriority_t)uxTaskPriorityGet (hTask);
|
prio = (osPriority_t)((int32_t)uxTaskPriorityGet (hTask));
|
||||||
}
|
}
|
||||||
|
|
||||||
return (prio);
|
return (prio);
|
||||||
|
@ -567,6 +609,7 @@ osStatus_t osThreadYield (void) {
|
||||||
return (stat);
|
return (stat);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if (configUSE_OS2_THREAD_SUSPEND_RESUME == 1)
|
||||||
osStatus_t osThreadSuspend (osThreadId_t thread_id) {
|
osStatus_t osThreadSuspend (osThreadId_t thread_id) {
|
||||||
TaskHandle_t hTask = (TaskHandle_t)thread_id;
|
TaskHandle_t hTask = (TaskHandle_t)thread_id;
|
||||||
osStatus_t stat;
|
osStatus_t stat;
|
||||||
|
@ -602,6 +645,7 @@ osStatus_t osThreadResume (osThreadId_t thread_id) {
|
||||||
|
|
||||||
return (stat);
|
return (stat);
|
||||||
}
|
}
|
||||||
|
#endif /* (configUSE_OS2_THREAD_SUSPEND_RESUME == 1) */
|
||||||
|
|
||||||
__NO_RETURN void osThreadExit (void) {
|
__NO_RETURN void osThreadExit (void) {
|
||||||
#ifndef USE_FreeRTOS_HEAP_1
|
#ifndef USE_FreeRTOS_HEAP_1
|
||||||
|
@ -651,6 +695,7 @@ uint32_t osThreadGetCount (void) {
|
||||||
return (count);
|
return (count);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if (configUSE_OS2_THREAD_ENUMERATE == 1)
|
||||||
uint32_t osThreadEnumerate (osThreadId_t *thread_array, uint32_t array_items) {
|
uint32_t osThreadEnumerate (osThreadId_t *thread_array, uint32_t array_items) {
|
||||||
uint32_t i, count;
|
uint32_t i, count;
|
||||||
TaskStatus_t *task;
|
TaskStatus_t *task;
|
||||||
|
@ -678,7 +723,9 @@ uint32_t osThreadEnumerate (osThreadId_t *thread_array, uint32_t array_items) {
|
||||||
|
|
||||||
return (count);
|
return (count);
|
||||||
}
|
}
|
||||||
|
#endif /* (configUSE_OS2_THREAD_ENUMERATE == 1) */
|
||||||
|
|
||||||
|
#if (configUSE_OS2_THREAD_FLAGS == 1)
|
||||||
uint32_t osThreadFlagsSet (osThreadId_t thread_id, uint32_t flags) {
|
uint32_t osThreadFlagsSet (osThreadId_t thread_id, uint32_t flags) {
|
||||||
TaskHandle_t hTask = (TaskHandle_t)thread_id;
|
TaskHandle_t hTask = (TaskHandle_t)thread_id;
|
||||||
uint32_t rflags;
|
uint32_t rflags;
|
||||||
|
@ -829,6 +876,7 @@ uint32_t osThreadFlagsWait (uint32_t flags, uint32_t options, uint32_t timeout)
|
||||||
/* Return flags before clearing */
|
/* Return flags before clearing */
|
||||||
return (rflags);
|
return (rflags);
|
||||||
}
|
}
|
||||||
|
#endif /* (configUSE_OS2_THREAD_FLAGS == 1) */
|
||||||
|
|
||||||
osStatus_t osDelay (uint32_t ticks) {
|
osStatus_t osDelay (uint32_t ticks) {
|
||||||
osStatus_t stat;
|
osStatus_t stat;
|
||||||
|
@ -876,6 +924,7 @@ osStatus_t osDelayUntil (uint32_t ticks) {
|
||||||
}
|
}
|
||||||
|
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
|
#if (configUSE_OS2_TIMER == 1)
|
||||||
|
|
||||||
static void TimerCallback (TimerHandle_t hTimer) {
|
static void TimerCallback (TimerHandle_t hTimer) {
|
||||||
TimerCallback_t *callb;
|
TimerCallback_t *callb;
|
||||||
|
@ -932,13 +981,21 @@ osTimerId_t osTimerNew (osTimerFunc_t func, osTimerType_t type, void *argument,
|
||||||
}
|
}
|
||||||
|
|
||||||
if (mem == 1) {
|
if (mem == 1) {
|
||||||
hTimer = xTimerCreateStatic (name, 1, reload, callb, TimerCallback, (StaticTimer_t *)attr->cb_mem);
|
#if (configSUPPORT_STATIC_ALLOCATION == 1)
|
||||||
|
hTimer = xTimerCreateStatic (name, 1, reload, callb, TimerCallback, (StaticTimer_t *)attr->cb_mem);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
if (mem == 0) {
|
if (mem == 0) {
|
||||||
hTimer = xTimerCreate (name, 1, reload, callb, TimerCallback);
|
#if (configSUPPORT_DYNAMIC_ALLOCATION == 1)
|
||||||
|
hTimer = xTimerCreate (name, 1, reload, callb, TimerCallback);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ((hTimer == NULL) && (callb != NULL)) {
|
||||||
|
vPortFree (callb);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1046,6 +1103,7 @@ osStatus_t osTimerDelete (osTimerId_t timer_id) {
|
||||||
|
|
||||||
return (stat);
|
return (stat);
|
||||||
}
|
}
|
||||||
|
#endif /* (configUSE_OS2_TIMER == 1) */
|
||||||
|
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
@ -1073,11 +1131,15 @@ osEventFlagsId_t osEventFlagsNew (const osEventFlagsAttr_t *attr) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (mem == 1) {
|
if (mem == 1) {
|
||||||
|
#if (configSUPPORT_STATIC_ALLOCATION == 1)
|
||||||
hEventGroup = xEventGroupCreateStatic (attr->cb_mem);
|
hEventGroup = xEventGroupCreateStatic (attr->cb_mem);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
if (mem == 0) {
|
if (mem == 0) {
|
||||||
hEventGroup = xEventGroupCreate();
|
#if (configSUPPORT_DYNAMIC_ALLOCATION == 1)
|
||||||
|
hEventGroup = xEventGroupCreate();
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1094,6 +1156,11 @@ uint32_t osEventFlagsSet (osEventFlagsId_t ef_id, uint32_t flags) {
|
||||||
rflags = (uint32_t)osErrorParameter;
|
rflags = (uint32_t)osErrorParameter;
|
||||||
}
|
}
|
||||||
else if (IS_IRQ()) {
|
else if (IS_IRQ()) {
|
||||||
|
#if (configUSE_OS2_EVENTFLAGS_FROM_ISR == 0)
|
||||||
|
(void)yield;
|
||||||
|
/* Enable timers and xTimerPendFunctionCall function to support osEventFlagsSet from ISR */
|
||||||
|
rflags = (uint32_t)osErrorResource;
|
||||||
|
#else
|
||||||
yield = pdFALSE;
|
yield = pdFALSE;
|
||||||
|
|
||||||
if (xEventGroupSetBitsFromISR (hEventGroup, (EventBits_t)flags, &yield) == pdFAIL) {
|
if (xEventGroupSetBitsFromISR (hEventGroup, (EventBits_t)flags, &yield) == pdFAIL) {
|
||||||
|
@ -1102,6 +1169,7 @@ uint32_t osEventFlagsSet (osEventFlagsId_t ef_id, uint32_t flags) {
|
||||||
rflags = flags;
|
rflags = flags;
|
||||||
portYIELD_FROM_ISR (yield);
|
portYIELD_FROM_ISR (yield);
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
rflags = xEventGroupSetBits (hEventGroup, (EventBits_t)flags);
|
rflags = xEventGroupSetBits (hEventGroup, (EventBits_t)flags);
|
||||||
|
@ -1118,11 +1186,16 @@ uint32_t osEventFlagsClear (osEventFlagsId_t ef_id, uint32_t flags) {
|
||||||
rflags = (uint32_t)osErrorParameter;
|
rflags = (uint32_t)osErrorParameter;
|
||||||
}
|
}
|
||||||
else if (IS_IRQ()) {
|
else if (IS_IRQ()) {
|
||||||
|
#if (configUSE_OS2_EVENTFLAGS_FROM_ISR == 0)
|
||||||
|
/* Enable timers and xTimerPendFunctionCall function to support osEventFlagsSet from ISR */
|
||||||
|
rflags = (uint32_t)osErrorResource;
|
||||||
|
#else
|
||||||
rflags = xEventGroupGetBitsFromISR (hEventGroup);
|
rflags = xEventGroupGetBitsFromISR (hEventGroup);
|
||||||
|
|
||||||
if (xEventGroupClearBitsFromISR (hEventGroup, (EventBits_t)flags) == pdFAIL) {
|
if (xEventGroupClearBitsFromISR (hEventGroup, (EventBits_t)flags) == pdFAIL) {
|
||||||
rflags = (uint32_t)osErrorResource;
|
rflags = (uint32_t)osErrorResource;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
rflags = xEventGroupClearBits (hEventGroup, (EventBits_t)flags);
|
rflags = xEventGroupClearBits (hEventGroup, (EventBits_t)flags);
|
||||||
|
@ -1176,7 +1249,7 @@ uint32_t osEventFlagsWait (osEventFlagsId_t ef_id, uint32_t flags, uint32_t opti
|
||||||
rflags = xEventGroupWaitBits (hEventGroup, (EventBits_t)flags, exit_clr, wait_all, (TickType_t)timeout);
|
rflags = xEventGroupWaitBits (hEventGroup, (EventBits_t)flags, exit_clr, wait_all, (TickType_t)timeout);
|
||||||
|
|
||||||
if (options & osFlagsWaitAll) {
|
if (options & osFlagsWaitAll) {
|
||||||
if (flags != rflags) {
|
if ((flags & rflags) != flags) {
|
||||||
if (timeout > 0U) {
|
if (timeout > 0U) {
|
||||||
rflags = (uint32_t)osErrorTimeout;
|
rflags = (uint32_t)osErrorTimeout;
|
||||||
} else {
|
} else {
|
||||||
|
@ -1221,6 +1294,7 @@ osStatus_t osEventFlagsDelete (osEventFlagsId_t ef_id) {
|
||||||
}
|
}
|
||||||
|
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
|
#if (configUSE_OS2_MUTEX == 1)
|
||||||
|
|
||||||
osMutexId_t osMutexNew (const osMutexAttr_t *attr) {
|
osMutexId_t osMutexNew (const osMutexAttr_t *attr) {
|
||||||
SemaphoreHandle_t hMutex;
|
SemaphoreHandle_t hMutex;
|
||||||
|
@ -1264,20 +1338,28 @@ osMutexId_t osMutexNew (const osMutexAttr_t *attr) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (mem == 1) {
|
if (mem == 1) {
|
||||||
if (rmtx != 0U) {
|
#if (configSUPPORT_STATIC_ALLOCATION == 1)
|
||||||
hMutex = xSemaphoreCreateRecursiveMutexStatic (attr->cb_mem);
|
if (rmtx != 0U) {
|
||||||
}
|
#if (configUSE_RECURSIVE_MUTEXES == 1)
|
||||||
else {
|
hMutex = xSemaphoreCreateRecursiveMutexStatic (attr->cb_mem);
|
||||||
hMutex = xSemaphoreCreateMutexStatic (attr->cb_mem);
|
#endif
|
||||||
}
|
}
|
||||||
|
else {
|
||||||
|
hMutex = xSemaphoreCreateMutexStatic (attr->cb_mem);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
if (mem == 0) {
|
if (mem == 0) {
|
||||||
if (rmtx != 0U) {
|
#if (configSUPPORT_DYNAMIC_ALLOCATION == 1)
|
||||||
hMutex = xSemaphoreCreateRecursiveMutex ();
|
if (rmtx != 0U) {
|
||||||
} else {
|
#if (configUSE_RECURSIVE_MUTEXES == 1)
|
||||||
hMutex = xSemaphoreCreateMutex ();
|
hMutex = xSemaphoreCreateRecursiveMutex ();
|
||||||
}
|
#endif
|
||||||
|
} else {
|
||||||
|
hMutex = xSemaphoreCreateMutex ();
|
||||||
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1320,6 +1402,7 @@ osStatus_t osMutexAcquire (osMutexId_t mutex_id, uint32_t timeout) {
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
if (rmtx != 0U) {
|
if (rmtx != 0U) {
|
||||||
|
#if (configUSE_RECURSIVE_MUTEXES == 1)
|
||||||
if (xSemaphoreTakeRecursive (hMutex, timeout) != pdPASS) {
|
if (xSemaphoreTakeRecursive (hMutex, timeout) != pdPASS) {
|
||||||
if (timeout != 0U) {
|
if (timeout != 0U) {
|
||||||
stat = osErrorTimeout;
|
stat = osErrorTimeout;
|
||||||
|
@ -1327,6 +1410,7 @@ osStatus_t osMutexAcquire (osMutexId_t mutex_id, uint32_t timeout) {
|
||||||
stat = osErrorResource;
|
stat = osErrorResource;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
if (xSemaphoreTake (hMutex, timeout) != pdPASS) {
|
if (xSemaphoreTake (hMutex, timeout) != pdPASS) {
|
||||||
|
@ -1361,9 +1445,11 @@ osStatus_t osMutexRelease (osMutexId_t mutex_id) {
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
if (rmtx != 0U) {
|
if (rmtx != 0U) {
|
||||||
|
#if (configUSE_RECURSIVE_MUTEXES == 1)
|
||||||
if (xSemaphoreGiveRecursive (hMutex) != pdPASS) {
|
if (xSemaphoreGiveRecursive (hMutex) != pdPASS) {
|
||||||
stat = osErrorResource;
|
stat = osErrorResource;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
if (xSemaphoreGive (hMutex) != pdPASS) {
|
if (xSemaphoreGive (hMutex) != pdPASS) {
|
||||||
|
@ -1416,6 +1502,7 @@ osStatus_t osMutexDelete (osMutexId_t mutex_id) {
|
||||||
|
|
||||||
return (stat);
|
return (stat);
|
||||||
}
|
}
|
||||||
|
#endif /* (configUSE_OS2_MUTEX == 1) */
|
||||||
|
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
@ -1448,10 +1535,14 @@ osSemaphoreId_t osSemaphoreNew (uint32_t max_count, uint32_t initial_count, cons
|
||||||
if (mem != -1) {
|
if (mem != -1) {
|
||||||
if (max_count == 1U) {
|
if (max_count == 1U) {
|
||||||
if (mem == 1) {
|
if (mem == 1) {
|
||||||
hSemaphore = xSemaphoreCreateBinaryStatic ((StaticSemaphore_t *)attr->cb_mem);
|
#if (configSUPPORT_STATIC_ALLOCATION == 1)
|
||||||
|
hSemaphore = xSemaphoreCreateBinaryStatic ((StaticSemaphore_t *)attr->cb_mem);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
hSemaphore = xSemaphoreCreateBinary();
|
#if (configSUPPORT_DYNAMIC_ALLOCATION == 1)
|
||||||
|
hSemaphore = xSemaphoreCreateBinary();
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((hSemaphore != NULL) && (initial_count != 0U)) {
|
if ((hSemaphore != NULL) && (initial_count != 0U)) {
|
||||||
|
@ -1463,10 +1554,14 @@ osSemaphoreId_t osSemaphoreNew (uint32_t max_count, uint32_t initial_count, cons
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
if (mem == 1) {
|
if (mem == 1) {
|
||||||
hSemaphore = xSemaphoreCreateCountingStatic (max_count, initial_count, (StaticSemaphore_t *)attr->cb_mem);
|
#if (configSUPPORT_STATIC_ALLOCATION == 1)
|
||||||
|
hSemaphore = xSemaphoreCreateCountingStatic (max_count, initial_count, (StaticSemaphore_t *)attr->cb_mem);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
hSemaphore = xSemaphoreCreateCounting (max_count, initial_count);
|
#if (configSUPPORT_DYNAMIC_ALLOCATION == 1)
|
||||||
|
hSemaphore = xSemaphoreCreateCounting (max_count, initial_count);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1624,11 +1719,15 @@ osMessageQueueId_t osMessageQueueNew (uint32_t msg_count, uint32_t msg_size, con
|
||||||
}
|
}
|
||||||
|
|
||||||
if (mem == 1) {
|
if (mem == 1) {
|
||||||
hQueue = xQueueCreateStatic (msg_count, msg_size, attr->mq_mem, attr->cb_mem);
|
#if (configSUPPORT_STATIC_ALLOCATION == 1)
|
||||||
|
hQueue = xQueueCreateStatic (msg_count, msg_size, attr->mq_mem, attr->cb_mem);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
if (mem == 0) {
|
if (mem == 0) {
|
||||||
hQueue = xQueueCreate (msg_count, msg_size);
|
#if (configSUPPORT_DYNAMIC_ALLOCATION == 1)
|
||||||
|
hQueue = xQueueCreate (msg_count, msg_size);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1842,6 +1941,463 @@ osStatus_t osMessageQueueDelete (osMessageQueueId_t mq_id) {
|
||||||
return (stat);
|
return (stat);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*/
|
||||||
|
#ifdef FREERTOS_MPOOL_H_
|
||||||
|
|
||||||
|
/* Static memory pool functions */
|
||||||
|
static void FreeBlock (MemPool_t *mp, void *block);
|
||||||
|
static void *AllocBlock (MemPool_t *mp);
|
||||||
|
static void *CreateBlock (MemPool_t *mp);
|
||||||
|
|
||||||
|
osMemoryPoolId_t osMemoryPoolNew (uint32_t block_count, uint32_t block_size, const osMemoryPoolAttr_t *attr) {
|
||||||
|
MemPool_t *mp;
|
||||||
|
const char *name;
|
||||||
|
int32_t mem_cb, mem_mp;
|
||||||
|
uint32_t sz;
|
||||||
|
|
||||||
|
if (IS_IRQ()) {
|
||||||
|
mp = NULL;
|
||||||
|
}
|
||||||
|
else if ((block_count == 0U) || (block_size == 0U)) {
|
||||||
|
mp = NULL;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
mp = NULL;
|
||||||
|
sz = MEMPOOL_ARR_SIZE (block_count, block_size);
|
||||||
|
|
||||||
|
name = NULL;
|
||||||
|
mem_cb = -1;
|
||||||
|
mem_mp = -1;
|
||||||
|
|
||||||
|
if (attr != NULL) {
|
||||||
|
if (attr->name != NULL) {
|
||||||
|
name = attr->name;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((attr->cb_mem != NULL) && (attr->cb_size >= sizeof(MemPool_t))) {
|
||||||
|
/* Static control block is provided */
|
||||||
|
mem_cb = 1;
|
||||||
|
}
|
||||||
|
else if ((attr->cb_mem == NULL) && (attr->cb_size == 0U)) {
|
||||||
|
/* Allocate control block memory on heap */
|
||||||
|
mem_cb = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((attr->mp_mem == NULL) && (attr->mp_size == 0U)) {
|
||||||
|
/* Allocate memory array on heap */
|
||||||
|
mem_mp = 0;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if (attr->mp_mem != NULL) {
|
||||||
|
/* Check if array is 4-byte aligned */
|
||||||
|
if (((uint32_t)attr->mp_mem & 3U) == 0U) {
|
||||||
|
/* Check if array big enough */
|
||||||
|
if (attr->mp_size >= sz) {
|
||||||
|
/* Static memory pool array is provided */
|
||||||
|
mem_mp = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
/* Attributes not provided, allocate memory on heap */
|
||||||
|
mem_cb = 0;
|
||||||
|
mem_mp = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (mem_cb == 0) {
|
||||||
|
mp = pvPortMalloc (sizeof(MemPool_t));
|
||||||
|
} else {
|
||||||
|
mp = attr->cb_mem;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (mp != NULL) {
|
||||||
|
/* Create a semaphore (max count == initial count == block_count) */
|
||||||
|
#if (configSUPPORT_STATIC_ALLOCATION == 1)
|
||||||
|
mp->sem = xSemaphoreCreateCountingStatic (block_count, block_count, &mp->mem_sem);
|
||||||
|
#elif (configSUPPORT_DYNAMIC_ALLOCATION == 1)
|
||||||
|
mp->sem = xSemaphoreCreateCounting (block_count, block_count);
|
||||||
|
#else
|
||||||
|
mp->sem == NULL;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if (mp->sem != NULL) {
|
||||||
|
/* Setup memory array */
|
||||||
|
if (mem_mp == 0) {
|
||||||
|
mp->mem_arr = pvPortMalloc (sz);
|
||||||
|
} else {
|
||||||
|
mp->mem_arr = attr->mp_mem;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((mp != NULL) && (mp->mem_arr != NULL)) {
|
||||||
|
/* Memory pool can be created */
|
||||||
|
mp->head = NULL;
|
||||||
|
mp->mem_sz = sz;
|
||||||
|
mp->name = name;
|
||||||
|
mp->bl_sz = block_size;
|
||||||
|
mp->bl_cnt = block_count;
|
||||||
|
mp->n = 0U;
|
||||||
|
|
||||||
|
/* Set heap allocated memory flags */
|
||||||
|
mp->status = MPOOL_STATUS;
|
||||||
|
|
||||||
|
if (mem_cb == 0) {
|
||||||
|
/* Control block on heap */
|
||||||
|
mp->status |= 1U;
|
||||||
|
}
|
||||||
|
if (mem_mp == 0) {
|
||||||
|
/* Memory array on heap */
|
||||||
|
mp->status |= 2U;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
/* Memory pool cannot be created, release allocated resources */
|
||||||
|
if ((mem_cb == 0) && (mp != NULL)) {
|
||||||
|
/* Free control block memory */
|
||||||
|
vPortFree (mp);
|
||||||
|
}
|
||||||
|
mp = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return (mp);
|
||||||
|
}
|
||||||
|
|
||||||
|
const char *osMemoryPoolGetName (osMemoryPoolId_t mp_id) {
|
||||||
|
MemPool_t *mp = (osMemoryPoolId_t)mp_id;
|
||||||
|
const char *p;
|
||||||
|
|
||||||
|
if (IS_IRQ()) {
|
||||||
|
p = NULL;
|
||||||
|
}
|
||||||
|
else if (mp_id == NULL) {
|
||||||
|
p = NULL;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
p = mp->name;
|
||||||
|
}
|
||||||
|
|
||||||
|
return (p);
|
||||||
|
}
|
||||||
|
|
||||||
|
void *osMemoryPoolAlloc (osMemoryPoolId_t mp_id, uint32_t timeout) {
|
||||||
|
MemPool_t *mp;
|
||||||
|
void *block;
|
||||||
|
uint32_t isrm;
|
||||||
|
|
||||||
|
if (mp_id == NULL) {
|
||||||
|
/* Invalid input parameters */
|
||||||
|
block = NULL;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
block = NULL;
|
||||||
|
|
||||||
|
mp = (MemPool_t *)mp_id;
|
||||||
|
|
||||||
|
if ((mp->status & MPOOL_STATUS) == MPOOL_STATUS) {
|
||||||
|
if (IS_IRQ()) {
|
||||||
|
if (timeout == 0U) {
|
||||||
|
if (xSemaphoreTakeFromISR (mp->sem, NULL) == pdTRUE) {
|
||||||
|
if ((mp->status & MPOOL_STATUS) == MPOOL_STATUS) {
|
||||||
|
isrm = taskENTER_CRITICAL_FROM_ISR();
|
||||||
|
|
||||||
|
/* Get a block from the free-list */
|
||||||
|
block = AllocBlock(mp);
|
||||||
|
|
||||||
|
if (block == NULL) {
|
||||||
|
/* List of free blocks is empty, 'create' new block */
|
||||||
|
block = CreateBlock(mp);
|
||||||
|
}
|
||||||
|
|
||||||
|
taskEXIT_CRITICAL_FROM_ISR(isrm);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if (xSemaphoreTake (mp->sem, (TickType_t)timeout) == pdTRUE) {
|
||||||
|
if ((mp->status & MPOOL_STATUS) == MPOOL_STATUS) {
|
||||||
|
taskENTER_CRITICAL();
|
||||||
|
|
||||||
|
/* Get a block from the free-list */
|
||||||
|
block = AllocBlock(mp);
|
||||||
|
|
||||||
|
if (block == NULL) {
|
||||||
|
/* List of free blocks is empty, 'create' new block */
|
||||||
|
block = CreateBlock(mp);
|
||||||
|
}
|
||||||
|
|
||||||
|
taskEXIT_CRITICAL();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return (block);
|
||||||
|
}
|
||||||
|
|
||||||
|
osStatus_t osMemoryPoolFree (osMemoryPoolId_t mp_id, void *block) {
|
||||||
|
MemPool_t *mp;
|
||||||
|
osStatus_t stat;
|
||||||
|
uint32_t isrm;
|
||||||
|
BaseType_t yield;
|
||||||
|
|
||||||
|
if ((mp_id == NULL) || (block == NULL)) {
|
||||||
|
/* Invalid input parameters */
|
||||||
|
stat = osErrorParameter;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
mp = (MemPool_t *)mp_id;
|
||||||
|
|
||||||
|
if ((mp->status & MPOOL_STATUS) != MPOOL_STATUS) {
|
||||||
|
/* Invalid object status */
|
||||||
|
stat = osErrorResource;
|
||||||
|
}
|
||||||
|
else if ((block < (void *)&mp->mem_arr[0]) || (block > (void*)&mp->mem_arr[mp->mem_sz-1])) {
|
||||||
|
/* Block pointer outside of memory array area */
|
||||||
|
stat = osErrorParameter;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
stat = osOK;
|
||||||
|
|
||||||
|
if (IS_IRQ()) {
|
||||||
|
if (uxSemaphoreGetCountFromISR (mp->sem) == mp->bl_cnt) {
|
||||||
|
stat = osErrorResource;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
isrm = taskENTER_CRITICAL_FROM_ISR();
|
||||||
|
|
||||||
|
/* Add block to the list of free blocks */
|
||||||
|
FreeBlock(mp, block);
|
||||||
|
|
||||||
|
taskEXIT_CRITICAL_FROM_ISR(isrm);
|
||||||
|
|
||||||
|
yield = pdFALSE;
|
||||||
|
xSemaphoreGiveFromISR (mp->sem, &yield);
|
||||||
|
portYIELD_FROM_ISR (yield);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if (uxSemaphoreGetCount (mp->sem) == mp->bl_cnt) {
|
||||||
|
stat = osErrorResource;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
taskENTER_CRITICAL();
|
||||||
|
|
||||||
|
/* Add block to the list of free blocks */
|
||||||
|
FreeBlock(mp, block);
|
||||||
|
|
||||||
|
taskEXIT_CRITICAL();
|
||||||
|
|
||||||
|
xSemaphoreGive (mp->sem);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return (stat);
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32_t osMemoryPoolGetCapacity (osMemoryPoolId_t mp_id) {
|
||||||
|
MemPool_t *mp;
|
||||||
|
uint32_t n;
|
||||||
|
|
||||||
|
if (mp_id == NULL) {
|
||||||
|
/* Invalid input parameters */
|
||||||
|
n = 0U;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
mp = (MemPool_t *)mp_id;
|
||||||
|
|
||||||
|
if ((mp->status & MPOOL_STATUS) != MPOOL_STATUS) {
|
||||||
|
/* Invalid object status */
|
||||||
|
n = 0U;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
n = mp->bl_cnt;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Return maximum number of memory blocks */
|
||||||
|
return (n);
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32_t osMemoryPoolGetBlockSize (osMemoryPoolId_t mp_id) {
|
||||||
|
MemPool_t *mp;
|
||||||
|
uint32_t sz;
|
||||||
|
|
||||||
|
if (mp_id == NULL) {
|
||||||
|
/* Invalid input parameters */
|
||||||
|
sz = 0U;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
mp = (MemPool_t *)mp_id;
|
||||||
|
|
||||||
|
if ((mp->status & MPOOL_STATUS) != MPOOL_STATUS) {
|
||||||
|
/* Invalid object status */
|
||||||
|
sz = 0U;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
sz = mp->bl_sz;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Return memory block size in bytes */
|
||||||
|
return (sz);
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32_t osMemoryPoolGetCount (osMemoryPoolId_t mp_id) {
|
||||||
|
MemPool_t *mp;
|
||||||
|
uint32_t n;
|
||||||
|
|
||||||
|
if (mp_id == NULL) {
|
||||||
|
/* Invalid input parameters */
|
||||||
|
n = 0U;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
mp = (MemPool_t *)mp_id;
|
||||||
|
|
||||||
|
if ((mp->status & MPOOL_STATUS) != MPOOL_STATUS) {
|
||||||
|
/* Invalid object status */
|
||||||
|
n = 0U;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if (IS_IRQ()) {
|
||||||
|
n = uxSemaphoreGetCountFromISR (mp->sem);
|
||||||
|
} else {
|
||||||
|
n = uxSemaphoreGetCount (mp->sem);
|
||||||
|
}
|
||||||
|
|
||||||
|
n = mp->bl_cnt - n;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Return number of memory blocks used */
|
||||||
|
return (n);
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32_t osMemoryPoolGetSpace (osMemoryPoolId_t mp_id) {
|
||||||
|
MemPool_t *mp;
|
||||||
|
uint32_t n;
|
||||||
|
|
||||||
|
if (mp_id == NULL) {
|
||||||
|
/* Invalid input parameters */
|
||||||
|
n = 0U;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
mp = (MemPool_t *)mp_id;
|
||||||
|
|
||||||
|
if ((mp->status & MPOOL_STATUS) != MPOOL_STATUS) {
|
||||||
|
/* Invalid object status */
|
||||||
|
n = 0U;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if (IS_IRQ()) {
|
||||||
|
n = uxSemaphoreGetCountFromISR (mp->sem);
|
||||||
|
} else {
|
||||||
|
n = uxSemaphoreGetCount (mp->sem);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Return number of memory blocks available */
|
||||||
|
return (n);
|
||||||
|
}
|
||||||
|
|
||||||
|
osStatus_t osMemoryPoolDelete (osMemoryPoolId_t mp_id) {
|
||||||
|
MemPool_t *mp;
|
||||||
|
osStatus_t stat;
|
||||||
|
|
||||||
|
if (mp_id == NULL) {
|
||||||
|
/* Invalid input parameters */
|
||||||
|
stat = osErrorParameter;
|
||||||
|
}
|
||||||
|
else if (IS_IRQ()) {
|
||||||
|
stat = osErrorISR;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
mp = (MemPool_t *)mp_id;
|
||||||
|
|
||||||
|
taskENTER_CRITICAL();
|
||||||
|
|
||||||
|
/* Invalidate control block status */
|
||||||
|
mp->status = mp->status & 3U;
|
||||||
|
|
||||||
|
/* Wake-up tasks waiting for pool semaphore */
|
||||||
|
while (xSemaphoreGive (mp->sem) == pdTRUE);
|
||||||
|
|
||||||
|
mp->head = NULL;
|
||||||
|
mp->bl_sz = 0U;
|
||||||
|
mp->bl_cnt = 0U;
|
||||||
|
|
||||||
|
if ((mp->status & 2U) != 0U) {
|
||||||
|
/* Memory pool array allocated on heap */
|
||||||
|
vPortFree (mp->mem_arr);
|
||||||
|
}
|
||||||
|
if ((mp->status & 1U) != 0U) {
|
||||||
|
/* Memory pool control block allocated on heap */
|
||||||
|
vPortFree (mp);
|
||||||
|
}
|
||||||
|
|
||||||
|
taskEXIT_CRITICAL();
|
||||||
|
|
||||||
|
stat = osOK;
|
||||||
|
}
|
||||||
|
|
||||||
|
return (stat);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
Create new block given according to the current block index.
|
||||||
|
*/
|
||||||
|
static void *CreateBlock (MemPool_t *mp) {
|
||||||
|
MemPoolBlock_t *p = NULL;
|
||||||
|
|
||||||
|
if (mp->n < mp->bl_cnt) {
|
||||||
|
/* Unallocated blocks exist, set pointer to new block */
|
||||||
|
p = (void *)(mp->mem_arr + (mp->bl_sz * mp->n));
|
||||||
|
|
||||||
|
/* Increment block index */
|
||||||
|
mp->n += 1U;
|
||||||
|
}
|
||||||
|
|
||||||
|
return (p);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
Allocate a block by reading the list of free blocks.
|
||||||
|
*/
|
||||||
|
static void *AllocBlock (MemPool_t *mp) {
|
||||||
|
MemPoolBlock_t *p = NULL;
|
||||||
|
|
||||||
|
if (mp->head != NULL) {
|
||||||
|
/* List of free block exists, get head block */
|
||||||
|
p = mp->head;
|
||||||
|
|
||||||
|
/* Head block is now next on the list */
|
||||||
|
mp->head = p->next;
|
||||||
|
}
|
||||||
|
|
||||||
|
return (p);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
Free block by putting it to the list of free blocks.
|
||||||
|
*/
|
||||||
|
static void FreeBlock (MemPool_t *mp, void *block) {
|
||||||
|
MemPoolBlock_t *p = block;
|
||||||
|
|
||||||
|
/* Store current head into block memory space */
|
||||||
|
p->next = mp->head;
|
||||||
|
|
||||||
|
/* Store current block as new head */
|
||||||
|
mp->head = p;
|
||||||
|
}
|
||||||
|
#endif /* FREERTOS_MPOOL_H_ */
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
/* Callback function prototypes */
|
/* Callback function prototypes */
|
||||||
|
@ -1886,28 +2442,25 @@ __WEAK void vApplicationDaemonTaskStartupHook (void){}
|
||||||
__WEAK void vApplicationStackOverflowHook (TaskHandle_t xTask, signed char *pcTaskName) {
|
__WEAK void vApplicationStackOverflowHook (TaskHandle_t xTask, signed char *pcTaskName) {
|
||||||
(void)xTask;
|
(void)xTask;
|
||||||
(void)pcTaskName;
|
(void)pcTaskName;
|
||||||
|
configASSERT(0);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
|
#if (configSUPPORT_STATIC_ALLOCATION == 1)
|
||||||
/* External Idle and Timer task static memory allocation functions */
|
/* External Idle and Timer task static memory allocation functions */
|
||||||
extern void vApplicationGetIdleTaskMemory (StaticTask_t **ppxIdleTaskTCBBuffer, StackType_t **ppxIdleTaskStackBuffer, uint32_t *pulIdleTaskStackSize);
|
extern void vApplicationGetIdleTaskMemory (StaticTask_t **ppxIdleTaskTCBBuffer, StackType_t **ppxIdleTaskStackBuffer, uint32_t *pulIdleTaskStackSize);
|
||||||
extern void vApplicationGetTimerTaskMemory (StaticTask_t **ppxTimerTaskTCBBuffer, StackType_t **ppxTimerTaskStackBuffer, uint32_t *pulTimerTaskStackSize);
|
extern void vApplicationGetTimerTaskMemory (StaticTask_t **ppxTimerTaskTCBBuffer, StackType_t **ppxTimerTaskStackBuffer, uint32_t *pulTimerTaskStackSize);
|
||||||
|
|
||||||
/* Idle task control block and stack */
|
|
||||||
static StaticTask_t Idle_TCB;
|
|
||||||
static StackType_t Idle_Stack[configMINIMAL_STACK_SIZE];
|
|
||||||
|
|
||||||
/* Timer task control block and stack */
|
|
||||||
static StaticTask_t Timer_TCB;
|
|
||||||
static StackType_t Timer_Stack[configTIMER_TASK_STACK_DEPTH];
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
vApplicationGetIdleTaskMemory gets called when configSUPPORT_STATIC_ALLOCATION
|
vApplicationGetIdleTaskMemory gets called when configSUPPORT_STATIC_ALLOCATION
|
||||||
equals to 1 and is required for static memory allocation support.
|
equals to 1 and is required for static memory allocation support.
|
||||||
*/
|
*/
|
||||||
void vApplicationGetIdleTaskMemory (StaticTask_t **ppxIdleTaskTCBBuffer, StackType_t **ppxIdleTaskStackBuffer, uint32_t *pulIdleTaskStackSize) {
|
__WEAK void vApplicationGetIdleTaskMemory (StaticTask_t **ppxIdleTaskTCBBuffer, StackType_t **ppxIdleTaskStackBuffer, uint32_t *pulIdleTaskStackSize) {
|
||||||
|
/* Idle task control block and stack */
|
||||||
|
static StaticTask_t Idle_TCB;
|
||||||
|
static StackType_t Idle_Stack[configMINIMAL_STACK_SIZE];
|
||||||
|
|
||||||
*ppxIdleTaskTCBBuffer = &Idle_TCB;
|
*ppxIdleTaskTCBBuffer = &Idle_TCB;
|
||||||
*ppxIdleTaskStackBuffer = &Idle_Stack[0];
|
*ppxIdleTaskStackBuffer = &Idle_Stack[0];
|
||||||
*pulIdleTaskStackSize = (uint32_t)configMINIMAL_STACK_SIZE;
|
*pulIdleTaskStackSize = (uint32_t)configMINIMAL_STACK_SIZE;
|
||||||
|
@ -1917,8 +2470,13 @@ void vApplicationGetIdleTaskMemory (StaticTask_t **ppxIdleTaskTCBBuffer, StackTy
|
||||||
vApplicationGetTimerTaskMemory gets called when configSUPPORT_STATIC_ALLOCATION
|
vApplicationGetTimerTaskMemory gets called when configSUPPORT_STATIC_ALLOCATION
|
||||||
equals to 1 and is required for static memory allocation support.
|
equals to 1 and is required for static memory allocation support.
|
||||||
*/
|
*/
|
||||||
void vApplicationGetTimerTaskMemory (StaticTask_t **ppxTimerTaskTCBBuffer, StackType_t **ppxTimerTaskStackBuffer, uint32_t *pulTimerTaskStackSize) {
|
__WEAK void vApplicationGetTimerTaskMemory (StaticTask_t **ppxTimerTaskTCBBuffer, StackType_t **ppxTimerTaskStackBuffer, uint32_t *pulTimerTaskStackSize) {
|
||||||
|
/* Timer task control block and stack */
|
||||||
|
static StaticTask_t Timer_TCB;
|
||||||
|
static StackType_t Timer_Stack[configTIMER_TASK_STACK_DEPTH];
|
||||||
|
|
||||||
*ppxTimerTaskTCBBuffer = &Timer_TCB;
|
*ppxTimerTaskTCBBuffer = &Timer_TCB;
|
||||||
*ppxTimerTaskStackBuffer = &Timer_Stack[0];
|
*ppxTimerTaskStackBuffer = &Timer_Stack[0];
|
||||||
*pulTimerTaskStackSize = (uint32_t)configTIMER_TASK_STACK_DEPTH;
|
*pulTimerTaskStackSize = (uint32_t)configTIMER_TASK_STACK_DEPTH;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
63
Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS_V2/freertos_mpool.h
vendored
Normal file
63
Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS_V2/freertos_mpool.h
vendored
Normal file
|
@ -0,0 +1,63 @@
|
||||||
|
/* --------------------------------------------------------------------------
|
||||||
|
* Copyright (c) 2013-2020 Arm Limited. All rights reserved.
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the License); you may
|
||||||
|
* not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an AS IS BASIS, WITHOUT
|
||||||
|
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*
|
||||||
|
* Name: freertos_mpool.h
|
||||||
|
* Purpose: CMSIS RTOS2 wrapper for FreeRTOS
|
||||||
|
*
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#ifndef FREERTOS_MPOOL_H_
|
||||||
|
#define FREERTOS_MPOOL_H_
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
#include "FreeRTOS.h"
|
||||||
|
#include "semphr.h"
|
||||||
|
|
||||||
|
/* Memory Pool implementation definitions */
|
||||||
|
#define MPOOL_STATUS 0x5EED0000U
|
||||||
|
|
||||||
|
/* Memory Block header */
|
||||||
|
typedef struct {
|
||||||
|
void *next; /* Pointer to next block */
|
||||||
|
} MemPoolBlock_t;
|
||||||
|
|
||||||
|
/* Memory Pool control block */
|
||||||
|
typedef struct MemPoolDef_t {
|
||||||
|
MemPoolBlock_t *head; /* Pointer to head block */
|
||||||
|
SemaphoreHandle_t sem; /* Pool semaphore handle */
|
||||||
|
uint8_t *mem_arr; /* Pool memory array */
|
||||||
|
uint32_t mem_sz; /* Pool memory array size */
|
||||||
|
const char *name; /* Pointer to name string */
|
||||||
|
uint32_t bl_sz; /* Size of a single block */
|
||||||
|
uint32_t bl_cnt; /* Number of blocks */
|
||||||
|
uint32_t n; /* Block allocation index */
|
||||||
|
volatile uint32_t status; /* Object status flags */
|
||||||
|
#if (configSUPPORT_STATIC_ALLOCATION == 1)
|
||||||
|
StaticSemaphore_t mem_sem; /* Semaphore object memory */
|
||||||
|
#endif
|
||||||
|
} MemPool_t;
|
||||||
|
|
||||||
|
/* No need to hide static object type, just align to coding style */
|
||||||
|
#define StaticMemPool_t MemPool_t
|
||||||
|
|
||||||
|
/* Define memory pool control block size */
|
||||||
|
#define MEMPOOL_CB_SIZE (sizeof(StaticMemPool_t))
|
||||||
|
|
||||||
|
/* Define size of the byte array required to create count of blocks of given size */
|
||||||
|
#define MEMPOOL_ARR_SIZE(bl_count, bl_size) (((((bl_size) + (4 - 1)) / 4) * 4)*(bl_count))
|
||||||
|
|
||||||
|
#endif /* FREERTOS_MPOOL_H_ */
|
310
Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS_V2/freertos_os2.h
vendored
Normal file
310
Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS_V2/freertos_os2.h
vendored
Normal file
|
@ -0,0 +1,310 @@
|
||||||
|
/* --------------------------------------------------------------------------
|
||||||
|
* Copyright (c) 2013-2020 Arm Limited. All rights reserved.
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the License); you may
|
||||||
|
* not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an AS IS BASIS, WITHOUT
|
||||||
|
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*
|
||||||
|
* Name: freertos_os2.h
|
||||||
|
* Purpose: CMSIS RTOS2 wrapper for FreeRTOS
|
||||||
|
*
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#ifndef FREERTOS_OS2_H_
|
||||||
|
#define FREERTOS_OS2_H_
|
||||||
|
|
||||||
|
#include <string.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
#include "FreeRTOS.h" // ARM.FreeRTOS::RTOS:Core
|
||||||
|
|
||||||
|
#include CMSIS_device_header
|
||||||
|
|
||||||
|
/*
|
||||||
|
CMSIS-RTOS2 FreeRTOS image size optimization definitions.
|
||||||
|
|
||||||
|
Note: Definitions configUSE_OS2 can be used to optimize FreeRTOS image size when
|
||||||
|
certain functionality is not required when using CMSIS-RTOS2 API.
|
||||||
|
In general optimization decisions are left to the tool chain but in cases
|
||||||
|
when coding style prevents it to optimize the code following optional
|
||||||
|
definitions can be used.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
Option to exclude CMSIS-RTOS2 functions osThreadSuspend and osThreadResume from
|
||||||
|
the application image.
|
||||||
|
*/
|
||||||
|
#ifndef configUSE_OS2_THREAD_SUSPEND_RESUME
|
||||||
|
#define configUSE_OS2_THREAD_SUSPEND_RESUME 1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
Option to exclude CMSIS-RTOS2 function osThreadEnumerate from the application image.
|
||||||
|
*/
|
||||||
|
#ifndef configUSE_OS2_THREAD_ENUMERATE
|
||||||
|
#define configUSE_OS2_THREAD_ENUMERATE 1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
Option to disable CMSIS-RTOS2 function osEventFlagsSet and osEventFlagsClear
|
||||||
|
operation from ISR.
|
||||||
|
*/
|
||||||
|
#ifndef configUSE_OS2_EVENTFLAGS_FROM_ISR
|
||||||
|
#define configUSE_OS2_EVENTFLAGS_FROM_ISR 1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
Option to exclude CMSIS-RTOS2 Thread Flags API functions from the application image.
|
||||||
|
*/
|
||||||
|
#ifndef configUSE_OS2_THREAD_FLAGS
|
||||||
|
#define configUSE_OS2_THREAD_FLAGS configUSE_TASK_NOTIFICATIONS
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
Option to exclude CMSIS-RTOS2 Timer API functions from the application image.
|
||||||
|
*/
|
||||||
|
#ifndef configUSE_OS2_TIMER
|
||||||
|
#define configUSE_OS2_TIMER configUSE_TIMERS
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
Option to exclude CMSIS-RTOS2 Mutex API functions from the application image.
|
||||||
|
*/
|
||||||
|
#ifndef configUSE_OS2_MUTEX
|
||||||
|
#define configUSE_OS2_MUTEX configUSE_MUTEXES
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
CMSIS-RTOS2 FreeRTOS configuration check (FreeRTOSConfig.h).
|
||||||
|
|
||||||
|
Note: CMSIS-RTOS API requires functions included by using following definitions.
|
||||||
|
In case if certain API function is not used compiler will optimize it away.
|
||||||
|
*/
|
||||||
|
#if (INCLUDE_xSemaphoreGetMutexHolder == 0)
|
||||||
|
/*
|
||||||
|
CMSIS-RTOS2 function osMutexGetOwner uses FreeRTOS function xSemaphoreGetMutexHolder. In case if
|
||||||
|
osMutexGetOwner is not used in the application image, compiler will optimize it away.
|
||||||
|
Set #define INCLUDE_xSemaphoreGetMutexHolder 1 to fix this error.
|
||||||
|
*/
|
||||||
|
#error "Definition INCLUDE_xSemaphoreGetMutexHolder must equal 1 to implement Mutex Management API."
|
||||||
|
#endif
|
||||||
|
#if (INCLUDE_vTaskDelay == 0)
|
||||||
|
/*
|
||||||
|
CMSIS-RTOS2 function osDelay uses FreeRTOS function vTaskDelay. In case if
|
||||||
|
osDelay is not used in the application image, compiler will optimize it away.
|
||||||
|
Set #define INCLUDE_vTaskDelay 1 to fix this error.
|
||||||
|
*/
|
||||||
|
#error "Definition INCLUDE_vTaskDelay must equal 1 to implement Generic Wait Functions API."
|
||||||
|
#endif
|
||||||
|
#if (INCLUDE_vTaskDelayUntil == 0)
|
||||||
|
/*
|
||||||
|
CMSIS-RTOS2 function osDelayUntil uses FreeRTOS function vTaskDelayUntil. In case if
|
||||||
|
osDelayUntil is not used in the application image, compiler will optimize it away.
|
||||||
|
Set #define INCLUDE_vTaskDelayUntil 1 to fix this error.
|
||||||
|
*/
|
||||||
|
#error "Definition INCLUDE_vTaskDelayUntil must equal 1 to implement Generic Wait Functions API."
|
||||||
|
#endif
|
||||||
|
#if (INCLUDE_vTaskDelete == 0)
|
||||||
|
/*
|
||||||
|
CMSIS-RTOS2 function osThreadTerminate and osThreadExit uses FreeRTOS function
|
||||||
|
vTaskDelete. In case if they are not used in the application image, compiler
|
||||||
|
will optimize them away.
|
||||||
|
Set #define INCLUDE_vTaskDelete 1 to fix this error.
|
||||||
|
*/
|
||||||
|
#error "Definition INCLUDE_vTaskDelete must equal 1 to implement Thread Management API."
|
||||||
|
#endif
|
||||||
|
#if (INCLUDE_xTaskGetCurrentTaskHandle == 0)
|
||||||
|
/*
|
||||||
|
CMSIS-RTOS2 API uses FreeRTOS function xTaskGetCurrentTaskHandle to implement
|
||||||
|
functions osThreadGetId, osThreadFlagsClear and osThreadFlagsGet. In case if these
|
||||||
|
functions are not used in the application image, compiler will optimize them away.
|
||||||
|
Set #define INCLUDE_xTaskGetCurrentTaskHandle 1 to fix this error.
|
||||||
|
*/
|
||||||
|
#error "Definition INCLUDE_xTaskGetCurrentTaskHandle must equal 1 to implement Thread Management API."
|
||||||
|
#endif
|
||||||
|
#if (INCLUDE_xTaskGetSchedulerState == 0)
|
||||||
|
/*
|
||||||
|
CMSIS-RTOS2 API uses FreeRTOS function xTaskGetSchedulerState to implement Kernel
|
||||||
|
tick handling and therefore it is vital that xTaskGetSchedulerState is included into
|
||||||
|
the application image.
|
||||||
|
Set #define INCLUDE_xTaskGetSchedulerState 1 to fix this error.
|
||||||
|
*/
|
||||||
|
#error "Definition INCLUDE_xTaskGetSchedulerState must equal 1 to implement Kernel Information and Control API."
|
||||||
|
#endif
|
||||||
|
#if (INCLUDE_uxTaskGetStackHighWaterMark == 0)
|
||||||
|
/*
|
||||||
|
CMSIS-RTOS2 function osThreadGetStackSpace uses FreeRTOS function uxTaskGetStackHighWaterMark.
|
||||||
|
In case if osThreadGetStackSpace is not used in the application image, compiler will
|
||||||
|
optimize it away.
|
||||||
|
Set #define INCLUDE_uxTaskGetStackHighWaterMark 1 to fix this error.
|
||||||
|
*/
|
||||||
|
#error "Definition INCLUDE_uxTaskGetStackHighWaterMark must equal 1 to implement Thread Management API."
|
||||||
|
#endif
|
||||||
|
#if (INCLUDE_uxTaskPriorityGet == 0)
|
||||||
|
/*
|
||||||
|
CMSIS-RTOS2 function osThreadGetPriority uses FreeRTOS function uxTaskPriorityGet. In case if
|
||||||
|
osThreadGetPriority is not used in the application image, compiler will optimize it away.
|
||||||
|
Set #define INCLUDE_uxTaskPriorityGet 1 to fix this error.
|
||||||
|
*/
|
||||||
|
#error "Definition INCLUDE_uxTaskPriorityGet must equal 1 to implement Thread Management API."
|
||||||
|
#endif
|
||||||
|
#if (INCLUDE_vTaskPrioritySet == 0)
|
||||||
|
/*
|
||||||
|
CMSIS-RTOS2 function osThreadSetPriority uses FreeRTOS function vTaskPrioritySet. In case if
|
||||||
|
osThreadSetPriority is not used in the application image, compiler will optimize it away.
|
||||||
|
Set #define INCLUDE_vTaskPrioritySet 1 to fix this error.
|
||||||
|
*/
|
||||||
|
#error "Definition INCLUDE_vTaskPrioritySet must equal 1 to implement Thread Management API."
|
||||||
|
#endif
|
||||||
|
#if (INCLUDE_eTaskGetState == 0)
|
||||||
|
/*
|
||||||
|
CMSIS-RTOS2 API uses FreeRTOS function vTaskDelayUntil to implement functions osThreadGetState
|
||||||
|
and osThreadTerminate. In case if these functions are not used in the application image,
|
||||||
|
compiler will optimize them away.
|
||||||
|
Set #define INCLUDE_eTaskGetState 1 to fix this error.
|
||||||
|
*/
|
||||||
|
#error "Definition INCLUDE_eTaskGetState must equal 1 to implement Thread Management API."
|
||||||
|
#endif
|
||||||
|
#if (INCLUDE_vTaskSuspend == 0)
|
||||||
|
/*
|
||||||
|
CMSIS-RTOS2 API uses FreeRTOS functions vTaskSuspend and vTaskResume to implement
|
||||||
|
functions osThreadSuspend and osThreadResume. In case if these functions are not
|
||||||
|
used in the application image, compiler will optimize them away.
|
||||||
|
Set #define INCLUDE_vTaskSuspend 1 to fix this error.
|
||||||
|
|
||||||
|
Alternatively, if the application does not use osThreadSuspend and
|
||||||
|
osThreadResume they can be excluded from the image code by setting:
|
||||||
|
#define configUSE_OS2_THREAD_SUSPEND_RESUME 0 (in FreeRTOSConfig.h)
|
||||||
|
*/
|
||||||
|
#if (configUSE_OS2_THREAD_SUSPEND_RESUME == 1)
|
||||||
|
#error "Definition INCLUDE_vTaskSuspend must equal 1 to implement Kernel Information and Control API."
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
#if (INCLUDE_xTimerPendFunctionCall == 0)
|
||||||
|
/*
|
||||||
|
CMSIS-RTOS2 function osEventFlagsSet and osEventFlagsClear, when called from
|
||||||
|
the ISR, call FreeRTOS functions xEventGroupSetBitsFromISR and
|
||||||
|
xEventGroupClearBitsFromISR which are only enabled if timers are operational and
|
||||||
|
xTimerPendFunctionCall in enabled.
|
||||||
|
Set #define INCLUDE_xTimerPendFunctionCall 1 and #define configUSE_TIMERS 1
|
||||||
|
to fix this error.
|
||||||
|
|
||||||
|
Alternatively, if the application does not use osEventFlagsSet and osEventFlagsClear
|
||||||
|
from the ISR their operation from ISR can be restricted by setting:
|
||||||
|
#define configUSE_OS2_EVENTFLAGS_FROM_ISR 0 (in FreeRTOSConfig.h)
|
||||||
|
*/
|
||||||
|
#if (configUSE_OS2_EVENTFLAGS_FROM_ISR == 1)
|
||||||
|
#error "Definition INCLUDE_xTimerPendFunctionCall must equal 1 to implement Event Flags API."
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if (configUSE_TIMERS == 0)
|
||||||
|
/*
|
||||||
|
CMSIS-RTOS2 Timer Management API functions use FreeRTOS timer functions to implement
|
||||||
|
timer management. In case if these functions are not used in the application image,
|
||||||
|
compiler will optimize them away.
|
||||||
|
Set #define configUSE_TIMERS 1 to fix this error.
|
||||||
|
|
||||||
|
Alternatively, if the application does not use timer functions they can be
|
||||||
|
excluded from the image code by setting:
|
||||||
|
#define configUSE_OS2_TIMER 0 (in FreeRTOSConfig.h)
|
||||||
|
*/
|
||||||
|
#if (configUSE_OS2_TIMER == 1)
|
||||||
|
#error "Definition configUSE_TIMERS must equal 1 to implement Timer Management API."
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if (configUSE_MUTEXES == 0)
|
||||||
|
/*
|
||||||
|
CMSIS-RTOS2 Mutex Management API functions use FreeRTOS mutex functions to implement
|
||||||
|
mutex management. In case if these functions are not used in the application image,
|
||||||
|
compiler will optimize them away.
|
||||||
|
Set #define configUSE_MUTEXES 1 to fix this error.
|
||||||
|
|
||||||
|
Alternatively, if the application does not use mutex functions they can be
|
||||||
|
excluded from the image code by setting:
|
||||||
|
#define configUSE_OS2_MUTEX 0 (in FreeRTOSConfig.h)
|
||||||
|
*/
|
||||||
|
#if (configUSE_OS2_MUTEX == 1)
|
||||||
|
#error "Definition configUSE_MUTEXES must equal 1 to implement Mutex Management API."
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if (configUSE_COUNTING_SEMAPHORES == 0)
|
||||||
|
/*
|
||||||
|
CMSIS-RTOS2 Memory Pool functions use FreeRTOS function xSemaphoreCreateCounting
|
||||||
|
to implement memory pools. In case if these functions are not used in the application image,
|
||||||
|
compiler will optimize them away.
|
||||||
|
Set #define configUSE_COUNTING_SEMAPHORES 1 to fix this error.
|
||||||
|
*/
|
||||||
|
#error "Definition configUSE_COUNTING_SEMAPHORES must equal 1 to implement Memory Pool API."
|
||||||
|
#endif
|
||||||
|
#if (configUSE_TASK_NOTIFICATIONS == 0)
|
||||||
|
/*
|
||||||
|
CMSIS-RTOS2 Thread Flags API functions use FreeRTOS Task Notification functions to implement
|
||||||
|
thread flag management. In case if these functions are not used in the application image,
|
||||||
|
compiler will optimize them away.
|
||||||
|
Set #define configUSE_TASK_NOTIFICATIONS 1 to fix this error.
|
||||||
|
|
||||||
|
Alternatively, if the application does not use thread flags functions they can be
|
||||||
|
excluded from the image code by setting:
|
||||||
|
#define configUSE_OS2_THREAD_FLAGS 0 (in FreeRTOSConfig.h)
|
||||||
|
*/
|
||||||
|
#if (configUSE_OS2_THREAD_FLAGS == 1)
|
||||||
|
#error "Definition configUSE_TASK_NOTIFICATIONS must equal 1 to implement Thread Flags API."
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if (configUSE_TRACE_FACILITY == 0)
|
||||||
|
/*
|
||||||
|
CMSIS-RTOS2 function osThreadEnumerate requires FreeRTOS function uxTaskGetSystemState
|
||||||
|
which is only enabled if configUSE_TRACE_FACILITY == 1.
|
||||||
|
Set #define configUSE_TRACE_FACILITY 1 to fix this error.
|
||||||
|
|
||||||
|
Alternatively, if the application does not use osThreadEnumerate it can be
|
||||||
|
excluded from the image code by setting:
|
||||||
|
#define configUSE_OS2_THREAD_ENUMERATE 0 (in FreeRTOSConfig.h)
|
||||||
|
*/
|
||||||
|
#if (configUSE_OS2_THREAD_ENUMERATE == 1)
|
||||||
|
#error "Definition configUSE_TRACE_FACILITY must equal 1 to implement osThreadEnumerate."
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if (configUSE_16_BIT_TICKS == 1)
|
||||||
|
/*
|
||||||
|
CMSIS-RTOS2 wrapper for FreeRTOS relies on 32-bit tick timer which is also optimal on
|
||||||
|
a 32-bit CPU architectures.
|
||||||
|
Set #define configUSE_16_BIT_TICKS 0 to fix this error.
|
||||||
|
*/
|
||||||
|
#error "Definition configUSE_16_BIT_TICKS must be zero to implement CMSIS-RTOS2 API."
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if (configMAX_PRIORITIES != 56)
|
||||||
|
/*
|
||||||
|
CMSIS-RTOS2 defines 56 different priorities (see osPriority_t) and portable CMSIS-RTOS2
|
||||||
|
implementation should implement the same number of priorities.
|
||||||
|
Set #define configMAX_PRIORITIES 56 to fix this error.
|
||||||
|
*/
|
||||||
|
#error "Definition configMAX_PRIORITIES must equal 56 to implement Thread Management API."
|
||||||
|
#endif
|
||||||
|
#if (configUSE_PORT_OPTIMISED_TASK_SELECTION != 0)
|
||||||
|
/*
|
||||||
|
CMSIS-RTOS2 requires handling of 56 different priorities (see osPriority_t) while FreeRTOS port
|
||||||
|
optimised selection for Cortex core only handles 32 different priorities.
|
||||||
|
Set #define configUSE_PORT_OPTIMISED_TASK_SELECTION 0 to fix this error.
|
||||||
|
*/
|
||||||
|
#error "Definition configUSE_PORT_OPTIMISED_TASK_SELECTION must be zero to implement Thread Management API."
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* FREERTOS_OS2_H_ */
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* FreeRTOS Kernel V10.2.1
|
* FreeRTOS Kernel V10.3.1
|
||||||
* Copyright (C) 2019 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
* Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
||||||
*
|
*
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy of
|
* Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||||
* this software and associated documentation files (the "Software"), to deal in
|
* this software and associated documentation files (the "Software"), to deal in
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* FreeRTOS Kernel V10.2.1
|
* FreeRTOS Kernel V10.3.1
|
||||||
* Copyright (C) 2019 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
* Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
||||||
*
|
*
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy of
|
* Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||||
* this software and associated documentation files (the "Software"), to deal in
|
* this software and associated documentation files (the "Software"), to deal in
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* FreeRTOS Kernel V10.2.1
|
* FreeRTOS Kernel V10.3.1
|
||||||
* Copyright (C) 2019 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
* Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
||||||
*
|
*
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy of
|
* Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||||
* this software and associated documentation files (the "Software"), to deal in
|
* this software and associated documentation files (the "Software"), to deal in
|
||||||
|
@ -241,10 +241,26 @@ extern "C" {
|
||||||
#define configASSERT_DEFINED 1
|
#define configASSERT_DEFINED 1
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/* configPRECONDITION should be defined as configASSERT.
|
||||||
|
The CBMC proofs need a way to track assumptions and assertions.
|
||||||
|
A configPRECONDITION statement should express an implicit invariant or
|
||||||
|
assumption made. A configASSERT statement should express an invariant that must
|
||||||
|
hold explicit before calling the code. */
|
||||||
|
#ifndef configPRECONDITION
|
||||||
|
#define configPRECONDITION( X ) configASSERT(X)
|
||||||
|
#define configPRECONDITION_DEFINED 0
|
||||||
|
#else
|
||||||
|
#define configPRECONDITION_DEFINED 1
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifndef portMEMORY_BARRIER
|
#ifndef portMEMORY_BARRIER
|
||||||
#define portMEMORY_BARRIER()
|
#define portMEMORY_BARRIER()
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifndef portSOFTWARE_BARRIER
|
||||||
|
#define portSOFTWARE_BARRIER()
|
||||||
|
#endif
|
||||||
|
|
||||||
/* The timers module relies on xTaskGetSchedulerState(). */
|
/* The timers module relies on xTaskGetSchedulerState(). */
|
||||||
#if configUSE_TIMERS == 1
|
#if configUSE_TIMERS == 1
|
||||||
|
|
||||||
|
@ -937,6 +953,7 @@ V8 if desired. */
|
||||||
#define pcTimerGetTimerName pcTimerGetName
|
#define pcTimerGetTimerName pcTimerGetName
|
||||||
#define pcQueueGetQueueName pcQueueGetName
|
#define pcQueueGetQueueName pcQueueGetName
|
||||||
#define vTaskGetTaskInfo vTaskGetInfo
|
#define vTaskGetTaskInfo vTaskGetInfo
|
||||||
|
#define xTaskGetIdleRunTimeCounter ulTaskGetIdleRunTimeCounter
|
||||||
|
|
||||||
/* Backward compatibility within the scheduler code only - these definitions
|
/* Backward compatibility within the scheduler code only - these definitions
|
||||||
are not really required but are included for completeness. */
|
are not really required but are included for completeness. */
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* FreeRTOS Kernel V10.2.1
|
* FreeRTOS Kernel V10.3.1
|
||||||
* Copyright (C) 2019 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
* Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
||||||
*
|
*
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy of
|
* Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||||
* this software and associated documentation files (the "Software"), to deal in
|
* this software and associated documentation files (the "Software"), to deal in
|
||||||
|
|
414
Middlewares/Third_Party/FreeRTOS/Source/include/atomic.h
vendored
Normal file
414
Middlewares/Third_Party/FreeRTOS/Source/include/atomic.h
vendored
Normal file
|
@ -0,0 +1,414 @@
|
||||||
|
/*
|
||||||
|
* FreeRTOS Kernel V10.3.1
|
||||||
|
* Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||||
|
* this software and associated documentation files (the "Software"), to deal in
|
||||||
|
* the Software without restriction, including without limitation the rights to
|
||||||
|
* use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
|
||||||
|
* the Software, and to permit persons to whom the Software is furnished to do so,
|
||||||
|
* subject to the following conditions:
|
||||||
|
*
|
||||||
|
* The above copyright notice and this permission notice shall be included in all
|
||||||
|
* copies or substantial portions of the Software.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
||||||
|
* FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
|
||||||
|
* COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
||||||
|
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||||
|
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
*
|
||||||
|
* http://www.FreeRTOS.org
|
||||||
|
* http://aws.amazon.com/freertos
|
||||||
|
*
|
||||||
|
* 1 tab == 4 spaces!
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @file atomic.h
|
||||||
|
* @brief FreeRTOS atomic operation support.
|
||||||
|
*
|
||||||
|
* This file implements atomic functions by disabling interrupts globally.
|
||||||
|
* Implementations with architecture specific atomic instructions can be
|
||||||
|
* provided under each compiler directory.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef ATOMIC_H
|
||||||
|
#define ATOMIC_H
|
||||||
|
|
||||||
|
#ifndef INC_FREERTOS_H
|
||||||
|
#error "include FreeRTOS.h must appear in source files before include atomic.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Standard includes. */
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Port specific definitions -- entering/exiting critical section.
|
||||||
|
* Refer template -- ./lib/FreeRTOS/portable/Compiler/Arch/portmacro.h
|
||||||
|
*
|
||||||
|
* Every call to ATOMIC_EXIT_CRITICAL() must be closely paired with
|
||||||
|
* ATOMIC_ENTER_CRITICAL().
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
#if defined( portSET_INTERRUPT_MASK_FROM_ISR )
|
||||||
|
|
||||||
|
/* Nested interrupt scheme is supported in this port. */
|
||||||
|
#define ATOMIC_ENTER_CRITICAL() \
|
||||||
|
UBaseType_t uxCriticalSectionType = portSET_INTERRUPT_MASK_FROM_ISR()
|
||||||
|
|
||||||
|
#define ATOMIC_EXIT_CRITICAL() \
|
||||||
|
portCLEAR_INTERRUPT_MASK_FROM_ISR( uxCriticalSectionType )
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
/* Nested interrupt scheme is NOT supported in this port. */
|
||||||
|
#define ATOMIC_ENTER_CRITICAL() portENTER_CRITICAL()
|
||||||
|
#define ATOMIC_EXIT_CRITICAL() portEXIT_CRITICAL()
|
||||||
|
|
||||||
|
#endif /* portSET_INTERRUPT_MASK_FROM_ISR() */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Port specific definition -- "always inline".
|
||||||
|
* Inline is compiler specific, and may not always get inlined depending on your
|
||||||
|
* optimization level. Also, inline is considered as performance optimization
|
||||||
|
* for atomic. Thus, if portFORCE_INLINE is not provided by portmacro.h,
|
||||||
|
* instead of resulting error, simply define it away.
|
||||||
|
*/
|
||||||
|
#ifndef portFORCE_INLINE
|
||||||
|
#define portFORCE_INLINE
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define ATOMIC_COMPARE_AND_SWAP_SUCCESS 0x1U /**< Compare and swap succeeded, swapped. */
|
||||||
|
#define ATOMIC_COMPARE_AND_SWAP_FAILURE 0x0U /**< Compare and swap failed, did not swap. */
|
||||||
|
|
||||||
|
/*----------------------------- Swap && CAS ------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Atomic compare-and-swap
|
||||||
|
*
|
||||||
|
* @brief Performs an atomic compare-and-swap operation on the specified values.
|
||||||
|
*
|
||||||
|
* @param[in, out] pulDestination Pointer to memory location from where value is
|
||||||
|
* to be loaded and checked.
|
||||||
|
* @param[in] ulExchange If condition meets, write this value to memory.
|
||||||
|
* @param[in] ulComparand Swap condition.
|
||||||
|
*
|
||||||
|
* @return Unsigned integer of value 1 or 0. 1 for swapped, 0 for not swapped.
|
||||||
|
*
|
||||||
|
* @note This function only swaps *pulDestination with ulExchange, if previous
|
||||||
|
* *pulDestination value equals ulComparand.
|
||||||
|
*/
|
||||||
|
static portFORCE_INLINE uint32_t Atomic_CompareAndSwap_u32( uint32_t volatile * pulDestination,
|
||||||
|
uint32_t ulExchange,
|
||||||
|
uint32_t ulComparand )
|
||||||
|
{
|
||||||
|
uint32_t ulReturnValue;
|
||||||
|
|
||||||
|
ATOMIC_ENTER_CRITICAL();
|
||||||
|
{
|
||||||
|
if( *pulDestination == ulComparand )
|
||||||
|
{
|
||||||
|
*pulDestination = ulExchange;
|
||||||
|
ulReturnValue = ATOMIC_COMPARE_AND_SWAP_SUCCESS;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ulReturnValue = ATOMIC_COMPARE_AND_SWAP_FAILURE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ATOMIC_EXIT_CRITICAL();
|
||||||
|
|
||||||
|
return ulReturnValue;
|
||||||
|
}
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Atomic swap (pointers)
|
||||||
|
*
|
||||||
|
* @brief Atomically sets the address pointed to by *ppvDestination to the value
|
||||||
|
* of *pvExchange.
|
||||||
|
*
|
||||||
|
* @param[in, out] ppvDestination Pointer to memory location from where a pointer
|
||||||
|
* value is to be loaded and written back to.
|
||||||
|
* @param[in] pvExchange Pointer value to be written to *ppvDestination.
|
||||||
|
*
|
||||||
|
* @return The initial value of *ppvDestination.
|
||||||
|
*/
|
||||||
|
static portFORCE_INLINE void * Atomic_SwapPointers_p32( void * volatile * ppvDestination,
|
||||||
|
void * pvExchange )
|
||||||
|
{
|
||||||
|
void * pReturnValue;
|
||||||
|
|
||||||
|
ATOMIC_ENTER_CRITICAL();
|
||||||
|
{
|
||||||
|
pReturnValue = *ppvDestination;
|
||||||
|
*ppvDestination = pvExchange;
|
||||||
|
}
|
||||||
|
ATOMIC_EXIT_CRITICAL();
|
||||||
|
|
||||||
|
return pReturnValue;
|
||||||
|
}
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Atomic compare-and-swap (pointers)
|
||||||
|
*
|
||||||
|
* @brief Performs an atomic compare-and-swap operation on the specified pointer
|
||||||
|
* values.
|
||||||
|
*
|
||||||
|
* @param[in, out] ppvDestination Pointer to memory location from where a pointer
|
||||||
|
* value is to be loaded and checked.
|
||||||
|
* @param[in] pvExchange If condition meets, write this value to memory.
|
||||||
|
* @param[in] pvComparand Swap condition.
|
||||||
|
*
|
||||||
|
* @return Unsigned integer of value 1 or 0. 1 for swapped, 0 for not swapped.
|
||||||
|
*
|
||||||
|
* @note This function only swaps *ppvDestination with pvExchange, if previous
|
||||||
|
* *ppvDestination value equals pvComparand.
|
||||||
|
*/
|
||||||
|
static portFORCE_INLINE uint32_t Atomic_CompareAndSwapPointers_p32( void * volatile * ppvDestination,
|
||||||
|
void * pvExchange,
|
||||||
|
void * pvComparand )
|
||||||
|
{
|
||||||
|
uint32_t ulReturnValue = ATOMIC_COMPARE_AND_SWAP_FAILURE;
|
||||||
|
|
||||||
|
ATOMIC_ENTER_CRITICAL();
|
||||||
|
{
|
||||||
|
if( *ppvDestination == pvComparand )
|
||||||
|
{
|
||||||
|
*ppvDestination = pvExchange;
|
||||||
|
ulReturnValue = ATOMIC_COMPARE_AND_SWAP_SUCCESS;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ATOMIC_EXIT_CRITICAL();
|
||||||
|
|
||||||
|
return ulReturnValue;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*----------------------------- Arithmetic ------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Atomic add
|
||||||
|
*
|
||||||
|
* @brief Atomically adds count to the value of the specified pointer points to.
|
||||||
|
*
|
||||||
|
* @param[in,out] pulAddend Pointer to memory location from where value is to be
|
||||||
|
* loaded and written back to.
|
||||||
|
* @param[in] ulCount Value to be added to *pulAddend.
|
||||||
|
*
|
||||||
|
* @return previous *pulAddend value.
|
||||||
|
*/
|
||||||
|
static portFORCE_INLINE uint32_t Atomic_Add_u32( uint32_t volatile * pulAddend,
|
||||||
|
uint32_t ulCount )
|
||||||
|
{
|
||||||
|
uint32_t ulCurrent;
|
||||||
|
|
||||||
|
ATOMIC_ENTER_CRITICAL();
|
||||||
|
{
|
||||||
|
ulCurrent = *pulAddend;
|
||||||
|
*pulAddend += ulCount;
|
||||||
|
}
|
||||||
|
ATOMIC_EXIT_CRITICAL();
|
||||||
|
|
||||||
|
return ulCurrent;
|
||||||
|
}
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Atomic subtract
|
||||||
|
*
|
||||||
|
* @brief Atomically subtracts count from the value of the specified pointer
|
||||||
|
* pointers to.
|
||||||
|
*
|
||||||
|
* @param[in,out] pulAddend Pointer to memory location from where value is to be
|
||||||
|
* loaded and written back to.
|
||||||
|
* @param[in] ulCount Value to be subtract from *pulAddend.
|
||||||
|
*
|
||||||
|
* @return previous *pulAddend value.
|
||||||
|
*/
|
||||||
|
static portFORCE_INLINE uint32_t Atomic_Subtract_u32( uint32_t volatile * pulAddend,
|
||||||
|
uint32_t ulCount )
|
||||||
|
{
|
||||||
|
uint32_t ulCurrent;
|
||||||
|
|
||||||
|
ATOMIC_ENTER_CRITICAL();
|
||||||
|
{
|
||||||
|
ulCurrent = *pulAddend;
|
||||||
|
*pulAddend -= ulCount;
|
||||||
|
}
|
||||||
|
ATOMIC_EXIT_CRITICAL();
|
||||||
|
|
||||||
|
return ulCurrent;
|
||||||
|
}
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Atomic increment
|
||||||
|
*
|
||||||
|
* @brief Atomically increments the value of the specified pointer points to.
|
||||||
|
*
|
||||||
|
* @param[in,out] pulAddend Pointer to memory location from where value is to be
|
||||||
|
* loaded and written back to.
|
||||||
|
*
|
||||||
|
* @return *pulAddend value before increment.
|
||||||
|
*/
|
||||||
|
static portFORCE_INLINE uint32_t Atomic_Increment_u32( uint32_t volatile * pulAddend )
|
||||||
|
{
|
||||||
|
uint32_t ulCurrent;
|
||||||
|
|
||||||
|
ATOMIC_ENTER_CRITICAL();
|
||||||
|
{
|
||||||
|
ulCurrent = *pulAddend;
|
||||||
|
*pulAddend += 1;
|
||||||
|
}
|
||||||
|
ATOMIC_EXIT_CRITICAL();
|
||||||
|
|
||||||
|
return ulCurrent;
|
||||||
|
}
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Atomic decrement
|
||||||
|
*
|
||||||
|
* @brief Atomically decrements the value of the specified pointer points to
|
||||||
|
*
|
||||||
|
* @param[in,out] pulAddend Pointer to memory location from where value is to be
|
||||||
|
* loaded and written back to.
|
||||||
|
*
|
||||||
|
* @return *pulAddend value before decrement.
|
||||||
|
*/
|
||||||
|
static portFORCE_INLINE uint32_t Atomic_Decrement_u32( uint32_t volatile * pulAddend )
|
||||||
|
{
|
||||||
|
uint32_t ulCurrent;
|
||||||
|
|
||||||
|
ATOMIC_ENTER_CRITICAL();
|
||||||
|
{
|
||||||
|
ulCurrent = *pulAddend;
|
||||||
|
*pulAddend -= 1;
|
||||||
|
}
|
||||||
|
ATOMIC_EXIT_CRITICAL();
|
||||||
|
|
||||||
|
return ulCurrent;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*----------------------------- Bitwise Logical ------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Atomic OR
|
||||||
|
*
|
||||||
|
* @brief Performs an atomic OR operation on the specified values.
|
||||||
|
*
|
||||||
|
* @param [in, out] pulDestination Pointer to memory location from where value is
|
||||||
|
* to be loaded and written back to.
|
||||||
|
* @param [in] ulValue Value to be ORed with *pulDestination.
|
||||||
|
*
|
||||||
|
* @return The original value of *pulDestination.
|
||||||
|
*/
|
||||||
|
static portFORCE_INLINE uint32_t Atomic_OR_u32( uint32_t volatile * pulDestination,
|
||||||
|
uint32_t ulValue )
|
||||||
|
{
|
||||||
|
uint32_t ulCurrent;
|
||||||
|
|
||||||
|
ATOMIC_ENTER_CRITICAL();
|
||||||
|
{
|
||||||
|
ulCurrent = *pulDestination;
|
||||||
|
*pulDestination |= ulValue;
|
||||||
|
}
|
||||||
|
ATOMIC_EXIT_CRITICAL();
|
||||||
|
|
||||||
|
return ulCurrent;
|
||||||
|
}
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Atomic AND
|
||||||
|
*
|
||||||
|
* @brief Performs an atomic AND operation on the specified values.
|
||||||
|
*
|
||||||
|
* @param [in, out] pulDestination Pointer to memory location from where value is
|
||||||
|
* to be loaded and written back to.
|
||||||
|
* @param [in] ulValue Value to be ANDed with *pulDestination.
|
||||||
|
*
|
||||||
|
* @return The original value of *pulDestination.
|
||||||
|
*/
|
||||||
|
static portFORCE_INLINE uint32_t Atomic_AND_u32( uint32_t volatile * pulDestination,
|
||||||
|
uint32_t ulValue )
|
||||||
|
{
|
||||||
|
uint32_t ulCurrent;
|
||||||
|
|
||||||
|
ATOMIC_ENTER_CRITICAL();
|
||||||
|
{
|
||||||
|
ulCurrent = *pulDestination;
|
||||||
|
*pulDestination &= ulValue;
|
||||||
|
}
|
||||||
|
ATOMIC_EXIT_CRITICAL();
|
||||||
|
|
||||||
|
return ulCurrent;
|
||||||
|
}
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Atomic NAND
|
||||||
|
*
|
||||||
|
* @brief Performs an atomic NAND operation on the specified values.
|
||||||
|
*
|
||||||
|
* @param [in, out] pulDestination Pointer to memory location from where value is
|
||||||
|
* to be loaded and written back to.
|
||||||
|
* @param [in] ulValue Value to be NANDed with *pulDestination.
|
||||||
|
*
|
||||||
|
* @return The original value of *pulDestination.
|
||||||
|
*/
|
||||||
|
static portFORCE_INLINE uint32_t Atomic_NAND_u32( uint32_t volatile * pulDestination,
|
||||||
|
uint32_t ulValue )
|
||||||
|
{
|
||||||
|
uint32_t ulCurrent;
|
||||||
|
|
||||||
|
ATOMIC_ENTER_CRITICAL();
|
||||||
|
{
|
||||||
|
ulCurrent = *pulDestination;
|
||||||
|
*pulDestination = ~( ulCurrent & ulValue );
|
||||||
|
}
|
||||||
|
ATOMIC_EXIT_CRITICAL();
|
||||||
|
|
||||||
|
return ulCurrent;
|
||||||
|
}
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Atomic XOR
|
||||||
|
*
|
||||||
|
* @brief Performs an atomic XOR operation on the specified values.
|
||||||
|
*
|
||||||
|
* @param [in, out] pulDestination Pointer to memory location from where value is
|
||||||
|
* to be loaded and written back to.
|
||||||
|
* @param [in] ulValue Value to be XORed with *pulDestination.
|
||||||
|
*
|
||||||
|
* @return The original value of *pulDestination.
|
||||||
|
*/
|
||||||
|
static portFORCE_INLINE uint32_t Atomic_XOR_u32( uint32_t volatile * pulDestination,
|
||||||
|
uint32_t ulValue )
|
||||||
|
{
|
||||||
|
uint32_t ulCurrent;
|
||||||
|
|
||||||
|
ATOMIC_ENTER_CRITICAL();
|
||||||
|
{
|
||||||
|
ulCurrent = *pulDestination;
|
||||||
|
*pulDestination ^= ulValue;
|
||||||
|
}
|
||||||
|
ATOMIC_EXIT_CRITICAL();
|
||||||
|
|
||||||
|
return ulCurrent;
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* ATOMIC_H */
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* FreeRTOS Kernel V10.2.1
|
* FreeRTOS Kernel V10.3.1
|
||||||
* Copyright (C) 2019 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
* Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
||||||
*
|
*
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy of
|
* Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||||
* this software and associated documentation files (the "Software"), to deal in
|
* this software and associated documentation files (the "Software"), to deal in
|
||||||
|
@ -157,7 +157,7 @@ BaseType_t xCoRoutineCreate( crCOROUTINE_CODE pxCoRoutineCode, UBaseType_t uxPri
|
||||||
}
|
}
|
||||||
|
|
||||||
// Alternatively, if you do not require any other part of the idle task to
|
// Alternatively, if you do not require any other part of the idle task to
|
||||||
// execute, the idle task hook can call vCoRoutineScheduler() within an
|
// execute, the idle task hook can call vCoRoutineSchedule() within an
|
||||||
// infinite loop.
|
// infinite loop.
|
||||||
void vApplicationIdleHook( void )
|
void vApplicationIdleHook( void )
|
||||||
{
|
{
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* FreeRTOS Kernel V10.2.1
|
* FreeRTOS Kernel V10.3.1
|
||||||
* Copyright (C) 2019 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
* Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
||||||
*
|
*
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy of
|
* Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||||
* this software and associated documentation files (the "Software"), to deal in
|
* this software and associated documentation files (the "Software"), to deal in
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* FreeRTOS Kernel V10.2.1
|
* FreeRTOS Kernel V10.3.1
|
||||||
* Copyright (C) 2019 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
* Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
||||||
*
|
*
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy of
|
* Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||||
* this software and associated documentation files (the "Software"), to deal in
|
* this software and associated documentation files (the "Software"), to deal in
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* FreeRTOS Kernel V10.2.1
|
* FreeRTOS Kernel V10.3.1
|
||||||
* Copyright (C) 2019 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
* Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
||||||
*
|
*
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy of
|
* Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||||
* this software and associated documentation files (the "Software"), to deal in
|
* this software and associated documentation files (the "Software"), to deal in
|
||||||
|
@ -183,7 +183,7 @@ typedef struct xLIST
|
||||||
* Access macro to get the owner of a list item. The owner of a list item
|
* 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.
|
* is the object (usually a TCB) that contains the list item.
|
||||||
*
|
*
|
||||||
* \page listSET_LIST_ITEM_OWNER listSET_LIST_ITEM_OWNER
|
* \page listGET_LIST_ITEM_OWNER listSET_LIST_ITEM_OWNER
|
||||||
* \ingroup LinkedList
|
* \ingroup LinkedList
|
||||||
*/
|
*/
|
||||||
#define listGET_LIST_ITEM_OWNER( pxListItem ) ( ( pxListItem )->pvOwner )
|
#define listGET_LIST_ITEM_OWNER( pxListItem ) ( ( pxListItem )->pvOwner )
|
||||||
|
@ -225,7 +225,7 @@ typedef struct xLIST
|
||||||
#define listGET_HEAD_ENTRY( pxList ) ( ( ( pxList )->xListEnd ).pxNext )
|
#define listGET_HEAD_ENTRY( pxList ) ( ( ( pxList )->xListEnd ).pxNext )
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Return the list item at the head of the list.
|
* Return the next list item.
|
||||||
*
|
*
|
||||||
* \page listGET_NEXT listGET_NEXT
|
* \page listGET_NEXT listGET_NEXT
|
||||||
* \ingroup LinkedList
|
* \ingroup LinkedList
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* FreeRTOS Kernel V10.2.1
|
* FreeRTOS Kernel V10.3.1
|
||||||
* Copyright (C) 2019 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
* Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
||||||
*
|
*
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy of
|
* Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||||
* this software and associated documentation files (the "Software"), to deal in
|
* this software and associated documentation files (the "Software"), to deal in
|
||||||
|
@ -62,6 +62,10 @@
|
||||||
#ifndef FREERTOS_MESSAGE_BUFFER_H
|
#ifndef FREERTOS_MESSAGE_BUFFER_H
|
||||||
#define FREERTOS_MESSAGE_BUFFER_H
|
#define FREERTOS_MESSAGE_BUFFER_H
|
||||||
|
|
||||||
|
#ifndef INC_FREERTOS_H
|
||||||
|
#error "include FreeRTOS.h must appear in source files before include message_buffer.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
/* Message buffers are built onto of stream buffers. */
|
/* Message buffers are built onto of stream buffers. */
|
||||||
#include "stream_buffer.h"
|
#include "stream_buffer.h"
|
||||||
|
|
||||||
|
@ -395,10 +399,10 @@ BaseType_t xHigherPriorityTaskWoken = pdFALSE; // Initialised to pdFALSE.
|
||||||
// priority of the currently executing task was unblocked and a context
|
// priority of the currently executing task was unblocked and a context
|
||||||
// switch should be performed to ensure the ISR returns to the unblocked
|
// switch should be performed to ensure the ISR returns to the unblocked
|
||||||
// task. In most FreeRTOS ports this is done by simply passing
|
// task. In most FreeRTOS ports this is done by simply passing
|
||||||
// xHigherPriorityTaskWoken into taskYIELD_FROM_ISR(), which will test the
|
// xHigherPriorityTaskWoken into portYIELD_FROM_ISR(), which will test the
|
||||||
// variables value, and perform the context switch if necessary. Check the
|
// variables value, and perform the context switch if necessary. Check the
|
||||||
// documentation for the port in use for port specific instructions.
|
// documentation for the port in use for port specific instructions.
|
||||||
taskYIELD_FROM_ISR( xHigherPriorityTaskWoken );
|
portYIELD_FROM_ISR( xHigherPriorityTaskWoken );
|
||||||
}
|
}
|
||||||
</pre>
|
</pre>
|
||||||
* \defgroup xMessageBufferSendFromISR xMessageBufferSendFromISR
|
* \defgroup xMessageBufferSendFromISR xMessageBufferSendFromISR
|
||||||
|
@ -584,10 +588,10 @@ BaseType_t xHigherPriorityTaskWoken = pdFALSE; // Initialised to pdFALSE.
|
||||||
// priority of the currently executing task was unblocked and a context
|
// priority of the currently executing task was unblocked and a context
|
||||||
// switch should be performed to ensure the ISR returns to the unblocked
|
// switch should be performed to ensure the ISR returns to the unblocked
|
||||||
// task. In most FreeRTOS ports this is done by simply passing
|
// task. In most FreeRTOS ports this is done by simply passing
|
||||||
// xHigherPriorityTaskWoken into taskYIELD_FROM_ISR(), which will test the
|
// xHigherPriorityTaskWoken into portYIELD_FROM_ISR(), which will test the
|
||||||
// variables value, and perform the context switch if necessary. Check the
|
// variables value, and perform the context switch if necessary. Check the
|
||||||
// documentation for the port in use for port specific instructions.
|
// documentation for the port in use for port specific instructions.
|
||||||
taskYIELD_FROM_ISR( xHigherPriorityTaskWoken );
|
portYIELD_FROM_ISR( xHigherPriorityTaskWoken );
|
||||||
}
|
}
|
||||||
</pre>
|
</pre>
|
||||||
* \defgroup xMessageBufferReceiveFromISR xMessageBufferReceiveFromISR
|
* \defgroup xMessageBufferReceiveFromISR xMessageBufferReceiveFromISR
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* FreeRTOS Kernel V10.2.1
|
* FreeRTOS Kernel V10.3.1
|
||||||
* Copyright (C) 2019 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
* Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
||||||
*
|
*
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy of
|
* Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||||
* this software and associated documentation files (the "Software"), to deal in
|
* this software and associated documentation files (the "Software"), to deal in
|
||||||
|
@ -69,19 +69,21 @@ void * MPU_pvTaskGetThreadLocalStoragePointer( TaskHandle_t xTaskToQuery, BaseTy
|
||||||
BaseType_t MPU_xTaskCallApplicationTaskHook( TaskHandle_t xTask, void *pvParameter ) FREERTOS_SYSTEM_CALL;
|
BaseType_t MPU_xTaskCallApplicationTaskHook( TaskHandle_t xTask, void *pvParameter ) FREERTOS_SYSTEM_CALL;
|
||||||
TaskHandle_t MPU_xTaskGetIdleTaskHandle( void ) FREERTOS_SYSTEM_CALL;
|
TaskHandle_t MPU_xTaskGetIdleTaskHandle( void ) FREERTOS_SYSTEM_CALL;
|
||||||
UBaseType_t MPU_uxTaskGetSystemState( TaskStatus_t * const pxTaskStatusArray, const UBaseType_t uxArraySize, uint32_t * const pulTotalRunTime ) FREERTOS_SYSTEM_CALL;
|
UBaseType_t MPU_uxTaskGetSystemState( TaskStatus_t * const pxTaskStatusArray, const UBaseType_t uxArraySize, uint32_t * const pulTotalRunTime ) FREERTOS_SYSTEM_CALL;
|
||||||
TickType_t MPU_xTaskGetIdleRunTimeCounter( void ) FREERTOS_SYSTEM_CALL;
|
uint32_t MPU_ulTaskGetIdleRunTimeCounter( void ) FREERTOS_SYSTEM_CALL;
|
||||||
void MPU_vTaskList( char * pcWriteBuffer ) FREERTOS_SYSTEM_CALL;
|
void MPU_vTaskList( char * pcWriteBuffer ) FREERTOS_SYSTEM_CALL;
|
||||||
void MPU_vTaskGetRunTimeStats( char *pcWriteBuffer ) FREERTOS_SYSTEM_CALL;
|
void MPU_vTaskGetRunTimeStats( char *pcWriteBuffer ) FREERTOS_SYSTEM_CALL;
|
||||||
BaseType_t MPU_xTaskGenericNotify( TaskHandle_t xTaskToNotify, uint32_t ulValue, eNotifyAction eAction, uint32_t *pulPreviousNotificationValue ) FREERTOS_SYSTEM_CALL;
|
BaseType_t MPU_xTaskGenericNotify( TaskHandle_t xTaskToNotify, uint32_t ulValue, eNotifyAction eAction, uint32_t *pulPreviousNotificationValue ) FREERTOS_SYSTEM_CALL;
|
||||||
BaseType_t MPU_xTaskNotifyWait( uint32_t ulBitsToClearOnEntry, uint32_t ulBitsToClearOnExit, uint32_t *pulNotificationValue, TickType_t xTicksToWait ) FREERTOS_SYSTEM_CALL;
|
BaseType_t MPU_xTaskNotifyWait( uint32_t ulBitsToClearOnEntry, uint32_t ulBitsToClearOnExit, uint32_t *pulNotificationValue, TickType_t xTicksToWait ) FREERTOS_SYSTEM_CALL;
|
||||||
uint32_t MPU_ulTaskNotifyTake( BaseType_t xClearCountOnExit, TickType_t xTicksToWait ) FREERTOS_SYSTEM_CALL;
|
uint32_t MPU_ulTaskNotifyTake( BaseType_t xClearCountOnExit, TickType_t xTicksToWait ) FREERTOS_SYSTEM_CALL;
|
||||||
BaseType_t MPU_xTaskNotifyStateClear( TaskHandle_t xTask ) FREERTOS_SYSTEM_CALL;
|
BaseType_t MPU_xTaskNotifyStateClear( TaskHandle_t xTask ) FREERTOS_SYSTEM_CALL;
|
||||||
|
uint32_t MPU_ulTaskNotifyValueClear( TaskHandle_t xTask, uint32_t ulBitsToClear ) FREERTOS_SYSTEM_CALL;
|
||||||
BaseType_t MPU_xTaskIncrementTick( void ) FREERTOS_SYSTEM_CALL;
|
BaseType_t MPU_xTaskIncrementTick( void ) FREERTOS_SYSTEM_CALL;
|
||||||
TaskHandle_t MPU_xTaskGetCurrentTaskHandle( void ) FREERTOS_SYSTEM_CALL;
|
TaskHandle_t MPU_xTaskGetCurrentTaskHandle( void ) FREERTOS_SYSTEM_CALL;
|
||||||
void MPU_vTaskSetTimeOutState( TimeOut_t * const pxTimeOut ) FREERTOS_SYSTEM_CALL;
|
void MPU_vTaskSetTimeOutState( TimeOut_t * const pxTimeOut ) FREERTOS_SYSTEM_CALL;
|
||||||
BaseType_t MPU_xTaskCheckForTimeOut( TimeOut_t * const pxTimeOut, TickType_t * const pxTicksToWait ) FREERTOS_SYSTEM_CALL;
|
BaseType_t MPU_xTaskCheckForTimeOut( TimeOut_t * const pxTimeOut, TickType_t * const pxTicksToWait ) FREERTOS_SYSTEM_CALL;
|
||||||
void MPU_vTaskMissedYield( void ) FREERTOS_SYSTEM_CALL;
|
void MPU_vTaskMissedYield( void ) FREERTOS_SYSTEM_CALL;
|
||||||
BaseType_t MPU_xTaskGetSchedulerState( void ) FREERTOS_SYSTEM_CALL;
|
BaseType_t MPU_xTaskGetSchedulerState( void ) FREERTOS_SYSTEM_CALL;
|
||||||
|
BaseType_t MPU_xTaskCatchUpTicks( TickType_t xTicksToCatchUp ) FREERTOS_SYSTEM_CALL;
|
||||||
|
|
||||||
/* MPU versions of queue.h API functions. */
|
/* MPU versions of queue.h API functions. */
|
||||||
BaseType_t MPU_xQueueGenericSend( QueueHandle_t xQueue, const void * const pvItemToQueue, TickType_t xTicksToWait, const BaseType_t xCopyPosition ) FREERTOS_SYSTEM_CALL;
|
BaseType_t MPU_xQueueGenericSend( QueueHandle_t xQueue, const void * const pvItemToQueue, TickType_t xTicksToWait, const BaseType_t xCopyPosition ) FREERTOS_SYSTEM_CALL;
|
||||||
|
@ -122,6 +124,7 @@ TaskHandle_t MPU_xTimerGetTimerDaemonTaskHandle( void ) FREERTOS_SYSTEM_CALL;
|
||||||
BaseType_t MPU_xTimerPendFunctionCall( PendedFunction_t xFunctionToPend, void *pvParameter1, uint32_t ulParameter2, TickType_t xTicksToWait ) FREERTOS_SYSTEM_CALL;
|
BaseType_t MPU_xTimerPendFunctionCall( PendedFunction_t xFunctionToPend, void *pvParameter1, uint32_t ulParameter2, TickType_t xTicksToWait ) FREERTOS_SYSTEM_CALL;
|
||||||
const char * MPU_pcTimerGetName( TimerHandle_t xTimer ) FREERTOS_SYSTEM_CALL;
|
const char * MPU_pcTimerGetName( TimerHandle_t xTimer ) FREERTOS_SYSTEM_CALL;
|
||||||
void MPU_vTimerSetReloadMode( TimerHandle_t xTimer, const UBaseType_t uxAutoReload ) FREERTOS_SYSTEM_CALL;
|
void MPU_vTimerSetReloadMode( TimerHandle_t xTimer, const UBaseType_t uxAutoReload ) FREERTOS_SYSTEM_CALL;
|
||||||
|
UBaseType_t MPU_uxTimerGetReloadMode( TimerHandle_t xTimer ) FREERTOS_SYSTEM_CALL;
|
||||||
TickType_t MPU_xTimerGetPeriod( TimerHandle_t xTimer ) FREERTOS_SYSTEM_CALL;
|
TickType_t MPU_xTimerGetPeriod( TimerHandle_t xTimer ) FREERTOS_SYSTEM_CALL;
|
||||||
TickType_t MPU_xTimerGetExpiryTime( TimerHandle_t xTimer ) FREERTOS_SYSTEM_CALL;
|
TickType_t MPU_xTimerGetExpiryTime( TimerHandle_t xTimer ) FREERTOS_SYSTEM_CALL;
|
||||||
BaseType_t MPU_xTimerCreateTimerTask( void ) FREERTOS_SYSTEM_CALL;
|
BaseType_t MPU_xTimerCreateTimerTask( void ) FREERTOS_SYSTEM_CALL;
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* FreeRTOS Kernel V10.2.1
|
* FreeRTOS Kernel V10.3.1
|
||||||
* Copyright (C) 2019 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
* Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
||||||
*
|
*
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy of
|
* Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||||
* this software and associated documentation files (the "Software"), to deal in
|
* this software and associated documentation files (the "Software"), to deal in
|
||||||
|
@ -77,11 +77,13 @@ only for ports that are using the MPU. */
|
||||||
#define uxTaskGetSystemState MPU_uxTaskGetSystemState
|
#define uxTaskGetSystemState MPU_uxTaskGetSystemState
|
||||||
#define vTaskList MPU_vTaskList
|
#define vTaskList MPU_vTaskList
|
||||||
#define vTaskGetRunTimeStats MPU_vTaskGetRunTimeStats
|
#define vTaskGetRunTimeStats MPU_vTaskGetRunTimeStats
|
||||||
#define xTaskGetIdleRunTimeCounter MPU_xTaskGetIdleRunTimeCounter
|
#define ulTaskGetIdleRunTimeCounter MPU_ulTaskGetIdleRunTimeCounter
|
||||||
#define xTaskGenericNotify MPU_xTaskGenericNotify
|
#define xTaskGenericNotify MPU_xTaskGenericNotify
|
||||||
#define xTaskNotifyWait MPU_xTaskNotifyWait
|
#define xTaskNotifyWait MPU_xTaskNotifyWait
|
||||||
#define ulTaskNotifyTake MPU_ulTaskNotifyTake
|
#define ulTaskNotifyTake MPU_ulTaskNotifyTake
|
||||||
#define xTaskNotifyStateClear MPU_xTaskNotifyStateClear
|
#define xTaskNotifyStateClear MPU_xTaskNotifyStateClear
|
||||||
|
#define ulTaskNotifyValueClear MPU_ulTaskNotifyValueClear
|
||||||
|
#define xTaskCatchUpTicks MPU_xTaskCatchUpTicks
|
||||||
|
|
||||||
#define xTaskGetCurrentTaskHandle MPU_xTaskGetCurrentTaskHandle
|
#define xTaskGetCurrentTaskHandle MPU_xTaskGetCurrentTaskHandle
|
||||||
#define vTaskSetTimeOutState MPU_vTaskSetTimeOutState
|
#define vTaskSetTimeOutState MPU_vTaskSetTimeOutState
|
||||||
|
@ -127,6 +129,7 @@ only for ports that are using the MPU. */
|
||||||
#define xTimerPendFunctionCall MPU_xTimerPendFunctionCall
|
#define xTimerPendFunctionCall MPU_xTimerPendFunctionCall
|
||||||
#define pcTimerGetName MPU_pcTimerGetName
|
#define pcTimerGetName MPU_pcTimerGetName
|
||||||
#define vTimerSetReloadMode MPU_vTimerSetReloadMode
|
#define vTimerSetReloadMode MPU_vTimerSetReloadMode
|
||||||
|
#define uxTimerGetReloadMode MPU_uxTimerGetReloadMode
|
||||||
#define xTimerGetPeriod MPU_xTimerGetPeriod
|
#define xTimerGetPeriod MPU_xTimerGetPeriod
|
||||||
#define xTimerGetExpiryTime MPU_xTimerGetExpiryTime
|
#define xTimerGetExpiryTime MPU_xTimerGetExpiryTime
|
||||||
#define xTimerGenericCommand MPU_xTimerGenericCommand
|
#define xTimerGenericCommand MPU_xTimerGenericCommand
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* FreeRTOS Kernel V10.2.1
|
* FreeRTOS Kernel V10.3.1
|
||||||
* Copyright (C) 2019 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
* Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
||||||
*
|
*
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy of
|
* Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||||
* this software and associated documentation files (the "Software"), to deal in
|
* this software and associated documentation files (the "Software"), to deal in
|
||||||
|
@ -118,13 +118,26 @@ extern "C" {
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Used by heap_5.c. */
|
/* Used by heap_5.c to define the start address and size of each memory region
|
||||||
|
that together comprise the total FreeRTOS heap space. */
|
||||||
typedef struct HeapRegion
|
typedef struct HeapRegion
|
||||||
{
|
{
|
||||||
uint8_t *pucStartAddress;
|
uint8_t *pucStartAddress;
|
||||||
size_t xSizeInBytes;
|
size_t xSizeInBytes;
|
||||||
} HeapRegion_t;
|
} HeapRegion_t;
|
||||||
|
|
||||||
|
/* Used to pass information about the heap out of vPortGetHeapStats(). */
|
||||||
|
typedef struct xHeapStats
|
||||||
|
{
|
||||||
|
size_t xAvailableHeapSpaceInBytes; /* The total heap size currently available - this is the sum of all the free blocks, not the largest block that can be allocated. */
|
||||||
|
size_t xSizeOfLargestFreeBlockInBytes; /* The maximum size, in bytes, of all the free blocks within the heap at the time vPortGetHeapStats() is called. */
|
||||||
|
size_t xSizeOfSmallestFreeBlockInBytes; /* The minimum size, in bytes, of all the free blocks within the heap at the time vPortGetHeapStats() is called. */
|
||||||
|
size_t xNumberOfFreeBlocks; /* The number of free memory blocks within the heap at the time vPortGetHeapStats() is called. */
|
||||||
|
size_t xMinimumEverFreeBytesRemaining; /* The minimum amount of total free memory (sum of all free blocks) there has been in the heap since the system booted. */
|
||||||
|
size_t xNumberOfSuccessfulAllocations; /* The number of calls to pvPortMalloc() that have returned a valid memory block. */
|
||||||
|
size_t xNumberOfSuccessfulFrees; /* The number of calls to vPortFree() that has successfully freed a block of memory. */
|
||||||
|
} HeapStats_t;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Used to define multiple heap regions for use by heap_5.c. This function
|
* Used to define multiple heap regions for use by heap_5.c. This function
|
||||||
* must be called before any calls to pvPortMalloc() - not creating a task,
|
* must be called before any calls to pvPortMalloc() - not creating a task,
|
||||||
|
@ -138,6 +151,11 @@ typedef struct HeapRegion
|
||||||
*/
|
*/
|
||||||
void vPortDefineHeapRegions( const HeapRegion_t * const pxHeapRegions ) PRIVILEGED_FUNCTION;
|
void vPortDefineHeapRegions( const HeapRegion_t * const pxHeapRegions ) PRIVILEGED_FUNCTION;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Returns a HeapStats_t structure filled with information about the current
|
||||||
|
* heap state.
|
||||||
|
*/
|
||||||
|
void vPortGetHeapStats( HeapStats_t *pxHeapStats );
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Map to the memory management routines required for the port.
|
* Map to the memory management routines required for the port.
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* FreeRTOS Kernel V10.2.1
|
* FreeRTOS Kernel V10.3.1
|
||||||
* Copyright (C) 2019 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
* Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
||||||
*
|
*
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy of
|
* Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||||
* this software and associated documentation files (the "Software"), to deal in
|
* this software and associated documentation files (the "Software"), to deal in
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* FreeRTOS Kernel V10.2.1
|
* FreeRTOS Kernel V10.3.1
|
||||||
* Copyright (C) 2019 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
* Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
||||||
*
|
*
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy of
|
* Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||||
* this software and associated documentation files (the "Software"), to deal in
|
* this software and associated documentation files (the "Software"), to deal in
|
||||||
|
@ -1284,7 +1284,7 @@ uint32_t ulVarToSend, ulValReceived;
|
||||||
// name of the yield function required is port specific.
|
// name of the yield function required is port specific.
|
||||||
if( xHigherPriorityTaskWokenByPost )
|
if( xHigherPriorityTaskWokenByPost )
|
||||||
{
|
{
|
||||||
taskYIELD_YIELD_FROM_ISR();
|
portYIELD_FROM_ISR();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
</pre>
|
</pre>
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* FreeRTOS Kernel V10.2.1
|
* FreeRTOS Kernel V10.3.1
|
||||||
* Copyright (C) 2019 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
* Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
||||||
*
|
*
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy of
|
* Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||||
* this software and associated documentation files (the "Software"), to deal in
|
* this software and associated documentation files (the "Software"), to deal in
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* FreeRTOS Kernel V10.2.1
|
* FreeRTOS Kernel V10.3.1
|
||||||
* Copyright (C) 2019 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
* Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
||||||
*
|
*
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy of
|
* Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||||
* this software and associated documentation files (the "Software"), to deal in
|
* this software and associated documentation files (the "Software"), to deal in
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* FreeRTOS Kernel V10.2.1
|
* FreeRTOS Kernel V10.3.1
|
||||||
* Copyright (C) 2019 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
* Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
||||||
*
|
*
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy of
|
* Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||||
* this software and associated documentation files (the "Software"), to deal in
|
* this software and associated documentation files (the "Software"), to deal in
|
||||||
|
@ -43,7 +43,7 @@
|
||||||
* (such as xStreamBufferSend()) inside a critical section and set the send
|
* (such as xStreamBufferSend()) inside a critical section and set the send
|
||||||
* block time to 0. Likewise, if there are to be multiple different readers
|
* block time to 0. Likewise, if there are to be multiple different readers
|
||||||
* then the application writer must place each call to a reading API function
|
* then the application writer must place each call to a reading API function
|
||||||
* (such as xStreamBufferRead()) inside a critical section section and set the
|
* (such as xStreamBufferReceive()) inside a critical section section and set the
|
||||||
* receive block time to 0.
|
* receive block time to 0.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
@ -51,6 +51,10 @@
|
||||||
#ifndef STREAM_BUFFER_H
|
#ifndef STREAM_BUFFER_H
|
||||||
#define STREAM_BUFFER_H
|
#define STREAM_BUFFER_H
|
||||||
|
|
||||||
|
#ifndef INC_FREERTOS_H
|
||||||
|
#error "include FreeRTOS.h must appear in source files before include stream_buffer.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
#if defined( __cplusplus )
|
#if defined( __cplusplus )
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
@ -237,7 +241,7 @@ size_t xStreamBufferSend( StreamBufferHandle_t xStreamBuffer,
|
||||||
* (such as xStreamBufferSend()) inside a critical section and set the send
|
* (such as xStreamBufferSend()) inside a critical section and set the send
|
||||||
* block time to 0. Likewise, if there are to be multiple different readers
|
* block time to 0. Likewise, if there are to be multiple different readers
|
||||||
* then the application writer must place each call to a reading API function
|
* then the application writer must place each call to a reading API function
|
||||||
* (such as xStreamBufferRead()) inside a critical section and set the receive
|
* (such as xStreamBufferReceive()) inside a critical section and set the receive
|
||||||
* block time to 0.
|
* block time to 0.
|
||||||
*
|
*
|
||||||
* Use xStreamBufferSend() to write to a stream buffer from a task. Use
|
* Use xStreamBufferSend() to write to a stream buffer from a task. Use
|
||||||
|
@ -335,7 +339,7 @@ size_t xStreamBufferSendFromISR( StreamBufferHandle_t xStreamBuffer,
|
||||||
* (such as xStreamBufferSend()) inside a critical section and set the send
|
* (such as xStreamBufferSend()) inside a critical section and set the send
|
||||||
* block time to 0. Likewise, if there are to be multiple different readers
|
* block time to 0. Likewise, if there are to be multiple different readers
|
||||||
* then the application writer must place each call to a reading API function
|
* then the application writer must place each call to a reading API function
|
||||||
* (such as xStreamBufferRead()) inside a critical section and set the receive
|
* (such as xStreamBufferReceive()) inside a critical section and set the receive
|
||||||
* block time to 0.
|
* block time to 0.
|
||||||
*
|
*
|
||||||
* Use xStreamBufferSend() to write to a stream buffer from a task. Use
|
* Use xStreamBufferSend() to write to a stream buffer from a task. Use
|
||||||
|
@ -435,7 +439,7 @@ size_t xStreamBufferReceive( StreamBufferHandle_t xStreamBuffer,
|
||||||
* (such as xStreamBufferSend()) inside a critical section and set the send
|
* (such as xStreamBufferSend()) inside a critical section and set the send
|
||||||
* block time to 0. Likewise, if there are to be multiple different readers
|
* block time to 0. Likewise, if there are to be multiple different readers
|
||||||
* then the application writer must place each call to a reading API function
|
* then the application writer must place each call to a reading API function
|
||||||
* (such as xStreamBufferRead()) inside a critical section and set the receive
|
* (such as xStreamBufferReceive()) inside a critical section and set the receive
|
||||||
* block time to 0.
|
* block time to 0.
|
||||||
*
|
*
|
||||||
* Use xStreamBufferReceive() to read from a stream buffer from a task. Use
|
* Use xStreamBufferReceive() to read from a stream buffer from a task. Use
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* FreeRTOS Kernel V10.2.1
|
* FreeRTOS Kernel V10.3.1
|
||||||
* Copyright (C) 2019 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
* Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
||||||
*
|
*
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy of
|
* Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||||
* this software and associated documentation files (the "Software"), to deal in
|
* this software and associated documentation files (the "Software"), to deal in
|
||||||
|
@ -43,10 +43,10 @@ extern "C" {
|
||||||
* MACROS AND DEFINITIONS
|
* MACROS AND DEFINITIONS
|
||||||
*----------------------------------------------------------*/
|
*----------------------------------------------------------*/
|
||||||
|
|
||||||
#define tskKERNEL_VERSION_NUMBER "V10.2.0"
|
#define tskKERNEL_VERSION_NUMBER "V10.3.1"
|
||||||
#define tskKERNEL_VERSION_MAJOR 10
|
#define tskKERNEL_VERSION_MAJOR 10
|
||||||
#define tskKERNEL_VERSION_MINOR 2
|
#define tskKERNEL_VERSION_MINOR 3
|
||||||
#define tskKERNEL_VERSION_BUILD 0
|
#define tskKERNEL_VERSION_BUILD 1
|
||||||
|
|
||||||
/* MPU region parameters passed in ulParameters
|
/* MPU region parameters passed in ulParameters
|
||||||
* of MemoryRegion_t struct. */
|
* of MemoryRegion_t struct. */
|
||||||
|
@ -314,13 +314,13 @@ is used in assert() statements. */
|
||||||
// an automatic stack variable it might no longer exist, or at least have been corrupted, by the time
|
// an automatic stack variable it might no longer exist, or at least have been corrupted, by the time
|
||||||
// the new task attempts to access it.
|
// the new task attempts to access it.
|
||||||
xTaskCreate( vTaskCode, "NAME", STACK_SIZE, &ucParameterToPass, tskIDLE_PRIORITY, &xHandle );
|
xTaskCreate( vTaskCode, "NAME", STACK_SIZE, &ucParameterToPass, tskIDLE_PRIORITY, &xHandle );
|
||||||
configASSERT( xHandle );
|
configASSERT( xHandle );
|
||||||
|
|
||||||
// Use the handle to delete the task.
|
// Use the handle to delete the task.
|
||||||
if( xHandle != NULL )
|
if( xHandle != NULL )
|
||||||
{
|
{
|
||||||
vTaskDelete( xHandle );
|
vTaskDelete( xHandle );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
</pre>
|
</pre>
|
||||||
* \defgroup xTaskCreate xTaskCreate
|
* \defgroup xTaskCreate xTaskCreate
|
||||||
|
@ -498,9 +498,9 @@ static const TaskParameters_t xCheckTaskParameters =
|
||||||
// for full information.
|
// for full information.
|
||||||
{
|
{
|
||||||
// Base address Length Parameters
|
// Base address Length Parameters
|
||||||
{ cReadWriteArray, 32, portMPU_REGION_READ_WRITE },
|
{ cReadWriteArray, 32, portMPU_REGION_READ_WRITE },
|
||||||
{ cReadOnlyArray, 32, portMPU_REGION_READ_ONLY },
|
{ cReadOnlyArray, 32, portMPU_REGION_READ_ONLY },
|
||||||
{ cPrivilegedOnlyAccessArray, 128, portMPU_REGION_PRIVILEGED_READ_WRITE }
|
{ cPrivilegedOnlyAccessArray, 128, portMPU_REGION_PRIVILEGED_READ_WRITE }
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -584,9 +584,9 @@ static const TaskParameters_t xCheckTaskParameters =
|
||||||
// for full information.
|
// for full information.
|
||||||
{
|
{
|
||||||
// Base address Length Parameters
|
// Base address Length Parameters
|
||||||
{ cReadWriteArray, 32, portMPU_REGION_READ_WRITE },
|
{ cReadWriteArray, 32, portMPU_REGION_READ_WRITE },
|
||||||
{ cReadOnlyArray, 32, portMPU_REGION_READ_ONLY },
|
{ cReadOnlyArray, 32, portMPU_REGION_READ_ONLY },
|
||||||
{ cPrivilegedOnlyAccessArray, 128, portMPU_REGION_PRIVILEGED_READ_WRITE }
|
{ cPrivilegedOnlyAccessArray, 128, portMPU_REGION_PRIVILEGED_READ_WRITE }
|
||||||
}
|
}
|
||||||
|
|
||||||
&xTaskBuffer; // Holds the task's data structure.
|
&xTaskBuffer; // Holds the task's data structure.
|
||||||
|
@ -831,6 +831,11 @@ void vTaskDelayUntil( TickType_t * const pxPreviousWakeTime, const TickType_t xT
|
||||||
* task will leave the Blocked state, and return from whichever function call
|
* task will leave the Blocked state, and return from whichever function call
|
||||||
* placed the task into the Blocked state.
|
* placed the task into the Blocked state.
|
||||||
*
|
*
|
||||||
|
* There is no 'FromISR' version of this function as an interrupt would need to
|
||||||
|
* know which object a task was blocked on in order to know which actions to
|
||||||
|
* take. For example, if the task was blocked on a queue the interrupt handler
|
||||||
|
* would then need to know if the queue was locked.
|
||||||
|
*
|
||||||
* @param xTask The handle of the task to remove from the Blocked state.
|
* @param xTask The handle of the task to remove from the Blocked state.
|
||||||
*
|
*
|
||||||
* @return If the task referenced by xTask was not in the Blocked state then
|
* @return If the task referenced by xTask was not in the Blocked state then
|
||||||
|
@ -1738,7 +1743,7 @@ void vTaskGetRunTimeStats( char *pcWriteBuffer ) PRIVILEGED_FUNCTION; /*lint !e9
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* task. h
|
* task. h
|
||||||
* <PRE>TickType_t xTaskGetIdleRunTimeCounter( void );</PRE>
|
* <PRE>uint32_t ulTaskGetIdleRunTimeCounter( void );</PRE>
|
||||||
*
|
*
|
||||||
* configGENERATE_RUN_TIME_STATS and configUSE_STATS_FORMATTING_FUNCTIONS
|
* configGENERATE_RUN_TIME_STATS and configUSE_STATS_FORMATTING_FUNCTIONS
|
||||||
* must both be defined as 1 for this function to be available. The application
|
* must both be defined as 1 for this function to be available. The application
|
||||||
|
@ -1753,7 +1758,7 @@ void vTaskGetRunTimeStats( char *pcWriteBuffer ) PRIVILEGED_FUNCTION; /*lint !e9
|
||||||
* of the accumulated time value depends on the frequency of the timer
|
* of the accumulated time value depends on the frequency of the timer
|
||||||
* configured by the portCONFIGURE_TIMER_FOR_RUN_TIME_STATS() macro.
|
* configured by the portCONFIGURE_TIMER_FOR_RUN_TIME_STATS() macro.
|
||||||
* While uxTaskGetSystemState() and vTaskGetRunTimeStats() writes the total
|
* While uxTaskGetSystemState() and vTaskGetRunTimeStats() writes the total
|
||||||
* execution time of each task into a buffer, xTaskGetIdleRunTimeCounter()
|
* execution time of each task into a buffer, ulTaskGetIdleRunTimeCounter()
|
||||||
* returns the total execution time of just the idle task.
|
* returns the total execution time of just the idle task.
|
||||||
*
|
*
|
||||||
* @return The total run time of the idle task. This is the amount of time the
|
* @return The total run time of the idle task. This is the amount of time the
|
||||||
|
@ -1761,10 +1766,10 @@ void vTaskGetRunTimeStats( char *pcWriteBuffer ) PRIVILEGED_FUNCTION; /*lint !e9
|
||||||
* frequency configured using the portCONFIGURE_TIMER_FOR_RUN_TIME_STATS() and
|
* frequency configured using the portCONFIGURE_TIMER_FOR_RUN_TIME_STATS() and
|
||||||
* portGET_RUN_TIME_COUNTER_VALUE() macros.
|
* portGET_RUN_TIME_COUNTER_VALUE() macros.
|
||||||
*
|
*
|
||||||
* \defgroup xTaskGetIdleRunTimeCounter xTaskGetIdleRunTimeCounter
|
* \defgroup ulTaskGetIdleRunTimeCounter ulTaskGetIdleRunTimeCounter
|
||||||
* \ingroup TaskUtils
|
* \ingroup TaskUtils
|
||||||
*/
|
*/
|
||||||
TickType_t xTaskGetIdleRunTimeCounter( void ) PRIVILEGED_FUNCTION;
|
uint32_t ulTaskGetIdleRunTimeCounter( void ) PRIVILEGED_FUNCTION;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* task. h
|
* task. h
|
||||||
|
@ -2201,6 +2206,121 @@ uint32_t ulTaskNotifyTake( BaseType_t xClearCountOnExit, TickType_t xTicksToWait
|
||||||
*/
|
*/
|
||||||
BaseType_t xTaskNotifyStateClear( TaskHandle_t xTask );
|
BaseType_t xTaskNotifyStateClear( TaskHandle_t xTask );
|
||||||
|
|
||||||
|
/**
|
||||||
|
* task. h
|
||||||
|
* <PRE>uint32_t ulTaskNotifyValueClear( TaskHandle_t xTask, uint32_t ulBitsToClear );</pre>
|
||||||
|
*
|
||||||
|
* Clears the bits specified by the ulBitsToClear bit mask in the notification
|
||||||
|
* value of the task referenced by xTask.
|
||||||
|
*
|
||||||
|
* Set ulBitsToClear to 0xffffffff (UINT_MAX on 32-bit architectures) to clear
|
||||||
|
* the notification value to 0. Set ulBitsToClear to 0 to query the task's
|
||||||
|
* notification value without clearing any bits.
|
||||||
|
*
|
||||||
|
* @return The value of the target task's notification value before the bits
|
||||||
|
* specified by ulBitsToClear were cleared.
|
||||||
|
* \defgroup ulTaskNotifyValueClear ulTaskNotifyValueClear
|
||||||
|
* \ingroup TaskNotifications
|
||||||
|
*/
|
||||||
|
uint32_t ulTaskNotifyValueClear( TaskHandle_t xTask, uint32_t ulBitsToClear ) PRIVILEGED_FUNCTION;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* task.h
|
||||||
|
* <pre>void vTaskSetTimeOutState( TimeOut_t * const pxTimeOut )</pre>
|
||||||
|
*
|
||||||
|
* Capture the current time for future use with xTaskCheckForTimeOut().
|
||||||
|
*
|
||||||
|
* @param pxTimeOut Pointer to a timeout object into which the current time
|
||||||
|
* is to be captured. The captured time includes the tick count and the number
|
||||||
|
* of times the tick count has overflowed since the system first booted.
|
||||||
|
* \defgroup vTaskSetTimeOutState vTaskSetTimeOutState
|
||||||
|
* \ingroup TaskCtrl
|
||||||
|
*/
|
||||||
|
void vTaskSetTimeOutState( TimeOut_t * const pxTimeOut ) PRIVILEGED_FUNCTION;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* task.h
|
||||||
|
* <pre>BaseType_t xTaskCheckForTimeOut( TimeOut_t * const pxTimeOut, TickType_t * const pxTicksToWait );</pre>
|
||||||
|
*
|
||||||
|
* Determines if pxTicksToWait ticks has passed since a time was captured
|
||||||
|
* using a call to vTaskSetTimeOutState(). The captured time includes the tick
|
||||||
|
* count and the number of times the tick count has overflowed.
|
||||||
|
*
|
||||||
|
* @param pxTimeOut The time status as captured previously using
|
||||||
|
* vTaskSetTimeOutState. If the timeout has not yet occurred, it is updated
|
||||||
|
* to reflect the current time status.
|
||||||
|
* @param pxTicksToWait The number of ticks to check for timeout i.e. if
|
||||||
|
* pxTicksToWait ticks have passed since pxTimeOut was last updated (either by
|
||||||
|
* vTaskSetTimeOutState() or xTaskCheckForTimeOut()), the timeout has occurred.
|
||||||
|
* If the timeout has not occurred, pxTIcksToWait is updated to reflect the
|
||||||
|
* number of remaining ticks.
|
||||||
|
*
|
||||||
|
* @return If timeout has occurred, pdTRUE is returned. Otherwise pdFALSE is
|
||||||
|
* returned and pxTicksToWait is updated to reflect the number of remaining
|
||||||
|
* ticks.
|
||||||
|
*
|
||||||
|
* @see https://www.freertos.org/xTaskCheckForTimeOut.html
|
||||||
|
*
|
||||||
|
* Example Usage:
|
||||||
|
* <pre>
|
||||||
|
// Driver library function used to receive uxWantedBytes from an Rx buffer
|
||||||
|
// that is filled by a UART interrupt. If there are not enough bytes in the
|
||||||
|
// Rx buffer then the task enters the Blocked state until it is notified that
|
||||||
|
// more data has been placed into the buffer. If there is still not enough
|
||||||
|
// data then the task re-enters the Blocked state, and xTaskCheckForTimeOut()
|
||||||
|
// is used to re-calculate the Block time to ensure the total amount of time
|
||||||
|
// spent in the Blocked state does not exceed MAX_TIME_TO_WAIT. This
|
||||||
|
// continues until either the buffer contains at least uxWantedBytes bytes,
|
||||||
|
// or the total amount of time spent in the Blocked state reaches
|
||||||
|
// MAX_TIME_TO_WAIT – at which point the task reads however many bytes are
|
||||||
|
// available up to a maximum of uxWantedBytes.
|
||||||
|
|
||||||
|
size_t xUART_Receive( uint8_t *pucBuffer, size_t uxWantedBytes )
|
||||||
|
{
|
||||||
|
size_t uxReceived = 0;
|
||||||
|
TickType_t xTicksToWait = MAX_TIME_TO_WAIT;
|
||||||
|
TimeOut_t xTimeOut;
|
||||||
|
|
||||||
|
// Initialize xTimeOut. This records the time at which this function
|
||||||
|
// was entered.
|
||||||
|
vTaskSetTimeOutState( &xTimeOut );
|
||||||
|
|
||||||
|
// Loop until the buffer contains the wanted number of bytes, or a
|
||||||
|
// timeout occurs.
|
||||||
|
while( UART_bytes_in_rx_buffer( pxUARTInstance ) < uxWantedBytes )
|
||||||
|
{
|
||||||
|
// The buffer didn't contain enough data so this task is going to
|
||||||
|
// enter the Blocked state. Adjusting xTicksToWait to account for
|
||||||
|
// any time that has been spent in the Blocked state within this
|
||||||
|
// function so far to ensure the total amount of time spent in the
|
||||||
|
// Blocked state does not exceed MAX_TIME_TO_WAIT.
|
||||||
|
if( xTaskCheckForTimeOut( &xTimeOut, &xTicksToWait ) != pdFALSE )
|
||||||
|
{
|
||||||
|
//Timed out before the wanted number of bytes were available,
|
||||||
|
// exit the loop.
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Wait for a maximum of xTicksToWait ticks to be notified that the
|
||||||
|
// receive interrupt has placed more data into the buffer.
|
||||||
|
ulTaskNotifyTake( pdTRUE, xTicksToWait );
|
||||||
|
}
|
||||||
|
|
||||||
|
// Attempt to read uxWantedBytes from the receive buffer into pucBuffer.
|
||||||
|
// The actual number of bytes read (which might be less than
|
||||||
|
// uxWantedBytes) is returned.
|
||||||
|
uxReceived = UART_read_from_receive_buffer( pxUARTInstance,
|
||||||
|
pucBuffer,
|
||||||
|
uxWantedBytes );
|
||||||
|
|
||||||
|
return uxReceived;
|
||||||
|
}
|
||||||
|
</pre>
|
||||||
|
* \defgroup xTaskCheckForTimeOut xTaskCheckForTimeOut
|
||||||
|
* \ingroup TaskCtrl
|
||||||
|
*/
|
||||||
|
BaseType_t xTaskCheckForTimeOut( TimeOut_t * const pxTimeOut, TickType_t * const pxTicksToWait ) PRIVILEGED_FUNCTION;
|
||||||
|
|
||||||
/*-----------------------------------------------------------
|
/*-----------------------------------------------------------
|
||||||
* SCHEDULER INTERNALS AVAILABLE FOR PORTING PURPOSES
|
* SCHEDULER INTERNALS AVAILABLE FOR PORTING PURPOSES
|
||||||
*----------------------------------------------------------*/
|
*----------------------------------------------------------*/
|
||||||
|
@ -2317,17 +2437,6 @@ TickType_t uxTaskResetEventItemValue( void ) PRIVILEGED_FUNCTION;
|
||||||
*/
|
*/
|
||||||
TaskHandle_t xTaskGetCurrentTaskHandle( void ) PRIVILEGED_FUNCTION;
|
TaskHandle_t xTaskGetCurrentTaskHandle( void ) PRIVILEGED_FUNCTION;
|
||||||
|
|
||||||
/*
|
|
||||||
* Capture the current time status for future reference.
|
|
||||||
*/
|
|
||||||
void vTaskSetTimeOutState( TimeOut_t * const pxTimeOut ) PRIVILEGED_FUNCTION;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Compare the time status now with that previously captured to see if the
|
|
||||||
* timeout has expired.
|
|
||||||
*/
|
|
||||||
BaseType_t xTaskCheckForTimeOut( TimeOut_t * const pxTimeOut, TickType_t * const pxTicksToWait ) PRIVILEGED_FUNCTION;
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Shortcut used by the queue implementation to prevent unnecessary call to
|
* Shortcut used by the queue implementation to prevent unnecessary call to
|
||||||
* taskYIELD();
|
* taskYIELD();
|
||||||
|
@ -2383,6 +2492,19 @@ void vTaskSetTaskNumber( TaskHandle_t xTask, const UBaseType_t uxHandle ) PRIVIL
|
||||||
*/
|
*/
|
||||||
void vTaskStepTick( const TickType_t xTicksToJump ) PRIVILEGED_FUNCTION;
|
void vTaskStepTick( const TickType_t xTicksToJump ) PRIVILEGED_FUNCTION;
|
||||||
|
|
||||||
|
/* Correct the tick count value after the application code has held
|
||||||
|
interrupts disabled for an extended period. xTicksToCatchUp is the number
|
||||||
|
of tick interrupts that have been missed due to interrupts being disabled.
|
||||||
|
Its value is not computed automatically, so must be computed by the
|
||||||
|
application writer.
|
||||||
|
|
||||||
|
This function is similar to vTaskStepTick(), however, unlike
|
||||||
|
vTaskStepTick(), xTaskCatchUpTicks() may move the tick count forward past a
|
||||||
|
time at which a task should be removed from the blocked state. That means
|
||||||
|
tasks may have to be removed from the blocked state as the tick count is
|
||||||
|
moved. */
|
||||||
|
BaseType_t xTaskCatchUpTicks( TickType_t xTicksToCatchUp ) PRIVILEGED_FUNCTION;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Only available when configUSE_TICKLESS_IDLE is set to 1.
|
* Only available when configUSE_TICKLESS_IDLE is set to 1.
|
||||||
* Provided for use within portSUPPRESS_TICKS_AND_SLEEP() to allow the port
|
* Provided for use within portSUPPRESS_TICKS_AND_SLEEP() to allow the port
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* FreeRTOS Kernel V10.2.1
|
* FreeRTOS Kernel V10.3.1
|
||||||
* Copyright (C) 2019 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
* Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
||||||
*
|
*
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy of
|
* Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||||
* this software and associated documentation files (the "Software"), to deal in
|
* this software and associated documentation files (the "Software"), to deal in
|
||||||
|
@ -121,7 +121,7 @@ typedef void (*PendedFunction_t)( void *, uint32_t );
|
||||||
* after 100 ticks, then xTimerPeriodInTicks should be set to 100.
|
* after 100 ticks, then xTimerPeriodInTicks should be set to 100.
|
||||||
* Alternatively, if the timer must expire after 500ms, then xPeriod can be set
|
* Alternatively, if the timer must expire after 500ms, then xPeriod can be set
|
||||||
* to ( 500 / portTICK_PERIOD_MS ) provided configTICK_RATE_HZ is less than or
|
* to ( 500 / portTICK_PERIOD_MS ) provided configTICK_RATE_HZ is less than or
|
||||||
* equal to 1000.
|
* equal to 1000. Time timer period must be greater than 0.
|
||||||
*
|
*
|
||||||
* @param uxAutoReload If uxAutoReload is set to pdTRUE then the timer will
|
* @param uxAutoReload If uxAutoReload is set to pdTRUE then the timer will
|
||||||
* expire repeatedly with a frequency set by the xTimerPeriodInTicks parameter.
|
* expire repeatedly with a frequency set by the xTimerPeriodInTicks parameter.
|
||||||
|
@ -138,9 +138,9 @@ typedef void (*PendedFunction_t)( void *, uint32_t );
|
||||||
* which is "void vCallbackFunction( TimerHandle_t xTimer );".
|
* which is "void vCallbackFunction( TimerHandle_t xTimer );".
|
||||||
*
|
*
|
||||||
* @return If the timer is successfully created then a handle to the newly
|
* @return If the timer is successfully created then a handle to the newly
|
||||||
* created timer is returned. If the timer cannot be created (because either
|
* created timer is returned. If the timer cannot be created because there is
|
||||||
* there is insufficient FreeRTOS heap remaining to allocate the timer
|
* insufficient FreeRTOS heap remaining to allocate the timer
|
||||||
* structures, or the timer period was set to 0) then NULL is returned.
|
* structures then NULL is returned.
|
||||||
*
|
*
|
||||||
* Example usage:
|
* Example usage:
|
||||||
* @verbatim
|
* @verbatim
|
||||||
|
@ -267,7 +267,7 @@ typedef void (*PendedFunction_t)( void *, uint32_t );
|
||||||
* after 100 ticks, then xTimerPeriodInTicks should be set to 100.
|
* after 100 ticks, then xTimerPeriodInTicks should be set to 100.
|
||||||
* Alternatively, if the timer must expire after 500ms, then xPeriod can be set
|
* Alternatively, if the timer must expire after 500ms, then xPeriod can be set
|
||||||
* to ( 500 / portTICK_PERIOD_MS ) provided configTICK_RATE_HZ is less than or
|
* to ( 500 / portTICK_PERIOD_MS ) provided configTICK_RATE_HZ is less than or
|
||||||
* equal to 1000.
|
* equal to 1000. The timer period must be greater than 0.
|
||||||
*
|
*
|
||||||
* @param uxAutoReload If uxAutoReload is set to pdTRUE then the timer will
|
* @param uxAutoReload If uxAutoReload is set to pdTRUE then the timer will
|
||||||
* expire repeatedly with a frequency set by the xTimerPeriodInTicks parameter.
|
* expire repeatedly with a frequency set by the xTimerPeriodInTicks parameter.
|
||||||
|
@ -1234,8 +1234,8 @@ const char * pcTimerGetName( TimerHandle_t xTimer ) PRIVILEGED_FUNCTION; /*lint
|
||||||
/**
|
/**
|
||||||
* void vTimerSetReloadMode( TimerHandle_t xTimer, const UBaseType_t uxAutoReload );
|
* void vTimerSetReloadMode( TimerHandle_t xTimer, const UBaseType_t uxAutoReload );
|
||||||
*
|
*
|
||||||
* Updates a timer to be either an autoreload timer, in which case the timer
|
* Updates a timer to be either an auto-reload timer, in which case the timer
|
||||||
* automatically resets itself each time it expires, or a one shot timer, in
|
* automatically resets itself each time it expires, or a one-shot timer, in
|
||||||
* which case the timer will only expire once unless it is manually restarted.
|
* which case the timer will only expire once unless it is manually restarted.
|
||||||
*
|
*
|
||||||
* @param xTimer The handle of the timer being updated.
|
* @param xTimer The handle of the timer being updated.
|
||||||
|
@ -1248,6 +1248,20 @@ const char * pcTimerGetName( TimerHandle_t xTimer ) PRIVILEGED_FUNCTION; /*lint
|
||||||
*/
|
*/
|
||||||
void vTimerSetReloadMode( TimerHandle_t xTimer, const UBaseType_t uxAutoReload ) PRIVILEGED_FUNCTION;
|
void vTimerSetReloadMode( TimerHandle_t xTimer, const UBaseType_t uxAutoReload ) PRIVILEGED_FUNCTION;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* UBaseType_t uxTimerGetReloadMode( TimerHandle_t xTimer );
|
||||||
|
*
|
||||||
|
* Queries a timer to determine if it is an auto-reload timer, in which case the timer
|
||||||
|
* automatically resets itself each time it expires, or a one-shot timer, in
|
||||||
|
* which case the timer will only expire once unless it is manually restarted.
|
||||||
|
*
|
||||||
|
* @param xTimer The handle of the timer being queried.
|
||||||
|
*
|
||||||
|
* @return If the timer is an auto-reload timer then pdTRUE is returned, otherwise
|
||||||
|
* pdFALSE is returned.
|
||||||
|
*/
|
||||||
|
UBaseType_t uxTimerGetReloadMode( TimerHandle_t xTimer ) PRIVILEGED_FUNCTION;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* TickType_t xTimerGetPeriod( TimerHandle_t xTimer );
|
* TickType_t xTimerGetPeriod( TimerHandle_t xTimer );
|
||||||
*
|
*
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* FreeRTOS Kernel V10.2.1
|
* FreeRTOS Kernel V10.3.1
|
||||||
* Copyright (C) 2019 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
* Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
||||||
*
|
*
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy of
|
* Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||||
* this software and associated documentation files (the "Software"), to deal in
|
* this software and associated documentation files (the "Software"), to deal in
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* FreeRTOS Kernel V10.2.1
|
* FreeRTOS Kernel V10.3.1
|
||||||
* Copyright (C) 2019 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
* Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
||||||
*
|
*
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy of
|
* Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||||
* this software and associated documentation files (the "Software"), to deal in
|
* this software and associated documentation files (the "Software"), to deal in
|
||||||
|
@ -576,14 +576,14 @@ void xPortSysTickHandler( void )
|
||||||
should not be executed again. However, the original expected idle
|
should not be executed again. However, the original expected idle
|
||||||
time variable must remain unmodified, so a copy is taken. */
|
time variable must remain unmodified, so a copy is taken. */
|
||||||
xModifiableIdleTime = xExpectedIdleTime;
|
xModifiableIdleTime = xExpectedIdleTime;
|
||||||
configPRE_SLEEP_PROCESSING( &xModifiableIdleTime );
|
configPRE_SLEEP_PROCESSING( xModifiableIdleTime );
|
||||||
if( xModifiableIdleTime > 0 )
|
if( xModifiableIdleTime > 0 )
|
||||||
{
|
{
|
||||||
__asm volatile( "dsb" ::: "memory" );
|
__asm volatile( "dsb" ::: "memory" );
|
||||||
__asm volatile( "wfi" );
|
__asm volatile( "wfi" );
|
||||||
__asm volatile( "isb" );
|
__asm volatile( "isb" );
|
||||||
}
|
}
|
||||||
configPOST_SLEEP_PROCESSING( &xExpectedIdleTime );
|
configPOST_SLEEP_PROCESSING( xExpectedIdleTime );
|
||||||
|
|
||||||
/* Re-enable interrupts to allow the interrupt that brought the MCU
|
/* Re-enable interrupts to allow the interrupt that brought the MCU
|
||||||
out of sleep mode to execute immediately. see comments above
|
out of sleep mode to execute immediately. see comments above
|
||||||
|
@ -664,7 +664,7 @@ void xPortSysTickHandler( void )
|
||||||
vTaskStepTick( ulCompleteTickPeriods );
|
vTaskStepTick( ulCompleteTickPeriods );
|
||||||
portNVIC_SYSTICK_LOAD_REG = ulTimerCountsForOneTick - 1UL;
|
portNVIC_SYSTICK_LOAD_REG = ulTimerCountsForOneTick - 1UL;
|
||||||
|
|
||||||
/* Exit with interrpts enabled. */
|
/* Exit with interrupts enabled. */
|
||||||
__asm volatile( "cpsie i" ::: "memory" );
|
__asm volatile( "cpsie i" ::: "memory" );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* FreeRTOS Kernel V10.2.1
|
* FreeRTOS Kernel V10.3.1
|
||||||
* Copyright (C) 2019 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
* Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
||||||
*
|
*
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy of
|
* Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||||
* this software and associated documentation files (the "Software"), to deal in
|
* this software and associated documentation files (the "Software"), to deal in
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* FreeRTOS Kernel V10.2.1
|
* FreeRTOS Kernel V10.3.1
|
||||||
* Copyright (C) 2019 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
* Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
||||||
*
|
*
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy of
|
* Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||||
* this software and associated documentation files (the "Software"), to deal in
|
* this software and associated documentation files (the "Software"), to deal in
|
||||||
|
@ -97,10 +97,12 @@ static const size_t xHeapStructSize = ( sizeof( BlockLink_t ) + ( ( size_t ) ( p
|
||||||
/* Create a couple of list links to mark the start and end of the list. */
|
/* Create a couple of list links to mark the start and end of the list. */
|
||||||
static BlockLink_t xStart, *pxEnd = NULL;
|
static BlockLink_t xStart, *pxEnd = NULL;
|
||||||
|
|
||||||
/* Keeps track of the number of free bytes remaining, but says nothing about
|
/* Keeps track of the number of calls to allocate and free memory as well as the
|
||||||
fragmentation. */
|
number of free bytes remaining, but says nothing about fragmentation. */
|
||||||
static size_t xFreeBytesRemaining = 0U;
|
static size_t xFreeBytesRemaining = 0U;
|
||||||
static size_t xMinimumEverFreeBytesRemaining = 0U;
|
static size_t xMinimumEverFreeBytesRemaining = 0U;
|
||||||
|
static size_t xNumberOfSuccessfulAllocations = 0;
|
||||||
|
static size_t xNumberOfSuccessfulFrees = 0;
|
||||||
|
|
||||||
/* Gets set to the top bit of an size_t type. When this bit in the xBlockSize
|
/* Gets set to the top bit of an size_t type. When this bit in the xBlockSize
|
||||||
member of an BlockLink_t structure is set then the block belongs to the
|
member of an BlockLink_t structure is set then the block belongs to the
|
||||||
|
@ -221,6 +223,7 @@ void *pvReturn = NULL;
|
||||||
by the application and has no "next" block. */
|
by the application and has no "next" block. */
|
||||||
pxBlock->xBlockSize |= xBlockAllocatedBit;
|
pxBlock->xBlockSize |= xBlockAllocatedBit;
|
||||||
pxBlock->pxNextFreeBlock = NULL;
|
pxBlock->pxNextFreeBlock = NULL;
|
||||||
|
xNumberOfSuccessfulAllocations++;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -292,6 +295,7 @@ BlockLink_t *pxLink;
|
||||||
xFreeBytesRemaining += pxLink->xBlockSize;
|
xFreeBytesRemaining += pxLink->xBlockSize;
|
||||||
traceFREE( pv, pxLink->xBlockSize );
|
traceFREE( pv, pxLink->xBlockSize );
|
||||||
prvInsertBlockIntoFreeList( ( ( BlockLink_t * ) pxLink ) );
|
prvInsertBlockIntoFreeList( ( ( BlockLink_t * ) pxLink ) );
|
||||||
|
xNumberOfSuccessfulFrees++;
|
||||||
}
|
}
|
||||||
( void ) xTaskResumeAll();
|
( void ) xTaskResumeAll();
|
||||||
}
|
}
|
||||||
|
@ -433,4 +437,56 @@ uint8_t *puc;
|
||||||
mtCOVERAGE_TEST_MARKER();
|
mtCOVERAGE_TEST_MARKER();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
void vPortGetHeapStats( HeapStats_t *pxHeapStats )
|
||||||
|
{
|
||||||
|
BlockLink_t *pxBlock;
|
||||||
|
size_t xBlocks = 0, xMaxSize = 0, xMinSize = portMAX_DELAY; /* portMAX_DELAY used as a portable way of getting the maximum value. */
|
||||||
|
|
||||||
|
vTaskSuspendAll();
|
||||||
|
{
|
||||||
|
pxBlock = xStart.pxNextFreeBlock;
|
||||||
|
|
||||||
|
/* pxBlock will be NULL if the heap has not been initialised. The heap
|
||||||
|
is initialised automatically when the first allocation is made. */
|
||||||
|
if( pxBlock != NULL )
|
||||||
|
{
|
||||||
|
do
|
||||||
|
{
|
||||||
|
/* Increment the number of blocks and record the largest block seen
|
||||||
|
so far. */
|
||||||
|
xBlocks++;
|
||||||
|
|
||||||
|
if( pxBlock->xBlockSize > xMaxSize )
|
||||||
|
{
|
||||||
|
xMaxSize = pxBlock->xBlockSize;
|
||||||
|
}
|
||||||
|
|
||||||
|
if( pxBlock->xBlockSize < xMinSize )
|
||||||
|
{
|
||||||
|
xMinSize = pxBlock->xBlockSize;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Move to the next block in the chain until the last block is
|
||||||
|
reached. */
|
||||||
|
pxBlock = pxBlock->pxNextFreeBlock;
|
||||||
|
} while( pxBlock != pxEnd );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
xTaskResumeAll();
|
||||||
|
|
||||||
|
pxHeapStats->xSizeOfLargestFreeBlockInBytes = xMaxSize;
|
||||||
|
pxHeapStats->xSizeOfSmallestFreeBlockInBytes = xMinSize;
|
||||||
|
pxHeapStats->xNumberOfFreeBlocks = xBlocks;
|
||||||
|
|
||||||
|
taskENTER_CRITICAL();
|
||||||
|
{
|
||||||
|
pxHeapStats->xAvailableHeapSpaceInBytes = xFreeBytesRemaining;
|
||||||
|
pxHeapStats->xNumberOfSuccessfulAllocations = xNumberOfSuccessfulAllocations;
|
||||||
|
pxHeapStats->xNumberOfSuccessfulFrees = xNumberOfSuccessfulFrees;
|
||||||
|
pxHeapStats->xMinimumEverFreeBytesRemaining = xMinimumEverFreeBytesRemaining;
|
||||||
|
}
|
||||||
|
taskEXIT_CRITICAL();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
46
Middlewares/Third_Party/FreeRTOS/Source/queue.c
vendored
46
Middlewares/Third_Party/FreeRTOS/Source/queue.c
vendored
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* FreeRTOS Kernel V10.2.1
|
* FreeRTOS Kernel V10.3.1
|
||||||
* Copyright (C) 2019 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
* Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
||||||
*
|
*
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy of
|
* Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||||
* this software and associated documentation files (the "Software"), to deal in
|
* this software and associated documentation files (the "Software"), to deal in
|
||||||
|
@ -203,7 +203,7 @@ static void prvCopyDataFromQueue( Queue_t * const pxQueue, void * const pvBuffer
|
||||||
* Checks to see if a queue is a member of a queue set, and if so, notifies
|
* Checks to see if a queue is a member of a queue set, and if so, notifies
|
||||||
* the queue set that the queue contains data.
|
* the queue set that the queue contains data.
|
||||||
*/
|
*/
|
||||||
static BaseType_t prvNotifyQueueSetContainer( const Queue_t * const pxQueue, const BaseType_t xCopyPosition ) PRIVILEGED_FUNCTION;
|
static BaseType_t prvNotifyQueueSetContainer( const Queue_t * const pxQueue ) PRIVILEGED_FUNCTION;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -373,17 +373,10 @@ Queue_t * const pxQueue = xQueue;
|
||||||
|
|
||||||
configASSERT( uxQueueLength > ( UBaseType_t ) 0 );
|
configASSERT( uxQueueLength > ( UBaseType_t ) 0 );
|
||||||
|
|
||||||
if( uxItemSize == ( UBaseType_t ) 0 )
|
/* Allocate enough space to hold the maximum number of items that
|
||||||
{
|
can be in the queue at any time. It is valid for uxItemSize to be
|
||||||
/* There is not going to be a queue storage area. */
|
zero in the case the queue is used as a semaphore. */
|
||||||
xQueueSizeInBytes = ( size_t ) 0;
|
xQueueSizeInBytes = ( size_t ) ( uxQueueLength * uxItemSize ); /*lint !e961 MISRA exception as the casts are only redundant for some ports. */
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
/* Allocate enough space to hold the maximum number of items that
|
|
||||||
can be in the queue at any time. */
|
|
||||||
xQueueSizeInBytes = ( size_t ) ( uxQueueLength * uxItemSize ); /*lint !e961 MISRA exception as the casts are only redundant for some ports. */
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Allocate the queue and storage area. Justification for MISRA
|
/* Allocate the queue and storage area. Justification for MISRA
|
||||||
deviation as follows: pvPortMalloc() always ensures returned memory
|
deviation as follows: pvPortMalloc() always ensures returned memory
|
||||||
|
@ -777,7 +770,7 @@ Queue_t * const pxQueue = xQueue;
|
||||||
|
|
||||||
#if ( configUSE_QUEUE_SETS == 1 )
|
#if ( configUSE_QUEUE_SETS == 1 )
|
||||||
{
|
{
|
||||||
UBaseType_t uxPreviousMessagesWaiting = pxQueue->uxMessagesWaiting;
|
const UBaseType_t uxPreviousMessagesWaiting = pxQueue->uxMessagesWaiting;
|
||||||
|
|
||||||
xYieldRequired = prvCopyDataToQueue( pxQueue, pvItemToQueue, xCopyPosition );
|
xYieldRequired = prvCopyDataToQueue( pxQueue, pvItemToQueue, xCopyPosition );
|
||||||
|
|
||||||
|
@ -790,7 +783,7 @@ Queue_t * const pxQueue = xQueue;
|
||||||
in the queue has not changed. */
|
in the queue has not changed. */
|
||||||
mtCOVERAGE_TEST_MARKER();
|
mtCOVERAGE_TEST_MARKER();
|
||||||
}
|
}
|
||||||
else if( prvNotifyQueueSetContainer( pxQueue, xCopyPosition ) != pdFALSE )
|
else if( prvNotifyQueueSetContainer( pxQueue ) != pdFALSE )
|
||||||
{
|
{
|
||||||
/* The queue is a member of a queue set, and posting
|
/* The queue is a member of a queue set, and posting
|
||||||
to the queue set caused a higher priority task to
|
to the queue set caused a higher priority task to
|
||||||
|
@ -990,6 +983,7 @@ Queue_t * const pxQueue = xQueue;
|
||||||
if( ( pxQueue->uxMessagesWaiting < pxQueue->uxLength ) || ( xCopyPosition == queueOVERWRITE ) )
|
if( ( pxQueue->uxMessagesWaiting < pxQueue->uxLength ) || ( xCopyPosition == queueOVERWRITE ) )
|
||||||
{
|
{
|
||||||
const int8_t cTxLock = pxQueue->cTxLock;
|
const int8_t cTxLock = pxQueue->cTxLock;
|
||||||
|
const UBaseType_t uxPreviousMessagesWaiting = pxQueue->uxMessagesWaiting;
|
||||||
|
|
||||||
traceQUEUE_SEND_FROM_ISR( pxQueue );
|
traceQUEUE_SEND_FROM_ISR( pxQueue );
|
||||||
|
|
||||||
|
@ -1008,7 +1002,14 @@ Queue_t * const pxQueue = xQueue;
|
||||||
{
|
{
|
||||||
if( pxQueue->pxQueueSetContainer != NULL )
|
if( pxQueue->pxQueueSetContainer != NULL )
|
||||||
{
|
{
|
||||||
if( prvNotifyQueueSetContainer( pxQueue, xCopyPosition ) != pdFALSE )
|
if( ( xCopyPosition == queueOVERWRITE ) && ( uxPreviousMessagesWaiting != ( UBaseType_t ) 0 ) )
|
||||||
|
{
|
||||||
|
/* Do not notify the queue set as an existing item
|
||||||
|
was overwritten in the queue so the number of items
|
||||||
|
in the queue has not changed. */
|
||||||
|
mtCOVERAGE_TEST_MARKER();
|
||||||
|
}
|
||||||
|
else if( prvNotifyQueueSetContainer( pxQueue ) != pdFALSE )
|
||||||
{
|
{
|
||||||
/* The queue is a member of a queue set, and posting
|
/* The queue is a member of a queue set, and posting
|
||||||
to the queue set caused a higher priority task to
|
to the queue set caused a higher priority task to
|
||||||
|
@ -1081,6 +1082,9 @@ Queue_t * const pxQueue = xQueue;
|
||||||
{
|
{
|
||||||
mtCOVERAGE_TEST_MARKER();
|
mtCOVERAGE_TEST_MARKER();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Not used in this path. */
|
||||||
|
( void ) uxPreviousMessagesWaiting;
|
||||||
}
|
}
|
||||||
#endif /* configUSE_QUEUE_SETS */
|
#endif /* configUSE_QUEUE_SETS */
|
||||||
}
|
}
|
||||||
|
@ -1173,7 +1177,7 @@ Queue_t * const pxQueue = xQueue;
|
||||||
{
|
{
|
||||||
if( pxQueue->pxQueueSetContainer != NULL )
|
if( pxQueue->pxQueueSetContainer != NULL )
|
||||||
{
|
{
|
||||||
if( prvNotifyQueueSetContainer( pxQueue, queueSEND_TO_BACK ) != pdFALSE )
|
if( prvNotifyQueueSetContainer( pxQueue ) != pdFALSE )
|
||||||
{
|
{
|
||||||
/* The semaphore is a member of a queue set, and
|
/* The semaphore is a member of a queue set, and
|
||||||
posting to the queue set caused a higher priority
|
posting to the queue set caused a higher priority
|
||||||
|
@ -2185,7 +2189,7 @@ static void prvUnlockQueue( Queue_t * const pxQueue )
|
||||||
{
|
{
|
||||||
if( pxQueue->pxQueueSetContainer != NULL )
|
if( pxQueue->pxQueueSetContainer != NULL )
|
||||||
{
|
{
|
||||||
if( prvNotifyQueueSetContainer( pxQueue, queueSEND_TO_BACK ) != pdFALSE )
|
if( prvNotifyQueueSetContainer( pxQueue ) != pdFALSE )
|
||||||
{
|
{
|
||||||
/* The queue is a member of a queue set, and posting to
|
/* The queue is a member of a queue set, and posting to
|
||||||
the queue set caused a higher priority task to unblock.
|
the queue set caused a higher priority task to unblock.
|
||||||
|
@ -2875,7 +2879,7 @@ Queue_t * const pxQueue = xQueue;
|
||||||
|
|
||||||
#if ( configUSE_QUEUE_SETS == 1 )
|
#if ( configUSE_QUEUE_SETS == 1 )
|
||||||
|
|
||||||
static BaseType_t prvNotifyQueueSetContainer( const Queue_t * const pxQueue, const BaseType_t xCopyPosition )
|
static BaseType_t prvNotifyQueueSetContainer( const Queue_t * const pxQueue )
|
||||||
{
|
{
|
||||||
Queue_t *pxQueueSetContainer = pxQueue->pxQueueSetContainer;
|
Queue_t *pxQueueSetContainer = pxQueue->pxQueueSetContainer;
|
||||||
BaseType_t xReturn = pdFALSE;
|
BaseType_t xReturn = pdFALSE;
|
||||||
|
@ -2892,7 +2896,7 @@ Queue_t * const pxQueue = xQueue;
|
||||||
traceQUEUE_SEND( pxQueueSetContainer );
|
traceQUEUE_SEND( pxQueueSetContainer );
|
||||||
|
|
||||||
/* The data copied is the handle of the queue that contains data. */
|
/* The data copied is the handle of the queue that contains data. */
|
||||||
xReturn = prvCopyDataToQueue( pxQueueSetContainer, &pxQueue, xCopyPosition );
|
xReturn = prvCopyDataToQueue( pxQueueSetContainer, &pxQueue, queueSEND_TO_BACK );
|
||||||
|
|
||||||
if( cTxLock == queueUNLOCKED )
|
if( cTxLock == queueUNLOCKED )
|
||||||
{
|
{
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* FreeRTOS Kernel V10.2.1
|
* FreeRTOS Kernel V10.3.1
|
||||||
* Copyright (C) 2019 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
* Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
||||||
*
|
*
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy of
|
* Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||||
* this software and associated documentation files (the "Software"), to deal in
|
* this software and associated documentation files (the "Software"), to deal in
|
||||||
|
|
184
Middlewares/Third_Party/FreeRTOS/Source/tasks.c
vendored
184
Middlewares/Third_Party/FreeRTOS/Source/tasks.c
vendored
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* FreeRTOS Kernel V10.2.1
|
* FreeRTOS Kernel V10.3.1
|
||||||
* Copyright (C) 2019 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
* Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
||||||
*
|
*
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy of
|
* Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||||
* this software and associated documentation files (the "Software"), to deal in
|
* this software and associated documentation files (the "Software"), to deal in
|
||||||
|
@ -300,7 +300,10 @@ typedef struct tskTaskControlBlock /* The old naming convention is used to pr
|
||||||
responsible for resulting newlib operation. User must be familiar with
|
responsible for resulting newlib operation. User must be familiar with
|
||||||
newlib and must provide system-wide implementations of the necessary
|
newlib and must provide system-wide implementations of the necessary
|
||||||
stubs. Be warned that (at the time of writing) the current newlib design
|
stubs. Be warned that (at the time of writing) the current newlib design
|
||||||
implements a system-wide malloc() that must be provided with locks. */
|
implements a system-wide malloc() that must be provided with locks.
|
||||||
|
|
||||||
|
See the third party link http://www.nadler.com/embedded/newlibAndFreeRTOS.html
|
||||||
|
for additional information. */
|
||||||
struct _reent xNewLib_reent;
|
struct _reent xNewLib_reent;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -337,23 +340,23 @@ PRIVILEGED_DATA TCB_t * volatile pxCurrentTCB = NULL;
|
||||||
xDelayedTaskList1 and xDelayedTaskList2 could be move to function scople but
|
xDelayedTaskList1 and xDelayedTaskList2 could be move to function scople but
|
||||||
doing so breaks some kernel aware debuggers and debuggers that rely on removing
|
doing so breaks some kernel aware debuggers and debuggers that rely on removing
|
||||||
the static qualifier. */
|
the static qualifier. */
|
||||||
PRIVILEGED_DATA static List_t pxReadyTasksLists[ configMAX_PRIORITIES ] = { 0 };/*< Prioritised ready tasks. */
|
PRIVILEGED_DATA static List_t pxReadyTasksLists[ configMAX_PRIORITIES ];/*< Prioritised ready tasks. */
|
||||||
PRIVILEGED_DATA static List_t xDelayedTaskList1 = { 0 }; /*< Delayed tasks. */
|
PRIVILEGED_DATA static List_t xDelayedTaskList1; /*< Delayed tasks. */
|
||||||
PRIVILEGED_DATA static List_t xDelayedTaskList2 = { 0 }; /*< Delayed tasks (two lists are used - one for delays that have overflowed the current tick count. */
|
PRIVILEGED_DATA static List_t xDelayedTaskList2; /*< Delayed tasks (two lists are used - one for delays that have overflowed the current tick count. */
|
||||||
PRIVILEGED_DATA static List_t * volatile pxDelayedTaskList = NULL; /*< Points to the delayed task list currently being used. */
|
PRIVILEGED_DATA static List_t * volatile pxDelayedTaskList; /*< Points to the delayed task list currently being used. */
|
||||||
PRIVILEGED_DATA static List_t * volatile pxOverflowDelayedTaskList = NULL; /*< Points to the delayed task list currently being used to hold tasks that have overflowed the current tick count. */
|
PRIVILEGED_DATA static List_t * volatile pxOverflowDelayedTaskList; /*< Points to the delayed task list currently being used to hold tasks that have overflowed the current tick count. */
|
||||||
PRIVILEGED_DATA static List_t xPendingReadyList = { 0 }; /*< Tasks that have been readied while the scheduler was suspended. They will be moved to the ready list when the scheduler is resumed. */
|
PRIVILEGED_DATA static List_t xPendingReadyList; /*< Tasks that have been readied while the scheduler was suspended. They will be moved to the ready list when the scheduler is resumed. */
|
||||||
|
|
||||||
#if( INCLUDE_vTaskDelete == 1 )
|
#if( INCLUDE_vTaskDelete == 1 )
|
||||||
|
|
||||||
PRIVILEGED_DATA static List_t xTasksWaitingTermination = { 0 }; /*< Tasks that have been deleted - but their memory not yet freed. */
|
PRIVILEGED_DATA static List_t xTasksWaitingTermination; /*< Tasks that have been deleted - but their memory not yet freed. */
|
||||||
PRIVILEGED_DATA static volatile UBaseType_t uxDeletedTasksWaitingCleanUp = ( UBaseType_t ) 0U;
|
PRIVILEGED_DATA static volatile UBaseType_t uxDeletedTasksWaitingCleanUp = ( UBaseType_t ) 0U;
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if ( INCLUDE_vTaskSuspend == 1 )
|
#if ( INCLUDE_vTaskSuspend == 1 )
|
||||||
|
|
||||||
PRIVILEGED_DATA static List_t xSuspendedTaskList = { 0 }; /*< Tasks that are currently suspended. */
|
PRIVILEGED_DATA static List_t xSuspendedTaskList; /*< Tasks that are currently suspended. */
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -368,7 +371,7 @@ PRIVILEGED_DATA static volatile UBaseType_t uxCurrentNumberOfTasks = ( UBaseTyp
|
||||||
PRIVILEGED_DATA static volatile TickType_t xTickCount = ( TickType_t ) configINITIAL_TICK_COUNT;
|
PRIVILEGED_DATA static volatile TickType_t xTickCount = ( TickType_t ) configINITIAL_TICK_COUNT;
|
||||||
PRIVILEGED_DATA static volatile UBaseType_t uxTopReadyPriority = tskIDLE_PRIORITY;
|
PRIVILEGED_DATA static volatile UBaseType_t uxTopReadyPriority = tskIDLE_PRIORITY;
|
||||||
PRIVILEGED_DATA static volatile BaseType_t xSchedulerRunning = pdFALSE;
|
PRIVILEGED_DATA static volatile BaseType_t xSchedulerRunning = pdFALSE;
|
||||||
PRIVILEGED_DATA static volatile UBaseType_t uxPendedTicks = ( UBaseType_t ) 0U;
|
PRIVILEGED_DATA static volatile TickType_t xPendedTicks = ( TickType_t ) 0U;
|
||||||
PRIVILEGED_DATA static volatile BaseType_t xYieldPending = pdFALSE;
|
PRIVILEGED_DATA static volatile BaseType_t xYieldPending = pdFALSE;
|
||||||
PRIVILEGED_DATA static volatile BaseType_t xNumOfOverflows = ( BaseType_t ) 0;
|
PRIVILEGED_DATA static volatile BaseType_t xNumOfOverflows = ( BaseType_t ) 0;
|
||||||
PRIVILEGED_DATA static UBaseType_t uxTaskNumber = ( UBaseType_t ) 0U;
|
PRIVILEGED_DATA static UBaseType_t uxTaskNumber = ( UBaseType_t ) 0U;
|
||||||
|
@ -993,7 +996,9 @@ UBaseType_t x;
|
||||||
|
|
||||||
#if ( configUSE_NEWLIB_REENTRANT == 1 )
|
#if ( configUSE_NEWLIB_REENTRANT == 1 )
|
||||||
{
|
{
|
||||||
/* Initialise this task's Newlib reent structure. */
|
/* Initialise this task's Newlib reent structure.
|
||||||
|
See the third party link http://www.nadler.com/embedded/newlibAndFreeRTOS.html
|
||||||
|
for additional information. */
|
||||||
_REENT_INIT_PTR( ( &( pxNewTCB->xNewLib_reent ) ) );
|
_REENT_INIT_PTR( ( &( pxNewTCB->xNewLib_reent ) ) );
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
@ -1164,7 +1169,7 @@ static void prvAddNewTaskToReadyList( TCB_t *pxNewTCB )
|
||||||
being deleted. */
|
being deleted. */
|
||||||
pxTCB = prvGetTCBFromHandle( xTaskToDelete );
|
pxTCB = prvGetTCBFromHandle( xTaskToDelete );
|
||||||
|
|
||||||
/* Remove task from the ready list. */
|
/* Remove task from the ready/delayed list. */
|
||||||
if( uxListRemove( &( pxTCB->xStateListItem ) ) == ( UBaseType_t ) 0 )
|
if( uxListRemove( &( pxTCB->xStateListItem ) ) == ( UBaseType_t ) 0 )
|
||||||
{
|
{
|
||||||
taskRESET_READY_PRIORITY( pxTCB->uxPriority );
|
taskRESET_READY_PRIORITY( pxTCB->uxPriority );
|
||||||
|
@ -1204,6 +1209,10 @@ static void prvAddNewTaskToReadyList( TCB_t *pxNewTCB )
|
||||||
check the xTasksWaitingTermination list. */
|
check the xTasksWaitingTermination list. */
|
||||||
++uxDeletedTasksWaitingCleanUp;
|
++uxDeletedTasksWaitingCleanUp;
|
||||||
|
|
||||||
|
/* Call the delete hook before portPRE_TASK_DELETE_HOOK() as
|
||||||
|
portPRE_TASK_DELETE_HOOK() does not return in the Win32 port. */
|
||||||
|
traceTASK_DELETE( pxTCB );
|
||||||
|
|
||||||
/* The pre-delete hook is primarily for the Windows simulator,
|
/* The pre-delete hook is primarily for the Windows simulator,
|
||||||
in which Windows specific clean up operations are performed,
|
in which Windows specific clean up operations are performed,
|
||||||
after which it is not possible to yield away from this task -
|
after which it is not possible to yield away from this task -
|
||||||
|
@ -1214,14 +1223,13 @@ static void prvAddNewTaskToReadyList( TCB_t *pxNewTCB )
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
--uxCurrentNumberOfTasks;
|
--uxCurrentNumberOfTasks;
|
||||||
|
traceTASK_DELETE( pxTCB );
|
||||||
prvDeleteTCB( pxTCB );
|
prvDeleteTCB( pxTCB );
|
||||||
|
|
||||||
/* Reset the next expected unblock time in case it referred to
|
/* Reset the next expected unblock time in case it referred to
|
||||||
the task that has just been deleted. */
|
the task that has just been deleted. */
|
||||||
prvResetNextTaskUnblockTime();
|
prvResetNextTaskUnblockTime();
|
||||||
}
|
}
|
||||||
|
|
||||||
traceTASK_DELETE( pxTCB );
|
|
||||||
}
|
}
|
||||||
taskEXIT_CRITICAL();
|
taskEXIT_CRITICAL();
|
||||||
|
|
||||||
|
@ -2041,7 +2049,9 @@ BaseType_t xReturn;
|
||||||
#if ( configUSE_NEWLIB_REENTRANT == 1 )
|
#if ( configUSE_NEWLIB_REENTRANT == 1 )
|
||||||
{
|
{
|
||||||
/* Switch Newlib's _impure_ptr variable to point to the _reent
|
/* Switch Newlib's _impure_ptr variable to point to the _reent
|
||||||
structure specific to the task that will run first. */
|
structure specific to the task that will run first.
|
||||||
|
See the third party link http://www.nadler.com/embedded/newlibAndFreeRTOS.html
|
||||||
|
for additional information. */
|
||||||
_impure_ptr = &( pxCurrentTCB->xNewLib_reent );
|
_impure_ptr = &( pxCurrentTCB->xNewLib_reent );
|
||||||
}
|
}
|
||||||
#endif /* configUSE_NEWLIB_REENTRANT */
|
#endif /* configUSE_NEWLIB_REENTRANT */
|
||||||
|
@ -2103,7 +2113,17 @@ void vTaskSuspendAll( void )
|
||||||
BaseType_t. Please read Richard Barry's reply in the following link to a
|
BaseType_t. Please read Richard Barry's reply in the following link to a
|
||||||
post in the FreeRTOS support forum before reporting this as a bug! -
|
post in the FreeRTOS support forum before reporting this as a bug! -
|
||||||
http://goo.gl/wu4acr */
|
http://goo.gl/wu4acr */
|
||||||
|
|
||||||
|
/* portSOFRWARE_BARRIER() is only implemented for emulated/simulated ports that
|
||||||
|
do not otherwise exhibit real time behaviour. */
|
||||||
|
portSOFTWARE_BARRIER();
|
||||||
|
|
||||||
|
/* The scheduler is suspended if uxSchedulerSuspended is non-zero. An increment
|
||||||
|
is used to allow calls to vTaskSuspendAll() to nest. */
|
||||||
++uxSchedulerSuspended;
|
++uxSchedulerSuspended;
|
||||||
|
|
||||||
|
/* Enforces ordering for ports and optimised compilers that may otherwise place
|
||||||
|
the above increment elsewhere. */
|
||||||
portMEMORY_BARRIER();
|
portMEMORY_BARRIER();
|
||||||
}
|
}
|
||||||
/*----------------------------------------------------------*/
|
/*----------------------------------------------------------*/
|
||||||
|
@ -2230,9 +2250,9 @@ BaseType_t xAlreadyYielded = pdFALSE;
|
||||||
not slip, and that any delayed tasks are resumed at the correct
|
not slip, and that any delayed tasks are resumed at the correct
|
||||||
time. */
|
time. */
|
||||||
{
|
{
|
||||||
UBaseType_t uxPendedCounts = uxPendedTicks; /* Non-volatile copy. */
|
TickType_t xPendedCounts = xPendedTicks; /* Non-volatile copy. */
|
||||||
|
|
||||||
if( uxPendedCounts > ( UBaseType_t ) 0U )
|
if( xPendedCounts > ( TickType_t ) 0U )
|
||||||
{
|
{
|
||||||
do
|
do
|
||||||
{
|
{
|
||||||
|
@ -2244,10 +2264,10 @@ BaseType_t xAlreadyYielded = pdFALSE;
|
||||||
{
|
{
|
||||||
mtCOVERAGE_TEST_MARKER();
|
mtCOVERAGE_TEST_MARKER();
|
||||||
}
|
}
|
||||||
--uxPendedCounts;
|
--xPendedCounts;
|
||||||
} while( uxPendedCounts > ( UBaseType_t ) 0U );
|
} while( xPendedCounts > ( TickType_t ) 0U );
|
||||||
|
|
||||||
uxPendedTicks = 0;
|
xPendedTicks = 0;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -2586,6 +2606,24 @@ implementations require configUSE_TICKLESS_IDLE to be set to a value other than
|
||||||
#endif /* configUSE_TICKLESS_IDLE */
|
#endif /* configUSE_TICKLESS_IDLE */
|
||||||
/*----------------------------------------------------------*/
|
/*----------------------------------------------------------*/
|
||||||
|
|
||||||
|
BaseType_t xTaskCatchUpTicks( TickType_t xTicksToCatchUp )
|
||||||
|
{
|
||||||
|
BaseType_t xYieldRequired = pdFALSE;
|
||||||
|
|
||||||
|
/* Must not be called with the scheduler suspended as the implementation
|
||||||
|
relies on xPendedTicks being wound down to 0 in xTaskResumeAll(). */
|
||||||
|
configASSERT( uxSchedulerSuspended == 0 );
|
||||||
|
|
||||||
|
/* Use xPendedTicks to mimic xTicksToCatchUp number of ticks occurring when
|
||||||
|
the scheduler is suspended so the ticks are executed in xTaskResumeAll(). */
|
||||||
|
vTaskSuspendAll();
|
||||||
|
xPendedTicks += xTicksToCatchUp;
|
||||||
|
xYieldRequired = xTaskResumeAll();
|
||||||
|
|
||||||
|
return xYieldRequired;
|
||||||
|
}
|
||||||
|
/*----------------------------------------------------------*/
|
||||||
|
|
||||||
#if ( INCLUDE_xTaskAbortDelay == 1 )
|
#if ( INCLUDE_xTaskAbortDelay == 1 )
|
||||||
|
|
||||||
BaseType_t xTaskAbortDelay( TaskHandle_t xTask )
|
BaseType_t xTaskAbortDelay( TaskHandle_t xTask )
|
||||||
|
@ -2617,6 +2655,10 @@ implementations require configUSE_TICKLESS_IDLE to be set to a value other than
|
||||||
if( listLIST_ITEM_CONTAINER( &( pxTCB->xEventListItem ) ) != NULL )
|
if( listLIST_ITEM_CONTAINER( &( pxTCB->xEventListItem ) ) != NULL )
|
||||||
{
|
{
|
||||||
( void ) uxListRemove( &( pxTCB->xEventListItem ) );
|
( void ) uxListRemove( &( pxTCB->xEventListItem ) );
|
||||||
|
|
||||||
|
/* This lets the task know it was forcibly removed from the
|
||||||
|
blocked state so it should not re-evaluate its block time and
|
||||||
|
then block again. */
|
||||||
pxTCB->ucDelayAborted = pdTRUE;
|
pxTCB->ucDelayAborted = pdTRUE;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -2793,7 +2835,7 @@ BaseType_t xSwitchRequired = pdFALSE;
|
||||||
{
|
{
|
||||||
/* Guard against the tick hook being called when the pended tick
|
/* Guard against the tick hook being called when the pended tick
|
||||||
count is being unwound (when the scheduler is being unlocked). */
|
count is being unwound (when the scheduler is being unlocked). */
|
||||||
if( uxPendedTicks == ( UBaseType_t ) 0U )
|
if( xPendedTicks == ( TickType_t ) 0 )
|
||||||
{
|
{
|
||||||
vApplicationTickHook();
|
vApplicationTickHook();
|
||||||
}
|
}
|
||||||
|
@ -2803,10 +2845,23 @@ BaseType_t xSwitchRequired = pdFALSE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif /* configUSE_TICK_HOOK */
|
#endif /* configUSE_TICK_HOOK */
|
||||||
|
|
||||||
|
#if ( configUSE_PREEMPTION == 1 )
|
||||||
|
{
|
||||||
|
if( xYieldPending != pdFALSE )
|
||||||
|
{
|
||||||
|
xSwitchRequired = pdTRUE;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
mtCOVERAGE_TEST_MARKER();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif /* configUSE_PREEMPTION */
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
++uxPendedTicks;
|
++xPendedTicks;
|
||||||
|
|
||||||
/* The tick hook gets called at regular intervals, even if the
|
/* The tick hook gets called at regular intervals, even if the
|
||||||
scheduler is locked. */
|
scheduler is locked. */
|
||||||
|
@ -2817,19 +2872,6 @@ BaseType_t xSwitchRequired = pdFALSE;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
#if ( configUSE_PREEMPTION == 1 )
|
|
||||||
{
|
|
||||||
if( xYieldPending != pdFALSE )
|
|
||||||
{
|
|
||||||
xSwitchRequired = pdTRUE;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
mtCOVERAGE_TEST_MARKER();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif /* configUSE_PREEMPTION */
|
|
||||||
|
|
||||||
return xSwitchRequired;
|
return xSwitchRequired;
|
||||||
}
|
}
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
@ -3009,7 +3051,9 @@ void vTaskSwitchContext( void )
|
||||||
#if ( configUSE_NEWLIB_REENTRANT == 1 )
|
#if ( configUSE_NEWLIB_REENTRANT == 1 )
|
||||||
{
|
{
|
||||||
/* Switch Newlib's _impure_ptr variable to point to the _reent
|
/* Switch Newlib's _impure_ptr variable to point to the _reent
|
||||||
structure specific to this task. */
|
structure specific to this task.
|
||||||
|
See the third party link http://www.nadler.com/embedded/newlibAndFreeRTOS.html
|
||||||
|
for additional information. */
|
||||||
_impure_ptr = &( pxCurrentTCB->xNewLib_reent );
|
_impure_ptr = &( pxCurrentTCB->xNewLib_reent );
|
||||||
}
|
}
|
||||||
#endif /* configUSE_NEWLIB_REENTRANT */
|
#endif /* configUSE_NEWLIB_REENTRANT */
|
||||||
|
@ -3176,6 +3220,20 @@ TCB_t *pxUnblockedTCB;
|
||||||
configASSERT( pxUnblockedTCB );
|
configASSERT( pxUnblockedTCB );
|
||||||
( void ) uxListRemove( pxEventListItem );
|
( void ) uxListRemove( pxEventListItem );
|
||||||
|
|
||||||
|
#if( configUSE_TICKLESS_IDLE != 0 )
|
||||||
|
{
|
||||||
|
/* If a task is blocked on a kernel object then xNextTaskUnblockTime
|
||||||
|
might be set to the blocked task's time out time. If the task is
|
||||||
|
unblocked for a reason other than a timeout xNextTaskUnblockTime is
|
||||||
|
normally left unchanged, because it is automatically reset to a new
|
||||||
|
value when the tick count equals xNextTaskUnblockTime. However if
|
||||||
|
tickless idling is used it might be more important to enter sleep mode
|
||||||
|
at the earliest possible time - so reset xNextTaskUnblockTime here to
|
||||||
|
ensure it is updated at the earliest possible time. */
|
||||||
|
prvResetNextTaskUnblockTime();
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
/* Remove the task from the delayed list and add it to the ready list. The
|
/* Remove the task from the delayed list and add it to the ready list. The
|
||||||
scheduler is suspended so interrupts will not be accessing the ready
|
scheduler is suspended so interrupts will not be accessing the ready
|
||||||
lists. */
|
lists. */
|
||||||
|
@ -3456,6 +3514,8 @@ static portTASK_FUNCTION( prvIdleTask, pvParameters )
|
||||||
const UBaseType_t uxNonApplicationTasks = 1;
|
const UBaseType_t uxNonApplicationTasks = 1;
|
||||||
eSleepModeStatus eReturn = eStandardSleep;
|
eSleepModeStatus eReturn = eStandardSleep;
|
||||||
|
|
||||||
|
/* This function must be called from a critical section. */
|
||||||
|
|
||||||
if( listCURRENT_LIST_LENGTH( &xPendingReadyList ) != 0 )
|
if( listCURRENT_LIST_LENGTH( &xPendingReadyList ) != 0 )
|
||||||
{
|
{
|
||||||
/* A task was made ready while the scheduler was suspended. */
|
/* A task was made ready while the scheduler was suspended. */
|
||||||
|
@ -3497,6 +3557,7 @@ static portTASK_FUNCTION( prvIdleTask, pvParameters )
|
||||||
if( xIndex < configNUM_THREAD_LOCAL_STORAGE_POINTERS )
|
if( xIndex < configNUM_THREAD_LOCAL_STORAGE_POINTERS )
|
||||||
{
|
{
|
||||||
pxTCB = prvGetTCBFromHandle( xTaskToSet );
|
pxTCB = prvGetTCBFromHandle( xTaskToSet );
|
||||||
|
configASSERT( pxTCB != NULL );
|
||||||
pxTCB->pvThreadLocalStoragePointers[ xIndex ] = pvValue;
|
pxTCB->pvThreadLocalStoragePointers[ xIndex ] = pvValue;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -3831,7 +3892,9 @@ static void prvCheckTasksWaitingTermination( void )
|
||||||
portCLEAN_UP_TCB( pxTCB );
|
portCLEAN_UP_TCB( pxTCB );
|
||||||
|
|
||||||
/* Free up the memory allocated by the scheduler for the task. It is up
|
/* Free up the memory allocated by the scheduler for the task. It is up
|
||||||
to the task to free any memory allocated at the application level. */
|
to the task to free any memory allocated at the application level.
|
||||||
|
See the third party link http://www.nadler.com/embedded/newlibAndFreeRTOS.html
|
||||||
|
for additional information. */
|
||||||
#if ( configUSE_NEWLIB_REENTRANT == 1 )
|
#if ( configUSE_NEWLIB_REENTRANT == 1 )
|
||||||
{
|
{
|
||||||
_reclaim_reent( &( pxTCB->xNewLib_reent ) );
|
_reclaim_reent( &( pxTCB->xNewLib_reent ) );
|
||||||
|
@ -3981,7 +4044,10 @@ TCB_t *pxTCB;
|
||||||
{
|
{
|
||||||
if( uxListRemove( &( pxMutexHolderTCB->xStateListItem ) ) == ( UBaseType_t ) 0 )
|
if( uxListRemove( &( pxMutexHolderTCB->xStateListItem ) ) == ( UBaseType_t ) 0 )
|
||||||
{
|
{
|
||||||
taskRESET_READY_PRIORITY( pxMutexHolderTCB->uxPriority );
|
/* It is known that the task is in its ready list so
|
||||||
|
there is no need to check again and the port level
|
||||||
|
reset macro can be called directly. */
|
||||||
|
portRESET_READY_PRIORITY( pxMutexHolderTCB->uxPriority, uxTopReadyPriority );
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -4061,7 +4127,7 @@ TCB_t *pxTCB;
|
||||||
the mutex. If the mutex is held by a task then it cannot be
|
the mutex. If the mutex is held by a task then it cannot be
|
||||||
given from an interrupt, and if a mutex is given by the
|
given from an interrupt, and if a mutex is given by the
|
||||||
holding task then it must be the running state task. Remove
|
holding task then it must be the running state task. Remove
|
||||||
the holding task from the ready list. */
|
the holding task from the ready/delayed list. */
|
||||||
if( uxListRemove( &( pxTCB->xStateListItem ) ) == ( UBaseType_t ) 0 )
|
if( uxListRemove( &( pxTCB->xStateListItem ) ) == ( UBaseType_t ) 0 )
|
||||||
{
|
{
|
||||||
taskRESET_READY_PRIORITY( pxTCB->uxPriority );
|
taskRESET_READY_PRIORITY( pxTCB->uxPriority );
|
||||||
|
@ -4182,7 +4248,10 @@ TCB_t *pxTCB;
|
||||||
{
|
{
|
||||||
if( uxListRemove( &( pxTCB->xStateListItem ) ) == ( UBaseType_t ) 0 )
|
if( uxListRemove( &( pxTCB->xStateListItem ) ) == ( UBaseType_t ) 0 )
|
||||||
{
|
{
|
||||||
taskRESET_READY_PRIORITY( pxTCB->uxPriority );
|
/* It is known that the task is in its ready list so
|
||||||
|
there is no need to check again and the port level
|
||||||
|
reset macro can be called directly. */
|
||||||
|
portRESET_READY_PRIORITY( pxTCB->uxPriority, uxTopReadyPriority );
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -5036,7 +5105,6 @@ TickType_t uxReturn;
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif /* configUSE_TASK_NOTIFICATIONS */
|
#endif /* configUSE_TASK_NOTIFICATIONS */
|
||||||
|
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
#if( configUSE_TASK_NOTIFICATIONS == 1 )
|
#if( configUSE_TASK_NOTIFICATIONS == 1 )
|
||||||
|
@ -5070,11 +5138,39 @@ TickType_t uxReturn;
|
||||||
#endif /* configUSE_TASK_NOTIFICATIONS */
|
#endif /* configUSE_TASK_NOTIFICATIONS */
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
#if( configUSE_TASK_NOTIFICATIONS == 1 )
|
||||||
|
|
||||||
|
uint32_t ulTaskNotifyValueClear( TaskHandle_t xTask, uint32_t ulBitsToClear )
|
||||||
|
{
|
||||||
|
TCB_t *pxTCB;
|
||||||
|
uint32_t ulReturn;
|
||||||
|
|
||||||
|
/* If null is passed in here then it is the calling task that is having
|
||||||
|
its notification state cleared. */
|
||||||
|
pxTCB = prvGetTCBFromHandle( xTask );
|
||||||
|
|
||||||
|
taskENTER_CRITICAL();
|
||||||
|
{
|
||||||
|
/* Return the notification as it was before the bits were cleared,
|
||||||
|
then clear the bit mask. */
|
||||||
|
ulReturn = pxCurrentTCB->ulNotifiedValue;
|
||||||
|
pxTCB->ulNotifiedValue &= ~ulBitsToClear;
|
||||||
|
}
|
||||||
|
taskEXIT_CRITICAL();
|
||||||
|
|
||||||
|
return ulReturn;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* configUSE_TASK_NOTIFICATIONS */
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
#if( ( configGENERATE_RUN_TIME_STATS == 1 ) && ( INCLUDE_xTaskGetIdleTaskHandle == 1 ) )
|
#if( ( configGENERATE_RUN_TIME_STATS == 1 ) && ( INCLUDE_xTaskGetIdleTaskHandle == 1 ) )
|
||||||
TickType_t xTaskGetIdleRunTimeCounter( void )
|
|
||||||
|
uint32_t ulTaskGetIdleRunTimeCounter( void )
|
||||||
{
|
{
|
||||||
return xIdleTaskHandle->ulRunTimeCounter;
|
return xIdleTaskHandle->ulRunTimeCounter;
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
|
45
Middlewares/Third_Party/FreeRTOS/Source/timers.c
vendored
45
Middlewares/Third_Party/FreeRTOS/Source/timers.c
vendored
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* FreeRTOS Kernel V10.2.1
|
* FreeRTOS Kernel V10.3.1
|
||||||
* Copyright (C) 2019 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
* Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
||||||
*
|
*
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy of
|
* Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||||
* this software and associated documentation files (the "Software"), to deal in
|
* this software and associated documentation files (the "Software"), to deal in
|
||||||
|
@ -132,10 +132,10 @@ timer service task is allowed to access these lists.
|
||||||
xActiveTimerList1 and xActiveTimerList2 could be at function scope but that
|
xActiveTimerList1 and xActiveTimerList2 could be at function scope but that
|
||||||
breaks some kernel aware debuggers, and debuggers that reply on removing the
|
breaks some kernel aware debuggers, and debuggers that reply on removing the
|
||||||
static qualifier. */
|
static qualifier. */
|
||||||
PRIVILEGED_DATA static List_t xActiveTimerList1 = { 0 };
|
PRIVILEGED_DATA static List_t xActiveTimerList1;
|
||||||
PRIVILEGED_DATA static List_t xActiveTimerList2 = { 0 };
|
PRIVILEGED_DATA static List_t xActiveTimerList2;
|
||||||
PRIVILEGED_DATA static List_t *pxCurrentTimerList = NULL;
|
PRIVILEGED_DATA static List_t *pxCurrentTimerList;
|
||||||
PRIVILEGED_DATA static List_t *pxOverflowTimerList = NULL;
|
PRIVILEGED_DATA static List_t *pxOverflowTimerList;
|
||||||
|
|
||||||
/* A queue that is used to send commands to the timer service task. */
|
/* A queue that is used to send commands to the timer service task. */
|
||||||
PRIVILEGED_DATA static QueueHandle_t xTimerQueue = NULL;
|
PRIVILEGED_DATA static QueueHandle_t xTimerQueue = NULL;
|
||||||
|
@ -182,7 +182,7 @@ static BaseType_t prvInsertTimerInActiveList( Timer_t * const pxTimer, const Tic
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* An active timer has reached its expire time. Reload the timer if it is an
|
* An active timer has reached its expire time. Reload the timer if it is an
|
||||||
* auto reload timer, then call its callback.
|
* auto-reload timer, then call its callback.
|
||||||
*/
|
*/
|
||||||
static void prvProcessExpiredTimer( const TickType_t xNextExpireTime, const TickType_t xTimeNow ) PRIVILEGED_FUNCTION;
|
static void prvProcessExpiredTimer( const TickType_t xNextExpireTime, const TickType_t xTimeNow ) PRIVILEGED_FUNCTION;
|
||||||
|
|
||||||
|
@ -292,7 +292,7 @@ BaseType_t xReturn = pdFAIL;
|
||||||
if( pxNewTimer != NULL )
|
if( pxNewTimer != NULL )
|
||||||
{
|
{
|
||||||
/* Status is thus far zero as the timer is not created statically
|
/* Status is thus far zero as the timer is not created statically
|
||||||
and has not been started. The autoreload bit may get set in
|
and has not been started. The auto-reload bit may get set in
|
||||||
prvInitialiseNewTimer. */
|
prvInitialiseNewTimer. */
|
||||||
pxNewTimer->ucStatus = 0x00;
|
pxNewTimer->ucStatus = 0x00;
|
||||||
prvInitialiseNewTimer( pcTimerName, xTimerPeriodInTicks, uxAutoReload, pvTimerID, pxCallbackFunction, pxNewTimer );
|
prvInitialiseNewTimer( pcTimerName, xTimerPeriodInTicks, uxAutoReload, pvTimerID, pxCallbackFunction, pxNewTimer );
|
||||||
|
@ -334,7 +334,7 @@ BaseType_t xReturn = pdFAIL;
|
||||||
{
|
{
|
||||||
/* Timers can be created statically or dynamically so note this
|
/* Timers can be created statically or dynamically so note this
|
||||||
timer was created statically in case it is later deleted. The
|
timer was created statically in case it is later deleted. The
|
||||||
autoreload bit may get set in prvInitialiseNewTimer(). */
|
auto-reload bit may get set in prvInitialiseNewTimer(). */
|
||||||
pxNewTimer->ucStatus = tmrSTATUS_IS_STATICALLY_ALLOCATED;
|
pxNewTimer->ucStatus = tmrSTATUS_IS_STATICALLY_ALLOCATED;
|
||||||
|
|
||||||
prvInitialiseNewTimer( pcTimerName, xTimerPeriodInTicks, uxAutoReload, pvTimerID, pxCallbackFunction, pxNewTimer );
|
prvInitialiseNewTimer( pcTimerName, xTimerPeriodInTicks, uxAutoReload, pvTimerID, pxCallbackFunction, pxNewTimer );
|
||||||
|
@ -459,6 +459,31 @@ Timer_t * pxTimer = xTimer;
|
||||||
}
|
}
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
UBaseType_t uxTimerGetReloadMode( TimerHandle_t xTimer )
|
||||||
|
{
|
||||||
|
Timer_t * pxTimer = xTimer;
|
||||||
|
UBaseType_t uxReturn;
|
||||||
|
|
||||||
|
configASSERT( xTimer );
|
||||||
|
taskENTER_CRITICAL();
|
||||||
|
{
|
||||||
|
if( ( pxTimer->ucStatus & tmrSTATUS_IS_AUTORELOAD ) == 0 )
|
||||||
|
{
|
||||||
|
/* Not an auto-reload timer. */
|
||||||
|
uxReturn = ( UBaseType_t ) pdFALSE;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* Is an auto-reload timer. */
|
||||||
|
uxReturn = ( UBaseType_t ) pdTRUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
taskEXIT_CRITICAL();
|
||||||
|
|
||||||
|
return uxReturn;
|
||||||
|
}
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
TickType_t xTimerGetExpiryTime( TimerHandle_t xTimer )
|
TickType_t xTimerGetExpiryTime( TimerHandle_t xTimer )
|
||||||
{
|
{
|
||||||
Timer_t * pxTimer = xTimer;
|
Timer_t * pxTimer = xTimer;
|
||||||
|
@ -489,7 +514,7 @@ Timer_t * const pxTimer = ( Timer_t * ) listGET_OWNER_OF_HEAD_ENTRY( pxCurrentTi
|
||||||
( void ) uxListRemove( &( pxTimer->xTimerListItem ) );
|
( void ) uxListRemove( &( pxTimer->xTimerListItem ) );
|
||||||
traceTIMER_EXPIRED( pxTimer );
|
traceTIMER_EXPIRED( pxTimer );
|
||||||
|
|
||||||
/* If the timer is an auto reload timer then calculate the next
|
/* If the timer is an auto-reload timer then calculate the next
|
||||||
expiry time and re-insert the timer in the list of active timers. */
|
expiry time and re-insert the timer in the list of active timers. */
|
||||||
if( ( pxTimer->ucStatus & tmrSTATUS_IS_AUTORELOAD ) != 0 )
|
if( ( pxTimer->ucStatus & tmrSTATUS_IS_AUTORELOAD ) != 0 )
|
||||||
{
|
{
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue