diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..a5c7d3ad8f8aef0fbdaa4ec88be267c9610936f6 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +.zip diff --git a/CMSISv2p00_LPC17xx/.cproject b/CMSISv2p00_LPC17xx/.cproject new file mode 100644 index 0000000000000000000000000000000000000000..a1817705ed7c215a65c90f7b7f9cd2500101d859 --- /dev/null +++ b/CMSISv2p00_LPC17xx/.cproject @@ -0,0 +1,548 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<?fileVersion 4.0.0?><cproject storage_type_id="org.eclipse.cdt.core.XmlProjectDescriptionStorage"> + <storageModule moduleId="org.eclipse.cdt.core.settings"> + <cconfiguration id="com.crt.advproject.config.lib.debug.1814355025"> + <storageModule buildSystemId="org.eclipse.cdt.managedbuilder.core.configurationDataProvider" id="com.crt.advproject.config.lib.debug.1814355025" moduleId="org.eclipse.cdt.core.settings" name="Debug"> + <externalSettings> + <externalSetting> + <entry flags="VALUE_WORKSPACE_PATH" kind="includePath" name="/CMSISv2p00_LPC17xx"/> + <entry flags="VALUE_WORKSPACE_PATH" kind="libraryPath" name="/CMSISv2p00_LPC17xx/Debug"/> + <entry flags="RESOLVED" kind="libraryFile" name="CMSISv2p00_LPC17xx" srcPrefixMapping="" srcRootPath=""/> + </externalSetting> + </externalSettings> + <extensions> + <extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser"/> + <extension id="org.eclipse.cdt.core.GNU_ELF" point="org.eclipse.cdt.core.BinaryParser"/> + <extension id="org.eclipse.cdt.core.MakeErrorParser" point="org.eclipse.cdt.core.ErrorParser"/> + <extension id="org.eclipse.cdt.core.GCCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/> + <extension id="org.eclipse.cdt.core.GASErrorParser" point="org.eclipse.cdt.core.ErrorParser"/> + <extension id="org.eclipse.cdt.core.GLDErrorParser" point="org.eclipse.cdt.core.ErrorParser"/> + <extension id="org.eclipse.cdt.core.GmakeErrorParser" point="org.eclipse.cdt.core.ErrorParser"/> + <extension id="org.eclipse.cdt.core.CWDLocator" point="org.eclipse.cdt.core.ErrorParser"/> + </extensions> + </storageModule> + <storageModule moduleId="cdtBuildSystem" version="4.0.0"> + <configuration artifactExtension="a" artifactName="${ProjName}" buildArtefactType="org.eclipse.cdt.build.core.buildArtefactType.staticLib" buildProperties="org.eclipse.cdt.build.core.buildArtefactType=org.eclipse.cdt.build.core.buildArtefactType.staticLib" cleanCommand="rm -rf" description="Debug build" errorParsers="org.eclipse.cdt.core.MakeErrorParser;org.eclipse.cdt.core.GCCErrorParser;org.eclipse.cdt.core.GLDErrorParser;org.eclipse.cdt.core.GASErrorParser" id="com.crt.advproject.config.lib.debug.1814355025" name="Debug" parent="com.crt.advproject.config.lib.debug" postannouncebuildStep="Performing post-build steps" postbuildStep="arm-none-eabi-size lib${BuildArtifactFileName} ; # arm-none-eabi-objdump -h -S lib${BuildArtifactFileName} >${BuildArtifactFileBaseName}.lss"> + <folderInfo id="com.crt.advproject.config.lib.debug.1814355025." name="/" resourcePath=""> + <toolChain id="com.crt.advproject.toolchain.lib.debug.1548108302" name="Code Red MCU Tools" superClass="com.crt.advproject.toolchain.lib.debug"> + <targetPlatform binaryParser="org.eclipse.cdt.core.ELF;org.eclipse.cdt.core.GNU_ELF" id="com.crt.advproject.platform.lib.debug.1050494393" name="ARM-based MCU (Debug)" superClass="com.crt.advproject.platform.lib.debug"/> + <builder buildPath="${workspace_loc:/CMSISv2p00_LPC17xx/Debug}" id="com.crt.advproject.builder.lib.debug.511092144" keepEnvironmentInBuildfile="false" managedBuildOn="true" name="Gnu Make Builder" superClass="com.crt.advproject.builder.lib.debug"/> + <tool id="com.crt.advproject.cpp.lib.debug.1604093373" name="MCU C++ Compiler" superClass="com.crt.advproject.cpp.lib.debug"> + <option id="com.crt.advproject.cpp.hdrlib.315305423" superClass="com.crt.advproject.cpp.hdrlib" useByScannerDiscovery="false"/> + <option id="gnu.cpp.compiler.option.preprocessor.def.451551178" superClass="gnu.cpp.compiler.option.preprocessor.def" useByScannerDiscovery="false"/> + </tool> + <tool id="com.crt.advproject.gcc.lib.debug.1004026908" name="MCU C Compiler" superClass="com.crt.advproject.gcc.lib.debug"> + <option id="com.crt.advproject.gcc.arch.1404126263" name="Architecture" superClass="com.crt.advproject.gcc.arch" useByScannerDiscovery="true" value="com.crt.advproject.gcc.target.cm3" valueType="enumerated"/> + <option id="com.crt.advproject.gcc.thumb.472427554" name="Thumb mode" superClass="com.crt.advproject.gcc.thumb" useByScannerDiscovery="false" value="true" valueType="boolean"/> + <option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="gnu.c.compiler.option.preprocessor.def.symbols.154328068" name="Defined symbols (-D)" superClass="gnu.c.compiler.option.preprocessor.def.symbols" useByScannerDiscovery="false" valueType="definedSymbols"> + <listOptionValue builtIn="false" value="__REDLIB__"/> + <listOptionValue builtIn="false" value="DEBUG"/> + <listOptionValue builtIn="false" value="__CODE_RED"/> + </option> + <option id="gnu.c.compiler.option.misc.other.278494594" name="Other flags" superClass="gnu.c.compiler.option.misc.other" useByScannerDiscovery="false" value="-c -fmessage-length=0 -fno-builtin -ffunction-sections -fdata-sections" valueType="string"/> + <option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="gnu.c.compiler.option.include.paths.111254829" name="Include paths (-I)" superClass="gnu.c.compiler.option.include.paths" useByScannerDiscovery="false" valueType="includePath"> + <listOptionValue builtIn="false" value="../inc"/> + </option> + <option id="gnu.c.compiler.option.optimization.flags.167107899" name="Other optimization flags" superClass="gnu.c.compiler.option.optimization.flags" useByScannerDiscovery="false" value="-Os" valueType="string"/> + <option id="com.crt.advproject.gcc.hdrlib.1141969343" superClass="com.crt.advproject.gcc.hdrlib"/> + <inputType id="com.crt.advproject.compiler.input.189471461" superClass="com.crt.advproject.compiler.input"/> + </tool> + <tool id="com.crt.advproject.gas.lib.debug.1199056603" name="MCU Assembler" superClass="com.crt.advproject.gas.lib.debug"> + <option id="com.crt.advproject.gas.arch.478675869" name="Architecture" superClass="com.crt.advproject.gas.arch" value="com.crt.advproject.gas.target.cm3" valueType="enumerated"/> + <option id="com.crt.advproject.gas.thumb.430089063" name="Thumb mode" superClass="com.crt.advproject.gas.thumb" value="true" valueType="boolean"/> + <option id="gnu.both.asm.option.flags.crt.1310306982" name="Assembler flags" superClass="gnu.both.asm.option.flags.crt" value="-c -x assembler-with-cpp -D__REDLIB__ -DDEBUG -D__CODE_RED" valueType="string"/> + <option id="com.crt.advproject.gas.hdrlib.127538207" superClass="com.crt.advproject.gas.hdrlib"/> + <inputType id="com.crt.advproject.assembler.input.1424028465" name="Additional Assembly Source Files" superClass="com.crt.advproject.assembler.input"/> + <inputType id="cdt.managedbuild.tool.gnu.assembler.input.1094448616" superClass="cdt.managedbuild.tool.gnu.assembler.input"/> + </tool> + <tool id="com.crt.advproject.ar.lib.debug.2004041978" name="MCU Archiver" superClass="com.crt.advproject.ar.lib.debug"/> + </toolChain> + </folderInfo> + <sourceEntries> + <entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="src"/> + <entry excluding="src" flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name=""/> + </sourceEntries> + </configuration> + </storageModule> + <storageModule moduleId="org.eclipse.cdt.core.externalSettings"/> + <storageModule moduleId="org.eclipse.cdt.core.language.mapping"/> + <storageModule moduleId="org.eclipse.cdt.internal.ui.text.commentOwnerProjectMappings"/> + </cconfiguration> + <cconfiguration id="com.crt.advproject.config.lib.release.1079171862"> + <storageModule buildSystemId="org.eclipse.cdt.managedbuilder.core.configurationDataProvider" id="com.crt.advproject.config.lib.release.1079171862" moduleId="org.eclipse.cdt.core.settings" name="Release"> + <externalSettings> + <externalSetting> + <entry flags="VALUE_WORKSPACE_PATH" kind="includePath" name="/CMSISv2p00_LPC17xx"/> + <entry flags="VALUE_WORKSPACE_PATH" kind="libraryPath" name="/CMSISv2p00_LPC17xx/Release"/> + <entry flags="RESOLVED" kind="libraryFile" name="CMSISv2p00_LPC17xx" srcPrefixMapping="" srcRootPath=""/> + </externalSetting> + </externalSettings> + <extensions> + <extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser"/> + <extension id="org.eclipse.cdt.core.GNU_ELF" point="org.eclipse.cdt.core.BinaryParser"/> + <extension id="org.eclipse.cdt.core.MakeErrorParser" point="org.eclipse.cdt.core.ErrorParser"/> + <extension id="org.eclipse.cdt.core.GCCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/> + <extension id="org.eclipse.cdt.core.GASErrorParser" point="org.eclipse.cdt.core.ErrorParser"/> + <extension id="org.eclipse.cdt.core.GLDErrorParser" point="org.eclipse.cdt.core.ErrorParser"/> + <extension id="org.eclipse.cdt.core.GmakeErrorParser" point="org.eclipse.cdt.core.ErrorParser"/> + <extension id="org.eclipse.cdt.core.CWDLocator" point="org.eclipse.cdt.core.ErrorParser"/> + </extensions> + </storageModule> + <storageModule moduleId="cdtBuildSystem" version="4.0.0"> + <configuration artifactExtension="a" artifactName="${ProjName}" buildArtefactType="org.eclipse.cdt.build.core.buildArtefactType.staticLib" buildProperties="org.eclipse.cdt.build.core.buildArtefactType=org.eclipse.cdt.build.core.buildArtefactType.staticLib" cleanCommand="rm -rf" description="Release build" errorParsers="org.eclipse.cdt.core.MakeErrorParser;org.eclipse.cdt.core.GCCErrorParser;org.eclipse.cdt.core.GLDErrorParser;org.eclipse.cdt.core.GASErrorParser" id="com.crt.advproject.config.lib.release.1079171862" name="Release" parent="com.crt.advproject.config.lib.release" postannouncebuildStep="Performing post-build steps" postbuildStep="arm-none-eabi-size lib${BuildArtifactFileName} ; # arm-none-eabi-objdump -h -S lib${BuildArtifactFileName} >${BuildArtifactFileBaseName}.lss"> + <folderInfo id="com.crt.advproject.config.lib.release.1079171862." name="/" resourcePath=""> + <toolChain id="com.crt.advproject.toolchain.lib.release.1097962762" name="Code Red MCU Tools" superClass="com.crt.advproject.toolchain.lib.release"> + <targetPlatform binaryParser="org.eclipse.cdt.core.ELF;org.eclipse.cdt.core.GNU_ELF" id="com.crt.advproject.platform.lib.release.994351139" name="ARM-based MCU (Debug)" superClass="com.crt.advproject.platform.lib.release"/> + <builder buildPath="${workspace_loc:/CMSISv2p00_LPC17xx/Release}" id="com.crt.advproject.builder.lib.release.1692141062" keepEnvironmentInBuildfile="false" managedBuildOn="true" name="Gnu Make Builder" superClass="com.crt.advproject.builder.lib.release"/> + <tool id="com.crt.advproject.cpp.lib.release.352135057" name="MCU C++ Compiler" superClass="com.crt.advproject.cpp.lib.release"/> + <tool id="com.crt.advproject.gcc.lib.release.1602026126" name="MCU C Compiler" superClass="com.crt.advproject.gcc.lib.release"> + <option id="com.crt.advproject.gcc.arch.1973834364" name="Architecture" superClass="com.crt.advproject.gcc.arch" value="com.crt.advproject.gcc.target.cm3" valueType="enumerated"/> + <option id="com.crt.advproject.gcc.thumb.987297888" name="Thumb mode" superClass="com.crt.advproject.gcc.thumb" value="true" valueType="boolean"/> + <option id="gnu.c.compiler.option.preprocessor.def.symbols.2129884672" name="Defined symbols (-D)" superClass="gnu.c.compiler.option.preprocessor.def.symbols" valueType="definedSymbols"> + <listOptionValue builtIn="false" value="__REDLIB__"/> + <listOptionValue builtIn="false" value="NDEBUG"/> + <listOptionValue builtIn="false" value="__CODE_RED"/> + </option> + <option id="gnu.c.compiler.option.misc.other.1390171355" name="Other flags" superClass="gnu.c.compiler.option.misc.other" value="-c -fmessage-length=0 -fno-builtin -ffunction-sections -fdata-sections" valueType="string"/> + <option id="gnu.c.compiler.option.optimization.flags.38180583" name="Other optimization flags" superClass="gnu.c.compiler.option.optimization.flags" value="-Os" valueType="string"/> + <option id="gnu.c.compiler.option.include.paths.995872451" name="Include paths (-I)" superClass="gnu.c.compiler.option.include.paths" valueType="includePath"> + <listOptionValue builtIn="false" value="../inc"/> + </option> + <inputType id="com.crt.advproject.compiler.input.1022340162" superClass="com.crt.advproject.compiler.input"/> + </tool> + <tool id="com.crt.advproject.gas.lib.release.48688322" name="MCU Assembler" superClass="com.crt.advproject.gas.lib.release"> + <option id="com.crt.advproject.gas.arch.601834344" name="Architecture" superClass="com.crt.advproject.gas.arch" value="com.crt.advproject.gas.target.cm3" valueType="enumerated"/> + <option id="com.crt.advproject.gas.thumb.652059259" name="Thumb mode" superClass="com.crt.advproject.gas.thumb" value="true" valueType="boolean"/> + <option id="gnu.both.asm.option.flags.crt.2095432557" name="Assembler flags" superClass="gnu.both.asm.option.flags.crt" value="-c -x assembler-with-cpp -D__REDLIB__ -DNDEBUG -D__CODE_RED" valueType="string"/> + <inputType id="com.crt.advproject.assembler.input.1808596896" name="Additional Assembly Source Files" superClass="com.crt.advproject.assembler.input"/> + <inputType id="cdt.managedbuild.tool.gnu.assembler.input.1468352635" superClass="cdt.managedbuild.tool.gnu.assembler.input"/> + </tool> + <tool id="com.crt.advproject.ar.lib.release.1701225249" name="MCU Archiver" superClass="com.crt.advproject.ar.lib.release"/> + </toolChain> + </folderInfo> + <sourceEntries> + <entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="src"/> + <entry excluding="src" flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name=""/> + </sourceEntries> + </configuration> + </storageModule> + <storageModule moduleId="org.eclipse.cdt.core.externalSettings"/> + <storageModule moduleId="org.eclipse.cdt.core.language.mapping"/> + <storageModule moduleId="org.eclipse.cdt.internal.ui.text.commentOwnerProjectMappings"/> + </cconfiguration> + </storageModule> + <storageModule moduleId="cdtBuildSystem" version="4.0.0"> + <project id="CMSISv2p00_LPC17xx.com.crt.advproject.projecttype.lib.1193160240" name="Static Library" projectType="com.crt.advproject.projecttype.lib"/> + </storageModule> + <storageModule moduleId="com.crt.config"> + <projectStorage><?xml version="1.0" encoding="UTF-8"?> +<TargetConfig> +<Properties property_0="" property_2="LPC175x_6x_32.cfx" property_3="NXP" property_4="LPC1751" property_count="5" version="70200"/> +<infoList vendor="NXP"><info chip="LPC1751" flash_driver="LPC175x_6x_32.cfx" match_id="0x00001110,0x25001118, 0x25001110" name="LPC1751" stub="crt_emu_cm3_nxp"><chip><name>LPC1751</name> +<family>LPC17xx</family> +<vendor>NXP (formerly Philips)</vendor> +<reset board="None" core="Real" sys="Real"/> +<clock changeable="TRUE" freq="20MHz" is_accurate="TRUE"/> +<memory can_program="true" id="Flash" is_ro="true" type="Flash"/> +<memory id="RAM" type="RAM"/> +<memory id="Periph" is_volatile="true" type="Peripheral"/> +<memoryInstance derived_from="Flash" id="MFlash32" location="0x00000000" size="0x8000"/> +<memoryInstance derived_from="RAM" id="RamLoc8" location="0x10000000" size="0x2000"/> +<prog_flash blocksz="0x1000" location="0" maxprgbuff="0x1000" progwithcode="TRUE" size="0x8000"/> +<peripheralInstance derived_from="LPC17_NVIC" determined="infoFile" id="NVIC" location="0xE000E000"/> +<peripheralInstance derived_from="TIMER" determined="infoFile" enable="SYSCTL.PCONP.PCTIM0&amp;0x1" id="TIMER0" location="0x40004000"/> +<peripheralInstance derived_from="TIMER" determined="infoFile" enable="SYSCTL.PCONP.PCTIM1&amp;0x1" id="TIMER1" location="0x40008000"/> +<peripheralInstance derived_from="TIMER" determined="infoFile" enable="SYSCTL.PCONP.PCTIM2&amp;0x1" id="TIMER2" location="0x40090000"/> +<peripheralInstance derived_from="TIMER" determined="infoFile" enable="SYSCTL.PCONP.PCTIM3&amp;0x1" id="TIMER3" location="0x40094000"/> +<peripheralInstance derived_from="LPC17_RIT" determined="infoFile" enable="SYSCTL.PCONP.PCRIT&amp;0x1" id="RIT" location="0x400B0000"/> +<peripheralInstance derived_from="FGPIO" determined="infoFile" enable="SYSCTL.PCONP.PCGPIO&amp;0x1" id="GPIO0" location="0x2009C000"/> +<peripheralInstance derived_from="FGPIO" determined="infoFile" enable="SYSCTL.PCONP.PCGPIO&amp;0x1" id="GPIO1" location="0x2009C020"/> +<peripheralInstance derived_from="FGPIO" determined="infoFile" enable="SYSCTL.PCONP.PCGPIO&amp;0x1" id="GPIO2" location="0x2009C040"/> +<peripheralInstance derived_from="FGPIO" determined="infoFile" enable="SYSCTL.PCONP.PCGPIO&amp;0x1" id="GPIO3" location="0x2009C060"/> +<peripheralInstance derived_from="FGPIO" determined="infoFile" enable="SYSCTL.PCONP.PCGPIO&amp;0x1" id="GPIO4" location="0x2009C080"/> +<peripheralInstance derived_from="LPC17_SYSCTL" determined="infoFile" id="SYSCTL" location="0x400FC000"/> +<peripheralInstance derived_from="LPC17xx_UART" determined="infoFile" enable="SYSCTL.PCONP.PCUART0&amp;0x1" id="UART0" location="0x4000C000"/> +<peripheralInstance derived_from="LPC17xx_UART_MODEM" determined="infoFile" enable="SYSCTL.PCONP.PCUART1&amp;0x1" id="UART1" location="0x40010000"/> +<peripheralInstance derived_from="LPC17xx_UART" determined="infoFile" enable="SYSCTL.PCONP.PCUART2&amp;0x1" id="UART2" location="0x40098000"/> +<peripheralInstance derived_from="LPC17xx_UART" determined="infoFile" enable="SYSCTL.PCONP.PCUART3&amp;0x1" id="UART3" location="0x4009C000"/> +<peripheralInstance derived_from="SPI" determined="infoFile" enable="SYSCTL.PCONP.PCSPI&amp;0x1" id="SPI" location="0x40020000"/> +<peripheralInstance derived_from="LPC17_SSP" determined="infoFile" enable="SYSCTL.PCONP.PCSSP0&amp;0x1" id="SSP0" location="0x40088000"/> +<peripheralInstance derived_from="LPC17_SSP" determined="infoFile" enable="SYSCTL.PCONP.PCSSP1&amp;0x1" id="SSP1" location="0x40030000"/> +<peripheralInstance derived_from="LPC17_ADC" determined="infoFile" enable="SYSCTL.PCONP.PCAD&amp;0x1" id="ADC" location="0x40034000"/> +<peripheralInstance derived_from="LPC17_USBINTST" determined="infoFile" enable="USBCLKCTL.USBClkCtrl&amp;0x12" id="USBINTSTAT" location="0x400fc1c0"/> +<peripheralInstance derived_from="LPC17_USB_CLK_CTL" determined="infoFile" id="USBCLKCTL" location="0x5000cff4"/> +<peripheralInstance derived_from="LPC17_USBDEV" determined="infoFile" enable="USBCLKCTL.USBClkSt&amp;0x12=0x12" id="USBDEV" location="0x5000C200"/> +<peripheralInstance derived_from="LPC17_PWM" determined="infoFile" enable="SYSCTL.PCONP.PWM1&amp;0x1" id="PWM" location="0x40018000"/> +<peripheralInstance derived_from="LPC17_I2C" determined="infoFile" enable="SYSCTL.PCONP.PCI2C0&amp;0x1" id="I2C0" location="0x4001C000"/> +<peripheralInstance derived_from="LPC17_I2C" determined="infoFile" enable="SYSCTL.PCONP.PCI2C1&amp;0x1" id="I2C1" location="0x4005C000"/> +<peripheralInstance derived_from="LPC17_I2C" determined="infoFile" enable="SYSCTL.PCONP.PCI2C2&amp;0x1" id="I2C2" location="0x400A0000"/> +<peripheralInstance derived_from="LPC17_DMA" determined="infoFile" enable="SYSCTL.PCONP.PCGPDMA&amp;0x1" id="DMA" location="0x50004000"/> +<peripheralInstance derived_from="CM3_DCR" determined="infoFile" id="DCR" location="0xE000EDF0"/> +<peripheralInstance derived_from="LPC17_PCB" determined="infoFile" id="PCB" location="0x4002c000"/> +<peripheralInstance derived_from="LPC17_QEI" determined="infoFile" id="QEI" location="0x400bc000"/> +<peripheralInstance derived_from="LPC17_USBHOST" determined="infoFile" enable="USBCLKCTL.USBClkSt&amp;0x11=0x11" id="USBHOST" location="0x5000C000"/> +<peripheralInstance derived_from="LPC17_USBOTG" determined="infoFile" enable="USBCLKCTL.USBClkSt&amp;0x1c=0x1c" id="USBOTG" location="0x5000C000"/> +<peripheralInstance derived_from="LPC17_RTC" determined="infoFile" enable="SYSCTL.PCONP.PCRTC&amp;0x1" id="RTC" location="0x40024000"/> +<peripheralInstance derived_from="MPU" determined="infoFile" id="MPU" location="0xE000ED90"/> +<peripheralInstance derived_from="LPC1x_WDT" determined="infoFile" id="WDT" location="0x40000000"/> +<peripheralInstance derived_from="LPC17_FLASHCFG" determined="infoFile" id="FLASHACCEL" location="0x400FC000"/> +<peripheralInstance derived_from="GPIO_INT" determined="infoFile" id="GPIOINTMAP" location="0x40028080"/> +<peripheralInstance derived_from="LPC17_CANAFR" determined="infoFile" enable="SYSCTL.PCONP.PCCAN1&amp;0x1" id="CANAFR" location="0x4003C000"/> +<peripheralInstance derived_from="LPC17_CANCEN" determined="infoFile" enable="SYSCTL.PCONP.PCCAN1&amp;0x1" id="CANCEN" location="0x40040000"/> +<peripheralInstance derived_from="LPC17_CANWAKESLEEP" determined="infoFile" id="CANWAKESLEEP" location="0x400FC110"/> +<peripheralInstance derived_from="LPC17_CANCON" determined="infoFile" enable="SYSCTL.PCONP.PCCAN1&amp;0x1" id="CANCON1" location="0x40044000"/> +<peripheralInstance derived_from="LPC17_MCPWM" determined="infoFile" enable="SYSCTL.PCONP.PCMCPWM&amp;0x1" id="MCPWM" location="0x400B8000"/> +<peripheralInstance derived_from="LPC17_FMC" determined="infoFile" id="FMC" location="0x40084000"/> +</chip> +<processor><name gcc_name="cortex-m3">Cortex-M3</name> +<family>Cortex-M</family> +</processor> +<link href="nxp_lpcxxxx_peripheral.xme" show="embed" type="simple"/> +</info> +</infoList> +</TargetConfig></projectStorage> + </storageModule> + <storageModule moduleId="refreshScope"/> + <storageModule moduleId="scannerConfiguration"> + <autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId="org.eclipse.cdt.make.core.GCCStandardMakePerProjectProfile"/> + <profile id="com.crt.advproject.GCCManagedMakePerProjectProfileCPP"> + <buildOutputProvider> + <openAction enabled="false" filePath=""/> + <parser enabled="false"/> + </buildOutputProvider> + <scannerInfoProvider id="com.crt.advproject.specsFile"> + <runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="arm-none-eabi-c++" useDefault="true"/> + <parser enabled="true"/> + </scannerInfoProvider> + </profile> + <profile id="com.crt.advproject.GCCManagedMakePerProjectProfile"> + <buildOutputProvider> + <openAction enabled="false" filePath=""/> + <parser enabled="false"/> + </buildOutputProvider> + <scannerInfoProvider id="com.crt.advproject.specsFile"> + <runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file} " command="arm-none-eabi-gcc" useDefault="true"/> + <parser enabled="true"/> + </scannerInfoProvider> + </profile> + <profile id="com.crt.advproject.GASManagedMakePerProjectProfile"> + <buildOutputProvider> + <openAction enabled="false" filePath=""/> + <parser enabled="false"/> + </buildOutputProvider> + <scannerInfoProvider id="com.crt.advproject.specsFile"> + <runAction arguments="-x assembler-with-cpp -E -P -v -dD ${plugin_state_location}/${specs_file}" command="arm-none-eabi-gcc" useDefault="true"/> + <parser enabled="true"/> + </scannerInfoProvider> + </profile> + <profile id="org.eclipse.cdt.make.core.GCCStandardMakePerProjectProfile"> + <buildOutputProvider> + <openAction enabled="true" filePath=""/> + <parser enabled="true"/> + </buildOutputProvider> + <scannerInfoProvider id="specsFile"> + <runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/> + <parser enabled="true"/> + </scannerInfoProvider> + </profile> + <profile id="org.eclipse.cdt.make.core.GCCStandardMakePerFileProfile"> + <buildOutputProvider> + <openAction enabled="true" filePath=""/> + <parser enabled="true"/> + </buildOutputProvider> + <scannerInfoProvider id="makefileGenerator"> + <runAction arguments="-f ${project_name}_scd.mk" command="make" useDefault="true"/> + <parser enabled="true"/> + </scannerInfoProvider> + </profile> + <profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfile"> + <buildOutputProvider> + <openAction enabled="true" filePath=""/> + <parser enabled="true"/> + </buildOutputProvider> + <scannerInfoProvider id="specsFile"> + <runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/> + <parser enabled="true"/> + </scannerInfoProvider> + </profile> + <profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileCPP"> + <buildOutputProvider> + <openAction enabled="true" filePath=""/> + <parser enabled="true"/> + </buildOutputProvider> + <scannerInfoProvider id="specsFile"> + <runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.cpp" command="g++" useDefault="true"/> + <parser enabled="true"/> + </scannerInfoProvider> + </profile> + <profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileC"> + <buildOutputProvider> + <openAction enabled="true" filePath=""/> + <parser enabled="true"/> + </buildOutputProvider> + <scannerInfoProvider id="specsFile"> + <runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.c" command="gcc" useDefault="true"/> + <parser enabled="true"/> + </scannerInfoProvider> + </profile> + <profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfile"> + <buildOutputProvider> + <openAction enabled="true" filePath=""/> + <parser enabled="true"/> + </buildOutputProvider> + <scannerInfoProvider id="specsFile"> + <runAction arguments="-c 'gcc -E -P -v -dD "${plugin_state_location}/${specs_file}"'" command="sh" useDefault="true"/> + <parser enabled="true"/> + </scannerInfoProvider> + </profile> + <profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileCPP"> + <buildOutputProvider> + <openAction enabled="true" filePath=""/> + <parser enabled="true"/> + </buildOutputProvider> + <scannerInfoProvider id="specsFile"> + <runAction arguments="-c 'g++ -E -P -v -dD "${plugin_state_location}/specs.cpp"'" command="sh" useDefault="true"/> + <parser enabled="true"/> + </scannerInfoProvider> + </profile> + <profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileC"> + <buildOutputProvider> + <openAction enabled="true" filePath=""/> + <parser enabled="true"/> + </buildOutputProvider> + <scannerInfoProvider id="specsFile"> + <runAction arguments="-c 'gcc -E -P -v -dD "${plugin_state_location}/specs.c"'" command="sh" useDefault="true"/> + <parser enabled="true"/> + </scannerInfoProvider> + </profile> + <scannerConfigBuildInfo instanceId="com.crt.advproject.config.lib.release.1079171862;com.crt.advproject.config.lib.release.1079171862.;com.crt.advproject.gcc.lib.release.1602026126;com.crt.advproject.compiler.input.1022340162"> + <autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId="com.crt.advproject.GCCManagedMakePerProjectProfile"/> + <profile id="com.crt.advproject.GCCManagedMakePerProjectProfileCPP"> + <buildOutputProvider> + <openAction enabled="false" filePath=""/> + <parser enabled="false"/> + </buildOutputProvider> + <scannerInfoProvider id="com.crt.advproject.specsFile"> + <runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="arm-none-eabi-c++" useDefault="true"/> + <parser enabled="true"/> + </scannerInfoProvider> + </profile> + <profile id="com.crt.advproject.GCCManagedMakePerProjectProfile"> + <buildOutputProvider> + <openAction enabled="false" filePath=""/> + <parser enabled="false"/> + </buildOutputProvider> + <scannerInfoProvider id="com.crt.advproject.specsFile"> + <runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file} " command="arm-none-eabi-gcc" useDefault="true"/> + <parser enabled="true"/> + </scannerInfoProvider> + </profile> + <profile id="com.crt.advproject.GASManagedMakePerProjectProfile"> + <buildOutputProvider> + <openAction enabled="false" filePath=""/> + <parser enabled="false"/> + </buildOutputProvider> + <scannerInfoProvider id="com.crt.advproject.specsFile"> + <runAction arguments="-x assembler-with-cpp -E -P -v -dD ${plugin_state_location}/${specs_file}" command="arm-none-eabi-gcc" useDefault="true"/> + <parser enabled="true"/> + </scannerInfoProvider> + </profile> + <profile id="org.eclipse.cdt.make.core.GCCStandardMakePerProjectProfile"> + <buildOutputProvider> + <openAction enabled="true" filePath=""/> + <parser enabled="true"/> + </buildOutputProvider> + <scannerInfoProvider id="specsFile"> + <runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/> + <parser enabled="true"/> + </scannerInfoProvider> + </profile> + <profile id="org.eclipse.cdt.make.core.GCCStandardMakePerFileProfile"> + <buildOutputProvider> + <openAction enabled="true" filePath=""/> + <parser enabled="true"/> + </buildOutputProvider> + <scannerInfoProvider id="makefileGenerator"> + <runAction arguments="-f ${project_name}_scd.mk" command="make" useDefault="true"/> + <parser enabled="true"/> + </scannerInfoProvider> + </profile> + <profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfile"> + <buildOutputProvider> + <openAction enabled="true" filePath=""/> + <parser enabled="true"/> + </buildOutputProvider> + <scannerInfoProvider id="specsFile"> + <runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/> + <parser enabled="true"/> + </scannerInfoProvider> + </profile> + <profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileCPP"> + <buildOutputProvider> + <openAction enabled="true" filePath=""/> + <parser enabled="true"/> + </buildOutputProvider> + <scannerInfoProvider id="specsFile"> + <runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.cpp" command="g++" useDefault="true"/> + <parser enabled="true"/> + </scannerInfoProvider> + </profile> + <profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileC"> + <buildOutputProvider> + <openAction enabled="true" filePath=""/> + <parser enabled="true"/> + </buildOutputProvider> + <scannerInfoProvider id="specsFile"> + <runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.c" command="gcc" useDefault="true"/> + <parser enabled="true"/> + </scannerInfoProvider> + </profile> + <profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfile"> + <buildOutputProvider> + <openAction enabled="true" filePath=""/> + <parser enabled="true"/> + </buildOutputProvider> + <scannerInfoProvider id="specsFile"> + <runAction arguments="-c 'gcc -E -P -v -dD "${plugin_state_location}/${specs_file}"'" command="sh" useDefault="true"/> + <parser enabled="true"/> + </scannerInfoProvider> + </profile> + <profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileCPP"> + <buildOutputProvider> + <openAction enabled="true" filePath=""/> + <parser enabled="true"/> + </buildOutputProvider> + <scannerInfoProvider id="specsFile"> + <runAction arguments="-c 'g++ -E -P -v -dD "${plugin_state_location}/specs.cpp"'" command="sh" useDefault="true"/> + <parser enabled="true"/> + </scannerInfoProvider> + </profile> + <profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileC"> + <buildOutputProvider> + <openAction enabled="true" filePath=""/> + <parser enabled="true"/> + </buildOutputProvider> + <scannerInfoProvider id="specsFile"> + <runAction arguments="-c 'gcc -E -P -v -dD "${plugin_state_location}/specs.c"'" command="sh" useDefault="true"/> + <parser enabled="true"/> + </scannerInfoProvider> + </profile> + </scannerConfigBuildInfo> + <scannerConfigBuildInfo instanceId="com.crt.advproject.config.lib.release.1079171862;com.crt.advproject.config.lib.release.1079171862.;com.crt.advproject.gas.lib.release.48688322;com.crt.advproject.assembler.input.1808596896"> + <autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId="com.crt.advproject.GCCManagedMakePerProjectProfile"/> + <profile id="com.crt.advproject.GCCManagedMakePerProjectProfileCPP"> + <buildOutputProvider> + <openAction enabled="false" filePath=""/> + <parser enabled="false"/> + </buildOutputProvider> + <scannerInfoProvider id="com.crt.advproject.specsFile"> + <runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="arm-none-eabi-c++" useDefault="true"/> + <parser enabled="true"/> + </scannerInfoProvider> + </profile> + <profile id="com.crt.advproject.GCCManagedMakePerProjectProfile"> + <buildOutputProvider> + <openAction enabled="false" filePath=""/> + <parser enabled="false"/> + </buildOutputProvider> + <scannerInfoProvider id="com.crt.advproject.specsFile"> + <runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file} " command="arm-none-eabi-gcc" useDefault="true"/> + <parser enabled="true"/> + </scannerInfoProvider> + </profile> + <profile id="com.crt.advproject.GASManagedMakePerProjectProfile"> + <buildOutputProvider> + <openAction enabled="false" filePath=""/> + <parser enabled="false"/> + </buildOutputProvider> + <scannerInfoProvider id="com.crt.advproject.specsFile"> + <runAction arguments="-x assembler-with-cpp -E -P -v -dD ${plugin_state_location}/${specs_file}" command="arm-none-eabi-gcc" useDefault="true"/> + <parser enabled="true"/> + </scannerInfoProvider> + </profile> + <profile id="org.eclipse.cdt.make.core.GCCStandardMakePerProjectProfile"> + <buildOutputProvider> + <openAction enabled="true" filePath=""/> + <parser enabled="true"/> + </buildOutputProvider> + <scannerInfoProvider id="specsFile"> + <runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/> + <parser enabled="true"/> + </scannerInfoProvider> + </profile> + <profile id="org.eclipse.cdt.make.core.GCCStandardMakePerFileProfile"> + <buildOutputProvider> + <openAction enabled="true" filePath=""/> + <parser enabled="true"/> + </buildOutputProvider> + <scannerInfoProvider id="makefileGenerator"> + <runAction arguments="-f ${project_name}_scd.mk" command="make" useDefault="true"/> + <parser enabled="true"/> + </scannerInfoProvider> + </profile> + <profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfile"> + <buildOutputProvider> + <openAction enabled="true" filePath=""/> + <parser enabled="true"/> + </buildOutputProvider> + <scannerInfoProvider id="specsFile"> + <runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/> + <parser enabled="true"/> + </scannerInfoProvider> + </profile> + <profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileCPP"> + <buildOutputProvider> + <openAction enabled="true" filePath=""/> + <parser enabled="true"/> + </buildOutputProvider> + <scannerInfoProvider id="specsFile"> + <runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.cpp" command="g++" useDefault="true"/> + <parser enabled="true"/> + </scannerInfoProvider> + </profile> + <profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileC"> + <buildOutputProvider> + <openAction enabled="true" filePath=""/> + <parser enabled="true"/> + </buildOutputProvider> + <scannerInfoProvider id="specsFile"> + <runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.c" command="gcc" useDefault="true"/> + <parser enabled="true"/> + </scannerInfoProvider> + </profile> + <profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfile"> + <buildOutputProvider> + <openAction enabled="true" filePath=""/> + <parser enabled="true"/> + </buildOutputProvider> + <scannerInfoProvider id="specsFile"> + <runAction arguments="-c 'gcc -E -P -v -dD "${plugin_state_location}/${specs_file}"'" command="sh" useDefault="true"/> + <parser enabled="true"/> + </scannerInfoProvider> + </profile> + <profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileCPP"> + <buildOutputProvider> + <openAction enabled="true" filePath=""/> + <parser enabled="true"/> + </buildOutputProvider> + <scannerInfoProvider id="specsFile"> + <runAction arguments="-c 'g++ -E -P -v -dD "${plugin_state_location}/specs.cpp"'" command="sh" useDefault="true"/> + <parser enabled="true"/> + </scannerInfoProvider> + </profile> + <profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileC"> + <buildOutputProvider> + <openAction enabled="true" filePath=""/> + <parser enabled="true"/> + </buildOutputProvider> + <scannerInfoProvider id="specsFile"> + <runAction arguments="-c 'gcc -E -P -v -dD "${plugin_state_location}/specs.c"'" command="sh" useDefault="true"/> + <parser enabled="true"/> + </scannerInfoProvider> + </profile> + </scannerConfigBuildInfo> + </storageModule> + <storageModule moduleId="org.eclipse.cdt.core.LanguageSettingsProviders"/> + <storageModule moduleId="openCmsis"/> + <storageModule moduleId="org.eclipse.cdt.make.core.buildtargets"/> +</cproject> \ No newline at end of file diff --git a/CMSISv2p00_LPC17xx/.project b/CMSISv2p00_LPC17xx/.project new file mode 100644 index 0000000000000000000000000000000000000000..5cd9643f190838c28b92a155ea0e46662740d5e4 --- /dev/null +++ b/CMSISv2p00_LPC17xx/.project @@ -0,0 +1,81 @@ +<?xml version="1.0" encoding="UTF-8"?> +<projectDescription> + <name>CMSISv2p00_LPC17xx</name> + <comment></comment> + <projects> + </projects> + <buildSpec> + <buildCommand> + <name>org.eclipse.cdt.managedbuilder.core.genmakebuilder</name> + <triggers>clean,full,incremental,</triggers> + <arguments> + <dictionary> + <key>?name?</key> + <value></value> + </dictionary> + <dictionary> + <key>org.eclipse.cdt.make.core.append_environment</key> + <value>true</value> + </dictionary> + <dictionary> + <key>org.eclipse.cdt.make.core.autoBuildTarget</key> + <value>all</value> + </dictionary> + <dictionary> + <key>org.eclipse.cdt.make.core.buildArguments</key> + <value></value> + </dictionary> + <dictionary> + <key>org.eclipse.cdt.make.core.buildCommand</key> + <value>make</value> + </dictionary> + <dictionary> + <key>org.eclipse.cdt.make.core.buildLocation</key> + <value>${workspace_loc:/CMSISv2p00_LPC17xx/Debug}</value> + </dictionary> + <dictionary> + <key>org.eclipse.cdt.make.core.cleanBuildTarget</key> + <value>clean</value> + </dictionary> + <dictionary> + <key>org.eclipse.cdt.make.core.contents</key> + <value>org.eclipse.cdt.make.core.activeConfigSettings</value> + </dictionary> + <dictionary> + <key>org.eclipse.cdt.make.core.enableAutoBuild</key> + <value>false</value> + </dictionary> + <dictionary> + <key>org.eclipse.cdt.make.core.enableCleanBuild</key> + <value>true</value> + </dictionary> + <dictionary> + <key>org.eclipse.cdt.make.core.enableFullBuild</key> + <value>true</value> + </dictionary> + <dictionary> + <key>org.eclipse.cdt.make.core.fullBuildTarget</key> + <value>all</value> + </dictionary> + <dictionary> + <key>org.eclipse.cdt.make.core.stopOnError</key> + <value>true</value> + </dictionary> + <dictionary> + <key>org.eclipse.cdt.make.core.useDefaultBuildCmd</key> + <value>true</value> + </dictionary> + </arguments> + </buildCommand> + <buildCommand> + <name>org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder</name> + <arguments> + </arguments> + </buildCommand> + </buildSpec> + <natures> + <nature>org.eclipse.cdt.core.cnature</nature> + <nature>org.eclipse.cdt.managedbuilder.core.managedBuildNature</nature> + <nature>org.eclipse.cdt.managedbuilder.core.ScannerConfigNature</nature> + </natures> +</projectDescription> diff --git a/CMSISv2p00_LPC17xx/.settings/language.settings.xml b/CMSISv2p00_LPC17xx/.settings/language.settings.xml new file mode 100644 index 0000000000000000000000000000000000000000..02bd4b7e8996c874b0f6a09346761369061eb823 --- /dev/null +++ b/CMSISv2p00_LPC17xx/.settings/language.settings.xml @@ -0,0 +1,25 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<project> + <configuration id="com.crt.advproject.config.lib.debug.1814355025" name="Debug"> + <extension point="org.eclipse.cdt.core.LanguageSettingsProvider"> + <provider copy-of="extension" id="org.eclipse.cdt.ui.UserLanguageSettingsProvider"/> + <provider copy-of="extension" id="com.crt.advproject.GCCBuildCommandParser"/> + <provider class="com.crt.advproject.specs.MCUGCCBuiltinSpecsDetector" console="false" env-hash="1414881416772095426" id="com.crt.advproject.GCCBuildSpecCompilerParser" keep-relative-paths="false" name="MCU GCC Built-in Compiler Parser" parameter="${COMMAND} ${FLAGS} -E -P -v -dD "${INPUTS}"" prefer-non-shared="true"> + <language-scope id="org.eclipse.cdt.core.gcc"/> + <language-scope id="org.eclipse.cdt.core.g++"/> + </provider> + <provider-reference id="org.eclipse.cdt.managedbuilder.core.MBSLanguageSettingsProvider" ref="shared-provider"/> + </extension> + </configuration> + <configuration id="com.crt.advproject.config.lib.release.1079171862" name="Release"> + <extension point="org.eclipse.cdt.core.LanguageSettingsProvider"> + <provider copy-of="extension" id="org.eclipse.cdt.ui.UserLanguageSettingsProvider"/> + <provider copy-of="extension" id="com.crt.advproject.GCCBuildCommandParser"/> + <provider class="com.crt.advproject.specs.MCUGCCBuiltinSpecsDetector" console="false" env-hash="1461310508609114466" id="com.crt.advproject.GCCBuildSpecCompilerParser" keep-relative-paths="false" name="MCU GCC Built-in Compiler Parser" parameter="${COMMAND} ${FLAGS} -E -P -v -dD "${INPUTS}"" prefer-non-shared="true"> + <language-scope id="org.eclipse.cdt.core.gcc"/> + <language-scope id="org.eclipse.cdt.core.g++"/> + </provider> + <provider-reference id="org.eclipse.cdt.managedbuilder.core.MBSLanguageSettingsProvider" ref="shared-provider"/> + </extension> + </configuration> +</project> \ No newline at end of file diff --git a/CMSISv2p00_LPC17xx/.settings/org.eclipse.core.resources.prefs b/CMSISv2p00_LPC17xx/.settings/org.eclipse.core.resources.prefs new file mode 100644 index 0000000000000000000000000000000000000000..99f26c0203a7844de00dbfc56e6a35d8ed3c022c --- /dev/null +++ b/CMSISv2p00_LPC17xx/.settings/org.eclipse.core.resources.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +encoding/<project>=UTF-8 diff --git a/CMSISv2p00_LPC17xx/Debug/libCMSISv2p00_LPC17xx.a b/CMSISv2p00_LPC17xx/Debug/libCMSISv2p00_LPC17xx.a new file mode 100644 index 0000000000000000000000000000000000000000..299eb67a1e2b854a5bce44ec1f594b68decbb092 Binary files /dev/null and b/CMSISv2p00_LPC17xx/Debug/libCMSISv2p00_LPC17xx.a differ diff --git a/CMSISv2p00_LPC17xx/Debug/makefile b/CMSISv2p00_LPC17xx/Debug/makefile new file mode 100644 index 0000000000000000000000000000000000000000..d5733729375e2972a8dc5e576808193b390f9c59 --- /dev/null +++ b/CMSISv2p00_LPC17xx/Debug/makefile @@ -0,0 +1,50 @@ +################################################################################ +# Automatically-generated file. Do not edit! +################################################################################ + +-include ../makefile.init + +RM := rm -rf + +# All of the sources participating in the build are defined here +-include sources.mk +-include src/subdir.mk +-include subdir.mk +-include objects.mk + +ifneq ($(MAKECMDGOALS),clean) +ifneq ($(strip $(C_DEPS)),) +-include $(C_DEPS) +endif +endif + +-include ../makefile.defs + +# Add inputs and outputs from these tool invocations to the build variables + +# All Target +all: libCMSISv2p00_LPC17xx.a + +# Tool invocations +libCMSISv2p00_LPC17xx.a: $(OBJS) $(USER_OBJS) + @echo 'Building target: $@' + @echo 'Invoking: MCU Archiver' + arm-none-eabi-ar -r "libCMSISv2p00_LPC17xx.a" $(OBJS) $(USER_OBJS) $(LIBS) + @echo 'Finished building target: $@' + @echo ' ' + $(MAKE) --no-print-directory post-build + +# Other Targets +clean: + -$(RM) $(OBJS)$(ARCHIVES)$(C_DEPS) libCMSISv2p00_LPC17xx.a + -@echo ' ' + +post-build: + -@echo 'Performing post-build steps' + -arm-none-eabi-size libCMSISv2p00_LPC17xx.a ; # arm-none-eabi-objdump -h -S libCMSISv2p00_LPC17xx.a >libCMSISv2p00_LPC17xx.lss + -@echo ' ' + +.PHONY: all clean dependents +.SECONDARY: post-build + +-include ../makefile.targets diff --git a/CMSISv2p00_LPC17xx/Debug/objects.mk b/CMSISv2p00_LPC17xx/Debug/objects.mk new file mode 100644 index 0000000000000000000000000000000000000000..dc31e16c685929c0d9eb5bd448a36f54b1533d57 --- /dev/null +++ b/CMSISv2p00_LPC17xx/Debug/objects.mk @@ -0,0 +1,8 @@ +################################################################################ +# Automatically-generated file. Do not edit! +################################################################################ + +USER_OBJS := + +LIBS := + diff --git a/CMSISv2p00_LPC17xx/Debug/sources.mk b/CMSISv2p00_LPC17xx/Debug/sources.mk new file mode 100644 index 0000000000000000000000000000000000000000..b73fb96b731b873895da424d46937f565bffdad2 --- /dev/null +++ b/CMSISv2p00_LPC17xx/Debug/sources.mk @@ -0,0 +1,18 @@ +################################################################################ +# Automatically-generated file. Do not edit! +################################################################################ + +OBJ_SRCS := +S_SRCS := +ASM_SRCS := +C_SRCS := +S_UPPER_SRCS := +O_SRCS := +OBJS := +ARCHIVES := +C_DEPS := + +# Every subdirectory with source files must be described here +SUBDIRS := \ +src \ + diff --git a/CMSISv2p00_LPC17xx/Debug/src/core_cm3.d b/CMSISv2p00_LPC17xx/Debug/src/core_cm3.d new file mode 100644 index 0000000000000000000000000000000000000000..d76bd1475e2b78bd2db55716eb44660c8226eb09 --- /dev/null +++ b/CMSISv2p00_LPC17xx/Debug/src/core_cm3.d @@ -0,0 +1 @@ +src/core_cm3.o src/core_cm3.d: ../src/core_cm3.c diff --git a/CMSISv2p00_LPC17xx/Debug/src/core_cm3.o b/CMSISv2p00_LPC17xx/Debug/src/core_cm3.o new file mode 100644 index 0000000000000000000000000000000000000000..050d1945896a97964c3e4bf1e56322939b0e27b5 Binary files /dev/null and b/CMSISv2p00_LPC17xx/Debug/src/core_cm3.o differ diff --git a/CMSISv2p00_LPC17xx/Debug/src/subdir.mk b/CMSISv2p00_LPC17xx/Debug/src/subdir.mk new file mode 100644 index 0000000000000000000000000000000000000000..fe6f04c7b99800f0291526256e671a7f0e956ed8 --- /dev/null +++ b/CMSISv2p00_LPC17xx/Debug/src/subdir.mk @@ -0,0 +1,27 @@ +################################################################################ +# Automatically-generated file. Do not edit! +################################################################################ + +# Add inputs and outputs from these tool invocations to the build variables +C_SRCS += \ +../src/core_cm3.c \ +../src/system_LPC17xx.c + +OBJS += \ +./src/core_cm3.o \ +./src/system_LPC17xx.o + +C_DEPS += \ +./src/core_cm3.d \ +./src/system_LPC17xx.d + + +# Each subdirectory must supply rules for building sources it contributes +src/%.o: ../src/%.c + @echo 'Building file: $<' + @echo 'Invoking: MCU C Compiler' + arm-none-eabi-gcc -D__REDLIB__ -DDEBUG -D__CODE_RED -I../inc -O0 -Os -g3 -Wall -c -fmessage-length=0 -fno-builtin -ffunction-sections -fdata-sections -mcpu=cortex-m3 -mthumb -D__REDLIB__ -specs=redlib.specs -MMD -MP -MF"$(@:%.o=%.d)" -MT"$(@:%.o=%.o)" -MT"$(@:%.o=%.d)" -o "$@" "$<" + @echo 'Finished building: $<' + @echo ' ' + + diff --git a/CMSISv2p00_LPC17xx/Debug/src/system_LPC17xx.d b/CMSISv2p00_LPC17xx/Debug/src/system_LPC17xx.d new file mode 100644 index 0000000000000000000000000000000000000000..a132246a2c91746f6c6034f6fe7dcf2b0dc5b37a --- /dev/null +++ b/CMSISv2p00_LPC17xx/Debug/src/system_LPC17xx.d @@ -0,0 +1,13 @@ +src/system_LPC17xx.o src/system_LPC17xx.d: ../src/system_LPC17xx.c \ + ../inc/LPC17xx.h ../inc/core_cm3.h ../inc/core_cmInstr.h \ + ../inc/core_cmFunc.h ../inc/system_LPC17xx.h + +../inc/LPC17xx.h: + +../inc/core_cm3.h: + +../inc/core_cmInstr.h: + +../inc/core_cmFunc.h: + +../inc/system_LPC17xx.h: diff --git a/CMSISv2p00_LPC17xx/Debug/src/system_LPC17xx.o b/CMSISv2p00_LPC17xx/Debug/src/system_LPC17xx.o new file mode 100644 index 0000000000000000000000000000000000000000..24fd1875de2038259aee7d2214d2fb20e235b86b Binary files /dev/null and b/CMSISv2p00_LPC17xx/Debug/src/system_LPC17xx.o differ diff --git a/CMSISv2p00_LPC17xx/docs/CMSIS END USER LICENCE AGREEMENT.pdf b/CMSISv2p00_LPC17xx/docs/CMSIS END USER LICENCE AGREEMENT.pdf new file mode 100644 index 0000000000000000000000000000000000000000..e04afaee6286ce461b2ab5f286c6f99b232f5ae0 Binary files /dev/null and b/CMSISv2p00_LPC17xx/docs/CMSIS END USER LICENCE AGREEMENT.pdf differ diff --git a/CMSISv2p00_LPC17xx/docs/cmsis_readme.txt b/CMSISv2p00_LPC17xx/docs/cmsis_readme.txt new file mode 100644 index 0000000000000000000000000000000000000000..316499c01484d26210923d66c1ff8d9950d54c41 --- /dev/null +++ b/CMSISv2p00_LPC17xx/docs/cmsis_readme.txt @@ -0,0 +1,44 @@ +CMSIS : Cortex Microcontroller Software Interface Standard +========================================================== + +Introduction +~~~~~~~~~~~~ +CMSIS defines for a Cortex-M Microcontroller System: + + * A common way to access peripheral registers and a + common way to define exception vectors. + * The register names of the Core Peripherals and the + names of the Core Exception Vectors. + * An device independent interface for RTOS Kernels + including a debug channel. + +By using CMSIS compliant software components, the user can +easier re-use template code. CMSIS is intended to enable the +combination of software components from multiple middleware +vendors. + +This project contains appropriate files for this MCU family +taken from CMSIS. A full copy of the CMSIS files, together +with additional information on CMSIS can be found at: + + http://www.onarm.com/ + http://www.arm.com/ + +Documentation +~~~~~~~~~~~~~ +The standard CMSIS documentation can be found within the +Code Red IDE help system, via: + +Help -> Help Contents -> Code Red Product Documentation -> CMSIS + +More information on the use of CMSIS within the Code Red IDE +can be found in the Support area of the Code Red website at + + http://www.code-red-tech.com/ + +At the time of writing, the CMSIS FAQ can be found directly +at: + + http://support.code-red-tech.com/CodeRedWiki/Support4CMSIS + + diff --git a/CMSISv2p00_LPC17xx/history.txt b/CMSISv2p00_LPC17xx/history.txt new file mode 100644 index 0000000000000000000000000000000000000000..42ca3af7c11a3248d21c506e76871712823716be --- /dev/null +++ b/CMSISv2p00_LPC17xx/history.txt @@ -0,0 +1,12 @@ +History of updates to CMSISv2p00_LPC17xx +======================================== + +7 March 2011 +------------ +LPC17xx CMSIS 2.0 library project using ARM +Cortex-M3 CMSIS files as supplied in ARM's CMSIS 2.0 +December 2010 release, together with device/board +specific files from NXP (as previously supplied in +CMSISv1p30_LPC17xx library project, dated 24 Aug 2010). + +Note files are built -Os for both Debug and Release \ No newline at end of file diff --git a/CMSISv2p00_LPC17xx/inc/LPC17xx.h b/CMSISv2p00_LPC17xx/inc/LPC17xx.h new file mode 100644 index 0000000000000000000000000000000000000000..8c4050b3a2a4e07ee5b53e5bc1dfc8df8d231ca0 --- /dev/null +++ b/CMSISv2p00_LPC17xx/inc/LPC17xx.h @@ -0,0 +1,1035 @@ +/**************************************************************************//** + * @file LPC17xx.h + * @brief CMSIS Cortex-M3 Core Peripheral Access Layer Header File for + * NXP LPC17xx Device Series + * @version: V1.09 + * @date: 17. March 2010 + + * + * @note + * Copyright (C) 2009 ARM Limited. All rights reserved. + * + * @par + * ARM Limited (ARM) is supplying this software for use with Cortex-M + * processor based microcontrollers. This file can be freely distributed + * within development tools that are supporting such ARM based processors. + * + * @par + * THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED + * OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. + * ARM SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR + * CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. + * + ******************************************************************************/ + + +#ifndef __LPC17xx_H__ +#define __LPC17xx_H__ + +/* + * ========================================================================== + * ---------- Interrupt Number Definition ----------------------------------- + * ========================================================================== + */ + +typedef enum IRQn +{ +/****** Cortex-M3 Processor Exceptions Numbers ***************************************************/ + NonMaskableInt_IRQn = -14, /*!< 2 Non Maskable Interrupt */ + MemoryManagement_IRQn = -12, /*!< 4 Cortex-M3 Memory Management Interrupt */ + BusFault_IRQn = -11, /*!< 5 Cortex-M3 Bus Fault Interrupt */ + UsageFault_IRQn = -10, /*!< 6 Cortex-M3 Usage Fault Interrupt */ + SVCall_IRQn = -5, /*!< 11 Cortex-M3 SV Call Interrupt */ + DebugMonitor_IRQn = -4, /*!< 12 Cortex-M3 Debug Monitor Interrupt */ + PendSV_IRQn = -2, /*!< 14 Cortex-M3 Pend SV Interrupt */ + SysTick_IRQn = -1, /*!< 15 Cortex-M3 System Tick Interrupt */ + +/****** LPC17xx Specific Interrupt Numbers *******************************************************/ + WDT_IRQn = 0, /*!< Watchdog Timer Interrupt */ + TIMER0_IRQn = 1, /*!< Timer0 Interrupt */ + TIMER1_IRQn = 2, /*!< Timer1 Interrupt */ + TIMER2_IRQn = 3, /*!< Timer2 Interrupt */ + TIMER3_IRQn = 4, /*!< Timer3 Interrupt */ + UART0_IRQn = 5, /*!< UART0 Interrupt */ + UART1_IRQn = 6, /*!< UART1 Interrupt */ + UART2_IRQn = 7, /*!< UART2 Interrupt */ + UART3_IRQn = 8, /*!< UART3 Interrupt */ + PWM1_IRQn = 9, /*!< PWM1 Interrupt */ + I2C0_IRQn = 10, /*!< I2C0 Interrupt */ + I2C1_IRQn = 11, /*!< I2C1 Interrupt */ + I2C2_IRQn = 12, /*!< I2C2 Interrupt */ + SPI_IRQn = 13, /*!< SPI Interrupt */ + SSP0_IRQn = 14, /*!< SSP0 Interrupt */ + SSP1_IRQn = 15, /*!< SSP1 Interrupt */ + PLL0_IRQn = 16, /*!< PLL0 Lock (Main PLL) Interrupt */ + RTC_IRQn = 17, /*!< Real Time Clock Interrupt */ + EINT0_IRQn = 18, /*!< External Interrupt 0 Interrupt */ + EINT1_IRQn = 19, /*!< External Interrupt 1 Interrupt */ + EINT2_IRQn = 20, /*!< External Interrupt 2 Interrupt */ + EINT3_IRQn = 21, /*!< External Interrupt 3 Interrupt */ + ADC_IRQn = 22, /*!< A/D Converter Interrupt */ + BOD_IRQn = 23, /*!< Brown-Out Detect Interrupt */ + USB_IRQn = 24, /*!< USB Interrupt */ + CAN_IRQn = 25, /*!< CAN Interrupt */ + DMA_IRQn = 26, /*!< General Purpose DMA Interrupt */ + I2S_IRQn = 27, /*!< I2S Interrupt */ + ENET_IRQn = 28, /*!< Ethernet Interrupt */ + RIT_IRQn = 29, /*!< Repetitive Interrupt Timer Interrupt */ + MCPWM_IRQn = 30, /*!< Motor Control PWM Interrupt */ + QEI_IRQn = 31, /*!< Quadrature Encoder Interface Interrupt */ + PLL1_IRQn = 32, /*!< PLL1 Lock (USB PLL) Interrupt */ + USBActivity_IRQn = 33, /* USB Activity interrupt */ + CANActivity_IRQn = 34, /* CAN Activity interrupt */ +} IRQn_Type; + + +/* + * ========================================================================== + * ----------- Processor and Core Peripheral Section ------------------------ + * ========================================================================== + */ + +/* Configuration of the Cortex-M3 Processor and Core Peripherals */ +#define __MPU_PRESENT 1 /*!< MPU present or not */ +#define __NVIC_PRIO_BITS 5 /*!< Number of Bits used for Priority Levels */ +#define __Vendor_SysTickConfig 0 /*!< Set to 1 if different SysTick Config is used */ + + +#include "core_cm3.h" /* Cortex-M3 processor and core peripherals */ +#include "system_LPC17xx.h" /* System Header */ + + +/******************************************************************************/ +/* Device Specific Peripheral registers structures */ +/******************************************************************************/ + +#if defined ( __CC_ARM ) +#pragma anon_unions +#endif + +/*------------- System Control (SC) ------------------------------------------*/ +typedef struct +{ + __IO uint32_t FLASHCFG; /* Flash Accelerator Module */ + uint32_t RESERVED0[31]; + __IO uint32_t PLL0CON; /* Clocking and Power Control */ + __IO uint32_t PLL0CFG; + __I uint32_t PLL0STAT; + __O uint32_t PLL0FEED; + uint32_t RESERVED1[4]; + __IO uint32_t PLL1CON; + __IO uint32_t PLL1CFG; + __I uint32_t PLL1STAT; + __O uint32_t PLL1FEED; + uint32_t RESERVED2[4]; + __IO uint32_t PCON; + __IO uint32_t PCONP; + uint32_t RESERVED3[15]; + __IO uint32_t CCLKCFG; + __IO uint32_t USBCLKCFG; + __IO uint32_t CLKSRCSEL; + __IO uint32_t CANSLEEPCLR; + __IO uint32_t CANWAKEFLAGS; + uint32_t RESERVED4[10]; + __IO uint32_t EXTINT; /* External Interrupts */ + uint32_t RESERVED5; + __IO uint32_t EXTMODE; + __IO uint32_t EXTPOLAR; + uint32_t RESERVED6[12]; + __IO uint32_t RSID; /* Reset */ + uint32_t RESERVED7[7]; + __IO uint32_t SCS; /* Syscon Miscellaneous Registers */ + __IO uint32_t IRCTRIM; /* Clock Dividers */ + __IO uint32_t PCLKSEL0; + __IO uint32_t PCLKSEL1; + uint32_t RESERVED8[4]; + __IO uint32_t USBIntSt; /* USB Device/OTG Interrupt Register */ + __IO uint32_t DMAREQSEL; + __IO uint32_t CLKOUTCFG; /* Clock Output Configuration */ + } LPC_SC_TypeDef; + +/*------------- Pin Connect Block (PINCON) -----------------------------------*/ +typedef struct +{ + __IO uint32_t PINSEL0; + __IO uint32_t PINSEL1; + __IO uint32_t PINSEL2; + __IO uint32_t PINSEL3; + __IO uint32_t PINSEL4; + __IO uint32_t PINSEL5; + __IO uint32_t PINSEL6; + __IO uint32_t PINSEL7; + __IO uint32_t PINSEL8; + __IO uint32_t PINSEL9; + __IO uint32_t PINSEL10; + uint32_t RESERVED0[5]; + __IO uint32_t PINMODE0; + __IO uint32_t PINMODE1; + __IO uint32_t PINMODE2; + __IO uint32_t PINMODE3; + __IO uint32_t PINMODE4; + __IO uint32_t PINMODE5; + __IO uint32_t PINMODE6; + __IO uint32_t PINMODE7; + __IO uint32_t PINMODE8; + __IO uint32_t PINMODE9; + __IO uint32_t PINMODE_OD0; + __IO uint32_t PINMODE_OD1; + __IO uint32_t PINMODE_OD2; + __IO uint32_t PINMODE_OD3; + __IO uint32_t PINMODE_OD4; + __IO uint32_t I2CPADCFG; +} LPC_PINCON_TypeDef; + +/*------------- General Purpose Input/Output (GPIO) --------------------------*/ +typedef struct +{ + union { + __IO uint32_t FIODIR; + struct { + __IO uint16_t FIODIRL; + __IO uint16_t FIODIRH; + }; + struct { + __IO uint8_t FIODIR0; + __IO uint8_t FIODIR1; + __IO uint8_t FIODIR2; + __IO uint8_t FIODIR3; + }; + }; + uint32_t RESERVED0[3]; + union { + __IO uint32_t FIOMASK; + struct { + __IO uint16_t FIOMASKL; + __IO uint16_t FIOMASKH; + }; + struct { + __IO uint8_t FIOMASK0; + __IO uint8_t FIOMASK1; + __IO uint8_t FIOMASK2; + __IO uint8_t FIOMASK3; + }; + }; + union { + __IO uint32_t FIOPIN; + struct { + __IO uint16_t FIOPINL; + __IO uint16_t FIOPINH; + }; + struct { + __IO uint8_t FIOPIN0; + __IO uint8_t FIOPIN1; + __IO uint8_t FIOPIN2; + __IO uint8_t FIOPIN3; + }; + }; + union { + __IO uint32_t FIOSET; + struct { + __IO uint16_t FIOSETL; + __IO uint16_t FIOSETH; + }; + struct { + __IO uint8_t FIOSET0; + __IO uint8_t FIOSET1; + __IO uint8_t FIOSET2; + __IO uint8_t FIOSET3; + }; + }; + union { + __O uint32_t FIOCLR; + struct { + __O uint16_t FIOCLRL; + __O uint16_t FIOCLRH; + }; + struct { + __O uint8_t FIOCLR0; + __O uint8_t FIOCLR1; + __O uint8_t FIOCLR2; + __O uint8_t FIOCLR3; + }; + }; +} LPC_GPIO_TypeDef; + +typedef struct +{ + __I uint32_t IntStatus; + __I uint32_t IO0IntStatR; + __I uint32_t IO0IntStatF; + __O uint32_t IO0IntClr; + __IO uint32_t IO0IntEnR; + __IO uint32_t IO0IntEnF; + uint32_t RESERVED0[3]; + __I uint32_t IO2IntStatR; + __I uint32_t IO2IntStatF; + __O uint32_t IO2IntClr; + __IO uint32_t IO2IntEnR; + __IO uint32_t IO2IntEnF; +} LPC_GPIOINT_TypeDef; + +/*------------- Timer (TIM) --------------------------------------------------*/ +typedef struct +{ + __IO uint32_t IR; + __IO uint32_t TCR; + __IO uint32_t TC; + __IO uint32_t PR; + __IO uint32_t PC; + __IO uint32_t MCR; + __IO uint32_t MR0; + __IO uint32_t MR1; + __IO uint32_t MR2; + __IO uint32_t MR3; + __IO uint32_t CCR; + __I uint32_t CR0; + __I uint32_t CR1; + uint32_t RESERVED0[2]; + __IO uint32_t EMR; + uint32_t RESERVED1[12]; + __IO uint32_t CTCR; +} LPC_TIM_TypeDef; + +/*------------- Pulse-Width Modulation (PWM) ---------------------------------*/ +typedef struct +{ + __IO uint32_t IR; + __IO uint32_t TCR; + __IO uint32_t TC; + __IO uint32_t PR; + __IO uint32_t PC; + __IO uint32_t MCR; + __IO uint32_t MR0; + __IO uint32_t MR1; + __IO uint32_t MR2; + __IO uint32_t MR3; + __IO uint32_t CCR; + __I uint32_t CR0; + __I uint32_t CR1; + __I uint32_t CR2; + __I uint32_t CR3; + uint32_t RESERVED0; + __IO uint32_t MR4; + __IO uint32_t MR5; + __IO uint32_t MR6; + __IO uint32_t PCR; + __IO uint32_t LER; + uint32_t RESERVED1[7]; + __IO uint32_t CTCR; +} LPC_PWM_TypeDef; + +/*------------- Universal Asynchronous Receiver Transmitter (UART) -----------*/ +typedef struct +{ + union { + __I uint8_t RBR; + __O uint8_t THR; + __IO uint8_t DLL; + uint32_t RESERVED0; + }; + union { + __IO uint8_t DLM; + __IO uint32_t IER; + }; + union { + __I uint32_t IIR; + __O uint8_t FCR; + }; + __IO uint8_t LCR; + uint8_t RESERVED1[7]; + __I uint8_t LSR; + uint8_t RESERVED2[7]; + __IO uint8_t SCR; + uint8_t RESERVED3[3]; + __IO uint32_t ACR; + __IO uint8_t ICR; + uint8_t RESERVED4[3]; + __IO uint8_t FDR; + uint8_t RESERVED5[7]; + __IO uint8_t TER; + uint8_t RESERVED6[39]; + __IO uint32_t FIFOLVL; +} LPC_UART_TypeDef; + +typedef struct +{ + union { + __I uint8_t RBR; + __O uint8_t THR; + __IO uint8_t DLL; + uint32_t RESERVED0; + }; + union { + __IO uint8_t DLM; + __IO uint32_t IER; + }; + union { + __I uint32_t IIR; + __O uint8_t FCR; + }; + __IO uint8_t LCR; + uint8_t RESERVED1[7]; + __I uint8_t LSR; + uint8_t RESERVED2[7]; + __IO uint8_t SCR; + uint8_t RESERVED3[3]; + __IO uint32_t ACR; + __IO uint8_t ICR; + uint8_t RESERVED4[3]; + __IO uint8_t FDR; + uint8_t RESERVED5[7]; + __IO uint8_t TER; + uint8_t RESERVED6[39]; + __IO uint32_t FIFOLVL; +} LPC_UART0_TypeDef; + +typedef struct +{ + union { + __I uint8_t RBR; + __O uint8_t THR; + __IO uint8_t DLL; + uint32_t RESERVED0; + }; + union { + __IO uint8_t DLM; + __IO uint32_t IER; + }; + union { + __I uint32_t IIR; + __O uint8_t FCR; + }; + __IO uint8_t LCR; + uint8_t RESERVED1[3]; + __IO uint8_t MCR; + uint8_t RESERVED2[3]; + __I uint8_t LSR; + uint8_t RESERVED3[3]; + __I uint8_t MSR; + uint8_t RESERVED4[3]; + __IO uint8_t SCR; + uint8_t RESERVED5[3]; + __IO uint32_t ACR; + uint32_t RESERVED6; + __IO uint32_t FDR; + uint32_t RESERVED7; + __IO uint8_t TER; + uint8_t RESERVED8[27]; + __IO uint8_t RS485CTRL; + uint8_t RESERVED9[3]; + __IO uint8_t ADRMATCH; + uint8_t RESERVED10[3]; + __IO uint8_t RS485DLY; + uint8_t RESERVED11[3]; + __IO uint32_t FIFOLVL; +} LPC_UART1_TypeDef; + +/*------------- Serial Peripheral Interface (SPI) ----------------------------*/ +typedef struct +{ + __IO uint32_t SPCR; + __I uint32_t SPSR; + __IO uint32_t SPDR; + __IO uint32_t SPCCR; + uint32_t RESERVED0[3]; + __IO uint32_t SPINT; +} LPC_SPI_TypeDef; + +/*------------- Synchronous Serial Communication (SSP) -----------------------*/ +typedef struct +{ + __IO uint32_t CR0; + __IO uint32_t CR1; + __IO uint32_t DR; + __I uint32_t SR; + __IO uint32_t CPSR; + __IO uint32_t IMSC; + __IO uint32_t RIS; + __IO uint32_t MIS; + __IO uint32_t ICR; + __IO uint32_t DMACR; +} LPC_SSP_TypeDef; + +/*------------- Inter-Integrated Circuit (I2C) -------------------------------*/ +typedef struct +{ + __IO uint32_t I2CONSET; + __I uint32_t I2STAT; + __IO uint32_t I2DAT; + __IO uint32_t I2ADR0; + __IO uint32_t I2SCLH; + __IO uint32_t I2SCLL; + __O uint32_t I2CONCLR; + __IO uint32_t MMCTRL; + __IO uint32_t I2ADR1; + __IO uint32_t I2ADR2; + __IO uint32_t I2ADR3; + __I uint32_t I2DATA_BUFFER; + __IO uint32_t I2MASK0; + __IO uint32_t I2MASK1; + __IO uint32_t I2MASK2; + __IO uint32_t I2MASK3; +} LPC_I2C_TypeDef; + +/*------------- Inter IC Sound (I2S) -----------------------------------------*/ +typedef struct +{ + __IO uint32_t I2SDAO; + __IO uint32_t I2SDAI; + __O uint32_t I2STXFIFO; + __I uint32_t I2SRXFIFO; + __I uint32_t I2SSTATE; + __IO uint32_t I2SDMA1; + __IO uint32_t I2SDMA2; + __IO uint32_t I2SIRQ; + __IO uint32_t I2STXRATE; + __IO uint32_t I2SRXRATE; + __IO uint32_t I2STXBITRATE; + __IO uint32_t I2SRXBITRATE; + __IO uint32_t I2STXMODE; + __IO uint32_t I2SRXMODE; +} LPC_I2S_TypeDef; + +/*------------- Repetitive Interrupt Timer (RIT) -----------------------------*/ +typedef struct +{ + __IO uint32_t RICOMPVAL; + __IO uint32_t RIMASK; + __IO uint8_t RICTRL; + uint8_t RESERVED0[3]; + __IO uint32_t RICOUNTER; +} LPC_RIT_TypeDef; + +/*------------- Real-Time Clock (RTC) ----------------------------------------*/ +typedef struct +{ + __IO uint8_t ILR; + uint8_t RESERVED0[7]; + __IO uint8_t CCR; + uint8_t RESERVED1[3]; + __IO uint8_t CIIR; + uint8_t RESERVED2[3]; + __IO uint8_t AMR; + uint8_t RESERVED3[3]; + __I uint32_t CTIME0; + __I uint32_t CTIME1; + __I uint32_t CTIME2; + __IO uint8_t SEC; + uint8_t RESERVED4[3]; + __IO uint8_t MIN; + uint8_t RESERVED5[3]; + __IO uint8_t HOUR; + uint8_t RESERVED6[3]; + __IO uint8_t DOM; + uint8_t RESERVED7[3]; + __IO uint8_t DOW; + uint8_t RESERVED8[3]; + __IO uint16_t DOY; + uint16_t RESERVED9; + __IO uint8_t MONTH; + uint8_t RESERVED10[3]; + __IO uint16_t YEAR; + uint16_t RESERVED11; + __IO uint32_t CALIBRATION; + __IO uint32_t GPREG0; + __IO uint32_t GPREG1; + __IO uint32_t GPREG2; + __IO uint32_t GPREG3; + __IO uint32_t GPREG4; + __IO uint8_t RTC_AUXEN; + uint8_t RESERVED12[3]; + __IO uint8_t RTC_AUX; + uint8_t RESERVED13[3]; + __IO uint8_t ALSEC; + uint8_t RESERVED14[3]; + __IO uint8_t ALMIN; + uint8_t RESERVED15[3]; + __IO uint8_t ALHOUR; + uint8_t RESERVED16[3]; + __IO uint8_t ALDOM; + uint8_t RESERVED17[3]; + __IO uint8_t ALDOW; + uint8_t RESERVED18[3]; + __IO uint16_t ALDOY; + uint16_t RESERVED19; + __IO uint8_t ALMON; + uint8_t RESERVED20[3]; + __IO uint16_t ALYEAR; + uint16_t RESERVED21; +} LPC_RTC_TypeDef; + +/*------------- Watchdog Timer (WDT) -----------------------------------------*/ +typedef struct +{ + __IO uint8_t WDMOD; + uint8_t RESERVED0[3]; + __IO uint32_t WDTC; + __O uint8_t WDFEED; + uint8_t RESERVED1[3]; + __I uint32_t WDTV; + __IO uint32_t WDCLKSEL; +} LPC_WDT_TypeDef; + +/*------------- Analog-to-Digital Converter (ADC) ----------------------------*/ +typedef struct +{ + __IO uint32_t ADCR; + __IO uint32_t ADGDR; + uint32_t RESERVED0; + __IO uint32_t ADINTEN; + __I uint32_t ADDR0; + __I uint32_t ADDR1; + __I uint32_t ADDR2; + __I uint32_t ADDR3; + __I uint32_t ADDR4; + __I uint32_t ADDR5; + __I uint32_t ADDR6; + __I uint32_t ADDR7; + __I uint32_t ADSTAT; + __IO uint32_t ADTRM; +} LPC_ADC_TypeDef; + +/*------------- Digital-to-Analog Converter (DAC) ----------------------------*/ +typedef struct +{ + __IO uint32_t DACR; + __IO uint32_t DACCTRL; + __IO uint16_t DACCNTVAL; +} LPC_DAC_TypeDef; + +/*------------- Motor Control Pulse-Width Modulation (MCPWM) -----------------*/ +typedef struct +{ + __I uint32_t MCCON; + __O uint32_t MCCON_SET; + __O uint32_t MCCON_CLR; + __I uint32_t MCCAPCON; + __O uint32_t MCCAPCON_SET; + __O uint32_t MCCAPCON_CLR; + __IO uint32_t MCTIM0; + __IO uint32_t MCTIM1; + __IO uint32_t MCTIM2; + __IO uint32_t MCPER0; + __IO uint32_t MCPER1; + __IO uint32_t MCPER2; + __IO uint32_t MCPW0; + __IO uint32_t MCPW1; + __IO uint32_t MCPW2; + __IO uint32_t MCDEADTIME; + __IO uint32_t MCCCP; + __IO uint32_t MCCR0; + __IO uint32_t MCCR1; + __IO uint32_t MCCR2; + __I uint32_t MCINTEN; + __O uint32_t MCINTEN_SET; + __O uint32_t MCINTEN_CLR; + __I uint32_t MCCNTCON; + __O uint32_t MCCNTCON_SET; + __O uint32_t MCCNTCON_CLR; + __I uint32_t MCINTFLAG; + __O uint32_t MCINTFLAG_SET; + __O uint32_t MCINTFLAG_CLR; + __O uint32_t MCCAP_CLR; +} LPC_MCPWM_TypeDef; + +/*------------- Quadrature Encoder Interface (QEI) ---------------------------*/ +typedef struct +{ + __O uint32_t QEICON; + __I uint32_t QEISTAT; + __IO uint32_t QEICONF; + __I uint32_t QEIPOS; + __IO uint32_t QEIMAXPOS; + __IO uint32_t CMPOS0; + __IO uint32_t CMPOS1; + __IO uint32_t CMPOS2; + __I uint32_t INXCNT; + __IO uint32_t INXCMP; + __IO uint32_t QEILOAD; + __I uint32_t QEITIME; + __I uint32_t QEIVEL; + __I uint32_t QEICAP; + __IO uint32_t VELCOMP; + __IO uint32_t FILTER; + uint32_t RESERVED0[998]; + __O uint32_t QEIIEC; + __O uint32_t QEIIES; + __I uint32_t QEIINTSTAT; + __I uint32_t QEIIE; + __O uint32_t QEICLR; + __O uint32_t QEISET; +} LPC_QEI_TypeDef; + +/*------------- Controller Area Network (CAN) --------------------------------*/ +typedef struct +{ + __IO uint32_t mask[512]; /* ID Masks */ +} LPC_CANAF_RAM_TypeDef; + +typedef struct /* Acceptance Filter Registers */ +{ + __IO uint32_t AFMR; + __IO uint32_t SFF_sa; + __IO uint32_t SFF_GRP_sa; + __IO uint32_t EFF_sa; + __IO uint32_t EFF_GRP_sa; + __IO uint32_t ENDofTable; + __I uint32_t LUTerrAd; + __I uint32_t LUTerr; + __IO uint32_t FCANIE; + __IO uint32_t FCANIC0; + __IO uint32_t FCANIC1; +} LPC_CANAF_TypeDef; + +typedef struct /* Central Registers */ +{ + __I uint32_t CANTxSR; + __I uint32_t CANRxSR; + __I uint32_t CANMSR; +} LPC_CANCR_TypeDef; + +typedef struct /* Controller Registers */ +{ + __IO uint32_t MOD; + __O uint32_t CMR; + __IO uint32_t GSR; + __I uint32_t ICR; + __IO uint32_t IER; + __IO uint32_t BTR; + __IO uint32_t EWL; + __I uint32_t SR; + __IO uint32_t RFS; + __IO uint32_t RID; + __IO uint32_t RDA; + __IO uint32_t RDB; + __IO uint32_t TFI1; + __IO uint32_t TID1; + __IO uint32_t TDA1; + __IO uint32_t TDB1; + __IO uint32_t TFI2; + __IO uint32_t TID2; + __IO uint32_t TDA2; + __IO uint32_t TDB2; + __IO uint32_t TFI3; + __IO uint32_t TID3; + __IO uint32_t TDA3; + __IO uint32_t TDB3; +} LPC_CAN_TypeDef; + +/*------------- General Purpose Direct Memory Access (GPDMA) -----------------*/ +typedef struct /* Common Registers */ +{ + __I uint32_t DMACIntStat; + __I uint32_t DMACIntTCStat; + __O uint32_t DMACIntTCClear; + __I uint32_t DMACIntErrStat; + __O uint32_t DMACIntErrClr; + __I uint32_t DMACRawIntTCStat; + __I uint32_t DMACRawIntErrStat; + __I uint32_t DMACEnbldChns; + __IO uint32_t DMACSoftBReq; + __IO uint32_t DMACSoftSReq; + __IO uint32_t DMACSoftLBReq; + __IO uint32_t DMACSoftLSReq; + __IO uint32_t DMACConfig; + __IO uint32_t DMACSync; +} LPC_GPDMA_TypeDef; + +typedef struct /* Channel Registers */ +{ + __IO uint32_t DMACCSrcAddr; + __IO uint32_t DMACCDestAddr; + __IO uint32_t DMACCLLI; + __IO uint32_t DMACCControl; + __IO uint32_t DMACCConfig; +} LPC_GPDMACH_TypeDef; + +/*------------- Universal Serial Bus (USB) -----------------------------------*/ +typedef struct +{ + __I uint32_t HcRevision; /* USB Host Registers */ + __IO uint32_t HcControl; + __IO uint32_t HcCommandStatus; + __IO uint32_t HcInterruptStatus; + __IO uint32_t HcInterruptEnable; + __IO uint32_t HcInterruptDisable; + __IO uint32_t HcHCCA; + __I uint32_t HcPeriodCurrentED; + __IO uint32_t HcControlHeadED; + __IO uint32_t HcControlCurrentED; + __IO uint32_t HcBulkHeadED; + __IO uint32_t HcBulkCurrentED; + __I uint32_t HcDoneHead; + __IO uint32_t HcFmInterval; + __I uint32_t HcFmRemaining; + __I uint32_t HcFmNumber; + __IO uint32_t HcPeriodicStart; + __IO uint32_t HcLSTreshold; + __IO uint32_t HcRhDescriptorA; + __IO uint32_t HcRhDescriptorB; + __IO uint32_t HcRhStatus; + __IO uint32_t HcRhPortStatus1; + __IO uint32_t HcRhPortStatus2; + uint32_t RESERVED0[40]; + __I uint32_t Module_ID; + + __I uint32_t OTGIntSt; /* USB On-The-Go Registers */ + __IO uint32_t OTGIntEn; + __O uint32_t OTGIntSet; + __O uint32_t OTGIntClr; + __IO uint32_t OTGStCtrl; + __IO uint32_t OTGTmr; + uint32_t RESERVED1[58]; + + __I uint32_t USBDevIntSt; /* USB Device Interrupt Registers */ + __IO uint32_t USBDevIntEn; + __O uint32_t USBDevIntClr; + __O uint32_t USBDevIntSet; + + __O uint32_t USBCmdCode; /* USB Device SIE Command Registers */ + __I uint32_t USBCmdData; + + __I uint32_t USBRxData; /* USB Device Transfer Registers */ + __O uint32_t USBTxData; + __I uint32_t USBRxPLen; + __O uint32_t USBTxPLen; + __IO uint32_t USBCtrl; + __O uint32_t USBDevIntPri; + + __I uint32_t USBEpIntSt; /* USB Device Endpoint Interrupt Regs */ + __IO uint32_t USBEpIntEn; + __O uint32_t USBEpIntClr; + __O uint32_t USBEpIntSet; + __O uint32_t USBEpIntPri; + + __IO uint32_t USBReEp; /* USB Device Endpoint Realization Reg*/ + __O uint32_t USBEpInd; + __IO uint32_t USBMaxPSize; + + __I uint32_t USBDMARSt; /* USB Device DMA Registers */ + __O uint32_t USBDMARClr; + __O uint32_t USBDMARSet; + uint32_t RESERVED2[9]; + __IO uint32_t USBUDCAH; + __I uint32_t USBEpDMASt; + __O uint32_t USBEpDMAEn; + __O uint32_t USBEpDMADis; + __I uint32_t USBDMAIntSt; + __IO uint32_t USBDMAIntEn; + uint32_t RESERVED3[2]; + __I uint32_t USBEoTIntSt; + __O uint32_t USBEoTIntClr; + __O uint32_t USBEoTIntSet; + __I uint32_t USBNDDRIntSt; + __O uint32_t USBNDDRIntClr; + __O uint32_t USBNDDRIntSet; + __I uint32_t USBSysErrIntSt; + __O uint32_t USBSysErrIntClr; + __O uint32_t USBSysErrIntSet; + uint32_t RESERVED4[15]; + + union { + __I uint32_t I2C_RX; /* USB OTG I2C Registers */ + __O uint32_t I2C_TX; + }; + __I uint32_t I2C_STS; + __IO uint32_t I2C_CTL; + __IO uint32_t I2C_CLKHI; + __O uint32_t I2C_CLKLO; + uint32_t RESERVED5[824]; + + union { + __IO uint32_t USBClkCtrl; /* USB Clock Control Registers */ + __IO uint32_t OTGClkCtrl; + }; + union { + __I uint32_t USBClkSt; + __I uint32_t OTGClkSt; + }; +} LPC_USB_TypeDef; + +/*------------- Ethernet Media Access Controller (EMAC) ----------------------*/ +typedef struct +{ + __IO uint32_t MAC1; /* MAC Registers */ + __IO uint32_t MAC2; + __IO uint32_t IPGT; + __IO uint32_t IPGR; + __IO uint32_t CLRT; + __IO uint32_t MAXF; + __IO uint32_t SUPP; + __IO uint32_t TEST; + __IO uint32_t MCFG; + __IO uint32_t MCMD; + __IO uint32_t MADR; + __O uint32_t MWTD; + __I uint32_t MRDD; + __I uint32_t MIND; + uint32_t RESERVED0[2]; + __IO uint32_t SA0; + __IO uint32_t SA1; + __IO uint32_t SA2; + uint32_t RESERVED1[45]; + __IO uint32_t Command; /* Control Registers */ + __I uint32_t Status; + __IO uint32_t RxDescriptor; + __IO uint32_t RxStatus; + __IO uint32_t RxDescriptorNumber; + __I uint32_t RxProduceIndex; + __IO uint32_t RxConsumeIndex; + __IO uint32_t TxDescriptor; + __IO uint32_t TxStatus; + __IO uint32_t TxDescriptorNumber; + __IO uint32_t TxProduceIndex; + __I uint32_t TxConsumeIndex; + uint32_t RESERVED2[10]; + __I uint32_t TSV0; + __I uint32_t TSV1; + __I uint32_t RSV; + uint32_t RESERVED3[3]; + __IO uint32_t FlowControlCounter; + __I uint32_t FlowControlStatus; + uint32_t RESERVED4[34]; + __IO uint32_t RxFilterCtrl; /* Rx Filter Registers */ + __IO uint32_t RxFilterWoLStatus; + __IO uint32_t RxFilterWoLClear; + uint32_t RESERVED5; + __IO uint32_t HashFilterL; + __IO uint32_t HashFilterH; + uint32_t RESERVED6[882]; + __I uint32_t IntStatus; /* Module Control Registers */ + __IO uint32_t IntEnable; + __O uint32_t IntClear; + __O uint32_t IntSet; + uint32_t RESERVED7; + __IO uint32_t PowerDown; + uint32_t RESERVED8; + __IO uint32_t Module_ID; +} LPC_EMAC_TypeDef; + +#if defined ( __CC_ARM ) +#pragma no_anon_unions +#endif + + +/******************************************************************************/ +/* Peripheral memory map */ +/******************************************************************************/ +/* Base addresses */ +#define LPC_FLASH_BASE (0x00000000UL) +#define LPC_RAM_BASE (0x10000000UL) +#define LPC_GPIO_BASE (0x2009C000UL) +#define LPC_APB0_BASE (0x40000000UL) +#define LPC_APB1_BASE (0x40080000UL) +#define LPC_AHB_BASE (0x50000000UL) +#define LPC_CM3_BASE (0xE0000000UL) + +/* APB0 peripherals */ +#define LPC_WDT_BASE (LPC_APB0_BASE + 0x00000) +#define LPC_TIM0_BASE (LPC_APB0_BASE + 0x04000) +#define LPC_TIM1_BASE (LPC_APB0_BASE + 0x08000) +#define LPC_UART0_BASE (LPC_APB0_BASE + 0x0C000) +#define LPC_UART1_BASE (LPC_APB0_BASE + 0x10000) +#define LPC_PWM1_BASE (LPC_APB0_BASE + 0x18000) +#define LPC_I2C0_BASE (LPC_APB0_BASE + 0x1C000) +#define LPC_SPI_BASE (LPC_APB0_BASE + 0x20000) +#define LPC_RTC_BASE (LPC_APB0_BASE + 0x24000) +#define LPC_GPIOINT_BASE (LPC_APB0_BASE + 0x28080) +#define LPC_PINCON_BASE (LPC_APB0_BASE + 0x2C000) +#define LPC_SSP1_BASE (LPC_APB0_BASE + 0x30000) +#define LPC_ADC_BASE (LPC_APB0_BASE + 0x34000) +#define LPC_CANAF_RAM_BASE (LPC_APB0_BASE + 0x38000) +#define LPC_CANAF_BASE (LPC_APB0_BASE + 0x3C000) +#define LPC_CANCR_BASE (LPC_APB0_BASE + 0x40000) +#define LPC_CAN1_BASE (LPC_APB0_BASE + 0x44000) +#define LPC_CAN2_BASE (LPC_APB0_BASE + 0x48000) +#define LPC_I2C1_BASE (LPC_APB0_BASE + 0x5C000) + +/* APB1 peripherals */ +#define LPC_SSP0_BASE (LPC_APB1_BASE + 0x08000) +#define LPC_DAC_BASE (LPC_APB1_BASE + 0x0C000) +#define LPC_TIM2_BASE (LPC_APB1_BASE + 0x10000) +#define LPC_TIM3_BASE (LPC_APB1_BASE + 0x14000) +#define LPC_UART2_BASE (LPC_APB1_BASE + 0x18000) +#define LPC_UART3_BASE (LPC_APB1_BASE + 0x1C000) +#define LPC_I2C2_BASE (LPC_APB1_BASE + 0x20000) +#define LPC_I2S_BASE (LPC_APB1_BASE + 0x28000) +#define LPC_RIT_BASE (LPC_APB1_BASE + 0x30000) +#define LPC_MCPWM_BASE (LPC_APB1_BASE + 0x38000) +#define LPC_QEI_BASE (LPC_APB1_BASE + 0x3C000) +#define LPC_SC_BASE (LPC_APB1_BASE + 0x7C000) + +/* AHB peripherals */ +#define LPC_EMAC_BASE (LPC_AHB_BASE + 0x00000) +#define LPC_GPDMA_BASE (LPC_AHB_BASE + 0x04000) +#define LPC_GPDMACH0_BASE (LPC_AHB_BASE + 0x04100) +#define LPC_GPDMACH1_BASE (LPC_AHB_BASE + 0x04120) +#define LPC_GPDMACH2_BASE (LPC_AHB_BASE + 0x04140) +#define LPC_GPDMACH3_BASE (LPC_AHB_BASE + 0x04160) +#define LPC_GPDMACH4_BASE (LPC_AHB_BASE + 0x04180) +#define LPC_GPDMACH5_BASE (LPC_AHB_BASE + 0x041A0) +#define LPC_GPDMACH6_BASE (LPC_AHB_BASE + 0x041C0) +#define LPC_GPDMACH7_BASE (LPC_AHB_BASE + 0x041E0) +#define LPC_USB_BASE (LPC_AHB_BASE + 0x0C000) + +/* GPIOs */ +#define LPC_GPIO0_BASE (LPC_GPIO_BASE + 0x00000) +#define LPC_GPIO1_BASE (LPC_GPIO_BASE + 0x00020) +#define LPC_GPIO2_BASE (LPC_GPIO_BASE + 0x00040) +#define LPC_GPIO3_BASE (LPC_GPIO_BASE + 0x00060) +#define LPC_GPIO4_BASE (LPC_GPIO_BASE + 0x00080) + + +/******************************************************************************/ +/* Peripheral declaration */ +/******************************************************************************/ +#define LPC_SC ((LPC_SC_TypeDef *) LPC_SC_BASE ) +#define LPC_GPIO0 ((LPC_GPIO_TypeDef *) LPC_GPIO0_BASE ) +#define LPC_GPIO1 ((LPC_GPIO_TypeDef *) LPC_GPIO1_BASE ) +#define LPC_GPIO2 ((LPC_GPIO_TypeDef *) LPC_GPIO2_BASE ) +#define LPC_GPIO3 ((LPC_GPIO_TypeDef *) LPC_GPIO3_BASE ) +#define LPC_GPIO4 ((LPC_GPIO_TypeDef *) LPC_GPIO4_BASE ) +#define LPC_WDT ((LPC_WDT_TypeDef *) LPC_WDT_BASE ) +#define LPC_TIM0 ((LPC_TIM_TypeDef *) LPC_TIM0_BASE ) +#define LPC_TIM1 ((LPC_TIM_TypeDef *) LPC_TIM1_BASE ) +#define LPC_TIM2 ((LPC_TIM_TypeDef *) LPC_TIM2_BASE ) +#define LPC_TIM3 ((LPC_TIM_TypeDef *) LPC_TIM3_BASE ) +#define LPC_RIT ((LPC_RIT_TypeDef *) LPC_RIT_BASE ) +#define LPC_UART0 ((LPC_UART0_TypeDef *) LPC_UART0_BASE ) +#define LPC_UART1 ((LPC_UART1_TypeDef *) LPC_UART1_BASE ) +#define LPC_UART2 ((LPC_UART_TypeDef *) LPC_UART2_BASE ) +#define LPC_UART3 ((LPC_UART_TypeDef *) LPC_UART3_BASE ) +#define LPC_PWM1 ((LPC_PWM_TypeDef *) LPC_PWM1_BASE ) +#define LPC_I2C0 ((LPC_I2C_TypeDef *) LPC_I2C0_BASE ) +#define LPC_I2C1 ((LPC_I2C_TypeDef *) LPC_I2C1_BASE ) +#define LPC_I2C2 ((LPC_I2C_TypeDef *) LPC_I2C2_BASE ) +#define LPC_I2S ((LPC_I2S_TypeDef *) LPC_I2S_BASE ) +#define LPC_SPI ((LPC_SPI_TypeDef *) LPC_SPI_BASE ) +#define LPC_RTC ((LPC_RTC_TypeDef *) LPC_RTC_BASE ) +#define LPC_GPIOINT ((LPC_GPIOINT_TypeDef *) LPC_GPIOINT_BASE ) +#define LPC_PINCON ((LPC_PINCON_TypeDef *) LPC_PINCON_BASE ) +#define LPC_SSP0 ((LPC_SSP_TypeDef *) LPC_SSP0_BASE ) +#define LPC_SSP1 ((LPC_SSP_TypeDef *) LPC_SSP1_BASE ) +#define LPC_ADC ((LPC_ADC_TypeDef *) LPC_ADC_BASE ) +#define LPC_DAC ((LPC_DAC_TypeDef *) LPC_DAC_BASE ) +#define LPC_CANAF_RAM ((LPC_CANAF_RAM_TypeDef *) LPC_CANAF_RAM_BASE) +#define LPC_CANAF ((LPC_CANAF_TypeDef *) LPC_CANAF_BASE ) +#define LPC_CANCR ((LPC_CANCR_TypeDef *) LPC_CANCR_BASE ) +#define LPC_CAN1 ((LPC_CAN_TypeDef *) LPC_CAN1_BASE ) +#define LPC_CAN2 ((LPC_CAN_TypeDef *) LPC_CAN2_BASE ) +#define LPC_MCPWM ((LPC_MCPWM_TypeDef *) LPC_MCPWM_BASE ) +#define LPC_QEI ((LPC_QEI_TypeDef *) LPC_QEI_BASE ) +#define LPC_EMAC ((LPC_EMAC_TypeDef *) LPC_EMAC_BASE ) +#define LPC_GPDMA ((LPC_GPDMA_TypeDef *) LPC_GPDMA_BASE ) +#define LPC_GPDMACH0 ((LPC_GPDMACH_TypeDef *) LPC_GPDMACH0_BASE ) +#define LPC_GPDMACH1 ((LPC_GPDMACH_TypeDef *) LPC_GPDMACH1_BASE ) +#define LPC_GPDMACH2 ((LPC_GPDMACH_TypeDef *) LPC_GPDMACH2_BASE ) +#define LPC_GPDMACH3 ((LPC_GPDMACH_TypeDef *) LPC_GPDMACH3_BASE ) +#define LPC_GPDMACH4 ((LPC_GPDMACH_TypeDef *) LPC_GPDMACH4_BASE ) +#define LPC_GPDMACH5 ((LPC_GPDMACH_TypeDef *) LPC_GPDMACH5_BASE ) +#define LPC_GPDMACH6 ((LPC_GPDMACH_TypeDef *) LPC_GPDMACH6_BASE ) +#define LPC_GPDMACH7 ((LPC_GPDMACH_TypeDef *) LPC_GPDMACH7_BASE ) +#define LPC_USB ((LPC_USB_TypeDef *) LPC_USB_BASE ) + +#endif // __LPC17xx_H__ diff --git a/CMSISv2p00_LPC17xx/inc/core_cm3.h b/CMSISv2p00_LPC17xx/inc/core_cm3.h new file mode 100644 index 0000000000000000000000000000000000000000..6b019a48e18b77392c1d737a361076c09db711f4 --- /dev/null +++ b/CMSISv2p00_LPC17xx/inc/core_cm3.h @@ -0,0 +1,1236 @@ +/**************************************************************************//** + * @file core_cm3.h + * @brief CMSIS Cortex-M3 Core Peripheral Access Layer Header File + * @version V2.01 + * @date 06. December 2010 + * + * @note + * Copyright (C) 2009-2010 ARM Limited. All rights reserved. + * + * @par + * ARM Limited (ARM) is supplying this software for use with Cortex-M + * processor based microcontrollers. This file can be freely distributed + * within development tools that are supporting such ARM based processors. + * + * @par + * THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED + * OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. + * ARM SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR + * CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. + * + ******************************************************************************/ +#if defined ( __ICCARM__ ) + #pragma system_include /* treat file as system include file for MISRA check */ +#endif + +#ifdef __cplusplus + extern "C" { +#endif + +#ifndef __CORE_CM3_H_GENERIC +#define __CORE_CM3_H_GENERIC + + +/** \mainpage CMSIS Cortex-M3 + + This documentation describes the CMSIS Cortex-M Core Peripheral Access Layer. + It consists of: + + - Cortex-M Core Register Definitions + - Cortex-M functions + - Cortex-M instructions + + The CMSIS Cortex-M3 Core Peripheral Access Layer contains C and assembly functions that ease + access to the Cortex-M Core + */ + +/** \defgroup CMSIS_LintCinfiguration CMSIS Lint Configuration + List of Lint messages which will be suppressed and not shown: + - not yet checked + . + Note: To re-enable a Message, insert a space before 'lint' * + + */ + + +/******************************************************************************* + * CMSIS definitions + ******************************************************************************/ +/** \defgroup CMSIS_core_definitions CMSIS Core Definitions + This file defines all structures and symbols for CMSIS core: + - CMSIS version number + - Cortex-M core + - Cortex-M core Revision Number + @{ + */ + +/* CMSIS CM3 definitions */ +#define __CM3_CMSIS_VERSION_MAIN (0x02) /*!< [31:16] CMSIS HAL main version */ +#define __CM3_CMSIS_VERSION_SUB (0x00) /*!< [15:0] CMSIS HAL sub version */ +#define __CM3_CMSIS_VERSION ((__CM3_CMSIS_VERSION_MAIN << 16) | __CM3_CMSIS_VERSION_SUB) /*!< CMSIS HAL version number */ + +#define __CORTEX_M (0x03) /*!< Cortex core */ + + +#if defined ( __CC_ARM ) + #define __ASM __asm /*!< asm keyword for ARM Compiler */ + #define __INLINE __inline /*!< inline keyword for ARM Compiler */ + +#elif defined ( __ICCARM__ ) + #define __ASM __asm /*!< asm keyword for IAR Compiler */ + #define __INLINE inline /*!< inline keyword for IAR Compiler. Only avaiable in High optimization mode! */ + +#elif defined ( __GNUC__ ) + #define __ASM __asm /*!< asm keyword for GNU Compiler */ + #define __INLINE inline /*!< inline keyword for GNU Compiler */ + +#elif defined ( __TASKING__ ) + #define __ASM __asm /*!< asm keyword for TASKING Compiler */ + #define __INLINE inline /*!< inline keyword for TASKING Compiler */ + +#endif + +#include <stdint.h> /*!< standard types definitions */ +#include "core_cmInstr.h" /*!< Core Instruction Access */ +#include "core_cmFunc.h" /*!< Core Function Access */ + +#endif /* __CORE_CM3_H_GENERIC */ + + +#ifndef __CMSIS_GENERIC + +#ifndef __CORE_CM3_H_DEPENDANT +#define __CORE_CM3_H_DEPENDANT + +/* IO definitions (access restrictions to peripheral registers) */ +#ifdef __cplusplus + #define __I volatile /*!< defines 'read only' permissions */ +#else + #define __I volatile const /*!< defines 'read only' permissions */ +#endif +#define __O volatile /*!< defines 'write only' permissions */ +#define __IO volatile /*!< defines 'read / write' permissions */ + +/*@} end of group CMSIS_core_definitions */ + + + +/******************************************************************************* + * Register Abstraction + ******************************************************************************/ +/** \defgroup CMSIS_core_register CMSIS Core Register + Core Register contain: + - Core Register + - Core NVIC Register + - Core SCB Register + - Core SysTick Register + - Core Debug Register + - Core MPU Register +*/ + +/** \ingroup CMSIS_core_register + \defgroup CMSIS_CORE CMSIS Core + Type definitions for the Cortex-M Core Registers + @{ + */ + +/** \brief Union type to access the Application Program Status Register (APSR). + */ +typedef union +{ + struct + { +#if (__CORTEX_M != 0x04) + uint32_t _reserved0:27; /*!< bit: 0..26 Reserved */ +#else + uint32_t _reserved0:16; /*!< bit: 0..15 Reserved */ + uint32_t GE:4; /*!< bit: 16..19 Greater than or Equal flags */ + uint32_t _reserved1:7; /*!< bit: 20..26 Reserved */ +#endif + uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ + uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ + uint32_t C:1; /*!< bit: 29 Carry condition code flag */ + uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ + uint32_t N:1; /*!< bit: 31 Negative condition code flag */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} APSR_Type; + + +/** \brief Union type to access the Interrupt Program Status Register (IPSR). + */ +typedef union +{ + struct + { + uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ + uint32_t _reserved0:23; /*!< bit: 9..31 Reserved */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} IPSR_Type; + + +/** \brief Union type to access the Special-Purpose Program Status Registers (xPSR). + */ +typedef union +{ + struct + { + uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ +#if (__CORTEX_M != 0x04) + uint32_t _reserved0:15; /*!< bit: 9..23 Reserved */ +#else + uint32_t _reserved0:7; /*!< bit: 9..15 Reserved */ + uint32_t GE:4; /*!< bit: 16..19 Greater than or Equal flags */ + uint32_t _reserved1:4; /*!< bit: 20..23 Reserved */ +#endif + uint32_t T:1; /*!< bit: 24 Thumb bit (read 0) */ + uint32_t IT:2; /*!< bit: 25..26 saved IT state (read 0) */ + uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ + uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ + uint32_t C:1; /*!< bit: 29 Carry condition code flag */ + uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ + uint32_t N:1; /*!< bit: 31 Negative condition code flag */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} xPSR_Type; + + +/** \brief Union type to access the Control Registers (CONTROL). + */ +typedef union +{ + struct + { + uint32_t nPRIV:1; /*!< bit: 0 Execution privilege in Thread mode */ + uint32_t SPSEL:1; /*!< bit: 1 Stack to be used */ + uint32_t FPCA:1; /*!< bit: 2 FP extension active flag */ + uint32_t _reserved0:29; /*!< bit: 3..31 Reserved */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} CONTROL_Type; + +/*@} end of group CMSIS_CORE */ + + +/** \ingroup CMSIS_core_register + \defgroup CMSIS_NVIC CMSIS NVIC + Type definitions for the Cortex-M NVIC Registers + @{ + */ + +/** \brief Structure type to access the Nested Vectored Interrupt Controller (NVIC). + */ +typedef struct +{ + __IO uint32_t ISER[8]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */ + uint32_t RESERVED0[24]; + __IO uint32_t ICER[8]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register */ + uint32_t RSERVED1[24]; + __IO uint32_t ISPR[8]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */ + uint32_t RESERVED2[24]; + __IO uint32_t ICPR[8]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */ + uint32_t RESERVED3[24]; + __IO uint32_t IABR[8]; /*!< Offset: 0x200 (R/W) Interrupt Active bit Register */ + uint32_t RESERVED4[56]; + __IO uint8_t IP[240]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register (8Bit wide) */ + uint32_t RESERVED5[644]; + __O uint32_t STIR; /*!< Offset: 0xE00 ( /W) Software Trigger Interrupt Register */ +} NVIC_Type; + +/*@} end of group CMSIS_NVIC */ + + +/** \ingroup CMSIS_core_register + \defgroup CMSIS_SCB CMSIS SCB + Type definitions for the Cortex-M System Control Block Registers + @{ + */ + +/** \brief Structure type to access the System Control Block (SCB). + */ +typedef struct +{ + __I uint32_t CPUID; /*!< Offset: 0x000 (R/ ) CPU ID Base Register */ + __IO uint32_t ICSR; /*!< Offset: 0x004 (R/W) Interrupt Control State Register */ + __IO uint32_t VTOR; /*!< Offset: 0x008 (R/W) Vector Table Offset Register */ + __IO uint32_t AIRCR; /*!< Offset: 0x00C (R/W) Application Interrupt / Reset Control Register */ + __IO uint32_t SCR; /*!< Offset: 0x010 (R/W) System Control Register */ + __IO uint32_t CCR; /*!< Offset: 0x014 (R/W) Configuration Control Register */ + __IO uint8_t SHP[12]; /*!< Offset: 0x018 (R/W) System Handlers Priority Registers (4-7, 8-11, 12-15) */ + __IO uint32_t SHCSR; /*!< Offset: 0x024 (R/W) System Handler Control and State Register */ + __IO uint32_t CFSR; /*!< Offset: 0x028 (R/W) Configurable Fault Status Register */ + __IO uint32_t HFSR; /*!< Offset: 0x02C (R/W) Hard Fault Status Register */ + __IO uint32_t DFSR; /*!< Offset: 0x030 (R/W) Debug Fault Status Register */ + __IO uint32_t MMFAR; /*!< Offset: 0x034 (R/W) Mem Manage Address Register */ + __IO uint32_t BFAR; /*!< Offset: 0x038 (R/W) Bus Fault Address Register */ + __IO uint32_t AFSR; /*!< Offset: 0x03C (R/W) Auxiliary Fault Status Register */ + __I uint32_t PFR[2]; /*!< Offset: 0x040 (R/ ) Processor Feature Register */ + __I uint32_t DFR; /*!< Offset: 0x048 (R/ ) Debug Feature Register */ + __I uint32_t ADR; /*!< Offset: 0x04C (R/ ) Auxiliary Feature Register */ + __I uint32_t MMFR[4]; /*!< Offset: 0x050 (R/ ) Memory Model Feature Register */ + __I uint32_t ISAR[5]; /*!< Offset: 0x060 (R/ ) ISA Feature Register */ +} SCB_Type; + +/* SCB CPUID Register Definitions */ +#define SCB_CPUID_IMPLEMENTER_Pos 24 /*!< SCB CPUID: IMPLEMENTER Position */ +#define SCB_CPUID_IMPLEMENTER_Msk (0xFFUL << SCB_CPUID_IMPLEMENTER_Pos) /*!< SCB CPUID: IMPLEMENTER Mask */ + +#define SCB_CPUID_VARIANT_Pos 20 /*!< SCB CPUID: VARIANT Position */ +#define SCB_CPUID_VARIANT_Msk (0xFUL << SCB_CPUID_VARIANT_Pos) /*!< SCB CPUID: VARIANT Mask */ + +#define SCB_CPUID_PARTNO_Pos 4 /*!< SCB CPUID: PARTNO Position */ +#define SCB_CPUID_PARTNO_Msk (0xFFFUL << SCB_CPUID_PARTNO_Pos) /*!< SCB CPUID: PARTNO Mask */ + +#define SCB_CPUID_REVISION_Pos 0 /*!< SCB CPUID: REVISION Position */ +#define SCB_CPUID_REVISION_Msk (0xFUL << SCB_CPUID_REVISION_Pos) /*!< SCB CPUID: REVISION Mask */ + +/* SCB Interrupt Control State Register Definitions */ +#define SCB_ICSR_NMIPENDSET_Pos 31 /*!< SCB ICSR: NMIPENDSET Position */ +#define SCB_ICSR_NMIPENDSET_Msk (1UL << SCB_ICSR_NMIPENDSET_Pos) /*!< SCB ICSR: NMIPENDSET Mask */ + +#define SCB_ICSR_PENDSVSET_Pos 28 /*!< SCB ICSR: PENDSVSET Position */ +#define SCB_ICSR_PENDSVSET_Msk (1UL << SCB_ICSR_PENDSVSET_Pos) /*!< SCB ICSR: PENDSVSET Mask */ + +#define SCB_ICSR_PENDSVCLR_Pos 27 /*!< SCB ICSR: PENDSVCLR Position */ +#define SCB_ICSR_PENDSVCLR_Msk (1UL << SCB_ICSR_PENDSVCLR_Pos) /*!< SCB ICSR: PENDSVCLR Mask */ + +#define SCB_ICSR_PENDSTSET_Pos 26 /*!< SCB ICSR: PENDSTSET Position */ +#define SCB_ICSR_PENDSTSET_Msk (1UL << SCB_ICSR_PENDSTSET_Pos) /*!< SCB ICSR: PENDSTSET Mask */ + +#define SCB_ICSR_PENDSTCLR_Pos 25 /*!< SCB ICSR: PENDSTCLR Position */ +#define SCB_ICSR_PENDSTCLR_Msk (1UL << SCB_ICSR_PENDSTCLR_Pos) /*!< SCB ICSR: PENDSTCLR Mask */ + +#define SCB_ICSR_ISRPREEMPT_Pos 23 /*!< SCB ICSR: ISRPREEMPT Position */ +#define SCB_ICSR_ISRPREEMPT_Msk (1UL << SCB_ICSR_ISRPREEMPT_Pos) /*!< SCB ICSR: ISRPREEMPT Mask */ + +#define SCB_ICSR_ISRPENDING_Pos 22 /*!< SCB ICSR: ISRPENDING Position */ +#define SCB_ICSR_ISRPENDING_Msk (1UL << SCB_ICSR_ISRPENDING_Pos) /*!< SCB ICSR: ISRPENDING Mask */ + +#define SCB_ICSR_VECTPENDING_Pos 12 /*!< SCB ICSR: VECTPENDING Position */ +#define SCB_ICSR_VECTPENDING_Msk (0x1FFUL << SCB_ICSR_VECTPENDING_Pos) /*!< SCB ICSR: VECTPENDING Mask */ + +#define SCB_ICSR_RETTOBASE_Pos 11 /*!< SCB ICSR: RETTOBASE Position */ +#define SCB_ICSR_RETTOBASE_Msk (1UL << SCB_ICSR_RETTOBASE_Pos) /*!< SCB ICSR: RETTOBASE Mask */ + +#define SCB_ICSR_VECTACTIVE_Pos 0 /*!< SCB ICSR: VECTACTIVE Position */ +#define SCB_ICSR_VECTACTIVE_Msk (0x1FFUL << SCB_ICSR_VECTACTIVE_Pos) /*!< SCB ICSR: VECTACTIVE Mask */ + +/* SCB Interrupt Control State Register Definitions */ +#define SCB_VTOR_TBLBASE_Pos 29 /*!< SCB VTOR: TBLBASE Position */ +#define SCB_VTOR_TBLBASE_Msk (1UL << SCB_VTOR_TBLBASE_Pos) /*!< SCB VTOR: TBLBASE Mask */ + +#define SCB_VTOR_TBLOFF_Pos 7 /*!< SCB VTOR: TBLOFF Position */ +#define SCB_VTOR_TBLOFF_Msk (0x3FFFFFUL << SCB_VTOR_TBLOFF_Pos) /*!< SCB VTOR: TBLOFF Mask */ + +/* SCB Application Interrupt and Reset Control Register Definitions */ +#define SCB_AIRCR_VECTKEY_Pos 16 /*!< SCB AIRCR: VECTKEY Position */ +#define SCB_AIRCR_VECTKEY_Msk (0xFFFFUL << SCB_AIRCR_VECTKEY_Pos) /*!< SCB AIRCR: VECTKEY Mask */ + +#define SCB_AIRCR_VECTKEYSTAT_Pos 16 /*!< SCB AIRCR: VECTKEYSTAT Position */ +#define SCB_AIRCR_VECTKEYSTAT_Msk (0xFFFFUL << SCB_AIRCR_VECTKEYSTAT_Pos) /*!< SCB AIRCR: VECTKEYSTAT Mask */ + +#define SCB_AIRCR_ENDIANESS_Pos 15 /*!< SCB AIRCR: ENDIANESS Position */ +#define SCB_AIRCR_ENDIANESS_Msk (1UL << SCB_AIRCR_ENDIANESS_Pos) /*!< SCB AIRCR: ENDIANESS Mask */ + +#define SCB_AIRCR_PRIGROUP_Pos 8 /*!< SCB AIRCR: PRIGROUP Position */ +#define SCB_AIRCR_PRIGROUP_Msk (7UL << SCB_AIRCR_PRIGROUP_Pos) /*!< SCB AIRCR: PRIGROUP Mask */ + +#define SCB_AIRCR_SYSRESETREQ_Pos 2 /*!< SCB AIRCR: SYSRESETREQ Position */ +#define SCB_AIRCR_SYSRESETREQ_Msk (1UL << SCB_AIRCR_SYSRESETREQ_Pos) /*!< SCB AIRCR: SYSRESETREQ Mask */ + +#define SCB_AIRCR_VECTCLRACTIVE_Pos 1 /*!< SCB AIRCR: VECTCLRACTIVE Position */ +#define SCB_AIRCR_VECTCLRACTIVE_Msk (1UL << SCB_AIRCR_VECTCLRACTIVE_Pos) /*!< SCB AIRCR: VECTCLRACTIVE Mask */ + +#define SCB_AIRCR_VECTRESET_Pos 0 /*!< SCB AIRCR: VECTRESET Position */ +#define SCB_AIRCR_VECTRESET_Msk (1UL << SCB_AIRCR_VECTRESET_Pos) /*!< SCB AIRCR: VECTRESET Mask */ + +/* SCB System Control Register Definitions */ +#define SCB_SCR_SEVONPEND_Pos 4 /*!< SCB SCR: SEVONPEND Position */ +#define SCB_SCR_SEVONPEND_Msk (1UL << SCB_SCR_SEVONPEND_Pos) /*!< SCB SCR: SEVONPEND Mask */ + +#define SCB_SCR_SLEEPDEEP_Pos 2 /*!< SCB SCR: SLEEPDEEP Position */ +#define SCB_SCR_SLEEPDEEP_Msk (1UL << SCB_SCR_SLEEPDEEP_Pos) /*!< SCB SCR: SLEEPDEEP Mask */ + +#define SCB_SCR_SLEEPONEXIT_Pos 1 /*!< SCB SCR: SLEEPONEXIT Position */ +#define SCB_SCR_SLEEPONEXIT_Msk (1UL << SCB_SCR_SLEEPONEXIT_Pos) /*!< SCB SCR: SLEEPONEXIT Mask */ + +/* SCB Configuration Control Register Definitions */ +#define SCB_CCR_STKALIGN_Pos 9 /*!< SCB CCR: STKALIGN Position */ +#define SCB_CCR_STKALIGN_Msk (1UL << SCB_CCR_STKALIGN_Pos) /*!< SCB CCR: STKALIGN Mask */ + +#define SCB_CCR_BFHFNMIGN_Pos 8 /*!< SCB CCR: BFHFNMIGN Position */ +#define SCB_CCR_BFHFNMIGN_Msk (1UL << SCB_CCR_BFHFNMIGN_Pos) /*!< SCB CCR: BFHFNMIGN Mask */ + +#define SCB_CCR_DIV_0_TRP_Pos 4 /*!< SCB CCR: DIV_0_TRP Position */ +#define SCB_CCR_DIV_0_TRP_Msk (1UL << SCB_CCR_DIV_0_TRP_Pos) /*!< SCB CCR: DIV_0_TRP Mask */ + +#define SCB_CCR_UNALIGN_TRP_Pos 3 /*!< SCB CCR: UNALIGN_TRP Position */ +#define SCB_CCR_UNALIGN_TRP_Msk (1UL << SCB_CCR_UNALIGN_TRP_Pos) /*!< SCB CCR: UNALIGN_TRP Mask */ + +#define SCB_CCR_USERSETMPEND_Pos 1 /*!< SCB CCR: USERSETMPEND Position */ +#define SCB_CCR_USERSETMPEND_Msk (1UL << SCB_CCR_USERSETMPEND_Pos) /*!< SCB CCR: USERSETMPEND Mask */ + +#define SCB_CCR_NONBASETHRDENA_Pos 0 /*!< SCB CCR: NONBASETHRDENA Position */ +#define SCB_CCR_NONBASETHRDENA_Msk (1UL << SCB_CCR_NONBASETHRDENA_Pos) /*!< SCB CCR: NONBASETHRDENA Mask */ + +/* SCB System Handler Control and State Register Definitions */ +#define SCB_SHCSR_USGFAULTENA_Pos 18 /*!< SCB SHCSR: USGFAULTENA Position */ +#define SCB_SHCSR_USGFAULTENA_Msk (1UL << SCB_SHCSR_USGFAULTENA_Pos) /*!< SCB SHCSR: USGFAULTENA Mask */ + +#define SCB_SHCSR_BUSFAULTENA_Pos 17 /*!< SCB SHCSR: BUSFAULTENA Position */ +#define SCB_SHCSR_BUSFAULTENA_Msk (1UL << SCB_SHCSR_BUSFAULTENA_Pos) /*!< SCB SHCSR: BUSFAULTENA Mask */ + +#define SCB_SHCSR_MEMFAULTENA_Pos 16 /*!< SCB SHCSR: MEMFAULTENA Position */ +#define SCB_SHCSR_MEMFAULTENA_Msk (1UL << SCB_SHCSR_MEMFAULTENA_Pos) /*!< SCB SHCSR: MEMFAULTENA Mask */ + +#define SCB_SHCSR_SVCALLPENDED_Pos 15 /*!< SCB SHCSR: SVCALLPENDED Position */ +#define SCB_SHCSR_SVCALLPENDED_Msk (1UL << SCB_SHCSR_SVCALLPENDED_Pos) /*!< SCB SHCSR: SVCALLPENDED Mask */ + +#define SCB_SHCSR_BUSFAULTPENDED_Pos 14 /*!< SCB SHCSR: BUSFAULTPENDED Position */ +#define SCB_SHCSR_BUSFAULTPENDED_Msk (1UL << SCB_SHCSR_BUSFAULTPENDED_Pos) /*!< SCB SHCSR: BUSFAULTPENDED Mask */ + +#define SCB_SHCSR_MEMFAULTPENDED_Pos 13 /*!< SCB SHCSR: MEMFAULTPENDED Position */ +#define SCB_SHCSR_MEMFAULTPENDED_Msk (1UL << SCB_SHCSR_MEMFAULTPENDED_Pos) /*!< SCB SHCSR: MEMFAULTPENDED Mask */ + +#define SCB_SHCSR_USGFAULTPENDED_Pos 12 /*!< SCB SHCSR: USGFAULTPENDED Position */ +#define SCB_SHCSR_USGFAULTPENDED_Msk (1UL << SCB_SHCSR_USGFAULTPENDED_Pos) /*!< SCB SHCSR: USGFAULTPENDED Mask */ + +#define SCB_SHCSR_SYSTICKACT_Pos 11 /*!< SCB SHCSR: SYSTICKACT Position */ +#define SCB_SHCSR_SYSTICKACT_Msk (1UL << SCB_SHCSR_SYSTICKACT_Pos) /*!< SCB SHCSR: SYSTICKACT Mask */ + +#define SCB_SHCSR_PENDSVACT_Pos 10 /*!< SCB SHCSR: PENDSVACT Position */ +#define SCB_SHCSR_PENDSVACT_Msk (1UL << SCB_SHCSR_PENDSVACT_Pos) /*!< SCB SHCSR: PENDSVACT Mask */ + +#define SCB_SHCSR_MONITORACT_Pos 8 /*!< SCB SHCSR: MONITORACT Position */ +#define SCB_SHCSR_MONITORACT_Msk (1UL << SCB_SHCSR_MONITORACT_Pos) /*!< SCB SHCSR: MONITORACT Mask */ + +#define SCB_SHCSR_SVCALLACT_Pos 7 /*!< SCB SHCSR: SVCALLACT Position */ +#define SCB_SHCSR_SVCALLACT_Msk (1UL << SCB_SHCSR_SVCALLACT_Pos) /*!< SCB SHCSR: SVCALLACT Mask */ + +#define SCB_SHCSR_USGFAULTACT_Pos 3 /*!< SCB SHCSR: USGFAULTACT Position */ +#define SCB_SHCSR_USGFAULTACT_Msk (1UL << SCB_SHCSR_USGFAULTACT_Pos) /*!< SCB SHCSR: USGFAULTACT Mask */ + +#define SCB_SHCSR_BUSFAULTACT_Pos 1 /*!< SCB SHCSR: BUSFAULTACT Position */ +#define SCB_SHCSR_BUSFAULTACT_Msk (1UL << SCB_SHCSR_BUSFAULTACT_Pos) /*!< SCB SHCSR: BUSFAULTACT Mask */ + +#define SCB_SHCSR_MEMFAULTACT_Pos 0 /*!< SCB SHCSR: MEMFAULTACT Position */ +#define SCB_SHCSR_MEMFAULTACT_Msk (1UL << SCB_SHCSR_MEMFAULTACT_Pos) /*!< SCB SHCSR: MEMFAULTACT Mask */ + +/* SCB Configurable Fault Status Registers Definitions */ +#define SCB_CFSR_USGFAULTSR_Pos 16 /*!< SCB CFSR: Usage Fault Status Register Position */ +#define SCB_CFSR_USGFAULTSR_Msk (0xFFFFUL << SCB_CFSR_USGFAULTSR_Pos) /*!< SCB CFSR: Usage Fault Status Register Mask */ + +#define SCB_CFSR_BUSFAULTSR_Pos 8 /*!< SCB CFSR: Bus Fault Status Register Position */ +#define SCB_CFSR_BUSFAULTSR_Msk (0xFFUL << SCB_CFSR_BUSFAULTSR_Pos) /*!< SCB CFSR: Bus Fault Status Register Mask */ + +#define SCB_CFSR_MEMFAULTSR_Pos 0 /*!< SCB CFSR: Memory Manage Fault Status Register Position */ +#define SCB_CFSR_MEMFAULTSR_Msk (0xFFUL << SCB_CFSR_MEMFAULTSR_Pos) /*!< SCB CFSR: Memory Manage Fault Status Register Mask */ + +/* SCB Hard Fault Status Registers Definitions */ +#define SCB_HFSR_DEBUGEVT_Pos 31 /*!< SCB HFSR: DEBUGEVT Position */ +#define SCB_HFSR_DEBUGEVT_Msk (1UL << SCB_HFSR_DEBUGEVT_Pos) /*!< SCB HFSR: DEBUGEVT Mask */ + +#define SCB_HFSR_FORCED_Pos 30 /*!< SCB HFSR: FORCED Position */ +#define SCB_HFSR_FORCED_Msk (1UL << SCB_HFSR_FORCED_Pos) /*!< SCB HFSR: FORCED Mask */ + +#define SCB_HFSR_VECTTBL_Pos 1 /*!< SCB HFSR: VECTTBL Position */ +#define SCB_HFSR_VECTTBL_Msk (1UL << SCB_HFSR_VECTTBL_Pos) /*!< SCB HFSR: VECTTBL Mask */ + +/* SCB Debug Fault Status Register Definitions */ +#define SCB_DFSR_EXTERNAL_Pos 4 /*!< SCB DFSR: EXTERNAL Position */ +#define SCB_DFSR_EXTERNAL_Msk (1UL << SCB_DFSR_EXTERNAL_Pos) /*!< SCB DFSR: EXTERNAL Mask */ + +#define SCB_DFSR_VCATCH_Pos 3 /*!< SCB DFSR: VCATCH Position */ +#define SCB_DFSR_VCATCH_Msk (1UL << SCB_DFSR_VCATCH_Pos) /*!< SCB DFSR: VCATCH Mask */ + +#define SCB_DFSR_DWTTRAP_Pos 2 /*!< SCB DFSR: DWTTRAP Position */ +#define SCB_DFSR_DWTTRAP_Msk (1UL << SCB_DFSR_DWTTRAP_Pos) /*!< SCB DFSR: DWTTRAP Mask */ + +#define SCB_DFSR_BKPT_Pos 1 /*!< SCB DFSR: BKPT Position */ +#define SCB_DFSR_BKPT_Msk (1UL << SCB_DFSR_BKPT_Pos) /*!< SCB DFSR: BKPT Mask */ + +#define SCB_DFSR_HALTED_Pos 0 /*!< SCB DFSR: HALTED Position */ +#define SCB_DFSR_HALTED_Msk (1UL << SCB_DFSR_HALTED_Pos) /*!< SCB DFSR: HALTED Mask */ + +/*@} end of group CMSIS_SCB */ + + +/** \ingroup CMSIS_core_register + \defgroup CMSIS_SysTick CMSIS SysTick + Type definitions for the Cortex-M System Timer Registers + @{ + */ + +/** \brief Structure type to access the System Timer (SysTick). + */ +typedef struct +{ + __IO uint32_t CTRL; /*!< Offset: 0x000 (R/W) SysTick Control and Status Register */ + __IO uint32_t LOAD; /*!< Offset: 0x004 (R/W) SysTick Reload Value Register */ + __IO uint32_t VAL; /*!< Offset: 0x008 (R/W) SysTick Current Value Register */ + __I uint32_t CALIB; /*!< Offset: 0x00C (R/ ) SysTick Calibration Register */ +} SysTick_Type; + +/* SysTick Control / Status Register Definitions */ +#define SysTick_CTRL_COUNTFLAG_Pos 16 /*!< SysTick CTRL: COUNTFLAG Position */ +#define SysTick_CTRL_COUNTFLAG_Msk (1UL << SysTick_CTRL_COUNTFLAG_Pos) /*!< SysTick CTRL: COUNTFLAG Mask */ + +#define SysTick_CTRL_CLKSOURCE_Pos 2 /*!< SysTick CTRL: CLKSOURCE Position */ +#define SysTick_CTRL_CLKSOURCE_Msk (1UL << SysTick_CTRL_CLKSOURCE_Pos) /*!< SysTick CTRL: CLKSOURCE Mask */ + +#define SysTick_CTRL_TICKINT_Pos 1 /*!< SysTick CTRL: TICKINT Position */ +#define SysTick_CTRL_TICKINT_Msk (1UL << SysTick_CTRL_TICKINT_Pos) /*!< SysTick CTRL: TICKINT Mask */ + +#define SysTick_CTRL_ENABLE_Pos 0 /*!< SysTick CTRL: ENABLE Position */ +#define SysTick_CTRL_ENABLE_Msk (1UL << SysTick_CTRL_ENABLE_Pos) /*!< SysTick CTRL: ENABLE Mask */ + +/* SysTick Reload Register Definitions */ +#define SysTick_LOAD_RELOAD_Pos 0 /*!< SysTick LOAD: RELOAD Position */ +#define SysTick_LOAD_RELOAD_Msk (0xFFFFFFUL << SysTick_LOAD_RELOAD_Pos) /*!< SysTick LOAD: RELOAD Mask */ + +/* SysTick Current Register Definitions */ +#define SysTick_VAL_CURRENT_Pos 0 /*!< SysTick VAL: CURRENT Position */ +#define SysTick_VAL_CURRENT_Msk (0xFFFFFFUL << SysTick_VAL_CURRENT_Pos) /*!< SysTick VAL: CURRENT Mask */ + +/* SysTick Calibration Register Definitions */ +#define SysTick_CALIB_NOREF_Pos 31 /*!< SysTick CALIB: NOREF Position */ +#define SysTick_CALIB_NOREF_Msk (1UL << SysTick_CALIB_NOREF_Pos) /*!< SysTick CALIB: NOREF Mask */ + +#define SysTick_CALIB_SKEW_Pos 30 /*!< SysTick CALIB: SKEW Position */ +#define SysTick_CALIB_SKEW_Msk (1UL << SysTick_CALIB_SKEW_Pos) /*!< SysTick CALIB: SKEW Mask */ + +#define SysTick_CALIB_TENMS_Pos 0 /*!< SysTick CALIB: TENMS Position */ +#define SysTick_CALIB_TENMS_Msk (0xFFFFFFUL << SysTick_VAL_CURRENT_Pos) /*!< SysTick CALIB: TENMS Mask */ + +/*@} end of group CMSIS_SysTick */ + + +/** \ingroup CMSIS_core_register + \defgroup CMSIS_ITM CMSIS ITM + Type definitions for the Cortex-M Instrumentation Trace Macrocell (ITM) + @{ + */ + +/** \brief Structure type to access the Instrumentation Trace Macrocell Register (ITM). + */ +typedef struct +{ + __O union + { + __O uint8_t u8; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 8-bit */ + __O uint16_t u16; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 16-bit */ + __O uint32_t u32; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 32-bit */ + } PORT [32]; /*!< Offset: 0x000 ( /W) ITM Stimulus Port Registers */ + uint32_t RESERVED0[864]; + __IO uint32_t TER; /*!< Offset: (R/W) ITM Trace Enable Register */ + uint32_t RESERVED1[15]; + __IO uint32_t TPR; /*!< Offset: (R/W) ITM Trace Privilege Register */ + uint32_t RESERVED2[15]; + __IO uint32_t TCR; /*!< Offset: (R/W) ITM Trace Control Register */ + uint32_t RESERVED3[29]; + __IO uint32_t IWR; /*!< Offset: (R/W) ITM Integration Write Register */ + __IO uint32_t IRR; /*!< Offset: (R/W) ITM Integration Read Register */ + __IO uint32_t IMCR; /*!< Offset: (R/W) ITM Integration Mode Control Register */ + uint32_t RESERVED4[43]; + __IO uint32_t LAR; /*!< Offset: (R/W) ITM Lock Access Register */ + __IO uint32_t LSR; /*!< Offset: (R/W) ITM Lock Status Register */ + uint32_t RESERVED5[6]; + __I uint32_t PID4; /*!< Offset: (R/ ) ITM Peripheral Identification Register #4 */ + __I uint32_t PID5; /*!< Offset: (R/ ) ITM Peripheral Identification Register #5 */ + __I uint32_t PID6; /*!< Offset: (R/ ) ITM Peripheral Identification Register #6 */ + __I uint32_t PID7; /*!< Offset: (R/ ) ITM Peripheral Identification Register #7 */ + __I uint32_t PID0; /*!< Offset: (R/ ) ITM Peripheral Identification Register #0 */ + __I uint32_t PID1; /*!< Offset: (R/ ) ITM Peripheral Identification Register #1 */ + __I uint32_t PID2; /*!< Offset: (R/ ) ITM Peripheral Identification Register #2 */ + __I uint32_t PID3; /*!< Offset: (R/ ) ITM Peripheral Identification Register #3 */ + __I uint32_t CID0; /*!< Offset: (R/ ) ITM Component Identification Register #0 */ + __I uint32_t CID1; /*!< Offset: (R/ ) ITM Component Identification Register #1 */ + __I uint32_t CID2; /*!< Offset: (R/ ) ITM Component Identification Register #2 */ + __I uint32_t CID3; /*!< Offset: (R/ ) ITM Component Identification Register #3 */ +} ITM_Type; + +/* ITM Trace Privilege Register Definitions */ +#define ITM_TPR_PRIVMASK_Pos 0 /*!< ITM TPR: PRIVMASK Position */ +#define ITM_TPR_PRIVMASK_Msk (0xFUL << ITM_TPR_PRIVMASK_Pos) /*!< ITM TPR: PRIVMASK Mask */ + +/* ITM Trace Control Register Definitions */ +#define ITM_TCR_BUSY_Pos 23 /*!< ITM TCR: BUSY Position */ +#define ITM_TCR_BUSY_Msk (1UL << ITM_TCR_BUSY_Pos) /*!< ITM TCR: BUSY Mask */ + +#define ITM_TCR_ATBID_Pos 16 /*!< ITM TCR: ATBID Position */ +#define ITM_TCR_ATBID_Msk (0x7FUL << ITM_TCR_ATBID_Pos) /*!< ITM TCR: ATBID Mask */ + +#define ITM_TCR_TSPrescale_Pos 8 /*!< ITM TCR: TSPrescale Position */ +#define ITM_TCR_TSPrescale_Msk (3UL << ITM_TCR_TSPrescale_Pos) /*!< ITM TCR: TSPrescale Mask */ + +#define ITM_TCR_SWOENA_Pos 4 /*!< ITM TCR: SWOENA Position */ +#define ITM_TCR_SWOENA_Msk (1UL << ITM_TCR_SWOENA_Pos) /*!< ITM TCR: SWOENA Mask */ + +#define ITM_TCR_DWTENA_Pos 3 /*!< ITM TCR: DWTENA Position */ +#define ITM_TCR_DWTENA_Msk (1UL << ITM_TCR_DWTENA_Pos) /*!< ITM TCR: DWTENA Mask */ + +#define ITM_TCR_SYNCENA_Pos 2 /*!< ITM TCR: SYNCENA Position */ +#define ITM_TCR_SYNCENA_Msk (1UL << ITM_TCR_SYNCENA_Pos) /*!< ITM TCR: SYNCENA Mask */ + +#define ITM_TCR_TSENA_Pos 1 /*!< ITM TCR: TSENA Position */ +#define ITM_TCR_TSENA_Msk (1UL << ITM_TCR_TSENA_Pos) /*!< ITM TCR: TSENA Mask */ + +#define ITM_TCR_ITMENA_Pos 0 /*!< ITM TCR: ITM Enable bit Position */ +#define ITM_TCR_ITMENA_Msk (1UL << ITM_TCR_ITMENA_Pos) /*!< ITM TCR: ITM Enable bit Mask */ + +/* ITM Integration Write Register Definitions */ +#define ITM_IWR_ATVALIDM_Pos 0 /*!< ITM IWR: ATVALIDM Position */ +#define ITM_IWR_ATVALIDM_Msk (1UL << ITM_IWR_ATVALIDM_Pos) /*!< ITM IWR: ATVALIDM Mask */ + +/* ITM Integration Read Register Definitions */ +#define ITM_IRR_ATREADYM_Pos 0 /*!< ITM IRR: ATREADYM Position */ +#define ITM_IRR_ATREADYM_Msk (1UL << ITM_IRR_ATREADYM_Pos) /*!< ITM IRR: ATREADYM Mask */ + +/* ITM Integration Mode Control Register Definitions */ +#define ITM_IMCR_INTEGRATION_Pos 0 /*!< ITM IMCR: INTEGRATION Position */ +#define ITM_IMCR_INTEGRATION_Msk (1UL << ITM_IMCR_INTEGRATION_Pos) /*!< ITM IMCR: INTEGRATION Mask */ + +/* ITM Lock Status Register Definitions */ +#define ITM_LSR_ByteAcc_Pos 2 /*!< ITM LSR: ByteAcc Position */ +#define ITM_LSR_ByteAcc_Msk (1UL << ITM_LSR_ByteAcc_Pos) /*!< ITM LSR: ByteAcc Mask */ + +#define ITM_LSR_Access_Pos 1 /*!< ITM LSR: Access Position */ +#define ITM_LSR_Access_Msk (1UL << ITM_LSR_Access_Pos) /*!< ITM LSR: Access Mask */ + +#define ITM_LSR_Present_Pos 0 /*!< ITM LSR: Present Position */ +#define ITM_LSR_Present_Msk (1UL << ITM_LSR_Present_Pos) /*!< ITM LSR: Present Mask */ + +/*@}*/ /* end of group CMSIS_ITM */ + + +/** \ingroup CMSIS_core_register + \defgroup CMSIS_InterruptType CMSIS Interrupt Type + Type definitions for the Cortex-M Interrupt Type Register + @{ + */ + +/** \brief Structure type to access the Interrupt Type Register. + */ +typedef struct +{ + uint32_t RESERVED0; + __I uint32_t ICTR; /*!< Offset: 0x004 (R/ ) Interrupt Control Type Register */ +#if ((defined __CM3_REV) && (__CM3_REV >= 0x200)) + __IO uint32_t ACTLR; /*!< Offset: 0x008 (R/W) Auxiliary Control Register */ +#else + uint32_t RESERVED1; +#endif +} InterruptType_Type; + +/* Interrupt Controller Type Register Definitions */ +#define IntType_ICTR_INTLINESNUM_Pos 0 /*!< InterruptType ICTR: INTLINESNUM Position */ +#define IntType_ICTR_INTLINESNUM_Msk (0x1FUL << IntType_ICTR_INTLINESNUM_Pos) /*!< InterruptType ICTR: INTLINESNUM Mask */ + +/* Auxiliary Control Register Definitions */ +#define IntType_ACTLR_DISFOLD_Pos 2 /*!< InterruptType ACTLR: DISFOLD Position */ +#define IntType_ACTLR_DISFOLD_Msk (1UL << IntType_ACTLR_DISFOLD_Pos) /*!< InterruptType ACTLR: DISFOLD Mask */ + +#define IntType_ACTLR_DISDEFWBUF_Pos 1 /*!< InterruptType ACTLR: DISDEFWBUF Position */ +#define IntType_ACTLR_DISDEFWBUF_Msk (1UL << IntType_ACTLR_DISDEFWBUF_Pos) /*!< InterruptType ACTLR: DISDEFWBUF Mask */ + +#define IntType_ACTLR_DISMCYCINT_Pos 0 /*!< InterruptType ACTLR: DISMCYCINT Position */ +#define IntType_ACTLR_DISMCYCINT_Msk (1UL << IntType_ACTLR_DISMCYCINT_Pos) /*!< InterruptType ACTLR: DISMCYCINT Mask */ + +/*@}*/ /* end of group CMSIS_InterruptType */ + + +#if (__MPU_PRESENT == 1) +/** \ingroup CMSIS_core_register + \defgroup CMSIS_MPU CMSIS MPU + Type definitions for the Cortex-M Memory Protection Unit (MPU) + @{ + */ + +/** \brief Structure type to access the Memory Protection Unit (MPU). + */ +typedef struct +{ + __I uint32_t TYPE; /*!< Offset: 0x000 (R/ ) MPU Type Register */ + __IO uint32_t CTRL; /*!< Offset: 0x004 (R/W) MPU Control Register */ + __IO uint32_t RNR; /*!< Offset: 0x008 (R/W) MPU Region RNRber Register */ + __IO uint32_t RBAR; /*!< Offset: 0x00C (R/W) MPU Region Base Address Register */ + __IO uint32_t RASR; /*!< Offset: 0x010 (R/W) MPU Region Attribute and Size Register */ + __IO uint32_t RBAR_A1; /*!< Offset: 0x014 (R/W) MPU Alias 1 Region Base Address Register */ + __IO uint32_t RASR_A1; /*!< Offset: 0x018 (R/W) MPU Alias 1 Region Attribute and Size Register */ + __IO uint32_t RBAR_A2; /*!< Offset: 0x01C (R/W) MPU Alias 2 Region Base Address Register */ + __IO uint32_t RASR_A2; /*!< Offset: 0x020 (R/W) MPU Alias 2 Region Attribute and Size Register */ + __IO uint32_t RBAR_A3; /*!< Offset: 0x024 (R/W) MPU Alias 3 Region Base Address Register */ + __IO uint32_t RASR_A3; /*!< Offset: 0x028 (R/W) MPU Alias 3 Region Attribute and Size Register */ +} MPU_Type; + +/* MPU Type Register */ +#define MPU_TYPE_IREGION_Pos 16 /*!< MPU TYPE: IREGION Position */ +#define MPU_TYPE_IREGION_Msk (0xFFUL << MPU_TYPE_IREGION_Pos) /*!< MPU TYPE: IREGION Mask */ + +#define MPU_TYPE_DREGION_Pos 8 /*!< MPU TYPE: DREGION Position */ +#define MPU_TYPE_DREGION_Msk (0xFFUL << MPU_TYPE_DREGION_Pos) /*!< MPU TYPE: DREGION Mask */ + +#define MPU_TYPE_SEPARATE_Pos 0 /*!< MPU TYPE: SEPARATE Position */ +#define MPU_TYPE_SEPARATE_Msk (1UL << MPU_TYPE_SEPARATE_Pos) /*!< MPU TYPE: SEPARATE Mask */ + +/* MPU Control Register */ +#define MPU_CTRL_PRIVDEFENA_Pos 2 /*!< MPU CTRL: PRIVDEFENA Position */ +#define MPU_CTRL_PRIVDEFENA_Msk (1UL << MPU_CTRL_PRIVDEFENA_Pos) /*!< MPU CTRL: PRIVDEFENA Mask */ + +#define MPU_CTRL_HFNMIENA_Pos 1 /*!< MPU CTRL: HFNMIENA Position */ +#define MPU_CTRL_HFNMIENA_Msk (1UL << MPU_CTRL_HFNMIENA_Pos) /*!< MPU CTRL: HFNMIENA Mask */ + +#define MPU_CTRL_ENABLE_Pos 0 /*!< MPU CTRL: ENABLE Position */ +#define MPU_CTRL_ENABLE_Msk (1UL << MPU_CTRL_ENABLE_Pos) /*!< MPU CTRL: ENABLE Mask */ + +/* MPU Region Number Register */ +#define MPU_RNR_REGION_Pos 0 /*!< MPU RNR: REGION Position */ +#define MPU_RNR_REGION_Msk (0xFFUL << MPU_RNR_REGION_Pos) /*!< MPU RNR: REGION Mask */ + +/* MPU Region Base Address Register */ +#define MPU_RBAR_ADDR_Pos 5 /*!< MPU RBAR: ADDR Position */ +#define MPU_RBAR_ADDR_Msk (0x7FFFFFFUL << MPU_RBAR_ADDR_Pos) /*!< MPU RBAR: ADDR Mask */ + +#define MPU_RBAR_VALID_Pos 4 /*!< MPU RBAR: VALID Position */ +#define MPU_RBAR_VALID_Msk (1UL << MPU_RBAR_VALID_Pos) /*!< MPU RBAR: VALID Mask */ + +#define MPU_RBAR_REGION_Pos 0 /*!< MPU RBAR: REGION Position */ +#define MPU_RBAR_REGION_Msk (0xFUL << MPU_RBAR_REGION_Pos) /*!< MPU RBAR: REGION Mask */ + +/* MPU Region Attribute and Size Register */ +#define MPU_RASR_XN_Pos 28 /*!< MPU RASR: XN Position */ +#define MPU_RASR_XN_Msk (1UL << MPU_RASR_XN_Pos) /*!< MPU RASR: XN Mask */ + +#define MPU_RASR_AP_Pos 24 /*!< MPU RASR: AP Position */ +#define MPU_RASR_AP_Msk (7UL << MPU_RASR_AP_Pos) /*!< MPU RASR: AP Mask */ + +#define MPU_RASR_TEX_Pos 19 /*!< MPU RASR: TEX Position */ +#define MPU_RASR_TEX_Msk (7UL << MPU_RASR_TEX_Pos) /*!< MPU RASR: TEX Mask */ + +#define MPU_RASR_S_Pos 18 /*!< MPU RASR: Shareable bit Position */ +#define MPU_RASR_S_Msk (1UL << MPU_RASR_S_Pos) /*!< MPU RASR: Shareable bit Mask */ + +#define MPU_RASR_C_Pos 17 /*!< MPU RASR: Cacheable bit Position */ +#define MPU_RASR_C_Msk (1UL << MPU_RASR_C_Pos) /*!< MPU RASR: Cacheable bit Mask */ + +#define MPU_RASR_B_Pos 16 /*!< MPU RASR: Bufferable bit Position */ +#define MPU_RASR_B_Msk (1UL << MPU_RASR_B_Pos) /*!< MPU RASR: Bufferable bit Mask */ + +#define MPU_RASR_SRD_Pos 8 /*!< MPU RASR: Sub-Region Disable Position */ +#define MPU_RASR_SRD_Msk (0xFFUL << MPU_RASR_SRD_Pos) /*!< MPU RASR: Sub-Region Disable Mask */ + +#define MPU_RASR_SIZE_Pos 1 /*!< MPU RASR: Region Size Field Position */ +#define MPU_RASR_SIZE_Msk (0x1FUL << MPU_RASR_SIZE_Pos) /*!< MPU RASR: Region Size Field Mask */ + +#define MPU_RASR_ENA_Pos 0 /*!< MPU RASR: Region enable bit Position */ +#define MPU_RASR_ENA_Msk (0x1UL << MPU_RASR_ENA_Pos) /*!< MPU RASR: Region enable bit Disable Mask */ + +/*@} end of group CMSIS_MPU */ +#endif + + +/** \ingroup CMSIS_core_register + \defgroup CMSIS_CoreDebug CMSIS Core Debug + Type definitions for the Cortex-M Core Debug Registers + @{ + */ + +/** \brief Structure type to access the Core Debug Register (CoreDebug). + */ +typedef struct +{ + __IO uint32_t DHCSR; /*!< Offset: 0x000 (R/W) Debug Halting Control and Status Register */ + __O uint32_t DCRSR; /*!< Offset: 0x004 ( /W) Debug Core Register Selector Register */ + __IO uint32_t DCRDR; /*!< Offset: 0x008 (R/W) Debug Core Register Data Register */ + __IO uint32_t DEMCR; /*!< Offset: 0x00C (R/W) Debug Exception and Monitor Control Register */ +} CoreDebug_Type; + +/* Debug Halting Control and Status Register */ +#define CoreDebug_DHCSR_DBGKEY_Pos 16 /*!< CoreDebug DHCSR: DBGKEY Position */ +#define CoreDebug_DHCSR_DBGKEY_Msk (0xFFFFUL << CoreDebug_DHCSR_DBGKEY_Pos) /*!< CoreDebug DHCSR: DBGKEY Mask */ + +#define CoreDebug_DHCSR_S_RESET_ST_Pos 25 /*!< CoreDebug DHCSR: S_RESET_ST Position */ +#define CoreDebug_DHCSR_S_RESET_ST_Msk (1UL << CoreDebug_DHCSR_S_RESET_ST_Pos) /*!< CoreDebug DHCSR: S_RESET_ST Mask */ + +#define CoreDebug_DHCSR_S_RETIRE_ST_Pos 24 /*!< CoreDebug DHCSR: S_RETIRE_ST Position */ +#define CoreDebug_DHCSR_S_RETIRE_ST_Msk (1UL << CoreDebug_DHCSR_S_RETIRE_ST_Pos) /*!< CoreDebug DHCSR: S_RETIRE_ST Mask */ + +#define CoreDebug_DHCSR_S_LOCKUP_Pos 19 /*!< CoreDebug DHCSR: S_LOCKUP Position */ +#define CoreDebug_DHCSR_S_LOCKUP_Msk (1UL << CoreDebug_DHCSR_S_LOCKUP_Pos) /*!< CoreDebug DHCSR: S_LOCKUP Mask */ + +#define CoreDebug_DHCSR_S_SLEEP_Pos 18 /*!< CoreDebug DHCSR: S_SLEEP Position */ +#define CoreDebug_DHCSR_S_SLEEP_Msk (1UL << CoreDebug_DHCSR_S_SLEEP_Pos) /*!< CoreDebug DHCSR: S_SLEEP Mask */ + +#define CoreDebug_DHCSR_S_HALT_Pos 17 /*!< CoreDebug DHCSR: S_HALT Position */ +#define CoreDebug_DHCSR_S_HALT_Msk (1UL << CoreDebug_DHCSR_S_HALT_Pos) /*!< CoreDebug DHCSR: S_HALT Mask */ + +#define CoreDebug_DHCSR_S_REGRDY_Pos 16 /*!< CoreDebug DHCSR: S_REGRDY Position */ +#define CoreDebug_DHCSR_S_REGRDY_Msk (1UL << CoreDebug_DHCSR_S_REGRDY_Pos) /*!< CoreDebug DHCSR: S_REGRDY Mask */ + +#define CoreDebug_DHCSR_C_SNAPSTALL_Pos 5 /*!< CoreDebug DHCSR: C_SNAPSTALL Position */ +#define CoreDebug_DHCSR_C_SNAPSTALL_Msk (1UL << CoreDebug_DHCSR_C_SNAPSTALL_Pos) /*!< CoreDebug DHCSR: C_SNAPSTALL Mask */ + +#define CoreDebug_DHCSR_C_MASKINTS_Pos 3 /*!< CoreDebug DHCSR: C_MASKINTS Position */ +#define CoreDebug_DHCSR_C_MASKINTS_Msk (1UL << CoreDebug_DHCSR_C_MASKINTS_Pos) /*!< CoreDebug DHCSR: C_MASKINTS Mask */ + +#define CoreDebug_DHCSR_C_STEP_Pos 2 /*!< CoreDebug DHCSR: C_STEP Position */ +#define CoreDebug_DHCSR_C_STEP_Msk (1UL << CoreDebug_DHCSR_C_STEP_Pos) /*!< CoreDebug DHCSR: C_STEP Mask */ + +#define CoreDebug_DHCSR_C_HALT_Pos 1 /*!< CoreDebug DHCSR: C_HALT Position */ +#define CoreDebug_DHCSR_C_HALT_Msk (1UL << CoreDebug_DHCSR_C_HALT_Pos) /*!< CoreDebug DHCSR: C_HALT Mask */ + +#define CoreDebug_DHCSR_C_DEBUGEN_Pos 0 /*!< CoreDebug DHCSR: C_DEBUGEN Position */ +#define CoreDebug_DHCSR_C_DEBUGEN_Msk (1UL << CoreDebug_DHCSR_C_DEBUGEN_Pos) /*!< CoreDebug DHCSR: C_DEBUGEN Mask */ + +/* Debug Core Register Selector Register */ +#define CoreDebug_DCRSR_REGWnR_Pos 16 /*!< CoreDebug DCRSR: REGWnR Position */ +#define CoreDebug_DCRSR_REGWnR_Msk (1UL << CoreDebug_DCRSR_REGWnR_Pos) /*!< CoreDebug DCRSR: REGWnR Mask */ + +#define CoreDebug_DCRSR_REGSEL_Pos 0 /*!< CoreDebug DCRSR: REGSEL Position */ +#define CoreDebug_DCRSR_REGSEL_Msk (0x1FUL << CoreDebug_DCRSR_REGSEL_Pos) /*!< CoreDebug DCRSR: REGSEL Mask */ + +/* Debug Exception and Monitor Control Register */ +#define CoreDebug_DEMCR_TRCENA_Pos 24 /*!< CoreDebug DEMCR: TRCENA Position */ +#define CoreDebug_DEMCR_TRCENA_Msk (1UL << CoreDebug_DEMCR_TRCENA_Pos) /*!< CoreDebug DEMCR: TRCENA Mask */ + +#define CoreDebug_DEMCR_MON_REQ_Pos 19 /*!< CoreDebug DEMCR: MON_REQ Position */ +#define CoreDebug_DEMCR_MON_REQ_Msk (1UL << CoreDebug_DEMCR_MON_REQ_Pos) /*!< CoreDebug DEMCR: MON_REQ Mask */ + +#define CoreDebug_DEMCR_MON_STEP_Pos 18 /*!< CoreDebug DEMCR: MON_STEP Position */ +#define CoreDebug_DEMCR_MON_STEP_Msk (1UL << CoreDebug_DEMCR_MON_STEP_Pos) /*!< CoreDebug DEMCR: MON_STEP Mask */ + +#define CoreDebug_DEMCR_MON_PEND_Pos 17 /*!< CoreDebug DEMCR: MON_PEND Position */ +#define CoreDebug_DEMCR_MON_PEND_Msk (1UL << CoreDebug_DEMCR_MON_PEND_Pos) /*!< CoreDebug DEMCR: MON_PEND Mask */ + +#define CoreDebug_DEMCR_MON_EN_Pos 16 /*!< CoreDebug DEMCR: MON_EN Position */ +#define CoreDebug_DEMCR_MON_EN_Msk (1UL << CoreDebug_DEMCR_MON_EN_Pos) /*!< CoreDebug DEMCR: MON_EN Mask */ + +#define CoreDebug_DEMCR_VC_HARDERR_Pos 10 /*!< CoreDebug DEMCR: VC_HARDERR Position */ +#define CoreDebug_DEMCR_VC_HARDERR_Msk (1UL << CoreDebug_DEMCR_VC_HARDERR_Pos) /*!< CoreDebug DEMCR: VC_HARDERR Mask */ + +#define CoreDebug_DEMCR_VC_INTERR_Pos 9 /*!< CoreDebug DEMCR: VC_INTERR Position */ +#define CoreDebug_DEMCR_VC_INTERR_Msk (1UL << CoreDebug_DEMCR_VC_INTERR_Pos) /*!< CoreDebug DEMCR: VC_INTERR Mask */ + +#define CoreDebug_DEMCR_VC_BUSERR_Pos 8 /*!< CoreDebug DEMCR: VC_BUSERR Position */ +#define CoreDebug_DEMCR_VC_BUSERR_Msk (1UL << CoreDebug_DEMCR_VC_BUSERR_Pos) /*!< CoreDebug DEMCR: VC_BUSERR Mask */ + +#define CoreDebug_DEMCR_VC_STATERR_Pos 7 /*!< CoreDebug DEMCR: VC_STATERR Position */ +#define CoreDebug_DEMCR_VC_STATERR_Msk (1UL << CoreDebug_DEMCR_VC_STATERR_Pos) /*!< CoreDebug DEMCR: VC_STATERR Mask */ + +#define CoreDebug_DEMCR_VC_CHKERR_Pos 6 /*!< CoreDebug DEMCR: VC_CHKERR Position */ +#define CoreDebug_DEMCR_VC_CHKERR_Msk (1UL << CoreDebug_DEMCR_VC_CHKERR_Pos) /*!< CoreDebug DEMCR: VC_CHKERR Mask */ + +#define CoreDebug_DEMCR_VC_NOCPERR_Pos 5 /*!< CoreDebug DEMCR: VC_NOCPERR Position */ +#define CoreDebug_DEMCR_VC_NOCPERR_Msk (1UL << CoreDebug_DEMCR_VC_NOCPERR_Pos) /*!< CoreDebug DEMCR: VC_NOCPERR Mask */ + +#define CoreDebug_DEMCR_VC_MMERR_Pos 4 /*!< CoreDebug DEMCR: VC_MMERR Position */ +#define CoreDebug_DEMCR_VC_MMERR_Msk (1UL << CoreDebug_DEMCR_VC_MMERR_Pos) /*!< CoreDebug DEMCR: VC_MMERR Mask */ + +#define CoreDebug_DEMCR_VC_CORERESET_Pos 0 /*!< CoreDebug DEMCR: VC_CORERESET Position */ +#define CoreDebug_DEMCR_VC_CORERESET_Msk (1UL << CoreDebug_DEMCR_VC_CORERESET_Pos) /*!< CoreDebug DEMCR: VC_CORERESET Mask */ + +/*@} end of group CMSIS_CoreDebug */ + + +/** \ingroup CMSIS_core_register + @{ + */ + +/* Memory mapping of Cortex-M3 Hardware */ +#define SCS_BASE (0xE000E000UL) /*!< System Control Space Base Address */ +#define ITM_BASE (0xE0000000UL) /*!< ITM Base Address */ +#define CoreDebug_BASE (0xE000EDF0UL) /*!< Core Debug Base Address */ +#define SysTick_BASE (SCS_BASE + 0x0010UL) /*!< SysTick Base Address */ +#define NVIC_BASE (SCS_BASE + 0x0100UL) /*!< NVIC Base Address */ +#define SCB_BASE (SCS_BASE + 0x0D00UL) /*!< System Control Block Base Address */ + +#define InterruptType ((InterruptType_Type *) SCS_BASE) /*!< Interrupt Type Register */ +#define SCB ((SCB_Type *) SCB_BASE) /*!< SCB configuration struct */ +#define SysTick ((SysTick_Type *) SysTick_BASE) /*!< SysTick configuration struct */ +#define NVIC ((NVIC_Type *) NVIC_BASE) /*!< NVIC configuration struct */ +#define ITM ((ITM_Type *) ITM_BASE) /*!< ITM configuration struct */ +#define CoreDebug ((CoreDebug_Type *) CoreDebug_BASE) /*!< Core Debug configuration struct */ + +#if (__MPU_PRESENT == 1) + #define MPU_BASE (SCS_BASE + 0x0D90UL) /*!< Memory Protection Unit */ + #define MPU ((MPU_Type*) MPU_BASE) /*!< Memory Protection Unit */ +#endif + +/*@} */ + + + +/******************************************************************************* + * Hardware Abstraction Layer + ******************************************************************************/ +/** \defgroup CMSIS_Core_FunctionInterface CMSIS Core Function Interface + Core Function Interface contains: + - Core NVIC Functions + - Core SysTick Functions + - Core Debug Functions + - Core Register Access Functions +*/ + + + +/* ########################## NVIC functions #################################### */ +/** \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_NVICFunctions CMSIS Core NVIC Functions + @{ + */ + +/** \brief Set Priority Grouping + + This function sets the priority grouping field using the required unlock sequence. + The parameter PriorityGroup is assigned to the field SCB->AIRCR [10:8] PRIGROUP field. + Only values from 0..7 are used. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS) the smallest possible priority group is set. + + \param [in] PriorityGroup Priority grouping field + */ +static __INLINE void NVIC_SetPriorityGrouping(uint32_t PriorityGroup) +{ + uint32_t reg_value; + uint32_t PriorityGroupTmp = (PriorityGroup & 0x07); /* only values 0..7 are used */ + + reg_value = SCB->AIRCR; /* read old register configuration */ + reg_value &= ~(SCB_AIRCR_VECTKEY_Msk | SCB_AIRCR_PRIGROUP_Msk); /* clear bits to change */ + reg_value = (reg_value | + (0x5FA << SCB_AIRCR_VECTKEY_Pos) | + (PriorityGroupTmp << 8)); /* Insert write key and priorty group */ + SCB->AIRCR = reg_value; +} + + +/** \brief Get Priority Grouping + + This function gets the priority grouping from NVIC Interrupt Controller. + Priority grouping is SCB->AIRCR [10:8] PRIGROUP field. + + \return Priority grouping field + */ +static __INLINE uint32_t NVIC_GetPriorityGrouping(void) +{ + return ((SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) >> SCB_AIRCR_PRIGROUP_Pos); /* read priority grouping field */ +} + + +/** \brief Enable External Interrupt + + This function enables a device specific interupt in the NVIC interrupt controller. + The interrupt number cannot be a negative value. + + \param [in] IRQn Number of the external interrupt to enable + */ +static __INLINE void NVIC_EnableIRQ(IRQn_Type IRQn) +{ + NVIC->ISER[((uint32_t)(IRQn) >> 5)] = (1 << ((uint32_t)(IRQn) & 0x1F)); /* enable interrupt */ +} + + +/** \brief Disable External Interrupt + + This function disables a device specific interupt in the NVIC interrupt controller. + The interrupt number cannot be a negative value. + + \param [in] IRQn Number of the external interrupt to disable + */ +static __INLINE void NVIC_DisableIRQ(IRQn_Type IRQn) +{ + NVIC->ICER[((uint32_t)(IRQn) >> 5)] = (1 << ((uint32_t)(IRQn) & 0x1F)); /* disable interrupt */ +} + + +/** \brief Get Pending Interrupt + + This function reads the pending register in the NVIC and returns the pending bit + for the specified interrupt. + + \param [in] IRQn Number of the interrupt for get pending + \return 0 Interrupt status is not pending + \return 1 Interrupt status is pending + */ +static __INLINE uint32_t NVIC_GetPendingIRQ(IRQn_Type IRQn) +{ + return((uint32_t) ((NVIC->ISPR[(uint32_t)(IRQn) >> 5] & (1 << ((uint32_t)(IRQn) & 0x1F)))?1:0)); /* Return 1 if pending else 0 */ +} + + +/** \brief Set Pending Interrupt + + This function sets the pending bit for the specified interrupt. + The interrupt number cannot be a negative value. + + \param [in] IRQn Number of the interrupt for set pending + */ +static __INLINE void NVIC_SetPendingIRQ(IRQn_Type IRQn) +{ + NVIC->ISPR[((uint32_t)(IRQn) >> 5)] = (1 << ((uint32_t)(IRQn) & 0x1F)); /* set interrupt pending */ +} + + +/** \brief Clear Pending Interrupt + + This function clears the pending bit for the specified interrupt. + The interrupt number cannot be a negative value. + + \param [in] IRQn Number of the interrupt for clear pending + */ +static __INLINE void NVIC_ClearPendingIRQ(IRQn_Type IRQn) +{ + NVIC->ICPR[((uint32_t)(IRQn) >> 5)] = (1 << ((uint32_t)(IRQn) & 0x1F)); /* Clear pending interrupt */ +} + + +/** \brief Get Active Interrupt + + This function reads the active register in NVIC and returns the active bit. + \param [in] IRQn Number of the interrupt for get active + \return 0 Interrupt status is not active + \return 1 Interrupt status is active + */ +static __INLINE uint32_t NVIC_GetActive(IRQn_Type IRQn) +{ + return((uint32_t)((NVIC->IABR[(uint32_t)(IRQn) >> 5] & (1 << ((uint32_t)(IRQn) & 0x1F)))?1:0)); /* Return 1 if active else 0 */ +} + + +/** \brief Set Interrupt Priority + + This function sets the priority for the specified interrupt. The interrupt + number can be positive to specify an external (device specific) + interrupt, or negative to specify an internal (core) interrupt. + + Note: The priority cannot be set for every core interrupt. + + \param [in] IRQn Number of the interrupt for set priority + \param [in] priority Priority to set + */ +static __INLINE void NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) +{ + if(IRQn < 0) { + SCB->SHP[((uint32_t)(IRQn) & 0xF)-4] = ((priority << (8 - __NVIC_PRIO_BITS)) & 0xff); } /* set Priority for Cortex-M System Interrupts */ + else { + NVIC->IP[(uint32_t)(IRQn)] = ((priority << (8 - __NVIC_PRIO_BITS)) & 0xff); } /* set Priority for device specific Interrupts */ +} + + +/** \brief Get Interrupt Priority + + This function reads the priority for the specified interrupt. The interrupt + number can be positive to specify an external (device specific) + interrupt, or negative to specify an internal (core) interrupt. + + The returned priority value is automatically aligned to the implemented + priority bits of the microcontroller. + + \param [in] IRQn Number of the interrupt for get priority + \return Interrupt Priority + */ +static __INLINE uint32_t NVIC_GetPriority(IRQn_Type IRQn) +{ + + if(IRQn < 0) { + return((uint32_t)(SCB->SHP[((uint32_t)(IRQn) & 0xF)-4] >> (8 - __NVIC_PRIO_BITS))); } /* get priority for Cortex-M system interrupts */ + else { + return((uint32_t)(NVIC->IP[(uint32_t)(IRQn)] >> (8 - __NVIC_PRIO_BITS))); } /* get priority for device specific interrupts */ +} + + +/** \brief Encode Priority + + This function encodes the priority for an interrupt with the given priority group, + preemptive priority value and sub priority value. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS) the samllest possible priority group is set. + + The returned priority value can be used for NVIC_SetPriority(...) function + + \param [in] PriorityGroup Used priority group + \param [in] PreemptPriority Preemptive priority value (starting from 0) + \param [in] SubPriority Sub priority value (starting from 0) + \return Encoded priority for the interrupt + */ +static __INLINE uint32_t NVIC_EncodePriority (uint32_t PriorityGroup, uint32_t PreemptPriority, uint32_t SubPriority) +{ + uint32_t PriorityGroupTmp = (PriorityGroup & 0x07); /* only values 0..7 are used */ + uint32_t PreemptPriorityBits; + uint32_t SubPriorityBits; + + PreemptPriorityBits = ((7 - PriorityGroupTmp) > __NVIC_PRIO_BITS) ? __NVIC_PRIO_BITS : 7 - PriorityGroupTmp; + SubPriorityBits = ((PriorityGroupTmp + __NVIC_PRIO_BITS) < 7) ? 0 : PriorityGroupTmp - 7 + __NVIC_PRIO_BITS; + + return ( + ((PreemptPriority & ((1 << (PreemptPriorityBits)) - 1)) << SubPriorityBits) | + ((SubPriority & ((1 << (SubPriorityBits )) - 1))) + ); +} + + +/** \brief Decode Priority + + This function decodes an interrupt priority value with the given priority group to + preemptive priority value and sub priority value. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS) the samllest possible priority group is set. + + The priority value can be retrieved with NVIC_GetPriority(...) function + + \param [in] Priority Priority value + \param [in] PriorityGroup Used priority group + \param [out] pPreemptPriority Preemptive priority value (starting from 0) + \param [out] pSubPriority Sub priority value (starting from 0) + */ +static __INLINE void NVIC_DecodePriority (uint32_t Priority, uint32_t PriorityGroup, uint32_t* pPreemptPriority, uint32_t* pSubPriority) +{ + uint32_t PriorityGroupTmp = (PriorityGroup & 0x07); /* only values 0..7 are used */ + uint32_t PreemptPriorityBits; + uint32_t SubPriorityBits; + + PreemptPriorityBits = ((7 - PriorityGroupTmp) > __NVIC_PRIO_BITS) ? __NVIC_PRIO_BITS : 7 - PriorityGroupTmp; + SubPriorityBits = ((PriorityGroupTmp + __NVIC_PRIO_BITS) < 7) ? 0 : PriorityGroupTmp - 7 + __NVIC_PRIO_BITS; + + *pPreemptPriority = (Priority >> SubPriorityBits) & ((1 << (PreemptPriorityBits)) - 1); + *pSubPriority = (Priority ) & ((1 << (SubPriorityBits )) - 1); +} + + +/** \brief System Reset + + This function initiate a system reset request to reset the MCU. + */ +static __INLINE void NVIC_SystemReset(void) +{ + __DSB(); /* Ensure all outstanding memory accesses included + buffered write are completed before reset */ + SCB->AIRCR = ((0x5FA << SCB_AIRCR_VECTKEY_Pos) | + (SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) | + SCB_AIRCR_SYSRESETREQ_Msk); /* Keep priority group unchanged */ + __DSB(); /* Ensure completion of memory access */ + while(1); /* wait until reset */ +} + +/*@} end of CMSIS_Core_NVICFunctions */ + + + +/* ################################## SysTick function ############################################ */ +/** \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_SysTickFunctions CMSIS Core SysTick Functions + @{ + */ + +#if (__Vendor_SysTickConfig == 0) + +/** \brief System Tick Configuration + + This function initialises the system tick timer and its interrupt and start the system tick timer. + Counter is in free running mode to generate periodical interrupts. + + \param [in] ticks Number of ticks between two interrupts + \return 0 Function succeeded + \return 1 Function failed + */ +static __INLINE uint32_t SysTick_Config(uint32_t ticks) +{ + if (ticks > SysTick_LOAD_RELOAD_Msk) return (1); /* Reload value impossible */ + + SysTick->LOAD = (ticks & SysTick_LOAD_RELOAD_Msk) - 1; /* set reload register */ + NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1); /* set Priority for Cortex-M0 System Interrupts */ + SysTick->VAL = 0; /* Load the SysTick Counter Value */ + SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | + SysTick_CTRL_TICKINT_Msk | + SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ + return (0); /* Function successful */ +} + +#endif + +/*@} end of CMSIS_Core_SysTickFunctions */ + + + +/* ##################################### Debug In/Output function ########################################### */ +/** \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_core_DebugFunctions CMSIS Core Debug Functions + @{ + */ + +extern volatile int32_t ITM_RxBuffer; /*!< external variable to receive characters */ +#define ITM_RXBUFFER_EMPTY 0x5AA55AA5 /*!< value identifying ITM_RxBuffer is ready for next character */ + + +/** \brief ITM Send Character + + This function transmits a character via the ITM channel 0. + It just returns when no debugger is connected that has booked the output. + It is blocking when a debugger is connected, but the previous character send is not transmitted. + + \param [in] ch Character to transmit + \return Character to transmit + */ +static __INLINE uint32_t ITM_SendChar (uint32_t ch) +{ + if ((CoreDebug->DEMCR & CoreDebug_DEMCR_TRCENA_Msk) && /* Trace enabled */ + (ITM->TCR & ITM_TCR_ITMENA_Msk) && /* ITM enabled */ + (ITM->TER & (1UL << 0) ) ) /* ITM Port #0 enabled */ + { + while (ITM->PORT[0].u32 == 0); + ITM->PORT[0].u8 = (uint8_t) ch; + } + return (ch); +} + + +/** \brief ITM Receive Character + + This function inputs a character via external variable ITM_RxBuffer. + It just returns when no debugger is connected that has booked the output. + It is blocking when a debugger is connected, but the previous character send is not transmitted. + + \return Received character + \return -1 No character received + */ +static __INLINE int32_t ITM_ReceiveChar (void) { + int32_t ch = -1; /* no character available */ + + if (ITM_RxBuffer != ITM_RXBUFFER_EMPTY) { + ch = ITM_RxBuffer; + ITM_RxBuffer = ITM_RXBUFFER_EMPTY; /* ready for next character */ + } + + return (ch); +} + + +/** \brief ITM Check Character + + This function checks external variable ITM_RxBuffer whether a character is available or not. + It returns '1' if a character is available and '0' if no character is available. + + \return 0 No character available + \return 1 Character available + */ +static __INLINE int32_t ITM_CheckChar (void) { + + if (ITM_RxBuffer == ITM_RXBUFFER_EMPTY) { + return (0); /* no character available */ + } else { + return (1); /* character available */ + } +} + +/*@} end of CMSIS_core_DebugFunctions */ + +#endif /* __CORE_CM3_H_DEPENDANT */ + +#endif /* __CMSIS_GENERIC */ + +#ifdef __cplusplus +} +#endif + +/*lint -restore */ diff --git a/CMSISv2p00_LPC17xx/inc/core_cmFunc.h b/CMSISv2p00_LPC17xx/inc/core_cmFunc.h new file mode 100644 index 0000000000000000000000000000000000000000..1ff04d9251269313ca091a92ba7802b9591032e2 --- /dev/null +++ b/CMSISv2p00_LPC17xx/inc/core_cmFunc.h @@ -0,0 +1,844 @@ +/**************************************************************************//** + * @file core_cmFunc.h + * @brief CMSIS Cortex-M Core Function Access Header File + * @version V2.01 + * @date 06. December 2010 + * + * @note + * Copyright (C) 2009-2010 ARM Limited. All rights reserved. + * + * @par + * ARM Limited (ARM) is supplying this software for use with Cortex-M + * processor based microcontrollers. This file can be freely distributed + * within development tools that are supporting such ARM based processors. + * + * @par + * THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED + * OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. + * ARM SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR + * CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. + * + ******************************************************************************/ + +#ifndef __CORE_CMFUNC_H__ +#define __CORE_CMFUNC_H__ + +/* ########################### Core Function Access ########################### */ +/** \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_RegAccFunctions CMSIS Core Register Access Functions + @{ + */ + +#if defined ( __CC_ARM ) /*------------------ RealView Compiler ----------------*/ +/* ARM armcc specific functions */ + +/* intrinsic void __enable_irq(); */ +/* intrinsic void __disable_irq(); */ + +/** \brief Get Control Register + + This function returns the content of the Control Register. + + \return Control Register value + */ +#if (__ARMCC_VERSION < 400000) +extern uint32_t __get_CONTROL(void); +#else /* (__ARMCC_VERSION >= 400000) */ +static __INLINE uint32_t __get_CONTROL(void) +{ + register uint32_t __regControl __ASM("control"); + return(__regControl); +} +#endif /* __ARMCC_VERSION */ + + +/** \brief Set Control Register + + This function writes the given value to the Control Register. + + \param [in] control Control Register value to set + */ +#if (__ARMCC_VERSION < 400000) +extern void __set_CONTROL(uint32_t control); +#else /* (__ARMCC_VERSION >= 400000) */ +static __INLINE void __set_CONTROL(uint32_t control) +{ + register uint32_t __regControl __ASM("control"); + __regControl = control; +} +#endif /* __ARMCC_VERSION */ + + +/** \brief Get ISPR Register + + This function returns the content of the ISPR Register. + + \return ISPR Register value + */ +#if (__ARMCC_VERSION < 400000) +extern uint32_t __get_IPSR(void); +#else /* (__ARMCC_VERSION >= 400000) */ +static __INLINE uint32_t __get_IPSR(void) +{ + register uint32_t __regIPSR __ASM("ipsr"); + return(__regIPSR); +} +#endif /* __ARMCC_VERSION */ + + +/** \brief Get APSR Register + + This function returns the content of the APSR Register. + + \return APSR Register value + */ +#if (__ARMCC_VERSION < 400000) +extern uint32_t __get_APSR(void); +#else /* (__ARMCC_VERSION >= 400000) */ +static __INLINE uint32_t __get_APSR(void) +{ + register uint32_t __regAPSR __ASM("apsr"); + return(__regAPSR); +} +#endif /* __ARMCC_VERSION */ + + +/** \brief Get xPSR Register + + This function returns the content of the xPSR Register. + + \return xPSR Register value + */ +#if (__ARMCC_VERSION < 400000) +extern uint32_t __get_xPSR(void); +#else /* (__ARMCC_VERSION >= 400000) */ +static __INLINE uint32_t __get_xPSR(void) +{ + register uint32_t __regXPSR __ASM("xpsr"); + return(__regXPSR); +} +#endif /* __ARMCC_VERSION */ + + +/** \brief Get Process Stack Pointer + + This function returns the current value of the Process Stack Pointer (PSP). + + \return PSP Register value + */ +#if (__ARMCC_VERSION < 400000) +extern uint32_t __get_PSP(void); +#else /* (__ARMCC_VERSION >= 400000) */ +static __INLINE uint32_t __get_PSP(void) +{ + register uint32_t __regProcessStackPointer __ASM("psp"); + return(__regProcessStackPointer); +} +#endif /* __ARMCC_VERSION */ + + +/** \brief Set Process Stack Pointer + + This function assigns the given value to the Process Stack Pointer (PSP). + + \param [in] topOfProcStack Process Stack Pointer value to set + */ +#if (__ARMCC_VERSION < 400000) +extern void __set_PSP(uint32_t topOfProcStack); +#else /* (__ARMCC_VERSION >= 400000) */ +static __INLINE void __set_PSP(uint32_t topOfProcStack) +{ + register uint32_t __regProcessStackPointer __ASM("psp"); + __regProcessStackPointer = topOfProcStack; +} +#endif /* __ARMCC_VERSION */ + + +/** \brief Get Main Stack Pointer + + This function returns the current value of the Main Stack Pointer (MSP). + + \return MSP Register value + */ +#if (__ARMCC_VERSION < 400000) +extern uint32_t __get_MSP(void); +#else /* (__ARMCC_VERSION >= 400000) */ +static __INLINE uint32_t __get_MSP(void) +{ + register uint32_t __regMainStackPointer __ASM("msp"); + return(__regMainStackPointer); +} +#endif /* __ARMCC_VERSION */ + + +/** \brief Set Main Stack Pointer + + This function assigns the given value to the Main Stack Pointer (MSP). + + \param [in] topOfMainStack Main Stack Pointer value to set + */ +#if (__ARMCC_VERSION < 400000) +extern void __set_MSP(uint32_t topOfMainStack); +#else /* (__ARMCC_VERSION >= 400000) */ +static __INLINE void __set_MSP(uint32_t topOfMainStack) +{ + register uint32_t __regMainStackPointer __ASM("msp"); + __regMainStackPointer = topOfMainStack; +} +#endif /* __ARMCC_VERSION */ + + +/** \brief Get Priority Mask + + This function returns the current state of the priority mask bit from the Priority Mask Register. + + \return Priority Mask value + */ +#if (__ARMCC_VERSION < 400000) +extern uint32_t __get_PRIMASK(void); +#else /* (__ARMCC_VERSION >= 400000) */ +static __INLINE uint32_t __get_PRIMASK(void) +{ + register uint32_t __regPriMask __ASM("primask"); + return(__regPriMask); +} +#endif /* __ARMCC_VERSION */ + + +/** \brief Set Priority Mask + + This function assigns the given value to the Priority Mask Register. + + \param [in] priMask Priority Mask + */ +#if (__ARMCC_VERSION < 400000) +extern void __set_PRIMASK(uint32_t priMask); +#else /* (__ARMCC_VERSION >= 400000) */ +static __INLINE void __set_PRIMASK(uint32_t priMask) +{ + register uint32_t __regPriMask __ASM("primask"); + __regPriMask = (priMask); +} +#endif /* __ARMCC_VERSION */ + + +#if (__CORTEX_M >= 0x03) + +/** \brief Enable FIQ + + This function enables FIQ interrupts by clearing the F-bit in the CPSR. + Can only be executed in Privileged modes. + */ +#define __enable_fault_irq __enable_fiq + + +/** \brief Disable FIQ + + This function disables FIQ interrupts by setting the F-bit in the CPSR. + Can only be executed in Privileged modes. + */ +#define __disable_fault_irq __disable_fiq + + +/** \brief Get Base Priority + + This function returns the current value of the Base Priority register. + + \return Base Priority register value + */ +#if (__ARMCC_VERSION < 400000) +extern uint32_t __get_BASEPRI(void); +#else /* (__ARMCC_VERSION >= 400000) */ +static __INLINE uint32_t __get_BASEPRI(void) +{ + register uint32_t __regBasePri __ASM("basepri"); + return(__regBasePri); +} +#endif /* __ARMCC_VERSION */ + + +/** \brief Set Base Priority + + This function assigns the given value to the Base Priority register. + + \param [in] basePri Base Priority value to set + */ +#if (__ARMCC_VERSION < 400000) +extern void __set_BASEPRI(uint32_t basePri); +#else /* (__ARMCC_VERSION >= 400000) */ +static __INLINE void __set_BASEPRI(uint32_t basePri) +{ + register uint32_t __regBasePri __ASM("basepri"); + __regBasePri = (basePri & 0xff); +} +#endif /* __ARMCC_VERSION */ + + +/** \brief Get Fault Mask + + This function returns the current value of the Fault Mask register. + + \return Fault Mask register value + */ +#if (__ARMCC_VERSION < 400000) +extern uint32_t __get_FAULTMASK(void); +#else /* (__ARMCC_VERSION >= 400000) */ +static __INLINE uint32_t __get_FAULTMASK(void) +{ + register uint32_t __regFaultMask __ASM("faultmask"); + return(__regFaultMask); +} +#endif /* __ARMCC_VERSION */ + + +/** \brief Set Fault Mask + + This function assigns the given value to the Fault Mask register. + + \param [in] faultMask Fault Mask value to set + */ +#if (__ARMCC_VERSION < 400000) +extern void __set_FAULTMASK(uint32_t faultMask); +#else /* (__ARMCC_VERSION >= 400000) */ +static __INLINE void __set_FAULTMASK(uint32_t faultMask) +{ + register uint32_t __regFaultMask __ASM("faultmask"); + __regFaultMask = (faultMask & 1); +} +#endif /* __ARMCC_VERSION */ + +#endif /* (__CORTEX_M >= 0x03) */ + + +#if (__CORTEX_M == 0x04) + +/** \brief Get FPSCR + + This function returns the current value of the Floating Point Status/Control register. + + \return Floating Point Status/Control register value + */ +static __INLINE uint32_t __get_FPSCR(void) +{ +#if (__FPU_PRESENT == 1) + register uint32_t __regfpscr __ASM("fpscr"); + return(__regfpscr); +#else + return(0); +#endif +} + + +/** \brief Set FPSCR + + This function assigns the given value to the Floating Point Status/Control register. + + \param [in] fpscr Floating Point Status/Control value to set + */ +static __INLINE void __set_FPSCR(uint32_t fpscr) +{ +#if (__FPU_PRESENT == 1) + register uint32_t __regfpscr __ASM("fpscr"); + __regfpscr = (fpscr); +#endif +} + +#endif /* (__CORTEX_M == 0x04) */ + + + #elif (defined (__ICCARM__)) /*---------------- ICC Compiler ---------------------*/ +/* IAR iccarm specific functions */ + +#if defined (__ICCARM__) + #include <intrinsics.h> /* IAR Intrinsics */ +#endif + +#pragma diag_suppress=Pe940 + +/** \brief Enable IRQ Interrupts + + This function enables IRQ interrupts by clearing the I-bit in the CPSR. + Can only be executed in Privileged modes. + */ +#define __enable_irq __enable_interrupt + + +/** \brief Disable IRQ Interrupts + + This function disables IRQ interrupts by setting the I-bit in the CPSR. + Can only be executed in Privileged modes. + */ +#define __disable_irq __disable_interrupt + + +/* intrinsic unsigned long __get_CONTROL( void ); (see intrinsic.h) */ +/* intrinsic void __set_CONTROL( unsigned long ); (see intrinsic.h) */ + + +/** \brief Get ISPR Register + + This function returns the content of the ISPR Register. + + \return ISPR Register value + */ +static uint32_t __get_IPSR(void) +{ + __ASM("mrs r0, ipsr"); +} + + +/** \brief Get APSR Register + + This function returns the content of the APSR Register. + + \return APSR Register value + */ +static uint32_t __get_APSR(void) +{ + __ASM("mrs r0, apsr"); +} + + +/** \brief Get xPSR Register + + This function returns the content of the xPSR Register. + + \return xPSR Register value + */ +static uint32_t __get_xPSR(void) +{ + __ASM("mrs r0, psr"); // assembler does not know "xpsr" +} + + +/** \brief Get Process Stack Pointer + + This function returns the current value of the Process Stack Pointer (PSP). + + \return PSP Register value + */ +static uint32_t __get_PSP(void) +{ + __ASM("mrs r0, psp"); +} + + +/** \brief Set Process Stack Pointer + + This function assigns the given value to the Process Stack Pointer (PSP). + + \param [in] topOfProcStack Process Stack Pointer value to set + */ +static void __set_PSP(uint32_t topOfProcStack) +{ + __ASM("msr psp, r0"); +} + + +/** \brief Get Main Stack Pointer + + This function returns the current value of the Main Stack Pointer (MSP). + + \return MSP Register value + */ +static uint32_t __get_MSP(void) +{ + __ASM("mrs r0, msp"); +} + + +/** \brief Set Main Stack Pointer + + This function assigns the given value to the Main Stack Pointer (MSP). + + \param [in] topOfMainStack Main Stack Pointer value to set + */ +static void __set_MSP(uint32_t topOfMainStack) +{ + __ASM("msr msp, r0"); +} + + +/* intrinsic unsigned long __get_PRIMASK( void ); (see intrinsic.h) */ +/* intrinsic void __set_PRIMASK( unsigned long ); (see intrinsic.h) */ + + +#if (__CORTEX_M >= 0x03) + +/** \brief Enable FIQ + + This function enables FIQ interrupts by clearing the F-bit in the CPSR. + Can only be executed in Privileged modes. + */ +static __INLINE void __enable_fault_irq(void) +{ + __ASM ("cpsie f"); +} + + +/** \brief Disable FIQ + + This function disables FIQ interrupts by setting the F-bit in the CPSR. + Can only be executed in Privileged modes. + */ +static __INLINE void __disable_fault_irq(void) +{ + __ASM ("cpsid f"); +} + + +/* intrinsic unsigned long __get_BASEPRI( void ); (see intrinsic.h) */ +/* intrinsic void __set_BASEPRI( unsigned long ); (see intrinsic.h) */ +/* intrinsic unsigned long __get_FAULTMASK( void ); (see intrinsic.h) */ +/* intrinsic void __set_FAULTMASK(unsigned long); (see intrinsic.h) */ + +#endif /* (__CORTEX_M >= 0x03) */ + + +#if (__CORTEX_M == 0x04) + +/** \brief Get FPSCR + + This function returns the current value of the Floating Point Status/Control register. + + \return Floating Point Status/Control register value + */ +static uint32_t __get_FPSCR(void) +{ +#if (__FPU_PRESENT == 1) + __ASM("vmrs r0, fpscr"); +#else + return(0); +#endif +} + + +/** \brief Set FPSCR + + This function assigns the given value to the Floating Point Status/Control register. + + \param [in] fpscr Floating Point Status/Control value to set + */ +static void __set_FPSCR(uint32_t fpscr) +{ +#if (__FPU_PRESENT == 1) + __ASM("vmsr fpscr, r0"); +#endif +} + +#endif /* (__CORTEX_M == 0x04) */ + +#pragma diag_default=Pe940 + + +#elif (defined (__GNUC__)) /*------------------ GNU Compiler ---------------------*/ +/* GNU gcc specific functions */ + +/** \brief Enable IRQ Interrupts + + This function enables IRQ interrupts by clearing the I-bit in the CPSR. + Can only be executed in Privileged modes. + */ +__attribute__( ( always_inline ) ) static __INLINE void __enable_irq(void) +{ + __ASM volatile ("cpsie i"); +} + + +/** \brief Disable IRQ Interrupts + + This function disables IRQ interrupts by setting the I-bit in the CPSR. + Can only be executed in Privileged modes. + */ +__attribute__( ( always_inline ) ) static __INLINE void __disable_irq(void) +{ + __ASM volatile ("cpsid i"); +} + + +/** \brief Get Control Register + + This function returns the content of the Control Register. + + \return Control Register value + */ +__attribute__( ( always_inline ) ) static __INLINE uint32_t __get_CONTROL(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, control" : "=r" (result) ); + return(result); +} + + +/** \brief Set Control Register + + This function writes the given value to the Control Register. + + \param [in] control Control Register value to set + */ +__attribute__( ( always_inline ) ) static __INLINE void __set_CONTROL(uint32_t control) +{ + __ASM volatile ("MSR control, %0" : : "r" (control) ); +} + + +/** \brief Get ISPR Register + + This function returns the content of the ISPR Register. + + \return ISPR Register value + */ +__attribute__( ( always_inline ) ) static __INLINE uint32_t __get_IPSR(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, ipsr" : "=r" (result) ); + return(result); +} + + +/** \brief Get APSR Register + + This function returns the content of the APSR Register. + + \return APSR Register value + */ +__attribute__( ( always_inline ) ) static __INLINE uint32_t __get_APSR(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, apsr" : "=r" (result) ); + return(result); +} + + +/** \brief Get xPSR Register + + This function returns the content of the xPSR Register. + + \return xPSR Register value + */ +__attribute__( ( always_inline ) ) static __INLINE uint32_t __get_xPSR(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, xpsr" : "=r" (result) ); + return(result); +} + + +/** \brief Get Process Stack Pointer + + This function returns the current value of the Process Stack Pointer (PSP). + + \return PSP Register value + */ +__attribute__( ( always_inline ) ) static __INLINE uint32_t __get_PSP(void) +{ + register uint32_t result; + + __ASM volatile ("MRS %0, psp\n" : "=r" (result) ); + return(result); +} + + +/** \brief Set Process Stack Pointer + + This function assigns the given value to the Process Stack Pointer (PSP). + + \param [in] topOfProcStack Process Stack Pointer value to set + */ +__attribute__( ( always_inline ) ) static __INLINE void __set_PSP(uint32_t topOfProcStack) +{ + __ASM volatile ("MSR psp, %0\n" : : "r" (topOfProcStack) ); +} + + +/** \brief Get Main Stack Pointer + + This function returns the current value of the Main Stack Pointer (MSP). + + \return MSP Register value + */ +__attribute__( ( always_inline ) ) static __INLINE uint32_t __get_MSP(void) +{ + register uint32_t result; + + __ASM volatile ("MRS %0, msp\n" : "=r" (result) ); + return(result); +} + + +/** \brief Set Main Stack Pointer + + This function assigns the given value to the Main Stack Pointer (MSP). + + \param [in] topOfMainStack Main Stack Pointer value to set + */ +__attribute__( ( always_inline ) ) static __INLINE void __set_MSP(uint32_t topOfMainStack) +{ + __ASM volatile ("MSR msp, %0\n" : : "r" (topOfMainStack) ); +} + + +/** \brief Get Priority Mask + + This function returns the current state of the priority mask bit from the Priority Mask Register. + + \return Priority Mask value + */ +__attribute__( ( always_inline ) ) static __INLINE uint32_t __get_PRIMASK(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, primask" : "=r" (result) ); + return(result); +} + + +/** \brief Set Priority Mask + + This function assigns the given value to the Priority Mask Register. + + \param [in] priMask Priority Mask + */ +__attribute__( ( always_inline ) ) static __INLINE void __set_PRIMASK(uint32_t priMask) +{ + __ASM volatile ("MSR primask, %0" : : "r" (priMask) ); +} + + +#if (__CORTEX_M >= 0x03) + +/** \brief Enable FIQ + + This function enables FIQ interrupts by clearing the F-bit in the CPSR. + Can only be executed in Privileged modes. + */ +__attribute__( ( always_inline ) ) static __INLINE void __enable_fault_irq(void) +{ + __ASM volatile ("cpsie f"); +} + + +/** \brief Disable FIQ + + This function disables FIQ interrupts by setting the F-bit in the CPSR. + Can only be executed in Privileged modes. + */ +__attribute__( ( always_inline ) ) static __INLINE void __disable_fault_irq(void) +{ + __ASM volatile ("cpsid f"); +} + + +/** \brief Get Base Priority + + This function returns the current value of the Base Priority register. + + \return Base Priority register value + */ +__attribute__( ( always_inline ) ) static __INLINE uint32_t __get_BASEPRI(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, basepri_max" : "=r" (result) ); + return(result); +} + + +/** \brief Set Base Priority + + This function assigns the given value to the Base Priority register. + + \param [in] basePri Base Priority value to set + */ +__attribute__( ( always_inline ) ) static __INLINE void __set_BASEPRI(uint32_t value) +{ + __ASM volatile ("MSR basepri, %0" : : "r" (value) ); +} + + +/** \brief Get Fault Mask + + This function returns the current value of the Fault Mask register. + + \return Fault Mask register value + */ +__attribute__( ( always_inline ) ) static __INLINE uint32_t __get_FAULTMASK(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, faultmask" : "=r" (result) ); + return(result); +} + + +/** \brief Set Fault Mask + + This function assigns the given value to the Fault Mask register. + + \param [in] faultMask Fault Mask value to set + */ +__attribute__( ( always_inline ) ) static __INLINE void __set_FAULTMASK(uint32_t faultMask) +{ + __ASM volatile ("MSR faultmask, %0" : : "r" (faultMask) ); +} + +#endif /* (__CORTEX_M >= 0x03) */ + + +#if (__CORTEX_M == 0x04) + +/** \brief Get FPSCR + + This function returns the current value of the Floating Point Status/Control register. + + \return Floating Point Status/Control register value + */ +__attribute__( ( always_inline ) ) static __INLINE uint32_t __get_FPSCR(void) +{ +#if (__FPU_PRESENT == 1) + uint32_t result; + + __ASM volatile ("MRS %0, fpscr" : "=r" (result) ); + return(result); +#else + return(0); +#endif +} + + +/** \brief Set FPSCR + + This function assigns the given value to the Floating Point Status/Control register. + + \param [in] fpscr Floating Point Status/Control value to set + */ +__attribute__( ( always_inline ) ) static __INLINE void __set_FPSCR(uint32_t fpscr) +{ +#if (__FPU_PRESENT == 1) + __ASM volatile ("MSR fpscr, %0" : : "r" (fpscr) ); +#endif +} + +#endif /* (__CORTEX_M == 0x04) */ + + +#elif (defined (__TASKING__)) /*--------------- TASKING Compiler -----------------*/ +/* TASKING carm specific functions */ + +/* + * The CMSIS functions have been implemented as intrinsics in the compiler. + * Please use "carm -?i" to get an up to date list of all instrinsics, + * Including the CMSIS ones. + */ + +#endif + +/*@} end of CMSIS_Core_RegAccFunctions */ + + +#endif /* __CORE_CMFUNC_H__ */ diff --git a/CMSISv2p00_LPC17xx/inc/core_cmInstr.h b/CMSISv2p00_LPC17xx/inc/core_cmInstr.h new file mode 100644 index 0000000000000000000000000000000000000000..95ce06cb27ed1f8752ffa189c03e047619b70b6d --- /dev/null +++ b/CMSISv2p00_LPC17xx/inc/core_cmInstr.h @@ -0,0 +1,775 @@ +/**************************************************************************//** + * @file core_cmInstr.h + * @brief CMSIS Cortex-M Core Instruction Access Header File + * @version V2.01 + * @date 06. December 2010 + * + * @note + * Copyright (C) 2009-2010 ARM Limited. All rights reserved. + * + * @par + * ARM Limited (ARM) is supplying this software for use with Cortex-M + * processor based microcontrollers. This file can be freely distributed + * within development tools that are supporting such ARM based processors. + * + * @par + * THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED + * OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. + * ARM SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR + * CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. + * + ******************************************************************************/ + +#ifndef __CORE_CMINSTR_H__ +#define __CORE_CMINSTR_H__ + + +/* ########################## Core Instruction Access ######################### */ +/** \defgroup CMSIS_Core_InstructionInterface CMSIS Core Instruction Interface + Access to dedicated instructions + @{ +*/ + +#if defined ( __CC_ARM ) /*------------------ RealView Compiler ----------------*/ +/* ARM armcc specific functions */ + +/** \brief No Operation + + No Operation does nothing. This instruction can be used for code alignment purposes. + */ +#define __NOP __nop + + +/** \brief Wait For Interrupt + + Wait For Interrupt is a hint instruction that suspends execution + until one of a number of events occurs. + */ +#define __WFI __wfi + + +/** \brief Wait For Event + + Wait For Event is a hint instruction that permits the processor to enter + a low-power state until one of a number of events occurs. + */ +#define __WFE __wfe + + +/** \brief Send Event + + Send Event is a hint instruction. It causes an event to be signaled to the CPU. + */ +#define __SEV __sev + + +/** \brief Instruction Synchronization Barrier + + Instruction Synchronization Barrier flushes the pipeline in the processor, + so that all instructions following the ISB are fetched from cache or + memory, after the instruction has been completed. + */ +#define __ISB() __isb(0xF) + + +/** \brief Data Synchronization Barrier + + This function acts as a special kind of Data Memory Barrier. + It completes when all explicit memory accesses before this instruction complete. + */ +#define __DSB() __dsb(0xF) + + +/** \brief Data Memory Barrier + + This function ensures the apparent order of the explicit memory operations before + and after the instruction, without ensuring their completion. + */ +#define __DMB() __dmb(0xF) + + +/** \brief Reverse byte order (32 bit) + + This function reverses the byte order in integer value. + + \param [in] value Value to reverse + \return Reversed value + */ +#define __REV __rev + + +/** \brief Reverse byte order (16 bit) + + This function reverses the byte order in two unsigned short values. + + \param [in] value Value to reverse + \return Reversed value + */ +#if (__ARMCC_VERSION < 400677) +extern uint32_t __REV16(uint32_t value); +#else /* (__ARMCC_VERSION >= 400677) */ +static __INLINE __ASM uint32_t __REV16(uint32_t value) +{ + rev16 r0, r0 + bx lr +} +#endif /* __ARMCC_VERSION */ + + +/** \brief Reverse byte order in signed short value + + This function reverses the byte order in a signed short value with sign extension to integer. + + \param [in] value Value to reverse + \return Reversed value + */ +#if (__ARMCC_VERSION < 400677) +extern int32_t __REVSH(int32_t value); +#else /* (__ARMCC_VERSION >= 400677) */ +static __INLINE __ASM int32_t __REVSH(int32_t value) +{ + revsh r0, r0 + bx lr +} +#endif /* __ARMCC_VERSION */ + + +#if (__CORTEX_M >= 0x03) + +/** \brief Reverse bit order of value + + This function reverses the bit order of the given value. + + \param [in] value Value to reverse + \return Reversed value + */ +#define __RBIT __rbit + + +/** \brief LDR Exclusive (8 bit) + + This function performs a exclusive LDR command for 8 bit value. + + \param [in] ptr Pointer to data + \return value of type uint8_t at (*ptr) + */ +#define __LDREXB(ptr) ((uint8_t ) __ldrex(ptr)) + + +/** \brief LDR Exclusive (16 bit) + + This function performs a exclusive LDR command for 16 bit values. + + \param [in] ptr Pointer to data + \return value of type uint16_t at (*ptr) + */ +#define __LDREXH(ptr) ((uint16_t) __ldrex(ptr)) + + +/** \brief LDR Exclusive (32 bit) + + This function performs a exclusive LDR command for 32 bit values. + + \param [in] ptr Pointer to data + \return value of type uint32_t at (*ptr) + */ +#define __LDREXW(ptr) ((uint32_t ) __ldrex(ptr)) + + +/** \brief STR Exclusive (8 bit) + + This function performs a exclusive STR command for 8 bit values. + + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +#define __STREXB(value, ptr) __strex(value, ptr) + + +/** \brief STR Exclusive (16 bit) + + This function performs a exclusive STR command for 16 bit values. + + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +#define __STREXH(value, ptr) __strex(value, ptr) + + +/** \brief STR Exclusive (32 bit) + + This function performs a exclusive STR command for 32 bit values. + + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +#define __STREXW(value, ptr) __strex(value, ptr) + + +/** \brief Remove the exclusive lock + + This function removes the exclusive lock which is created by LDREX. + + */ +#if (__ARMCC_VERSION < 400000) +extern void __CLREX(void); +#else /* (__ARMCC_VERSION >= 400000) */ +#define __CLREX __clrex +#endif /* __ARMCC_VERSION */ + + +/** \brief Signed Saturate + + This function saturates a signed value. + + \param [in] value Value to be saturated + \param [in] sat Bit position to saturate to (1..32) + \return Saturated value + */ +#define __SSAT __ssat + + +/** \brief Unsigned Saturate + + This function saturates an unsigned value. + + \param [in] value Value to be saturated + \param [in] sat Bit position to saturate to (0..31) + \return Saturated value + */ +#define __USAT __usat + + +/** \brief Count leading zeros + + This function counts the number of leading zeros of a data value. + + \param [in] value Value to count the leading zeros + \return number of leading zeros in value + */ +#define __CLZ __clz + +#endif /* (__CORTEX_M >= 0x03) */ + + + +#elif (defined (__ICCARM__)) /*---------------- ICC Compiler ---------------------*/ +/* IAR iccarm specific functions */ + +#include <intrinsics.h> /* IAR Intrinsics */ + +#pragma diag_suppress=Pe940 + +/** \brief No Operation + + No Operation does nothing. This instruction can be used for code alignment purposes. + */ +#define __NOP __no_operation + + +/** \brief Wait For Interrupt + + Wait For Interrupt is a hint instruction that suspends execution + until one of a number of events occurs. + */ +static __INLINE void __WFI(void) +{ + __ASM ("wfi"); +} + + +/** \brief Wait For Event + + Wait For Event is a hint instruction that permits the processor to enter + a low-power state until one of a number of events occurs. + */ +static __INLINE void __WFE(void) +{ + __ASM ("wfe"); +} + + +/** \brief Send Event + + Send Event is a hint instruction. It causes an event to be signaled to the CPU. + */ +static __INLINE void __SEV(void) +{ + __ASM ("sev"); +} + + +/* intrinsic void __ISB(void) (see intrinsics.h) */ +/* intrinsic void __DSB(void) (see intrinsics.h) */ +/* intrinsic void __DMB(void) (see intrinsics.h) */ +/* intrinsic uint32_t __REV(uint32_t value) (see intrinsics.h) */ +/* intrinsic __SSAT (see intrinsics.h) */ +/* intrinsic __USAT (see intrinsics.h) */ + + +/** \brief Reverse byte order (16 bit) + + This function reverses the byte order in two unsigned short values. + + \param [in] value Value to reverse + \return Reversed value + */ +static uint32_t __REV16(uint32_t value) +{ + __ASM("rev16 r0, r0"); +} + + +/* intrinsic uint32_t __REVSH(uint32_t value) (see intrinsics.h */ + + +#if (__CORTEX_M >= 0x03) + +/** \brief Reverse bit order of value + + This function reverses the bit order of the given value. + + \param [in] value Value to reverse + \return Reversed value + */ +static uint32_t __RBIT(uint32_t value) +{ + __ASM("rbit r0, r0"); +} + + +/** \brief LDR Exclusive (8 bit) + + This function performs a exclusive LDR command for 8 bit value. + + \param [in] ptr Pointer to data + \return value of type uint8_t at (*ptr) + */ +static uint8_t __LDREXB(volatile uint8_t *addr) +{ + __ASM("ldrexb r0, [r0]"); +} + + +/** \brief LDR Exclusive (16 bit) + + This function performs a exclusive LDR command for 16 bit values. + + \param [in] ptr Pointer to data + \return value of type uint16_t at (*ptr) + */ +static uint16_t __LDREXH(volatile uint16_t *addr) +{ + __ASM("ldrexh r0, [r0]"); +} + + +/** \brief LDR Exclusive (32 bit) + + This function performs a exclusive LDR command for 32 bit values. + + \param [in] ptr Pointer to data + \return value of type uint32_t at (*ptr) + */ +/* intrinsic unsigned long __LDREX(unsigned long *) (see intrinsics.h) */ +static uint32_t __LDREXW(volatile uint32_t *addr) +{ + __ASM("ldrex r0, [r0]"); +} + + +/** \brief STR Exclusive (8 bit) + + This function performs a exclusive STR command for 8 bit values. + + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +static uint32_t __STREXB(uint8_t value, volatile uint8_t *addr) +{ + __ASM("strexb r0, r0, [r1]"); +} + + +/** \brief STR Exclusive (16 bit) + + This function performs a exclusive STR command for 16 bit values. + + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +static uint32_t __STREXH(uint16_t value, volatile uint16_t *addr) +{ + __ASM("strexh r0, r0, [r1]"); +} + + +/** \brief STR Exclusive (32 bit) + + This function performs a exclusive STR command for 32 bit values. + + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +/* intrinsic unsigned long __STREX(unsigned long, unsigned long) (see intrinsics.h )*/ +static uint32_t __STREXW(uint32_t value, volatile uint32_t *addr) +{ + __ASM("strex r0, r0, [r1]"); +} + + +/** \brief Remove the exclusive lock + + This function removes the exclusive lock which is created by LDREX. + + */ +static __INLINE void __CLREX(void) +{ + __ASM ("clrex"); +} + +/* intrinsic unsigned char __CLZ( unsigned long ) (see intrinsics.h) */ + +#endif /* (__CORTEX_M >= 0x03) */ + +#pragma diag_default=Pe940 + + + +#elif (defined (__GNUC__)) /*------------------ GNU Compiler ---------------------*/ +/* GNU gcc specific functions */ + +/** \brief No Operation + + No Operation does nothing. This instruction can be used for code alignment purposes. + */ +__attribute__( ( always_inline ) ) static __INLINE void __NOP(void) +{ + __ASM volatile ("nop"); +} + + +/** \brief Wait For Interrupt + + Wait For Interrupt is a hint instruction that suspends execution + until one of a number of events occurs. + */ +__attribute__( ( always_inline ) ) static __INLINE void __WFI(void) +{ + __ASM volatile ("wfi"); +} + + +/** \brief Wait For Event + + Wait For Event is a hint instruction that permits the processor to enter + a low-power state until one of a number of events occurs. + */ +__attribute__( ( always_inline ) ) static __INLINE void __WFE(void) +{ + __ASM volatile ("wfe"); +} + + +/** \brief Send Event + + Send Event is a hint instruction. It causes an event to be signaled to the CPU. + */ +__attribute__( ( always_inline ) ) static __INLINE void __SEV(void) +{ + __ASM volatile ("sev"); +} + + +/** \brief Instruction Synchronization Barrier + + Instruction Synchronization Barrier flushes the pipeline in the processor, + so that all instructions following the ISB are fetched from cache or + memory, after the instruction has been completed. + */ +__attribute__( ( always_inline ) ) static __INLINE void __ISB(void) +{ + __ASM volatile ("isb"); +} + + +/** \brief Data Synchronization Barrier + + This function acts as a special kind of Data Memory Barrier. + It completes when all explicit memory accesses before this instruction complete. + */ +__attribute__( ( always_inline ) ) static __INLINE void __DSB(void) +{ + __ASM volatile ("dsb"); +} + + +/** \brief Data Memory Barrier + + This function ensures the apparent order of the explicit memory operations before + and after the instruction, without ensuring their completion. + */ +__attribute__( ( always_inline ) ) static __INLINE void __DMB(void) +{ + __ASM volatile ("dmb"); +} + + +/** \brief Reverse byte order (32 bit) + + This function reverses the byte order in integer value. + + \param [in] value Value to reverse + \return Reversed value + */ +__attribute__( ( always_inline ) ) static __INLINE uint32_t __REV(uint32_t value) +{ + uint32_t result; + + __ASM volatile ("rev %0, %1" : "=r" (result) : "r" (value) ); + return(result); +} + + +/** \brief Reverse byte order (16 bit) + + This function reverses the byte order in two unsigned short values. + + \param [in] value Value to reverse + \return Reversed value + */ +__attribute__( ( always_inline ) ) static __INLINE uint32_t __REV16(uint32_t value) +{ + uint32_t result; + + __ASM volatile ("rev16 %0, %1" : "=r" (result) : "r" (value) ); + return(result); +} + + +/** \brief Reverse byte order in signed short value + + This function reverses the byte order in a signed short value with sign extension to integer. + + \param [in] value Value to reverse + \return Reversed value + */ +__attribute__( ( always_inline ) ) static __INLINE int32_t __REVSH(int32_t value) +{ + uint32_t result; + + __ASM volatile ("revsh %0, %1" : "=r" (result) : "r" (value) ); + return(result); +} + + +#if (__CORTEX_M >= 0x03) + +/** \brief Reverse bit order of value + + This function reverses the bit order of the given value. + + \param [in] value Value to reverse + \return Reversed value + */ +__attribute__( ( always_inline ) ) static __INLINE uint32_t __RBIT(uint32_t value) +{ + uint32_t result; + + __ASM volatile ("rbit %0, %1" : "=r" (result) : "r" (value) ); + return(result); +} + + +/** \brief LDR Exclusive (8 bit) + + This function performs a exclusive LDR command for 8 bit value. + + \param [in] ptr Pointer to data + \return value of type uint8_t at (*ptr) + */ +__attribute__( ( always_inline ) ) static __INLINE uint8_t __LDREXB(volatile uint8_t *addr) +{ + uint8_t result; + + __ASM volatile ("ldrexb %0, [%1]" : "=r" (result) : "r" (addr) ); + return(result); +} + + +/** \brief LDR Exclusive (16 bit) + + This function performs a exclusive LDR command for 16 bit values. + + \param [in] ptr Pointer to data + \return value of type uint16_t at (*ptr) + */ +__attribute__( ( always_inline ) ) static __INLINE uint16_t __LDREXH(volatile uint16_t *addr) +{ + uint16_t result; + + __ASM volatile ("ldrexh %0, [%1]" : "=r" (result) : "r" (addr) ); + return(result); +} + + +/** \brief LDR Exclusive (32 bit) + + This function performs a exclusive LDR command for 32 bit values. + + \param [in] ptr Pointer to data + \return value of type uint32_t at (*ptr) + */ +__attribute__( ( always_inline ) ) static __INLINE uint32_t __LDREXW(volatile uint32_t *addr) +{ + uint32_t result; + + __ASM volatile ("ldrex %0, [%1]" : "=r" (result) : "r" (addr) ); + return(result); +} + + +/** \brief STR Exclusive (8 bit) + + This function performs a exclusive STR command for 8 bit values. + + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +__attribute__( ( always_inline ) ) static __INLINE uint32_t __STREXB(uint8_t value, volatile uint8_t *addr) +{ + uint32_t result; + + __ASM volatile ("strexb %0, %2, [%1]" : "=r" (result) : "r" (addr), "r" (value) ); + return(result); +} + + +/** \brief STR Exclusive (16 bit) + + This function performs a exclusive STR command for 16 bit values. + + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +__attribute__( ( always_inline ) ) static __INLINE uint32_t __STREXH(uint16_t value, volatile uint16_t *addr) +{ + uint32_t result; + + __ASM volatile ("strexh %0, %2, [%1]" : "=r" (result) : "r" (addr), "r" (value) ); + return(result); +} + + +/** \brief STR Exclusive (32 bit) + + This function performs a exclusive STR command for 32 bit values. + + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +__attribute__( ( always_inline ) ) static __INLINE uint32_t __STREXW(uint32_t value, volatile uint32_t *addr) +{ + uint32_t result; + + __ASM volatile ("strex %0, %2, [%1]" : "=r" (result) : "r" (addr), "r" (value) ); + return(result); +} + + +/** \brief Remove the exclusive lock + + This function removes the exclusive lock which is created by LDREX. + + */ +__attribute__( ( always_inline ) ) static __INLINE void __CLREX(void) +{ + __ASM volatile ("clrex"); +} + + +/** \brief Signed Saturate + + This function saturates a signed value. + + \param [in] value Value to be saturated + \param [in] sat Bit position to saturate to (1..32) + \return Saturated value + */ +#define __SSAT(ARG1,ARG2) \ +({ \ + uint32_t __RES, __ARG1 = (ARG1); \ + __ASM ("ssat %0, %1, %2" : "=r" (__RES) : "I" (ARG2), "r" (__ARG1) ); \ + __RES; \ + }) + + +/** \brief Unsigned Saturate + + This function saturates an unsigned value. + + \param [in] value Value to be saturated + \param [in] sat Bit position to saturate to (0..31) + \return Saturated value + */ +#define __USAT(ARG1,ARG2) \ +({ \ + uint32_t __RES, __ARG1 = (ARG1); \ + __ASM ("usat %0, %1, %2" : "=r" (__RES) : "I" (ARG2), "r" (__ARG1) ); \ + __RES; \ + }) + + +/** \brief Count leading zeros + + This function counts the number of leading zeros of a data value. + + \param [in] value Value to count the leading zeros + \return number of leading zeros in value + */ +__attribute__( ( always_inline ) ) static __INLINE uint8_t __CLZ(uint32_t value) +{ + uint8_t result; + + __ASM volatile ("clz %0, %1" : "=r" (result) : "r" (value) ); + return(result); +} + +#endif /* (__CORTEX_M >= 0x03) */ + + + + +#elif (defined (__TASKING__)) /*--------------- TASKING Compiler -----------------*/ +/* TASKING carm specific functions */ + +/* + * The CMSIS functions have been implemented as intrinsics in the compiler. + * Please use "carm -?i" to get an up to date list of all instrinsics, + * Including the CMSIS ones. + */ + +#endif + +/*@}*/ /* end of group CMSIS_Core_InstructionInterface */ + +#endif /* __CORE_CMINSTR_H__ */ diff --git a/CMSISv2p00_LPC17xx/inc/system_LPC17xx.h b/CMSISv2p00_LPC17xx/inc/system_LPC17xx.h new file mode 100644 index 0000000000000000000000000000000000000000..e58767e9cd70a1bcf2707b214b12945b72db29aa --- /dev/null +++ b/CMSISv2p00_LPC17xx/inc/system_LPC17xx.h @@ -0,0 +1,64 @@ +/**************************************************************************//** + * @file system_LPC17xx.h + * @brief CMSIS Cortex-M3 Device Peripheral Access Layer Header File + * for the NXP LPC17xx Device Series + * @version V1.02 + * @date 08. September 2009 + * + * @note + * Copyright (C) 2009 ARM Limited. All rights reserved. + * + * @par + * ARM Limited (ARM) is supplying this software for use with Cortex-M + * processor based microcontrollers. This file can be freely distributed + * within development tools that are supporting such ARM based processors. + * + * @par + * THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED + * OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. + * ARM SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR + * CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. + * + ******************************************************************************/ + + +#ifndef __SYSTEM_LPC17xx_H +#define __SYSTEM_LPC17xx_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include <stdint.h> + +extern uint32_t SystemCoreClock; /*!< System Clock Frequency (Core Clock) */ + + +/** + * Initialize the system + * + * @param none + * @return none + * + * @brief Setup the microcontroller system. + * Initialize the System and update the SystemCoreClock variable. + */ +extern void SystemInit (void); + +/** + * Update SystemCoreClock variable + * + * @param none + * @return none + * + * @brief Updates the SystemCoreClock with current core Clock + * retrieved from cpu registers. + */ +extern void SystemCoreClockUpdate (void); + +#ifdef __cplusplus +} +#endif + +#endif /* __SYSTEM_LPC17xx_H */ diff --git a/CMSISv2p00_LPC17xx/src/core_cm3.c b/CMSISv2p00_LPC17xx/src/core_cm3.c new file mode 100644 index 0000000000000000000000000000000000000000..fd052ce27c92d20ef02223b036b51c56b74e1b53 --- /dev/null +++ b/CMSISv2p00_LPC17xx/src/core_cm3.c @@ -0,0 +1,339 @@ +/**************************************************************************//** + * @file core_cm3.c + * @brief CMSIS Cortex-M3 Core Peripheral Access Layer Source File + * @version V2.00 + * @date 13. September 2010 + * + * @note + * Copyright (C) 2009-2010 ARM Limited. All rights reserved. + * + * @par + * ARM Limited (ARM) is supplying this software for use with Cortex-M + * processor based microcontrollers. This file can be freely distributed + * within development tools that are supporting such ARM based processors. + * + * @par + * THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED + * OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. + * ARM SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR + * CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. + * + ******************************************************************************/ + +#include <stdint.h> + +/* define compiler specific symbols */ +#if defined ( __CC_ARM ) + #define __ASM __asm /*!< asm keyword for ARM Compiler */ + #define __INLINE __inline /*!< inline keyword for ARM Compiler */ + +#elif defined ( __ICCARM__ ) + #define __ASM __asm /*!< asm keyword for IAR Compiler */ + #define __INLINE inline /*!< inline keyword for IAR Compiler. Only avaiable in High optimization mode! */ + +#elif defined ( __GNUC__ ) + #define __ASM __asm /*!< asm keyword for GNU Compiler */ + #define __INLINE inline /*!< inline keyword for GNU Compiler */ + +#elif defined ( __TASKING__ ) + #define __ASM __asm /*!< asm keyword for TASKING Compiler */ + #define __INLINE inline /*!< inline keyword for TASKING Compiler */ + +#endif + + +/* ########################## Core Instruction Access ######################### */ + +#if defined ( __CC_ARM ) /*------------------ RealView Compiler ----------------*/ + +/** \brief Reverse byte order (16 bit) + + This function reverses the byte order in two unsigned short values. + + \param [in] value Value to reverse + \return Reversed value + */ +#if (__ARMCC_VERSION < 400677) +__ASM uint32_t __REV16(uint32_t value) +{ + rev16 r0, r0 + bx lr +} +#endif /* __ARMCC_VERSION */ + + +/** \brief Reverse byte order in signed short value + + This function reverses the byte order in a signed short value with sign extension to integer. + + \param [in] value Value to reverse + \return Reversed value + */ +#if (__ARMCC_VERSION < 400677) +__ASM int32_t __REVSH(int32_t value) +{ + revsh r0, r0 + bx lr +} +#endif /* __ARMCC_VERSION */ + + +/** \brief Remove the exclusive lock + + This function removes the exclusive lock which is created by LDREX. + + */ +#if (__ARMCC_VERSION < 400000) +__ASM void __CLREX(void) +{ + clrex +} +#endif /* __ARMCC_VERSION */ + + +#elif (defined (__ICCARM__)) /*---------------- ICC Compiler ---------------------*/ +/* obsolete */ +#elif (defined (__GNUC__)) /*------------------ GNU Compiler ---------------------*/ +/* obsolete */ +#elif (defined (__TASKING__)) /*--------------- TASKING Compiler -----------------*/ +/* obsolete */ +#endif + + +/* ########################### Core Function Access ########################### */ + +#if defined ( __CC_ARM ) /*------------------ RealView Compiler ----------------*/ + +/** \brief Get Control Register + + This function returns the content of the Control Register. + + \return Control Register value + */ +#if (__ARMCC_VERSION < 400000) +__ASM uint32_t __get_CONTROL(void) +{ + mrs r0, control + bx lr +} +#endif /* __ARMCC_VERSION */ + + +/** \brief Set Control Register + + This function writes the given value to the Control Register. + + \param [in] control Control Register value to set + */ +#if (__ARMCC_VERSION < 400000) +__ASM void __set_CONTROL(uint32_t control) +{ + msr control, r0 + bx lr +} +#endif /* __ARMCC_VERSION */ + + +/** \brief Get ISPR Register + + This function returns the content of the ISPR Register. + + \return ISPR Register value + */ +#if (__ARMCC_VERSION < 400000) +__ASM uint32_t __get_IPSR(void) +{ + mrs r0, ipsr + bx lr +} +#endif /* __ARMCC_VERSION */ + + +/** \brief Get APSR Register + + This function returns the content of the APSR Register. + + \return APSR Register value + */ +#if (__ARMCC_VERSION < 400000) +__ASM uint32_t __get_APSR(void) +{ + mrs r0, apsr + bx lr +} +#endif /* __ARMCC_VERSION */ + + +/** \brief Get xPSR Register + + This function returns the content of the xPSR Register. + + \return xPSR Register value + */ +#if (__ARMCC_VERSION < 400000) +__ASM uint32_t __get_xPSR(void) +{ + mrs r0, xpsr + bx lr +} +#endif /* __ARMCC_VERSION */ + + +/** \brief Get Process Stack Pointer + + This function returns the current value of the Process Stack Pointer (PSP). + + \return PSP Register value + */ +#if (__ARMCC_VERSION < 400000) +__ASM uint32_t __get_PSP(void) +{ + mrs r0, psp + bx lr +} +#endif /* __ARMCC_VERSION */ + + +/** \brief Set Process Stack Pointer + + This function assigns the given value to the Process Stack Pointer (PSP). + + \param [in] topOfProcStack Process Stack Pointer value to set + */ +#if (__ARMCC_VERSION < 400000) +__ASM void __set_PSP(uint32_t topOfProcStack) +{ + msr psp, r0 + bx lr +} +#endif /* __ARMCC_VERSION */ + + +/** \brief Get Main Stack Pointer + + This function returns the current value of the Main Stack Pointer (MSP). + + \return MSP Register value + */ +#if (__ARMCC_VERSION < 400000) +__ASM uint32_t __get_MSP(void) +{ + mrs r0, msp + bx lr +} +#endif /* __ARMCC_VERSION */ + + +/** \brief Set Main Stack Pointer + + This function assigns the given value to the Main Stack Pointer (MSP). + + \param [in] topOfMainStack Main Stack Pointer value to set + */ +#if (__ARMCC_VERSION < 400000) +__ASM void __set_MSP(uint32_t mainStackPointer) +{ + msr msp, r0 + bx lr +} +#endif /* __ARMCC_VERSION */ + + +/** \brief Get Base Priority + + This function returns the current value of the Base Priority register. + + \return Base Priority register value + */ +#if (__ARMCC_VERSION < 400000) +__ASM uint32_t __get_BASEPRI(void) +{ + mrs r0, basepri + bx lr +} +#endif /* __ARMCC_VERSION */ + + +/** \brief Set Base Priority + + This function assigns the given value to the Base Priority register. + + \param [in] basePri Base Priority value to set + */ +#if (__ARMCC_VERSION < 400000) +__ASM void __set_BASEPRI(uint32_t basePri) +{ + msr basepri, r0 + bx lr +} +#endif /* __ARMCC_VERSION */ + +/** \brief Get Priority Mask + + This function returns the current state of the priority mask bit from the Priority Mask Register. + + \return Priority Mask value + */ +#if (__ARMCC_VERSION < 400000) +__ASM uint32_t __get_PRIMASK(void) +{ + mrs r0, primask + bx lr +} +#endif /* __ARMCC_VERSION */ + + +/** \brief Set Priority Mask + + This function assigns the given value to the Priority Mask Register. + + \param [in] priMask Priority Mask + */ +#if (__ARMCC_VERSION < 400000) +__ASM void __set_PRIMASK(uint32_t priMask) +{ + msr primask, r0 + bx lr +} +#endif /* __ARMCC_VERSION */ + + +/** \brief Get Fault Mask + + This function returns the current value of the Fault Mask Register. + + \return Fault Mask value + */ +#if (__ARMCC_VERSION < 400000) +__ASM uint32_t __get_FAULTMASK(void) +{ + mrs r0, faultmask + bx lr +} +#endif /* __ARMCC_VERSION */ + + +/** \brief Set the Fault Mask + + This function assigns the given value to the Fault Mask Register. + + \param [in] faultMask Fault Mask value value to set + */ +#if (__ARMCC_VERSION < 400000) +__ASM void __set_FAULTMASK(uint32_t faultMask) +{ + msr faultmask, r0 + bx lr +} +#endif /* __ARMCC_VERSION */ + + + +#elif (defined (__ICCARM__)) /*---------------- ICC Compiler ---------------------*/ +/* obsolete */ +#elif (defined (__GNUC__)) /*------------------ GNU Compiler ---------------------*/ +/* obsolete */ +#elif (defined (__TASKING__)) /*--------------- TASKING Compiler -----------------*/ +/* obsolete */ +#endif diff --git a/CMSISv2p00_LPC17xx/src/system_LPC17xx.c b/CMSISv2p00_LPC17xx/src/system_LPC17xx.c new file mode 100644 index 0000000000000000000000000000000000000000..b9d674ab0eb93fca549764c66144dfff77871109 --- /dev/null +++ b/CMSISv2p00_LPC17xx/src/system_LPC17xx.c @@ -0,0 +1,532 @@ +/**************************************************************************//** + * @file system_LPC17xx.c + * @brief CMSIS Cortex-M3 Device Peripheral Access Layer Source File + * for the NXP LPC17xx Device Series + * @version V1.08 + * @date 12. May 2010 + * + * @note + * Copyright (C) 2009 ARM Limited. All rights reserved. + * + * @par + * ARM Limited (ARM) is supplying this software for use with Cortex-M + * processor based microcontrollers. This file can be freely distributed + * within development tools that are supporting such ARM based processors. + * + * @par + * THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED + * OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. + * ARM SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR + * CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. + * + ******************************************************************************/ + + +#include <stdint.h> +#include "LPC17xx.h" + +/* +//-------- <<< Use Configuration Wizard in Context Menu >>> ------------------ +*/ + +/*--------------------- Clock Configuration ---------------------------------- +// +// <e> Clock Configuration +// <h> System Controls and Status Register (SCS) +// <o1.4> OSCRANGE: Main Oscillator Range Select +// <0=> 1 MHz to 20 MHz +// <1=> 15 MHz to 24 MHz +// <e1.5> OSCEN: Main Oscillator Enable +// </e> +// </h> +// +// <h> Clock Source Select Register (CLKSRCSEL) +// <o2.0..1> CLKSRC: PLL Clock Source Selection +// <0=> Internal RC oscillator +// <1=> Main oscillator +// <2=> RTC oscillator +// </h> +// +// <e3> PLL0 Configuration (Main PLL) +// <h> PLL0 Configuration Register (PLL0CFG) +// <i> F_cco0 = (2 * M * F_in) / N +// <i> F_in must be in the range of 32 kHz to 50 MHz +// <i> F_cco0 must be in the range of 275 MHz to 550 MHz +// <o4.0..14> MSEL: PLL Multiplier Selection +// <6-32768><#-1> +// <i> M Value +// <o4.16..23> NSEL: PLL Divider Selection +// <1-256><#-1> +// <i> N Value +// </h> +// </e> +// +// <e5> PLL1 Configuration (USB PLL) +// <h> PLL1 Configuration Register (PLL1CFG) +// <i> F_usb = M * F_osc or F_usb = F_cco1 / (2 * P) +// <i> F_cco1 = F_osc * M * 2 * P +// <i> F_cco1 must be in the range of 156 MHz to 320 MHz +// <o6.0..4> MSEL: PLL Multiplier Selection +// <1-32><#-1> +// <i> M Value (for USB maximum value is 4) +// <o6.5..6> PSEL: PLL Divider Selection +// <0=> 1 +// <1=> 2 +// <2=> 4 +// <3=> 8 +// <i> P Value +// </h> +// </e> +// +// <h> CPU Clock Configuration Register (CCLKCFG) +// <o7.0..7> CCLKSEL: Divide Value for CPU Clock from PLL0 +// <1-256><#-1> +// </h> +// +// <h> USB Clock Configuration Register (USBCLKCFG) +// <o8.0..3> USBSEL: Divide Value for USB Clock from PLL0 +// <0-15> +// <i> Divide is USBSEL + 1 +// </h> +// +// <h> Peripheral Clock Selection Register 0 (PCLKSEL0) +// <o9.0..1> PCLK_WDT: Peripheral Clock Selection for WDT +// <0=> Pclk = Cclk / 4 +// <1=> Pclk = Cclk +// <2=> Pclk = Cclk / 2 +// <3=> Pclk = Hclk / 8 +// <o9.2..3> PCLK_TIMER0: Peripheral Clock Selection for TIMER0 +// <0=> Pclk = Cclk / 4 +// <1=> Pclk = Cclk +// <2=> Pclk = Cclk / 2 +// <3=> Pclk = Hclk / 8 +// <o9.4..5> PCLK_TIMER1: Peripheral Clock Selection for TIMER1 +// <0=> Pclk = Cclk / 4 +// <1=> Pclk = Cclk +// <2=> Pclk = Cclk / 2 +// <3=> Pclk = Hclk / 8 +// <o9.6..7> PCLK_UART0: Peripheral Clock Selection for UART0 +// <0=> Pclk = Cclk / 4 +// <1=> Pclk = Cclk +// <2=> Pclk = Cclk / 2 +// <3=> Pclk = Hclk / 8 +// <o9.8..9> PCLK_UART1: Peripheral Clock Selection for UART1 +// <0=> Pclk = Cclk / 4 +// <1=> Pclk = Cclk +// <2=> Pclk = Cclk / 2 +// <3=> Pclk = Hclk / 8 +// <o9.12..13> PCLK_PWM1: Peripheral Clock Selection for PWM1 +// <0=> Pclk = Cclk / 4 +// <1=> Pclk = Cclk +// <2=> Pclk = Cclk / 2 +// <3=> Pclk = Hclk / 8 +// <o9.14..15> PCLK_I2C0: Peripheral Clock Selection for I2C0 +// <0=> Pclk = Cclk / 4 +// <1=> Pclk = Cclk +// <2=> Pclk = Cclk / 2 +// <3=> Pclk = Hclk / 8 +// <o9.16..17> PCLK_SPI: Peripheral Clock Selection for SPI +// <0=> Pclk = Cclk / 4 +// <1=> Pclk = Cclk +// <2=> Pclk = Cclk / 2 +// <3=> Pclk = Hclk / 8 +// <o9.20..21> PCLK_SSP1: Peripheral Clock Selection for SSP1 +// <0=> Pclk = Cclk / 4 +// <1=> Pclk = Cclk +// <2=> Pclk = Cclk / 2 +// <3=> Pclk = Hclk / 8 +// <o9.22..23> PCLK_DAC: Peripheral Clock Selection for DAC +// <0=> Pclk = Cclk / 4 +// <1=> Pclk = Cclk +// <2=> Pclk = Cclk / 2 +// <3=> Pclk = Hclk / 8 +// <o9.24..25> PCLK_ADC: Peripheral Clock Selection for ADC +// <0=> Pclk = Cclk / 4 +// <1=> Pclk = Cclk +// <2=> Pclk = Cclk / 2 +// <3=> Pclk = Hclk / 8 +// <o9.26..27> PCLK_CAN1: Peripheral Clock Selection for CAN1 +// <0=> Pclk = Cclk / 4 +// <1=> Pclk = Cclk +// <2=> Pclk = Cclk / 2 +// <3=> Pclk = Hclk / 6 +// <o9.28..29> PCLK_CAN2: Peripheral Clock Selection for CAN2 +// <0=> Pclk = Cclk / 4 +// <1=> Pclk = Cclk +// <2=> Pclk = Cclk / 2 +// <3=> Pclk = Hclk / 6 +// <o9.30..31> PCLK_ACF: Peripheral Clock Selection for ACF +// <0=> Pclk = Cclk / 4 +// <1=> Pclk = Cclk +// <2=> Pclk = Cclk / 2 +// <3=> Pclk = Hclk / 6 +// </h> +// +// <h> Peripheral Clock Selection Register 1 (PCLKSEL1) +// <o10.0..1> PCLK_QEI: Peripheral Clock Selection for the Quadrature Encoder Interface +// <0=> Pclk = Cclk / 4 +// <1=> Pclk = Cclk +// <2=> Pclk = Cclk / 2 +// <3=> Pclk = Hclk / 8 +// <o10.2..3> PCLK_GPIO: Peripheral Clock Selection for GPIOs +// <0=> Pclk = Cclk / 4 +// <1=> Pclk = Cclk +// <2=> Pclk = Cclk / 2 +// <3=> Pclk = Hclk / 8 +// <o10.4..5> PCLK_PCB: Peripheral Clock Selection for the Pin Connect Block +// <0=> Pclk = Cclk / 4 +// <1=> Pclk = Cclk +// <2=> Pclk = Cclk / 2 +// <3=> Pclk = Hclk / 8 +// <o10.6..7> PCLK_I2C1: Peripheral Clock Selection for I2C1 +// <0=> Pclk = Cclk / 4 +// <1=> Pclk = Cclk +// <2=> Pclk = Cclk / 2 +// <3=> Pclk = Hclk / 8 +// <o10.10..11> PCLK_SSP0: Peripheral Clock Selection for SSP0 +// <0=> Pclk = Cclk / 4 +// <1=> Pclk = Cclk +// <2=> Pclk = Cclk / 2 +// <3=> Pclk = Hclk / 8 +// <o10.12..13> PCLK_TIMER2: Peripheral Clock Selection for TIMER2 +// <0=> Pclk = Cclk / 4 +// <1=> Pclk = Cclk +// <2=> Pclk = Cclk / 2 +// <3=> Pclk = Hclk / 8 +// <o10.14..15> PCLK_TIMER3: Peripheral Clock Selection for TIMER3 +// <0=> Pclk = Cclk / 4 +// <1=> Pclk = Cclk +// <2=> Pclk = Cclk / 2 +// <3=> Pclk = Hclk / 8 +// <o10.16..17> PCLK_UART2: Peripheral Clock Selection for UART2 +// <0=> Pclk = Cclk / 4 +// <1=> Pclk = Cclk +// <2=> Pclk = Cclk / 2 +// <3=> Pclk = Hclk / 8 +// <o10.18..19> PCLK_UART3: Peripheral Clock Selection for UART3 +// <0=> Pclk = Cclk / 4 +// <1=> Pclk = Cclk +// <2=> Pclk = Cclk / 2 +// <3=> Pclk = Hclk / 8 +// <o10.20..21> PCLK_I2C2: Peripheral Clock Selection for I2C2 +// <0=> Pclk = Cclk / 4 +// <1=> Pclk = Cclk +// <2=> Pclk = Cclk / 2 +// <3=> Pclk = Hclk / 8 +// <o10.22..23> PCLK_I2S: Peripheral Clock Selection for I2S +// <0=> Pclk = Cclk / 4 +// <1=> Pclk = Cclk +// <2=> Pclk = Cclk / 2 +// <3=> Pclk = Hclk / 8 +// <o10.26..27> PCLK_RIT: Peripheral Clock Selection for the Repetitive Interrupt Timer +// <0=> Pclk = Cclk / 4 +// <1=> Pclk = Cclk +// <2=> Pclk = Cclk / 2 +// <3=> Pclk = Hclk / 8 +// <o10.28..29> PCLK_SYSCON: Peripheral Clock Selection for the System Control Block +// <0=> Pclk = Cclk / 4 +// <1=> Pclk = Cclk +// <2=> Pclk = Cclk / 2 +// <3=> Pclk = Hclk / 8 +// <o10.30..31> PCLK_MC: Peripheral Clock Selection for the Motor Control PWM +// <0=> Pclk = Cclk / 4 +// <1=> Pclk = Cclk +// <2=> Pclk = Cclk / 2 +// <3=> Pclk = Hclk / 8 +// </h> +// +// <h> Power Control for Peripherals Register (PCONP) +// <o11.1> PCTIM0: Timer/Counter 0 power/clock enable +// <o11.2> PCTIM1: Timer/Counter 1 power/clock enable +// <o11.3> PCUART0: UART 0 power/clock enable +// <o11.4> PCUART1: UART 1 power/clock enable +// <o11.6> PCPWM1: PWM 1 power/clock enable +// <o11.7> PCI2C0: I2C interface 0 power/clock enable +// <o11.8> PCSPI: SPI interface power/clock enable +// <o11.9> PCRTC: RTC power/clock enable +// <o11.10> PCSSP1: SSP interface 1 power/clock enable +// <o11.12> PCAD: A/D converter power/clock enable +// <o11.13> PCCAN1: CAN controller 1 power/clock enable +// <o11.14> PCCAN2: CAN controller 2 power/clock enable +// <o11.15> PCGPIO: GPIOs power/clock enable +// <o11.16> PCRIT: Repetitive interrupt timer power/clock enable +// <o11.17> PCMC: Motor control PWM power/clock enable +// <o11.18> PCQEI: Quadrature encoder interface power/clock enable +// <o11.19> PCI2C1: I2C interface 1 power/clock enable +// <o11.21> PCSSP0: SSP interface 0 power/clock enable +// <o11.22> PCTIM2: Timer 2 power/clock enable +// <o11.23> PCTIM3: Timer 3 power/clock enable +// <o11.24> PCUART2: UART 2 power/clock enable +// <o11.25> PCUART3: UART 3 power/clock enable +// <o11.26> PCI2C2: I2C interface 2 power/clock enable +// <o11.27> PCI2S: I2S interface power/clock enable +// <o11.29> PCGPDMA: GP DMA function power/clock enable +// <o11.30> PCENET: Ethernet block power/clock enable +// <o11.31> PCUSB: USB interface power/clock enable +// </h> +// +// <h> Clock Output Configuration Register (CLKOUTCFG) +// <o12.0..3> CLKOUTSEL: Selects clock source for CLKOUT +// <0=> CPU clock +// <1=> Main oscillator +// <2=> Internal RC oscillator +// <3=> USB clock +// <4=> RTC oscillator +// <o12.4..7> CLKOUTDIV: Selects clock divider for CLKOUT +// <1-16><#-1> +// <o12.8> CLKOUT_EN: CLKOUT enable control +// </h> +// +// </e> +*/ +#define CLOCK_SETUP 1 +#define SCS_Val 0x00000020 +#define CLKSRCSEL_Val 0x00000001 +#define PLL0_SETUP 1 +#define PLL0CFG_Val 0x00050063 +#define PLL1_SETUP 1 +#define PLL1CFG_Val 0x00000023 +#define CCLKCFG_Val 0x00000003 +#define USBCLKCFG_Val 0x00000000 +#define PCLKSEL0_Val 0x00000000 +#define PCLKSEL1_Val 0x00000000 +#define PCONP_Val 0x042887DE +#define CLKOUTCFG_Val 0x00000000 + + +/*--------------------- Flash Accelerator Configuration ---------------------- +// +// <e> Flash Accelerator Configuration +// <o1.12..15> FLASHTIM: Flash Access Time +// <0=> 1 CPU clock (for CPU clock up to 20 MHz) +// <1=> 2 CPU clocks (for CPU clock up to 40 MHz) +// <2=> 3 CPU clocks (for CPU clock up to 60 MHz) +// <3=> 4 CPU clocks (for CPU clock up to 80 MHz) +// <4=> 5 CPU clocks (for CPU clock up to 100 MHz) +// <5=> 6 CPU clocks (for any CPU clock) +// </e> +*/ +#define FLASH_SETUP 1 +#define FLASHCFG_Val 0x00004000 + +/* +//-------- <<< end of configuration section >>> ------------------------------ +*/ + +/*---------------------------------------------------------------------------- + Check the register settings + *----------------------------------------------------------------------------*/ +#define CHECK_RANGE(val, min, max) ((val < min) || (val > max)) +#define CHECK_RSVD(val, mask) (val & mask) + +/* Clock Configuration -------------------------------------------------------*/ +#if (CHECK_RSVD((SCS_Val), ~0x00000030)) + #error "SCS: Invalid values of reserved bits!" +#endif + +#if (CHECK_RANGE((CLKSRCSEL_Val), 0, 2)) + #error "CLKSRCSEL: Value out of range!" +#endif + +#if (CHECK_RSVD((PLL0CFG_Val), ~0x00FF7FFF)) + #error "PLL0CFG: Invalid values of reserved bits!" +#endif + +#if (CHECK_RSVD((PLL1CFG_Val), ~0x0000007F)) + #error "PLL1CFG: Invalid values of reserved bits!" +#endif + +#if (PLL0_SETUP) /* if PLL0 is used */ + #if (CCLKCFG_Val < 2) /* CCLKSEL must be greater then 1 */ + #error "CCLKCFG: CCLKSEL must be greater then 1 if PLL0 is used!" + #endif +#endif + +#if (CHECK_RANGE((CCLKCFG_Val), 2, 255)) + #error "CCLKCFG: Value out of range!" +#endif + +#if (CHECK_RSVD((USBCLKCFG_Val), ~0x0000000F)) + #error "USBCLKCFG: Invalid values of reserved bits!" +#endif + +#if (CHECK_RSVD((PCLKSEL0_Val), 0x000C0C00)) + #error "PCLKSEL0: Invalid values of reserved bits!" +#endif + +#if (CHECK_RSVD((PCLKSEL1_Val), 0x03000300)) + #error "PCLKSEL1: Invalid values of reserved bits!" +#endif + +#if (CHECK_RSVD((PCONP_Val), 0x10100821)) + #error "PCONP: Invalid values of reserved bits!" +#endif + +#if (CHECK_RSVD((CLKOUTCFG_Val), ~0x000001FF)) + #error "CLKOUTCFG: Invalid values of reserved bits!" +#endif + +/* Flash Accelerator Configuration -------------------------------------------*/ +#if (CHECK_RSVD((FLASHCFG_Val), ~0x0000F000)) + #error "FLASHCFG: Invalid values of reserved bits!" +#endif + + +/*---------------------------------------------------------------------------- + DEFINES + *----------------------------------------------------------------------------*/ + +/*---------------------------------------------------------------------------- + Define clocks + *----------------------------------------------------------------------------*/ +#define XTAL (12000000UL) /* Oscillator frequency */ +#define OSC_CLK ( XTAL) /* Main oscillator frequency */ +#define RTC_CLK ( 32000UL) /* RTC oscillator frequency */ +#define IRC_OSC ( 4000000UL) /* Internal RC oscillator frequency */ + + +/* F_cco0 = (2 * M * F_in) / N */ +#define __M (((PLL0CFG_Val ) & 0x7FFF) + 1) +#define __N (((PLL0CFG_Val >> 16) & 0x00FF) + 1) +#define __FCCO(__F_IN) ((2ULL * __M * __F_IN) / __N) +#define __CCLK_DIV (((CCLKCFG_Val ) & 0x00FF) + 1) + +/* Determine core clock frequency according to settings */ + #if (PLL0_SETUP) + #if ((CLKSRCSEL_Val & 0x03) == 1) + #define __CORE_CLK (__FCCO(OSC_CLK) / __CCLK_DIV) + #elif ((CLKSRCSEL_Val & 0x03) == 2) + #define __CORE_CLK (__FCCO(RTC_CLK) / __CCLK_DIV) + #else + #define __CORE_CLK (__FCCO(IRC_OSC) / __CCLK_DIV) + #endif + #else + #if ((CLKSRCSEL_Val & 0x03) == 1) + #define __CORE_CLK (OSC_CLK / __CCLK_DIV) + #elif ((CLKSRCSEL_Val & 0x03) == 2) + #define __CORE_CLK (RTC_CLK / __CCLK_DIV) + #else + #define __CORE_CLK (IRC_OSC / __CCLK_DIV) + #endif + #endif + + +/*---------------------------------------------------------------------------- + Clock Variable definitions + *----------------------------------------------------------------------------*/ +uint32_t SystemCoreClock = __CORE_CLK;/*!< System Clock Frequency (Core Clock)*/ + + +/*---------------------------------------------------------------------------- + Clock functions + *----------------------------------------------------------------------------*/ +void SystemCoreClockUpdate (void) /* Get Core Clock Frequency */ +{ + /* Determine clock frequency according to clock register values */ + if (((LPC_SC->PLL0STAT >> 24) & 3) == 3) { /* If PLL0 enabled and connected */ + switch (LPC_SC->CLKSRCSEL & 0x03) { + case 0: /* Int. RC oscillator => PLL0 */ + case 3: /* Reserved, default to Int. RC */ + SystemCoreClock = (IRC_OSC * + ((2ULL * ((LPC_SC->PLL0STAT & 0x7FFF) + 1))) / + (((LPC_SC->PLL0STAT >> 16) & 0xFF) + 1) / + ((LPC_SC->CCLKCFG & 0xFF)+ 1)); + break; + case 1: /* Main oscillator => PLL0 */ + SystemCoreClock = (OSC_CLK * + ((2ULL * ((LPC_SC->PLL0STAT & 0x7FFF) + 1))) / + (((LPC_SC->PLL0STAT >> 16) & 0xFF) + 1) / + ((LPC_SC->CCLKCFG & 0xFF)+ 1)); + break; + case 2: /* RTC oscillator => PLL0 */ + SystemCoreClock = (RTC_CLK * + ((2ULL * ((LPC_SC->PLL0STAT & 0x7FFF) + 1))) / + (((LPC_SC->PLL0STAT >> 16) & 0xFF) + 1) / + ((LPC_SC->CCLKCFG & 0xFF)+ 1)); + break; + } + } else { + switch (LPC_SC->CLKSRCSEL & 0x03) { + case 0: /* Int. RC oscillator => PLL0 */ + case 3: /* Reserved, default to Int. RC */ + SystemCoreClock = IRC_OSC / ((LPC_SC->CCLKCFG & 0xFF)+ 1); + break; + case 1: /* Main oscillator => PLL0 */ + SystemCoreClock = OSC_CLK / ((LPC_SC->CCLKCFG & 0xFF)+ 1); + break; + case 2: /* RTC oscillator => PLL0 */ + SystemCoreClock = RTC_CLK / ((LPC_SC->CCLKCFG & 0xFF)+ 1); + break; + } + } + +} + +/** + * Initialize the system + * + * @param none + * @return none + * + * @brief Setup the microcontroller system. + * Initialize the System. + */ +void SystemInit (void) +{ +#if (CLOCK_SETUP) /* Clock Setup */ + LPC_SC->SCS = SCS_Val; + if (SCS_Val & (1 << 5)) { /* If Main Oscillator is enabled */ + while ((LPC_SC->SCS & (1<<6)) == 0);/* Wait for Oscillator to be ready */ + } + + LPC_SC->CCLKCFG = CCLKCFG_Val; /* Setup Clock Divider */ + + LPC_SC->PCLKSEL0 = PCLKSEL0_Val; /* Peripheral Clock Selection */ + LPC_SC->PCLKSEL1 = PCLKSEL1_Val; + + LPC_SC->CLKSRCSEL = CLKSRCSEL_Val; /* Select Clock Source for PLL0 */ + +#if (PLL0_SETUP) + LPC_SC->PLL0CFG = PLL0CFG_Val; /* configure PLL0 */ + LPC_SC->PLL0FEED = 0xAA; + LPC_SC->PLL0FEED = 0x55; + + LPC_SC->PLL0CON = 0x01; /* PLL0 Enable */ + LPC_SC->PLL0FEED = 0xAA; + LPC_SC->PLL0FEED = 0x55; + while (!(LPC_SC->PLL0STAT & (1<<26)));/* Wait for PLOCK0 */ + + LPC_SC->PLL0CON = 0x03; /* PLL0 Enable & Connect */ + LPC_SC->PLL0FEED = 0xAA; + LPC_SC->PLL0FEED = 0x55; + while (!(LPC_SC->PLL0STAT & ((1<<25) | (1<<24))));/* Wait for PLLC0_STAT & PLLE0_STAT */ +#endif + +#if (PLL1_SETUP) + LPC_SC->PLL1CFG = PLL1CFG_Val; + LPC_SC->PLL1FEED = 0xAA; + LPC_SC->PLL1FEED = 0x55; + + LPC_SC->PLL1CON = 0x01; /* PLL1 Enable */ + LPC_SC->PLL1FEED = 0xAA; + LPC_SC->PLL1FEED = 0x55; + while (!(LPC_SC->PLL1STAT & (1<<10)));/* Wait for PLOCK1 */ + + LPC_SC->PLL1CON = 0x03; /* PLL1 Enable & Connect */ + LPC_SC->PLL1FEED = 0xAA; + LPC_SC->PLL1FEED = 0x55; + while (!(LPC_SC->PLL1STAT & ((1<< 9) | (1<< 8))));/* Wait for PLLC1_STAT & PLLE1_STAT */ +#else + LPC_SC->USBCLKCFG = USBCLKCFG_Val; /* Setup USB Clock Divider */ +#endif + + LPC_SC->PCONP = PCONP_Val; /* Power Control for Peripherals */ + + LPC_SC->CLKOUTCFG = CLKOUTCFG_Val; /* Clock Output Configuration */ +#endif + +#if (FLASH_SETUP == 1) /* Flash Accelerator Setup */ + LPC_SC->FLASHCFG = (LPC_SC->FLASHCFG & ~0x0000F000) | FLASHCFG_Val; +#endif +} diff --git a/FreeRTOS.zip b/FreeRTOS.zip new file mode 100644 index 0000000000000000000000000000000000000000..8960ce1bcf09fb4f365be81b3d924fb35a014898 Binary files /dev/null and b/FreeRTOS.zip differ diff --git a/FreeRTOSWithTraces/.cproject b/FreeRTOSWithTraces/.cproject new file mode 100644 index 0000000000000000000000000000000000000000..cbf241752cbf6ede4a36f5d18020449364021ddb --- /dev/null +++ b/FreeRTOSWithTraces/.cproject @@ -0,0 +1,258 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<?fileVersion 4.0.0?><cproject storage_type_id="org.eclipse.cdt.core.XmlProjectDescriptionStorage"> + <storageModule moduleId="org.eclipse.cdt.core.settings"> + <cconfiguration id="com.crt.advproject.config.exe.debug.2001608576"> + <storageModule buildSystemId="org.eclipse.cdt.managedbuilder.core.configurationDataProvider" id="com.crt.advproject.config.exe.debug.2001608576" moduleId="org.eclipse.cdt.core.settings" name="Debug"> + <externalSettings/> + <extensions> + <extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser"/> + <extension id="org.eclipse.cdt.core.GNU_ELF" point="org.eclipse.cdt.core.BinaryParser"/> + <extension id="org.eclipse.cdt.core.GmakeErrorParser" point="org.eclipse.cdt.core.ErrorParser"/> + <extension id="org.eclipse.cdt.core.CWDLocator" point="org.eclipse.cdt.core.ErrorParser"/> + <extension id="org.eclipse.cdt.core.GCCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/> + <extension id="org.eclipse.cdt.core.GASErrorParser" point="org.eclipse.cdt.core.ErrorParser"/> + <extension id="org.eclipse.cdt.core.GLDErrorParser" point="org.eclipse.cdt.core.ErrorParser"/> + </extensions> + </storageModule> + <storageModule moduleId="cdtBuildSystem" version="4.0.0"> + <configuration artifactExtension="axf" artifactName="${ProjName}" buildArtefactType="org.eclipse.cdt.build.core.buildArtefactType.exe" buildProperties="org.eclipse.cdt.build.core.buildArtefactType=org.eclipse.cdt.build.core.buildArtefactType.exe" cleanCommand="rm -rf" description="Debug build" errorParsers="org.eclipse.cdt.core.CWDLocator;org.eclipse.cdt.core.GmakeErrorParser;org.eclipse.cdt.core.GCCErrorParser;org.eclipse.cdt.core.GLDErrorParser;org.eclipse.cdt.core.GASErrorParser" id="com.crt.advproject.config.exe.debug.2001608576" name="Debug" parent="com.crt.advproject.config.exe.debug" postannouncebuildStep="Performing post-build steps" postbuildStep="arm-none-eabi-size "${BuildArtifactFileName}"; # arm-none-eabi-objcopy -O binary "${BuildArtifactFileName}" "${BuildArtifactFileBaseName}.bin" ; checksum -p ${TargetChip} -d "${BuildArtifactFileBaseName}.bin"; "> + <folderInfo id="com.crt.advproject.config.exe.debug.2001608576." name="/" resourcePath=""> + <toolChain id="com.crt.advproject.toolchain.exe.debug.720468766" name="Code Red MCU Tools" superClass="com.crt.advproject.toolchain.exe.debug"> + <targetPlatform binaryParser="org.eclipse.cdt.core.ELF;org.eclipse.cdt.core.GNU_ELF" id="com.crt.advproject.platform.exe.debug.61849875" name="ARM-based MCU (Debug)" superClass="com.crt.advproject.platform.exe.debug"/> + <builder buildPath="${workspace_loc:/serie_4_ex_1}/Debug" id="com.crt.advproject.builder.exe.debug.1265613075" keepEnvironmentInBuildfile="false" managedBuildOn="true" name="Gnu Make Builder" superClass="com.crt.advproject.builder.exe.debug"/> + <tool id="com.crt.advproject.cpp.exe.debug.1414174243" name="MCU C++ Compiler" superClass="com.crt.advproject.cpp.exe.debug"/> + <tool id="com.crt.advproject.gcc.exe.debug.90655892" name="MCU C Compiler" superClass="com.crt.advproject.gcc.exe.debug"> + <option id="com.crt.advproject.gcc.arch.823355763" name="Architecture" superClass="com.crt.advproject.gcc.arch" value="com.crt.advproject.gcc.target.cm3" valueType="enumerated"/> + <option id="com.crt.advproject.gcc.thumb.542341241" name="Thumb mode" superClass="com.crt.advproject.gcc.thumb" value="true" valueType="boolean"/> + <option id="com.crt.advproject.gcc.hdrlib.684839280" name="Library headers" superClass="com.crt.advproject.gcc.hdrlib" value="com.crt.advproject.gcc.hdrlib.codered" valueType="enumerated"/> + <option id="gnu.c.compiler.option.preprocessor.def.symbols.567824786" name="Defined symbols (-D)" superClass="gnu.c.compiler.option.preprocessor.def.symbols" valueType="definedSymbols"> + <listOptionValue builtIn="false" value="__USE_CMSIS"/> + <listOptionValue builtIn="false" value="DEBUG"/> + <listOptionValue builtIn="false" value="__CODE_RED"/> + <listOptionValue builtIn="false" value="PACK_STRUCT_END=__attribute\(\(packed\)\)"/> + <listOptionValue builtIn="false" value="GCC_ARMCM3"/> + <listOptionValue builtIn="false" value="__REDLIB__"/> + </option> + <option id="gnu.c.compiler.option.misc.other.1484903452" name="Other flags" superClass="gnu.c.compiler.option.misc.other" value="-c -fmessage-length=0 -fno-builtin -ffunction-sections -fdata-sections" valueType="string"/> + <option id="com.crt.advproject.gcc.exe.debug.option.optimization.level.2069546710" name="Optimization Level" superClass="com.crt.advproject.gcc.exe.debug.option.optimization.level"/> + <option id="gnu.c.compiler.option.include.paths.1921036710" name="Include paths (-I)" superClass="gnu.c.compiler.option.include.paths" valueType="includePath"> + <listOptionValue builtIn="false" value="../src"/> + <listOptionValue builtIn="false" value=""${workspace_loc:/CMSISv2p00_LPC17xx/inc}""/> + <listOptionValue builtIn="false" value="../FreeRTOS_include"/> + <listOptionValue builtIn="false" value="../FreeRTOS_portable"/> + </option> + <option id="com.crt.advproject.gcc.specs.110467693" name="Specs" superClass="com.crt.advproject.gcc.specs" value="com.crt.advproject.gcc.specs.codered" valueType="enumerated"/> + <inputType id="com.crt.advproject.compiler.input.1722447288" superClass="com.crt.advproject.compiler.input"/> + </tool> + <tool id="com.crt.advproject.gas.exe.debug.1323960667" name="MCU Assembler" superClass="com.crt.advproject.gas.exe.debug"> + <option id="com.crt.advproject.gas.arch.1719694346" name="Architecture" superClass="com.crt.advproject.gas.arch" value="com.crt.advproject.gas.target.cm3" valueType="enumerated"/> + <option id="com.crt.advproject.gas.thumb.382847383" name="Thumb mode" superClass="com.crt.advproject.gas.thumb" value="true" valueType="boolean"/> + <option id="gnu.both.asm.option.flags.crt.343580234" name="Assembler flags" superClass="gnu.both.asm.option.flags.crt" value="-c -x assembler-with-cpp -DDEBUG -D__CODE_RED -D__REDLIB__" valueType="string"/> + <option id="com.crt.advproject.gas.hdrlib.55138212" name="Library headers" superClass="com.crt.advproject.gas.hdrlib" value="com.crt.advproject.gas.hdrlib.codered" valueType="enumerated"/> + <option id="com.crt.advproject.gas.specs.1333481962" name="Specs" superClass="com.crt.advproject.gas.specs" value="com.crt.advproject.gas.specs.codered" valueType="enumerated"/> + <inputType id="cdt.managedbuild.tool.gnu.assembler.input.1720942523" superClass="cdt.managedbuild.tool.gnu.assembler.input"/> + <inputType id="com.crt.advproject.assembler.input.971579368" name="Additional Assembly Source Files" superClass="com.crt.advproject.assembler.input"/> + </tool> + <tool id="com.crt.advproject.link.cpp.exe.debug.1214392321" name="MCU C++ Linker" superClass="com.crt.advproject.link.cpp.exe.debug"/> + <tool id="com.crt.advproject.link.exe.debug.900018139" name="MCU Linker" superClass="com.crt.advproject.link.exe.debug"> + <option id="com.crt.advproject.link.arch.36947921" name="Architecture" superClass="com.crt.advproject.link.arch" value="com.crt.advproject.link.target.cm3" valueType="enumerated"/> + <option id="com.crt.advproject.link.thumb.1782895577" name="Thumb mode" superClass="com.crt.advproject.link.thumb" value="true" valueType="boolean"/> + <option id="com.crt.advproject.link.script.491221921" name="Linker script" superClass="com.crt.advproject.link.script" value=""FreeRTOSWithTraces_Debug.ld"" valueType="string"/> + <option id="com.crt.advproject.link.manage.310318587" name="Manage linker script" superClass="com.crt.advproject.link.manage" value="true" valueType="boolean"/> + <option id="gnu.c.link.option.nostdlibs.216429343" name="No startup or default libs (-nostdlib)" superClass="gnu.c.link.option.nostdlibs" value="true" valueType="boolean"/> + <option id="gnu.c.link.option.other.1948342963" name="Other options (-Xlinker [option])" superClass="gnu.c.link.option.other" valueType="stringList"> + <listOptionValue builtIn="false" value="-Map="${BuildArtifactFileBaseName}.map""/> + <listOptionValue builtIn="false" value="--gc-sections"/> + </option> + <option id="com.crt.advproject.link.gcc.hdrlib.1527884937" name="Library" superClass="com.crt.advproject.link.gcc.hdrlib" value="com.crt.advproject.gcc.link.hdrlib.codered.semihost" valueType="enumerated"/> + <option id="com.crt.advproject.link.gcc.multicore.slave.1855381409" name="Multicore configuration" superClass="com.crt.advproject.link.gcc.multicore.slave"/> + <option id="gnu.c.link.option.libs.1086376640" name="Libraries (-l)" superClass="gnu.c.link.option.libs" valueType="libs"> + <listOptionValue builtIn="false" value="CMSISv2p00_LPC17xx"/> + <listOptionValue builtIn="false" value="MyLab_lib"/> + </option> + <option id="gnu.c.link.option.paths.624990467" name="Library search path (-L)" superClass="gnu.c.link.option.paths" valueType="libPaths"> + <listOptionValue builtIn="false" value=""${workspace_loc:/CMSISv2p00_LPC17xx/Debug}""/> + <listOptionValue builtIn="false" value=""${workspace_loc:/${ProjName}/Debug}""/> + </option> + <option id="com.crt.advproject.link.gcc.multicore.master.userobjs.292644195" name="Slave Objects (not visible)" superClass="com.crt.advproject.link.gcc.multicore.master.userobjs" valueType="userObjs"/> + <inputType id="cdt.managedbuild.tool.gnu.c.linker.input.1151901998" superClass="cdt.managedbuild.tool.gnu.c.linker.input"> + <additionalInput kind="additionalinputdependency" paths="$(USER_OBJS)"/> + <additionalInput kind="additionalinput" paths="$(LIBS)"/> + </inputType> + </tool> + </toolChain> + </folderInfo> + <sourceEntries> + <entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="FreeRTOS_include"/> + <entry excluding="MemMang/heap_3.c|MemMang/heap_1.c" flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="FreeRTOS_portable"/> + <entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="FreeRTOS_src"/> + <entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="src"/> + </sourceEntries> + </configuration> + </storageModule> + <storageModule moduleId="org.eclipse.cdt.core.externalSettings"/> + </cconfiguration> + <cconfiguration id="com.crt.advproject.config.exe.release.1510040367"> + <storageModule buildSystemId="org.eclipse.cdt.managedbuilder.core.configurationDataProvider" id="com.crt.advproject.config.exe.release.1510040367" moduleId="org.eclipse.cdt.core.settings" name="Release"> + <externalSettings/> + <extensions> + <extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser"/> + <extension id="org.eclipse.cdt.core.GNU_ELF" point="org.eclipse.cdt.core.BinaryParser"/> + <extension id="org.eclipse.cdt.core.GmakeErrorParser" point="org.eclipse.cdt.core.ErrorParser"/> + <extension id="org.eclipse.cdt.core.CWDLocator" point="org.eclipse.cdt.core.ErrorParser"/> + <extension id="org.eclipse.cdt.core.GCCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/> + <extension id="org.eclipse.cdt.core.GASErrorParser" point="org.eclipse.cdt.core.ErrorParser"/> + <extension id="org.eclipse.cdt.core.GLDErrorParser" point="org.eclipse.cdt.core.ErrorParser"/> + </extensions> + </storageModule> + <storageModule moduleId="cdtBuildSystem" version="4.0.0"> + <configuration artifactExtension="axf" artifactName="${ProjName}" buildArtefactType="org.eclipse.cdt.build.core.buildArtefactType.exe" buildProperties="org.eclipse.cdt.build.core.buildArtefactType=org.eclipse.cdt.build.core.buildArtefactType.exe" cleanCommand="rm -rf" description="Release build" errorParsers="org.eclipse.cdt.core.CWDLocator;org.eclipse.cdt.core.GmakeErrorParser;org.eclipse.cdt.core.GCCErrorParser;org.eclipse.cdt.core.GLDErrorParser;org.eclipse.cdt.core.GASErrorParser" id="com.crt.advproject.config.exe.release.1510040367" name="Release" parent="com.crt.advproject.config.exe.release" postannouncebuildStep="Performing post-build steps" postbuildStep="arm-none-eabi-size "${BuildArtifactFileName}"; # arm-none-eabi-objcopy -O binary "${BuildArtifactFileName}" "${BuildArtifactFileBaseName}.bin" ; checksum -p ${TargetChip} -d "${BuildArtifactFileBaseName}.bin"; "> + <folderInfo id="com.crt.advproject.config.exe.release.1510040367." name="/" resourcePath=""> + <toolChain id="com.crt.advproject.toolchain.exe.release.1837373593" name="Code Red MCU Tools" superClass="com.crt.advproject.toolchain.exe.release"> + <targetPlatform binaryParser="org.eclipse.cdt.core.ELF;org.eclipse.cdt.core.GNU_ELF" id="com.crt.advproject.platform.exe.release.279785975" name="ARM-based MCU (Release)" superClass="com.crt.advproject.platform.exe.release"/> + <builder buildPath="${workspace_loc:/serie_4_ex_1}/Release" id="com.crt.advproject.builder.exe.release.931271344" keepEnvironmentInBuildfile="false" managedBuildOn="true" name="Gnu Make Builder" superClass="com.crt.advproject.builder.exe.release"/> + <tool id="com.crt.advproject.cpp.exe.release.1812467124" name="MCU C++ Compiler" superClass="com.crt.advproject.cpp.exe.release"/> + <tool id="com.crt.advproject.gcc.exe.release.1491571806" name="MCU C Compiler" superClass="com.crt.advproject.gcc.exe.release"> + <option id="com.crt.advproject.gcc.arch.860929261" name="Architecture" superClass="com.crt.advproject.gcc.arch" value="com.crt.advproject.gcc.target.cm3" valueType="enumerated"/> + <option id="com.crt.advproject.gcc.thumb.1997373441" name="Thumb mode" superClass="com.crt.advproject.gcc.thumb" value="true" valueType="boolean"/> + <option id="com.crt.advproject.gcc.hdrlib.819178239" name="Library headers" superClass="com.crt.advproject.gcc.hdrlib" value="com.crt.advproject.gcc.hdrlib.newlib" valueType="enumerated"/> + <option id="gnu.c.compiler.option.preprocessor.def.symbols.72747489" name="Defined symbols (-D)" superClass="gnu.c.compiler.option.preprocessor.def.symbols" valueType="definedSymbols"> + <listOptionValue builtIn="false" value="__NEWLIB__"/> + <listOptionValue builtIn="false" value="NDEBUG"/> + <listOptionValue builtIn="false" value="__CODE_RED"/> + <listOptionValue builtIn="false" value="PACK_STRUCT_END=__attribute\(\(packed\)\)"/> + <listOptionValue builtIn="false" value="GCC_ARMCM3"/> + </option> + <option id="gnu.c.compiler.option.misc.other.1043060195" name="Other flags" superClass="gnu.c.compiler.option.misc.other" value="-c -fmessage-length=0 -fno-builtin -ffunction-sections -fdata-sections" valueType="string"/> + <option id="com.crt.advproject.gcc.exe.release.option.optimization.level.1835315964" name="Optimization Level" superClass="com.crt.advproject.gcc.exe.release.option.optimization.level"/> + <option id="gnu.c.compiler.option.include.paths.2029946574" name="Include paths (-I)" superClass="gnu.c.compiler.option.include.paths" valueType="includePath"> + <listOptionValue builtIn="false" value="../src"/> + <listOptionValue builtIn="false" value="../FreeRTOS_include"/> + <listOptionValue builtIn="false" value="../FreeRTOS_portable"/> + </option> + <option id="com.crt.advproject.gcc.specs.1699789425" name="Specs" superClass="com.crt.advproject.gcc.specs" value="com.crt.advproject.gcc.specs.newlib" valueType="enumerated"/> + <inputType id="com.crt.advproject.compiler.input.1317448040" superClass="com.crt.advproject.compiler.input"/> + </tool> + <tool id="com.crt.advproject.gas.exe.release.1707433449" name="MCU Assembler" superClass="com.crt.advproject.gas.exe.release"> + <option id="com.crt.advproject.gas.arch.1102722770" name="Architecture" superClass="com.crt.advproject.gas.arch" value="com.crt.advproject.gas.target.cm3" valueType="enumerated"/> + <option id="com.crt.advproject.gas.thumb.2031357681" name="Thumb mode" superClass="com.crt.advproject.gas.thumb" value="true" valueType="boolean"/> + <option id="gnu.both.asm.option.flags.crt.561780142" name="Assembler flags" superClass="gnu.both.asm.option.flags.crt" value="-c -x assembler-with-cpp -D__NEWLIB__ -DNDEBUG -D__CODE_RED" valueType="string"/> + <option id="com.crt.advproject.gas.hdrlib.2096175584" name="Library headers" superClass="com.crt.advproject.gas.hdrlib" value="com.crt.advproject.gas.hdrlib.newlib" valueType="enumerated"/> + <option id="com.crt.advproject.gas.specs.1990287015" name="Specs" superClass="com.crt.advproject.gas.specs" value="com.crt.advproject.gas.specs.newlib" valueType="enumerated"/> + <inputType id="cdt.managedbuild.tool.gnu.assembler.input.1215629078" superClass="cdt.managedbuild.tool.gnu.assembler.input"/> + <inputType id="com.crt.advproject.assembler.input.1244750814" name="Additional Assembly Source Files" superClass="com.crt.advproject.assembler.input"/> + </tool> + <tool id="com.crt.advproject.link.cpp.exe.release.428857389" name="MCU C++ Linker" superClass="com.crt.advproject.link.cpp.exe.release"/> + <tool id="com.crt.advproject.link.exe.release.1912019191" name="MCU Linker" superClass="com.crt.advproject.link.exe.release"> + <option id="com.crt.advproject.link.arch.1072922891" name="Architecture" superClass="com.crt.advproject.link.arch" value="com.crt.advproject.link.target.cm3" valueType="enumerated"/> + <option id="com.crt.advproject.link.thumb.2110168930" name="Thumb mode" superClass="com.crt.advproject.link.thumb" value="true" valueType="boolean"/> + <option id="com.crt.advproject.link.script.36061435" name="Linker script" superClass="com.crt.advproject.link.script" value=""FreeRTOSWithTraces_Release.ld"" valueType="string"/> + <option id="com.crt.advproject.link.manage.2017234677" name="Manage linker script" superClass="com.crt.advproject.link.manage" value="true" valueType="boolean"/> + <option id="gnu.c.link.option.nostdlibs.750747626" name="No startup or default libs (-nostdlib)" superClass="gnu.c.link.option.nostdlibs" value="true" valueType="boolean"/> + <option id="gnu.c.link.option.other.1060901110" name="Other options (-Xlinker [option])" superClass="gnu.c.link.option.other" valueType="stringList"> + <listOptionValue builtIn="false" value="-Map="${BuildArtifactFileBaseName}.map""/> + <listOptionValue builtIn="false" value="--gc-sections"/> + </option> + <option id="com.crt.advproject.link.gcc.hdrlib.252330214" name="Library" superClass="com.crt.advproject.link.gcc.hdrlib" value="com.crt.advproject.gcc.link.hdrlib.newlib.none" valueType="enumerated"/> + <option id="com.crt.advproject.link.gcc.multicore.master.userobjs.436075629" name="Slave Objects (not visible)" superClass="com.crt.advproject.link.gcc.multicore.master.userobjs" valueType="userObjs"/> + <inputType id="cdt.managedbuild.tool.gnu.c.linker.input.1299321118" superClass="cdt.managedbuild.tool.gnu.c.linker.input"> + <additionalInput kind="additionalinputdependency" paths="$(USER_OBJS)"/> + <additionalInput kind="additionalinput" paths="$(LIBS)"/> + </inputType> + </tool> + </toolChain> + </folderInfo> + <sourceEntries> + <entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="FreeRTOS_include"/> + <entry excluding="MemMang/heap_3.c|MemMang/heap_1.c" flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="FreeRTOS_portable"/> + <entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="FreeRTOS_src"/> + <entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="src"/> + </sourceEntries> + </configuration> + </storageModule> + <storageModule moduleId="org.eclipse.cdt.core.externalSettings"/> + </cconfiguration> + </storageModule> + <storageModule moduleId="cdtBuildSystem" version="4.0.0"> + <project id="serie_4_ex_1.com.crt.advproject.projecttype.exe.1260828544" name="Executable" projectType="com.crt.advproject.projecttype.exe"/> + </storageModule> + <storageModule moduleId="scannerConfiguration"> + <autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId=""/> + </storageModule> + <storageModule moduleId="org.eclipse.cdt.core.LanguageSettingsProviders"/> + <storageModule moduleId="com.crt.config"> + <projectStorage><?xml version="1.0" encoding="UTF-8"?> +<TargetConfig> +<Properties property_0="" property_2="LPC175x_6x_512.cfx" property_3="NXP" property_4="LPC1769" property_count="5" version="70200"/> +<infoList vendor="NXP"><info chip="LPC1769" flash_driver="LPC175x_6x_512.cfx" match_id="0x26113F37" name="LPC1769" package="lpc17_lqfp100.xml" stub="crt_emu_cm3_nxp"><chip><name>LPC1769</name> +<family>LPC17xx</family> +<vendor>NXP (formerly Philips)</vendor> +<reset board="None" core="Real" sys="Real"/> +<clock changeable="TRUE" freq="20MHz" is_accurate="TRUE"/> +<memory can_program="true" id="Flash" is_ro="true" type="Flash"/> +<memory id="RAM" type="RAM"/> +<memory id="Periph" is_volatile="true" type="Peripheral"/> +<memoryInstance derived_from="Flash" id="MFlash512" location="0x00000000" size="0x80000"/> +<memoryInstance derived_from="RAM" id="RamLoc32" location="0x10000000" size="0x8000"/> +<memoryInstance derived_from="RAM" id="RamAHB32" location="0x2007c000" size="0x8000"/> +<prog_flash blocksz="0x1000" location="0" maxprgbuff="0x1000" progwithcode="TRUE" size="0x10000"/> +<prog_flash blocksz="0x8000" location="0x10000" maxprgbuff="0x1000" progwithcode="TRUE" size="0x70000"/> +<peripheralInstance derived_from="LPC17_NVIC" determined="infoFile" id="NVIC" location="0xE000E000"/> +<peripheralInstance derived_from="TIMER" determined="infoFile" enable="SYSCTL.PCONP.PCTIM0&amp;0x1" id="TIMER0" location="0x40004000"/> +<peripheralInstance derived_from="TIMER" determined="infoFile" enable="SYSCTL.PCONP.PCTIM1&amp;0x1" id="TIMER1" location="0x40008000"/> +<peripheralInstance derived_from="TIMER" determined="infoFile" enable="SYSCTL.PCONP.PCTIM2&amp;0x1" id="TIMER2" location="0x40090000"/> +<peripheralInstance derived_from="TIMER" determined="infoFile" enable="SYSCTL.PCONP.PCTIM3&amp;0x1" id="TIMER3" location="0x40094000"/> +<peripheralInstance derived_from="LPC17_RIT" determined="infoFile" enable="SYSCTL.PCONP.PCRIT&amp;0x1" id="RIT" location="0x400B0000"/> +<peripheralInstance derived_from="FGPIO" determined="infoFile" enable="SYSCTL.PCONP.PCGPIO&amp;0x1" id="GPIO0" location="0x2009C000"/> +<peripheralInstance derived_from="FGPIO" determined="infoFile" enable="SYSCTL.PCONP.PCGPIO&amp;0x1" id="GPIO1" location="0x2009C020"/> +<peripheralInstance derived_from="FGPIO" determined="infoFile" enable="SYSCTL.PCONP.PCGPIO&amp;0x1" id="GPIO2" location="0x2009C040"/> +<peripheralInstance derived_from="FGPIO" determined="infoFile" enable="SYSCTL.PCONP.PCGPIO&amp;0x1" id="GPIO3" location="0x2009C060"/> +<peripheralInstance derived_from="FGPIO" determined="infoFile" enable="SYSCTL.PCONP.PCGPIO&amp;0x1" id="GPIO4" location="0x2009C080"/> +<peripheralInstance derived_from="LPC17_I2S" determined="infoFile" enable="SYSCTL.PCONP&amp;0x08000000" id="I2S" location="0x400A8000"/> +<peripheralInstance derived_from="LPC17_SYSCTL" determined="infoFile" id="SYSCTL" location="0x400FC000"/> +<peripheralInstance derived_from="LPC17_DAC" determined="infoFile" enable="PCB.PINSEL1.P0_26&amp;0x2=2" id="DAC" location="0x4008C000"/> +<peripheralInstance derived_from="LPC17xx_UART" determined="infoFile" enable="SYSCTL.PCONP.PCUART0&amp;0x1" id="UART0" location="0x4000C000"/> +<peripheralInstance derived_from="LPC17xx_UART_MODEM" determined="infoFile" enable="SYSCTL.PCONP.PCUART1&amp;0x1" id="UART1" location="0x40010000"/> +<peripheralInstance derived_from="LPC17xx_UART" determined="infoFile" enable="SYSCTL.PCONP.PCUART2&amp;0x1" id="UART2" location="0x40098000"/> +<peripheralInstance derived_from="LPC17xx_UART" determined="infoFile" enable="SYSCTL.PCONP.PCUART3&amp;0x1" id="UART3" location="0x4009C000"/> +<peripheralInstance derived_from="SPI" determined="infoFile" enable="SYSCTL.PCONP.PCSPI&amp;0x1" id="SPI" location="0x40020000"/> +<peripheralInstance derived_from="LPC17_SSP" determined="infoFile" enable="SYSCTL.PCONP.PCSSP0&amp;0x1" id="SSP0" location="0x40088000"/> +<peripheralInstance derived_from="LPC17_SSP" determined="infoFile" enable="SYSCTL.PCONP.PCSSP1&amp;0x1" id="SSP1" location="0x40030000"/> +<peripheralInstance derived_from="LPC17_ADC" determined="infoFile" enable="SYSCTL.PCONP.PCAD&amp;0x1" id="ADC" location="0x40034000"/> +<peripheralInstance derived_from="LPC17_USBINTST" determined="infoFile" enable="USBCLKCTL.USBClkCtrl&amp;0x12" id="USBINTSTAT" location="0x400fc1c0"/> +<peripheralInstance derived_from="LPC17_USB_CLK_CTL" determined="infoFile" id="USBCLKCTL" location="0x5000cff4"/> +<peripheralInstance derived_from="LPC17_USBDEV" determined="infoFile" enable="USBCLKCTL.USBClkSt&amp;0x12=0x12" id="USBDEV" location="0x5000C200"/> +<peripheralInstance derived_from="LPC17_PWM" determined="infoFile" enable="SYSCTL.PCONP.PWM1&amp;0x1" id="PWM" location="0x40018000"/> +<peripheralInstance derived_from="LPC17_I2C" determined="infoFile" enable="SYSCTL.PCONP.PCI2C0&amp;0x1" id="I2C0" location="0x4001C000"/> +<peripheralInstance derived_from="LPC17_I2C" determined="infoFile" enable="SYSCTL.PCONP.PCI2C1&amp;0x1" id="I2C1" location="0x4005C000"/> +<peripheralInstance derived_from="LPC17_I2C" determined="infoFile" enable="SYSCTL.PCONP.PCI2C2&amp;0x1" id="I2C2" location="0x400A0000"/> +<peripheralInstance derived_from="LPC17_DMA" determined="infoFile" enable="SYSCTL.PCONP.PCGPDMA&amp;0x1" id="DMA" location="0x50004000"/> +<peripheralInstance derived_from="LPC17_ENET" determined="infoFile" enable="SYSCTL.PCONP.PCENET&amp;0x1" id="ENET" location="0x50000000"/> +<peripheralInstance derived_from="CM3_DCR" determined="infoFile" id="DCR" location="0xE000EDF0"/> +<peripheralInstance derived_from="LPC17_PCB" determined="infoFile" id="PCB" location="0x4002c000"/> +<peripheralInstance derived_from="LPC17_QEI" determined="infoFile" enable="SYSCTL.PCONP.PCQEI&amp;0x1" id="QEI" location="0x400bc000"/> +<peripheralInstance derived_from="LPC17_USBHOST" determined="infoFile" enable="USBCLKCTL.USBClkSt&amp;0x11=0x11" id="USBHOST" location="0x5000C000"/> +<peripheralInstance derived_from="LPC17_USBOTG" determined="infoFile" enable="USBCLKCTL.USBClkSt&amp;0x1c=0x1c" id="USBOTG" location="0x5000C000"/> +<peripheralInstance derived_from="LPC17_RTC" determined="infoFile" enable="SYSCTL.PCONP.PCRTC&amp;0x1" id="RTC" location="0x40024000"/> +<peripheralInstance derived_from="MPU" determined="infoFile" id="MPU" location="0xE000ED90"/> +<peripheralInstance derived_from="LPC1x_WDT" determined="infoFile" id="WDT" location="0x40000000"/> +<peripheralInstance derived_from="LPC17_FLASHCFG" determined="infoFile" id="FLASHACCEL" location="0x400FC000"/> +<peripheralInstance derived_from="GPIO_INT" determined="infoFile" id="GPIOINTMAP" location="0x40028080"/> +<peripheralInstance derived_from="LPC17_CANAFR" determined="infoFile" enable="SYSCTL.PCONP.PCCAN1&amp;0x1|SYSCTL.PCONP.PCCAN2&amp;0x1" id="CANAFR" location="0x4003C000"/> +<peripheralInstance derived_from="LPC17_CANCEN" determined="infoFile" enable="SYSCTL.PCONP.PCCAN1&amp;0x1|SYSCTL.PCONP.PCCAN2&amp;0x1" id="CANCEN" location="0x40040000"/> +<peripheralInstance derived_from="LPC17_CANWAKESLEEP" determined="infoFile" id="CANWAKESLEEP" location="0x400FC110"/> +<peripheralInstance derived_from="LPC17_CANCON" determined="infoFile" enable="SYSCTL.PCONP.PCCAN1&amp;0x1" id="CANCON1" location="0x40044000"/> +<peripheralInstance derived_from="LPC17_CANCON" determined="infoFile" enable="SYSCTL.PCONP.PCCAN2&amp;0x1" id="CANCON2" location="0x40048000"/> +<peripheralInstance derived_from="LPC17_MCPWM" determined="infoFile" enable="SYSCTL.PCONP.PCMCPWM&amp;0x1" id="MCPWM" location="0x400B8000"/> +<peripheralInstance derived_from="LPC17_FMC" determined="infoFile" id="FMC" location="0x40084000"/> +</chip> +<processor><name gcc_name="cortex-m3">Cortex-M3</name> +<family>Cortex-M</family> +</processor> +<link href="nxp_lpcxxxx_peripheral.xme" show="embed" type="simple"/> +</info> +</infoList> +</TargetConfig></projectStorage> + </storageModule> + <storageModule moduleId="refreshScope"/> +</cproject> diff --git a/FreeRTOSWithTraces/.project b/FreeRTOSWithTraces/.project new file mode 100644 index 0000000000000000000000000000000000000000..80d78e1b6e111dbf48f24b5dd86f877a247e2e3f --- /dev/null +++ b/FreeRTOSWithTraces/.project @@ -0,0 +1,27 @@ +<?xml version="1.0" encoding="UTF-8"?> +<projectDescription> + <name>FreeRTOSWithTraces</name> + <comment></comment> + <projects> + <project>CMSISv2p00_LPC17xx</project> + </projects> + <buildSpec> + <buildCommand> + <name>org.eclipse.cdt.managedbuilder.core.genmakebuilder</name> + <triggers>clean,full,incremental,</triggers> + <arguments> + </arguments> + </buildCommand> + <buildCommand> + <name>org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder</name> + <triggers>full,incremental,</triggers> + <arguments> + </arguments> + </buildCommand> + </buildSpec> + <natures> + <nature>org.eclipse.cdt.core.cnature</nature> + <nature>org.eclipse.cdt.managedbuilder.core.managedBuildNature</nature> + <nature>org.eclipse.cdt.managedbuilder.core.ScannerConfigNature</nature> + </natures> +</projectDescription> diff --git a/FreeRTOSWithTraces/.settings/language.settings.xml b/FreeRTOSWithTraces/.settings/language.settings.xml new file mode 100644 index 0000000000000000000000000000000000000000..c6ba173ad2471ce783f7d530bf9214fe4e250476 --- /dev/null +++ b/FreeRTOSWithTraces/.settings/language.settings.xml @@ -0,0 +1,17 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<project> + <configuration id="com.crt.advproject.config.exe.debug.2001608576" name="Debug"> + <extension point="org.eclipse.cdt.core.LanguageSettingsProvider"> + <provider copy-of="extension" id="org.eclipse.cdt.ui.UserLanguageSettingsProvider"/> + <provider class="org.eclipse.cdt.managedbuilder.language.settings.providers.GCCBuildCommandParser" id="com.crt.advproject.GCCBuildCommandParser" keep-relative-paths="false" name="MCU GCC Build Output Parser" parameter="(arm-none-eabi-gcc)|(arm-none-eabi-[gc]\+\+)|(gcc)|([gc]\+\+)|(clang)" prefer-non-shared="true"/> + <provider-reference id="org.eclipse.cdt.managedbuilder.core.MBSLanguageSettingsProvider" ref="shared-provider"/> + </extension> + </configuration> + <configuration id="com.crt.advproject.config.exe.release.1510040367" name="Release"> + <extension point="org.eclipse.cdt.core.LanguageSettingsProvider"> + <provider copy-of="extension" id="org.eclipse.cdt.ui.UserLanguageSettingsProvider"/> + <provider copy-of="extension" id="com.crt.advproject.GCCBuildCommandParser"/> + <provider-reference id="org.eclipse.cdt.managedbuilder.core.MBSLanguageSettingsProvider" ref="shared-provider"/> + </extension> + </configuration> +</project> diff --git a/FreeRTOSWithTraces/.settings/org.eclipse.core.resources.prefs b/FreeRTOSWithTraces/.settings/org.eclipse.core.resources.prefs new file mode 100644 index 0000000000000000000000000000000000000000..99f26c0203a7844de00dbfc56e6a35d8ed3c022c --- /dev/null +++ b/FreeRTOSWithTraces/.settings/org.eclipse.core.resources.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +encoding/<project>=UTF-8 diff --git a/FreeRTOSWithTraces/Debug/FreeRTOSWithTraces.axf b/FreeRTOSWithTraces/Debug/FreeRTOSWithTraces.axf new file mode 100644 index 0000000000000000000000000000000000000000..cfd82a1f01b41e798f3e1745db9875604e2c0045 Binary files /dev/null and b/FreeRTOSWithTraces/Debug/FreeRTOSWithTraces.axf differ diff --git a/FreeRTOSWithTraces/Debug/FreeRTOSWithTraces.map b/FreeRTOSWithTraces/Debug/FreeRTOSWithTraces.map new file mode 100644 index 0000000000000000000000000000000000000000..87e4b85f0b1ce6e35a5d15c1e50bf97b256dc8d6 --- /dev/null +++ b/FreeRTOSWithTraces/Debug/FreeRTOSWithTraces.map @@ -0,0 +1,1449 @@ +Archive member included to satisfy reference by file (symbol) + +C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\CMSISv2p00_LPC17xx\Debug\libCMSISv2p00_LPC17xx.a(system_LPC17xx.o) + ./src/cr_startup_lpc17.o (SystemInit) +C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\FreeRTOSWithTraces\Debug\libMyLab_lib.a(uart.o) + ./src/main.o (uart0_init_ref) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(_cr__main.o) + ./src/cr_startup_lpc17.o (__main) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(memcpy.o) + ./FreeRTOS_src/queue.o (memcpy) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(memset.o) + ./FreeRTOS_src/tasks.o (memset) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_cr_assert.o) + C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\FreeRTOSWithTraces\Debug\libMyLab_lib.a(uart.o) (__assertion_failed) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_deferredlazyseek.o) + c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_cr_assert.o) (__flsbuf) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_fflush.o) + c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_deferredlazyseek.o) (_fflush) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_writebuf.o) + c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_deferredlazyseek.o) (_Cwritebuf) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(alloc.o) + c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_deferredlazyseek.o) (_Csys_alloc) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fputs.o) + c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_cr_assert.o) (fputs) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fseek.o) + c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_deferredlazyseek.o) (fseek) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(ftell.o) + c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fseek.o) (ftell) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(initio.o) + c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(_cr__main.o) (_initio) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(setvbuf.o) + c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(initio.o) (setvbuf) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(stdio.o) + c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_cr_assert.o) (__Ciob) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(strncpy.o) + ./FreeRTOS_src/tasks.o (strncpy) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(__fillbuf.o) + c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(stdio.o) (__filbuf) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(__init_alloc.o) + c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(alloc.o) (__heaps) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_cr_sbrk.o) + c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(alloc.o) (_sbrk) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_fdopen.o) + c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(initio.o) (_fdopen) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(errno.o) + c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(ftell.o) (errno) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fclose.o) + c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(initio.o) (fclose) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fflush.o) + c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fclose.o) (fflush) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(remove.o) + c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fclose.o) (remove) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(strlen.o) + c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(remove.o) (strlen) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_cr_check_heap.o) + c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_cr_sbrk.o) (__check_heap_overflow) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_do_fflush.o) + c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fflush.o) (_do_fflush) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(division_64.o) + C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\CMSISv2p00_LPC17xx\Debug\libCMSISv2p00_LPC17xx.a(system_LPC17xx.o) (__aeabi_uldivmod) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(division_idiv0.o) + c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(division_64.o) (__aeabi_idiv0) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(memcpy.o) + c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(memcpy.o) (__aeabi_memcpy) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_appexit.o) + c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_cr_assert.o) (__sys_appexit) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_close.o) + c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fclose.o) (__sys_close) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_flen.o) + c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_writebuf.o) (__sys_flen) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_istty.o) + c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_deferredlazyseek.o) (__sys_istty) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_read.o) + c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(__fillbuf.o) (__sys_read) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_readc.o) + c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(__fillbuf.o) (__sys_readc) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_remove.o) + c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(remove.o) (__sys_remove) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_rename.o) + c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(remove.o) (__sys_rename) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_seek.o) + c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_writebuf.o) (__sys_seek) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_tmpnam.o) + c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fclose.o) (__sys_tmpnam) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_write.o) + c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_writebuf.o) (__sys_write) + +Allocating common symbols +Common symbol size file + +xQueueRegistry 0x50 ./FreeRTOS_src/queue.o + +Discarded input sections + + .group 0x00000000 0x8 ./src/cr_startup_lpc17.o + .group 0x00000000 0x8 ./src/cr_startup_lpc17.o + .group 0x00000000 0x8 ./src/cr_startup_lpc17.o + .group 0x00000000 0x8 ./src/cr_startup_lpc17.o + .text 0x00000000 0x0 ./src/cr_startup_lpc17.o + .data 0x00000000 0x0 ./src/cr_startup_lpc17.o + .bss 0x00000000 0x0 ./src/cr_startup_lpc17.o + .group 0x00000000 0x8 ./src/main.o + .group 0x00000000 0x8 ./src/main.o + .group 0x00000000 0x8 ./src/main.o + .group 0x00000000 0x8 ./src/main.o + .group 0x00000000 0x8 ./src/main.o + .group 0x00000000 0x8 ./src/main.o + .group 0x00000000 0x8 ./src/main.o + .group 0x00000000 0x8 ./src/main.o + .group 0x00000000 0x8 ./src/main.o + .group 0x00000000 0x8 ./src/main.o + .group 0x00000000 0x8 ./src/main.o + .group 0x00000000 0x8 ./src/main.o + .group 0x00000000 0x8 ./src/main.o + .group 0x00000000 0x8 ./src/main.o + .group 0x00000000 0x8 ./src/main.o + .group 0x00000000 0x8 ./src/main.o + .group 0x00000000 0x8 ./src/main.o + .group 0x00000000 0x8 ./src/main.o + .group 0x00000000 0x8 ./src/main.o + .group 0x00000000 0x8 ./src/main.o + .group 0x00000000 0x8 ./src/main.o + .group 0x00000000 0x8 ./src/main.o + .text 0x00000000 0x0 ./src/main.o + .data 0x00000000 0x0 ./src/main.o + .bss 0x00000000 0x0 ./src/main.o + .debug_macro 0x00000000 0x892 ./src/main.o + .debug_macro 0x00000000 0x10 ./src/main.o + .debug_macro 0x00000000 0x12d ./src/main.o + .debug_macro 0x00000000 0x5b2 ./src/main.o + .group 0x00000000 0x8 ./FreeRTOS_src/croutine.o + .group 0x00000000 0x8 ./FreeRTOS_src/croutine.o + .group 0x00000000 0x8 ./FreeRTOS_src/croutine.o + .group 0x00000000 0x8 ./FreeRTOS_src/croutine.o + .group 0x00000000 0x8 ./FreeRTOS_src/croutine.o + .group 0x00000000 0x8 ./FreeRTOS_src/croutine.o + .group 0x00000000 0x8 ./FreeRTOS_src/croutine.o + .group 0x00000000 0x8 ./FreeRTOS_src/croutine.o + .group 0x00000000 0x8 ./FreeRTOS_src/croutine.o + .group 0x00000000 0x8 ./FreeRTOS_src/croutine.o + .group 0x00000000 0x8 ./FreeRTOS_src/croutine.o + .group 0x00000000 0x8 ./FreeRTOS_src/croutine.o + .group 0x00000000 0x8 ./FreeRTOS_src/croutine.o + .group 0x00000000 0x8 ./FreeRTOS_src/croutine.o + .text 0x00000000 0x0 ./FreeRTOS_src/croutine.o + .data 0x00000000 0x0 ./FreeRTOS_src/croutine.o + .bss 0x00000000 0x0 ./FreeRTOS_src/croutine.o + .bss.pxReadyCoRoutineLists + 0x00000000 0x28 ./FreeRTOS_src/croutine.o + .bss.xDelayedCoRoutineList1 + 0x00000000 0x14 ./FreeRTOS_src/croutine.o + .bss.xDelayedCoRoutineList2 + 0x00000000 0x14 ./FreeRTOS_src/croutine.o + .bss.pxDelayedCoRoutineList + 0x00000000 0x4 ./FreeRTOS_src/croutine.o + .bss.pxOverflowDelayedCoRoutineList + 0x00000000 0x4 ./FreeRTOS_src/croutine.o + .bss.xPendingReadyCoRoutineList + 0x00000000 0x14 ./FreeRTOS_src/croutine.o + .bss.pxCurrentCoRoutine + 0x00000000 0x4 ./FreeRTOS_src/croutine.o + .bss.uxTopCoRoutineReadyPriority + 0x00000000 0x4 ./FreeRTOS_src/croutine.o + .bss.xCoRoutineTickCount + 0x00000000 0x4 ./FreeRTOS_src/croutine.o + .bss.xLastTickCount + 0x00000000 0x4 ./FreeRTOS_src/croutine.o + .bss.xPassedTicks + 0x00000000 0x4 ./FreeRTOS_src/croutine.o + .text.xCoRoutineCreate + 0x00000000 0xcc ./FreeRTOS_src/croutine.o + .text.vCoRoutineAddToDelayedList + 0x00000000 0x84 ./FreeRTOS_src/croutine.o + .text.prvCheckPendingReadyList + 0x00000000 0x80 ./FreeRTOS_src/croutine.o + .text.prvCheckDelayedList + 0x00000000 0xfc ./FreeRTOS_src/croutine.o + .text.vCoRoutineSchedule + 0x00000000 0xa0 ./FreeRTOS_src/croutine.o + .text.prvInitialiseCoRoutineLists + 0x00000000 0x6c ./FreeRTOS_src/croutine.o + .text.xCoRoutineRemoveFromEventList + 0x00000000 0x50 ./FreeRTOS_src/croutine.o + .debug_info 0x00000000 0x493 ./FreeRTOS_src/croutine.o + .debug_abbrev 0x00000000 0x18a ./FreeRTOS_src/croutine.o + .debug_aranges + 0x00000000 0x50 ./FreeRTOS_src/croutine.o + .debug_ranges 0x00000000 0x40 ./FreeRTOS_src/croutine.o + .debug_macro 0x00000000 0xc6 ./FreeRTOS_src/croutine.o + .debug_macro 0x00000000 0x892 ./FreeRTOS_src/croutine.o + .debug_macro 0x00000000 0x10 ./FreeRTOS_src/croutine.o + .debug_macro 0x00000000 0x12d ./FreeRTOS_src/croutine.o + .debug_macro 0x00000000 0x16 ./FreeRTOS_src/croutine.o + .debug_macro 0x00000000 0x46 ./FreeRTOS_src/croutine.o + .debug_macro 0x00000000 0x5b2 ./FreeRTOS_src/croutine.o + .debug_macro 0x00000000 0x14a ./FreeRTOS_src/croutine.o + .debug_macro 0x00000000 0xa3 ./FreeRTOS_src/croutine.o + .debug_macro 0x00000000 0x12 ./FreeRTOS_src/croutine.o + .debug_macro 0x00000000 0x1f ./FreeRTOS_src/croutine.o + .debug_macro 0x00000000 0x177 ./FreeRTOS_src/croutine.o + .debug_macro 0x00000000 0x49 ./FreeRTOS_src/croutine.o + .debug_macro 0x00000000 0x57 ./FreeRTOS_src/croutine.o + .debug_macro 0x00000000 0x49 ./FreeRTOS_src/croutine.o + .debug_line 0x00000000 0x2dc ./FreeRTOS_src/croutine.o + .debug_str 0x00000000 0x629d ./FreeRTOS_src/croutine.o + .comment 0x00000000 0x6f ./FreeRTOS_src/croutine.o + .debug_frame 0x00000000 0x10c ./FreeRTOS_src/croutine.o + .ARM.attributes + 0x00000000 0x33 ./FreeRTOS_src/croutine.o + .group 0x00000000 0x8 ./FreeRTOS_src/list.o + .group 0x00000000 0x8 ./FreeRTOS_src/list.o + .group 0x00000000 0x8 ./FreeRTOS_src/list.o + .group 0x00000000 0x8 ./FreeRTOS_src/list.o + .group 0x00000000 0x8 ./FreeRTOS_src/list.o + .group 0x00000000 0x8 ./FreeRTOS_src/list.o + .group 0x00000000 0x8 ./FreeRTOS_src/list.o + .group 0x00000000 0x8 ./FreeRTOS_src/list.o + .group 0x00000000 0x8 ./FreeRTOS_src/list.o + .group 0x00000000 0x8 ./FreeRTOS_src/list.o + .group 0x00000000 0x8 ./FreeRTOS_src/list.o + .group 0x00000000 0x8 ./FreeRTOS_src/list.o + .text 0x00000000 0x0 ./FreeRTOS_src/list.o + .data 0x00000000 0x0 ./FreeRTOS_src/list.o + .bss 0x00000000 0x0 ./FreeRTOS_src/list.o + .text.vListInitialise + 0x00000000 0x40 ./FreeRTOS_src/list.o + .text.vListInitialiseItem + 0x00000000 0x18 ./FreeRTOS_src/list.o + .text.vListInsert + 0x00000000 0x70 ./FreeRTOS_src/list.o + .debug_macro 0x00000000 0x892 ./FreeRTOS_src/list.o + .debug_macro 0x00000000 0x10 ./FreeRTOS_src/list.o + .debug_macro 0x00000000 0x12d ./FreeRTOS_src/list.o + .debug_macro 0x00000000 0x46 ./FreeRTOS_src/list.o + .debug_macro 0x00000000 0x5b2 ./FreeRTOS_src/list.o + .debug_macro 0x00000000 0x14a ./FreeRTOS_src/list.o + .debug_macro 0x00000000 0xa3 ./FreeRTOS_src/list.o + .debug_macro 0x00000000 0x12 ./FreeRTOS_src/list.o + .debug_macro 0x00000000 0x1f ./FreeRTOS_src/list.o + .debug_macro 0x00000000 0x177 ./FreeRTOS_src/list.o + .debug_macro 0x00000000 0x49 ./FreeRTOS_src/list.o + .group 0x00000000 0x8 ./FreeRTOS_src/queue.o + .group 0x00000000 0x8 ./FreeRTOS_src/queue.o + .group 0x00000000 0x8 ./FreeRTOS_src/queue.o + .group 0x00000000 0x8 ./FreeRTOS_src/queue.o + .group 0x00000000 0x8 ./FreeRTOS_src/queue.o + .group 0x00000000 0x8 ./FreeRTOS_src/queue.o + .group 0x00000000 0x8 ./FreeRTOS_src/queue.o + .group 0x00000000 0x8 ./FreeRTOS_src/queue.o + .group 0x00000000 0x8 ./FreeRTOS_src/queue.o + .group 0x00000000 0x8 ./FreeRTOS_src/queue.o + .group 0x00000000 0x8 ./FreeRTOS_src/queue.o + .group 0x00000000 0x8 ./FreeRTOS_src/queue.o + .group 0x00000000 0x8 ./FreeRTOS_src/queue.o + .group 0x00000000 0x8 ./FreeRTOS_src/queue.o + .text 0x00000000 0x0 ./FreeRTOS_src/queue.o + .data 0x00000000 0x0 ./FreeRTOS_src/queue.o + .bss 0x00000000 0x0 ./FreeRTOS_src/queue.o + .text.xQueueCreate + 0x00000000 0xbc ./FreeRTOS_src/queue.o + .text.xQueueCreateMutex + 0x00000000 0x78 ./FreeRTOS_src/queue.o + .text.xQueueGiveMutexRecursive + 0x00000000 0x48 ./FreeRTOS_src/queue.o + .text.xQueueTakeMutexRecursive + 0x00000000 0x50 ./FreeRTOS_src/queue.o + .text.xQueueCreateCountingSemaphore + 0x00000000 0x2c ./FreeRTOS_src/queue.o + .text.xQueueGenericSend + 0x00000000 0x108 ./FreeRTOS_src/queue.o + .text.xQueueGenericSendFromISR + 0x00000000 0x80 ./FreeRTOS_src/queue.o + .text.xQueueGenericReceive + 0x00000000 0x168 ./FreeRTOS_src/queue.o + .text.xQueueReceiveFromISR + 0x00000000 0x84 ./FreeRTOS_src/queue.o + .text.uxQueueMessagesWaiting + 0x00000000 0x20 ./FreeRTOS_src/queue.o + .text.uxQueueMessagesWaitingFromISR + 0x00000000 0x1c ./FreeRTOS_src/queue.o + .text.vQueueDelete + 0x00000000 0x28 ./FreeRTOS_src/queue.o + .text.prvCopyDataToQueue + 0x00000000 0xb8 ./FreeRTOS_src/queue.o + .text.prvCopyDataFromQueue + 0x00000000 0x4c ./FreeRTOS_src/queue.o + .text.prvUnlockQueue + 0x00000000 0x98 ./FreeRTOS_src/queue.o + .text.prvIsQueueEmpty + 0x00000000 0x2c ./FreeRTOS_src/queue.o + .text.xQueueIsQueueEmptyFromISR + 0x00000000 0x24 ./FreeRTOS_src/queue.o + .text.prvIsQueueFull + 0x00000000 0x30 ./FreeRTOS_src/queue.o + .text.xQueueIsQueueFullFromISR + 0x00000000 0x28 ./FreeRTOS_src/queue.o + .text.vQueueAddToRegistry + 0x00000000 0x50 ./FreeRTOS_src/queue.o + .text.vQueueUnregisterQueue + 0x00000000 0x44 ./FreeRTOS_src/queue.o + .debug_info 0x00000000 0x891 ./FreeRTOS_src/queue.o + .debug_abbrev 0x00000000 0x1bb ./FreeRTOS_src/queue.o + .debug_aranges + 0x00000000 0xc0 ./FreeRTOS_src/queue.o + .debug_ranges 0x00000000 0xb0 ./FreeRTOS_src/queue.o + .debug_macro 0x00000000 0x137 ./FreeRTOS_src/queue.o + .debug_macro 0x00000000 0x892 ./FreeRTOS_src/queue.o + .debug_macro 0x00000000 0x10 ./FreeRTOS_src/queue.o + .debug_macro 0x00000000 0x12d ./FreeRTOS_src/queue.o + .debug_macro 0x00000000 0x28 ./FreeRTOS_src/queue.o + .debug_macro 0x00000000 0x46 ./FreeRTOS_src/queue.o + .debug_macro 0x00000000 0x5b2 ./FreeRTOS_src/queue.o + .debug_macro 0x00000000 0x14a ./FreeRTOS_src/queue.o + .debug_macro 0x00000000 0xa3 ./FreeRTOS_src/queue.o + .debug_macro 0x00000000 0x12 ./FreeRTOS_src/queue.o + .debug_macro 0x00000000 0x1f ./FreeRTOS_src/queue.o + .debug_macro 0x00000000 0x177 ./FreeRTOS_src/queue.o + .debug_macro 0x00000000 0x49 ./FreeRTOS_src/queue.o + .debug_macro 0x00000000 0x57 ./FreeRTOS_src/queue.o + .debug_macro 0x00000000 0x49 ./FreeRTOS_src/queue.o + .debug_line 0x00000000 0x480 ./FreeRTOS_src/queue.o + .debug_str 0x00000000 0x6660 ./FreeRTOS_src/queue.o + .comment 0x00000000 0x6f ./FreeRTOS_src/queue.o + .debug_frame 0x00000000 0x320 ./FreeRTOS_src/queue.o + .ARM.attributes + 0x00000000 0x33 ./FreeRTOS_src/queue.o + COMMON 0x00000000 0x50 ./FreeRTOS_src/queue.o + .group 0x00000000 0x8 ./FreeRTOS_src/tasks.o + .group 0x00000000 0x8 ./FreeRTOS_src/tasks.o + .group 0x00000000 0x8 ./FreeRTOS_src/tasks.o + .group 0x00000000 0x8 ./FreeRTOS_src/tasks.o + .group 0x00000000 0x8 ./FreeRTOS_src/tasks.o + .group 0x00000000 0x8 ./FreeRTOS_src/tasks.o + .group 0x00000000 0x8 ./FreeRTOS_src/tasks.o + .group 0x00000000 0x8 ./FreeRTOS_src/tasks.o + .group 0x00000000 0x8 ./FreeRTOS_src/tasks.o + .group 0x00000000 0x8 ./FreeRTOS_src/tasks.o + .group 0x00000000 0x8 ./FreeRTOS_src/tasks.o + .group 0x00000000 0x8 ./FreeRTOS_src/tasks.o + .group 0x00000000 0x8 ./FreeRTOS_src/tasks.o + .group 0x00000000 0x8 ./FreeRTOS_src/tasks.o + .group 0x00000000 0x8 ./FreeRTOS_src/tasks.o + .group 0x00000000 0x8 ./FreeRTOS_src/tasks.o + .text 0x00000000 0x0 ./FreeRTOS_src/tasks.o + .data 0x00000000 0x0 ./FreeRTOS_src/tasks.o + .bss 0x00000000 0x0 ./FreeRTOS_src/tasks.o + .bss.xDelayedTaskList1 + 0x00000000 0x14 ./FreeRTOS_src/tasks.o + .bss.xDelayedTaskList2 + 0x00000000 0x14 ./FreeRTOS_src/tasks.o + .bss.xPendingReadyList + 0x00000000 0x14 ./FreeRTOS_src/tasks.o + .bss.xTasksWaitingTermination + 0x00000000 0x14 ./FreeRTOS_src/tasks.o + .bss.uxTasksDeleted + 0x00000000 0x4 ./FreeRTOS_src/tasks.o + .bss.xSuspendedTaskList + 0x00000000 0x14 ./FreeRTOS_src/tasks.o + .bss.uxCurrentNumberOfTasks + 0x00000000 0x4 ./FreeRTOS_src/tasks.o + .bss.uxTopUsedPriority + 0x00000000 0x4 ./FreeRTOS_src/tasks.o + .bss.xSchedulerRunning + 0x00000000 0x4 ./FreeRTOS_src/tasks.o + .bss.uxTaskNumber + 0x00000000 0x4 ./FreeRTOS_src/tasks.o + .text.xTaskGenericCreate + 0x00000000 0x15c ./FreeRTOS_src/tasks.o + .text.vTaskDelete + 0x00000000 0x98 ./FreeRTOS_src/tasks.o + .text.vTaskDelayUntil + 0x00000000 0x98 ./FreeRTOS_src/tasks.o + .text.vTaskDelay + 0x00000000 0x54 ./FreeRTOS_src/tasks.o + .text.uxTaskPriorityGet + 0x00000000 0x34 ./FreeRTOS_src/tasks.o + .text.vTaskPrioritySet + 0x00000000 0xfc ./FreeRTOS_src/tasks.o + .text.vTaskSuspend + 0x00000000 0x9c ./FreeRTOS_src/tasks.o + .text.xTaskIsTaskSuspended + 0x00000000 0x44 ./FreeRTOS_src/tasks.o + .text.vTaskResume + 0x00000000 0x90 ./FreeRTOS_src/tasks.o + .text.xTaskResumeFromISR + 0x00000000 0xa0 ./FreeRTOS_src/tasks.o + .rodata 0x00000000 0x5 ./FreeRTOS_src/tasks.o + .text.vTaskStartScheduler + 0x00000000 0x5c ./FreeRTOS_src/tasks.o + .text.vTaskEndScheduler + 0x00000000 0x20 ./FreeRTOS_src/tasks.o + .text.vTaskSuspendAll + 0x00000000 0x1c ./FreeRTOS_src/tasks.o + .text.xTaskResumeAll + 0x00000000 0xf4 ./FreeRTOS_src/tasks.o + .text.xTaskGetTickCount + 0x00000000 0x24 ./FreeRTOS_src/tasks.o + .text.xTaskGetTickCountFromISR + 0x00000000 0x30 ./FreeRTOS_src/tasks.o + .text.uxTaskGetNumberOfTasks + 0x00000000 0x14 ./FreeRTOS_src/tasks.o + .text.vTaskPlaceOnEventList + 0x00000000 0x60 ./FreeRTOS_src/tasks.o + .text.xTaskRemoveFromEventList + 0x00000000 0xa0 ./FreeRTOS_src/tasks.o + .text.vTaskSetTimeOutState + 0x00000000 0x2c ./FreeRTOS_src/tasks.o + .text.xTaskCheckForTimeOut + 0x00000000 0x88 ./FreeRTOS_src/tasks.o + .text.vTaskMissedYield + 0x00000000 0x18 ./FreeRTOS_src/tasks.o + .text.prvIdleTask + 0x00000000 0x14 ./FreeRTOS_src/tasks.o + .text.prvInitialiseTCBVariables + 0x00000000 0x6c ./FreeRTOS_src/tasks.o + .text.prvInitialiseTaskLists + 0x00000000 0x80 ./FreeRTOS_src/tasks.o + .text.prvCheckTasksWaitingTermination + 0x00000000 0x78 ./FreeRTOS_src/tasks.o + .text.prvAddCurrentTaskToDelayedList + 0x00000000 0x6c ./FreeRTOS_src/tasks.o + .text.prvAllocateTCBAndStack + 0x00000000 0x64 ./FreeRTOS_src/tasks.o + .text.usTaskCheckFreeStackSpace + 0x00000000 0x30 ./FreeRTOS_src/tasks.o + .text.uxTaskGetStackHighWaterMark + 0x00000000 0x38 ./FreeRTOS_src/tasks.o + .text.prvDeleteTCB + 0x00000000 0x20 ./FreeRTOS_src/tasks.o + .text.xTaskGetCurrentTaskHandle + 0x00000000 0x1c ./FreeRTOS_src/tasks.o + .text.vTaskPriorityInherit + 0x00000000 0xa4 ./FreeRTOS_src/tasks.o + .text.vTaskPriorityDisinherit + 0x00000000 0x7c ./FreeRTOS_src/tasks.o + .debug_macro 0x00000000 0x892 ./FreeRTOS_src/tasks.o + .debug_macro 0x00000000 0x10 ./FreeRTOS_src/tasks.o + .debug_macro 0x00000000 0x12d ./FreeRTOS_src/tasks.o + .debug_macro 0x00000000 0xa0 ./FreeRTOS_src/tasks.o + .debug_macro 0x00000000 0x46 ./FreeRTOS_src/tasks.o + .debug_macro 0x00000000 0x5b2 ./FreeRTOS_src/tasks.o + .debug_macro 0x00000000 0x14a ./FreeRTOS_src/tasks.o + .debug_macro 0x00000000 0xa3 ./FreeRTOS_src/tasks.o + .debug_macro 0x00000000 0x12 ./FreeRTOS_src/tasks.o + .debug_macro 0x00000000 0x1f ./FreeRTOS_src/tasks.o + .debug_macro 0x00000000 0x177 ./FreeRTOS_src/tasks.o + .debug_macro 0x00000000 0x49 ./FreeRTOS_src/tasks.o + .debug_macro 0x00000000 0x57 ./FreeRTOS_src/tasks.o + .group 0x00000000 0x8 ./FreeRTOS_src/timers.o + .group 0x00000000 0x8 ./FreeRTOS_src/timers.o + .group 0x00000000 0x8 ./FreeRTOS_src/timers.o + .group 0x00000000 0x8 ./FreeRTOS_src/timers.o + .group 0x00000000 0x8 ./FreeRTOS_src/timers.o + .group 0x00000000 0x8 ./FreeRTOS_src/timers.o + .group 0x00000000 0x8 ./FreeRTOS_src/timers.o + .group 0x00000000 0x8 ./FreeRTOS_src/timers.o + .group 0x00000000 0x8 ./FreeRTOS_src/timers.o + .group 0x00000000 0x8 ./FreeRTOS_src/timers.o + .group 0x00000000 0x8 ./FreeRTOS_src/timers.o + .group 0x00000000 0x8 ./FreeRTOS_src/timers.o + .group 0x00000000 0x8 ./FreeRTOS_src/timers.o + .group 0x00000000 0x8 ./FreeRTOS_src/timers.o + .group 0x00000000 0x8 ./FreeRTOS_src/timers.o + .text 0x00000000 0x0 ./FreeRTOS_src/timers.o + .data 0x00000000 0x0 ./FreeRTOS_src/timers.o + .bss 0x00000000 0x0 ./FreeRTOS_src/timers.o + .debug_info 0x00000000 0x76 ./FreeRTOS_src/timers.o + .debug_abbrev 0x00000000 0x29 ./FreeRTOS_src/timers.o + .debug_aranges + 0x00000000 0x18 ./FreeRTOS_src/timers.o + .debug_macro 0x00000000 0xcf ./FreeRTOS_src/timers.o + .debug_macro 0x00000000 0x892 ./FreeRTOS_src/timers.o + .debug_macro 0x00000000 0x10 ./FreeRTOS_src/timers.o + .debug_macro 0x00000000 0x12d ./FreeRTOS_src/timers.o + .debug_macro 0x00000000 0x16 ./FreeRTOS_src/timers.o + .debug_macro 0x00000000 0x46 ./FreeRTOS_src/timers.o + .debug_macro 0x00000000 0x5b2 ./FreeRTOS_src/timers.o + .debug_macro 0x00000000 0x14a ./FreeRTOS_src/timers.o + .debug_macro 0x00000000 0xa3 ./FreeRTOS_src/timers.o + .debug_macro 0x00000000 0x12 ./FreeRTOS_src/timers.o + .debug_macro 0x00000000 0x1f ./FreeRTOS_src/timers.o + .debug_macro 0x00000000 0x177 ./FreeRTOS_src/timers.o + .debug_macro 0x00000000 0x49 ./FreeRTOS_src/timers.o + .debug_macro 0x00000000 0x57 ./FreeRTOS_src/timers.o + .debug_macro 0x00000000 0x6a ./FreeRTOS_src/timers.o + .debug_macro 0x00000000 0x61 ./FreeRTOS_src/timers.o + .debug_line 0x00000000 0x1bd ./FreeRTOS_src/timers.o + .debug_str 0x00000000 0x6518 ./FreeRTOS_src/timers.o + .comment 0x00000000 0x6f ./FreeRTOS_src/timers.o + .ARM.attributes + 0x00000000 0x33 ./FreeRTOS_src/timers.o + .group 0x00000000 0x8 ./FreeRTOS_portable/MemMang/heap_2.o + .group 0x00000000 0x8 ./FreeRTOS_portable/MemMang/heap_2.o + .group 0x00000000 0x8 ./FreeRTOS_portable/MemMang/heap_2.o + .group 0x00000000 0x8 ./FreeRTOS_portable/MemMang/heap_2.o + .group 0x00000000 0x8 ./FreeRTOS_portable/MemMang/heap_2.o + .group 0x00000000 0x8 ./FreeRTOS_portable/MemMang/heap_2.o + .group 0x00000000 0x8 ./FreeRTOS_portable/MemMang/heap_2.o + .group 0x00000000 0x8 ./FreeRTOS_portable/MemMang/heap_2.o + .group 0x00000000 0x8 ./FreeRTOS_portable/MemMang/heap_2.o + .group 0x00000000 0x8 ./FreeRTOS_portable/MemMang/heap_2.o + .group 0x00000000 0x8 ./FreeRTOS_portable/MemMang/heap_2.o + .group 0x00000000 0x8 ./FreeRTOS_portable/MemMang/heap_2.o + .group 0x00000000 0x8 ./FreeRTOS_portable/MemMang/heap_2.o + .text 0x00000000 0x0 ./FreeRTOS_portable/MemMang/heap_2.o + .data 0x00000000 0x0 ./FreeRTOS_portable/MemMang/heap_2.o + .bss 0x00000000 0x0 ./FreeRTOS_portable/MemMang/heap_2.o + .bss.xHeap 0x00000000 0x5000 ./FreeRTOS_portable/MemMang/heap_2.o + .rodata.heapSTRUCT_SIZE + 0x00000000 0x2 ./FreeRTOS_portable/MemMang/heap_2.o + .bss.xStart 0x00000000 0x8 ./FreeRTOS_portable/MemMang/heap_2.o + .bss.xEnd 0x00000000 0x8 ./FreeRTOS_portable/MemMang/heap_2.o + .data.xFreeBytesRemaining + 0x00000000 0x4 ./FreeRTOS_portable/MemMang/heap_2.o + .text.pvPortMalloc + 0x00000000 0x144 ./FreeRTOS_portable/MemMang/heap_2.o + .text.vPortFree + 0x00000000 0x74 ./FreeRTOS_portable/MemMang/heap_2.o + .text.xPortGetFreeHeapSize + 0x00000000 0x14 ./FreeRTOS_portable/MemMang/heap_2.o + .text.vPortInitialiseBlocks + 0x00000000 0xc ./FreeRTOS_portable/MemMang/heap_2.o + .bss.xHeapHasBeenInitialised.4156 + 0x00000000 0x4 ./FreeRTOS_portable/MemMang/heap_2.o + .debug_info 0x00000000 0x2a3 ./FreeRTOS_portable/MemMang/heap_2.o + .debug_abbrev 0x00000000 0x16b ./FreeRTOS_portable/MemMang/heap_2.o + .debug_aranges + 0x00000000 0x38 ./FreeRTOS_portable/MemMang/heap_2.o + .debug_ranges 0x00000000 0x28 ./FreeRTOS_portable/MemMang/heap_2.o + .debug_macro 0x00000000 0xe4 ./FreeRTOS_portable/MemMang/heap_2.o + .debug_macro 0x00000000 0x892 ./FreeRTOS_portable/MemMang/heap_2.o + .debug_macro 0x00000000 0x10 ./FreeRTOS_portable/MemMang/heap_2.o + .debug_macro 0x00000000 0x12d ./FreeRTOS_portable/MemMang/heap_2.o + .debug_macro 0x00000000 0x28 ./FreeRTOS_portable/MemMang/heap_2.o + .debug_macro 0x00000000 0x46 ./FreeRTOS_portable/MemMang/heap_2.o + .debug_macro 0x00000000 0x5b2 ./FreeRTOS_portable/MemMang/heap_2.o + .debug_macro 0x00000000 0x14a ./FreeRTOS_portable/MemMang/heap_2.o + .debug_macro 0x00000000 0xa3 ./FreeRTOS_portable/MemMang/heap_2.o + .debug_macro 0x00000000 0x12 ./FreeRTOS_portable/MemMang/heap_2.o + .debug_macro 0x00000000 0x1f ./FreeRTOS_portable/MemMang/heap_2.o + .debug_macro 0x00000000 0x177 ./FreeRTOS_portable/MemMang/heap_2.o + .debug_macro 0x00000000 0x49 ./FreeRTOS_portable/MemMang/heap_2.o + .debug_macro 0x00000000 0x57 ./FreeRTOS_portable/MemMang/heap_2.o + .debug_line 0x00000000 0x262 ./FreeRTOS_portable/MemMang/heap_2.o + .debug_str 0x00000000 0x5d69 ./FreeRTOS_portable/MemMang/heap_2.o + .comment 0x00000000 0x6f ./FreeRTOS_portable/MemMang/heap_2.o + .debug_frame 0x00000000 0x98 ./FreeRTOS_portable/MemMang/heap_2.o + .ARM.attributes + 0x00000000 0x33 ./FreeRTOS_portable/MemMang/heap_2.o + .group 0x00000000 0x8 ./FreeRTOS_portable/port.o + .group 0x00000000 0x8 ./FreeRTOS_portable/port.o + .group 0x00000000 0x8 ./FreeRTOS_portable/port.o + .group 0x00000000 0x8 ./FreeRTOS_portable/port.o + .group 0x00000000 0x8 ./FreeRTOS_portable/port.o + .group 0x00000000 0x8 ./FreeRTOS_portable/port.o + .group 0x00000000 0x8 ./FreeRTOS_portable/port.o + .group 0x00000000 0x8 ./FreeRTOS_portable/port.o + .group 0x00000000 0x8 ./FreeRTOS_portable/port.o + .group 0x00000000 0x8 ./FreeRTOS_portable/port.o + .group 0x00000000 0x8 ./FreeRTOS_portable/port.o + .group 0x00000000 0x8 ./FreeRTOS_portable/port.o + .group 0x00000000 0x8 ./FreeRTOS_portable/port.o + .text 0x00000000 0x0 ./FreeRTOS_portable/port.o + .data 0x00000000 0x0 ./FreeRTOS_portable/port.o + .bss 0x00000000 0x0 ./FreeRTOS_portable/port.o + .rodata.ulKernelPriority + 0x00000000 0x4 ./FreeRTOS_portable/port.o + .data.uxCriticalNesting + 0x00000000 0x4 ./FreeRTOS_portable/port.o + .text.pxPortInitialiseStack + 0x00000000 0x50 ./FreeRTOS_portable/port.o + .text.vPortStartFirstTask + 0x00000000 0x18 ./FreeRTOS_portable/port.o + .text.xPortStartScheduler + 0x00000000 0x38 ./FreeRTOS_portable/port.o + .text.vPortEndScheduler + 0x00000000 0xc ./FreeRTOS_portable/port.o + .text.vPortYieldFromISR + 0x00000000 0x18 ./FreeRTOS_portable/port.o + .text.vPortEnterCritical + 0x00000000 0x24 ./FreeRTOS_portable/port.o + .text.vPortExitCritical + 0x00000000 0x2c ./FreeRTOS_portable/port.o + .text.prvSetupTimerInterrupt + 0x00000000 0x24 ./FreeRTOS_portable/port.o + .debug_macro 0x00000000 0x892 ./FreeRTOS_portable/port.o + .debug_macro 0x00000000 0x10 ./FreeRTOS_portable/port.o + .debug_macro 0x00000000 0x12d ./FreeRTOS_portable/port.o + .debug_macro 0x00000000 0x16 ./FreeRTOS_portable/port.o + .debug_macro 0x00000000 0x46 ./FreeRTOS_portable/port.o + .debug_macro 0x00000000 0x5b2 ./FreeRTOS_portable/port.o + .debug_macro 0x00000000 0x14a ./FreeRTOS_portable/port.o + .debug_macro 0x00000000 0xa3 ./FreeRTOS_portable/port.o + .debug_macro 0x00000000 0x12 ./FreeRTOS_portable/port.o + .debug_macro 0x00000000 0x1f ./FreeRTOS_portable/port.o + .debug_macro 0x00000000 0x177 ./FreeRTOS_portable/port.o + .debug_macro 0x00000000 0x49 ./FreeRTOS_portable/port.o + .debug_macro 0x00000000 0x57 ./FreeRTOS_portable/port.o + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\CMSISv2p00_LPC17xx\Debug\libCMSISv2p00_LPC17xx.a(system_LPC17xx.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\CMSISv2p00_LPC17xx\Debug\libCMSISv2p00_LPC17xx.a(system_LPC17xx.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\CMSISv2p00_LPC17xx\Debug\libCMSISv2p00_LPC17xx.a(system_LPC17xx.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\CMSISv2p00_LPC17xx\Debug\libCMSISv2p00_LPC17xx.a(system_LPC17xx.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\CMSISv2p00_LPC17xx\Debug\libCMSISv2p00_LPC17xx.a(system_LPC17xx.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\CMSISv2p00_LPC17xx\Debug\libCMSISv2p00_LPC17xx.a(system_LPC17xx.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\CMSISv2p00_LPC17xx\Debug\libCMSISv2p00_LPC17xx.a(system_LPC17xx.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\CMSISv2p00_LPC17xx\Debug\libCMSISv2p00_LPC17xx.a(system_LPC17xx.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\CMSISv2p00_LPC17xx\Debug\libCMSISv2p00_LPC17xx.a(system_LPC17xx.o) + .text 0x00000000 0x0 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\CMSISv2p00_LPC17xx\Debug\libCMSISv2p00_LPC17xx.a(system_LPC17xx.o) + .data 0x00000000 0x0 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\CMSISv2p00_LPC17xx\Debug\libCMSISv2p00_LPC17xx.a(system_LPC17xx.o) + .bss 0x00000000 0x0 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\CMSISv2p00_LPC17xx\Debug\libCMSISv2p00_LPC17xx.a(system_LPC17xx.o) + .text.SystemCoreClockUpdate + 0x00000000 0xb4 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\CMSISv2p00_LPC17xx\Debug\libCMSISv2p00_LPC17xx.a(system_LPC17xx.o) + .data.SystemCoreClock + 0x00000000 0x4 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\CMSISv2p00_LPC17xx\Debug\libCMSISv2p00_LPC17xx.a(system_LPC17xx.o) + .debug_macro 0x00000000 0x10 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\CMSISv2p00_LPC17xx\Debug\libCMSISv2p00_LPC17xx.a(system_LPC17xx.o) + .debug_macro 0x00000000 0x12d C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\CMSISv2p00_LPC17xx\Debug\libCMSISv2p00_LPC17xx.a(system_LPC17xx.o) + .debug_macro 0x00000000 0x5b2 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\CMSISv2p00_LPC17xx\Debug\libCMSISv2p00_LPC17xx.a(system_LPC17xx.o) + .debug_macro 0x00000000 0x1c C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\CMSISv2p00_LPC17xx\Debug\libCMSISv2p00_LPC17xx.a(system_LPC17xx.o) + .debug_macro 0x00000000 0x2e C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\CMSISv2p00_LPC17xx\Debug\libCMSISv2p00_LPC17xx.a(system_LPC17xx.o) + .debug_macro 0x00000000 0x18 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\CMSISv2p00_LPC17xx\Debug\libCMSISv2p00_LPC17xx.a(system_LPC17xx.o) + .debug_macro 0x00000000 0x7af C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\CMSISv2p00_LPC17xx\Debug\libCMSISv2p00_LPC17xx.a(system_LPC17xx.o) + .debug_macro 0x00000000 0x2c7 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\CMSISv2p00_LPC17xx\Debug\libCMSISv2p00_LPC17xx.a(system_LPC17xx.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\FreeRTOSWithTraces\Debug\libMyLab_lib.a(uart.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\FreeRTOSWithTraces\Debug\libMyLab_lib.a(uart.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\FreeRTOSWithTraces\Debug\libMyLab_lib.a(uart.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\FreeRTOSWithTraces\Debug\libMyLab_lib.a(uart.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\FreeRTOSWithTraces\Debug\libMyLab_lib.a(uart.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\FreeRTOSWithTraces\Debug\libMyLab_lib.a(uart.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\FreeRTOSWithTraces\Debug\libMyLab_lib.a(uart.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\FreeRTOSWithTraces\Debug\libMyLab_lib.a(uart.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\FreeRTOSWithTraces\Debug\libMyLab_lib.a(uart.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\FreeRTOSWithTraces\Debug\libMyLab_lib.a(uart.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\FreeRTOSWithTraces\Debug\libMyLab_lib.a(uart.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\FreeRTOSWithTraces\Debug\libMyLab_lib.a(uart.o) + .text 0x00000000 0x0 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\FreeRTOSWithTraces\Debug\libMyLab_lib.a(uart.o) + .data 0x00000000 0x0 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\FreeRTOSWithTraces\Debug\libMyLab_lib.a(uart.o) + .bss 0x00000000 0x0 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\FreeRTOSWithTraces\Debug\libMyLab_lib.a(uart.o) + .text.NVIC_DisableIRQ + 0x00000000 0x34 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\FreeRTOSWithTraces\Debug\libMyLab_lib.a(uart.o) + .text.taskYIELD + 0x00000000 0xc C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\FreeRTOSWithTraces\Debug\libMyLab_lib.a(uart.o) + .text.uart0_stop_interrupt + 0x00000000 0x10 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\FreeRTOSWithTraces\Debug\libMyLab_lib.a(uart.o) + .text.uart0_send_ref + 0x00000000 0x40 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\FreeRTOSWithTraces\Debug\libMyLab_lib.a(uart.o) + .debug_macro 0x00000000 0x1c C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\FreeRTOSWithTraces\Debug\libMyLab_lib.a(uart.o) + .debug_macro 0x00000000 0x2e C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\FreeRTOSWithTraces\Debug\libMyLab_lib.a(uart.o) + .debug_macro 0x00000000 0x10 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\FreeRTOSWithTraces\Debug\libMyLab_lib.a(uart.o) + .debug_macro 0x00000000 0x12d C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\FreeRTOSWithTraces\Debug\libMyLab_lib.a(uart.o) + .debug_macro 0x00000000 0x5b2 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\FreeRTOSWithTraces\Debug\libMyLab_lib.a(uart.o) + .debug_macro 0x00000000 0x18 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\FreeRTOSWithTraces\Debug\libMyLab_lib.a(uart.o) + .debug_macro 0x00000000 0x7af C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\FreeRTOSWithTraces\Debug\libMyLab_lib.a(uart.o) + .debug_macro 0x00000000 0x2c7 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\FreeRTOSWithTraces\Debug\libMyLab_lib.a(uart.o) + .debug_macro 0x00000000 0x28 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\FreeRTOSWithTraces\Debug\libMyLab_lib.a(uart.o) + .debug_macro 0x00000000 0x2e C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\FreeRTOSWithTraces\Debug\libMyLab_lib.a(uart.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(_cr__main.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(_cr__main.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(_cr__main.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(memcpy.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(memcpy.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(memcpy.o) + .text.memcpy 0x00000000 0x4 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(memcpy.o) + .comment 0x00000000 0x6f c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(memcpy.o) + .ARM.attributes + 0x00000000 0x33 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(memcpy.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(memset.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(memset.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(memset.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_cr_assert.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_cr_assert.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_cr_assert.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_deferredlazyseek.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_deferredlazyseek.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_deferredlazyseek.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_fflush.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_fflush.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_fflush.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_writebuf.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_writebuf.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_writebuf.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(alloc.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(alloc.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(alloc.o) + .text.calloc 0x00000000 0x50 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(alloc.o) + .text.realloc 0x00000000 0x24 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(alloc.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fputs.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fputs.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fputs.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fseek.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fseek.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fseek.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(ftell.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(ftell.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(ftell.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(initio.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(initio.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(initio.o) + .text._terminateio + 0x00000000 0x44 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(initio.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(setvbuf.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(setvbuf.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(setvbuf.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(stdio.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(stdio.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(stdio.o) + .text.getc 0x00000000 0x18 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(stdio.o) + .text.fgetc 0x00000000 0x4 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(stdio.o) + .text.getchar 0x00000000 0x20 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(stdio.o) + .text.putc 0x00000000 0x24 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(stdio.o) + .text.fputc 0x00000000 0x4 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(stdio.o) + .text.putchar 0x00000000 0x24 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(stdio.o) + .text.feof 0x00000000 0x8 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(stdio.o) + .text.ferror 0x00000000 0x8 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(stdio.o) + .text.clearerr + 0x00000000 0xe c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(stdio.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(strncpy.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(strncpy.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(strncpy.o) + .text.strncpy 0x00000000 0x56 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(strncpy.o) + .comment 0x00000000 0x6f c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(strncpy.o) + .ARM.attributes + 0x00000000 0x33 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(strncpy.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(__fillbuf.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(__fillbuf.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(__fillbuf.o) + .text._Csys_read_ + 0x00000000 0x22 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(__fillbuf.o) + .text.__filbuf + 0x00000000 0x178 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(__fillbuf.o) + .text._fillb2 0x00000000 0x1c c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(__fillbuf.o) + .comment 0x00000000 0x6f c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(__fillbuf.o) + .ARM.attributes + 0x00000000 0x33 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(__fillbuf.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(__init_alloc.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(__init_alloc.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(__init_alloc.o) + .text._init_alloc + 0x00000000 0x14 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(__init_alloc.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_cr_sbrk.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_cr_sbrk.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_cr_sbrk.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_fdopen.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_fdopen.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_fdopen.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(errno.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(errno.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(errno.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fclose.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fclose.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fclose.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fflush.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fflush.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fflush.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(remove.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(remove.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(remove.o) + .text.rename 0x00000000 0x28 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(remove.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(strlen.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(strlen.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(strlen.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_cr_check_heap.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_cr_check_heap.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_cr_check_heap.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_do_fflush.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_do_fflush.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_do_fflush.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(division_64.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(division_64.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(division_64.o) + .text.__aeabi_division_ldivmod + 0x00000000 0x26 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(division_64.o) + .text.__aeabi_division_uldivmod + 0x00000000 0x174 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(division_64.o) + .ARM.attributes + 0x00000000 0x21 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(division_64.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(division_idiv0.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(division_idiv0.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(division_idiv0.o) + .text.__aeabi_division_idiv0 + 0x00000000 0x2 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(division_idiv0.o) + .ARM.attributes + 0x00000000 0x21 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(division_idiv0.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(memcpy.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(memcpy.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(memcpy.o) + .text.__aeabi_memcpy + 0x00000000 0x34 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(memcpy.o) + .text.__aeabi_memmove + 0x00000000 0x1c c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(memcpy.o) + .text.__aeabi_memclr + 0x00000000 0x8 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(memcpy.o) + .text.__aeabi_memset + 0x00000000 0xa c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(memcpy.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_appexit.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_appexit.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_appexit.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_close.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_close.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_close.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_flen.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_flen.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_flen.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_istty.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_istty.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_istty.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_read.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_read.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_read.o) + .text.__sys_read + 0x00000000 0xc c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_read.o) + .ARM.attributes + 0x00000000 0x21 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_read.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_readc.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_readc.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_readc.o) + .text.__sys_readc + 0x00000000 0x8 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_readc.o) + .ARM.attributes + 0x00000000 0x21 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_readc.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_remove.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_remove.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_remove.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_rename.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_rename.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_rename.o) + .text.__sys_rename + 0x00000000 0xc c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_rename.o) + .ARM.attributes + 0x00000000 0x21 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_rename.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_seek.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_seek.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_seek.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_tmpnam.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_tmpnam.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_tmpnam.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_write.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_write.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_write.o) + +Memory Configuration + +Name Origin Length Attributes +MFlash512 0x00000000 0x00080000 xr +RamLoc32 0x10000000 0x00008000 xrw +RamAHB32 0x2007c000 0x00008000 xrw +*default* 0x00000000 0xffffffff + +Linker script and memory map + +LOAD ./src/cr_startup_lpc17.o +LOAD ./src/main.o +LOAD ./FreeRTOS_src/croutine.o +LOAD ./FreeRTOS_src/list.o +LOAD ./FreeRTOS_src/queue.o +LOAD ./FreeRTOS_src/tasks.o +LOAD ./FreeRTOS_src/timers.o +LOAD ./FreeRTOS_portable/MemMang/heap_2.o +LOAD ./FreeRTOS_portable/port.o +LOAD C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\CMSISv2p00_LPC17xx\Debug\libCMSISv2p00_LPC17xx.a +LOAD C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\FreeRTOSWithTraces\Debug\libMyLab_lib.a +START GROUP +LOAD c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a +LOAD c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a +LOAD c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a +END GROUP + 0x00000000 __base_MFlash512 = 0x0 + 0x00000000 __base_Flash = 0x0 + 0x00080000 __top_MFlash512 = 0x80000 + 0x00080000 __top_Flash = 0x80000 + 0x10000000 __base_RamLoc32 = 0x10000000 + 0x10000000 __base_RAM = 0x10000000 + 0x10008000 __top_RamLoc32 = 0x10008000 + 0x10008000 __top_RAM = 0x10008000 + 0x2007c000 __base_RamAHB32 = 0x2007c000 + 0x2007c000 __base_RAM2 = 0x2007c000 + 0x20084000 __top_RamAHB32 = 0x20084000 + 0x20084000 __top_RAM2 = 0x20084000 + +.text 0x00000000 0x10ac + FILL mask 0xff + 0x00000000 __vectors_start__ = ABSOLUTE (.) + *(.isr_vector) + .isr_vector 0x00000000 0xcc ./src/cr_startup_lpc17.o + 0x00000000 g_pfnVectors + 0x000000cc . = ALIGN (0x4) + 0x000000cc __section_table_start = . + 0x000000cc __data_section_table = . + 0x000000cc 0x4 LONG 0x10ac LOADADDR (.data) + 0x000000d0 0x4 LONG 0x10000000 ADDR (.data) + 0x000000d4 0x4 LONG 0x8 SIZEOF (.data) + 0x000000d8 0x4 LONG 0x10ac LOADADDR (.data_RAM2) + 0x000000dc 0x4 LONG 0x2007c000 ADDR (.data_RAM2) + 0x000000e0 0x4 LONG 0x0 SIZEOF (.data_RAM2) + 0x000000e4 __data_section_table_end = . + 0x000000e4 __bss_section_table = . + 0x000000e4 0x4 LONG 0x10000008 ADDR (.bss) + 0x000000e8 0x4 LONG 0x1e0 SIZEOF (.bss) + 0x000000ec 0x4 LONG 0x2007c000 ADDR (.bss_RAM2) + 0x000000f0 0x4 LONG 0x0 SIZEOF (.bss_RAM2) + 0x000000f4 __bss_section_table_end = . + 0x000000f4 __section_table_end = . + *(.after_vectors*) + *(.text*) + .text.ResetISR + 0x000000f4 0x58 ./src/cr_startup_lpc17.o + 0x000000f4 ResetISR + .text.NMI_Handler + 0x0000014c 0x8 ./src/cr_startup_lpc17.o + 0x0000014c NMI_Handler + .text.HardFault_Handler + 0x00000154 0x8 ./src/cr_startup_lpc17.o + 0x00000154 HardFault_Handler + .text.MemManage_Handler + 0x0000015c 0x8 ./src/cr_startup_lpc17.o + 0x0000015c MemManage_Handler + .text.BusFault_Handler + 0x00000164 0x8 ./src/cr_startup_lpc17.o + 0x00000164 BusFault_Handler + .text.UsageFault_Handler + 0x0000016c 0x8 ./src/cr_startup_lpc17.o + 0x0000016c UsageFault_Handler + .text.DebugMon_Handler + 0x00000174 0x8 ./src/cr_startup_lpc17.o + 0x00000174 DebugMon_Handler + .text.IntDefaultHandler + 0x0000017c 0x8 ./src/cr_startup_lpc17.o + 0x0000017c TIMER2_IRQHandler + 0x0000017c RIT_IRQHandler + 0x0000017c I2C0_IRQHandler + 0x0000017c USBActivity_IRQHandler + 0x0000017c PWM1_IRQHandler + 0x0000017c I2C1_IRQHandler + 0x0000017c EINT2_IRQHandler + 0x0000017c UART1_IRQHandler + 0x0000017c EINT3_IRQHandler + 0x0000017c CANActivity_IRQHandler + 0x0000017c TIMER3_IRQHandler + 0x0000017c IntDefaultHandler + 0x0000017c PLL0_IRQHandler + 0x0000017c CAN_IRQHandler + 0x0000017c PLL1_IRQHandler + 0x0000017c SSP0_IRQHandler + 0x0000017c I2S_IRQHandler + 0x0000017c I2C2_IRQHandler + 0x0000017c RTC_IRQHandler + 0x0000017c TIMER0_IRQHandler + 0x0000017c SPI_IRQHandler + 0x0000017c EINT1_IRQHandler + 0x0000017c TIMER1_IRQHandler + 0x0000017c UART2_IRQHandler + 0x0000017c ADC_IRQHandler + 0x0000017c SSP1_IRQHandler + 0x0000017c USB_IRQHandler + 0x0000017c BOD_IRQHandler + 0x0000017c WDT_IRQHandler + 0x0000017c QEI_IRQHandler + 0x0000017c EINT0_IRQHandler + 0x0000017c DMA_IRQHandler + 0x0000017c UART3_IRQHandler + 0x0000017c MCPWM_IRQHandler + 0x0000017c ENET_IRQHandler + .text.write_trace + 0x00000184 0x1c ./src/main.o + 0x00000184 write_trace + .text.main 0x000001a0 0x18 ./src/main.o + 0x000001a0 main + .text.vListInsertEnd + 0x000001b8 0x50 ./FreeRTOS_src/list.o + 0x000001b8 vListInsertEnd + .text.vListRemove + 0x00000208 0x50 ./FreeRTOS_src/list.o + 0x00000208 vListRemove + .text.vTaskIncrementTick + 0x00000258 0x12c ./FreeRTOS_src/tasks.o + 0x00000258 vTaskIncrementTick + .text.vTaskSwitchContext + 0x00000384 0xd8 ./FreeRTOS_src/tasks.o + 0x00000384 vTaskSwitchContext + .text.vPortSVCHandler + 0x0000045c 0x24 ./FreeRTOS_portable/port.o + 0x0000045c vPortSVCHandler + .text.xPortPendSVHandler + 0x00000480 0x40 ./FreeRTOS_portable/port.o + 0x00000480 xPortPendSVHandler + .text.xPortSysTickHandler + 0x000004c0 0x34 ./FreeRTOS_portable/port.o + 0x000004c0 xPortSysTickHandler + .text.SystemInit + 0x000004f4 0xe4 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\CMSISv2p00_LPC17xx\Debug\libCMSISv2p00_LPC17xx.a(system_LPC17xx.o) + 0x000004f4 SystemInit + .text.NVIC_EnableIRQ + 0x000005d8 0x30 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\FreeRTOSWithTraces\Debug\libMyLab_lib.a(uart.o) + .text.UART0_IRQHandler + 0x00000608 0x70 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\FreeRTOSWithTraces\Debug\libMyLab_lib.a(uart.o) + 0x00000608 UART0_IRQHandler + .text.uart0_init_ref + 0x00000678 0xf8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\FreeRTOSWithTraces\Debug\libMyLab_lib.a(uart.o) + 0x00000678 uart0_init_ref + .text.__main 0x00000770 0x14 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(_cr__main.o) + 0x00000770 __CR_SEMIHOST + 0x00000770 __main + .text.memset 0x00000784 0x4 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(memset.o) + 0x00000784 memset + .text.__assertion_failed + 0x00000788 0x48 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_cr_assert.o) + 0x00000788 __assertion_failed + .text._deferredlazyseek + 0x000007d0 0x44 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_deferredlazyseek.o) + 0x000007d0 _deferredlazyseek + .text.__flsbuf + 0x00000814 0x140 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_deferredlazyseek.o) + 0x00000814 __flsbuf + .text._fflush 0x00000954 0x58 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_fflush.o) + 0x00000954 _fflush + .text._Cwritebuf + 0x000009ac 0x68 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_writebuf.o) + 0x000009ac _Cwritebuf + .text.malloc 0x00000a14 0xc8 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(alloc.o) + 0x00000a14 malloc + .text.free 0x00000adc 0x30 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(alloc.o) + 0x00000adc free + .text._Csys_alloc + 0x00000b0c 0x20 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(alloc.o) + 0x00000b0c _Csys_alloc + .text.fputs 0x00000b2c 0x2c c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fputs.o) + 0x00000b2c fputs + .text.fseek 0x00000b58 0x110 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fseek.o) + 0x00000b58 fseek + .text.ftell 0x00000c68 0x4c c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(ftell.o) + 0x00000c68 ftell + .text._initio 0x00000cb4 0xa4 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(initio.o) + 0x00000cb4 _initio + .text.setvbuf 0x00000d58 0x40 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(setvbuf.o) + 0x00000d58 setvbuf + .text._sbrk 0x00000d98 0x40 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_cr_sbrk.o) + 0x00000d98 _sbrk + .text._fdopen 0x00000dd8 0x6a c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_fdopen.o) + 0x00000dd8 _fdopen + .text.fclose 0x00000e42 0x6c c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fclose.o) + 0x00000e42 fclose + *fill* 0x00000eae 0x2 ff + .text.fflush 0x00000eb0 0x30 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fflush.o) + 0x00000eb0 fflush + .text.remove 0x00000ee0 0x14 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(remove.o) + 0x00000ee0 remove + .text.strlen 0x00000ef4 0x4a c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(strlen.o) + 0x00000ef4 strlen + *fill* 0x00000f3e 0x2 ff + .text.__check_heap_overflow + 0x00000f40 0x18 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_cr_check_heap.o) + 0x00000f40 __check_heap_overflow + .text._do_fflush + 0x00000f58 0x44 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_do_fflush.o) + 0x00000f58 _do_fflush + .text.__aeabi_memset_lowlevel + 0x00000f9c 0x32 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(memcpy.o) + 0x00000f9c __aeabi_lowlevel_memset + *fill* 0x00000fce 0x2 ff + .text.__sys_appexit + 0x00000fd0 0xc c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_appexit.o) + 0x00000fd0 __sys_appexit + 0x00000fd0 __exit + .text.__sys_close + 0x00000fdc 0xc c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_close.o) + 0x00000fdc __sys_close + .text.__sys_flen + 0x00000fe8 0xc c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_flen.o) + 0x00000fe8 __sys_flen + .text.__sys_istty + 0x00000ff4 0xc c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_istty.o) + 0x00000ff4 __sys_istty + .text.__sys_remove + 0x00001000 0xc c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_remove.o) + 0x00001000 __sys_remove + .text.__sys_seek + 0x0000100c 0xc c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_seek.o) + 0x0000100c __sys_seek + .text.__sys_tmpnam + 0x00001018 0xc c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_tmpnam.o) + 0x00001018 __sys_tmpnam + .text.__sys_write + 0x00001024 0xc c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_write.o) + 0x00001024 __sys_write + 0x00001024 __write + *(.rodata .rodata.* .constdata .constdata.*) + .rodata 0x00001030 0x48 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\FreeRTOSWithTraces\Debug\libMyLab_lib.a(uart.o) + .rodata.str1.1 + 0x00001078 0x15 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_cr_assert.o) + .rodata.str1.1 + 0x0000108d 0x18 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(alloc.o) + .rodata.str1.1 + 0x000010a5 0x4 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(initio.o) + 0x000010ac . = ALIGN (0x4) + *fill* 0x000010a9 0x3 ff + +.glue_7 0x000010ac 0x0 + .glue_7 0x000010ac 0x0 linker stubs + +.glue_7t 0x000010ac 0x0 + .glue_7t 0x000010ac 0x0 linker stubs + +.vfp11_veneer 0x000010ac 0x0 + .vfp11_veneer 0x000010ac 0x0 linker stubs + +.v4_bx 0x000010ac 0x0 + .v4_bx 0x000010ac 0x0 linker stubs + +.iplt 0x000010ac 0x0 + .iplt 0x000010ac 0x0 ./src/cr_startup_lpc17.o + +.rel.dyn 0x000010ac 0x0 + .rel.iplt 0x000010ac 0x0 ./src/cr_startup_lpc17.o + +.ARM.extab + *(.ARM.extab* .gnu.linkonce.armextab.*) + 0x000010ac __exidx_start = . + +.ARM.exidx + *(.ARM.exidx* .gnu.linkonce.armexidx.*) + 0x000010ac __exidx_end = . + 0x000010ac _etext = . + +.data_RAM2 0x2007c000 0x0 load address 0x000010ac + FILL mask 0xff + [!provide] PROVIDE (__start_data_RAM2, .) + *(.ramfunc.$RAM2) + *(.ramfunc.$RamAHB32) + *(.data.$RAM2*) + *(.data.$RamAHB32*) + 0x2007c000 . = ALIGN (0x4) + [!provide] PROVIDE (__end_data_RAM2, .) + +.uninit_RESERVED + 0x10000000 0x0 + *(.bss.$RESERVED*) + 0x10000000 . = ALIGN (0x4) + 0x10000000 _end_uninit_RESERVED = . + +.data 0x10000000 0x8 load address 0x000010ac + FILL mask 0xff + 0x10000000 _data = . + *(vtable) + *(.ramfunc*) + *(.data*) + .data.previous_id_in + 0x10000000 0x4 ./FreeRTOS_src/tasks.o + .data.xNextTaskUnblockTime + 0x10000004 0x4 ./FreeRTOS_src/tasks.o + 0x10000008 . = ALIGN (0x4) + 0x10000008 _edata = . + +.igot.plt 0x10000008 0x0 load address 0x000010b4 + .igot.plt 0x10000008 0x0 ./src/cr_startup_lpc17.o + +.bss_RAM2 0x2007c000 0x0 + [!provide] PROVIDE (__start_bss_RAM2, .) + *(.bss.$RAM2*) + *(.bss.$RamAHB32*) + 0x2007c000 . = ALIGN ((. != 0x0)?0x4:0x1) + [!provide] PROVIDE (__end_bss_RAM2, .) + +.bss 0x10000008 0x1e0 + 0x10000008 _bss = . + *(.bss*) + .bss.pxCurrentTCB + 0x10000008 0x4 ./FreeRTOS_src/tasks.o + 0x10000008 pxCurrentTCB + .bss.pxReadyTasksLists + 0x1000000c 0x64 ./FreeRTOS_src/tasks.o + .bss.pxDelayedTaskList + 0x10000070 0x4 ./FreeRTOS_src/tasks.o + .bss.pxOverflowDelayedTaskList + 0x10000074 0x4 ./FreeRTOS_src/tasks.o + .bss.xTickCount + 0x10000078 0x4 ./FreeRTOS_src/tasks.o + .bss.uxTopReadyPriority + 0x1000007c 0x4 ./FreeRTOS_src/tasks.o + .bss.uxSchedulerSuspended + 0x10000080 0x4 ./FreeRTOS_src/tasks.o + .bss.uxMissedTicks + 0x10000084 0x4 ./FreeRTOS_src/tasks.o + .bss.xMissedYield + 0x10000088 0x4 ./FreeRTOS_src/tasks.o + .bss.xNumOfOverflows + 0x1000008c 0x4 ./FreeRTOS_src/tasks.o + .bss.tx_callbck + 0x10000090 0x4 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\FreeRTOSWithTraces\Debug\libMyLab_lib.a(uart.o) + .bss.rx_callbck + 0x10000094 0x4 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\FreeRTOSWithTraces\Debug\libMyLab_lib.a(uart.o) + .bss._extra 0x10000098 0x4 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(initio.o) + 0x10000098 _extra + .bss.__Ciob 0x1000009c 0x140 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(stdio.o) + 0x1000009c __Ciob + .bss.__heaps 0x100001dc 0x4 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(__init_alloc.o) + 0x100001dc __heaps + .bss.__end_of_heap + 0x100001e0 0x4 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(__init_alloc.o) + 0x100001e0 __end_of_heap + .bss.errno 0x100001e4 0x4 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(errno.o) + 0x100001e4 errno + *(COMMON) + 0x100001e8 . = ALIGN (0x4) + 0x100001e8 _ebss = . + [!provide] PROVIDE (end, .) + +.noinit_RAM2 0x2007c000 0x0 + *(.noinit.$RAM2*) + *(.noinit.$RamAHB32*) + 0x2007c000 . = ALIGN (0x4) + +.noinit 0x100001e8 0x0 + 0x100001e8 _noinit = . + *(.noinit*) + 0x100001e8 . = ALIGN (0x4) + 0x100001e8 _end_noinit = . + 0x100001e8 PROVIDE (_pvHeapStart, DEFINED (__user_heap_base)?__user_heap_base:.) + 0x10008000 PROVIDE (_vStackTop, DEFINED (__user_stack_top)?__user_stack_top:(__top_RamLoc32 - 0x0)) + [!provide] PROVIDE (__valid_user_code_checksum, (0x0 - ((((((_vStackTop + (ResetISR + 0x1)) + (NMI_Handler + 0x1)) + (HardFault_Handler + 0x1)) + (DEFINED (MemManage_Handler)?MemManage_Handler:0x0 + 0x1)) + (DEFINED (BusFault_Handler)?BusFault_Handler:0x0 + 0x1)) + (DEFINED (UsageFault_Handler)?UsageFault_Handler:0x0 + 0x1)))) +OUTPUT(FreeRTOSWithTraces.axf elf32-littlearm) + +.debug_info 0x00000000 0x20fe + .debug_info 0x00000000 0x187 ./src/cr_startup_lpc17.o + .debug_info 0x00000187 0xec ./src/main.o + .debug_info 0x00000273 0x280 ./FreeRTOS_src/list.o + .debug_info 0x000004f3 0xd85 ./FreeRTOS_src/tasks.o + .debug_info 0x00001278 0x1db ./FreeRTOS_portable/port.o + .debug_info 0x00001453 0x318 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\CMSISv2p00_LPC17xx\Debug\libCMSISv2p00_LPC17xx.a(system_LPC17xx.o) + .debug_info 0x0000176b 0x993 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\FreeRTOSWithTraces\Debug\libMyLab_lib.a(uart.o) + +.debug_abbrev 0x00000000 0x81e + .debug_abbrev 0x00000000 0xb9 ./src/cr_startup_lpc17.o + .debug_abbrev 0x000000b9 0xa4 ./src/main.o + .debug_abbrev 0x0000015d 0xbf ./FreeRTOS_src/list.o + .debug_abbrev 0x0000021c 0x1fd ./FreeRTOS_src/tasks.o + .debug_abbrev 0x00000419 0x11d ./FreeRTOS_portable/port.o + .debug_abbrev 0x00000536 0xe6 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\CMSISv2p00_LPC17xx\Debug\libCMSISv2p00_LPC17xx.a(system_LPC17xx.o) + .debug_abbrev 0x0000061c 0x202 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\FreeRTOSWithTraces\Debug\libMyLab_lib.a(uart.o) + +.debug_aranges 0x00000000 0x2e0 + .debug_aranges + 0x00000000 0x58 ./src/cr_startup_lpc17.o + .debug_aranges + 0x00000058 0x28 ./src/main.o + .debug_aranges + 0x00000080 0x40 ./FreeRTOS_src/list.o + .debug_aranges + 0x000000c0 0x138 ./FreeRTOS_src/tasks.o + .debug_aranges + 0x000001f8 0x70 ./FreeRTOS_portable/port.o + .debug_aranges + 0x00000268 0x28 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\CMSISv2p00_LPC17xx\Debug\libCMSISv2p00_LPC17xx.a(system_LPC17xx.o) + .debug_aranges + 0x00000290 0x50 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\FreeRTOSWithTraces\Debug\libMyLab_lib.a(uart.o) + +.debug_ranges 0x00000000 0x270 + .debug_ranges 0x00000000 0x48 ./src/cr_startup_lpc17.o + .debug_ranges 0x00000048 0x18 ./src/main.o + .debug_ranges 0x00000060 0x30 ./FreeRTOS_src/list.o + .debug_ranges 0x00000090 0x128 ./FreeRTOS_src/tasks.o + .debug_ranges 0x000001b8 0x60 ./FreeRTOS_portable/port.o + .debug_ranges 0x00000218 0x18 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\CMSISv2p00_LPC17xx\Debug\libCMSISv2p00_LPC17xx.a(system_LPC17xx.o) + .debug_ranges 0x00000230 0x40 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\FreeRTOSWithTraces\Debug\libMyLab_lib.a(uart.o) + +.debug_macro 0x00000000 0x38a4 + .debug_macro 0x00000000 0x52 ./src/cr_startup_lpc17.o + .debug_macro 0x00000052 0x892 ./src/cr_startup_lpc17.o + .debug_macro 0x000008e4 0x10 ./src/cr_startup_lpc17.o + .debug_macro 0x000008f4 0x12d ./src/cr_startup_lpc17.o + .debug_macro 0x00000a21 0x5b2 ./src/cr_startup_lpc17.o + .debug_macro 0x00000fd3 0x11c ./src/main.o + .debug_macro 0x000010ef 0x1c ./src/main.o + .debug_macro 0x0000110b 0x2e ./src/main.o + .debug_macro 0x00001139 0x18 ./src/main.o + .debug_macro 0x00001151 0x7af ./src/main.o + .debug_macro 0x00001900 0x2c7 ./src/main.o + .debug_macro 0x00001bc7 0xa0 ./src/main.o + .debug_macro 0x00001c67 0x10 ./src/main.o + .debug_macro 0x00001c77 0x46 ./src/main.o + .debug_macro 0x00001cbd 0x150 ./src/main.o + .debug_macro 0x00001e0d 0xa3 ./src/main.o + .debug_macro 0x00001eb0 0x12 ./src/main.o + .debug_macro 0x00001ec2 0x1f ./src/main.o + .debug_macro 0x00001ee1 0x177 ./src/main.o + .debug_macro 0x00002058 0x49 ./src/main.o + .debug_macro 0x000020a1 0x57 ./src/main.o + .debug_macro 0x000020f8 0x6a ./src/main.o + .debug_macro 0x00002162 0x62 ./src/main.o + .debug_macro 0x000021c4 0x2e ./src/main.o + .debug_macro 0x000021f2 0xb6 ./FreeRTOS_src/list.o + .debug_macro 0x000022a8 0x28 ./FreeRTOS_src/list.o + .debug_macro 0x000022d0 0x149 ./FreeRTOS_src/tasks.o + .debug_macro 0x00002419 0x22 ./FreeRTOS_src/tasks.o + .debug_macro 0x0000243b 0x61 ./FreeRTOS_src/tasks.o + .debug_macro 0x0000249c 0x16 ./FreeRTOS_src/tasks.o + .debug_macro 0x000024b2 0xf3 ./FreeRTOS_portable/port.o + .debug_macro 0x000025a5 0x12b C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\CMSISv2p00_LPC17xx\Debug\libCMSISv2p00_LPC17xx.a(system_LPC17xx.o) + .debug_macro 0x000026d0 0x886 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\CMSISv2p00_LPC17xx\Debug\libCMSISv2p00_LPC17xx.a(system_LPC17xx.o) + .debug_macro 0x00002f56 0xa0 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\FreeRTOSWithTraces\Debug\libMyLab_lib.a(uart.o) + .debug_macro 0x00002ff6 0x898 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\FreeRTOSWithTraces\Debug\libMyLab_lib.a(uart.o) + .debug_macro 0x0000388e 0x16 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\FreeRTOSWithTraces\Debug\libMyLab_lib.a(uart.o) + +.debug_line 0x00000000 0x1521 + .debug_line 0x00000000 0x211 ./src/cr_startup_lpc17.o + .debug_line 0x00000211 0x27e ./src/main.o + .debug_line 0x0000048f 0x22a ./FreeRTOS_src/list.o + .debug_line 0x000006b9 0x769 ./FreeRTOS_src/tasks.o + .debug_line 0x00000e22 0x275 ./FreeRTOS_portable/port.o + .debug_line 0x00001097 0x1d3 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\CMSISv2p00_LPC17xx\Debug\libCMSISv2p00_LPC17xx.a(system_LPC17xx.o) + .debug_line 0x0000126a 0x2b7 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\FreeRTOSWithTraces\Debug\libMyLab_lib.a(uart.o) + +.debug_str 0x00000000 0xcb5d + .debug_str 0x00000000 0x3cf3 ./src/cr_startup_lpc17.o + 0x3d7e (size before relaxing) + .debug_str 0x00003cf3 0x6c1f ./src/main.o + 0xa893 (size before relaxing) + .debug_str 0x0000a912 0x1c2 ./FreeRTOS_src/list.o + 0x56c5 (size before relaxing) + .debug_str 0x0000aad4 0x1256 ./FreeRTOS_src/tasks.o + 0x6de4 (size before relaxing) + .debug_str 0x0000bd2a 0x368 ./FreeRTOS_portable/port.o + 0x5bdc (size before relaxing) + .debug_str 0x0000c092 0x563 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\CMSISv2p00_LPC17xx\Debug\libCMSISv2p00_LPC17xx.a(system_LPC17xx.o) + 0x8146 (size before relaxing) + .debug_str 0x0000c5f5 0x568 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\FreeRTOSWithTraces\Debug\libMyLab_lib.a(uart.o) + 0x8474 (size before relaxing) + +.comment 0x00000000 0xdc + .comment 0x00000000 0x6e ./src/cr_startup_lpc17.o + 0x6f (size before relaxing) + .comment 0x0000006e 0x6f ./src/main.o + .comment 0x0000006e 0x6f ./FreeRTOS_src/list.o + .comment 0x0000006e 0x6f ./FreeRTOS_src/tasks.o + .comment 0x0000006e 0x6f ./FreeRTOS_portable/port.o + .comment 0x0000006e 0x6f C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\CMSISv2p00_LPC17xx\Debug\libCMSISv2p00_LPC17xx.a(system_LPC17xx.o) + .comment 0x0000006e 0x6f C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\FreeRTOSWithTraces\Debug\libMyLab_lib.a(uart.o) + .comment 0x0000006e 0x6e c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(_cr__main.o) + 0x6f (size before relaxing) + .comment 0x000000dc 0x6f c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(memset.o) + .comment 0x000000dc 0x6f c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_cr_assert.o) + .comment 0x000000dc 0x6f c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_deferredlazyseek.o) + .comment 0x000000dc 0x6f c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_fflush.o) + .comment 0x000000dc 0x6f c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_writebuf.o) + .comment 0x000000dc 0x6f c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(alloc.o) + .comment 0x000000dc 0x6f c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fputs.o) + .comment 0x000000dc 0x6f c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fseek.o) + .comment 0x000000dc 0x6f c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(ftell.o) + .comment 0x000000dc 0x6f c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(initio.o) + .comment 0x000000dc 0x6f c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(setvbuf.o) + .comment 0x000000dc 0x6f c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(stdio.o) + .comment 0x000000dc 0x6f c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(__init_alloc.o) + .comment 0x000000dc 0x6f c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_cr_sbrk.o) + .comment 0x000000dc 0x6f c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_fdopen.o) + .comment 0x000000dc 0x6f c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(errno.o) + .comment 0x000000dc 0x6f c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fclose.o) + .comment 0x000000dc 0x6f c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fflush.o) + .comment 0x000000dc 0x6f c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(remove.o) + .comment 0x000000dc 0x6f c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(strlen.o) + .comment 0x000000dc 0x6f c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_cr_check_heap.o) + .comment 0x000000dc 0x6f c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_do_fflush.o) + +.ARM.attributes + 0x00000000 0x31 + .ARM.attributes + 0x00000000 0x33 ./src/cr_startup_lpc17.o + .ARM.attributes + 0x00000033 0x33 ./src/main.o + .ARM.attributes + 0x00000066 0x33 ./FreeRTOS_src/list.o + .ARM.attributes + 0x00000099 0x33 ./FreeRTOS_src/tasks.o + .ARM.attributes + 0x000000cc 0x33 ./FreeRTOS_portable/port.o + .ARM.attributes + 0x000000ff 0x33 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\CMSISv2p00_LPC17xx\Debug\libCMSISv2p00_LPC17xx.a(system_LPC17xx.o) + .ARM.attributes + 0x00000132 0x33 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\FreeRTOSWithTraces\Debug\libMyLab_lib.a(uart.o) + .ARM.attributes + 0x00000165 0x33 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(_cr__main.o) + .ARM.attributes + 0x00000198 0x33 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(memset.o) + .ARM.attributes + 0x000001cb 0x33 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_cr_assert.o) + .ARM.attributes + 0x000001fe 0x33 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_deferredlazyseek.o) + .ARM.attributes + 0x00000231 0x33 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_fflush.o) + .ARM.attributes + 0x00000264 0x33 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_writebuf.o) + .ARM.attributes + 0x00000297 0x33 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(alloc.o) + .ARM.attributes + 0x000002ca 0x33 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fputs.o) + .ARM.attributes + 0x000002fd 0x33 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fseek.o) + .ARM.attributes + 0x00000330 0x33 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(ftell.o) + .ARM.attributes + 0x00000363 0x33 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(initio.o) + .ARM.attributes + 0x00000396 0x33 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(setvbuf.o) + .ARM.attributes + 0x000003c9 0x33 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(stdio.o) + .ARM.attributes + 0x000003fc 0x33 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(__init_alloc.o) + .ARM.attributes + 0x0000042f 0x33 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_cr_sbrk.o) + .ARM.attributes + 0x00000462 0x33 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_fdopen.o) + .ARM.attributes + 0x00000495 0x33 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(errno.o) + .ARM.attributes + 0x000004c8 0x33 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fclose.o) + .ARM.attributes + 0x000004fb 0x33 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fflush.o) + .ARM.attributes + 0x0000052e 0x33 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(remove.o) + .ARM.attributes + 0x00000561 0x33 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(strlen.o) + .ARM.attributes + 0x00000594 0x33 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_cr_check_heap.o) + .ARM.attributes + 0x000005c7 0x33 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_do_fflush.o) + .ARM.attributes + 0x000005fa 0x21 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(memcpy.o) + .ARM.attributes + 0x0000061b 0x21 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_appexit.o) + .ARM.attributes + 0x0000063c 0x21 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_close.o) + .ARM.attributes + 0x0000065d 0x21 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_flen.o) + .ARM.attributes + 0x0000067e 0x21 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_istty.o) + .ARM.attributes + 0x0000069f 0x21 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_remove.o) + .ARM.attributes + 0x000006c0 0x21 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_seek.o) + .ARM.attributes + 0x000006e1 0x21 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_tmpnam.o) + .ARM.attributes + 0x00000702 0x21 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_write.o) + +.debug_frame 0x00000000 0x9b4 + .debug_frame 0x00000000 0xd8 ./src/cr_startup_lpc17.o + .debug_frame 0x000000d8 0x54 ./src/main.o + .debug_frame 0x0000012c 0xd8 ./FreeRTOS_src/list.o + .debug_frame 0x00000204 0x524 ./FreeRTOS_src/tasks.o + .debug_frame 0x00000728 0x148 ./FreeRTOS_portable/port.o + .debug_frame 0x00000870 0x3c C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\CMSISv2p00_LPC17xx\Debug\libCMSISv2p00_LPC17xx.a(system_LPC17xx.o) + .debug_frame 0x000008ac 0x108 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\FreeRTOSWithTraces\Debug\libMyLab_lib.a(uart.o) diff --git a/FreeRTOSWithTraces/Debug/FreeRTOSWithTraces_Debug.ld b/FreeRTOSWithTraces/Debug/FreeRTOSWithTraces_Debug.ld new file mode 100644 index 0000000000000000000000000000000000000000..45903219e7e5717fde6e57192c0c75c57af75850 --- /dev/null +++ b/FreeRTOSWithTraces/Debug/FreeRTOSWithTraces_Debug.ld @@ -0,0 +1,151 @@ +/* + * GENERATED FILE - DO NOT EDIT + * (c) Code Red Technologies Ltd, 2008-2013 + * (c) NXP Semiconductors 2013-2018 + * Generated linker script file for LPC1769 + * Created from linkscript.ldt by FMCreateLinkLibraries + * Using Freemarker v2.3.23 + * LPCXpresso v8.2.2 [Build 650] [2016-09-09] on 20 févr. 2018 11:42:58 + */ + +INCLUDE "FreeRTOSWithTraces_Debug_library.ld" +INCLUDE "FreeRTOSWithTraces_Debug_memory.ld" + +ENTRY(ResetISR) + +SECTIONS +{ + /* MAIN TEXT SECTION */ + .text : ALIGN(4) + { + FILL(0xff) + __vectors_start__ = ABSOLUTE(.) ; + KEEP(*(.isr_vector)) + /* Global Section Table */ + . = ALIGN(4) ; + __section_table_start = .; + __data_section_table = .; + LONG(LOADADDR(.data)); + LONG( ADDR(.data)); + LONG( SIZEOF(.data)); + LONG(LOADADDR(.data_RAM2)); + LONG( ADDR(.data_RAM2)); + LONG( SIZEOF(.data_RAM2)); + __data_section_table_end = .; + __bss_section_table = .; + LONG( ADDR(.bss)); + LONG( SIZEOF(.bss)); + LONG( ADDR(.bss_RAM2)); + LONG( SIZEOF(.bss_RAM2)); + __bss_section_table_end = .; + __section_table_end = . ; + /* End of Global Section Table */ + + *(.after_vectors*) + + } >MFlash512 + + .text : ALIGN(4) + { + *(.text*) + *(.rodata .rodata.* .constdata .constdata.*) + . = ALIGN(4); + } > MFlash512 + /* + * for exception handling/unwind - some Newlib functions (in common + * with C++ and STDC++) use this. + */ + .ARM.extab : ALIGN(4) + { + *(.ARM.extab* .gnu.linkonce.armextab.*) + } > MFlash512 + __exidx_start = .; + + .ARM.exidx : ALIGN(4) + { + *(.ARM.exidx* .gnu.linkonce.armexidx.*) + } > MFlash512 + __exidx_end = .; + + _etext = .; + + /* DATA section for RamAHB32 */ + .data_RAM2 : ALIGN(4) + { + FILL(0xff) + PROVIDE(__start_data_RAM2 = .) ; + *(.ramfunc.$RAM2) + *(.ramfunc.$RamAHB32) + *(.data.$RAM2*) + *(.data.$RamAHB32*) + . = ALIGN(4) ; + PROVIDE(__end_data_RAM2 = .) ; + } > RamAHB32 AT>MFlash512 + + /* MAIN DATA SECTION */ + .uninit_RESERVED : ALIGN(4) + { + KEEP(*(.bss.$RESERVED*)) + . = ALIGN(4) ; + _end_uninit_RESERVED = .; + } > RamLoc32 + /* Main DATA section (RamLoc32) */ + .data : ALIGN(4) + { + FILL(0xff) + _data = . ; + *(vtable) + *(.ramfunc*) + *(.data*) + . = ALIGN(4) ; + _edata = . ; + } > RamLoc32 AT>MFlash512 + /* BSS section for RamAHB32 */ + .bss_RAM2 : ALIGN(4) + { + PROVIDE(__start_bss_RAM2 = .) ; + *(.bss.$RAM2*) + *(.bss.$RamAHB32*) + . = ALIGN (. != 0 ? 4 : 1) ; /* avoid empty segment */ + PROVIDE(__end_bss_RAM2 = .) ; + } > RamAHB32 + /* MAIN BSS SECTION */ + .bss : ALIGN(4) + { + _bss = .; + *(.bss*) + *(COMMON) + . = ALIGN(4) ; + _ebss = .; + PROVIDE(end = .); + } > RamLoc32 + /* NOINIT section for RamAHB32 */ + .noinit_RAM2 (NOLOAD) : ALIGN(4) + { + *(.noinit.$RAM2*) + *(.noinit.$RamAHB32*) + . = ALIGN(4) ; + } > RamAHB32 + /* DEFAULT NOINIT SECTION */ + .noinit (NOLOAD): ALIGN(4) + { + _noinit = .; + *(.noinit*) + . = ALIGN(4) ; + _end_noinit = .; + } > RamLoc32 + + PROVIDE(_pvHeapStart = DEFINED(__user_heap_base) ? __user_heap_base : .); + PROVIDE(_vStackTop = DEFINED(__user_stack_top) ? __user_stack_top : __top_RamLoc32 - 0); + + /* ## Create checksum value (used in startup) ## */ + PROVIDE(__valid_user_code_checksum = 0 - + (_vStackTop + + (ResetISR + 1) + + (NMI_Handler + 1) + + (HardFault_Handler + 1) + + (( DEFINED(MemManage_Handler) ? MemManage_Handler : 0 ) + 1) /* MemManage_Handler may not be defined */ + + (( DEFINED(BusFault_Handler) ? BusFault_Handler : 0 ) + 1) /* BusFault_Handler may not be defined */ + + (( DEFINED(UsageFault_Handler) ? UsageFault_Handler : 0 ) + 1) /* UsageFault_Handler may not be defined */ + ) ); +} \ No newline at end of file diff --git a/FreeRTOSWithTraces/Debug/FreeRTOSWithTraces_Debug_lib.ld b/FreeRTOSWithTraces/Debug/FreeRTOSWithTraces_Debug_lib.ld new file mode 100644 index 0000000000000000000000000000000000000000..230026fcaf66f8c2b92f0a6938783ebdfa1f1686 --- /dev/null +++ b/FreeRTOSWithTraces/Debug/FreeRTOSWithTraces_Debug_lib.ld @@ -0,0 +1,14 @@ +/* + * GENERATED FILE - DO NOT EDIT + * (C) Code Red Technologies Ltd, 2008-2016 + * Generated linker script file for LPC1769 + * Created from LibIncTemplate.ld (vLPCXpresso v5.2 (6 [Build 2137] [2013-07-08] )) + * By LPCXpresso v5.2.6 [Build 2137] [2013-07-08] on Mon Feb 08 16:12:00 CET 2016 + */ + + + GROUP( + libcr_semihost.a + libcr_c.a + libcr_eabihelpers.a + ) diff --git a/FreeRTOSWithTraces/Debug/FreeRTOSWithTraces_Debug_library.ld b/FreeRTOSWithTraces/Debug/FreeRTOSWithTraces_Debug_library.ld new file mode 100644 index 0000000000000000000000000000000000000000..4b098a33f5216da07f5e1fa24d5346bcce3b9ddc --- /dev/null +++ b/FreeRTOSWithTraces/Debug/FreeRTOSWithTraces_Debug_library.ld @@ -0,0 +1,15 @@ +/* + * GENERATED FILE - DO NOT EDIT + * (c) Code Red Technologies Ltd, 2008-2013 + * (c) NXP Semiconductors 2013-2018 + * Generated linker script file for LPC1769 + * Created from library.ldt by FMCreateLinkLibraries + * Using Freemarker v2.3.23 + * LPCXpresso v8.2.2 [Build 650] [2016-09-09] on 20 févr. 2018 11:42:58 + */ + +GROUP ( + libcr_semihost.a + libcr_c.a + libcr_eabihelpers.a +) diff --git a/FreeRTOSWithTraces/Debug/FreeRTOSWithTraces_Debug_mem.ld b/FreeRTOSWithTraces/Debug/FreeRTOSWithTraces_Debug_mem.ld new file mode 100644 index 0000000000000000000000000000000000000000..588ad7b2e18418f5903e7fe2c070031e27375817 --- /dev/null +++ b/FreeRTOSWithTraces/Debug/FreeRTOSWithTraces_Debug_mem.ld @@ -0,0 +1,21 @@ +/* + * GENERATED FILE - DO NOT EDIT + * (C) Code Red Technologies Ltd, 2008-2016 + * Linker script memory definitions + * Created from LinkMemoryTemplate + * By LPCXpresso v5.2.6 [Build 2137] [2013-07-08] on Mon Feb 08 16:12:00 CET 2016) +*/ + +MEMORY +{ + /* Define each memory region */ + MFlash512 (rx) : ORIGIN = 0x0, LENGTH = 0x80000 /* 512k */ + RamLoc32 (rwx) : ORIGIN = 0x10000000, LENGTH = 0x8000 /* 32k */ + RamAHB32 (rwx) : ORIGIN = 0x2007c000, LENGTH = 0x8000 /* 32k */ + +} + /* Define a symbol for the top of each memory region */ + __top_MFlash512 = 0x0 + 0x80000; + __top_RamLoc32 = 0x10000000 + 0x8000; + __top_RamAHB32 = 0x2007c000 + 0x8000; + diff --git a/FreeRTOSWithTraces/Debug/FreeRTOSWithTraces_Debug_memory.ld b/FreeRTOSWithTraces/Debug/FreeRTOSWithTraces_Debug_memory.ld new file mode 100644 index 0000000000000000000000000000000000000000..26ceb2bb23dc58541c53fbac9630e75bec98d652 --- /dev/null +++ b/FreeRTOSWithTraces/Debug/FreeRTOSWithTraces_Debug_memory.ld @@ -0,0 +1,31 @@ +/* + * GENERATED FILE - DO NOT EDIT + * (c) Code Red Technologies Ltd, 2008-2013 + * (c) NXP Semiconductors 2013-2018 + * Generated linker script file for LPC1769 + * Created from memory.ldt by FMCreateLinkMemory + * Using Freemarker v2.3.23 + * LPCXpresso v8.2.2 [Build 650] [2016-09-09] on 20 févr. 2018 11:42:58 + */ + +MEMORY +{ + /* Define each memory region */ + MFlash512 (rx) : ORIGIN = 0x0, LENGTH = 0x80000 /* 512K bytes (alias Flash) */ + RamLoc32 (rwx) : ORIGIN = 0x10000000, LENGTH = 0x8000 /* 32K bytes (alias RAM) */ + RamAHB32 (rwx) : ORIGIN = 0x2007c000, LENGTH = 0x8000 /* 32K bytes (alias RAM2) */ +} + + /* Define a symbol for the top of each memory region */ + __base_MFlash512 = 0x0 ; /* MFlash512 */ + __base_Flash = 0x0 ; /* Flash */ + __top_MFlash512 = 0x0 + 0x80000 ; /* 512K bytes */ + __top_Flash = 0x0 + 0x80000 ; /* 512K bytes */ + __base_RamLoc32 = 0x10000000 ; /* RamLoc32 */ + __base_RAM = 0x10000000 ; /* RAM */ + __top_RamLoc32 = 0x10000000 + 0x8000 ; /* 32K bytes */ + __top_RAM = 0x10000000 + 0x8000 ; /* 32K bytes */ + __base_RamAHB32 = 0x2007c000 ; /* RamAHB32 */ + __base_RAM2 = 0x2007c000 ; /* RAM2 */ + __top_RamAHB32 = 0x2007c000 + 0x8000 ; /* 32K bytes */ + __top_RAM2 = 0x2007c000 + 0x8000 ; /* 32K bytes */ diff --git a/FreeRTOSWithTraces/Debug/FreeRTOS_portable/MemMang/heap_2.d b/FreeRTOSWithTraces/Debug/FreeRTOS_portable/MemMang/heap_2.d new file mode 100644 index 0000000000000000000000000000000000000000..614a1bc42384af6ca57de03f4580c959b7b4d323 --- /dev/null +++ b/FreeRTOSWithTraces/Debug/FreeRTOS_portable/MemMang/heap_2.d @@ -0,0 +1,22 @@ +FreeRTOS_portable/MemMang/heap_2.o FreeRTOS_portable/MemMang/heap_2.d: \ + ../FreeRTOS_portable/MemMang/heap_2.c ../FreeRTOS_include/FreeRTOS.h \ + ../FreeRTOS_include/projdefs.h ../src/FreeRTOSConfig.h \ + ../FreeRTOS_include/portable.h ../FreeRTOS_portable/portmacro.h \ + ../FreeRTOS_include/mpu_wrappers.h ../FreeRTOS_include/task.h \ + ../FreeRTOS_include/list.h + +../FreeRTOS_include/FreeRTOS.h: + +../FreeRTOS_include/projdefs.h: + +../src/FreeRTOSConfig.h: + +../FreeRTOS_include/portable.h: + +../FreeRTOS_portable/portmacro.h: + +../FreeRTOS_include/mpu_wrappers.h: + +../FreeRTOS_include/task.h: + +../FreeRTOS_include/list.h: diff --git a/FreeRTOSWithTraces/Debug/FreeRTOS_portable/MemMang/heap_2.o b/FreeRTOSWithTraces/Debug/FreeRTOS_portable/MemMang/heap_2.o new file mode 100644 index 0000000000000000000000000000000000000000..19ac1482c0e6bff1d1b0a0a5a41871135f9ada63 Binary files /dev/null and b/FreeRTOSWithTraces/Debug/FreeRTOS_portable/MemMang/heap_2.o differ diff --git a/FreeRTOSWithTraces/Debug/FreeRTOS_portable/MemMang/subdir.mk b/FreeRTOSWithTraces/Debug/FreeRTOS_portable/MemMang/subdir.mk new file mode 100644 index 0000000000000000000000000000000000000000..5ea764d6d40793af2d6f03f13f95bbe0d8e5077d --- /dev/null +++ b/FreeRTOSWithTraces/Debug/FreeRTOS_portable/MemMang/subdir.mk @@ -0,0 +1,24 @@ +################################################################################ +# Automatically-generated file. Do not edit! +################################################################################ + +# Add inputs and outputs from these tool invocations to the build variables +C_SRCS += \ +../FreeRTOS_portable/MemMang/heap_2.c + +OBJS += \ +./FreeRTOS_portable/MemMang/heap_2.o + +C_DEPS += \ +./FreeRTOS_portable/MemMang/heap_2.d + + +# Each subdirectory must supply rules for building sources it contributes +FreeRTOS_portable/MemMang/%.o: ../FreeRTOS_portable/MemMang/%.c + @echo 'Building file: $<' + @echo 'Invoking: MCU C Compiler' + arm-none-eabi-gcc -D__USE_CMSIS -DDEBUG -D__CODE_RED -DPACK_STRUCT_END=__attribute\(\(packed\)\) -DGCC_ARMCM3 -D__REDLIB__ -I../src -I"C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\CMSISv2p00_LPC17xx\inc" -I../FreeRTOS_include -I../FreeRTOS_portable -O0 -g3 -Wall -c -fmessage-length=0 -fno-builtin -ffunction-sections -fdata-sections -mcpu=cortex-m3 -mthumb -D__REDLIB__ -specs=redlib.specs -MMD -MP -MF"$(@:%.o=%.d)" -MT"$(@:%.o=%.o)" -MT"$(@:%.o=%.d)" -o "$@" "$<" + @echo 'Finished building: $<' + @echo ' ' + + diff --git a/FreeRTOSWithTraces/Debug/FreeRTOS_portable/port.d b/FreeRTOSWithTraces/Debug/FreeRTOS_portable/port.d new file mode 100644 index 0000000000000000000000000000000000000000..019033874eb704dddf15eedaec5d4eaf3ee75beb --- /dev/null +++ b/FreeRTOSWithTraces/Debug/FreeRTOS_portable/port.d @@ -0,0 +1,22 @@ +FreeRTOS_portable/port.o FreeRTOS_portable/port.d: \ + ../FreeRTOS_portable/port.c ../FreeRTOS_include/FreeRTOS.h \ + ../FreeRTOS_include/projdefs.h ../src/FreeRTOSConfig.h \ + ../FreeRTOS_include/portable.h ../FreeRTOS_portable/portmacro.h \ + ../FreeRTOS_include/mpu_wrappers.h ../FreeRTOS_include/task.h \ + ../FreeRTOS_include/list.h + +../FreeRTOS_include/FreeRTOS.h: + +../FreeRTOS_include/projdefs.h: + +../src/FreeRTOSConfig.h: + +../FreeRTOS_include/portable.h: + +../FreeRTOS_portable/portmacro.h: + +../FreeRTOS_include/mpu_wrappers.h: + +../FreeRTOS_include/task.h: + +../FreeRTOS_include/list.h: diff --git a/FreeRTOSWithTraces/Debug/FreeRTOS_portable/port.o b/FreeRTOSWithTraces/Debug/FreeRTOS_portable/port.o new file mode 100644 index 0000000000000000000000000000000000000000..71399b63b5e0f0b1883e12a241ab25f976f2a03e Binary files /dev/null and b/FreeRTOSWithTraces/Debug/FreeRTOS_portable/port.o differ diff --git a/FreeRTOSWithTraces/Debug/FreeRTOS_portable/subdir.mk b/FreeRTOSWithTraces/Debug/FreeRTOS_portable/subdir.mk new file mode 100644 index 0000000000000000000000000000000000000000..4c1acb85348769eb2e16fd851e2fccc560e4ec47 --- /dev/null +++ b/FreeRTOSWithTraces/Debug/FreeRTOS_portable/subdir.mk @@ -0,0 +1,24 @@ +################################################################################ +# Automatically-generated file. Do not edit! +################################################################################ + +# Add inputs and outputs from these tool invocations to the build variables +C_SRCS += \ +../FreeRTOS_portable/port.c + +OBJS += \ +./FreeRTOS_portable/port.o + +C_DEPS += \ +./FreeRTOS_portable/port.d + + +# Each subdirectory must supply rules for building sources it contributes +FreeRTOS_portable/%.o: ../FreeRTOS_portable/%.c + @echo 'Building file: $<' + @echo 'Invoking: MCU C Compiler' + arm-none-eabi-gcc -D__USE_CMSIS -DDEBUG -D__CODE_RED -DPACK_STRUCT_END=__attribute\(\(packed\)\) -DGCC_ARMCM3 -D__REDLIB__ -I../src -I"C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\CMSISv2p00_LPC17xx\inc" -I../FreeRTOS_include -I../FreeRTOS_portable -O0 -g3 -Wall -c -fmessage-length=0 -fno-builtin -ffunction-sections -fdata-sections -mcpu=cortex-m3 -mthumb -D__REDLIB__ -specs=redlib.specs -MMD -MP -MF"$(@:%.o=%.d)" -MT"$(@:%.o=%.o)" -MT"$(@:%.o=%.d)" -o "$@" "$<" + @echo 'Finished building: $<' + @echo ' ' + + diff --git a/FreeRTOSWithTraces/Debug/FreeRTOS_src/croutine.d b/FreeRTOSWithTraces/Debug/FreeRTOS_src/croutine.d new file mode 100644 index 0000000000000000000000000000000000000000..db90ac680855acf832a236209475d67834ca40d2 --- /dev/null +++ b/FreeRTOSWithTraces/Debug/FreeRTOS_src/croutine.d @@ -0,0 +1,24 @@ +FreeRTOS_src/croutine.o FreeRTOS_src/croutine.d: \ + ../FreeRTOS_src/croutine.c ../FreeRTOS_include/FreeRTOS.h \ + ../FreeRTOS_include/projdefs.h ../src/FreeRTOSConfig.h \ + ../FreeRTOS_include/portable.h ../FreeRTOS_portable/portmacro.h \ + ../FreeRTOS_include/mpu_wrappers.h ../FreeRTOS_include/task.h \ + ../FreeRTOS_include/list.h ../FreeRTOS_include/croutine.h + +../FreeRTOS_include/FreeRTOS.h: + +../FreeRTOS_include/projdefs.h: + +../src/FreeRTOSConfig.h: + +../FreeRTOS_include/portable.h: + +../FreeRTOS_portable/portmacro.h: + +../FreeRTOS_include/mpu_wrappers.h: + +../FreeRTOS_include/task.h: + +../FreeRTOS_include/list.h: + +../FreeRTOS_include/croutine.h: diff --git a/FreeRTOSWithTraces/Debug/FreeRTOS_src/croutine.o b/FreeRTOSWithTraces/Debug/FreeRTOS_src/croutine.o new file mode 100644 index 0000000000000000000000000000000000000000..a88956298941b1979bc92d216c2b10a4a24cff2c Binary files /dev/null and b/FreeRTOSWithTraces/Debug/FreeRTOS_src/croutine.o differ diff --git a/FreeRTOSWithTraces/Debug/FreeRTOS_src/list.d b/FreeRTOSWithTraces/Debug/FreeRTOS_src/list.d new file mode 100644 index 0000000000000000000000000000000000000000..4ff67b7dffbe2df443e489ebf86da932d8e6f1e8 --- /dev/null +++ b/FreeRTOSWithTraces/Debug/FreeRTOS_src/list.d @@ -0,0 +1,19 @@ +FreeRTOS_src/list.o FreeRTOS_src/list.d: ../FreeRTOS_src/list.c \ + ../FreeRTOS_include/FreeRTOS.h ../FreeRTOS_include/projdefs.h \ + ../src/FreeRTOSConfig.h ../FreeRTOS_include/portable.h \ + ../FreeRTOS_portable/portmacro.h ../FreeRTOS_include/mpu_wrappers.h \ + ../FreeRTOS_include/list.h + +../FreeRTOS_include/FreeRTOS.h: + +../FreeRTOS_include/projdefs.h: + +../src/FreeRTOSConfig.h: + +../FreeRTOS_include/portable.h: + +../FreeRTOS_portable/portmacro.h: + +../FreeRTOS_include/mpu_wrappers.h: + +../FreeRTOS_include/list.h: diff --git a/FreeRTOSWithTraces/Debug/FreeRTOS_src/list.o b/FreeRTOSWithTraces/Debug/FreeRTOS_src/list.o new file mode 100644 index 0000000000000000000000000000000000000000..781a157e6ac242c253e3bf03f4b628ebbb0cb5d3 Binary files /dev/null and b/FreeRTOSWithTraces/Debug/FreeRTOS_src/list.o differ diff --git a/FreeRTOSWithTraces/Debug/FreeRTOS_src/queue.d b/FreeRTOSWithTraces/Debug/FreeRTOS_src/queue.d new file mode 100644 index 0000000000000000000000000000000000000000..fea81e69443c8fa0ac16a9a783137cf649799afb --- /dev/null +++ b/FreeRTOSWithTraces/Debug/FreeRTOS_src/queue.d @@ -0,0 +1,24 @@ +FreeRTOS_src/queue.o FreeRTOS_src/queue.d: ../FreeRTOS_src/queue.c \ + ../FreeRTOS_include/FreeRTOS.h ../FreeRTOS_include/projdefs.h \ + ../src/FreeRTOSConfig.h ../FreeRTOS_include/portable.h \ + ../FreeRTOS_portable/portmacro.h ../FreeRTOS_include/mpu_wrappers.h \ + ../FreeRTOS_include/task.h ../FreeRTOS_include/list.h \ + ../FreeRTOS_include/croutine.h + +../FreeRTOS_include/FreeRTOS.h: + +../FreeRTOS_include/projdefs.h: + +../src/FreeRTOSConfig.h: + +../FreeRTOS_include/portable.h: + +../FreeRTOS_portable/portmacro.h: + +../FreeRTOS_include/mpu_wrappers.h: + +../FreeRTOS_include/task.h: + +../FreeRTOS_include/list.h: + +../FreeRTOS_include/croutine.h: diff --git a/FreeRTOSWithTraces/Debug/FreeRTOS_src/queue.o b/FreeRTOSWithTraces/Debug/FreeRTOS_src/queue.o new file mode 100644 index 0000000000000000000000000000000000000000..f6b4be37ef062a1e050140e0af12ca397180c31a Binary files /dev/null and b/FreeRTOSWithTraces/Debug/FreeRTOS_src/queue.o differ diff --git a/FreeRTOSWithTraces/Debug/FreeRTOS_src/subdir.mk b/FreeRTOSWithTraces/Debug/FreeRTOS_src/subdir.mk new file mode 100644 index 0000000000000000000000000000000000000000..8e6650839a9c2bbf17ccb5c818eaa87cb7f051c7 --- /dev/null +++ b/FreeRTOSWithTraces/Debug/FreeRTOS_src/subdir.mk @@ -0,0 +1,36 @@ +################################################################################ +# Automatically-generated file. Do not edit! +################################################################################ + +# Add inputs and outputs from these tool invocations to the build variables +C_SRCS += \ +../FreeRTOS_src/croutine.c \ +../FreeRTOS_src/list.c \ +../FreeRTOS_src/queue.c \ +../FreeRTOS_src/tasks.c \ +../FreeRTOS_src/timers.c + +OBJS += \ +./FreeRTOS_src/croutine.o \ +./FreeRTOS_src/list.o \ +./FreeRTOS_src/queue.o \ +./FreeRTOS_src/tasks.o \ +./FreeRTOS_src/timers.o + +C_DEPS += \ +./FreeRTOS_src/croutine.d \ +./FreeRTOS_src/list.d \ +./FreeRTOS_src/queue.d \ +./FreeRTOS_src/tasks.d \ +./FreeRTOS_src/timers.d + + +# Each subdirectory must supply rules for building sources it contributes +FreeRTOS_src/%.o: ../FreeRTOS_src/%.c + @echo 'Building file: $<' + @echo 'Invoking: MCU C Compiler' + arm-none-eabi-gcc -D__USE_CMSIS -DDEBUG -D__CODE_RED -DPACK_STRUCT_END=__attribute\(\(packed\)\) -DGCC_ARMCM3 -D__REDLIB__ -I../src -I"C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\CMSISv2p00_LPC17xx\inc" -I../FreeRTOS_include -I../FreeRTOS_portable -O0 -g3 -Wall -c -fmessage-length=0 -fno-builtin -ffunction-sections -fdata-sections -mcpu=cortex-m3 -mthumb -D__REDLIB__ -specs=redlib.specs -MMD -MP -MF"$(@:%.o=%.d)" -MT"$(@:%.o=%.o)" -MT"$(@:%.o=%.d)" -o "$@" "$<" + @echo 'Finished building: $<' + @echo ' ' + + diff --git a/FreeRTOSWithTraces/Debug/FreeRTOS_src/tasks.d b/FreeRTOSWithTraces/Debug/FreeRTOS_src/tasks.d new file mode 100644 index 0000000000000000000000000000000000000000..066de9f8623ffba46441669bbf3de3e16c476bf8 --- /dev/null +++ b/FreeRTOSWithTraces/Debug/FreeRTOS_src/tasks.d @@ -0,0 +1,26 @@ +FreeRTOS_src/tasks.o FreeRTOS_src/tasks.d: ../FreeRTOS_src/tasks.c \ + ../FreeRTOS_include/FreeRTOS.h ../FreeRTOS_include/projdefs.h \ + ../src/FreeRTOSConfig.h ../FreeRTOS_include/portable.h \ + ../FreeRTOS_portable/portmacro.h ../FreeRTOS_include/mpu_wrappers.h \ + ../FreeRTOS_include/task.h ../FreeRTOS_include/list.h \ + ../FreeRTOS_include/timers.h ../FreeRTOS_include/StackMacros.h + +../FreeRTOS_include/FreeRTOS.h: + +../FreeRTOS_include/projdefs.h: + +../src/FreeRTOSConfig.h: + +../FreeRTOS_include/portable.h: + +../FreeRTOS_portable/portmacro.h: + +../FreeRTOS_include/mpu_wrappers.h: + +../FreeRTOS_include/task.h: + +../FreeRTOS_include/list.h: + +../FreeRTOS_include/timers.h: + +../FreeRTOS_include/StackMacros.h: diff --git a/FreeRTOSWithTraces/Debug/FreeRTOS_src/tasks.o b/FreeRTOSWithTraces/Debug/FreeRTOS_src/tasks.o new file mode 100644 index 0000000000000000000000000000000000000000..ea7b8a6aaeb3610ce526d8947c32d26d37173cc6 Binary files /dev/null and b/FreeRTOSWithTraces/Debug/FreeRTOS_src/tasks.o differ diff --git a/FreeRTOSWithTraces/Debug/FreeRTOS_src/timers.d b/FreeRTOSWithTraces/Debug/FreeRTOS_src/timers.d new file mode 100644 index 0000000000000000000000000000000000000000..4c1a2a2d3bb979cbd5de2a6ed355b79ddd099e5c --- /dev/null +++ b/FreeRTOSWithTraces/Debug/FreeRTOS_src/timers.d @@ -0,0 +1,26 @@ +FreeRTOS_src/timers.o FreeRTOS_src/timers.d: ../FreeRTOS_src/timers.c \ + ../FreeRTOS_include/FreeRTOS.h ../FreeRTOS_include/projdefs.h \ + ../src/FreeRTOSConfig.h ../FreeRTOS_include/portable.h \ + ../FreeRTOS_portable/portmacro.h ../FreeRTOS_include/mpu_wrappers.h \ + ../FreeRTOS_include/task.h ../FreeRTOS_include/list.h \ + ../FreeRTOS_include/queue.h ../FreeRTOS_include/timers.h + +../FreeRTOS_include/FreeRTOS.h: + +../FreeRTOS_include/projdefs.h: + +../src/FreeRTOSConfig.h: + +../FreeRTOS_include/portable.h: + +../FreeRTOS_portable/portmacro.h: + +../FreeRTOS_include/mpu_wrappers.h: + +../FreeRTOS_include/task.h: + +../FreeRTOS_include/list.h: + +../FreeRTOS_include/queue.h: + +../FreeRTOS_include/timers.h: diff --git a/FreeRTOSWithTraces/Debug/FreeRTOS_src/timers.o b/FreeRTOSWithTraces/Debug/FreeRTOS_src/timers.o new file mode 100644 index 0000000000000000000000000000000000000000..679c34ae2fb9cf1a7d6c834de2380f12e867a3a0 Binary files /dev/null and b/FreeRTOSWithTraces/Debug/FreeRTOS_src/timers.o differ diff --git a/FreeRTOSWithTraces/Debug/libMyLab_lib.a b/FreeRTOSWithTraces/Debug/libMyLab_lib.a new file mode 100644 index 0000000000000000000000000000000000000000..b52a4472ff3323bac4641e3f5ecce0a58262c708 Binary files /dev/null and b/FreeRTOSWithTraces/Debug/libMyLab_lib.a differ diff --git a/FreeRTOSWithTraces/Debug/makefile b/FreeRTOSWithTraces/Debug/makefile new file mode 100644 index 0000000000000000000000000000000000000000..c47aa3076613da6de77b9a8cd00208a01c72bdfc --- /dev/null +++ b/FreeRTOSWithTraces/Debug/makefile @@ -0,0 +1,53 @@ +################################################################################ +# Automatically-generated file. Do not edit! +################################################################################ + +-include ../makefile.init + +RM := rm -rf + +# All of the sources participating in the build are defined here +-include sources.mk +-include src/subdir.mk +-include FreeRTOS_src/subdir.mk +-include FreeRTOS_portable/MemMang/subdir.mk +-include FreeRTOS_portable/subdir.mk +-include subdir.mk +-include objects.mk + +ifneq ($(MAKECMDGOALS),clean) +ifneq ($(strip $(C_DEPS)),) +-include $(C_DEPS) +endif +endif + +-include ../makefile.defs + +# Add inputs and outputs from these tool invocations to the build variables + +# All Target +all: FreeRTOSWithTraces.axf + +# Tool invocations +FreeRTOSWithTraces.axf: $(OBJS) $(USER_OBJS) + @echo 'Building target: $@' + @echo 'Invoking: MCU Linker' + arm-none-eabi-gcc -nostdlib -L"C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\CMSISv2p00_LPC17xx\Debug" -L"C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\FreeRTOSWithTraces\Debug" -Xlinker -Map="FreeRTOSWithTraces.map" -Xlinker --gc-sections -mcpu=cortex-m3 -mthumb -T "FreeRTOSWithTraces_Debug.ld" -o "FreeRTOSWithTraces.axf" $(OBJS) $(USER_OBJS) $(LIBS) + @echo 'Finished building target: $@' + @echo ' ' + $(MAKE) --no-print-directory post-build + +# Other Targets +clean: + -$(RM) $(EXECUTABLES)$(OBJS)$(C_DEPS) FreeRTOSWithTraces.axf + -@echo ' ' + +post-build: + -@echo 'Performing post-build steps' + -arm-none-eabi-size "FreeRTOSWithTraces.axf"; # arm-none-eabi-objcopy -O binary "FreeRTOSWithTraces.axf" "FreeRTOSWithTraces.bin" ; checksum -p LPC1769 -d "FreeRTOSWithTraces.bin"; + -@echo ' ' + +.PHONY: all clean dependents +.SECONDARY: post-build + +-include ../makefile.targets diff --git a/FreeRTOSWithTraces/Debug/objects.mk b/FreeRTOSWithTraces/Debug/objects.mk new file mode 100644 index 0000000000000000000000000000000000000000..0c619deb853a4fac01a75e203fe76e55bca2d597 --- /dev/null +++ b/FreeRTOSWithTraces/Debug/objects.mk @@ -0,0 +1,8 @@ +################################################################################ +# Automatically-generated file. Do not edit! +################################################################################ + +USER_OBJS := + +LIBS := -lCMSISv2p00_LPC17xx -lMyLab_lib + diff --git a/FreeRTOSWithTraces/Debug/sources.mk b/FreeRTOSWithTraces/Debug/sources.mk new file mode 100644 index 0000000000000000000000000000000000000000..4c81af4a8c05fe72af0729002a5d7e53b980ee72 --- /dev/null +++ b/FreeRTOSWithTraces/Debug/sources.mk @@ -0,0 +1,21 @@ +################################################################################ +# Automatically-generated file. Do not edit! +################################################################################ + +OBJ_SRCS := +S_SRCS := +ASM_SRCS := +C_SRCS := +S_UPPER_SRCS := +O_SRCS := +EXECUTABLES := +OBJS := +C_DEPS := + +# Every subdirectory with source files must be described here +SUBDIRS := \ +FreeRTOS_portable/MemMang \ +FreeRTOS_portable \ +FreeRTOS_src \ +src \ + diff --git a/FreeRTOSWithTraces/Debug/src/cr_startup_lpc17.d b/FreeRTOSWithTraces/Debug/src/cr_startup_lpc17.d new file mode 100644 index 0000000000000000000000000000000000000000..9cc23ef37d474b41d05839cf4dcaf229d2973130 --- /dev/null +++ b/FreeRTOSWithTraces/Debug/src/cr_startup_lpc17.d @@ -0,0 +1,4 @@ +src/cr_startup_lpc17.o src/cr_startup_lpc17.d: ../src/cr_startup_lpc17.c \ + C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\CMSISv2p00_LPC17xx\inc/system_LPC17xx.h + +C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\CMSISv2p00_LPC17xx\inc/system_LPC17xx.h: diff --git a/FreeRTOSWithTraces/Debug/src/cr_startup_lpc17.o b/FreeRTOSWithTraces/Debug/src/cr_startup_lpc17.o new file mode 100644 index 0000000000000000000000000000000000000000..dab8ad12858f7c92560b156c3c3306a905cbcb5e Binary files /dev/null and b/FreeRTOSWithTraces/Debug/src/cr_startup_lpc17.o differ diff --git a/FreeRTOSWithTraces/Debug/src/main.d b/FreeRTOSWithTraces/Debug/src/main.d new file mode 100644 index 0000000000000000000000000000000000000000..362b712ae6d4eeb1b9783fdcb8ca7507f55f4aa3 --- /dev/null +++ b/FreeRTOSWithTraces/Debug/src/main.d @@ -0,0 +1,46 @@ +src/main.o src/main.d: ../src/main.c \ + C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\CMSISv2p00_LPC17xx\inc/LPC17xx.h \ + C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\CMSISv2p00_LPC17xx\inc/core_cm3.h \ + C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\CMSISv2p00_LPC17xx\inc/core_cmInstr.h \ + C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\CMSISv2p00_LPC17xx\inc/core_cmFunc.h \ + C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\CMSISv2p00_LPC17xx\inc/system_LPC17xx.h \ + ../FreeRTOS_include/FreeRTOS.h ../FreeRTOS_include/projdefs.h \ + ../src/FreeRTOSConfig.h ../FreeRTOS_include/portable.h \ + ../FreeRTOS_portable/portmacro.h ../FreeRTOS_include/mpu_wrappers.h \ + ../FreeRTOS_include/task.h ../FreeRTOS_include/list.h \ + ../FreeRTOS_include/queue.h ../FreeRTOS_include/semphr.h \ + ../FreeRTOS_include/queue.h ../src/uart.h + +C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\CMSISv2p00_LPC17xx\inc/LPC17xx.h: + +C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\CMSISv2p00_LPC17xx\inc/core_cm3.h: + +C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\CMSISv2p00_LPC17xx\inc/core_cmInstr.h: + +C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\CMSISv2p00_LPC17xx\inc/core_cmFunc.h: + +C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\CMSISv2p00_LPC17xx\inc/system_LPC17xx.h: + +../FreeRTOS_include/FreeRTOS.h: + +../FreeRTOS_include/projdefs.h: + +../src/FreeRTOSConfig.h: + +../FreeRTOS_include/portable.h: + +../FreeRTOS_portable/portmacro.h: + +../FreeRTOS_include/mpu_wrappers.h: + +../FreeRTOS_include/task.h: + +../FreeRTOS_include/list.h: + +../FreeRTOS_include/queue.h: + +../FreeRTOS_include/semphr.h: + +../FreeRTOS_include/queue.h: + +../src/uart.h: diff --git a/FreeRTOSWithTraces/Debug/src/main.o b/FreeRTOSWithTraces/Debug/src/main.o new file mode 100644 index 0000000000000000000000000000000000000000..bdee6b5f102bff45b9f7f3f5def4146612c64aaf Binary files /dev/null and b/FreeRTOSWithTraces/Debug/src/main.o differ diff --git a/FreeRTOSWithTraces/Debug/src/subdir.mk b/FreeRTOSWithTraces/Debug/src/subdir.mk new file mode 100644 index 0000000000000000000000000000000000000000..fd31d88ee862fed778e9a2ac111781e7679961f3 --- /dev/null +++ b/FreeRTOSWithTraces/Debug/src/subdir.mk @@ -0,0 +1,27 @@ +################################################################################ +# Automatically-generated file. Do not edit! +################################################################################ + +# Add inputs and outputs from these tool invocations to the build variables +C_SRCS += \ +../src/cr_startup_lpc17.c \ +../src/main.c + +OBJS += \ +./src/cr_startup_lpc17.o \ +./src/main.o + +C_DEPS += \ +./src/cr_startup_lpc17.d \ +./src/main.d + + +# Each subdirectory must supply rules for building sources it contributes +src/%.o: ../src/%.c + @echo 'Building file: $<' + @echo 'Invoking: MCU C Compiler' + arm-none-eabi-gcc -D__USE_CMSIS -DDEBUG -D__CODE_RED -DPACK_STRUCT_END=__attribute\(\(packed\)\) -DGCC_ARMCM3 -D__REDLIB__ -I../src -I"C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\CMSISv2p00_LPC17xx\inc" -I../FreeRTOS_include -I../FreeRTOS_portable -O0 -g3 -Wall -c -fmessage-length=0 -fno-builtin -ffunction-sections -fdata-sections -mcpu=cortex-m3 -mthumb -D__REDLIB__ -specs=redlib.specs -MMD -MP -MF"$(@:%.o=%.d)" -MT"$(@:%.o=%.o)" -MT"$(@:%.o=%.d)" -o "$@" "$<" + @echo 'Finished building: $<' + @echo ' ' + + diff --git a/FreeRTOSWithTraces/FreeRTOS_include/FreeRTOS.h b/FreeRTOSWithTraces/FreeRTOS_include/FreeRTOS.h new file mode 100644 index 0000000000000000000000000000000000000000..e5eb39abb4dcf9255946b75a0a0e8b2c2759868b --- /dev/null +++ b/FreeRTOSWithTraces/FreeRTOS_include/FreeRTOS.h @@ -0,0 +1,468 @@ +/* + FreeRTOS V7.0.1 - Copyright (C) 2011 Real Time Engineers Ltd. + + + FreeRTOS supports many tools and architectures. V7.0.0 is sponsored by: + Atollic AB - Atollic provides professional embedded systems development + tools for C/C++ development, code analysis and test automation. + See http://www.atollic.com + + + *************************************************************************** + * * + * FreeRTOS tutorial books are available in pdf and paperback. * + * Complete, revised, and edited pdf reference manuals are also * + * available. * + * * + * Purchasing FreeRTOS documentation will not only help you, by * + * ensuring you get running as quickly as possible and with an * + * in-depth knowledge of how to use FreeRTOS, it will also help * + * the FreeRTOS project to continue with its mission of providing * + * professional grade, cross platform, de facto standard solutions * + * for microcontrollers - completely free of charge! * + * * + * >>> See http://www.FreeRTOS.org/Documentation for details. <<< * + * * + * Thank you for using FreeRTOS, and thank you for your support! * + * * + *************************************************************************** + + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation AND MODIFIED BY the FreeRTOS exception. + >>>NOTE<<< The modification to the GPL is included to allow you to + distribute a combined work that includes FreeRTOS without being obliged to + provide the source code for proprietary components outside of the FreeRTOS + kernel. FreeRTOS is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + more details. You should have received a copy of the GNU General Public + License and the FreeRTOS license exception along with FreeRTOS; if not it + can be viewed here: http://www.freertos.org/a00114.html and also obtained + by writing to Richard Barry, contact details for whom are available on the + FreeRTOS WEB site. + + 1 tab == 4 spaces! + + http://www.FreeRTOS.org - Documentation, latest information, license and + contact details. + + http://www.SafeRTOS.com - A version that is certified for use in safety + critical systems. + + http://www.OpenRTOS.com - Commercial support, development, porting, + licensing and training services. +*/ + +#ifndef INC_FREERTOS_H +#define INC_FREERTOS_H + + +/* + * Include the generic headers required for the FreeRTOS port being used. + */ +#include <stddef.h> + +/* Basic FreeRTOS definitions. */ +#include "projdefs.h" + +/* Application specific configuration options. */ +#include "FreeRTOSConfig.h" + +/* Definitions specific to the port being used. */ +#include "portable.h" + + +/* Defines the prototype to which the application task hook function must +conform. */ +typedef portBASE_TYPE (*pdTASK_HOOK_CODE)( void * ); + + + + + +/* + * Check all the required application specific macros have been defined. + * These macros are application specific and (as downloaded) are defined + * within FreeRTOSConfig.h. + */ + +#ifndef configUSE_PREEMPTION + #error Missing definition: configUSE_PREEMPTION should be defined in FreeRTOSConfig.h as either 1 or 0. See the Configuration section of the FreeRTOS API documentation for details. +#endif + +#ifndef configUSE_IDLE_HOOK + #error Missing definition: configUSE_IDLE_HOOK should be defined in FreeRTOSConfig.h as either 1 or 0. See the Configuration section of the FreeRTOS API documentation for details. +#endif + +#ifndef configUSE_TICK_HOOK + #error Missing definition: configUSE_TICK_HOOK should be defined in FreeRTOSConfig.h as either 1 or 0. See the Configuration section of the FreeRTOS API documentation for details. +#endif + +#ifndef configUSE_CO_ROUTINES + #error Missing definition: configUSE_CO_ROUTINES should be defined in FreeRTOSConfig.h as either 1 or 0. See the Configuration section of the FreeRTOS API documentation for details. +#endif + +#ifndef INCLUDE_vTaskPrioritySet + #error Missing definition: INCLUDE_vTaskPrioritySet should be defined in FreeRTOSConfig.h as either 1 or 0. See the Configuration section of the FreeRTOS API documentation for details. +#endif + +#ifndef INCLUDE_uxTaskPriorityGet + #error Missing definition: INCLUDE_uxTaskPriorityGet should be defined in FreeRTOSConfig.h as either 1 or 0. See the Configuration section of the FreeRTOS API documentation for details. +#endif + +#ifndef INCLUDE_vTaskDelete + #error Missing definition: INCLUDE_vTaskDelete should be defined in FreeRTOSConfig.h as either 1 or 0. See the Configuration section of the FreeRTOS API documentation for details. +#endif + +#ifndef INCLUDE_vTaskCleanUpResources + #error Missing definition: INCLUDE_vTaskCleanUpResources should be defined in FreeRTOSConfig.h as either 1 or 0. See the Configuration section of the FreeRTOS API documentation for details. +#endif + +#ifndef INCLUDE_vTaskSuspend + #error Missing definition: INCLUDE_vTaskSuspend should be defined in FreeRTOSConfig.h as either 1 or 0. See the Configuration section of the FreeRTOS API documentation for details. +#endif + +#ifndef INCLUDE_vTaskDelayUntil + #error Missing definition: INCLUDE_vTaskDelayUntil should be defined in FreeRTOSConfig.h as either 1 or 0. See the Configuration section of the FreeRTOS API documentation for details. +#endif + +#ifndef INCLUDE_vTaskDelay + #error Missing definition: INCLUDE_vTaskDelay should be defined in FreeRTOSConfig.h as either 1 or 0. See the Configuration section of the FreeRTOS API documentation for details. +#endif + +#ifndef configUSE_16_BIT_TICKS + #error Missing definition: configUSE_16_BIT_TICKS should be defined in FreeRTOSConfig.h as either 1 or 0. See the Configuration section of the FreeRTOS API documentation for details. +#endif + +#ifndef configUSE_APPLICATION_TASK_TAG + #define configUSE_APPLICATION_TASK_TAG 0 +#endif + +#ifndef INCLUDE_uxTaskGetStackHighWaterMark + #define INCLUDE_uxTaskGetStackHighWaterMark 0 +#endif + +#ifndef configUSE_RECURSIVE_MUTEXES + #define configUSE_RECURSIVE_MUTEXES 0 +#endif + +#ifndef configUSE_MUTEXES + #define configUSE_MUTEXES 0 +#endif + +#ifndef configUSE_TIMERS + #define configUSE_TIMERS 0 +#endif + +#ifndef configUSE_COUNTING_SEMAPHORES + #define configUSE_COUNTING_SEMAPHORES 0 +#endif + +#ifndef configUSE_ALTERNATIVE_API + #define configUSE_ALTERNATIVE_API 0 +#endif + +#ifndef portCRITICAL_NESTING_IN_TCB + #define portCRITICAL_NESTING_IN_TCB 0 +#endif + +#ifndef configMAX_TASK_NAME_LEN + #define configMAX_TASK_NAME_LEN 16 +#endif + +#ifndef configIDLE_SHOULD_YIELD + #define configIDLE_SHOULD_YIELD 1 +#endif + +#if configMAX_TASK_NAME_LEN < 1 + #error configMAX_TASK_NAME_LEN must be set to a minimum of 1 in FreeRTOSConfig.h +#endif + +#ifndef INCLUDE_xTaskResumeFromISR + #define INCLUDE_xTaskResumeFromISR 1 +#endif + +#ifndef configASSERT + #define configASSERT( x ) +#endif + +/* The timers module relies on xTaskGetSchedulerState(). */ +#if configUSE_TIMERS == 1 + + #ifndef configTIMER_TASK_PRIORITY + #error If configUSE_TIMERS is set to 1 then configTIMER_TASK_PRIORITY must also be defined. + #endif /* configTIMER_TASK_PRIORITY */ + + #ifndef configTIMER_QUEUE_LENGTH + #error If configUSE_TIMERS is set to 1 then configTIMER_QUEUE_LENGTH must also be defined. + #endif /* configTIMER_QUEUE_LENGTH */ + + #ifndef configTIMER_TASK_STACK_DEPTH + #error If configUSE_TIMERS is set to 1 then configTIMER_TASK_STACK_DEPTH must also be defined. + #endif /* configTIMER_TASK_STACK_DEPTH */ + +#endif /* configUSE_TIMERS */ + +#ifndef INCLUDE_xTaskGetSchedulerState + #define INCLUDE_xTaskGetSchedulerState 0 +#endif + +#ifndef INCLUDE_xTaskGetCurrentTaskHandle + #define INCLUDE_xTaskGetCurrentTaskHandle 0 +#endif + + +#ifndef portSET_INTERRUPT_MASK_FROM_ISR + #define portSET_INTERRUPT_MASK_FROM_ISR() 0 +#endif + +#ifndef portCLEAR_INTERRUPT_MASK_FROM_ISR + #define portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedStatusValue ) ( void ) uxSavedStatusValue +#endif + + +#ifndef configQUEUE_REGISTRY_SIZE + #define configQUEUE_REGISTRY_SIZE 0U +#endif + +#if ( configQUEUE_REGISTRY_SIZE < 1U ) + #define vQueueAddToRegistry( xQueue, pcName ) + #define vQueueUnregisterQueue( xQueue ) +#endif + + +/* Remove any unused trace macros. */ +#ifndef traceSTART + /* Used to perform any necessary initialisation - for example, open a file + into which trace is to be written. */ + #define traceSTART() +#endif + +#ifndef traceEND + /* Use to close a trace, for example close a file into which trace has been + written. */ + #define traceEND() +#endif + +#ifndef traceTASK_SWITCHED_IN + /* Called after a task has been selected to run. pxCurrentTCB holds a pointer + to the task control block of the selected task. */ + #define traceTASK_SWITCHED_IN() +#endif + +#ifndef traceTASK_SWITCHED_OUT + /* Called before a task has been selected to run. pxCurrentTCB holds a pointer + to the task control block of the task being switched out. */ + #define traceTASK_SWITCHED_OUT() +#endif + +#ifndef traceBLOCKING_ON_QUEUE_RECEIVE + /* Task is about to block because it cannot read from a + queue/mutex/semaphore. pxQueue is a pointer to the queue/mutex/semaphore + upon which the read was attempted. pxCurrentTCB points to the TCB of the + task that attempted the read. */ + #define traceBLOCKING_ON_QUEUE_RECEIVE( pxQueue ) +#endif + +#ifndef traceBLOCKING_ON_QUEUE_SEND + /* Task is about to block because it cannot write to a + queue/mutex/semaphore. pxQueue is a pointer to the queue/mutex/semaphore + upon which the write was attempted. pxCurrentTCB points to the TCB of the + task that attempted the write. */ + #define traceBLOCKING_ON_QUEUE_SEND( pxQueue ) +#endif + +#ifndef configCHECK_FOR_STACK_OVERFLOW + #define configCHECK_FOR_STACK_OVERFLOW 0 +#endif + +/* The following event macros are embedded in the kernel API calls. */ + +#ifndef traceQUEUE_CREATE + #define traceQUEUE_CREATE( pxNewQueue ) +#endif + +#ifndef traceQUEUE_CREATE_FAILED + #define traceQUEUE_CREATE_FAILED() +#endif + +#ifndef traceCREATE_MUTEX + #define traceCREATE_MUTEX( pxNewQueue ) +#endif + +#ifndef traceCREATE_MUTEX_FAILED + #define traceCREATE_MUTEX_FAILED() +#endif + +#ifndef traceGIVE_MUTEX_RECURSIVE + #define traceGIVE_MUTEX_RECURSIVE( pxMutex ) +#endif + +#ifndef traceGIVE_MUTEX_RECURSIVE_FAILED + #define traceGIVE_MUTEX_RECURSIVE_FAILED( pxMutex ) +#endif + +#ifndef traceTAKE_MUTEX_RECURSIVE + #define traceTAKE_MUTEX_RECURSIVE( pxMutex ) +#endif + +#ifndef traceTAKE_MUTEX_RECURSIVE_FAILED + #define traceTAKE_MUTEX_RECURSIVE_FAILED( pxMutex ) +#endif + +#ifndef traceCREATE_COUNTING_SEMAPHORE + #define traceCREATE_COUNTING_SEMAPHORE() +#endif + +#ifndef traceCREATE_COUNTING_SEMAPHORE_FAILED + #define traceCREATE_COUNTING_SEMAPHORE_FAILED() +#endif + +#ifndef traceQUEUE_SEND + #define traceQUEUE_SEND( pxQueue ) +#endif + +#ifndef traceQUEUE_SEND_FAILED + #define traceQUEUE_SEND_FAILED( pxQueue ) +#endif + +#ifndef traceQUEUE_RECEIVE + #define traceQUEUE_RECEIVE( pxQueue ) +#endif + +#ifndef traceQUEUE_PEEK + #define traceQUEUE_PEEK( pxQueue ) +#endif + +#ifndef traceQUEUE_RECEIVE_FAILED + #define traceQUEUE_RECEIVE_FAILED( pxQueue ) +#endif + +#ifndef traceQUEUE_SEND_FROM_ISR + #define traceQUEUE_SEND_FROM_ISR( pxQueue ) +#endif + +#ifndef traceQUEUE_SEND_FROM_ISR_FAILED + #define traceQUEUE_SEND_FROM_ISR_FAILED( pxQueue ) +#endif + +#ifndef traceQUEUE_RECEIVE_FROM_ISR + #define traceQUEUE_RECEIVE_FROM_ISR( pxQueue ) +#endif + +#ifndef traceQUEUE_RECEIVE_FROM_ISR_FAILED + #define traceQUEUE_RECEIVE_FROM_ISR_FAILED( pxQueue ) +#endif + +#ifndef traceQUEUE_DELETE + #define traceQUEUE_DELETE( pxQueue ) +#endif + +#ifndef traceTASK_CREATE + #define traceTASK_CREATE( pxNewTCB ) +#endif + +#ifndef traceTASK_CREATE_FAILED + #define traceTASK_CREATE_FAILED() +#endif + +#ifndef traceTASK_DELETE + #define traceTASK_DELETE( pxTaskToDelete ) +#endif + +#ifndef traceTASK_DELAY_UNTIL + #define traceTASK_DELAY_UNTIL() +#endif + +#ifndef traceTASK_DELAY + #define traceTASK_DELAY() +#endif + +#ifndef traceTASK_PRIORITY_SET + #define traceTASK_PRIORITY_SET( pxTask, uxNewPriority ) +#endif + +#ifndef traceTASK_SUSPEND + #define traceTASK_SUSPEND( pxTaskToSuspend ) +#endif + +#ifndef traceTASK_RESUME + #define traceTASK_RESUME( pxTaskToResume ) +#endif + +#ifndef traceTASK_RESUME_FROM_ISR + #define traceTASK_RESUME_FROM_ISR( pxTaskToResume ) +#endif + +#ifndef traceTASK_INCREMENT_TICK + #define traceTASK_INCREMENT_TICK( xTickCount ) +#endif + +#ifndef traceTIMER_CREATE + #define traceTIMER_CREATE( pxNewTimer ) +#endif + +#ifndef traceTIMER_CREATE_FAILED + #define traceTIMER_CREATE_FAILED() +#endif + +#ifndef traceTIMER_COMMAND_SEND + #define traceTIMER_COMMAND_SEND( xTimer, xMessageID, xMessageValueValue, xReturn ) +#endif + +#ifndef traceTIMER_EXPIRED + #define traceTIMER_EXPIRED( pxTimer ) +#endif + +#ifndef traceTIMER_COMMAND_RECEIVED + #define traceTIMER_COMMAND_RECEIVED( pxTimer, xMessageID, xMessageValue ) +#endif + +#ifndef configGENERATE_RUN_TIME_STATS + #define configGENERATE_RUN_TIME_STATS 0 +#endif + +#if ( configGENERATE_RUN_TIME_STATS == 1 ) + + #ifndef portCONFIGURE_TIMER_FOR_RUN_TIME_STATS + #error If configGENERATE_RUN_TIME_STATS is defined then portCONFIGURE_TIMER_FOR_RUN_TIME_STATS must also be defined. portCONFIGURE_TIMER_FOR_RUN_TIME_STATS should call a port layer function to setup a peripheral timer/counter that can then be used as the run time counter time base. + #endif /* portCONFIGURE_TIMER_FOR_RUN_TIME_STATS */ + + #ifndef portGET_RUN_TIME_COUNTER_VALUE + #ifndef portALT_GET_RUN_TIME_COUNTER_VALUE + #error If configGENERATE_RUN_TIME_STATS is defined then either portGET_RUN_TIME_COUNTER_VALUE or portALT_GET_RUN_TIME_COUNTER_VALUE must also be defined. See the examples provided and the FreeRTOS web site for more information. + #endif /* portALT_GET_RUN_TIME_COUNTER_VALUE */ + #endif /* portGET_RUN_TIME_COUNTER_VALUE */ + +#endif /* configGENERATE_RUN_TIME_STATS */ + +#ifndef portCONFIGURE_TIMER_FOR_RUN_TIME_STATS + #define portCONFIGURE_TIMER_FOR_RUN_TIME_STATS() +#endif + +#ifndef configUSE_MALLOC_FAILED_HOOK + #define configUSE_MALLOC_FAILED_HOOK 0 +#endif + +#ifndef portPRIVILEGE_BIT + #define portPRIVILEGE_BIT ( ( unsigned portBASE_TYPE ) 0x00 ) +#endif + +#ifndef portYIELD_WITHIN_API + #define portYIELD_WITHIN_API portYIELD +#endif + +#ifndef pvPortMallocAligned + #define pvPortMallocAligned( x, puxStackBuffer ) ( ( ( puxStackBuffer ) == NULL ) ? ( pvPortMalloc( ( x ) ) ) : ( puxStackBuffer ) ) +#endif + +#ifndef vPortFreeAligned + #define vPortFreeAligned( pvBlockToFree ) vPortFree( pvBlockToFree ) +#endif + +#endif /* INC_FREERTOS_H */ + diff --git a/FreeRTOSWithTraces/FreeRTOS_include/StackMacros.h b/FreeRTOSWithTraces/FreeRTOS_include/StackMacros.h new file mode 100644 index 0000000000000000000000000000000000000000..1114b6d29d07273ae1f467e3ffc47954841d17ca --- /dev/null +++ b/FreeRTOSWithTraces/FreeRTOS_include/StackMacros.h @@ -0,0 +1,174 @@ +/* + FreeRTOS V7.0.1 - Copyright (C) 2011 Real Time Engineers Ltd. + + + FreeRTOS supports many tools and architectures. V7.0.0 is sponsored by: + Atollic AB - Atollic provides professional embedded systems development + tools for C/C++ development, code analysis and test automation. + See http://www.atollic.com + + + *************************************************************************** + * * + * FreeRTOS tutorial books are available in pdf and paperback. * + * Complete, revised, and edited pdf reference manuals are also * + * available. * + * * + * Purchasing FreeRTOS documentation will not only help you, by * + * ensuring you get running as quickly as possible and with an * + * in-depth knowledge of how to use FreeRTOS, it will also help * + * the FreeRTOS project to continue with its mission of providing * + * professional grade, cross platform, de facto standard solutions * + * for microcontrollers - completely free of charge! * + * * + * >>> See http://www.FreeRTOS.org/Documentation for details. <<< * + * * + * Thank you for using FreeRTOS, and thank you for your support! * + * * + *************************************************************************** + + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation AND MODIFIED BY the FreeRTOS exception. + >>>NOTE<<< The modification to the GPL is included to allow you to + distribute a combined work that includes FreeRTOS without being obliged to + provide the source code for proprietary components outside of the FreeRTOS + kernel. FreeRTOS is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + more details. You should have received a copy of the GNU General Public + License and the FreeRTOS license exception along with FreeRTOS; if not it + can be viewed here: http://www.freertos.org/a00114.html and also obtained + by writing to Richard Barry, contact details for whom are available on the + FreeRTOS WEB site. + + 1 tab == 4 spaces! + + http://www.FreeRTOS.org - Documentation, latest information, license and + contact details. + + http://www.SafeRTOS.com - A version that is certified for use in safety + critical systems. + + http://www.OpenRTOS.com - Commercial support, development, porting, + licensing and training services. +*/ + +#ifndef STACK_MACROS_H +#define STACK_MACROS_H + +/* + * Call the stack overflow hook function if the stack of the task being swapped + * out is currently overflowed, or looks like it might have overflowed in the + * past. + * + * Setting configCHECK_FOR_STACK_OVERFLOW to 1 will cause the macro to check + * the current stack state only - comparing the current top of stack value to + * the stack limit. Setting configCHECK_FOR_STACK_OVERFLOW to greater than 1 + * will also cause the last few stack bytes to be checked to ensure the value + * to which the bytes were set when the task was created have not been + * overwritten. Note this second test does not guarantee that an overflowed + * stack will always be recognised. + */ + +/*-----------------------------------------------------------*/ + +#if( configCHECK_FOR_STACK_OVERFLOW == 0 ) + + /* FreeRTOSConfig.h is not set to check for stack overflows. */ + #define taskFIRST_CHECK_FOR_STACK_OVERFLOW() + #define taskSECOND_CHECK_FOR_STACK_OVERFLOW() + +#endif /* configCHECK_FOR_STACK_OVERFLOW == 0 */ +/*-----------------------------------------------------------*/ + +#if( configCHECK_FOR_STACK_OVERFLOW == 1 ) + + /* FreeRTOSConfig.h is only set to use the first method of + overflow checking. */ + #define taskSECOND_CHECK_FOR_STACK_OVERFLOW() + +#endif +/*-----------------------------------------------------------*/ + +#if( ( configCHECK_FOR_STACK_OVERFLOW > 0 ) && ( portSTACK_GROWTH < 0 ) ) + + /* Only the current stack state is to be checked. */ + #define taskFIRST_CHECK_FOR_STACK_OVERFLOW() \ + { \ + /* Is the currently saved stack pointer within the stack limit? */ \ + if( pxCurrentTCB->pxTopOfStack <= pxCurrentTCB->pxStack ) \ + { \ + vApplicationStackOverflowHook( ( xTaskHandle ) pxCurrentTCB, pxCurrentTCB->pcTaskName ); \ + } \ + } + +#endif /* configCHECK_FOR_STACK_OVERFLOW > 0 */ +/*-----------------------------------------------------------*/ + +#if( ( configCHECK_FOR_STACK_OVERFLOW > 0 ) && ( portSTACK_GROWTH > 0 ) ) + + /* Only the current stack state is to be checked. */ + #define taskFIRST_CHECK_FOR_STACK_OVERFLOW() \ + { \ + \ + /* Is the currently saved stack pointer within the stack limit? */ \ + if( pxCurrentTCB->pxTopOfStack >= pxCurrentTCB->pxEndOfStack ) \ + { \ + vApplicationStackOverflowHook( ( xTaskHandle ) pxCurrentTCB, pxCurrentTCB->pcTaskName ); \ + } \ + } + +#endif /* configCHECK_FOR_STACK_OVERFLOW == 1 */ +/*-----------------------------------------------------------*/ + +#if( ( configCHECK_FOR_STACK_OVERFLOW > 1 ) && ( portSTACK_GROWTH < 0 ) ) + + #define taskSECOND_CHECK_FOR_STACK_OVERFLOW() \ + { \ + static const unsigned char ucExpectedStackBytes[] = { tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, \ + tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, \ + tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, \ + tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, \ + tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE }; \ + \ + \ + /* Has the extremity of the task stack ever been written over? */ \ + if( memcmp( ( void * ) pxCurrentTCB->pxStack, ( void * ) ucExpectedStackBytes, sizeof( ucExpectedStackBytes ) ) != 0 ) \ + { \ + vApplicationStackOverflowHook( ( xTaskHandle ) pxCurrentTCB, pxCurrentTCB->pcTaskName ); \ + } \ + } + +#endif /* #if( configCHECK_FOR_STACK_OVERFLOW > 1 ) */ +/*-----------------------------------------------------------*/ + +#if( ( configCHECK_FOR_STACK_OVERFLOW > 1 ) && ( portSTACK_GROWTH > 0 ) ) + + #define taskSECOND_CHECK_FOR_STACK_OVERFLOW() \ + { \ + char *pcEndOfStack = ( char * ) pxCurrentTCB->pxEndOfStack; \ + static const unsigned char ucExpectedStackBytes[] = { tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, \ + tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, \ + tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, \ + tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, \ + tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE }; \ + \ + \ + pcEndOfStack -= sizeof( ucExpectedStackBytes ); \ + \ + /* Has the extremity of the task stack ever been written over? */ \ + if( memcmp( ( void * ) pcEndOfStack, ( void * ) ucExpectedStackBytes, sizeof( ucExpectedStackBytes ) ) != 0 ) \ + { \ + vApplicationStackOverflowHook( ( xTaskHandle ) pxCurrentTCB, pxCurrentTCB->pcTaskName ); \ + } \ + } + +#endif /* #if( configCHECK_FOR_STACK_OVERFLOW > 1 ) */ +/*-----------------------------------------------------------*/ + +#endif /* STACK_MACROS_H */ + diff --git a/FreeRTOSWithTraces/FreeRTOS_include/croutine.h b/FreeRTOSWithTraces/FreeRTOS_include/croutine.h new file mode 100644 index 0000000000000000000000000000000000000000..65fdc48e082be282a857ca7f186d5baef71b04fd --- /dev/null +++ b/FreeRTOSWithTraces/FreeRTOS_include/croutine.h @@ -0,0 +1,752 @@ +/* + FreeRTOS V7.0.1 - Copyright (C) 2011 Real Time Engineers Ltd. + + + FreeRTOS supports many tools and architectures. V7.0.0 is sponsored by: + Atollic AB - Atollic provides professional embedded systems development + tools for C/C++ development, code analysis and test automation. + See http://www.atollic.com + + + *************************************************************************** + * * + * FreeRTOS tutorial books are available in pdf and paperback. * + * Complete, revised, and edited pdf reference manuals are also * + * available. * + * * + * Purchasing FreeRTOS documentation will not only help you, by * + * ensuring you get running as quickly as possible and with an * + * in-depth knowledge of how to use FreeRTOS, it will also help * + * the FreeRTOS project to continue with its mission of providing * + * professional grade, cross platform, de facto standard solutions * + * for microcontrollers - completely free of charge! * + * * + * >>> See http://www.FreeRTOS.org/Documentation for details. <<< * + * * + * Thank you for using FreeRTOS, and thank you for your support! * + * * + *************************************************************************** + + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation AND MODIFIED BY the FreeRTOS exception. + >>>NOTE<<< The modification to the GPL is included to allow you to + distribute a combined work that includes FreeRTOS without being obliged to + provide the source code for proprietary components outside of the FreeRTOS + kernel. FreeRTOS is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + more details. You should have received a copy of the GNU General Public + License and the FreeRTOS license exception along with FreeRTOS; if not it + can be viewed here: http://www.freertos.org/a00114.html and also obtained + by writing to Richard Barry, contact details for whom are available on the + FreeRTOS WEB site. + + 1 tab == 4 spaces! + + http://www.FreeRTOS.org - Documentation, latest information, license and + contact details. + + http://www.SafeRTOS.com - A version that is certified for use in safety + critical systems. + + http://www.OpenRTOS.com - Commercial support, development, porting, + licensing and training services. +*/ + +#ifndef CO_ROUTINE_H +#define CO_ROUTINE_H + +#ifndef INC_FREERTOS_H + #error "include FreeRTOS.h must appear in source files before include croutine.h" +#endif + +#include "list.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* Used to hide the implementation of the co-routine control block. The +control block structure however has to be included in the header due to +the macro implementation of the co-routine functionality. */ +typedef void * xCoRoutineHandle; + +/* Defines the prototype to which co-routine functions must conform. */ +typedef void (*crCOROUTINE_CODE)( xCoRoutineHandle, unsigned portBASE_TYPE ); + +typedef struct corCoRoutineControlBlock +{ + crCOROUTINE_CODE pxCoRoutineFunction; + xListItem xGenericListItem; /*< List item used to place the CRCB in ready and blocked queues. */ + xListItem xEventListItem; /*< List item used to place the CRCB in event lists. */ + unsigned portBASE_TYPE uxPriority; /*< The priority of the co-routine in relation to other co-routines. */ + unsigned portBASE_TYPE uxIndex; /*< Used to distinguish between co-routines when multiple co-routines use the same co-routine function. */ + unsigned short uxState; /*< Used internally by the co-routine implementation. */ +} corCRCB; /* Co-routine control block. Note must be identical in size down to uxPriority with tskTCB. */ + +/** + * croutine. h + *<pre> + portBASE_TYPE xCoRoutineCreate( + crCOROUTINE_CODE pxCoRoutineCode, + unsigned portBASE_TYPE uxPriority, + unsigned portBASE_TYPE uxIndex + );</pre> + * + * Create a new co-routine and add it to the list of co-routines that are + * ready to run. + * + * @param pxCoRoutineCode Pointer to the co-routine function. Co-routine + * functions require special syntax - see the co-routine section of the WEB + * documentation for more information. + * + * @param uxPriority The priority with respect to other co-routines at which + * the co-routine will run. + * + * @param uxIndex Used to distinguish between different co-routines that + * execute the same function. See the example below and the co-routine section + * of the WEB documentation for further information. + * + * @return pdPASS if the co-routine was successfully created and added to a ready + * list, otherwise an error code defined with ProjDefs.h. + * + * Example usage: + <pre> + // Co-routine to be created. + void vFlashCoRoutine( xCoRoutineHandle xHandle, unsigned portBASE_TYPE uxIndex ) + { + // Variables in co-routines must be declared static if they must maintain value across a blocking call. + // This may not be necessary for const variables. + static const char cLedToFlash[ 2 ] = { 5, 6 }; + static const portTickType uxFlashRates[ 2 ] = { 200, 400 }; + + // Must start every co-routine with a call to crSTART(); + crSTART( xHandle ); + + for( ;; ) + { + // This co-routine just delays for a fixed period, then toggles + // an LED. Two co-routines are created using this function, so + // the uxIndex parameter is used to tell the co-routine which + // LED to flash and how long to delay. This assumes xQueue has + // already been created. + vParTestToggleLED( cLedToFlash[ uxIndex ] ); + crDELAY( xHandle, uxFlashRates[ uxIndex ] ); + } + + // Must end every co-routine with a call to crEND(); + crEND(); + } + + // Function that creates two co-routines. + void vOtherFunction( void ) + { + unsigned char ucParameterToPass; + xTaskHandle xHandle; + + // Create two co-routines at priority 0. The first is given index 0 + // so (from the code above) toggles LED 5 every 200 ticks. The second + // is given index 1 so toggles LED 6 every 400 ticks. + for( uxIndex = 0; uxIndex < 2; uxIndex++ ) + { + xCoRoutineCreate( vFlashCoRoutine, 0, uxIndex ); + } + } + </pre> + * \defgroup xCoRoutineCreate xCoRoutineCreate + * \ingroup Tasks + */ +signed portBASE_TYPE xCoRoutineCreate( crCOROUTINE_CODE pxCoRoutineCode, unsigned portBASE_TYPE uxPriority, unsigned portBASE_TYPE uxIndex ); + + +/** + * croutine. h + *<pre> + void vCoRoutineSchedule( void );</pre> + * + * Run a co-routine. + * + * vCoRoutineSchedule() executes the highest priority co-routine that is able + * to run. The co-routine will execute until it either blocks, yields or is + * preempted by a task. Co-routines execute cooperatively so one + * co-routine cannot be preempted by another, but can be preempted by a task. + * + * If an application comprises of both tasks and co-routines then + * vCoRoutineSchedule should be called from the idle task (in an idle task + * hook). + * + * Example usage: + <pre> + // This idle task hook will schedule a co-routine each time it is called. + // The rest of the idle task will execute between co-routine calls. + void vApplicationIdleHook( void ) + { + vCoRoutineSchedule(); + } + + // Alternatively, if you do not require any other part of the idle task to + // execute, the idle task hook can call vCoRoutineScheduler() within an + // infinite loop. + void vApplicationIdleHook( void ) + { + for( ;; ) + { + vCoRoutineSchedule(); + } + } + </pre> + * \defgroup vCoRoutineSchedule vCoRoutineSchedule + * \ingroup Tasks + */ +void vCoRoutineSchedule( void ); + +/** + * croutine. h + * <pre> + crSTART( xCoRoutineHandle xHandle );</pre> + * + * This macro MUST always be called at the start of a co-routine function. + * + * Example usage: + <pre> + // Co-routine to be created. + void vACoRoutine( xCoRoutineHandle xHandle, unsigned portBASE_TYPE uxIndex ) + { + // Variables in co-routines must be declared static if they must maintain value across a blocking call. + static long ulAVariable; + + // Must start every co-routine with a call to crSTART(); + crSTART( xHandle ); + + for( ;; ) + { + // Co-routine functionality goes here. + } + + // Must end every co-routine with a call to crEND(); + crEND(); + }</pre> + * \defgroup crSTART crSTART + * \ingroup Tasks + */ +#define crSTART( pxCRCB ) switch( ( ( corCRCB * )( pxCRCB ) )->uxState ) { case 0: + +/** + * croutine. h + * <pre> + crEND();</pre> + * + * This macro MUST always be called at the end of a co-routine function. + * + * Example usage: + <pre> + // Co-routine to be created. + void vACoRoutine( xCoRoutineHandle xHandle, unsigned portBASE_TYPE uxIndex ) + { + // Variables in co-routines must be declared static if they must maintain value across a blocking call. + static long ulAVariable; + + // Must start every co-routine with a call to crSTART(); + crSTART( xHandle ); + + for( ;; ) + { + // Co-routine functionality goes here. + } + + // Must end every co-routine with a call to crEND(); + crEND(); + }</pre> + * \defgroup crSTART crSTART + * \ingroup Tasks + */ +#define crEND() } + +/* + * These macros are intended for internal use by the co-routine implementation + * only. The macros should not be used directly by application writers. + */ +#define crSET_STATE0( xHandle ) ( ( corCRCB * )( xHandle ) )->uxState = (__LINE__ * 2); return; case (__LINE__ * 2): +#define crSET_STATE1( xHandle ) ( ( corCRCB * )( xHandle ) )->uxState = ((__LINE__ * 2)+1); return; case ((__LINE__ * 2)+1): + +/** + * croutine. h + *<pre> + crDELAY( xCoRoutineHandle xHandle, portTickType xTicksToDelay );</pre> + * + * Delay a co-routine for a fixed period of time. + * + * crDELAY can only be called from the co-routine function itself - not + * from within a function called by the co-routine function. This is because + * co-routines do not maintain their own stack. + * + * @param xHandle The handle of the co-routine to delay. This is the xHandle + * parameter of the co-routine function. + * + * @param xTickToDelay The number of ticks that the co-routine should delay + * for. The actual amount of time this equates to is defined by + * configTICK_RATE_HZ (set in FreeRTOSConfig.h). The constant portTICK_RATE_MS + * can be used to convert ticks to milliseconds. + * + * Example usage: + <pre> + // Co-routine to be created. + void vACoRoutine( xCoRoutineHandle xHandle, unsigned portBASE_TYPE uxIndex ) + { + // Variables in co-routines must be declared static if they must maintain value across a blocking call. + // This may not be necessary for const variables. + // We are to delay for 200ms. + static const xTickType xDelayTime = 200 / portTICK_RATE_MS; + + // Must start every co-routine with a call to crSTART(); + crSTART( xHandle ); + + for( ;; ) + { + // Delay for 200ms. + crDELAY( xHandle, xDelayTime ); + + // Do something here. + } + + // Must end every co-routine with a call to crEND(); + crEND(); + }</pre> + * \defgroup crDELAY crDELAY + * \ingroup Tasks + */ +#define crDELAY( xHandle, xTicksToDelay ) \ + if( ( xTicksToDelay ) > 0 ) \ + { \ + vCoRoutineAddToDelayedList( ( xTicksToDelay ), NULL ); \ + } \ + crSET_STATE0( ( xHandle ) ); + +/** + * <pre> + crQUEUE_SEND( + xCoRoutineHandle xHandle, + xQueueHandle pxQueue, + void *pvItemToQueue, + portTickType xTicksToWait, + portBASE_TYPE *pxResult + )</pre> + * + * The macro's crQUEUE_SEND() and crQUEUE_RECEIVE() are the co-routine + * equivalent to the xQueueSend() and xQueueReceive() functions used by tasks. + * + * crQUEUE_SEND and crQUEUE_RECEIVE can only be used from a co-routine whereas + * xQueueSend() and xQueueReceive() can only be used from tasks. + * + * crQUEUE_SEND can only be called from the co-routine function itself - not + * from within a function called by the co-routine function. This is because + * co-routines do not maintain their own stack. + * + * See the co-routine section of the WEB documentation for information on + * passing data between tasks and co-routines and between ISR's and + * co-routines. + * + * @param xHandle The handle of the calling co-routine. This is the xHandle + * parameter of the co-routine function. + * + * @param pxQueue The handle of the queue on which the data will be posted. + * The handle is obtained as the return value when the queue is created using + * the xQueueCreate() API function. + * + * @param pvItemToQueue A pointer to the data being posted onto the queue. + * The number of bytes of each queued item is specified when the queue is + * created. This number of bytes is copied from pvItemToQueue into the queue + * itself. + * + * @param xTickToDelay The number of ticks that the co-routine should block + * to wait for space to become available on the queue, should space not be + * available immediately. The actual amount of time this equates to is defined + * by configTICK_RATE_HZ (set in FreeRTOSConfig.h). The constant + * portTICK_RATE_MS can be used to convert ticks to milliseconds (see example + * below). + * + * @param pxResult The variable pointed to by pxResult will be set to pdPASS if + * data was successfully posted onto the queue, otherwise it will be set to an + * error defined within ProjDefs.h. + * + * Example usage: + <pre> + // Co-routine function that blocks for a fixed period then posts a number onto + // a queue. + static void prvCoRoutineFlashTask( xCoRoutineHandle xHandle, unsigned portBASE_TYPE uxIndex ) + { + // Variables in co-routines must be declared static if they must maintain value across a blocking call. + static portBASE_TYPE xNumberToPost = 0; + static portBASE_TYPE xResult; + + // Co-routines must begin with a call to crSTART(). + crSTART( xHandle ); + + for( ;; ) + { + // This assumes the queue has already been created. + crQUEUE_SEND( xHandle, xCoRoutineQueue, &xNumberToPost, NO_DELAY, &xResult ); + + if( xResult != pdPASS ) + { + // The message was not posted! + } + + // Increment the number to be posted onto the queue. + xNumberToPost++; + + // Delay for 100 ticks. + crDELAY( xHandle, 100 ); + } + + // Co-routines must end with a call to crEND(). + crEND(); + }</pre> + * \defgroup crQUEUE_SEND crQUEUE_SEND + * \ingroup Tasks + */ +#define crQUEUE_SEND( xHandle, pxQueue, pvItemToQueue, xTicksToWait, pxResult ) \ +{ \ + *( pxResult ) = xQueueCRSend( ( pxQueue) , ( pvItemToQueue) , ( xTicksToWait ) ); \ + if( *( pxResult ) == errQUEUE_BLOCKED ) \ + { \ + crSET_STATE0( ( xHandle ) ); \ + *pxResult = xQueueCRSend( ( pxQueue ), ( pvItemToQueue ), 0 ); \ + } \ + if( *pxResult == errQUEUE_YIELD ) \ + { \ + crSET_STATE1( ( xHandle ) ); \ + *pxResult = pdPASS; \ + } \ +} + +/** + * croutine. h + * <pre> + crQUEUE_RECEIVE( + xCoRoutineHandle xHandle, + xQueueHandle pxQueue, + void *pvBuffer, + portTickType xTicksToWait, + portBASE_TYPE *pxResult + )</pre> + * + * The macro's crQUEUE_SEND() and crQUEUE_RECEIVE() are the co-routine + * equivalent to the xQueueSend() and xQueueReceive() functions used by tasks. + * + * crQUEUE_SEND and crQUEUE_RECEIVE can only be used from a co-routine whereas + * xQueueSend() and xQueueReceive() can only be used from tasks. + * + * crQUEUE_RECEIVE can only be called from the co-routine function itself - not + * from within a function called by the co-routine function. This is because + * co-routines do not maintain their own stack. + * + * See the co-routine section of the WEB documentation for information on + * passing data between tasks and co-routines and between ISR's and + * co-routines. + * + * @param xHandle The handle of the calling co-routine. This is the xHandle + * parameter of the co-routine function. + * + * @param pxQueue The handle of the queue from which the data will be received. + * The handle is obtained as the return value when the queue is created using + * the xQueueCreate() API function. + * + * @param pvBuffer The buffer into which the received item is to be copied. + * The number of bytes of each queued item is specified when the queue is + * created. This number of bytes is copied into pvBuffer. + * + * @param xTickToDelay The number of ticks that the co-routine should block + * to wait for data to become available from the queue, should data not be + * available immediately. The actual amount of time this equates to is defined + * by configTICK_RATE_HZ (set in FreeRTOSConfig.h). The constant + * portTICK_RATE_MS can be used to convert ticks to milliseconds (see the + * crQUEUE_SEND example). + * + * @param pxResult The variable pointed to by pxResult will be set to pdPASS if + * data was successfully retrieved from the queue, otherwise it will be set to + * an error code as defined within ProjDefs.h. + * + * Example usage: + <pre> + // A co-routine receives the number of an LED to flash from a queue. It + // blocks on the queue until the number is received. + static void prvCoRoutineFlashWorkTask( xCoRoutineHandle xHandle, unsigned portBASE_TYPE uxIndex ) + { + // Variables in co-routines must be declared static if they must maintain value across a blocking call. + static portBASE_TYPE xResult; + static unsigned portBASE_TYPE uxLEDToFlash; + + // All co-routines must start with a call to crSTART(). + crSTART( xHandle ); + + for( ;; ) + { + // Wait for data to become available on the queue. + crQUEUE_RECEIVE( xHandle, xCoRoutineQueue, &uxLEDToFlash, portMAX_DELAY, &xResult ); + + if( xResult == pdPASS ) + { + // We received the LED to flash - flash it! + vParTestToggleLED( uxLEDToFlash ); + } + } + + crEND(); + }</pre> + * \defgroup crQUEUE_RECEIVE crQUEUE_RECEIVE + * \ingroup Tasks + */ +#define crQUEUE_RECEIVE( xHandle, pxQueue, pvBuffer, xTicksToWait, pxResult ) \ +{ \ + *( pxResult ) = xQueueCRReceive( ( pxQueue) , ( pvBuffer ), ( xTicksToWait ) ); \ + if( *( pxResult ) == errQUEUE_BLOCKED ) \ + { \ + crSET_STATE0( ( xHandle ) ); \ + *( pxResult ) = xQueueCRReceive( ( pxQueue) , ( pvBuffer ), 0 ); \ + } \ + if( *( pxResult ) == errQUEUE_YIELD ) \ + { \ + crSET_STATE1( ( xHandle ) ); \ + *( pxResult ) = pdPASS; \ + } \ +} + +/** + * croutine. h + * <pre> + crQUEUE_SEND_FROM_ISR( + xQueueHandle pxQueue, + void *pvItemToQueue, + portBASE_TYPE xCoRoutinePreviouslyWoken + )</pre> + * + * The macro's crQUEUE_SEND_FROM_ISR() and crQUEUE_RECEIVE_FROM_ISR() are the + * co-routine equivalent to the xQueueSendFromISR() and xQueueReceiveFromISR() + * functions used by tasks. + * + * crQUEUE_SEND_FROM_ISR() and crQUEUE_RECEIVE_FROM_ISR() can only be used to + * pass data between a co-routine and and ISR, whereas xQueueSendFromISR() and + * xQueueReceiveFromISR() can only be used to pass data between a task and and + * ISR. + * + * crQUEUE_SEND_FROM_ISR can only be called from an ISR to send data to a queue + * that is being used from within a co-routine. + * + * See the co-routine section of the WEB documentation for information on + * passing data between tasks and co-routines and between ISR's and + * co-routines. + * + * @param xQueue The handle to the queue on which the item is to be posted. + * + * @param pvItemToQueue A pointer to the item that is to be placed on the + * queue. The size of the items the queue will hold was defined when the + * queue was created, so this many bytes will be copied from pvItemToQueue + * into the queue storage area. + * + * @param xCoRoutinePreviouslyWoken This is included so an ISR can post onto + * the same queue multiple times from a single interrupt. The first call + * should always pass in pdFALSE. Subsequent calls should pass in + * the value returned from the previous call. + * + * @return pdTRUE if a co-routine was woken by posting onto the queue. This is + * used by the ISR to determine if a context switch may be required following + * the ISR. + * + * Example usage: + <pre> + // A co-routine that blocks on a queue waiting for characters to be received. + static void vReceivingCoRoutine( xCoRoutineHandle xHandle, unsigned portBASE_TYPE uxIndex ) + { + char cRxedChar; + portBASE_TYPE xResult; + + // All co-routines must start with a call to crSTART(). + crSTART( xHandle ); + + for( ;; ) + { + // Wait for data to become available on the queue. This assumes the + // queue xCommsRxQueue has already been created! + crQUEUE_RECEIVE( xHandle, xCommsRxQueue, &uxLEDToFlash, portMAX_DELAY, &xResult ); + + // Was a character received? + if( xResult == pdPASS ) + { + // Process the character here. + } + } + + // All co-routines must end with a call to crEND(). + crEND(); + } + + // An ISR that uses a queue to send characters received on a serial port to + // a co-routine. + void vUART_ISR( void ) + { + char cRxedChar; + portBASE_TYPE xCRWokenByPost = pdFALSE; + + // We loop around reading characters until there are none left in the UART. + while( UART_RX_REG_NOT_EMPTY() ) + { + // Obtain the character from the UART. + cRxedChar = UART_RX_REG; + + // Post the character onto a queue. xCRWokenByPost will be pdFALSE + // the first time around the loop. If the post causes a co-routine + // to be woken (unblocked) then xCRWokenByPost will be set to pdTRUE. + // In this manner we can ensure that if more than one co-routine is + // blocked on the queue only one is woken by this ISR no matter how + // many characters are posted to the queue. + xCRWokenByPost = crQUEUE_SEND_FROM_ISR( xCommsRxQueue, &cRxedChar, xCRWokenByPost ); + } + }</pre> + * \defgroup crQUEUE_SEND_FROM_ISR crQUEUE_SEND_FROM_ISR + * \ingroup Tasks + */ +#define crQUEUE_SEND_FROM_ISR( pxQueue, pvItemToQueue, xCoRoutinePreviouslyWoken ) xQueueCRSendFromISR( ( pxQueue ), ( pvItemToQueue ), ( xCoRoutinePreviouslyWoken ) ) + + +/** + * croutine. h + * <pre> + crQUEUE_SEND_FROM_ISR( + xQueueHandle pxQueue, + void *pvBuffer, + portBASE_TYPE * pxCoRoutineWoken + )</pre> + * + * The macro's crQUEUE_SEND_FROM_ISR() and crQUEUE_RECEIVE_FROM_ISR() are the + * co-routine equivalent to the xQueueSendFromISR() and xQueueReceiveFromISR() + * functions used by tasks. + * + * crQUEUE_SEND_FROM_ISR() and crQUEUE_RECEIVE_FROM_ISR() can only be used to + * pass data between a co-routine and and ISR, whereas xQueueSendFromISR() and + * xQueueReceiveFromISR() can only be used to pass data between a task and and + * ISR. + * + * crQUEUE_RECEIVE_FROM_ISR can only be called from an ISR to receive data + * from a queue that is being used from within a co-routine (a co-routine + * posted to the queue). + * + * See the co-routine section of the WEB documentation for information on + * passing data between tasks and co-routines and between ISR's and + * co-routines. + * + * @param xQueue The handle to the queue on which the item is to be posted. + * + * @param pvBuffer A pointer to a buffer into which the received item will be + * placed. The size of the items the queue will hold was defined when the + * queue was created, so this many bytes will be copied from the queue into + * pvBuffer. + * + * @param pxCoRoutineWoken A co-routine may be blocked waiting for space to become + * available on the queue. If crQUEUE_RECEIVE_FROM_ISR causes such a + * co-routine to unblock *pxCoRoutineWoken will get set to pdTRUE, otherwise + * *pxCoRoutineWoken will remain unchanged. + * + * @return pdTRUE an item was successfully received from the queue, otherwise + * pdFALSE. + * + * Example usage: + <pre> + // A co-routine that posts a character to a queue then blocks for a fixed + // period. The character is incremented each time. + static void vSendingCoRoutine( xCoRoutineHandle xHandle, unsigned portBASE_TYPE uxIndex ) + { + // cChar holds its value while this co-routine is blocked and must therefore + // be declared static. + static char cCharToTx = 'a'; + portBASE_TYPE xResult; + + // All co-routines must start with a call to crSTART(). + crSTART( xHandle ); + + for( ;; ) + { + // Send the next character to the queue. + crQUEUE_SEND( xHandle, xCoRoutineQueue, &cCharToTx, NO_DELAY, &xResult ); + + if( xResult == pdPASS ) + { + // The character was successfully posted to the queue. + } + else + { + // Could not post the character to the queue. + } + + // Enable the UART Tx interrupt to cause an interrupt in this + // hypothetical UART. The interrupt will obtain the character + // from the queue and send it. + ENABLE_RX_INTERRUPT(); + + // Increment to the next character then block for a fixed period. + // cCharToTx will maintain its value across the delay as it is + // declared static. + cCharToTx++; + if( cCharToTx > 'x' ) + { + cCharToTx = 'a'; + } + crDELAY( 100 ); + } + + // All co-routines must end with a call to crEND(). + crEND(); + } + + // An ISR that uses a queue to receive characters to send on a UART. + void vUART_ISR( void ) + { + char cCharToTx; + portBASE_TYPE xCRWokenByPost = pdFALSE; + + while( UART_TX_REG_EMPTY() ) + { + // Are there any characters in the queue waiting to be sent? + // xCRWokenByPost will automatically be set to pdTRUE if a co-routine + // is woken by the post - ensuring that only a single co-routine is + // woken no matter how many times we go around this loop. + if( crQUEUE_RECEIVE_FROM_ISR( pxQueue, &cCharToTx, &xCRWokenByPost ) ) + { + SEND_CHARACTER( cCharToTx ); + } + } + }</pre> + * \defgroup crQUEUE_RECEIVE_FROM_ISR crQUEUE_RECEIVE_FROM_ISR + * \ingroup Tasks + */ +#define crQUEUE_RECEIVE_FROM_ISR( pxQueue, pvBuffer, pxCoRoutineWoken ) xQueueCRReceiveFromISR( ( pxQueue ), ( pvBuffer ), ( pxCoRoutineWoken ) ) + +/* + * This function is intended for internal use by the co-routine macros only. + * The macro nature of the co-routine implementation requires that the + * prototype appears here. The function should not be used by application + * writers. + * + * Removes the current co-routine from its ready list and places it in the + * appropriate delayed list. + */ +void vCoRoutineAddToDelayedList( portTickType xTicksToDelay, xList *pxEventList ); + +/* + * This function is intended for internal use by the queue implementation only. + * The function should not be used by application writers. + * + * Removes the highest priority co-routine from the event list and places it in + * the pending ready list. + */ +signed portBASE_TYPE xCoRoutineRemoveFromEventList( const xList *pxEventList ); + +#ifdef __cplusplus +} +#endif + +#endif /* CO_ROUTINE_H */ diff --git a/FreeRTOSWithTraces/FreeRTOS_include/list.h b/FreeRTOSWithTraces/FreeRTOS_include/list.h new file mode 100644 index 0000000000000000000000000000000000000000..e8b47c4392a085b1572884066ffb3d4681e310aa --- /dev/null +++ b/FreeRTOSWithTraces/FreeRTOS_include/list.h @@ -0,0 +1,314 @@ +/* + FreeRTOS V7.0.1 - Copyright (C) 2011 Real Time Engineers Ltd. + + + FreeRTOS supports many tools and architectures. V7.0.0 is sponsored by: + Atollic AB - Atollic provides professional embedded systems development + tools for C/C++ development, code analysis and test automation. + See http://www.atollic.com + + + *************************************************************************** + * * + * FreeRTOS tutorial books are available in pdf and paperback. * + * Complete, revised, and edited pdf reference manuals are also * + * available. * + * * + * Purchasing FreeRTOS documentation will not only help you, by * + * ensuring you get running as quickly as possible and with an * + * in-depth knowledge of how to use FreeRTOS, it will also help * + * the FreeRTOS project to continue with its mission of providing * + * professional grade, cross platform, de facto standard solutions * + * for microcontrollers - completely free of charge! * + * * + * >>> See http://www.FreeRTOS.org/Documentation for details. <<< * + * * + * Thank you for using FreeRTOS, and thank you for your support! * + * * + *************************************************************************** + + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation AND MODIFIED BY the FreeRTOS exception. + >>>NOTE<<< The modification to the GPL is included to allow you to + distribute a combined work that includes FreeRTOS without being obliged to + provide the source code for proprietary components outside of the FreeRTOS + kernel. FreeRTOS is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + more details. You should have received a copy of the GNU General Public + License and the FreeRTOS license exception along with FreeRTOS; if not it + can be viewed here: http://www.freertos.org/a00114.html and also obtained + by writing to Richard Barry, contact details for whom are available on the + FreeRTOS WEB site. + + 1 tab == 4 spaces! + + http://www.FreeRTOS.org - Documentation, latest information, license and + contact details. + + http://www.SafeRTOS.com - A version that is certified for use in safety + critical systems. + + http://www.OpenRTOS.com - Commercial support, development, porting, + licensing and training services. +*/ + +/* + * This is the list implementation used by the scheduler. While it is tailored + * heavily for the schedulers needs, it is also available for use by + * application code. + * + * xLists can only store pointers to xListItems. Each xListItem contains a + * numeric value (xItemValue). Most of the time the lists are sorted in + * descending item value order. + * + * Lists are created already containing one list item. The value of this + * item is the maximum possible that can be stored, it is therefore always at + * the end of the list and acts as a marker. The list member pxHead always + * points to this marker - even though it is at the tail of the list. This + * is because the tail contains a wrap back pointer to the true head of + * the list. + * + * In addition to it's value, each list item contains a pointer to the next + * item in the list (pxNext), a pointer to the list it is in (pxContainer) + * and a pointer to back to the object that contains it. These later two + * pointers are included for efficiency of list manipulation. There is + * effectively a two way link between the object containing the list item and + * the list item itself. + * + * + * \page ListIntroduction List Implementation + * \ingroup FreeRTOSIntro + */ + + +#ifndef LIST_H +#define LIST_H + +#ifdef __cplusplus +extern "C" { +#endif +/* + * Definition of the only type of object that a list can contain. + */ +struct xLIST_ITEM +{ + portTickType xItemValue; /*< The value being listed. In most cases this is used to sort the list in descending order. */ + volatile struct xLIST_ITEM * pxNext; /*< Pointer to the next xListItem in the list. */ + volatile struct xLIST_ITEM * pxPrevious;/*< Pointer to the previous xListItem in the list. */ + void * pvOwner; /*< Pointer to the object (normally a TCB) that contains the list item. There is therefore a two way link between the object containing the list item and the list item itself. */ + void * pvContainer; /*< Pointer to the list in which this list item is placed (if any). */ +}; +typedef struct xLIST_ITEM xListItem; /* For some reason lint wants this as two separate definitions. */ + +struct xMINI_LIST_ITEM +{ + portTickType xItemValue; + volatile struct xLIST_ITEM *pxNext; + volatile struct xLIST_ITEM *pxPrevious; +}; +typedef struct xMINI_LIST_ITEM xMiniListItem; + +/* + * Definition of the type of queue used by the scheduler. + */ +typedef struct xLIST +{ + volatile unsigned portBASE_TYPE uxNumberOfItems; + volatile xListItem * pxIndex; /*< Used to walk through the list. Points to the last item returned by a call to pvListGetOwnerOfNextEntry (). */ + volatile xMiniListItem xListEnd; /*< List item that contains the maximum possible item value meaning it is always at the end of the list and is therefore used as a marker. */ +} xList; + +/* + * Access macro to set the owner of a list item. The owner of a list item + * is the object (usually a TCB) that contains the list item. + * + * \page listSET_LIST_ITEM_OWNER listSET_LIST_ITEM_OWNER + * \ingroup LinkedList + */ +#define listSET_LIST_ITEM_OWNER( pxListItem, pxOwner ) ( pxListItem )->pvOwner = ( void * ) ( pxOwner ) + +/* + * Access macro to set the value of the list item. In most cases the value is + * used to sort the list in descending order. + * + * \page listSET_LIST_ITEM_VALUE listSET_LIST_ITEM_VALUE + * \ingroup LinkedList + */ +#define listSET_LIST_ITEM_VALUE( pxListItem, xValue ) ( pxListItem )->xItemValue = ( xValue ) + +/* + * Access macro the retrieve the value of the list item. The value can + * represent anything - for example a the priority of a task, or the time at + * which a task should be unblocked. + * + * \page listGET_LIST_ITEM_VALUE listGET_LIST_ITEM_VALUE + * \ingroup LinkedList + */ +#define listGET_LIST_ITEM_VALUE( pxListItem ) ( ( pxListItem )->xItemValue ) + +/* + * Access macro the retrieve the value of the list item at the head of a given + * list. + * + * \page listGET_LIST_ITEM_VALUE listGET_LIST_ITEM_VALUE + * \ingroup LinkedList + */ +#define listGET_ITEM_VALUE_OF_HEAD_ENTRY( pxList ) ( (&( ( pxList )->xListEnd ))->pxNext->xItemValue ) + +/* + * Access macro to determine if a list contains any items. The macro will + * only have the value true if the list is empty. + * + * \page listLIST_IS_EMPTY listLIST_IS_EMPTY + * \ingroup LinkedList + */ +#define listLIST_IS_EMPTY( pxList ) ( ( pxList )->uxNumberOfItems == ( unsigned portBASE_TYPE ) 0 ) + +/* + * Access macro to return the number of items in the list. + */ +#define listCURRENT_LIST_LENGTH( pxList ) ( ( pxList )->uxNumberOfItems ) + +/* + * Access function to obtain the owner of the next entry in a list. + * + * The list member pxIndex is used to walk through a list. Calling + * listGET_OWNER_OF_NEXT_ENTRY increments pxIndex to the next item in the list + * and returns that entries pxOwner parameter. Using multiple calls to this + * function it is therefore possible to move through every item contained in + * a list. + * + * The pxOwner parameter of a list item is a pointer to the object that owns + * the list item. In the scheduler this is normally a task control block. + * The pxOwner parameter effectively creates a two way link between the list + * item and its owner. + * + * @param pxList The list from which the next item owner is to be returned. + * + * \page listGET_OWNER_OF_NEXT_ENTRY listGET_OWNER_OF_NEXT_ENTRY + * \ingroup LinkedList + */ +#define listGET_OWNER_OF_NEXT_ENTRY( pxTCB, pxList ) \ +{ \ +xList * const pxConstList = ( pxList ); \ + /* Increment the index to the next item and return the item, ensuring */ \ + /* we don't return the marker used at the end of the list. */ \ + ( pxConstList )->pxIndex = ( pxConstList )->pxIndex->pxNext; \ + if( ( pxConstList )->pxIndex == ( xListItem * ) &( ( pxConstList )->xListEnd ) ) \ + { \ + ( pxConstList )->pxIndex = ( pxConstList )->pxIndex->pxNext; \ + } \ + ( pxTCB ) = ( pxConstList )->pxIndex->pvOwner; \ +} + + +/* + * Access function to obtain the owner of the first entry in a list. Lists + * are normally sorted in ascending item value order. + * + * This function returns the pxOwner member of the first item in the list. + * The pxOwner parameter of a list item is a pointer to the object that owns + * the list item. In the scheduler this is normally a task control block. + * The pxOwner parameter effectively creates a two way link between the list + * item and its owner. + * + * @param pxList The list from which the owner of the head item is to be + * returned. + * + * \page listGET_OWNER_OF_HEAD_ENTRY listGET_OWNER_OF_HEAD_ENTRY + * \ingroup LinkedList + */ +#define listGET_OWNER_OF_HEAD_ENTRY( pxList ) ( (&( ( pxList )->xListEnd ))->pxNext->pvOwner ) + +/* + * Check to see if a list item is within a list. The list item maintains a + * "container" pointer that points to the list it is in. All this macro does + * is check to see if the container and the list match. + * + * @param pxList The list we want to know if the list item is within. + * @param pxListItem The list item we want to know if is in the list. + * @return pdTRUE is the list item is in the list, otherwise pdFALSE. + * pointer against + */ +#define listIS_CONTAINED_WITHIN( pxList, pxListItem ) ( ( pxListItem )->pvContainer == ( void * ) ( pxList ) ) + +/* + * Must be called before a list is used! This initialises all the members + * of the list structure and inserts the xListEnd item into the list as a + * marker to the back of the list. + * + * @param pxList Pointer to the list being initialised. + * + * \page vListInitialise vListInitialise + * \ingroup LinkedList + */ +void vListInitialise( xList *pxList ); + +/* + * Must be called before a list item is used. This sets the list container to + * null so the item does not think that it is already contained in a list. + * + * @param pxItem Pointer to the list item being initialised. + * + * \page vListInitialiseItem vListInitialiseItem + * \ingroup LinkedList + */ +void vListInitialiseItem( xListItem *pxItem ); + +/* + * Insert a list item into a list. The item will be inserted into the list in + * a position determined by its item value (descending item value order). + * + * @param pxList The list into which the item is to be inserted. + * + * @param pxNewListItem The item to that is to be placed in the list. + * + * \page vListInsert vListInsert + * \ingroup LinkedList + */ +void vListInsert( xList *pxList, xListItem *pxNewListItem ); + +/* + * Insert a list item into a list. The item will be inserted in a position + * such that it will be the last item within the list returned by multiple + * calls to listGET_OWNER_OF_NEXT_ENTRY. + * + * The list member pvIndex is used to walk through a list. Calling + * listGET_OWNER_OF_NEXT_ENTRY increments pvIndex to the next item in the list. + * Placing an item in a list using vListInsertEnd effectively places the item + * in the list position pointed to by pvIndex. This means that every other + * item within the list will be returned by listGET_OWNER_OF_NEXT_ENTRY before + * the pvIndex parameter again points to the item being inserted. + * + * @param pxList The list into which the item is to be inserted. + * + * @param pxNewListItem The list item to be inserted into the list. + * + * \page vListInsertEnd vListInsertEnd + * \ingroup LinkedList + */ +void vListInsertEnd( xList *pxList, xListItem *pxNewListItem ); + +/* + * Remove an item from a list. The list item has a pointer to the list that + * it is in, so only the list item need be passed into the function. + * + * @param vListRemove The item to be removed. The item will remove itself from + * the list pointed to by it's pxContainer parameter. + * + * \page vListRemove vListRemove + * \ingroup LinkedList + */ +void vListRemove( xListItem *pxItemToRemove ); + +#ifdef __cplusplus +} +#endif + +#endif + diff --git a/FreeRTOSWithTraces/FreeRTOS_include/mpu_wrappers.h b/FreeRTOSWithTraces/FreeRTOS_include/mpu_wrappers.h new file mode 100644 index 0000000000000000000000000000000000000000..b7371b9ba9692de00ede3da58c7ec818bff2a4a8 --- /dev/null +++ b/FreeRTOSWithTraces/FreeRTOS_include/mpu_wrappers.h @@ -0,0 +1,141 @@ +/* + FreeRTOS V7.0.1 - Copyright (C) 2011 Real Time Engineers Ltd. + + + FreeRTOS supports many tools and architectures. V7.0.0 is sponsored by: + Atollic AB - Atollic provides professional embedded systems development + tools for C/C++ development, code analysis and test automation. + See http://www.atollic.com + + + *************************************************************************** + * * + * FreeRTOS tutorial books are available in pdf and paperback. * + * Complete, revised, and edited pdf reference manuals are also * + * available. * + * * + * Purchasing FreeRTOS documentation will not only help you, by * + * ensuring you get running as quickly as possible and with an * + * in-depth knowledge of how to use FreeRTOS, it will also help * + * the FreeRTOS project to continue with its mission of providing * + * professional grade, cross platform, de facto standard solutions * + * for microcontrollers - completely free of charge! * + * * + * >>> See http://www.FreeRTOS.org/Documentation for details. <<< * + * * + * Thank you for using FreeRTOS, and thank you for your support! * + * * + *************************************************************************** + + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation AND MODIFIED BY the FreeRTOS exception. + >>>NOTE<<< The modification to the GPL is included to allow you to + distribute a combined work that includes FreeRTOS without being obliged to + provide the source code for proprietary components outside of the FreeRTOS + kernel. FreeRTOS is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + more details. You should have received a copy of the GNU General Public + License and the FreeRTOS license exception along with FreeRTOS; if not it + can be viewed here: http://www.freertos.org/a00114.html and also obtained + by writing to Richard Barry, contact details for whom are available on the + FreeRTOS WEB site. + + 1 tab == 4 spaces! + + http://www.FreeRTOS.org - Documentation, latest information, license and + contact details. + + http://www.SafeRTOS.com - A version that is certified for use in safety + critical systems. + + http://www.OpenRTOS.com - Commercial support, development, porting, + licensing and training services. +*/ + +#ifndef MPU_WRAPPERS_H +#define MPU_WRAPPERS_H + +/* This file redefines API functions to be called through a wrapper macro, but +only for ports that are using the MPU. */ +#ifdef portUSING_MPU_WRAPPERS + + /* MPU_WRAPPERS_INCLUDED_FROM_API_FILE will be defined when this file is + included from queue.c or task.c to prevent it from having an effect within + those files. */ + #ifndef MPU_WRAPPERS_INCLUDED_FROM_API_FILE + + #define xTaskGenericCreate MPU_xTaskGenericCreate + #define vTaskAllocateMPURegions MPU_vTaskAllocateMPURegions + #define vTaskDelete MPU_vTaskDelete + #define vTaskDelayUntil MPU_vTaskDelayUntil + #define vTaskDelay MPU_vTaskDelay + #define uxTaskPriorityGet MPU_uxTaskPriorityGet + #define vTaskPrioritySet MPU_vTaskPrioritySet + #define vTaskSuspend MPU_vTaskSuspend + #define xTaskIsTaskSuspended MPU_xTaskIsTaskSuspended + #define vTaskResume MPU_vTaskResume + #define vTaskSuspendAll MPU_vTaskSuspendAll + #define xTaskResumeAll MPU_xTaskResumeAll + #define xTaskGetTickCount MPU_xTaskGetTickCount + #define uxTaskGetNumberOfTasks MPU_uxTaskGetNumberOfTasks + #define vTaskList MPU_vTaskList + #define vTaskGetRunTimeStats MPU_vTaskGetRunTimeStats + #define vTaskStartTrace MPU_vTaskStartTrace + #define ulTaskEndTrace MPU_ulTaskEndTrace + #define vTaskSetApplicationTaskTag MPU_vTaskSetApplicationTaskTag + #define xTaskGetApplicationTaskTag MPU_xTaskGetApplicationTaskTag + #define xTaskCallApplicationTaskHook MPU_xTaskCallApplicationTaskHook + #define uxTaskGetStackHighWaterMark MPU_uxTaskGetStackHighWaterMark + #define xTaskGetCurrentTaskHandle MPU_xTaskGetCurrentTaskHandle + #define xTaskGetSchedulerState MPU_xTaskGetSchedulerState + + #define xQueueCreate MPU_xQueueCreate + #define xQueueCreateMutex MPU_xQueueCreateMutex + #define xQueueGiveMutexRecursive MPU_xQueueGiveMutexRecursive + #define xQueueTakeMutexRecursive MPU_xQueueTakeMutexRecursive + #define xQueueCreateCountingSemaphore MPU_xQueueCreateCountingSemaphore + #define xQueueGenericSend MPU_xQueueGenericSend + #define xQueueAltGenericSend MPU_xQueueAltGenericSend + #define xQueueAltGenericReceive MPU_xQueueAltGenericReceive + #define xQueueGenericReceive MPU_xQueueGenericReceive + #define uxQueueMessagesWaiting MPU_uxQueueMessagesWaiting + #define vQueueDelete MPU_vQueueDelete + + #define pvPortMalloc MPU_pvPortMalloc + #define vPortFree MPU_vPortFree + #define xPortGetFreeHeapSize MPU_xPortGetFreeHeapSize + #define vPortInitialiseBlocks MPU_vPortInitialiseBlocks + + #if configQUEUE_REGISTRY_SIZE > 0 + #define vQueueAddToRegistry MPU_vQueueAddToRegistry + #define vQueueUnregisterQueue MPU_vQueueUnregisterQueue + #endif + + /* Remove the privileged function macro. */ + #define PRIVILEGED_FUNCTION + + #else /* MPU_WRAPPERS_INCLUDED_FROM_API_FILE */ + + /* Ensure API functions go in the privileged execution section. */ + #define PRIVILEGED_FUNCTION __attribute__((section("privileged_functions"))) + #define PRIVILEGED_DATA __attribute__((section("privileged_data"))) + //#define PRIVILEGED_DATA + + #endif /* MPU_WRAPPERS_INCLUDED_FROM_API_FILE */ + +#else /* portUSING_MPU_WRAPPERS */ + + #define PRIVILEGED_FUNCTION + #define PRIVILEGED_DATA + #define portUSING_MPU_WRAPPERS 0 + +#endif /* portUSING_MPU_WRAPPERS */ + + +#endif /* MPU_WRAPPERS_H */ + diff --git a/FreeRTOSWithTraces/FreeRTOS_include/portable.h b/FreeRTOSWithTraces/FreeRTOS_include/portable.h new file mode 100644 index 0000000000000000000000000000000000000000..5bb784d544422e63234ade775055668596de5e94 --- /dev/null +++ b/FreeRTOSWithTraces/FreeRTOS_include/portable.h @@ -0,0 +1,396 @@ +/* + FreeRTOS V7.0.1 - Copyright (C) 2011 Real Time Engineers Ltd. + + + FreeRTOS supports many tools and architectures. V7.0.0 is sponsored by: + Atollic AB - Atollic provides professional embedded systems development + tools for C/C++ development, code analysis and test automation. + See http://www.atollic.com + + + *************************************************************************** + * * + * FreeRTOS tutorial books are available in pdf and paperback. * + * Complete, revised, and edited pdf reference manuals are also * + * available. * + * * + * Purchasing FreeRTOS documentation will not only help you, by * + * ensuring you get running as quickly as possible and with an * + * in-depth knowledge of how to use FreeRTOS, it will also help * + * the FreeRTOS project to continue with its mission of providing * + * professional grade, cross platform, de facto standard solutions * + * for microcontrollers - completely free of charge! * + * * + * >>> See http://www.FreeRTOS.org/Documentation for details. <<< * + * * + * Thank you for using FreeRTOS, and thank you for your support! * + * * + *************************************************************************** + + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation AND MODIFIED BY the FreeRTOS exception. + >>>NOTE<<< The modification to the GPL is included to allow you to + distribute a combined work that includes FreeRTOS without being obliged to + provide the source code for proprietary components outside of the FreeRTOS + kernel. FreeRTOS is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + more details. You should have received a copy of the GNU General Public + License and the FreeRTOS license exception along with FreeRTOS; if not it + can be viewed here: http://www.freertos.org/a00114.html and also obtained + by writing to Richard Barry, contact details for whom are available on the + FreeRTOS WEB site. + + 1 tab == 4 spaces! + + http://www.FreeRTOS.org - Documentation, latest information, license and + contact details. + + http://www.SafeRTOS.com - A version that is certified for use in safety + critical systems. + + http://www.OpenRTOS.com - Commercial support, development, porting, + licensing and training services. +*/ + +/*----------------------------------------------------------- + * Portable layer API. Each function must be defined for each port. + *----------------------------------------------------------*/ + +#ifndef PORTABLE_H +#define PORTABLE_H + +/* Include the macro file relevant to the port being used. */ + +#ifdef OPEN_WATCOM_INDUSTRIAL_PC_PORT + #include "..\..\Source\portable\owatcom\16bitdos\pc\portmacro.h" + typedef void ( __interrupt __far *pxISR )(); +#endif + +#ifdef OPEN_WATCOM_FLASH_LITE_186_PORT + #include "..\..\Source\portable\owatcom\16bitdos\flsh186\portmacro.h" + typedef void ( __interrupt __far *pxISR )(); +#endif + +#ifdef GCC_MEGA_AVR +#include "portmacro.h" +#endif + +#ifdef IAR_MEGA_AVR +#include "portmacro.h" +#endif + +#ifdef MPLAB_PIC24_PORT + #include "..\..\Source\portable\MPLAB\PIC24_dsPIC\portmacro.h" +#endif + +#ifdef MPLAB_DSPIC_PORT + #include "..\..\Source\portable\MPLAB\PIC24_dsPIC\portmacro.h" +#endif + +#ifdef MPLAB_PIC18F_PORT + #include "..\..\Source\portable\MPLAB\PIC18F\portmacro.h" +#endif + +#ifdef MPLAB_PIC32MX_PORT + #include "..\..\Source\portable\MPLAB\PIC32MX\portmacro.h" +#endif + +#ifdef _FEDPICC +#include "portmacro.h" +#endif + +#ifdef SDCC_CYGNAL +#include "portmacro.h" +#endif + +#ifdef GCC_ARM7 +#include "portmacro.h" +#endif + +#ifdef GCC_ARM7_ECLIPSE + #include "portmacro.h" +#endif + +#ifdef ROWLEY_LPC23xx +#include "portmacro.h" +#endif + +#ifdef IAR_MSP430 + #include "..\..\Source\portable\IAR\MSP430\portmacro.h" +#endif + +#ifdef GCC_MSP430 +#include "portmacro.h" +#endif + +#ifdef ROWLEY_MSP430 +#include "portmacro.h" +#endif + +#ifdef ARM7_LPC21xx_KEIL_RVDS + #include "..\..\Source\portable\RVDS\ARM7_LPC21xx\portmacro.h" +#endif + +#ifdef SAM7_GCC +#include "portmacro.h" +#endif + +#ifdef SAM7_IAR + #include "..\..\Source\portable\IAR\AtmelSAM7S64\portmacro.h" +#endif + +#ifdef SAM9XE_IAR + #include "..\..\Source\portable\IAR\AtmelSAM9XE\portmacro.h" +#endif + +#ifdef LPC2000_IAR + #include "..\..\Source\portable\IAR\LPC2000\portmacro.h" +#endif + +#ifdef STR71X_IAR + #include "..\..\Source\portable\IAR\STR71x\portmacro.h" +#endif + +#ifdef STR75X_IAR + #include "..\..\Source\portable\IAR\STR75x\portmacro.h" +#endif + +#ifdef STR75X_GCC + #include "..\..\Source\portable\GCC\STR75x\portmacro.h" +#endif + +#ifdef STR91X_IAR + #include "..\..\Source\portable\IAR\STR91x\portmacro.h" +#endif + +#ifdef GCC_H8S +#include "portmacro.h" +#endif + +#ifdef GCC_AT91FR40008 +#include "portmacro.h" +#endif + +#ifdef RVDS_ARMCM3_LM3S102 +#include "portmacro.h" +#endif + +#ifdef GCC_ARMCM3_LM3S102 +#include "portmacro.h" +#endif + +#ifdef GCC_ARMCM3 +#include "portmacro.h" +#endif + +#ifdef IAR_ARM_CM3 +#include "portmacro.h" +#endif + +#ifdef IAR_ARMCM3_LM +#include "portmacro.h" +#endif + +#ifdef HCS12_CODE_WARRIOR +#include "portmacro.h" +#endif + +#ifdef MICROBLAZE_GCC +#include "portmacro.h" +#endif + +#ifdef TERN_EE + #include "..\..\Source\portable\Paradigm\Tern_EE\small\portmacro.h" +#endif + +#ifdef GCC_HCS12 +#include "portmacro.h" +#endif + +#ifdef GCC_MCF5235 +#include "portmacro.h" +#endif + +#ifdef COLDFIRE_V2_GCC +#include "portmacro.h" +#endif + +#ifdef COLDFIRE_V2_CODEWARRIOR +#include "portmacro.h" +#endif + +#ifdef GCC_PPC405 +#include "portmacro.h" +#endif + +#ifdef GCC_PPC440 +#include "portmacro.h" +#endif + +#ifdef _16FX_SOFTUNE + #include "..\..\Source\portable\Softune\MB96340\portmacro.h" +#endif + +#ifdef BCC_INDUSTRIAL_PC_PORT + /* A short file name has to be used in place of the normal + FreeRTOSConfig.h when using the Borland compiler. */ + #include "frconfig.h" + #include "..\portable\BCC\16BitDOS\PC\prtmacro.h" + typedef void ( __interrupt __far *pxISR )(); +#endif + +#ifdef BCC_FLASH_LITE_186_PORT + /* A short file name has to be used in place of the normal + FreeRTOSConfig.h when using the Borland compiler. */ + #include "frconfig.h" + #include "..\portable\BCC\16BitDOS\flsh186\prtmacro.h" + typedef void ( __interrupt __far *pxISR )(); +#endif + +#ifdef __GNUC__ + #ifdef __AVR32_AVR32A__ + #include "portmacro.h" + #endif +#endif + +#ifdef __ICCAVR32__ + #ifdef __CORE__ + #if __CORE__ == __AVR32A__ + #include "portmacro.h" + #endif + #endif +#endif + +#ifdef __91467D + #include "portmacro.h" +#endif + +#ifdef __96340 + #include "portmacro.h" +#endif + + +#ifdef __IAR_V850ES_Fx3__ +#include "portmacro.h" +#endif + +#ifdef __IAR_V850ES_Jx3__ +#include "portmacro.h" +#endif + +#ifdef __IAR_V850ES_Jx3_L__ +#include "portmacro.h" +#endif + +#ifdef __IAR_V850ES_Jx2__ +#include "portmacro.h" +#endif + +#ifdef __IAR_V850ES_Hx2__ +#include "portmacro.h" +#endif + +#ifdef __IAR_78K0R_Kx3__ +#include "portmacro.h" +#endif + +#ifdef __IAR_78K0R_Kx3L__ +#include "portmacro.h" +#endif + +/* Catch all to ensure portmacro.h is included in the build. Newer demos +have the path as part of the project options, rather than as relative from +the project location. If portENTER_CRITICAL() has not been defined then +portmacro.h has not yet been included - as every portmacro.h provides a +portENTER_CRITICAL() definition. Check the demo application for your demo +to find the path to the correct portmacro.h file. */ +#ifndef portENTER_CRITICAL + #include "portmacro.h" +#endif + +#if portBYTE_ALIGNMENT == 8 + #define portBYTE_ALIGNMENT_MASK ( 0x0007 ) +#endif + +#if portBYTE_ALIGNMENT == 4 + #define portBYTE_ALIGNMENT_MASK ( 0x0003 ) +#endif + +#if portBYTE_ALIGNMENT == 2 + #define portBYTE_ALIGNMENT_MASK ( 0x0001 ) +#endif + +#if portBYTE_ALIGNMENT == 1 + #define portBYTE_ALIGNMENT_MASK ( 0x0000 ) +#endif + +#ifndef portBYTE_ALIGNMENT_MASK + #error "Invalid portBYTE_ALIGNMENT definition" +#endif + +#ifndef portNUM_CONFIGURABLE_REGIONS + #define portNUM_CONFIGURABLE_REGIONS 1 +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +#include "mpu_wrappers.h" + +/* + * Setup the stack of a new task so it is ready to be placed under the + * scheduler control. The registers have to be placed on the stack in + * the order that the port expects to find them. + * + */ +#if( portUSING_MPU_WRAPPERS == 1 ) + portSTACK_TYPE *pxPortInitialiseStack( portSTACK_TYPE *pxTopOfStack, pdTASK_CODE pxCode, void *pvParameters, portBASE_TYPE xRunPrivileged ) PRIVILEGED_FUNCTION; +#else + portSTACK_TYPE *pxPortInitialiseStack( portSTACK_TYPE *pxTopOfStack, pdTASK_CODE pxCode, void *pvParameters ); +#endif + +/* + * Map to the memory management routines required for the port. + */ +void *pvPortMalloc( size_t xSize ) PRIVILEGED_FUNCTION; +void vPortFree( void *pv ) PRIVILEGED_FUNCTION; +void vPortInitialiseBlocks( void ) PRIVILEGED_FUNCTION; +size_t xPortGetFreeHeapSize( void ) PRIVILEGED_FUNCTION; + +/* + * Setup the hardware ready for the scheduler to take control. This generally + * sets up a tick interrupt and sets timers for the correct tick frequency. + */ +portBASE_TYPE xPortStartScheduler( void ) PRIVILEGED_FUNCTION; + +/* + * Undo any hardware/ISR setup that was performed by xPortStartScheduler() so + * the hardware is left in its original condition after the scheduler stops + * executing. + */ +void vPortEndScheduler( void ) PRIVILEGED_FUNCTION; + +/* + * The structures and methods of manipulating the MPU are contained within the + * port layer. + * + * Fills the xMPUSettings structure with the memory region information + * contained in xRegions. + */ +#if( portUSING_MPU_WRAPPERS == 1 ) + struct xMEMORY_REGION; + void vPortStoreTaskMPUSettings( xMPU_SETTINGS *xMPUSettings, const struct xMEMORY_REGION * const xRegions, portSTACK_TYPE *pxBottomOfStack, unsigned short usStackDepth ) PRIVILEGED_FUNCTION; +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* PORTABLE_H */ + diff --git a/FreeRTOSWithTraces/FreeRTOS_include/projdefs.h b/FreeRTOSWithTraces/FreeRTOS_include/projdefs.h new file mode 100644 index 0000000000000000000000000000000000000000..bf118a8ac1bcc2a939ee08ac9bf1f3bf359d7c4c --- /dev/null +++ b/FreeRTOSWithTraces/FreeRTOS_include/projdefs.h @@ -0,0 +1,83 @@ +/* + FreeRTOS V7.0.1 - Copyright (C) 2011 Real Time Engineers Ltd. + + + FreeRTOS supports many tools and architectures. V7.0.0 is sponsored by: + Atollic AB - Atollic provides professional embedded systems development + tools for C/C++ development, code analysis and test automation. + See http://www.atollic.com + + + *************************************************************************** + * * + * FreeRTOS tutorial books are available in pdf and paperback. * + * Complete, revised, and edited pdf reference manuals are also * + * available. * + * * + * Purchasing FreeRTOS documentation will not only help you, by * + * ensuring you get running as quickly as possible and with an * + * in-depth knowledge of how to use FreeRTOS, it will also help * + * the FreeRTOS project to continue with its mission of providing * + * professional grade, cross platform, de facto standard solutions * + * for microcontrollers - completely free of charge! * + * * + * >>> See http://www.FreeRTOS.org/Documentation for details. <<< * + * * + * Thank you for using FreeRTOS, and thank you for your support! * + * * + *************************************************************************** + + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation AND MODIFIED BY the FreeRTOS exception. + >>>NOTE<<< The modification to the GPL is included to allow you to + distribute a combined work that includes FreeRTOS without being obliged to + provide the source code for proprietary components outside of the FreeRTOS + kernel. FreeRTOS is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + more details. You should have received a copy of the GNU General Public + License and the FreeRTOS license exception along with FreeRTOS; if not it + can be viewed here: http://www.freertos.org/a00114.html and also obtained + by writing to Richard Barry, contact details for whom are available on the + FreeRTOS WEB site. + + 1 tab == 4 spaces! + + http://www.FreeRTOS.org - Documentation, latest information, license and + contact details. + + http://www.SafeRTOS.com - A version that is certified for use in safety + critical systems. + + http://www.OpenRTOS.com - Commercial support, development, porting, + licensing and training services. +*/ + +#ifndef PROJDEFS_H +#define PROJDEFS_H + +/* Defines the prototype to which task functions must conform. */ +typedef void (*pdTASK_CODE)( void * ); + +#define pdTRUE ( 1 ) +#define pdFALSE ( 0 ) + +#define pdPASS ( 1 ) +#define pdFAIL ( 0 ) +#define errQUEUE_EMPTY ( 0 ) +#define errQUEUE_FULL ( 0 ) + +/* Error definitions. */ +#define errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY ( -1 ) +#define errNO_TASK_TO_RUN ( -2 ) +#define errQUEUE_BLOCKED ( -4 ) +#define errQUEUE_YIELD ( -5 ) + +#endif /* PROJDEFS_H */ + + + diff --git a/FreeRTOSWithTraces/FreeRTOS_include/queue.h b/FreeRTOSWithTraces/FreeRTOS_include/queue.h new file mode 100644 index 0000000000000000000000000000000000000000..47add266f8ca0e7f3e0f583239f0ca24ed083a3c --- /dev/null +++ b/FreeRTOSWithTraces/FreeRTOS_include/queue.h @@ -0,0 +1,1270 @@ +/* + FreeRTOS V7.0.1 - Copyright (C) 2011 Real Time Engineers Ltd. + + + FreeRTOS supports many tools and architectures. V7.0.0 is sponsored by: + Atollic AB - Atollic provides professional embedded systems development + tools for C/C++ development, code analysis and test automation. + See http://www.atollic.com + + + *************************************************************************** + * * + * FreeRTOS tutorial books are available in pdf and paperback. * + * Complete, revised, and edited pdf reference manuals are also * + * available. * + * * + * Purchasing FreeRTOS documentation will not only help you, by * + * ensuring you get running as quickly as possible and with an * + * in-depth knowledge of how to use FreeRTOS, it will also help * + * the FreeRTOS project to continue with its mission of providing * + * professional grade, cross platform, de facto standard solutions * + * for microcontrollers - completely free of charge! * + * * + * >>> See http://www.FreeRTOS.org/Documentation for details. <<< * + * * + * Thank you for using FreeRTOS, and thank you for your support! * + * * + *************************************************************************** + + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation AND MODIFIED BY the FreeRTOS exception. + >>>NOTE<<< The modification to the GPL is included to allow you to + distribute a combined work that includes FreeRTOS without being obliged to + provide the source code for proprietary components outside of the FreeRTOS + kernel. FreeRTOS is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + more details. You should have received a copy of the GNU General Public + License and the FreeRTOS license exception along with FreeRTOS; if not it + can be viewed here: http://www.freertos.org/a00114.html and also obtained + by writing to Richard Barry, contact details for whom are available on the + FreeRTOS WEB site. + + 1 tab == 4 spaces! + + http://www.FreeRTOS.org - Documentation, latest information, license and + contact details. + + http://www.SafeRTOS.com - A version that is certified for use in safety + critical systems. + + http://www.OpenRTOS.com - Commercial support, development, porting, + licensing and training services. +*/ + + +#ifndef QUEUE_H +#define QUEUE_H + +#ifndef INC_FREERTOS_H + #error "#include FreeRTOS.h" must appear in source files before "#include queue.h" +#endif + +#ifdef __cplusplus +extern "C" { +#endif + + +#include "mpu_wrappers.h" + +/** + * Type by which queues are referenced. For example, a call to xQueueCreate + * returns (via a pointer parameter) an xQueueHandle variable that can then + * be used as a parameter to xQueueSend(), xQueueReceive(), etc. + */ +typedef void * xQueueHandle; + + +/* For internal use only. */ +#define queueSEND_TO_BACK ( 0 ) +#define queueSEND_TO_FRONT ( 1 ) + + +/** + * queue. h + * <pre> + xQueueHandle xQueueCreate( + unsigned portBASE_TYPE uxQueueLength, + unsigned portBASE_TYPE uxItemSize + ); + * </pre> + * + * Creates a new queue instance. This allocates the storage required by the + * new queue and returns a handle for the queue. + * + * @param uxQueueLength The maximum number of items that the queue can contain. + * + * @param uxItemSize The number of bytes each item in the queue will require. + * Items are queued by copy, not by reference, so this is the number of bytes + * that will be copied for each posted item. Each item on the queue must be + * the same size. + * + * @return If the queue is successfully create then a handle to the newly + * created queue is returned. If the queue cannot be created then 0 is + * returned. + * + * Example usage: + <pre> + struct AMessage + { + char ucMessageID; + char ucData[ 20 ]; + }; + + void vATask( void *pvParameters ) + { + xQueueHandle xQueue1, xQueue2; + + // Create a queue capable of containing 10 unsigned long values. + xQueue1 = xQueueCreate( 10, sizeof( unsigned long ) ); + if( xQueue1 == 0 ) + { + // Queue was not created and must not be used. + } + + // Create a queue capable of containing 10 pointers to AMessage structures. + // These should be passed by pointer as they contain a lot of data. + xQueue2 = xQueueCreate( 10, sizeof( struct AMessage * ) ); + if( xQueue2 == 0 ) + { + // Queue was not created and must not be used. + } + + // ... Rest of task code. + } + </pre> + * \defgroup xQueueCreate xQueueCreate + * \ingroup QueueManagement + */ +xQueueHandle xQueueCreate( unsigned portBASE_TYPE uxQueueLength, unsigned portBASE_TYPE uxItemSize ); + +/** + * queue. h + * <pre> + portBASE_TYPE xQueueSendToToFront( + xQueueHandle xQueue, + const void * pvItemToQueue, + portTickType xTicksToWait + ); + * </pre> + * + * This is a macro that calls xQueueGenericSend(). + * + * Post an item to the front of a queue. The item is queued by copy, not by + * reference. This function must not be called from an interrupt service + * routine. See xQueueSendFromISR () for an alternative which may be used + * in an ISR. + * + * @param xQueue The handle to the queue on which the item is to be posted. + * + * @param pvItemToQueue A pointer to the item that is to be placed on the + * queue. The size of the items the queue will hold was defined when the + * queue was created, so this many bytes will be copied from pvItemToQueue + * into the queue storage area. + * + * @param xTicksToWait The maximum amount of time the task should block + * waiting for space to become available on the queue, should it already + * be full. The call will return immediately if this is set to 0 and the + * queue is full. The time is defined in tick periods so the constant + * portTICK_RATE_MS should be used to convert to real time if this is required. + * + * @return pdTRUE if the item was successfully posted, otherwise errQUEUE_FULL. + * + * Example usage: + <pre> + struct AMessage + { + char ucMessageID; + char ucData[ 20 ]; + } xMessage; + + unsigned long ulVar = 10UL; + + void vATask( void *pvParameters ) + { + xQueueHandle xQueue1, xQueue2; + struct AMessage *pxMessage; + + // Create a queue capable of containing 10 unsigned long values. + xQueue1 = xQueueCreate( 10, sizeof( unsigned long ) ); + + // Create a queue capable of containing 10 pointers to AMessage structures. + // These should be passed by pointer as they contain a lot of data. + xQueue2 = xQueueCreate( 10, sizeof( struct AMessage * ) ); + + // ... + + if( xQueue1 != 0 ) + { + // Send an unsigned long. Wait for 10 ticks for space to become + // available if necessary. + if( xQueueSendToFront( xQueue1, ( void * ) &ulVar, ( portTickType ) 10 ) != pdPASS ) + { + // Failed to post the message, even after 10 ticks. + } + } + + if( xQueue2 != 0 ) + { + // Send a pointer to a struct AMessage object. Don't block if the + // queue is already full. + pxMessage = & xMessage; + xQueueSendToFront( xQueue2, ( void * ) &pxMessage, ( portTickType ) 0 ); + } + + // ... Rest of task code. + } + </pre> + * \defgroup xQueueSend xQueueSend + * \ingroup QueueManagement + */ +#define xQueueSendToFront( xQueue, pvItemToQueue, xTicksToWait ) xQueueGenericSend( ( xQueue ), ( pvItemToQueue ), ( xTicksToWait ), queueSEND_TO_FRONT ) + +/** + * queue. h + * <pre> + portBASE_TYPE xQueueSendToBack( + xQueueHandle xQueue, + const void * pvItemToQueue, + portTickType xTicksToWait + ); + * </pre> + * + * This is a macro that calls xQueueGenericSend(). + * + * Post an item to the back of a queue. The item is queued by copy, not by + * reference. This function must not be called from an interrupt service + * routine. See xQueueSendFromISR () for an alternative which may be used + * in an ISR. + * + * @param xQueue The handle to the queue on which the item is to be posted. + * + * @param pvItemToQueue A pointer to the item that is to be placed on the + * queue. The size of the items the queue will hold was defined when the + * queue was created, so this many bytes will be copied from pvItemToQueue + * into the queue storage area. + * + * @param xTicksToWait The maximum amount of time the task should block + * waiting for space to become available on the queue, should it already + * be full. The call will return immediately if this is set to 0 and the queue + * is full. The time is defined in tick periods so the constant + * portTICK_RATE_MS should be used to convert to real time if this is required. + * + * @return pdTRUE if the item was successfully posted, otherwise errQUEUE_FULL. + * + * Example usage: + <pre> + struct AMessage + { + char ucMessageID; + char ucData[ 20 ]; + } xMessage; + + unsigned long ulVar = 10UL; + + void vATask( void *pvParameters ) + { + xQueueHandle xQueue1, xQueue2; + struct AMessage *pxMessage; + + // Create a queue capable of containing 10 unsigned long values. + xQueue1 = xQueueCreate( 10, sizeof( unsigned long ) ); + + // Create a queue capable of containing 10 pointers to AMessage structures. + // These should be passed by pointer as they contain a lot of data. + xQueue2 = xQueueCreate( 10, sizeof( struct AMessage * ) ); + + // ... + + if( xQueue1 != 0 ) + { + // Send an unsigned long. Wait for 10 ticks for space to become + // available if necessary. + if( xQueueSendToBack( xQueue1, ( void * ) &ulVar, ( portTickType ) 10 ) != pdPASS ) + { + // Failed to post the message, even after 10 ticks. + } + } + + if( xQueue2 != 0 ) + { + // Send a pointer to a struct AMessage object. Don't block if the + // queue is already full. + pxMessage = & xMessage; + xQueueSendToBack( xQueue2, ( void * ) &pxMessage, ( portTickType ) 0 ); + } + + // ... Rest of task code. + } + </pre> + * \defgroup xQueueSend xQueueSend + * \ingroup QueueManagement + */ +#define xQueueSendToBack( xQueue, pvItemToQueue, xTicksToWait ) xQueueGenericSend( ( xQueue ), ( pvItemToQueue ), ( xTicksToWait ), queueSEND_TO_BACK ) + +/** + * queue. h + * <pre> + portBASE_TYPE xQueueSend( + xQueueHandle xQueue, + const void * pvItemToQueue, + portTickType xTicksToWait + ); + * </pre> + * + * This is a macro that calls xQueueGenericSend(). It is included for + * backward compatibility with versions of FreeRTOS.org that did not + * include the xQueueSendToFront() and xQueueSendToBack() macros. It is + * equivalent to xQueueSendToBack(). + * + * Post an item on a queue. The item is queued by copy, not by reference. + * This function must not be called from an interrupt service routine. + * See xQueueSendFromISR () for an alternative which may be used in an ISR. + * + * @param xQueue The handle to the queue on which the item is to be posted. + * + * @param pvItemToQueue A pointer to the item that is to be placed on the + * queue. The size of the items the queue will hold was defined when the + * queue was created, so this many bytes will be copied from pvItemToQueue + * into the queue storage area. + * + * @param xTicksToWait The maximum amount of time the task should block + * waiting for space to become available on the queue, should it already + * be full. The call will return immediately if this is set to 0 and the + * queue is full. The time is defined in tick periods so the constant + * portTICK_RATE_MS should be used to convert to real time if this is required. + * + * @return pdTRUE if the item was successfully posted, otherwise errQUEUE_FULL. + * + * Example usage: + <pre> + struct AMessage + { + char ucMessageID; + char ucData[ 20 ]; + } xMessage; + + unsigned long ulVar = 10UL; + + void vATask( void *pvParameters ) + { + xQueueHandle xQueue1, xQueue2; + struct AMessage *pxMessage; + + // Create a queue capable of containing 10 unsigned long values. + xQueue1 = xQueueCreate( 10, sizeof( unsigned long ) ); + + // Create a queue capable of containing 10 pointers to AMessage structures. + // These should be passed by pointer as they contain a lot of data. + xQueue2 = xQueueCreate( 10, sizeof( struct AMessage * ) ); + + // ... + + if( xQueue1 != 0 ) + { + // Send an unsigned long. Wait for 10 ticks for space to become + // available if necessary. + if( xQueueSend( xQueue1, ( void * ) &ulVar, ( portTickType ) 10 ) != pdPASS ) + { + // Failed to post the message, even after 10 ticks. + } + } + + if( xQueue2 != 0 ) + { + // Send a pointer to a struct AMessage object. Don't block if the + // queue is already full. + pxMessage = & xMessage; + xQueueSend( xQueue2, ( void * ) &pxMessage, ( portTickType ) 0 ); + } + + // ... Rest of task code. + } + </pre> + * \defgroup xQueueSend xQueueSend + * \ingroup QueueManagement + */ +#define xQueueSend( xQueue, pvItemToQueue, xTicksToWait ) xQueueGenericSend( ( xQueue ), ( pvItemToQueue ), ( xTicksToWait ), queueSEND_TO_BACK ) + + +/** + * queue. h + * <pre> + portBASE_TYPE xQueueGenericSend( + xQueueHandle xQueue, + const void * pvItemToQueue, + portTickType xTicksToWait + portBASE_TYPE xCopyPosition + ); + * </pre> + * + * It is preferred that the macros xQueueSend(), xQueueSendToFront() and + * xQueueSendToBack() are used in place of calling this function directly. + * + * Post an item on a queue. The item is queued by copy, not by reference. + * This function must not be called from an interrupt service routine. + * See xQueueSendFromISR () for an alternative which may be used in an ISR. + * + * @param xQueue The handle to the queue on which the item is to be posted. + * + * @param pvItemToQueue A pointer to the item that is to be placed on the + * queue. The size of the items the queue will hold was defined when the + * queue was created, so this many bytes will be copied from pvItemToQueue + * into the queue storage area. + * + * @param xTicksToWait The maximum amount of time the task should block + * waiting for space to become available on the queue, should it already + * be full. The call will return immediately if this is set to 0 and the + * queue is full. The time is defined in tick periods so the constant + * portTICK_RATE_MS should be used to convert to real time if this is required. + * + * @param xCopyPosition Can take the value queueSEND_TO_BACK to place the + * item at the back of the queue, or queueSEND_TO_FRONT to place the item + * at the front of the queue (for high priority messages). + * + * @return pdTRUE if the item was successfully posted, otherwise errQUEUE_FULL. + * + * Example usage: + <pre> + struct AMessage + { + char ucMessageID; + char ucData[ 20 ]; + } xMessage; + + unsigned long ulVar = 10UL; + + void vATask( void *pvParameters ) + { + xQueueHandle xQueue1, xQueue2; + struct AMessage *pxMessage; + + // Create a queue capable of containing 10 unsigned long values. + xQueue1 = xQueueCreate( 10, sizeof( unsigned long ) ); + + // Create a queue capable of containing 10 pointers to AMessage structures. + // These should be passed by pointer as they contain a lot of data. + xQueue2 = xQueueCreate( 10, sizeof( struct AMessage * ) ); + + // ... + + if( xQueue1 != 0 ) + { + // Send an unsigned long. Wait for 10 ticks for space to become + // available if necessary. + if( xQueueGenericSend( xQueue1, ( void * ) &ulVar, ( portTickType ) 10, queueSEND_TO_BACK ) != pdPASS ) + { + // Failed to post the message, even after 10 ticks. + } + } + + if( xQueue2 != 0 ) + { + // Send a pointer to a struct AMessage object. Don't block if the + // queue is already full. + pxMessage = & xMessage; + xQueueGenericSend( xQueue2, ( void * ) &pxMessage, ( portTickType ) 0, queueSEND_TO_BACK ); + } + + // ... Rest of task code. + } + </pre> + * \defgroup xQueueSend xQueueSend + * \ingroup QueueManagement + */ +signed portBASE_TYPE xQueueGenericSend( xQueueHandle pxQueue, const void * const pvItemToQueue, portTickType xTicksToWait, portBASE_TYPE xCopyPosition ); + +/** + * queue. h + * <pre> + portBASE_TYPE xQueuePeek( + xQueueHandle xQueue, + void *pvBuffer, + portTickType xTicksToWait + );</pre> + * + * This is a macro that calls the xQueueGenericReceive() function. + * + * Receive an item from a queue without removing the item from the queue. + * The item is received by copy so a buffer of adequate size must be + * provided. The number of bytes copied into the buffer was defined when + * the queue was created. + * + * Successfully received items remain on the queue so will be returned again + * by the next call, or a call to xQueueReceive(). + * + * This macro must not be used in an interrupt service routine. + * + * @param pxQueue The handle to the queue from which the item is to be + * received. + * + * @param pvBuffer Pointer to the buffer into which the received item will + * be copied. + * + * @param xTicksToWait The maximum amount of time the task should block + * waiting for an item to receive should the queue be empty at the time + * of the call. The time is defined in tick periods so the constant + * portTICK_RATE_MS should be used to convert to real time if this is required. + * xQueuePeek() will return immediately if xTicksToWait is 0 and the queue + * is empty. + * + * @return pdTRUE if an item was successfully received from the queue, + * otherwise pdFALSE. + * + * Example usage: + <pre> + struct AMessage + { + char ucMessageID; + char ucData[ 20 ]; + } xMessage; + + xQueueHandle xQueue; + + // Task to create a queue and post a value. + void vATask( void *pvParameters ) + { + struct AMessage *pxMessage; + + // Create a queue capable of containing 10 pointers to AMessage structures. + // These should be passed by pointer as they contain a lot of data. + xQueue = xQueueCreate( 10, sizeof( struct AMessage * ) ); + if( xQueue == 0 ) + { + // Failed to create the queue. + } + + // ... + + // Send a pointer to a struct AMessage object. Don't block if the + // queue is already full. + pxMessage = & xMessage; + xQueueSend( xQueue, ( void * ) &pxMessage, ( portTickType ) 0 ); + + // ... Rest of task code. + } + + // Task to peek the data from the queue. + void vADifferentTask( void *pvParameters ) + { + struct AMessage *pxRxedMessage; + + if( xQueue != 0 ) + { + // Peek a message on the created queue. Block for 10 ticks if a + // message is not immediately available. + if( xQueuePeek( xQueue, &( pxRxedMessage ), ( portTickType ) 10 ) ) + { + // pcRxedMessage now points to the struct AMessage variable posted + // by vATask, but the item still remains on the queue. + } + } + + // ... Rest of task code. + } + </pre> + * \defgroup xQueueReceive xQueueReceive + * \ingroup QueueManagement + */ +#define xQueuePeek( xQueue, pvBuffer, xTicksToWait ) xQueueGenericReceive( ( xQueue ), ( pvBuffer ), ( xTicksToWait ), pdTRUE ) + +/** + * queue. h + * <pre> + portBASE_TYPE xQueueReceive( + xQueueHandle xQueue, + void *pvBuffer, + portTickType xTicksToWait + );</pre> + * + * This is a macro that calls the xQueueGenericReceive() function. + * + * Receive an item from a queue. The item is received by copy so a buffer of + * adequate size must be provided. The number of bytes copied into the buffer + * was defined when the queue was created. + * + * Successfully received items are removed from the queue. + * + * This function must not be used in an interrupt service routine. See + * xQueueReceiveFromISR for an alternative that can. + * + * @param pxQueue The handle to the queue from which the item is to be + * received. + * + * @param pvBuffer Pointer to the buffer into which the received item will + * be copied. + * + * @param xTicksToWait The maximum amount of time the task should block + * waiting for an item to receive should the queue be empty at the time + * of the call. xQueueReceive() will return immediately if xTicksToWait + * is zero and the queue is empty. The time is defined in tick periods so the + * constant portTICK_RATE_MS should be used to convert to real time if this is + * required. + * + * @return pdTRUE if an item was successfully received from the queue, + * otherwise pdFALSE. + * + * Example usage: + <pre> + struct AMessage + { + char ucMessageID; + char ucData[ 20 ]; + } xMessage; + + xQueueHandle xQueue; + + // Task to create a queue and post a value. + void vATask( void *pvParameters ) + { + struct AMessage *pxMessage; + + // Create a queue capable of containing 10 pointers to AMessage structures. + // These should be passed by pointer as they contain a lot of data. + xQueue = xQueueCreate( 10, sizeof( struct AMessage * ) ); + if( xQueue == 0 ) + { + // Failed to create the queue. + } + + // ... + + // Send a pointer to a struct AMessage object. Don't block if the + // queue is already full. + pxMessage = & xMessage; + xQueueSend( xQueue, ( void * ) &pxMessage, ( portTickType ) 0 ); + + // ... Rest of task code. + } + + // Task to receive from the queue. + void vADifferentTask( void *pvParameters ) + { + struct AMessage *pxRxedMessage; + + if( xQueue != 0 ) + { + // Receive a message on the created queue. Block for 10 ticks if a + // message is not immediately available. + if( xQueueReceive( xQueue, &( pxRxedMessage ), ( portTickType ) 10 ) ) + { + // pcRxedMessage now points to the struct AMessage variable posted + // by vATask. + } + } + + // ... Rest of task code. + } + </pre> + * \defgroup xQueueReceive xQueueReceive + * \ingroup QueueManagement + */ +#define xQueueReceive( xQueue, pvBuffer, xTicksToWait ) xQueueGenericReceive( ( xQueue ), ( pvBuffer ), ( xTicksToWait ), pdFALSE ) + + +/** + * queue. h + * <pre> + portBASE_TYPE xQueueGenericReceive( + xQueueHandle xQueue, + void *pvBuffer, + portTickType xTicksToWait + portBASE_TYPE xJustPeek + );</pre> + * + * It is preferred that the macro xQueueReceive() be used rather than calling + * this function directly. + * + * Receive an item from a queue. The item is received by copy so a buffer of + * adequate size must be provided. The number of bytes copied into the buffer + * was defined when the queue was created. + * + * This function must not be used in an interrupt service routine. See + * xQueueReceiveFromISR for an alternative that can. + * + * @param pxQueue The handle to the queue from which the item is to be + * received. + * + * @param pvBuffer Pointer to the buffer into which the received item will + * be copied. + * + * @param xTicksToWait The maximum amount of time the task should block + * waiting for an item to receive should the queue be empty at the time + * of the call. The time is defined in tick periods so the constant + * portTICK_RATE_MS should be used to convert to real time if this is required. + * xQueueGenericReceive() will return immediately if the queue is empty and + * xTicksToWait is 0. + * + * @param xJustPeek When set to true, the item received from the queue is not + * actually removed from the queue - meaning a subsequent call to + * xQueueReceive() will return the same item. When set to false, the item + * being received from the queue is also removed from the queue. + * + * @return pdTRUE if an item was successfully received from the queue, + * otherwise pdFALSE. + * + * Example usage: + <pre> + struct AMessage + { + char ucMessageID; + char ucData[ 20 ]; + } xMessage; + + xQueueHandle xQueue; + + // Task to create a queue and post a value. + void vATask( void *pvParameters ) + { + struct AMessage *pxMessage; + + // Create a queue capable of containing 10 pointers to AMessage structures. + // These should be passed by pointer as they contain a lot of data. + xQueue = xQueueCreate( 10, sizeof( struct AMessage * ) ); + if( xQueue == 0 ) + { + // Failed to create the queue. + } + + // ... + + // Send a pointer to a struct AMessage object. Don't block if the + // queue is already full. + pxMessage = & xMessage; + xQueueSend( xQueue, ( void * ) &pxMessage, ( portTickType ) 0 ); + + // ... Rest of task code. + } + + // Task to receive from the queue. + void vADifferentTask( void *pvParameters ) + { + struct AMessage *pxRxedMessage; + + if( xQueue != 0 ) + { + // Receive a message on the created queue. Block for 10 ticks if a + // message is not immediately available. + if( xQueueGenericReceive( xQueue, &( pxRxedMessage ), ( portTickType ) 10 ) ) + { + // pcRxedMessage now points to the struct AMessage variable posted + // by vATask. + } + } + + // ... Rest of task code. + } + </pre> + * \defgroup xQueueReceive xQueueReceive + * \ingroup QueueManagement + */ +signed portBASE_TYPE xQueueGenericReceive( xQueueHandle xQueue, void * const pvBuffer, portTickType xTicksToWait, portBASE_TYPE xJustPeek ); + +/** + * queue. h + * <pre>unsigned portBASE_TYPE uxQueueMessagesWaiting( const xQueueHandle xQueue );</pre> + * + * Return the number of messages stored in a queue. + * + * @param xQueue A handle to the queue being queried. + * + * @return The number of messages available in the queue. + * + * \page uxQueueMessagesWaiting uxQueueMessagesWaiting + * \ingroup QueueManagement + */ +unsigned portBASE_TYPE uxQueueMessagesWaiting( const xQueueHandle xQueue ); + +/** + * queue. h + * <pre>void vQueueDelete( xQueueHandle xQueue );</pre> + * + * Delete a queue - freeing all the memory allocated for storing of items + * placed on the queue. + * + * @param xQueue A handle to the queue to be deleted. + * + * \page vQueueDelete vQueueDelete + * \ingroup QueueManagement + */ +void vQueueDelete( xQueueHandle pxQueue ); + +/** + * queue. h + * <pre> + portBASE_TYPE xQueueSendToFrontFromISR( + xQueueHandle pxQueue, + const void *pvItemToQueue, + portBASE_TYPE *pxHigherPriorityTaskWoken + ); + </pre> + * + * This is a macro that calls xQueueGenericSendFromISR(). + * + * Post an item to the front of a queue. It is safe to use this macro from + * within an interrupt service routine. + * + * Items are queued by copy not reference so it is preferable to only + * queue small items, especially when called from an ISR. In most cases + * it would be preferable to store a pointer to the item being queued. + * + * @param xQueue The handle to the queue on which the item is to be posted. + * + * @param pvItemToQueue A pointer to the item that is to be placed on the + * queue. The size of the items the queue will hold was defined when the + * queue was created, so this many bytes will be copied from pvItemToQueue + * into the queue storage area. + * + * @param pxHigherPriorityTaskWoken xQueueSendToFrontFromISR() will set + * *pxHigherPriorityTaskWoken to pdTRUE if sending to the queue caused a task + * to unblock, and the unblocked task has a priority higher than the currently + * running task. If xQueueSendToFromFromISR() sets this value to pdTRUE then + * a context switch should be requested before the interrupt is exited. + * + * @return pdTRUE if the data was successfully sent to the queue, otherwise + * errQUEUE_FULL. + * + * Example usage for buffered IO (where the ISR can obtain more than one value + * per call): + <pre> + void vBufferISR( void ) + { + char cIn; + portBASE_TYPE xHigherPrioritTaskWoken; + + // We have not woken a task at the start of the ISR. + xHigherPriorityTaskWoken = pdFALSE; + + // Loop until the buffer is empty. + do + { + // Obtain a byte from the buffer. + cIn = portINPUT_BYTE( RX_REGISTER_ADDRESS ); + + // Post the byte. + xQueueSendToFrontFromISR( xRxQueue, &cIn, &xHigherPriorityTaskWoken ); + + } while( portINPUT_BYTE( BUFFER_COUNT ) ); + + // Now the buffer is empty we can switch context if necessary. + if( xHigherPriorityTaskWoken ) + { + taskYIELD (); + } + } + </pre> + * + * \defgroup xQueueSendFromISR xQueueSendFromISR + * \ingroup QueueManagement + */ +#define xQueueSendToFrontFromISR( pxQueue, pvItemToQueue, pxHigherPriorityTaskWoken ) xQueueGenericSendFromISR( ( pxQueue ), ( pvItemToQueue ), ( pxHigherPriorityTaskWoken ), queueSEND_TO_FRONT ) + + +/** + * queue. h + * <pre> + portBASE_TYPE xQueueSendToBackFromISR( + xQueueHandle pxQueue, + const void *pvItemToQueue, + portBASE_TYPE *pxHigherPriorityTaskWoken + ); + </pre> + * + * This is a macro that calls xQueueGenericSendFromISR(). + * + * Post an item to the back of a queue. It is safe to use this macro from + * within an interrupt service routine. + * + * Items are queued by copy not reference so it is preferable to only + * queue small items, especially when called from an ISR. In most cases + * it would be preferable to store a pointer to the item being queued. + * + * @param xQueue The handle to the queue on which the item is to be posted. + * + * @param pvItemToQueue A pointer to the item that is to be placed on the + * queue. The size of the items the queue will hold was defined when the + * queue was created, so this many bytes will be copied from pvItemToQueue + * into the queue storage area. + * + * @param pxHigherPriorityTaskWoken xQueueSendToBackFromISR() will set + * *pxHigherPriorityTaskWoken to pdTRUE if sending to the queue caused a task + * to unblock, and the unblocked task has a priority higher than the currently + * running task. If xQueueSendToBackFromISR() sets this value to pdTRUE then + * a context switch should be requested before the interrupt is exited. + * + * @return pdTRUE if the data was successfully sent to the queue, otherwise + * errQUEUE_FULL. + * + * Example usage for buffered IO (where the ISR can obtain more than one value + * per call): + <pre> + void vBufferISR( void ) + { + char cIn; + portBASE_TYPE xHigherPriorityTaskWoken; + + // We have not woken a task at the start of the ISR. + xHigherPriorityTaskWoken = pdFALSE; + + // Loop until the buffer is empty. + do + { + // Obtain a byte from the buffer. + cIn = portINPUT_BYTE( RX_REGISTER_ADDRESS ); + + // Post the byte. + xQueueSendToBackFromISR( xRxQueue, &cIn, &xHigherPriorityTaskWoken ); + + } while( portINPUT_BYTE( BUFFER_COUNT ) ); + + // Now the buffer is empty we can switch context if necessary. + if( xHigherPriorityTaskWoken ) + { + taskYIELD (); + } + } + </pre> + * + * \defgroup xQueueSendFromISR xQueueSendFromISR + * \ingroup QueueManagement + */ +#define xQueueSendToBackFromISR( pxQueue, pvItemToQueue, pxHigherPriorityTaskWoken ) xQueueGenericSendFromISR( ( pxQueue ), ( pvItemToQueue ), ( pxHigherPriorityTaskWoken ), queueSEND_TO_BACK ) + +/** + * queue. h + * <pre> + portBASE_TYPE xQueueSendFromISR( + xQueueHandle pxQueue, + const void *pvItemToQueue, + portBASE_TYPE *pxHigherPriorityTaskWoken + ); + </pre> + * + * This is a macro that calls xQueueGenericSendFromISR(). It is included + * for backward compatibility with versions of FreeRTOS.org that did not + * include the xQueueSendToBackFromISR() and xQueueSendToFrontFromISR() + * macros. + * + * Post an item to the back of a queue. It is safe to use this function from + * within an interrupt service routine. + * + * Items are queued by copy not reference so it is preferable to only + * queue small items, especially when called from an ISR. In most cases + * it would be preferable to store a pointer to the item being queued. + * + * @param xQueue The handle to the queue on which the item is to be posted. + * + * @param pvItemToQueue A pointer to the item that is to be placed on the + * queue. The size of the items the queue will hold was defined when the + * queue was created, so this many bytes will be copied from pvItemToQueue + * into the queue storage area. + * + * @param pxHigherPriorityTaskWoken xQueueSendFromISR() will set + * *pxHigherPriorityTaskWoken to pdTRUE if sending to the queue caused a task + * to unblock, and the unblocked task has a priority higher than the currently + * running task. If xQueueSendFromISR() sets this value to pdTRUE then + * a context switch should be requested before the interrupt is exited. + * + * @return pdTRUE if the data was successfully sent to the queue, otherwise + * errQUEUE_FULL. + * + * Example usage for buffered IO (where the ISR can obtain more than one value + * per call): + <pre> + void vBufferISR( void ) + { + char cIn; + portBASE_TYPE xHigherPriorityTaskWoken; + + // We have not woken a task at the start of the ISR. + xHigherPriorityTaskWoken = pdFALSE; + + // Loop until the buffer is empty. + do + { + // Obtain a byte from the buffer. + cIn = portINPUT_BYTE( RX_REGISTER_ADDRESS ); + + // Post the byte. + xQueueSendFromISR( xRxQueue, &cIn, &xHigherPriorityTaskWoken ); + + } while( portINPUT_BYTE( BUFFER_COUNT ) ); + + // Now the buffer is empty we can switch context if necessary. + if( xHigherPriorityTaskWoken ) + { + // Actual macro used here is port specific. + taskYIELD_FROM_ISR (); + } + } + </pre> + * + * \defgroup xQueueSendFromISR xQueueSendFromISR + * \ingroup QueueManagement + */ +#define xQueueSendFromISR( pxQueue, pvItemToQueue, pxHigherPriorityTaskWoken ) xQueueGenericSendFromISR( ( pxQueue ), ( pvItemToQueue ), ( pxHigherPriorityTaskWoken ), queueSEND_TO_BACK ) + +/** + * queue. h + * <pre> + portBASE_TYPE xQueueGenericSendFromISR( + xQueueHandle pxQueue, + const void *pvItemToQueue, + portBASE_TYPE *pxHigherPriorityTaskWoken, + portBASE_TYPE xCopyPosition + ); + </pre> + * + * It is preferred that the macros xQueueSendFromISR(), + * xQueueSendToFrontFromISR() and xQueueSendToBackFromISR() be used in place + * of calling this function directly. + * + * Post an item on a queue. It is safe to use this function from within an + * interrupt service routine. + * + * Items are queued by copy not reference so it is preferable to only + * queue small items, especially when called from an ISR. In most cases + * it would be preferable to store a pointer to the item being queued. + * + * @param xQueue The handle to the queue on which the item is to be posted. + * + * @param pvItemToQueue A pointer to the item that is to be placed on the + * queue. The size of the items the queue will hold was defined when the + * queue was created, so this many bytes will be copied from pvItemToQueue + * into the queue storage area. + * + * @param pxHigherPriorityTaskWoken xQueueGenericSendFromISR() will set + * *pxHigherPriorityTaskWoken to pdTRUE if sending to the queue caused a task + * to unblock, and the unblocked task has a priority higher than the currently + * running task. If xQueueGenericSendFromISR() sets this value to pdTRUE then + * a context switch should be requested before the interrupt is exited. + * + * @param xCopyPosition Can take the value queueSEND_TO_BACK to place the + * item at the back of the queue, or queueSEND_TO_FRONT to place the item + * at the front of the queue (for high priority messages). + * + * @return pdTRUE if the data was successfully sent to the queue, otherwise + * errQUEUE_FULL. + * + * Example usage for buffered IO (where the ISR can obtain more than one value + * per call): + <pre> + void vBufferISR( void ) + { + char cIn; + portBASE_TYPE xHigherPriorityTaskWokenByPost; + + // We have not woken a task at the start of the ISR. + xHigherPriorityTaskWokenByPost = pdFALSE; + + // Loop until the buffer is empty. + do + { + // Obtain a byte from the buffer. + cIn = portINPUT_BYTE( RX_REGISTER_ADDRESS ); + + // Post each byte. + xQueueGenericSendFromISR( xRxQueue, &cIn, &xHigherPriorityTaskWokenByPost, queueSEND_TO_BACK ); + + } while( portINPUT_BYTE( BUFFER_COUNT ) ); + + // Now the buffer is empty we can switch context if necessary. Note that the + // name of the yield function required is port specific. + if( xHigherPriorityTaskWokenByPost ) + { + taskYIELD_YIELD_FROM_ISR(); + } + } + </pre> + * + * \defgroup xQueueSendFromISR xQueueSendFromISR + * \ingroup QueueManagement + */ +signed portBASE_TYPE xQueueGenericSendFromISR( xQueueHandle pxQueue, const void * const pvItemToQueue, signed portBASE_TYPE *pxHigherPriorityTaskWoken, portBASE_TYPE xCopyPosition ); + +/** + * queue. h + * <pre> + portBASE_TYPE xQueueReceiveFromISR( + xQueueHandle pxQueue, + void *pvBuffer, + portBASE_TYPE *pxTaskWoken + ); + * </pre> + * + * Receive an item from a queue. It is safe to use this function from within an + * interrupt service routine. + * + * @param pxQueue The handle to the queue from which the item is to be + * received. + * + * @param pvBuffer Pointer to the buffer into which the received item will + * be copied. + * + * @param pxTaskWoken A task may be blocked waiting for space to become + * available on the queue. If xQueueReceiveFromISR causes such a task to + * unblock *pxTaskWoken will get set to pdTRUE, otherwise *pxTaskWoken will + * remain unchanged. + * + * @return pdTRUE if an item was successfully received from the queue, + * otherwise pdFALSE. + * + * Example usage: + <pre> + + xQueueHandle xQueue; + + // Function to create a queue and post some values. + void vAFunction( void *pvParameters ) + { + char cValueToPost; + const portTickType xBlockTime = ( portTickType )0xff; + + // Create a queue capable of containing 10 characters. + xQueue = xQueueCreate( 10, sizeof( char ) ); + if( xQueue == 0 ) + { + // Failed to create the queue. + } + + // ... + + // Post some characters that will be used within an ISR. If the queue + // is full then this task will block for xBlockTime ticks. + cValueToPost = 'a'; + xQueueSend( xQueue, ( void * ) &cValueToPost, xBlockTime ); + cValueToPost = 'b'; + xQueueSend( xQueue, ( void * ) &cValueToPost, xBlockTime ); + + // ... keep posting characters ... this task may block when the queue + // becomes full. + + cValueToPost = 'c'; + xQueueSend( xQueue, ( void * ) &cValueToPost, xBlockTime ); + } + + // ISR that outputs all the characters received on the queue. + void vISR_Routine( void ) + { + portBASE_TYPE xTaskWokenByReceive = pdFALSE; + char cRxedChar; + + while( xQueueReceiveFromISR( xQueue, ( void * ) &cRxedChar, &xTaskWokenByReceive) ) + { + // A character was received. Output the character now. + vOutputCharacter( cRxedChar ); + + // If removing the character from the queue woke the task that was + // posting onto the queue cTaskWokenByReceive will have been set to + // pdTRUE. No matter how many times this loop iterates only one + // task will be woken. + } + + if( cTaskWokenByPost != ( char ) pdFALSE; + { + taskYIELD (); + } + } + </pre> + * \defgroup xQueueReceiveFromISR xQueueReceiveFromISR + * \ingroup QueueManagement + */ +signed portBASE_TYPE xQueueReceiveFromISR( xQueueHandle pxQueue, void * const pvBuffer, signed portBASE_TYPE *pxTaskWoken ); + +/* + * Utilities to query queue that are safe to use from an ISR. These utilities + * should be used only from witin an ISR, or within a critical section. + */ +signed portBASE_TYPE xQueueIsQueueEmptyFromISR( const xQueueHandle pxQueue ); +signed portBASE_TYPE xQueueIsQueueFullFromISR( const xQueueHandle pxQueue ); +unsigned portBASE_TYPE uxQueueMessagesWaitingFromISR( const xQueueHandle pxQueue ); + + +/* + * xQueueAltGenericSend() is an alternative version of xQueueGenericSend(). + * Likewise xQueueAltGenericReceive() is an alternative version of + * xQueueGenericReceive(). + * + * The source code that implements the alternative (Alt) API is much + * simpler because it executes everything from within a critical section. + * This is the approach taken by many other RTOSes, but FreeRTOS.org has the + * preferred fully featured API too. The fully featured API has more + * complex code that takes longer to execute, but makes much less use of + * critical sections. Therefore the alternative API sacrifices interrupt + * responsiveness to gain execution speed, whereas the fully featured API + * sacrifices execution speed to ensure better interrupt responsiveness. + */ +signed portBASE_TYPE xQueueAltGenericSend( xQueueHandle pxQueue, const void * const pvItemToQueue, portTickType xTicksToWait, portBASE_TYPE xCopyPosition ); +signed portBASE_TYPE xQueueAltGenericReceive( xQueueHandle pxQueue, void * const pvBuffer, portTickType xTicksToWait, portBASE_TYPE xJustPeeking ); +#define xQueueAltSendToFront( xQueue, pvItemToQueue, xTicksToWait ) xQueueAltGenericSend( ( xQueue ), ( pvItemToQueue ), ( xTicksToWait ), queueSEND_TO_FRONT ) +#define xQueueAltSendToBack( xQueue, pvItemToQueue, xTicksToWait ) xQueueAltGenericSend( ( xQueue ), ( pvItemToQueue ), ( xTicksToWait ), queueSEND_TO_BACK ) +#define xQueueAltReceive( xQueue, pvBuffer, xTicksToWait ) xQueueAltGenericReceive( ( xQueue ), ( pvBuffer ), ( xTicksToWait ), pdFALSE ) +#define xQueueAltPeek( xQueue, pvBuffer, xTicksToWait ) xQueueAltGenericReceive( ( xQueue ), ( pvBuffer ), ( xTicksToWait ), pdTRUE ) + +/* + * The functions defined above are for passing data to and from tasks. The + * functions below are the equivalents for passing data to and from + * co-routines. + * + * These functions are called from the co-routine macro implementation and + * should not be called directly from application code. Instead use the macro + * wrappers defined within croutine.h. + */ +signed portBASE_TYPE xQueueCRSendFromISR( xQueueHandle pxQueue, const void *pvItemToQueue, signed portBASE_TYPE xCoRoutinePreviouslyWoken ); +signed portBASE_TYPE xQueueCRReceiveFromISR( xQueueHandle pxQueue, void *pvBuffer, signed portBASE_TYPE *pxTaskWoken ); +signed portBASE_TYPE xQueueCRSend( xQueueHandle pxQueue, const void *pvItemToQueue, portTickType xTicksToWait ); +signed portBASE_TYPE xQueueCRReceive( xQueueHandle pxQueue, void *pvBuffer, portTickType xTicksToWait ); + +/* + * For internal use only. Use xSemaphoreCreateMutex() or + * xSemaphoreCreateCounting() instead of calling these functions directly. + */ +xQueueHandle xQueueCreateMutex( void ); +xQueueHandle xQueueCreateCountingSemaphore( unsigned portBASE_TYPE uxCountValue, unsigned portBASE_TYPE uxInitialCount ); + +/* + * For internal use only. Use xSemaphoreTakeMutexRecursive() or + * xSemaphoreGiveMutexRecursive() instead of calling these functions directly. + */ +portBASE_TYPE xQueueTakeMutexRecursive( xQueueHandle pxMutex, portTickType xBlockTime ); +portBASE_TYPE xQueueGiveMutexRecursive( xQueueHandle pxMutex ); + +/* + * The registry is provided as a means for kernel aware debuggers to + * locate queues, semaphores and mutexes. Call vQueueAddToRegistry() add + * a queue, semaphore or mutex handle to the registry if you want the handle + * to be available to a kernel aware debugger. If you are not using a kernel + * aware debugger then this function can be ignored. + * + * configQUEUE_REGISTRY_SIZE defines the maximum number of handles the + * registry can hold. configQUEUE_REGISTRY_SIZE must be greater than 0 + * within FreeRTOSConfig.h for the registry to be available. Its value + * does not effect the number of queues, semaphores and mutexes that can be + * created - just the number that the registry can hold. + * + * @param xQueue The handle of the queue being added to the registry. This + * is the handle returned by a call to xQueueCreate(). Semaphore and mutex + * handles can also be passed in here. + * + * @param pcName The name to be associated with the handle. This is the + * name that the kernel aware debugger will display. + */ +#if configQUEUE_REGISTRY_SIZE > 0U + void vQueueAddToRegistry( xQueueHandle xQueue, signed char *pcName ); +#endif + +/* Not a public API function, hence the 'Restricted' in the name. */ +void vQueueWaitForMessageRestricted( xQueueHandle pxQueue, portTickType xTicksToWait ); + + +#ifdef __cplusplus +} +#endif + +#endif /* QUEUE_H */ + diff --git a/FreeRTOSWithTraces/FreeRTOS_include/semphr.h b/FreeRTOSWithTraces/FreeRTOS_include/semphr.h new file mode 100644 index 0000000000000000000000000000000000000000..0130f1d79aee4bd7d3863ab84ceed0d6798c37bf --- /dev/null +++ b/FreeRTOSWithTraces/FreeRTOS_include/semphr.h @@ -0,0 +1,717 @@ +/* + FreeRTOS V7.0.1 - Copyright (C) 2011 Real Time Engineers Ltd. + + + FreeRTOS supports many tools and architectures. V7.0.0 is sponsored by: + Atollic AB - Atollic provides professional embedded systems development + tools for C/C++ development, code analysis and test automation. + See http://www.atollic.com + + + *************************************************************************** + * * + * FreeRTOS tutorial books are available in pdf and paperback. * + * Complete, revised, and edited pdf reference manuals are also * + * available. * + * * + * Purchasing FreeRTOS documentation will not only help you, by * + * ensuring you get running as quickly as possible and with an * + * in-depth knowledge of how to use FreeRTOS, it will also help * + * the FreeRTOS project to continue with its mission of providing * + * professional grade, cross platform, de facto standard solutions * + * for microcontrollers - completely free of charge! * + * * + * >>> See http://www.FreeRTOS.org/Documentation for details. <<< * + * * + * Thank you for using FreeRTOS, and thank you for your support! * + * * + *************************************************************************** + + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation AND MODIFIED BY the FreeRTOS exception. + >>>NOTE<<< The modification to the GPL is included to allow you to + distribute a combined work that includes FreeRTOS without being obliged to + provide the source code for proprietary components outside of the FreeRTOS + kernel. FreeRTOS is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + more details. You should have received a copy of the GNU General Public + License and the FreeRTOS license exception along with FreeRTOS; if not it + can be viewed here: http://www.freertos.org/a00114.html and also obtained + by writing to Richard Barry, contact details for whom are available on the + FreeRTOS WEB site. + + 1 tab == 4 spaces! + + http://www.FreeRTOS.org - Documentation, latest information, license and + contact details. + + http://www.SafeRTOS.com - A version that is certified for use in safety + critical systems. + + http://www.OpenRTOS.com - Commercial support, development, porting, + licensing and training services. +*/ + +#ifndef SEMAPHORE_H +#define SEMAPHORE_H + +#ifndef INC_FREERTOS_H + #error "#include FreeRTOS.h" must appear in source files before "#include semphr.h" +#endif + +#include "queue.h" + +typedef xQueueHandle xSemaphoreHandle; + +#define semBINARY_SEMAPHORE_QUEUE_LENGTH ( ( unsigned char ) 1U ) +#define semSEMAPHORE_QUEUE_ITEM_LENGTH ( ( unsigned char ) 0U ) +#define semGIVE_BLOCK_TIME ( ( portTickType ) 0U ) + + +/** + * semphr. h + * <pre>vSemaphoreCreateBinary( xSemaphoreHandle xSemaphore )</pre> + * + * <i>Macro</i> that implements a semaphore by using the existing queue mechanism. + * The queue length is 1 as this is a binary semaphore. The data size is 0 + * as we don't want to actually store any data - we just want to know if the + * queue is empty or full. + * + * This type of semaphore can be used for pure synchronisation between tasks or + * between an interrupt and a task. The semaphore need not be given back once + * obtained, so one task/interrupt can continuously 'give' the semaphore while + * another continuously 'takes' the semaphore. For this reason this type of + * semaphore does not use a priority inheritance mechanism. For an alternative + * that does use priority inheritance see xSemaphoreCreateMutex(). + * + * @param xSemaphore Handle to the created semaphore. Should be of type xSemaphoreHandle. + * + * Example usage: + <pre> + xSemaphoreHandle xSemaphore; + + void vATask( void * pvParameters ) + { + // Semaphore cannot be used before a call to vSemaphoreCreateBinary (). + // This is a macro so pass the variable in directly. + vSemaphoreCreateBinary( xSemaphore ); + + if( xSemaphore != NULL ) + { + // The semaphore was created successfully. + // The semaphore can now be used. + } + } + </pre> + * \defgroup vSemaphoreCreateBinary vSemaphoreCreateBinary + * \ingroup Semaphores + */ +#define vSemaphoreCreateBinary( xSemaphore ) { \ + ( xSemaphore ) = xQueueCreate( ( unsigned portBASE_TYPE ) 1, semSEMAPHORE_QUEUE_ITEM_LENGTH ); \ + if( ( xSemaphore ) != NULL ) \ + { \ + xSemaphoreGive( ( xSemaphore ) ); \ + } \ + } + +/** + * semphr. h + * <pre>xSemaphoreTake( + * xSemaphoreHandle xSemaphore, + * portTickType xBlockTime + * )</pre> + * + * <i>Macro</i> to obtain a semaphore. The semaphore must have previously been + * created with a call to vSemaphoreCreateBinary(), xSemaphoreCreateMutex() or + * xSemaphoreCreateCounting(). + * + * @param xSemaphore A handle to the semaphore being taken - obtained when + * the semaphore was created. + * + * @param xBlockTime The time in ticks to wait for the semaphore to become + * available. The macro portTICK_RATE_MS can be used to convert this to a + * real time. A block time of zero can be used to poll the semaphore. A block + * time of portMAX_DELAY can be used to block indefinitely (provided + * INCLUDE_vTaskSuspend is set to 1 in FreeRTOSConfig.h). + * + * @return pdTRUE if the semaphore was obtained. pdFALSE + * if xBlockTime expired without the semaphore becoming available. + * + * Example usage: + <pre> + xSemaphoreHandle xSemaphore = NULL; + + // A task that creates a semaphore. + void vATask( void * pvParameters ) + { + // Create the semaphore to guard a shared resource. + vSemaphoreCreateBinary( xSemaphore ); + } + + // A task that uses the semaphore. + void vAnotherTask( void * pvParameters ) + { + // ... Do other things. + + if( xSemaphore != NULL ) + { + // See if we can obtain the semaphore. If the semaphore is not available + // wait 10 ticks to see if it becomes free. + if( xSemaphoreTake( xSemaphore, ( portTickType ) 10 ) == pdTRUE ) + { + // We were able to obtain the semaphore and can now access the + // shared resource. + + // ... + + // We have finished accessing the shared resource. Release the + // semaphore. + xSemaphoreGive( xSemaphore ); + } + else + { + // We could not obtain the semaphore and can therefore not access + // the shared resource safely. + } + } + } + </pre> + * \defgroup xSemaphoreTake xSemaphoreTake + * \ingroup Semaphores + */ +#define xSemaphoreTake( xSemaphore, xBlockTime ) xQueueGenericReceive( ( xQueueHandle ) ( xSemaphore ), NULL, ( xBlockTime ), pdFALSE ) + +/** + * semphr. h + * xSemaphoreTakeRecursive( + * xSemaphoreHandle xMutex, + * portTickType xBlockTime + * ) + * + * <i>Macro</i> to recursively obtain, or 'take', a mutex type semaphore. + * The mutex must have previously been created using a call to + * xSemaphoreCreateRecursiveMutex(); + * + * configUSE_RECURSIVE_MUTEXES must be set to 1 in FreeRTOSConfig.h for this + * macro to be available. + * + * This macro must not be used on mutexes created using xSemaphoreCreateMutex(). + * + * A mutex used recursively can be 'taken' repeatedly by the owner. The mutex + * doesn't become available again until the owner has called + * xSemaphoreGiveRecursive() for each successful 'take' request. For example, + * if a task successfully 'takes' the same mutex 5 times then the mutex will + * not be available to any other task until it has also 'given' the mutex back + * exactly five times. + * + * @param xMutex A handle to the mutex being obtained. This is the + * handle returned by xSemaphoreCreateRecursiveMutex(); + * + * @param xBlockTime The time in ticks to wait for the semaphore to become + * available. The macro portTICK_RATE_MS can be used to convert this to a + * real time. A block time of zero can be used to poll the semaphore. If + * the task already owns the semaphore then xSemaphoreTakeRecursive() will + * return immediately no matter what the value of xBlockTime. + * + * @return pdTRUE if the semaphore was obtained. pdFALSE if xBlockTime + * expired without the semaphore becoming available. + * + * Example usage: + <pre> + xSemaphoreHandle xMutex = NULL; + + // A task that creates a mutex. + void vATask( void * pvParameters ) + { + // Create the mutex to guard a shared resource. + xMutex = xSemaphoreCreateRecursiveMutex(); + } + + // A task that uses the mutex. + void vAnotherTask( void * pvParameters ) + { + // ... Do other things. + + if( xMutex != NULL ) + { + // See if we can obtain the mutex. If the mutex is not available + // wait 10 ticks to see if it becomes free. + if( xSemaphoreTakeRecursive( xSemaphore, ( portTickType ) 10 ) == pdTRUE ) + { + // We were able to obtain the mutex and can now access the + // shared resource. + + // ... + // For some reason due to the nature of the code further calls to + // xSemaphoreTakeRecursive() are made on the same mutex. In real + // code these would not be just sequential calls as this would make + // no sense. Instead the calls are likely to be buried inside + // a more complex call structure. + xSemaphoreTakeRecursive( xMutex, ( portTickType ) 10 ); + xSemaphoreTakeRecursive( xMutex, ( portTickType ) 10 ); + + // The mutex has now been 'taken' three times, so will not be + // available to another task until it has also been given back + // three times. Again it is unlikely that real code would have + // these calls sequentially, but instead buried in a more complex + // call structure. This is just for illustrative purposes. + xSemaphoreGiveRecursive( xMutex ); + xSemaphoreGiveRecursive( xMutex ); + xSemaphoreGiveRecursive( xMutex ); + + // Now the mutex can be taken by other tasks. + } + else + { + // We could not obtain the mutex and can therefore not access + // the shared resource safely. + } + } + } + </pre> + * \defgroup xSemaphoreTakeRecursive xSemaphoreTakeRecursive + * \ingroup Semaphores + */ +#define xSemaphoreTakeRecursive( xMutex, xBlockTime ) xQueueTakeMutexRecursive( ( xMutex ), ( xBlockTime ) ) + + +/* + * xSemaphoreAltTake() is an alternative version of xSemaphoreTake(). + * + * The source code that implements the alternative (Alt) API is much + * simpler because it executes everything from within a critical section. + * This is the approach taken by many other RTOSes, but FreeRTOS.org has the + * preferred fully featured API too. The fully featured API has more + * complex code that takes longer to execute, but makes much less use of + * critical sections. Therefore the alternative API sacrifices interrupt + * responsiveness to gain execution speed, whereas the fully featured API + * sacrifices execution speed to ensure better interrupt responsiveness. + */ +#define xSemaphoreAltTake( xSemaphore, xBlockTime ) xQueueAltGenericReceive( ( xQueueHandle ) ( xSemaphore ), NULL, ( xBlockTime ), pdFALSE ) + +/** + * semphr. h + * <pre>xSemaphoreGive( xSemaphoreHandle xSemaphore )</pre> + * + * <i>Macro</i> to release a semaphore. The semaphore must have previously been + * created with a call to vSemaphoreCreateBinary(), xSemaphoreCreateMutex() or + * xSemaphoreCreateCounting(). and obtained using sSemaphoreTake(). + * + * This macro must not be used from an ISR. See xSemaphoreGiveFromISR () for + * an alternative which can be used from an ISR. + * + * This macro must also not be used on semaphores created using + * xSemaphoreCreateRecursiveMutex(). + * + * @param xSemaphore A handle to the semaphore being released. This is the + * handle returned when the semaphore was created. + * + * @return pdTRUE if the semaphore was released. pdFALSE if an error occurred. + * Semaphores are implemented using queues. An error can occur if there is + * no space on the queue to post a message - indicating that the + * semaphore was not first obtained correctly. + * + * Example usage: + <pre> + xSemaphoreHandle xSemaphore = NULL; + + void vATask( void * pvParameters ) + { + // Create the semaphore to guard a shared resource. + vSemaphoreCreateBinary( xSemaphore ); + + if( xSemaphore != NULL ) + { + if( xSemaphoreGive( xSemaphore ) != pdTRUE ) + { + // We would expect this call to fail because we cannot give + // a semaphore without first "taking" it! + } + + // Obtain the semaphore - don't block if the semaphore is not + // immediately available. + if( xSemaphoreTake( xSemaphore, ( portTickType ) 0 ) ) + { + // We now have the semaphore and can access the shared resource. + + // ... + + // We have finished accessing the shared resource so can free the + // semaphore. + if( xSemaphoreGive( xSemaphore ) != pdTRUE ) + { + // We would not expect this call to fail because we must have + // obtained the semaphore to get here. + } + } + } + } + </pre> + * \defgroup xSemaphoreGive xSemaphoreGive + * \ingroup Semaphores + */ +#define xSemaphoreGive( xSemaphore ) xQueueGenericSend( ( xQueueHandle ) ( xSemaphore ), NULL, semGIVE_BLOCK_TIME, queueSEND_TO_BACK ) + +/** + * semphr. h + * <pre>xSemaphoreGiveRecursive( xSemaphoreHandle xMutex )</pre> + * + * <i>Macro</i> to recursively release, or 'give', a mutex type semaphore. + * The mutex must have previously been created using a call to + * xSemaphoreCreateRecursiveMutex(); + * + * configUSE_RECURSIVE_MUTEXES must be set to 1 in FreeRTOSConfig.h for this + * macro to be available. + * + * This macro must not be used on mutexes created using xSemaphoreCreateMutex(). + * + * A mutex used recursively can be 'taken' repeatedly by the owner. The mutex + * doesn't become available again until the owner has called + * xSemaphoreGiveRecursive() for each successful 'take' request. For example, + * if a task successfully 'takes' the same mutex 5 times then the mutex will + * not be available to any other task until it has also 'given' the mutex back + * exactly five times. + * + * @param xMutex A handle to the mutex being released, or 'given'. This is the + * handle returned by xSemaphoreCreateMutex(); + * + * @return pdTRUE if the semaphore was given. + * + * Example usage: + <pre> + xSemaphoreHandle xMutex = NULL; + + // A task that creates a mutex. + void vATask( void * pvParameters ) + { + // Create the mutex to guard a shared resource. + xMutex = xSemaphoreCreateRecursiveMutex(); + } + + // A task that uses the mutex. + void vAnotherTask( void * pvParameters ) + { + // ... Do other things. + + if( xMutex != NULL ) + { + // See if we can obtain the mutex. If the mutex is not available + // wait 10 ticks to see if it becomes free. + if( xSemaphoreTakeRecursive( xMutex, ( portTickType ) 10 ) == pdTRUE ) + { + // We were able to obtain the mutex and can now access the + // shared resource. + + // ... + // For some reason due to the nature of the code further calls to + // xSemaphoreTakeRecursive() are made on the same mutex. In real + // code these would not be just sequential calls as this would make + // no sense. Instead the calls are likely to be buried inside + // a more complex call structure. + xSemaphoreTakeRecursive( xMutex, ( portTickType ) 10 ); + xSemaphoreTakeRecursive( xMutex, ( portTickType ) 10 ); + + // The mutex has now been 'taken' three times, so will not be + // available to another task until it has also been given back + // three times. Again it is unlikely that real code would have + // these calls sequentially, it would be more likely that the calls + // to xSemaphoreGiveRecursive() would be called as a call stack + // unwound. This is just for demonstrative purposes. + xSemaphoreGiveRecursive( xMutex ); + xSemaphoreGiveRecursive( xMutex ); + xSemaphoreGiveRecursive( xMutex ); + + // Now the mutex can be taken by other tasks. + } + else + { + // We could not obtain the mutex and can therefore not access + // the shared resource safely. + } + } + } + </pre> + * \defgroup xSemaphoreGiveRecursive xSemaphoreGiveRecursive + * \ingroup Semaphores + */ +#define xSemaphoreGiveRecursive( xMutex ) xQueueGiveMutexRecursive( ( xMutex ) ) + +/* + * xSemaphoreAltGive() is an alternative version of xSemaphoreGive(). + * + * The source code that implements the alternative (Alt) API is much + * simpler because it executes everything from within a critical section. + * This is the approach taken by many other RTOSes, but FreeRTOS.org has the + * preferred fully featured API too. The fully featured API has more + * complex code that takes longer to execute, but makes much less use of + * critical sections. Therefore the alternative API sacrifices interrupt + * responsiveness to gain execution speed, whereas the fully featured API + * sacrifices execution speed to ensure better interrupt responsiveness. + */ +#define xSemaphoreAltGive( xSemaphore ) xQueueAltGenericSend( ( xQueueHandle ) ( xSemaphore ), NULL, semGIVE_BLOCK_TIME, queueSEND_TO_BACK ) + +/** + * semphr. h + * <pre> + xSemaphoreGiveFromISR( + xSemaphoreHandle xSemaphore, + signed portBASE_TYPE *pxHigherPriorityTaskWoken + )</pre> + * + * <i>Macro</i> to release a semaphore. The semaphore must have previously been + * created with a call to vSemaphoreCreateBinary() or xSemaphoreCreateCounting(). + * + * Mutex type semaphores (those created using a call to xSemaphoreCreateMutex()) + * must not be used with this macro. + * + * This macro can be used from an ISR. + * + * @param xSemaphore A handle to the semaphore being released. This is the + * handle returned when the semaphore was created. + * + * @param pxHigherPriorityTaskWoken xSemaphoreGiveFromISR() will set + * *pxHigherPriorityTaskWoken to pdTRUE if giving the semaphore caused a task + * to unblock, and the unblocked task has a priority higher than the currently + * running task. If xSemaphoreGiveFromISR() sets this value to pdTRUE then + * a context switch should be requested before the interrupt is exited. + * + * @return pdTRUE if the semaphore was successfully given, otherwise errQUEUE_FULL. + * + * Example usage: + <pre> + \#define LONG_TIME 0xffff + \#define TICKS_TO_WAIT 10 + xSemaphoreHandle xSemaphore = NULL; + + // Repetitive task. + void vATask( void * pvParameters ) + { + for( ;; ) + { + // We want this task to run every 10 ticks of a timer. The semaphore + // was created before this task was started. + + // Block waiting for the semaphore to become available. + if( xSemaphoreTake( xSemaphore, LONG_TIME ) == pdTRUE ) + { + // It is time to execute. + + // ... + + // We have finished our task. Return to the top of the loop where + // we will block on the semaphore until it is time to execute + // again. Note when using the semaphore for synchronisation with an + // ISR in this manner there is no need to 'give' the semaphore back. + } + } + } + + // Timer ISR + void vTimerISR( void * pvParameters ) + { + static unsigned char ucLocalTickCount = 0; + static signed portBASE_TYPE xHigherPriorityTaskWoken; + + // A timer tick has occurred. + + // ... Do other time functions. + + // Is it time for vATask () to run? + xHigherPriorityTaskWoken = pdFALSE; + ucLocalTickCount++; + if( ucLocalTickCount >= TICKS_TO_WAIT ) + { + // Unblock the task by releasing the semaphore. + xSemaphoreGiveFromISR( xSemaphore, &xHigherPriorityTaskWoken ); + + // Reset the count so we release the semaphore again in 10 ticks time. + ucLocalTickCount = 0; + } + + if( xHigherPriorityTaskWoken != pdFALSE ) + { + // We can force a context switch here. Context switching from an + // ISR uses port specific syntax. Check the demo task for your port + // to find the syntax required. + } + } + </pre> + * \defgroup xSemaphoreGiveFromISR xSemaphoreGiveFromISR + * \ingroup Semaphores + */ +#define xSemaphoreGiveFromISR( xSemaphore, pxHigherPriorityTaskWoken ) xQueueGenericSendFromISR( ( xQueueHandle ) ( xSemaphore ), NULL, ( pxHigherPriorityTaskWoken ), queueSEND_TO_BACK ) + +/** + * semphr. h + * <pre>xSemaphoreHandle xSemaphoreCreateMutex( void )</pre> + * + * <i>Macro</i> that implements a mutex semaphore by using the existing queue + * mechanism. + * + * Mutexes created using this macro can be accessed using the xSemaphoreTake() + * and xSemaphoreGive() macros. The xSemaphoreTakeRecursive() and + * xSemaphoreGiveRecursive() macros should not be used. + * + * This type of semaphore uses a priority inheritance mechanism so a task + * 'taking' a semaphore MUST ALWAYS 'give' the semaphore back once the + * semaphore it is no longer required. + * + * Mutex type semaphores cannot be used from within interrupt service routines. + * + * See vSemaphoreCreateBinary() for an alternative implementation that can be + * used for pure synchronisation (where one task or interrupt always 'gives' the + * semaphore and another always 'takes' the semaphore) and from within interrupt + * service routines. + * + * @return xSemaphore Handle to the created mutex semaphore. Should be of type + * xSemaphoreHandle. + * + * Example usage: + <pre> + xSemaphoreHandle xSemaphore; + + void vATask( void * pvParameters ) + { + // Semaphore cannot be used before a call to xSemaphoreCreateMutex(). + // This is a macro so pass the variable in directly. + xSemaphore = xSemaphoreCreateMutex(); + + if( xSemaphore != NULL ) + { + // The semaphore was created successfully. + // The semaphore can now be used. + } + } + </pre> + * \defgroup vSemaphoreCreateMutex vSemaphoreCreateMutex + * \ingroup Semaphores + */ +#define xSemaphoreCreateMutex() xQueueCreateMutex() + + +/** + * semphr. h + * <pre>xSemaphoreHandle xSemaphoreCreateRecursiveMutex( void )</pre> + * + * <i>Macro</i> that implements a recursive mutex by using the existing queue + * mechanism. + * + * Mutexes created using this macro can be accessed using the + * xSemaphoreTakeRecursive() and xSemaphoreGiveRecursive() macros. The + * xSemaphoreTake() and xSemaphoreGive() macros should not be used. + * + * A mutex used recursively can be 'taken' repeatedly by the owner. The mutex + * doesn't become available again until the owner has called + * xSemaphoreGiveRecursive() for each successful 'take' request. For example, + * if a task successfully 'takes' the same mutex 5 times then the mutex will + * not be available to any other task until it has also 'given' the mutex back + * exactly five times. + * + * This type of semaphore uses a priority inheritance mechanism so a task + * 'taking' a semaphore MUST ALWAYS 'give' the semaphore back once the + * semaphore it is no longer required. + * + * Mutex type semaphores cannot be used from within interrupt service routines. + * + * See vSemaphoreCreateBinary() for an alternative implementation that can be + * used for pure synchronisation (where one task or interrupt always 'gives' the + * semaphore and another always 'takes' the semaphore) and from within interrupt + * service routines. + * + * @return xSemaphore Handle to the created mutex semaphore. Should be of type + * xSemaphoreHandle. + * + * Example usage: + <pre> + xSemaphoreHandle xSemaphore; + + void vATask( void * pvParameters ) + { + // Semaphore cannot be used before a call to xSemaphoreCreateMutex(). + // This is a macro so pass the variable in directly. + xSemaphore = xSemaphoreCreateRecursiveMutex(); + + if( xSemaphore != NULL ) + { + // The semaphore was created successfully. + // The semaphore can now be used. + } + } + </pre> + * \defgroup vSemaphoreCreateMutex vSemaphoreCreateMutex + * \ingroup Semaphores + */ +#define xSemaphoreCreateRecursiveMutex() xQueueCreateMutex() + +/** + * semphr. h + * <pre>xSemaphoreHandle xSemaphoreCreateCounting( unsigned portBASE_TYPE uxMaxCount, unsigned portBASE_TYPE uxInitialCount )</pre> + * + * <i>Macro</i> that creates a counting semaphore by using the existing + * queue mechanism. + * + * Counting semaphores are typically used for two things: + * + * 1) Counting events. + * + * In this usage scenario an event handler will 'give' a semaphore each time + * an event occurs (incrementing the semaphore count value), and a handler + * task will 'take' a semaphore each time it processes an event + * (decrementing the semaphore count value). The count value is therefore + * the difference between the number of events that have occurred and the + * number that have been processed. In this case it is desirable for the + * initial count value to be zero. + * + * 2) Resource management. + * + * In this usage scenario the count value indicates the number of resources + * available. To obtain control of a resource a task must first obtain a + * semaphore - decrementing the semaphore count value. When the count value + * reaches zero there are no free resources. When a task finishes with the + * resource it 'gives' the semaphore back - incrementing the semaphore count + * value. In this case it is desirable for the initial count value to be + * equal to the maximum count value, indicating that all resources are free. + * + * @param uxMaxCount The maximum count value that can be reached. When the + * semaphore reaches this value it can no longer be 'given'. + * + * @param uxInitialCount The count value assigned to the semaphore when it is + * created. + * + * @return Handle to the created semaphore. Null if the semaphore could not be + * created. + * + * Example usage: + <pre> + xSemaphoreHandle xSemaphore; + + void vATask( void * pvParameters ) + { + xSemaphoreHandle xSemaphore = NULL; + + // Semaphore cannot be used before a call to xSemaphoreCreateCounting(). + // The max value to which the semaphore can count should be 10, and the + // initial value assigned to the count should be 0. + xSemaphore = xSemaphoreCreateCounting( 10, 0 ); + + if( xSemaphore != NULL ) + { + // The semaphore was created successfully. + // The semaphore can now be used. + } + } + </pre> + * \defgroup xSemaphoreCreateCounting xSemaphoreCreateCounting + * \ingroup Semaphores + */ +#define xSemaphoreCreateCounting( uxMaxCount, uxInitialCount ) xQueueCreateCountingSemaphore( ( uxMaxCount ), ( uxInitialCount ) ) + + +#endif /* SEMAPHORE_H */ + + diff --git a/FreeRTOSWithTraces/FreeRTOS_include/task.h b/FreeRTOSWithTraces/FreeRTOS_include/task.h new file mode 100644 index 0000000000000000000000000000000000000000..3c44904dc3ecbe036989a918752a6d3fc0dad564 --- /dev/null +++ b/FreeRTOSWithTraces/FreeRTOS_include/task.h @@ -0,0 +1,1307 @@ +/* + FreeRTOS V7.0.1 - Copyright (C) 2011 Real Time Engineers Ltd. + + + FreeRTOS supports many tools and architectures. V7.0.0 is sponsored by: + Atollic AB - Atollic provides professional embedded systems development + tools for C/C++ development, code analysis and test automation. + See http://www.atollic.com + + + *************************************************************************** + * * + * FreeRTOS tutorial books are available in pdf and paperback. * + * Complete, revised, and edited pdf reference manuals are also * + * available. * + * * + * Purchasing FreeRTOS documentation will not only help you, by * + * ensuring you get running as quickly as possible and with an * + * in-depth knowledge of how to use FreeRTOS, it will also help * + * the FreeRTOS project to continue with its mission of providing * + * professional grade, cross platform, de facto standard solutions * + * for microcontrollers - completely free of charge! * + * * + * >>> See http://www.FreeRTOS.org/Documentation for details. <<< * + * * + * Thank you for using FreeRTOS, and thank you for your support! * + * * + *************************************************************************** + + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation AND MODIFIED BY the FreeRTOS exception. + >>>NOTE<<< The modification to the GPL is included to allow you to + distribute a combined work that includes FreeRTOS without being obliged to + provide the source code for proprietary components outside of the FreeRTOS + kernel. FreeRTOS is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + more details. You should have received a copy of the GNU General Public + License and the FreeRTOS license exception along with FreeRTOS; if not it + can be viewed here: http://www.freertos.org/a00114.html and also obtained + by writing to Richard Barry, contact details for whom are available on the + FreeRTOS WEB site. + + 1 tab == 4 spaces! + + http://www.FreeRTOS.org - Documentation, latest information, license and + contact details. + + http://www.SafeRTOS.com - A version that is certified for use in safety + critical systems. + + http://www.OpenRTOS.com - Commercial support, development, porting, + licensing and training services. +*/ + + +#ifndef TASK_H +#define TASK_H + +#ifndef INC_FREERTOS_H + #error "include FreeRTOS.h must appear in source files before include task.h" +#endif + +#include "portable.h" +#include "list.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/*----------------------------------------------------------- + * MACROS AND DEFINITIONS + *----------------------------------------------------------*/ + +#define tskKERNEL_VERSION_NUMBER "V7.0.1" + +/** + * task. h + * + * Type by which tasks are referenced. For example, a call to xTaskCreate + * returns (via a pointer parameter) an xTaskHandle variable that can then + * be used as a parameter to vTaskDelete to delete the task. + * + * \page xTaskHandle xTaskHandle + * \ingroup Tasks + */ +typedef void * xTaskHandle; + +/* + * Used internally only. + */ +typedef struct xTIME_OUT +{ + portBASE_TYPE xOverflowCount; + portTickType xTimeOnEntering; +} xTimeOutType; + +/* + * Defines the memory ranges allocated to the task when an MPU is used. + */ +typedef struct xMEMORY_REGION +{ + void *pvBaseAddress; + unsigned long ulLengthInBytes; + unsigned long ulParameters; +} xMemoryRegion; + +/* + * Parameters required to create an MPU protected task. + */ +typedef struct xTASK_PARAMTERS +{ + pdTASK_CODE pvTaskCode; + const signed char * const pcName; + unsigned short usStackDepth; + void *pvParameters; + unsigned portBASE_TYPE uxPriority; + portSTACK_TYPE *puxStackBuffer; + xMemoryRegion xRegions[ portNUM_CONFIGURABLE_REGIONS ]; +} xTaskParameters; + +/* + * Defines the priority used by the idle task. This must not be modified. + * + * \ingroup TaskUtils + */ +#define tskIDLE_PRIORITY ( ( unsigned portBASE_TYPE ) 0U ) + +/** + * task. h + * + * Macro for forcing a context switch. + * + * \page taskYIELD taskYIELD + * \ingroup SchedulerControl + */ +#define taskYIELD() portYIELD() + +/** + * task. h + * + * Macro to mark the start of a critical code region. Preemptive context + * switches cannot occur when in a critical region. + * + * NOTE: This may alter the stack (depending on the portable implementation) + * so must be used with care! + * + * \page taskENTER_CRITICAL taskENTER_CRITICAL + * \ingroup SchedulerControl + */ +#define taskENTER_CRITICAL() portENTER_CRITICAL() + +/** + * task. h + * + * Macro to mark the end of a critical code region. Preemptive context + * switches cannot occur when in a critical region. + * + * NOTE: This may alter the stack (depending on the portable implementation) + * so must be used with care! + * + * \page taskEXIT_CRITICAL taskEXIT_CRITICAL + * \ingroup SchedulerControl + */ +#define taskEXIT_CRITICAL() portEXIT_CRITICAL() + +/** + * task. h + * + * Macro to disable all maskable interrupts. + * + * \page taskDISABLE_INTERRUPTS taskDISABLE_INTERRUPTS + * \ingroup SchedulerControl + */ +#define taskDISABLE_INTERRUPTS() portDISABLE_INTERRUPTS() + +/** + * task. h + * + * Macro to enable microcontroller interrupts. + * + * \page taskENABLE_INTERRUPTS taskENABLE_INTERRUPTS + * \ingroup SchedulerControl + */ +#define taskENABLE_INTERRUPTS() portENABLE_INTERRUPTS() + +/* Definitions returned by xTaskGetSchedulerState(). */ +#define taskSCHEDULER_NOT_STARTED 0 +#define taskSCHEDULER_RUNNING 1 +#define taskSCHEDULER_SUSPENDED 2 + +/*----------------------------------------------------------- + * TASK CREATION API + *----------------------------------------------------------*/ + +/** + * task. h + *<pre> + portBASE_TYPE xTaskCreate( + pdTASK_CODE pvTaskCode, + const char * const pcName, + unsigned short usStackDepth, + void *pvParameters, + unsigned portBASE_TYPE uxPriority, + xTaskHandle *pvCreatedTask + );</pre> + * + * Create a new task and add it to the list of tasks that are ready to run. + * + * xTaskCreate() can only be used to create a task that has unrestricted + * access to the entire microcontroller memory map. Systems that include MPU + * support can alternatively create an MPU constrained task using + * xTaskCreateRestricted(). + * + * @param pvTaskCode Pointer to the task entry function. Tasks + * must be implemented to never return (i.e. continuous loop). + * + * @param pcName A descriptive name for the task. This is mainly used to + * facilitate debugging. Max length defined by tskMAX_TASK_NAME_LEN - default + * is 16. + * + * @param usStackDepth The size of the task stack specified as the number of + * variables the stack can hold - not the number of bytes. For example, if + * the stack is 16 bits wide and usStackDepth is defined as 100, 200 bytes + * will be allocated for stack storage. + * + * @param pvParameters Pointer that will be used as the parameter for the task + * being created. + * + * @param uxPriority The priority at which the task should run. Systems that + * include MPU support can optionally create tasks in a privileged (system) + * mode by setting bit portPRIVILEGE_BIT of the priority parameter. For + * example, to create a privileged task at priority 2 the uxPriority parameter + * should be set to ( 2 | portPRIVILEGE_BIT ). + * + * @param pvCreatedTask Used to pass back a handle by which the created task + * can be referenced. + * + * @return pdPASS if the task was successfully created and added to a ready + * list, otherwise an error code defined in the file errors. h + * + * Example usage: + <pre> + // Task to be created. + void vTaskCode( void * pvParameters ) + { + for( ;; ) + { + // Task code goes here. + } + } + + // Function that creates a task. + void vOtherFunction( void ) + { + static unsigned char ucParameterToPass; + xTaskHandle xHandle; + + // Create the task, storing the handle. Note that the passed parameter ucParameterToPass + // must exist for the lifetime of the task, so in this case is declared static. If it was just an + // 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. + xTaskCreate( vTaskCode, "NAME", STACK_SIZE, &ucParameterToPass, tskIDLE_PRIORITY, &xHandle ); + + // Use the handle to delete the task. + vTaskDelete( xHandle ); + } + </pre> + * \defgroup xTaskCreate xTaskCreate + * \ingroup Tasks + */ +#define xTaskCreate( pvTaskCode, pcName, usStackDepth, pvParameters, uxPriority, pxCreatedTask ) xTaskGenericCreate( ( pvTaskCode ), ( pcName ), ( usStackDepth ), ( pvParameters ), ( uxPriority ), ( pxCreatedTask ), ( NULL ), ( NULL ) ) + +/** + * task. h + *<pre> + portBASE_TYPE xTaskCreateRestricted( xTaskParameters *pxTaskDefinition, xTaskHandle *pxCreatedTask );</pre> + * + * xTaskCreateRestricted() should only be used in systems that include an MPU + * implementation. + * + * Create a new task and add it to the list of tasks that are ready to run. + * The function parameters define the memory regions and associated access + * permissions allocated to the task. + * + * @param pxTaskDefinition Pointer to a structure that contains a member + * for each of the normal xTaskCreate() parameters (see the xTaskCreate() API + * documentation) plus an optional stack buffer and the memory region + * definitions. + * + * @param pxCreatedTask Used to pass back a handle by which the created task + * can be referenced. + * + * @return pdPASS if the task was successfully created and added to a ready + * list, otherwise an error code defined in the file errors. h + * + * Example usage: + <pre> +// Create an xTaskParameters structure that defines the task to be created. +static const xTaskParameters xCheckTaskParameters = +{ + vATask, // pvTaskCode - the function that implements the task. + "ATask", // pcName - just a text name for the task to assist debugging. + 100, // usStackDepth - the stack size DEFINED IN WORDS. + NULL, // pvParameters - passed into the task function as the function parameters. + ( 1UL | portPRIVILEGE_BIT ),// uxPriority - task priority, set the portPRIVILEGE_BIT if the task should run in a privileged state. + cStackBuffer,// puxStackBuffer - the buffer to be used as the task stack. + + // xRegions - Allocate up to three separate memory regions for access by + // the task, with appropriate access permissions. Different processors have + // different memory alignment requirements - refer to the FreeRTOS documentation + // for full information. + { + // Base address Length Parameters + { cReadWriteArray, 32, portMPU_REGION_READ_WRITE }, + { cReadOnlyArray, 32, portMPU_REGION_READ_ONLY }, + { cPrivilegedOnlyAccessArray, 128, portMPU_REGION_PRIVILEGED_READ_WRITE } + } +}; + +int main( void ) +{ +xTaskHandle xHandle; + + // Create a task from the const structure defined above. The task handle + // is requested (the second parameter is not NULL) but in this case just for + // demonstration purposes as its not actually used. + xTaskCreateRestricted( &xRegTest1Parameters, &xHandle ); + + // Start the scheduler. + vTaskStartScheduler(); + + // Will only get here if there was insufficient memory to create the idle + // task. + for( ;; ); +} + </pre> + * \defgroup xTaskCreateRestricted xTaskCreateRestricted + * \ingroup Tasks + */ +#define xTaskCreateRestricted( x, pxCreatedTask ) xTaskGenericCreate( ((x)->pvTaskCode), ((x)->pcName), ((x)->usStackDepth), ((x)->pvParameters), ((x)->uxPriority), (pxCreatedTask), ((x)->puxStackBuffer), ((x)->xRegions) ) + +/** + * task. h + *<pre> + void vTaskAllocateMPURegions( xTaskHandle xTask, const xMemoryRegion * const pxRegions );</pre> + * + * Memory regions are assigned to a restricted task when the task is created by + * a call to xTaskCreateRestricted(). These regions can be redefined using + * vTaskAllocateMPURegions(). + * + * @param xTask The handle of the task being updated. + * + * @param xRegions A pointer to an xMemoryRegion structure that contains the + * new memory region definitions. + * + * Example usage: + <pre> +// Define an array of xMemoryRegion structures that configures an MPU region +// allowing read/write access for 1024 bytes starting at the beginning of the +// ucOneKByte array. The other two of the maximum 3 definable regions are +// unused so set to zero. +static const xMemoryRegion xAltRegions[ portNUM_CONFIGURABLE_REGIONS ] = +{ + // Base address Length Parameters + { ucOneKByte, 1024, portMPU_REGION_READ_WRITE }, + { 0, 0, 0 }, + { 0, 0, 0 } +}; + +void vATask( void *pvParameters ) +{ + // This task was created such that it has access to certain regions of + // memory as defined by the MPU configuration. At some point it is + // desired that these MPU regions are replaced with that defined in the + // xAltRegions const struct above. Use a call to vTaskAllocateMPURegions() + // for this purpose. NULL is used as the task handle to indicate that this + // function should modify the MPU regions of the calling task. + vTaskAllocateMPURegions( NULL, xAltRegions ); + + // Now the task can continue its function, but from this point on can only + // access its stack and the ucOneKByte array (unless any other statically + // defined or shared regions have been declared elsewhere). +} + </pre> + * \defgroup xTaskCreateRestricted xTaskCreateRestricted + * \ingroup Tasks + */ +void vTaskAllocateMPURegions( xTaskHandle xTask, const xMemoryRegion * const pxRegions ) PRIVILEGED_FUNCTION; + +/** + * task. h + * <pre>void vTaskDelete( xTaskHandle pxTask );</pre> + * + * INCLUDE_vTaskDelete must be defined as 1 for this function to be available. + * See the configuration section for more information. + * + * Remove a task from the RTOS real time kernels management. The task being + * deleted will be removed from all ready, blocked, suspended and event lists. + * + * NOTE: The idle task is responsible for freeing the kernel allocated + * memory from tasks that have been deleted. It is therefore important that + * the idle task is not starved of microcontroller processing time if your + * application makes any calls to vTaskDelete (). Memory allocated by the + * task code is not automatically freed, and should be freed before the task + * is deleted. + * + * See the demo application file death.c for sample code that utilises + * vTaskDelete (). + * + * @param pxTask The handle of the task to be deleted. Passing NULL will + * cause the calling task to be deleted. + * + * Example usage: + <pre> + void vOtherFunction( void ) + { + xTaskHandle xHandle; + + // Create the task, storing the handle. + xTaskCreate( vTaskCode, "NAME", STACK_SIZE, NULL, tskIDLE_PRIORITY, &xHandle ); + + // Use the handle to delete the task. + vTaskDelete( xHandle ); + } + </pre> + * \defgroup vTaskDelete vTaskDelete + * \ingroup Tasks + */ +void vTaskDelete( xTaskHandle pxTaskToDelete ) PRIVILEGED_FUNCTION; + +/*----------------------------------------------------------- + * TASK CONTROL API + *----------------------------------------------------------*/ + +/** + * task. h + * <pre>void vTaskDelay( portTickType xTicksToDelay );</pre> + * + * Delay a task for a given number of ticks. The actual time that the + * task remains blocked depends on the tick rate. The constant + * portTICK_RATE_MS can be used to calculate real time from the tick + * rate - with the resolution of one tick period. + * + * INCLUDE_vTaskDelay must be defined as 1 for this function to be available. + * See the configuration section for more information. + * + * + * vTaskDelay() specifies a time at which the task wishes to unblock relative to + * the time at which vTaskDelay() is called. For example, specifying a block + * period of 100 ticks will cause the task to unblock 100 ticks after + * vTaskDelay() is called. vTaskDelay() does not therefore provide a good method + * of controlling the frequency of a cyclical task as the path taken through the + * code, as well as other task and interrupt activity, will effect the frequency + * at which vTaskDelay() gets called and therefore the time at which the task + * next executes. See vTaskDelayUntil() for an alternative API function designed + * to facilitate fixed frequency execution. It does this by specifying an + * absolute time (rather than a relative time) at which the calling task should + * unblock. + * + * @param xTicksToDelay The amount of time, in tick periods, that + * the calling task should block. + * + * Example usage: + + void vTaskFunction( void * pvParameters ) + { + void vTaskFunction( void * pvParameters ) + { + // Block for 500ms. + const portTickType xDelay = 500 / portTICK_RATE_MS; + + for( ;; ) + { + // Simply toggle the LED every 500ms, blocking between each toggle. + vToggleLED(); + vTaskDelay( xDelay ); + } + } + + * \defgroup vTaskDelay vTaskDelay + * \ingroup TaskCtrl + */ +void vTaskDelay( portTickType xTicksToDelay ) PRIVILEGED_FUNCTION; + +/** + * task. h + * <pre>void vTaskDelayUntil( portTickType *pxPreviousWakeTime, portTickType xTimeIncrement );</pre> + * + * INCLUDE_vTaskDelayUntil must be defined as 1 for this function to be available. + * See the configuration section for more information. + * + * Delay a task until a specified time. This function can be used by cyclical + * tasks to ensure a constant execution frequency. + * + * This function differs from vTaskDelay () in one important aspect: vTaskDelay () will + * cause a task to block for the specified number of ticks from the time vTaskDelay () is + * called. It is therefore difficult to use vTaskDelay () by itself to generate a fixed + * execution frequency as the time between a task starting to execute and that task + * calling vTaskDelay () may not be fixed [the task may take a different path though the + * code between calls, or may get interrupted or preempted a different number of times + * each time it executes]. + * + * Whereas vTaskDelay () specifies a wake time relative to the time at which the function + * is called, vTaskDelayUntil () specifies the absolute (exact) time at which it wishes to + * unblock. + * + * The constant portTICK_RATE_MS can be used to calculate real time from the tick + * rate - with the resolution of one tick period. + * + * @param pxPreviousWakeTime Pointer to a variable that holds the time at which the + * task was last unblocked. The variable must be initialised with the current time + * prior to its first use (see the example below). Following this the variable is + * automatically updated within vTaskDelayUntil (). + * + * @param xTimeIncrement The cycle time period. The task will be unblocked at + * time *pxPreviousWakeTime + xTimeIncrement. Calling vTaskDelayUntil with the + * same xTimeIncrement parameter value will cause the task to execute with + * a fixed interface period. + * + * Example usage: + <pre> + // Perform an action every 10 ticks. + void vTaskFunction( void * pvParameters ) + { + portTickType xLastWakeTime; + const portTickType xFrequency = 10; + + // Initialise the xLastWakeTime variable with the current time. + xLastWakeTime = xTaskGetTickCount (); + for( ;; ) + { + // Wait for the next cycle. + vTaskDelayUntil( &xLastWakeTime, xFrequency ); + + // Perform action here. + } + } + </pre> + * \defgroup vTaskDelayUntil vTaskDelayUntil + * \ingroup TaskCtrl + */ +void vTaskDelayUntil( portTickType * const pxPreviousWakeTime, portTickType xTimeIncrement ) PRIVILEGED_FUNCTION; + +/** + * task. h + * <pre>unsigned portBASE_TYPE uxTaskPriorityGet( xTaskHandle pxTask );</pre> + * + * INCLUDE_xTaskPriorityGet must be defined as 1 for this function to be available. + * See the configuration section for more information. + * + * Obtain the priority of any task. + * + * @param pxTask Handle of the task to be queried. Passing a NULL + * handle results in the priority of the calling task being returned. + * + * @return The priority of pxTask. + * + * Example usage: + <pre> + void vAFunction( void ) + { + xTaskHandle xHandle; + + // Create a task, storing the handle. + xTaskCreate( vTaskCode, "NAME", STACK_SIZE, NULL, tskIDLE_PRIORITY, &xHandle ); + + // ... + + // Use the handle to obtain the priority of the created task. + // It was created with tskIDLE_PRIORITY, but may have changed + // it itself. + if( uxTaskPriorityGet( xHandle ) != tskIDLE_PRIORITY ) + { + // The task has changed it's priority. + } + + // ... + + // Is our priority higher than the created task? + if( uxTaskPriorityGet( xHandle ) < uxTaskPriorityGet( NULL ) ) + { + // Our priority (obtained using NULL handle) is higher. + } + } + </pre> + * \defgroup uxTaskPriorityGet uxTaskPriorityGet + * \ingroup TaskCtrl + */ +unsigned portBASE_TYPE uxTaskPriorityGet( xTaskHandle pxTask ) PRIVILEGED_FUNCTION; + +/** + * task. h + * <pre>void vTaskPrioritySet( xTaskHandle pxTask, unsigned portBASE_TYPE uxNewPriority );</pre> + * + * INCLUDE_vTaskPrioritySet must be defined as 1 for this function to be available. + * See the configuration section for more information. + * + * Set the priority of any task. + * + * A context switch will occur before the function returns if the priority + * being set is higher than the currently executing task. + * + * @param pxTask Handle to the task for which the priority is being set. + * Passing a NULL handle results in the priority of the calling task being set. + * + * @param uxNewPriority The priority to which the task will be set. + * + * Example usage: + <pre> + void vAFunction( void ) + { + xTaskHandle xHandle; + + // Create a task, storing the handle. + xTaskCreate( vTaskCode, "NAME", STACK_SIZE, NULL, tskIDLE_PRIORITY, &xHandle ); + + // ... + + // Use the handle to raise the priority of the created task. + vTaskPrioritySet( xHandle, tskIDLE_PRIORITY + 1 ); + + // ... + + // Use a NULL handle to raise our priority to the same value. + vTaskPrioritySet( NULL, tskIDLE_PRIORITY + 1 ); + } + </pre> + * \defgroup vTaskPrioritySet vTaskPrioritySet + * \ingroup TaskCtrl + */ +void vTaskPrioritySet( xTaskHandle pxTask, unsigned portBASE_TYPE uxNewPriority ) PRIVILEGED_FUNCTION; + +/** + * task. h + * <pre>void vTaskSuspend( xTaskHandle pxTaskToSuspend );</pre> + * + * INCLUDE_vTaskSuspend must be defined as 1 for this function to be available. + * See the configuration section for more information. + * + * Suspend any task. When suspended a task will never get any microcontroller + * processing time, no matter what its priority. + * + * Calls to vTaskSuspend are not accumulative - + * i.e. calling vTaskSuspend () twice on the same task still only requires one + * call to vTaskResume () to ready the suspended task. + * + * @param pxTaskToSuspend Handle to the task being suspended. Passing a NULL + * handle will cause the calling task to be suspended. + * + * Example usage: + <pre> + void vAFunction( void ) + { + xTaskHandle xHandle; + + // Create a task, storing the handle. + xTaskCreate( vTaskCode, "NAME", STACK_SIZE, NULL, tskIDLE_PRIORITY, &xHandle ); + + // ... + + // Use the handle to suspend the created task. + vTaskSuspend( xHandle ); + + // ... + + // The created task will not run during this period, unless + // another task calls vTaskResume( xHandle ). + + //... + + + // Suspend ourselves. + vTaskSuspend( NULL ); + + // We cannot get here unless another task calls vTaskResume + // with our handle as the parameter. + } + </pre> + * \defgroup vTaskSuspend vTaskSuspend + * \ingroup TaskCtrl + */ +void vTaskSuspend( xTaskHandle pxTaskToSuspend ) PRIVILEGED_FUNCTION; + +/** + * task. h + * <pre>void vTaskResume( xTaskHandle pxTaskToResume );</pre> + * + * INCLUDE_vTaskSuspend must be defined as 1 for this function to be available. + * See the configuration section for more information. + * + * Resumes a suspended task. + * + * A task that has been suspended by one of more calls to vTaskSuspend () + * will be made available for running again by a single call to + * vTaskResume (). + * + * @param pxTaskToResume Handle to the task being readied. + * + * Example usage: + <pre> + void vAFunction( void ) + { + xTaskHandle xHandle; + + // Create a task, storing the handle. + xTaskCreate( vTaskCode, "NAME", STACK_SIZE, NULL, tskIDLE_PRIORITY, &xHandle ); + + // ... + + // Use the handle to suspend the created task. + vTaskSuspend( xHandle ); + + // ... + + // The created task will not run during this period, unless + // another task calls vTaskResume( xHandle ). + + //... + + + // Resume the suspended task ourselves. + vTaskResume( xHandle ); + + // The created task will once again get microcontroller processing + // time in accordance with it priority within the system. + } + </pre> + * \defgroup vTaskResume vTaskResume + * \ingroup TaskCtrl + */ +void vTaskResume( xTaskHandle pxTaskToResume ) PRIVILEGED_FUNCTION; + +/** + * task. h + * <pre>void xTaskResumeFromISR( xTaskHandle pxTaskToResume );</pre> + * + * INCLUDE_xTaskResumeFromISR must be defined as 1 for this function to be + * available. See the configuration section for more information. + * + * An implementation of vTaskResume() that can be called from within an ISR. + * + * A task that has been suspended by one of more calls to vTaskSuspend () + * will be made available for running again by a single call to + * xTaskResumeFromISR (). + * + * @param pxTaskToResume Handle to the task being readied. + * + * \defgroup vTaskResumeFromISR vTaskResumeFromISR + * \ingroup TaskCtrl + */ +portBASE_TYPE xTaskResumeFromISR( xTaskHandle pxTaskToResume ) PRIVILEGED_FUNCTION; + +/*----------------------------------------------------------- + * SCHEDULER CONTROL + *----------------------------------------------------------*/ + +/** + * task. h + * <pre>void vTaskStartScheduler( void );</pre> + * + * Starts the real time kernel tick processing. After calling the kernel + * has control over which tasks are executed and when. This function + * does not return until an executing task calls vTaskEndScheduler (). + * + * At least one task should be created via a call to xTaskCreate () + * before calling vTaskStartScheduler (). The idle task is created + * automatically when the first application task is created. + * + * See the demo application file main.c for an example of creating + * tasks and starting the kernel. + * + * Example usage: + <pre> + void vAFunction( void ) + { + // Create at least one task before starting the kernel. + xTaskCreate( vTaskCode, "NAME", STACK_SIZE, NULL, tskIDLE_PRIORITY, NULL ); + + // Start the real time kernel with preemption. + vTaskStartScheduler (); + + // Will not get here unless a task calls vTaskEndScheduler () + } + </pre> + * + * \defgroup vTaskStartScheduler vTaskStartScheduler + * \ingroup SchedulerControl + */ +void vTaskStartScheduler( void ) PRIVILEGED_FUNCTION; + +/** + * task. h + * <pre>void vTaskEndScheduler( void );</pre> + * + * Stops the real time kernel tick. All created tasks will be automatically + * deleted and multitasking (either preemptive or cooperative) will + * stop. Execution then resumes from the point where vTaskStartScheduler () + * was called, as if vTaskStartScheduler () had just returned. + * + * See the demo application file main. c in the demo/PC directory for an + * example that uses vTaskEndScheduler (). + * + * vTaskEndScheduler () requires an exit function to be defined within the + * portable layer (see vPortEndScheduler () in port. c for the PC port). This + * performs hardware specific operations such as stopping the kernel tick. + * + * vTaskEndScheduler () will cause all of the resources allocated by the + * kernel to be freed - but will not free resources allocated by application + * tasks. + * + * Example usage: + <pre> + void vTaskCode( void * pvParameters ) + { + for( ;; ) + { + // Task code goes here. + + // At some point we want to end the real time kernel processing + // so call ... + vTaskEndScheduler (); + } + } + + void vAFunction( void ) + { + // Create at least one task before starting the kernel. + xTaskCreate( vTaskCode, "NAME", STACK_SIZE, NULL, tskIDLE_PRIORITY, NULL ); + + // Start the real time kernel with preemption. + vTaskStartScheduler (); + + // Will only get here when the vTaskCode () task has called + // vTaskEndScheduler (). When we get here we are back to single task + // execution. + } + </pre> + * + * \defgroup vTaskEndScheduler vTaskEndScheduler + * \ingroup SchedulerControl + */ +void vTaskEndScheduler( void ) PRIVILEGED_FUNCTION; + +/** + * task. h + * <pre>void vTaskSuspendAll( void );</pre> + * + * Suspends all real time kernel activity while keeping interrupts (including the + * kernel tick) enabled. + * + * After calling vTaskSuspendAll () the calling task will continue to execute + * without risk of being swapped out until a call to xTaskResumeAll () has been + * made. + * + * API functions that have the potential to cause a context switch (for example, + * vTaskDelayUntil(), xQueueSend(), etc.) must not be called while the scheduler + * is suspended. + * + * Example usage: + <pre> + void vTask1( void * pvParameters ) + { + for( ;; ) + { + // Task code goes here. + + // ... + + // At some point the task wants to perform a long operation during + // which it does not want to get swapped out. It cannot use + // taskENTER_CRITICAL ()/taskEXIT_CRITICAL () as the length of the + // operation may cause interrupts to be missed - including the + // ticks. + + // Prevent the real time kernel swapping out the task. + vTaskSuspendAll (); + + // Perform the operation here. There is no need to use critical + // sections as we have all the microcontroller processing time. + // During this time interrupts will still operate and the kernel + // tick count will be maintained. + + // ... + + // The operation is complete. Restart the kernel. + xTaskResumeAll (); + } + } + </pre> + * \defgroup vTaskSuspendAll vTaskSuspendAll + * \ingroup SchedulerControl + */ +void vTaskSuspendAll( void ) PRIVILEGED_FUNCTION; + +/** + * task. h + * <pre>char xTaskResumeAll( void );</pre> + * + * Resumes real time kernel activity following a call to vTaskSuspendAll (). + * After a call to vTaskSuspendAll () the kernel will take control of which + * task is executing at any time. + * + * @return If resuming the scheduler caused a context switch then pdTRUE is + * returned, otherwise pdFALSE is returned. + * + * Example usage: + <pre> + void vTask1( void * pvParameters ) + { + for( ;; ) + { + // Task code goes here. + + // ... + + // At some point the task wants to perform a long operation during + // which it does not want to get swapped out. It cannot use + // taskENTER_CRITICAL ()/taskEXIT_CRITICAL () as the length of the + // operation may cause interrupts to be missed - including the + // ticks. + + // Prevent the real time kernel swapping out the task. + vTaskSuspendAll (); + + // Perform the operation here. There is no need to use critical + // sections as we have all the microcontroller processing time. + // During this time interrupts will still operate and the real + // time kernel tick count will be maintained. + + // ... + + // The operation is complete. Restart the kernel. We want to force + // a context switch - but there is no point if resuming the scheduler + // caused a context switch already. + if( !xTaskResumeAll () ) + { + taskYIELD (); + } + } + } + </pre> + * \defgroup xTaskResumeAll xTaskResumeAll + * \ingroup SchedulerControl + */ +signed portBASE_TYPE xTaskResumeAll( void ) PRIVILEGED_FUNCTION; + +/** + * task. h + * <pre>signed portBASE_TYPE xTaskIsTaskSuspended( xTaskHandle xTask );</pre> + * + * Utility task that simply returns pdTRUE if the task referenced by xTask is + * currently in the Suspended state, or pdFALSE if the task referenced by xTask + * is in any other state. + * + */ +signed portBASE_TYPE xTaskIsTaskSuspended( xTaskHandle xTask ) PRIVILEGED_FUNCTION; + +/*----------------------------------------------------------- + * TASK UTILITIES + *----------------------------------------------------------*/ + +/** + * task. h + * <PRE>portTickType xTaskGetTickCount( void );</PRE> + * + * @return The count of ticks since vTaskStartScheduler was called. + * + * \page xTaskGetTickCount xTaskGetTickCount + * \ingroup TaskUtils + */ +portTickType xTaskGetTickCount( void ) PRIVILEGED_FUNCTION; + +/** + * task. h + * <PRE>portTickType xTaskGetTickCountFromISR( void );</PRE> + * + * @return The count of ticks since vTaskStartScheduler was called. + * + * This is a version of xTaskGetTickCount() that is safe to be called from an + * ISR - provided that portTickType is the natural word size of the + * microcontroller being used or interrupt nesting is either not supported or + * not being used. + * + * \page xTaskGetTickCount xTaskGetTickCount + * \ingroup TaskUtils + */ +portTickType xTaskGetTickCountFromISR( void ) PRIVILEGED_FUNCTION; + +/** + * task. h + * <PRE>unsigned short uxTaskGetNumberOfTasks( void );</PRE> + * + * @return The number of tasks that the real time kernel is currently managing. + * This includes all ready, blocked and suspended tasks. A task that + * has been deleted but not yet freed by the idle task will also be + * included in the count. + * + * \page uxTaskGetNumberOfTasks uxTaskGetNumberOfTasks + * \ingroup TaskUtils + */ +unsigned portBASE_TYPE uxTaskGetNumberOfTasks( void ) PRIVILEGED_FUNCTION; + +/** + * task. h + * <PRE>void vTaskList( char *pcWriteBuffer );</PRE> + * + * configUSE_TRACE_FACILITY must be defined as 1 for this function to be + * available. See the configuration section for more information. + * + * NOTE: This function will disable interrupts for its duration. It is + * not intended for normal application runtime use but as a debug aid. + * + * Lists all the current tasks, along with their current state and stack + * usage high water mark. + * + * Tasks are reported as blocked ('B'), ready ('R'), deleted ('D') or + * suspended ('S'). + * + * @param pcWriteBuffer A buffer into which the above mentioned details + * will be written, in ascii form. This buffer is assumed to be large + * enough to contain the generated report. Approximately 40 bytes per + * task should be sufficient. + * + * \page vTaskList vTaskList + * \ingroup TaskUtils + */ +void vTaskList( signed char *pcWriteBuffer ) PRIVILEGED_FUNCTION; + +/** + * task. h + * <PRE>void vTaskGetRunTimeStats( char *pcWriteBuffer );</PRE> + * + * configGENERATE_RUN_TIME_STATS must be defined as 1 for this function + * to be available. The application must also then provide definitions + * for portCONFIGURE_TIMER_FOR_RUN_TIME_STATS() and + * portGET_RUN_TIME_COUNTER_VALUE to configure a peripheral timer/counter + * and return the timers current count value respectively. The counter + * should be at least 10 times the frequency of the tick count. + * + * NOTE: This function will disable interrupts for its duration. It is + * not intended for normal application runtime use but as a debug aid. + * + * Setting configGENERATE_RUN_TIME_STATS to 1 will result in a total + * accumulated execution time being stored for each task. The resolution + * of the accumulated time value depends on the frequency of the timer + * configured by the portCONFIGURE_TIMER_FOR_RUN_TIME_STATS() macro. + * Calling vTaskGetRunTimeStats() writes the total execution time of each + * task into a buffer, both as an absolute count value and as a percentage + * of the total system execution time. + * + * @param pcWriteBuffer A buffer into which the execution times will be + * written, in ascii form. This buffer is assumed to be large enough to + * contain the generated report. Approximately 40 bytes per task should + * be sufficient. + * + * \page vTaskGetRunTimeStats vTaskGetRunTimeStats + * \ingroup TaskUtils + */ +void vTaskGetRunTimeStats( signed char *pcWriteBuffer ) PRIVILEGED_FUNCTION; + +/** + * task. h + * <PRE>void vTaskStartTrace( char * pcBuffer, unsigned portBASE_TYPE uxBufferSize );</PRE> + * + * Starts a real time kernel activity trace. The trace logs the identity of + * which task is running when. + * + * The trace file is stored in binary format. A separate DOS utility called + * convtrce.exe is used to convert this into a tab delimited text file which + * can be viewed and plotted in a spread sheet. + * + * @param pcBuffer The buffer into which the trace will be written. + * + * @param ulBufferSize The size of pcBuffer in bytes. The trace will continue + * until either the buffer in full, or ulTaskEndTrace () is called. + * + * \page vTaskStartTrace vTaskStartTrace + * \ingroup TaskUtils + */ +void vTaskStartTrace( signed char * pcBuffer, unsigned long ulBufferSize ) PRIVILEGED_FUNCTION; + +/** + * task. h + * <PRE>unsigned long ulTaskEndTrace( void );</PRE> + * + * Stops a kernel activity trace. See vTaskStartTrace (). + * + * @return The number of bytes that have been written into the trace buffer. + * + * \page usTaskEndTrace usTaskEndTrace + * \ingroup TaskUtils + */ +unsigned long ulTaskEndTrace( void ) PRIVILEGED_FUNCTION; + +/** + * task.h + * <PRE>unsigned portBASE_TYPE uxTaskGetStackHighWaterMark( xTaskHandle xTask );</PRE> + * + * INCLUDE_uxTaskGetStackHighWaterMark must be set to 1 in FreeRTOSConfig.h for + * this function to be available. + * + * Returns the high water mark of the stack associated with xTask. That is, + * the minimum free stack space there has been (in words, so on a 32 bit machine + * a value of 1 means 4 bytes) since the task started. The smaller the returned + * number the closer the task has come to overflowing its stack. + * + * @param xTask Handle of the task associated with the stack to be checked. + * Set xTask to NULL to check the stack of the calling task. + * + * @return The smallest amount of free stack space there has been (in bytes) + * since the task referenced by xTask was created. + */ +unsigned portBASE_TYPE uxTaskGetStackHighWaterMark( xTaskHandle xTask ) PRIVILEGED_FUNCTION; + +/* When using trace macros it is sometimes necessary to include tasks.h before +FreeRTOS.h. When this is done pdTASK_HOOK_CODE will not yet have been defined, +so the following two prototypes will cause a compilation error. This can be +fixed by simply guarding against the inclusion of these two prototypes unless +they are explicitly required by the configUSE_APPLICATION_TASK_TAG configuration +constant. */ +#ifdef configUSE_APPLICATION_TASK_TAG + #if configUSE_APPLICATION_TASK_TAG == 1 + /** + * task.h + * <pre>void vTaskSetApplicationTaskTag( xTaskHandle xTask, pdTASK_HOOK_CODE pxHookFunction );</pre> + * + * Sets pxHookFunction to be the task hook function used by the task xTask. + * Passing xTask as NULL has the effect of setting the calling tasks hook + * function. + */ + void vTaskSetApplicationTaskTag( xTaskHandle xTask, pdTASK_HOOK_CODE pxHookFunction ) PRIVILEGED_FUNCTION; + + /** + * task.h + * <pre>void xTaskGetApplicationTaskTag( xTaskHandle xTask );</pre> + * + * Returns the pxHookFunction value assigned to the task xTask. + */ + pdTASK_HOOK_CODE xTaskGetApplicationTaskTag( xTaskHandle xTask ) PRIVILEGED_FUNCTION; + #endif /* configUSE_APPLICATION_TASK_TAG ==1 */ +#endif /* ifdef configUSE_APPLICATION_TASK_TAG */ + +/** + * task.h + * <pre>portBASE_TYPE xTaskCallApplicationTaskHook( xTaskHandle xTask, pdTASK_HOOK_CODE pxHookFunction );</pre> + * + * Calls the hook function associated with xTask. Passing xTask as NULL has + * the effect of calling the Running tasks (the calling task) hook function. + * + * pvParameter is passed to the hook function for the task to interpret as it + * wants. + */ +portBASE_TYPE xTaskCallApplicationTaskHook( xTaskHandle xTask, void *pvParameter ) PRIVILEGED_FUNCTION; + + +/*----------------------------------------------------------- + * SCHEDULER INTERNALS AVAILABLE FOR PORTING PURPOSES + *----------------------------------------------------------*/ + +/* + * THIS FUNCTION MUST NOT BE USED FROM APPLICATION CODE. IT IS ONLY + * INTENDED FOR USE WHEN IMPLEMENTING A PORT OF THE SCHEDULER AND IS + * AN INTERFACE WHICH IS FOR THE EXCLUSIVE USE OF THE SCHEDULER. + * + * Called from the real time kernel tick (either preemptive or cooperative), + * this increments the tick count and checks if any tasks that are blocked + * for a finite period required removing from a blocked list and placing on + * a ready list. + */ +void vTaskIncrementTick( void ) PRIVILEGED_FUNCTION; + +/* + * THIS FUNCTION MUST NOT BE USED FROM APPLICATION CODE. IT IS AN + * INTERFACE WHICH IS FOR THE EXCLUSIVE USE OF THE SCHEDULER. + * + * THIS FUNCTION MUST BE CALLED WITH INTERRUPTS DISABLED. + * + * Removes the calling task from the ready list and places it both + * on the list of tasks waiting for a particular event, and the + * list of delayed tasks. The task will be removed from both lists + * and replaced on the ready list should either the event occur (and + * there be no higher priority tasks waiting on the same event) or + * the delay period expires. + * + * @param pxEventList The list containing tasks that are blocked waiting + * for the event to occur. + * + * @param xTicksToWait The maximum amount of time that the task should wait + * for the event to occur. This is specified in kernel ticks,the constant + * portTICK_RATE_MS can be used to convert kernel ticks into a real time + * period. + */ +void vTaskPlaceOnEventList( const xList * const pxEventList, portTickType xTicksToWait ) PRIVILEGED_FUNCTION; + +/* + * THIS FUNCTION MUST NOT BE USED FROM APPLICATION CODE. IT IS AN + * INTERFACE WHICH IS FOR THE EXCLUSIVE USE OF THE SCHEDULER. + * + * THIS FUNCTION MUST BE CALLED WITH INTERRUPTS DISABLED. + * + * This function performs nearly the same function as vTaskPlaceOnEventList(). + * The difference being that this function does not permit tasks to block + * indefinitely, whereas vTaskPlaceOnEventList() does. + * + * @return pdTRUE if the task being removed has a higher priority than the task + * making the call, otherwise pdFALSE. + */ +void vTaskPlaceOnEventListRestricted( const xList * const pxEventList, portTickType xTicksToWait ) PRIVILEGED_FUNCTION; + +/* + * THIS FUNCTION MUST NOT BE USED FROM APPLICATION CODE. IT IS AN + * INTERFACE WHICH IS FOR THE EXCLUSIVE USE OF THE SCHEDULER. + * + * THIS FUNCTION MUST BE CALLED WITH INTERRUPTS DISABLED. + * + * Removes a task from both the specified event list and the list of blocked + * tasks, and places it on a ready queue. + * + * xTaskRemoveFromEventList () will be called if either an event occurs to + * unblock a task, or the block timeout period expires. + * + * @return pdTRUE if the task being removed has a higher priority than the task + * making the call, otherwise pdFALSE. + */ +signed portBASE_TYPE xTaskRemoveFromEventList( const xList * const pxEventList ) PRIVILEGED_FUNCTION; + +/* + * THIS FUNCTION MUST NOT BE USED FROM APPLICATION CODE. IT IS AN + * INTERFACE WHICH IS FOR THE EXCLUSIVE USE OF THE SCHEDULER. + * + * INCLUDE_vTaskCleanUpResources and INCLUDE_vTaskSuspend must be defined as 1 + * for this function to be available. + * See the configuration section for more information. + * + * Empties the ready and delayed queues of task control blocks, freeing the + * memory allocated for the task control block and task stacks as it goes. + */ +void vTaskCleanUpResources( void ) PRIVILEGED_FUNCTION; + +/* + * THIS FUNCTION MUST NOT BE USED FROM APPLICATION CODE. IT IS ONLY + * INTENDED FOR USE WHEN IMPLEMENTING A PORT OF THE SCHEDULER AND IS + * AN INTERFACE WHICH IS FOR THE EXCLUSIVE USE OF THE SCHEDULER. + * + * Sets the pointer to the current TCB to the TCB of the highest priority task + * that is ready to run. + */ +void vTaskSwitchContext( void ) PRIVILEGED_FUNCTION; + +/* + * Return the handle of the calling task. + */ +xTaskHandle xTaskGetCurrentTaskHandle( void ) PRIVILEGED_FUNCTION; + +/* + * Capture the current time status for future reference. + */ +void vTaskSetTimeOutState( xTimeOutType * const pxTimeOut ) PRIVILEGED_FUNCTION; + +/* + * Compare the time status now with that previously captured to see if the + * timeout has expired. + */ +portBASE_TYPE xTaskCheckForTimeOut( xTimeOutType * const pxTimeOut, portTickType * const pxTicksToWait ) PRIVILEGED_FUNCTION; + +/* + * Shortcut used by the queue implementation to prevent unnecessary call to + * taskYIELD(); + */ +void vTaskMissedYield( void ) PRIVILEGED_FUNCTION; + +/* + * Returns the scheduler state as taskSCHEDULER_RUNNING, + * taskSCHEDULER_NOT_STARTED or taskSCHEDULER_SUSPENDED. + */ +portBASE_TYPE xTaskGetSchedulerState( void ) PRIVILEGED_FUNCTION; + +/* + * Raises the priority of the mutex holder to that of the calling task should + * the mutex holder have a priority less than the calling task. + */ +void vTaskPriorityInherit( xTaskHandle * const pxMutexHolder ) PRIVILEGED_FUNCTION; + +/* + * Set the priority of a task back to its proper priority in the case that it + * inherited a higher priority while it was holding a semaphore. + */ +void vTaskPriorityDisinherit( xTaskHandle * const pxMutexHolder ) PRIVILEGED_FUNCTION; + +/* + * Generic version of the task creation function which is in turn called by the + * xTaskCreate() and xTaskCreateRestricted() macros. + */ +signed portBASE_TYPE xTaskGenericCreate( pdTASK_CODE pxTaskCode, const signed char * const pcName, unsigned short usStackDepth, void *pvParameters, unsigned portBASE_TYPE uxPriority, xTaskHandle *pxCreatedTask, portSTACK_TYPE *puxStackBuffer, const xMemoryRegion * const xRegions ) PRIVILEGED_FUNCTION; + +#ifdef __cplusplus +} +#endif +#endif /* TASK_H */ + + + diff --git a/FreeRTOSWithTraces/FreeRTOS_include/timers.h b/FreeRTOSWithTraces/FreeRTOS_include/timers.h new file mode 100644 index 0000000000000000000000000000000000000000..3d78c0ae035a58d9677d80a5432212ca81d9ec21 --- /dev/null +++ b/FreeRTOSWithTraces/FreeRTOS_include/timers.h @@ -0,0 +1,936 @@ +/* + FreeRTOS V7.0.1 - Copyright (C) 2011 Real Time Engineers Ltd. + + + FreeRTOS supports many tools and architectures. V7.0.0 is sponsored by: + Atollic AB - Atollic provides professional embedded systems development + tools for C/C++ development, code analysis and test automation. + See http://www.atollic.com + + + *************************************************************************** + * * + * FreeRTOS tutorial books are available in pdf and paperback. * + * Complete, revised, and edited pdf reference manuals are also * + * available. * + * * + * Purchasing FreeRTOS documentation will not only help you, by * + * ensuring you get running as quickly as possible and with an * + * in-depth knowledge of how to use FreeRTOS, it will also help * + * the FreeRTOS project to continue with its mission of providing * + * professional grade, cross platform, de facto standard solutions * + * for microcontrollers - completely free of charge! * + * * + * >>> See http://www.FreeRTOS.org/Documentation for details. <<< * + * * + * Thank you for using FreeRTOS, and thank you for your support! * + * * + *************************************************************************** + + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation AND MODIFIED BY the FreeRTOS exception. + >>>NOTE<<< The modification to the GPL is included to allow you to + distribute a combined work that includes FreeRTOS without being obliged to + provide the source code for proprietary components outside of the FreeRTOS + kernel. FreeRTOS is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + more details. You should have received a copy of the GNU General Public + License and the FreeRTOS license exception along with FreeRTOS; if not it + can be viewed here: http://www.freertos.org/a00114.html and also obtained + by writing to Richard Barry, contact details for whom are available on the + FreeRTOS WEB site. + + 1 tab == 4 spaces! + + http://www.FreeRTOS.org - Documentation, latest information, license and + contact details. + + http://www.SafeRTOS.com - A version that is certified for use in safety + critical systems. + + http://www.OpenRTOS.com - Commercial support, development, porting, + licensing and training services. +*/ + + +#ifndef TIMERS_H +#define TIMERS_H + +#ifndef INC_FREERTOS_H + #error "include FreeRTOS.h must appear in source files before include timers.h" +#endif + +#include "portable.h" +#include "list.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* IDs for commands that can be sent/received on the timer queue. These are to +be used solely through the macros that make up the public software timer API, +as defined below. */ +#define tmrCOMMAND_START 0 +#define tmrCOMMAND_STOP 1 +#define tmrCOMMAND_CHANGE_PERIOD 2 +#define tmrCOMMAND_DELETE 3 + +/*----------------------------------------------------------- + * MACROS AND DEFINITIONS + *----------------------------------------------------------*/ + + /** + * Type by which software timers are referenced. For example, a call to + * xTimerCreate() returns an xTimerHandle variable that can then be used to + * reference the subject timer in calls to other software timer API functions + * (for example, xTimerStart(), xTimerReset(), etc.). + */ +typedef void * xTimerHandle; + +/* Define the prototype to which timer callback functions must conform. */ +typedef void (*tmrTIMER_CALLBACK)( xTimerHandle xTimer ); + +/** + * xTimerHandle xTimerCreate( const signed char *pcTimerName, + * portTickType xTimerPeriod, + * unsigned portBASE_TYPE uxAutoReload, + * void * pvTimerID, + * tmrTIMER_CALLBACK pxCallbackFunction ); + * + * Creates a new software timer instance. This allocates the storage required + * by the new timer, initialises the new timers internal state, and returns a + * handle by which the new timer can be referenced. + * + * Timers are created in the dormant state. The xTimerStart(), xTimerReset(), + * xTimerStartFromISR(), xTimerResetFromISR(), xTimerChangePeriod() and + * xTimerChangePeriodFromISR() API functions can all be used to transition a timer into the + * active state. + * + * @param pcTimerName A text name that is assigned to the timer. This is done + * purely to assist debugging. The kernel itself only ever references a timer by + * its handle, and never by its name. + * + * @param xTimerPeriod The timer period. The time is defined in tick periods so + * the constant portTICK_RATE_MS can be used to convert a time that has been + * specified in milliseconds. For example, if the timer must expire after 100 + * ticks, then xTimerPeriod should be set to 100. Alternatively, if the timer + * must expire after 500ms, then xPeriod can be set to ( 500 / portTICK_RATE_MS ) + * provided configTICK_RATE_HZ is less than or equal to 1000. + * + * @param uxAutoReload If uxAutoReload is set to pdTRUE then the timer will + * expire repeatedly with a frequency set by the xTimerPeriod parameter. If + * uxAutoReload is set to pdFALSE then the timer will be a one-shot timer and + * enter the dormant state after it expires. + * + * @param pvTimerID An identifier that is assigned to the timer being created. + * Typically this would be used in the timer callback function to identify which + * timer expired when the same callback function is assigned to more than one + * timer. + * + * @param pxCallbackFunction The function to call when the timer expires. + * Callback functions must have the prototype defined by tmrTIMER_CALLBACK, + * which is "void vCallbackFunction( xTIMER *xTimer );". + * + * @return If the timer is successfully create then a handle to the newly + * created timer is returned. If the timer cannot be created (because either + * there is insufficient FreeRTOS heap remaining to allocate the timer + * structures, or the timer period was set to 0) then 0 is returned. + * + * Example usage: + * + * + * #define NUM_TIMERS 5 + * + * // An array to hold handles to the created timers. + * xTimerHandle xTimers[ NUM_TIMERS ]; + * + * // An array to hold a count of the number of times each timer expires. + * long lExpireCounters[ NUM_TIMERS ] = { 0 }; + * + * // Define a callback function that will be used by multiple timer instances. + * // The callback function does nothing but count the number of times the + * // associated timer expires, and stop the timer once the timer has expired + * // 10 times. + * void vTimerCallback( xTIMER *pxTimer ) + * { + * long lArrayIndex; + * const long xMaxExpiryCountBeforeStopping = 10; + * + * // Optionally do something if the pxTimer parameter is NULL. + * configASSERT( pxTimer ); + * + * // Which timer expired? + * lArrayIndex = ( long ) pvTimerGetTimerID( pxTimer ); + * + * // Increment the number of times that pxTimer has expired. + * lExpireCounters[ lArrayIndex ] += 1; + * + * // If the timer has expired 10 times then stop it from running. + * if( lExpireCounters[ lArrayIndex ] == xMaxExpiryCountBeforeStopping ) + * { + * // Do not use a block time if calling a timer API function from a + * // timer callback function, as doing so could cause a deadlock! + * xTimerStop( pxTimer, 0 ); + * } + * } + * + * void main( void ) + * { + * long x; + * + * // Create then start some timers. Starting the timers before the scheduler + * // has been started means the timers will start running immediately that + * // the scheduler starts. + * for( x = 0; x < NUM_TIMERS; x++ ) + * { + * xTimers[ x ] = xTimerCreate( "Timer", // Just a text name, not used by the kernel. + * ( 100 * x ), // The timer period in ticks. + * pdTRUE, // The timers will auto-reload themselves when they expire. + * ( void * ) x, // Assign each timer a unique id equal to its array index. + * vTimerCallback // Each timer calls the same callback when it expires. + * ); + * + * if( xTimers[ x ] == NULL ) + * { + * // The timer was not created. + * } + * else + * { + * // Start the timer. No block time is specified, and even if one was + * // it would be ignored because the scheduler has not yet been + * // started. + * if( xTimerStart( xTimers[ x ], 0 ) != pdPASS ) + * { + * // The timer could not be set into the Active state. + * } + * } + * } + * + * // ... + * // Create tasks here. + * // ... + * + * // Starting the scheduler will start the timers running as they have already + * // been set into the active state. + * xTaskStartScheduler(); + * + * // Should not reach here. + * for( ;; ); + * } + */ +xTimerHandle xTimerCreate( const signed char *pcTimerName, portTickType xTimerPeriodInTicks, unsigned portBASE_TYPE uxAutoReload, void * pvTimerID, tmrTIMER_CALLBACK pxCallbackFunction ) PRIVILEGED_FUNCTION; + +/** + * void *pvTimerGetTimerID( xTimerHandle xTimer ); + * + * Returns the ID assigned to the timer. + * + * IDs are assigned to timers using the pvTimerID parameter of the call to + * xTimerCreated() that was used to create the timer. + * + * If the same callback function is assigned to multiple timers then the timer + * ID can be used within the callback function to identify which timer actually + * expired. + * + * @param xTimer The timer being queried. + * + * @return The ID assigned to the timer being queried. + * + * Example usage: + * + * See the xTimerCreate() API function example usage scenario. + */ +void *pvTimerGetTimerID( xTimerHandle xTimer ) PRIVILEGED_FUNCTION; + +/** + * portBASE_TYPE xTimerIsTimerActive( xTimerHandle xTimer ); + * + * Queries a timer to see if it is active or dormant. + * + * A timer will be dormant if: + * 1) It has been created but not started, or + * 2) It is an expired on-shot timer that has not been restarted. + * + * Timers are created in the dormant state. The xTimerStart(), xTimerReset(), + * xTimerStartFromISR(), xTimerResetFromISR(), xTimerChangePeriod() and + * xTimerChangePeriodFromISR() API functions can all be used to transition a timer into the + * active state. + * + * @param xTimer The timer being queried. + * + * @return pdFALSE will be returned if the timer is dormant. A value other than + * pdFALSE will be returned if the timer is active. + * + * Example usage: + * + * // This function assumes xTimer has already been created. + * void vAFunction( xTimerHandle xTimer ) + * { + * if( xTimerIsTimerActive( xTimer ) != pdFALSE ) // or more simply and equivalently "if( xTimerIsTimerActive( xTimer ) )" + * { + * // xTimer is active, do something. + * } + * else + * { + * // xTimer is not active, do something else. + * } + * } + */ +portBASE_TYPE xTimerIsTimerActive( xTimerHandle xTimer ) PRIVILEGED_FUNCTION; + +/** + * portBASE_TYPE xTimerStart( xTimerHandle xTimer, portTickType xBlockTime ); + * + * Timer functionality is provided by a timer service/daemon task. Many of the + * public FreeRTOS timer API functions send commands to the timer service task + * though a queue called the timer command queue. The timer command queue is + * private to the kernel itself and is not directly accessible to application + * code. The length of the timer command queue is set by the + * configTIMER_QUEUE_LENGTH configuration constant. + * + * xTimerStart() starts a timer that was previously created using the + * xTimerCreate() API function. If the timer had already been started and was + * already in the active state, then xTimerStart() has equivalent functionality + * to the xTimerReset() API function. + * + * Starting a timer ensures the timer is in the active state. If the timer + * is not stopped, deleted, or reset in the mean time, the callback function + * associated with the timer will get called 'n' ticks after xTimerStart() was + * called, where 'n' is the timers defined period. + * + * It is valid to call xTimerStart() before the scheduler has been started, but + * when this is done the timer will not actually start until the scheduler is + * started, and the timers expiry time will be relative to when the scheduler is + * started, not relative to when xTimerStart() was called. + * + * The configUSE_TIMERS configuration constant must be set to 1 for xTimerStart() + * to be available. + * + * @param xTimer The handle of the timer being started/restarted. + * + * @param xBlockTime Specifies the time, in ticks, that the calling task should + * be held in the Blocked state to wait for the start command to be successfully + * sent to the timer command queue, should the queue already be full when + * xTimerStart() was called. xBlockTime is ignored if xTimerStart() is called + * before the scheduler is started. + * + * @return pdFAIL will be returned if the start command could not be sent to + * the timer command queue even after xBlockTime ticks had passed. pdPASS will + * be returned if the command was successfully sent to the timer command queue. + * When the command is actually processed will depend on the priority of the + * timer service/daemon task relative to other tasks in the system, although the + * timers expiry time is relative to when xTimerStart() is actually called. The + * timer service/daemon task priority is set by the configTIMER_TASK_PRIORITY + * configuration constant. + * + * Example usage: + * + * See the xTimerCreate() API function example usage scenario. + * + */ +#define xTimerStart( xTimer, xBlockTime ) xTimerGenericCommand( ( xTimer ), tmrCOMMAND_START, ( xTaskGetTickCount() ), NULL, ( xBlockTime ) ) + +/** + * portBASE_TYPE xTimerStop( xTimerHandle xTimer, portTickType xBlockTime ); + * + * Timer functionality is provided by a timer service/daemon task. Many of the + * public FreeRTOS timer API functions send commands to the timer service task + * though a queue called the timer command queue. The timer command queue is + * private to the kernel itself and is not directly accessible to application + * code. The length of the timer command queue is set by the + * configTIMER_QUEUE_LENGTH configuration constant. + * + * xTimerStop() stops a timer that was previously started using either of the + * The xTimerStart(), xTimerReset(), xTimerStartFromISR(), xTimerResetFromISR(), + * xTimerChangePeriod() or xTimerChangePeriodFromISR() API functions. + * + * Stopping a timer ensures the timer is not in the active state. + * + * The configUSE_TIMERS configuration constant must be set to 1 for xTimerStop() + * to be available. + * + * @param xTimer The handle of the timer being stopped. + * + * @param xBlockTime Specifies the time, in ticks, that the calling task should + * be held in the Blocked state to wait for the stop command to be successfully + * sent to the timer command queue, should the queue already be full when + * xTimerStop() was called. xBlockTime is ignored if xTimerStop() is called + * before the scheduler is started. + * + * @return pdFAIL will be returned if the stop command could not be sent to + * the timer command queue even after xBlockTime ticks had passed. pdPASS will + * be returned if the command was successfully sent to the timer command queue. + * When the command is actually processed will depend on the priority of the + * timer service/daemon task relative to other tasks in the system. The timer + * service/daemon task priority is set by the configTIMER_TASK_PRIORITY + * configuration constant. + * + * Example usage: + * + * See the xTimerCreate() API function example usage scenario. + * + */ +#define xTimerStop( xTimer, xBlockTime ) xTimerGenericCommand( ( xTimer ), tmrCOMMAND_STOP, 0U, NULL, ( xBlockTime ) ) + +/** + * portBASE_TYPE xTimerChangePeriod( xTimerHandle xTimer, + * portTickType xNewPeriod, + * portTickType xBlockTime ); + * + * Timer functionality is provided by a timer service/daemon task. Many of the + * public FreeRTOS timer API functions send commands to the timer service task + * though a queue called the timer command queue. The timer command queue is + * private to the kernel itself and is not directly accessible to application + * code. The length of the timer command queue is set by the + * configTIMER_QUEUE_LENGTH configuration constant. + * + * xTimerChangePeriod() changes the period of a timer that was previously + * created using the xTimerCreate() API function. + * + * xTimerChangePeriod() can be called to change the period of an active or + * dormant state timer. + * + * The configUSE_TIMERS configuration constant must be set to 1 for + * xTimerChangePeriod() to be available. + * + * @param xTimer The handle of the timer that is having its period changed. + * + * @param xNewPeriod The new period for xTimer. Timer periods are specified in + * tick periods, so the constant portTICK_RATE_MS can be used to convert a time + * that has been specified in milliseconds. For example, if the timer must + * expire after 100 ticks, then xNewPeriod should be set to 100. Alternatively, + * if the timer must expire after 500ms, then xNewPeriod can be set to + * ( 500 / portTICK_RATE_MS ) provided configTICK_RATE_HZ is less than + * or equal to 1000. + * + * @param xBlockTime Specifies the time, in ticks, that the calling task should + * be held in the Blocked state to wait for the change period command to be + * successfully sent to the timer command queue, should the queue already be + * full when xTimerChangePeriod() was called. xBlockTime is ignored if + * xTimerChangePeriod() is called before the scheduler is started. + * + * @return pdFAIL will be returned if the change period command could not be + * sent to the timer command queue even after xBlockTime ticks had passed. + * pdPASS will be returned if the command was successfully sent to the timer + * command queue. When the command is actually processed will depend on the + * priority of the timer service/daemon task relative to other tasks in the + * system. The timer service/daemon task priority is set by the + * configTIMER_TASK_PRIORITY configuration constant. + * + * Example usage: + * + * // This function assumes xTimer has already been created. If the timer + * // referenced by xTimer is already active when it is called, then the timer + * // is deleted. If the timer referenced by xTimer is not active when it is + * // called, then the period of the timer is set to 500ms and the timer is + * // started. + * void vAFunction( xTimerHandle xTimer ) + * { + * if( xTimerIsTimerActive( xTimer ) != pdFALSE ) // or more simply and equivalently "if( xTimerIsTimerActive( xTimer ) )" + * { + * // xTimer is already active - delete it. + * xTimerDelete( xTimer ); + * } + * else + * { + * // xTimer is not active, change its period to 500ms. This will also + * // cause the timer to start. Block for a maximum of 100 ticks if the + * // change period command cannot immediately be sent to the timer + * // command queue. + * if( xTimerChangePeriod( xTimer, 500 / portTICK_RATE_MS, 100 ) == pdPASS ) + * { + * // The command was successfully sent. + * } + * else + * { + * // The command could not be sent, even after waiting for 100 ticks + * // to pass. Take appropriate action here. + * } + * } + * } + */ + #define xTimerChangePeriod( xTimer, xNewPeriod, xBlockTime ) xTimerGenericCommand( ( xTimer ), tmrCOMMAND_CHANGE_PERIOD, ( xNewPeriod ), NULL, ( xBlockTime ) ) + +/** + * portBASE_TYPE xTimerDelete( xTimerHandle xTimer, portTickType xBlockTime ); + * + * Timer functionality is provided by a timer service/daemon task. Many of the + * public FreeRTOS timer API functions send commands to the timer service task + * though a queue called the timer command queue. The timer command queue is + * private to the kernel itself and is not directly accessible to application + * code. The length of the timer command queue is set by the + * configTIMER_QUEUE_LENGTH configuration constant. + * + * xTimerDelete() deletes a timer that was previously created using the + * xTimerCreate() API function. + * + * The configUSE_TIMERS configuration constant must be set to 1 for + * xTimerDelete() to be available. + * + * @param xTimer The handle of the timer being deleted. + * + * @param xBlockTime Specifies the time, in ticks, that the calling task should + * be held in the Blocked state to wait for the delete command to be + * successfully sent to the timer command queue, should the queue already be + * full when xTimerDelete() was called. xBlockTime is ignored if xTimerDelete() + * is called before the scheduler is started. + * + * @return pdFAIL will be returned if the delete command could not be sent to + * the timer command queue even after xBlockTime ticks had passed. pdPASS will + * be returned if the command was successfully sent to the timer command queue. + * When the command is actually processed will depend on the priority of the + * timer service/daemon task relative to other tasks in the system. The timer + * service/daemon task priority is set by the configTIMER_TASK_PRIORITY + * configuration constant. + * + * Example usage: + * + * See the xTimerChangePeriod() API function example usage scenario. + */ +#define xTimerDelete( xTimer, xBlockTime ) xTimerGenericCommand( ( xTimer ), tmrCOMMAND_DELETE, 0U, NULL, ( xBlockTime ) ) + +/** + * portBASE_TYPE xTimerReset( xTimerHandle xTimer, portTickType xBlockTime ); + * + * Timer functionality is provided by a timer service/daemon task. Many of the + * public FreeRTOS timer API functions send commands to the timer service task + * though a queue called the timer command queue. The timer command queue is + * private to the kernel itself and is not directly accessible to application + * code. The length of the timer command queue is set by the + * configTIMER_QUEUE_LENGTH configuration constant. + * + * xTimerReset() re-starts a timer that was previously created using the + * xTimerCreate() API function. If the timer had already been started and was + * already in the active state, then xTimerReset() will cause the timer to + * re-evaluate its expiry time so that it is relative to when xTimerReset() was + * called. If the timer was in the dormant state then xTimerReset() has + * equivalent functionality to the xTimerStart() API function. + * + * Resetting a timer ensures the timer is in the active state. If the timer + * is not stopped, deleted, or reset in the mean time, the callback function + * associated with the timer will get called 'n' ticks after xTimerReset() was + * called, where 'n' is the timers defined period. + * + * It is valid to call xTimerReset() before the scheduler has been started, but + * when this is done the timer will not actually start until the scheduler is + * started, and the timers expiry time will be relative to when the scheduler is + * started, not relative to when xTimerReset() was called. + * + * The configUSE_TIMERS configuration constant must be set to 1 for xTimerReset() + * to be available. + * + * @param xTimer The handle of the timer being reset/started/restarted. + * + * @param xBlockTime Specifies the time, in ticks, that the calling task should + * be held in the Blocked state to wait for the reset command to be successfully + * sent to the timer command queue, should the queue already be full when + * xTimerReset() was called. xBlockTime is ignored if xTimerReset() is called + * before the scheduler is started. + * + * @return pdFAIL will be returned if the reset command could not be sent to + * the timer command queue even after xBlockTime ticks had passed. pdPASS will + * be returned if the command was successfully sent to the timer command queue. + * When the command is actually processed will depend on the priority of the + * timer service/daemon task relative to other tasks in the system, although the + * timers expiry time is relative to when xTimerStart() is actually called. The + * timer service/daemon task priority is set by the configTIMER_TASK_PRIORITY + * configuration constant. + * + * Example usage: + * + * // When a key is pressed, an LCD back-light is switched on. If 5 seconds pass + * // without a key being pressed, then the LCD back-light is switched off. In + * // this case, the timer is a one-shot timer. + * + * xTimerHandle xBacklightTimer = NULL; + * + * // The callback function assigned to the one-shot timer. In this case the + * // parameter is not used. + * void vBacklightTimerCallback( xTIMER *pxTimer ) + * { + * // The timer expired, therefore 5 seconds must have passed since a key + * // was pressed. Switch off the LCD back-light. + * vSetBacklightState( BACKLIGHT_OFF ); + * } + * + * // The key press event handler. + * void vKeyPressEventHandler( char cKey ) + * { + * // Ensure the LCD back-light is on, then reset the timer that is + * // responsible for turning the back-light off after 5 seconds of + * // key inactivity. Wait 10 ticks for the command to be successfully sent + * // if it cannot be sent immediately. + * vSetBacklightState( BACKLIGHT_ON ); + * if( xTimerReset( xBacklightTimer, 100 ) != pdPASS ) + * { + * // The reset command was not executed successfully. Take appropriate + * // action here. + * } + * + * // Perform the rest of the key processing here. + * } + * + * void main( void ) + * { + * long x; + * + * // Create then start the one-shot timer that is responsible for turning + * // the back-light off if no keys are pressed within a 5 second period. + * xBacklightTimer = xTimerCreate( "BacklightTimer", // Just a text name, not used by the kernel. + * ( 5000 / portTICK_RATE_MS), // The timer period in ticks. + * pdFALSE, // The timer is a one-shot timer. + * 0, // The id is not used by the callback so can take any value. + * vBacklightTimerCallback // The callback function that switches the LCD back-light off. + * ); + * + * if( xBacklightTimer == NULL ) + * { + * // The timer was not created. + * } + * else + * { + * // Start the timer. No block time is specified, and even if one was + * // it would be ignored because the scheduler has not yet been + * // started. + * if( xTimerStart( xBacklightTimer, 0 ) != pdPASS ) + * { + * // The timer could not be set into the Active state. + * } + * } + * + * // ... + * // Create tasks here. + * // ... + * + * // Starting the scheduler will start the timer running as it has already + * // been set into the active state. + * xTaskStartScheduler(); + * + * // Should not reach here. + * for( ;; ); + * } + */ +#define xTimerReset( xTimer, xBlockTime ) xTimerGenericCommand( ( xTimer ), tmrCOMMAND_START, ( xTaskGetTickCount() ), NULL, ( xBlockTime ) ) + +/** + * portBASE_TYPE xTimerStartFromISR( xTimerHandle xTimer, + * portBASE_TYPE *pxHigherPriorityTaskWoken ); + * + * A version of xTimerStart() that can be called from an interrupt service + * routine. + * + * @param xTimer The handle of the timer being started/restarted. + * + * @param pxHigherPriorityTaskWoken The timer service/daemon task spends most + * of its time in the Blocked state, waiting for messages to arrive on the timer + * command queue. Calling xTimerStartFromISR() writes a message to the timer + * command queue, so has the potential to transition the timer service/daemon + * task out of the Blocked state. If calling xTimerStartFromISR() causes the + * timer service/daemon task to leave the Blocked state, and the timer service/ + * daemon task has a priority equal to or greater than the currently executing + * task (the task that was interrupted), then *pxHigherPriorityTaskWoken will + * get set to pdTRUE internally within the xTimerStartFromISR() function. If + * xTimerStartFromISR() sets this value to pdTRUE then a context switch should + * be performed before the interrupt exits. + * + * @return pdFAIL will be returned if the start command could not be sent to + * the timer command queue. pdPASS will be returned if the command was + * successfully sent to the timer command queue. When the command is actually + * processed will depend on the priority of the timer service/daemon task + * relative to other tasks in the system, although the timers expiry time is + * relative to when xTimerStartFromISR() is actually called. The timer service/daemon + * task priority is set by the configTIMER_TASK_PRIORITY configuration constant. + * + * Example usage: + * + * // This scenario assumes xBacklightTimer has already been created. When a + * // key is pressed, an LCD back-light is switched on. If 5 seconds pass + * // without a key being pressed, then the LCD back-light is switched off. In + * // this case, the timer is a one-shot timer, and unlike the example given for + * // the xTimerReset() function, the key press event handler is an interrupt + * // service routine. + * + * // The callback function assigned to the one-shot timer. In this case the + * // parameter is not used. + * void vBacklightTimerCallback( xTIMER *pxTimer ) + * { + * // The timer expired, therefore 5 seconds must have passed since a key + * // was pressed. Switch off the LCD back-light. + * vSetBacklightState( BACKLIGHT_OFF ); + * } + * + * // The key press interrupt service routine. + * void vKeyPressEventInterruptHandler( void ) + * { + * portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE; + * + * // Ensure the LCD back-light is on, then restart the timer that is + * // responsible for turning the back-light off after 5 seconds of + * // key inactivity. This is an interrupt service routine so can only + * // call FreeRTOS API functions that end in "FromISR". + * vSetBacklightState( BACKLIGHT_ON ); + * + * // xTimerStartFromISR() or xTimerResetFromISR() could be called here + * // as both cause the timer to re-calculate its expiry time. + * // xHigherPriorityTaskWoken was initialised to pdFALSE when it was + * // declared (in this function). + * if( xTimerStartFromISR( xBacklightTimer, &xHigherPriorityTaskWoken ) != pdPASS ) + * { + * // The start command was not executed successfully. Take appropriate + * // action here. + * } + * + * // Perform the rest of the key processing here. + * + * // If xHigherPriorityTaskWoken equals pdTRUE, then a context switch + * // should be performed. The syntax required to perform a context switch + * // from inside an ISR varies from port to port, and from compiler to + * // compiler. Inspect the demos for the port you are using to find the + * // actual syntax required. + * if( xHigherPriorityTaskWoken != pdFALSE ) + * { + * // Call the interrupt safe yield function here (actual function + * // depends on the FreeRTOS port being used. + * } + * } + */ +#define xTimerStartFromISR( xTimer, pxHigherPriorityTaskWoken ) xTimerGenericCommand( ( xTimer ), tmrCOMMAND_START, ( xTaskGetTickCountFromISR() ), ( pxHigherPriorityTaskWoken ), 0U ) + +/** + * portBASE_TYPE xTimerStopFromISR( xTimerHandle xTimer, + * portBASE_TYPE *pxHigherPriorityTaskWoken ); + * + * A version of xTimerStop() that can be called from an interrupt service + * routine. + * + * @param xTimer The handle of the timer being stopped. + * + * @param pxHigherPriorityTaskWoken The timer service/daemon task spends most + * of its time in the Blocked state, waiting for messages to arrive on the timer + * command queue. Calling xTimerStopFromISR() writes a message to the timer + * command queue, so has the potential to transition the timer service/daemon + * task out of the Blocked state. If calling xTimerStopFromISR() causes the + * timer service/daemon task to leave the Blocked state, and the timer service/ + * daemon task has a priority equal to or greater than the currently executing + * task (the task that was interrupted), then *pxHigherPriorityTaskWoken will + * get set to pdTRUE internally within the xTimerStopFromISR() function. If + * xTimerStopFromISR() sets this value to pdTRUE then a context switch should + * be performed before the interrupt exits. + * + * @return pdFAIL will be returned if the stop command could not be sent to + * the timer command queue. pdPASS will be returned if the command was + * successfully sent to the timer command queue. When the command is actually + * processed will depend on the priority of the timer service/daemon task + * relative to other tasks in the system. The timer service/daemon task + * priority is set by the configTIMER_TASK_PRIORITY configuration constant. + * + * Example usage: + * + * // This scenario assumes xTimer has already been created and started. When + * // an interrupt occurs, the timer should be simply stopped. + * + * // The interrupt service routine that stops the timer. + * void vAnExampleInterruptServiceRoutine( void ) + * { + * portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE; + * + * // The interrupt has occurred - simply stop the timer. + * // xHigherPriorityTaskWoken was set to pdFALSE where it was defined + * // (within this function). As this is an interrupt service routine, only + * // FreeRTOS API functions that end in "FromISR" can be used. + * if( xTimerStopFromISR( xTimer, &xHigherPriorityTaskWoken ) != pdPASS ) + * { + * // The stop command was not executed successfully. Take appropriate + * // action here. + * } + * + * // If xHigherPriorityTaskWoken equals pdTRUE, then a context switch + * // should be performed. The syntax required to perform a context switch + * // from inside an ISR varies from port to port, and from compiler to + * // compiler. Inspect the demos for the port you are using to find the + * // actual syntax required. + * if( xHigherPriorityTaskWoken != pdFALSE ) + * { + * // Call the interrupt safe yield function here (actual function + * // depends on the FreeRTOS port being used. + * } + * } + */ +#define xTimerStopFromISR( xTimer, pxHigherPriorityTaskWoken ) xTimerGenericCommand( ( xTimer ), tmrCOMMAND_STOP, 0, ( pxHigherPriorityTaskWoken ), 0U ) + +/** + * portBASE_TYPE xTimerChangePeriodFromISR( xTimerHandle xTimer, + * portTickType xNewPeriod, + * portBASE_TYPE *pxHigherPriorityTaskWoken ); + * + * A version of xTimerChangePeriod() that can be called from an interrupt + * service routine. + * + * @param xTimer The handle of the timer that is having its period changed. + * + * @param xNewPeriod The new period for xTimer. Timer periods are specified in + * tick periods, so the constant portTICK_RATE_MS can be used to convert a time + * that has been specified in milliseconds. For example, if the timer must + * expire after 100 ticks, then xNewPeriod should be set to 100. Alternatively, + * if the timer must expire after 500ms, then xNewPeriod can be set to + * ( 500 / portTICK_RATE_MS ) provided configTICK_RATE_HZ is less than + * or equal to 1000. + * + * @param pxHigherPriorityTaskWoken The timer service/daemon task spends most + * of its time in the Blocked state, waiting for messages to arrive on the timer + * command queue. Calling xTimerChangePeriodFromISR() writes a message to the + * timer command queue, so has the potential to transition the timer service/ + * daemon task out of the Blocked state. If calling xTimerChangePeriodFromISR() + * causes the timer service/daemon task to leave the Blocked state, and the + * timer service/daemon task has a priority equal to or greater than the + * currently executing task (the task that was interrupted), then + * *pxHigherPriorityTaskWoken will get set to pdTRUE internally within the + * xTimerChangePeriodFromISR() function. If xTimerChangePeriodFromISR() sets + * this value to pdTRUE then a context switch should be performed before the + * interrupt exits. + * + * @return pdFAIL will be returned if the command to change the timers period + * could not be sent to the timer command queue. pdPASS will be returned if the + * command was successfully sent to the timer command queue. When the command + * is actually processed will depend on the priority of the timer service/daemon + * task relative to other tasks in the system. The timer service/daemon task + * priority is set by the configTIMER_TASK_PRIORITY configuration constant. + * + * Example usage: + * + * // This scenario assumes xTimer has already been created and started. When + * // an interrupt occurs, the period of xTimer should be changed to 500ms. + * + * // The interrupt service routine that changes the period of xTimer. + * void vAnExampleInterruptServiceRoutine( void ) + * { + * portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE; + * + * // The interrupt has occurred - change the period of xTimer to 500ms. + * // xHigherPriorityTaskWoken was set to pdFALSE where it was defined + * // (within this function). As this is an interrupt service routine, only + * // FreeRTOS API functions that end in "FromISR" can be used. + * if( xTimerChangePeriodFromISR( xTimer, &xHigherPriorityTaskWoken ) != pdPASS ) + * { + * // The command to change the timers period was not executed + * // successfully. Take appropriate action here. + * } + * + * // If xHigherPriorityTaskWoken equals pdTRUE, then a context switch + * // should be performed. The syntax required to perform a context switch + * // from inside an ISR varies from port to port, and from compiler to + * // compiler. Inspect the demos for the port you are using to find the + * // actual syntax required. + * if( xHigherPriorityTaskWoken != pdFALSE ) + * { + * // Call the interrupt safe yield function here (actual function + * // depends on the FreeRTOS port being used. + * } + * } + */ +#define xTimerChangePeriodFromISR( xTimer, xNewPeriod, pxHigherPriorityTaskWoken ) xTimerGenericCommand( ( xTimer ), tmrCOMMAND_CHANGE_PERIOD, ( xNewPeriod ), ( pxHigherPriorityTaskWoken ), 0U ) + +/** + * portBASE_TYPE xTimerResetFromISR( xTimerHandle xTimer, + * portBASE_TYPE *pxHigherPriorityTaskWoken ); + * + * A version of xTimerReset() that can be called from an interrupt service + * routine. + * + * @param xTimer The handle of the timer that is to be started, reset, or + * restarted. + * + * @param pxHigherPriorityTaskWoken The timer service/daemon task spends most + * of its time in the Blocked state, waiting for messages to arrive on the timer + * command queue. Calling xTimerResetFromISR() writes a message to the timer + * command queue, so has the potential to transition the timer service/daemon + * task out of the Blocked state. If calling xTimerResetFromISR() causes the + * timer service/daemon task to leave the Blocked state, and the timer service/ + * daemon task has a priority equal to or greater than the currently executing + * task (the task that was interrupted), then *pxHigherPriorityTaskWoken will + * get set to pdTRUE internally within the xTimerResetFromISR() function. If + * xTimerResetFromISR() sets this value to pdTRUE then a context switch should + * be performed before the interrupt exits. + * + * @return pdFAIL will be returned if the reset command could not be sent to + * the timer command queue. pdPASS will be returned if the command was + * successfully sent to the timer command queue. When the command is actually + * processed will depend on the priority of the timer service/daemon task + * relative to other tasks in the system, although the timers expiry time is + * relative to when xTimerResetFromISR() is actually called. The timer service/daemon + * task priority is set by the configTIMER_TASK_PRIORITY configuration constant. + * + * Example usage: + * + * // This scenario assumes xBacklightTimer has already been created. When a + * // key is pressed, an LCD back-light is switched on. If 5 seconds pass + * // without a key being pressed, then the LCD back-light is switched off. In + * // this case, the timer is a one-shot timer, and unlike the example given for + * // the xTimerReset() function, the key press event handler is an interrupt + * // service routine. + * + * // The callback function assigned to the one-shot timer. In this case the + * // parameter is not used. + * void vBacklightTimerCallback( xTIMER *pxTimer ) + * { + * // The timer expired, therefore 5 seconds must have passed since a key + * // was pressed. Switch off the LCD back-light. + * vSetBacklightState( BACKLIGHT_OFF ); + * } + * + * // The key press interrupt service routine. + * void vKeyPressEventInterruptHandler( void ) + * { + * portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE; + * + * // Ensure the LCD back-light is on, then reset the timer that is + * // responsible for turning the back-light off after 5 seconds of + * // key inactivity. This is an interrupt service routine so can only + * // call FreeRTOS API functions that end in "FromISR". + * vSetBacklightState( BACKLIGHT_ON ); + * + * // xTimerStartFromISR() or xTimerResetFromISR() could be called here + * // as both cause the timer to re-calculate its expiry time. + * // xHigherPriorityTaskWoken was initialised to pdFALSE when it was + * // declared (in this function). + * if( xTimerResetFromISR( xBacklightTimer, &xHigherPriorityTaskWoken ) != pdPASS ) + * { + * // The reset command was not executed successfully. Take appropriate + * // action here. + * } + * + * // Perform the rest of the key processing here. + * + * // If xHigherPriorityTaskWoken equals pdTRUE, then a context switch + * // should be performed. The syntax required to perform a context switch + * // from inside an ISR varies from port to port, and from compiler to + * // compiler. Inspect the demos for the port you are using to find the + * // actual syntax required. + * if( xHigherPriorityTaskWoken != pdFALSE ) + * { + * // Call the interrupt safe yield function here (actual function + * // depends on the FreeRTOS port being used. + * } + * } + */ +#define xTimerResetFromISR( xTimer, pxHigherPriorityTaskWoken ) xTimerGenericCommand( ( xTimer ), tmrCOMMAND_START, ( xTaskGetTickCountFromISR() ), ( pxHigherPriorityTaskWoken ), 0U ) + +/* + * Functions beyond this part are not part of the public API and are intended + * for use by the kernel only. + */ +portBASE_TYPE xTimerCreateTimerTask( void ) PRIVILEGED_FUNCTION; +portBASE_TYPE xTimerGenericCommand( xTimerHandle xTimer, portBASE_TYPE xCommandID, portTickType xOptionalValue, portBASE_TYPE *pxHigherPriorityTaskWoken, portTickType xBlockTime ) PRIVILEGED_FUNCTION; + +#ifdef __cplusplus +} +#endif +#endif /* TIMERS_H */ + + + diff --git a/FreeRTOSWithTraces/FreeRTOS_portable/MemMang/heap_1.c b/FreeRTOSWithTraces/FreeRTOS_portable/MemMang/heap_1.c new file mode 100644 index 0000000000000000000000000000000000000000..f063be198986f515d3a43bad75852f47361c03ef --- /dev/null +++ b/FreeRTOSWithTraces/FreeRTOS_portable/MemMang/heap_1.c @@ -0,0 +1,152 @@ +/* + FreeRTOS V7.0.1 - Copyright (C) 2011 Real Time Engineers Ltd. + + + *************************************************************************** + * * + * FreeRTOS tutorial books are available in pdf and paperback. * + * Complete, revised, and edited pdf reference manuals are also * + * available. * + * * + * Purchasing FreeRTOS documentation will not only help you, by * + * ensuring you get running as quickly as possible and with an * + * in-depth knowledge of how to use FreeRTOS, it will also help * + * the FreeRTOS project to continue with its mission of providing * + * professional grade, cross platform, de facto standard solutions * + * for microcontrollers - completely free of charge! * + * * + * >>> See http://www.FreeRTOS.org/Documentation for details. <<< * + * * + * Thank you for using FreeRTOS, and thank you for your support! * + * * + *************************************************************************** + + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation AND MODIFIED BY the FreeRTOS exception. + >>>NOTE<<< The modification to the GPL is included to allow you to + distribute a combined work that includes FreeRTOS without being obliged to + provide the source code for proprietary components outside of the FreeRTOS + kernel. FreeRTOS is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + more details. You should have received a copy of the GNU General Public + License and the FreeRTOS license exception along with FreeRTOS; if not it + can be viewed here: http://www.freertos.org/a00114.html and also obtained + by writing to Richard Barry, contact details for whom are available on the + FreeRTOS WEB site. + + 1 tab == 4 spaces! + + http://www.FreeRTOS.org - Documentation, latest information, license and + contact details. + + http://www.SafeRTOS.com - A version that is certified for use in safety + critical systems. + + http://www.OpenRTOS.com - Commercial support, development, porting, + licensing and training services. +*/ + + +/* + * The simplest possible implementation of pvPortMalloc(). Note that this + * implementation does NOT allow allocated memory to be freed again. + * + * See heap_2.c and heap_3.c for alternative implementations, and the memory + * management pages of http://www.FreeRTOS.org for more information. + */ +#include <stdlib.h> + +/* Defining MPU_WRAPPERS_INCLUDED_FROM_API_FILE prevents task.h from redefining +all the API functions to use the MPU wrappers. That should only be done when +task.h is included from an application file. */ +#define MPU_WRAPPERS_INCLUDED_FROM_API_FILE + +#include "FreeRTOS.h" +#include "task.h" + +#undef MPU_WRAPPERS_INCLUDED_FROM_API_FILE + +/* Allocate the memory for the heap. The struct is used to force byte +alignment without using any non-portable code. */ +static union xRTOS_HEAP +{ + #if portBYTE_ALIGNMENT == 8 + volatile portDOUBLE dDummy; + #else + volatile unsigned long ulDummy; + #endif + unsigned char ucHeap[ configTOTAL_HEAP_SIZE ]; +} xHeap; + +static size_t xNextFreeByte = ( size_t ) 0; +/*-----------------------------------------------------------*/ + +void *pvPortMalloc( size_t xWantedSize ) +{ +void *pvReturn = NULL; + + /* Ensure that blocks are always aligned to the required number of bytes. */ + #if portBYTE_ALIGNMENT != 1 + if( xWantedSize & portBYTE_ALIGNMENT_MASK ) + { + /* Byte alignment required. */ + xWantedSize += ( portBYTE_ALIGNMENT - ( xWantedSize & portBYTE_ALIGNMENT_MASK ) ); + } + #endif + + vTaskSuspendAll(); + { + /* Check there is enough room left for the allocation. */ + if( ( ( xNextFreeByte + xWantedSize ) < configTOTAL_HEAP_SIZE ) && + ( ( xNextFreeByte + xWantedSize ) > xNextFreeByte ) )/* Check for overflow. */ + { + /* Return the next free byte then increment the index past this + block. */ + pvReturn = &( xHeap.ucHeap[ xNextFreeByte ] ); + xNextFreeByte += xWantedSize; + } + } + xTaskResumeAll(); + + #if( configUSE_MALLOC_FAILED_HOOK == 1 ) + { + if( pvReturn == NULL ) + { + extern void vApplicationMallocFailedHook( void ); + vApplicationMallocFailedHook(); + } + } + #endif + + return pvReturn; +} +/*-----------------------------------------------------------*/ + +void vPortFree( void *pv ) +{ + /* Memory cannot be freed using this scheme. See heap_2.c and heap_3.c + for alternative implementations, and the memory management pages of + http://www.FreeRTOS.org for more information. */ + ( void ) pv; +} +/*-----------------------------------------------------------*/ + +void vPortInitialiseBlocks( void ) +{ + /* Only required when static memory is not cleared. */ + xNextFreeByte = ( size_t ) 0; +} +/*-----------------------------------------------------------*/ + +size_t xPortGetFreeHeapSize( void ) +{ + return ( configTOTAL_HEAP_SIZE - xNextFreeByte ); +} + + + diff --git a/FreeRTOSWithTraces/FreeRTOS_portable/MemMang/heap_2.c b/FreeRTOSWithTraces/FreeRTOS_portable/MemMang/heap_2.c new file mode 100644 index 0000000000000000000000000000000000000000..1d1c76a60e48af77f6e69e93bc1328b0ac1dea82 --- /dev/null +++ b/FreeRTOSWithTraces/FreeRTOS_portable/MemMang/heap_2.c @@ -0,0 +1,278 @@ +/* + FreeRTOS V7.0.1 - Copyright (C) 2011 Real Time Engineers Ltd. + + + *************************************************************************** + * * + * FreeRTOS tutorial books are available in pdf and paperback. * + * Complete, revised, and edited pdf reference manuals are also * + * available. * + * * + * Purchasing FreeRTOS documentation will not only help you, by * + * ensuring you get running as quickly as possible and with an * + * in-depth knowledge of how to use FreeRTOS, it will also help * + * the FreeRTOS project to continue with its mission of providing * + * professional grade, cross platform, de facto standard solutions * + * for microcontrollers - completely free of charge! * + * * + * >>> See http://www.FreeRTOS.org/Documentation for details. <<< * + * * + * Thank you for using FreeRTOS, and thank you for your support! * + * * + *************************************************************************** + + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation AND MODIFIED BY the FreeRTOS exception. + >>>NOTE<<< The modification to the GPL is included to allow you to + distribute a combined work that includes FreeRTOS without being obliged to + provide the source code for proprietary components outside of the FreeRTOS + kernel. FreeRTOS is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + more details. You should have received a copy of the GNU General Public + License and the FreeRTOS license exception along with FreeRTOS; if not it + can be viewed here: http://www.freertos.org/a00114.html and also obtained + by writing to Richard Barry, contact details for whom are available on the + FreeRTOS WEB site. + + 1 tab == 4 spaces! + + http://www.FreeRTOS.org - Documentation, latest information, license and + contact details. + + http://www.SafeRTOS.com - A version that is certified for use in safety + critical systems. + + http://www.OpenRTOS.com - Commercial support, development, porting, + licensing and training services. +*/ + +/* + * A sample implementation of pvPortMalloc() and vPortFree() that permits + * allocated blocks to be freed, but does not combine adjacent free blocks + * into a single larger block. + * + * See heap_1.c and heap_3.c for alternative implementations, and the memory + * management pages of http://www.FreeRTOS.org for more information. + */ +#include <stdlib.h> + +/* Defining MPU_WRAPPERS_INCLUDED_FROM_API_FILE prevents task.h from redefining +all the API functions to use the MPU wrappers. That should only be done when +task.h is included from an application file. */ +#define MPU_WRAPPERS_INCLUDED_FROM_API_FILE + +#include "FreeRTOS.h" +#include "task.h" + +#undef MPU_WRAPPERS_INCLUDED_FROM_API_FILE + +/* Allocate the memory for the heap. The struct is used to force byte +alignment without using any non-portable code. */ +static union xRTOS_HEAP +{ + #if portBYTE_ALIGNMENT == 8 + volatile portDOUBLE dDummy; + #else + volatile unsigned long ulDummy; + #endif + unsigned char ucHeap[ configTOTAL_HEAP_SIZE ]; +} xHeap; + +/* Define the linked list structure. This is used to link free blocks in order +of their size. */ +typedef struct A_BLOCK_LINK +{ + struct A_BLOCK_LINK *pxNextFreeBlock; /*<< The next free block in the list. */ + size_t xBlockSize; /*<< The size of the free block. */ +} xBlockLink; + + +static const unsigned short heapSTRUCT_SIZE = ( sizeof( xBlockLink ) + portBYTE_ALIGNMENT - ( sizeof( xBlockLink ) % portBYTE_ALIGNMENT ) ); +#define heapMINIMUM_BLOCK_SIZE ( ( size_t ) ( heapSTRUCT_SIZE * 2 ) ) + +/* Create a couple of list links to mark the start and end of the list. */ +static xBlockLink xStart, xEnd; + +/* Keeps track of the number of free bytes remaining, but says nothing about +fragmentation. */ +static size_t xFreeBytesRemaining = configTOTAL_HEAP_SIZE; + +/* STATIC FUNCTIONS ARE DEFINED AS MACROS TO MINIMIZE THE FUNCTION CALL DEPTH. */ + +/* + * Insert a block into the list of free blocks - which is ordered by size of + * the block. Small blocks at the start of the list and large blocks at the end + * of the list. + */ +#define prvInsertBlockIntoFreeList( pxBlockToInsert ) \ +{ \ +xBlockLink *pxIterator; \ +size_t xBlockSize; \ + \ + xBlockSize = pxBlockToInsert->xBlockSize; \ + \ + /* Iterate through the list until a block is found that has a larger size */ \ + /* than the block we are inserting. */ \ + for( pxIterator = &xStart; pxIterator->pxNextFreeBlock->xBlockSize < xBlockSize; pxIterator = pxIterator->pxNextFreeBlock ) \ + { \ + /* There is nothing to do here - just iterate to the correct position. */ \ + } \ + \ + /* Update the list to include the block being inserted in the correct */ \ + /* position. */ \ + pxBlockToInsert->pxNextFreeBlock = pxIterator->pxNextFreeBlock; \ + pxIterator->pxNextFreeBlock = pxBlockToInsert; \ +} +/*-----------------------------------------------------------*/ + +#define prvHeapInit() \ +{ \ +xBlockLink *pxFirstFreeBlock; \ + \ + /* xStart is used to hold a pointer to the first item in the list of free */ \ + /* blocks. The void cast is used to prevent compiler warnings. */ \ + xStart.pxNextFreeBlock = ( void * ) xHeap.ucHeap; \ + xStart.xBlockSize = ( size_t ) 0; \ + \ + /* xEnd is used to mark the end of the list of free blocks. */ \ + xEnd.xBlockSize = configTOTAL_HEAP_SIZE; \ + xEnd.pxNextFreeBlock = NULL; \ + \ + /* To start with there is a single free block that is sized to take up the \ + entire heap space. */ \ + pxFirstFreeBlock = ( void * ) xHeap.ucHeap; \ + pxFirstFreeBlock->xBlockSize = configTOTAL_HEAP_SIZE; \ + pxFirstFreeBlock->pxNextFreeBlock = &xEnd; \ +} +/*-----------------------------------------------------------*/ + +void *pvPortMalloc( size_t xWantedSize ) +{ +xBlockLink *pxBlock, *pxPreviousBlock, *pxNewBlockLink; +static portBASE_TYPE xHeapHasBeenInitialised = pdFALSE; +void *pvReturn = NULL; + + vTaskSuspendAll(); + { + /* If this is the first call to malloc then the heap will require + initialisation to setup the list of free blocks. */ + if( xHeapHasBeenInitialised == pdFALSE ) + { + prvHeapInit(); + xHeapHasBeenInitialised = pdTRUE; + } + + /* The wanted size is increased so it can contain a xBlockLink + structure in addition to the requested amount of bytes. */ + if( xWantedSize > 0 ) + { + xWantedSize += heapSTRUCT_SIZE; + + /* Ensure that blocks are always aligned to the required number of bytes. */ + if( xWantedSize & portBYTE_ALIGNMENT_MASK ) + { + /* Byte alignment required. */ + xWantedSize += ( portBYTE_ALIGNMENT - ( xWantedSize & portBYTE_ALIGNMENT_MASK ) ); + } + } + + if( ( xWantedSize > 0 ) && ( xWantedSize < configTOTAL_HEAP_SIZE ) ) + { + /* Blocks are stored in byte order - traverse the list from the start + (smallest) block until one of adequate size is found. */ + pxPreviousBlock = &xStart; + pxBlock = xStart.pxNextFreeBlock; + while( ( pxBlock->xBlockSize < xWantedSize ) && ( pxBlock->pxNextFreeBlock ) ) + { + pxPreviousBlock = pxBlock; + pxBlock = pxBlock->pxNextFreeBlock; + } + + /* If we found the end marker then a block of adequate size was not found. */ + if( pxBlock != &xEnd ) + { + /* Return the memory space - jumping over the xBlockLink structure + at its start. */ + pvReturn = ( void * ) ( ( ( unsigned char * ) pxPreviousBlock->pxNextFreeBlock ) + heapSTRUCT_SIZE ); + + /* This block is being returned for use so must be taken our of the + list of free blocks. */ + pxPreviousBlock->pxNextFreeBlock = pxBlock->pxNextFreeBlock; + + /* If the block is larger than required it can be split into two. */ + if( ( pxBlock->xBlockSize - xWantedSize ) > heapMINIMUM_BLOCK_SIZE ) + { + /* This block is to be split into two. Create a new block + following the number of bytes requested. The void cast is + used to prevent byte alignment warnings from the compiler. */ + pxNewBlockLink = ( void * ) ( ( ( unsigned char * ) pxBlock ) + xWantedSize ); + + /* Calculate the sizes of two blocks split from the single + block. */ + pxNewBlockLink->xBlockSize = pxBlock->xBlockSize - xWantedSize; + pxBlock->xBlockSize = xWantedSize; + + /* Insert the new block into the list of free blocks. */ + prvInsertBlockIntoFreeList( ( pxNewBlockLink ) ); + } + + xFreeBytesRemaining -= pxBlock->xBlockSize; + } + } + } + xTaskResumeAll(); + + #if( configUSE_MALLOC_FAILED_HOOK == 1 ) + { + if( pvReturn == NULL ) + { + extern void vApplicationMallocFailedHook( void ); + vApplicationMallocFailedHook(); + } + } + #endif + + return pvReturn; +} +/*-----------------------------------------------------------*/ + +void vPortFree( void *pv ) +{ +unsigned char *puc = ( unsigned char * ) pv; +xBlockLink *pxLink; + + if( pv ) + { + /* The memory being freed will have an xBlockLink structure immediately + before it. */ + puc -= heapSTRUCT_SIZE; + + /* This casting is to keep the compiler from issuing warnings. */ + pxLink = ( void * ) puc; + + vTaskSuspendAll(); + { + /* Add this block to the list of free blocks. */ + prvInsertBlockIntoFreeList( ( ( xBlockLink * ) pxLink ) ); + xFreeBytesRemaining += pxLink->xBlockSize; + } + xTaskResumeAll(); + } +} +/*-----------------------------------------------------------*/ + +size_t xPortGetFreeHeapSize( void ) +{ + return xFreeBytesRemaining; +} +/*-----------------------------------------------------------*/ + +void vPortInitialiseBlocks( void ) +{ + /* This just exists to keep the linker quiet. */ +} diff --git a/FreeRTOSWithTraces/FreeRTOS_portable/MemMang/heap_3.c b/FreeRTOSWithTraces/FreeRTOS_portable/MemMang/heap_3.c new file mode 100644 index 0000000000000000000000000000000000000000..fa799a0c21ae6cf15560ffc7ba286847f124d496 --- /dev/null +++ b/FreeRTOSWithTraces/FreeRTOS_portable/MemMang/heap_3.c @@ -0,0 +1,117 @@ +/* + FreeRTOS V7.0.1 - Copyright (C) 2011 Real Time Engineers Ltd. + + + *************************************************************************** + * * + * FreeRTOS tutorial books are available in pdf and paperback. * + * Complete, revised, and edited pdf reference manuals are also * + * available. * + * * + * Purchasing FreeRTOS documentation will not only help you, by * + * ensuring you get running as quickly as possible and with an * + * in-depth knowledge of how to use FreeRTOS, it will also help * + * the FreeRTOS project to continue with its mission of providing * + * professional grade, cross platform, de facto standard solutions * + * for microcontrollers - completely free of charge! * + * * + * >>> See http://www.FreeRTOS.org/Documentation for details. <<< * + * * + * Thank you for using FreeRTOS, and thank you for your support! * + * * + *************************************************************************** + + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation AND MODIFIED BY the FreeRTOS exception. + >>>NOTE<<< The modification to the GPL is included to allow you to + distribute a combined work that includes FreeRTOS without being obliged to + provide the source code for proprietary components outside of the FreeRTOS + kernel. FreeRTOS is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + more details. You should have received a copy of the GNU General Public + License and the FreeRTOS license exception along with FreeRTOS; if not it + can be viewed here: http://www.freertos.org/a00114.html and also obtained + by writing to Richard Barry, contact details for whom are available on the + FreeRTOS WEB site. + + 1 tab == 4 spaces! + + http://www.FreeRTOS.org - Documentation, latest information, license and + contact details. + + http://www.SafeRTOS.com - A version that is certified for use in safety + critical systems. + + http://www.OpenRTOS.com - Commercial support, development, porting, + licensing and training services. +*/ + + +/* + * Implementation of pvPortMalloc() and vPortFree() that relies on the + * compilers own malloc() and free() implementations. + * + * This file can only be used if the linker is configured to to generate + * a heap memory area. + * + * See heap_2.c and heap_1.c for alternative implementations, and the memory + * management pages of http://www.FreeRTOS.org for more information. + */ + +#include <stdlib.h> + +/* Defining MPU_WRAPPERS_INCLUDED_FROM_API_FILE prevents task.h from redefining +all the API functions to use the MPU wrappers. That should only be done when +task.h is included from an application file. */ +#define MPU_WRAPPERS_INCLUDED_FROM_API_FILE + +#include "FreeRTOS.h" +#include "task.h" + +#undef MPU_WRAPPERS_INCLUDED_FROM_API_FILE + +/*-----------------------------------------------------------*/ + +void *pvPortMalloc( size_t xWantedSize ) +{ +void *pvReturn; + + vTaskSuspendAll(); + { + pvReturn = malloc( xWantedSize ); + } + xTaskResumeAll(); + + #if( configUSE_MALLOC_FAILED_HOOK == 1 ) + { + if( pvReturn == NULL ) + { + extern void vApplicationMallocFailedHook( void ); + vApplicationMallocFailedHook(); + } + } + #endif + + return pvReturn; +} +/*-----------------------------------------------------------*/ + +void vPortFree( void *pv ) +{ + if( pv ) + { + vTaskSuspendAll(); + { + free( pv ); + } + xTaskResumeAll(); + } +} + + + diff --git a/FreeRTOSWithTraces/FreeRTOS_portable/port.c b/FreeRTOSWithTraces/FreeRTOS_portable/port.c new file mode 100644 index 0000000000000000000000000000000000000000..70c74912a48a5c884d610f69ba505d692e32a969 --- /dev/null +++ b/FreeRTOSWithTraces/FreeRTOS_portable/port.c @@ -0,0 +1,283 @@ +/* + FreeRTOS V7.0.1 - Copyright (C) 2011 Real Time Engineers Ltd. + + + *************************************************************************** + * * + * FreeRTOS tutorial books are available in pdf and paperback. * + * Complete, revised, and edited pdf reference manuals are also * + * available. * + * * + * Purchasing FreeRTOS documentation will not only help you, by * + * ensuring you get running as quickly as possible and with an * + * in-depth knowledge of how to use FreeRTOS, it will also help * + * the FreeRTOS project to continue with its mission of providing * + * professional grade, cross platform, de facto standard solutions * + * for microcontrollers - completely free of charge! * + * * + * >>> See http://www.FreeRTOS.org/Documentation for details. <<< * + * * + * Thank you for using FreeRTOS, and thank you for your support! * + * * + *************************************************************************** + + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation AND MODIFIED BY the FreeRTOS exception. + >>>NOTE<<< The modification to the GPL is included to allow you to + distribute a combined work that includes FreeRTOS without being obliged to + provide the source code for proprietary components outside of the FreeRTOS + kernel. FreeRTOS is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + more details. You should have received a copy of the GNU General Public + License and the FreeRTOS license exception along with FreeRTOS; if not it + can be viewed here: http://www.freertos.org/a00114.html and also obtained + by writing to Richard Barry, contact details for whom are available on the + FreeRTOS WEB site. + + 1 tab == 4 spaces! + + http://www.FreeRTOS.org - Documentation, latest information, license and + contact details. + + http://www.SafeRTOS.com - A version that is certified for use in safety + critical systems. + + http://www.OpenRTOS.com - Commercial support, development, porting, + licensing and training services. +*/ + +/*----------------------------------------------------------- + * Implementation of functions defined in portable.h for the ARM CM3 port. + *----------------------------------------------------------*/ + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" + +/* For backward compatibility, ensure configKERNEL_INTERRUPT_PRIORITY is +defined. The value should also ensure backward compatibility. +FreeRTOS.org versions prior to V4.4.0 did not include this definition. */ +#ifndef configKERNEL_INTERRUPT_PRIORITY + #define configKERNEL_INTERRUPT_PRIORITY 255 +#endif + +/* Constants required to manipulate the NVIC. */ +#define portNVIC_SYSTICK_CTRL ( ( volatile unsigned long *) 0xe000e010 ) +#define portNVIC_SYSTICK_LOAD ( ( volatile unsigned long *) 0xe000e014 ) +#define portNVIC_INT_CTRL ( ( volatile unsigned long *) 0xe000ed04 ) +#define portNVIC_SYSPRI2 ( ( volatile unsigned long *) 0xe000ed20 ) +#define portNVIC_SYSTICK_CLK 0x00000004 +#define portNVIC_SYSTICK_INT 0x00000002 +#define portNVIC_SYSTICK_ENABLE 0x00000001 +#define portNVIC_PENDSVSET 0x10000000 +#define portNVIC_PENDSV_PRI ( ( ( unsigned long ) configKERNEL_INTERRUPT_PRIORITY ) << 16 ) +#define portNVIC_SYSTICK_PRI ( ( ( unsigned long ) configKERNEL_INTERRUPT_PRIORITY ) << 24 ) + +/* Constants required to set up the initial stack. */ +#define portINITIAL_XPSR ( 0x01000000 ) + +/* The priority used by the kernel is assigned to a variable to make access +from inline assembler easier. */ +const unsigned long ulKernelPriority = configKERNEL_INTERRUPT_PRIORITY; + +/* Each task maintains its own interrupt status in the critical nesting +variable. */ +static unsigned portBASE_TYPE uxCriticalNesting = 0xaaaaaaaa; + +/* + * Setup the timer to generate the tick interrupts. + */ +static void prvSetupTimerInterrupt( void ); + +/* + * Exception handlers. + */ +void xPortPendSVHandler( void ) __attribute__ (( naked )); +void xPortSysTickHandler( void ); +void vPortSVCHandler( void ) __attribute__ (( naked )); + +/* + * Start first task is a separate function so it can be tested in isolation. + */ +void vPortStartFirstTask( void ) __attribute__ (( naked )); + +/*-----------------------------------------------------------*/ + +/* + * See header file for description. + */ +portSTACK_TYPE *pxPortInitialiseStack( portSTACK_TYPE *pxTopOfStack, pdTASK_CODE pxCode, void *pvParameters ) +{ + /* Simulate the stack frame as it would be created by a context switch + interrupt. */ + pxTopOfStack--; /* Offset added to account for the way the MCU uses the stack on entry/exit of interrupts. */ + *pxTopOfStack = portINITIAL_XPSR; /* xPSR */ + pxTopOfStack--; + *pxTopOfStack = ( portSTACK_TYPE ) pxCode; /* PC */ + pxTopOfStack--; + *pxTopOfStack = 0; /* LR */ + pxTopOfStack -= 5; /* R12, R3, R2 and R1. */ + *pxTopOfStack = ( portSTACK_TYPE ) pvParameters; /* R0 */ + pxTopOfStack -= 8; /* R11, R10, R9, R8, R7, R6, R5 and R4. */ + + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +void vPortSVCHandler( void ) +{ + __asm volatile ( + " ldr r3, pxCurrentTCBConst2 \n" /* Restore the context. */ + " ldr r1, [r3] \n" /* Use pxCurrentTCBConst to get the pxCurrentTCB address. */ + " ldr r0, [r1] \n" /* The first item in pxCurrentTCB is the task top of stack. */ + " ldmia r0!, {r4-r11} \n" /* Pop the registers that are not automatically saved on exception entry and the critical nesting count. */ + " msr psp, r0 \n" /* Restore the task stack pointer. */ + " mov r0, #0 \n" + " msr basepri, r0 \n" + " orr r14, #0xd \n" + " bx r14 \n" + " \n" + " .align 2 \n" + "pxCurrentTCBConst2: .word pxCurrentTCB \n" + ); +} +/*-----------------------------------------------------------*/ + +void vPortStartFirstTask( void ) +{ + __asm volatile( + " ldr r0, =0xE000ED08 \n" /* Use the NVIC offset register to locate the stack. */ + " ldr r0, [r0] \n" + " ldr r0, [r0] \n" + " msr msp, r0 \n" /* Set the msp back to the start of the stack. */ + " cpsie i \n" /* Globally enable interrupts. */ + " svc 0 \n" /* System call to start first task. */ + " nop \n" + ); +} +/*-----------------------------------------------------------*/ + +/* + * See header file for description. + */ +portBASE_TYPE xPortStartScheduler( void ) +{ + /* Make PendSV, CallSV and SysTick the same priroity as the kernel. */ + *(portNVIC_SYSPRI2) |= portNVIC_PENDSV_PRI; + *(portNVIC_SYSPRI2) |= portNVIC_SYSTICK_PRI; + + /* Start the timer that generates the tick ISR. Interrupts are disabled + here already. */ + prvSetupTimerInterrupt(); + + /* Initialise the critical nesting count ready for the first task. */ + uxCriticalNesting = 0; + + /* Start the first task. */ + vPortStartFirstTask(); + + /* Should not get here! */ + return 0; +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* It is unlikely that the CM3 port will require this function as there + is nothing to return to. */ +} +/*-----------------------------------------------------------*/ + +void vPortYieldFromISR( void ) +{ + /* Set a PendSV to request a context switch. */ + *(portNVIC_INT_CTRL) = portNVIC_PENDSVSET; +} +/*-----------------------------------------------------------*/ + +void vPortEnterCritical( void ) +{ + portDISABLE_INTERRUPTS(); + uxCriticalNesting++; +} +/*-----------------------------------------------------------*/ + +void vPortExitCritical( void ) +{ + uxCriticalNesting--; + if( uxCriticalNesting == 0 ) + { + portENABLE_INTERRUPTS(); + } +} +/*-----------------------------------------------------------*/ + +void xPortPendSVHandler( void ) +{ + /* This is a naked function. */ + + __asm volatile + ( + " mrs r0, psp \n" + " \n" + " ldr r3, pxCurrentTCBConst \n" /* Get the location of the current TCB. */ + " ldr r2, [r3] \n" + " \n" + " stmdb r0!, {r4-r11} \n" /* Save the remaining registers. */ + " str r0, [r2] \n" /* Save the new top of stack into the first member of the TCB. */ + " \n" + " stmdb sp!, {r3, r14} \n" + " mov r0, %0 \n" + " msr basepri, r0 \n" + " bl vTaskSwitchContext \n" + " mov r0, #0 \n" + " msr basepri, r0 \n" + " ldmia sp!, {r3, r14} \n" + " \n" /* Restore the context, including the critical nesting count. */ + " ldr r1, [r3] \n" + " ldr r0, [r1] \n" /* The first item in pxCurrentTCB is the task top of stack. */ + " ldmia r0!, {r4-r11} \n" /* Pop the registers. */ + " msr psp, r0 \n" + " bx r14 \n" + " \n" + " .align 2 \n" + "pxCurrentTCBConst: .word pxCurrentTCB \n" + ::"i"(configMAX_SYSCALL_INTERRUPT_PRIORITY) + ); +} +/*-----------------------------------------------------------*/ + +void xPortSysTickHandler( void ) +{ +unsigned long ulDummy; + + /* If using preemption, also force a context switch. */ + #if configUSE_PREEMPTION == 1 + *(portNVIC_INT_CTRL) = portNVIC_PENDSVSET; + #endif + + ulDummy = portSET_INTERRUPT_MASK_FROM_ISR(); + { + vTaskIncrementTick(); + } + portCLEAR_INTERRUPT_MASK_FROM_ISR( ulDummy ); +} +/*-----------------------------------------------------------*/ + +/* + * Setup the systick timer to generate the tick interrupts at the required + * frequency. + */ +void prvSetupTimerInterrupt( void ) +{ + /* Configure SysTick to interrupt at the requested rate. */ + *(portNVIC_SYSTICK_LOAD) = ( configCPU_CLOCK_HZ / configTICK_RATE_HZ ) - 1UL; + *(portNVIC_SYSTICK_CTRL) = portNVIC_SYSTICK_CLK | portNVIC_SYSTICK_INT | portNVIC_SYSTICK_ENABLE; +} +/*-----------------------------------------------------------*/ + diff --git a/FreeRTOSWithTraces/FreeRTOS_portable/portmacro.h b/FreeRTOSWithTraces/FreeRTOS_portable/portmacro.h new file mode 100644 index 0000000000000000000000000000000000000000..461bf90521b9837f0c0728c20b385c09e6f52e3d --- /dev/null +++ b/FreeRTOSWithTraces/FreeRTOS_portable/portmacro.h @@ -0,0 +1,156 @@ +/* + FreeRTOS V7.0.1 - Copyright (C) 2011 Real Time Engineers Ltd. + + + *************************************************************************** + * * + * FreeRTOS tutorial books are available in pdf and paperback. * + * Complete, revised, and edited pdf reference manuals are also * + * available. * + * * + * Purchasing FreeRTOS documentation will not only help you, by * + * ensuring you get running as quickly as possible and with an * + * in-depth knowledge of how to use FreeRTOS, it will also help * + * the FreeRTOS project to continue with its mission of providing * + * professional grade, cross platform, de facto standard solutions * + * for microcontrollers - completely free of charge! * + * * + * >>> See http://www.FreeRTOS.org/Documentation for details. <<< * + * * + * Thank you for using FreeRTOS, and thank you for your support! * + * * + *************************************************************************** + + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation AND MODIFIED BY the FreeRTOS exception. + >>>NOTE<<< The modification to the GPL is included to allow you to + distribute a combined work that includes FreeRTOS without being obliged to + provide the source code for proprietary components outside of the FreeRTOS + kernel. FreeRTOS is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + more details. You should have received a copy of the GNU General Public + License and the FreeRTOS license exception along with FreeRTOS; if not it + can be viewed here: http://www.freertos.org/a00114.html and also obtained + by writing to Richard Barry, contact details for whom are available on the + FreeRTOS WEB site. + + 1 tab == 4 spaces! + + http://www.FreeRTOS.org - Documentation, latest information, license and + contact details. + + http://www.SafeRTOS.com - A version that is certified for use in safety + critical systems. + + http://www.OpenRTOS.com - Commercial support, development, porting, + licensing and training services. +*/ + + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +#ifdef __cplusplus +extern "C" { +#endif + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* Type definitions. */ +#define portCHAR char +#define portFLOAT float +#define portDOUBLE double +#define portLONG long +#define portSHORT short +#define portSTACK_TYPE unsigned portLONG +#define portBASE_TYPE long + +#if( configUSE_16_BIT_TICKS == 1 ) + typedef unsigned portSHORT portTickType; + #define portMAX_DELAY ( portTickType ) 0xffff +#else + typedef unsigned portLONG portTickType; + #define portMAX_DELAY ( portTickType ) 0xffffffff +#endif +/*-----------------------------------------------------------*/ + +/* Architecture specifics. */ +#define portSTACK_GROWTH ( -1 ) +#define portTICK_RATE_MS ( ( portTickType ) 1000 / configTICK_RATE_HZ ) +#define portBYTE_ALIGNMENT 8 +/*-----------------------------------------------------------*/ + + +/* Scheduler utilities. */ +extern void vPortYieldFromISR( void ); + +#define portYIELD() vPortYieldFromISR() + +#define portEND_SWITCHING_ISR( xSwitchRequired ) if( xSwitchRequired ) vPortYieldFromISR() +/*-----------------------------------------------------------*/ + + +/* Critical section management. */ + +/* + * Set basepri to portMAX_SYSCALL_INTERRUPT_PRIORITY without effecting other + * registers. r0 is clobbered. + */ +#define portSET_INTERRUPT_MASK() \ + __asm volatile \ + ( \ + " mov r0, %0 \n" \ + " msr basepri, r0 \n" \ + ::"i"(configMAX_SYSCALL_INTERRUPT_PRIORITY):"r0" \ + ) + +/* + * Set basepri back to 0 without effective other registers. + * r0 is clobbered. + */ +#define portCLEAR_INTERRUPT_MASK() \ + __asm volatile \ + ( \ + " mov r0, #0 \n" \ + " msr basepri, r0 \n" \ + :::"r0" \ + ) + +#define portSET_INTERRUPT_MASK_FROM_ISR() 0;portSET_INTERRUPT_MASK() +#define portCLEAR_INTERRUPT_MASK_FROM_ISR(x) portCLEAR_INTERRUPT_MASK();(void)x + + +extern void vPortEnterCritical( void ); +extern void vPortExitCritical( void ); + +#define portDISABLE_INTERRUPTS() portSET_INTERRUPT_MASK() +#define portENABLE_INTERRUPTS() portCLEAR_INTERRUPT_MASK() +#define portENTER_CRITICAL() vPortEnterCritical() +#define portEXIT_CRITICAL() vPortExitCritical() +/*-----------------------------------------------------------*/ + +/* Task function macros as described on the FreeRTOS.org WEB site. */ +#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void *pvParameters ) +#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void *pvParameters ) + +#define portNOP() + +#ifdef __cplusplus +} +#endif + +#endif /* PORTMACRO_H */ + diff --git a/FreeRTOSWithTraces/FreeRTOS_src/croutine.c b/FreeRTOSWithTraces/FreeRTOS_src/croutine.c new file mode 100644 index 0000000000000000000000000000000000000000..58fb1bf4b846b0fd1d11fdeb335db97e4a591b85 --- /dev/null +++ b/FreeRTOSWithTraces/FreeRTOS_src/croutine.c @@ -0,0 +1,380 @@ +/* + FreeRTOS V7.0.1 - Copyright (C) 2011 Real Time Engineers Ltd. + + + FreeRTOS supports many tools and architectures. V7.0.0 is sponsored by: + Atollic AB - Atollic provides professional embedded systems development + tools for C/C++ development, code analysis and test automation. + See http://www.atollic.com + + + *************************************************************************** + * * + * FreeRTOS tutorial books are available in pdf and paperback. * + * Complete, revised, and edited pdf reference manuals are also * + * available. * + * * + * Purchasing FreeRTOS documentation will not only help you, by * + * ensuring you get running as quickly as possible and with an * + * in-depth knowledge of how to use FreeRTOS, it will also help * + * the FreeRTOS project to continue with its mission of providing * + * professional grade, cross platform, de facto standard solutions * + * for microcontrollers - completely free of charge! * + * * + * >>> See http://www.FreeRTOS.org/Documentation for details. <<< * + * * + * Thank you for using FreeRTOS, and thank you for your support! * + * * + *************************************************************************** + + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation AND MODIFIED BY the FreeRTOS exception. + >>>NOTE<<< The modification to the GPL is included to allow you to + distribute a combined work that includes FreeRTOS without being obliged to + provide the source code for proprietary components outside of the FreeRTOS + kernel. FreeRTOS is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + more details. You should have received a copy of the GNU General Public + License and the FreeRTOS license exception along with FreeRTOS; if not it + can be viewed here: http://www.freertos.org/a00114.html and also obtained + by writing to Richard Barry, contact details for whom are available on the + FreeRTOS WEB site. + + 1 tab == 4 spaces! + + http://www.FreeRTOS.org - Documentation, latest information, license and + contact details. + + http://www.SafeRTOS.com - A version that is certified for use in safety + critical systems. + + http://www.OpenRTOS.com - Commercial support, development, porting, + licensing and training services. +*/ + +#include "FreeRTOS.h" +#include "task.h" +#include "croutine.h" + +/* + * Some kernel aware debuggers require data to be viewed to be global, rather + * than file scope. + */ +#ifdef portREMOVE_STATIC_QUALIFIER + #define static +#endif + + +/* Lists for ready and blocked co-routines. --------------------*/ +static xList pxReadyCoRoutineLists[ configMAX_CO_ROUTINE_PRIORITIES ]; /*< Prioritised ready co-routines. */ +static xList xDelayedCoRoutineList1; /*< Delayed co-routines. */ +static xList xDelayedCoRoutineList2; /*< Delayed co-routines (two lists are used - one for delays that have overflowed the current tick count. */ +static xList * pxDelayedCoRoutineList; /*< Points to the delayed co-routine list currently being used. */ +static xList * pxOverflowDelayedCoRoutineList; /*< Points to the delayed co-routine list currently being used to hold co-routines that have overflowed the current tick count. */ +static xList xPendingReadyCoRoutineList; /*< Holds co-routines that have been readied by an external event. They cannot be added directly to the ready lists as the ready lists cannot be accessed by interrupts. */ + +/* Other file private variables. --------------------------------*/ +corCRCB * pxCurrentCoRoutine = NULL; +static unsigned portBASE_TYPE uxTopCoRoutineReadyPriority = 0; +static portTickType xCoRoutineTickCount = 0, xLastTickCount = 0, xPassedTicks = 0; + +/* The initial state of the co-routine when it is created. */ +#define corINITIAL_STATE ( 0 ) + +/* + * Place the co-routine represented by pxCRCB into the appropriate ready queue + * for the priority. It is inserted at the end of the list. + * + * This macro accesses the co-routine ready lists and therefore must not be + * used from within an ISR. + */ +#define prvAddCoRoutineToReadyQueue( pxCRCB ) \ +{ \ + if( pxCRCB->uxPriority > uxTopCoRoutineReadyPriority ) \ + { \ + uxTopCoRoutineReadyPriority = pxCRCB->uxPriority; \ + } \ + vListInsertEnd( ( xList * ) &( pxReadyCoRoutineLists[ pxCRCB->uxPriority ] ), &( pxCRCB->xGenericListItem ) ); \ +} + +/* + * Utility to ready all the lists used by the scheduler. This is called + * automatically upon the creation of the first co-routine. + */ +static void prvInitialiseCoRoutineLists( void ); + +/* + * Co-routines that are readied by an interrupt cannot be placed directly into + * the ready lists (there is no mutual exclusion). Instead they are placed in + * in the pending ready list in order that they can later be moved to the ready + * list by the co-routine scheduler. + */ +static void prvCheckPendingReadyList( void ); + +/* + * Macro that looks at the list of co-routines that are currently delayed to + * see if any require waking. + * + * Co-routines are stored in the queue in the order of their wake time - + * meaning once one co-routine has been found whose timer has not expired + * we need not look any further down the list. + */ +static void prvCheckDelayedList( void ); + +/*-----------------------------------------------------------*/ + +signed portBASE_TYPE xCoRoutineCreate( crCOROUTINE_CODE pxCoRoutineCode, unsigned portBASE_TYPE uxPriority, unsigned portBASE_TYPE uxIndex ) +{ +signed portBASE_TYPE xReturn; +corCRCB *pxCoRoutine; + + /* Allocate the memory that will store the co-routine control block. */ + pxCoRoutine = ( corCRCB * ) pvPortMalloc( sizeof( corCRCB ) ); + if( pxCoRoutine ) + { + /* If pxCurrentCoRoutine is NULL then this is the first co-routine to + be created and the co-routine data structures need initialising. */ + if( pxCurrentCoRoutine == NULL ) + { + pxCurrentCoRoutine = pxCoRoutine; + prvInitialiseCoRoutineLists(); + } + + /* Check the priority is within limits. */ + if( uxPriority >= configMAX_CO_ROUTINE_PRIORITIES ) + { + uxPriority = configMAX_CO_ROUTINE_PRIORITIES - 1; + } + + /* Fill out the co-routine control block from the function parameters. */ + pxCoRoutine->uxState = corINITIAL_STATE; + pxCoRoutine->uxPriority = uxPriority; + pxCoRoutine->uxIndex = uxIndex; + pxCoRoutine->pxCoRoutineFunction = pxCoRoutineCode; + + /* Initialise all the other co-routine control block parameters. */ + vListInitialiseItem( &( pxCoRoutine->xGenericListItem ) ); + vListInitialiseItem( &( pxCoRoutine->xEventListItem ) ); + + /* Set the co-routine control block as a link back from the xListItem. + This is so we can get back to the containing CRCB from a generic item + in a list. */ + listSET_LIST_ITEM_OWNER( &( pxCoRoutine->xGenericListItem ), pxCoRoutine ); + listSET_LIST_ITEM_OWNER( &( pxCoRoutine->xEventListItem ), pxCoRoutine ); + + /* Event lists are always in priority order. */ + listSET_LIST_ITEM_VALUE( &( pxCoRoutine->xEventListItem ), configMAX_PRIORITIES - ( portTickType ) uxPriority ); + + /* Now the co-routine has been initialised it can be added to the ready + list at the correct priority. */ + prvAddCoRoutineToReadyQueue( pxCoRoutine ); + + xReturn = pdPASS; + } + else + { + xReturn = errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY; + } + + return xReturn; +} +/*-----------------------------------------------------------*/ + +void vCoRoutineAddToDelayedList( portTickType xTicksToDelay, xList *pxEventList ) +{ +portTickType xTimeToWake; + + /* Calculate the time to wake - this may overflow but this is + not a problem. */ + xTimeToWake = xCoRoutineTickCount + xTicksToDelay; + + /* We must remove ourselves from the ready list before adding + ourselves to the blocked list as the same list item is used for + both lists. */ + vListRemove( ( xListItem * ) &( pxCurrentCoRoutine->xGenericListItem ) ); + + /* The list item will be inserted in wake time order. */ + listSET_LIST_ITEM_VALUE( &( pxCurrentCoRoutine->xGenericListItem ), xTimeToWake ); + + if( xTimeToWake < xCoRoutineTickCount ) + { + /* Wake time has overflowed. Place this item in the + overflow list. */ + vListInsert( ( xList * ) pxOverflowDelayedCoRoutineList, ( xListItem * ) &( pxCurrentCoRoutine->xGenericListItem ) ); + } + else + { + /* The wake time has not overflowed, so we can use the + current block list. */ + vListInsert( ( xList * ) pxDelayedCoRoutineList, ( xListItem * ) &( pxCurrentCoRoutine->xGenericListItem ) ); + } + + if( pxEventList ) + { + /* Also add the co-routine to an event list. If this is done then the + function must be called with interrupts disabled. */ + vListInsert( pxEventList, &( pxCurrentCoRoutine->xEventListItem ) ); + } +} +/*-----------------------------------------------------------*/ + +static void prvCheckPendingReadyList( void ) +{ + /* Are there any co-routines waiting to get moved to the ready list? These + are co-routines that have been readied by an ISR. The ISR cannot access + the ready lists itself. */ + while( listLIST_IS_EMPTY( &xPendingReadyCoRoutineList ) == pdFALSE ) + { + corCRCB *pxUnblockedCRCB; + + /* The pending ready list can be accessed by an ISR. */ + portDISABLE_INTERRUPTS(); + { + pxUnblockedCRCB = ( corCRCB * ) listGET_OWNER_OF_HEAD_ENTRY( (&xPendingReadyCoRoutineList) ); + vListRemove( &( pxUnblockedCRCB->xEventListItem ) ); + } + portENABLE_INTERRUPTS(); + + vListRemove( &( pxUnblockedCRCB->xGenericListItem ) ); + prvAddCoRoutineToReadyQueue( pxUnblockedCRCB ); + } +} +/*-----------------------------------------------------------*/ + +static void prvCheckDelayedList( void ) +{ +corCRCB *pxCRCB; + + xPassedTicks = xTaskGetTickCount() - xLastTickCount; + while( xPassedTicks ) + { + xCoRoutineTickCount++; + xPassedTicks--; + + /* If the tick count has overflowed we need to swap the ready lists. */ + if( xCoRoutineTickCount == 0 ) + { + xList * pxTemp; + + /* Tick count has overflowed so we need to swap the delay lists. If there are + any items in pxDelayedCoRoutineList here then there is an error! */ + pxTemp = pxDelayedCoRoutineList; + pxDelayedCoRoutineList = pxOverflowDelayedCoRoutineList; + pxOverflowDelayedCoRoutineList = pxTemp; + } + + /* See if this tick has made a timeout expire. */ + while( listLIST_IS_EMPTY( pxDelayedCoRoutineList ) == pdFALSE ) + { + pxCRCB = ( corCRCB * ) listGET_OWNER_OF_HEAD_ENTRY( pxDelayedCoRoutineList ); + + if( xCoRoutineTickCount < listGET_LIST_ITEM_VALUE( &( pxCRCB->xGenericListItem ) ) ) + { + /* Timeout not yet expired. */ + break; + } + + portDISABLE_INTERRUPTS(); + { + /* The event could have occurred just before this critical + section. If this is the case then the generic list item will + have been moved to the pending ready list and the following + line is still valid. Also the pvContainer parameter will have + been set to NULL so the following lines are also valid. */ + vListRemove( &( pxCRCB->xGenericListItem ) ); + + /* Is the co-routine waiting on an event also? */ + if( pxCRCB->xEventListItem.pvContainer ) + { + vListRemove( &( pxCRCB->xEventListItem ) ); + } + } + portENABLE_INTERRUPTS(); + + prvAddCoRoutineToReadyQueue( pxCRCB ); + } + } + + xLastTickCount = xCoRoutineTickCount; +} +/*-----------------------------------------------------------*/ + +void vCoRoutineSchedule( void ) +{ + /* See if any co-routines readied by events need moving to the ready lists. */ + prvCheckPendingReadyList(); + + /* See if any delayed co-routines have timed out. */ + prvCheckDelayedList(); + + /* Find the highest priority queue that contains ready co-routines. */ + while( listLIST_IS_EMPTY( &( pxReadyCoRoutineLists[ uxTopCoRoutineReadyPriority ] ) ) ) + { + if( uxTopCoRoutineReadyPriority == 0 ) + { + /* No more co-routines to check. */ + return; + } + --uxTopCoRoutineReadyPriority; + } + + /* listGET_OWNER_OF_NEXT_ENTRY walks through the list, so the co-routines + of the same priority get an equal share of the processor time. */ + listGET_OWNER_OF_NEXT_ENTRY( pxCurrentCoRoutine, &( pxReadyCoRoutineLists[ uxTopCoRoutineReadyPriority ] ) ); + + /* Call the co-routine. */ + ( pxCurrentCoRoutine->pxCoRoutineFunction )( pxCurrentCoRoutine, pxCurrentCoRoutine->uxIndex ); + + return; +} +/*-----------------------------------------------------------*/ + +static void prvInitialiseCoRoutineLists( void ) +{ +unsigned portBASE_TYPE uxPriority; + + for( uxPriority = 0; uxPriority < configMAX_CO_ROUTINE_PRIORITIES; uxPriority++ ) + { + vListInitialise( ( xList * ) &( pxReadyCoRoutineLists[ uxPriority ] ) ); + } + + vListInitialise( ( xList * ) &xDelayedCoRoutineList1 ); + vListInitialise( ( xList * ) &xDelayedCoRoutineList2 ); + vListInitialise( ( xList * ) &xPendingReadyCoRoutineList ); + + /* Start with pxDelayedCoRoutineList using list1 and the + pxOverflowDelayedCoRoutineList using list2. */ + pxDelayedCoRoutineList = &xDelayedCoRoutineList1; + pxOverflowDelayedCoRoutineList = &xDelayedCoRoutineList2; +} +/*-----------------------------------------------------------*/ + +signed portBASE_TYPE xCoRoutineRemoveFromEventList( const xList *pxEventList ) +{ +corCRCB *pxUnblockedCRCB; +signed portBASE_TYPE xReturn; + + /* This function is called from within an interrupt. It can only access + event lists and the pending ready list. This function assumes that a + check has already been made to ensure pxEventList is not empty. */ + pxUnblockedCRCB = ( corCRCB * ) listGET_OWNER_OF_HEAD_ENTRY( pxEventList ); + vListRemove( &( pxUnblockedCRCB->xEventListItem ) ); + vListInsertEnd( ( xList * ) &( xPendingReadyCoRoutineList ), &( pxUnblockedCRCB->xEventListItem ) ); + + if( pxUnblockedCRCB->uxPriority >= pxCurrentCoRoutine->uxPriority ) + { + xReturn = pdTRUE; + } + else + { + xReturn = pdFALSE; + } + + return xReturn; +} + diff --git a/FreeRTOSWithTraces/FreeRTOS_src/list.c b/FreeRTOSWithTraces/FreeRTOS_src/list.c new file mode 100644 index 0000000000000000000000000000000000000000..c3ef2a89dd717defcc730c4d1d94a9187600db33 --- /dev/null +++ b/FreeRTOSWithTraces/FreeRTOS_src/list.c @@ -0,0 +1,197 @@ +/* + FreeRTOS V7.0.1 - Copyright (C) 2011 Real Time Engineers Ltd. + + + FreeRTOS supports many tools and architectures. V7.0.0 is sponsored by: + Atollic AB - Atollic provides professional embedded systems development + tools for C/C++ development, code analysis and test automation. + See http://www.atollic.com + + + *************************************************************************** + * * + * FreeRTOS tutorial books are available in pdf and paperback. * + * Complete, revised, and edited pdf reference manuals are also * + * available. * + * * + * Purchasing FreeRTOS documentation will not only help you, by * + * ensuring you get running as quickly as possible and with an * + * in-depth knowledge of how to use FreeRTOS, it will also help * + * the FreeRTOS project to continue with its mission of providing * + * professional grade, cross platform, de facto standard solutions * + * for microcontrollers - completely free of charge! * + * * + * >>> See http://www.FreeRTOS.org/Documentation for details. <<< * + * * + * Thank you for using FreeRTOS, and thank you for your support! * + * * + *************************************************************************** + + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation AND MODIFIED BY the FreeRTOS exception. + >>>NOTE<<< The modification to the GPL is included to allow you to + distribute a combined work that includes FreeRTOS without being obliged to + provide the source code for proprietary components outside of the FreeRTOS + kernel. FreeRTOS is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + more details. You should have received a copy of the GNU General Public + License and the FreeRTOS license exception along with FreeRTOS; if not it + can be viewed here: http://www.freertos.org/a00114.html and also obtained + by writing to Richard Barry, contact details for whom are available on the + FreeRTOS WEB site. + + 1 tab == 4 spaces! + + http://www.FreeRTOS.org - Documentation, latest information, license and + contact details. + + http://www.SafeRTOS.com - A version that is certified for use in safety + critical systems. + + http://www.OpenRTOS.com - Commercial support, development, porting, + licensing and training services. +*/ + + +#include <stdlib.h> +#include "FreeRTOS.h" +#include "list.h" + +/*----------------------------------------------------------- + * PUBLIC LIST API documented in list.h + *----------------------------------------------------------*/ + +void vListInitialise( xList *pxList ) +{ + /* The list structure contains a list item which is used to mark the + end of the list. To initialise the list the list end is inserted + as the only list entry. */ + pxList->pxIndex = ( xListItem * ) &( pxList->xListEnd ); + + /* The list end value is the highest possible value in the list to + ensure it remains at the end of the list. */ + pxList->xListEnd.xItemValue = portMAX_DELAY; + + /* The list end next and previous pointers point to itself so we know + when the list is empty. */ + pxList->xListEnd.pxNext = ( xListItem * ) &( pxList->xListEnd ); + pxList->xListEnd.pxPrevious = ( xListItem * ) &( pxList->xListEnd ); + + pxList->uxNumberOfItems = ( unsigned portBASE_TYPE ) 0U; +} +/*-----------------------------------------------------------*/ + +void vListInitialiseItem( xListItem *pxItem ) +{ + /* Make sure the list item is not recorded as being on a list. */ + pxItem->pvContainer = NULL; +} +/*-----------------------------------------------------------*/ + +void vListInsertEnd( xList *pxList, xListItem *pxNewListItem ) +{ +volatile xListItem * pxIndex; + + /* Insert a new list item into pxList, but rather than sort the list, + makes the new list item the last item to be removed by a call to + pvListGetOwnerOfNextEntry. This means it has to be the item pointed to by + the pxIndex member. */ + pxIndex = pxList->pxIndex; + + pxNewListItem->pxNext = pxIndex->pxNext; + pxNewListItem->pxPrevious = pxList->pxIndex; + pxIndex->pxNext->pxPrevious = ( volatile xListItem * ) pxNewListItem; + pxIndex->pxNext = ( volatile xListItem * ) pxNewListItem; + pxList->pxIndex = ( volatile xListItem * ) pxNewListItem; + + /* Remember which list the item is in. */ + pxNewListItem->pvContainer = ( void * ) pxList; + + ( pxList->uxNumberOfItems )++; +} +/*-----------------------------------------------------------*/ + +void vListInsert( xList *pxList, xListItem *pxNewListItem ) +{ +volatile xListItem *pxIterator; +portTickType xValueOfInsertion; + + /* Insert the new list item into the list, sorted in ulListItem order. */ + xValueOfInsertion = pxNewListItem->xItemValue; + + /* If the list already contains a list item with the same item value then + the new list item should be placed after it. This ensures that TCB's which + are stored in ready lists (all of which have the same ulListItem value) + get an equal share of the CPU. However, if the xItemValue is the same as + the back marker the iteration loop below will not end. This means we need + to guard against this by checking the value first and modifying the + algorithm slightly if necessary. */ + if( xValueOfInsertion == portMAX_DELAY ) + { + pxIterator = pxList->xListEnd.pxPrevious; + } + else + { + /* *** NOTE *********************************************************** + If you find your application is crashing here then likely causes are: + 1) Stack overflow - + see http://www.freertos.org/Stacks-and-stack-overflow-checking.html + 2) Incorrect interrupt priority assignment, especially on Cortex-M3 + parts where numerically high priority values denote low actual + interrupt priories, which can seem counter intuitive. See + configMAX_SYSCALL_INTERRUPT_PRIORITY on http://www.freertos.org/a00110.html + 3) Calling an API function from within a critical section or when + the scheduler is suspended. + 4) Using a queue or semaphore before it has been initialised or + before the scheduler has been started (are interrupts firing + before vTaskStartScheduler() has been called?). + See http://www.freertos.org/FAQHelp.html for more tips. + **********************************************************************/ + + for( pxIterator = ( xListItem * ) &( pxList->xListEnd ); pxIterator->pxNext->xItemValue <= xValueOfInsertion; pxIterator = pxIterator->pxNext ) + { + /* There is nothing to do here, we are just iterating to the + wanted insertion position. */ + } + } + + pxNewListItem->pxNext = pxIterator->pxNext; + pxNewListItem->pxNext->pxPrevious = ( volatile xListItem * ) pxNewListItem; + pxNewListItem->pxPrevious = pxIterator; + pxIterator->pxNext = ( volatile xListItem * ) pxNewListItem; + + /* Remember which list the item is in. This allows fast removal of the + item later. */ + pxNewListItem->pvContainer = ( void * ) pxList; + + ( pxList->uxNumberOfItems )++; +} +/*-----------------------------------------------------------*/ + +void vListRemove( xListItem *pxItemToRemove ) +{ +xList * pxList; + + pxItemToRemove->pxNext->pxPrevious = pxItemToRemove->pxPrevious; + pxItemToRemove->pxPrevious->pxNext = pxItemToRemove->pxNext; + + /* The list item knows which list it is in. Obtain the list from the list + item. */ + pxList = ( xList * ) pxItemToRemove->pvContainer; + + /* Make sure the index is left pointing to a valid item. */ + if( pxList->pxIndex == pxItemToRemove ) + { + pxList->pxIndex = pxItemToRemove->pxPrevious; + } + + pxItemToRemove->pvContainer = NULL; + ( pxList->uxNumberOfItems )--; +} +/*-----------------------------------------------------------*/ + diff --git a/FreeRTOSWithTraces/FreeRTOS_src/queue.c b/FreeRTOSWithTraces/FreeRTOS_src/queue.c new file mode 100644 index 0000000000000000000000000000000000000000..2ae7c7030d709346aaca69cd83296bcd0b1ed95f --- /dev/null +++ b/FreeRTOSWithTraces/FreeRTOS_src/queue.c @@ -0,0 +1,1539 @@ +/* + FreeRTOS V7.0.1 - Copyright (C) 2011 Real Time Engineers Ltd. + + + FreeRTOS supports many tools and architectures. V7.0.0 is sponsored by: + Atollic AB - Atollic provides professional embedded systems development + tools for C/C++ development, code analysis and test automation. + See http://www.atollic.com + + + *************************************************************************** + * * + * FreeRTOS tutorial books are available in pdf and paperback. * + * Complete, revised, and edited pdf reference manuals are also * + * available. * + * * + * Purchasing FreeRTOS documentation will not only help you, by * + * ensuring you get running as quickly as possible and with an * + * in-depth knowledge of how to use FreeRTOS, it will also help * + * the FreeRTOS project to continue with its mission of providing * + * professional grade, cross platform, de facto standard solutions * + * for microcontrollers - completely free of charge! * + * * + * >>> See http://www.FreeRTOS.org/Documentation for details. <<< * + * * + * Thank you for using FreeRTOS, and thank you for your support! * + * * + *************************************************************************** + + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation AND MODIFIED BY the FreeRTOS exception. + >>>NOTE<<< The modification to the GPL is included to allow you to + distribute a combined work that includes FreeRTOS without being obliged to + provide the source code for proprietary components outside of the FreeRTOS + kernel. FreeRTOS is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + more details. You should have received a copy of the GNU General Public + License and the FreeRTOS license exception along with FreeRTOS; if not it + can be viewed here: http://www.freertos.org/a00114.html and also obtained + by writing to Richard Barry, contact details for whom are available on the + FreeRTOS WEB site. + + 1 tab == 4 spaces! + + http://www.FreeRTOS.org - Documentation, latest information, license and + contact details. + + http://www.SafeRTOS.com - A version that is certified for use in safety + critical systems. + + http://www.OpenRTOS.com - Commercial support, development, porting, + licensing and training services. +*/ + +#include <stdlib.h> +#include <string.h> + +/* Defining MPU_WRAPPERS_INCLUDED_FROM_API_FILE prevents task.h from redefining +all the API functions to use the MPU wrappers. That should only be done when +task.h is included from an application file. */ +#define MPU_WRAPPERS_INCLUDED_FROM_API_FILE + +#include "FreeRTOS.h" +#include "task.h" +#include "croutine.h" + +#undef MPU_WRAPPERS_INCLUDED_FROM_API_FILE + +/*----------------------------------------------------------- + * PUBLIC LIST API documented in list.h + *----------------------------------------------------------*/ + +/* Constants used with the cRxLock and cTxLock structure members. */ +#define queueUNLOCKED ( ( signed portBASE_TYPE ) -1 ) +#define queueLOCKED_UNMODIFIED ( ( signed portBASE_TYPE ) 0 ) + +#define queueERRONEOUS_UNBLOCK ( -1 ) + +/* For internal use only. */ +#define queueSEND_TO_BACK ( 0 ) +#define queueSEND_TO_FRONT ( 1 ) + +/* Effectively make a union out of the xQUEUE structure. */ +#define pxMutexHolder pcTail +#define uxQueueType pcHead +#define uxRecursiveCallCount pcReadFrom +#define queueQUEUE_IS_MUTEX NULL + +/* Semaphores do not actually store or copy data, so have an items size of +zero. */ +#define queueSEMAPHORE_QUEUE_ITEM_LENGTH ( 0 ) +#define queueDONT_BLOCK ( ( portTickType ) 0 ) +#define queueMUTEX_GIVE_BLOCK_TIME ( ( portTickType ) 0 ) + +/* + * Definition of the queue used by the scheduler. + * Items are queued by copy, not reference. + */ +typedef struct QueueDefinition +{ + signed char *pcHead; /*< Points to the beginning of the queue storage area. */ + signed char *pcTail; /*< Points to the byte at the end of the queue storage area. Once more byte is allocated than necessary to store the queue items, this is used as a marker. */ + + signed char *pcWriteTo; /*< Points to the free next place in the storage area. */ + signed char *pcReadFrom; /*< Points to the last place that a queued item was read from. */ + + xList xTasksWaitingToSend; /*< List of tasks that are blocked waiting to post onto this queue. Stored in priority order. */ + xList xTasksWaitingToReceive; /*< List of tasks that are blocked waiting to read from this queue. Stored in priority order. */ + + volatile unsigned portBASE_TYPE uxMessagesWaiting;/*< The number of items currently in the queue. */ + unsigned portBASE_TYPE uxLength; /*< The length of the queue defined as the number of items it will hold, not the number of bytes. */ + unsigned portBASE_TYPE uxItemSize; /*< The size of each items that the queue will hold. */ + + signed portBASE_TYPE xRxLock; /*< Stores the number of items received from the queue (removed from the queue) while the queue was locked. Set to queueUNLOCKED when the queue is not locked. */ + signed portBASE_TYPE xTxLock; /*< Stores the number of items transmitted to the queue (added to the queue) while the queue was locked. Set to queueUNLOCKED when the queue is not locked. */ + +} xQUEUE; +/*-----------------------------------------------------------*/ + +/* + * Inside this file xQueueHandle is a pointer to a xQUEUE structure. + * To keep the definition private the API header file defines it as a + * pointer to void. + */ +typedef xQUEUE * xQueueHandle; + +/* + * Prototypes for public functions are included here so we don't have to + * include the API header file (as it defines xQueueHandle differently). These + * functions are documented in the API header file. + */ +xQueueHandle xQueueCreate( unsigned portBASE_TYPE uxQueueLength, unsigned portBASE_TYPE uxItemSize ) PRIVILEGED_FUNCTION; +signed portBASE_TYPE xQueueGenericSend( xQueueHandle xQueue, const void * const pvItemToQueue, portTickType xTicksToWait, portBASE_TYPE xCopyPosition ) PRIVILEGED_FUNCTION; +unsigned portBASE_TYPE uxQueueMessagesWaiting( const xQueueHandle pxQueue ) PRIVILEGED_FUNCTION; +void vQueueDelete( xQueueHandle xQueue ) PRIVILEGED_FUNCTION; +signed portBASE_TYPE xQueueGenericSendFromISR( xQueueHandle pxQueue, const void * const pvItemToQueue, signed portBASE_TYPE *pxHigherPriorityTaskWoken, portBASE_TYPE xCopyPosition ) PRIVILEGED_FUNCTION; +signed portBASE_TYPE xQueueGenericReceive( xQueueHandle pxQueue, void * const pvBuffer, portTickType xTicksToWait, portBASE_TYPE xJustPeeking ) PRIVILEGED_FUNCTION; +signed portBASE_TYPE xQueueReceiveFromISR( xQueueHandle pxQueue, void * const pvBuffer, signed portBASE_TYPE *pxTaskWoken ) PRIVILEGED_FUNCTION; +xQueueHandle xQueueCreateMutex( void ) PRIVILEGED_FUNCTION; +xQueueHandle xQueueCreateCountingSemaphore( unsigned portBASE_TYPE uxCountValue, unsigned portBASE_TYPE uxInitialCount ) PRIVILEGED_FUNCTION; +portBASE_TYPE xQueueTakeMutexRecursive( xQueueHandle xMutex, portTickType xBlockTime ) PRIVILEGED_FUNCTION; +portBASE_TYPE xQueueGiveMutexRecursive( xQueueHandle xMutex ) PRIVILEGED_FUNCTION; +signed portBASE_TYPE xQueueAltGenericSend( xQueueHandle pxQueue, const void * const pvItemToQueue, portTickType xTicksToWait, portBASE_TYPE xCopyPosition ) PRIVILEGED_FUNCTION; +signed portBASE_TYPE xQueueAltGenericReceive( xQueueHandle pxQueue, void * const pvBuffer, portTickType xTicksToWait, portBASE_TYPE xJustPeeking ) PRIVILEGED_FUNCTION; +signed portBASE_TYPE xQueueIsQueueEmptyFromISR( const xQueueHandle pxQueue ) PRIVILEGED_FUNCTION; +signed portBASE_TYPE xQueueIsQueueFullFromISR( const xQueueHandle pxQueue ) PRIVILEGED_FUNCTION; +unsigned portBASE_TYPE uxQueueMessagesWaitingFromISR( const xQueueHandle pxQueue ) PRIVILEGED_FUNCTION; +void vQueueWaitForMessageRestricted( xQueueHandle pxQueue, portTickType xTicksToWait ) PRIVILEGED_FUNCTION; + +/* + * Co-routine queue functions differ from task queue functions. Co-routines are + * an optional component. + */ +#if configUSE_CO_ROUTINES == 1 + signed portBASE_TYPE xQueueCRSendFromISR( xQueueHandle pxQueue, const void *pvItemToQueue, signed portBASE_TYPE xCoRoutinePreviouslyWoken ) PRIVILEGED_FUNCTION; + signed portBASE_TYPE xQueueCRReceiveFromISR( xQueueHandle pxQueue, void *pvBuffer, signed portBASE_TYPE *pxTaskWoken ) PRIVILEGED_FUNCTION; + signed portBASE_TYPE xQueueCRSend( xQueueHandle pxQueue, const void *pvItemToQueue, portTickType xTicksToWait ) PRIVILEGED_FUNCTION; + signed portBASE_TYPE xQueueCRReceive( xQueueHandle pxQueue, void *pvBuffer, portTickType xTicksToWait ) PRIVILEGED_FUNCTION; +#endif + +/* + * The queue registry is just a means for kernel aware debuggers to locate + * queue structures. It has no other purpose so is an optional component. + */ +#if configQUEUE_REGISTRY_SIZE > 0 + + /* The type stored within the queue registry array. This allows a name + to be assigned to each queue making kernel aware debugging a little + more user friendly. */ + typedef struct QUEUE_REGISTRY_ITEM + { + signed char *pcQueueName; + xQueueHandle xHandle; + } xQueueRegistryItem; + + /* The queue registry is simply an array of xQueueRegistryItem structures. + The pcQueueName member of a structure being NULL is indicative of the + array position being vacant. */ + xQueueRegistryItem xQueueRegistry[ configQUEUE_REGISTRY_SIZE ]; + + /* Removes a queue from the registry by simply setting the pcQueueName + member to NULL. */ + static void vQueueUnregisterQueue( xQueueHandle xQueue ) PRIVILEGED_FUNCTION; + void vQueueAddToRegistry( xQueueHandle xQueue, signed char *pcQueueName ) PRIVILEGED_FUNCTION; +#endif + +/* + * Unlocks a queue locked by a call to prvLockQueue. Locking a queue does not + * prevent an ISR from adding or removing items to the queue, but does prevent + * an ISR from removing tasks from the queue event lists. If an ISR finds a + * queue is locked it will instead increment the appropriate queue lock count + * to indicate that a task may require unblocking. When the queue in unlocked + * these lock counts are inspected, and the appropriate action taken. + */ +static void prvUnlockQueue( xQueueHandle pxQueue ) PRIVILEGED_FUNCTION; + +/* + * Uses a critical section to determine if there is any data in a queue. + * + * @return pdTRUE if the queue contains no items, otherwise pdFALSE. + */ +static signed portBASE_TYPE prvIsQueueEmpty( const xQueueHandle pxQueue ) PRIVILEGED_FUNCTION; + +/* + * Uses a critical section to determine if there is any space in a queue. + * + * @return pdTRUE if there is no space, otherwise pdFALSE; + */ +static signed portBASE_TYPE prvIsQueueFull( const xQueueHandle pxQueue ) PRIVILEGED_FUNCTION; + +/* + * Copies an item into the queue, either at the front of the queue or the + * back of the queue. + */ +static void prvCopyDataToQueue( xQUEUE *pxQueue, const void *pvItemToQueue, portBASE_TYPE xPosition ) PRIVILEGED_FUNCTION; + +/* + * Copies an item out of a queue. + */ +static void prvCopyDataFromQueue( xQUEUE * const pxQueue, const void *pvBuffer ) PRIVILEGED_FUNCTION; +/*-----------------------------------------------------------*/ + +/* + * Macro to mark a queue as locked. Locking a queue prevents an ISR from + * accessing the queue event lists. + */ +#define prvLockQueue( pxQueue ) \ + taskENTER_CRITICAL(); \ + { \ + if( ( pxQueue )->xRxLock == queueUNLOCKED ) \ + { \ + ( pxQueue )->xRxLock = queueLOCKED_UNMODIFIED; \ + } \ + if( ( pxQueue )->xTxLock == queueUNLOCKED ) \ + { \ + ( pxQueue )->xTxLock = queueLOCKED_UNMODIFIED; \ + } \ + } \ + taskEXIT_CRITICAL() +/*-----------------------------------------------------------*/ + + +/*----------------------------------------------------------- + * PUBLIC QUEUE MANAGEMENT API documented in queue.h + *----------------------------------------------------------*/ + +xQueueHandle xQueueCreate( unsigned portBASE_TYPE uxQueueLength, unsigned portBASE_TYPE uxItemSize ) +{ +xQUEUE *pxNewQueue; +size_t xQueueSizeInBytes; +xQueueHandle xReturn = NULL; + + /* Allocate the new queue structure. */ + if( uxQueueLength > ( unsigned portBASE_TYPE ) 0 ) + { + pxNewQueue = ( xQUEUE * ) pvPortMalloc( sizeof( xQUEUE ) ); + if( pxNewQueue != NULL ) + { + /* Create the list of pointers to queue items. The queue is one byte + longer than asked for to make wrap checking easier/faster. */ + xQueueSizeInBytes = ( size_t ) ( uxQueueLength * uxItemSize ) + ( size_t ) 1; + + pxNewQueue->pcHead = ( signed char * ) pvPortMalloc( xQueueSizeInBytes ); + if( pxNewQueue->pcHead != NULL ) + { + /* Initialise the queue members as described above where the + queue type is defined. */ + pxNewQueue->pcTail = pxNewQueue->pcHead + ( uxQueueLength * uxItemSize ); + pxNewQueue->uxMessagesWaiting = ( unsigned portBASE_TYPE ) 0U; + pxNewQueue->pcWriteTo = pxNewQueue->pcHead; + pxNewQueue->pcReadFrom = pxNewQueue->pcHead + ( ( uxQueueLength - ( unsigned portBASE_TYPE ) 1U ) * uxItemSize ); + pxNewQueue->uxLength = uxQueueLength; + pxNewQueue->uxItemSize = uxItemSize; + pxNewQueue->xRxLock = queueUNLOCKED; + pxNewQueue->xTxLock = queueUNLOCKED; + + /* Likewise ensure the event queues start with the correct state. */ + vListInitialise( &( pxNewQueue->xTasksWaitingToSend ) ); + vListInitialise( &( pxNewQueue->xTasksWaitingToReceive ) ); + + traceQUEUE_CREATE( pxNewQueue ); + xReturn = pxNewQueue; + } + else + { + traceQUEUE_CREATE_FAILED(); + vPortFree( pxNewQueue ); + } + } + } + + configASSERT( xReturn ); + + return xReturn; +} +/*-----------------------------------------------------------*/ + +#if ( configUSE_MUTEXES == 1 ) + + xQueueHandle xQueueCreateMutex( void ) + { + xQUEUE *pxNewQueue; + + /* Allocate the new queue structure. */ + pxNewQueue = ( xQUEUE * ) pvPortMalloc( sizeof( xQUEUE ) ); + if( pxNewQueue != NULL ) + { + /* Information required for priority inheritance. */ + pxNewQueue->pxMutexHolder = NULL; + pxNewQueue->uxQueueType = queueQUEUE_IS_MUTEX; + + /* Queues used as a mutex no data is actually copied into or out + of the queue. */ + pxNewQueue->pcWriteTo = NULL; + pxNewQueue->pcReadFrom = NULL; + + /* Each mutex has a length of 1 (like a binary semaphore) and + an item size of 0 as nothing is actually copied into or out + of the mutex. */ + pxNewQueue->uxMessagesWaiting = ( unsigned portBASE_TYPE ) 0U; + pxNewQueue->uxLength = ( unsigned portBASE_TYPE ) 1U; + pxNewQueue->uxItemSize = ( unsigned portBASE_TYPE ) 0U; + pxNewQueue->xRxLock = queueUNLOCKED; + pxNewQueue->xTxLock = queueUNLOCKED; + + /* Ensure the event queues start with the correct state. */ + vListInitialise( &( pxNewQueue->xTasksWaitingToSend ) ); + vListInitialise( &( pxNewQueue->xTasksWaitingToReceive ) ); + + /* Start with the semaphore in the expected state. */ + xQueueGenericSend( pxNewQueue, NULL, ( portTickType ) 0U, queueSEND_TO_BACK ); + + traceCREATE_MUTEX( pxNewQueue ); + } + else + { + traceCREATE_MUTEX_FAILED(); + } + + configASSERT( pxNewQueue ); + return pxNewQueue; + } + +#endif /* configUSE_MUTEXES */ +/*-----------------------------------------------------------*/ + +#if configUSE_RECURSIVE_MUTEXES == 1 + + portBASE_TYPE xQueueGiveMutexRecursive( xQueueHandle pxMutex ) + { + portBASE_TYPE xReturn; + + configASSERT( pxMutex ); + + /* If this is the task that holds the mutex then pxMutexHolder will not + change outside of this task. If this task does not hold the mutex then + pxMutexHolder can never coincidentally equal the tasks handle, and as + this is the only condition we are interested in it does not matter if + pxMutexHolder is accessed simultaneously by another task. Therefore no + mutual exclusion is required to test the pxMutexHolder variable. */ + if( pxMutex->pxMutexHolder == xTaskGetCurrentTaskHandle() ) + { + traceGIVE_MUTEX_RECURSIVE( pxMutex ); + + /* uxRecursiveCallCount cannot be zero if pxMutexHolder is equal to + the task handle, therefore no underflow check is required. Also, + uxRecursiveCallCount is only modified by the mutex holder, and as + there can only be one, no mutual exclusion is required to modify the + uxRecursiveCallCount member. */ + ( pxMutex->uxRecursiveCallCount )--; + + /* Have we unwound the call count? */ + if( pxMutex->uxRecursiveCallCount == 0 ) + { + /* Return the mutex. This will automatically unblock any other + task that might be waiting to access the mutex. */ + xQueueGenericSend( pxMutex, NULL, queueMUTEX_GIVE_BLOCK_TIME, queueSEND_TO_BACK ); + } + + xReturn = pdPASS; + } + else + { + /* We cannot give the mutex because we are not the holder. */ + xReturn = pdFAIL; + + traceGIVE_MUTEX_RECURSIVE_FAILED( pxMutex ); + } + + return xReturn; + } + +#endif /* configUSE_RECURSIVE_MUTEXES */ +/*-----------------------------------------------------------*/ + +#if configUSE_RECURSIVE_MUTEXES == 1 + + portBASE_TYPE xQueueTakeMutexRecursive( xQueueHandle pxMutex, portTickType xBlockTime ) + { + portBASE_TYPE xReturn; + + configASSERT( pxMutex ); + + /* Comments regarding mutual exclusion as per those within + xQueueGiveMutexRecursive(). */ + + traceTAKE_MUTEX_RECURSIVE( pxMutex ); + + if( pxMutex->pxMutexHolder == xTaskGetCurrentTaskHandle() ) + { + ( pxMutex->uxRecursiveCallCount )++; + xReturn = pdPASS; + } + else + { + xReturn = xQueueGenericReceive( pxMutex, NULL, xBlockTime, pdFALSE ); + + /* pdPASS will only be returned if we successfully obtained the mutex, + we may have blocked to reach here. */ + if( xReturn == pdPASS ) + { + ( pxMutex->uxRecursiveCallCount )++; + } + else + { + traceTAKE_MUTEX_RECURSIVE_FAILED( pxMutex ); + } + } + + return xReturn; + } + +#endif /* configUSE_RECURSIVE_MUTEXES */ +/*-----------------------------------------------------------*/ + +#if configUSE_COUNTING_SEMAPHORES == 1 + + xQueueHandle xQueueCreateCountingSemaphore( unsigned portBASE_TYPE uxCountValue, unsigned portBASE_TYPE uxInitialCount ) + { + xQueueHandle pxHandle; + + pxHandle = xQueueCreate( ( unsigned portBASE_TYPE ) uxCountValue, queueSEMAPHORE_QUEUE_ITEM_LENGTH ); + + if( pxHandle != NULL ) + { + pxHandle->uxMessagesWaiting = uxInitialCount; + + traceCREATE_COUNTING_SEMAPHORE(); + } + else + { + traceCREATE_COUNTING_SEMAPHORE_FAILED(); + } + + configASSERT( pxHandle ); + return pxHandle; + } + +#endif /* configUSE_COUNTING_SEMAPHORES */ +/*-----------------------------------------------------------*/ + +signed portBASE_TYPE xQueueGenericSend( xQueueHandle pxQueue, const void * const pvItemToQueue, portTickType xTicksToWait, portBASE_TYPE xCopyPosition ) +{ +signed portBASE_TYPE xEntryTimeSet = pdFALSE; +xTimeOutType xTimeOut; + + configASSERT( pxQueue ); + configASSERT( !( ( pvItemToQueue == NULL ) && ( pxQueue->uxItemSize != ( unsigned portBASE_TYPE ) 0U ) ) ); + + /* This function relaxes the coding standard somewhat to allow return + statements within the function itself. This is done in the interest + of execution time efficiency. */ + for( ;; ) + { + taskENTER_CRITICAL(); + { + /* Is there room on the queue now? To be running we must be + the highest priority task wanting to access the queue. */ + if( pxQueue->uxMessagesWaiting < pxQueue->uxLength ) + { + traceQUEUE_SEND( pxQueue ); + prvCopyDataToQueue( pxQueue, pvItemToQueue, xCopyPosition ); + + /* If there was a task waiting for data to arrive on the + queue then unblock it now. */ + if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToReceive ) ) == pdFALSE ) + { + if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToReceive ) ) == pdTRUE ) + { + /* The unblocked task has a priority higher than + our own so yield immediately. Yes it is ok to do + this from within the critical section - the kernel + takes care of that. */ + portYIELD_WITHIN_API(); + } + } + + taskEXIT_CRITICAL(); + + /* Return to the original privilege level before exiting the + function. */ + return pdPASS; + } + else + { + if( xTicksToWait == ( portTickType ) 0 ) + { + /* The queue was full and no block time is specified (or + the block time has expired) so leave now. */ + taskEXIT_CRITICAL(); + + /* Return to the original privilege level before exiting + the function. */ + traceQUEUE_SEND_FAILED( pxQueue ); + return errQUEUE_FULL; + } + else if( xEntryTimeSet == pdFALSE ) + { + /* The queue was full and a block time was specified so + configure the timeout structure. */ + vTaskSetTimeOutState( &xTimeOut ); + xEntryTimeSet = pdTRUE; + } + } + } + taskEXIT_CRITICAL(); + + /* Interrupts and other tasks can send to and receive from the queue + now the critical section has been exited. */ + + vTaskSuspendAll(); + prvLockQueue( pxQueue ); + + /* Update the timeout state to see if it has expired yet. */ + if( xTaskCheckForTimeOut( &xTimeOut, &xTicksToWait ) == pdFALSE ) + { + if( prvIsQueueFull( pxQueue ) ) + { + traceBLOCKING_ON_QUEUE_SEND( pxQueue ); + vTaskPlaceOnEventList( &( pxQueue->xTasksWaitingToSend ), xTicksToWait ); + + /* Unlocking the queue means queue events can effect the + event list. It is possible that interrupts occurring now + remove this task from the event list again - but as the + scheduler is suspended the task will go onto the pending + ready last instead of the actual ready list. */ + prvUnlockQueue( pxQueue ); + + /* Resuming the scheduler will move tasks from the pending + ready list into the ready list - so it is feasible that this + task is already in a ready list before it yields - in which + case the yield will not cause a context switch unless there + is also a higher priority task in the pending ready list. */ + if( !xTaskResumeAll() ) + { + portYIELD_WITHIN_API(); + } + } + else + { + /* Try again. */ + prvUnlockQueue( pxQueue ); + ( void ) xTaskResumeAll(); + } + } + else + { + /* The timeout has expired. */ + prvUnlockQueue( pxQueue ); + ( void ) xTaskResumeAll(); + + /* Return to the original privilege level before exiting the + function. */ + traceQUEUE_SEND_FAILED( pxQueue ); + return errQUEUE_FULL; + } + } +} +/*-----------------------------------------------------------*/ + +#if configUSE_ALTERNATIVE_API == 1 + + signed portBASE_TYPE xQueueAltGenericSend( xQueueHandle pxQueue, const void * const pvItemToQueue, portTickType xTicksToWait, portBASE_TYPE xCopyPosition ) + { + signed portBASE_TYPE xEntryTimeSet = pdFALSE; + xTimeOutType xTimeOut; + + configASSERT( pxQueue ); + configASSERT( !( ( pvItemToQueue == NULL ) && ( pxQueue->uxItemSize != ( unsigned portBASE_TYPE ) 0U ) ) ); + + for( ;; ) + { + taskENTER_CRITICAL(); + { + /* Is there room on the queue now? To be running we must be + the highest priority task wanting to access the queue. */ + if( pxQueue->uxMessagesWaiting < pxQueue->uxLength ) + { + traceQUEUE_SEND( pxQueue ); + prvCopyDataToQueue( pxQueue, pvItemToQueue, xCopyPosition ); + + /* If there was a task waiting for data to arrive on the + queue then unblock it now. */ + if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToReceive ) ) == pdFALSE ) + { + if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToReceive ) ) == pdTRUE ) + { + /* The unblocked task has a priority higher than + our own so yield immediately. */ + portYIELD_WITHIN_API(); + } + } + + taskEXIT_CRITICAL(); + return pdPASS; + } + else + { + if( xTicksToWait == ( portTickType ) 0 ) + { + taskEXIT_CRITICAL(); + return errQUEUE_FULL; + } + else if( xEntryTimeSet == pdFALSE ) + { + vTaskSetTimeOutState( &xTimeOut ); + xEntryTimeSet = pdTRUE; + } + } + } + taskEXIT_CRITICAL(); + + taskENTER_CRITICAL(); + { + if( xTaskCheckForTimeOut( &xTimeOut, &xTicksToWait ) == pdFALSE ) + { + if( prvIsQueueFull( pxQueue ) ) + { + traceBLOCKING_ON_QUEUE_SEND( pxQueue ); + vTaskPlaceOnEventList( &( pxQueue->xTasksWaitingToSend ), xTicksToWait ); + portYIELD_WITHIN_API(); + } + } + else + { + taskEXIT_CRITICAL(); + traceQUEUE_SEND_FAILED( pxQueue ); + return errQUEUE_FULL; + } + } + taskEXIT_CRITICAL(); + } + } + +#endif /* configUSE_ALTERNATIVE_API */ +/*-----------------------------------------------------------*/ + +#if configUSE_ALTERNATIVE_API == 1 + + signed portBASE_TYPE xQueueAltGenericReceive( xQueueHandle pxQueue, void * const pvBuffer, portTickType xTicksToWait, portBASE_TYPE xJustPeeking ) + { + signed portBASE_TYPE xEntryTimeSet = pdFALSE; + xTimeOutType xTimeOut; + signed char *pcOriginalReadPosition; + + configASSERT( pxQueue ); + configASSERT( !( ( pvBuffer == NULL ) && ( pxQueue->uxItemSize != ( unsigned portBASE_TYPE ) 0U ) ) ); + + for( ;; ) + { + taskENTER_CRITICAL(); + { + if( pxQueue->uxMessagesWaiting > ( unsigned portBASE_TYPE ) 0 ) + { + /* Remember our read position in case we are just peeking. */ + pcOriginalReadPosition = pxQueue->pcReadFrom; + + prvCopyDataFromQueue( pxQueue, pvBuffer ); + + if( xJustPeeking == pdFALSE ) + { + traceQUEUE_RECEIVE( pxQueue ); + + /* We are actually removing data. */ + --( pxQueue->uxMessagesWaiting ); + + #if ( configUSE_MUTEXES == 1 ) + { + if( pxQueue->uxQueueType == queueQUEUE_IS_MUTEX ) + { + /* Record the information required to implement + priority inheritance should it become necessary. */ + pxQueue->pxMutexHolder = xTaskGetCurrentTaskHandle(); + } + } + #endif + + if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToSend ) ) == pdFALSE ) + { + if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToSend ) ) == pdTRUE ) + { + portYIELD_WITHIN_API(); + } + } + } + else + { + traceQUEUE_PEEK( pxQueue ); + + /* We are not removing the data, so reset our read + pointer. */ + pxQueue->pcReadFrom = pcOriginalReadPosition; + + /* The data is being left in the queue, so see if there are + any other tasks waiting for the data. */ + if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToReceive ) ) == pdFALSE ) + { + /* Tasks that are removed from the event list will get added to + the pending ready list as the scheduler is still suspended. */ + if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToReceive ) ) != pdFALSE ) + { + /* The task waiting has a higher priority than this task. */ + portYIELD_WITHIN_API(); + } + } + + } + + taskEXIT_CRITICAL(); + return pdPASS; + } + else + { + if( xTicksToWait == ( portTickType ) 0 ) + { + taskEXIT_CRITICAL(); + traceQUEUE_RECEIVE_FAILED( pxQueue ); + return errQUEUE_EMPTY; + } + else if( xEntryTimeSet == pdFALSE ) + { + vTaskSetTimeOutState( &xTimeOut ); + xEntryTimeSet = pdTRUE; + } + } + } + taskEXIT_CRITICAL(); + + taskENTER_CRITICAL(); + { + if( xTaskCheckForTimeOut( &xTimeOut, &xTicksToWait ) == pdFALSE ) + { + if( prvIsQueueEmpty( pxQueue ) ) + { + traceBLOCKING_ON_QUEUE_RECEIVE( pxQueue ); + + #if ( configUSE_MUTEXES == 1 ) + { + if( pxQueue->uxQueueType == queueQUEUE_IS_MUTEX ) + { + portENTER_CRITICAL(); + vTaskPriorityInherit( ( void * ) pxQueue->pxMutexHolder ); + portEXIT_CRITICAL(); + } + } + #endif + + vTaskPlaceOnEventList( &( pxQueue->xTasksWaitingToReceive ), xTicksToWait ); + portYIELD_WITHIN_API(); + } + } + else + { + taskEXIT_CRITICAL(); + traceQUEUE_RECEIVE_FAILED( pxQueue ); + return errQUEUE_EMPTY; + } + } + taskEXIT_CRITICAL(); + } + } + + +#endif /* configUSE_ALTERNATIVE_API */ +/*-----------------------------------------------------------*/ + +signed portBASE_TYPE xQueueGenericSendFromISR( xQueueHandle pxQueue, const void * const pvItemToQueue, signed portBASE_TYPE *pxHigherPriorityTaskWoken, portBASE_TYPE xCopyPosition ) +{ +signed portBASE_TYPE xReturn; +unsigned portBASE_TYPE uxSavedInterruptStatus; + + configASSERT( pxQueue ); + configASSERT( pxHigherPriorityTaskWoken ); + configASSERT( !( ( pvItemToQueue == NULL ) && ( pxQueue->uxItemSize != ( unsigned portBASE_TYPE ) 0U ) ) ); + + /* Similar to xQueueGenericSend, except we don't block if there is no room + in the queue. Also we don't directly wake a task that was blocked on a + queue read, instead we return a flag to say whether a context switch is + required or not (i.e. has a task with a higher priority than us been woken + by this post). */ + uxSavedInterruptStatus = portSET_INTERRUPT_MASK_FROM_ISR(); + { + if( pxQueue->uxMessagesWaiting < pxQueue->uxLength ) + { + traceQUEUE_SEND_FROM_ISR( pxQueue ); + + prvCopyDataToQueue( pxQueue, pvItemToQueue, xCopyPosition ); + + /* If the queue is locked we do not alter the event list. This will + be done when the queue is unlocked later. */ + if( pxQueue->xTxLock == queueUNLOCKED ) + { + if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToReceive ) ) == pdFALSE ) + { + if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToReceive ) ) != pdFALSE ) + { + /* The task waiting has a higher priority so record that a + context switch is required. */ + *pxHigherPriorityTaskWoken = pdTRUE; + } + } + } + else + { + /* Increment the lock count so the task that unlocks the queue + knows that data was posted while it was locked. */ + ++( pxQueue->xTxLock ); + } + + xReturn = pdPASS; + } + else + { + traceQUEUE_SEND_FROM_ISR_FAILED( pxQueue ); + xReturn = errQUEUE_FULL; + } + } + portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedInterruptStatus ); + + return xReturn; +} +/*-----------------------------------------------------------*/ + +signed portBASE_TYPE xQueueGenericReceive( xQueueHandle pxQueue, void * const pvBuffer, portTickType xTicksToWait, portBASE_TYPE xJustPeeking ) +{ +signed portBASE_TYPE xEntryTimeSet = pdFALSE; +xTimeOutType xTimeOut; +signed char *pcOriginalReadPosition; + + configASSERT( pxQueue ); + configASSERT( !( ( pvBuffer == NULL ) && ( pxQueue->uxItemSize != ( unsigned portBASE_TYPE ) 0U ) ) ); + + /* This function relaxes the coding standard somewhat to allow return + statements within the function itself. This is done in the interest + of execution time efficiency. */ + + for( ;; ) + { + taskENTER_CRITICAL(); + { + /* Is there data in the queue now? To be running we must be + the highest priority task wanting to access the queue. */ + if( pxQueue->uxMessagesWaiting > ( unsigned portBASE_TYPE ) 0 ) + { + /* Remember our read position in case we are just peeking. */ + pcOriginalReadPosition = pxQueue->pcReadFrom; + + prvCopyDataFromQueue( pxQueue, pvBuffer ); + + if( xJustPeeking == pdFALSE ) + { + traceQUEUE_RECEIVE( pxQueue ); + + /* We are actually removing data. */ + --( pxQueue->uxMessagesWaiting ); + + #if ( configUSE_MUTEXES == 1 ) + { + if( pxQueue->uxQueueType == queueQUEUE_IS_MUTEX ) + { + /* Record the information required to implement + priority inheritance should it become necessary. */ + pxQueue->pxMutexHolder = xTaskGetCurrentTaskHandle(); + } + } + #endif + + if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToSend ) ) == pdFALSE ) + { + if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToSend ) ) == pdTRUE ) + { + portYIELD_WITHIN_API(); + } + } + } + else + { + traceQUEUE_PEEK( pxQueue ); + + /* We are not removing the data, so reset our read + pointer. */ + pxQueue->pcReadFrom = pcOriginalReadPosition; + + /* The data is being left in the queue, so see if there are + any other tasks waiting for the data. */ + if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToReceive ) ) == pdFALSE ) + { + /* Tasks that are removed from the event list will get added to + the pending ready list as the scheduler is still suspended. */ + if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToReceive ) ) != pdFALSE ) + { + /* The task waiting has a higher priority than this task. */ + portYIELD_WITHIN_API(); + } + } + + } + + taskEXIT_CRITICAL(); + return pdPASS; + } + else + { + if( xTicksToWait == ( portTickType ) 0 ) + { + /* The queue was empty and no block time is specified (or + the block time has expired) so leave now. */ + taskEXIT_CRITICAL(); + traceQUEUE_RECEIVE_FAILED( pxQueue ); + return errQUEUE_EMPTY; + } + else if( xEntryTimeSet == pdFALSE ) + { + /* The queue was empty and a block time was specified so + configure the timeout structure. */ + vTaskSetTimeOutState( &xTimeOut ); + xEntryTimeSet = pdTRUE; + } + } + } + taskEXIT_CRITICAL(); + + /* Interrupts and other tasks can send to and receive from the queue + now the critical section has been exited. */ + + vTaskSuspendAll(); + prvLockQueue( pxQueue ); + + /* Update the timeout state to see if it has expired yet. */ + if( xTaskCheckForTimeOut( &xTimeOut, &xTicksToWait ) == pdFALSE ) + { + if( prvIsQueueEmpty( pxQueue ) ) + { + traceBLOCKING_ON_QUEUE_RECEIVE( pxQueue ); + + #if ( configUSE_MUTEXES == 1 ) + { + if( pxQueue->uxQueueType == queueQUEUE_IS_MUTEX ) + { + portENTER_CRITICAL(); + { + vTaskPriorityInherit( ( void * ) pxQueue->pxMutexHolder ); + } + portEXIT_CRITICAL(); + } + } + #endif + + vTaskPlaceOnEventList( &( pxQueue->xTasksWaitingToReceive ), xTicksToWait ); + prvUnlockQueue( pxQueue ); + if( !xTaskResumeAll() ) + { + portYIELD_WITHIN_API(); + } + } + else + { + /* Try again. */ + prvUnlockQueue( pxQueue ); + ( void ) xTaskResumeAll(); + } + } + else + { + prvUnlockQueue( pxQueue ); + ( void ) xTaskResumeAll(); + traceQUEUE_RECEIVE_FAILED( pxQueue ); + return errQUEUE_EMPTY; + } + } +} +/*-----------------------------------------------------------*/ + +signed portBASE_TYPE xQueueReceiveFromISR( xQueueHandle pxQueue, void * const pvBuffer, signed portBASE_TYPE *pxTaskWoken ) +{ +signed portBASE_TYPE xReturn; +unsigned portBASE_TYPE uxSavedInterruptStatus; + + configASSERT( pxQueue ); + configASSERT( pxTaskWoken ); + configASSERT( !( ( pvBuffer == NULL ) && ( pxQueue->uxItemSize != ( unsigned portBASE_TYPE ) 0U ) ) ); + + uxSavedInterruptStatus = portSET_INTERRUPT_MASK_FROM_ISR(); + { + /* We cannot block from an ISR, so check there is data available. */ + if( pxQueue->uxMessagesWaiting > ( unsigned portBASE_TYPE ) 0 ) + { + traceQUEUE_RECEIVE_FROM_ISR( pxQueue ); + + prvCopyDataFromQueue( pxQueue, pvBuffer ); + --( pxQueue->uxMessagesWaiting ); + + /* If the queue is locked we will not modify the event list. Instead + we update the lock count so the task that unlocks the queue will know + that an ISR has removed data while the queue was locked. */ + if( pxQueue->xRxLock == queueUNLOCKED ) + { + if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToSend ) ) == pdFALSE ) + { + if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToSend ) ) != pdFALSE ) + { + /* The task waiting has a higher priority than us so + force a context switch. */ + *pxTaskWoken = pdTRUE; + } + } + } + else + { + /* Increment the lock count so the task that unlocks the queue + knows that data was removed while it was locked. */ + ++( pxQueue->xRxLock ); + } + + xReturn = pdPASS; + } + else + { + xReturn = pdFAIL; + traceQUEUE_RECEIVE_FROM_ISR_FAILED( pxQueue ); + } + } + portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedInterruptStatus ); + + return xReturn; +} +/*-----------------------------------------------------------*/ + +unsigned portBASE_TYPE uxQueueMessagesWaiting( const xQueueHandle pxQueue ) +{ +unsigned portBASE_TYPE uxReturn; + + configASSERT( pxQueue ); + + taskENTER_CRITICAL(); + uxReturn = pxQueue->uxMessagesWaiting; + taskEXIT_CRITICAL(); + + return uxReturn; +} +/*-----------------------------------------------------------*/ + +unsigned portBASE_TYPE uxQueueMessagesWaitingFromISR( const xQueueHandle pxQueue ) +{ +unsigned portBASE_TYPE uxReturn; + + configASSERT( pxQueue ); + + uxReturn = pxQueue->uxMessagesWaiting; + + return uxReturn; +} +/*-----------------------------------------------------------*/ + +void vQueueDelete( xQueueHandle pxQueue ) +{ + configASSERT( pxQueue ); + + traceQUEUE_DELETE( pxQueue ); + vQueueUnregisterQueue( pxQueue ); + vPortFree( pxQueue->pcHead ); + vPortFree( pxQueue ); +} +/*-----------------------------------------------------------*/ + +static void prvCopyDataToQueue( xQUEUE *pxQueue, const void *pvItemToQueue, portBASE_TYPE xPosition ) +{ + if( pxQueue->uxItemSize == ( unsigned portBASE_TYPE ) 0 ) + { + #if ( configUSE_MUTEXES == 1 ) + { + if( pxQueue->uxQueueType == queueQUEUE_IS_MUTEX ) + { + /* The mutex is no longer being held. */ + vTaskPriorityDisinherit( ( void * ) pxQueue->pxMutexHolder ); + pxQueue->pxMutexHolder = NULL; + } + } + #endif + } + else if( xPosition == queueSEND_TO_BACK ) + { + memcpy( ( void * ) pxQueue->pcWriteTo, pvItemToQueue, ( unsigned ) pxQueue->uxItemSize ); + pxQueue->pcWriteTo += pxQueue->uxItemSize; + if( pxQueue->pcWriteTo >= pxQueue->pcTail ) + { + pxQueue->pcWriteTo = pxQueue->pcHead; + } + } + else + { + memcpy( ( void * ) pxQueue->pcReadFrom, pvItemToQueue, ( unsigned ) pxQueue->uxItemSize ); + pxQueue->pcReadFrom -= pxQueue->uxItemSize; + if( pxQueue->pcReadFrom < pxQueue->pcHead ) + { + pxQueue->pcReadFrom = ( pxQueue->pcTail - pxQueue->uxItemSize ); + } + } + + ++( pxQueue->uxMessagesWaiting ); +} +/*-----------------------------------------------------------*/ + +static void prvCopyDataFromQueue( xQUEUE * const pxQueue, const void *pvBuffer ) +{ + if( pxQueue->uxQueueType != queueQUEUE_IS_MUTEX ) + { + pxQueue->pcReadFrom += pxQueue->uxItemSize; + if( pxQueue->pcReadFrom >= pxQueue->pcTail ) + { + pxQueue->pcReadFrom = pxQueue->pcHead; + } + memcpy( ( void * ) pvBuffer, ( void * ) pxQueue->pcReadFrom, ( unsigned ) pxQueue->uxItemSize ); + } +} +/*-----------------------------------------------------------*/ + +static void prvUnlockQueue( xQueueHandle pxQueue ) +{ + /* THIS FUNCTION MUST BE CALLED WITH THE SCHEDULER SUSPENDED. */ + + /* The lock counts contains the number of extra data items placed or + removed from the queue while the queue was locked. When a queue is + locked items can be added or removed, but the event lists cannot be + updated. */ + taskENTER_CRITICAL(); + { + /* See if data was added to the queue while it was locked. */ + while( pxQueue->xTxLock > queueLOCKED_UNMODIFIED ) + { + /* Data was posted while the queue was locked. Are any tasks + blocked waiting for data to become available? */ + if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToReceive ) ) == pdFALSE ) + { + /* Tasks that are removed from the event list will get added to + the pending ready list as the scheduler is still suspended. */ + if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToReceive ) ) != pdFALSE ) + { + /* The task waiting has a higher priority so record that a + context switch is required. */ + vTaskMissedYield(); + } + + --( pxQueue->xTxLock ); + } + else + { + break; + } + } + + pxQueue->xTxLock = queueUNLOCKED; + } + taskEXIT_CRITICAL(); + + /* Do the same for the Rx lock. */ + taskENTER_CRITICAL(); + { + while( pxQueue->xRxLock > queueLOCKED_UNMODIFIED ) + { + if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToSend ) ) == pdFALSE ) + { + if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToSend ) ) != pdFALSE ) + { + vTaskMissedYield(); + } + + --( pxQueue->xRxLock ); + } + else + { + break; + } + } + + pxQueue->xRxLock = queueUNLOCKED; + } + taskEXIT_CRITICAL(); +} +/*-----------------------------------------------------------*/ + +static signed portBASE_TYPE prvIsQueueEmpty( const xQueueHandle pxQueue ) +{ +signed portBASE_TYPE xReturn; + + taskENTER_CRITICAL(); + xReturn = ( pxQueue->uxMessagesWaiting == ( unsigned portBASE_TYPE ) 0 ); + taskEXIT_CRITICAL(); + + return xReturn; +} +/*-----------------------------------------------------------*/ + +signed portBASE_TYPE xQueueIsQueueEmptyFromISR( const xQueueHandle pxQueue ) +{ +signed portBASE_TYPE xReturn; + + configASSERT( pxQueue ); + xReturn = ( pxQueue->uxMessagesWaiting == ( unsigned portBASE_TYPE ) 0 ); + + return xReturn; +} +/*-----------------------------------------------------------*/ + +static signed portBASE_TYPE prvIsQueueFull( const xQueueHandle pxQueue ) +{ +signed portBASE_TYPE xReturn; + + taskENTER_CRITICAL(); + xReturn = ( pxQueue->uxMessagesWaiting == pxQueue->uxLength ); + taskEXIT_CRITICAL(); + + return xReturn; +} +/*-----------------------------------------------------------*/ + +signed portBASE_TYPE xQueueIsQueueFullFromISR( const xQueueHandle pxQueue ) +{ +signed portBASE_TYPE xReturn; + + configASSERT( pxQueue ); + xReturn = ( pxQueue->uxMessagesWaiting == pxQueue->uxLength ); + + return xReturn; +} +/*-----------------------------------------------------------*/ + +#if configUSE_CO_ROUTINES == 1 +signed portBASE_TYPE xQueueCRSend( xQueueHandle pxQueue, const void *pvItemToQueue, portTickType xTicksToWait ) +{ +signed portBASE_TYPE xReturn; + + /* If the queue is already full we may have to block. A critical section + is required to prevent an interrupt removing something from the queue + between the check to see if the queue is full and blocking on the queue. */ + portDISABLE_INTERRUPTS(); + { + if( prvIsQueueFull( pxQueue ) ) + { + /* The queue is full - do we want to block or just leave without + posting? */ + if( xTicksToWait > ( portTickType ) 0 ) + { + /* As this is called from a coroutine we cannot block directly, but + return indicating that we need to block. */ + vCoRoutineAddToDelayedList( xTicksToWait, &( pxQueue->xTasksWaitingToSend ) ); + portENABLE_INTERRUPTS(); + return errQUEUE_BLOCKED; + } + else + { + portENABLE_INTERRUPTS(); + return errQUEUE_FULL; + } + } + } + portENABLE_INTERRUPTS(); + + portNOP(); + + portDISABLE_INTERRUPTS(); + { + if( pxQueue->uxMessagesWaiting < pxQueue->uxLength ) + { + /* There is room in the queue, copy the data into the queue. */ + prvCopyDataToQueue( pxQueue, pvItemToQueue, queueSEND_TO_BACK ); + xReturn = pdPASS; + + /* Were any co-routines waiting for data to become available? */ + if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToReceive ) ) == pdFALSE ) + { + /* In this instance the co-routine could be placed directly + into the ready list as we are within a critical section. + Instead the same pending ready list mechanism is used as if + the event were caused from within an interrupt. */ + if( xCoRoutineRemoveFromEventList( &( pxQueue->xTasksWaitingToReceive ) ) != pdFALSE ) + { + /* The co-routine waiting has a higher priority so record + that a yield might be appropriate. */ + xReturn = errQUEUE_YIELD; + } + } + } + else + { + xReturn = errQUEUE_FULL; + } + } + portENABLE_INTERRUPTS(); + + return xReturn; +} +#endif +/*-----------------------------------------------------------*/ + +#if configUSE_CO_ROUTINES == 1 +signed portBASE_TYPE xQueueCRReceive( xQueueHandle pxQueue, void *pvBuffer, portTickType xTicksToWait ) +{ +signed portBASE_TYPE xReturn; + + /* If the queue is already empty we may have to block. A critical section + is required to prevent an interrupt adding something to the queue + between the check to see if the queue is empty and blocking on the queue. */ + portDISABLE_INTERRUPTS(); + { + if( pxQueue->uxMessagesWaiting == ( unsigned portBASE_TYPE ) 0 ) + { + /* There are no messages in the queue, do we want to block or just + leave with nothing? */ + if( xTicksToWait > ( portTickType ) 0 ) + { + /* As this is a co-routine we cannot block directly, but return + indicating that we need to block. */ + vCoRoutineAddToDelayedList( xTicksToWait, &( pxQueue->xTasksWaitingToReceive ) ); + portENABLE_INTERRUPTS(); + return errQUEUE_BLOCKED; + } + else + { + portENABLE_INTERRUPTS(); + return errQUEUE_FULL; + } + } + } + portENABLE_INTERRUPTS(); + + portNOP(); + + portDISABLE_INTERRUPTS(); + { + if( pxQueue->uxMessagesWaiting > ( unsigned portBASE_TYPE ) 0 ) + { + /* Data is available from the queue. */ + pxQueue->pcReadFrom += pxQueue->uxItemSize; + if( pxQueue->pcReadFrom >= pxQueue->pcTail ) + { + pxQueue->pcReadFrom = pxQueue->pcHead; + } + --( pxQueue->uxMessagesWaiting ); + memcpy( ( void * ) pvBuffer, ( void * ) pxQueue->pcReadFrom, ( unsigned ) pxQueue->uxItemSize ); + + xReturn = pdPASS; + + /* Were any co-routines waiting for space to become available? */ + if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToSend ) ) == pdFALSE ) + { + /* In this instance the co-routine could be placed directly + into the ready list as we are within a critical section. + Instead the same pending ready list mechanism is used as if + the event were caused from within an interrupt. */ + if( xCoRoutineRemoveFromEventList( &( pxQueue->xTasksWaitingToSend ) ) != pdFALSE ) + { + xReturn = errQUEUE_YIELD; + } + } + } + else + { + xReturn = pdFAIL; + } + } + portENABLE_INTERRUPTS(); + + return xReturn; +} +#endif +/*-----------------------------------------------------------*/ + + + +#if configUSE_CO_ROUTINES == 1 +signed portBASE_TYPE xQueueCRSendFromISR( xQueueHandle pxQueue, const void *pvItemToQueue, signed portBASE_TYPE xCoRoutinePreviouslyWoken ) +{ + /* Cannot block within an ISR so if there is no space on the queue then + exit without doing anything. */ + if( pxQueue->uxMessagesWaiting < pxQueue->uxLength ) + { + prvCopyDataToQueue( pxQueue, pvItemToQueue, queueSEND_TO_BACK ); + + /* We only want to wake one co-routine per ISR, so check that a + co-routine has not already been woken. */ + if( !xCoRoutinePreviouslyWoken ) + { + if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToReceive ) ) == pdFALSE ) + { + if( xCoRoutineRemoveFromEventList( &( pxQueue->xTasksWaitingToReceive ) ) != pdFALSE ) + { + return pdTRUE; + } + } + } + } + + return xCoRoutinePreviouslyWoken; +} +#endif +/*-----------------------------------------------------------*/ + +#if configUSE_CO_ROUTINES == 1 +signed portBASE_TYPE xQueueCRReceiveFromISR( xQueueHandle pxQueue, void *pvBuffer, signed portBASE_TYPE *pxCoRoutineWoken ) +{ +signed portBASE_TYPE xReturn; + + /* We cannot block from an ISR, so check there is data available. If + not then just leave without doing anything. */ + if( pxQueue->uxMessagesWaiting > ( unsigned portBASE_TYPE ) 0 ) + { + /* Copy the data from the queue. */ + pxQueue->pcReadFrom += pxQueue->uxItemSize; + if( pxQueue->pcReadFrom >= pxQueue->pcTail ) + { + pxQueue->pcReadFrom = pxQueue->pcHead; + } + --( pxQueue->uxMessagesWaiting ); + memcpy( ( void * ) pvBuffer, ( void * ) pxQueue->pcReadFrom, ( unsigned ) pxQueue->uxItemSize ); + + if( !( *pxCoRoutineWoken ) ) + { + if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToSend ) ) == pdFALSE ) + { + if( xCoRoutineRemoveFromEventList( &( pxQueue->xTasksWaitingToSend ) ) != pdFALSE ) + { + *pxCoRoutineWoken = pdTRUE; + } + } + } + + xReturn = pdPASS; + } + else + { + xReturn = pdFAIL; + } + + return xReturn; +} +#endif +/*-----------------------------------------------------------*/ + +#if configQUEUE_REGISTRY_SIZE > 0 + + void vQueueAddToRegistry( xQueueHandle xQueue, signed char *pcQueueName ) + { + unsigned portBASE_TYPE ux; + + /* See if there is an empty space in the registry. A NULL name denotes + a free slot. */ + for( ux = ( unsigned portBASE_TYPE ) 0U; ux < configQUEUE_REGISTRY_SIZE; ux++ ) + { + if( xQueueRegistry[ ux ].pcQueueName == NULL ) + { + /* Store the information on this queue. */ + xQueueRegistry[ ux ].pcQueueName = pcQueueName; + xQueueRegistry[ ux ].xHandle = xQueue; + break; + } + } + } + +#endif +/*-----------------------------------------------------------*/ + +#if configQUEUE_REGISTRY_SIZE > 0 + + static void vQueueUnregisterQueue( xQueueHandle xQueue ) + { + unsigned portBASE_TYPE ux; + + /* See if the handle of the queue being unregistered in actually in the + registry. */ + for( ux = ( unsigned portBASE_TYPE ) 0U; ux < configQUEUE_REGISTRY_SIZE; ux++ ) + { + if( xQueueRegistry[ ux ].xHandle == xQueue ) + { + /* Set the name to NULL to show that this slot if free again. */ + xQueueRegistry[ ux ].pcQueueName = NULL; + break; + } + } + + } + +#endif +/*-----------------------------------------------------------*/ + +#if configUSE_TIMERS == 1 + + void vQueueWaitForMessageRestricted( xQueueHandle pxQueue, portTickType xTicksToWait ) + { + /* This function should not be called by application code hence the + 'Restricted' in its name. It is not part of the public API. It is + designed for use by kernel code, and has special calling requirements. + It can result in vListInsert() being called on a list that can only + possibly ever have one item in it, so the list will be fast, but even + so it should be called with the scheduler locked and not from a critical + section. */ + + /* Only do anything if there are no messages in the queue. This function + will not actually cause the task to block, just place it on a blocked + list. It will not block until the scheduler is unlocked - at which + time a yield will be performed. If an item is added to the queue while + the queue is locked, and the calling task blocks on the queue, then the + calling task will be immediately unblocked when the queue is unlocked. */ + prvLockQueue( pxQueue ); + if( pxQueue->uxMessagesWaiting == ( unsigned portBASE_TYPE ) 0U ) + { + /* There is nothing in the queue, block for the specified period. */ + vTaskPlaceOnEventListRestricted( &( pxQueue->xTasksWaitingToReceive ), xTicksToWait ); + } + prvUnlockQueue( pxQueue ); + } + +#endif + diff --git a/FreeRTOSWithTraces/FreeRTOS_src/readme.txt b/FreeRTOSWithTraces/FreeRTOS_src/readme.txt new file mode 100644 index 0000000000000000000000000000000000000000..81518ecb4339e35363d844853fde09116e314cea --- /dev/null +++ b/FreeRTOSWithTraces/FreeRTOS_src/readme.txt @@ -0,0 +1,17 @@ +Each real time kernel port consists of three files that contain the core kernel +components and are common to every port, and one or more files that are +specific to a particular microcontroller and or compiler. + ++ The FreeRTOS/Source directory contains the three files that are common to +every port - list.c, queue.c and tasks.c. The kernel is contained within these +three files. croutine.c implements the optional co-routine functionality - which +is normally only used on very memory limited systems. + ++ The FreeRTOS/Source/Portable directory contains the files that are specific to +a particular microcontroller and or compiler. + ++ The FreeRTOS/Source/include directory contains the real time kernel header +files. + +See the readme file in the FreeRTOS/Source/Portable directory for more +information. \ No newline at end of file diff --git a/FreeRTOSWithTraces/FreeRTOS_src/tasks.c b/FreeRTOSWithTraces/FreeRTOS_src/tasks.c new file mode 100644 index 0000000000000000000000000000000000000000..94afbe3e1fcc5deeeb1b225681719c54ef573f78 --- /dev/null +++ b/FreeRTOSWithTraces/FreeRTOS_src/tasks.c @@ -0,0 +1,2542 @@ +/* + FreeRTOS V7.0.1 - Copyright (C) 2011 Real Time Engineers Ltd. + + + FreeRTOS supports many tools and architectures. V7.0.0 is sponsored by: + Atollic AB - Atollic provides professional embedded systems development + tools for C/C++ development, code analysis and test automation. + See http://www.atollic.com + + + *************************************************************************** + * * + * FreeRTOS tutorial books are available in pdf and paperback. * + * Complete, revised, and edited pdf reference manuals are also * + * available. * + * * + * Purchasing FreeRTOS documentation will not only help you, by * + * ensuring you get running as quickly as possible and with an * + * in-depth knowledge of how to use FreeRTOS, it will also help * + * the FreeRTOS project to continue with its mission of providing * + * professional grade, cross platform, de facto standard solutions * + * for microcontrollers - completely free of charge! * + * * + * >>> See http://www.FreeRTOS.org/Documentation for details. <<< * + * * + * Thank you for using FreeRTOS, and thank you for your support! * + * * + *************************************************************************** + + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation AND MODIFIED BY the FreeRTOS exception. + >>>NOTE<<< The modification to the GPL is included to allow you to + distribute a combined work that includes FreeRTOS without being obliged to + provide the source code for proprietary components outside of the FreeRTOS + kernel. FreeRTOS is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + more details. You should have received a copy of the GNU General Public + License and the FreeRTOS license exception along with FreeRTOS; if not it + can be viewed here: http://www.freertos.org/a00114.html and also obtained + by writing to Richard Barry, contact details for whom are available on the + FreeRTOS WEB site. + + 1 tab == 4 spaces! + + http://www.FreeRTOS.org - Documentation, latest information, license and + contact details. + + http://www.SafeRTOS.com - A version that is certified for use in safety + critical systems. + + http://www.OpenRTOS.com - Commercial support, development, porting, + licensing and training services. +*/ + + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> + +/* Defining MPU_WRAPPERS_INCLUDED_FROM_API_FILE prevents task.h from redefining +all the API functions to use the MPU wrappers. That should only be done when +task.h is included from an application file. */ +#define MPU_WRAPPERS_INCLUDED_FROM_API_FILE + +#include "FreeRTOS.h" +#include "task.h" +#include "timers.h" +#include "StackMacros.h" + +#undef MPU_WRAPPERS_INCLUDED_FROM_API_FILE + +/* + * Macro to define the amount of stack available to the idle task. + */ +#define tskIDLE_STACK_SIZE configMINIMAL_STACK_SIZE + +/* + * Task control block. A task control block (TCB) is allocated to each task, + * and stores the context of the task. + */ +typedef struct tskTaskControlBlock +{ + volatile portSTACK_TYPE *pxTopOfStack; /*< Points to the location of the last item placed on the tasks stack. THIS MUST BE THE FIRST MEMBER OF THE STRUCT. */ + + #if ( portUSING_MPU_WRAPPERS == 1 ) + xMPU_SETTINGS xMPUSettings; /*< The MPU settings are defined as part of the port layer. THIS MUST BE THE SECOND MEMBER OF THE STRUCT. */ + #endif + + xListItem xGenericListItem; /*< List item used to place the TCB in ready and blocked queues. */ + xListItem xEventListItem; /*< List item used to place the TCB in event lists. */ + unsigned portBASE_TYPE uxPriority; /*< The priority of the task where 0 is the lowest priority. */ + portSTACK_TYPE *pxStack; /*< Points to the start of the stack. */ + signed char pcTaskName[ configMAX_TASK_NAME_LEN ];/*< Descriptive name given to the task when created. Facilitates debugging only. */ + + #if ( portSTACK_GROWTH > 0 ) + portSTACK_TYPE *pxEndOfStack; /*< Used for stack overflow checking on architectures where the stack grows up from low memory. */ + #endif + + #if ( portCRITICAL_NESTING_IN_TCB == 1 ) + unsigned portBASE_TYPE uxCriticalNesting; + #endif + + #if ( configUSE_TRACE_FACILITY == 1 ) + unsigned portBASE_TYPE uxTCBNumber; /*< This is used for tracing the scheduler and making debugging easier only. */ + #endif + #if ( configHEPIA_TRACING == 1 ) + unsigned char task_id; + #endif + #if ( configUSE_MUTEXES == 1 ) + unsigned portBASE_TYPE uxBasePriority; /*< The priority last assigned to the task - used by the priority inheritance mechanism. */ + #endif + + #if ( configUSE_APPLICATION_TASK_TAG == 1 ) + pdTASK_HOOK_CODE pxTaskTag; + #endif + + #if ( configGENERATE_RUN_TIME_STATS == 1 ) + unsigned long ulRunTimeCounter; /*< Used for calculating how much CPU time each task is utilising. */ + #endif + +} tskTCB; + +#if ( configHEPIA_TRACING == 1 ) +void write_trace(uint8_t sig_idx, short val); +static unsigned previous_id_in=0xFF; +#endif + +/* + * Some kernel aware debuggers require data to be viewed to be global, rather + * than file scope. + */ +#ifdef portREMOVE_STATIC_QUALIFIER + #define static +#endif + +/*lint -e956 */ +PRIVILEGED_DATA tskTCB * volatile pxCurrentTCB = NULL; + +/* Lists for ready and blocked tasks. --------------------*/ + +PRIVILEGED_DATA static xList pxReadyTasksLists[ configMAX_PRIORITIES ]; /*< Prioritised ready tasks. */ +PRIVILEGED_DATA static xList xDelayedTaskList1; /*< Delayed tasks. */ +PRIVILEGED_DATA static xList xDelayedTaskList2; /*< Delayed tasks (two lists are used - one for delays that have overflowed the current tick count. */ +PRIVILEGED_DATA static xList * volatile pxDelayedTaskList ; /*< Points to the delayed task list currently being used. */ +PRIVILEGED_DATA static xList * volatile pxOverflowDelayedTaskList; /*< Points to the delayed task list currently being used to hold tasks that have overflowed the current tick count. */ +PRIVILEGED_DATA static xList xPendingReadyList; /*< Tasks that have been readied while the scheduler was suspended. They will be moved to the ready queue when the scheduler is resumed. */ + +#if ( INCLUDE_vTaskDelete == 1 ) + + PRIVILEGED_DATA static volatile xList xTasksWaitingTermination; /*< Tasks that have been deleted - but the their memory not yet freed. */ + PRIVILEGED_DATA static volatile unsigned portBASE_TYPE uxTasksDeleted = ( unsigned portBASE_TYPE ) 0; + +#endif + +#if ( INCLUDE_vTaskSuspend == 1 ) + + PRIVILEGED_DATA static xList xSuspendedTaskList; /*< Tasks that are currently suspended. */ + +#endif + +/* File private variables. --------------------------------*/ +PRIVILEGED_DATA static volatile unsigned portBASE_TYPE uxCurrentNumberOfTasks = ( unsigned portBASE_TYPE ) 0; +PRIVILEGED_DATA static volatile portTickType xTickCount = ( portTickType ) 0; +PRIVILEGED_DATA static unsigned portBASE_TYPE uxTopUsedPriority = tskIDLE_PRIORITY; +PRIVILEGED_DATA static volatile unsigned portBASE_TYPE uxTopReadyPriority = tskIDLE_PRIORITY; +PRIVILEGED_DATA static volatile signed portBASE_TYPE xSchedulerRunning = pdFALSE; +PRIVILEGED_DATA static volatile unsigned portBASE_TYPE uxSchedulerSuspended = ( unsigned portBASE_TYPE ) pdFALSE; +PRIVILEGED_DATA static volatile unsigned portBASE_TYPE uxMissedTicks = ( unsigned portBASE_TYPE ) 0; +PRIVILEGED_DATA static volatile portBASE_TYPE xMissedYield = ( portBASE_TYPE ) pdFALSE; +PRIVILEGED_DATA static volatile portBASE_TYPE xNumOfOverflows = ( portBASE_TYPE ) 0; +PRIVILEGED_DATA static unsigned portBASE_TYPE uxTaskNumber = ( unsigned portBASE_TYPE ) 0; +PRIVILEGED_DATA static portTickType xNextTaskUnblockTime = ( portTickType ) portMAX_DELAY; + +#if ( configGENERATE_RUN_TIME_STATS == 1 ) + + PRIVILEGED_DATA static char pcStatsString[ 50 ] ; + PRIVILEGED_DATA static unsigned long ulTaskSwitchedInTime = 0UL; /*< Holds the value of a timer/counter the last time a task was switched in. */ + static void prvGenerateRunTimeStatsForTasksInList( const signed char *pcWriteBuffer, xList *pxList, unsigned long ulTotalRunTime ) PRIVILEGED_FUNCTION; + +#endif + +/* Debugging and trace facilities private variables and macros. ------------*/ + +/* + * The value used to fill the stack of a task when the task is created. This + * is used purely for checking the high water mark for tasks. + */ +#define tskSTACK_FILL_BYTE ( 0xa5U ) + +/* + * Macros used by vListTask to indicate which state a task is in. + */ +#define tskBLOCKED_CHAR ( ( signed char ) 'B' ) +#define tskREADY_CHAR ( ( signed char ) 'R' ) +#define tskDELETED_CHAR ( ( signed char ) 'D' ) +#define tskSUSPENDED_CHAR ( ( signed char ) 'S' ) + +/* + * Macros and private variables used by the trace facility. + */ +#if ( configUSE_TRACE_FACILITY == 1 ) + + #define tskSIZE_OF_EACH_TRACE_LINE ( ( unsigned long ) ( sizeof( unsigned long ) + sizeof( unsigned long ) ) ) + PRIVILEGED_DATA static volatile signed char * volatile pcTraceBuffer; + PRIVILEGED_DATA static signed char *pcTraceBufferStart; + PRIVILEGED_DATA static signed char *pcTraceBufferEnd; + PRIVILEGED_DATA static signed portBASE_TYPE xTracing = pdFALSE; + static unsigned portBASE_TYPE uxPreviousTask = 255U; + PRIVILEGED_DATA static char pcStatusString[ 50 ]; + +#endif + +/*-----------------------------------------------------------*/ + +/* + * Macro that writes a trace of scheduler activity to a buffer. This trace + * shows which task is running when and is very useful as a debugging tool. + * As this macro is called each context switch it is a good idea to undefine + * it if not using the facility. + */ +#if ( configUSE_TRACE_FACILITY == 1 ) + + #define vWriteTraceToBuffer() \ + { \ + if( xTracing ) \ + { \ + if( uxPreviousTask != pxCurrentTCB->uxTCBNumber ) \ + { \ + if( ( pcTraceBuffer + tskSIZE_OF_EACH_TRACE_LINE ) < pcTraceBufferEnd ) \ + { \ + uxPreviousTask = pxCurrentTCB->uxTCBNumber; \ + *( unsigned long * ) pcTraceBuffer = ( unsigned long ) xTickCount; \ + pcTraceBuffer += sizeof( unsigned long ); \ + *( unsigned long * ) pcTraceBuffer = ( unsigned long ) uxPreviousTask; \ + pcTraceBuffer += sizeof( unsigned long ); \ + } \ + else \ + { \ + xTracing = pdFALSE; \ + } \ + } \ + } \ + } + +#else + + #define vWriteTraceToBuffer() + +#endif +/*-----------------------------------------------------------*/ + +/* + * Place the task represented by pxTCB into the appropriate ready queue for + * the task. It is inserted at the end of the list. One quirk of this is + * that if the task being inserted is at the same priority as the currently + * executing task, then it will only be rescheduled after the currently + * executing task has been rescheduled. + */ +#define prvAddTaskToReadyQueue( pxTCB ) \ + if( ( pxTCB )->uxPriority > uxTopReadyPriority ) \ + { \ + uxTopReadyPriority = ( pxTCB )->uxPriority; \ + } \ + vListInsertEnd( ( xList * ) &( pxReadyTasksLists[ ( pxTCB )->uxPriority ] ), &( ( pxTCB )->xGenericListItem ) ) +/*-----------------------------------------------------------*/ + +/* + * Macro that looks at the list of tasks that are currently delayed to see if + * any require waking. + * + * Tasks are stored in the queue in the order of their wake time - meaning + * once one tasks has been found whose timer has not expired we need not look + * any further down the list. + */ +#define prvCheckDelayedTasks() \ +{ \ +portTickType xItemValue; \ + \ + /* Is the tick count greater than or equal to the wake time of the first \ + task referenced from the delayed tasks list? */ \ + if( xTickCount >= xNextTaskUnblockTime ) \ + { \ + for( ;; ) \ + { \ + if( listLIST_IS_EMPTY( pxDelayedTaskList ) != pdFALSE ) \ + { \ + /* The delayed list is empty. Set xNextTaskUnblockTime to the \ + maximum possible value so it is extremely unlikely that the \ + if( xTickCount >= xNextTaskUnblockTime ) test will pass next \ + time through. */ \ + xNextTaskUnblockTime = portMAX_DELAY; \ + break; \ + } \ + else \ + { \ + /* The delayed list is not empty, get the value of the item at \ + the head of the delayed list. This is the time at which the \ + task at the head of the delayed list should be removed from \ + the Blocked state. */ \ + pxTCB = ( tskTCB * ) listGET_OWNER_OF_HEAD_ENTRY( pxDelayedTaskList ); \ + xItemValue = listGET_LIST_ITEM_VALUE( &( pxTCB->xGenericListItem ) ); \ + \ + if( xTickCount < xItemValue ) \ + { \ + /* It is not time to unblock this item yet, but the item \ + value is the time at which the task at the head of the \ + blocked list should be removed from the Blocked state - \ + so record the item value in xNextTaskUnblockTime. */ \ + xNextTaskUnblockTime = xItemValue; \ + break; \ + } \ + \ + /* It is time to remove the item from the Blocked state. */ \ + vListRemove( &( pxTCB->xGenericListItem ) ); \ + \ + /* Is the task waiting on an event also? */ \ + if( pxTCB->xEventListItem.pvContainer ) \ + { \ + vListRemove( &( pxTCB->xEventListItem ) ); \ + } \ + prvAddTaskToReadyQueue( pxTCB ); \ + } \ + } \ + } \ +} +/*-----------------------------------------------------------*/ + +/* + * Several functions take an xTaskHandle parameter that can optionally be NULL, + * where NULL is used to indicate that the handle of the currently executing + * task should be used in place of the parameter. This macro simply checks to + * see if the parameter is NULL and returns a pointer to the appropriate TCB. + */ +#define prvGetTCBFromHandle( pxHandle ) ( ( ( pxHandle ) == NULL ) ? ( tskTCB * ) pxCurrentTCB : ( tskTCB * ) ( pxHandle ) ) + +/* Callback function prototypes. --------------------------*/ +extern void vApplicationStackOverflowHook( xTaskHandle *pxTask, signed char *pcTaskName ); +extern void vApplicationTickHook( void ); + +/* File private functions. --------------------------------*/ + +/* + * Utility to ready a TCB for a given task. Mainly just copies the parameters + * into the TCB structure. + */ +static void prvInitialiseTCBVariables( tskTCB *pxTCB, const signed char * const pcName, unsigned portBASE_TYPE uxPriority, const xMemoryRegion * const xRegions, unsigned short usStackDepth ) PRIVILEGED_FUNCTION; + +/* + * Utility to ready all the lists used by the scheduler. This is called + * automatically upon the creation of the first task. + */ +static void prvInitialiseTaskLists( void ) PRIVILEGED_FUNCTION; + +/* + * The idle task, which as all tasks is implemented as a never ending loop. + * The idle task is automatically created and added to the ready lists upon + * creation of the first user task. + * + * The portTASK_FUNCTION_PROTO() macro is used to allow port/compiler specific + * language extensions. The equivalent prototype for this function is: + * + * void prvIdleTask( void *pvParameters ); + * + */ +static portTASK_FUNCTION_PROTO( prvIdleTask, pvParameters ); + +/* + * Utility to free all memory allocated by the scheduler to hold a TCB, + * including the stack pointed to by the TCB. + * + * This does not free memory allocated by the task itself (i.e. memory + * allocated by calls to pvPortMalloc from within the tasks application code). + */ +#if ( ( INCLUDE_vTaskDelete == 1 ) || ( INCLUDE_vTaskCleanUpResources == 1 ) ) + + static void prvDeleteTCB( tskTCB *pxTCB ) PRIVILEGED_FUNCTION; + +#endif + +/* + * Used only by the idle task. This checks to see if anything has been placed + * in the list of tasks waiting to be deleted. If so the task is cleaned up + * and its TCB deleted. + */ +static void prvCheckTasksWaitingTermination( void ) PRIVILEGED_FUNCTION; + +/* + * The currently executing task is entering the Blocked state. Add the task to + * either the current or the overflow delayed task list. + */ +static void prvAddCurrentTaskToDelayedList( portTickType xTimeToWake ) PRIVILEGED_FUNCTION; + +/* + * Allocates memory from the heap for a TCB and associated stack. Checks the + * allocation was successful. + */ +static tskTCB *prvAllocateTCBAndStack( unsigned short usStackDepth, portSTACK_TYPE *puxStackBuffer ) PRIVILEGED_FUNCTION; + +/* + * Called from vTaskList. vListTasks details all the tasks currently under + * control of the scheduler. The tasks may be in one of a number of lists. + * prvListTaskWithinSingleList accepts a list and details the tasks from + * within just that list. + * + * THIS FUNCTION IS INTENDED FOR DEBUGGING ONLY, AND SHOULD NOT BE CALLED FROM + * NORMAL APPLICATION CODE. + */ +#if ( configUSE_TRACE_FACILITY == 1 ) + + static void prvListTaskWithinSingleList( const signed char *pcWriteBuffer, xList *pxList, signed char cStatus ) PRIVILEGED_FUNCTION; + +#endif + +/* + * When a task is created, the stack of the task is filled with a known value. + * This function determines the 'high water mark' of the task stack by + * determining how much of the stack remains at the original preset value. + */ +#if ( ( configUSE_TRACE_FACILITY == 1 ) || ( INCLUDE_uxTaskGetStackHighWaterMark == 1 ) ) + + static unsigned short usTaskCheckFreeStackSpace( const unsigned char * pucStackByte ) PRIVILEGED_FUNCTION; + +#endif + + +/*lint +e956 */ + + + +/*----------------------------------------------------------- + * TASK CREATION API documented in task.h + *----------------------------------------------------------*/ + +signed portBASE_TYPE xTaskGenericCreate( pdTASK_CODE pxTaskCode, const signed char * const pcName, unsigned short usStackDepth, void *pvParameters, unsigned portBASE_TYPE uxPriority, xTaskHandle *pxCreatedTask, portSTACK_TYPE *puxStackBuffer, const xMemoryRegion * const xRegions ) +{ +signed portBASE_TYPE xReturn; +tskTCB * pxNewTCB; + + configASSERT( pxTaskCode ); + configASSERT( ( uxPriority < configMAX_PRIORITIES ) ); + + /* Allocate the memory required by the TCB and stack for the new task, + checking that the allocation was successful. */ + pxNewTCB = prvAllocateTCBAndStack( usStackDepth, puxStackBuffer ); + + if( pxNewTCB != NULL ) + { + portSTACK_TYPE *pxTopOfStack; + + #if( portUSING_MPU_WRAPPERS == 1 ) + /* Should the task be created in privileged mode? */ + portBASE_TYPE xRunPrivileged; + if( ( uxPriority & portPRIVILEGE_BIT ) != 0x00 ) + { + xRunPrivileged = pdTRUE; + } + else + { + xRunPrivileged = pdFALSE; + } + uxPriority &= ~portPRIVILEGE_BIT; + #endif /* portUSING_MPU_WRAPPERS == 1 */ + + /* Calculate the top of stack address. This depends on whether the + stack grows from high memory to low (as per the 80x86) or visa versa. + portSTACK_GROWTH is used to make the result positive or negative as + required by the port. */ + #if( portSTACK_GROWTH < 0 ) + { + pxTopOfStack = pxNewTCB->pxStack + ( usStackDepth - ( unsigned short ) 1 ); + pxTopOfStack = ( portSTACK_TYPE * ) ( ( ( unsigned long ) pxTopOfStack ) & ( ( unsigned long ) ~portBYTE_ALIGNMENT_MASK ) ); + + /* Check the alignment of the calculated top of stack is correct. */ + configASSERT( ( ( ( unsigned long ) pxTopOfStack & ( unsigned long ) portBYTE_ALIGNMENT_MASK ) == 0UL ) ); + } + #else + { + pxTopOfStack = pxNewTCB->pxStack; + + /* Check the alignment of the stack buffer is correct. */ + configASSERT( ( ( ( unsigned long ) pxNewTCB->pxStack & ( unsigned long ) portBYTE_ALIGNMENT_MASK ) == 0UL ) ); + + /* If we want to use stack checking on architectures that use + a positive stack growth direction then we also need to store the + other extreme of the stack space. */ + pxNewTCB->pxEndOfStack = pxNewTCB->pxStack + ( usStackDepth - 1 ); + } + #endif + + /* Setup the newly allocated TCB with the initial state of the task. */ + prvInitialiseTCBVariables( pxNewTCB, pcName, uxPriority, xRegions, usStackDepth ); + + /* Initialize the TCB stack to look as if the task was already running, + but had been interrupted by the scheduler. The return address is set + to the start of the task function. Once the stack has been initialised + the top of stack variable is updated. */ + #if( portUSING_MPU_WRAPPERS == 1 ) + { + pxNewTCB->pxTopOfStack = pxPortInitialiseStack( pxTopOfStack, pxTaskCode, pvParameters, xRunPrivileged ); + } + #else + { + pxNewTCB->pxTopOfStack = pxPortInitialiseStack( pxTopOfStack, pxTaskCode, pvParameters ); + } + #endif + + /* Check the alignment of the initialised stack. */ + configASSERT( ( ( ( unsigned long ) pxNewTCB->pxTopOfStack & ( unsigned long ) portBYTE_ALIGNMENT_MASK ) == 0UL ) ); + + if( ( void * ) pxCreatedTask != NULL ) + { + /* Pass the TCB out - in an anonymous way. The calling function/ + task can use this as a handle to delete the task later if + required.*/ + *pxCreatedTask = ( xTaskHandle ) pxNewTCB; + } + + /* We are going to manipulate the task queues to add this task to a + ready list, so must make sure no interrupts occur. */ + taskENTER_CRITICAL(); + { + uxCurrentNumberOfTasks++; + if( pxCurrentTCB == NULL ) + { + /* There are no other tasks, or all the other tasks are in + the suspended state - make this the current task. */ + pxCurrentTCB = pxNewTCB; + + if( uxCurrentNumberOfTasks == ( unsigned portBASE_TYPE ) 1 ) + { + /* This is the first task to be created so do the preliminary + initialisation required. We will not recover if this call + fails, but we will report the failure. */ + prvInitialiseTaskLists(); + } + } + else + { + /* If the scheduler is not already running, make this task the + current task if it is the highest priority task to be created + so far. */ + if( xSchedulerRunning == pdFALSE ) + { + if( pxCurrentTCB->uxPriority <= uxPriority ) + { + pxCurrentTCB = pxNewTCB; + } + } + } + + /* Remember the top priority to make context switching faster. Use + the priority in pxNewTCB as this has been capped to a valid value. */ + if( pxNewTCB->uxPriority > uxTopUsedPriority ) + { + uxTopUsedPriority = pxNewTCB->uxPriority; + } + + #if ( configUSE_TRACE_FACILITY == 1 ) + { + /* Add a counter into the TCB for tracing only. */ + pxNewTCB->uxTCBNumber = uxTaskNumber; + } + #endif + #if ( configHEPIA_TRACING == 1 ) + { + pxNewTCB->task_id = (unsigned char)uxTaskNumber; + } + #endif + uxTaskNumber++; + + prvAddTaskToReadyQueue( pxNewTCB ); + + xReturn = pdPASS; + traceTASK_CREATE( pxNewTCB ); + } + taskEXIT_CRITICAL(); + } + else + { + xReturn = errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY; + traceTASK_CREATE_FAILED(); + } + + if( xReturn == pdPASS ) + { + if( xSchedulerRunning != pdFALSE ) + { + /* If the created task is of a higher priority than the current task + then it should run now. */ + if( pxCurrentTCB->uxPriority < uxPriority ) + { + portYIELD_WITHIN_API(); + } + } + } + + return xReturn; +} +/*-----------------------------------------------------------*/ + +#if ( INCLUDE_vTaskDelete == 1 ) + + void vTaskDelete( xTaskHandle pxTaskToDelete ) + { + tskTCB *pxTCB; + + taskENTER_CRITICAL(); + { + /* Ensure a yield is performed if the current task is being + deleted. */ + if( pxTaskToDelete == pxCurrentTCB ) + { + pxTaskToDelete = NULL; + } + + /* If null is passed in here then we are deleting ourselves. */ + pxTCB = prvGetTCBFromHandle( pxTaskToDelete ); + + /* Remove task from the ready list and place in the termination list. + This will stop the task from be scheduled. The idle task will check + the termination list and free up any memory allocated by the + scheduler for the TCB and stack. */ + vListRemove( &( pxTCB->xGenericListItem ) ); + + /* Is the task waiting on an event also? */ + if( pxTCB->xEventListItem.pvContainer ) + { + vListRemove( &( pxTCB->xEventListItem ) ); + } + + vListInsertEnd( ( xList * ) &xTasksWaitingTermination, &( pxTCB->xGenericListItem ) ); + + /* Increment the ucTasksDeleted variable so the idle task knows + there is a task that has been deleted and that it should therefore + check the xTasksWaitingTermination list. */ + ++uxTasksDeleted; + + /* Increment the uxTaskNumberVariable also so kernel aware debuggers + can detect that the task lists need re-generating. */ + uxTaskNumber++; + + traceTASK_DELETE( pxTCB ); + } + taskEXIT_CRITICAL(); + + /* Force a reschedule if we have just deleted the current task. */ + if( xSchedulerRunning != pdFALSE ) + { + if( ( void * ) pxTaskToDelete == NULL ) + { + portYIELD_WITHIN_API(); + } + } + } + +#endif + + + + + + +/*----------------------------------------------------------- + * TASK CONTROL API documented in task.h + *----------------------------------------------------------*/ + +#if ( INCLUDE_vTaskDelayUntil == 1 ) + + void vTaskDelayUntil( portTickType * const pxPreviousWakeTime, portTickType xTimeIncrement ) + { + portTickType xTimeToWake; + portBASE_TYPE xAlreadyYielded, xShouldDelay = pdFALSE; + + configASSERT( pxPreviousWakeTime ); + configASSERT( ( xTimeIncrement > 0 ) ); + + vTaskSuspendAll(); + { + /* Generate the tick time at which the task wants to wake. */ + xTimeToWake = *pxPreviousWakeTime + xTimeIncrement; + + if( xTickCount < *pxPreviousWakeTime ) + { + /* The tick count has overflowed since this function was + lasted called. In this case the only time we should ever + actually delay is if the wake time has also overflowed, + and the wake time is greater than the tick time. When this + is the case it is as if neither time had overflowed. */ + if( ( xTimeToWake < *pxPreviousWakeTime ) && ( xTimeToWake > xTickCount ) ) + { + xShouldDelay = pdTRUE; + } + } + else + { + /* The tick time has not overflowed. In this case we will + delay if either the wake time has overflowed, and/or the + tick time is less than the wake time. */ + if( ( xTimeToWake < *pxPreviousWakeTime ) || ( xTimeToWake > xTickCount ) ) + { + xShouldDelay = pdTRUE; + } + } + + /* Update the wake time ready for the next call. */ + *pxPreviousWakeTime = xTimeToWake; + + if( xShouldDelay != pdFALSE ) + { + traceTASK_DELAY_UNTIL(); + + /* We must remove ourselves from the ready list before adding + ourselves to the blocked list as the same list item is used for + both lists. */ + vListRemove( ( xListItem * ) &( pxCurrentTCB->xGenericListItem ) ); + prvAddCurrentTaskToDelayedList( xTimeToWake ); + } + } + xAlreadyYielded = xTaskResumeAll(); + + /* Force a reschedule if xTaskResumeAll has not already done so, we may + have put ourselves to sleep. */ + if( !xAlreadyYielded ) + { + portYIELD_WITHIN_API(); + } + } + +#endif +/*-----------------------------------------------------------*/ + +#if ( INCLUDE_vTaskDelay == 1 ) + + void vTaskDelay( portTickType xTicksToDelay ) + { + portTickType xTimeToWake; + signed portBASE_TYPE xAlreadyYielded = pdFALSE; + + /* A delay time of zero just forces a reschedule. */ + if( xTicksToDelay > ( portTickType ) 0 ) + { + vTaskSuspendAll(); + { + traceTASK_DELAY(); + + /* A task that is removed from the event list while the + scheduler is suspended will not get placed in the ready + list or removed from the blocked list until the scheduler + is resumed. + + This task cannot be in an event list as it is the currently + executing task. */ + + /* Calculate the time to wake - this may overflow but this is + not a problem. */ + xTimeToWake = xTickCount + xTicksToDelay; + + /* We must remove ourselves from the ready list before adding + ourselves to the blocked list as the same list item is used for + both lists. */ + vListRemove( ( xListItem * ) &( pxCurrentTCB->xGenericListItem ) ); + prvAddCurrentTaskToDelayedList( xTimeToWake ); + } + xAlreadyYielded = xTaskResumeAll(); + } + + /* Force a reschedule if xTaskResumeAll has not already done so, we may + have put ourselves to sleep. */ + if( !xAlreadyYielded ) + { + portYIELD_WITHIN_API(); + } + } + +#endif +/*-----------------------------------------------------------*/ + +#if ( INCLUDE_uxTaskPriorityGet == 1 ) + + unsigned portBASE_TYPE uxTaskPriorityGet( xTaskHandle pxTask ) + { + tskTCB *pxTCB; + unsigned portBASE_TYPE uxReturn; + + taskENTER_CRITICAL(); + { + /* If null is passed in here then we are changing the + priority of the calling function. */ + pxTCB = prvGetTCBFromHandle( pxTask ); + uxReturn = pxTCB->uxPriority; + } + taskEXIT_CRITICAL(); + + return uxReturn; + } + +#endif +/*-----------------------------------------------------------*/ + +#if ( INCLUDE_vTaskPrioritySet == 1 ) + + void vTaskPrioritySet( xTaskHandle pxTask, unsigned portBASE_TYPE uxNewPriority ) + { + tskTCB *pxTCB; + unsigned portBASE_TYPE uxCurrentPriority; + portBASE_TYPE xYieldRequired = pdFALSE; + + configASSERT( ( uxNewPriority < configMAX_PRIORITIES ) ); + + /* Ensure the new priority is valid. */ + if( uxNewPriority >= configMAX_PRIORITIES ) + { + uxNewPriority = configMAX_PRIORITIES - ( unsigned portBASE_TYPE ) 1U; + } + + taskENTER_CRITICAL(); + { + if( pxTask == pxCurrentTCB ) + { + pxTask = NULL; + } + + /* If null is passed in here then we are changing the + priority of the calling function. */ + pxTCB = prvGetTCBFromHandle( pxTask ); + + traceTASK_PRIORITY_SET( pxTask, uxNewPriority ); + + #if ( configUSE_MUTEXES == 1 ) + { + uxCurrentPriority = pxTCB->uxBasePriority; + } + #else + { + uxCurrentPriority = pxTCB->uxPriority; + } + #endif + + if( uxCurrentPriority != uxNewPriority ) + { + /* The priority change may have readied a task of higher + priority than the calling task. */ + if( uxNewPriority > uxCurrentPriority ) + { + if( pxTask != NULL ) + { + /* The priority of another task is being raised. If we + were raising the priority of the currently running task + there would be no need to switch as it must have already + been the highest priority task. */ + xYieldRequired = pdTRUE; + } + } + else if( pxTask == NULL ) + { + /* Setting our own priority down means there may now be another + task of higher priority that is ready to execute. */ + xYieldRequired = pdTRUE; + } + + + + #if ( configUSE_MUTEXES == 1 ) + { + /* Only change the priority being used if the task is not + currently using an inherited priority. */ + if( pxTCB->uxBasePriority == pxTCB->uxPriority ) + { + pxTCB->uxPriority = uxNewPriority; + } + + /* The base priority gets set whatever. */ + pxTCB->uxBasePriority = uxNewPriority; + } + #else + { + pxTCB->uxPriority = uxNewPriority; + } + #endif + + listSET_LIST_ITEM_VALUE( &( pxTCB->xEventListItem ), ( configMAX_PRIORITIES - ( portTickType ) uxNewPriority ) ); + + /* If the task is in the blocked or suspended list we need do + nothing more than change it's priority variable. However, if + the task is in a ready list it needs to be removed and placed + in the queue appropriate to its new priority. */ + if( listIS_CONTAINED_WITHIN( &( pxReadyTasksLists[ uxCurrentPriority ] ), &( pxTCB->xGenericListItem ) ) ) + { + /* The task is currently in its ready list - remove before adding + it to it's new ready list. As we are in a critical section we + can do this even if the scheduler is suspended. */ + vListRemove( &( pxTCB->xGenericListItem ) ); + prvAddTaskToReadyQueue( pxTCB ); + } + + if( xYieldRequired == pdTRUE ) + { + portYIELD_WITHIN_API(); + } + } + } + taskEXIT_CRITICAL(); + } + +#endif +/*-----------------------------------------------------------*/ + +#if ( INCLUDE_vTaskSuspend == 1 ) + + void vTaskSuspend( xTaskHandle pxTaskToSuspend ) + { + tskTCB *pxTCB; + + taskENTER_CRITICAL(); + { + /* Ensure a yield is performed if the current task is being + suspended. */ + if( pxTaskToSuspend == pxCurrentTCB ) + { + pxTaskToSuspend = NULL; + } + + /* If null is passed in here then we are suspending ourselves. */ + pxTCB = prvGetTCBFromHandle( pxTaskToSuspend ); + + traceTASK_SUSPEND( pxTCB ); + + /* Remove task from the ready/delayed list and place in the suspended list. */ + vListRemove( &( pxTCB->xGenericListItem ) ); + + /* Is the task waiting on an event also? */ + if( pxTCB->xEventListItem.pvContainer ) + { + vListRemove( &( pxTCB->xEventListItem ) ); + } + + vListInsertEnd( ( xList * ) &xSuspendedTaskList, &( pxTCB->xGenericListItem ) ); + } + taskEXIT_CRITICAL(); + + if( ( void * ) pxTaskToSuspend == NULL ) + { + if( xSchedulerRunning != pdFALSE ) + { + /* We have just suspended the current task. */ + portYIELD_WITHIN_API(); + } + else + { + /* The scheduler is not running, but the task that was pointed + to by pxCurrentTCB has just been suspended and pxCurrentTCB + must be adjusted to point to a different task. */ + if( listCURRENT_LIST_LENGTH( &xSuspendedTaskList ) == uxCurrentNumberOfTasks ) + { + /* No other tasks are ready, so set pxCurrentTCB back to + NULL so when the next task is created pxCurrentTCB will + be set to point to it no matter what its relative priority + is. */ + pxCurrentTCB = NULL; + } + else + { + vTaskSwitchContext(); + } + } + } + } + +#endif +/*-----------------------------------------------------------*/ + +#if ( INCLUDE_vTaskSuspend == 1 ) + + signed portBASE_TYPE xTaskIsTaskSuspended( xTaskHandle xTask ) + { + portBASE_TYPE xReturn = pdFALSE; + const tskTCB * const pxTCB = ( tskTCB * ) xTask; + + /* It does not make sense to check if the calling task is suspended. */ + configASSERT( xTask ); + + /* Is the task we are attempting to resume actually in the + suspended list? */ + if( listIS_CONTAINED_WITHIN( &xSuspendedTaskList, &( pxTCB->xGenericListItem ) ) != pdFALSE ) + { + /* Has the task already been resumed from within an ISR? */ + if( listIS_CONTAINED_WITHIN( &xPendingReadyList, &( pxTCB->xEventListItem ) ) != pdTRUE ) + { + /* Is it in the suspended list because it is in the + Suspended state? It is possible to be in the suspended + list because it is blocked on a task with no timeout + specified. */ + if( listIS_CONTAINED_WITHIN( NULL, &( pxTCB->xEventListItem ) ) == pdTRUE ) + { + xReturn = pdTRUE; + } + } + } + + return xReturn; + } + +#endif +/*-----------------------------------------------------------*/ + +#if ( INCLUDE_vTaskSuspend == 1 ) + + void vTaskResume( xTaskHandle pxTaskToResume ) + { + tskTCB *pxTCB; + + /* It does not make sense to resume the calling task. */ + configASSERT( pxTaskToResume ); + + /* Remove the task from whichever list it is currently in, and place + it in the ready list. */ + pxTCB = ( tskTCB * ) pxTaskToResume; + + /* The parameter cannot be NULL as it is impossible to resume the + currently executing task. */ + if( ( pxTCB != NULL ) && ( pxTCB != pxCurrentTCB ) ) + { + taskENTER_CRITICAL(); + { + if( xTaskIsTaskSuspended( pxTCB ) == pdTRUE ) + { + traceTASK_RESUME( pxTCB ); + + /* As we are in a critical section we can access the ready + lists even if the scheduler is suspended. */ + vListRemove( &( pxTCB->xGenericListItem ) ); + prvAddTaskToReadyQueue( pxTCB ); + + /* We may have just resumed a higher priority task. */ + if( pxTCB->uxPriority >= pxCurrentTCB->uxPriority ) + { + /* This yield may not cause the task just resumed to run, but + will leave the lists in the correct state for the next yield. */ + portYIELD_WITHIN_API(); + } + } + } + taskEXIT_CRITICAL(); + } + } + +#endif + +/*-----------------------------------------------------------*/ + +#if ( ( INCLUDE_xTaskResumeFromISR == 1 ) && ( INCLUDE_vTaskSuspend == 1 ) ) + + portBASE_TYPE xTaskResumeFromISR( xTaskHandle pxTaskToResume ) + { + portBASE_TYPE xYieldRequired = pdFALSE; + tskTCB *pxTCB; + + configASSERT( pxTaskToResume ); + + pxTCB = ( tskTCB * ) pxTaskToResume; + + if( xTaskIsTaskSuspended( pxTCB ) == pdTRUE ) + { + traceTASK_RESUME_FROM_ISR( pxTCB ); + + if( uxSchedulerSuspended == ( unsigned portBASE_TYPE ) pdFALSE ) + { + xYieldRequired = ( pxTCB->uxPriority >= pxCurrentTCB->uxPriority ); + vListRemove( &( pxTCB->xGenericListItem ) ); + prvAddTaskToReadyQueue( pxTCB ); + } + else + { + /* We cannot access the delayed or ready lists, so will hold this + task pending until the scheduler is resumed, at which point a + yield will be performed if necessary. */ + vListInsertEnd( ( xList * ) &( xPendingReadyList ), &( pxTCB->xEventListItem ) ); + } + } + + return xYieldRequired; + } + +#endif + + + + +/*----------------------------------------------------------- + * PUBLIC SCHEDULER CONTROL documented in task.h + *----------------------------------------------------------*/ + + +void vTaskStartScheduler( void ) +{ +portBASE_TYPE xReturn; + + /* Add the idle task at the lowest priority. */ + xReturn = xTaskCreate( prvIdleTask, ( signed char * ) "IDLE", tskIDLE_STACK_SIZE, ( void * ) NULL, ( tskIDLE_PRIORITY | portPRIVILEGE_BIT ), ( xTaskHandle * ) NULL ); + + #if ( configUSE_TIMERS == 1 ) + { + if( xReturn == pdPASS ) + { + xReturn = xTimerCreateTimerTask(); + } + } + #endif + + if( xReturn == pdPASS ) + { + /* Interrupts are turned off here, to ensure a tick does not occur + before or during the call to xPortStartScheduler(). The stacks of + the created tasks contain a status word with interrupts switched on + so interrupts will automatically get re-enabled when the first task + starts to run. + + STEPPING THROUGH HERE USING A DEBUGGER CAN CAUSE BIG PROBLEMS IF THE + DEBUGGER ALLOWS INTERRUPTS TO BE PROCESSED. */ + portDISABLE_INTERRUPTS(); + + xSchedulerRunning = pdTRUE; + xTickCount = ( portTickType ) 0; + + /* If configGENERATE_RUN_TIME_STATS is defined then the following + macro must be defined to configure the timer/counter used to generate + the run time counter time base. */ + portCONFIGURE_TIMER_FOR_RUN_TIME_STATS(); + + /* Setting up the timer tick is hardware specific and thus in the + portable interface. */ + if( xPortStartScheduler() ) + { + /* Should not reach here as if the scheduler is running the + function will not return. */ + } + else + { + /* Should only reach here if a task calls xTaskEndScheduler(). */ + } + } + + /* This line will only be reached if the kernel could not be started. */ + configASSERT( xReturn ); +} +/*-----------------------------------------------------------*/ + +void vTaskEndScheduler( void ) +{ + /* Stop the scheduler interrupts and call the portable scheduler end + routine so the original ISRs can be restored if necessary. The port + layer must ensure interrupts enable bit is left in the correct state. */ + portDISABLE_INTERRUPTS(); + xSchedulerRunning = pdFALSE; + vPortEndScheduler(); +} +/*----------------------------------------------------------*/ + +void vTaskSuspendAll( void ) +{ + /* A critical section is not required as the variable is of type + portBASE_TYPE. */ + ++uxSchedulerSuspended; +} +/*----------------------------------------------------------*/ + +signed portBASE_TYPE xTaskResumeAll( void ) +{ +register tskTCB *pxTCB; +signed portBASE_TYPE xAlreadyYielded = pdFALSE; + + /* If uxSchedulerSuspended is zero then this function does not match a + previous call to vTaskSuspendAll(). */ + configASSERT( uxSchedulerSuspended ); + + /* It is possible that an ISR caused a task to be removed from an event + list while the scheduler was suspended. If this was the case then the + removed task will have been added to the xPendingReadyList. Once the + scheduler has been resumed it is safe to move all the pending ready + tasks from this list into their appropriate ready list. */ + taskENTER_CRITICAL(); + { + --uxSchedulerSuspended; + + if( uxSchedulerSuspended == ( unsigned portBASE_TYPE ) pdFALSE ) + { + if( uxCurrentNumberOfTasks > ( unsigned portBASE_TYPE ) 0 ) + { + portBASE_TYPE xYieldRequired = pdFALSE; + + /* Move any readied tasks from the pending list into the + appropriate ready list. */ + while( listLIST_IS_EMPTY( ( xList * ) &xPendingReadyList ) == pdFALSE ) + { + pxTCB = ( tskTCB * ) listGET_OWNER_OF_HEAD_ENTRY( ( ( xList * ) &xPendingReadyList ) ); + vListRemove( &( pxTCB->xEventListItem ) ); + vListRemove( &( pxTCB->xGenericListItem ) ); + prvAddTaskToReadyQueue( pxTCB ); + + /* If we have moved a task that has a priority higher than + the current task then we should yield. */ + if( pxTCB->uxPriority >= pxCurrentTCB->uxPriority ) + { + xYieldRequired = pdTRUE; + } + } + + /* If any ticks occurred while the scheduler was suspended then + they should be processed now. This ensures the tick count does not + slip, and that any delayed tasks are resumed at the correct time. */ + if( uxMissedTicks > ( unsigned portBASE_TYPE ) 0 ) + { + while( uxMissedTicks > ( unsigned portBASE_TYPE ) 0 ) + { + vTaskIncrementTick(); + --uxMissedTicks; + } + + /* As we have processed some ticks it is appropriate to yield + to ensure the highest priority task that is ready to run is + the task actually running. */ + #if configUSE_PREEMPTION == 1 + { + xYieldRequired = pdTRUE; + } + #endif + } + + if( ( xYieldRequired == pdTRUE ) || ( xMissedYield == pdTRUE ) ) + { + xAlreadyYielded = pdTRUE; + xMissedYield = pdFALSE; + portYIELD_WITHIN_API(); + } + } + } + } + taskEXIT_CRITICAL(); + + return xAlreadyYielded; +} + + + + + + +/*----------------------------------------------------------- + * PUBLIC TASK UTILITIES documented in task.h + *----------------------------------------------------------*/ + + + +portTickType xTaskGetTickCount( void ) +{ +portTickType xTicks; + + /* Critical section required if running on a 16 bit processor. */ + taskENTER_CRITICAL(); + { + xTicks = xTickCount; + } + taskEXIT_CRITICAL(); + + return xTicks; +} +/*-----------------------------------------------------------*/ + +portTickType xTaskGetTickCountFromISR( void ) +{ +portTickType xReturn; +unsigned portBASE_TYPE uxSavedInterruptStatus; + + uxSavedInterruptStatus = portSET_INTERRUPT_MASK_FROM_ISR(); + xReturn = xTickCount; + portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedInterruptStatus ); + + return xReturn; +} +/*-----------------------------------------------------------*/ + +unsigned portBASE_TYPE uxTaskGetNumberOfTasks( void ) +{ + /* A critical section is not required because the variables are of type + portBASE_TYPE. */ + return uxCurrentNumberOfTasks; +} +/*-----------------------------------------------------------*/ + +#if ( configUSE_TRACE_FACILITY == 1 ) + + void vTaskList( signed char *pcWriteBuffer ) + { + unsigned portBASE_TYPE uxQueue; + + /* This is a VERY costly function that should be used for debug only. + It leaves interrupts disabled for a LONG time. */ + + vTaskSuspendAll(); + { + /* Run through all the lists that could potentially contain a TCB and + report the task name, state and stack high water mark. */ + + *pcWriteBuffer = ( signed char ) 0x00; + strcat( ( char * ) pcWriteBuffer, ( const char * ) "\r\n" ); + + uxQueue = uxTopUsedPriority + ( unsigned portBASE_TYPE ) 1U; + + do + { + uxQueue--; + + if( listLIST_IS_EMPTY( &( pxReadyTasksLists[ uxQueue ] ) ) == pdFALSE ) + { + prvListTaskWithinSingleList( pcWriteBuffer, ( xList * ) &( pxReadyTasksLists[ uxQueue ] ), tskREADY_CHAR ); + } + }while( uxQueue > ( unsigned short ) tskIDLE_PRIORITY ); + + if( listLIST_IS_EMPTY( pxDelayedTaskList ) == pdFALSE ) + { + prvListTaskWithinSingleList( pcWriteBuffer, ( xList * ) pxDelayedTaskList, tskBLOCKED_CHAR ); + } + + if( listLIST_IS_EMPTY( pxOverflowDelayedTaskList ) == pdFALSE ) + { + prvListTaskWithinSingleList( pcWriteBuffer, ( xList * ) pxOverflowDelayedTaskList, tskBLOCKED_CHAR ); + } + + #if( INCLUDE_vTaskDelete == 1 ) + { + if( listLIST_IS_EMPTY( &xTasksWaitingTermination ) == pdFALSE ) + { + prvListTaskWithinSingleList( pcWriteBuffer, ( xList * ) &xTasksWaitingTermination, tskDELETED_CHAR ); + } + } + #endif + + #if ( INCLUDE_vTaskSuspend == 1 ) + { + if( listLIST_IS_EMPTY( &xSuspendedTaskList ) == pdFALSE ) + { + prvListTaskWithinSingleList( pcWriteBuffer, ( xList * ) &xSuspendedTaskList, tskSUSPENDED_CHAR ); + } + } + #endif + } + xTaskResumeAll(); + } + +#endif +/*----------------------------------------------------------*/ + +#if ( configGENERATE_RUN_TIME_STATS == 1 ) + + void vTaskGetRunTimeStats( signed char *pcWriteBuffer ) + { + unsigned portBASE_TYPE uxQueue; + unsigned long ulTotalRunTime; + + /* This is a VERY costly function that should be used for debug only. + It leaves interrupts disabled for a LONG time. */ + + vTaskSuspendAll(); + { + #ifdef portALT_GET_RUN_TIME_COUNTER_VALUE + portALT_GET_RUN_TIME_COUNTER_VALUE( ulTotalRunTime ); + #else + ulTotalRunTime = portGET_RUN_TIME_COUNTER_VALUE(); + #endif + + /* Divide ulTotalRunTime by 100 to make the percentage caluclations + simpler in the prvGenerateRunTimeStatsForTasksInList() function. */ + ulTotalRunTime /= 100UL; + + /* Run through all the lists that could potentially contain a TCB, + generating a table of run timer percentages in the provided + buffer. */ + + *pcWriteBuffer = ( signed char ) 0x00; + strcat( ( char * ) pcWriteBuffer, ( const char * ) "\r\n" ); + + uxQueue = uxTopUsedPriority + ( unsigned portBASE_TYPE ) 1U; + + do + { + uxQueue--; + + if( listLIST_IS_EMPTY( &( pxReadyTasksLists[ uxQueue ] ) ) == pdFALSE ) + { + prvGenerateRunTimeStatsForTasksInList( pcWriteBuffer, ( xList * ) &( pxReadyTasksLists[ uxQueue ] ), ulTotalRunTime ); + } + }while( uxQueue > ( unsigned short ) tskIDLE_PRIORITY ); + + if( listLIST_IS_EMPTY( pxDelayedTaskList ) == pdFALSE ) + { + prvGenerateRunTimeStatsForTasksInList( pcWriteBuffer, ( xList * ) pxDelayedTaskList, ulTotalRunTime ); + } + + if( listLIST_IS_EMPTY( pxOverflowDelayedTaskList ) == pdFALSE ) + { + prvGenerateRunTimeStatsForTasksInList( pcWriteBuffer, ( xList * ) pxOverflowDelayedTaskList, ulTotalRunTime ); + } + + #if ( INCLUDE_vTaskDelete == 1 ) + { + if( listLIST_IS_EMPTY( &xTasksWaitingTermination ) == pdFALSE ) + { + prvGenerateRunTimeStatsForTasksInList( pcWriteBuffer, ( xList * ) &xTasksWaitingTermination, ulTotalRunTime ); + } + } + #endif + + #if ( INCLUDE_vTaskSuspend == 1 ) + { + if( listLIST_IS_EMPTY( &xSuspendedTaskList ) == pdFALSE ) + { + prvGenerateRunTimeStatsForTasksInList( pcWriteBuffer, ( xList * ) &xSuspendedTaskList, ulTotalRunTime ); + } + } + #endif + } + xTaskResumeAll(); + } + +#endif +/*----------------------------------------------------------*/ + +#if ( configUSE_TRACE_FACILITY == 1 ) + + void vTaskStartTrace( signed char * pcBuffer, unsigned long ulBufferSize ) + { + configASSERT( pcBuffer ); + configASSERT( ulBufferSize ); + + taskENTER_CRITICAL(); + { + pcTraceBuffer = ( signed char * )pcBuffer; + pcTraceBufferStart = pcBuffer; + pcTraceBufferEnd = pcBuffer + ( ulBufferSize - tskSIZE_OF_EACH_TRACE_LINE ); + xTracing = pdTRUE; + } + taskEXIT_CRITICAL(); + } + +#endif +/*----------------------------------------------------------*/ + +#if ( configUSE_TRACE_FACILITY == 1 ) + + unsigned long ulTaskEndTrace( void ) + { + unsigned long ulBufferLength; + + taskENTER_CRITICAL(); + xTracing = pdFALSE; + taskEXIT_CRITICAL(); + + ulBufferLength = ( unsigned long ) ( pcTraceBuffer - pcTraceBufferStart ); + + return ulBufferLength; + } + +#endif + + + +/*----------------------------------------------------------- + * SCHEDULER INTERNALS AVAILABLE FOR PORTING PURPOSES + * documented in task.h + *----------------------------------------------------------*/ + + +void vTaskIncrementTick( void ) +{ +tskTCB * pxTCB; + + /* Called by the portable layer each time a tick interrupt occurs. + Increments the tick then checks to see if the new tick value will cause any + tasks to be unblocked. */ + if( uxSchedulerSuspended == ( unsigned portBASE_TYPE ) pdFALSE ) + { + ++xTickCount; + if( xTickCount == ( portTickType ) 0 ) + { + xList *pxTemp; + + /* Tick count has overflowed so we need to swap the delay lists. + If there are any items in pxDelayedTaskList here then there is + an error! */ + configASSERT( ( listLIST_IS_EMPTY( pxDelayedTaskList ) ) ); + + pxTemp = pxDelayedTaskList; + pxDelayedTaskList = pxOverflowDelayedTaskList; + pxOverflowDelayedTaskList = pxTemp; + xNumOfOverflows++; + + if( listLIST_IS_EMPTY( pxDelayedTaskList ) != pdFALSE ) + { + /* The new current delayed list is empty. Set + xNextTaskUnblockTime to the maximum possible value so it is + extremely unlikely that the + if( xTickCount >= xNextTaskUnblockTime ) test will pass until + there is an item in the delayed list. */ + xNextTaskUnblockTime = portMAX_DELAY; + } + else + { + /* The new current delayed list is not empty, get the value of + the item at the head of the delayed list. This is the time at + which the task at the head of the delayed list should be removed + from the Blocked state. */ + pxTCB = ( tskTCB * ) listGET_OWNER_OF_HEAD_ENTRY( pxDelayedTaskList ); + xNextTaskUnblockTime = listGET_LIST_ITEM_VALUE( &( pxTCB->xGenericListItem ) ); + } + } + + /* See if this tick has made a timeout expire. */ + prvCheckDelayedTasks(); + } + else + { + ++uxMissedTicks; + + /* The tick hook gets called at regular intervals, even if the + scheduler is locked. */ + #if ( configUSE_TICK_HOOK == 1 ) + { + vApplicationTickHook(); + } + #endif + } + + #if ( configUSE_TICK_HOOK == 1 ) + { + /* Guard against the tick hook being called when the missed tick + count is being unwound (when the scheduler is being unlocked. */ + if( uxMissedTicks == ( unsigned portBASE_TYPE ) 0U ) + { + vApplicationTickHook(); + } + } + #endif + + traceTASK_INCREMENT_TICK( xTickCount ); +} +/*-----------------------------------------------------------*/ + +#if ( ( INCLUDE_vTaskCleanUpResources == 1 ) && ( INCLUDE_vTaskSuspend == 1 ) ) + + void vTaskCleanUpResources( void ) + { + unsigned short usQueue; + volatile tskTCB *pxTCB; + + usQueue = ( unsigned short ) uxTopUsedPriority + ( unsigned short ) 1; + + /* Remove any TCB's from the ready queues. */ + do + { + usQueue--; + + while( listLIST_IS_EMPTY( &( pxReadyTasksLists[ usQueue ] ) ) == pdFALSE ) + { + listGET_OWNER_OF_NEXT_ENTRY( pxTCB, &( pxReadyTasksLists[ usQueue ] ) ); + vListRemove( ( xListItem * ) &( pxTCB->xGenericListItem ) ); + + prvDeleteTCB( ( tskTCB * ) pxTCB ); + } + }while( usQueue > ( unsigned short ) tskIDLE_PRIORITY ); + + /* Remove any TCB's from the delayed queue. */ + while( listLIST_IS_EMPTY( &xDelayedTaskList1 ) == pdFALSE ) + { + listGET_OWNER_OF_NEXT_ENTRY( pxTCB, &xDelayedTaskList1 ); + vListRemove( ( xListItem * ) &( pxTCB->xGenericListItem ) ); + + prvDeleteTCB( ( tskTCB * ) pxTCB ); + } + + /* Remove any TCB's from the overflow delayed queue. */ + while( listLIST_IS_EMPTY( &xDelayedTaskList2 ) == pdFALSE ) + { + listGET_OWNER_OF_NEXT_ENTRY( pxTCB, &xDelayedTaskList2 ); + vListRemove( ( xListItem * ) &( pxTCB->xGenericListItem ) ); + + prvDeleteTCB( ( tskTCB * ) pxTCB ); + } + + while( listLIST_IS_EMPTY( &xSuspendedTaskList ) == pdFALSE ) + { + listGET_OWNER_OF_NEXT_ENTRY( pxTCB, &xSuspendedTaskList ); + vListRemove( ( xListItem * ) &( pxTCB->xGenericListItem ) ); + + prvDeleteTCB( ( tskTCB * ) pxTCB ); + } + } + +#endif +/*-----------------------------------------------------------*/ + +#if ( configUSE_APPLICATION_TASK_TAG == 1 ) + + void vTaskSetApplicationTaskTag( xTaskHandle xTask, pdTASK_HOOK_CODE pxHookFunction ) + { + tskTCB *xTCB; + + /* If xTask is NULL then we are setting our own task hook. */ + if( xTask == NULL ) + { + xTCB = ( tskTCB * ) pxCurrentTCB; + } + else + { + xTCB = ( tskTCB * ) xTask; + } + + /* Save the hook function in the TCB. A critical section is required as + the value can be accessed from an interrupt. */ + taskENTER_CRITICAL(); + xTCB->pxTaskTag = pxHookFunction; + taskEXIT_CRITICAL(); + } + +#endif +/*-----------------------------------------------------------*/ + +#if ( configUSE_APPLICATION_TASK_TAG == 1 ) + + pdTASK_HOOK_CODE xTaskGetApplicationTaskTag( xTaskHandle xTask ) + { + tskTCB *xTCB; + pdTASK_HOOK_CODE xReturn; + + /* If xTask is NULL then we are setting our own task hook. */ + if( xTask == NULL ) + { + xTCB = ( tskTCB * ) pxCurrentTCB; + } + else + { + xTCB = ( tskTCB * ) xTask; + } + + /* Save the hook function in the TCB. A critical section is required as + the value can be accessed from an interrupt. */ + taskENTER_CRITICAL(); + xReturn = xTCB->pxTaskTag; + taskEXIT_CRITICAL(); + + return xReturn; + } + +#endif +/*-----------------------------------------------------------*/ + +#if ( configUSE_APPLICATION_TASK_TAG == 1 ) + + portBASE_TYPE xTaskCallApplicationTaskHook( xTaskHandle xTask, void *pvParameter ) + { + tskTCB *xTCB; + portBASE_TYPE xReturn; + + /* If xTask is NULL then we are calling our own task hook. */ + if( xTask == NULL ) + { + xTCB = ( tskTCB * ) pxCurrentTCB; + } + else + { + xTCB = ( tskTCB * ) xTask; + } + + if( xTCB->pxTaskTag != NULL ) + { + xReturn = xTCB->pxTaskTag( pvParameter ); + } + else + { + xReturn = pdFAIL; + } + + return xReturn; + } + +#endif +/*-----------------------------------------------------------*/ + +void vTaskSwitchContext( void ) +{ + if( uxSchedulerSuspended != ( unsigned portBASE_TYPE ) pdFALSE ) + { + /* The scheduler is currently suspended - do not allow a context + switch. */ + xMissedYield = pdTRUE; + } + else + { + traceTASK_SWITCHED_OUT(); + //id_out=pxCurrentTCB->task_id; + + + #if ( configGENERATE_RUN_TIME_STATS == 1 ) + { + unsigned long ulTempCounter; + + #ifdef portALT_GET_RUN_TIME_COUNTER_VALUE + portALT_GET_RUN_TIME_COUNTER_VALUE( ulTempCounter ); + #else + ulTempCounter = portGET_RUN_TIME_COUNTER_VALUE(); + #endif + + /* Add the amount of time the task has been running to the accumulated + time so far. The time the task started running was stored in + ulTaskSwitchedInTime. Note that there is no overflow protection here + so count values are only valid until the timer overflows. Generally + this will be about 1 hour assuming a 1uS timer increment. */ + pxCurrentTCB->ulRunTimeCounter += ( ulTempCounter - ulTaskSwitchedInTime ); + ulTaskSwitchedInTime = ulTempCounter; + } + #endif + + taskFIRST_CHECK_FOR_STACK_OVERFLOW(); + taskSECOND_CHECK_FOR_STACK_OVERFLOW(); + + /* Find the highest priority queue that contains ready tasks. */ + while( listLIST_IS_EMPTY( &( pxReadyTasksLists[ uxTopReadyPriority ] ) ) ) + { + configASSERT( uxTopReadyPriority ); + --uxTopReadyPriority; + } + + /* listGET_OWNER_OF_NEXT_ENTRY walks through the list, so the tasks of the + same priority get an equal share of the processor time. */ + listGET_OWNER_OF_NEXT_ENTRY( pxCurrentTCB, &( pxReadyTasksLists[ uxTopReadyPriority ] ) ); + + traceTASK_SWITCHED_IN(); + /*if (previous_id_in!=pxCurrentTCB->task_id) + { + if (previous_id_in!=0xFF) + write_trace_vcd(previous_id_in, 0); + write_trace_vcd(pxCurrentTCB->task_id, 1); + previous_id_in=pxCurrentTCB->task_id; + }*/ + vWriteTraceToBuffer(); + } +} +/*-----------------------------------------------------------*/ + +void vTaskPlaceOnEventList( const xList * const pxEventList, portTickType xTicksToWait ) +{ +portTickType xTimeToWake; + + configASSERT( pxEventList ); + + /* THIS FUNCTION MUST BE CALLED WITH INTERRUPTS DISABLED OR THE + SCHEDULER SUSPENDED. */ + + /* Place the event list item of the TCB in the appropriate event list. + This is placed in the list in priority order so the highest priority task + is the first to be woken by the event. */ + vListInsert( ( xList * ) pxEventList, ( xListItem * ) &( pxCurrentTCB->xEventListItem ) ); + + /* We must remove ourselves from the ready list before adding ourselves + to the blocked list as the same list item is used for both lists. We have + exclusive access to the ready lists as the scheduler is locked. */ + vListRemove( ( xListItem * ) &( pxCurrentTCB->xGenericListItem ) ); + + + #if ( INCLUDE_vTaskSuspend == 1 ) + { + if( xTicksToWait == portMAX_DELAY ) + { + /* Add ourselves to the suspended task list instead of a delayed task + list to ensure we are not woken by a timing event. We will block + indefinitely. */ + vListInsertEnd( ( xList * ) &xSuspendedTaskList, ( xListItem * ) &( pxCurrentTCB->xGenericListItem ) ); + } + else + { + /* Calculate the time at which the task should be woken if the event does + not occur. This may overflow but this doesn't matter. */ + xTimeToWake = xTickCount + xTicksToWait; + prvAddCurrentTaskToDelayedList( xTimeToWake ); + } + } + #else + { + /* Calculate the time at which the task should be woken if the event does + not occur. This may overflow but this doesn't matter. */ + xTimeToWake = xTickCount + xTicksToWait; + prvAddCurrentTaskToDelayedList( xTimeToWake ); + } + #endif +} +/*-----------------------------------------------------------*/ + +#if configUSE_TIMERS == 1 + + void vTaskPlaceOnEventListRestricted( const xList * const pxEventList, portTickType xTicksToWait ) + { + portTickType xTimeToWake; + + configASSERT( pxEventList ); + + /* This function should not be called by application code hence the + 'Restricted' in its name. It is not part of the public API. It is + designed for use by kernel code, and has special calling requirements - + it should be called from a critical section. */ + + + /* Place the event list item of the TCB in the appropriate event list. + In this case it is assume that this is the only task that is going to + be waiting on this event list, so the faster vListInsertEnd() function + can be used in place of vListInsert. */ + vListInsertEnd( ( xList * ) pxEventList, ( xListItem * ) &( pxCurrentTCB->xEventListItem ) ); + + /* We must remove this task from the ready list before adding it to the + blocked list as the same list item is used for both lists. This + function is called form a critical section. */ + vListRemove( ( xListItem * ) &( pxCurrentTCB->xGenericListItem ) ); + + /* Calculate the time at which the task should be woken if the event does + not occur. This may overflow but this doesn't matter. */ + xTimeToWake = xTickCount + xTicksToWait; + prvAddCurrentTaskToDelayedList( xTimeToWake ); + } + +#endif /* configUSE_TIMERS */ +/*-----------------------------------------------------------*/ + +signed portBASE_TYPE xTaskRemoveFromEventList( const xList * const pxEventList ) +{ +tskTCB *pxUnblockedTCB; +portBASE_TYPE xReturn; + + /* THIS FUNCTION MUST BE CALLED WITH INTERRUPTS DISABLED OR THE + SCHEDULER SUSPENDED. It can also be called from within an ISR. */ + + /* The event list is sorted in priority order, so we can remove the + first in the list, remove the TCB from the delayed list, and add + it to the ready list. + + If an event is for a queue that is locked then this function will never + get called - the lock count on the queue will get modified instead. This + means we can always expect exclusive access to the event list here. + + This function assumes that a check has already been made to ensure that + pxEventList is not empty. */ + pxUnblockedTCB = ( tskTCB * ) listGET_OWNER_OF_HEAD_ENTRY( pxEventList ); + configASSERT( pxUnblockedTCB ); + vListRemove( &( pxUnblockedTCB->xEventListItem ) ); + + if( uxSchedulerSuspended == ( unsigned portBASE_TYPE ) pdFALSE ) + { + vListRemove( &( pxUnblockedTCB->xGenericListItem ) ); + prvAddTaskToReadyQueue( pxUnblockedTCB ); + } + else + { + /* We cannot access the delayed or ready lists, so will hold this + task pending until the scheduler is resumed. */ + vListInsertEnd( ( xList * ) &( xPendingReadyList ), &( pxUnblockedTCB->xEventListItem ) ); + } + + if( pxUnblockedTCB->uxPriority >= pxCurrentTCB->uxPriority ) + { + /* Return true if the task removed from the event list has + a higher priority than the calling task. This allows + the calling task to know if it should force a context + switch now. */ + xReturn = pdTRUE; + } + else + { + xReturn = pdFALSE; + } + + return xReturn; +} +/*-----------------------------------------------------------*/ + +void vTaskSetTimeOutState( xTimeOutType * const pxTimeOut ) +{ + configASSERT( pxTimeOut ); + pxTimeOut->xOverflowCount = xNumOfOverflows; + pxTimeOut->xTimeOnEntering = xTickCount; +} +/*-----------------------------------------------------------*/ + +portBASE_TYPE xTaskCheckForTimeOut( xTimeOutType * const pxTimeOut, portTickType * const pxTicksToWait ) +{ +portBASE_TYPE xReturn; + + configASSERT( pxTimeOut ); + configASSERT( pxTicksToWait ); + + taskENTER_CRITICAL(); + { + #if ( INCLUDE_vTaskSuspend == 1 ) + /* If INCLUDE_vTaskSuspend is set to 1 and the block time specified is + the maximum block time then the task should block indefinitely, and + therefore never time out. */ + if( *pxTicksToWait == portMAX_DELAY ) + { + xReturn = pdFALSE; + } + else /* We are not blocking indefinitely, perform the checks below. */ + #endif + + if( ( xNumOfOverflows != pxTimeOut->xOverflowCount ) && ( ( portTickType ) xTickCount >= ( portTickType ) pxTimeOut->xTimeOnEntering ) ) + { + /* The tick count is greater than the time at which vTaskSetTimeout() + was called, but has also overflowed since vTaskSetTimeOut() was called. + It must have wrapped all the way around and gone past us again. This + passed since vTaskSetTimeout() was called. */ + xReturn = pdTRUE; + } + else if( ( ( portTickType ) ( ( portTickType ) xTickCount - ( portTickType ) pxTimeOut->xTimeOnEntering ) ) < ( portTickType ) *pxTicksToWait ) + { + /* Not a genuine timeout. Adjust parameters for time remaining. */ + *pxTicksToWait -= ( ( portTickType ) xTickCount - ( portTickType ) pxTimeOut->xTimeOnEntering ); + vTaskSetTimeOutState( pxTimeOut ); + xReturn = pdFALSE; + } + else + { + xReturn = pdTRUE; + } + } + taskEXIT_CRITICAL(); + + return xReturn; +} +/*-----------------------------------------------------------*/ + +void vTaskMissedYield( void ) +{ + xMissedYield = pdTRUE; +} + +/* + * ----------------------------------------------------------- + * The Idle task. + * ---------------------------------------------------------- + * + * The portTASK_FUNCTION() macro is used to allow port/compiler specific + * language extensions. The equivalent prototype for this function is: + * + * void prvIdleTask( void *pvParameters ); + * + */ +static portTASK_FUNCTION( prvIdleTask, pvParameters ) +{ + /* Stop warnings. */ + ( void ) pvParameters; + + for( ;; ) + { + /* See if any tasks have been deleted. */ + prvCheckTasksWaitingTermination(); + + #if ( configUSE_PREEMPTION == 0 ) + { + /* If we are not using preemption we keep forcing a task switch to + see if any other task has become available. If we are using + preemption we don't need to do this as any task becoming available + will automatically get the processor anyway. */ + taskYIELD(); + } + #endif + + #if ( ( configUSE_PREEMPTION == 1 ) && ( configIDLE_SHOULD_YIELD == 1 ) ) + { + /* When using preemption tasks of equal priority will be + timesliced. If a task that is sharing the idle priority is ready + to run then the idle task should yield before the end of the + timeslice. + + A critical region is not required here as we are just reading from + the list, and an occasional incorrect value will not matter. If + the ready list at the idle priority contains more than one task + then a task other than the idle task is ready to execute. */ + if( listCURRENT_LIST_LENGTH( &( pxReadyTasksLists[ tskIDLE_PRIORITY ] ) ) > ( unsigned portBASE_TYPE ) 1 ) + { + taskYIELD(); + } + } + #endif + + #if ( configUSE_IDLE_HOOK == 1 ) + { + extern void vApplicationIdleHook( void ); + + /* Call the user defined function from within the idle task. This + allows the application designer to add background functionality + without the overhead of a separate task. + NOTE: vApplicationIdleHook() MUST NOT, UNDER ANY CIRCUMSTANCES, + CALL A FUNCTION THAT MIGHT BLOCK. */ + vApplicationIdleHook(); + } + #endif + } +} /*lint !e715 pvParameters is not accessed but all task functions require the same prototype. */ + + + + + + + +/*----------------------------------------------------------- + * File private functions documented at the top of the file. + *----------------------------------------------------------*/ + + + +static void prvInitialiseTCBVariables( tskTCB *pxTCB, const signed char * const pcName, unsigned portBASE_TYPE uxPriority, const xMemoryRegion * const xRegions, unsigned short usStackDepth ) +{ + /* Store the function name in the TCB. */ + #if configMAX_TASK_NAME_LEN > 1 + { + /* Don't bring strncpy into the build unnecessarily. */ + strncpy( ( char * ) pxTCB->pcTaskName, ( const char * ) pcName, ( unsigned short ) configMAX_TASK_NAME_LEN ); + } + #endif + pxTCB->pcTaskName[ ( unsigned short ) configMAX_TASK_NAME_LEN - ( unsigned short ) 1 ] = ( signed char ) '\0'; + + /* This is used as an array index so must ensure it's not too large. First + remove the privilege bit if one is present. */ + if( uxPriority >= configMAX_PRIORITIES ) + { + uxPriority = configMAX_PRIORITIES - ( unsigned portBASE_TYPE ) 1U; + } + + pxTCB->uxPriority = uxPriority; + #if ( configUSE_MUTEXES == 1 ) + { + pxTCB->uxBasePriority = uxPriority; + } + #endif + + vListInitialiseItem( &( pxTCB->xGenericListItem ) ); + vListInitialiseItem( &( pxTCB->xEventListItem ) ); + + /* Set the pxTCB as a link back from the xListItem. This is so we can get + back to the containing TCB from a generic item in a list. */ + listSET_LIST_ITEM_OWNER( &( pxTCB->xGenericListItem ), pxTCB ); + + /* Event lists are always in priority order. */ + listSET_LIST_ITEM_VALUE( &( pxTCB->xEventListItem ), configMAX_PRIORITIES - ( portTickType ) uxPriority ); + listSET_LIST_ITEM_OWNER( &( pxTCB->xEventListItem ), pxTCB ); + + #if ( portCRITICAL_NESTING_IN_TCB == 1 ) + { + pxTCB->uxCriticalNesting = ( unsigned portBASE_TYPE ) 0; + } + #endif + + #if ( configUSE_APPLICATION_TASK_TAG == 1 ) + { + pxTCB->pxTaskTag = NULL; + } + #endif + + #if ( configGENERATE_RUN_TIME_STATS == 1 ) + { + pxTCB->ulRunTimeCounter = 0UL; + } + #endif + + #if ( portUSING_MPU_WRAPPERS == 1 ) + { + vPortStoreTaskMPUSettings( &( pxTCB->xMPUSettings ), xRegions, pxTCB->pxStack, usStackDepth ); + } + #else + { + ( void ) xRegions; + ( void ) usStackDepth; + } + #endif +} +/*-----------------------------------------------------------*/ + +#if ( portUSING_MPU_WRAPPERS == 1 ) + + void vTaskAllocateMPURegions( xTaskHandle xTaskToModify, const xMemoryRegion * const xRegions ) + { + tskTCB *pxTCB; + + if( xTaskToModify == pxCurrentTCB ) + { + xTaskToModify = NULL; + } + + /* If null is passed in here then we are deleting ourselves. */ + pxTCB = prvGetTCBFromHandle( xTaskToModify ); + + vPortStoreTaskMPUSettings( &( pxTCB->xMPUSettings ), xRegions, NULL, 0 ); + } + /*-----------------------------------------------------------*/ +#endif + +static void prvInitialiseTaskLists( void ) +{ +unsigned portBASE_TYPE uxPriority; + + for( uxPriority = ( unsigned portBASE_TYPE ) 0U; uxPriority < configMAX_PRIORITIES; uxPriority++ ) + { + vListInitialise( ( xList * ) &( pxReadyTasksLists[ uxPriority ] ) ); + } + + vListInitialise( ( xList * ) &xDelayedTaskList1 ); + vListInitialise( ( xList * ) &xDelayedTaskList2 ); + vListInitialise( ( xList * ) &xPendingReadyList ); + + #if ( INCLUDE_vTaskDelete == 1 ) + { + vListInitialise( ( xList * ) &xTasksWaitingTermination ); + } + #endif + + #if ( INCLUDE_vTaskSuspend == 1 ) + { + vListInitialise( ( xList * ) &xSuspendedTaskList ); + } + #endif + + /* Start with pxDelayedTaskList using list1 and the pxOverflowDelayedTaskList + using list2. */ + pxDelayedTaskList = &xDelayedTaskList1; + pxOverflowDelayedTaskList = &xDelayedTaskList2; +} +/*-----------------------------------------------------------*/ + +static void prvCheckTasksWaitingTermination( void ) +{ + #if ( INCLUDE_vTaskDelete == 1 ) + { + portBASE_TYPE xListIsEmpty; + + /* ucTasksDeleted is used to prevent vTaskSuspendAll() being called + too often in the idle task. */ + if( uxTasksDeleted > ( unsigned portBASE_TYPE ) 0 ) + { + vTaskSuspendAll(); + xListIsEmpty = listLIST_IS_EMPTY( &xTasksWaitingTermination ); + xTaskResumeAll(); + + if( xListIsEmpty == pdFALSE ) + { + tskTCB *pxTCB; + + taskENTER_CRITICAL(); + { + pxTCB = ( tskTCB * ) listGET_OWNER_OF_HEAD_ENTRY( ( ( xList * ) &xTasksWaitingTermination ) ); + vListRemove( &( pxTCB->xGenericListItem ) ); + --uxCurrentNumberOfTasks; + --uxTasksDeleted; + } + taskEXIT_CRITICAL(); + + prvDeleteTCB( pxTCB ); + } + } + } + #endif +} +/*-----------------------------------------------------------*/ + +static void prvAddCurrentTaskToDelayedList( portTickType xTimeToWake ) +{ + /* The list item will be inserted in wake time order. */ + listSET_LIST_ITEM_VALUE( &( pxCurrentTCB->xGenericListItem ), xTimeToWake ); + + if( xTimeToWake < xTickCount ) + { + /* Wake time has overflowed. Place this item in the overflow list. */ + vListInsert( ( xList * ) pxOverflowDelayedTaskList, ( xListItem * ) &( pxCurrentTCB->xGenericListItem ) ); + } + else + { + /* The wake time has not overflowed, so we can use the current block list. */ + vListInsert( ( xList * ) pxDelayedTaskList, ( xListItem * ) &( pxCurrentTCB->xGenericListItem ) ); + + /* If the task entering the blocked state was placed at the head of the + list of blocked tasks then xNextTaskUnblockTime needs to be updated + too. */ + if( xTimeToWake < xNextTaskUnblockTime ) + { + xNextTaskUnblockTime = xTimeToWake; + } + } +} +/*-----------------------------------------------------------*/ + +static tskTCB *prvAllocateTCBAndStack( unsigned short usStackDepth, portSTACK_TYPE *puxStackBuffer ) +{ +tskTCB *pxNewTCB; + + /* Allocate space for the TCB. Where the memory comes from depends on + the implementation of the port malloc function. */ + pxNewTCB = ( tskTCB * ) pvPortMalloc( sizeof( tskTCB ) ); + + if( pxNewTCB != NULL ) + { + /* Allocate space for the stack used by the task being created. + The base of the stack memory stored in the TCB so the task can + be deleted later if required. */ + pxNewTCB->pxStack = ( portSTACK_TYPE * ) pvPortMallocAligned( ( ( ( size_t )usStackDepth ) * sizeof( portSTACK_TYPE ) ), puxStackBuffer ); + + if( pxNewTCB->pxStack == NULL ) + { + /* Could not allocate the stack. Delete the allocated TCB. */ + vPortFree( pxNewTCB ); + pxNewTCB = NULL; + } + else + { + /* Just to help debugging. */ + memset( pxNewTCB->pxStack, tskSTACK_FILL_BYTE, usStackDepth * sizeof( portSTACK_TYPE ) ); + } + } + + return pxNewTCB; +} +/*-----------------------------------------------------------*/ + +#if ( configUSE_TRACE_FACILITY == 1 ) + + static void prvListTaskWithinSingleList( const signed char *pcWriteBuffer, xList *pxList, signed char cStatus ) + { + volatile tskTCB *pxNextTCB, *pxFirstTCB; + unsigned short usStackRemaining; + + /* Write the details of all the TCB's in pxList into the buffer. */ + listGET_OWNER_OF_NEXT_ENTRY( pxFirstTCB, pxList ); + do + { + listGET_OWNER_OF_NEXT_ENTRY( pxNextTCB, pxList ); + #if ( portSTACK_GROWTH > 0 ) + { + usStackRemaining = usTaskCheckFreeStackSpace( ( unsigned char * ) pxNextTCB->pxEndOfStack ); + } + #else + { + usStackRemaining = usTaskCheckFreeStackSpace( ( unsigned char * ) pxNextTCB->pxStack ); + } + #endif + + sprintf( pcStatusString, ( char * ) "%s\t\t%c\t%u\t%u\t%u\r\n", pxNextTCB->pcTaskName, cStatus, ( unsigned int ) pxNextTCB->uxPriority, usStackRemaining, ( unsigned int ) pxNextTCB->uxTCBNumber ); + strcat( ( char * ) pcWriteBuffer, ( char * ) pcStatusString ); + + } while( pxNextTCB != pxFirstTCB ); + } + +#endif +/*-----------------------------------------------------------*/ + +#if ( configGENERATE_RUN_TIME_STATS == 1 ) + + static void prvGenerateRunTimeStatsForTasksInList( const signed char *pcWriteBuffer, xList *pxList, unsigned long ulTotalRunTime ) + { + volatile tskTCB *pxNextTCB, *pxFirstTCB; + unsigned long ulStatsAsPercentage; + + /* Write the run time stats of all the TCB's in pxList into the buffer. */ + listGET_OWNER_OF_NEXT_ENTRY( pxFirstTCB, pxList ); + do + { + /* Get next TCB in from the list. */ + listGET_OWNER_OF_NEXT_ENTRY( pxNextTCB, pxList ); + + /* Divide by zero check. */ + if( ulTotalRunTime > 0UL ) + { + /* Has the task run at all? */ + if( pxNextTCB->ulRunTimeCounter == 0 ) + { + /* The task has used no CPU time at all. */ + sprintf( pcStatsString, ( char * ) "%s\t\t0\t\t0%%\r\n", pxNextTCB->pcTaskName ); + } + else + { + /* What percentage of the total run time has the task used? + This will always be rounded down to the nearest integer. + ulTotalRunTime has already been divided by 100. */ + ulStatsAsPercentage = pxNextTCB->ulRunTimeCounter / ulTotalRunTime; + + if( ulStatsAsPercentage > 0UL ) + { + #ifdef portLU_PRINTF_SPECIFIER_REQUIRED + { + sprintf( pcStatsString, ( char * ) "%s\t\t%lu\t\t%lu%%\r\n", pxNextTCB->pcTaskName, pxNextTCB->ulRunTimeCounter, ulStatsAsPercentage ); + } + #else + { + /* sizeof( int ) == sizeof( long ) so a smaller + printf() library can be used. */ + sprintf( pcStatsString, ( char * ) "%s\t\t%u\t\t%u%%\r\n", pxNextTCB->pcTaskName, ( unsigned int ) pxNextTCB->ulRunTimeCounter, ( unsigned int ) ulStatsAsPercentage ); + } + #endif + } + else + { + /* If the percentage is zero here then the task has + consumed less than 1% of the total run time. */ + #ifdef portLU_PRINTF_SPECIFIER_REQUIRED + { + sprintf( pcStatsString, ( char * ) "%s\t\t%lu\t\t<1%%\r\n", pxNextTCB->pcTaskName, pxNextTCB->ulRunTimeCounter ); + } + #else + { + /* sizeof( int ) == sizeof( long ) so a smaller + printf() library can be used. */ + sprintf( pcStatsString, ( char * ) "%s\t\t%u\t\t<1%%\r\n", pxNextTCB->pcTaskName, ( unsigned int ) pxNextTCB->ulRunTimeCounter ); + } + #endif + } + } + + strcat( ( char * ) pcWriteBuffer, ( char * ) pcStatsString ); + } + + } while( pxNextTCB != pxFirstTCB ); + } + +#endif +/*-----------------------------------------------------------*/ + +#if ( ( configUSE_TRACE_FACILITY == 1 ) || ( INCLUDE_uxTaskGetStackHighWaterMark == 1 ) ) + + static unsigned short usTaskCheckFreeStackSpace( const unsigned char * pucStackByte ) + { + register unsigned short usCount = 0; + + while( *pucStackByte == tskSTACK_FILL_BYTE ) + { + pucStackByte -= portSTACK_GROWTH; + usCount++; + } + + usCount /= sizeof( portSTACK_TYPE ); + + return usCount; + } + +#endif +/*-----------------------------------------------------------*/ + +#if ( INCLUDE_uxTaskGetStackHighWaterMark == 1 ) + + unsigned portBASE_TYPE uxTaskGetStackHighWaterMark( xTaskHandle xTask ) + { + tskTCB *pxTCB; + unsigned char *pcEndOfStack; + unsigned portBASE_TYPE uxReturn; + + pxTCB = prvGetTCBFromHandle( xTask ); + + #if portSTACK_GROWTH < 0 + { + pcEndOfStack = ( unsigned char * ) pxTCB->pxStack; + } + #else + { + pcEndOfStack = ( unsigned char * ) pxTCB->pxEndOfStack; + } + #endif + + uxReturn = ( unsigned portBASE_TYPE ) usTaskCheckFreeStackSpace( pcEndOfStack ); + + return uxReturn; + } + +#endif +/*-----------------------------------------------------------*/ + +#if ( ( INCLUDE_vTaskDelete == 1 ) || ( INCLUDE_vTaskCleanUpResources == 1 ) ) + + static void prvDeleteTCB( tskTCB *pxTCB ) + { + /* 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. */ + vPortFreeAligned( pxTCB->pxStack ); + vPortFree( pxTCB ); + } + +#endif + + +/*-----------------------------------------------------------*/ + +#if ( ( INCLUDE_xTaskGetCurrentTaskHandle == 1 ) || ( configUSE_MUTEXES == 1 ) ) + + xTaskHandle xTaskGetCurrentTaskHandle( void ) + { + xTaskHandle xReturn; + + /* A critical section is not required as this is not called from + an interrupt and the current TCB will always be the same for any + individual execution thread. */ + xReturn = pxCurrentTCB; + + return xReturn; + } + +#endif + +/*-----------------------------------------------------------*/ + +#if ( ( INCLUDE_xTaskGetSchedulerState == 1 ) || ( configUSE_TIMERS == 1 ) ) + + portBASE_TYPE xTaskGetSchedulerState( void ) + { + portBASE_TYPE xReturn; + + if( xSchedulerRunning == pdFALSE ) + { + xReturn = taskSCHEDULER_NOT_STARTED; + } + else + { + if( uxSchedulerSuspended == ( unsigned portBASE_TYPE ) pdFALSE ) + { + xReturn = taskSCHEDULER_RUNNING; + } + else + { + xReturn = taskSCHEDULER_SUSPENDED; + } + } + + return xReturn; + } + +#endif +/*-----------------------------------------------------------*/ + +#if ( configUSE_MUTEXES == 1 ) + + void vTaskPriorityInherit( xTaskHandle * const pxMutexHolder ) + { + tskTCB * const pxTCB = ( tskTCB * ) pxMutexHolder; + + configASSERT( pxMutexHolder ); + + if( pxTCB->uxPriority < pxCurrentTCB->uxPriority ) + { + /* Adjust the mutex holder state to account for its new priority. */ + listSET_LIST_ITEM_VALUE( &( pxTCB->xEventListItem ), configMAX_PRIORITIES - ( portTickType ) pxCurrentTCB->uxPriority ); + + /* If the task being modified is in the ready state it will need to + be moved in to a new list. */ + if( listIS_CONTAINED_WITHIN( &( pxReadyTasksLists[ pxTCB->uxPriority ] ), &( pxTCB->xGenericListItem ) ) ) + { + vListRemove( &( pxTCB->xGenericListItem ) ); + + /* Inherit the priority before being moved into the new list. */ + pxTCB->uxPriority = pxCurrentTCB->uxPriority; + prvAddTaskToReadyQueue( pxTCB ); + } + else + { + /* Just inherit the priority. */ + pxTCB->uxPriority = pxCurrentTCB->uxPriority; + } + } + } + +#endif +/*-----------------------------------------------------------*/ + +#if ( configUSE_MUTEXES == 1 ) + + void vTaskPriorityDisinherit( xTaskHandle * const pxMutexHolder ) + { + tskTCB * const pxTCB = ( tskTCB * ) pxMutexHolder; + + if( pxMutexHolder != NULL ) + { + if( pxTCB->uxPriority != pxTCB->uxBasePriority ) + { + /* We must be the running task to be able to give the mutex back. + Remove ourselves from the ready list we currently appear in. */ + vListRemove( &( pxTCB->xGenericListItem ) ); + + /* Disinherit the priority before adding ourselves into the new + ready list. */ + pxTCB->uxPriority = pxTCB->uxBasePriority; + listSET_LIST_ITEM_VALUE( &( pxTCB->xEventListItem ), configMAX_PRIORITIES - ( portTickType ) pxTCB->uxPriority ); + prvAddTaskToReadyQueue( pxTCB ); + } + } + } + +#endif +/*-----------------------------------------------------------*/ + +#if ( portCRITICAL_NESTING_IN_TCB == 1 ) + + void vTaskEnterCritical( void ) + { + portDISABLE_INTERRUPTS(); + + if( xSchedulerRunning != pdFALSE ) + { + ( pxCurrentTCB->uxCriticalNesting )++; + } + } + +#endif +/*-----------------------------------------------------------*/ + +#if ( portCRITICAL_NESTING_IN_TCB == 1 ) + +void vTaskExitCritical( void ) +{ + if( xSchedulerRunning != pdFALSE ) + { + if( pxCurrentTCB->uxCriticalNesting > 0 ) + { + ( pxCurrentTCB->uxCriticalNesting )--; + + if( pxCurrentTCB->uxCriticalNesting == 0 ) + { + portENABLE_INTERRUPTS(); + } + } + } +} + +#endif +/*-----------------------------------------------------------*/ + + + + diff --git a/FreeRTOSWithTraces/FreeRTOS_src/timers.c b/FreeRTOSWithTraces/FreeRTOS_src/timers.c new file mode 100644 index 0000000000000000000000000000000000000000..7e5ef22addaf00433a7a10800cca496cdca84111 --- /dev/null +++ b/FreeRTOSWithTraces/FreeRTOS_src/timers.c @@ -0,0 +1,649 @@ +/* + FreeRTOS V7.0.1 - Copyright (C) 2011 Real Time Engineers Ltd. + + + FreeRTOS supports many tools and architectures. V7.0.0 is sponsored by: + Atollic AB - Atollic provides professional embedded systems development + tools for C/C++ development, code analysis and test automation. + See http://www.atollic.com + + + *************************************************************************** + * * + * FreeRTOS tutorial books are available in pdf and paperback. * + * Complete, revised, and edited pdf reference manuals are also * + * available. * + * * + * Purchasing FreeRTOS documentation will not only help you, by * + * ensuring you get running as quickly as possible and with an * + * in-depth knowledge of how to use FreeRTOS, it will also help * + * the FreeRTOS project to continue with its mission of providing * + * professional grade, cross platform, de facto standard solutions * + * for microcontrollers - completely free of charge! * + * * + * >>> See http://www.FreeRTOS.org/Documentation for details. <<< * + * * + * Thank you for using FreeRTOS, and thank you for your support! * + * * + *************************************************************************** + + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation AND MODIFIED BY the FreeRTOS exception. + >>>NOTE<<< The modification to the GPL is included to allow you to + distribute a combined work that includes FreeRTOS without being obliged to + provide the source code for proprietary components outside of the FreeRTOS + kernel. FreeRTOS is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + more details. You should have received a copy of the GNU General Public + License and the FreeRTOS license exception along with FreeRTOS; if not it + can be viewed here: http://www.freertos.org/a00114.html and also obtained + by writing to Richard Barry, contact details for whom are available on the + FreeRTOS WEB site. + + 1 tab == 4 spaces! + + http://www.FreeRTOS.org - Documentation, latest information, license and + contact details. + + http://www.SafeRTOS.com - A version that is certified for use in safety + critical systems. + + http://www.OpenRTOS.com - Commercial support, development, porting, + licensing and training services. +*/ + +/* Defining MPU_WRAPPERS_INCLUDED_FROM_API_FILE prevents task.h from redefining +all the API functions to use the MPU wrappers. That should only be done when +task.h is included from an application file. */ +#define MPU_WRAPPERS_INCLUDED_FROM_API_FILE + +#include "FreeRTOS.h" +#include "task.h" +#include "queue.h" +#include "timers.h" + +#undef MPU_WRAPPERS_INCLUDED_FROM_API_FILE + +/* This entire source file will be skipped if the application is not configured +to include software timer functionality. This #if is closed at the very bottom +of this file. If you want to include software timer functionality then ensure +configUSE_TIMERS is set to 1 in FreeRTOSConfig.h. */ +#if ( configUSE_TIMERS == 1 ) + +/* Misc definitions. */ +#define tmrNO_DELAY ( portTickType ) 0U + +/* The definition of the timers themselves. */ +typedef struct tmrTimerControl +{ + const signed char *pcTimerName; /*<< Text name. This is not used by the kernel, it is included simply to make debugging easier. */ + xListItem xTimerListItem; /*<< Standard linked list item as used by all kernel features for event management. */ + portTickType xTimerPeriodInTicks;/*<< How quickly and often the timer expires. */ + unsigned portBASE_TYPE uxAutoReload; /*<< Set to pdTRUE if the timer should be automatically restarted once expired. Set to pdFALSE if the timer is, in effect, a one shot timer. */ + void *pvTimerID; /*<< An ID to identify the timer. This allows the timer to be identified when the same callback is used for multiple timers. */ + tmrTIMER_CALLBACK pxCallbackFunction; /*<< The function that will be called when the timer expires. */ +} xTIMER; + +/* The definition of messages that can be sent and received on the timer +queue. */ +typedef struct tmrTimerQueueMessage +{ + portBASE_TYPE xMessageID; /*<< The command being sent to the timer service task. */ + portTickType xMessageValue; /*<< An optional value used by a subset of commands, for example, when changing the period of a timer. */ + xTIMER * pxTimer; /*<< The timer to which the command will be applied. */ +} xTIMER_MESSAGE; + + +/* The list in which active timers are stored. Timers are referenced in expire +time order, with the nearest expiry time at the front of the list. Only the +timer service task is allowed to access xActiveTimerList. */ +PRIVILEGED_DATA static xList xActiveTimerList1; +PRIVILEGED_DATA static xList xActiveTimerList2; +PRIVILEGED_DATA static xList *pxCurrentTimerList; +PRIVILEGED_DATA static xList *pxOverflowTimerList; + +/* A queue that is used to send commands to the timer service task. */ +PRIVILEGED_DATA static xQueueHandle xTimerQueue = NULL; + +/*-----------------------------------------------------------*/ + +/* + * Initialise the infrastructure used by the timer service task if it has not + * been initialised already. + */ +static void prvCheckForValidListAndQueue( void ) PRIVILEGED_FUNCTION; + +/* + * The timer service task (daemon). Timer functionality is controlled by this + * task. Other tasks communicate with the timer service task using the + * xTimerQueue queue. + */ +static void prvTimerTask( void *pvParameters ) PRIVILEGED_FUNCTION; + +/* + * Called by the timer service task to interpret and process a command it + * received on the timer queue. + */ +static void prvProcessReceivedCommands( void ) PRIVILEGED_FUNCTION; + +/* + * Insert the timer into either xActiveTimerList1, or xActiveTimerList2, + * depending on if the expire time causes a timer counter overflow. + */ +static portBASE_TYPE prvInsertTimerInActiveList( xTIMER *pxTimer, portTickType xNextExpiryTime, portTickType xTimeNow, portTickType xCommandTime ) PRIVILEGED_FUNCTION; + +/* + * An active timer has reached its expire time. Reload the timer if it is an + * auto reload timer, then call its callback. + */ +static void prvProcessExpiredTimer( portTickType xNextExpireTime, portTickType xTimeNow ) PRIVILEGED_FUNCTION; + +/* + * The tick count has overflowed. Switch the timer lists after ensuring the + * current timer list does not still reference some timers. + */ +static void prvSwitchTimerLists( portTickType xLastTime ) PRIVILEGED_FUNCTION; + +/* + * Obtain the current tick count, setting *pxTimerListsWereSwitched to pdTRUE + * if a tick count overflow occurred since prvSampleTimeNow() was last called. + */ +static portTickType prvSampleTimeNow( portBASE_TYPE *pxTimerListsWereSwitched ) PRIVILEGED_FUNCTION; + +/* + * If the timer list contains any active timers then return the expire time of + * the timer that will expire first and set *pxListWasEmpty to false. If the + * timer list does not contain any timers then return 0 and set *pxListWasEmpty + * to pdTRUE. + */ +static portTickType prvGetNextExpireTime( portBASE_TYPE *pxListWasEmpty ) PRIVILEGED_FUNCTION; + +/* + * If a timer has expired, process it. Otherwise, block the timer service task + * until either a timer does expire or a command is received. + */ +static void prvProcessTimerOrBlockTask( portTickType xNextExpireTime, portBASE_TYPE xListWasEmpty ) PRIVILEGED_FUNCTION; + +/*-----------------------------------------------------------*/ + +portBASE_TYPE xTimerCreateTimerTask( void ) +{ +portBASE_TYPE xReturn = pdFAIL; + + /* This function is called when the scheduler is started if + configUSE_TIMERS is set to 1. Check that the infrastructure used by the + timer service task has been created/initialised. If timers have already + been created then the initialisation will already have been performed. */ + prvCheckForValidListAndQueue(); + + if( xTimerQueue != NULL ) + { + xReturn = xTaskCreate( prvTimerTask, ( const signed char * ) "Tmr Svc", ( unsigned short ) configTIMER_TASK_STACK_DEPTH, NULL, ( unsigned portBASE_TYPE ) configTIMER_TASK_PRIORITY, NULL); + } + + configASSERT( xReturn ); + return xReturn; +} +/*-----------------------------------------------------------*/ + +xTimerHandle xTimerCreate( const signed char *pcTimerName, portTickType xTimerPeriodInTicks, unsigned portBASE_TYPE uxAutoReload, void *pvTimerID, tmrTIMER_CALLBACK pxCallbackFunction ) +{ +xTIMER *pxNewTimer; + + /* Allocate the timer structure. */ + if( xTimerPeriodInTicks == ( portTickType ) 0U ) + { + pxNewTimer = NULL; + configASSERT( ( xTimerPeriodInTicks > 0 ) ); + } + else + { + pxNewTimer = ( xTIMER * ) pvPortMalloc( sizeof( xTIMER ) ); + if( pxNewTimer != NULL ) + { + /* Ensure the infrastructure used by the timer service task has been + created/initialised. */ + prvCheckForValidListAndQueue(); + + /* Initialise the timer structure members using the function parameters. */ + pxNewTimer->pcTimerName = pcTimerName; + pxNewTimer->xTimerPeriodInTicks = xTimerPeriodInTicks; + pxNewTimer->uxAutoReload = uxAutoReload; + pxNewTimer->pvTimerID = pvTimerID; + pxNewTimer->pxCallbackFunction = pxCallbackFunction; + vListInitialiseItem( &( pxNewTimer->xTimerListItem ) ); + + traceTIMER_CREATE( pxNewTimer ); + } + else + { + traceTIMER_CREATE_FAILED(); + } + } + + return ( xTimerHandle ) pxNewTimer; +} +/*-----------------------------------------------------------*/ + +portBASE_TYPE xTimerGenericCommand( xTimerHandle xTimer, portBASE_TYPE xCommandID, portTickType xOptionalValue, portBASE_TYPE *pxHigherPriorityTaskWoken, portTickType xBlockTime ) +{ +portBASE_TYPE xReturn = pdFAIL; +xTIMER_MESSAGE xMessage; + + /* Send a message to the timer service task to perform a particular action + on a particular timer definition. */ + if( xTimerQueue != NULL ) + { + /* Send a command to the timer service task to start the xTimer timer. */ + xMessage.xMessageID = xCommandID; + xMessage.xMessageValue = xOptionalValue; + xMessage.pxTimer = ( xTIMER * ) xTimer; + + if( pxHigherPriorityTaskWoken == NULL ) + { + if( xTaskGetSchedulerState() == taskSCHEDULER_RUNNING ) + { + xReturn = xQueueSendToBack( xTimerQueue, &xMessage, xBlockTime ); + } + else + { + xReturn = xQueueSendToBack( xTimerQueue, &xMessage, tmrNO_DELAY ); + } + } + else + { + xReturn = xQueueSendToBackFromISR( xTimerQueue, &xMessage, pxHigherPriorityTaskWoken ); + } + + traceTIMER_COMMAND_SEND( xTimer, xCommandID, xOptionalValue, xReturn ); + } + + return xReturn; +} +/*-----------------------------------------------------------*/ + +static void prvProcessExpiredTimer( portTickType xNextExpireTime, portTickType xTimeNow ) +{ +xTIMER *pxTimer; +portBASE_TYPE xResult; + + /* Remove the timer from the list of active timers. A check has already + been performed to ensure the list is not empty. */ + pxTimer = ( xTIMER * ) listGET_OWNER_OF_HEAD_ENTRY( pxCurrentTimerList ); + vListRemove( &( pxTimer->xTimerListItem ) ); + traceTIMER_EXPIRED( pxTimer ); + + /* 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. */ + if( pxTimer->uxAutoReload == ( unsigned portBASE_TYPE ) pdTRUE ) + { + /* This is the only time a timer is inserted into a list using + a time relative to anything other than the current time. It + will therefore be inserted into the correct list relative to + the time this task thinks it is now, even if a command to + switch lists due to a tick count overflow is already waiting in + the timer queue. */ + if( prvInsertTimerInActiveList( pxTimer, ( xNextExpireTime + pxTimer->xTimerPeriodInTicks ), xTimeNow, xNextExpireTime ) == pdTRUE ) + { + /* The timer expired before it was added to the active timer + list. Reload it now. */ + xResult = xTimerGenericCommand( pxTimer, tmrCOMMAND_START, xNextExpireTime, NULL, tmrNO_DELAY ); + configASSERT( xResult ); + ( void ) xResult; + } + } + + /* Call the timer callback. */ + pxTimer->pxCallbackFunction( ( xTimerHandle ) pxTimer ); +} +/*-----------------------------------------------------------*/ + +static void prvTimerTask( void *pvParameters ) +{ +portTickType xNextExpireTime; +portBASE_TYPE xListWasEmpty; + + /* Just to avoid compiler warnings. */ + ( void ) pvParameters; + + for( ;; ) + { + /* Query the timers list to see if it contains any timers, and if so, + obtain the time at which the next timer will expire. */ + xNextExpireTime = prvGetNextExpireTime( &xListWasEmpty ); + + /* If a timer has expired, process it. Otherwise, block this task + until either a timer does expire, or a command is received. */ + prvProcessTimerOrBlockTask( xNextExpireTime, xListWasEmpty ); + + /* Empty the command queue. */ + prvProcessReceivedCommands(); + } +} +/*-----------------------------------------------------------*/ + +static void prvProcessTimerOrBlockTask( portTickType xNextExpireTime, portBASE_TYPE xListWasEmpty ) +{ +portTickType xTimeNow; +portBASE_TYPE xTimerListsWereSwitched; + + vTaskSuspendAll(); + { + /* Obtain the time now to make an assessment as to whether the timer + has expired or not. If obtaining the time causes the lists to switch + then don't process this timer as any timers that remained in the list + when the lists were switched will have been processed within the + prvSampelTimeNow() function. */ + xTimeNow = prvSampleTimeNow( &xTimerListsWereSwitched ); + if( xTimerListsWereSwitched == pdFALSE ) + { + /* The tick count has not overflowed, has the timer expired? */ + if( ( xListWasEmpty == pdFALSE ) && ( xNextExpireTime <= xTimeNow ) ) + { + xTaskResumeAll(); + prvProcessExpiredTimer( xNextExpireTime, xTimeNow ); + } + else + { + /* The tick count has not overflowed, and the next expire + time has not been reached yet. This task should therefore + block to wait for the next expire time or a command to be + received - whichever comes first. The following line cannot + be reached unless xNextExpireTime > xTimeNow, except in the + case when the current timer list is empty. */ + vQueueWaitForMessageRestricted( xTimerQueue, ( xNextExpireTime - xTimeNow ) ); + + if( xTaskResumeAll() == pdFALSE ) + { + /* Yield to wait for either a command to arrive, or the block time + to expire. If a command arrived between the critical section being + exited and this yield then the yield will not cause the task + to block. */ + portYIELD_WITHIN_API(); + } + } + } + else + { + xTaskResumeAll(); + } + } +} +/*-----------------------------------------------------------*/ + +static portTickType prvGetNextExpireTime( portBASE_TYPE *pxListWasEmpty ) +{ +portTickType xNextExpireTime; + + /* Timers are listed in expiry time order, with the head of the list + referencing the task that will expire first. Obtain the time at which + the timer with the nearest expiry time will expire. If there are no + active timers then just set the next expire time to 0. That will cause + this task to unblock when the tick count overflows, at which point the + timer lists will be switched and the next expiry time can be + re-assessed. */ + *pxListWasEmpty = listLIST_IS_EMPTY( pxCurrentTimerList ); + if( *pxListWasEmpty == pdFALSE ) + { + xNextExpireTime = listGET_ITEM_VALUE_OF_HEAD_ENTRY( pxCurrentTimerList ); + } + else + { + /* Ensure the task unblocks when the tick count rolls over. */ + xNextExpireTime = ( portTickType ) 0U; + } + + return xNextExpireTime; +} +/*-----------------------------------------------------------*/ + +static portTickType prvSampleTimeNow( portBASE_TYPE *pxTimerListsWereSwitched ) +{ +portTickType xTimeNow; +static portTickType xLastTime = ( portTickType ) 0U; + + xTimeNow = xTaskGetTickCount(); + + if( xTimeNow < xLastTime ) + { + prvSwitchTimerLists( xLastTime ); + *pxTimerListsWereSwitched = pdTRUE; + } + else + { + *pxTimerListsWereSwitched = pdFALSE; + } + + xLastTime = xTimeNow; + + return xTimeNow; +} +/*-----------------------------------------------------------*/ + +static portBASE_TYPE prvInsertTimerInActiveList( xTIMER *pxTimer, portTickType xNextExpiryTime, portTickType xTimeNow, portTickType xCommandTime ) +{ +portBASE_TYPE xProcessTimerNow = pdFALSE; + + listSET_LIST_ITEM_VALUE( &( pxTimer->xTimerListItem ), xNextExpiryTime ); + listSET_LIST_ITEM_OWNER( &( pxTimer->xTimerListItem ), pxTimer ); + + if( xNextExpiryTime <= xTimeNow ) + { + /* Has the expiry time elapsed between the command to start/reset a + timer was issued, and the time the command was processed? */ + if( ( ( portTickType ) ( xTimeNow - xCommandTime ) ) >= pxTimer->xTimerPeriodInTicks ) + { + /* The time between a command being issued and the command being + processed actually exceeds the timers period. */ + xProcessTimerNow = pdTRUE; + } + else + { + vListInsert( pxOverflowTimerList, &( pxTimer->xTimerListItem ) ); + } + } + else + { + if( ( xTimeNow < xCommandTime ) && ( xNextExpiryTime >= xCommandTime ) ) + { + /* If, since the command was issued, the tick count has overflowed + but the expiry time has not, then the timer must have already passed + its expiry time and should be processed immediately. */ + xProcessTimerNow = pdTRUE; + } + else + { + vListInsert( pxCurrentTimerList, &( pxTimer->xTimerListItem ) ); + } + } + + return xProcessTimerNow; +} +/*-----------------------------------------------------------*/ + +static void prvProcessReceivedCommands( void ) +{ +xTIMER_MESSAGE xMessage; +xTIMER *pxTimer; +portBASE_TYPE xTimerListsWereSwitched, xResult; +portTickType xTimeNow; + + /* In this case the xTimerListsWereSwitched parameter is not used, but it + must be present in the function call. */ + xTimeNow = prvSampleTimeNow( &xTimerListsWereSwitched ); + + while( xQueueReceive( xTimerQueue, &xMessage, tmrNO_DELAY ) != pdFAIL ) + { + pxTimer = xMessage.pxTimer; + + /* Is the timer already in a list of active timers? When the command + is trmCOMMAND_PROCESS_TIMER_OVERFLOW, the timer will be NULL as the + command is to the task rather than to an individual timer. */ + if( pxTimer != NULL ) + { + if( listIS_CONTAINED_WITHIN( NULL, &( pxTimer->xTimerListItem ) ) == pdFALSE ) + { + /* The timer is in a list, remove it. */ + vListRemove( &( pxTimer->xTimerListItem ) ); + } + } + + traceTIMER_COMMAND_RECEIVED( pxTimer, xMessage.xMessageID, xMessage.xMessageValue ); + + switch( xMessage.xMessageID ) + { + case tmrCOMMAND_START : + /* Start or restart a timer. */ + if( prvInsertTimerInActiveList( pxTimer, xMessage.xMessageValue + pxTimer->xTimerPeriodInTicks, xTimeNow, xMessage.xMessageValue ) == pdTRUE ) + { + /* The timer expired before it was added to the active timer + list. Process it now. */ + pxTimer->pxCallbackFunction( ( xTimerHandle ) pxTimer ); + + if( pxTimer->uxAutoReload == ( unsigned portBASE_TYPE ) pdTRUE ) + { + xResult = xTimerGenericCommand( pxTimer, tmrCOMMAND_START, xMessage.xMessageValue + pxTimer->xTimerPeriodInTicks, NULL, tmrNO_DELAY ); + configASSERT( xResult ); + ( void ) xResult; + } + } + break; + + case tmrCOMMAND_STOP : + /* The timer has already been removed from the active list. + There is nothing to do here. */ + break; + + case tmrCOMMAND_CHANGE_PERIOD : + pxTimer->xTimerPeriodInTicks = xMessage.xMessageValue; + configASSERT( ( pxTimer->xTimerPeriodInTicks > 0 ) ); + prvInsertTimerInActiveList( pxTimer, ( xTimeNow + pxTimer->xTimerPeriodInTicks ), xTimeNow, xTimeNow ); + break; + + case tmrCOMMAND_DELETE : + /* The timer has already been removed from the active list, + just free up the memory. */ + vPortFree( pxTimer ); + break; + + default : + /* Don't expect to get here. */ + break; + } + } +} +/*-----------------------------------------------------------*/ + +static void prvSwitchTimerLists( portTickType xLastTime ) +{ +portTickType xNextExpireTime, xReloadTime; +xList *pxTemp; +xTIMER *pxTimer; +portBASE_TYPE xResult; + + /* Remove compiler warnings if configASSERT() is not defined. */ + ( void ) xLastTime; + + /* The tick count has overflowed. The timer lists must be switched. + If there are any timers still referenced from the current timer list + then they must have expired and should be processed before the lists + are switched. */ + while( listLIST_IS_EMPTY( pxCurrentTimerList ) == pdFALSE ) + { + xNextExpireTime = listGET_ITEM_VALUE_OF_HEAD_ENTRY( pxCurrentTimerList ); + + /* Remove the timer from the list. */ + pxTimer = ( xTIMER * ) listGET_OWNER_OF_HEAD_ENTRY( pxCurrentTimerList ); + vListRemove( &( pxTimer->xTimerListItem ) ); + + /* Execute its callback, then send a command to restart the timer if + it is an auto-reload timer. It cannot be restarted here as the lists + have not yet been switched. */ + pxTimer->pxCallbackFunction( ( xTimerHandle ) pxTimer ); + + if( pxTimer->uxAutoReload == ( unsigned portBASE_TYPE ) pdTRUE ) + { + /* Calculate the reload value, and if the reload value results in + the timer going into the same timer list then it has already expired + and the timer should be re-inserted into the current list so it is + processed again within this loop. Otherwise a command should be sent + to restart the timer to ensure it is only inserted into a list after + the lists have been swapped. */ + xReloadTime = ( xNextExpireTime + pxTimer->xTimerPeriodInTicks ); + if( xReloadTime > xNextExpireTime ) + { + listSET_LIST_ITEM_VALUE( &( pxTimer->xTimerListItem ), xReloadTime ); + listSET_LIST_ITEM_OWNER( &( pxTimer->xTimerListItem ), pxTimer ); + vListInsert( pxCurrentTimerList, &( pxTimer->xTimerListItem ) ); + } + else + { + xResult = xTimerGenericCommand( pxTimer, tmrCOMMAND_START, xNextExpireTime, NULL, tmrNO_DELAY ); + configASSERT( xResult ); + ( void ) xResult; + } + } + } + + pxTemp = pxCurrentTimerList; + pxCurrentTimerList = pxOverflowTimerList; + pxOverflowTimerList = pxTemp; +} +/*-----------------------------------------------------------*/ + +static void prvCheckForValidListAndQueue( void ) +{ + /* Check that the list from which active timers are referenced, and the + queue used to communicate with the timer service, have been + initialised. */ + taskENTER_CRITICAL(); + { + if( xTimerQueue == NULL ) + { + vListInitialise( &xActiveTimerList1 ); + vListInitialise( &xActiveTimerList2 ); + pxCurrentTimerList = &xActiveTimerList1; + pxOverflowTimerList = &xActiveTimerList2; + xTimerQueue = xQueueCreate( ( unsigned portBASE_TYPE ) configTIMER_QUEUE_LENGTH, sizeof( xTIMER_MESSAGE ) ); + } + } + taskEXIT_CRITICAL(); +} +/*-----------------------------------------------------------*/ + +portBASE_TYPE xTimerIsTimerActive( xTimerHandle xTimer ) +{ +portBASE_TYPE xTimerIsInActiveList; +xTIMER *pxTimer = ( xTIMER * ) xTimer; + + /* Is the timer in the list of active timers? */ + taskENTER_CRITICAL(); + { + /* Checking to see if it is in the NULL list in effect checks to see if + it is referenced from either the current or the overflow timer lists in + one go, but the logic has to be reversed, hence the '!'. */ + xTimerIsInActiveList = !( listIS_CONTAINED_WITHIN( NULL, &( pxTimer->xTimerListItem ) ) ); + } + taskEXIT_CRITICAL(); + + return xTimerIsInActiveList; +} +/*-----------------------------------------------------------*/ + +void *pvTimerGetTimerID( xTimerHandle xTimer ) +{ +xTIMER *pxTimer = ( xTIMER * ) xTimer; + + return pxTimer->pvTimerID; +} +/*-----------------------------------------------------------*/ + +/* This entire source file will be skipped if the application is not configured +to include software timer functionality. If you want to include software timer +functionality then ensure configUSE_TIMERS is set to 1 in FreeRTOSConfig.h. */ +#endif /* configUSE_TIMERS == 1 */ diff --git a/FreeRTOSWithTraces/src/FreeRTOSConfig.h b/FreeRTOSWithTraces/src/FreeRTOSConfig.h new file mode 100644 index 0000000000000000000000000000000000000000..ef80ce43ce0b372f0188c55665e7ebfb4c43adca --- /dev/null +++ b/FreeRTOSWithTraces/src/FreeRTOSConfig.h @@ -0,0 +1,179 @@ +/* + FreeRTOS V7.0.1 - Copyright (C) 2011 Real Time Engineers Ltd. + + + *************************************************************************** + * * + * FreeRTOS tutorial books are available in pdf and paperback. * + * Complete, revised, and edited pdf reference manuals are also * + * available. * + * * + * Purchasing FreeRTOS documentation will not only help you, by * + * ensuring you get running as quickly as possible and with an * + * in-depth knowledge of how to use FreeRTOS, it will also help * + * the FreeRTOS project to continue with its mission of providing * + * professional grade, cross platform, de facto standard solutions * + * for microcontrollers - completely free of charge! * + * * + * >>> See http://www.FreeRTOS.org/Documentation for details. <<< * + * * + * Thank you for using FreeRTOS, and thank you for your support! * + * * + *************************************************************************** + + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation AND MODIFIED BY the FreeRTOS exception. + >>>NOTE<<< The modification to the GPL is included to allow you to + distribute a combined work that includes FreeRTOS without being obliged to + provide the source code for proprietary components outside of the FreeRTOS + kernel. FreeRTOS is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + more details. You should have received a copy of the GNU General Public + License and the FreeRTOS license exception along with FreeRTOS; if not it + can be viewed here: http://www.freertos.org/a00114.html and also obtained + by writing to Richard Barry, contact details for whom are available on the + FreeRTOS WEB site. + + 1 tab == 4 spaces! + + http://www.FreeRTOS.org - Documentation, latest information, license and + contact details. + + http://www.SafeRTOS.com - A version that is certified for use in safety + critical systems. + + http://www.OpenRTOS.com - Commercial support, development, porting, + licensing and training services. +*/ + +#ifndef FREERTOS_CONFIG_H +#define FREERTOS_CONFIG_H + +#include <stdint.h> + +/*----------------------------------------------------------- + * Application specific definitions. + * + * These definitions should be adjusted for your particular hardware and + * application requirements. + * + * THESE PARAMETERS ARE DESCRIBED WITHIN THE 'CONFIGURATION' SECTION OF THE + * FreeRTOS API DOCUMENTATION AVAILABLE ON THE FreeRTOS.org WEB SITE. + *----------------------------------------------------------*/ + +#define configUSE_PREEMPTION 1 +#define configMAX_PRIORITIES ( ( unsigned portBASE_TYPE ) 5 ) +#define configUSE_TICK_HOOK 0 +#define configCPU_CLOCK_HZ ( ( unsigned long ) 100000000 ) +#define configTICK_RATE_HZ ( ( portTickType ) 100 ) +#define configMINIMAL_STACK_SIZE ( ( unsigned short ) 80 ) +#define configTOTAL_HEAP_SIZE ( ( size_t ) ( 20 * 1024 ) ) +#define configMAX_TASK_NAME_LEN ( 12 ) +#define configUSE_TRACE_FACILITY 0 +#define configUSE_16_BIT_TICKS 0 +#define configIDLE_SHOULD_YIELD 0 +#define configUSE_CO_ROUTINES 0 +#define configUSE_MUTEXES 1 +#define configHEPIA_TRACING 1 +#define configUSE_IDLE_HOOK 0 /*configHEPIA_TRACING*/ + +#if configHEPIA_TRACING +// TRACE WITHOUT TRACING TASK: +// condition task_id!=uxTaskNumber-1 can be useful to avoid tracing the tracing task itself! +/*#define traceTASK_SWITCHED_IN() {if (previous_id_in!=pxCurrentTCB->task_id) {\ + if (previous_id_in!=0xFF && previous_id_in!=uxTaskNumber-1) \ + write_trace(previous_id_in, 0); \ + if (pxCurrentTCB->task_id!=uxTaskNumber-1) \ + write_trace(pxCurrentTCB->task_id, 1); \ + previous_id_in=pxCurrentTCB->task_id;}}*/ + +// TRACE INCLUDING TRACING TASK: +#define traceTASK_SWITCHED_IN() {if (previous_id_in!=pxCurrentTCB->task_id) {\ + if (previous_id_in!=0xFF) \ + write_trace(previous_id_in, 0); \ + write_trace(pxCurrentTCB->task_id, 1); \ + previous_id_in=pxCurrentTCB->task_id;}} +#endif + + +#define configMAX_CO_ROUTINE_PRIORITIES ( 2 ) + +#define configUSE_COUNTING_SEMAPHORES 1 +#define configUSE_ALTERNATIVE_API 0 +#define configCHECK_FOR_STACK_OVERFLOW 0 +#define configUSE_RECURSIVE_MUTEXES 1 +#define configQUEUE_REGISTRY_SIZE 10 +#define configGENERATE_RUN_TIME_STATS 0 + +/* Set the following definitions to 1 to include the API function, or zero +to exclude the API function. */ + +#define INCLUDE_vTaskPrioritySet 1 +#define INCLUDE_uxTaskPriorityGet 1 +#define INCLUDE_vTaskDelete 1 +#define INCLUDE_vTaskCleanUpResources 0 +#define INCLUDE_vTaskSuspend 1 +#define INCLUDE_vTaskDelayUntil 1 +#define INCLUDE_vTaskDelay 1 +#define INCLUDE_uxTaskGetStackHighWaterMark 1 + +/*----------------------------------------------------------- + * Ethernet configuration. + *-----------------------------------------------------------*/ + +/* MAC address configuration. */ +#define configMAC_ADDR0 0x00 +#define configMAC_ADDR1 0x12 +#define configMAC_ADDR2 0x13 +#define configMAC_ADDR3 0x10 +#define configMAC_ADDR4 0x15 +#define configMAC_ADDR5 0x11 + +/* IP address configuration. */ +#define configIP_ADDR0 192 +#define configIP_ADDR1 168 +#define configIP_ADDR2 0 +#define configIP_ADDR3 201 + +/* Netmask configuration. */ +#define configNET_MASK0 255 +#define configNET_MASK1 255 +#define configNET_MASK2 255 +#define configNET_MASK3 0 + +/* Use the system definition, if there is one */ +#ifdef __NVIC_PRIO_BITS + #define configPRIO_BITS __NVIC_PRIO_BITS +#else + #define configPRIO_BITS 5 /* 32 priority levels */ +#endif + +/* The lowest priority. */ +#define configKERNEL_INTERRUPT_PRIORITY ( 31 << (8 - configPRIO_BITS) ) +/* Priority 5, or 160 as only the top three bits are implemented. */ +#define configMAX_SYSCALL_INTERRUPT_PRIORITY ( 5 << (8 - configPRIO_BITS) ) + +/* Priorities passed to NVIC_SetPriority() do not require shifting as the +function does the shifting itself. Note these priorities need to be equal to +or lower than configMAX_SYSCALL_INTERRUPT_PRIORITY - therefore the numeric +value needs to be equal to or greater than 5 (on the Cortex-M3 the lower the +numeric value the higher the interrupt priority). */ +#define configEMAC_INTERRUPT_PRIORITY 5 +#define configUSB_INTERRUPT_PRIORITY 6 + + + +/*----------------------------------------------------------- + * Macros required to setup the timer for the run time stats. + *-----------------------------------------------------------*/ +extern void vConfigureTimerForRunTimeStats( void ); + +#define portGET_RUN_TIME_COUNTER_VALUE() LPC_TIM0->TC + + +#endif /* FREERTOS_CONFIG_H */ diff --git a/FreeRTOSWithTraces/src/cr_startup_lpc17.c b/FreeRTOSWithTraces/src/cr_startup_lpc17.c new file mode 100644 index 0000000000000000000000000000000000000000..18fe10b82f3dab2a9f238800eba12ddf7f24a9d0 --- /dev/null +++ b/FreeRTOSWithTraces/src/cr_startup_lpc17.c @@ -0,0 +1,349 @@ +//***************************************************************************** +// +--+ +// | ++----+ +// +-++ | +// | | +// +-+--+ | +// | +--+--+ +// +----+ Copyright (c) 2009-10 Code Red Technologies Ltd. +// +// Microcontroller Startup code for use with Red Suite +// +// Software License Agreement +// +// The software is owned by Code Red Technologies and/or its suppliers, and is +// protected under applicable copyright laws. All rights are reserved. Any +// use in violation of the foregoing restrictions may subject the user to criminal +// sanctions under applicable laws, as well as to civil liability for the breach +// of the terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// USE OF THIS SOFTWARE FOR COMMERCIAL DEVELOPMENT AND/OR EDUCATION IS SUBJECT +// TO A CURRENT END USER LICENSE AGREEMENT (COMMERCIAL OR EDUCATIONAL) WITH +// CODE RED TECHNOLOGIES LTD. +// +//***************************************************************************** +#if defined (__cplusplus) +#ifdef __REDLIB__ +#error Redlib does not support C++ +#else +//***************************************************************************** +// +// The entry point for the C++ library startup +// +//***************************************************************************** +extern "C" { + extern void __libc_init_array(void); +} +#endif +#endif + +#define WEAK __attribute__ ((weak)) +#define ALIAS(f) __attribute__ ((weak, alias (#f))) + +// Code Red - if CMSIS is being used, then SystemInit() routine +// will be called by startup code rather than in application's main() +#if defined (__USE_CMSIS) +#include "system_LPC17xx.h" +#endif + +//***************************************************************************** +#if defined (__cplusplus) +extern "C" { +#endif + +//***************************************************************************** +// +// Forward declaration of the default handlers. These are aliased. +// When the application defines a handler (with the same name), this will +// automatically take precedence over these weak definitions +// +//***************************************************************************** + void ResetISR(void); +WEAK void NMI_Handler(void); +WEAK void HardFault_Handler(void); +WEAK void MemManage_Handler(void); +WEAK void BusFault_Handler(void); +WEAK void UsageFault_Handler(void); +WEAK void SVCall_Handler(void); +WEAK void DebugMon_Handler(void); +WEAK void PendSV_Handler(void); +WEAK void SysTick_Handler(void); +WEAK void IntDefaultHandler(void); + +//***************************************************************************** +// +// Forward declaration of the specific IRQ handlers. These are aliased +// to the IntDefaultHandler, which is a 'forever' loop. When the application +// defines a handler (with the same name), this will automatically take +// precedence over these weak definitions +// +//***************************************************************************** +void WDT_IRQHandler(void) ALIAS(IntDefaultHandler); +void TIMER0_IRQHandler(void) ALIAS(IntDefaultHandler); +void TIMER1_IRQHandler(void) ALIAS(IntDefaultHandler); +void TIMER2_IRQHandler(void) ALIAS(IntDefaultHandler); +void TIMER3_IRQHandler(void) ALIAS(IntDefaultHandler); +void UART0_IRQHandler(void) ALIAS(IntDefaultHandler); +void UART1_IRQHandler(void) ALIAS(IntDefaultHandler); +void UART2_IRQHandler(void) ALIAS(IntDefaultHandler); +void UART3_IRQHandler(void) ALIAS(IntDefaultHandler); +void PWM1_IRQHandler(void) ALIAS(IntDefaultHandler); +void I2C0_IRQHandler(void) ALIAS(IntDefaultHandler); +void I2C1_IRQHandler(void) ALIAS(IntDefaultHandler); +void I2C2_IRQHandler(void) ALIAS(IntDefaultHandler); +void SPI_IRQHandler(void) ALIAS(IntDefaultHandler); +void SSP0_IRQHandler(void) ALIAS(IntDefaultHandler); +void SSP1_IRQHandler(void) ALIAS(IntDefaultHandler); +void PLL0_IRQHandler(void) ALIAS(IntDefaultHandler); +void RTC_IRQHandler(void) ALIAS(IntDefaultHandler); +void EINT0_IRQHandler(void) ALIAS(IntDefaultHandler); +void EINT1_IRQHandler(void) ALIAS(IntDefaultHandler); +void EINT2_IRQHandler(void) ALIAS(IntDefaultHandler); +void EINT3_IRQHandler(void) ALIAS(IntDefaultHandler); +void ADC_IRQHandler(void) ALIAS(IntDefaultHandler); +void BOD_IRQHandler(void) ALIAS(IntDefaultHandler); +void USB_IRQHandler(void) ALIAS(IntDefaultHandler); +void CAN_IRQHandler(void) ALIAS(IntDefaultHandler); +void DMA_IRQHandler(void) ALIAS(IntDefaultHandler); +void I2S_IRQHandler(void) ALIAS(IntDefaultHandler); +void ENET_IRQHandler(void) ALIAS(IntDefaultHandler); +void RIT_IRQHandler(void) ALIAS(IntDefaultHandler); +void MCPWM_IRQHandler(void) ALIAS(IntDefaultHandler); +void QEI_IRQHandler(void) ALIAS(IntDefaultHandler); +void PLL1_IRQHandler(void) ALIAS(IntDefaultHandler); +void USBActivity_IRQHandler(void) ALIAS(IntDefaultHandler); +void CANActivity_IRQHandler(void) ALIAS(IntDefaultHandler); + +extern void xPortSysTickHandler(void); +extern void xPortPendSVHandler(void); +extern void vPortSVCHandler( void ); +extern void vEMAC_ISR( void ); + +//***************************************************************************** +// +// The entry point for the application. +// __main() is the entry point for Redlib based applications +// main() is the entry point for Newlib based applications +// +//***************************************************************************** +#if defined (__REDLIB__) +extern void __main(void); +#endif +extern int main(void); +//***************************************************************************** +// +// External declaration for the pointer to the stack top from the Linker Script +// +//***************************************************************************** +extern void _vStackTop(void); + +//***************************************************************************** +#if defined (__cplusplus) +} // extern "C" +#endif +//***************************************************************************** +// +// The vector table. +// This relies on the linker script to place at correct location in memory. +// +//***************************************************************************** +extern void (* const g_pfnVectors[])(void); +__attribute__ ((section(".isr_vector"))) +void (* const g_pfnVectors[])(void) = +{ + // Core Level - CM3 + (void *)&_vStackTop, // The initial stack pointer + ResetISR, // The reset handler + NMI_Handler, // The NMI handler + HardFault_Handler, // The hard fault handler + MemManage_Handler, // The MPU fault handler + BusFault_Handler, // The bus fault handler + UsageFault_Handler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + vPortSVCHandler, // SVCall handler + DebugMon_Handler, // Debug monitor handler + 0, // Reserved + xPortPendSVHandler, // The PendSV handler + xPortSysTickHandler, // The SysTick handler + + // Chip Level - LPC17 + WDT_IRQHandler, // 16, 0x40 - WDT + TIMER0_IRQHandler, // 17, 0x44 - TIMER0 + TIMER1_IRQHandler, // 18, 0x48 - TIMER1 + TIMER2_IRQHandler, // 19, 0x4c - TIMER2 + TIMER3_IRQHandler, // 20, 0x50 - TIMER3 + UART0_IRQHandler, // 21, 0x54 - UART0 + UART1_IRQHandler, // 22, 0x58 - UART1 + UART2_IRQHandler, // 23, 0x5c - UART2 + UART3_IRQHandler, // 24, 0x60 - UART3 + PWM1_IRQHandler, // 25, 0x64 - PWM1 + I2C0_IRQHandler, // 26, 0x68 - I2C0 + I2C1_IRQHandler, // 27, 0x6c - I2C1 + I2C2_IRQHandler, // 28, 0x70 - I2C2 + SPI_IRQHandler, // 29, 0x74 - SPI + SSP0_IRQHandler, // 30, 0x78 - SSP0 + SSP1_IRQHandler, // 31, 0x7c - SSP1 + PLL0_IRQHandler, // 32, 0x80 - PLL0 (Main PLL) + RTC_IRQHandler, // 33, 0x84 - RTC + EINT0_IRQHandler, // 34, 0x88 - EINT0 + EINT1_IRQHandler, // 35, 0x8c - EINT1 + EINT2_IRQHandler, // 36, 0x90 - EINT2 + EINT3_IRQHandler, // 37, 0x94 - EINT3 + ADC_IRQHandler, // 38, 0x98 - ADC + BOD_IRQHandler, // 39, 0x9c - BOD + USB_IRQHandler, // 40, 0xA0 - USB + CAN_IRQHandler, // 41, 0xa4 - CAN + DMA_IRQHandler, // 42, 0xa8 - GP DMA + I2S_IRQHandler, // 43, 0xac - I2S + ENET_IRQHandler, // Ethernet. + RIT_IRQHandler, // 45, 0xb4 - RITINT + MCPWM_IRQHandler, // 46, 0xb8 - Motor Control PWM + QEI_IRQHandler, // 47, 0xbc - Quadrature Encoder + PLL1_IRQHandler, // 48, 0xc0 - PLL1 (USB PLL) + USBActivity_IRQHandler, // 49, 0xc4 - USB Activity interrupt to wakeup + CANActivity_IRQHandler, // 50, 0xc8 - CAN Activity interrupt to wakeup +}; + +//***************************************************************************** +// +// The following are constructs created by the linker, indicating where the +// the "data" and "bss" segments reside in memory. The initializers for the +// for the "data" segment resides immediately following the "text" segment. +// +//***************************************************************************** +extern unsigned long _etext; +extern unsigned long _data; +extern unsigned long _edata; +extern unsigned long _bss; +extern unsigned long _ebss; + +//***************************************************************************** +// Reset entry point for your code. +// Sets up a simple runtime environment and initializes the C/C++ +// library. +// +//***************************************************************************** +void +ResetISR(void) { + unsigned long *pulSrc, *pulDest; + + // + // Copy the data segment initializers from flash to SRAM. + // + pulSrc = &_etext; + for(pulDest = &_data; pulDest < &_edata; ) + { + *pulDest++ = *pulSrc++; + } + + // + // Zero fill the bss segment. This is done with inline assembly since this + // will clear the value of pulDest if it is not kept in a register. + // + __asm(" ldr r0, =_bss\n" + " ldr r1, =_ebss\n" + " mov r2, #0\n" + " .thumb_func\n" + "zero_loop:\n" + " cmp r0, r1\n" + " it lt\n" + " strlt r2, [r0], #4\n" + " blt zero_loop"); + +#ifdef __USE_CMSIS + SystemInit(); +#endif + +#if defined (__cplusplus) + // + // Call C++ library initialisation + // + __libc_init_array(); +#endif + +#if defined (__REDLIB__) + // Call the Redlib library, which in turn calls main() + __main() ; +#else + main(); +#endif + + // + // main() shouldn't return, but if it does, we'll just enter an infinite loop + // + while (1) { + ; + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +void NMI_Handler(void) +{ + while(1) + { + } +} + +void HardFault_Handler(void) +{ + while(1) + { + } +} + +void MemManage_Handler(void) +{ + while(1) + { + } +} + +void BusFault_Handler(void) +{ + while(1) + { + } +} + +void UsageFault_Handler(void) +{ + while(1) + { + } +} + + +void DebugMon_Handler(void) +{ + while(1) + { + } +} + +//***************************************************************************** +// +// Processor ends up here if an unexpected interrupt occurs or a handler +// is not present in the application code. +// +//***************************************************************************** +void IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/FreeRTOSWithTraces/src/main.c b/FreeRTOSWithTraces/src/main.c new file mode 100644 index 0000000000000000000000000000000000000000..5b5767f3b60285cb4118bbcd684cb17f3df15df0 --- /dev/null +++ b/FreeRTOSWithTraces/src/main.c @@ -0,0 +1,25 @@ +/** +* Created on : 19.01.2014 + * Author : VP + * Description : exercice 1 of serie 4 + */ + + +#ifdef __USE_CMSIS +#include "LPC17xx.h" +#endif +#include <stdio.h> +#include "FreeRTOS.h" +#include "task.h" +#include "queue.h" +#include "semphr.h" +#include "uart.h" + +void write_trace(uint8_t sig_idx, short val) {} + +int main(void) +{ + uart0_init_ref(115200, NULL, NULL); + + return 1; +} diff --git a/FreeRTOSWithTraces/src/uart.h b/FreeRTOSWithTraces/src/uart.h new file mode 100644 index 0000000000000000000000000000000000000000..ccd49ea0b9d00e460ae60ef185d8f1e6842380ad --- /dev/null +++ b/FreeRTOSWithTraces/src/uart.h @@ -0,0 +1,50 @@ +/* + * Description: UART 0 driver + * Created on : 30 sept. 2013 + * Author : VP + */ +#ifndef __UART_H +#define __UART_H + +#define IER_RX 0x1 // interrupt enable flags +#define IER_TX 0x2 + +#define IIR_TX 0x2 // interrupt identification flags +#define IIR_RX 0x4 +#define IS_TX_EMPTY (1<<5) // status flags on LSR register +#define IS_RX_NOT_EMPTY (1<<2) + +/* Callback function prototype for UART interrupt */ +typedef void (*uart_callback_t)(int int_status); + +/* Description: UART 0 initialisation. Callbacks can be used, but at most once for TX and once for RX data. + * Note that only the first call of uart0_init_ref is setting up the baudrate, which can't be + * modified during further calls. + * + * Parameters: baudrate [bit/s] + * tx_callback: pointer on callback function called by interrupt at the end of TX character + * transmission. Note that calling uart0_init_ref() does NOT activate IER_THRE to avoid + * continuous calls of tx_callback when the transmission buffer is empty. It is up to + * the user to enable it when necessary (LPC_UART0->IER |= IER_THRE) and to disable it at + * the end of the transmission (LPC_UART0->IER &= ~IER_THRE). Once IER configured to enable + * the interrupt, the first interrupt can be provoked either by sending a character on the UART + * or by forcing the VIC to rise it with NVIC_SetPendingIRQ(UART0_IRQn). Note that if this last + * method is used, the int_flags of the callback parameter are not significant. In this case, + * LPC_UART0->LSR must be read to know if a transmission has been done. + * rx_callback: pointer on callback function called by interrupt on RX character + * receiving. if NULL is given, no interrupt is configured. The callback + * will be called each time a character is received. + */ +void uart0_init_ref(uint32_t baudrate, uart_callback_t tx_callback, uart_callback_t rx_callback); + +/* Description: UART 0 initialisation + * + * Parameters: data: pointer on data to be sent + * length: data length [bytes] + */ +void uart0_send_ref(uint8_t *data, uint32_t length); + +/* Description: stop UART0 interrupts. The switch off is only managed by the VIC. */ +void uart0_stop_interrupt(); + +#endif diff --git a/TP1_labyrinth_etu.zip b/TP1_labyrinth_etu.zip new file mode 100644 index 0000000000000000000000000000000000000000..f79c4973b452db76c65d45655db6c8a0fede3a18 Binary files /dev/null and b/TP1_labyrinth_etu.zip differ diff --git a/TP1_labyrinth_etu/.cproject b/TP1_labyrinth_etu/.cproject new file mode 100644 index 0000000000000000000000000000000000000000..285014593a4f51e403887610399f7ce5f8328e03 --- /dev/null +++ b/TP1_labyrinth_etu/.cproject @@ -0,0 +1,234 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<?fileVersion 4.0.0?><cproject storage_type_id="org.eclipse.cdt.core.XmlProjectDescriptionStorage"> + <storageModule moduleId="org.eclipse.cdt.core.settings"> + <cconfiguration id="com.crt.advproject.config.exe.debug.215110136"> + <storageModule buildSystemId="org.eclipse.cdt.managedbuilder.core.configurationDataProvider" id="com.crt.advproject.config.exe.debug.215110136" moduleId="org.eclipse.cdt.core.settings" name="Debug"> + <externalSettings/> + <extensions> + <extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser"/> + <extension id="org.eclipse.cdt.core.GNU_ELF" point="org.eclipse.cdt.core.BinaryParser"/> + <extension id="org.eclipse.cdt.core.GmakeErrorParser" point="org.eclipse.cdt.core.ErrorParser"/> + <extension id="org.eclipse.cdt.core.CWDLocator" point="org.eclipse.cdt.core.ErrorParser"/> + <extension id="org.eclipse.cdt.core.GCCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/> + <extension id="org.eclipse.cdt.core.GASErrorParser" point="org.eclipse.cdt.core.ErrorParser"/> + <extension id="org.eclipse.cdt.core.GLDErrorParser" point="org.eclipse.cdt.core.ErrorParser"/> + </extensions> + </storageModule> + <storageModule moduleId="cdtBuildSystem" version="4.0.0"> + <configuration artifactExtension="axf" artifactName="${ProjName}" buildArtefactType="org.eclipse.cdt.build.core.buildArtefactType.exe" buildProperties="org.eclipse.cdt.build.core.buildArtefactType=org.eclipse.cdt.build.core.buildArtefactType.exe" cleanCommand="rm -rf" description="Debug build" errorParsers="org.eclipse.cdt.core.CWDLocator;org.eclipse.cdt.core.GmakeErrorParser;org.eclipse.cdt.core.GCCErrorParser;org.eclipse.cdt.core.GLDErrorParser;org.eclipse.cdt.core.GASErrorParser" id="com.crt.advproject.config.exe.debug.215110136" name="Debug" parent="com.crt.advproject.config.exe.debug" postannouncebuildStep="Performing post-build steps" postbuildStep="arm-none-eabi-size "${BuildArtifactFileName}"; # arm-none-eabi-objcopy -O binary "${BuildArtifactFileName}" "${BuildArtifactFileBaseName}.bin" ; checksum -p ${TargetChip} -d "${BuildArtifactFileBaseName}.bin"; " preannouncebuildStep="" prebuildStep=""> + <folderInfo id="com.crt.advproject.config.exe.debug.215110136." name="/" resourcePath=""> + <toolChain errorParsers="" id="com.crt.advproject.toolchain.exe.debug.1804927929" name="Code Red MCU Tools" superClass="com.crt.advproject.toolchain.exe.debug"> + <targetPlatform binaryParser="org.eclipse.cdt.core.ELF;org.eclipse.cdt.core.GNU_ELF" id="com.crt.advproject.platform.exe.debug.1527502542" name="ARM-based MCU (Debug)" superClass="com.crt.advproject.platform.exe.debug"/> + <builder buildPath="${workspace_loc:/TP2}/Debug" errorParsers="org.eclipse.cdt.core.GmakeErrorParser;org.eclipse.cdt.core.CWDLocator" id="com.crt.advproject.builder.exe.debug.490842416" keepEnvironmentInBuildfile="false" managedBuildOn="true" name="Gnu Make Builder" superClass="com.crt.advproject.builder.exe.debug"/> + <tool id="com.crt.advproject.cpp.exe.debug.330627341" name="MCU C++ Compiler" superClass="com.crt.advproject.cpp.exe.debug"> + <option id="com.crt.advproject.cpp.hdrlib.1542235693" superClass="com.crt.advproject.cpp.hdrlib"/> + <option id="gnu.cpp.compiler.option.preprocessor.def.1033251062" superClass="gnu.cpp.compiler.option.preprocessor.def"/> + <option id="com.crt.advproject.cpp.fpu.1390250600" superClass="com.crt.advproject.cpp.fpu"/> + </tool> + <tool command="arm-none-eabi-gcc" commandLinePattern="${COMMAND} ${FLAGS} ${OUTPUT_FLAG} ${OUTPUT_PREFIX}${OUTPUT} ${INPUTS}" errorParsers="org.eclipse.cdt.core.GCCErrorParser" id="com.crt.advproject.gcc.exe.debug.1250049820" name="MCU C Compiler" superClass="com.crt.advproject.gcc.exe.debug"> + <option id="com.crt.advproject.gcc.arch.780875128" name="Architecture" superClass="com.crt.advproject.gcc.arch" value="com.crt.advproject.gcc.target.cm3" valueType="enumerated"/> + <option id="com.crt.advproject.gcc.thumb.891265985" name="Thumb mode" superClass="com.crt.advproject.gcc.thumb" value="true" valueType="boolean"/> + <option id="com.crt.advproject.gcc.hdrlib.1590293672" name="Library headers" superClass="com.crt.advproject.gcc.hdrlib" value="com.crt.advproject.gcc.hdrlib.codered" valueType="enumerated"/> + <option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="gnu.c.compiler.option.preprocessor.def.symbols.1935059032" name="Defined symbols (-D)" superClass="gnu.c.compiler.option.preprocessor.def.symbols" valueType="definedSymbols"> + <listOptionValue builtIn="false" value="__REDLIB__"/> + <listOptionValue builtIn="false" value="__USE_CMSIS=CMSISv2p00_LPC17xx"/> + <listOptionValue builtIn="false" value="DEBUG"/> + <listOptionValue builtIn="false" value="__CODE_RED"/> + <listOptionValue builtIn="false" value="PACK_STRUCT_END=__attribute\(\(packed\)\)"/> + <listOptionValue builtIn="false" value="GCC_ARMCM3"/> + </option> + <option id="gnu.c.compiler.option.misc.other.903224402" name="Other flags" superClass="gnu.c.compiler.option.misc.other" value="-c -fmessage-length=0 -fno-builtin -ffunction-sections -fdata-sections" valueType="string"/> + <option id="com.crt.advproject.gcc.exe.debug.option.optimization.level.221342748" name="Optimization Level" superClass="com.crt.advproject.gcc.exe.debug.option.optimization.level"/> + <option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="gnu.c.compiler.option.include.paths.2063520027" name="Include paths (-I)" superClass="gnu.c.compiler.option.include.paths" valueType="includePath"> + <listOptionValue builtIn="false" value="../src"/> + <listOptionValue builtIn="false" value=""${workspace_loc:/CMSISv2p00_LPC17xx/inc}""/> + <listOptionValue builtIn="false" value="../FreeRTOS_include"/> + <listOptionValue builtIn="false" value="../FreeRTOS_portable"/> + </option> + <option id="com.crt.advproject.gcc.fpu.451212913" superClass="com.crt.advproject.gcc.fpu"/> + <inputType id="com.crt.advproject.compiler.input.1300873006" superClass="com.crt.advproject.compiler.input"/> + </tool> + <tool command="arm-none-eabi-gcc" commandLinePattern="${COMMAND} ${FLAGS} ${OUTPUT_FLAG} ${OUTPUT_PREFIX}${OUTPUT} ${INPUTS}" errorParsers="org.eclipse.cdt.core.GASErrorParser" id="com.crt.advproject.gas.exe.debug.80806858" name="MCU Assembler" superClass="com.crt.advproject.gas.exe.debug"> + <option id="com.crt.advproject.gas.arch.1931039645" name="Architecture" superClass="com.crt.advproject.gas.arch" value="com.crt.advproject.gas.target.cm3" valueType="enumerated"/> + <option id="com.crt.advproject.gas.thumb.315086202" name="Thumb mode" superClass="com.crt.advproject.gas.thumb" value="true" valueType="boolean"/> + <option id="gnu.both.asm.option.flags.crt.621293431" name="Assembler flags" superClass="gnu.both.asm.option.flags.crt" value="-c -x assembler-with-cpp -DDEBUG -D__CODE_RED -D__REDLIB__" valueType="string"/> + <option id="com.crt.advproject.gas.hdrlib.1714928458" name="Library headers" superClass="com.crt.advproject.gas.hdrlib" value="com.crt.advproject.gas.hdrlib.codered" valueType="enumerated"/> + <option id="com.crt.advproject.gas.specs.649457621" name="Specs" superClass="com.crt.advproject.gas.specs" value="com.crt.advproject.gas.specs.codered" valueType="enumerated"/> + <option id="com.crt.advproject.gas.fpu.950250050" superClass="com.crt.advproject.gas.fpu"/> + <inputType id="cdt.managedbuild.tool.gnu.assembler.input.321505136" superClass="cdt.managedbuild.tool.gnu.assembler.input"/> + <inputType id="com.crt.advproject.assembler.input.196020520" name="Additional Assembly Source Files" superClass="com.crt.advproject.assembler.input"/> + </tool> + <tool id="com.crt.advproject.link.cpp.exe.debug.1287150940" name="MCU C++ Linker" superClass="com.crt.advproject.link.cpp.exe.debug"> + <option id="com.crt.advproject.link.cpp.hdrlib.840329032" superClass="com.crt.advproject.link.cpp.hdrlib"/> + <option id="com.crt.advproject.link.cpp.fpu.1531155306" superClass="com.crt.advproject.link.cpp.fpu"/> + </tool> + <tool command="arm-none-eabi-gcc" commandLinePattern="${COMMAND} ${FLAGS} ${OUTPUT_FLAG} ${OUTPUT_PREFIX}${OUTPUT} ${INPUTS}" errorParsers="org.eclipse.cdt.core.GLDErrorParser" id="com.crt.advproject.link.exe.debug.539946703" name="MCU Linker" superClass="com.crt.advproject.link.exe.debug"> + <option id="com.crt.advproject.link.arch.1188932394" name="Architecture" superClass="com.crt.advproject.link.arch" value="com.crt.advproject.link.target.cm3" valueType="enumerated"/> + <option id="com.crt.advproject.link.thumb.880718650" name="Thumb mode" superClass="com.crt.advproject.link.thumb" value="true" valueType="boolean"/> + <option id="com.crt.advproject.link.script.230425977" name="Linker script" superClass="com.crt.advproject.link.script" value=""TP1_labyrinth_Debug.ld"" valueType="string"/> + <option id="com.crt.advproject.link.manage.798320364" name="Manage linker script" superClass="com.crt.advproject.link.manage" value="true" valueType="boolean"/> + <option id="gnu.c.link.option.nostdlibs.766477309" name="No startup or default libs (-nostdlib)" superClass="gnu.c.link.option.nostdlibs" value="true" valueType="boolean"/> + <option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="gnu.c.link.option.other.442238479" name="Other options (-Xlinker [option])" superClass="gnu.c.link.option.other" valueType="stringList"> + <listOptionValue builtIn="false" value="-Map="${BuildArtifactFileBaseName}.map""/> + <listOptionValue builtIn="false" value="--gc-sections"/> + </option> + <option id="com.crt.advproject.link.gcc.hdrlib.508433176" name="Library" superClass="com.crt.advproject.link.gcc.hdrlib" value="com.crt.advproject.gcc.link.hdrlib.codered.semihost" valueType="enumerated"/> + <option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="true" id="com.crt.advproject.link.gcc.multicore.master.userobjs.1983727347" name="Slave Objects (not visible)" superClass="com.crt.advproject.link.gcc.multicore.master.userobjs" valueType="userObjs"/> + <option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="gnu.c.link.option.libs.622752648" name="Libraries (-l)" superClass="gnu.c.link.option.libs" valueType="libs"> + <listOptionValue builtIn="false" value="MyLab_lib"/> + <listOptionValue builtIn="false" value="CMSISv2p00_LPC17xx"/> + </option> + <option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="gnu.c.link.option.paths.2103028876" name="Library search path (-L)" superClass="gnu.c.link.option.paths" valueType="libPaths"> + <listOptionValue builtIn="false" value=""${workspace_loc:/${ProjName}/Debug}""/> + <listOptionValue builtIn="false" value=""${workspace_loc:/CMSISv2p00_LPC17xx/Debug}""/> + </option> + <option id="com.crt.advproject.link.gcc.multicore.slave.1598157986" name="Multicore configuration" superClass="com.crt.advproject.link.gcc.multicore.slave"/> + <option id="com.crt.advproject.link.memory.load.image.150114658" superClass="com.crt.advproject.link.memory.load.image" value="" valueType="string"/> + <option id="com.crt.advproject.link.memory.heapAndStack.14079040" superClass="com.crt.advproject.link.memory.heapAndStack" value="&Heap:Default;Post Data;Default&Stack:Default;End;Default" valueType="string"/> + <option id="com.crt.advproject.link.memory.data.1400138320" superClass="com.crt.advproject.link.memory.data" value="" valueType="string"/> + <option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="true" id="com.crt.advproject.link.memory.sections.1663873252" superClass="com.crt.advproject.link.memory.sections" valueType="stringList"/> + <option id="com.crt.advproject.link.fpu.987598863" superClass="com.crt.advproject.link.fpu"/> + <inputType id="cdt.managedbuild.tool.gnu.c.linker.input.615549911" superClass="cdt.managedbuild.tool.gnu.c.linker.input"> + <additionalInput kind="additionalinputdependency" paths="$(USER_OBJS)"/> + <additionalInput kind="additionalinput" paths="$(LIBS)"/> + </inputType> + </tool> + <tool id="com.crt.advproject.tool.debug.debug.607313775" name="MCU Debugger" superClass="com.crt.advproject.tool.debug.debug"/> + </toolChain> + </folderInfo> + <sourceEntries> + <entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="FreeRTOS_include"/> + <entry excluding="MemMang/heap_3.c|MemMang/heap_1.c" flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="FreeRTOS_portable"/> + <entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="FreeRTOS_src"/> + <entry excluding="trace_mgt_sol.c" flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="src"/> + </sourceEntries> + </configuration> + </storageModule> + <storageModule moduleId="org.eclipse.cdt.core.externalSettings"/> + </cconfiguration> + <cconfiguration id="com.crt.advproject.config.exe.release.888357251"> + <storageModule buildSystemId="org.eclipse.cdt.managedbuilder.core.configurationDataProvider" id="com.crt.advproject.config.exe.release.888357251" moduleId="org.eclipse.cdt.core.settings" name="Release"> + <externalSettings/> + <extensions> + <extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser"/> + <extension id="org.eclipse.cdt.core.GNU_ELF" point="org.eclipse.cdt.core.BinaryParser"/> + <extension id="org.eclipse.cdt.core.GmakeErrorParser" point="org.eclipse.cdt.core.ErrorParser"/> + <extension id="org.eclipse.cdt.core.CWDLocator" point="org.eclipse.cdt.core.ErrorParser"/> + <extension id="org.eclipse.cdt.core.GCCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/> + <extension id="org.eclipse.cdt.core.GASErrorParser" point="org.eclipse.cdt.core.ErrorParser"/> + <extension id="org.eclipse.cdt.core.GLDErrorParser" point="org.eclipse.cdt.core.ErrorParser"/> + </extensions> + </storageModule> + <storageModule moduleId="cdtBuildSystem" version="4.0.0"> + <configuration artifactExtension="axf" artifactName="${ProjName}" buildArtefactType="org.eclipse.cdt.build.core.buildArtefactType.exe" buildProperties="org.eclipse.cdt.build.core.buildArtefactType=org.eclipse.cdt.build.core.buildArtefactType.exe" cleanCommand="rm -rf" description="Release build" errorParsers="org.eclipse.cdt.core.CWDLocator;org.eclipse.cdt.core.GmakeErrorParser;org.eclipse.cdt.core.GCCErrorParser;org.eclipse.cdt.core.GLDErrorParser;org.eclipse.cdt.core.GASErrorParser" id="com.crt.advproject.config.exe.release.888357251" name="Release" parent="com.crt.advproject.config.exe.release" postannouncebuildStep="Performing post-build steps" postbuildStep="arm-none-eabi-size "${BuildArtifactFileName}"; # arm-none-eabi-objcopy -O binary "${BuildArtifactFileName}" "${BuildArtifactFileBaseName}.bin" ; checksum -p ${TargetChip} -d "${BuildArtifactFileBaseName}.bin"; "> + <folderInfo id="com.crt.advproject.config.exe.release.888357251." name="/" resourcePath=""> + <toolChain id="com.crt.advproject.toolchain.exe.release.1404220263" name="Code Red MCU Tools" superClass="com.crt.advproject.toolchain.exe.release"> + <targetPlatform binaryParser="org.eclipse.cdt.core.ELF;org.eclipse.cdt.core.GNU_ELF" id="com.crt.advproject.platform.exe.release.279372661" name="ARM-based MCU (Release)" superClass="com.crt.advproject.platform.exe.release"/> + <builder buildPath="${workspace_loc:/TP2}/Release" id="com.crt.advproject.builder.exe.release.53884433" keepEnvironmentInBuildfile="false" managedBuildOn="true" name="Gnu Make Builder" superClass="com.crt.advproject.builder.exe.release"/> + <tool id="com.crt.advproject.cpp.exe.release.64077473" name="MCU C++ Compiler" superClass="com.crt.advproject.cpp.exe.release"/> + <tool id="com.crt.advproject.gcc.exe.release.647642122" name="MCU C Compiler" superClass="com.crt.advproject.gcc.exe.release"> + <option id="com.crt.advproject.gcc.arch.448155008" name="Architecture" superClass="com.crt.advproject.gcc.arch" value="com.crt.advproject.gcc.target.cm3" valueType="enumerated"/> + <option id="com.crt.advproject.gcc.thumb.664712729" name="Thumb mode" superClass="com.crt.advproject.gcc.thumb" value="true" valueType="boolean"/> + <option id="com.crt.advproject.gcc.hdrlib.1361225698" name="Library headers" superClass="com.crt.advproject.gcc.hdrlib" value="com.crt.advproject.gcc.hdrlib.newlib" valueType="enumerated"/> + <option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="gnu.c.compiler.option.preprocessor.def.symbols.1436089355" name="Defined symbols (-D)" superClass="gnu.c.compiler.option.preprocessor.def.symbols" valueType="definedSymbols"> + <listOptionValue builtIn="false" value="__NEWLIB__"/> + <listOptionValue builtIn="false" value="NDEBUG"/> + <listOptionValue builtIn="false" value="__CODE_RED"/> + <listOptionValue builtIn="false" value="PACK_STRUCT_END=__attribute\(\(packed\)\)"/> + <listOptionValue builtIn="false" value="GCC_ARMCM3"/> + </option> + <option id="gnu.c.compiler.option.misc.other.1518566865" name="Other flags" superClass="gnu.c.compiler.option.misc.other" value="-c -fmessage-length=0 -fno-builtin -ffunction-sections -fdata-sections" valueType="string"/> + <option id="com.crt.advproject.gcc.exe.release.option.optimization.level.276657637" name="Optimization Level" superClass="com.crt.advproject.gcc.exe.release.option.optimization.level"/> + <option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="gnu.c.compiler.option.include.paths.362116296" name="Include paths (-I)" superClass="gnu.c.compiler.option.include.paths" valueType="includePath"> + <listOptionValue builtIn="false" value="../src"/> + <listOptionValue builtIn="false" value="../FreeRTOS_include"/> + <listOptionValue builtIn="false" value="../FreeRTOS_portable"/> + </option> + <option id="com.crt.advproject.gcc.specs.1492295667" name="Specs" superClass="com.crt.advproject.gcc.specs" value="com.crt.advproject.gcc.specs.newlib" valueType="enumerated"/> + <inputType id="com.crt.advproject.compiler.input.510162422" superClass="com.crt.advproject.compiler.input"/> + </tool> + <tool id="com.crt.advproject.gas.exe.release.204333355" name="MCU Assembler" superClass="com.crt.advproject.gas.exe.release"> + <option id="com.crt.advproject.gas.arch.80160302" name="Architecture" superClass="com.crt.advproject.gas.arch" value="com.crt.advproject.gas.target.cm3" valueType="enumerated"/> + <option id="com.crt.advproject.gas.thumb.5877606" name="Thumb mode" superClass="com.crt.advproject.gas.thumb" value="true" valueType="boolean"/> + <option id="gnu.both.asm.option.flags.crt.2136234858" name="Assembler flags" superClass="gnu.both.asm.option.flags.crt" value="-c -x assembler-with-cpp -D__NEWLIB__ -DNDEBUG -D__CODE_RED" valueType="string"/> + <option id="com.crt.advproject.gas.hdrlib.1079337911" name="Library headers" superClass="com.crt.advproject.gas.hdrlib" value="com.crt.advproject.gas.hdrlib.newlib" valueType="enumerated"/> + <option id="com.crt.advproject.gas.specs.148349439" name="Specs" superClass="com.crt.advproject.gas.specs" value="com.crt.advproject.gas.specs.newlib" valueType="enumerated"/> + <inputType id="cdt.managedbuild.tool.gnu.assembler.input.97585317" superClass="cdt.managedbuild.tool.gnu.assembler.input"/> + <inputType id="com.crt.advproject.assembler.input.994256559" name="Additional Assembly Source Files" superClass="com.crt.advproject.assembler.input"/> + </tool> + <tool id="com.crt.advproject.link.cpp.exe.release.671111905" name="MCU C++ Linker" superClass="com.crt.advproject.link.cpp.exe.release"/> + <tool id="com.crt.advproject.link.exe.release.575860282" name="MCU Linker" superClass="com.crt.advproject.link.exe.release"> + <option id="com.crt.advproject.link.arch.1354382116" name="Architecture" superClass="com.crt.advproject.link.arch" value="com.crt.advproject.link.target.cm3" valueType="enumerated"/> + <option id="com.crt.advproject.link.thumb.1774848315" name="Thumb mode" superClass="com.crt.advproject.link.thumb" value="true" valueType="boolean"/> + <option id="com.crt.advproject.link.script.1242159919" name="Linker script" superClass="com.crt.advproject.link.script" value=""TP1_labyrinth_Release.ld"" valueType="string"/> + <option id="com.crt.advproject.link.manage.1035341187" name="Manage linker script" superClass="com.crt.advproject.link.manage" value="true" valueType="boolean"/> + <option id="gnu.c.link.option.nostdlibs.383809744" name="No startup or default libs (-nostdlib)" superClass="gnu.c.link.option.nostdlibs" value="true" valueType="boolean"/> + <option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="gnu.c.link.option.other.1967530262" name="Other options (-Xlinker [option])" superClass="gnu.c.link.option.other" valueType="stringList"> + <listOptionValue builtIn="false" value="-Map="${BuildArtifactFileBaseName}.map""/> + <listOptionValue builtIn="false" value="--gc-sections"/> + </option> + <option id="com.crt.advproject.link.gcc.hdrlib.652701584" name="Library" superClass="com.crt.advproject.link.gcc.hdrlib" value="com.crt.advproject.gcc.link.hdrlib.newlib.none" valueType="enumerated"/> + <option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="true" id="com.crt.advproject.link.gcc.multicore.master.userobjs.1041574837" name="Slave Objects (not visible)" superClass="com.crt.advproject.link.gcc.multicore.master.userobjs" valueType="userObjs"/> + <option id="com.crt.advproject.link.memory.load.image.1927945293" superClass="com.crt.advproject.link.memory.load.image" value="" valueType="string"/> + <option id="com.crt.advproject.link.memory.heapAndStack.1630402613" superClass="com.crt.advproject.link.memory.heapAndStack" value="&Heap:Default;Post Data;Default&Stack:Default;End;Default" valueType="string"/> + <option id="com.crt.advproject.link.memory.data.1044931913" superClass="com.crt.advproject.link.memory.data" value="" valueType="string"/> + <option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="true" id="com.crt.advproject.link.memory.sections.93930457" superClass="com.crt.advproject.link.memory.sections" valueType="stringList"/> + <inputType id="cdt.managedbuild.tool.gnu.c.linker.input.1207060680" superClass="cdt.managedbuild.tool.gnu.c.linker.input"> + <additionalInput kind="additionalinputdependency" paths="$(USER_OBJS)"/> + <additionalInput kind="additionalinput" paths="$(LIBS)"/> + </inputType> + </tool> + <tool id="com.crt.advproject.tool.debug.release.1963871936" name="MCU Debugger" superClass="com.crt.advproject.tool.debug.release"/> + </toolChain> + </folderInfo> + <sourceEntries> + <entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="FreeRTOS_include"/> + <entry excluding="MemMang/heap_3.c|MemMang/heap_1.c" flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="FreeRTOS_portable"/> + <entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="FreeRTOS_src"/> + <entry excluding="trace_mgt_sol.c" flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="src"/> + </sourceEntries> + </configuration> + </storageModule> + <storageModule moduleId="org.eclipse.cdt.core.externalSettings"/> + </cconfiguration> + </storageModule> + <storageModule moduleId="cdtBuildSystem" version="4.0.0"> + <project id="TP2.com.crt.advproject.projecttype.exe.1564122844" name="Executable" projectType="com.crt.advproject.projecttype.exe"/> + </storageModule> + <storageModule moduleId="scannerConfiguration"> + <autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId=""/> + </storageModule> + <storageModule moduleId="org.eclipse.cdt.core.LanguageSettingsProviders"/> + <storageModule moduleId="com.crt.config"> + <projectStorage><?xml version="1.0" encoding="UTF-8"?> +<TargetConfig> +<Properties property_2="LPC175x_6x_512.cfx" property_3="NXP" property_4="LPC1769" property_count="5" version="100300"/> +<infoList vendor="NXP"> +<info chip="LPC1769" flash_driver="LPC175x_6x_512.cfx" match_id="0x26113F37" name="LPC1769" package="lpc17_lqfp100.xml" stub="crt_emu_cm3_nxp"> +<chip> +<name>LPC1769</name> +<family>LPC17xx</family> +<vendor>NXP (formerly Philips)</vendor> +<reset board="None" core="Real" sys="Real"/> +<clock changeable="TRUE" freq="20MHz" is_accurate="TRUE"/> +<memory can_program="true" id="Flash" is_ro="true" type="Flash"/> +<memory id="RAM" type="RAM"/> +<memory id="Periph" is_volatile="true" type="Peripheral"/> +<memoryInstance derived_from="Flash" id="MFlash512" location="0x00000000" size="0x80000"/> +<memoryInstance derived_from="RAM" id="RamLoc32" location="0x10000000" size="0x8000"/> +<memoryInstance derived_from="RAM" id="RamAHB32" location="0x2007c000" size="0x8000"/> +<prog_flash blocksz="0x1000" location="0" maxprgbuff="0x1000" progwithcode="TRUE" size="0x10000"/> +<prog_flash blocksz="0x8000" location="0x10000" maxprgbuff="0x1000" progwithcode="TRUE" size="0x70000"/> +</chip> +<processor> +<name gcc_name="cortex-m3">Cortex-M3</name> +<family>Cortex-M</family> +</processor> +</info> +</infoList> +</TargetConfig></projectStorage> + </storageModule> + <storageModule moduleId="refreshScope"/> + <storageModule moduleId="com.crt.advproject"/> + <storageModule moduleId="org.eclipse.cdt.make.core.buildtargets"/> +</cproject> diff --git a/TP1_labyrinth_etu/.project b/TP1_labyrinth_etu/.project new file mode 100644 index 0000000000000000000000000000000000000000..471a85c952a12c1f1c119504ea22c6fa895270b9 --- /dev/null +++ b/TP1_labyrinth_etu/.project @@ -0,0 +1,27 @@ +<?xml version="1.0" encoding="UTF-8"?> +<projectDescription> + <name>TP1_labyrinth_etu</name> + <comment></comment> + <projects> + <project>CMSISv2p00_LPC17xx</project> + </projects> + <buildSpec> + <buildCommand> + <name>org.eclipse.cdt.managedbuilder.core.genmakebuilder</name> + <triggers>clean,full,incremental,</triggers> + <arguments> + </arguments> + </buildCommand> + <buildCommand> + <name>org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder</name> + <triggers>full,incremental,</triggers> + <arguments> + </arguments> + </buildCommand> + </buildSpec> + <natures> + <nature>org.eclipse.cdt.core.cnature</nature> + <nature>org.eclipse.cdt.managedbuilder.core.managedBuildNature</nature> + <nature>org.eclipse.cdt.managedbuilder.core.ScannerConfigNature</nature> + </natures> +</projectDescription> diff --git a/TP1_labyrinth_etu/.project~ b/TP1_labyrinth_etu/.project~ new file mode 100644 index 0000000000000000000000000000000000000000..c29adf40c88f68491f2ed2bffe4dfab60435c79c --- /dev/null +++ b/TP1_labyrinth_etu/.project~ @@ -0,0 +1,27 @@ +<?xml version="1.0" encoding="UTF-8"?> +<projectDescription> + <name>TP22</name> + <comment></comment> + <projects> + <project>CMSISv2p00_LPC17xx</project> + </projects> + <buildSpec> + <buildCommand> + <name>org.eclipse.cdt.managedbuilder.core.genmakebuilder</name> + <triggers>clean,full,incremental,</triggers> + <arguments> + </arguments> + </buildCommand> + <buildCommand> + <name>org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder</name> + <triggers>full,incremental,</triggers> + <arguments> + </arguments> + </buildCommand> + </buildSpec> + <natures> + <nature>org.eclipse.cdt.core.cnature</nature> + <nature>org.eclipse.cdt.managedbuilder.core.managedBuildNature</nature> + <nature>org.eclipse.cdt.managedbuilder.core.ScannerConfigNature</nature> + </natures> +</projectDescription> diff --git a/TP1_labyrinth_etu/.settings/language.settings.xml b/TP1_labyrinth_etu/.settings/language.settings.xml new file mode 100644 index 0000000000000000000000000000000000000000..e928f48365fb3aabe32b06c1ea7b3a753e8ef5ae --- /dev/null +++ b/TP1_labyrinth_etu/.settings/language.settings.xml @@ -0,0 +1,25 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<project> + <configuration id="com.crt.advproject.config.exe.debug.215110136" name="Debug"> + <extension point="org.eclipse.cdt.core.LanguageSettingsProvider"> + <provider copy-of="extension" id="org.eclipse.cdt.ui.UserLanguageSettingsProvider"/> + <provider copy-of="extension" id="com.crt.advproject.GCCBuildCommandParser"/> + <provider class="com.crt.advproject.specs.MCUGCCBuiltinSpecsDetector" console="false" env-hash="1414881416772095426" id="com.crt.advproject.GCCBuildSpecCompilerParser" keep-relative-paths="false" name="MCU GCC Built-in Compiler Parser" parameter="${COMMAND} ${FLAGS} -E -P -v -dD "${INPUTS}"" prefer-non-shared="true"> + <language-scope id="org.eclipse.cdt.core.gcc"/> + <language-scope id="org.eclipse.cdt.core.g++"/> + </provider> + <provider-reference id="org.eclipse.cdt.managedbuilder.core.MBSLanguageSettingsProvider" ref="shared-provider"/> + </extension> + </configuration> + <configuration id="com.crt.advproject.config.exe.release.888357251" name="Release"> + <extension point="org.eclipse.cdt.core.LanguageSettingsProvider"> + <provider copy-of="extension" id="org.eclipse.cdt.ui.UserLanguageSettingsProvider"/> + <provider copy-of="extension" id="com.crt.advproject.GCCBuildCommandParser"/> + <provider class="com.crt.advproject.specs.MCUGCCBuiltinSpecsDetector" console="false" env-hash="1461310508609114466" id="com.crt.advproject.GCCBuildSpecCompilerParser" keep-relative-paths="false" name="MCU GCC Built-in Compiler Parser" parameter="${COMMAND} ${FLAGS} -E -P -v -dD "${INPUTS}"" prefer-non-shared="true"> + <language-scope id="org.eclipse.cdt.core.gcc"/> + <language-scope id="org.eclipse.cdt.core.g++"/> + </provider> + <provider-reference id="org.eclipse.cdt.managedbuilder.core.MBSLanguageSettingsProvider" ref="shared-provider"/> + </extension> + </configuration> +</project> \ No newline at end of file diff --git a/TP1_labyrinth_etu/.settings/org.eclipse.core.resources.prefs b/TP1_labyrinth_etu/.settings/org.eclipse.core.resources.prefs new file mode 100644 index 0000000000000000000000000000000000000000..99f26c0203a7844de00dbfc56e6a35d8ed3c022c --- /dev/null +++ b/TP1_labyrinth_etu/.settings/org.eclipse.core.resources.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +encoding/<project>=UTF-8 diff --git a/TP1_labyrinth_etu/Debug/FreeRTOS_portable/MemMang/heap_2.d b/TP1_labyrinth_etu/Debug/FreeRTOS_portable/MemMang/heap_2.d new file mode 100644 index 0000000000000000000000000000000000000000..614a1bc42384af6ca57de03f4580c959b7b4d323 --- /dev/null +++ b/TP1_labyrinth_etu/Debug/FreeRTOS_portable/MemMang/heap_2.d @@ -0,0 +1,22 @@ +FreeRTOS_portable/MemMang/heap_2.o FreeRTOS_portable/MemMang/heap_2.d: \ + ../FreeRTOS_portable/MemMang/heap_2.c ../FreeRTOS_include/FreeRTOS.h \ + ../FreeRTOS_include/projdefs.h ../src/FreeRTOSConfig.h \ + ../FreeRTOS_include/portable.h ../FreeRTOS_portable/portmacro.h \ + ../FreeRTOS_include/mpu_wrappers.h ../FreeRTOS_include/task.h \ + ../FreeRTOS_include/list.h + +../FreeRTOS_include/FreeRTOS.h: + +../FreeRTOS_include/projdefs.h: + +../src/FreeRTOSConfig.h: + +../FreeRTOS_include/portable.h: + +../FreeRTOS_portable/portmacro.h: + +../FreeRTOS_include/mpu_wrappers.h: + +../FreeRTOS_include/task.h: + +../FreeRTOS_include/list.h: diff --git a/TP1_labyrinth_etu/Debug/FreeRTOS_portable/MemMang/heap_2.o b/TP1_labyrinth_etu/Debug/FreeRTOS_portable/MemMang/heap_2.o new file mode 100644 index 0000000000000000000000000000000000000000..993c84bd6c4c9e20749c1f105459d256ecd15504 Binary files /dev/null and b/TP1_labyrinth_etu/Debug/FreeRTOS_portable/MemMang/heap_2.o differ diff --git a/TP1_labyrinth_etu/Debug/FreeRTOS_portable/MemMang/subdir.mk b/TP1_labyrinth_etu/Debug/FreeRTOS_portable/MemMang/subdir.mk new file mode 100644 index 0000000000000000000000000000000000000000..76c2749be07076e7e6f16267ec21e3f099449851 --- /dev/null +++ b/TP1_labyrinth_etu/Debug/FreeRTOS_portable/MemMang/subdir.mk @@ -0,0 +1,24 @@ +################################################################################ +# Automatically-generated file. Do not edit! +################################################################################ + +# Add inputs and outputs from these tool invocations to the build variables +C_SRCS += \ +../FreeRTOS_portable/MemMang/heap_2.c + +OBJS += \ +./FreeRTOS_portable/MemMang/heap_2.o + +C_DEPS += \ +./FreeRTOS_portable/MemMang/heap_2.d + + +# Each subdirectory must supply rules for building sources it contributes +FreeRTOS_portable/MemMang/%.o: ../FreeRTOS_portable/MemMang/%.c + @echo 'Building file: $<' + @echo 'Invoking: MCU C Compiler' + arm-none-eabi-gcc -D__REDLIB__ -D__USE_CMSIS=CMSISv2p00_LPC17xx -DDEBUG -D__CODE_RED -DPACK_STRUCT_END=__attribute\(\(packed\)\) -DGCC_ARMCM3 -I../src -I"C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\CMSISv2p00_LPC17xx\inc" -I../FreeRTOS_include -I../FreeRTOS_portable -O0 -g3 -Wall -c -fmessage-length=0 -fno-builtin -ffunction-sections -fdata-sections -mcpu=cortex-m3 -mthumb -D__REDLIB__ -specs=redlib.specs -MMD -MP -MF"$(@:%.o=%.d)" -MT"$(@:%.o=%.o)" -MT"$(@:%.o=%.d)" -o "$@" "$<" + @echo 'Finished building: $<' + @echo ' ' + + diff --git a/TP1_labyrinth_etu/Debug/FreeRTOS_portable/port.d b/TP1_labyrinth_etu/Debug/FreeRTOS_portable/port.d new file mode 100644 index 0000000000000000000000000000000000000000..019033874eb704dddf15eedaec5d4eaf3ee75beb --- /dev/null +++ b/TP1_labyrinth_etu/Debug/FreeRTOS_portable/port.d @@ -0,0 +1,22 @@ +FreeRTOS_portable/port.o FreeRTOS_portable/port.d: \ + ../FreeRTOS_portable/port.c ../FreeRTOS_include/FreeRTOS.h \ + ../FreeRTOS_include/projdefs.h ../src/FreeRTOSConfig.h \ + ../FreeRTOS_include/portable.h ../FreeRTOS_portable/portmacro.h \ + ../FreeRTOS_include/mpu_wrappers.h ../FreeRTOS_include/task.h \ + ../FreeRTOS_include/list.h + +../FreeRTOS_include/FreeRTOS.h: + +../FreeRTOS_include/projdefs.h: + +../src/FreeRTOSConfig.h: + +../FreeRTOS_include/portable.h: + +../FreeRTOS_portable/portmacro.h: + +../FreeRTOS_include/mpu_wrappers.h: + +../FreeRTOS_include/task.h: + +../FreeRTOS_include/list.h: diff --git a/TP1_labyrinth_etu/Debug/FreeRTOS_portable/port.o b/TP1_labyrinth_etu/Debug/FreeRTOS_portable/port.o new file mode 100644 index 0000000000000000000000000000000000000000..4533c55a06a913f6e1b3248dae96ea55cbdbe702 Binary files /dev/null and b/TP1_labyrinth_etu/Debug/FreeRTOS_portable/port.o differ diff --git a/TP1_labyrinth_etu/Debug/FreeRTOS_portable/subdir.mk b/TP1_labyrinth_etu/Debug/FreeRTOS_portable/subdir.mk new file mode 100644 index 0000000000000000000000000000000000000000..762569e92bbffff2fc68fe87390f2b5eb8f5742b --- /dev/null +++ b/TP1_labyrinth_etu/Debug/FreeRTOS_portable/subdir.mk @@ -0,0 +1,24 @@ +################################################################################ +# Automatically-generated file. Do not edit! +################################################################################ + +# Add inputs and outputs from these tool invocations to the build variables +C_SRCS += \ +../FreeRTOS_portable/port.c + +OBJS += \ +./FreeRTOS_portable/port.o + +C_DEPS += \ +./FreeRTOS_portable/port.d + + +# Each subdirectory must supply rules for building sources it contributes +FreeRTOS_portable/%.o: ../FreeRTOS_portable/%.c + @echo 'Building file: $<' + @echo 'Invoking: MCU C Compiler' + arm-none-eabi-gcc -D__REDLIB__ -D__USE_CMSIS=CMSISv2p00_LPC17xx -DDEBUG -D__CODE_RED -DPACK_STRUCT_END=__attribute\(\(packed\)\) -DGCC_ARMCM3 -I../src -I"C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\CMSISv2p00_LPC17xx\inc" -I../FreeRTOS_include -I../FreeRTOS_portable -O0 -g3 -Wall -c -fmessage-length=0 -fno-builtin -ffunction-sections -fdata-sections -mcpu=cortex-m3 -mthumb -D__REDLIB__ -specs=redlib.specs -MMD -MP -MF"$(@:%.o=%.d)" -MT"$(@:%.o=%.o)" -MT"$(@:%.o=%.d)" -o "$@" "$<" + @echo 'Finished building: $<' + @echo ' ' + + diff --git a/TP1_labyrinth_etu/Debug/FreeRTOS_src/croutine.d b/TP1_labyrinth_etu/Debug/FreeRTOS_src/croutine.d new file mode 100644 index 0000000000000000000000000000000000000000..db90ac680855acf832a236209475d67834ca40d2 --- /dev/null +++ b/TP1_labyrinth_etu/Debug/FreeRTOS_src/croutine.d @@ -0,0 +1,24 @@ +FreeRTOS_src/croutine.o FreeRTOS_src/croutine.d: \ + ../FreeRTOS_src/croutine.c ../FreeRTOS_include/FreeRTOS.h \ + ../FreeRTOS_include/projdefs.h ../src/FreeRTOSConfig.h \ + ../FreeRTOS_include/portable.h ../FreeRTOS_portable/portmacro.h \ + ../FreeRTOS_include/mpu_wrappers.h ../FreeRTOS_include/task.h \ + ../FreeRTOS_include/list.h ../FreeRTOS_include/croutine.h + +../FreeRTOS_include/FreeRTOS.h: + +../FreeRTOS_include/projdefs.h: + +../src/FreeRTOSConfig.h: + +../FreeRTOS_include/portable.h: + +../FreeRTOS_portable/portmacro.h: + +../FreeRTOS_include/mpu_wrappers.h: + +../FreeRTOS_include/task.h: + +../FreeRTOS_include/list.h: + +../FreeRTOS_include/croutine.h: diff --git a/TP1_labyrinth_etu/Debug/FreeRTOS_src/croutine.o b/TP1_labyrinth_etu/Debug/FreeRTOS_src/croutine.o new file mode 100644 index 0000000000000000000000000000000000000000..7e86c8095424c2168cad85d2d07f2beb60ddeff8 Binary files /dev/null and b/TP1_labyrinth_etu/Debug/FreeRTOS_src/croutine.o differ diff --git a/TP1_labyrinth_etu/Debug/FreeRTOS_src/list.d b/TP1_labyrinth_etu/Debug/FreeRTOS_src/list.d new file mode 100644 index 0000000000000000000000000000000000000000..4ff67b7dffbe2df443e489ebf86da932d8e6f1e8 --- /dev/null +++ b/TP1_labyrinth_etu/Debug/FreeRTOS_src/list.d @@ -0,0 +1,19 @@ +FreeRTOS_src/list.o FreeRTOS_src/list.d: ../FreeRTOS_src/list.c \ + ../FreeRTOS_include/FreeRTOS.h ../FreeRTOS_include/projdefs.h \ + ../src/FreeRTOSConfig.h ../FreeRTOS_include/portable.h \ + ../FreeRTOS_portable/portmacro.h ../FreeRTOS_include/mpu_wrappers.h \ + ../FreeRTOS_include/list.h + +../FreeRTOS_include/FreeRTOS.h: + +../FreeRTOS_include/projdefs.h: + +../src/FreeRTOSConfig.h: + +../FreeRTOS_include/portable.h: + +../FreeRTOS_portable/portmacro.h: + +../FreeRTOS_include/mpu_wrappers.h: + +../FreeRTOS_include/list.h: diff --git a/TP1_labyrinth_etu/Debug/FreeRTOS_src/list.o b/TP1_labyrinth_etu/Debug/FreeRTOS_src/list.o new file mode 100644 index 0000000000000000000000000000000000000000..2b4b32972572f46ad8d48884e261fdfd8de74d09 Binary files /dev/null and b/TP1_labyrinth_etu/Debug/FreeRTOS_src/list.o differ diff --git a/TP1_labyrinth_etu/Debug/FreeRTOS_src/queue.d b/TP1_labyrinth_etu/Debug/FreeRTOS_src/queue.d new file mode 100644 index 0000000000000000000000000000000000000000..fea81e69443c8fa0ac16a9a783137cf649799afb --- /dev/null +++ b/TP1_labyrinth_etu/Debug/FreeRTOS_src/queue.d @@ -0,0 +1,24 @@ +FreeRTOS_src/queue.o FreeRTOS_src/queue.d: ../FreeRTOS_src/queue.c \ + ../FreeRTOS_include/FreeRTOS.h ../FreeRTOS_include/projdefs.h \ + ../src/FreeRTOSConfig.h ../FreeRTOS_include/portable.h \ + ../FreeRTOS_portable/portmacro.h ../FreeRTOS_include/mpu_wrappers.h \ + ../FreeRTOS_include/task.h ../FreeRTOS_include/list.h \ + ../FreeRTOS_include/croutine.h + +../FreeRTOS_include/FreeRTOS.h: + +../FreeRTOS_include/projdefs.h: + +../src/FreeRTOSConfig.h: + +../FreeRTOS_include/portable.h: + +../FreeRTOS_portable/portmacro.h: + +../FreeRTOS_include/mpu_wrappers.h: + +../FreeRTOS_include/task.h: + +../FreeRTOS_include/list.h: + +../FreeRTOS_include/croutine.h: diff --git a/TP1_labyrinth_etu/Debug/FreeRTOS_src/queue.o b/TP1_labyrinth_etu/Debug/FreeRTOS_src/queue.o new file mode 100644 index 0000000000000000000000000000000000000000..ddfbe17a4d12f5a14bfcfb37504a7a86a20037d8 Binary files /dev/null and b/TP1_labyrinth_etu/Debug/FreeRTOS_src/queue.o differ diff --git a/TP1_labyrinth_etu/Debug/FreeRTOS_src/subdir.mk b/TP1_labyrinth_etu/Debug/FreeRTOS_src/subdir.mk new file mode 100644 index 0000000000000000000000000000000000000000..4e270ab4f75710e727211cbfee89ea536adb982a --- /dev/null +++ b/TP1_labyrinth_etu/Debug/FreeRTOS_src/subdir.mk @@ -0,0 +1,36 @@ +################################################################################ +# Automatically-generated file. Do not edit! +################################################################################ + +# Add inputs and outputs from these tool invocations to the build variables +C_SRCS += \ +../FreeRTOS_src/croutine.c \ +../FreeRTOS_src/list.c \ +../FreeRTOS_src/queue.c \ +../FreeRTOS_src/tasks.c \ +../FreeRTOS_src/timers.c + +OBJS += \ +./FreeRTOS_src/croutine.o \ +./FreeRTOS_src/list.o \ +./FreeRTOS_src/queue.o \ +./FreeRTOS_src/tasks.o \ +./FreeRTOS_src/timers.o + +C_DEPS += \ +./FreeRTOS_src/croutine.d \ +./FreeRTOS_src/list.d \ +./FreeRTOS_src/queue.d \ +./FreeRTOS_src/tasks.d \ +./FreeRTOS_src/timers.d + + +# Each subdirectory must supply rules for building sources it contributes +FreeRTOS_src/%.o: ../FreeRTOS_src/%.c + @echo 'Building file: $<' + @echo 'Invoking: MCU C Compiler' + arm-none-eabi-gcc -D__REDLIB__ -D__USE_CMSIS=CMSISv2p00_LPC17xx -DDEBUG -D__CODE_RED -DPACK_STRUCT_END=__attribute\(\(packed\)\) -DGCC_ARMCM3 -I../src -I"C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\CMSISv2p00_LPC17xx\inc" -I../FreeRTOS_include -I../FreeRTOS_portable -O0 -g3 -Wall -c -fmessage-length=0 -fno-builtin -ffunction-sections -fdata-sections -mcpu=cortex-m3 -mthumb -D__REDLIB__ -specs=redlib.specs -MMD -MP -MF"$(@:%.o=%.d)" -MT"$(@:%.o=%.o)" -MT"$(@:%.o=%.d)" -o "$@" "$<" + @echo 'Finished building: $<' + @echo ' ' + + diff --git a/TP1_labyrinth_etu/Debug/FreeRTOS_src/tasks.d b/TP1_labyrinth_etu/Debug/FreeRTOS_src/tasks.d new file mode 100644 index 0000000000000000000000000000000000000000..066de9f8623ffba46441669bbf3de3e16c476bf8 --- /dev/null +++ b/TP1_labyrinth_etu/Debug/FreeRTOS_src/tasks.d @@ -0,0 +1,26 @@ +FreeRTOS_src/tasks.o FreeRTOS_src/tasks.d: ../FreeRTOS_src/tasks.c \ + ../FreeRTOS_include/FreeRTOS.h ../FreeRTOS_include/projdefs.h \ + ../src/FreeRTOSConfig.h ../FreeRTOS_include/portable.h \ + ../FreeRTOS_portable/portmacro.h ../FreeRTOS_include/mpu_wrappers.h \ + ../FreeRTOS_include/task.h ../FreeRTOS_include/list.h \ + ../FreeRTOS_include/timers.h ../FreeRTOS_include/StackMacros.h + +../FreeRTOS_include/FreeRTOS.h: + +../FreeRTOS_include/projdefs.h: + +../src/FreeRTOSConfig.h: + +../FreeRTOS_include/portable.h: + +../FreeRTOS_portable/portmacro.h: + +../FreeRTOS_include/mpu_wrappers.h: + +../FreeRTOS_include/task.h: + +../FreeRTOS_include/list.h: + +../FreeRTOS_include/timers.h: + +../FreeRTOS_include/StackMacros.h: diff --git a/TP1_labyrinth_etu/Debug/FreeRTOS_src/tasks.o b/TP1_labyrinth_etu/Debug/FreeRTOS_src/tasks.o new file mode 100644 index 0000000000000000000000000000000000000000..9aab994d50116b7c71076ed1e1667f7b1fb4fe30 Binary files /dev/null and b/TP1_labyrinth_etu/Debug/FreeRTOS_src/tasks.o differ diff --git a/TP1_labyrinth_etu/Debug/FreeRTOS_src/timers.d b/TP1_labyrinth_etu/Debug/FreeRTOS_src/timers.d new file mode 100644 index 0000000000000000000000000000000000000000..4c1a2a2d3bb979cbd5de2a6ed355b79ddd099e5c --- /dev/null +++ b/TP1_labyrinth_etu/Debug/FreeRTOS_src/timers.d @@ -0,0 +1,26 @@ +FreeRTOS_src/timers.o FreeRTOS_src/timers.d: ../FreeRTOS_src/timers.c \ + ../FreeRTOS_include/FreeRTOS.h ../FreeRTOS_include/projdefs.h \ + ../src/FreeRTOSConfig.h ../FreeRTOS_include/portable.h \ + ../FreeRTOS_portable/portmacro.h ../FreeRTOS_include/mpu_wrappers.h \ + ../FreeRTOS_include/task.h ../FreeRTOS_include/list.h \ + ../FreeRTOS_include/queue.h ../FreeRTOS_include/timers.h + +../FreeRTOS_include/FreeRTOS.h: + +../FreeRTOS_include/projdefs.h: + +../src/FreeRTOSConfig.h: + +../FreeRTOS_include/portable.h: + +../FreeRTOS_portable/portmacro.h: + +../FreeRTOS_include/mpu_wrappers.h: + +../FreeRTOS_include/task.h: + +../FreeRTOS_include/list.h: + +../FreeRTOS_include/queue.h: + +../FreeRTOS_include/timers.h: diff --git a/TP1_labyrinth_etu/Debug/FreeRTOS_src/timers.o b/TP1_labyrinth_etu/Debug/FreeRTOS_src/timers.o new file mode 100644 index 0000000000000000000000000000000000000000..b5dc76db296d421494a5db8dc8efb7a690268638 Binary files /dev/null and b/TP1_labyrinth_etu/Debug/FreeRTOS_src/timers.o differ diff --git a/TP1_labyrinth_etu/Debug/TP1_labyrinth.map b/TP1_labyrinth_etu/Debug/TP1_labyrinth.map new file mode 100644 index 0000000000000000000000000000000000000000..3bb3dbb0dac16faabbce2fb3703645983f0a5fa6 --- /dev/null +++ b/TP1_labyrinth_etu/Debug/TP1_labyrinth.map @@ -0,0 +1,2636 @@ +Archive member included to satisfy reference by file (symbol) + +C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(accelerometer.o) + ./src/labyrinth.o (accel_init) +C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(custom_rand.o) + ./src/labyrinth.o (rnd_32) +C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(ethernet_mgt.o) + ./src/labyrinth.o (ethernet_init) +C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(ethmac.o) + C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(ethernet_mgt.o) (Init_EthMAC) +C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(lcd.o) + ./src/labyrinth.o (init_lcd) +C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(ssp.o) + C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(lcd.o) (ssp_init_custom) +C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(traces.o) + ./src/trace_mgt.o (write_trace_ref) +C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(uart.o) + C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(traces.o) (uart0_init_ref) +C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(I2C.o) + C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(accelerometer.o) (init_i2c) +C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(fonts.o) + C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(lcd.o) (SmallFont) +C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\CMSISv2p00_LPC17xx\Debug\libCMSISv2p00_LPC17xx.a(system_LPC17xx.o) + ./src/cr_startup_lpc17.o (SystemInit) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(_cr__main.o) + ./src/cr_startup_lpc17.o (__main) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(memcpy.o) + ./FreeRTOS_src/queue.o (memcpy) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(memset.o) + ./FreeRTOS_src/tasks.o (memset) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(alloc.o) + C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(lcd.o) (malloc) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(ceil.o) + ./src/tools.o (ceil) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fclose.o) + C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(lcd.o) (fclose) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fflush.o) + c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fclose.o) (fflush) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(floor.o) + ./src/tools.o (floor) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fopen.o) + C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(lcd.o) (fopen) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fpprintf.o) + C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(lcd.o) (vsprintf) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fread.o) + C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(lcd.o) (fread) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(freopen.o) + c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fopen.o) (freopen) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fseek.o) + C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(lcd.o) (fseek) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(ftell.o) + c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fseek.o) (ftell) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(initio.o) + c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(_cr__main.o) (_initio) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(printf.o) + c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fpprintf.o) (__vfprintf) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(remove.o) + c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fclose.o) (remove) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(setvbuf.o) + c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(initio.o) (setvbuf) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(sqrt.o) + C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(lcd.o) (sqrt) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(stdio.o) + c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fflush.o) (__Ciob) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(stdlib.o) + C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(lcd.o) (exit) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(strlen.o) + C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(lcd.o) (strlen) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(strncpy.o) + ./FreeRTOS_src/tasks.o (strncpy) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(__fillbuf.o) + c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(stdio.o) (__filbuf) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(__init_alloc.o) + c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(alloc.o) (__heaps) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_cr_sbrk.o) + c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(alloc.o) (_sbrk) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_deferredlazyseek.o) + c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(__fillbuf.o) (_deferredlazyseek) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_do_fflush.o) + c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fflush.o) (_do_fflush) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_fdopen.o) + c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(initio.o) (_fdopen) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_fflush.o) + c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(__fillbuf.o) (_fflush) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_frexpl.o) + c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fpprintf.o) (_frexpl) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_hugeval.o) + c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(sqrt.o) (__huge_val) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_ldexpl.o) + c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fpprintf.o) (_ldexpl) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_read.o) + c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fread.o) (_Cread) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_writebuf.o) + c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_deferredlazyseek.o) (_Cwritebuf) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(errno.o) + c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(ftell.o) (errno) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(raise.o) + c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(stdlib.o) (raise) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_cr_check_heap.o) + c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_cr_sbrk.o) (__check_heap_overflow) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(division_64.o) + C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\CMSISv2p00_LPC17xx\Debug\libCMSISv2p00_LPC17xx.a(system_LPC17xx.o) (__aeabi_uldivmod) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(division_idiv0.o) + c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(division_64.o) (__aeabi_idiv0) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(double.o) + ./src/labyrinth.o (__aeabi_dmul) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(float.o) + ./src/tools.o (__aeabi_fmul) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(memcpy.o) + c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(memcpy.o) (__aeabi_memcpy) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_appexit.o) + c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(alloc.o) (__sys_appexit) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_close.o) + c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fclose.o) (__sys_close) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_flen.o) + c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fseek.o) (__sys_flen) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_istty.o) + c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fseek.o) (__sys_istty) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_open.o) + c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(freopen.o) (__sys_open) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_read.o) + c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(__fillbuf.o) (__sys_read) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_readc.o) + c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(__fillbuf.o) (__sys_readc) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_remove.o) + c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(remove.o) (__sys_remove) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_rename.o) + c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(remove.o) (__sys_rename) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_seek.o) + c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(__fillbuf.o) (__sys_seek) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_tmpnam.o) + c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fclose.o) (__sys_tmpnam) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_write.o) + c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(alloc.o) (__sys_write) + +Allocating common symbols +Common symbol size file + +_j 0x4 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(custom_rand.o) +timer_counter 0x4 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(traces.o) +xQueueRegistry 0x50 ./FreeRTOS_src/queue.o +_k 0x4 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(custom_rand.o) +trace_buffer 0x800 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(traces.o) + +Discarded input sections + + .group 0x00000000 0x8 ./src/cr_startup_lpc17.o + .group 0x00000000 0x8 ./src/cr_startup_lpc17.o + .group 0x00000000 0x8 ./src/cr_startup_lpc17.o + .group 0x00000000 0x8 ./src/cr_startup_lpc17.o + .text 0x00000000 0x0 ./src/cr_startup_lpc17.o + .data 0x00000000 0x0 ./src/cr_startup_lpc17.o + .bss 0x00000000 0x0 ./src/cr_startup_lpc17.o + .group 0x00000000 0x8 ./src/debug.o + .group 0x00000000 0x8 ./src/debug.o + .group 0x00000000 0x8 ./src/debug.o + .group 0x00000000 0x8 ./src/debug.o + .group 0x00000000 0x8 ./src/debug.o + .group 0x00000000 0x8 ./src/debug.o + .group 0x00000000 0x8 ./src/debug.o + .group 0x00000000 0x8 ./src/debug.o + .group 0x00000000 0x8 ./src/debug.o + .group 0x00000000 0x8 ./src/debug.o + .group 0x00000000 0x8 ./src/debug.o + .group 0x00000000 0x8 ./src/debug.o + .group 0x00000000 0x8 ./src/debug.o + .group 0x00000000 0x8 ./src/debug.o + .group 0x00000000 0x8 ./src/debug.o + .group 0x00000000 0x8 ./src/debug.o + .group 0x00000000 0x8 ./src/debug.o + .group 0x00000000 0x8 ./src/debug.o + .group 0x00000000 0x8 ./src/debug.o + .group 0x00000000 0x8 ./src/debug.o + .group 0x00000000 0x8 ./src/debug.o + .group 0x00000000 0x8 ./src/debug.o + .text 0x00000000 0x0 ./src/debug.o + .data 0x00000000 0x0 ./src/debug.o + .bss 0x00000000 0x0 ./src/debug.o + .debug_info 0x00000000 0x92 ./src/debug.o + .debug_abbrev 0x00000000 0x4e ./src/debug.o + .debug_aranges + 0x00000000 0x18 ./src/debug.o + .debug_macro 0x00000000 0x122 ./src/debug.o + .debug_macro 0x00000000 0x892 ./src/debug.o + .debug_macro 0x00000000 0x10 ./src/debug.o + .debug_macro 0x00000000 0x12d ./src/debug.o + .debug_macro 0x00000000 0xa0 ./src/debug.o + .debug_macro 0x00000000 0x1c ./src/debug.o + .debug_macro 0x00000000 0x2e ./src/debug.o + .debug_macro 0x00000000 0x5b2 ./src/debug.o + .debug_macro 0x00000000 0x18 ./src/debug.o + .debug_macro 0x00000000 0x7af ./src/debug.o + .debug_macro 0x00000000 0x2c7 ./src/debug.o + .debug_macro 0x00000000 0x10 ./src/debug.o + .debug_macro 0x00000000 0x46 ./src/debug.o + .debug_macro 0x00000000 0x150 ./src/debug.o + .debug_macro 0x00000000 0xa3 ./src/debug.o + .debug_macro 0x00000000 0x12 ./src/debug.o + .debug_macro 0x00000000 0x1f ./src/debug.o + .debug_macro 0x00000000 0x177 ./src/debug.o + .debug_macro 0x00000000 0x49 ./src/debug.o + .debug_macro 0x00000000 0x57 ./src/debug.o + .debug_macro 0x00000000 0x6a ./src/debug.o + .debug_macro 0x00000000 0x62 ./src/debug.o + .debug_macro 0x00000000 0x16 ./src/debug.o + .debug_line 0x00000000 0x266 ./src/debug.o + .debug_str 0x00000000 0xa8c3 ./src/debug.o + .comment 0x00000000 0x6f ./src/debug.o + .ARM.attributes + 0x00000000 0x33 ./src/debug.o + .group 0x00000000 0x8 ./src/gpio.o + .group 0x00000000 0x8 ./src/gpio.o + .group 0x00000000 0x8 ./src/gpio.o + .group 0x00000000 0x8 ./src/gpio.o + .group 0x00000000 0x8 ./src/gpio.o + .group 0x00000000 0x8 ./src/gpio.o + .group 0x00000000 0x8 ./src/gpio.o + .group 0x00000000 0x8 ./src/gpio.o + .group 0x00000000 0x8 ./src/gpio.o + .group 0x00000000 0x8 ./src/gpio.o + .text 0x00000000 0x0 ./src/gpio.o + .data 0x00000000 0x0 ./src/gpio.o + .bss 0x00000000 0x0 ./src/gpio.o + .text.NVIC_EnableIRQ + 0x00000000 0x30 ./src/gpio.o + .text.init_gpio + 0x00000000 0xd4 ./src/gpio.o + .text.set_gpio + 0x00000000 0x3c ./src/gpio.o + .debug_macro 0x00000000 0x892 ./src/gpio.o + .debug_macro 0x00000000 0x1c ./src/gpio.o + .debug_macro 0x00000000 0x2e ./src/gpio.o + .debug_macro 0x00000000 0x10 ./src/gpio.o + .debug_macro 0x00000000 0x12d ./src/gpio.o + .debug_macro 0x00000000 0x5b2 ./src/gpio.o + .debug_macro 0x00000000 0x18 ./src/gpio.o + .debug_macro 0x00000000 0x7af ./src/gpio.o + .debug_macro 0x00000000 0x2c7 ./src/gpio.o + .group 0x00000000 0x8 ./src/labyrinth.o + .group 0x00000000 0x8 ./src/labyrinth.o + .group 0x00000000 0x8 ./src/labyrinth.o + .group 0x00000000 0x8 ./src/labyrinth.o + .group 0x00000000 0x8 ./src/labyrinth.o + .group 0x00000000 0x8 ./src/labyrinth.o + .group 0x00000000 0x8 ./src/labyrinth.o + .group 0x00000000 0x8 ./src/labyrinth.o + .group 0x00000000 0x8 ./src/labyrinth.o + .group 0x00000000 0x8 ./src/labyrinth.o + .group 0x00000000 0x8 ./src/labyrinth.o + .group 0x00000000 0x8 ./src/labyrinth.o + .group 0x00000000 0x8 ./src/labyrinth.o + .group 0x00000000 0x8 ./src/labyrinth.o + .group 0x00000000 0x8 ./src/labyrinth.o + .group 0x00000000 0x8 ./src/labyrinth.o + .group 0x00000000 0x8 ./src/labyrinth.o + .group 0x00000000 0x8 ./src/labyrinth.o + .group 0x00000000 0x8 ./src/labyrinth.o + .group 0x00000000 0x8 ./src/labyrinth.o + .group 0x00000000 0x8 ./src/labyrinth.o + .group 0x00000000 0x8 ./src/labyrinth.o + .group 0x00000000 0x8 ./src/labyrinth.o + .group 0x00000000 0x8 ./src/labyrinth.o + .group 0x00000000 0x8 ./src/labyrinth.o + .group 0x00000000 0x8 ./src/labyrinth.o + .group 0x00000000 0x8 ./src/labyrinth.o + .group 0x00000000 0x8 ./src/labyrinth.o + .group 0x00000000 0x8 ./src/labyrinth.o + .group 0x00000000 0x8 ./src/labyrinth.o + .group 0x00000000 0x8 ./src/labyrinth.o + .text 0x00000000 0x0 ./src/labyrinth.o + .data 0x00000000 0x0 ./src/labyrinth.o + .bss 0x00000000 0x0 ./src/labyrinth.o + .debug_macro 0x00000000 0x892 ./src/labyrinth.o + .debug_macro 0x00000000 0x10 ./src/labyrinth.o + .debug_macro 0x00000000 0x12d ./src/labyrinth.o + .debug_macro 0x00000000 0xa0 ./src/labyrinth.o + .debug_macro 0x00000000 0x22 ./src/labyrinth.o + .debug_macro 0x00000000 0x46 ./src/labyrinth.o + .debug_macro 0x00000000 0xa3 ./src/labyrinth.o + .debug_macro 0x00000000 0x12 ./src/labyrinth.o + .debug_macro 0x00000000 0x1f ./src/labyrinth.o + .debug_macro 0x00000000 0x177 ./src/labyrinth.o + .debug_macro 0x00000000 0x49 ./src/labyrinth.o + .debug_macro 0x00000000 0x57 ./src/labyrinth.o + .debug_macro 0x00000000 0x6a ./src/labyrinth.o + .debug_macro 0x00000000 0x62 ./src/labyrinth.o + .debug_macro 0x00000000 0x1c ./src/labyrinth.o + .debug_macro 0x00000000 0x2e ./src/labyrinth.o + .debug_macro 0x00000000 0x5b2 ./src/labyrinth.o + .debug_macro 0x00000000 0x18 ./src/labyrinth.o + .debug_macro 0x00000000 0x7af ./src/labyrinth.o + .debug_macro 0x00000000 0x2c7 ./src/labyrinth.o + .group 0x00000000 0x8 ./src/tools.o + .group 0x00000000 0x8 ./src/tools.o + .group 0x00000000 0x8 ./src/tools.o + .group 0x00000000 0x8 ./src/tools.o + .group 0x00000000 0x8 ./src/tools.o + .group 0x00000000 0x8 ./src/tools.o + .group 0x00000000 0x8 ./src/tools.o + .group 0x00000000 0x8 ./src/tools.o + .group 0x00000000 0x8 ./src/tools.o + .group 0x00000000 0x8 ./src/tools.o + .group 0x00000000 0x8 ./src/tools.o + .group 0x00000000 0x8 ./src/tools.o + .group 0x00000000 0x8 ./src/tools.o + .group 0x00000000 0x8 ./src/tools.o + .group 0x00000000 0x8 ./src/tools.o + .group 0x00000000 0x8 ./src/tools.o + .text 0x00000000 0x0 ./src/tools.o + .data 0x00000000 0x0 ./src/tools.o + .bss 0x00000000 0x0 ./src/tools.o + .debug_macro 0x00000000 0x892 ./src/tools.o + .debug_macro 0x00000000 0x10 ./src/tools.o + .debug_macro 0x00000000 0x12d ./src/tools.o + .debug_macro 0x00000000 0x5b2 ./src/tools.o + .debug_macro 0x00000000 0x1c ./src/tools.o + .debug_macro 0x00000000 0x2e ./src/tools.o + .debug_macro 0x00000000 0x18 ./src/tools.o + .debug_macro 0x00000000 0x7af ./src/tools.o + .debug_macro 0x00000000 0x2c7 ./src/tools.o + .debug_macro 0x00000000 0x1c ./src/tools.o + .debug_macro 0x00000000 0x22 ./src/tools.o + .debug_macro 0x00000000 0x28 ./src/tools.o + .debug_macro 0x00000000 0x1c ./src/tools.o + .debug_macro 0x00000000 0xc2 ./src/tools.o + .group 0x00000000 0x8 ./src/trace_mgt.o + .group 0x00000000 0x8 ./src/trace_mgt.o + .group 0x00000000 0x8 ./src/trace_mgt.o + .group 0x00000000 0x8 ./src/trace_mgt.o + .group 0x00000000 0x8 ./src/trace_mgt.o + .group 0x00000000 0x8 ./src/trace_mgt.o + .group 0x00000000 0x8 ./src/trace_mgt.o + .group 0x00000000 0x8 ./src/trace_mgt.o + .group 0x00000000 0x8 ./src/trace_mgt.o + .group 0x00000000 0x8 ./src/trace_mgt.o + .group 0x00000000 0x8 ./src/trace_mgt.o + .group 0x00000000 0x8 ./src/trace_mgt.o + .group 0x00000000 0x8 ./src/trace_mgt.o + .group 0x00000000 0x8 ./src/trace_mgt.o + .group 0x00000000 0x8 ./src/trace_mgt.o + .group 0x00000000 0x8 ./src/trace_mgt.o + .group 0x00000000 0x8 ./src/trace_mgt.o + .group 0x00000000 0x8 ./src/trace_mgt.o + .group 0x00000000 0x8 ./src/trace_mgt.o + .group 0x00000000 0x8 ./src/trace_mgt.o + .group 0x00000000 0x8 ./src/trace_mgt.o + .group 0x00000000 0x8 ./src/trace_mgt.o + .group 0x00000000 0x8 ./src/trace_mgt.o + .text 0x00000000 0x0 ./src/trace_mgt.o + .data 0x00000000 0x0 ./src/trace_mgt.o + .bss 0x00000000 0x0 ./src/trace_mgt.o + .debug_macro 0x00000000 0x892 ./src/trace_mgt.o + .debug_macro 0x00000000 0x1c ./src/trace_mgt.o + .debug_macro 0x00000000 0x2e ./src/trace_mgt.o + .debug_macro 0x00000000 0x10 ./src/trace_mgt.o + .debug_macro 0x00000000 0x12d ./src/trace_mgt.o + .debug_macro 0x00000000 0x5b2 ./src/trace_mgt.o + .debug_macro 0x00000000 0x18 ./src/trace_mgt.o + .debug_macro 0x00000000 0x7af ./src/trace_mgt.o + .debug_macro 0x00000000 0x2c7 ./src/trace_mgt.o + .debug_macro 0x00000000 0xa0 ./src/trace_mgt.o + .debug_macro 0x00000000 0x22 ./src/trace_mgt.o + .debug_macro 0x00000000 0x10 ./src/trace_mgt.o + .debug_macro 0x00000000 0x46 ./src/trace_mgt.o + .debug_macro 0x00000000 0x150 ./src/trace_mgt.o + .debug_macro 0x00000000 0xa3 ./src/trace_mgt.o + .debug_macro 0x00000000 0x12 ./src/trace_mgt.o + .debug_macro 0x00000000 0x1f ./src/trace_mgt.o + .debug_macro 0x00000000 0x177 ./src/trace_mgt.o + .debug_macro 0x00000000 0x49 ./src/trace_mgt.o + .debug_macro 0x00000000 0x57 ./src/trace_mgt.o + .debug_macro 0x00000000 0x6a ./src/trace_mgt.o + .debug_macro 0x00000000 0x62 ./src/trace_mgt.o + .group 0x00000000 0x8 ./src/uart.o + .group 0x00000000 0x8 ./src/uart.o + .group 0x00000000 0x8 ./src/uart.o + .group 0x00000000 0x8 ./src/uart.o + .group 0x00000000 0x8 ./src/uart.o + .group 0x00000000 0x8 ./src/uart.o + .group 0x00000000 0x8 ./src/uart.o + .group 0x00000000 0x8 ./src/uart.o + .group 0x00000000 0x8 ./src/uart.o + .group 0x00000000 0x8 ./src/uart.o + .text 0x00000000 0x0 ./src/uart.o + .data 0x00000000 0x0 ./src/uart.o + .bss 0x00000000 0x0 ./src/uart.o + .text.uart0_init + 0x00000000 0xac ./src/uart.o + .text.uart0_send + 0x00000000 0x40 ./src/uart.o + .debug_info 0x00000000 0x688 ./src/uart.o + .debug_abbrev 0x00000000 0x16c ./src/uart.o + .debug_aranges + 0x00000000 0x28 ./src/uart.o + .debug_ranges 0x00000000 0x18 ./src/uart.o + .debug_macro 0x00000000 0x84 ./src/uart.o + .debug_macro 0x00000000 0x892 ./src/uart.o + .debug_macro 0x00000000 0x1c ./src/uart.o + .debug_macro 0x00000000 0x2e ./src/uart.o + .debug_macro 0x00000000 0x10 ./src/uart.o + .debug_macro 0x00000000 0x12d ./src/uart.o + .debug_macro 0x00000000 0x5b2 ./src/uart.o + .debug_macro 0x00000000 0x18 ./src/uart.o + .debug_macro 0x00000000 0x7af ./src/uart.o + .debug_macro 0x00000000 0x2c7 ./src/uart.o + .debug_macro 0x00000000 0x16 ./src/uart.o + .debug_line 0x00000000 0x1d7 ./src/uart.o + .debug_str 0x00000000 0x804d ./src/uart.o + .comment 0x00000000 0x6f ./src/uart.o + .debug_frame 0x00000000 0x60 ./src/uart.o + .ARM.attributes + 0x00000000 0x33 ./src/uart.o + .group 0x00000000 0x8 ./FreeRTOS_src/croutine.o + .group 0x00000000 0x8 ./FreeRTOS_src/croutine.o + .group 0x00000000 0x8 ./FreeRTOS_src/croutine.o + .group 0x00000000 0x8 ./FreeRTOS_src/croutine.o + .group 0x00000000 0x8 ./FreeRTOS_src/croutine.o + .group 0x00000000 0x8 ./FreeRTOS_src/croutine.o + .group 0x00000000 0x8 ./FreeRTOS_src/croutine.o + .group 0x00000000 0x8 ./FreeRTOS_src/croutine.o + .group 0x00000000 0x8 ./FreeRTOS_src/croutine.o + .group 0x00000000 0x8 ./FreeRTOS_src/croutine.o + .group 0x00000000 0x8 ./FreeRTOS_src/croutine.o + .group 0x00000000 0x8 ./FreeRTOS_src/croutine.o + .group 0x00000000 0x8 ./FreeRTOS_src/croutine.o + .text 0x00000000 0x0 ./FreeRTOS_src/croutine.o + .data 0x00000000 0x0 ./FreeRTOS_src/croutine.o + .bss 0x00000000 0x0 ./FreeRTOS_src/croutine.o + .bss.pxReadyCoRoutineLists + 0x00000000 0x28 ./FreeRTOS_src/croutine.o + .bss.xDelayedCoRoutineList1 + 0x00000000 0x14 ./FreeRTOS_src/croutine.o + .bss.xDelayedCoRoutineList2 + 0x00000000 0x14 ./FreeRTOS_src/croutine.o + .bss.pxDelayedCoRoutineList + 0x00000000 0x4 ./FreeRTOS_src/croutine.o + .bss.pxOverflowDelayedCoRoutineList + 0x00000000 0x4 ./FreeRTOS_src/croutine.o + .bss.xPendingReadyCoRoutineList + 0x00000000 0x14 ./FreeRTOS_src/croutine.o + .bss.pxCurrentCoRoutine + 0x00000000 0x4 ./FreeRTOS_src/croutine.o + .bss.uxTopCoRoutineReadyPriority + 0x00000000 0x4 ./FreeRTOS_src/croutine.o + .bss.xCoRoutineTickCount + 0x00000000 0x4 ./FreeRTOS_src/croutine.o + .bss.xLastTickCount + 0x00000000 0x4 ./FreeRTOS_src/croutine.o + .bss.xPassedTicks + 0x00000000 0x4 ./FreeRTOS_src/croutine.o + .text.xCoRoutineCreate + 0x00000000 0xcc ./FreeRTOS_src/croutine.o + .text.vCoRoutineAddToDelayedList + 0x00000000 0x84 ./FreeRTOS_src/croutine.o + .text.prvCheckPendingReadyList + 0x00000000 0x80 ./FreeRTOS_src/croutine.o + .text.prvCheckDelayedList + 0x00000000 0xfc ./FreeRTOS_src/croutine.o + .text.vCoRoutineSchedule + 0x00000000 0xa0 ./FreeRTOS_src/croutine.o + .text.prvInitialiseCoRoutineLists + 0x00000000 0x6c ./FreeRTOS_src/croutine.o + .text.xCoRoutineRemoveFromEventList + 0x00000000 0x50 ./FreeRTOS_src/croutine.o + .debug_info 0x00000000 0x47e ./FreeRTOS_src/croutine.o + .debug_abbrev 0x00000000 0x18a ./FreeRTOS_src/croutine.o + .debug_aranges + 0x00000000 0x50 ./FreeRTOS_src/croutine.o + .debug_ranges 0x00000000 0x40 ./FreeRTOS_src/croutine.o + .debug_macro 0x00000000 0xad ./FreeRTOS_src/croutine.o + .debug_macro 0x00000000 0x892 ./FreeRTOS_src/croutine.o + .debug_macro 0x00000000 0x10 ./FreeRTOS_src/croutine.o + .debug_macro 0x00000000 0x12d ./FreeRTOS_src/croutine.o + .debug_macro 0x00000000 0x16 ./FreeRTOS_src/croutine.o + .debug_macro 0x00000000 0x46 ./FreeRTOS_src/croutine.o + .debug_macro 0x00000000 0x150 ./FreeRTOS_src/croutine.o + .debug_macro 0x00000000 0xa3 ./FreeRTOS_src/croutine.o + .debug_macro 0x00000000 0x12 ./FreeRTOS_src/croutine.o + .debug_macro 0x00000000 0x1f ./FreeRTOS_src/croutine.o + .debug_macro 0x00000000 0x177 ./FreeRTOS_src/croutine.o + .debug_macro 0x00000000 0x49 ./FreeRTOS_src/croutine.o + .debug_macro 0x00000000 0x57 ./FreeRTOS_src/croutine.o + .debug_macro 0x00000000 0x49 ./FreeRTOS_src/croutine.o + .debug_line 0x00000000 0x2d0 ./FreeRTOS_src/croutine.o + .debug_str 0x00000000 0x5123 ./FreeRTOS_src/croutine.o + .comment 0x00000000 0x6f ./FreeRTOS_src/croutine.o + .debug_frame 0x00000000 0x10c ./FreeRTOS_src/croutine.o + .ARM.attributes + 0x00000000 0x33 ./FreeRTOS_src/croutine.o + .group 0x00000000 0x8 ./FreeRTOS_src/list.o + .group 0x00000000 0x8 ./FreeRTOS_src/list.o + .group 0x00000000 0x8 ./FreeRTOS_src/list.o + .group 0x00000000 0x8 ./FreeRTOS_src/list.o + .group 0x00000000 0x8 ./FreeRTOS_src/list.o + .group 0x00000000 0x8 ./FreeRTOS_src/list.o + .group 0x00000000 0x8 ./FreeRTOS_src/list.o + .group 0x00000000 0x8 ./FreeRTOS_src/list.o + .group 0x00000000 0x8 ./FreeRTOS_src/list.o + .group 0x00000000 0x8 ./FreeRTOS_src/list.o + .group 0x00000000 0x8 ./FreeRTOS_src/list.o + .text 0x00000000 0x0 ./FreeRTOS_src/list.o + .data 0x00000000 0x0 ./FreeRTOS_src/list.o + .bss 0x00000000 0x0 ./FreeRTOS_src/list.o + .debug_macro 0x00000000 0x892 ./FreeRTOS_src/list.o + .debug_macro 0x00000000 0x10 ./FreeRTOS_src/list.o + .debug_macro 0x00000000 0x12d ./FreeRTOS_src/list.o + .debug_macro 0x00000000 0x46 ./FreeRTOS_src/list.o + .debug_macro 0x00000000 0x150 ./FreeRTOS_src/list.o + .debug_macro 0x00000000 0xa3 ./FreeRTOS_src/list.o + .debug_macro 0x00000000 0x12 ./FreeRTOS_src/list.o + .debug_macro 0x00000000 0x1f ./FreeRTOS_src/list.o + .debug_macro 0x00000000 0x177 ./FreeRTOS_src/list.o + .debug_macro 0x00000000 0x49 ./FreeRTOS_src/list.o + .group 0x00000000 0x8 ./FreeRTOS_src/queue.o + .group 0x00000000 0x8 ./FreeRTOS_src/queue.o + .group 0x00000000 0x8 ./FreeRTOS_src/queue.o + .group 0x00000000 0x8 ./FreeRTOS_src/queue.o + .group 0x00000000 0x8 ./FreeRTOS_src/queue.o + .group 0x00000000 0x8 ./FreeRTOS_src/queue.o + .group 0x00000000 0x8 ./FreeRTOS_src/queue.o + .group 0x00000000 0x8 ./FreeRTOS_src/queue.o + .group 0x00000000 0x8 ./FreeRTOS_src/queue.o + .group 0x00000000 0x8 ./FreeRTOS_src/queue.o + .group 0x00000000 0x8 ./FreeRTOS_src/queue.o + .group 0x00000000 0x8 ./FreeRTOS_src/queue.o + .group 0x00000000 0x8 ./FreeRTOS_src/queue.o + .text 0x00000000 0x0 ./FreeRTOS_src/queue.o + .data 0x00000000 0x0 ./FreeRTOS_src/queue.o + .bss 0x00000000 0x0 ./FreeRTOS_src/queue.o + .text.xQueueCreate + 0x00000000 0xbc ./FreeRTOS_src/queue.o + .text.xQueueGiveMutexRecursive + 0x00000000 0x48 ./FreeRTOS_src/queue.o + .text.xQueueTakeMutexRecursive + 0x00000000 0x50 ./FreeRTOS_src/queue.o + .text.xQueueCreateCountingSemaphore + 0x00000000 0x2c ./FreeRTOS_src/queue.o + .text.xQueueGenericSend + 0x00000000 0x108 ./FreeRTOS_src/queue.o + .text.xQueueGenericSendFromISR + 0x00000000 0x80 ./FreeRTOS_src/queue.o + .text.xQueueGenericReceive + 0x00000000 0x13c ./FreeRTOS_src/queue.o + .text.xQueueReceiveFromISR + 0x00000000 0x84 ./FreeRTOS_src/queue.o + .text.uxQueueMessagesWaiting + 0x00000000 0x20 ./FreeRTOS_src/queue.o + .text.uxQueueMessagesWaitingFromISR + 0x00000000 0x1c ./FreeRTOS_src/queue.o + .text.vQueueDelete + 0x00000000 0x28 ./FreeRTOS_src/queue.o + .text.prvCopyDataToQueue + 0x00000000 0x9c ./FreeRTOS_src/queue.o + .text.prvCopyDataFromQueue + 0x00000000 0x4c ./FreeRTOS_src/queue.o + .text.prvUnlockQueue + 0x00000000 0x98 ./FreeRTOS_src/queue.o + .text.prvIsQueueEmpty + 0x00000000 0x2c ./FreeRTOS_src/queue.o + .text.xQueueIsQueueEmptyFromISR + 0x00000000 0x24 ./FreeRTOS_src/queue.o + .text.prvIsQueueFull + 0x00000000 0x30 ./FreeRTOS_src/queue.o + .text.xQueueIsQueueFullFromISR + 0x00000000 0x28 ./FreeRTOS_src/queue.o + .text.vQueueAddToRegistry + 0x00000000 0x50 ./FreeRTOS_src/queue.o + .text.vQueueUnregisterQueue + 0x00000000 0x44 ./FreeRTOS_src/queue.o + .debug_info 0x00000000 0x859 ./FreeRTOS_src/queue.o + .debug_abbrev 0x00000000 0x1bb ./FreeRTOS_src/queue.o + .debug_aranges + 0x00000000 0xb8 ./FreeRTOS_src/queue.o + .debug_ranges 0x00000000 0xa8 ./FreeRTOS_src/queue.o + .debug_macro 0x00000000 0x11e ./FreeRTOS_src/queue.o + .debug_macro 0x00000000 0x892 ./FreeRTOS_src/queue.o + .debug_macro 0x00000000 0x10 ./FreeRTOS_src/queue.o + .debug_macro 0x00000000 0x12d ./FreeRTOS_src/queue.o + .debug_macro 0x00000000 0x28 ./FreeRTOS_src/queue.o + .debug_macro 0x00000000 0x46 ./FreeRTOS_src/queue.o + .debug_macro 0x00000000 0x150 ./FreeRTOS_src/queue.o + .debug_macro 0x00000000 0xa3 ./FreeRTOS_src/queue.o + .debug_macro 0x00000000 0x12 ./FreeRTOS_src/queue.o + .debug_macro 0x00000000 0x1f ./FreeRTOS_src/queue.o + .debug_macro 0x00000000 0x177 ./FreeRTOS_src/queue.o + .debug_macro 0x00000000 0x49 ./FreeRTOS_src/queue.o + .debug_macro 0x00000000 0x57 ./FreeRTOS_src/queue.o + .debug_macro 0x00000000 0x49 ./FreeRTOS_src/queue.o + .debug_line 0x00000000 0x44f ./FreeRTOS_src/queue.o + .debug_str 0x00000000 0x54e2 ./FreeRTOS_src/queue.o + .comment 0x00000000 0x6f ./FreeRTOS_src/queue.o + .debug_frame 0x00000000 0x2fc ./FreeRTOS_src/queue.o + .ARM.attributes + 0x00000000 0x33 ./FreeRTOS_src/queue.o + COMMON 0x00000000 0x50 ./FreeRTOS_src/queue.o + .group 0x00000000 0x8 ./FreeRTOS_src/tasks.o + .group 0x00000000 0x8 ./FreeRTOS_src/tasks.o + .group 0x00000000 0x8 ./FreeRTOS_src/tasks.o + .group 0x00000000 0x8 ./FreeRTOS_src/tasks.o + .group 0x00000000 0x8 ./FreeRTOS_src/tasks.o + .group 0x00000000 0x8 ./FreeRTOS_src/tasks.o + .group 0x00000000 0x8 ./FreeRTOS_src/tasks.o + .group 0x00000000 0x8 ./FreeRTOS_src/tasks.o + .group 0x00000000 0x8 ./FreeRTOS_src/tasks.o + .group 0x00000000 0x8 ./FreeRTOS_src/tasks.o + .group 0x00000000 0x8 ./FreeRTOS_src/tasks.o + .group 0x00000000 0x8 ./FreeRTOS_src/tasks.o + .group 0x00000000 0x8 ./FreeRTOS_src/tasks.o + .group 0x00000000 0x8 ./FreeRTOS_src/tasks.o + .group 0x00000000 0x8 ./FreeRTOS_src/tasks.o + .text 0x00000000 0x0 ./FreeRTOS_src/tasks.o + .data 0x00000000 0x0 ./FreeRTOS_src/tasks.o + .bss 0x00000000 0x0 ./FreeRTOS_src/tasks.o + .text.vTaskDelete + 0x00000000 0x98 ./FreeRTOS_src/tasks.o + .text.vTaskDelay + 0x00000000 0x54 ./FreeRTOS_src/tasks.o + .text.uxTaskPriorityGet + 0x00000000 0x34 ./FreeRTOS_src/tasks.o + .text.vTaskPrioritySet + 0x00000000 0xe8 ./FreeRTOS_src/tasks.o + .text.vTaskSuspend + 0x00000000 0x9c ./FreeRTOS_src/tasks.o + .text.xTaskIsTaskSuspended + 0x00000000 0x44 ./FreeRTOS_src/tasks.o + .text.vTaskResume + 0x00000000 0x90 ./FreeRTOS_src/tasks.o + .text.xTaskResumeFromISR + 0x00000000 0xa0 ./FreeRTOS_src/tasks.o + .text.vTaskEndScheduler + 0x00000000 0x20 ./FreeRTOS_src/tasks.o + .text.xTaskGetTickCountFromISR + 0x00000000 0x30 ./FreeRTOS_src/tasks.o + .text.uxTaskGetNumberOfTasks + 0x00000000 0x14 ./FreeRTOS_src/tasks.o + .text.vTaskPlaceOnEventList + 0x00000000 0x60 ./FreeRTOS_src/tasks.o + .text.xTaskRemoveFromEventList + 0x00000000 0xa0 ./FreeRTOS_src/tasks.o + .text.vTaskSetTimeOutState + 0x00000000 0x2c ./FreeRTOS_src/tasks.o + .text.xTaskCheckForTimeOut + 0x00000000 0x88 ./FreeRTOS_src/tasks.o + .text.vTaskMissedYield + 0x00000000 0x18 ./FreeRTOS_src/tasks.o + .text.usTaskCheckFreeStackSpace + 0x00000000 0x30 ./FreeRTOS_src/tasks.o + .text.uxTaskGetStackHighWaterMark + 0x00000000 0x38 ./FreeRTOS_src/tasks.o + .debug_macro 0x00000000 0x892 ./FreeRTOS_src/tasks.o + .debug_macro 0x00000000 0x10 ./FreeRTOS_src/tasks.o + .debug_macro 0x00000000 0x12d ./FreeRTOS_src/tasks.o + .debug_macro 0x00000000 0xa0 ./FreeRTOS_src/tasks.o + .debug_macro 0x00000000 0x22 ./FreeRTOS_src/tasks.o + .debug_macro 0x00000000 0x46 ./FreeRTOS_src/tasks.o + .debug_macro 0x00000000 0x150 ./FreeRTOS_src/tasks.o + .debug_macro 0x00000000 0xa3 ./FreeRTOS_src/tasks.o + .debug_macro 0x00000000 0x12 ./FreeRTOS_src/tasks.o + .debug_macro 0x00000000 0x1f ./FreeRTOS_src/tasks.o + .debug_macro 0x00000000 0x177 ./FreeRTOS_src/tasks.o + .debug_macro 0x00000000 0x49 ./FreeRTOS_src/tasks.o + .debug_macro 0x00000000 0x57 ./FreeRTOS_src/tasks.o + .group 0x00000000 0x8 ./FreeRTOS_src/timers.o + .group 0x00000000 0x8 ./FreeRTOS_src/timers.o + .group 0x00000000 0x8 ./FreeRTOS_src/timers.o + .group 0x00000000 0x8 ./FreeRTOS_src/timers.o + .group 0x00000000 0x8 ./FreeRTOS_src/timers.o + .group 0x00000000 0x8 ./FreeRTOS_src/timers.o + .group 0x00000000 0x8 ./FreeRTOS_src/timers.o + .group 0x00000000 0x8 ./FreeRTOS_src/timers.o + .group 0x00000000 0x8 ./FreeRTOS_src/timers.o + .group 0x00000000 0x8 ./FreeRTOS_src/timers.o + .group 0x00000000 0x8 ./FreeRTOS_src/timers.o + .group 0x00000000 0x8 ./FreeRTOS_src/timers.o + .group 0x00000000 0x8 ./FreeRTOS_src/timers.o + .group 0x00000000 0x8 ./FreeRTOS_src/timers.o + .text 0x00000000 0x0 ./FreeRTOS_src/timers.o + .data 0x00000000 0x0 ./FreeRTOS_src/timers.o + .bss 0x00000000 0x0 ./FreeRTOS_src/timers.o + .debug_info 0x00000000 0x61 ./FreeRTOS_src/timers.o + .debug_abbrev 0x00000000 0x29 ./FreeRTOS_src/timers.o + .debug_aranges + 0x00000000 0x18 ./FreeRTOS_src/timers.o + .debug_macro 0x00000000 0xb6 ./FreeRTOS_src/timers.o + .debug_macro 0x00000000 0x892 ./FreeRTOS_src/timers.o + .debug_macro 0x00000000 0x10 ./FreeRTOS_src/timers.o + .debug_macro 0x00000000 0x12d ./FreeRTOS_src/timers.o + .debug_macro 0x00000000 0x16 ./FreeRTOS_src/timers.o + .debug_macro 0x00000000 0x46 ./FreeRTOS_src/timers.o + .debug_macro 0x00000000 0x150 ./FreeRTOS_src/timers.o + .debug_macro 0x00000000 0xa3 ./FreeRTOS_src/timers.o + .debug_macro 0x00000000 0x12 ./FreeRTOS_src/timers.o + .debug_macro 0x00000000 0x1f ./FreeRTOS_src/timers.o + .debug_macro 0x00000000 0x177 ./FreeRTOS_src/timers.o + .debug_macro 0x00000000 0x49 ./FreeRTOS_src/timers.o + .debug_macro 0x00000000 0x57 ./FreeRTOS_src/timers.o + .debug_macro 0x00000000 0x6a ./FreeRTOS_src/timers.o + .debug_macro 0x00000000 0x61 ./FreeRTOS_src/timers.o + .debug_line 0x00000000 0x1b1 ./FreeRTOS_src/timers.o + .debug_str 0x00000000 0x539e ./FreeRTOS_src/timers.o + .comment 0x00000000 0x6f ./FreeRTOS_src/timers.o + .ARM.attributes + 0x00000000 0x33 ./FreeRTOS_src/timers.o + .group 0x00000000 0x8 ./FreeRTOS_portable/MemMang/heap_2.o + .group 0x00000000 0x8 ./FreeRTOS_portable/MemMang/heap_2.o + .group 0x00000000 0x8 ./FreeRTOS_portable/MemMang/heap_2.o + .group 0x00000000 0x8 ./FreeRTOS_portable/MemMang/heap_2.o + .group 0x00000000 0x8 ./FreeRTOS_portable/MemMang/heap_2.o + .group 0x00000000 0x8 ./FreeRTOS_portable/MemMang/heap_2.o + .group 0x00000000 0x8 ./FreeRTOS_portable/MemMang/heap_2.o + .group 0x00000000 0x8 ./FreeRTOS_portable/MemMang/heap_2.o + .group 0x00000000 0x8 ./FreeRTOS_portable/MemMang/heap_2.o + .group 0x00000000 0x8 ./FreeRTOS_portable/MemMang/heap_2.o + .group 0x00000000 0x8 ./FreeRTOS_portable/MemMang/heap_2.o + .group 0x00000000 0x8 ./FreeRTOS_portable/MemMang/heap_2.o + .text 0x00000000 0x0 ./FreeRTOS_portable/MemMang/heap_2.o + .data 0x00000000 0x0 ./FreeRTOS_portable/MemMang/heap_2.o + .bss 0x00000000 0x0 ./FreeRTOS_portable/MemMang/heap_2.o + .rodata.heapSTRUCT_SIZE + 0x00000000 0x2 ./FreeRTOS_portable/MemMang/heap_2.o + .text.xPortGetFreeHeapSize + 0x00000000 0x14 ./FreeRTOS_portable/MemMang/heap_2.o + .text.vPortInitialiseBlocks + 0x00000000 0xc ./FreeRTOS_portable/MemMang/heap_2.o + .debug_macro 0x00000000 0x892 ./FreeRTOS_portable/MemMang/heap_2.o + .debug_macro 0x00000000 0x10 ./FreeRTOS_portable/MemMang/heap_2.o + .debug_macro 0x00000000 0x12d ./FreeRTOS_portable/MemMang/heap_2.o + .debug_macro 0x00000000 0x28 ./FreeRTOS_portable/MemMang/heap_2.o + .debug_macro 0x00000000 0x46 ./FreeRTOS_portable/MemMang/heap_2.o + .debug_macro 0x00000000 0x150 ./FreeRTOS_portable/MemMang/heap_2.o + .debug_macro 0x00000000 0xa3 ./FreeRTOS_portable/MemMang/heap_2.o + .debug_macro 0x00000000 0x12 ./FreeRTOS_portable/MemMang/heap_2.o + .debug_macro 0x00000000 0x1f ./FreeRTOS_portable/MemMang/heap_2.o + .debug_macro 0x00000000 0x177 ./FreeRTOS_portable/MemMang/heap_2.o + .debug_macro 0x00000000 0x49 ./FreeRTOS_portable/MemMang/heap_2.o + .debug_macro 0x00000000 0x57 ./FreeRTOS_portable/MemMang/heap_2.o + .group 0x00000000 0x8 ./FreeRTOS_portable/port.o + .group 0x00000000 0x8 ./FreeRTOS_portable/port.o + .group 0x00000000 0x8 ./FreeRTOS_portable/port.o + .group 0x00000000 0x8 ./FreeRTOS_portable/port.o + .group 0x00000000 0x8 ./FreeRTOS_portable/port.o + .group 0x00000000 0x8 ./FreeRTOS_portable/port.o + .group 0x00000000 0x8 ./FreeRTOS_portable/port.o + .group 0x00000000 0x8 ./FreeRTOS_portable/port.o + .group 0x00000000 0x8 ./FreeRTOS_portable/port.o + .group 0x00000000 0x8 ./FreeRTOS_portable/port.o + .group 0x00000000 0x8 ./FreeRTOS_portable/port.o + .group 0x00000000 0x8 ./FreeRTOS_portable/port.o + .text 0x00000000 0x0 ./FreeRTOS_portable/port.o + .data 0x00000000 0x0 ./FreeRTOS_portable/port.o + .bss 0x00000000 0x0 ./FreeRTOS_portable/port.o + .rodata.ulKernelPriority + 0x00000000 0x4 ./FreeRTOS_portable/port.o + .text.vPortEndScheduler + 0x00000000 0xc ./FreeRTOS_portable/port.o + .debug_macro 0x00000000 0x892 ./FreeRTOS_portable/port.o + .debug_macro 0x00000000 0x10 ./FreeRTOS_portable/port.o + .debug_macro 0x00000000 0x12d ./FreeRTOS_portable/port.o + .debug_macro 0x00000000 0x16 ./FreeRTOS_portable/port.o + .debug_macro 0x00000000 0x46 ./FreeRTOS_portable/port.o + .debug_macro 0x00000000 0x150 ./FreeRTOS_portable/port.o + .debug_macro 0x00000000 0xa3 ./FreeRTOS_portable/port.o + .debug_macro 0x00000000 0x12 ./FreeRTOS_portable/port.o + .debug_macro 0x00000000 0x1f ./FreeRTOS_portable/port.o + .debug_macro 0x00000000 0x177 ./FreeRTOS_portable/port.o + .debug_macro 0x00000000 0x49 ./FreeRTOS_portable/port.o + .debug_macro 0x00000000 0x57 ./FreeRTOS_portable/port.o + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(accelerometer.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(accelerometer.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(accelerometer.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(accelerometer.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(accelerometer.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(accelerometer.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(accelerometer.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(accelerometer.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(accelerometer.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(accelerometer.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(accelerometer.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(accelerometer.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(accelerometer.o) + .text 0x00000000 0x0 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(accelerometer.o) + .data 0x00000000 0x0 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(accelerometer.o) + .bss 0x00000000 0x0 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(accelerometer.o) + .debug_macro 0x00000000 0x10 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(accelerometer.o) + .debug_macro 0x00000000 0x12d C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(accelerometer.o) + .debug_macro 0x00000000 0x28 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(accelerometer.o) + .debug_macro 0x00000000 0x1c C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(accelerometer.o) + .debug_macro 0x00000000 0x2e C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(accelerometer.o) + .debug_macro 0x00000000 0x5b2 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(accelerometer.o) + .debug_macro 0x00000000 0x18 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(accelerometer.o) + .debug_macro 0x00000000 0x7af C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(accelerometer.o) + .debug_macro 0x00000000 0x2c7 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(accelerometer.o) + .debug_macro 0x00000000 0xd6 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(accelerometer.o) + .debug_macro 0x00000000 0x22 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(accelerometer.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(custom_rand.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(custom_rand.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(custom_rand.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(custom_rand.o) + .text 0x00000000 0x0 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(custom_rand.o) + .data 0x00000000 0x0 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(custom_rand.o) + .bss 0x00000000 0x0 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(custom_rand.o) + .debug_macro 0x00000000 0x898 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(custom_rand.o) + .debug_macro 0x00000000 0x10 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(custom_rand.o) + .debug_macro 0x00000000 0x12d C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(custom_rand.o) + .debug_macro 0x00000000 0x5b2 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(custom_rand.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(ethernet_mgt.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(ethernet_mgt.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(ethernet_mgt.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(ethernet_mgt.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(ethernet_mgt.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(ethernet_mgt.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(ethernet_mgt.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(ethernet_mgt.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(ethernet_mgt.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(ethernet_mgt.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(ethernet_mgt.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(ethernet_mgt.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(ethernet_mgt.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(ethernet_mgt.o) + .text 0x00000000 0x0 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(ethernet_mgt.o) + .data 0x00000000 0x0 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(ethernet_mgt.o) + .bss 0x00000000 0x0 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(ethernet_mgt.o) + .text.rec_eth 0x00000000 0x40 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(ethernet_mgt.o) + .debug_macro 0x00000000 0x898 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(ethernet_mgt.o) + .debug_macro 0x00000000 0x10 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(ethernet_mgt.o) + .debug_macro 0x00000000 0x12d C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(ethernet_mgt.o) + .debug_macro 0x00000000 0x28 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(ethernet_mgt.o) + .debug_macro 0x00000000 0x1c C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(ethernet_mgt.o) + .debug_macro 0x00000000 0x2e C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(ethernet_mgt.o) + .debug_macro 0x00000000 0x5b2 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(ethernet_mgt.o) + .debug_macro 0x00000000 0x18 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(ethernet_mgt.o) + .debug_macro 0x00000000 0x7af C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(ethernet_mgt.o) + .debug_macro 0x00000000 0x2c7 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(ethernet_mgt.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(ethmac.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(ethmac.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(ethmac.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(ethmac.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(ethmac.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(ethmac.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(ethmac.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(ethmac.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(ethmac.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(ethmac.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(ethmac.o) + .text 0x00000000 0x0 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(ethmac.o) + .data 0x00000000 0x0 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(ethmac.o) + .bss 0x00000000 0x0 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(ethmac.o) + .text.ethernet_power_down + 0x00000000 0xcc C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(ethmac.o) + .text.CheckIfFrameReceived + 0x00000000 0x28 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(ethmac.o) + .debug_macro 0x00000000 0x898 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(ethmac.o) + .debug_macro 0x00000000 0x10 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(ethmac.o) + .debug_macro 0x00000000 0x12d C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(ethmac.o) + .debug_macro 0x00000000 0xa0 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(ethmac.o) + .debug_macro 0x00000000 0x5c3 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(ethmac.o) + .debug_macro 0x00000000 0x1c C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(ethmac.o) + .debug_macro 0x00000000 0x2e C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(ethmac.o) + .debug_macro 0x00000000 0x5b2 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(ethmac.o) + .debug_macro 0x00000000 0x18 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(ethmac.o) + .debug_macro 0x00000000 0x7af C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(ethmac.o) + .debug_macro 0x00000000 0x2c7 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(ethmac.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(lcd.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(lcd.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(lcd.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(lcd.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(lcd.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(lcd.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(lcd.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(lcd.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(lcd.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(lcd.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(lcd.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(lcd.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(lcd.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(lcd.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(lcd.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(lcd.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(lcd.o) + .text 0x00000000 0x0 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(lcd.o) + .data 0x00000000 0x0 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(lcd.o) + .bss 0x00000000 0x0 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(lcd.o) + .text.read_cmd + 0x00000000 0x64 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(lcd.o) + .text.setup_scroll + 0x00000000 0x68 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(lcd.o) + .text.lcd_scroll + 0x00000000 0x60 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(lcd.o) + .text.lcd_set_fenetre_pixel + 0x00000000 0x24 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(lcd.o) + .text.Ecran_Croix + 0x00000000 0x78 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(lcd.o) + .text.lcd_lineH + 0x00000000 0x64 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(lcd.o) + .text.lcd_lineV + 0x00000000 0x60 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(lcd.o) + .text.lcd_line + 0x00000000 0x158 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(lcd.o) + .text.lcd_circle + 0x00000000 0x1ac C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(lcd.o) + .text.lcd_filled_circle_on_square + 0x00000000 0xcc C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(lcd.o) + .text.lcd_empty_rectangle + 0x00000000 0x80 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(lcd.o) + .text.lcd_printf + 0x00000000 0x254 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(lcd.o) + .text.read_bmp_file + 0x00000000 0x1d0 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(lcd.o) + .text.display_bitmap16 + 0x00000000 0x70 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(lcd.o) + .bss.is_scroll_setup.5886 + 0x00000000 0x1 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(lcd.o) + .bss.x.5883 0x00000000 0x4 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(lcd.o) + .data.offset.5885 + 0x00000000 0x4 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(lcd.o) + .data.y.5884 0x00000000 0x4 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(lcd.o) + .debug_macro 0x00000000 0x898 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(lcd.o) + .debug_macro 0x00000000 0x10 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(lcd.o) + .debug_macro 0x00000000 0x12d C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(lcd.o) + .debug_macro 0x00000000 0x9a C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(lcd.o) + .debug_macro 0x00000000 0x22 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(lcd.o) + .debug_macro 0x00000000 0xc4 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(lcd.o) + .debug_macro 0x00000000 0x1c C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(lcd.o) + .debug_macro 0x00000000 0x2e C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(lcd.o) + .debug_macro 0x00000000 0x5b2 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(lcd.o) + .debug_macro 0x00000000 0x18 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(lcd.o) + .debug_macro 0x00000000 0x7af C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(lcd.o) + .debug_macro 0x00000000 0x2c7 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(lcd.o) + .debug_macro 0x00000000 0x1c C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(lcd.o) + .debug_macro 0x00000000 0x22 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(lcd.o) + .debug_macro 0x00000000 0x28 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(lcd.o) + .debug_macro 0x00000000 0x1c C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(lcd.o) + .debug_macro 0x00000000 0xc2 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(lcd.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(ssp.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(ssp.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(ssp.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(ssp.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(ssp.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(ssp.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(ssp.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(ssp.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(ssp.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(ssp.o) + .text 0x00000000 0x0 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(ssp.o) + .data 0x00000000 0x0 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(ssp.o) + .bss 0x00000000 0x0 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(ssp.o) + .debug_macro 0x00000000 0x898 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(ssp.o) + .debug_macro 0x00000000 0x1c C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(ssp.o) + .debug_macro 0x00000000 0x2e C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(ssp.o) + .debug_macro 0x00000000 0x10 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(ssp.o) + .debug_macro 0x00000000 0x12d C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(ssp.o) + .debug_macro 0x00000000 0x5b2 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(ssp.o) + .debug_macro 0x00000000 0x18 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(ssp.o) + .debug_macro 0x00000000 0x7af C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(ssp.o) + .debug_macro 0x00000000 0x2c7 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(ssp.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(traces.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(traces.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(traces.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(traces.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(traces.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(traces.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(traces.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(traces.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(traces.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(traces.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(traces.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(traces.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(traces.o) + .text 0x00000000 0x0 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(traces.o) + .data 0x00000000 0x0 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(traces.o) + .bss 0x00000000 0x0 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(traces.o) + .text.send_traces_to_uart0 + 0x00000000 0x74 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(traces.o) + .debug_macro 0x00000000 0x898 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(traces.o) + .debug_macro 0x00000000 0x1c C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(traces.o) + .debug_macro 0x00000000 0x2e C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(traces.o) + .debug_macro 0x00000000 0x10 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(traces.o) + .debug_macro 0x00000000 0x12d C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(traces.o) + .debug_macro 0x00000000 0x5b2 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(traces.o) + .debug_macro 0x00000000 0x18 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(traces.o) + .debug_macro 0x00000000 0x7af C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(traces.o) + .debug_macro 0x00000000 0x2c7 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(traces.o) + .debug_macro 0x00000000 0x28 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(traces.o) + .debug_macro 0x00000000 0x22 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(traces.o) + .debug_macro 0x00000000 0x16 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(traces.o) + .debug_macro 0x00000000 0x9a C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(traces.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(uart.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(uart.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(uart.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(uart.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(uart.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(uart.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(uart.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(uart.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(uart.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(uart.o) + .text 0x00000000 0x0 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(uart.o) + .data 0x00000000 0x0 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(uart.o) + .bss 0x00000000 0x0 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(uart.o) + .text.taskYIELD + 0x00000000 0xc C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(uart.o) + .text.uart0_send_ref + 0x00000000 0x40 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(uart.o) + .debug_macro 0x00000000 0x898 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(uart.o) + .debug_macro 0x00000000 0x1c C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(uart.o) + .debug_macro 0x00000000 0x2e C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(uart.o) + .debug_macro 0x00000000 0x10 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(uart.o) + .debug_macro 0x00000000 0x12d C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(uart.o) + .debug_macro 0x00000000 0x5b2 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(uart.o) + .debug_macro 0x00000000 0x18 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(uart.o) + .debug_macro 0x00000000 0x7af C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(uart.o) + .debug_macro 0x00000000 0x2c7 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(uart.o) + .debug_macro 0x00000000 0x16 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(uart.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(I2C.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(I2C.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(I2C.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(I2C.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(I2C.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(I2C.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(I2C.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(I2C.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(I2C.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(I2C.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(I2C.o) + .text 0x00000000 0x0 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(I2C.o) + .data 0x00000000 0x0 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(I2C.o) + .bss 0x00000000 0x0 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(I2C.o) + .text.I2C_slave_read + 0x00000000 0x1c8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(I2C.o) + .text.I2C_slave_write + 0x00000000 0x168 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(I2C.o) + .debug_macro 0x00000000 0x898 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(I2C.o) + .debug_macro 0x00000000 0x1c C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(I2C.o) + .debug_macro 0x00000000 0x2e C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(I2C.o) + .debug_macro 0x00000000 0x10 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(I2C.o) + .debug_macro 0x00000000 0x12d C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(I2C.o) + .debug_macro 0x00000000 0x5b2 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(I2C.o) + .debug_macro 0x00000000 0x18 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(I2C.o) + .debug_macro 0x00000000 0x7af C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(I2C.o) + .debug_macro 0x00000000 0x2c7 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(I2C.o) + .debug_macro 0x00000000 0x22 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(I2C.o) + .debug_macro 0x00000000 0x52 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(I2C.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(fonts.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(fonts.o) + .text 0x00000000 0x0 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(fonts.o) + .data 0x00000000 0x0 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(fonts.o) + .bss 0x00000000 0x0 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(fonts.o) + .rodata.SevenSegNumFont + 0x00000000 0x7d4 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(fonts.o) + .debug_macro 0x00000000 0x898 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(fonts.o) + .debug_macro 0x00000000 0x1c C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(fonts.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\CMSISv2p00_LPC17xx\Debug\libCMSISv2p00_LPC17xx.a(system_LPC17xx.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\CMSISv2p00_LPC17xx\Debug\libCMSISv2p00_LPC17xx.a(system_LPC17xx.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\CMSISv2p00_LPC17xx\Debug\libCMSISv2p00_LPC17xx.a(system_LPC17xx.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\CMSISv2p00_LPC17xx\Debug\libCMSISv2p00_LPC17xx.a(system_LPC17xx.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\CMSISv2p00_LPC17xx\Debug\libCMSISv2p00_LPC17xx.a(system_LPC17xx.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\CMSISv2p00_LPC17xx\Debug\libCMSISv2p00_LPC17xx.a(system_LPC17xx.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\CMSISv2p00_LPC17xx\Debug\libCMSISv2p00_LPC17xx.a(system_LPC17xx.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\CMSISv2p00_LPC17xx\Debug\libCMSISv2p00_LPC17xx.a(system_LPC17xx.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\CMSISv2p00_LPC17xx\Debug\libCMSISv2p00_LPC17xx.a(system_LPC17xx.o) + .text 0x00000000 0x0 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\CMSISv2p00_LPC17xx\Debug\libCMSISv2p00_LPC17xx.a(system_LPC17xx.o) + .data 0x00000000 0x0 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\CMSISv2p00_LPC17xx\Debug\libCMSISv2p00_LPC17xx.a(system_LPC17xx.o) + .bss 0x00000000 0x0 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\CMSISv2p00_LPC17xx\Debug\libCMSISv2p00_LPC17xx.a(system_LPC17xx.o) + .text.SystemCoreClockUpdate + 0x00000000 0xb4 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\CMSISv2p00_LPC17xx\Debug\libCMSISv2p00_LPC17xx.a(system_LPC17xx.o) + .data.SystemCoreClock + 0x00000000 0x4 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\CMSISv2p00_LPC17xx\Debug\libCMSISv2p00_LPC17xx.a(system_LPC17xx.o) + .debug_macro 0x00000000 0x10 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\CMSISv2p00_LPC17xx\Debug\libCMSISv2p00_LPC17xx.a(system_LPC17xx.o) + .debug_macro 0x00000000 0x12d C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\CMSISv2p00_LPC17xx\Debug\libCMSISv2p00_LPC17xx.a(system_LPC17xx.o) + .debug_macro 0x00000000 0x5b2 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\CMSISv2p00_LPC17xx\Debug\libCMSISv2p00_LPC17xx.a(system_LPC17xx.o) + .debug_macro 0x00000000 0x1c C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\CMSISv2p00_LPC17xx\Debug\libCMSISv2p00_LPC17xx.a(system_LPC17xx.o) + .debug_macro 0x00000000 0x2e C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\CMSISv2p00_LPC17xx\Debug\libCMSISv2p00_LPC17xx.a(system_LPC17xx.o) + .debug_macro 0x00000000 0x18 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\CMSISv2p00_LPC17xx\Debug\libCMSISv2p00_LPC17xx.a(system_LPC17xx.o) + .debug_macro 0x00000000 0x7af C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\CMSISv2p00_LPC17xx\Debug\libCMSISv2p00_LPC17xx.a(system_LPC17xx.o) + .debug_macro 0x00000000 0x2c7 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\CMSISv2p00_LPC17xx\Debug\libCMSISv2p00_LPC17xx.a(system_LPC17xx.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(_cr__main.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(_cr__main.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(_cr__main.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(memcpy.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(memcpy.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(memcpy.o) + .text.memcpy 0x00000000 0x4 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(memcpy.o) + .comment 0x00000000 0x6f c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(memcpy.o) + .ARM.attributes + 0x00000000 0x33 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(memcpy.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(memset.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(memset.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(memset.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(alloc.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(alloc.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(alloc.o) + .text.calloc 0x00000000 0x50 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(alloc.o) + .text.realloc 0x00000000 0x24 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(alloc.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(ceil.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(ceil.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(ceil.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fclose.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fclose.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fclose.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fflush.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fflush.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fflush.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(floor.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(floor.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(floor.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fopen.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fopen.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fopen.o) + .text.fopen 0x00000000 0x28 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fopen.o) + .comment 0x00000000 0x6f c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fopen.o) + .ARM.attributes + 0x00000000 0x33 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fopen.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fpprintf.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fpprintf.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fpprintf.o) + .text.fprintf 0x00000000 0x30 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fpprintf.o) + .text.printf_char + 0x00000000 0x34 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fpprintf.o) + .text.snprintf + 0x00000000 0x68 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fpprintf.o) + .text.vfprintf + 0x00000000 0x1c c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fpprintf.o) + .text.vprintf 0x00000000 0x24 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fpprintf.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fread.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fread.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fread.o) + .text.fread 0x00000000 0x1a c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fread.o) + .comment 0x00000000 0x6f c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fread.o) + .ARM.attributes + 0x00000000 0x33 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fread.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(freopen.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(freopen.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(freopen.o) + .text.freopen 0x00000000 0x88 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(freopen.o) + .comment 0x00000000 0x6f c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(freopen.o) + .ARM.attributes + 0x00000000 0x33 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(freopen.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fseek.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fseek.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fseek.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(ftell.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(ftell.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(ftell.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(initio.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(initio.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(initio.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(printf.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(printf.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(printf.o) + .text.no_fp_display + 0x00000000 0x4 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(printf.o) + .text._fprintf + 0x00000000 0x30 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(printf.o) + .text._printf_char + 0x00000000 0x34 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(printf.o) + .text._sprintf + 0x00000000 0x6c c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(printf.o) + .text._snprintf + 0x00000000 0x68 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(printf.o) + .text._vfprintf + 0x00000000 0x20 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(printf.o) + .text._vprintf + 0x00000000 0x24 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(printf.o) + .text._vsprintf + 0x00000000 0x5c c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(printf.o) + .text._vsnprintf + 0x00000000 0x5c c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(printf.o) + .text._printf 0x00000000 0x54 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(printf.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(remove.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(remove.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(remove.o) + .text.rename 0x00000000 0x28 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(remove.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(setvbuf.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(setvbuf.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(setvbuf.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(sqrt.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(sqrt.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(sqrt.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(stdio.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(stdio.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(stdio.o) + .text.getc 0x00000000 0x18 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(stdio.o) + .text.fgetc 0x00000000 0x4 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(stdio.o) + .text.getchar 0x00000000 0x20 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(stdio.o) + .text.putc 0x00000000 0x24 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(stdio.o) + .text.fputc 0x00000000 0x4 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(stdio.o) + .text.putchar 0x00000000 0x24 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(stdio.o) + .text.feof 0x00000000 0x8 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(stdio.o) + .text.ferror 0x00000000 0x8 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(stdio.o) + .text.clearerr + 0x00000000 0xe c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(stdio.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(stdlib.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(stdlib.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(stdlib.o) + .text.__rand 0x00000000 0x20 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(stdlib.o) + .text.__srand 0x00000000 0xc c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(stdlib.o) + .text.rand 0x00000000 0x3c c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(stdlib.o) + .text.srand 0x00000000 0x40 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(stdlib.o) + .text._exit_init + 0x00000000 0xc c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(stdlib.o) + .text.atexit 0x00000000 0x24 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(stdlib.o) + .text.abort 0x00000000 0x12 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(stdlib.o) + .text.abs 0x00000000 0x8 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(stdlib.o) + .text.labs 0x00000000 0x8 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(stdlib.o) + .text.div 0x00000000 0x10 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(stdlib.o) + .text.ldiv 0x00000000 0x10 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(stdlib.o) + .data.next 0x00000000 0x4 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(stdlib.o) + .data._random_number_seed + 0x00000000 0xdc c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(stdlib.o) + .data._random_j + 0x00000000 0x4 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(stdlib.o) + .data._random_k + 0x00000000 0x4 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(stdlib.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(strlen.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(strlen.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(strlen.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(strncpy.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(strncpy.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(strncpy.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(__fillbuf.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(__fillbuf.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(__fillbuf.o) + .text._Csys_read_ + 0x00000000 0x22 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(__fillbuf.o) + .text.__filbuf + 0x00000000 0x178 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(__fillbuf.o) + .text._fillb2 0x00000000 0x1c c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(__fillbuf.o) + .comment 0x00000000 0x6f c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(__fillbuf.o) + .ARM.attributes + 0x00000000 0x33 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(__fillbuf.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(__init_alloc.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(__init_alloc.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(__init_alloc.o) + .text._init_alloc + 0x00000000 0x14 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(__init_alloc.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_cr_sbrk.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_cr_sbrk.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_cr_sbrk.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_deferredlazyseek.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_deferredlazyseek.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_deferredlazyseek.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_do_fflush.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_do_fflush.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_do_fflush.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_fdopen.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_fdopen.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_fdopen.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_fflush.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_fflush.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_fflush.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_frexpl.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_frexpl.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_frexpl.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_hugeval.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_hugeval.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_hugeval.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_ldexpl.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_ldexpl.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_ldexpl.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_read.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_read.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_read.o) + .text._Cread 0x00000000 0x8c c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_read.o) + .comment 0x00000000 0x6f c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_read.o) + .ARM.attributes + 0x00000000 0x33 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_read.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_writebuf.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_writebuf.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_writebuf.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(errno.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(errno.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(errno.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(raise.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(raise.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(raise.o) + .text.raise 0x00000000 0x6 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(raise.o) + .comment 0x00000000 0x6f c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(raise.o) + .ARM.attributes + 0x00000000 0x33 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(raise.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_cr_check_heap.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_cr_check_heap.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_cr_check_heap.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(division_64.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(division_64.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(division_64.o) + .text.__aeabi_division_ldivmod + 0x00000000 0x26 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(division_64.o) + .text.__aeabi_division_uldivmod + 0x00000000 0x174 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(division_64.o) + .ARM.attributes + 0x00000000 0x21 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(division_64.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(division_idiv0.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(division_idiv0.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(division_idiv0.o) + .text.__aeabi_division_idiv0 + 0x00000000 0x2 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(division_idiv0.o) + .ARM.attributes + 0x00000000 0x21 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(division_idiv0.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(double.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(double.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(double.o) + .text.__aeabi_drsub + 0x00000000 0x1c c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(double.o) + .text.__aeabi_dneg + 0x00000000 0x8 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(double.o) + .text.__aeabi_d2uiz + 0x00000000 0x30 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(double.o) + .text.__aeabi_d2lz + 0x00000000 0x6a c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(double.o) + .text.__aeabi_d2ulz + 0x00000000 0x54 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(double.o) + .text.__bhs_ul2d + 0x00000000 0x88 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(double.o) + .text.__aeabi_ui2d + 0x00000000 0x8 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(double.o) + .text.__aeabi_l2d + 0x00000000 0x18 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(double.o) + .text.__aeabi_ul2d + 0x00000000 0x8 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(double.o) + .text.__aeabi_dcmpgt + 0x00000000 0x54 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(double.o) + .text.__aeabi_dcmpun + 0x00000000 0x1a c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(double.o) + .text.__aeabi_cdcmple + 0x00000000 0x24 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(double.o) + .text.__aeabi_cdrcmple + 0x00000000 0x14 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(double.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(float.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(float.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(float.o) + .text.__aeabi_frsub + 0x00000000 0xc c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(float.o) + .text.__aeabi_fneg + 0x00000000 0x6 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(float.o) + .text.__aeabi_f2iz + 0x00000000 0x32 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(float.o) + .text.__aeabi_f2uiz + 0x00000000 0x28 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(float.o) + .text.__aeabi_f2lz + 0x00000000 0x5a c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(float.o) + .text.__aeabi_f2ulz + 0x00000000 0x3e c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(float.o) + .text.__bhs_ul2f + 0x00000000 0x46 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(float.o) + .text.__aeabi_l2f + 0x00000000 0x18 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(float.o) + .text.__aeabi_ul2f + 0x00000000 0x8 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(float.o) + .text.__aeabi_fcmpeq + 0x00000000 0x1e c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(float.o) + .text.__aeabi_fcmpun + 0x00000000 0x1a c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(float.o) + .text.__aeabi_cfcmple + 0x00000000 0x20 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(float.o) + .text.__aeabi_cfrcmple + 0x00000000 0xa c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(float.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(memcpy.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(memcpy.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(memcpy.o) + .text.__aeabi_memcpy + 0x00000000 0x34 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(memcpy.o) + .text.__aeabi_memmove + 0x00000000 0x1c c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(memcpy.o) + .text.__aeabi_memclr + 0x00000000 0x8 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(memcpy.o) + .text.__aeabi_memset + 0x00000000 0xa c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(memcpy.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_appexit.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_appexit.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_appexit.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_close.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_close.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_close.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_flen.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_flen.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_flen.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_istty.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_istty.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_istty.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_open.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_open.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_open.o) + .text.__sys_open + 0x00000000 0xc c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_open.o) + .ARM.attributes + 0x00000000 0x21 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_open.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_read.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_read.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_read.o) + .text.__sys_read + 0x00000000 0xc c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_read.o) + .ARM.attributes + 0x00000000 0x21 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_read.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_readc.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_readc.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_readc.o) + .text.__sys_readc + 0x00000000 0x8 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_readc.o) + .ARM.attributes + 0x00000000 0x21 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_readc.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_remove.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_remove.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_remove.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_rename.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_rename.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_rename.o) + .text.__sys_rename + 0x00000000 0xc c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_rename.o) + .ARM.attributes + 0x00000000 0x21 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_rename.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_seek.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_seek.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_seek.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_tmpnam.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_tmpnam.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_tmpnam.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_write.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_write.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_write.o) + +Memory Configuration + +Name Origin Length Attributes +MFlash512 0x00000000 0x00080000 xr +RamLoc32 0x10000000 0x00008000 xrw +RamAHB32 0x2007c000 0x00008000 xrw +*default* 0x00000000 0xffffffff + +Linker script and memory map + +LOAD ./src/cr_startup_lpc17.o +LOAD ./src/debug.o +LOAD ./src/gpio.o +LOAD ./src/labyrinth.o +LOAD ./src/tools.o +LOAD ./src/trace_mgt.o +LOAD ./src/uart.o +LOAD ./FreeRTOS_src/croutine.o +LOAD ./FreeRTOS_src/list.o +LOAD ./FreeRTOS_src/queue.o +LOAD ./FreeRTOS_src/tasks.o +LOAD ./FreeRTOS_src/timers.o +LOAD ./FreeRTOS_portable/MemMang/heap_2.o +LOAD ./FreeRTOS_portable/port.o +LOAD C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a +LOAD C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\CMSISv2p00_LPC17xx\Debug\libCMSISv2p00_LPC17xx.a +START GROUP +LOAD c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a +LOAD c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a +LOAD c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a +END GROUP + 0x00000000 __base_MFlash512 = 0x0 + 0x00000000 __base_Flash = 0x0 + 0x00080000 __top_MFlash512 = 0x80000 + 0x00080000 __top_Flash = 0x80000 + 0x10000000 __base_RamLoc32 = 0x10000000 + 0x10000000 __base_RAM = 0x10000000 + 0x10008000 __top_RamLoc32 = 0x10008000 + 0x10008000 __top_RAM = 0x10008000 + 0x2007c000 __base_RamAHB32 = 0x2007c000 + 0x2007c000 __base_RAM2 = 0x2007c000 + 0x20084000 __top_RamAHB32 = 0x20084000 + 0x20084000 __top_RAM2 = 0x20084000 + +.text 0x00000000 0x7c10 + FILL mask 0xff + 0x00000000 __vectors_start__ = ABSOLUTE (.) + *(.isr_vector) + .isr_vector 0x00000000 0xcc ./src/cr_startup_lpc17.o + 0x00000000 g_pfnVectors + 0x000000cc . = ALIGN (0x4) + 0x000000cc __section_table_start = . + 0x000000cc __data_section_table = . + 0x000000cc 0x4 LONG 0x7c10 LOADADDR (.data) + 0x000000d0 0x4 LONG 0x10000000 ADDR (.data) + 0x000000d4 0x4 LONG 0x2a0 SIZEOF (.data) + 0x000000d8 0x4 LONG 0x7c10 LOADADDR (.data_RAM2) + 0x000000dc 0x4 LONG 0x2007c000 ADDR (.data_RAM2) + 0x000000e0 0x4 LONG 0x0 SIZEOF (.data_RAM2) + 0x000000e4 __data_section_table_end = . + 0x000000e4 __bss_section_table = . + 0x000000e4 0x4 LONG 0x100002a0 ADDR (.bss) + 0x000000e8 0x4 LONG 0x5774 SIZEOF (.bss) + 0x000000ec 0x4 LONG 0x2007c000 ADDR (.bss_RAM2) + 0x000000f0 0x4 LONG 0x0 SIZEOF (.bss_RAM2) + 0x000000f4 __bss_section_table_end = . + 0x000000f4 __section_table_end = . + *(.after_vectors*) + .after_vectors + 0x000000f4 0x12c ./src/cr_startup_lpc17.o + 0x000000f4 data_init + 0x00000138 bss_init + 0x00000170 ResetISR + 0x000001e8 NMI_Handler + 0x000001f0 HardFault_Handler + 0x000001f8 MemManage_Handler + 0x00000200 BusFault_Handler + 0x00000208 UsageFault_Handler + 0x00000210 DebugMon_Handler + 0x00000218 UART1_IRQHandler + 0x00000218 CANActivity_IRQHandler + 0x00000218 TIMER3_IRQHandler + 0x00000218 USBActivity_IRQHandler + 0x00000218 EINT2_IRQHandler + 0x00000218 I2C1_IRQHandler + 0x00000218 IntDefaultHandler + 0x00000218 PLL0_IRQHandler + 0x00000218 CAN_IRQHandler + 0x00000218 PLL1_IRQHandler + 0x00000218 I2C0_IRQHandler + 0x00000218 I2S_IRQHandler + 0x00000218 I2C2_IRQHandler + 0x00000218 RTC_IRQHandler + 0x00000218 TIMER0_IRQHandler + 0x00000218 SPI_IRQHandler + 0x00000218 RIT_IRQHandler + 0x00000218 EINT1_IRQHandler + 0x00000218 TIMER1_IRQHandler + 0x00000218 UART2_IRQHandler + 0x00000218 ADC_IRQHandler + 0x00000218 SSP1_IRQHandler + 0x00000218 USB_IRQHandler + 0x00000218 BOD_IRQHandler + 0x00000218 PWM1_IRQHandler + 0x00000218 WDT_IRQHandler + 0x00000218 QEI_IRQHandler + 0x00000218 EINT0_IRQHandler + 0x00000218 SSP0_IRQHandler + 0x00000218 DMA_IRQHandler + 0x00000218 TIMER2_IRQHandler + 0x00000218 UART3_IRQHandler + 0x00000218 MCPWM_IRQHandler + *(.text*) + .text.EINT3_IRQHandler + 0x00000220 0x48 ./src/gpio.o + 0x00000220 EINT3_IRQHandler + .text.get_gpio + 0x00000268 0x2c ./src/gpio.o + 0x00000268 get_gpio + *fill* 0x00000294 0x4 ff + .text.ball 0x00000298 0x544 ./src/labyrinth.o + 0x00000298 ball + .text.slave_info_rx + 0x000007dc 0x28 ./src/labyrinth.o + 0x000007dc slave_info_rx + .text.main 0x00000804 0xb0 ./src/labyrinth.o + 0x00000804 main + .text.round 0x000008b4 0x78 ./src/tools.o + 0x000008b4 round + .text.draw_labyrinth + 0x0000092c 0x150 ./src/tools.o + 0x0000092c draw_labyrinth + .text.test_collision + 0x00000a7c 0x450 ./src/tools.o + 0x00000a7c test_collision + .text.write_trace + 0x00000ecc 0x28 ./src/trace_mgt.o + 0x00000ecc write_trace + .text.vListInitialise + 0x00000ef4 0x40 ./FreeRTOS_src/list.o + 0x00000ef4 vListInitialise + .text.vListInitialiseItem + 0x00000f34 0x18 ./FreeRTOS_src/list.o + 0x00000f34 vListInitialiseItem + .text.vListInsertEnd + 0x00000f4c 0x50 ./FreeRTOS_src/list.o + 0x00000f4c vListInsertEnd + .text.vListInsert + 0x00000f9c 0x70 ./FreeRTOS_src/list.o + 0x00000f9c vListInsert + .text.vListRemove + 0x0000100c 0x50 ./FreeRTOS_src/list.o + 0x0000100c vListRemove + .text.xTaskGenericCreate + 0x0000105c 0x15c ./FreeRTOS_src/tasks.o + 0x0000105c xTaskGenericCreate + .text.vTaskDelayUntil + 0x000011b8 0x98 ./FreeRTOS_src/tasks.o + 0x000011b8 vTaskDelayUntil + .text.vTaskStartScheduler + 0x00001250 0x5c ./FreeRTOS_src/tasks.o + 0x00001250 vTaskStartScheduler + .text.vTaskSuspendAll + 0x000012ac 0x1c ./FreeRTOS_src/tasks.o + 0x000012ac vTaskSuspendAll + .text.xTaskResumeAll + 0x000012c8 0xf0 ./FreeRTOS_src/tasks.o + 0x000012c8 xTaskResumeAll + .text.xTaskGetTickCount + 0x000013b8 0x24 ./FreeRTOS_src/tasks.o + 0x000013b8 xTaskGetTickCount + .text.vTaskIncrementTick + 0x000013dc 0x12c ./FreeRTOS_src/tasks.o + 0x000013dc vTaskIncrementTick + .text.vTaskSwitchContext + 0x00001508 0x100 ./FreeRTOS_src/tasks.o + 0x00001508 vTaskSwitchContext + .text.prvIdleTask + 0x00001608 0x14 ./FreeRTOS_src/tasks.o + .text.prvInitialiseTCBVariables + 0x0000161c 0x68 ./FreeRTOS_src/tasks.o + .text.prvInitialiseTaskLists + 0x00001684 0x80 ./FreeRTOS_src/tasks.o + .text.prvCheckTasksWaitingTermination + 0x00001704 0x78 ./FreeRTOS_src/tasks.o + .text.prvAddCurrentTaskToDelayedList + 0x0000177c 0x6c ./FreeRTOS_src/tasks.o + .text.prvAllocateTCBAndStack + 0x000017e8 0x64 ./FreeRTOS_src/tasks.o + .text.prvDeleteTCB + 0x0000184c 0x20 ./FreeRTOS_src/tasks.o + .text.pvPortMalloc + 0x0000186c 0x144 ./FreeRTOS_portable/MemMang/heap_2.o + 0x0000186c pvPortMalloc + .text.vPortFree + 0x000019b0 0x74 ./FreeRTOS_portable/MemMang/heap_2.o + 0x000019b0 vPortFree + .text.pxPortInitialiseStack + 0x00001a24 0x50 ./FreeRTOS_portable/port.o + 0x00001a24 pxPortInitialiseStack + .text.vPortSVCHandler + 0x00001a74 0x24 ./FreeRTOS_portable/port.o + 0x00001a74 vPortSVCHandler + .text.vPortStartFirstTask + 0x00001a98 0x18 ./FreeRTOS_portable/port.o + 0x00001a98 vPortStartFirstTask + .text.xPortStartScheduler + 0x00001ab0 0x38 ./FreeRTOS_portable/port.o + 0x00001ab0 xPortStartScheduler + .text.vPortYieldFromISR + 0x00001ae8 0x18 ./FreeRTOS_portable/port.o + 0x00001ae8 vPortYieldFromISR + .text.vPortEnterCritical + 0x00001b00 0x24 ./FreeRTOS_portable/port.o + 0x00001b00 vPortEnterCritical + .text.vPortExitCritical + 0x00001b24 0x2c ./FreeRTOS_portable/port.o + 0x00001b24 vPortExitCritical + .text.xPortPendSVHandler + 0x00001b50 0x40 ./FreeRTOS_portable/port.o + 0x00001b50 xPortPendSVHandler + .text.xPortSysTickHandler + 0x00001b90 0x28 ./FreeRTOS_portable/port.o + 0x00001b90 xPortSysTickHandler + .text.prvSetupTimerInterrupt + 0x00001bb8 0x24 ./FreeRTOS_portable/port.o + .text.accel_write_byte + 0x00001bdc 0x44 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(accelerometer.o) + 0x00001bdc accel_write_byte + .text.accel_read_byte + 0x00001c20 0x54 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(accelerometer.o) + 0x00001c20 accel_read_byte + .text.accel_init + 0x00001c74 0xb4 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(accelerometer.o) + 0x00001c74 accel_init + .text.accel_read + 0x00001d28 0xcc C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(accelerometer.o) + 0x00001d28 accel_read + .text.rnd_32 0x00001df4 0x78 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(custom_rand.o) + 0x00001df4 rnd_32 + .text.init_rnd32 + 0x00001e6c 0x6c C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(custom_rand.o) + 0x00001e6c init_rnd32 + .text.NVIC_EnableIRQ + 0x00001ed8 0x30 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(ethernet_mgt.o) + .text.ENET_IRQHandler + 0x00001f08 0x78 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(ethernet_mgt.o) + 0x00001f08 ENET_IRQHandler + .text.ethernet_init + 0x00001f80 0x4c C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(ethernet_mgt.o) + 0x00001f80 ethernet_init + .text.send_eth + 0x00001fcc 0x64 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(ethernet_mgt.o) + 0x00001fcc send_eth + .text.WriteToPHY + 0x00002030 0x50 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(ethmac.o) + 0x00002030 WriteToPHY + .text.ReadFromPHY + 0x00002080 0x60 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(ethmac.o) + 0x00002080 ReadFromPHY + .text.Init_EthMAC + 0x000020e0 0x3e0 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(ethmac.o) + 0x000020e0 Init_EthMAC + .text.WriteFrame_EthMAC + 0x000024c0 0x28 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(ethmac.o) + 0x000024c0 WriteFrame_EthMAC + .text.ReadFrame_EthMAC + 0x000024e8 0x1c C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(ethmac.o) + 0x000024e8 ReadFrame_EthMAC + .text.RequestSend + 0x00002504 0x50 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(ethmac.o) + 0x00002504 RequestSend + .text.StartReadingFrame + 0x00002554 0x50 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(ethmac.o) + 0x00002554 StartReadingFrame + .text.StopReadingFrame + 0x000025a4 0x34 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(ethmac.o) + 0x000025a4 StopReadingFrame + .text.LCD_RS_ENA + 0x000025d8 0x38 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(lcd.o) + .text.LCD_RS_DIS + 0x00002610 0x38 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(lcd.o) + .text.Write_Cmd_Data + 0x00002648 0x28 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(lcd.o) + 0x00002648 Write_Cmd_Data + .text.Write_Cmd + 0x00002670 0x28 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(lcd.o) + 0x00002670 Write_Cmd + .text.Write_Data + 0x00002698 0x30 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(lcd.o) + 0x00002698 Write_Data + .text.Write_Data_U16 + 0x000026c8 0x28 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(lcd.o) + 0x000026c8 Write_Data_U16 + .text.Delay 0x000026f0 0x30 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(lcd.o) + 0x000026f0 Delay + .text.ILI9341_Initial + 0x00002720 0x220 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(lcd.o) + 0x00002720 ILI9341_Initial + .text.init_lcd + 0x00002940 0x54 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(lcd.o) + 0x00002940 init_lcd + .text.LCD_SetPos + 0x00002994 0xb8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(lcd.o) + 0x00002994 LCD_SetPos + .text.LCD_SetPosR + 0x00002a4c 0x90 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(lcd.o) + 0x00002a4c LCD_SetPosR + .text.read_pixels + 0x00002adc 0xf8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(lcd.o) + 0x00002adc read_pixels + .text.clear_screen + 0x00002bd4 0x4c C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(lcd.o) + 0x00002bd4 clear_screen + .text.lcd_filled_circle + 0x00002c20 0xd8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(lcd.o) + 0x00002c20 lcd_filled_circle + .text.lcd_filled_rectangle + 0x00002cf8 0xa4 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(lcd.o) + 0x00002cf8 lcd_filled_rectangle + .text.lcd_print_char + 0x00002d9c 0x10c C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(lcd.o) + 0x00002d9c lcd_print_char + .text.lcd_print + 0x00002ea8 0xf4 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(lcd.o) + 0x00002ea8 lcd_print + .text.ssp_init_custom + 0x00002f9c 0x84 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(ssp.o) + 0x00002f9c ssp_init_custom + .text.ssp_send_buf + 0x00003020 0x48 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(ssp.o) + 0x00003020 ssp_send_buf + .text.ssp_receive_buf + 0x00003068 0x70 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(ssp.o) + 0x00003068 ssp_receive_buf + .text.NVIC_EnableIRQ + 0x000030d8 0x30 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(traces.o) + .text.NVIC_SetPendingIRQ + 0x00003108 0x34 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(traces.o) + .text.start_timer + 0x0000313c 0xa8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(traces.o) + 0x0000313c start_timer + .text.write_trace_ref + 0x000031e4 0x138 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(traces.o) + 0x000031e4 write_trace_ref + .text.UART0_IRQHandler + 0x0000331c 0x7c C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(traces.o) + 0x0000331c UART0_IRQHandler + .text.init_traces + 0x00003398 0x44 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(traces.o) + 0x00003398 init_traces + .text.uart0_init_ref + 0x000033dc 0x80 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(uart.o) + 0x000033dc uart0_init_ref + .text.init_i2c + 0x0000345c 0xfc C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(I2C.o) + 0x0000345c init_i2c + .text.wait_SI 0x00003558 0x44 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(I2C.o) + 0x00003558 wait_SI + .text.I2C_master_write + 0x0000359c 0xec C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(I2C.o) + 0x0000359c I2C_master_write + .text.I2C_master_read + 0x00003688 0x120 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(I2C.o) + 0x00003688 I2C_master_read + .text.SystemInit + 0x000037a8 0xe4 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\CMSISv2p00_LPC17xx\Debug\libCMSISv2p00_LPC17xx.a(system_LPC17xx.o) + 0x000037a8 SystemInit + .text.__main 0x0000388c 0x14 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(_cr__main.o) + 0x0000388c __CR_SEMIHOST + 0x0000388c __main + .text.memset 0x000038a0 0x4 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(memset.o) + 0x000038a0 memset + .text.malloc 0x000038a4 0xc8 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(alloc.o) + 0x000038a4 malloc + .text.free 0x0000396c 0x30 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(alloc.o) + 0x0000396c free + .text._Csys_alloc + 0x0000399c 0x20 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(alloc.o) + 0x0000399c _Csys_alloc + .text.ceil 0x000039bc 0x90 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(ceil.o) + 0x000039bc ceil + .text.fclose 0x00003a4c 0x6c c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fclose.o) + 0x00003a4c fclose + .text.fflush 0x00003ab8 0x30 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fflush.o) + 0x00003ab8 fflush + .text.floor 0x00003ae8 0x94 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(floor.o) + 0x00003ae8 floor + .text.fp_round + 0x00003b7c 0x4c c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fpprintf.o) + .text.pr_dec.constprop.1 + 0x00003bc8 0x26 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fpprintf.o) + *fill* 0x00003bee 0x2 ff + .text.sprintf 0x00003bf0 0x6c c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fpprintf.o) + 0x00003bf0 sprintf + *fill* 0x00003c5c 0x4 ff + .text.fp_display + 0x00003c60 0x8ec c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fpprintf.o) + .text.vsprintf + 0x0000454c 0x5c c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fpprintf.o) + 0x0000454c vsprintf + .text.vsnprintf + 0x000045a8 0x5c c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fpprintf.o) + 0x000045a8 vsnprintf + .text.printf 0x00004604 0x54 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fpprintf.o) + 0x00004604 printf + .text.fseek 0x00004658 0x110 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fseek.o) + 0x00004658 fseek + .text.ftell 0x00004768 0x4c c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(ftell.o) + 0x00004768 ftell + .text._initio 0x000047b4 0xa4 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(initio.o) + 0x000047b4 _initio + .text._terminateio + 0x00004858 0x44 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(initio.o) + 0x00004858 _terminateio + .text.__vfprintf + 0x0000489c 0xd28 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(printf.o) + 0x0000489c __vfprintf + .text.remove 0x000055c4 0x14 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(remove.o) + 0x000055c4 remove + .text.setvbuf 0x000055d8 0x40 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(setvbuf.o) + 0x000055d8 setvbuf + .text.sqrt 0x00005618 0x11c c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(sqrt.o) + 0x00005618 sqrt + .text.exit 0x00005734 0x2c c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(stdlib.o) + 0x00005734 exit + .text.strlen 0x00005760 0x4a c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(strlen.o) + 0x00005760 strlen + .text.strncpy 0x000057aa 0x56 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(strncpy.o) + 0x000057aa strncpy + .text._sbrk 0x00005800 0x40 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_cr_sbrk.o) + 0x00005800 _sbrk + .text._deferredlazyseek + 0x00005840 0x44 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_deferredlazyseek.o) + 0x00005840 _deferredlazyseek + .text.__flsbuf + 0x00005884 0x140 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_deferredlazyseek.o) + 0x00005884 __flsbuf + .text._do_fflush + 0x000059c4 0x44 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_do_fflush.o) + 0x000059c4 _do_fflush + .text._fdopen 0x00005a08 0x6a c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_fdopen.o) + 0x00005a08 _fdopen + .text._fflush 0x00005a72 0x58 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_fflush.o) + 0x00005a72 _fflush + .text._frexpl 0x00005aca 0x5a c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_frexpl.o) + 0x00005aca _frexpl + .text._ldexpl 0x00005b24 0x4c c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_ldexpl.o) + 0x00005b24 _ldexpl + .text._Cwritebuf + 0x00005b70 0x68 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_writebuf.o) + 0x00005b70 _Cwritebuf + .text.__check_heap_overflow + 0x00005bd8 0x18 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_cr_check_heap.o) + 0x00005bd8 __check_heap_overflow + .text.__aeabi_dmul + 0x00005bf0 0x110 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(double.o) + 0x00005bf0 __aeabi_dmul + .text.__aeabi_ddiv + 0x00005d00 0x138 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(double.o) + 0x00005d00 __aeabi_ddiv + .text.__aeabi_dsub + 0x00005e38 0x1a0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(double.o) + 0x00005e38 __aeabi_dsub + .text.__aeabi_dadd + 0x00005fd8 0x10c c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(double.o) + 0x00005fd8 __aeabi_dadd + .text.__aeabi_d2f + 0x000060e4 0x54 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(double.o) + 0x000060e4 __aeabi_d2f + .text.__aeabi_d2iz + 0x00006138 0x40 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(double.o) + 0x00006138 __aeabi_d2iz + .text.__bhs_ui2d + 0x00006178 0x46 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(double.o) + 0x00006178 __bhs_ui2d + .text.__aeabi_i2d + 0x000061be 0x10 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(double.o) + 0x000061be __aeabi_i2d + .text.__aeabi_dcmpeq + 0x000061ce 0x2c c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(double.o) + 0x000061ce __aeabi_dcmpeq + .text.__aeabi_dcmplt + 0x000061fa 0x54 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(double.o) + 0x000061fa __aeabi_dcmplt + .text.__aeabi_dcmple + 0x0000624e 0x54 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(double.o) + 0x0000624e __aeabi_dcmple + .text.__aeabi_dcmpge + 0x000062a2 0x54 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(double.o) + 0x000062a2 __aeabi_dcmpge + *fill* 0x000062f6 0x2 ff + .text.__aeabi_fmul + 0x000062f8 0xb0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(float.o) + 0x000062f8 __aeabi_fmul + .text.__aeabi_fdiv + 0x000063a8 0xc0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(float.o) + 0x000063a8 __aeabi_fdiv + .text.__aeabi_fsub + 0x00006468 0xe0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(float.o) + 0x00006468 __aeabi_fsub + .text.__aeabi_fadd + 0x00006548 0xac c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(float.o) + 0x00006548 __aeabi_fadd + .text.__bhs_ui2f + 0x000065f4 0x26 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(float.o) + 0x000065f4 __bhs_ui2f + .text.__aeabi_i2f + 0x0000661a 0x10 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(float.o) + 0x0000661a __aeabi_i2f + .text.__aeabi_ui2f + 0x0000662a 0x8 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(float.o) + 0x0000662a __aeabi_ui2f + *fill* 0x00006632 0x2 ff + .text.__aeabi_f2d + 0x00006634 0x38 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(float.o) + 0x00006634 __aeabi_f2d + .text.__aeabi_fcmplt + 0x0000666c 0x3a c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(float.o) + 0x0000666c __aeabi_fcmplt + .text.__aeabi_fcmpgt + 0x000066a6 0x3a c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(float.o) + 0x000066a6 __aeabi_fcmpgt + .text.__aeabi_fcmple + 0x000066e0 0x3e c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(float.o) + 0x000066e0 __aeabi_fcmple + .text.__aeabi_fcmpge + 0x0000671e 0x3e c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(float.o) + 0x0000671e __aeabi_fcmpge + .text.__aeabi_memset_lowlevel + 0x0000675c 0x32 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(memcpy.o) + 0x0000675c __aeabi_lowlevel_memset + *fill* 0x0000678e 0x2 ff + .text.__sys_appexit + 0x00006790 0xc c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_appexit.o) + 0x00006790 __sys_appexit + 0x00006790 __exit + .text.__sys_close + 0x0000679c 0xc c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_close.o) + 0x0000679c __sys_close + .text.__sys_flen + 0x000067a8 0xc c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_flen.o) + 0x000067a8 __sys_flen + .text.__sys_istty + 0x000067b4 0xc c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_istty.o) + 0x000067b4 __sys_istty + .text.__sys_remove + 0x000067c0 0xc c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_remove.o) + 0x000067c0 __sys_remove + .text.__sys_seek + 0x000067cc 0xc c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_seek.o) + 0x000067cc __sys_seek + .text.__sys_tmpnam + 0x000067d8 0xc c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_tmpnam.o) + 0x000067d8 __sys_tmpnam + .text.__sys_write + 0x000067e4 0xc c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_write.o) + 0x000067e4 __sys_write + 0x000067e4 __write + *(.rodata .rodata.* .constdata .constdata.*) + .rodata 0x000067f0 0x5d ./src/labyrinth.o + *fill* 0x0000684d 0x3 ff + .rodata 0x00006850 0x5 ./FreeRTOS_src/tasks.o + *fill* 0x00006855 0x3 ff + .rodata 0x00006858 0x28 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(ethernet_mgt.o) + .rodata 0x00006880 0x37 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(ethmac.o) + *fill* 0x000068b7 0x1 ff + .rodata 0x000068b8 0x19b C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(lcd.o) + *fill* 0x00006a53 0x1 ff + .rodata 0x00006a54 0xcc C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(traces.o) + .rodata.SmallFont + 0x00006b20 0x478 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(fonts.o) + 0x00006b20 SmallFont + .rodata.BigFont + 0x00006f98 0xbe4 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(fonts.o) + 0x00006f98 BigFont + .rodata.str1.1 + 0x00007b7c 0x18 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(alloc.o) + .rodata.str1.1 + 0x00007b94 0x34 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fpprintf.o) + 0x35 (size before relaxing) + .rodata.str1.1 + 0x00007bc8 0x4 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(initio.o) + .rodata.str1.1 + 0x00007bcc 0x31 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(printf.o) + 0x38 (size before relaxing) + *fill* 0x00007bfd 0x3 ff + .rodata.__huge_val + 0x00007c00 0x8 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_hugeval.o) + 0x00007c00 __huge_val + .rodata.__huge_vall + 0x00007c08 0x8 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_hugeval.o) + 0x00007c08 __huge_vall + 0x00007c10 . = ALIGN (0x4) + +.glue_7 0x00007c10 0x0 + .glue_7 0x00007c10 0x0 linker stubs + +.glue_7t 0x00007c10 0x0 + .glue_7t 0x00007c10 0x0 linker stubs + +.vfp11_veneer 0x00007c10 0x0 + .vfp11_veneer 0x00007c10 0x0 linker stubs + +.v4_bx 0x00007c10 0x0 + .v4_bx 0x00007c10 0x0 linker stubs + +.iplt 0x00007c10 0x0 + .iplt 0x00007c10 0x0 ./src/cr_startup_lpc17.o + +.rel.dyn 0x00007c10 0x0 + .rel.iplt 0x00007c10 0x0 ./src/cr_startup_lpc17.o + +.ARM.extab + *(.ARM.extab* .gnu.linkonce.armextab.*) + 0x00007c10 __exidx_start = . + +.ARM.exidx + *(.ARM.exidx* .gnu.linkonce.armexidx.*) + 0x00007c10 __exidx_end = . + 0x00007c10 _etext = . + +.data_RAM2 0x2007c000 0x0 load address 0x00007c10 + FILL mask 0xff + [!provide] PROVIDE (__start_data_RAM2, .) + *(.ramfunc.$RAM2) + *(.ramfunc.$RamAHB32) + *(.data.$RAM2*) + *(.data.$RamAHB32*) + 0x2007c000 . = ALIGN (0x4) + [!provide] PROVIDE (__end_data_RAM2, .) + +.uninit_RESERVED + 0x10000000 0x0 + *(.bss.$RESERVED*) + 0x10000000 . = ALIGN (0x4) + 0x10000000 _end_uninit_RESERVED = . + +.data 0x10000000 0x2a0 load address 0x00007c10 + FILL mask 0xff + 0x10000000 _data = . + *(vtable) + *(.ramfunc*) + *(.data*) + .data.labyrinth_points + 0x10000000 0x128 ./src/labyrinth.o + .data.ball_param_th.5985 + 0x10000128 0x8c ./src/labyrinth.o + .data.previous_id_in + 0x100001b4 0x4 ./FreeRTOS_src/tasks.o + .data.xNextTaskUnblockTime + 0x100001b8 0x4 ./FreeRTOS_src/tasks.o + .data.xFreeBytesRemaining + 0x100001bc 0x4 ./FreeRTOS_portable/MemMang/heap_2.o + .data.uxCriticalNesting + 0x100001c0 0x4 ./FreeRTOS_portable/port.o + .data.olds 0x100001c4 0xdc C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(custom_rand.o) + 0x100001c4 olds + 0x100002a0 . = ALIGN (0x4) + 0x100002a0 _edata = . + +.igot.plt 0x100002a0 0x0 load address 0x00007eb0 + .igot.plt 0x100002a0 0x0 ./src/cr_startup_lpc17.o + +.bss_RAM2 0x2007c000 0x0 + [!provide] PROVIDE (__start_bss_RAM2, .) + *(.bss.$RAM2*) + *(.bss.$RamAHB32*) + 0x2007c000 . = ALIGN ((. != 0x0)?0x4:0x1) + [!provide] PROVIDE (__end_bss_RAM2, .) + +.bss 0x100002a0 0x5774 + 0x100002a0 _bss = . + *(.bss*) + .bss.gpio_int_clr + 0x100002a0 0x4 ./src/gpio.o + .bss.irq_callback_g + 0x100002a4 0x4 ./src/gpio.o + .bss.slave_accel + 0x100002a8 0x14 ./src/labyrinth.o + .bss.finished 0x100002bc 0x1 ./src/labyrinth.o + *fill* 0x100002bd 0x3 + .bss.pxCurrentTCB + 0x100002c0 0x4 ./FreeRTOS_src/tasks.o + 0x100002c0 pxCurrentTCB + .bss.pxReadyTasksLists + 0x100002c4 0x64 ./FreeRTOS_src/tasks.o + .bss.xDelayedTaskList1 + 0x10000328 0x14 ./FreeRTOS_src/tasks.o + .bss.xDelayedTaskList2 + 0x1000033c 0x14 ./FreeRTOS_src/tasks.o + .bss.pxDelayedTaskList + 0x10000350 0x4 ./FreeRTOS_src/tasks.o + .bss.pxOverflowDelayedTaskList + 0x10000354 0x4 ./FreeRTOS_src/tasks.o + .bss.xPendingReadyList + 0x10000358 0x14 ./FreeRTOS_src/tasks.o + .bss.xTasksWaitingTermination + 0x1000036c 0x14 ./FreeRTOS_src/tasks.o + .bss.uxTasksDeleted + 0x10000380 0x4 ./FreeRTOS_src/tasks.o + .bss.xSuspendedTaskList + 0x10000384 0x14 ./FreeRTOS_src/tasks.o + .bss.uxCurrentNumberOfTasks + 0x10000398 0x4 ./FreeRTOS_src/tasks.o + .bss.xTickCount + 0x1000039c 0x4 ./FreeRTOS_src/tasks.o + .bss.uxTopUsedPriority + 0x100003a0 0x4 ./FreeRTOS_src/tasks.o + .bss.uxTopReadyPriority + 0x100003a4 0x4 ./FreeRTOS_src/tasks.o + .bss.xSchedulerRunning + 0x100003a8 0x4 ./FreeRTOS_src/tasks.o + .bss.uxSchedulerSuspended + 0x100003ac 0x4 ./FreeRTOS_src/tasks.o + .bss.uxMissedTicks + 0x100003b0 0x4 ./FreeRTOS_src/tasks.o + .bss.xMissedYield + 0x100003b4 0x4 ./FreeRTOS_src/tasks.o + .bss.xNumOfOverflows + 0x100003b8 0x4 ./FreeRTOS_src/tasks.o + .bss.uxTaskNumber + 0x100003bc 0x4 ./FreeRTOS_src/tasks.o + .bss.xHeap 0x100003c0 0x4c00 ./FreeRTOS_portable/MemMang/heap_2.o + .bss.xStart 0x10004fc0 0x8 ./FreeRTOS_portable/MemMang/heap_2.o + .bss.xEnd 0x10004fc8 0x8 ./FreeRTOS_portable/MemMang/heap_2.o + .bss.xHeapHasBeenInitialised.4128 + 0x10004fd0 0x4 ./FreeRTOS_portable/MemMang/heap_2.o + .bss.i2c_h 0x10004fd4 0x4 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(accelerometer.o) + .bss.rx_irq_callback + 0x10004fd8 0x4 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(ethernet_mgt.o) + .bss.dat 0x10004fdc 0x3c C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(ethernet_mgt.o) + .bss.rx 0x10005018 0x4 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(ethernet_mgt.o) + 0x10005018 rx + .bss.rxptr 0x1000501c 0x4 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(ethmac.o) + .bss.txptr 0x10005020 0x4 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(ethmac.o) + .bss.write_idx + 0x10005024 0x4 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(traces.o) + 0x10005024 write_idx + .bss.read_idx 0x10005028 0x4 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(traces.o) + 0x10005028 read_idx + .bss.int_enabled + 0x1000502c 0x1 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(traces.o) + .bss.trace_init_done + 0x1000502d 0x1 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(traces.o) + *fill* 0x1000502e 0x2 + .bss._extra 0x10005030 0x4 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(initio.o) + 0x10005030 _extra + .bss.__Ciob 0x10005034 0x140 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(stdio.o) + 0x10005034 __Ciob + .bss._exitvector + 0x10005174 0x84 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(stdlib.o) + 0x10005174 _exitvector + .bss._number_of_exit_functions + 0x100051f8 0x4 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(stdlib.o) + 0x100051f8 _number_of_exit_functions + .bss.__heaps 0x100051fc 0x4 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(__init_alloc.o) + 0x100051fc __heaps + .bss.__end_of_heap + 0x10005200 0x4 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(__init_alloc.o) + 0x10005200 __end_of_heap + .bss.errno 0x10005204 0x4 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(errno.o) + 0x10005204 errno + *(COMMON) + COMMON 0x10005208 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(custom_rand.o) + 0x10005208 _j + 0x1000520c _k + COMMON 0x10005210 0x804 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(traces.o) + 0x10005210 timer_counter + 0x10005214 trace_buffer + 0x10005a14 . = ALIGN (0x4) + 0x10005a14 _ebss = . + [!provide] PROVIDE (end, .) + +.noinit_RAM2 0x2007c000 0x0 + *(.noinit.$RAM2*) + *(.noinit.$RamAHB32*) + 0x2007c000 . = ALIGN (0x4) + +.noinit 0x10005a14 0x0 + 0x10005a14 _noinit = . + *(.noinit*) + 0x10005a14 . = ALIGN (0x4) + 0x10005a14 _end_noinit = . + 0x10005a14 PROVIDE (_pvHeapStart, DEFINED (__user_heap_base)?__user_heap_base:.) + 0x10008000 PROVIDE (_vStackTop, DEFINED (__user_stack_top)?__user_stack_top:(__top_RamLoc32 - 0x0)) + [!provide] PROVIDE (__valid_user_code_checksum, (0x0 - ((((((_vStackTop + (ResetISR + 0x1)) + (NMI_Handler + 0x1)) + (HardFault_Handler + 0x1)) + (DEFINED (MemManage_Handler)?MemManage_Handler:0x0 + 0x1)) + (DEFINED (BusFault_Handler)?BusFault_Handler:0x0 + 0x1)) + (DEFINED (UsageFault_Handler)?UsageFault_Handler:0x0 + 0x1)))) +OUTPUT(TP1_labyrinth.axf elf32-littlearm) + +.debug_info 0x00000000 0x753b + .debug_info 0x00000000 0x259 ./src/cr_startup_lpc17.o + .debug_info 0x00000259 0xa41 ./src/gpio.o + .debug_info 0x00000c9a 0x6f9 ./src/labyrinth.o + .debug_info 0x00001393 0x2a0 ./src/tools.o + .debug_info 0x00001633 0xd7 ./src/trace_mgt.o + .debug_info 0x0000170a 0x264 ./FreeRTOS_src/list.o + .debug_info 0x0000196e 0xcbb ./FreeRTOS_src/tasks.o + .debug_info 0x00002629 0x295 ./FreeRTOS_portable/MemMang/heap_2.o + .debug_info 0x000028be 0x1c6 ./FreeRTOS_portable/port.o + .debug_info 0x00002a84 0x362 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(accelerometer.o) + .debug_info 0x00002de6 0x126 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(custom_rand.o) + .debug_info 0x00002f0c 0x7d8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(ethernet_mgt.o) + .debug_info 0x000036e4 0x9cb C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(ethmac.o) + .debug_info 0x000040af 0x129f C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(lcd.o) + .debug_info 0x0000534e 0x5ab C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(ssp.o) + .debug_info 0x000058f9 0xa05 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(traces.o) + .debug_info 0x000062fe 0x672 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(uart.o) + .debug_info 0x00006970 0x809 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(I2C.o) + .debug_info 0x00007179 0xaa C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(fonts.o) + .debug_info 0x00007223 0x318 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\CMSISv2p00_LPC17xx\Debug\libCMSISv2p00_LPC17xx.a(system_LPC17xx.o) + +.debug_abbrev 0x00000000 0x1b19 + .debug_abbrev 0x00000000 0x100 ./src/cr_startup_lpc17.o + .debug_abbrev 0x00000100 0x215 ./src/gpio.o + .debug_abbrev 0x00000315 0x176 ./src/labyrinth.o + .debug_abbrev 0x0000048b 0x122 ./src/tools.o + .debug_abbrev 0x000005ad 0x8a ./src/trace_mgt.o + .debug_abbrev 0x00000637 0xbf ./FreeRTOS_src/list.o + .debug_abbrev 0x000006f6 0x1ec ./FreeRTOS_src/tasks.o + .debug_abbrev 0x000008e2 0x16b ./FreeRTOS_portable/MemMang/heap_2.o + .debug_abbrev 0x00000a4d 0x11d ./FreeRTOS_portable/port.o + .debug_abbrev 0x00000b6a 0x111 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(accelerometer.o) + .debug_abbrev 0x00000c7b 0xc2 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(custom_rand.o) + .debug_abbrev 0x00000d3d 0x1fc C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(ethernet_mgt.o) + .debug_abbrev 0x00000f39 0x205 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(ethmac.o) + .debug_abbrev 0x0000113e 0x274 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(lcd.o) + .debug_abbrev 0x000013b2 0x13a C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(ssp.o) + .debug_abbrev 0x000014ec 0x21e C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(traces.o) + .debug_abbrev 0x0000170a 0x18b C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(uart.o) + .debug_abbrev 0x00001895 0x156 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(I2C.o) + .debug_abbrev 0x000019eb 0x48 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(fonts.o) + .debug_abbrev 0x00001a33 0xe6 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\CMSISv2p00_LPC17xx\Debug\libCMSISv2p00_LPC17xx.a(system_LPC17xx.o) + +.debug_aranges 0x00000000 0x680 + .debug_aranges + 0x00000000 0x68 ./src/cr_startup_lpc17.o + .debug_aranges + 0x00000068 0x40 ./src/gpio.o + .debug_aranges + 0x000000a8 0x30 ./src/labyrinth.o + .debug_aranges + 0x000000d8 0x30 ./src/tools.o + .debug_aranges + 0x00000108 0x20 ./src/trace_mgt.o + .debug_aranges + 0x00000128 0x40 ./FreeRTOS_src/list.o + .debug_aranges + 0x00000168 0x120 ./FreeRTOS_src/tasks.o + .debug_aranges + 0x00000288 0x38 ./FreeRTOS_portable/MemMang/heap_2.o + .debug_aranges + 0x000002c0 0x70 ./FreeRTOS_portable/port.o + .debug_aranges + 0x00000330 0x38 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(accelerometer.o) + .debug_aranges + 0x00000368 0x28 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(custom_rand.o) + .debug_aranges + 0x00000390 0x40 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(ethernet_mgt.o) + .debug_aranges + 0x000003d0 0x68 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(ethmac.o) + .debug_aranges + 0x00000438 0x110 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(lcd.o) + .debug_aranges + 0x00000548 0x30 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(ssp.o) + .debug_aranges + 0x00000578 0x50 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(traces.o) + .debug_aranges + 0x000005c8 0x30 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(uart.o) + .debug_aranges + 0x000005f8 0x48 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(I2C.o) + .debug_aranges + 0x00000640 0x18 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(fonts.o) + .debug_aranges + 0x00000658 0x28 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\CMSISv2p00_LPC17xx\Debug\libCMSISv2p00_LPC17xx.a(system_LPC17xx.o) + +.debug_ranges 0x00000000 0x568 + .debug_ranges 0x00000000 0x58 ./src/cr_startup_lpc17.o + .debug_ranges 0x00000058 0x30 ./src/gpio.o + .debug_ranges 0x00000088 0x20 ./src/labyrinth.o + .debug_ranges 0x000000a8 0x20 ./src/tools.o + .debug_ranges 0x000000c8 0x10 ./src/trace_mgt.o + .debug_ranges 0x000000d8 0x30 ./FreeRTOS_src/list.o + .debug_ranges 0x00000108 0x110 ./FreeRTOS_src/tasks.o + .debug_ranges 0x00000218 0x28 ./FreeRTOS_portable/MemMang/heap_2.o + .debug_ranges 0x00000240 0x60 ./FreeRTOS_portable/port.o + .debug_ranges 0x000002a0 0x28 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(accelerometer.o) + .debug_ranges 0x000002c8 0x18 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(custom_rand.o) + .debug_ranges 0x000002e0 0x30 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(ethernet_mgt.o) + .debug_ranges 0x00000310 0x58 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(ethmac.o) + .debug_ranges 0x00000368 0x130 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(lcd.o) + .debug_ranges 0x00000498 0x20 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(ssp.o) + .debug_ranges 0x000004b8 0x40 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(traces.o) + .debug_ranges 0x000004f8 0x20 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(uart.o) + .debug_ranges 0x00000518 0x38 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(I2C.o) + .debug_ranges 0x00000550 0x18 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\CMSISv2p00_LPC17xx\Debug\libCMSISv2p00_LPC17xx.a(system_LPC17xx.o) + +.debug_macro 0x00000000 0x3e30 + .debug_macro 0x00000000 0x52 ./src/cr_startup_lpc17.o + .debug_macro 0x00000052 0x892 ./src/cr_startup_lpc17.o + .debug_macro 0x000008e4 0x10 ./src/cr_startup_lpc17.o + .debug_macro 0x000008f4 0x12d ./src/cr_startup_lpc17.o + .debug_macro 0x00000a21 0x5b2 ./src/cr_startup_lpc17.o + .debug_macro 0x00000fd3 0x8e ./src/gpio.o + .debug_macro 0x00001061 0x22 ./src/gpio.o + .debug_macro 0x00001083 0x219 ./src/labyrinth.o + .debug_macro 0x0000129c 0x22 ./src/labyrinth.o + .debug_macro 0x000012be 0xc4 ./src/labyrinth.o + .debug_macro 0x00001382 0x150 ./src/labyrinth.o + .debug_macro 0x000014d2 0x1c ./src/labyrinth.o + .debug_macro 0x000014ee 0x28 ./src/labyrinth.o + .debug_macro 0x00001516 0x1c ./src/labyrinth.o + .debug_macro 0x00001532 0xc2 ./src/labyrinth.o + .debug_macro 0x000015f4 0xd6 ./src/labyrinth.o + .debug_macro 0x000016ca 0x22 ./src/labyrinth.o + .debug_macro 0x000016ec 0x1c ./src/labyrinth.o + .debug_macro 0x00001708 0x10 ./src/labyrinth.o + .debug_macro 0x00001718 0xc0 ./src/tools.o + .debug_macro 0x000017d8 0xc4 ./src/tools.o + .debug_macro 0x0000189c 0x1c ./src/tools.o + .debug_macro 0x000018b8 0x135 ./src/trace_mgt.o + .debug_macro 0x000019ed 0x16 ./src/trace_mgt.o + .debug_macro 0x00001a03 0x9d ./FreeRTOS_src/list.o + .debug_macro 0x00001aa0 0x28 ./FreeRTOS_src/list.o + .debug_macro 0x00001ac8 0x130 ./FreeRTOS_src/tasks.o + .debug_macro 0x00001bf8 0x61 ./FreeRTOS_src/tasks.o + .debug_macro 0x00001c59 0x16 ./FreeRTOS_src/tasks.o + .debug_macro 0x00001c6f 0xcb ./FreeRTOS_portable/MemMang/heap_2.o + .debug_macro 0x00001d3a 0xda ./FreeRTOS_portable/port.o + .debug_macro 0x00001e14 0xaf C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(accelerometer.o) + .debug_macro 0x00001ec3 0x898 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(accelerometer.o) + .debug_macro 0x0000275b 0x52 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(accelerometer.o) + .debug_macro 0x000027ad 0x46 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(custom_rand.o) + .debug_macro 0x000027f3 0xd4 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(ethernet_mgt.o) + .debug_macro 0x000028c7 0x9a C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(ethernet_mgt.o) + .debug_macro 0x00002961 0x7c C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(ethernet_mgt.o) + .debug_macro 0x000029dd 0x82 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(ethernet_mgt.o) + .debug_macro 0x00002a5f 0x5c3 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(ethernet_mgt.o) + .debug_macro 0x00003022 0xa9 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(ethmac.o) + .debug_macro 0x000030cb 0x108 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(lcd.o) + .debug_macro 0x000031d3 0x90 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(ssp.o) + .debug_macro 0x00003263 0x22 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(ssp.o) + .debug_macro 0x00003285 0xcf C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(traces.o) + .debug_macro 0x00003354 0x84 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(uart.o) + .debug_macro 0x000033d8 0x8d C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(I2C.o) + .debug_macro 0x00003465 0x1a C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(fonts.o) + .debug_macro 0x0000347f 0x12b C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\CMSISv2p00_LPC17xx\Debug\libCMSISv2p00_LPC17xx.a(system_LPC17xx.o) + .debug_macro 0x000035aa 0x886 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\CMSISv2p00_LPC17xx\Debug\libCMSISv2p00_LPC17xx.a(system_LPC17xx.o) + +.debug_line 0x00000000 0x3c9a + .debug_line 0x00000000 0x1e2 ./src/cr_startup_lpc17.o + .debug_line 0x000001e2 0x273 ./src/gpio.o + .debug_line 0x00000455 0x41c ./src/labyrinth.o + .debug_line 0x00000871 0x32f ./src/tools.o + .debug_line 0x00000ba0 0x297 ./src/trace_mgt.o + .debug_line 0x00000e37 0x21e ./FreeRTOS_src/list.o + .debug_line 0x00001055 0x709 ./FreeRTOS_src/tasks.o + .debug_line 0x0000175e 0x256 ./FreeRTOS_portable/MemMang/heap_2.o + .debug_line 0x000019b4 0x268 ./FreeRTOS_portable/port.o + .debug_line 0x00001c1c 0x299 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(accelerometer.o) + .debug_line 0x00001eb5 0x19e C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(custom_rand.o) + .debug_line 0x00002053 0x320 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(ethernet_mgt.o) + .debug_line 0x00002373 0x3db C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(ethmac.o) + .debug_line 0x0000274e 0x80d C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(lcd.o) + .debug_line 0x00002f5b 0x25a C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(ssp.o) + .debug_line 0x000031b5 0x30e C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(traces.o) + .debug_line 0x000034c3 0x221 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(uart.o) + .debug_line 0x000036e4 0x360 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(I2C.o) + .debug_line 0x00003a44 0x83 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(fonts.o) + .debug_line 0x00003ac7 0x1d3 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\CMSISv2p00_LPC17xx\Debug\libCMSISv2p00_LPC17xx.a(system_LPC17xx.o) + +.debug_str 0x00000000 0x10bd5 + .debug_str 0x00000000 0x3d87 ./src/cr_startup_lpc17.o + 0x3e06 (size before relaxing) + .debug_str 0x00003d87 0x472f ./src/gpio.o + 0x83c7 (size before relaxing) + .debug_str 0x000084b6 0x3cfe ./src/labyrinth.o + 0xbc14 (size before relaxing) + .debug_str 0x0000c1b4 0x56 ./src/tools.o + 0x88bd (size before relaxing) + .debug_str 0x0000c20a 0x74 ./src/trace_mgt.o + 0xa916 (size before relaxing) + .debug_str 0x0000c27e 0x135 ./FreeRTOS_src/list.o + 0x453a (size before relaxing) + .debug_str 0x0000c3b3 0x11c8 ./FreeRTOS_src/tasks.o + 0x5bff (size before relaxing) + .debug_str 0x0000d57b 0x45f ./FreeRTOS_portable/MemMang/heap_2.o + 0x4bfd (size before relaxing) + .debug_str 0x0000d9da 0x368 ./FreeRTOS_portable/port.o + 0x4a62 (size before relaxing) + .debug_str 0x0000dd42 0x267 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(accelerometer.o) + 0x8393 (size before relaxing) + .debug_str 0x0000dfa9 0x31 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(custom_rand.o) + 0x3cb0 (size before relaxing) + .debug_str 0x0000dfda 0x1e3b C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(ethernet_mgt.o) + 0xa130 (size before relaxing) + .debug_str 0x0000fe15 0x227 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(ethmac.o) + 0x9a75 (size before relaxing) + .debug_str 0x0001003c 0x412 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(lcd.o) + 0x9006 (size before relaxing) + .debug_str 0x0001044e 0xa7 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(ssp.o) + 0x80e2 (size before relaxing) + .debug_str 0x000104f5 0x17f C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(traces.o) + 0x85c5 (size before relaxing) + .debug_str 0x00010674 0x45 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(uart.o) + 0x8063 (size before relaxing) + .debug_str 0x000106b9 0xe5 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(I2C.o) + 0x823f (size before relaxing) + .debug_str 0x0001079e 0x1f C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(fonts.o) + 0x2587 (size before relaxing) + .debug_str 0x000107bd 0x418 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\CMSISv2p00_LPC17xx\Debug\libCMSISv2p00_LPC17xx.a(system_LPC17xx.o) + 0x814e (size before relaxing) + +.comment 0x00000000 0xdc + .comment 0x00000000 0x6e ./src/cr_startup_lpc17.o + 0x6f (size before relaxing) + .comment 0x0000006e 0x6f ./src/gpio.o + .comment 0x0000006e 0x6f ./src/labyrinth.o + .comment 0x0000006e 0x6f ./src/tools.o + .comment 0x0000006e 0x6f ./src/trace_mgt.o + .comment 0x0000006e 0x6f ./FreeRTOS_src/list.o + .comment 0x0000006e 0x6f ./FreeRTOS_src/tasks.o + .comment 0x0000006e 0x6f ./FreeRTOS_portable/MemMang/heap_2.o + .comment 0x0000006e 0x6f ./FreeRTOS_portable/port.o + .comment 0x0000006e 0x6f C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(accelerometer.o) + .comment 0x0000006e 0x6f C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(custom_rand.o) + .comment 0x0000006e 0x6f C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(ethernet_mgt.o) + .comment 0x0000006e 0x6f C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(ethmac.o) + .comment 0x0000006e 0x6f C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(lcd.o) + .comment 0x0000006e 0x6f C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(ssp.o) + .comment 0x0000006e 0x6f C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(traces.o) + .comment 0x0000006e 0x6f C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(uart.o) + .comment 0x0000006e 0x6f C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(I2C.o) + .comment 0x0000006e 0x6f C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(fonts.o) + .comment 0x0000006e 0x6f C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\CMSISv2p00_LPC17xx\Debug\libCMSISv2p00_LPC17xx.a(system_LPC17xx.o) + .comment 0x0000006e 0x6e c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(_cr__main.o) + 0x6f (size before relaxing) + .comment 0x000000dc 0x6f c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(memset.o) + .comment 0x000000dc 0x6f c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(alloc.o) + .comment 0x000000dc 0x6f c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(ceil.o) + .comment 0x000000dc 0x6f c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fclose.o) + .comment 0x000000dc 0x6f c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fflush.o) + .comment 0x000000dc 0x6f c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(floor.o) + .comment 0x000000dc 0x6f c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fpprintf.o) + .comment 0x000000dc 0x6f c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fseek.o) + .comment 0x000000dc 0x6f c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(ftell.o) + .comment 0x000000dc 0x6f c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(initio.o) + .comment 0x000000dc 0x6f c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(printf.o) + .comment 0x000000dc 0x6f c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(remove.o) + .comment 0x000000dc 0x6f c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(setvbuf.o) + .comment 0x000000dc 0x6f c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(sqrt.o) + .comment 0x000000dc 0x6f c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(stdio.o) + .comment 0x000000dc 0x6f c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(stdlib.o) + .comment 0x000000dc 0x6f c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(strlen.o) + .comment 0x000000dc 0x6f c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(strncpy.o) + .comment 0x000000dc 0x6f c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(__init_alloc.o) + .comment 0x000000dc 0x6f c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_cr_sbrk.o) + .comment 0x000000dc 0x6f c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_deferredlazyseek.o) + .comment 0x000000dc 0x6f c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_do_fflush.o) + .comment 0x000000dc 0x6f c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_fdopen.o) + .comment 0x000000dc 0x6f c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_fflush.o) + .comment 0x000000dc 0x6f c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_frexpl.o) + .comment 0x000000dc 0x6f c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_hugeval.o) + .comment 0x000000dc 0x6f c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_ldexpl.o) + .comment 0x000000dc 0x6f c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_writebuf.o) + .comment 0x000000dc 0x6f c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(errno.o) + .comment 0x000000dc 0x6f c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_cr_check_heap.o) + .comment 0x000000dc 0x6f c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(double.o) + .comment 0x000000dc 0x6f c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(float.o) + +.ARM.attributes + 0x00000000 0x31 + .ARM.attributes + 0x00000000 0x33 ./src/cr_startup_lpc17.o + .ARM.attributes + 0x00000033 0x33 ./src/gpio.o + .ARM.attributes + 0x00000066 0x33 ./src/labyrinth.o + .ARM.attributes + 0x00000099 0x33 ./src/tools.o + .ARM.attributes + 0x000000cc 0x33 ./src/trace_mgt.o + .ARM.attributes + 0x000000ff 0x33 ./FreeRTOS_src/list.o + .ARM.attributes + 0x00000132 0x33 ./FreeRTOS_src/tasks.o + .ARM.attributes + 0x00000165 0x33 ./FreeRTOS_portable/MemMang/heap_2.o + .ARM.attributes + 0x00000198 0x33 ./FreeRTOS_portable/port.o + .ARM.attributes + 0x000001cb 0x33 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(accelerometer.o) + .ARM.attributes + 0x000001fe 0x33 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(custom_rand.o) + .ARM.attributes + 0x00000231 0x33 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(ethernet_mgt.o) + .ARM.attributes + 0x00000264 0x33 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(ethmac.o) + .ARM.attributes + 0x00000297 0x33 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(lcd.o) + .ARM.attributes + 0x000002ca 0x33 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(ssp.o) + .ARM.attributes + 0x000002fd 0x33 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(traces.o) + .ARM.attributes + 0x00000330 0x33 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(uart.o) + .ARM.attributes + 0x00000363 0x33 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(I2C.o) + .ARM.attributes + 0x00000396 0x33 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(fonts.o) + .ARM.attributes + 0x000003c9 0x33 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\CMSISv2p00_LPC17xx\Debug\libCMSISv2p00_LPC17xx.a(system_LPC17xx.o) + .ARM.attributes + 0x000003fc 0x33 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(_cr__main.o) + .ARM.attributes + 0x0000042f 0x33 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(memset.o) + .ARM.attributes + 0x00000462 0x33 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(alloc.o) + .ARM.attributes + 0x00000495 0x33 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(ceil.o) + .ARM.attributes + 0x000004c8 0x33 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fclose.o) + .ARM.attributes + 0x000004fb 0x33 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fflush.o) + .ARM.attributes + 0x0000052e 0x33 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(floor.o) + .ARM.attributes + 0x00000561 0x33 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fpprintf.o) + .ARM.attributes + 0x00000594 0x33 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fseek.o) + .ARM.attributes + 0x000005c7 0x33 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(ftell.o) + .ARM.attributes + 0x000005fa 0x33 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(initio.o) + .ARM.attributes + 0x0000062d 0x33 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(printf.o) + .ARM.attributes + 0x00000660 0x33 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(remove.o) + .ARM.attributes + 0x00000693 0x33 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(setvbuf.o) + .ARM.attributes + 0x000006c6 0x33 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(sqrt.o) + .ARM.attributes + 0x000006f9 0x33 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(stdio.o) + .ARM.attributes + 0x0000072c 0x33 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(stdlib.o) + .ARM.attributes + 0x0000075f 0x33 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(strlen.o) + .ARM.attributes + 0x00000792 0x33 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(strncpy.o) + .ARM.attributes + 0x000007c5 0x33 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(__init_alloc.o) + .ARM.attributes + 0x000007f8 0x33 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_cr_sbrk.o) + .ARM.attributes + 0x0000082b 0x33 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_deferredlazyseek.o) + .ARM.attributes + 0x0000085e 0x33 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_do_fflush.o) + .ARM.attributes + 0x00000891 0x33 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_fdopen.o) + .ARM.attributes + 0x000008c4 0x33 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_fflush.o) + .ARM.attributes + 0x000008f7 0x33 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_frexpl.o) + .ARM.attributes + 0x0000092a 0x33 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_hugeval.o) + .ARM.attributes + 0x0000095d 0x33 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_ldexpl.o) + .ARM.attributes + 0x00000990 0x33 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_writebuf.o) + .ARM.attributes + 0x000009c3 0x33 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(errno.o) + .ARM.attributes + 0x000009f6 0x33 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_cr_check_heap.o) + .ARM.attributes + 0x00000a29 0x33 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(double.o) + .ARM.attributes + 0x00000a5c 0x33 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(float.o) + .ARM.attributes + 0x00000a8f 0x21 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(memcpy.o) + .ARM.attributes + 0x00000ab0 0x21 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_appexit.o) + .ARM.attributes + 0x00000ad1 0x21 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_close.o) + .ARM.attributes + 0x00000af2 0x21 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_flen.o) + .ARM.attributes + 0x00000b13 0x21 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_istty.o) + .ARM.attributes + 0x00000b34 0x21 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_remove.o) + .ARM.attributes + 0x00000b55 0x21 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_seek.o) + .ARM.attributes + 0x00000b76 0x21 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_tmpnam.o) + .ARM.attributes + 0x00000b97 0x21 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_write.o) + +.debug_frame 0x00000000 0x15e0 + .debug_frame 0x00000000 0x128 ./src/cr_startup_lpc17.o + .debug_frame 0x00000128 0xcc ./src/gpio.o + .debug_frame 0x000001f4 0x88 ./src/labyrinth.o + .debug_frame 0x0000027c 0x90 ./src/tools.o + .debug_frame 0x0000030c 0x34 ./src/trace_mgt.o + .debug_frame 0x00000340 0xd8 ./FreeRTOS_src/list.o + .debug_frame 0x00000418 0x4b4 ./FreeRTOS_src/tasks.o + .debug_frame 0x000008cc 0x98 ./FreeRTOS_portable/MemMang/heap_2.o + .debug_frame 0x00000964 0x148 ./FreeRTOS_portable/port.o + .debug_frame 0x00000aac 0xa0 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(accelerometer.o) + .debug_frame 0x00000b4c 0x5c C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(custom_rand.o) + .debug_frame 0x00000ba8 0xc8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(ethernet_mgt.o) + .debug_frame 0x00000c70 0x18c C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(ethmac.o) + .debug_frame 0x00000dfc 0x490 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(lcd.o) + .debug_frame 0x0000128c 0x88 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(ssp.o) + .debug_frame 0x00001314 0x11c C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(traces.o) + .debug_frame 0x00001430 0x7c C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(uart.o) + .debug_frame 0x000014ac 0xf8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth\Debug\libMylab_lib.a(I2C.o) + .debug_frame 0x000015a4 0x3c C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\CMSISv2p00_LPC17xx\Debug\libCMSISv2p00_LPC17xx.a(system_LPC17xx.o) diff --git a/TP1_labyrinth_etu/Debug/TP1_labyrinth_Debug.ld b/TP1_labyrinth_etu/Debug/TP1_labyrinth_Debug.ld new file mode 100644 index 0000000000000000000000000000000000000000..d8d03551227e36c49dbbb3a39b0119f4f9a27491 --- /dev/null +++ b/TP1_labyrinth_etu/Debug/TP1_labyrinth_Debug.ld @@ -0,0 +1,151 @@ +/* + * GENERATED FILE - DO NOT EDIT + * (c) Code Red Technologies Ltd, 2008-2013 + * (c) NXP Semiconductors 2013-2018 + * Generated linker script file for LPC1769 + * Created from linkscript.ldt by FMCreateLinkLibraries + * Using Freemarker v2.3.23 + * LPCXpresso v8.2.2 [Build 650] [2016-09-09] on 11 juin 2018 18:05:21 + */ + +INCLUDE "TP1_labyrinth_Debug_library.ld" +INCLUDE "TP1_labyrinth_Debug_memory.ld" + +ENTRY(ResetISR) + +SECTIONS +{ + /* MAIN TEXT SECTION */ + .text : ALIGN(4) + { + FILL(0xff) + __vectors_start__ = ABSOLUTE(.) ; + KEEP(*(.isr_vector)) + /* Global Section Table */ + . = ALIGN(4) ; + __section_table_start = .; + __data_section_table = .; + LONG(LOADADDR(.data)); + LONG( ADDR(.data)); + LONG( SIZEOF(.data)); + LONG(LOADADDR(.data_RAM2)); + LONG( ADDR(.data_RAM2)); + LONG( SIZEOF(.data_RAM2)); + __data_section_table_end = .; + __bss_section_table = .; + LONG( ADDR(.bss)); + LONG( SIZEOF(.bss)); + LONG( ADDR(.bss_RAM2)); + LONG( SIZEOF(.bss_RAM2)); + __bss_section_table_end = .; + __section_table_end = . ; + /* End of Global Section Table */ + + *(.after_vectors*) + + } >MFlash512 + + .text : ALIGN(4) + { + *(.text*) + *(.rodata .rodata.* .constdata .constdata.*) + . = ALIGN(4); + } > MFlash512 + /* + * for exception handling/unwind - some Newlib functions (in common + * with C++ and STDC++) use this. + */ + .ARM.extab : ALIGN(4) + { + *(.ARM.extab* .gnu.linkonce.armextab.*) + } > MFlash512 + __exidx_start = .; + + .ARM.exidx : ALIGN(4) + { + *(.ARM.exidx* .gnu.linkonce.armexidx.*) + } > MFlash512 + __exidx_end = .; + + _etext = .; + + /* DATA section for RamAHB32 */ + .data_RAM2 : ALIGN(4) + { + FILL(0xff) + PROVIDE(__start_data_RAM2 = .) ; + *(.ramfunc.$RAM2) + *(.ramfunc.$RamAHB32) + *(.data.$RAM2*) + *(.data.$RamAHB32*) + . = ALIGN(4) ; + PROVIDE(__end_data_RAM2 = .) ; + } > RamAHB32 AT>MFlash512 + + /* MAIN DATA SECTION */ + .uninit_RESERVED : ALIGN(4) + { + KEEP(*(.bss.$RESERVED*)) + . = ALIGN(4) ; + _end_uninit_RESERVED = .; + } > RamLoc32 + /* Main DATA section (RamLoc32) */ + .data : ALIGN(4) + { + FILL(0xff) + _data = . ; + *(vtable) + *(.ramfunc*) + *(.data*) + . = ALIGN(4) ; + _edata = . ; + } > RamLoc32 AT>MFlash512 + /* BSS section for RamAHB32 */ + .bss_RAM2 : ALIGN(4) + { + PROVIDE(__start_bss_RAM2 = .) ; + *(.bss.$RAM2*) + *(.bss.$RamAHB32*) + . = ALIGN (. != 0 ? 4 : 1) ; /* avoid empty segment */ + PROVIDE(__end_bss_RAM2 = .) ; + } > RamAHB32 + /* MAIN BSS SECTION */ + .bss : ALIGN(4) + { + _bss = .; + *(.bss*) + *(COMMON) + . = ALIGN(4) ; + _ebss = .; + PROVIDE(end = .); + } > RamLoc32 + /* NOINIT section for RamAHB32 */ + .noinit_RAM2 (NOLOAD) : ALIGN(4) + { + *(.noinit.$RAM2*) + *(.noinit.$RamAHB32*) + . = ALIGN(4) ; + } > RamAHB32 + /* DEFAULT NOINIT SECTION */ + .noinit (NOLOAD): ALIGN(4) + { + _noinit = .; + *(.noinit*) + . = ALIGN(4) ; + _end_noinit = .; + } > RamLoc32 + + PROVIDE(_pvHeapStart = DEFINED(__user_heap_base) ? __user_heap_base : .); + PROVIDE(_vStackTop = DEFINED(__user_stack_top) ? __user_stack_top : __top_RamLoc32 - 0); + + /* ## Create checksum value (used in startup) ## */ + PROVIDE(__valid_user_code_checksum = 0 - + (_vStackTop + + (ResetISR + 1) + + (NMI_Handler + 1) + + (HardFault_Handler + 1) + + (( DEFINED(MemManage_Handler) ? MemManage_Handler : 0 ) + 1) /* MemManage_Handler may not be defined */ + + (( DEFINED(BusFault_Handler) ? BusFault_Handler : 0 ) + 1) /* BusFault_Handler may not be defined */ + + (( DEFINED(UsageFault_Handler) ? UsageFault_Handler : 0 ) + 1) /* UsageFault_Handler may not be defined */ + ) ); +} \ No newline at end of file diff --git a/TP1_labyrinth_etu/Debug/TP1_labyrinth_Debug_library.ld b/TP1_labyrinth_etu/Debug/TP1_labyrinth_Debug_library.ld new file mode 100644 index 0000000000000000000000000000000000000000..e2f9dd7bdb712d2b551f82868abe46d9a24eedd0 --- /dev/null +++ b/TP1_labyrinth_etu/Debug/TP1_labyrinth_Debug_library.ld @@ -0,0 +1,15 @@ +/* + * GENERATED FILE - DO NOT EDIT + * (c) Code Red Technologies Ltd, 2008-2013 + * (c) NXP Semiconductors 2013-2018 + * Generated linker script file for LPC1769 + * Created from library.ldt by FMCreateLinkLibraries + * Using Freemarker v2.3.23 + * LPCXpresso v8.2.2 [Build 650] [2016-09-09] on 11 juin 2018 18:05:21 + */ + +GROUP ( + libcr_semihost.a + libcr_c.a + libcr_eabihelpers.a +) diff --git a/TP1_labyrinth_etu/Debug/TP1_labyrinth_Debug_memory.ld b/TP1_labyrinth_etu/Debug/TP1_labyrinth_Debug_memory.ld new file mode 100644 index 0000000000000000000000000000000000000000..9881165cc3395de49b9930f4d66f528c3714b918 --- /dev/null +++ b/TP1_labyrinth_etu/Debug/TP1_labyrinth_Debug_memory.ld @@ -0,0 +1,31 @@ +/* + * GENERATED FILE - DO NOT EDIT + * (c) Code Red Technologies Ltd, 2008-2013 + * (c) NXP Semiconductors 2013-2018 + * Generated linker script file for LPC1769 + * Created from memory.ldt by FMCreateLinkMemory + * Using Freemarker v2.3.23 + * LPCXpresso v8.2.2 [Build 650] [2016-09-09] on 11 juin 2018 18:05:21 + */ + +MEMORY +{ + /* Define each memory region */ + MFlash512 (rx) : ORIGIN = 0x0, LENGTH = 0x80000 /* 512K bytes (alias Flash) */ + RamLoc32 (rwx) : ORIGIN = 0x10000000, LENGTH = 0x8000 /* 32K bytes (alias RAM) */ + RamAHB32 (rwx) : ORIGIN = 0x2007c000, LENGTH = 0x8000 /* 32K bytes (alias RAM2) */ +} + + /* Define a symbol for the top of each memory region */ + __base_MFlash512 = 0x0 ; /* MFlash512 */ + __base_Flash = 0x0 ; /* Flash */ + __top_MFlash512 = 0x0 + 0x80000 ; /* 512K bytes */ + __top_Flash = 0x0 + 0x80000 ; /* 512K bytes */ + __base_RamLoc32 = 0x10000000 ; /* RamLoc32 */ + __base_RAM = 0x10000000 ; /* RAM */ + __top_RamLoc32 = 0x10000000 + 0x8000 ; /* 32K bytes */ + __top_RAM = 0x10000000 + 0x8000 ; /* 32K bytes */ + __base_RamAHB32 = 0x2007c000 ; /* RamAHB32 */ + __base_RAM2 = 0x2007c000 ; /* RAM2 */ + __top_RamAHB32 = 0x2007c000 + 0x8000 ; /* 32K bytes */ + __top_RAM2 = 0x2007c000 + 0x8000 ; /* 32K bytes */ diff --git a/TP1_labyrinth_etu/Debug/TP1_labyrinth_etu.axf b/TP1_labyrinth_etu/Debug/TP1_labyrinth_etu.axf new file mode 100644 index 0000000000000000000000000000000000000000..236eb069263ee70aacb1ffdec934aceaad9fccaa Binary files /dev/null and b/TP1_labyrinth_etu/Debug/TP1_labyrinth_etu.axf differ diff --git a/TP1_labyrinth_etu/Debug/TP1_labyrinth_etu.map b/TP1_labyrinth_etu/Debug/TP1_labyrinth_etu.map new file mode 100644 index 0000000000000000000000000000000000000000..e0a5feeb0597d173b90a5608c058ab484cf948d9 --- /dev/null +++ b/TP1_labyrinth_etu/Debug/TP1_labyrinth_etu.map @@ -0,0 +1,2331 @@ +Archive member included to satisfy reference by file (symbol) + +C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(accelerometer.o) + ./src/labyrinth.o (accel_init) +C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(custom_rand.o) + ./src/labyrinth.o (init_rnd32) +C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(lcd.o) + ./src/labyrinth.o (init_lcd) +C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(ssp.o) + C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(lcd.o) (ssp_init_custom) +C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(traces.o) + ./src/trace_mgt.o (write_trace_ref) +C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(uart.o) + C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(traces.o) (uart0_init_ref) +C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(I2C.o) + C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(accelerometer.o) (init_i2c) +C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(fonts.o) + C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(lcd.o) (SmallFont) +C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\CMSISv2p00_LPC17xx\Debug\libCMSISv2p00_LPC17xx.a(system_LPC17xx.o) + ./src/cr_startup_lpc17.o (SystemInit) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(_cr__main.o) + ./src/cr_startup_lpc17.o (__main) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(memcpy.o) + ./FreeRTOS_src/queue.o (memcpy) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(memset.o) + ./FreeRTOS_src/tasks.o (memset) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_cr_assert.o) + C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(uart.o) (__assertion_failed) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_deferredlazyseek.o) + c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_cr_assert.o) (__flsbuf) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_fflush.o) + c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_deferredlazyseek.o) (_fflush) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_writebuf.o) + c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_deferredlazyseek.o) (_Cwritebuf) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(alloc.o) + C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(lcd.o) (malloc) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(ceil.o) + ./src/tools.o (ceil) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fclose.o) + C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(lcd.o) (fclose) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fflush.o) + c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fclose.o) (fflush) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(floor.o) + ./src/tools.o (floor) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fopen.o) + C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(lcd.o) (fopen) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fpprintf.o) + C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(lcd.o) (vsprintf) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fputs.o) + c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_cr_assert.o) (fputs) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fread.o) + C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(lcd.o) (fread) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(freopen.o) + c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fopen.o) (freopen) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fseek.o) + C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(lcd.o) (fseek) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(ftell.o) + c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fseek.o) (ftell) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(initio.o) + c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(_cr__main.o) (_initio) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(printf.o) + c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fpprintf.o) (__vfprintf) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(remove.o) + c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fclose.o) (remove) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(setvbuf.o) + c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(initio.o) (setvbuf) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(sqrt.o) + C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(lcd.o) (sqrt) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(stdio.o) + c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_cr_assert.o) (__Ciob) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(stdlib.o) + C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(lcd.o) (exit) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(strlen.o) + C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(lcd.o) (strlen) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(strncpy.o) + ./FreeRTOS_src/tasks.o (strncpy) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(__fillbuf.o) + c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(stdio.o) (__filbuf) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(__init_alloc.o) + c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(alloc.o) (__heaps) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_cr_sbrk.o) + c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(alloc.o) (_sbrk) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_do_fflush.o) + c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fflush.o) (_do_fflush) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_fdopen.o) + c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(initio.o) (_fdopen) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_frexpl.o) + c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fpprintf.o) (_frexpl) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_hugeval.o) + c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(sqrt.o) (__huge_val) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_ldexpl.o) + c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fpprintf.o) (_ldexpl) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_read.o) + c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fread.o) (_Cread) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(errno.o) + c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(ftell.o) (errno) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(raise.o) + c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(stdlib.o) (raise) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_cr_check_heap.o) + c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_cr_sbrk.o) (__check_heap_overflow) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(division_64.o) + C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\CMSISv2p00_LPC17xx\Debug\libCMSISv2p00_LPC17xx.a(system_LPC17xx.o) (__aeabi_uldivmod) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(division_idiv0.o) + c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(division_64.o) (__aeabi_idiv0) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(double.o) + c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fpprintf.o) (__aeabi_dmul) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(float.o) + ./src/tools.o (__aeabi_fmul) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(memcpy.o) + c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(memcpy.o) (__aeabi_memcpy) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_appexit.o) + c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_cr_assert.o) (__sys_appexit) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_close.o) + c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fclose.o) (__sys_close) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_flen.o) + c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_writebuf.o) (__sys_flen) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_istty.o) + c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_deferredlazyseek.o) (__sys_istty) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_open.o) + c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(freopen.o) (__sys_open) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_read.o) + c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(__fillbuf.o) (__sys_read) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_readc.o) + c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(__fillbuf.o) (__sys_readc) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_remove.o) + c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(remove.o) (__sys_remove) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_rename.o) + c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(remove.o) (__sys_rename) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_seek.o) + c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_writebuf.o) (__sys_seek) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_tmpnam.o) + c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fclose.o) (__sys_tmpnam) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_write.o) + c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_writebuf.o) (__sys_write) + +Allocating common symbols +Common symbol size file + +_j 0x4 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(custom_rand.o) +xQueueRegistry 0x50 ./FreeRTOS_src/queue.o +_k 0x4 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(custom_rand.o) + +Discarded input sections + + .group 0x00000000 0x8 ./src/cr_startup_lpc17.o + .group 0x00000000 0x8 ./src/cr_startup_lpc17.o + .group 0x00000000 0x8 ./src/cr_startup_lpc17.o + .group 0x00000000 0x8 ./src/cr_startup_lpc17.o + .text 0x00000000 0x0 ./src/cr_startup_lpc17.o + .data 0x00000000 0x0 ./src/cr_startup_lpc17.o + .bss 0x00000000 0x0 ./src/cr_startup_lpc17.o + .group 0x00000000 0x8 ./src/labyrinth.o + .group 0x00000000 0x8 ./src/labyrinth.o + .group 0x00000000 0x8 ./src/labyrinth.o + .group 0x00000000 0x8 ./src/labyrinth.o + .group 0x00000000 0x8 ./src/labyrinth.o + .group 0x00000000 0x8 ./src/labyrinth.o + .group 0x00000000 0x8 ./src/labyrinth.o + .group 0x00000000 0x8 ./src/labyrinth.o + .group 0x00000000 0x8 ./src/labyrinth.o + .group 0x00000000 0x8 ./src/labyrinth.o + .group 0x00000000 0x8 ./src/labyrinth.o + .group 0x00000000 0x8 ./src/labyrinth.o + .group 0x00000000 0x8 ./src/labyrinth.o + .group 0x00000000 0x8 ./src/labyrinth.o + .group 0x00000000 0x8 ./src/labyrinth.o + .group 0x00000000 0x8 ./src/labyrinth.o + .group 0x00000000 0x8 ./src/labyrinth.o + .group 0x00000000 0x8 ./src/labyrinth.o + .group 0x00000000 0x8 ./src/labyrinth.o + .group 0x00000000 0x8 ./src/labyrinth.o + .group 0x00000000 0x8 ./src/labyrinth.o + .group 0x00000000 0x8 ./src/labyrinth.o + .group 0x00000000 0x8 ./src/labyrinth.o + .group 0x00000000 0x8 ./src/labyrinth.o + .group 0x00000000 0x8 ./src/labyrinth.o + .group 0x00000000 0x8 ./src/labyrinth.o + .group 0x00000000 0x8 ./src/labyrinth.o + .group 0x00000000 0x8 ./src/labyrinth.o + .group 0x00000000 0x8 ./src/labyrinth.o + .group 0x00000000 0x8 ./src/labyrinth.o + .text 0x00000000 0x0 ./src/labyrinth.o + .data 0x00000000 0x0 ./src/labyrinth.o + .bss 0x00000000 0x0 ./src/labyrinth.o + .text.slave_info_rx + 0x00000000 0x14 ./src/labyrinth.o + .data.ball_param_th.5931 + 0x00000000 0x8c ./src/labyrinth.o + .debug_macro 0x00000000 0x892 ./src/labyrinth.o + .debug_macro 0x00000000 0x10 ./src/labyrinth.o + .debug_macro 0x00000000 0x12d ./src/labyrinth.o + .debug_macro 0x00000000 0x5b2 ./src/labyrinth.o + .group 0x00000000 0x8 ./src/tools.o + .group 0x00000000 0x8 ./src/tools.o + .group 0x00000000 0x8 ./src/tools.o + .group 0x00000000 0x8 ./src/tools.o + .group 0x00000000 0x8 ./src/tools.o + .group 0x00000000 0x8 ./src/tools.o + .group 0x00000000 0x8 ./src/tools.o + .group 0x00000000 0x8 ./src/tools.o + .group 0x00000000 0x8 ./src/tools.o + .group 0x00000000 0x8 ./src/tools.o + .group 0x00000000 0x8 ./src/tools.o + .group 0x00000000 0x8 ./src/tools.o + .group 0x00000000 0x8 ./src/tools.o + .group 0x00000000 0x8 ./src/tools.o + .group 0x00000000 0x8 ./src/tools.o + .group 0x00000000 0x8 ./src/tools.o + .text 0x00000000 0x0 ./src/tools.o + .data 0x00000000 0x0 ./src/tools.o + .bss 0x00000000 0x0 ./src/tools.o + .text.round 0x00000000 0x78 ./src/tools.o + .text.test_collision + 0x00000000 0x450 ./src/tools.o + .debug_macro 0x00000000 0x892 ./src/tools.o + .debug_macro 0x00000000 0x10 ./src/tools.o + .debug_macro 0x00000000 0x12d ./src/tools.o + .debug_macro 0x00000000 0x5b2 ./src/tools.o + .debug_macro 0x00000000 0x1c ./src/tools.o + .debug_macro 0x00000000 0x2e ./src/tools.o + .debug_macro 0x00000000 0x18 ./src/tools.o + .debug_macro 0x00000000 0x7af ./src/tools.o + .debug_macro 0x00000000 0x2c7 ./src/tools.o + .debug_macro 0x00000000 0x1c ./src/tools.o + .debug_macro 0x00000000 0x22 ./src/tools.o + .debug_macro 0x00000000 0x28 ./src/tools.o + .debug_macro 0x00000000 0x1c ./src/tools.o + .debug_macro 0x00000000 0xc2 ./src/tools.o + .group 0x00000000 0x8 ./src/trace_mgt.o + .group 0x00000000 0x8 ./src/trace_mgt.o + .group 0x00000000 0x8 ./src/trace_mgt.o + .group 0x00000000 0x8 ./src/trace_mgt.o + .group 0x00000000 0x8 ./src/trace_mgt.o + .group 0x00000000 0x8 ./src/trace_mgt.o + .group 0x00000000 0x8 ./src/trace_mgt.o + .group 0x00000000 0x8 ./src/trace_mgt.o + .group 0x00000000 0x8 ./src/trace_mgt.o + .group 0x00000000 0x8 ./src/trace_mgt.o + .group 0x00000000 0x8 ./src/trace_mgt.o + .group 0x00000000 0x8 ./src/trace_mgt.o + .group 0x00000000 0x8 ./src/trace_mgt.o + .group 0x00000000 0x8 ./src/trace_mgt.o + .group 0x00000000 0x8 ./src/trace_mgt.o + .group 0x00000000 0x8 ./src/trace_mgt.o + .group 0x00000000 0x8 ./src/trace_mgt.o + .group 0x00000000 0x8 ./src/trace_mgt.o + .group 0x00000000 0x8 ./src/trace_mgt.o + .group 0x00000000 0x8 ./src/trace_mgt.o + .group 0x00000000 0x8 ./src/trace_mgt.o + .group 0x00000000 0x8 ./src/trace_mgt.o + .group 0x00000000 0x8 ./src/trace_mgt.o + .text 0x00000000 0x0 ./src/trace_mgt.o + .data 0x00000000 0x0 ./src/trace_mgt.o + .bss 0x00000000 0x0 ./src/trace_mgt.o + .debug_macro 0x00000000 0x892 ./src/trace_mgt.o + .debug_macro 0x00000000 0x1c ./src/trace_mgt.o + .debug_macro 0x00000000 0x2e ./src/trace_mgt.o + .debug_macro 0x00000000 0x10 ./src/trace_mgt.o + .debug_macro 0x00000000 0x12d ./src/trace_mgt.o + .debug_macro 0x00000000 0x5b2 ./src/trace_mgt.o + .debug_macro 0x00000000 0x18 ./src/trace_mgt.o + .debug_macro 0x00000000 0x7af ./src/trace_mgt.o + .debug_macro 0x00000000 0x2c7 ./src/trace_mgt.o + .debug_macro 0x00000000 0xa0 ./src/trace_mgt.o + .debug_macro 0x00000000 0x22 ./src/trace_mgt.o + .debug_macro 0x00000000 0x46 ./src/trace_mgt.o + .debug_macro 0x00000000 0xa3 ./src/trace_mgt.o + .debug_macro 0x00000000 0x12 ./src/trace_mgt.o + .debug_macro 0x00000000 0x1f ./src/trace_mgt.o + .debug_macro 0x00000000 0x177 ./src/trace_mgt.o + .debug_macro 0x00000000 0x49 ./src/trace_mgt.o + .debug_macro 0x00000000 0x57 ./src/trace_mgt.o + .debug_macro 0x00000000 0x6a ./src/trace_mgt.o + .debug_macro 0x00000000 0x62 ./src/trace_mgt.o + .group 0x00000000 0x8 ./FreeRTOS_src/croutine.o + .group 0x00000000 0x8 ./FreeRTOS_src/croutine.o + .group 0x00000000 0x8 ./FreeRTOS_src/croutine.o + .group 0x00000000 0x8 ./FreeRTOS_src/croutine.o + .group 0x00000000 0x8 ./FreeRTOS_src/croutine.o + .group 0x00000000 0x8 ./FreeRTOS_src/croutine.o + .group 0x00000000 0x8 ./FreeRTOS_src/croutine.o + .group 0x00000000 0x8 ./FreeRTOS_src/croutine.o + .group 0x00000000 0x8 ./FreeRTOS_src/croutine.o + .group 0x00000000 0x8 ./FreeRTOS_src/croutine.o + .group 0x00000000 0x8 ./FreeRTOS_src/croutine.o + .group 0x00000000 0x8 ./FreeRTOS_src/croutine.o + .group 0x00000000 0x8 ./FreeRTOS_src/croutine.o + .text 0x00000000 0x0 ./FreeRTOS_src/croutine.o + .data 0x00000000 0x0 ./FreeRTOS_src/croutine.o + .bss 0x00000000 0x0 ./FreeRTOS_src/croutine.o + .bss.pxReadyCoRoutineLists + 0x00000000 0x28 ./FreeRTOS_src/croutine.o + .bss.xDelayedCoRoutineList1 + 0x00000000 0x14 ./FreeRTOS_src/croutine.o + .bss.xDelayedCoRoutineList2 + 0x00000000 0x14 ./FreeRTOS_src/croutine.o + .bss.pxDelayedCoRoutineList + 0x00000000 0x4 ./FreeRTOS_src/croutine.o + .bss.pxOverflowDelayedCoRoutineList + 0x00000000 0x4 ./FreeRTOS_src/croutine.o + .bss.xPendingReadyCoRoutineList + 0x00000000 0x14 ./FreeRTOS_src/croutine.o + .bss.pxCurrentCoRoutine + 0x00000000 0x4 ./FreeRTOS_src/croutine.o + .bss.uxTopCoRoutineReadyPriority + 0x00000000 0x4 ./FreeRTOS_src/croutine.o + .bss.xCoRoutineTickCount + 0x00000000 0x4 ./FreeRTOS_src/croutine.o + .bss.xLastTickCount + 0x00000000 0x4 ./FreeRTOS_src/croutine.o + .bss.xPassedTicks + 0x00000000 0x4 ./FreeRTOS_src/croutine.o + .text.xCoRoutineCreate + 0x00000000 0xcc ./FreeRTOS_src/croutine.o + .text.vCoRoutineAddToDelayedList + 0x00000000 0x84 ./FreeRTOS_src/croutine.o + .text.prvCheckPendingReadyList + 0x00000000 0x80 ./FreeRTOS_src/croutine.o + .text.prvCheckDelayedList + 0x00000000 0xfc ./FreeRTOS_src/croutine.o + .text.vCoRoutineSchedule + 0x00000000 0xa0 ./FreeRTOS_src/croutine.o + .text.prvInitialiseCoRoutineLists + 0x00000000 0x6c ./FreeRTOS_src/croutine.o + .text.xCoRoutineRemoveFromEventList + 0x00000000 0x50 ./FreeRTOS_src/croutine.o + .debug_info 0x00000000 0x47e ./FreeRTOS_src/croutine.o + .debug_abbrev 0x00000000 0x18a ./FreeRTOS_src/croutine.o + .debug_aranges + 0x00000000 0x50 ./FreeRTOS_src/croutine.o + .debug_ranges 0x00000000 0x40 ./FreeRTOS_src/croutine.o + .debug_macro 0x00000000 0xad ./FreeRTOS_src/croutine.o + .debug_macro 0x00000000 0x892 ./FreeRTOS_src/croutine.o + .debug_macro 0x00000000 0x10 ./FreeRTOS_src/croutine.o + .debug_macro 0x00000000 0x12d ./FreeRTOS_src/croutine.o + .debug_macro 0x00000000 0x16 ./FreeRTOS_src/croutine.o + .debug_macro 0x00000000 0x46 ./FreeRTOS_src/croutine.o + .debug_macro 0x00000000 0x150 ./FreeRTOS_src/croutine.o + .debug_macro 0x00000000 0xa3 ./FreeRTOS_src/croutine.o + .debug_macro 0x00000000 0x12 ./FreeRTOS_src/croutine.o + .debug_macro 0x00000000 0x1f ./FreeRTOS_src/croutine.o + .debug_macro 0x00000000 0x177 ./FreeRTOS_src/croutine.o + .debug_macro 0x00000000 0x49 ./FreeRTOS_src/croutine.o + .debug_macro 0x00000000 0x57 ./FreeRTOS_src/croutine.o + .debug_macro 0x00000000 0x49 ./FreeRTOS_src/croutine.o + .debug_line 0x00000000 0x2d0 ./FreeRTOS_src/croutine.o + .debug_str 0x00000000 0x511f ./FreeRTOS_src/croutine.o + .comment 0x00000000 0x6f ./FreeRTOS_src/croutine.o + .debug_frame 0x00000000 0x10c ./FreeRTOS_src/croutine.o + .ARM.attributes + 0x00000000 0x33 ./FreeRTOS_src/croutine.o + .group 0x00000000 0x8 ./FreeRTOS_src/list.o + .group 0x00000000 0x8 ./FreeRTOS_src/list.o + .group 0x00000000 0x8 ./FreeRTOS_src/list.o + .group 0x00000000 0x8 ./FreeRTOS_src/list.o + .group 0x00000000 0x8 ./FreeRTOS_src/list.o + .group 0x00000000 0x8 ./FreeRTOS_src/list.o + .group 0x00000000 0x8 ./FreeRTOS_src/list.o + .group 0x00000000 0x8 ./FreeRTOS_src/list.o + .group 0x00000000 0x8 ./FreeRTOS_src/list.o + .group 0x00000000 0x8 ./FreeRTOS_src/list.o + .group 0x00000000 0x8 ./FreeRTOS_src/list.o + .text 0x00000000 0x0 ./FreeRTOS_src/list.o + .data 0x00000000 0x0 ./FreeRTOS_src/list.o + .bss 0x00000000 0x0 ./FreeRTOS_src/list.o + .text.vListInitialise + 0x00000000 0x40 ./FreeRTOS_src/list.o + .text.vListInitialiseItem + 0x00000000 0x18 ./FreeRTOS_src/list.o + .text.vListInsert + 0x00000000 0x70 ./FreeRTOS_src/list.o + .debug_macro 0x00000000 0x892 ./FreeRTOS_src/list.o + .debug_macro 0x00000000 0x10 ./FreeRTOS_src/list.o + .debug_macro 0x00000000 0x12d ./FreeRTOS_src/list.o + .debug_macro 0x00000000 0x46 ./FreeRTOS_src/list.o + .debug_macro 0x00000000 0x150 ./FreeRTOS_src/list.o + .debug_macro 0x00000000 0xa3 ./FreeRTOS_src/list.o + .debug_macro 0x00000000 0x12 ./FreeRTOS_src/list.o + .debug_macro 0x00000000 0x1f ./FreeRTOS_src/list.o + .debug_macro 0x00000000 0x177 ./FreeRTOS_src/list.o + .debug_macro 0x00000000 0x49 ./FreeRTOS_src/list.o + .group 0x00000000 0x8 ./FreeRTOS_src/queue.o + .group 0x00000000 0x8 ./FreeRTOS_src/queue.o + .group 0x00000000 0x8 ./FreeRTOS_src/queue.o + .group 0x00000000 0x8 ./FreeRTOS_src/queue.o + .group 0x00000000 0x8 ./FreeRTOS_src/queue.o + .group 0x00000000 0x8 ./FreeRTOS_src/queue.o + .group 0x00000000 0x8 ./FreeRTOS_src/queue.o + .group 0x00000000 0x8 ./FreeRTOS_src/queue.o + .group 0x00000000 0x8 ./FreeRTOS_src/queue.o + .group 0x00000000 0x8 ./FreeRTOS_src/queue.o + .group 0x00000000 0x8 ./FreeRTOS_src/queue.o + .group 0x00000000 0x8 ./FreeRTOS_src/queue.o + .group 0x00000000 0x8 ./FreeRTOS_src/queue.o + .text 0x00000000 0x0 ./FreeRTOS_src/queue.o + .data 0x00000000 0x0 ./FreeRTOS_src/queue.o + .bss 0x00000000 0x0 ./FreeRTOS_src/queue.o + .text.xQueueCreate + 0x00000000 0xbc ./FreeRTOS_src/queue.o + .text.xQueueGiveMutexRecursive + 0x00000000 0x48 ./FreeRTOS_src/queue.o + .text.xQueueTakeMutexRecursive + 0x00000000 0x50 ./FreeRTOS_src/queue.o + .text.xQueueCreateCountingSemaphore + 0x00000000 0x2c ./FreeRTOS_src/queue.o + .text.xQueueGenericSend + 0x00000000 0x108 ./FreeRTOS_src/queue.o + .text.xQueueGenericSendFromISR + 0x00000000 0x80 ./FreeRTOS_src/queue.o + .text.xQueueGenericReceive + 0x00000000 0x13c ./FreeRTOS_src/queue.o + .text.xQueueReceiveFromISR + 0x00000000 0x84 ./FreeRTOS_src/queue.o + .text.uxQueueMessagesWaiting + 0x00000000 0x20 ./FreeRTOS_src/queue.o + .text.uxQueueMessagesWaitingFromISR + 0x00000000 0x1c ./FreeRTOS_src/queue.o + .text.vQueueDelete + 0x00000000 0x28 ./FreeRTOS_src/queue.o + .text.prvCopyDataToQueue + 0x00000000 0x9c ./FreeRTOS_src/queue.o + .text.prvCopyDataFromQueue + 0x00000000 0x4c ./FreeRTOS_src/queue.o + .text.prvUnlockQueue + 0x00000000 0x98 ./FreeRTOS_src/queue.o + .text.prvIsQueueEmpty + 0x00000000 0x2c ./FreeRTOS_src/queue.o + .text.xQueueIsQueueEmptyFromISR + 0x00000000 0x24 ./FreeRTOS_src/queue.o + .text.prvIsQueueFull + 0x00000000 0x30 ./FreeRTOS_src/queue.o + .text.xQueueIsQueueFullFromISR + 0x00000000 0x28 ./FreeRTOS_src/queue.o + .text.vQueueAddToRegistry + 0x00000000 0x50 ./FreeRTOS_src/queue.o + .text.vQueueUnregisterQueue + 0x00000000 0x44 ./FreeRTOS_src/queue.o + .debug_info 0x00000000 0x859 ./FreeRTOS_src/queue.o + .debug_abbrev 0x00000000 0x1bb ./FreeRTOS_src/queue.o + .debug_aranges + 0x00000000 0xb8 ./FreeRTOS_src/queue.o + .debug_ranges 0x00000000 0xa8 ./FreeRTOS_src/queue.o + .debug_macro 0x00000000 0x11e ./FreeRTOS_src/queue.o + .debug_macro 0x00000000 0x892 ./FreeRTOS_src/queue.o + .debug_macro 0x00000000 0x10 ./FreeRTOS_src/queue.o + .debug_macro 0x00000000 0x12d ./FreeRTOS_src/queue.o + .debug_macro 0x00000000 0x28 ./FreeRTOS_src/queue.o + .debug_macro 0x00000000 0x46 ./FreeRTOS_src/queue.o + .debug_macro 0x00000000 0x150 ./FreeRTOS_src/queue.o + .debug_macro 0x00000000 0xa3 ./FreeRTOS_src/queue.o + .debug_macro 0x00000000 0x12 ./FreeRTOS_src/queue.o + .debug_macro 0x00000000 0x1f ./FreeRTOS_src/queue.o + .debug_macro 0x00000000 0x177 ./FreeRTOS_src/queue.o + .debug_macro 0x00000000 0x49 ./FreeRTOS_src/queue.o + .debug_macro 0x00000000 0x57 ./FreeRTOS_src/queue.o + .debug_macro 0x00000000 0x49 ./FreeRTOS_src/queue.o + .debug_line 0x00000000 0x44f ./FreeRTOS_src/queue.o + .debug_str 0x00000000 0x54de ./FreeRTOS_src/queue.o + .comment 0x00000000 0x6f ./FreeRTOS_src/queue.o + .debug_frame 0x00000000 0x2fc ./FreeRTOS_src/queue.o + .ARM.attributes + 0x00000000 0x33 ./FreeRTOS_src/queue.o + COMMON 0x00000000 0x50 ./FreeRTOS_src/queue.o + .group 0x00000000 0x8 ./FreeRTOS_src/tasks.o + .group 0x00000000 0x8 ./FreeRTOS_src/tasks.o + .group 0x00000000 0x8 ./FreeRTOS_src/tasks.o + .group 0x00000000 0x8 ./FreeRTOS_src/tasks.o + .group 0x00000000 0x8 ./FreeRTOS_src/tasks.o + .group 0x00000000 0x8 ./FreeRTOS_src/tasks.o + .group 0x00000000 0x8 ./FreeRTOS_src/tasks.o + .group 0x00000000 0x8 ./FreeRTOS_src/tasks.o + .group 0x00000000 0x8 ./FreeRTOS_src/tasks.o + .group 0x00000000 0x8 ./FreeRTOS_src/tasks.o + .group 0x00000000 0x8 ./FreeRTOS_src/tasks.o + .group 0x00000000 0x8 ./FreeRTOS_src/tasks.o + .group 0x00000000 0x8 ./FreeRTOS_src/tasks.o + .group 0x00000000 0x8 ./FreeRTOS_src/tasks.o + .group 0x00000000 0x8 ./FreeRTOS_src/tasks.o + .text 0x00000000 0x0 ./FreeRTOS_src/tasks.o + .data 0x00000000 0x0 ./FreeRTOS_src/tasks.o + .bss 0x00000000 0x0 ./FreeRTOS_src/tasks.o + .bss.xDelayedTaskList1 + 0x00000000 0x14 ./FreeRTOS_src/tasks.o + .bss.xDelayedTaskList2 + 0x00000000 0x14 ./FreeRTOS_src/tasks.o + .bss.xPendingReadyList + 0x00000000 0x14 ./FreeRTOS_src/tasks.o + .bss.xTasksWaitingTermination + 0x00000000 0x14 ./FreeRTOS_src/tasks.o + .bss.uxTasksDeleted + 0x00000000 0x4 ./FreeRTOS_src/tasks.o + .bss.xSuspendedTaskList + 0x00000000 0x14 ./FreeRTOS_src/tasks.o + .bss.uxCurrentNumberOfTasks + 0x00000000 0x4 ./FreeRTOS_src/tasks.o + .bss.uxTopUsedPriority + 0x00000000 0x4 ./FreeRTOS_src/tasks.o + .bss.xSchedulerRunning + 0x00000000 0x4 ./FreeRTOS_src/tasks.o + .text.xTaskGenericCreate + 0x00000000 0x15c ./FreeRTOS_src/tasks.o + .text.vTaskDelete + 0x00000000 0x98 ./FreeRTOS_src/tasks.o + .text.vTaskDelayUntil + 0x00000000 0x98 ./FreeRTOS_src/tasks.o + .text.vTaskDelay + 0x00000000 0x54 ./FreeRTOS_src/tasks.o + .text.uxTaskPriorityGet + 0x00000000 0x34 ./FreeRTOS_src/tasks.o + .text.vTaskPrioritySet + 0x00000000 0xe8 ./FreeRTOS_src/tasks.o + .text.vTaskSuspend + 0x00000000 0x9c ./FreeRTOS_src/tasks.o + .text.xTaskIsTaskSuspended + 0x00000000 0x44 ./FreeRTOS_src/tasks.o + .text.vTaskResume + 0x00000000 0x90 ./FreeRTOS_src/tasks.o + .text.xTaskResumeFromISR + 0x00000000 0xa0 ./FreeRTOS_src/tasks.o + .rodata 0x00000000 0x5 ./FreeRTOS_src/tasks.o + .text.vTaskStartScheduler + 0x00000000 0x5c ./FreeRTOS_src/tasks.o + .text.vTaskEndScheduler + 0x00000000 0x20 ./FreeRTOS_src/tasks.o + .text.vTaskSuspendAll + 0x00000000 0x1c ./FreeRTOS_src/tasks.o + .text.xTaskResumeAll + 0x00000000 0xf0 ./FreeRTOS_src/tasks.o + .text.xTaskGetTickCount + 0x00000000 0x24 ./FreeRTOS_src/tasks.o + .text.xTaskGetTickCountFromISR + 0x00000000 0x30 ./FreeRTOS_src/tasks.o + .text.uxTaskGetNumberOfTasks + 0x00000000 0x14 ./FreeRTOS_src/tasks.o + .text.vTaskPlaceOnEventList + 0x00000000 0x60 ./FreeRTOS_src/tasks.o + .text.xTaskRemoveFromEventList + 0x00000000 0xa0 ./FreeRTOS_src/tasks.o + .text.vTaskSetTimeOutState + 0x00000000 0x2c ./FreeRTOS_src/tasks.o + .text.xTaskCheckForTimeOut + 0x00000000 0x88 ./FreeRTOS_src/tasks.o + .text.vTaskMissedYield + 0x00000000 0x18 ./FreeRTOS_src/tasks.o + .text.prvIdleTask + 0x00000000 0x14 ./FreeRTOS_src/tasks.o + .text.prvInitialiseTCBVariables + 0x00000000 0x68 ./FreeRTOS_src/tasks.o + .text.prvInitialiseTaskLists + 0x00000000 0x80 ./FreeRTOS_src/tasks.o + .text.prvCheckTasksWaitingTermination + 0x00000000 0x78 ./FreeRTOS_src/tasks.o + .text.prvAddCurrentTaskToDelayedList + 0x00000000 0x6c ./FreeRTOS_src/tasks.o + .text.prvAllocateTCBAndStack + 0x00000000 0x64 ./FreeRTOS_src/tasks.o + .text.usTaskCheckFreeStackSpace + 0x00000000 0x30 ./FreeRTOS_src/tasks.o + .text.uxTaskGetStackHighWaterMark + 0x00000000 0x38 ./FreeRTOS_src/tasks.o + .text.prvDeleteTCB + 0x00000000 0x20 ./FreeRTOS_src/tasks.o + .debug_macro 0x00000000 0x892 ./FreeRTOS_src/tasks.o + .debug_macro 0x00000000 0x10 ./FreeRTOS_src/tasks.o + .debug_macro 0x00000000 0x12d ./FreeRTOS_src/tasks.o + .debug_macro 0x00000000 0xa0 ./FreeRTOS_src/tasks.o + .debug_macro 0x00000000 0x22 ./FreeRTOS_src/tasks.o + .debug_macro 0x00000000 0x46 ./FreeRTOS_src/tasks.o + .debug_macro 0x00000000 0x150 ./FreeRTOS_src/tasks.o + .debug_macro 0x00000000 0xa3 ./FreeRTOS_src/tasks.o + .debug_macro 0x00000000 0x12 ./FreeRTOS_src/tasks.o + .debug_macro 0x00000000 0x1f ./FreeRTOS_src/tasks.o + .debug_macro 0x00000000 0x177 ./FreeRTOS_src/tasks.o + .debug_macro 0x00000000 0x49 ./FreeRTOS_src/tasks.o + .debug_macro 0x00000000 0x57 ./FreeRTOS_src/tasks.o + .group 0x00000000 0x8 ./FreeRTOS_src/timers.o + .group 0x00000000 0x8 ./FreeRTOS_src/timers.o + .group 0x00000000 0x8 ./FreeRTOS_src/timers.o + .group 0x00000000 0x8 ./FreeRTOS_src/timers.o + .group 0x00000000 0x8 ./FreeRTOS_src/timers.o + .group 0x00000000 0x8 ./FreeRTOS_src/timers.o + .group 0x00000000 0x8 ./FreeRTOS_src/timers.o + .group 0x00000000 0x8 ./FreeRTOS_src/timers.o + .group 0x00000000 0x8 ./FreeRTOS_src/timers.o + .group 0x00000000 0x8 ./FreeRTOS_src/timers.o + .group 0x00000000 0x8 ./FreeRTOS_src/timers.o + .group 0x00000000 0x8 ./FreeRTOS_src/timers.o + .group 0x00000000 0x8 ./FreeRTOS_src/timers.o + .group 0x00000000 0x8 ./FreeRTOS_src/timers.o + .text 0x00000000 0x0 ./FreeRTOS_src/timers.o + .data 0x00000000 0x0 ./FreeRTOS_src/timers.o + .bss 0x00000000 0x0 ./FreeRTOS_src/timers.o + .debug_info 0x00000000 0x61 ./FreeRTOS_src/timers.o + .debug_abbrev 0x00000000 0x29 ./FreeRTOS_src/timers.o + .debug_aranges + 0x00000000 0x18 ./FreeRTOS_src/timers.o + .debug_macro 0x00000000 0xb6 ./FreeRTOS_src/timers.o + .debug_macro 0x00000000 0x892 ./FreeRTOS_src/timers.o + .debug_macro 0x00000000 0x10 ./FreeRTOS_src/timers.o + .debug_macro 0x00000000 0x12d ./FreeRTOS_src/timers.o + .debug_macro 0x00000000 0x16 ./FreeRTOS_src/timers.o + .debug_macro 0x00000000 0x46 ./FreeRTOS_src/timers.o + .debug_macro 0x00000000 0x150 ./FreeRTOS_src/timers.o + .debug_macro 0x00000000 0xa3 ./FreeRTOS_src/timers.o + .debug_macro 0x00000000 0x12 ./FreeRTOS_src/timers.o + .debug_macro 0x00000000 0x1f ./FreeRTOS_src/timers.o + .debug_macro 0x00000000 0x177 ./FreeRTOS_src/timers.o + .debug_macro 0x00000000 0x49 ./FreeRTOS_src/timers.o + .debug_macro 0x00000000 0x57 ./FreeRTOS_src/timers.o + .debug_macro 0x00000000 0x6a ./FreeRTOS_src/timers.o + .debug_macro 0x00000000 0x61 ./FreeRTOS_src/timers.o + .debug_line 0x00000000 0x1b1 ./FreeRTOS_src/timers.o + .debug_str 0x00000000 0x539a ./FreeRTOS_src/timers.o + .comment 0x00000000 0x6f ./FreeRTOS_src/timers.o + .ARM.attributes + 0x00000000 0x33 ./FreeRTOS_src/timers.o + .group 0x00000000 0x8 ./FreeRTOS_portable/MemMang/heap_2.o + .group 0x00000000 0x8 ./FreeRTOS_portable/MemMang/heap_2.o + .group 0x00000000 0x8 ./FreeRTOS_portable/MemMang/heap_2.o + .group 0x00000000 0x8 ./FreeRTOS_portable/MemMang/heap_2.o + .group 0x00000000 0x8 ./FreeRTOS_portable/MemMang/heap_2.o + .group 0x00000000 0x8 ./FreeRTOS_portable/MemMang/heap_2.o + .group 0x00000000 0x8 ./FreeRTOS_portable/MemMang/heap_2.o + .group 0x00000000 0x8 ./FreeRTOS_portable/MemMang/heap_2.o + .group 0x00000000 0x8 ./FreeRTOS_portable/MemMang/heap_2.o + .group 0x00000000 0x8 ./FreeRTOS_portable/MemMang/heap_2.o + .group 0x00000000 0x8 ./FreeRTOS_portable/MemMang/heap_2.o + .group 0x00000000 0x8 ./FreeRTOS_portable/MemMang/heap_2.o + .text 0x00000000 0x0 ./FreeRTOS_portable/MemMang/heap_2.o + .data 0x00000000 0x0 ./FreeRTOS_portable/MemMang/heap_2.o + .bss 0x00000000 0x0 ./FreeRTOS_portable/MemMang/heap_2.o + .bss.xHeap 0x00000000 0x4c00 ./FreeRTOS_portable/MemMang/heap_2.o + .rodata.heapSTRUCT_SIZE + 0x00000000 0x2 ./FreeRTOS_portable/MemMang/heap_2.o + .bss.xStart 0x00000000 0x8 ./FreeRTOS_portable/MemMang/heap_2.o + .bss.xEnd 0x00000000 0x8 ./FreeRTOS_portable/MemMang/heap_2.o + .data.xFreeBytesRemaining + 0x00000000 0x4 ./FreeRTOS_portable/MemMang/heap_2.o + .text.pvPortMalloc + 0x00000000 0x144 ./FreeRTOS_portable/MemMang/heap_2.o + .text.vPortFree + 0x00000000 0x74 ./FreeRTOS_portable/MemMang/heap_2.o + .text.xPortGetFreeHeapSize + 0x00000000 0x14 ./FreeRTOS_portable/MemMang/heap_2.o + .text.vPortInitialiseBlocks + 0x00000000 0xc ./FreeRTOS_portable/MemMang/heap_2.o + .bss.xHeapHasBeenInitialised.4128 + 0x00000000 0x4 ./FreeRTOS_portable/MemMang/heap_2.o + .debug_info 0x00000000 0x295 ./FreeRTOS_portable/MemMang/heap_2.o + .debug_abbrev 0x00000000 0x16b ./FreeRTOS_portable/MemMang/heap_2.o + .debug_aranges + 0x00000000 0x38 ./FreeRTOS_portable/MemMang/heap_2.o + .debug_ranges 0x00000000 0x28 ./FreeRTOS_portable/MemMang/heap_2.o + .debug_macro 0x00000000 0xcb ./FreeRTOS_portable/MemMang/heap_2.o + .debug_macro 0x00000000 0x892 ./FreeRTOS_portable/MemMang/heap_2.o + .debug_macro 0x00000000 0x10 ./FreeRTOS_portable/MemMang/heap_2.o + .debug_macro 0x00000000 0x12d ./FreeRTOS_portable/MemMang/heap_2.o + .debug_macro 0x00000000 0x28 ./FreeRTOS_portable/MemMang/heap_2.o + .debug_macro 0x00000000 0x46 ./FreeRTOS_portable/MemMang/heap_2.o + .debug_macro 0x00000000 0x150 ./FreeRTOS_portable/MemMang/heap_2.o + .debug_macro 0x00000000 0xa3 ./FreeRTOS_portable/MemMang/heap_2.o + .debug_macro 0x00000000 0x12 ./FreeRTOS_portable/MemMang/heap_2.o + .debug_macro 0x00000000 0x1f ./FreeRTOS_portable/MemMang/heap_2.o + .debug_macro 0x00000000 0x177 ./FreeRTOS_portable/MemMang/heap_2.o + .debug_macro 0x00000000 0x49 ./FreeRTOS_portable/MemMang/heap_2.o + .debug_macro 0x00000000 0x57 ./FreeRTOS_portable/MemMang/heap_2.o + .debug_line 0x00000000 0x256 ./FreeRTOS_portable/MemMang/heap_2.o + .debug_str 0x00000000 0x4bf9 ./FreeRTOS_portable/MemMang/heap_2.o + .comment 0x00000000 0x6f ./FreeRTOS_portable/MemMang/heap_2.o + .debug_frame 0x00000000 0x98 ./FreeRTOS_portable/MemMang/heap_2.o + .ARM.attributes + 0x00000000 0x33 ./FreeRTOS_portable/MemMang/heap_2.o + .group 0x00000000 0x8 ./FreeRTOS_portable/port.o + .group 0x00000000 0x8 ./FreeRTOS_portable/port.o + .group 0x00000000 0x8 ./FreeRTOS_portable/port.o + .group 0x00000000 0x8 ./FreeRTOS_portable/port.o + .group 0x00000000 0x8 ./FreeRTOS_portable/port.o + .group 0x00000000 0x8 ./FreeRTOS_portable/port.o + .group 0x00000000 0x8 ./FreeRTOS_portable/port.o + .group 0x00000000 0x8 ./FreeRTOS_portable/port.o + .group 0x00000000 0x8 ./FreeRTOS_portable/port.o + .group 0x00000000 0x8 ./FreeRTOS_portable/port.o + .group 0x00000000 0x8 ./FreeRTOS_portable/port.o + .group 0x00000000 0x8 ./FreeRTOS_portable/port.o + .text 0x00000000 0x0 ./FreeRTOS_portable/port.o + .data 0x00000000 0x0 ./FreeRTOS_portable/port.o + .bss 0x00000000 0x0 ./FreeRTOS_portable/port.o + .rodata.ulKernelPriority + 0x00000000 0x4 ./FreeRTOS_portable/port.o + .data.uxCriticalNesting + 0x00000000 0x4 ./FreeRTOS_portable/port.o + .text.pxPortInitialiseStack + 0x00000000 0x50 ./FreeRTOS_portable/port.o + .text.vPortStartFirstTask + 0x00000000 0x18 ./FreeRTOS_portable/port.o + .text.xPortStartScheduler + 0x00000000 0x38 ./FreeRTOS_portable/port.o + .text.vPortEndScheduler + 0x00000000 0xc ./FreeRTOS_portable/port.o + .text.vPortYieldFromISR + 0x00000000 0x18 ./FreeRTOS_portable/port.o + .text.vPortEnterCritical + 0x00000000 0x24 ./FreeRTOS_portable/port.o + .text.vPortExitCritical + 0x00000000 0x2c ./FreeRTOS_portable/port.o + .text.prvSetupTimerInterrupt + 0x00000000 0x24 ./FreeRTOS_portable/port.o + .debug_macro 0x00000000 0x892 ./FreeRTOS_portable/port.o + .debug_macro 0x00000000 0x10 ./FreeRTOS_portable/port.o + .debug_macro 0x00000000 0x12d ./FreeRTOS_portable/port.o + .debug_macro 0x00000000 0x16 ./FreeRTOS_portable/port.o + .debug_macro 0x00000000 0x46 ./FreeRTOS_portable/port.o + .debug_macro 0x00000000 0x150 ./FreeRTOS_portable/port.o + .debug_macro 0x00000000 0xa3 ./FreeRTOS_portable/port.o + .debug_macro 0x00000000 0x12 ./FreeRTOS_portable/port.o + .debug_macro 0x00000000 0x1f ./FreeRTOS_portable/port.o + .debug_macro 0x00000000 0x177 ./FreeRTOS_portable/port.o + .debug_macro 0x00000000 0x49 ./FreeRTOS_portable/port.o + .debug_macro 0x00000000 0x57 ./FreeRTOS_portable/port.o + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(accelerometer.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(accelerometer.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(accelerometer.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(accelerometer.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(accelerometer.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(accelerometer.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(accelerometer.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(accelerometer.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(accelerometer.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(accelerometer.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(accelerometer.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(accelerometer.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(accelerometer.o) + .text 0x00000000 0x0 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(accelerometer.o) + .data 0x00000000 0x0 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(accelerometer.o) + .bss 0x00000000 0x0 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(accelerometer.o) + .debug_macro 0x00000000 0x10 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(accelerometer.o) + .debug_macro 0x00000000 0x12d C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(accelerometer.o) + .debug_macro 0x00000000 0x28 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(accelerometer.o) + .debug_macro 0x00000000 0x1c C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(accelerometer.o) + .debug_macro 0x00000000 0x2e C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(accelerometer.o) + .debug_macro 0x00000000 0x5b2 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(accelerometer.o) + .debug_macro 0x00000000 0x18 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(accelerometer.o) + .debug_macro 0x00000000 0x7af C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(accelerometer.o) + .debug_macro 0x00000000 0x2c7 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(accelerometer.o) + .debug_macro 0x00000000 0xd6 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(accelerometer.o) + .debug_macro 0x00000000 0x22 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(accelerometer.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(custom_rand.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(custom_rand.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(custom_rand.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(custom_rand.o) + .text 0x00000000 0x0 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(custom_rand.o) + .data 0x00000000 0x0 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(custom_rand.o) + .bss 0x00000000 0x0 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(custom_rand.o) + .debug_macro 0x00000000 0x898 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(custom_rand.o) + .debug_macro 0x00000000 0x10 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(custom_rand.o) + .debug_macro 0x00000000 0x12d C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(custom_rand.o) + .debug_macro 0x00000000 0x5b2 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(custom_rand.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(lcd.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(lcd.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(lcd.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(lcd.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(lcd.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(lcd.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(lcd.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(lcd.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(lcd.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(lcd.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(lcd.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(lcd.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(lcd.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(lcd.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(lcd.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(lcd.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(lcd.o) + .text 0x00000000 0x0 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(lcd.o) + .data 0x00000000 0x0 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(lcd.o) + .bss 0x00000000 0x0 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(lcd.o) + .bss.str 0x00000000 0x30c C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(lcd.o) + .text.LCD_SetPosR + 0x00000000 0x90 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(lcd.o) + .text.read_pixels + 0x00000000 0xf8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(lcd.o) + .text.read_cmd + 0x00000000 0x64 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(lcd.o) + .text.setup_scroll + 0x00000000 0x68 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(lcd.o) + .text.lcd_scroll + 0x00000000 0x60 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(lcd.o) + .text.lcd_set_fenetre_pixel + 0x00000000 0x24 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(lcd.o) + .text.Ecran_Croix + 0x00000000 0x78 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(lcd.o) + .text.lcd_lineH + 0x00000000 0x64 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(lcd.o) + .text.lcd_lineV + 0x00000000 0x60 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(lcd.o) + .text.lcd_line + 0x00000000 0x158 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(lcd.o) + .text.lcd_circle + 0x00000000 0x1ac C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(lcd.o) + .text.lcd_filled_circle + 0x00000000 0xd8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(lcd.o) + .text.lcd_filled_circle_on_square + 0x00000000 0xcc C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(lcd.o) + .text.lcd_empty_rectangle + 0x00000000 0x80 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(lcd.o) + .text.lcd_print_char + 0x00000000 0x10c C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(lcd.o) + .text.lcd_print + 0x00000000 0xe0 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(lcd.o) + .text.lcd_printf + 0x00000000 0x20c C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(lcd.o) + .text.read_bmp_file + 0x00000000 0x1d0 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(lcd.o) + .text.display_bitmap16 + 0x00000000 0x70 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(lcd.o) + .bss.is_scroll_setup.5885 + 0x00000000 0x1 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(lcd.o) + .bss.x.5882 0x00000000 0x4 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(lcd.o) + .data.offset.5884 + 0x00000000 0x4 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(lcd.o) + .data.y.5883 0x00000000 0x4 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(lcd.o) + .debug_macro 0x00000000 0x898 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(lcd.o) + .debug_macro 0x00000000 0x10 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(lcd.o) + .debug_macro 0x00000000 0x12d C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(lcd.o) + .debug_macro 0x00000000 0x22 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(lcd.o) + .debug_macro 0x00000000 0xc4 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(lcd.o) + .debug_macro 0x00000000 0x1c C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(lcd.o) + .debug_macro 0x00000000 0x2e C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(lcd.o) + .debug_macro 0x00000000 0x5b2 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(lcd.o) + .debug_macro 0x00000000 0x18 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(lcd.o) + .debug_macro 0x00000000 0x7af C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(lcd.o) + .debug_macro 0x00000000 0x2c7 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(lcd.o) + .debug_macro 0x00000000 0x1c C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(lcd.o) + .debug_macro 0x00000000 0x22 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(lcd.o) + .debug_macro 0x00000000 0x28 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(lcd.o) + .debug_macro 0x00000000 0x1c C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(lcd.o) + .debug_macro 0x00000000 0xc2 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(lcd.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(ssp.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(ssp.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(ssp.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(ssp.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(ssp.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(ssp.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(ssp.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(ssp.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(ssp.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(ssp.o) + .text 0x00000000 0x0 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(ssp.o) + .data 0x00000000 0x0 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(ssp.o) + .bss 0x00000000 0x0 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(ssp.o) + .text.ssp_receive_buf + 0x00000000 0x70 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(ssp.o) + .debug_macro 0x00000000 0x898 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(ssp.o) + .debug_macro 0x00000000 0x1c C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(ssp.o) + .debug_macro 0x00000000 0x2e C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(ssp.o) + .debug_macro 0x00000000 0x10 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(ssp.o) + .debug_macro 0x00000000 0x12d C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(ssp.o) + .debug_macro 0x00000000 0x5b2 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(ssp.o) + .debug_macro 0x00000000 0x18 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(ssp.o) + .debug_macro 0x00000000 0x7af C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(ssp.o) + .debug_macro 0x00000000 0x2c7 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(ssp.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(traces.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(traces.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(traces.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(traces.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(traces.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(traces.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(traces.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(traces.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(traces.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(traces.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(traces.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(traces.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(traces.o) + .text 0x00000000 0x0 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(traces.o) + .data 0x00000000 0x0 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(traces.o) + .bss 0x00000000 0x0 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(traces.o) + .text.send_traces_to_uart0 + 0x00000000 0x74 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(traces.o) + .debug_macro 0x00000000 0x898 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(traces.o) + .debug_macro 0x00000000 0x1c C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(traces.o) + .debug_macro 0x00000000 0x2e C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(traces.o) + .debug_macro 0x00000000 0x10 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(traces.o) + .debug_macro 0x00000000 0x12d C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(traces.o) + .debug_macro 0x00000000 0x5b2 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(traces.o) + .debug_macro 0x00000000 0x18 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(traces.o) + .debug_macro 0x00000000 0x7af C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(traces.o) + .debug_macro 0x00000000 0x2c7 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(traces.o) + .debug_macro 0x00000000 0x28 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(traces.o) + .debug_macro 0x00000000 0x22 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(traces.o) + .debug_macro 0x00000000 0x2e C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(traces.o) + .debug_macro 0x00000000 0x9a C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(traces.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(uart.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(uart.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(uart.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(uart.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(uart.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(uart.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(uart.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(uart.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(uart.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(uart.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(uart.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(uart.o) + .text 0x00000000 0x0 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(uart.o) + .data 0x00000000 0x0 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(uart.o) + .bss 0x00000000 0x0 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(uart.o) + .text.NVIC_DisableIRQ + 0x00000000 0x34 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(uart.o) + .text.taskYIELD + 0x00000000 0xc C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(uart.o) + .text.uart0_stop_interrupt + 0x00000000 0x10 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(uart.o) + .text.uart0_send_ref + 0x00000000 0x40 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(uart.o) + .debug_macro 0x00000000 0x898 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(uart.o) + .debug_macro 0x00000000 0x1c C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(uart.o) + .debug_macro 0x00000000 0x2e C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(uart.o) + .debug_macro 0x00000000 0x10 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(uart.o) + .debug_macro 0x00000000 0x12d C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(uart.o) + .debug_macro 0x00000000 0x5b2 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(uart.o) + .debug_macro 0x00000000 0x18 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(uart.o) + .debug_macro 0x00000000 0x7af C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(uart.o) + .debug_macro 0x00000000 0x2c7 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(uart.o) + .debug_macro 0x00000000 0x28 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(uart.o) + .debug_macro 0x00000000 0x2e C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(uart.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(I2C.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(I2C.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(I2C.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(I2C.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(I2C.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(I2C.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(I2C.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(I2C.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(I2C.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(I2C.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(I2C.o) + .text 0x00000000 0x0 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(I2C.o) + .data 0x00000000 0x0 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(I2C.o) + .bss 0x00000000 0x0 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(I2C.o) + .text.I2C_slave_read + 0x00000000 0x1c8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(I2C.o) + .text.I2C_slave_write + 0x00000000 0x168 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(I2C.o) + .debug_macro 0x00000000 0x898 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(I2C.o) + .debug_macro 0x00000000 0x1c C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(I2C.o) + .debug_macro 0x00000000 0x2e C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(I2C.o) + .debug_macro 0x00000000 0x10 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(I2C.o) + .debug_macro 0x00000000 0x12d C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(I2C.o) + .debug_macro 0x00000000 0x5b2 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(I2C.o) + .debug_macro 0x00000000 0x18 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(I2C.o) + .debug_macro 0x00000000 0x7af C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(I2C.o) + .debug_macro 0x00000000 0x2c7 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(I2C.o) + .debug_macro 0x00000000 0x22 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(I2C.o) + .debug_macro 0x00000000 0x58 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(I2C.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(fonts.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(fonts.o) + .text 0x00000000 0x0 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(fonts.o) + .data 0x00000000 0x0 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(fonts.o) + .bss 0x00000000 0x0 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(fonts.o) + .rodata.SmallFont + 0x00000000 0x478 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(fonts.o) + .rodata.BigFont + 0x00000000 0xbe4 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(fonts.o) + .rodata.SevenSegNumFont + 0x00000000 0x7d4 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(fonts.o) + .debug_info 0x00000000 0xaa C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(fonts.o) + .debug_abbrev 0x00000000 0x48 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(fonts.o) + .debug_aranges + 0x00000000 0x18 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(fonts.o) + .debug_macro 0x00000000 0x1a C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(fonts.o) + .debug_macro 0x00000000 0x898 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(fonts.o) + .debug_macro 0x00000000 0x1c C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(fonts.o) + .debug_line 0x00000000 0x7b C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(fonts.o) + .debug_str 0x00000000 0x257f C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(fonts.o) + .comment 0x00000000 0x6f C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(fonts.o) + .ARM.attributes + 0x00000000 0x33 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(fonts.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\CMSISv2p00_LPC17xx\Debug\libCMSISv2p00_LPC17xx.a(system_LPC17xx.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\CMSISv2p00_LPC17xx\Debug\libCMSISv2p00_LPC17xx.a(system_LPC17xx.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\CMSISv2p00_LPC17xx\Debug\libCMSISv2p00_LPC17xx.a(system_LPC17xx.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\CMSISv2p00_LPC17xx\Debug\libCMSISv2p00_LPC17xx.a(system_LPC17xx.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\CMSISv2p00_LPC17xx\Debug\libCMSISv2p00_LPC17xx.a(system_LPC17xx.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\CMSISv2p00_LPC17xx\Debug\libCMSISv2p00_LPC17xx.a(system_LPC17xx.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\CMSISv2p00_LPC17xx\Debug\libCMSISv2p00_LPC17xx.a(system_LPC17xx.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\CMSISv2p00_LPC17xx\Debug\libCMSISv2p00_LPC17xx.a(system_LPC17xx.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\CMSISv2p00_LPC17xx\Debug\libCMSISv2p00_LPC17xx.a(system_LPC17xx.o) + .text 0x00000000 0x0 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\CMSISv2p00_LPC17xx\Debug\libCMSISv2p00_LPC17xx.a(system_LPC17xx.o) + .data 0x00000000 0x0 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\CMSISv2p00_LPC17xx\Debug\libCMSISv2p00_LPC17xx.a(system_LPC17xx.o) + .bss 0x00000000 0x0 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\CMSISv2p00_LPC17xx\Debug\libCMSISv2p00_LPC17xx.a(system_LPC17xx.o) + .text.SystemCoreClockUpdate + 0x00000000 0xb4 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\CMSISv2p00_LPC17xx\Debug\libCMSISv2p00_LPC17xx.a(system_LPC17xx.o) + .debug_macro 0x00000000 0x10 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\CMSISv2p00_LPC17xx\Debug\libCMSISv2p00_LPC17xx.a(system_LPC17xx.o) + .debug_macro 0x00000000 0x12d C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\CMSISv2p00_LPC17xx\Debug\libCMSISv2p00_LPC17xx.a(system_LPC17xx.o) + .debug_macro 0x00000000 0x5b2 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\CMSISv2p00_LPC17xx\Debug\libCMSISv2p00_LPC17xx.a(system_LPC17xx.o) + .debug_macro 0x00000000 0x1c C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\CMSISv2p00_LPC17xx\Debug\libCMSISv2p00_LPC17xx.a(system_LPC17xx.o) + .debug_macro 0x00000000 0x2e C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\CMSISv2p00_LPC17xx\Debug\libCMSISv2p00_LPC17xx.a(system_LPC17xx.o) + .debug_macro 0x00000000 0x18 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\CMSISv2p00_LPC17xx\Debug\libCMSISv2p00_LPC17xx.a(system_LPC17xx.o) + .debug_macro 0x00000000 0x7af C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\CMSISv2p00_LPC17xx\Debug\libCMSISv2p00_LPC17xx.a(system_LPC17xx.o) + .debug_macro 0x00000000 0x2c7 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\CMSISv2p00_LPC17xx\Debug\libCMSISv2p00_LPC17xx.a(system_LPC17xx.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(_cr__main.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(_cr__main.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(_cr__main.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(memcpy.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(memcpy.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(memcpy.o) + .text.memcpy 0x00000000 0x4 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(memcpy.o) + .comment 0x00000000 0x6f c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(memcpy.o) + .ARM.attributes + 0x00000000 0x33 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(memcpy.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(memset.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(memset.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(memset.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_cr_assert.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_cr_assert.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_cr_assert.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_deferredlazyseek.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_deferredlazyseek.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_deferredlazyseek.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_fflush.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_fflush.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_fflush.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_writebuf.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_writebuf.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_writebuf.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(alloc.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(alloc.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(alloc.o) + .text.calloc 0x00000000 0x50 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(alloc.o) + .text.realloc 0x00000000 0x24 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(alloc.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(ceil.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(ceil.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(ceil.o) + .text.ceil 0x00000000 0x90 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(ceil.o) + .comment 0x00000000 0x6f c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(ceil.o) + .ARM.attributes + 0x00000000 0x33 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(ceil.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fclose.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fclose.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fclose.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fflush.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fflush.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fflush.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(floor.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(floor.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(floor.o) + .text.floor 0x00000000 0x94 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(floor.o) + .comment 0x00000000 0x6f c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(floor.o) + .ARM.attributes + 0x00000000 0x33 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(floor.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fopen.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fopen.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fopen.o) + .text.fopen 0x00000000 0x28 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fopen.o) + .comment 0x00000000 0x6f c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fopen.o) + .ARM.attributes + 0x00000000 0x33 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fopen.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fpprintf.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fpprintf.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fpprintf.o) + .text.fprintf 0x00000000 0x30 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fpprintf.o) + .text.printf_char + 0x00000000 0x34 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fpprintf.o) + .text.snprintf + 0x00000000 0x68 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fpprintf.o) + .text.vfprintf + 0x00000000 0x1c c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fpprintf.o) + .text.vprintf 0x00000000 0x24 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fpprintf.o) + .text.vsprintf + 0x00000000 0x5c c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fpprintf.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fputs.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fputs.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fputs.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fread.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fread.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fread.o) + .text.fread 0x00000000 0x1a c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fread.o) + .comment 0x00000000 0x6f c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fread.o) + .ARM.attributes + 0x00000000 0x33 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fread.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(freopen.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(freopen.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(freopen.o) + .text.freopen 0x00000000 0x88 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(freopen.o) + .comment 0x00000000 0x6f c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(freopen.o) + .ARM.attributes + 0x00000000 0x33 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(freopen.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fseek.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fseek.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fseek.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(ftell.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(ftell.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(ftell.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(initio.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(initio.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(initio.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(printf.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(printf.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(printf.o) + .text.no_fp_display + 0x00000000 0x4 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(printf.o) + .text._fprintf + 0x00000000 0x30 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(printf.o) + .text._printf_char + 0x00000000 0x34 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(printf.o) + .text._sprintf + 0x00000000 0x6c c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(printf.o) + .text._snprintf + 0x00000000 0x68 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(printf.o) + .text._vfprintf + 0x00000000 0x20 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(printf.o) + .text._vprintf + 0x00000000 0x24 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(printf.o) + .text._vsprintf + 0x00000000 0x5c c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(printf.o) + .text._vsnprintf + 0x00000000 0x5c c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(printf.o) + .text._printf 0x00000000 0x54 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(printf.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(remove.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(remove.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(remove.o) + .text.rename 0x00000000 0x28 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(remove.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(setvbuf.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(setvbuf.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(setvbuf.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(sqrt.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(sqrt.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(sqrt.o) + .text.sqrt 0x00000000 0x11c c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(sqrt.o) + .comment 0x00000000 0x6f c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(sqrt.o) + .ARM.attributes + 0x00000000 0x33 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(sqrt.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(stdio.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(stdio.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(stdio.o) + .text.getc 0x00000000 0x18 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(stdio.o) + .text.fgetc 0x00000000 0x4 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(stdio.o) + .text.getchar 0x00000000 0x20 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(stdio.o) + .text.putc 0x00000000 0x24 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(stdio.o) + .text.fputc 0x00000000 0x4 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(stdio.o) + .text.putchar 0x00000000 0x24 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(stdio.o) + .text.feof 0x00000000 0x8 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(stdio.o) + .text.ferror 0x00000000 0x8 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(stdio.o) + .text.clearerr + 0x00000000 0xe c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(stdio.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(stdlib.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(stdlib.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(stdlib.o) + .text.__rand 0x00000000 0x20 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(stdlib.o) + .text.__srand 0x00000000 0xc c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(stdlib.o) + .text.rand 0x00000000 0x3c c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(stdlib.o) + .text.srand 0x00000000 0x40 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(stdlib.o) + .text._exit_init + 0x00000000 0xc c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(stdlib.o) + .text.atexit 0x00000000 0x24 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(stdlib.o) + .text.abort 0x00000000 0x12 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(stdlib.o) + .text.abs 0x00000000 0x8 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(stdlib.o) + .text.labs 0x00000000 0x8 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(stdlib.o) + .text.div 0x00000000 0x10 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(stdlib.o) + .text.ldiv 0x00000000 0x10 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(stdlib.o) + .data.next 0x00000000 0x4 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(stdlib.o) + .data._random_number_seed + 0x00000000 0xdc c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(stdlib.o) + .data._random_j + 0x00000000 0x4 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(stdlib.o) + .data._random_k + 0x00000000 0x4 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(stdlib.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(strlen.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(strlen.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(strlen.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(strncpy.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(strncpy.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(strncpy.o) + .text.strncpy 0x00000000 0x56 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(strncpy.o) + .comment 0x00000000 0x6f c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(strncpy.o) + .ARM.attributes + 0x00000000 0x33 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(strncpy.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(__fillbuf.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(__fillbuf.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(__fillbuf.o) + .text._Csys_read_ + 0x00000000 0x22 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(__fillbuf.o) + .text.__filbuf + 0x00000000 0x178 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(__fillbuf.o) + .text._fillb2 0x00000000 0x1c c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(__fillbuf.o) + .comment 0x00000000 0x6f c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(__fillbuf.o) + .ARM.attributes + 0x00000000 0x33 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(__fillbuf.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(__init_alloc.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(__init_alloc.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(__init_alloc.o) + .text._init_alloc + 0x00000000 0x14 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(__init_alloc.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_cr_sbrk.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_cr_sbrk.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_cr_sbrk.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_do_fflush.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_do_fflush.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_do_fflush.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_fdopen.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_fdopen.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_fdopen.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_frexpl.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_frexpl.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_frexpl.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_hugeval.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_hugeval.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_hugeval.o) + .rodata.__huge_val + 0x00000000 0x8 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_hugeval.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_ldexpl.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_ldexpl.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_ldexpl.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_read.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_read.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_read.o) + .text._Cread 0x00000000 0x8c c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_read.o) + .comment 0x00000000 0x6f c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_read.o) + .ARM.attributes + 0x00000000 0x33 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_read.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(errno.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(errno.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(errno.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(raise.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(raise.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(raise.o) + .text.raise 0x00000000 0x6 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(raise.o) + .comment 0x00000000 0x6f c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(raise.o) + .ARM.attributes + 0x00000000 0x33 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(raise.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_cr_check_heap.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_cr_check_heap.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_cr_check_heap.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(division_64.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(division_64.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(division_64.o) + .text.__aeabi_division_ldivmod + 0x00000000 0x26 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(division_64.o) + .text.__aeabi_division_uldivmod + 0x00000000 0x174 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(division_64.o) + .ARM.attributes + 0x00000000 0x21 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(division_64.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(division_idiv0.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(division_idiv0.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(division_idiv0.o) + .text.__aeabi_division_idiv0 + 0x00000000 0x2 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(division_idiv0.o) + .ARM.attributes + 0x00000000 0x21 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(division_idiv0.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(double.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(double.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(double.o) + .text.__aeabi_drsub + 0x00000000 0x1c c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(double.o) + .text.__aeabi_dneg + 0x00000000 0x8 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(double.o) + .text.__aeabi_d2f + 0x00000000 0x54 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(double.o) + .text.__aeabi_d2uiz + 0x00000000 0x30 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(double.o) + .text.__aeabi_d2lz + 0x00000000 0x6a c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(double.o) + .text.__aeabi_d2ulz + 0x00000000 0x54 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(double.o) + .text.__bhs_ul2d + 0x00000000 0x88 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(double.o) + .text.__aeabi_ui2d + 0x00000000 0x8 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(double.o) + .text.__aeabi_l2d + 0x00000000 0x18 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(double.o) + .text.__aeabi_ul2d + 0x00000000 0x8 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(double.o) + .text.__aeabi_dcmpgt + 0x00000000 0x54 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(double.o) + .text.__aeabi_dcmpun + 0x00000000 0x1a c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(double.o) + .text.__aeabi_cdcmple + 0x00000000 0x24 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(double.o) + .text.__aeabi_cdrcmple + 0x00000000 0x14 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(double.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(float.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(float.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(float.o) + .text.__aeabi_fmul + 0x00000000 0xb0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(float.o) + .text.__aeabi_fsub + 0x00000000 0xe0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(float.o) + .text.__aeabi_fadd + 0x00000000 0xac c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(float.o) + .text.__aeabi_frsub + 0x00000000 0xc c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(float.o) + .text.__aeabi_fneg + 0x00000000 0x6 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(float.o) + .text.__aeabi_f2iz + 0x00000000 0x32 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(float.o) + .text.__aeabi_f2uiz + 0x00000000 0x28 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(float.o) + .text.__aeabi_f2lz + 0x00000000 0x5a c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(float.o) + .text.__aeabi_f2ulz + 0x00000000 0x3e c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(float.o) + .text.__bhs_ul2f + 0x00000000 0x46 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(float.o) + .text.__aeabi_ui2f + 0x00000000 0x8 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(float.o) + .text.__aeabi_l2f + 0x00000000 0x18 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(float.o) + .text.__aeabi_ul2f + 0x00000000 0x8 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(float.o) + .text.__aeabi_f2d + 0x00000000 0x38 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(float.o) + .text.__aeabi_fcmpeq + 0x00000000 0x1e c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(float.o) + .text.__aeabi_fcmplt + 0x00000000 0x3a c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(float.o) + .text.__aeabi_fcmpgt + 0x00000000 0x3a c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(float.o) + .text.__aeabi_fcmple + 0x00000000 0x3e c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(float.o) + .text.__aeabi_fcmpge + 0x00000000 0x3e c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(float.o) + .text.__aeabi_fcmpun + 0x00000000 0x1a c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(float.o) + .text.__aeabi_cfcmple + 0x00000000 0x20 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(float.o) + .text.__aeabi_cfrcmple + 0x00000000 0xa c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(float.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(memcpy.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(memcpy.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(memcpy.o) + .text.__aeabi_memcpy + 0x00000000 0x34 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(memcpy.o) + .text.__aeabi_memmove + 0x00000000 0x1c c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(memcpy.o) + .text.__aeabi_memclr + 0x00000000 0x8 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(memcpy.o) + .text.__aeabi_memset + 0x00000000 0xa c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(memcpy.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_appexit.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_appexit.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_appexit.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_close.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_close.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_close.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_flen.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_flen.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_flen.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_istty.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_istty.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_istty.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_open.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_open.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_open.o) + .text.__sys_open + 0x00000000 0xc c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_open.o) + .ARM.attributes + 0x00000000 0x21 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_open.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_read.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_read.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_read.o) + .text.__sys_read + 0x00000000 0xc c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_read.o) + .ARM.attributes + 0x00000000 0x21 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_read.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_readc.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_readc.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_readc.o) + .text.__sys_readc + 0x00000000 0x8 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_readc.o) + .ARM.attributes + 0x00000000 0x21 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_readc.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_remove.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_remove.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_remove.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_rename.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_rename.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_rename.o) + .text.__sys_rename + 0x00000000 0xc c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_rename.o) + .ARM.attributes + 0x00000000 0x21 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_rename.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_seek.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_seek.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_seek.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_tmpnam.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_tmpnam.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_tmpnam.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_write.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_write.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_write.o) + +Memory Configuration + +Name Origin Length Attributes +MFlash512 0x00000000 0x00080000 xr +RamLoc32 0x10000000 0x00008000 xrw +RamAHB32 0x2007c000 0x00008000 xrw +*default* 0x00000000 0xffffffff + +Linker script and memory map + +LOAD ./src/cr_startup_lpc17.o +LOAD ./src/labyrinth.o +LOAD ./src/tools.o +LOAD ./src/trace_mgt.o +LOAD ./FreeRTOS_src/croutine.o +LOAD ./FreeRTOS_src/list.o +LOAD ./FreeRTOS_src/queue.o +LOAD ./FreeRTOS_src/tasks.o +LOAD ./FreeRTOS_src/timers.o +LOAD ./FreeRTOS_portable/MemMang/heap_2.o +LOAD ./FreeRTOS_portable/port.o +LOAD C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a +LOAD C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\CMSISv2p00_LPC17xx\Debug\libCMSISv2p00_LPC17xx.a +START GROUP +LOAD c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a +LOAD c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a +LOAD c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a +END GROUP + 0x00000000 __base_MFlash512 = 0x0 + 0x00000000 __base_Flash = 0x0 + 0x00080000 __top_MFlash512 = 0x80000 + 0x00080000 __top_Flash = 0x80000 + 0x10000000 __base_RamLoc32 = 0x10000000 + 0x10000000 __base_RAM = 0x10000000 + 0x10008000 __top_RamLoc32 = 0x10008000 + 0x10008000 __top_RAM = 0x10008000 + 0x2007c000 __base_RamAHB32 = 0x2007c000 + 0x2007c000 __base_RAM2 = 0x2007c000 + 0x20084000 __top_RamAHB32 = 0x20084000 + 0x20084000 __top_RAM2 = 0x20084000 + +.text 0x00000000 0x4638 + FILL mask 0xff + 0x00000000 __vectors_start__ = ABSOLUTE (.) + *(.isr_vector) + .isr_vector 0x00000000 0xcc ./src/cr_startup_lpc17.o + 0x00000000 g_pfnVectors + 0x000000cc . = ALIGN (0x4) + 0x000000cc __section_table_start = . + 0x000000cc __data_section_table = . + 0x000000cc 0x4 LONG 0x4638 LOADADDR (.data) + 0x000000d0 0x4 LONG 0x10000000 ADDR (.data) + 0x000000d4 0x4 LONG 0x210 SIZEOF (.data) + 0x000000d8 0x4 LONG 0x4638 LOADADDR (.data_RAM2) + 0x000000dc 0x4 LONG 0x2007c000 ADDR (.data_RAM2) + 0x000000e0 0x4 LONG 0x0 SIZEOF (.data_RAM2) + 0x000000e4 __data_section_table_end = . + 0x000000e4 __bss_section_table = . + 0x000000e4 0x4 LONG 0x10000210 ADDR (.bss) + 0x000000e8 0x4 LONG 0xa8c SIZEOF (.bss) + 0x000000ec 0x4 LONG 0x2007c000 ADDR (.bss_RAM2) + 0x000000f0 0x4 LONG 0x0 SIZEOF (.bss_RAM2) + 0x000000f4 __bss_section_table_end = . + 0x000000f4 __section_table_end = . + *(.after_vectors*) + .after_vectors + 0x000000f4 0x12c ./src/cr_startup_lpc17.o + 0x000000f4 data_init + 0x00000138 bss_init + 0x00000170 ResetISR + 0x000001e8 NMI_Handler + 0x000001f0 HardFault_Handler + 0x000001f8 MemManage_Handler + 0x00000200 BusFault_Handler + 0x00000208 UsageFault_Handler + 0x00000210 DebugMon_Handler + 0x00000218 UART1_IRQHandler + 0x00000218 I2C1_IRQHandler + 0x00000218 CANActivity_IRQHandler + 0x00000218 TIMER3_IRQHandler + 0x00000218 USBActivity_IRQHandler + 0x00000218 EINT3_IRQHandler + 0x00000218 EINT2_IRQHandler + 0x00000218 IntDefaultHandler + 0x00000218 PLL0_IRQHandler + 0x00000218 CAN_IRQHandler + 0x00000218 I2C0_IRQHandler + 0x00000218 SSP0_IRQHandler + 0x00000218 I2S_IRQHandler + 0x00000218 I2C2_IRQHandler + 0x00000218 RTC_IRQHandler + 0x00000218 TIMER0_IRQHandler + 0x00000218 SPI_IRQHandler + 0x00000218 RIT_IRQHandler + 0x00000218 EINT1_IRQHandler + 0x00000218 TIMER1_IRQHandler + 0x00000218 UART2_IRQHandler + 0x00000218 ADC_IRQHandler + 0x00000218 SSP1_IRQHandler + 0x00000218 USB_IRQHandler + 0x00000218 BOD_IRQHandler + 0x00000218 PWM1_IRQHandler + 0x00000218 WDT_IRQHandler + 0x00000218 QEI_IRQHandler + 0x00000218 EINT0_IRQHandler + 0x00000218 PLL1_IRQHandler + 0x00000218 DMA_IRQHandler + 0x00000218 TIMER2_IRQHandler + 0x00000218 UART3_IRQHandler + 0x00000218 MCPWM_IRQHandler + 0x00000218 ENET_IRQHandler + *(.text*) + .text.main 0x00000220 0x50 ./src/labyrinth.o + 0x00000220 main + .text.draw_labyrinth + 0x00000270 0x150 ./src/tools.o + 0x00000270 draw_labyrinth + .text.write_trace + 0x000003c0 0x28 ./src/trace_mgt.o + 0x000003c0 write_trace + .text.vListInsertEnd + 0x000003e8 0x50 ./FreeRTOS_src/list.o + 0x000003e8 vListInsertEnd + .text.vListRemove + 0x00000438 0x50 ./FreeRTOS_src/list.o + 0x00000438 vListRemove + .text.vTaskIncrementTick + 0x00000488 0x12c ./FreeRTOS_src/tasks.o + 0x00000488 vTaskIncrementTick + .text.vTaskSwitchContext + 0x000005b4 0x100 ./FreeRTOS_src/tasks.o + 0x000005b4 vTaskSwitchContext + .text.vPortSVCHandler + 0x000006b4 0x24 ./FreeRTOS_portable/port.o + 0x000006b4 vPortSVCHandler + .text.xPortPendSVHandler + 0x000006d8 0x40 ./FreeRTOS_portable/port.o + 0x000006d8 xPortPendSVHandler + .text.xPortSysTickHandler + 0x00000718 0x28 ./FreeRTOS_portable/port.o + 0x00000718 xPortSysTickHandler + .text.accel_write_byte + 0x00000740 0x44 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(accelerometer.o) + 0x00000740 accel_write_byte + .text.accel_read_byte + 0x00000784 0x54 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(accelerometer.o) + 0x00000784 accel_read_byte + .text.accel_init + 0x000007d8 0xb8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(accelerometer.o) + 0x000007d8 accel_init + .text.accel_read + 0x00000890 0xcc C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(accelerometer.o) + 0x00000890 accel_read + .text.rnd32 0x0000095c 0x78 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(custom_rand.o) + 0x0000095c rnd32 + .text.init_rnd32 + 0x000009d4 0x6c C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(custom_rand.o) + 0x000009d4 init_rnd32 + .text.LCD_RS_ENA + 0x00000a40 0x38 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(lcd.o) + .text.LCD_RS_DIS + 0x00000a78 0x38 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(lcd.o) + .text.Write_Cmd_Data + 0x00000ab0 0x28 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(lcd.o) + 0x00000ab0 Write_Cmd_Data + .text.Write_Cmd + 0x00000ad8 0x28 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(lcd.o) + 0x00000ad8 Write_Cmd + .text.Write_Data + 0x00000b00 0x30 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(lcd.o) + 0x00000b00 Write_Data + .text.Write_Data_U16 + 0x00000b30 0x28 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(lcd.o) + 0x00000b30 Write_Data_U16 + .text.Delay 0x00000b58 0x30 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(lcd.o) + 0x00000b58 Delay + .text.ILI9341_Initial + 0x00000b88 0x220 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(lcd.o) + 0x00000b88 ILI9341_Initial + .text.init_lcd + 0x00000da8 0x54 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(lcd.o) + 0x00000da8 init_lcd + .text.LCD_SetPos + 0x00000dfc 0xb8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(lcd.o) + 0x00000dfc LCD_SetPos + .text.clear_screen + 0x00000eb4 0x4c C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(lcd.o) + 0x00000eb4 clear_screen + .text.lcd_filled_rectangle + 0x00000f00 0xa4 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(lcd.o) + 0x00000f00 lcd_filled_rectangle + .text.ssp_init_custom + 0x00000fa4 0x84 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(ssp.o) + 0x00000fa4 ssp_init_custom + .text.ssp_send_buf + 0x00001028 0x48 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(ssp.o) + 0x00001028 ssp_send_buf + .text.start_timer + 0x00001070 0xa8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(traces.o) + 0x00001070 start_timer + .text.write_trace_ref + 0x00001118 0x174 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(traces.o) + 0x00001118 write_trace_ref + .text.tx_handler + 0x0000128c 0x7c C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(traces.o) + 0x0000128c tx_handler + .text.init_traces + 0x00001308 0x4c C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(traces.o) + 0x00001308 init_traces + .text.NVIC_EnableIRQ + 0x00001354 0x30 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(uart.o) + .text.UART0_IRQHandler + 0x00001384 0x70 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(uart.o) + 0x00001384 UART0_IRQHandler + .text.uart0_init_ref + 0x000013f4 0xf8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(uart.o) + 0x000013f4 uart0_init_ref + .text.init_i2c + 0x000014ec 0x180 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(I2C.o) + 0x000014ec init_i2c + .text.wait_SI 0x0000166c 0x44 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(I2C.o) + 0x0000166c wait_SI + .text.I2C_master_write + 0x000016b0 0xec C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(I2C.o) + 0x000016b0 I2C_master_write + .text.I2C_master_read + 0x0000179c 0x120 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(I2C.o) + 0x0000179c I2C_master_read + .text.SystemInit + 0x000018bc 0xe4 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\CMSISv2p00_LPC17xx\Debug\libCMSISv2p00_LPC17xx.a(system_LPC17xx.o) + 0x000018bc SystemInit + .text.__main 0x000019a0 0x14 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(_cr__main.o) + 0x000019a0 __CR_SEMIHOST + 0x000019a0 __main + .text.memset 0x000019b4 0x4 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(memset.o) + 0x000019b4 memset + .text.__assertion_failed + 0x000019b8 0x48 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_cr_assert.o) + 0x000019b8 __assertion_failed + .text._deferredlazyseek + 0x00001a00 0x44 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_deferredlazyseek.o) + 0x00001a00 _deferredlazyseek + .text.__flsbuf + 0x00001a44 0x140 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_deferredlazyseek.o) + 0x00001a44 __flsbuf + .text._fflush 0x00001b84 0x58 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_fflush.o) + 0x00001b84 _fflush + .text._Cwritebuf + 0x00001bdc 0x68 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_writebuf.o) + 0x00001bdc _Cwritebuf + .text.malloc 0x00001c44 0xc8 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(alloc.o) + 0x00001c44 malloc + .text.free 0x00001d0c 0x30 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(alloc.o) + 0x00001d0c free + .text._Csys_alloc + 0x00001d3c 0x20 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(alloc.o) + 0x00001d3c _Csys_alloc + .text.fclose 0x00001d5c 0x6c c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fclose.o) + 0x00001d5c fclose + .text.fflush 0x00001dc8 0x30 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fflush.o) + 0x00001dc8 fflush + .text.fp_round + 0x00001df8 0x4c c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fpprintf.o) + .text.pr_dec.constprop.1 + 0x00001e44 0x26 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fpprintf.o) + *fill* 0x00001e6a 0x2 ff + .text.sprintf 0x00001e6c 0x6c c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fpprintf.o) + 0x00001e6c sprintf + .text.fp_display + 0x00001ed8 0x8ec c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fpprintf.o) + .text.vsnprintf + 0x000027c4 0x5c c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fpprintf.o) + 0x000027c4 vsnprintf + .text.printf 0x00002820 0x54 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fpprintf.o) + 0x00002820 printf + .text.fputs 0x00002874 0x2c c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fputs.o) + 0x00002874 fputs + .text.fseek 0x000028a0 0x110 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fseek.o) + 0x000028a0 fseek + .text.ftell 0x000029b0 0x4c c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(ftell.o) + 0x000029b0 ftell + .text._initio 0x000029fc 0xa4 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(initio.o) + 0x000029fc _initio + .text._terminateio + 0x00002aa0 0x44 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(initio.o) + 0x00002aa0 _terminateio + .text.__vfprintf + 0x00002ae4 0xd28 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(printf.o) + 0x00002ae4 __vfprintf + .text.remove 0x0000380c 0x14 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(remove.o) + 0x0000380c remove + .text.setvbuf 0x00003820 0x40 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(setvbuf.o) + 0x00003820 setvbuf + .text.exit 0x00003860 0x2c c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(stdlib.o) + 0x00003860 exit + .text.strlen 0x0000388c 0x4a c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(strlen.o) + 0x0000388c strlen + *fill* 0x000038d6 0x2 ff + .text._sbrk 0x000038d8 0x40 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_cr_sbrk.o) + 0x000038d8 _sbrk + .text._do_fflush + 0x00003918 0x44 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_do_fflush.o) + 0x00003918 _do_fflush + .text._fdopen 0x0000395c 0x6a c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_fdopen.o) + 0x0000395c _fdopen + .text._frexpl 0x000039c6 0x5a c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_frexpl.o) + 0x000039c6 _frexpl + .text._ldexpl 0x00003a20 0x4c c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_ldexpl.o) + 0x00003a20 _ldexpl + .text.__check_heap_overflow + 0x00003a6c 0x18 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_cr_check_heap.o) + 0x00003a6c __check_heap_overflow + .text.__aeabi_dmul + 0x00003a84 0x110 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(double.o) + 0x00003a84 __aeabi_dmul + .text.__aeabi_ddiv + 0x00003b94 0x138 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(double.o) + 0x00003b94 __aeabi_ddiv + .text.__aeabi_dsub + 0x00003ccc 0x1a0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(double.o) + 0x00003ccc __aeabi_dsub + .text.__aeabi_dadd + 0x00003e6c 0x10c c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(double.o) + 0x00003e6c __aeabi_dadd + .text.__aeabi_d2iz + 0x00003f78 0x40 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(double.o) + 0x00003f78 __aeabi_d2iz + .text.__bhs_ui2d + 0x00003fb8 0x46 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(double.o) + 0x00003fb8 __bhs_ui2d + .text.__aeabi_i2d + 0x00003ffe 0x10 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(double.o) + 0x00003ffe __aeabi_i2d + .text.__aeabi_dcmpeq + 0x0000400e 0x2c c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(double.o) + 0x0000400e __aeabi_dcmpeq + .text.__aeabi_dcmplt + 0x0000403a 0x54 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(double.o) + 0x0000403a __aeabi_dcmplt + .text.__aeabi_dcmple + 0x0000408e 0x54 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(double.o) + 0x0000408e __aeabi_dcmple + .text.__aeabi_dcmpge + 0x000040e2 0x54 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(double.o) + 0x000040e2 __aeabi_dcmpge + *fill* 0x00004136 0x2 ff + .text.__aeabi_fdiv + 0x00004138 0xc0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(float.o) + 0x00004138 __aeabi_fdiv + .text.__bhs_ui2f + 0x000041f8 0x26 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(float.o) + 0x000041f8 __bhs_ui2f + .text.__aeabi_i2f + 0x0000421e 0x10 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(float.o) + 0x0000421e __aeabi_i2f + .text.__aeabi_memset_lowlevel + 0x0000422e 0x32 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(memcpy.o) + 0x0000422e __aeabi_lowlevel_memset + .text.__sys_appexit + 0x00004260 0xc c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_appexit.o) + 0x00004260 __sys_appexit + 0x00004260 __exit + .text.__sys_close + 0x0000426c 0xc c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_close.o) + 0x0000426c __sys_close + .text.__sys_flen + 0x00004278 0xc c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_flen.o) + 0x00004278 __sys_flen + .text.__sys_istty + 0x00004284 0xc c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_istty.o) + 0x00004284 __sys_istty + .text.__sys_remove + 0x00004290 0xc c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_remove.o) + 0x00004290 __sys_remove + .text.__sys_seek + 0x0000429c 0xc c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_seek.o) + 0x0000429c __sys_seek + .text.__sys_tmpnam + 0x000042a8 0xc c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_tmpnam.o) + 0x000042a8 __sys_tmpnam + .text.__sys_write + 0x000042b4 0xc c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_write.o) + 0x000042b4 __sys_write + 0x000042b4 __write + *(.rodata .rodata.* .constdata .constdata.*) + .rodata 0x000042c0 0x26 ./src/labyrinth.o + *fill* 0x000042e6 0x2 ff + .rodata 0x000042e8 0x19b C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(lcd.o) + *fill* 0x00004483 0x1 ff + .rodata 0x00004484 0xcc C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(traces.o) + .rodata 0x00004550 0x48 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(uart.o) + .rodata.str1.1 + 0x00004598 0x15 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_cr_assert.o) + .rodata.str1.1 + 0x000045ad 0x18 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(alloc.o) + .rodata.str1.1 + 0x000045c5 0x32 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fpprintf.o) + 0x35 (size before relaxing) + .rodata.str1.1 + 0x000045f7 0x4 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(initio.o) + .rodata.str1.1 + 0x000045fb 0x31 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(printf.o) + 0x38 (size before relaxing) + *fill* 0x0000462c 0x4 ff + .rodata.__huge_vall + 0x00004630 0x8 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_hugeval.o) + 0x00004630 __huge_vall + 0x00004638 . = ALIGN (0x4) + +.glue_7 0x00004638 0x0 + .glue_7 0x00004638 0x0 linker stubs + +.glue_7t 0x00004638 0x0 + .glue_7t 0x00004638 0x0 linker stubs + +.vfp11_veneer 0x00004638 0x0 + .vfp11_veneer 0x00004638 0x0 linker stubs + +.v4_bx 0x00004638 0x0 + .v4_bx 0x00004638 0x0 linker stubs + +.iplt 0x00004638 0x0 + .iplt 0x00004638 0x0 ./src/cr_startup_lpc17.o + +.rel.dyn 0x00004638 0x0 + .rel.iplt 0x00004638 0x0 ./src/cr_startup_lpc17.o + +.ARM.extab + *(.ARM.extab* .gnu.linkonce.armextab.*) + 0x00004638 __exidx_start = . + +.ARM.exidx + *(.ARM.exidx* .gnu.linkonce.armexidx.*) + 0x00004638 __exidx_end = . + 0x00004638 _etext = . + +.data_RAM2 0x2007c000 0x0 load address 0x00004638 + FILL mask 0xff + [!provide] PROVIDE (__start_data_RAM2, .) + *(.ramfunc.$RAM2) + *(.ramfunc.$RamAHB32) + *(.data.$RAM2*) + *(.data.$RamAHB32*) + 0x2007c000 . = ALIGN (0x4) + [!provide] PROVIDE (__end_data_RAM2, .) + +.uninit_RESERVED + 0x10000000 0x0 + *(.bss.$RESERVED*) + 0x10000000 . = ALIGN (0x4) + 0x10000000 _end_uninit_RESERVED = . + +.data 0x10000000 0x210 load address 0x00004638 + FILL mask 0xff + 0x10000000 _data = . + *(vtable) + *(.ramfunc*) + *(.data*) + .data.labyrinth_points + 0x10000000 0x128 ./src/labyrinth.o + .data.previous_id_in + 0x10000128 0x4 ./FreeRTOS_src/tasks.o + .data.xNextTaskUnblockTime + 0x1000012c 0x4 ./FreeRTOS_src/tasks.o + .data.olds 0x10000130 0xdc C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(custom_rand.o) + 0x10000130 olds + .data.SystemCoreClock + 0x1000020c 0x4 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\CMSISv2p00_LPC17xx\Debug\libCMSISv2p00_LPC17xx.a(system_LPC17xx.o) + 0x1000020c SystemCoreClock + 0x10000210 . = ALIGN (0x4) + 0x10000210 _edata = . + +.igot.plt 0x10000210 0x0 load address 0x00004848 + .igot.plt 0x10000210 0x0 ./src/cr_startup_lpc17.o + +.bss_RAM2 0x2007c000 0x0 + [!provide] PROVIDE (__start_bss_RAM2, .) + *(.bss.$RAM2*) + *(.bss.$RamAHB32*) + 0x2007c000 . = ALIGN ((. != 0x0)?0x4:0x1) + [!provide] PROVIDE (__end_bss_RAM2, .) + +.bss 0x10000210 0xa8c + 0x10000210 _bss = . + *(.bss*) + .bss.pxCurrentTCB + 0x10000210 0x4 ./FreeRTOS_src/tasks.o + 0x10000210 pxCurrentTCB + .bss.pxReadyTasksLists + 0x10000214 0x64 ./FreeRTOS_src/tasks.o + .bss.pxDelayedTaskList + 0x10000278 0x4 ./FreeRTOS_src/tasks.o + .bss.pxOverflowDelayedTaskList + 0x1000027c 0x4 ./FreeRTOS_src/tasks.o + .bss.xTickCount + 0x10000280 0x4 ./FreeRTOS_src/tasks.o + .bss.uxTopReadyPriority + 0x10000284 0x4 ./FreeRTOS_src/tasks.o + .bss.uxSchedulerSuspended + 0x10000288 0x4 ./FreeRTOS_src/tasks.o + .bss.uxMissedTicks + 0x1000028c 0x4 ./FreeRTOS_src/tasks.o + .bss.xMissedYield + 0x10000290 0x4 ./FreeRTOS_src/tasks.o + .bss.xNumOfOverflows + 0x10000294 0x4 ./FreeRTOS_src/tasks.o + .bss.uxTaskNumber + 0x10000298 0x4 ./FreeRTOS_src/tasks.o + .bss.i2c_h 0x1000029c 0x4 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(accelerometer.o) + .bss.trace_buffer + 0x100002a0 0x800 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(traces.o) + .bss.write_idx + 0x10000aa0 0x4 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(traces.o) + .bss.read_idx 0x10000aa4 0x4 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(traces.o) + .bss.w_byte_idx + 0x10000aa8 0x4 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(traces.o) + .bss.timer_counter + 0x10000aac 0x4 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(traces.o) + .bss.int_enabled + 0x10000ab0 0x1 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(traces.o) + .bss.trace_init_done + 0x10000ab1 0x1 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(traces.o) + *fill* 0x10000ab2 0x2 + .bss.tx_callbck + 0x10000ab4 0x4 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(uart.o) + .bss.rx_callbck + 0x10000ab8 0x4 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(uart.o) + .bss._extra 0x10000abc 0x4 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(initio.o) + 0x10000abc _extra + .bss.__Ciob 0x10000ac0 0x140 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(stdio.o) + 0x10000ac0 __Ciob + .bss._exitvector + 0x10000c00 0x84 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(stdlib.o) + 0x10000c00 _exitvector + .bss._number_of_exit_functions + 0x10000c84 0x4 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(stdlib.o) + 0x10000c84 _number_of_exit_functions + .bss.__heaps 0x10000c88 0x4 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(__init_alloc.o) + 0x10000c88 __heaps + .bss.__end_of_heap + 0x10000c8c 0x4 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(__init_alloc.o) + 0x10000c8c __end_of_heap + .bss.errno 0x10000c90 0x4 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(errno.o) + 0x10000c90 errno + *(COMMON) + COMMON 0x10000c94 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(custom_rand.o) + 0x10000c94 _j + 0x10000c98 _k + 0x10000c9c . = ALIGN (0x4) + 0x10000c9c _ebss = . + [!provide] PROVIDE (end, .) + +.noinit_RAM2 0x2007c000 0x0 + *(.noinit.$RAM2*) + *(.noinit.$RamAHB32*) + 0x2007c000 . = ALIGN (0x4) + +.noinit 0x10000c9c 0x0 + 0x10000c9c _noinit = . + *(.noinit*) + 0x10000c9c . = ALIGN (0x4) + 0x10000c9c _end_noinit = . + 0x10000c9c PROVIDE (_pvHeapStart, DEFINED (__user_heap_base)?__user_heap_base:.) + 0x10008000 PROVIDE (_vStackTop, DEFINED (__user_stack_top)?__user_stack_top:(__top_RamLoc32 - 0x0)) + [!provide] PROVIDE (__valid_user_code_checksum, (0x0 - ((((((_vStackTop + (ResetISR + 0x1)) + (NMI_Handler + 0x1)) + (HardFault_Handler + 0x1)) + (DEFINED (MemManage_Handler)?MemManage_Handler:0x0 + 0x1)) + (DEFINED (BusFault_Handler)?BusFault_Handler:0x0 + 0x1)) + (DEFINED (UsageFault_Handler)?UsageFault_Handler:0x0 + 0x1)))) +OUTPUT(TP1_labyrinth_etu.axf elf32-littlearm) + +.debug_info 0x00000000 0x528f + .debug_info 0x00000000 0x259 ./src/cr_startup_lpc17.o + .debug_info 0x00000259 0x2c5 ./src/labyrinth.o + .debug_info 0x0000051e 0x2a0 ./src/tools.o + .debug_info 0x000007be 0xd7 ./src/trace_mgt.o + .debug_info 0x00000895 0x264 ./FreeRTOS_src/list.o + .debug_info 0x00000af9 0xcbb ./FreeRTOS_src/tasks.o + .debug_info 0x000017b4 0x1c6 ./FreeRTOS_portable/port.o + .debug_info 0x0000197a 0x362 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(accelerometer.o) + .debug_info 0x00001cdc 0x126 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(custom_rand.o) + .debug_info 0x00001e02 0x127b C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(lcd.o) + .debug_info 0x0000307d 0x5ab C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(ssp.o) + .debug_info 0x00003628 0x786 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(traces.o) + .debug_info 0x00003dae 0x993 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(uart.o) + .debug_info 0x00004741 0x836 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(I2C.o) + .debug_info 0x00004f77 0x318 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\CMSISv2p00_LPC17xx\Debug\libCMSISv2p00_LPC17xx.a(system_LPC17xx.o) + +.debug_abbrev 0x00000000 0x1349 + .debug_abbrev 0x00000000 0x100 ./src/cr_startup_lpc17.o + .debug_abbrev 0x00000100 0x11a ./src/labyrinth.o + .debug_abbrev 0x0000021a 0x122 ./src/tools.o + .debug_abbrev 0x0000033c 0x8a ./src/trace_mgt.o + .debug_abbrev 0x000003c6 0xbf ./FreeRTOS_src/list.o + .debug_abbrev 0x00000485 0x1ec ./FreeRTOS_src/tasks.o + .debug_abbrev 0x00000671 0x11d ./FreeRTOS_portable/port.o + .debug_abbrev 0x0000078e 0x111 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(accelerometer.o) + .debug_abbrev 0x0000089f 0xc2 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(custom_rand.o) + .debug_abbrev 0x00000961 0x274 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(lcd.o) + .debug_abbrev 0x00000bd5 0x13a C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(ssp.o) + .debug_abbrev 0x00000d0f 0x1a2 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(traces.o) + .debug_abbrev 0x00000eb1 0x202 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(uart.o) + .debug_abbrev 0x000010b3 0x1b0 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(I2C.o) + .debug_abbrev 0x00001263 0xe6 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\CMSISv2p00_LPC17xx\Debug\libCMSISv2p00_LPC17xx.a(system_LPC17xx.o) + +.debug_aranges 0x00000000 0x550 + .debug_aranges + 0x00000000 0x68 ./src/cr_startup_lpc17.o + .debug_aranges + 0x00000068 0x28 ./src/labyrinth.o + .debug_aranges + 0x00000090 0x30 ./src/tools.o + .debug_aranges + 0x000000c0 0x20 ./src/trace_mgt.o + .debug_aranges + 0x000000e0 0x40 ./FreeRTOS_src/list.o + .debug_aranges + 0x00000120 0x120 ./FreeRTOS_src/tasks.o + .debug_aranges + 0x00000240 0x70 ./FreeRTOS_portable/port.o + .debug_aranges + 0x000002b0 0x38 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(accelerometer.o) + .debug_aranges + 0x000002e8 0x28 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(custom_rand.o) + .debug_aranges + 0x00000310 0x110 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(lcd.o) + .debug_aranges + 0x00000420 0x30 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(ssp.o) + .debug_aranges + 0x00000450 0x40 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(traces.o) + .debug_aranges + 0x00000490 0x50 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(uart.o) + .debug_aranges + 0x000004e0 0x48 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(I2C.o) + .debug_aranges + 0x00000528 0x28 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\CMSISv2p00_LPC17xx\Debug\libCMSISv2p00_LPC17xx.a(system_LPC17xx.o) + +.debug_ranges 0x00000000 0x490 + .debug_ranges 0x00000000 0x58 ./src/cr_startup_lpc17.o + .debug_ranges 0x00000058 0x18 ./src/labyrinth.o + .debug_ranges 0x00000070 0x20 ./src/tools.o + .debug_ranges 0x00000090 0x10 ./src/trace_mgt.o + .debug_ranges 0x000000a0 0x30 ./FreeRTOS_src/list.o + .debug_ranges 0x000000d0 0x110 ./FreeRTOS_src/tasks.o + .debug_ranges 0x000001e0 0x60 ./FreeRTOS_portable/port.o + .debug_ranges 0x00000240 0x28 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(accelerometer.o) + .debug_ranges 0x00000268 0x18 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(custom_rand.o) + .debug_ranges 0x00000280 0x130 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(lcd.o) + .debug_ranges 0x000003b0 0x20 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(ssp.o) + .debug_ranges 0x000003d0 0x30 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(traces.o) + .debug_ranges 0x00000400 0x40 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(uart.o) + .debug_ranges 0x00000440 0x38 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(I2C.o) + .debug_ranges 0x00000478 0x18 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\CMSISv2p00_LPC17xx\Debug\libCMSISv2p00_LPC17xx.a(system_LPC17xx.o) + +.debug_macro 0x00000000 0x4569 + .debug_macro 0x00000000 0x52 ./src/cr_startup_lpc17.o + .debug_macro 0x00000052 0x892 ./src/cr_startup_lpc17.o + .debug_macro 0x000008e4 0x10 ./src/cr_startup_lpc17.o + .debug_macro 0x000008f4 0x12d ./src/cr_startup_lpc17.o + .debug_macro 0x00000a21 0x5b2 ./src/cr_startup_lpc17.o + .debug_macro 0x00000fd3 0x1fa ./src/labyrinth.o + .debug_macro 0x000011cd 0xa0 ./src/labyrinth.o + .debug_macro 0x0000126d 0x22 ./src/labyrinth.o + .debug_macro 0x0000128f 0x22 ./src/labyrinth.o + .debug_macro 0x000012b1 0xc4 ./src/labyrinth.o + .debug_macro 0x00001375 0x46 ./src/labyrinth.o + .debug_macro 0x000013bb 0x150 ./src/labyrinth.o + .debug_macro 0x0000150b 0xa3 ./src/labyrinth.o + .debug_macro 0x000015ae 0x12 ./src/labyrinth.o + .debug_macro 0x000015c0 0x1f ./src/labyrinth.o + .debug_macro 0x000015df 0x177 ./src/labyrinth.o + .debug_macro 0x00001756 0x49 ./src/labyrinth.o + .debug_macro 0x0000179f 0x57 ./src/labyrinth.o + .debug_macro 0x000017f6 0x6a ./src/labyrinth.o + .debug_macro 0x00001860 0x62 ./src/labyrinth.o + .debug_macro 0x000018c2 0x1c ./src/labyrinth.o + .debug_macro 0x000018de 0x2e ./src/labyrinth.o + .debug_macro 0x0000190c 0x18 ./src/labyrinth.o + .debug_macro 0x00001924 0x7af ./src/labyrinth.o + .debug_macro 0x000020d3 0x2c7 ./src/labyrinth.o + .debug_macro 0x0000239a 0x1c ./src/labyrinth.o + .debug_macro 0x000023b6 0x28 ./src/labyrinth.o + .debug_macro 0x000023de 0x1c ./src/labyrinth.o + .debug_macro 0x000023fa 0xc2 ./src/labyrinth.o + .debug_macro 0x000024bc 0xd6 ./src/labyrinth.o + .debug_macro 0x00002592 0x22 ./src/labyrinth.o + .debug_macro 0x000025b4 0x10 ./src/labyrinth.o + .debug_macro 0x000025c4 0xc0 ./src/tools.o + .debug_macro 0x00002684 0xc4 ./src/tools.o + .debug_macro 0x00002748 0x1c ./src/tools.o + .debug_macro 0x00002764 0x135 ./src/trace_mgt.o + .debug_macro 0x00002899 0x10 ./src/trace_mgt.o + .debug_macro 0x000028a9 0x150 ./src/trace_mgt.o + .debug_macro 0x000029f9 0x2e ./src/trace_mgt.o + .debug_macro 0x00002a27 0x9d ./FreeRTOS_src/list.o + .debug_macro 0x00002ac4 0x28 ./FreeRTOS_src/list.o + .debug_macro 0x00002aec 0x130 ./FreeRTOS_src/tasks.o + .debug_macro 0x00002c1c 0x61 ./FreeRTOS_src/tasks.o + .debug_macro 0x00002c7d 0x16 ./FreeRTOS_src/tasks.o + .debug_macro 0x00002c93 0xda ./FreeRTOS_portable/port.o + .debug_macro 0x00002d6d 0xaf C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(accelerometer.o) + .debug_macro 0x00002e1c 0x898 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(accelerometer.o) + .debug_macro 0x000036b4 0x58 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(accelerometer.o) + .debug_macro 0x0000370c 0x46 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(custom_rand.o) + .debug_macro 0x00003752 0x108 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(lcd.o) + .debug_macro 0x0000385a 0x9a C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(lcd.o) + .debug_macro 0x000038f4 0x90 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(ssp.o) + .debug_macro 0x00003984 0x22 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(ssp.o) + .debug_macro 0x000039a6 0xcf C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(traces.o) + .debug_macro 0x00003a75 0xa0 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(uart.o) + .debug_macro 0x00003b15 0x16 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(uart.o) + .debug_macro 0x00003b2b 0x8d C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(I2C.o) + .debug_macro 0x00003bb8 0x12b C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\CMSISv2p00_LPC17xx\Debug\libCMSISv2p00_LPC17xx.a(system_LPC17xx.o) + .debug_macro 0x00003ce3 0x886 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\CMSISv2p00_LPC17xx\Debug\libCMSISv2p00_LPC17xx.a(system_LPC17xx.o) + +.debug_line 0x00000000 0x2f94 + .debug_line 0x00000000 0x1da ./src/cr_startup_lpc17.o + .debug_line 0x000001da 0x335 ./src/labyrinth.o + .debug_line 0x0000050f 0x327 ./src/tools.o + .debug_line 0x00000836 0x28f ./src/trace_mgt.o + .debug_line 0x00000ac5 0x21e ./FreeRTOS_src/list.o + .debug_line 0x00000ce3 0x709 ./FreeRTOS_src/tasks.o + .debug_line 0x000013ec 0x268 ./FreeRTOS_portable/port.o + .debug_line 0x00001654 0x289 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(accelerometer.o) + .debug_line 0x000018dd 0x196 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(custom_rand.o) + .debug_line 0x00001a73 0x7fc C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(lcd.o) + .debug_line 0x0000226f 0x24a C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(ssp.o) + .debug_line 0x000024b9 0x2f9 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(traces.o) + .debug_line 0x000027b2 0x2b7 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(uart.o) + .debug_line 0x00002a69 0x358 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(I2C.o) + .debug_line 0x00002dc1 0x1d3 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\CMSISv2p00_LPC17xx\Debug\libCMSISv2p00_LPC17xx.a(system_LPC17xx.o) + +.debug_str 0x00000000 0xe70f + .debug_str 0x00000000 0x3d83 ./src/cr_startup_lpc17.o + 0x3e02 (size before relaxing) + .debug_str 0x00003d83 0x7cf4 ./src/labyrinth.o + 0xb991 (size before relaxing) + .debug_str 0x0000ba77 0x9a ./src/tools.o + 0x88b9 (size before relaxing) + .debug_str 0x0000bb11 0xa9 ./src/trace_mgt.o + 0xa947 (size before relaxing) + .debug_str 0x0000bbba 0x142 ./FreeRTOS_src/list.o + 0x4536 (size before relaxing) + .debug_str 0x0000bcfc 0x11c8 ./FreeRTOS_src/tasks.o + 0x5bfb (size before relaxing) + .debug_str 0x0000cec4 0x368 ./FreeRTOS_portable/port.o + 0x4a5e (size before relaxing) + .debug_str 0x0000d22c 0x268 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(accelerometer.o) + 0x83a7 (size before relaxing) + .debug_str 0x0000d494 0x2a C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(custom_rand.o) + 0x3ca7 (size before relaxing) + .debug_str 0x0000d4be 0x547 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(lcd.o) + 0x8ffe (size before relaxing) + .debug_str 0x0000da05 0x2fa C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(ssp.o) + 0x80da (size before relaxing) + .debug_str 0x0000dcff 0x176 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(traces.o) + 0x83b3 (size before relaxing) + .debug_str 0x0000de75 0x390 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(uart.o) + 0x8474 (size before relaxing) + .debug_str 0x0000e205 0x10a C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(I2C.o) + 0x8278 (size before relaxing) + .debug_str 0x0000e30f 0x400 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\CMSISv2p00_LPC17xx\Debug\libCMSISv2p00_LPC17xx.a(system_LPC17xx.o) + 0x8146 (size before relaxing) + +.comment 0x00000000 0xdc + .comment 0x00000000 0x6e ./src/cr_startup_lpc17.o + 0x6f (size before relaxing) + .comment 0x0000006e 0x6f ./src/labyrinth.o + .comment 0x0000006e 0x6f ./src/tools.o + .comment 0x0000006e 0x6f ./src/trace_mgt.o + .comment 0x0000006e 0x6f ./FreeRTOS_src/list.o + .comment 0x0000006e 0x6f ./FreeRTOS_src/tasks.o + .comment 0x0000006e 0x6f ./FreeRTOS_portable/port.o + .comment 0x0000006e 0x6f C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(accelerometer.o) + .comment 0x0000006e 0x6f C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(custom_rand.o) + .comment 0x0000006e 0x6f C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(lcd.o) + .comment 0x0000006e 0x6f C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(ssp.o) + .comment 0x0000006e 0x6f C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(traces.o) + .comment 0x0000006e 0x6f C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(uart.o) + .comment 0x0000006e 0x6f C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(I2C.o) + .comment 0x0000006e 0x6f C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\CMSISv2p00_LPC17xx\Debug\libCMSISv2p00_LPC17xx.a(system_LPC17xx.o) + .comment 0x0000006e 0x6e c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(_cr__main.o) + 0x6f (size before relaxing) + .comment 0x000000dc 0x6f c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(memset.o) + .comment 0x000000dc 0x6f c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_cr_assert.o) + .comment 0x000000dc 0x6f c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_deferredlazyseek.o) + .comment 0x000000dc 0x6f c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_fflush.o) + .comment 0x000000dc 0x6f c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_writebuf.o) + .comment 0x000000dc 0x6f c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(alloc.o) + .comment 0x000000dc 0x6f c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fclose.o) + .comment 0x000000dc 0x6f c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fflush.o) + .comment 0x000000dc 0x6f c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fpprintf.o) + .comment 0x000000dc 0x6f c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fputs.o) + .comment 0x000000dc 0x6f c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fseek.o) + .comment 0x000000dc 0x6f c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(ftell.o) + .comment 0x000000dc 0x6f c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(initio.o) + .comment 0x000000dc 0x6f c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(printf.o) + .comment 0x000000dc 0x6f c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(remove.o) + .comment 0x000000dc 0x6f c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(setvbuf.o) + .comment 0x000000dc 0x6f c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(stdio.o) + .comment 0x000000dc 0x6f c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(stdlib.o) + .comment 0x000000dc 0x6f c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(strlen.o) + .comment 0x000000dc 0x6f c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(__init_alloc.o) + .comment 0x000000dc 0x6f c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_cr_sbrk.o) + .comment 0x000000dc 0x6f c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_do_fflush.o) + .comment 0x000000dc 0x6f c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_fdopen.o) + .comment 0x000000dc 0x6f c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_frexpl.o) + .comment 0x000000dc 0x6f c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_hugeval.o) + .comment 0x000000dc 0x6f c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_ldexpl.o) + .comment 0x000000dc 0x6f c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(errno.o) + .comment 0x000000dc 0x6f c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_cr_check_heap.o) + .comment 0x000000dc 0x6f c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(double.o) + .comment 0x000000dc 0x6f c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(float.o) + +.ARM.attributes + 0x00000000 0x31 + .ARM.attributes + 0x00000000 0x33 ./src/cr_startup_lpc17.o + .ARM.attributes + 0x00000033 0x33 ./src/labyrinth.o + .ARM.attributes + 0x00000066 0x33 ./src/tools.o + .ARM.attributes + 0x00000099 0x33 ./src/trace_mgt.o + .ARM.attributes + 0x000000cc 0x33 ./FreeRTOS_src/list.o + .ARM.attributes + 0x000000ff 0x33 ./FreeRTOS_src/tasks.o + .ARM.attributes + 0x00000132 0x33 ./FreeRTOS_portable/port.o + .ARM.attributes + 0x00000165 0x33 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(accelerometer.o) + .ARM.attributes + 0x00000198 0x33 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(custom_rand.o) + .ARM.attributes + 0x000001cb 0x33 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(lcd.o) + .ARM.attributes + 0x000001fe 0x33 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(ssp.o) + .ARM.attributes + 0x00000231 0x33 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(traces.o) + .ARM.attributes + 0x00000264 0x33 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(uart.o) + .ARM.attributes + 0x00000297 0x33 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(I2C.o) + .ARM.attributes + 0x000002ca 0x33 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\CMSISv2p00_LPC17xx\Debug\libCMSISv2p00_LPC17xx.a(system_LPC17xx.o) + .ARM.attributes + 0x000002fd 0x33 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(_cr__main.o) + .ARM.attributes + 0x00000330 0x33 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(memset.o) + .ARM.attributes + 0x00000363 0x33 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_cr_assert.o) + .ARM.attributes + 0x00000396 0x33 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_deferredlazyseek.o) + .ARM.attributes + 0x000003c9 0x33 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_fflush.o) + .ARM.attributes + 0x000003fc 0x33 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_writebuf.o) + .ARM.attributes + 0x0000042f 0x33 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(alloc.o) + .ARM.attributes + 0x00000462 0x33 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fclose.o) + .ARM.attributes + 0x00000495 0x33 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fflush.o) + .ARM.attributes + 0x000004c8 0x33 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fpprintf.o) + .ARM.attributes + 0x000004fb 0x33 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fputs.o) + .ARM.attributes + 0x0000052e 0x33 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fseek.o) + .ARM.attributes + 0x00000561 0x33 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(ftell.o) + .ARM.attributes + 0x00000594 0x33 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(initio.o) + .ARM.attributes + 0x000005c7 0x33 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(printf.o) + .ARM.attributes + 0x000005fa 0x33 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(remove.o) + .ARM.attributes + 0x0000062d 0x33 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(setvbuf.o) + .ARM.attributes + 0x00000660 0x33 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(stdio.o) + .ARM.attributes + 0x00000693 0x33 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(stdlib.o) + .ARM.attributes + 0x000006c6 0x33 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(strlen.o) + .ARM.attributes + 0x000006f9 0x33 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(__init_alloc.o) + .ARM.attributes + 0x0000072c 0x33 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_cr_sbrk.o) + .ARM.attributes + 0x0000075f 0x33 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_do_fflush.o) + .ARM.attributes + 0x00000792 0x33 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_fdopen.o) + .ARM.attributes + 0x000007c5 0x33 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_frexpl.o) + .ARM.attributes + 0x000007f8 0x33 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_hugeval.o) + .ARM.attributes + 0x0000082b 0x33 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_ldexpl.o) + .ARM.attributes + 0x0000085e 0x33 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(errno.o) + .ARM.attributes + 0x00000891 0x33 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_cr_check_heap.o) + .ARM.attributes + 0x000008c4 0x33 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(double.o) + .ARM.attributes + 0x000008f7 0x33 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(float.o) + .ARM.attributes + 0x0000092a 0x21 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(memcpy.o) + .ARM.attributes + 0x0000094b 0x21 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_appexit.o) + .ARM.attributes + 0x0000096c 0x21 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_close.o) + .ARM.attributes + 0x0000098d 0x21 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_flen.o) + .ARM.attributes + 0x000009ae 0x21 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_istty.o) + .ARM.attributes + 0x000009cf 0x21 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_remove.o) + .ARM.attributes + 0x000009f0 0x21 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_seek.o) + .ARM.attributes + 0x00000a11 0x21 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_tmpnam.o) + .ARM.attributes + 0x00000a32 0x21 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_write.o) + +.debug_frame 0x00000000 0x1234 + .debug_frame 0x00000000 0x128 ./src/cr_startup_lpc17.o + .debug_frame 0x00000128 0x5c ./src/labyrinth.o + .debug_frame 0x00000184 0x90 ./src/tools.o + .debug_frame 0x00000214 0x34 ./src/trace_mgt.o + .debug_frame 0x00000248 0xd8 ./FreeRTOS_src/list.o + .debug_frame 0x00000320 0x4b4 ./FreeRTOS_src/tasks.o + .debug_frame 0x000007d4 0x148 ./FreeRTOS_portable/port.o + .debug_frame 0x0000091c 0xa0 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(accelerometer.o) + .debug_frame 0x000009bc 0x5c C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(custom_rand.o) + .debug_frame 0x00000a18 0x48c C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(lcd.o) + .debug_frame 0x00000ea4 0x88 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(ssp.o) + .debug_frame 0x00000f2c 0xcc C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(traces.o) + .debug_frame 0x00000ff8 0x108 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(uart.o) + .debug_frame 0x00001100 0xf8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug\libMylab_lib.a(I2C.o) + .debug_frame 0x000011f8 0x3c C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\CMSISv2p00_LPC17xx\Debug\libCMSISv2p00_LPC17xx.a(system_LPC17xx.o) diff --git a/TP1_labyrinth_etu/Debug/TP1_labyrinth_ref.axf b/TP1_labyrinth_etu/Debug/TP1_labyrinth_ref.axf new file mode 100644 index 0000000000000000000000000000000000000000..85e71fb402db0cf5f141bf8acfab334b3717f81b Binary files /dev/null and b/TP1_labyrinth_etu/Debug/TP1_labyrinth_ref.axf differ diff --git a/TP1_labyrinth_etu/Debug/libMyLab_lib.a b/TP1_labyrinth_etu/Debug/libMyLab_lib.a new file mode 100644 index 0000000000000000000000000000000000000000..a1719c2b85c94b5e654936c41a3f48c616a4ae6a Binary files /dev/null and b/TP1_labyrinth_etu/Debug/libMyLab_lib.a differ diff --git a/TP1_labyrinth_etu/Debug/makefile b/TP1_labyrinth_etu/Debug/makefile new file mode 100644 index 0000000000000000000000000000000000000000..2a97db90e3fb5b17f74472b82e5a0becffe5727a --- /dev/null +++ b/TP1_labyrinth_etu/Debug/makefile @@ -0,0 +1,53 @@ +################################################################################ +# Automatically-generated file. Do not edit! +################################################################################ + +-include ../makefile.init + +RM := rm -rf + +# All of the sources participating in the build are defined here +-include sources.mk +-include src/subdir.mk +-include FreeRTOS_src/subdir.mk +-include FreeRTOS_portable/MemMang/subdir.mk +-include FreeRTOS_portable/subdir.mk +-include subdir.mk +-include objects.mk + +ifneq ($(MAKECMDGOALS),clean) +ifneq ($(strip $(C_DEPS)),) +-include $(C_DEPS) +endif +endif + +-include ../makefile.defs + +# Add inputs and outputs from these tool invocations to the build variables + +# All Target +all: TP1_labyrinth_etu.axf + +# Tool invocations +TP1_labyrinth_etu.axf: $(OBJS) $(USER_OBJS) + @echo 'Building target: $@' + @echo 'Invoking: MCU Linker' + arm-none-eabi-gcc -nostdlib -L"C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_etu\Debug" -L"C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\CMSISv2p00_LPC17xx\Debug" -Xlinker -Map="TP1_labyrinth_etu.map" -Xlinker --gc-sections -mcpu=cortex-m3 -mthumb -T "TP1_labyrinth_Debug.ld" -o "TP1_labyrinth_etu.axf" $(OBJS) $(USER_OBJS) $(LIBS) + @echo 'Finished building target: $@' + @echo ' ' + $(MAKE) --no-print-directory post-build + +# Other Targets +clean: + -$(RM) $(EXECUTABLES)$(OBJS)$(C_DEPS) TP1_labyrinth_etu.axf + -@echo ' ' + +post-build: + -@echo 'Performing post-build steps' + -arm-none-eabi-size "TP1_labyrinth_etu.axf"; # arm-none-eabi-objcopy -O binary "TP1_labyrinth_etu.axf" "TP1_labyrinth_etu.bin" ; checksum -p LPC1769 -d "TP1_labyrinth_etu.bin"; + -@echo ' ' + +.PHONY: all clean dependents +.SECONDARY: post-build + +-include ../makefile.targets diff --git a/TP1_labyrinth_etu/Debug/objects.mk b/TP1_labyrinth_etu/Debug/objects.mk new file mode 100644 index 0000000000000000000000000000000000000000..0e09a97a6da64121437a36ee5b12303e1088454e --- /dev/null +++ b/TP1_labyrinth_etu/Debug/objects.mk @@ -0,0 +1,8 @@ +################################################################################ +# Automatically-generated file. Do not edit! +################################################################################ + +USER_OBJS := + +LIBS := -lMylab_lib -lCMSISv2p00_LPC17xx + diff --git a/TP1_labyrinth_etu/Debug/sources.mk b/TP1_labyrinth_etu/Debug/sources.mk new file mode 100644 index 0000000000000000000000000000000000000000..4c81af4a8c05fe72af0729002a5d7e53b980ee72 --- /dev/null +++ b/TP1_labyrinth_etu/Debug/sources.mk @@ -0,0 +1,21 @@ +################################################################################ +# Automatically-generated file. Do not edit! +################################################################################ + +OBJ_SRCS := +S_SRCS := +ASM_SRCS := +C_SRCS := +S_UPPER_SRCS := +O_SRCS := +EXECUTABLES := +OBJS := +C_DEPS := + +# Every subdirectory with source files must be described here +SUBDIRS := \ +FreeRTOS_portable/MemMang \ +FreeRTOS_portable \ +FreeRTOS_src \ +src \ + diff --git a/TP1_labyrinth_etu/Debug/src/cr_startup_lpc17.d b/TP1_labyrinth_etu/Debug/src/cr_startup_lpc17.d new file mode 100644 index 0000000000000000000000000000000000000000..9cc23ef37d474b41d05839cf4dcaf229d2973130 --- /dev/null +++ b/TP1_labyrinth_etu/Debug/src/cr_startup_lpc17.d @@ -0,0 +1,4 @@ +src/cr_startup_lpc17.o src/cr_startup_lpc17.d: ../src/cr_startup_lpc17.c \ + C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\CMSISv2p00_LPC17xx\inc/system_LPC17xx.h + +C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\CMSISv2p00_LPC17xx\inc/system_LPC17xx.h: diff --git a/TP1_labyrinth_etu/Debug/src/cr_startup_lpc17.o b/TP1_labyrinth_etu/Debug/src/cr_startup_lpc17.o new file mode 100644 index 0000000000000000000000000000000000000000..6533a9fc0a377e2fe3da170548f26f73da5e841d Binary files /dev/null and b/TP1_labyrinth_etu/Debug/src/cr_startup_lpc17.o differ diff --git a/TP1_labyrinth_etu/Debug/src/debug.d b/TP1_labyrinth_etu/Debug/src/debug.d new file mode 100644 index 0000000000000000000000000000000000000000..4d138b1e6df3331b7eb3624f1bdbb1534c2ab61d --- /dev/null +++ b/TP1_labyrinth_etu/Debug/src/debug.d @@ -0,0 +1,46 @@ +src/debug.o src/debug.d: ../src/debug.c ../src/debug.h \ + C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\CMSISv2p00_LPC17xx\inc/LPC17xx.h \ + C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\CMSISv2p00_LPC17xx\inc/core_cm3.h \ + C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\CMSISv2p00_LPC17xx\inc/core_cmInstr.h \ + C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\CMSISv2p00_LPC17xx\inc/core_cmFunc.h \ + C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\CMSISv2p00_LPC17xx\inc/system_LPC17xx.h \ + ../FreeRTOS_include/FreeRTOS.h ../FreeRTOS_include/projdefs.h \ + ../src/FreeRTOSConfig.h ../FreeRTOS_include/portable.h \ + ../FreeRTOS_portable/portmacro.h ../FreeRTOS_include/mpu_wrappers.h \ + ../FreeRTOS_include/task.h ../FreeRTOS_include/list.h \ + ../FreeRTOS_include/queue.h ../FreeRTOS_include/semphr.h \ + ../FreeRTOS_include/queue.h + +../src/debug.h: + +C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\CMSISv2p00_LPC17xx\inc/LPC17xx.h: + +C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\CMSISv2p00_LPC17xx\inc/core_cm3.h: + +C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\CMSISv2p00_LPC17xx\inc/core_cmInstr.h: + +C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\CMSISv2p00_LPC17xx\inc/core_cmFunc.h: + +C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\CMSISv2p00_LPC17xx\inc/system_LPC17xx.h: + +../FreeRTOS_include/FreeRTOS.h: + +../FreeRTOS_include/projdefs.h: + +../src/FreeRTOSConfig.h: + +../FreeRTOS_include/portable.h: + +../FreeRTOS_portable/portmacro.h: + +../FreeRTOS_include/mpu_wrappers.h: + +../FreeRTOS_include/task.h: + +../FreeRTOS_include/list.h: + +../FreeRTOS_include/queue.h: + +../FreeRTOS_include/semphr.h: + +../FreeRTOS_include/queue.h: diff --git a/TP1_labyrinth_etu/Debug/src/labyrinth.d b/TP1_labyrinth_etu/Debug/src/labyrinth.d new file mode 100644 index 0000000000000000000000000000000000000000..a512ad631bc1473c2f2584b0d822b27ae31bbdcd --- /dev/null +++ b/TP1_labyrinth_etu/Debug/src/labyrinth.d @@ -0,0 +1,62 @@ +src/labyrinth.o src/labyrinth.d: ../src/labyrinth.c \ + ../FreeRTOS_include/FreeRTOS.h ../FreeRTOS_include/projdefs.h \ + ../src/FreeRTOSConfig.h ../FreeRTOS_include/portable.h \ + ../FreeRTOS_portable/portmacro.h ../FreeRTOS_include/mpu_wrappers.h \ + ../FreeRTOS_include/task.h ../FreeRTOS_include/list.h \ + ../FreeRTOS_include/queue.h ../FreeRTOS_include/semphr.h \ + ../FreeRTOS_include/queue.h ../src/lcd.h \ + C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\CMSISv2p00_LPC17xx\inc/LPC17xx.h \ + C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\CMSISv2p00_LPC17xx\inc/core_cm3.h \ + C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\CMSISv2p00_LPC17xx\inc/core_cmInstr.h \ + C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\CMSISv2p00_LPC17xx\inc/core_cmFunc.h \ + C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\CMSISv2p00_LPC17xx\inc/system_LPC17xx.h \ + ../src/ssp.h ../src/fonts.h ../src/accelerometer.h ../src/ethernet_mgt.h \ + ../src/tools.h ../src/custom_rand.h ../src/traces_ref.h + +../FreeRTOS_include/FreeRTOS.h: + +../FreeRTOS_include/projdefs.h: + +../src/FreeRTOSConfig.h: + +../FreeRTOS_include/portable.h: + +../FreeRTOS_portable/portmacro.h: + +../FreeRTOS_include/mpu_wrappers.h: + +../FreeRTOS_include/task.h: + +../FreeRTOS_include/list.h: + +../FreeRTOS_include/queue.h: + +../FreeRTOS_include/semphr.h: + +../FreeRTOS_include/queue.h: + +../src/lcd.h: + +C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\CMSISv2p00_LPC17xx\inc/LPC17xx.h: + +C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\CMSISv2p00_LPC17xx\inc/core_cm3.h: + +C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\CMSISv2p00_LPC17xx\inc/core_cmInstr.h: + +C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\CMSISv2p00_LPC17xx\inc/core_cmFunc.h: + +C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\CMSISv2p00_LPC17xx\inc/system_LPC17xx.h: + +../src/ssp.h: + +../src/fonts.h: + +../src/accelerometer.h: + +../src/ethernet_mgt.h: + +../src/tools.h: + +../src/custom_rand.h: + +../src/traces_ref.h: diff --git a/TP1_labyrinth_etu/Debug/src/labyrinth.o b/TP1_labyrinth_etu/Debug/src/labyrinth.o new file mode 100644 index 0000000000000000000000000000000000000000..1946169dd5ffb324a7c3084ca9581e2afb75f8e5 Binary files /dev/null and b/TP1_labyrinth_etu/Debug/src/labyrinth.o differ diff --git a/TP1_labyrinth_etu/Debug/src/subdir.mk b/TP1_labyrinth_etu/Debug/src/subdir.mk new file mode 100644 index 0000000000000000000000000000000000000000..e9d4204e65323825fd3bd6a56cad71104c6f8800 --- /dev/null +++ b/TP1_labyrinth_etu/Debug/src/subdir.mk @@ -0,0 +1,33 @@ +################################################################################ +# Automatically-generated file. Do not edit! +################################################################################ + +# Add inputs and outputs from these tool invocations to the build variables +C_SRCS += \ +../src/cr_startup_lpc17.c \ +../src/labyrinth.c \ +../src/tools.c \ +../src/trace_mgt.c + +OBJS += \ +./src/cr_startup_lpc17.o \ +./src/labyrinth.o \ +./src/tools.o \ +./src/trace_mgt.o + +C_DEPS += \ +./src/cr_startup_lpc17.d \ +./src/labyrinth.d \ +./src/tools.d \ +./src/trace_mgt.d + + +# Each subdirectory must supply rules for building sources it contributes +src/%.o: ../src/%.c + @echo 'Building file: $<' + @echo 'Invoking: MCU C Compiler' + arm-none-eabi-gcc -D__REDLIB__ -D__USE_CMSIS=CMSISv2p00_LPC17xx -DDEBUG -D__CODE_RED -DPACK_STRUCT_END=__attribute\(\(packed\)\) -DGCC_ARMCM3 -I../src -I"C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\CMSISv2p00_LPC17xx\inc" -I../FreeRTOS_include -I../FreeRTOS_portable -O0 -g3 -Wall -c -fmessage-length=0 -fno-builtin -ffunction-sections -fdata-sections -mcpu=cortex-m3 -mthumb -D__REDLIB__ -specs=redlib.specs -MMD -MP -MF"$(@:%.o=%.d)" -MT"$(@:%.o=%.o)" -MT"$(@:%.o=%.d)" -o "$@" "$<" + @echo 'Finished building: $<' + @echo ' ' + + diff --git a/TP1_labyrinth_etu/Debug/src/timer.d b/TP1_labyrinth_etu/Debug/src/timer.d new file mode 100644 index 0000000000000000000000000000000000000000..16d3ee16c451a96894d6ba5bed930d1955bdda07 --- /dev/null +++ b/TP1_labyrinth_etu/Debug/src/timer.d @@ -0,0 +1,54 @@ +src/timer.o src/timer.d: ../src/timer.c \ + C:\Users\Vincent\Documents\LPCXpresso_5.2.6_2137\w_exercices\CMSISv2p00_LPC17xx\inc/LPC17xx.h \ + C:\Users\Vincent\Documents\LPCXpresso_5.2.6_2137\w_exercices\CMSISv2p00_LPC17xx\inc/core_cm3.h \ + C:\Users\Vincent\Documents\LPCXpresso_5.2.6_2137\w_exercices\CMSISv2p00_LPC17xx\inc/core_cmInstr.h \ + C:\Users\Vincent\Documents\LPCXpresso_5.2.6_2137\w_exercices\CMSISv2p00_LPC17xx\inc/core_cmFunc.h \ + C:\Users\Vincent\Documents\LPCXpresso_5.2.6_2137\w_exercices\CMSISv2p00_LPC17xx\inc/system_LPC17xx.h \ + ../src/timer.h \ + C:\Users\Vincent\Documents\LPCXpresso_5.2.6_2137\w_exercices\lib_tool\inc/read_mic.h \ + ../src/sin_detector.h ../src/semaphores.h ../FreeRTOS_include/FreeRTOS.h \ + ../FreeRTOS_include/projdefs.h ../src/FreeRTOSConfig.h \ + ../FreeRTOS_include/portable.h ../FreeRTOS_portable/portmacro.h \ + ../FreeRTOS_include/mpu_wrappers.h ../FreeRTOS_include/task.h \ + ../FreeRTOS_include/list.h ../FreeRTOS_include/queue.h \ + ../FreeRTOS_include/semphr.h ../FreeRTOS_include/queue.h + +C:\Users\Vincent\Documents\LPCXpresso_5.2.6_2137\w_exercices\CMSISv2p00_LPC17xx\inc/LPC17xx.h: + +C:\Users\Vincent\Documents\LPCXpresso_5.2.6_2137\w_exercices\CMSISv2p00_LPC17xx\inc/core_cm3.h: + +C:\Users\Vincent\Documents\LPCXpresso_5.2.6_2137\w_exercices\CMSISv2p00_LPC17xx\inc/core_cmInstr.h: + +C:\Users\Vincent\Documents\LPCXpresso_5.2.6_2137\w_exercices\CMSISv2p00_LPC17xx\inc/core_cmFunc.h: + +C:\Users\Vincent\Documents\LPCXpresso_5.2.6_2137\w_exercices\CMSISv2p00_LPC17xx\inc/system_LPC17xx.h: + +../src/timer.h: + +C:\Users\Vincent\Documents\LPCXpresso_5.2.6_2137\w_exercices\lib_tool\inc/read_mic.h: + +../src/sin_detector.h: + +../src/semaphores.h: + +../FreeRTOS_include/FreeRTOS.h: + +../FreeRTOS_include/projdefs.h: + +../src/FreeRTOSConfig.h: + +../FreeRTOS_include/portable.h: + +../FreeRTOS_portable/portmacro.h: + +../FreeRTOS_include/mpu_wrappers.h: + +../FreeRTOS_include/task.h: + +../FreeRTOS_include/list.h: + +../FreeRTOS_include/queue.h: + +../FreeRTOS_include/semphr.h: + +../FreeRTOS_include/queue.h: diff --git a/TP1_labyrinth_etu/Debug/src/tools.d b/TP1_labyrinth_etu/Debug/src/tools.d new file mode 100644 index 0000000000000000000000000000000000000000..11be791ca2eff3d9e55794e982f9407a551f5248 --- /dev/null +++ b/TP1_labyrinth_etu/Debug/src/tools.d @@ -0,0 +1,25 @@ +src/tools.o src/tools.d: ../src/tools.c ../src/tools.h ../src/lcd.h \ + C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\CMSISv2p00_LPC17xx\inc/LPC17xx.h \ + C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\CMSISv2p00_LPC17xx\inc/core_cm3.h \ + C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\CMSISv2p00_LPC17xx\inc/core_cmInstr.h \ + C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\CMSISv2p00_LPC17xx\inc/core_cmFunc.h \ + C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\CMSISv2p00_LPC17xx\inc/system_LPC17xx.h \ + ../src/ssp.h ../src/fonts.h + +../src/tools.h: + +../src/lcd.h: + +C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\CMSISv2p00_LPC17xx\inc/LPC17xx.h: + +C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\CMSISv2p00_LPC17xx\inc/core_cm3.h: + +C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\CMSISv2p00_LPC17xx\inc/core_cmInstr.h: + +C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\CMSISv2p00_LPC17xx\inc/core_cmFunc.h: + +C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\CMSISv2p00_LPC17xx\inc/system_LPC17xx.h: + +../src/ssp.h: + +../src/fonts.h: diff --git a/TP1_labyrinth_etu/Debug/src/tools.o b/TP1_labyrinth_etu/Debug/src/tools.o new file mode 100644 index 0000000000000000000000000000000000000000..2b5c61b1fde2427607bc9929fb19a6f1dbb87b96 Binary files /dev/null and b/TP1_labyrinth_etu/Debug/src/tools.o differ diff --git a/TP1_labyrinth_etu/Debug/src/tp2_son.d b/TP1_labyrinth_etu/Debug/src/tp2_son.d new file mode 100644 index 0000000000000000000000000000000000000000..0f0c0fd02914f9c77c77b8b56b0d37b026804ae9 --- /dev/null +++ b/TP1_labyrinth_etu/Debug/src/tp2_son.d @@ -0,0 +1,60 @@ +src/tp2_son.o src/tp2_son.d: ../src/tp2_son.c ../src/demodulator.h \ + C:\Users\Vincent\Documents\LPCXpresso_5.2.6_2137\w_exercices\lib_tool\inc/read_mic.h \ + C:\Users\Vincent\Documents\LPCXpresso_5.2.6_2137\w_exercices\lib_tool\inc/ethmac.h \ + ../FreeRTOS_include/FreeRTOS.h ../FreeRTOS_include/projdefs.h \ + ../src/FreeRTOSConfig.h ../FreeRTOS_include/portable.h \ + ../FreeRTOS_portable/portmacro.h ../FreeRTOS_include/mpu_wrappers.h \ + ../FreeRTOS_include/task.h ../FreeRTOS_include/list.h \ + ../FreeRTOS_include/queue.h ../FreeRTOS_include/semphr.h \ + ../FreeRTOS_include/queue.h ../src/gpio.h \ + C:\Users\Vincent\Documents\LPCXpresso_5.2.6_2137\w_exercices\CMSISv2p00_LPC17xx\inc/LPC17xx.h \ + C:\Users\Vincent\Documents\LPCXpresso_5.2.6_2137\w_exercices\CMSISv2p00_LPC17xx\inc/core_cm3.h \ + C:\Users\Vincent\Documents\LPCXpresso_5.2.6_2137\w_exercices\CMSISv2p00_LPC17xx\inc/core_cmInstr.h \ + C:\Users\Vincent\Documents\LPCXpresso_5.2.6_2137\w_exercices\CMSISv2p00_LPC17xx\inc/core_cmFunc.h \ + C:\Users\Vincent\Documents\LPCXpresso_5.2.6_2137\w_exercices\CMSISv2p00_LPC17xx\inc/system_LPC17xx.h \ + C:\Users\Vincent\Documents\LPCXpresso_5.2.6_2137\w_exercices\lib_tool\inc/lcd.h \ + ../src/debug.h + +../src/demodulator.h: + +C:\Users\Vincent\Documents\LPCXpresso_5.2.6_2137\w_exercices\lib_tool\inc/read_mic.h: + +C:\Users\Vincent\Documents\LPCXpresso_5.2.6_2137\w_exercices\lib_tool\inc/ethmac.h: + +../FreeRTOS_include/FreeRTOS.h: + +../FreeRTOS_include/projdefs.h: + +../src/FreeRTOSConfig.h: + +../FreeRTOS_include/portable.h: + +../FreeRTOS_portable/portmacro.h: + +../FreeRTOS_include/mpu_wrappers.h: + +../FreeRTOS_include/task.h: + +../FreeRTOS_include/list.h: + +../FreeRTOS_include/queue.h: + +../FreeRTOS_include/semphr.h: + +../FreeRTOS_include/queue.h: + +../src/gpio.h: + +C:\Users\Vincent\Documents\LPCXpresso_5.2.6_2137\w_exercices\CMSISv2p00_LPC17xx\inc/LPC17xx.h: + +C:\Users\Vincent\Documents\LPCXpresso_5.2.6_2137\w_exercices\CMSISv2p00_LPC17xx\inc/core_cm3.h: + +C:\Users\Vincent\Documents\LPCXpresso_5.2.6_2137\w_exercices\CMSISv2p00_LPC17xx\inc/core_cmInstr.h: + +C:\Users\Vincent\Documents\LPCXpresso_5.2.6_2137\w_exercices\CMSISv2p00_LPC17xx\inc/core_cmFunc.h: + +C:\Users\Vincent\Documents\LPCXpresso_5.2.6_2137\w_exercices\CMSISv2p00_LPC17xx\inc/system_LPC17xx.h: + +C:\Users\Vincent\Documents\LPCXpresso_5.2.6_2137\w_exercices\lib_tool\inc/lcd.h: + +../src/debug.h: diff --git a/TP1_labyrinth_etu/Debug/src/tp2_son.o b/TP1_labyrinth_etu/Debug/src/tp2_son.o new file mode 100644 index 0000000000000000000000000000000000000000..dac76ce80549181cff71d2b3ace5cb99feea4c54 Binary files /dev/null and b/TP1_labyrinth_etu/Debug/src/tp2_son.o differ diff --git a/TP1_labyrinth_etu/Debug/src/trace_mgt.d b/TP1_labyrinth_etu/Debug/src/trace_mgt.d new file mode 100644 index 0000000000000000000000000000000000000000..a60cfe19c16052f30ced55b8be40c0924838f465 --- /dev/null +++ b/TP1_labyrinth_etu/Debug/src/trace_mgt.d @@ -0,0 +1,48 @@ +src/trace_mgt.o src/trace_mgt.d: ../src/trace_mgt.c \ + C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\CMSISv2p00_LPC17xx\inc/LPC17xx.h \ + C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\CMSISv2p00_LPC17xx\inc/core_cm3.h \ + C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\CMSISv2p00_LPC17xx\inc/core_cmInstr.h \ + C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\CMSISv2p00_LPC17xx\inc/core_cmFunc.h \ + C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\CMSISv2p00_LPC17xx\inc/system_LPC17xx.h \ + ../src/traces_ref.h ../FreeRTOS_include/FreeRTOS.h \ + ../FreeRTOS_include/projdefs.h ../src/FreeRTOSConfig.h \ + ../FreeRTOS_include/portable.h ../FreeRTOS_portable/portmacro.h \ + ../FreeRTOS_include/mpu_wrappers.h ../FreeRTOS_include/task.h \ + ../FreeRTOS_include/list.h ../FreeRTOS_include/queue.h \ + ../FreeRTOS_include/semphr.h ../FreeRTOS_include/queue.h ../src/uart.h + +C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\CMSISv2p00_LPC17xx\inc/LPC17xx.h: + +C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\CMSISv2p00_LPC17xx\inc/core_cm3.h: + +C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\CMSISv2p00_LPC17xx\inc/core_cmInstr.h: + +C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\CMSISv2p00_LPC17xx\inc/core_cmFunc.h: + +C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\CMSISv2p00_LPC17xx\inc/system_LPC17xx.h: + +../src/traces_ref.h: + +../FreeRTOS_include/FreeRTOS.h: + +../FreeRTOS_include/projdefs.h: + +../src/FreeRTOSConfig.h: + +../FreeRTOS_include/portable.h: + +../FreeRTOS_portable/portmacro.h: + +../FreeRTOS_include/mpu_wrappers.h: + +../FreeRTOS_include/task.h: + +../FreeRTOS_include/list.h: + +../FreeRTOS_include/queue.h: + +../FreeRTOS_include/semphr.h: + +../FreeRTOS_include/queue.h: + +../src/uart.h: diff --git a/TP1_labyrinth_etu/Debug/src/trace_mgt.o b/TP1_labyrinth_etu/Debug/src/trace_mgt.o new file mode 100644 index 0000000000000000000000000000000000000000..f5c0923138230dad26de82be1b4cea54dc043967 Binary files /dev/null and b/TP1_labyrinth_etu/Debug/src/trace_mgt.o differ diff --git a/TP1_labyrinth_etu/FreeRTOS_include/FreeRTOS.h b/TP1_labyrinth_etu/FreeRTOS_include/FreeRTOS.h new file mode 100644 index 0000000000000000000000000000000000000000..e5eb39abb4dcf9255946b75a0a0e8b2c2759868b --- /dev/null +++ b/TP1_labyrinth_etu/FreeRTOS_include/FreeRTOS.h @@ -0,0 +1,468 @@ +/* + FreeRTOS V7.0.1 - Copyright (C) 2011 Real Time Engineers Ltd. + + + FreeRTOS supports many tools and architectures. V7.0.0 is sponsored by: + Atollic AB - Atollic provides professional embedded systems development + tools for C/C++ development, code analysis and test automation. + See http://www.atollic.com + + + *************************************************************************** + * * + * FreeRTOS tutorial books are available in pdf and paperback. * + * Complete, revised, and edited pdf reference manuals are also * + * available. * + * * + * Purchasing FreeRTOS documentation will not only help you, by * + * ensuring you get running as quickly as possible and with an * + * in-depth knowledge of how to use FreeRTOS, it will also help * + * the FreeRTOS project to continue with its mission of providing * + * professional grade, cross platform, de facto standard solutions * + * for microcontrollers - completely free of charge! * + * * + * >>> See http://www.FreeRTOS.org/Documentation for details. <<< * + * * + * Thank you for using FreeRTOS, and thank you for your support! * + * * + *************************************************************************** + + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation AND MODIFIED BY the FreeRTOS exception. + >>>NOTE<<< The modification to the GPL is included to allow you to + distribute a combined work that includes FreeRTOS without being obliged to + provide the source code for proprietary components outside of the FreeRTOS + kernel. FreeRTOS is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + more details. You should have received a copy of the GNU General Public + License and the FreeRTOS license exception along with FreeRTOS; if not it + can be viewed here: http://www.freertos.org/a00114.html and also obtained + by writing to Richard Barry, contact details for whom are available on the + FreeRTOS WEB site. + + 1 tab == 4 spaces! + + http://www.FreeRTOS.org - Documentation, latest information, license and + contact details. + + http://www.SafeRTOS.com - A version that is certified for use in safety + critical systems. + + http://www.OpenRTOS.com - Commercial support, development, porting, + licensing and training services. +*/ + +#ifndef INC_FREERTOS_H +#define INC_FREERTOS_H + + +/* + * Include the generic headers required for the FreeRTOS port being used. + */ +#include <stddef.h> + +/* Basic FreeRTOS definitions. */ +#include "projdefs.h" + +/* Application specific configuration options. */ +#include "FreeRTOSConfig.h" + +/* Definitions specific to the port being used. */ +#include "portable.h" + + +/* Defines the prototype to which the application task hook function must +conform. */ +typedef portBASE_TYPE (*pdTASK_HOOK_CODE)( void * ); + + + + + +/* + * Check all the required application specific macros have been defined. + * These macros are application specific and (as downloaded) are defined + * within FreeRTOSConfig.h. + */ + +#ifndef configUSE_PREEMPTION + #error Missing definition: configUSE_PREEMPTION should be defined in FreeRTOSConfig.h as either 1 or 0. See the Configuration section of the FreeRTOS API documentation for details. +#endif + +#ifndef configUSE_IDLE_HOOK + #error Missing definition: configUSE_IDLE_HOOK should be defined in FreeRTOSConfig.h as either 1 or 0. See the Configuration section of the FreeRTOS API documentation for details. +#endif + +#ifndef configUSE_TICK_HOOK + #error Missing definition: configUSE_TICK_HOOK should be defined in FreeRTOSConfig.h as either 1 or 0. See the Configuration section of the FreeRTOS API documentation for details. +#endif + +#ifndef configUSE_CO_ROUTINES + #error Missing definition: configUSE_CO_ROUTINES should be defined in FreeRTOSConfig.h as either 1 or 0. See the Configuration section of the FreeRTOS API documentation for details. +#endif + +#ifndef INCLUDE_vTaskPrioritySet + #error Missing definition: INCLUDE_vTaskPrioritySet should be defined in FreeRTOSConfig.h as either 1 or 0. See the Configuration section of the FreeRTOS API documentation for details. +#endif + +#ifndef INCLUDE_uxTaskPriorityGet + #error Missing definition: INCLUDE_uxTaskPriorityGet should be defined in FreeRTOSConfig.h as either 1 or 0. See the Configuration section of the FreeRTOS API documentation for details. +#endif + +#ifndef INCLUDE_vTaskDelete + #error Missing definition: INCLUDE_vTaskDelete should be defined in FreeRTOSConfig.h as either 1 or 0. See the Configuration section of the FreeRTOS API documentation for details. +#endif + +#ifndef INCLUDE_vTaskCleanUpResources + #error Missing definition: INCLUDE_vTaskCleanUpResources should be defined in FreeRTOSConfig.h as either 1 or 0. See the Configuration section of the FreeRTOS API documentation for details. +#endif + +#ifndef INCLUDE_vTaskSuspend + #error Missing definition: INCLUDE_vTaskSuspend should be defined in FreeRTOSConfig.h as either 1 or 0. See the Configuration section of the FreeRTOS API documentation for details. +#endif + +#ifndef INCLUDE_vTaskDelayUntil + #error Missing definition: INCLUDE_vTaskDelayUntil should be defined in FreeRTOSConfig.h as either 1 or 0. See the Configuration section of the FreeRTOS API documentation for details. +#endif + +#ifndef INCLUDE_vTaskDelay + #error Missing definition: INCLUDE_vTaskDelay should be defined in FreeRTOSConfig.h as either 1 or 0. See the Configuration section of the FreeRTOS API documentation for details. +#endif + +#ifndef configUSE_16_BIT_TICKS + #error Missing definition: configUSE_16_BIT_TICKS should be defined in FreeRTOSConfig.h as either 1 or 0. See the Configuration section of the FreeRTOS API documentation for details. +#endif + +#ifndef configUSE_APPLICATION_TASK_TAG + #define configUSE_APPLICATION_TASK_TAG 0 +#endif + +#ifndef INCLUDE_uxTaskGetStackHighWaterMark + #define INCLUDE_uxTaskGetStackHighWaterMark 0 +#endif + +#ifndef configUSE_RECURSIVE_MUTEXES + #define configUSE_RECURSIVE_MUTEXES 0 +#endif + +#ifndef configUSE_MUTEXES + #define configUSE_MUTEXES 0 +#endif + +#ifndef configUSE_TIMERS + #define configUSE_TIMERS 0 +#endif + +#ifndef configUSE_COUNTING_SEMAPHORES + #define configUSE_COUNTING_SEMAPHORES 0 +#endif + +#ifndef configUSE_ALTERNATIVE_API + #define configUSE_ALTERNATIVE_API 0 +#endif + +#ifndef portCRITICAL_NESTING_IN_TCB + #define portCRITICAL_NESTING_IN_TCB 0 +#endif + +#ifndef configMAX_TASK_NAME_LEN + #define configMAX_TASK_NAME_LEN 16 +#endif + +#ifndef configIDLE_SHOULD_YIELD + #define configIDLE_SHOULD_YIELD 1 +#endif + +#if configMAX_TASK_NAME_LEN < 1 + #error configMAX_TASK_NAME_LEN must be set to a minimum of 1 in FreeRTOSConfig.h +#endif + +#ifndef INCLUDE_xTaskResumeFromISR + #define INCLUDE_xTaskResumeFromISR 1 +#endif + +#ifndef configASSERT + #define configASSERT( x ) +#endif + +/* The timers module relies on xTaskGetSchedulerState(). */ +#if configUSE_TIMERS == 1 + + #ifndef configTIMER_TASK_PRIORITY + #error If configUSE_TIMERS is set to 1 then configTIMER_TASK_PRIORITY must also be defined. + #endif /* configTIMER_TASK_PRIORITY */ + + #ifndef configTIMER_QUEUE_LENGTH + #error If configUSE_TIMERS is set to 1 then configTIMER_QUEUE_LENGTH must also be defined. + #endif /* configTIMER_QUEUE_LENGTH */ + + #ifndef configTIMER_TASK_STACK_DEPTH + #error If configUSE_TIMERS is set to 1 then configTIMER_TASK_STACK_DEPTH must also be defined. + #endif /* configTIMER_TASK_STACK_DEPTH */ + +#endif /* configUSE_TIMERS */ + +#ifndef INCLUDE_xTaskGetSchedulerState + #define INCLUDE_xTaskGetSchedulerState 0 +#endif + +#ifndef INCLUDE_xTaskGetCurrentTaskHandle + #define INCLUDE_xTaskGetCurrentTaskHandle 0 +#endif + + +#ifndef portSET_INTERRUPT_MASK_FROM_ISR + #define portSET_INTERRUPT_MASK_FROM_ISR() 0 +#endif + +#ifndef portCLEAR_INTERRUPT_MASK_FROM_ISR + #define portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedStatusValue ) ( void ) uxSavedStatusValue +#endif + + +#ifndef configQUEUE_REGISTRY_SIZE + #define configQUEUE_REGISTRY_SIZE 0U +#endif + +#if ( configQUEUE_REGISTRY_SIZE < 1U ) + #define vQueueAddToRegistry( xQueue, pcName ) + #define vQueueUnregisterQueue( xQueue ) +#endif + + +/* Remove any unused trace macros. */ +#ifndef traceSTART + /* Used to perform any necessary initialisation - for example, open a file + into which trace is to be written. */ + #define traceSTART() +#endif + +#ifndef traceEND + /* Use to close a trace, for example close a file into which trace has been + written. */ + #define traceEND() +#endif + +#ifndef traceTASK_SWITCHED_IN + /* Called after a task has been selected to run. pxCurrentTCB holds a pointer + to the task control block of the selected task. */ + #define traceTASK_SWITCHED_IN() +#endif + +#ifndef traceTASK_SWITCHED_OUT + /* Called before a task has been selected to run. pxCurrentTCB holds a pointer + to the task control block of the task being switched out. */ + #define traceTASK_SWITCHED_OUT() +#endif + +#ifndef traceBLOCKING_ON_QUEUE_RECEIVE + /* Task is about to block because it cannot read from a + queue/mutex/semaphore. pxQueue is a pointer to the queue/mutex/semaphore + upon which the read was attempted. pxCurrentTCB points to the TCB of the + task that attempted the read. */ + #define traceBLOCKING_ON_QUEUE_RECEIVE( pxQueue ) +#endif + +#ifndef traceBLOCKING_ON_QUEUE_SEND + /* Task is about to block because it cannot write to a + queue/mutex/semaphore. pxQueue is a pointer to the queue/mutex/semaphore + upon which the write was attempted. pxCurrentTCB points to the TCB of the + task that attempted the write. */ + #define traceBLOCKING_ON_QUEUE_SEND( pxQueue ) +#endif + +#ifndef configCHECK_FOR_STACK_OVERFLOW + #define configCHECK_FOR_STACK_OVERFLOW 0 +#endif + +/* The following event macros are embedded in the kernel API calls. */ + +#ifndef traceQUEUE_CREATE + #define traceQUEUE_CREATE( pxNewQueue ) +#endif + +#ifndef traceQUEUE_CREATE_FAILED + #define traceQUEUE_CREATE_FAILED() +#endif + +#ifndef traceCREATE_MUTEX + #define traceCREATE_MUTEX( pxNewQueue ) +#endif + +#ifndef traceCREATE_MUTEX_FAILED + #define traceCREATE_MUTEX_FAILED() +#endif + +#ifndef traceGIVE_MUTEX_RECURSIVE + #define traceGIVE_MUTEX_RECURSIVE( pxMutex ) +#endif + +#ifndef traceGIVE_MUTEX_RECURSIVE_FAILED + #define traceGIVE_MUTEX_RECURSIVE_FAILED( pxMutex ) +#endif + +#ifndef traceTAKE_MUTEX_RECURSIVE + #define traceTAKE_MUTEX_RECURSIVE( pxMutex ) +#endif + +#ifndef traceTAKE_MUTEX_RECURSIVE_FAILED + #define traceTAKE_MUTEX_RECURSIVE_FAILED( pxMutex ) +#endif + +#ifndef traceCREATE_COUNTING_SEMAPHORE + #define traceCREATE_COUNTING_SEMAPHORE() +#endif + +#ifndef traceCREATE_COUNTING_SEMAPHORE_FAILED + #define traceCREATE_COUNTING_SEMAPHORE_FAILED() +#endif + +#ifndef traceQUEUE_SEND + #define traceQUEUE_SEND( pxQueue ) +#endif + +#ifndef traceQUEUE_SEND_FAILED + #define traceQUEUE_SEND_FAILED( pxQueue ) +#endif + +#ifndef traceQUEUE_RECEIVE + #define traceQUEUE_RECEIVE( pxQueue ) +#endif + +#ifndef traceQUEUE_PEEK + #define traceQUEUE_PEEK( pxQueue ) +#endif + +#ifndef traceQUEUE_RECEIVE_FAILED + #define traceQUEUE_RECEIVE_FAILED( pxQueue ) +#endif + +#ifndef traceQUEUE_SEND_FROM_ISR + #define traceQUEUE_SEND_FROM_ISR( pxQueue ) +#endif + +#ifndef traceQUEUE_SEND_FROM_ISR_FAILED + #define traceQUEUE_SEND_FROM_ISR_FAILED( pxQueue ) +#endif + +#ifndef traceQUEUE_RECEIVE_FROM_ISR + #define traceQUEUE_RECEIVE_FROM_ISR( pxQueue ) +#endif + +#ifndef traceQUEUE_RECEIVE_FROM_ISR_FAILED + #define traceQUEUE_RECEIVE_FROM_ISR_FAILED( pxQueue ) +#endif + +#ifndef traceQUEUE_DELETE + #define traceQUEUE_DELETE( pxQueue ) +#endif + +#ifndef traceTASK_CREATE + #define traceTASK_CREATE( pxNewTCB ) +#endif + +#ifndef traceTASK_CREATE_FAILED + #define traceTASK_CREATE_FAILED() +#endif + +#ifndef traceTASK_DELETE + #define traceTASK_DELETE( pxTaskToDelete ) +#endif + +#ifndef traceTASK_DELAY_UNTIL + #define traceTASK_DELAY_UNTIL() +#endif + +#ifndef traceTASK_DELAY + #define traceTASK_DELAY() +#endif + +#ifndef traceTASK_PRIORITY_SET + #define traceTASK_PRIORITY_SET( pxTask, uxNewPriority ) +#endif + +#ifndef traceTASK_SUSPEND + #define traceTASK_SUSPEND( pxTaskToSuspend ) +#endif + +#ifndef traceTASK_RESUME + #define traceTASK_RESUME( pxTaskToResume ) +#endif + +#ifndef traceTASK_RESUME_FROM_ISR + #define traceTASK_RESUME_FROM_ISR( pxTaskToResume ) +#endif + +#ifndef traceTASK_INCREMENT_TICK + #define traceTASK_INCREMENT_TICK( xTickCount ) +#endif + +#ifndef traceTIMER_CREATE + #define traceTIMER_CREATE( pxNewTimer ) +#endif + +#ifndef traceTIMER_CREATE_FAILED + #define traceTIMER_CREATE_FAILED() +#endif + +#ifndef traceTIMER_COMMAND_SEND + #define traceTIMER_COMMAND_SEND( xTimer, xMessageID, xMessageValueValue, xReturn ) +#endif + +#ifndef traceTIMER_EXPIRED + #define traceTIMER_EXPIRED( pxTimer ) +#endif + +#ifndef traceTIMER_COMMAND_RECEIVED + #define traceTIMER_COMMAND_RECEIVED( pxTimer, xMessageID, xMessageValue ) +#endif + +#ifndef configGENERATE_RUN_TIME_STATS + #define configGENERATE_RUN_TIME_STATS 0 +#endif + +#if ( configGENERATE_RUN_TIME_STATS == 1 ) + + #ifndef portCONFIGURE_TIMER_FOR_RUN_TIME_STATS + #error If configGENERATE_RUN_TIME_STATS is defined then portCONFIGURE_TIMER_FOR_RUN_TIME_STATS must also be defined. portCONFIGURE_TIMER_FOR_RUN_TIME_STATS should call a port layer function to setup a peripheral timer/counter that can then be used as the run time counter time base. + #endif /* portCONFIGURE_TIMER_FOR_RUN_TIME_STATS */ + + #ifndef portGET_RUN_TIME_COUNTER_VALUE + #ifndef portALT_GET_RUN_TIME_COUNTER_VALUE + #error If configGENERATE_RUN_TIME_STATS is defined then either portGET_RUN_TIME_COUNTER_VALUE or portALT_GET_RUN_TIME_COUNTER_VALUE must also be defined. See the examples provided and the FreeRTOS web site for more information. + #endif /* portALT_GET_RUN_TIME_COUNTER_VALUE */ + #endif /* portGET_RUN_TIME_COUNTER_VALUE */ + +#endif /* configGENERATE_RUN_TIME_STATS */ + +#ifndef portCONFIGURE_TIMER_FOR_RUN_TIME_STATS + #define portCONFIGURE_TIMER_FOR_RUN_TIME_STATS() +#endif + +#ifndef configUSE_MALLOC_FAILED_HOOK + #define configUSE_MALLOC_FAILED_HOOK 0 +#endif + +#ifndef portPRIVILEGE_BIT + #define portPRIVILEGE_BIT ( ( unsigned portBASE_TYPE ) 0x00 ) +#endif + +#ifndef portYIELD_WITHIN_API + #define portYIELD_WITHIN_API portYIELD +#endif + +#ifndef pvPortMallocAligned + #define pvPortMallocAligned( x, puxStackBuffer ) ( ( ( puxStackBuffer ) == NULL ) ? ( pvPortMalloc( ( x ) ) ) : ( puxStackBuffer ) ) +#endif + +#ifndef vPortFreeAligned + #define vPortFreeAligned( pvBlockToFree ) vPortFree( pvBlockToFree ) +#endif + +#endif /* INC_FREERTOS_H */ + diff --git a/TP1_labyrinth_etu/FreeRTOS_include/StackMacros.h b/TP1_labyrinth_etu/FreeRTOS_include/StackMacros.h new file mode 100644 index 0000000000000000000000000000000000000000..1114b6d29d07273ae1f467e3ffc47954841d17ca --- /dev/null +++ b/TP1_labyrinth_etu/FreeRTOS_include/StackMacros.h @@ -0,0 +1,174 @@ +/* + FreeRTOS V7.0.1 - Copyright (C) 2011 Real Time Engineers Ltd. + + + FreeRTOS supports many tools and architectures. V7.0.0 is sponsored by: + Atollic AB - Atollic provides professional embedded systems development + tools for C/C++ development, code analysis and test automation. + See http://www.atollic.com + + + *************************************************************************** + * * + * FreeRTOS tutorial books are available in pdf and paperback. * + * Complete, revised, and edited pdf reference manuals are also * + * available. * + * * + * Purchasing FreeRTOS documentation will not only help you, by * + * ensuring you get running as quickly as possible and with an * + * in-depth knowledge of how to use FreeRTOS, it will also help * + * the FreeRTOS project to continue with its mission of providing * + * professional grade, cross platform, de facto standard solutions * + * for microcontrollers - completely free of charge! * + * * + * >>> See http://www.FreeRTOS.org/Documentation for details. <<< * + * * + * Thank you for using FreeRTOS, and thank you for your support! * + * * + *************************************************************************** + + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation AND MODIFIED BY the FreeRTOS exception. + >>>NOTE<<< The modification to the GPL is included to allow you to + distribute a combined work that includes FreeRTOS without being obliged to + provide the source code for proprietary components outside of the FreeRTOS + kernel. FreeRTOS is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + more details. You should have received a copy of the GNU General Public + License and the FreeRTOS license exception along with FreeRTOS; if not it + can be viewed here: http://www.freertos.org/a00114.html and also obtained + by writing to Richard Barry, contact details for whom are available on the + FreeRTOS WEB site. + + 1 tab == 4 spaces! + + http://www.FreeRTOS.org - Documentation, latest information, license and + contact details. + + http://www.SafeRTOS.com - A version that is certified for use in safety + critical systems. + + http://www.OpenRTOS.com - Commercial support, development, porting, + licensing and training services. +*/ + +#ifndef STACK_MACROS_H +#define STACK_MACROS_H + +/* + * Call the stack overflow hook function if the stack of the task being swapped + * out is currently overflowed, or looks like it might have overflowed in the + * past. + * + * Setting configCHECK_FOR_STACK_OVERFLOW to 1 will cause the macro to check + * the current stack state only - comparing the current top of stack value to + * the stack limit. Setting configCHECK_FOR_STACK_OVERFLOW to greater than 1 + * will also cause the last few stack bytes to be checked to ensure the value + * to which the bytes were set when the task was created have not been + * overwritten. Note this second test does not guarantee that an overflowed + * stack will always be recognised. + */ + +/*-----------------------------------------------------------*/ + +#if( configCHECK_FOR_STACK_OVERFLOW == 0 ) + + /* FreeRTOSConfig.h is not set to check for stack overflows. */ + #define taskFIRST_CHECK_FOR_STACK_OVERFLOW() + #define taskSECOND_CHECK_FOR_STACK_OVERFLOW() + +#endif /* configCHECK_FOR_STACK_OVERFLOW == 0 */ +/*-----------------------------------------------------------*/ + +#if( configCHECK_FOR_STACK_OVERFLOW == 1 ) + + /* FreeRTOSConfig.h is only set to use the first method of + overflow checking. */ + #define taskSECOND_CHECK_FOR_STACK_OVERFLOW() + +#endif +/*-----------------------------------------------------------*/ + +#if( ( configCHECK_FOR_STACK_OVERFLOW > 0 ) && ( portSTACK_GROWTH < 0 ) ) + + /* Only the current stack state is to be checked. */ + #define taskFIRST_CHECK_FOR_STACK_OVERFLOW() \ + { \ + /* Is the currently saved stack pointer within the stack limit? */ \ + if( pxCurrentTCB->pxTopOfStack <= pxCurrentTCB->pxStack ) \ + { \ + vApplicationStackOverflowHook( ( xTaskHandle ) pxCurrentTCB, pxCurrentTCB->pcTaskName ); \ + } \ + } + +#endif /* configCHECK_FOR_STACK_OVERFLOW > 0 */ +/*-----------------------------------------------------------*/ + +#if( ( configCHECK_FOR_STACK_OVERFLOW > 0 ) && ( portSTACK_GROWTH > 0 ) ) + + /* Only the current stack state is to be checked. */ + #define taskFIRST_CHECK_FOR_STACK_OVERFLOW() \ + { \ + \ + /* Is the currently saved stack pointer within the stack limit? */ \ + if( pxCurrentTCB->pxTopOfStack >= pxCurrentTCB->pxEndOfStack ) \ + { \ + vApplicationStackOverflowHook( ( xTaskHandle ) pxCurrentTCB, pxCurrentTCB->pcTaskName ); \ + } \ + } + +#endif /* configCHECK_FOR_STACK_OVERFLOW == 1 */ +/*-----------------------------------------------------------*/ + +#if( ( configCHECK_FOR_STACK_OVERFLOW > 1 ) && ( portSTACK_GROWTH < 0 ) ) + + #define taskSECOND_CHECK_FOR_STACK_OVERFLOW() \ + { \ + static const unsigned char ucExpectedStackBytes[] = { tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, \ + tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, \ + tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, \ + tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, \ + tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE }; \ + \ + \ + /* Has the extremity of the task stack ever been written over? */ \ + if( memcmp( ( void * ) pxCurrentTCB->pxStack, ( void * ) ucExpectedStackBytes, sizeof( ucExpectedStackBytes ) ) != 0 ) \ + { \ + vApplicationStackOverflowHook( ( xTaskHandle ) pxCurrentTCB, pxCurrentTCB->pcTaskName ); \ + } \ + } + +#endif /* #if( configCHECK_FOR_STACK_OVERFLOW > 1 ) */ +/*-----------------------------------------------------------*/ + +#if( ( configCHECK_FOR_STACK_OVERFLOW > 1 ) && ( portSTACK_GROWTH > 0 ) ) + + #define taskSECOND_CHECK_FOR_STACK_OVERFLOW() \ + { \ + char *pcEndOfStack = ( char * ) pxCurrentTCB->pxEndOfStack; \ + static const unsigned char ucExpectedStackBytes[] = { tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, \ + tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, \ + tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, \ + tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, \ + tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE }; \ + \ + \ + pcEndOfStack -= sizeof( ucExpectedStackBytes ); \ + \ + /* Has the extremity of the task stack ever been written over? */ \ + if( memcmp( ( void * ) pcEndOfStack, ( void * ) ucExpectedStackBytes, sizeof( ucExpectedStackBytes ) ) != 0 ) \ + { \ + vApplicationStackOverflowHook( ( xTaskHandle ) pxCurrentTCB, pxCurrentTCB->pcTaskName ); \ + } \ + } + +#endif /* #if( configCHECK_FOR_STACK_OVERFLOW > 1 ) */ +/*-----------------------------------------------------------*/ + +#endif /* STACK_MACROS_H */ + diff --git a/TP1_labyrinth_etu/FreeRTOS_include/croutine.h b/TP1_labyrinth_etu/FreeRTOS_include/croutine.h new file mode 100644 index 0000000000000000000000000000000000000000..65fdc48e082be282a857ca7f186d5baef71b04fd --- /dev/null +++ b/TP1_labyrinth_etu/FreeRTOS_include/croutine.h @@ -0,0 +1,752 @@ +/* + FreeRTOS V7.0.1 - Copyright (C) 2011 Real Time Engineers Ltd. + + + FreeRTOS supports many tools and architectures. V7.0.0 is sponsored by: + Atollic AB - Atollic provides professional embedded systems development + tools for C/C++ development, code analysis and test automation. + See http://www.atollic.com + + + *************************************************************************** + * * + * FreeRTOS tutorial books are available in pdf and paperback. * + * Complete, revised, and edited pdf reference manuals are also * + * available. * + * * + * Purchasing FreeRTOS documentation will not only help you, by * + * ensuring you get running as quickly as possible and with an * + * in-depth knowledge of how to use FreeRTOS, it will also help * + * the FreeRTOS project to continue with its mission of providing * + * professional grade, cross platform, de facto standard solutions * + * for microcontrollers - completely free of charge! * + * * + * >>> See http://www.FreeRTOS.org/Documentation for details. <<< * + * * + * Thank you for using FreeRTOS, and thank you for your support! * + * * + *************************************************************************** + + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation AND MODIFIED BY the FreeRTOS exception. + >>>NOTE<<< The modification to the GPL is included to allow you to + distribute a combined work that includes FreeRTOS without being obliged to + provide the source code for proprietary components outside of the FreeRTOS + kernel. FreeRTOS is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + more details. You should have received a copy of the GNU General Public + License and the FreeRTOS license exception along with FreeRTOS; if not it + can be viewed here: http://www.freertos.org/a00114.html and also obtained + by writing to Richard Barry, contact details for whom are available on the + FreeRTOS WEB site. + + 1 tab == 4 spaces! + + http://www.FreeRTOS.org - Documentation, latest information, license and + contact details. + + http://www.SafeRTOS.com - A version that is certified for use in safety + critical systems. + + http://www.OpenRTOS.com - Commercial support, development, porting, + licensing and training services. +*/ + +#ifndef CO_ROUTINE_H +#define CO_ROUTINE_H + +#ifndef INC_FREERTOS_H + #error "include FreeRTOS.h must appear in source files before include croutine.h" +#endif + +#include "list.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* Used to hide the implementation of the co-routine control block. The +control block structure however has to be included in the header due to +the macro implementation of the co-routine functionality. */ +typedef void * xCoRoutineHandle; + +/* Defines the prototype to which co-routine functions must conform. */ +typedef void (*crCOROUTINE_CODE)( xCoRoutineHandle, unsigned portBASE_TYPE ); + +typedef struct corCoRoutineControlBlock +{ + crCOROUTINE_CODE pxCoRoutineFunction; + xListItem xGenericListItem; /*< List item used to place the CRCB in ready and blocked queues. */ + xListItem xEventListItem; /*< List item used to place the CRCB in event lists. */ + unsigned portBASE_TYPE uxPriority; /*< The priority of the co-routine in relation to other co-routines. */ + unsigned portBASE_TYPE uxIndex; /*< Used to distinguish between co-routines when multiple co-routines use the same co-routine function. */ + unsigned short uxState; /*< Used internally by the co-routine implementation. */ +} corCRCB; /* Co-routine control block. Note must be identical in size down to uxPriority with tskTCB. */ + +/** + * croutine. h + *<pre> + portBASE_TYPE xCoRoutineCreate( + crCOROUTINE_CODE pxCoRoutineCode, + unsigned portBASE_TYPE uxPriority, + unsigned portBASE_TYPE uxIndex + );</pre> + * + * Create a new co-routine and add it to the list of co-routines that are + * ready to run. + * + * @param pxCoRoutineCode Pointer to the co-routine function. Co-routine + * functions require special syntax - see the co-routine section of the WEB + * documentation for more information. + * + * @param uxPriority The priority with respect to other co-routines at which + * the co-routine will run. + * + * @param uxIndex Used to distinguish between different co-routines that + * execute the same function. See the example below and the co-routine section + * of the WEB documentation for further information. + * + * @return pdPASS if the co-routine was successfully created and added to a ready + * list, otherwise an error code defined with ProjDefs.h. + * + * Example usage: + <pre> + // Co-routine to be created. + void vFlashCoRoutine( xCoRoutineHandle xHandle, unsigned portBASE_TYPE uxIndex ) + { + // Variables in co-routines must be declared static if they must maintain value across a blocking call. + // This may not be necessary for const variables. + static const char cLedToFlash[ 2 ] = { 5, 6 }; + static const portTickType uxFlashRates[ 2 ] = { 200, 400 }; + + // Must start every co-routine with a call to crSTART(); + crSTART( xHandle ); + + for( ;; ) + { + // This co-routine just delays for a fixed period, then toggles + // an LED. Two co-routines are created using this function, so + // the uxIndex parameter is used to tell the co-routine which + // LED to flash and how long to delay. This assumes xQueue has + // already been created. + vParTestToggleLED( cLedToFlash[ uxIndex ] ); + crDELAY( xHandle, uxFlashRates[ uxIndex ] ); + } + + // Must end every co-routine with a call to crEND(); + crEND(); + } + + // Function that creates two co-routines. + void vOtherFunction( void ) + { + unsigned char ucParameterToPass; + xTaskHandle xHandle; + + // Create two co-routines at priority 0. The first is given index 0 + // so (from the code above) toggles LED 5 every 200 ticks. The second + // is given index 1 so toggles LED 6 every 400 ticks. + for( uxIndex = 0; uxIndex < 2; uxIndex++ ) + { + xCoRoutineCreate( vFlashCoRoutine, 0, uxIndex ); + } + } + </pre> + * \defgroup xCoRoutineCreate xCoRoutineCreate + * \ingroup Tasks + */ +signed portBASE_TYPE xCoRoutineCreate( crCOROUTINE_CODE pxCoRoutineCode, unsigned portBASE_TYPE uxPriority, unsigned portBASE_TYPE uxIndex ); + + +/** + * croutine. h + *<pre> + void vCoRoutineSchedule( void );</pre> + * + * Run a co-routine. + * + * vCoRoutineSchedule() executes the highest priority co-routine that is able + * to run. The co-routine will execute until it either blocks, yields or is + * preempted by a task. Co-routines execute cooperatively so one + * co-routine cannot be preempted by another, but can be preempted by a task. + * + * If an application comprises of both tasks and co-routines then + * vCoRoutineSchedule should be called from the idle task (in an idle task + * hook). + * + * Example usage: + <pre> + // This idle task hook will schedule a co-routine each time it is called. + // The rest of the idle task will execute between co-routine calls. + void vApplicationIdleHook( void ) + { + vCoRoutineSchedule(); + } + + // Alternatively, if you do not require any other part of the idle task to + // execute, the idle task hook can call vCoRoutineScheduler() within an + // infinite loop. + void vApplicationIdleHook( void ) + { + for( ;; ) + { + vCoRoutineSchedule(); + } + } + </pre> + * \defgroup vCoRoutineSchedule vCoRoutineSchedule + * \ingroup Tasks + */ +void vCoRoutineSchedule( void ); + +/** + * croutine. h + * <pre> + crSTART( xCoRoutineHandle xHandle );</pre> + * + * This macro MUST always be called at the start of a co-routine function. + * + * Example usage: + <pre> + // Co-routine to be created. + void vACoRoutine( xCoRoutineHandle xHandle, unsigned portBASE_TYPE uxIndex ) + { + // Variables in co-routines must be declared static if they must maintain value across a blocking call. + static long ulAVariable; + + // Must start every co-routine with a call to crSTART(); + crSTART( xHandle ); + + for( ;; ) + { + // Co-routine functionality goes here. + } + + // Must end every co-routine with a call to crEND(); + crEND(); + }</pre> + * \defgroup crSTART crSTART + * \ingroup Tasks + */ +#define crSTART( pxCRCB ) switch( ( ( corCRCB * )( pxCRCB ) )->uxState ) { case 0: + +/** + * croutine. h + * <pre> + crEND();</pre> + * + * This macro MUST always be called at the end of a co-routine function. + * + * Example usage: + <pre> + // Co-routine to be created. + void vACoRoutine( xCoRoutineHandle xHandle, unsigned portBASE_TYPE uxIndex ) + { + // Variables in co-routines must be declared static if they must maintain value across a blocking call. + static long ulAVariable; + + // Must start every co-routine with a call to crSTART(); + crSTART( xHandle ); + + for( ;; ) + { + // Co-routine functionality goes here. + } + + // Must end every co-routine with a call to crEND(); + crEND(); + }</pre> + * \defgroup crSTART crSTART + * \ingroup Tasks + */ +#define crEND() } + +/* + * These macros are intended for internal use by the co-routine implementation + * only. The macros should not be used directly by application writers. + */ +#define crSET_STATE0( xHandle ) ( ( corCRCB * )( xHandle ) )->uxState = (__LINE__ * 2); return; case (__LINE__ * 2): +#define crSET_STATE1( xHandle ) ( ( corCRCB * )( xHandle ) )->uxState = ((__LINE__ * 2)+1); return; case ((__LINE__ * 2)+1): + +/** + * croutine. h + *<pre> + crDELAY( xCoRoutineHandle xHandle, portTickType xTicksToDelay );</pre> + * + * Delay a co-routine for a fixed period of time. + * + * crDELAY can only be called from the co-routine function itself - not + * from within a function called by the co-routine function. This is because + * co-routines do not maintain their own stack. + * + * @param xHandle The handle of the co-routine to delay. This is the xHandle + * parameter of the co-routine function. + * + * @param xTickToDelay The number of ticks that the co-routine should delay + * for. The actual amount of time this equates to is defined by + * configTICK_RATE_HZ (set in FreeRTOSConfig.h). The constant portTICK_RATE_MS + * can be used to convert ticks to milliseconds. + * + * Example usage: + <pre> + // Co-routine to be created. + void vACoRoutine( xCoRoutineHandle xHandle, unsigned portBASE_TYPE uxIndex ) + { + // Variables in co-routines must be declared static if they must maintain value across a blocking call. + // This may not be necessary for const variables. + // We are to delay for 200ms. + static const xTickType xDelayTime = 200 / portTICK_RATE_MS; + + // Must start every co-routine with a call to crSTART(); + crSTART( xHandle ); + + for( ;; ) + { + // Delay for 200ms. + crDELAY( xHandle, xDelayTime ); + + // Do something here. + } + + // Must end every co-routine with a call to crEND(); + crEND(); + }</pre> + * \defgroup crDELAY crDELAY + * \ingroup Tasks + */ +#define crDELAY( xHandle, xTicksToDelay ) \ + if( ( xTicksToDelay ) > 0 ) \ + { \ + vCoRoutineAddToDelayedList( ( xTicksToDelay ), NULL ); \ + } \ + crSET_STATE0( ( xHandle ) ); + +/** + * <pre> + crQUEUE_SEND( + xCoRoutineHandle xHandle, + xQueueHandle pxQueue, + void *pvItemToQueue, + portTickType xTicksToWait, + portBASE_TYPE *pxResult + )</pre> + * + * The macro's crQUEUE_SEND() and crQUEUE_RECEIVE() are the co-routine + * equivalent to the xQueueSend() and xQueueReceive() functions used by tasks. + * + * crQUEUE_SEND and crQUEUE_RECEIVE can only be used from a co-routine whereas + * xQueueSend() and xQueueReceive() can only be used from tasks. + * + * crQUEUE_SEND can only be called from the co-routine function itself - not + * from within a function called by the co-routine function. This is because + * co-routines do not maintain their own stack. + * + * See the co-routine section of the WEB documentation for information on + * passing data between tasks and co-routines and between ISR's and + * co-routines. + * + * @param xHandle The handle of the calling co-routine. This is the xHandle + * parameter of the co-routine function. + * + * @param pxQueue The handle of the queue on which the data will be posted. + * The handle is obtained as the return value when the queue is created using + * the xQueueCreate() API function. + * + * @param pvItemToQueue A pointer to the data being posted onto the queue. + * The number of bytes of each queued item is specified when the queue is + * created. This number of bytes is copied from pvItemToQueue into the queue + * itself. + * + * @param xTickToDelay The number of ticks that the co-routine should block + * to wait for space to become available on the queue, should space not be + * available immediately. The actual amount of time this equates to is defined + * by configTICK_RATE_HZ (set in FreeRTOSConfig.h). The constant + * portTICK_RATE_MS can be used to convert ticks to milliseconds (see example + * below). + * + * @param pxResult The variable pointed to by pxResult will be set to pdPASS if + * data was successfully posted onto the queue, otherwise it will be set to an + * error defined within ProjDefs.h. + * + * Example usage: + <pre> + // Co-routine function that blocks for a fixed period then posts a number onto + // a queue. + static void prvCoRoutineFlashTask( xCoRoutineHandle xHandle, unsigned portBASE_TYPE uxIndex ) + { + // Variables in co-routines must be declared static if they must maintain value across a blocking call. + static portBASE_TYPE xNumberToPost = 0; + static portBASE_TYPE xResult; + + // Co-routines must begin with a call to crSTART(). + crSTART( xHandle ); + + for( ;; ) + { + // This assumes the queue has already been created. + crQUEUE_SEND( xHandle, xCoRoutineQueue, &xNumberToPost, NO_DELAY, &xResult ); + + if( xResult != pdPASS ) + { + // The message was not posted! + } + + // Increment the number to be posted onto the queue. + xNumberToPost++; + + // Delay for 100 ticks. + crDELAY( xHandle, 100 ); + } + + // Co-routines must end with a call to crEND(). + crEND(); + }</pre> + * \defgroup crQUEUE_SEND crQUEUE_SEND + * \ingroup Tasks + */ +#define crQUEUE_SEND( xHandle, pxQueue, pvItemToQueue, xTicksToWait, pxResult ) \ +{ \ + *( pxResult ) = xQueueCRSend( ( pxQueue) , ( pvItemToQueue) , ( xTicksToWait ) ); \ + if( *( pxResult ) == errQUEUE_BLOCKED ) \ + { \ + crSET_STATE0( ( xHandle ) ); \ + *pxResult = xQueueCRSend( ( pxQueue ), ( pvItemToQueue ), 0 ); \ + } \ + if( *pxResult == errQUEUE_YIELD ) \ + { \ + crSET_STATE1( ( xHandle ) ); \ + *pxResult = pdPASS; \ + } \ +} + +/** + * croutine. h + * <pre> + crQUEUE_RECEIVE( + xCoRoutineHandle xHandle, + xQueueHandle pxQueue, + void *pvBuffer, + portTickType xTicksToWait, + portBASE_TYPE *pxResult + )</pre> + * + * The macro's crQUEUE_SEND() and crQUEUE_RECEIVE() are the co-routine + * equivalent to the xQueueSend() and xQueueReceive() functions used by tasks. + * + * crQUEUE_SEND and crQUEUE_RECEIVE can only be used from a co-routine whereas + * xQueueSend() and xQueueReceive() can only be used from tasks. + * + * crQUEUE_RECEIVE can only be called from the co-routine function itself - not + * from within a function called by the co-routine function. This is because + * co-routines do not maintain their own stack. + * + * See the co-routine section of the WEB documentation for information on + * passing data between tasks and co-routines and between ISR's and + * co-routines. + * + * @param xHandle The handle of the calling co-routine. This is the xHandle + * parameter of the co-routine function. + * + * @param pxQueue The handle of the queue from which the data will be received. + * The handle is obtained as the return value when the queue is created using + * the xQueueCreate() API function. + * + * @param pvBuffer The buffer into which the received item is to be copied. + * The number of bytes of each queued item is specified when the queue is + * created. This number of bytes is copied into pvBuffer. + * + * @param xTickToDelay The number of ticks that the co-routine should block + * to wait for data to become available from the queue, should data not be + * available immediately. The actual amount of time this equates to is defined + * by configTICK_RATE_HZ (set in FreeRTOSConfig.h). The constant + * portTICK_RATE_MS can be used to convert ticks to milliseconds (see the + * crQUEUE_SEND example). + * + * @param pxResult The variable pointed to by pxResult will be set to pdPASS if + * data was successfully retrieved from the queue, otherwise it will be set to + * an error code as defined within ProjDefs.h. + * + * Example usage: + <pre> + // A co-routine receives the number of an LED to flash from a queue. It + // blocks on the queue until the number is received. + static void prvCoRoutineFlashWorkTask( xCoRoutineHandle xHandle, unsigned portBASE_TYPE uxIndex ) + { + // Variables in co-routines must be declared static if they must maintain value across a blocking call. + static portBASE_TYPE xResult; + static unsigned portBASE_TYPE uxLEDToFlash; + + // All co-routines must start with a call to crSTART(). + crSTART( xHandle ); + + for( ;; ) + { + // Wait for data to become available on the queue. + crQUEUE_RECEIVE( xHandle, xCoRoutineQueue, &uxLEDToFlash, portMAX_DELAY, &xResult ); + + if( xResult == pdPASS ) + { + // We received the LED to flash - flash it! + vParTestToggleLED( uxLEDToFlash ); + } + } + + crEND(); + }</pre> + * \defgroup crQUEUE_RECEIVE crQUEUE_RECEIVE + * \ingroup Tasks + */ +#define crQUEUE_RECEIVE( xHandle, pxQueue, pvBuffer, xTicksToWait, pxResult ) \ +{ \ + *( pxResult ) = xQueueCRReceive( ( pxQueue) , ( pvBuffer ), ( xTicksToWait ) ); \ + if( *( pxResult ) == errQUEUE_BLOCKED ) \ + { \ + crSET_STATE0( ( xHandle ) ); \ + *( pxResult ) = xQueueCRReceive( ( pxQueue) , ( pvBuffer ), 0 ); \ + } \ + if( *( pxResult ) == errQUEUE_YIELD ) \ + { \ + crSET_STATE1( ( xHandle ) ); \ + *( pxResult ) = pdPASS; \ + } \ +} + +/** + * croutine. h + * <pre> + crQUEUE_SEND_FROM_ISR( + xQueueHandle pxQueue, + void *pvItemToQueue, + portBASE_TYPE xCoRoutinePreviouslyWoken + )</pre> + * + * The macro's crQUEUE_SEND_FROM_ISR() and crQUEUE_RECEIVE_FROM_ISR() are the + * co-routine equivalent to the xQueueSendFromISR() and xQueueReceiveFromISR() + * functions used by tasks. + * + * crQUEUE_SEND_FROM_ISR() and crQUEUE_RECEIVE_FROM_ISR() can only be used to + * pass data between a co-routine and and ISR, whereas xQueueSendFromISR() and + * xQueueReceiveFromISR() can only be used to pass data between a task and and + * ISR. + * + * crQUEUE_SEND_FROM_ISR can only be called from an ISR to send data to a queue + * that is being used from within a co-routine. + * + * See the co-routine section of the WEB documentation for information on + * passing data between tasks and co-routines and between ISR's and + * co-routines. + * + * @param xQueue The handle to the queue on which the item is to be posted. + * + * @param pvItemToQueue A pointer to the item that is to be placed on the + * queue. The size of the items the queue will hold was defined when the + * queue was created, so this many bytes will be copied from pvItemToQueue + * into the queue storage area. + * + * @param xCoRoutinePreviouslyWoken This is included so an ISR can post onto + * the same queue multiple times from a single interrupt. The first call + * should always pass in pdFALSE. Subsequent calls should pass in + * the value returned from the previous call. + * + * @return pdTRUE if a co-routine was woken by posting onto the queue. This is + * used by the ISR to determine if a context switch may be required following + * the ISR. + * + * Example usage: + <pre> + // A co-routine that blocks on a queue waiting for characters to be received. + static void vReceivingCoRoutine( xCoRoutineHandle xHandle, unsigned portBASE_TYPE uxIndex ) + { + char cRxedChar; + portBASE_TYPE xResult; + + // All co-routines must start with a call to crSTART(). + crSTART( xHandle ); + + for( ;; ) + { + // Wait for data to become available on the queue. This assumes the + // queue xCommsRxQueue has already been created! + crQUEUE_RECEIVE( xHandle, xCommsRxQueue, &uxLEDToFlash, portMAX_DELAY, &xResult ); + + // Was a character received? + if( xResult == pdPASS ) + { + // Process the character here. + } + } + + // All co-routines must end with a call to crEND(). + crEND(); + } + + // An ISR that uses a queue to send characters received on a serial port to + // a co-routine. + void vUART_ISR( void ) + { + char cRxedChar; + portBASE_TYPE xCRWokenByPost = pdFALSE; + + // We loop around reading characters until there are none left in the UART. + while( UART_RX_REG_NOT_EMPTY() ) + { + // Obtain the character from the UART. + cRxedChar = UART_RX_REG; + + // Post the character onto a queue. xCRWokenByPost will be pdFALSE + // the first time around the loop. If the post causes a co-routine + // to be woken (unblocked) then xCRWokenByPost will be set to pdTRUE. + // In this manner we can ensure that if more than one co-routine is + // blocked on the queue only one is woken by this ISR no matter how + // many characters are posted to the queue. + xCRWokenByPost = crQUEUE_SEND_FROM_ISR( xCommsRxQueue, &cRxedChar, xCRWokenByPost ); + } + }</pre> + * \defgroup crQUEUE_SEND_FROM_ISR crQUEUE_SEND_FROM_ISR + * \ingroup Tasks + */ +#define crQUEUE_SEND_FROM_ISR( pxQueue, pvItemToQueue, xCoRoutinePreviouslyWoken ) xQueueCRSendFromISR( ( pxQueue ), ( pvItemToQueue ), ( xCoRoutinePreviouslyWoken ) ) + + +/** + * croutine. h + * <pre> + crQUEUE_SEND_FROM_ISR( + xQueueHandle pxQueue, + void *pvBuffer, + portBASE_TYPE * pxCoRoutineWoken + )</pre> + * + * The macro's crQUEUE_SEND_FROM_ISR() and crQUEUE_RECEIVE_FROM_ISR() are the + * co-routine equivalent to the xQueueSendFromISR() and xQueueReceiveFromISR() + * functions used by tasks. + * + * crQUEUE_SEND_FROM_ISR() and crQUEUE_RECEIVE_FROM_ISR() can only be used to + * pass data between a co-routine and and ISR, whereas xQueueSendFromISR() and + * xQueueReceiveFromISR() can only be used to pass data between a task and and + * ISR. + * + * crQUEUE_RECEIVE_FROM_ISR can only be called from an ISR to receive data + * from a queue that is being used from within a co-routine (a co-routine + * posted to the queue). + * + * See the co-routine section of the WEB documentation for information on + * passing data between tasks and co-routines and between ISR's and + * co-routines. + * + * @param xQueue The handle to the queue on which the item is to be posted. + * + * @param pvBuffer A pointer to a buffer into which the received item will be + * placed. The size of the items the queue will hold was defined when the + * queue was created, so this many bytes will be copied from the queue into + * pvBuffer. + * + * @param pxCoRoutineWoken A co-routine may be blocked waiting for space to become + * available on the queue. If crQUEUE_RECEIVE_FROM_ISR causes such a + * co-routine to unblock *pxCoRoutineWoken will get set to pdTRUE, otherwise + * *pxCoRoutineWoken will remain unchanged. + * + * @return pdTRUE an item was successfully received from the queue, otherwise + * pdFALSE. + * + * Example usage: + <pre> + // A co-routine that posts a character to a queue then blocks for a fixed + // period. The character is incremented each time. + static void vSendingCoRoutine( xCoRoutineHandle xHandle, unsigned portBASE_TYPE uxIndex ) + { + // cChar holds its value while this co-routine is blocked and must therefore + // be declared static. + static char cCharToTx = 'a'; + portBASE_TYPE xResult; + + // All co-routines must start with a call to crSTART(). + crSTART( xHandle ); + + for( ;; ) + { + // Send the next character to the queue. + crQUEUE_SEND( xHandle, xCoRoutineQueue, &cCharToTx, NO_DELAY, &xResult ); + + if( xResult == pdPASS ) + { + // The character was successfully posted to the queue. + } + else + { + // Could not post the character to the queue. + } + + // Enable the UART Tx interrupt to cause an interrupt in this + // hypothetical UART. The interrupt will obtain the character + // from the queue and send it. + ENABLE_RX_INTERRUPT(); + + // Increment to the next character then block for a fixed period. + // cCharToTx will maintain its value across the delay as it is + // declared static. + cCharToTx++; + if( cCharToTx > 'x' ) + { + cCharToTx = 'a'; + } + crDELAY( 100 ); + } + + // All co-routines must end with a call to crEND(). + crEND(); + } + + // An ISR that uses a queue to receive characters to send on a UART. + void vUART_ISR( void ) + { + char cCharToTx; + portBASE_TYPE xCRWokenByPost = pdFALSE; + + while( UART_TX_REG_EMPTY() ) + { + // Are there any characters in the queue waiting to be sent? + // xCRWokenByPost will automatically be set to pdTRUE if a co-routine + // is woken by the post - ensuring that only a single co-routine is + // woken no matter how many times we go around this loop. + if( crQUEUE_RECEIVE_FROM_ISR( pxQueue, &cCharToTx, &xCRWokenByPost ) ) + { + SEND_CHARACTER( cCharToTx ); + } + } + }</pre> + * \defgroup crQUEUE_RECEIVE_FROM_ISR crQUEUE_RECEIVE_FROM_ISR + * \ingroup Tasks + */ +#define crQUEUE_RECEIVE_FROM_ISR( pxQueue, pvBuffer, pxCoRoutineWoken ) xQueueCRReceiveFromISR( ( pxQueue ), ( pvBuffer ), ( pxCoRoutineWoken ) ) + +/* + * This function is intended for internal use by the co-routine macros only. + * The macro nature of the co-routine implementation requires that the + * prototype appears here. The function should not be used by application + * writers. + * + * Removes the current co-routine from its ready list and places it in the + * appropriate delayed list. + */ +void vCoRoutineAddToDelayedList( portTickType xTicksToDelay, xList *pxEventList ); + +/* + * This function is intended for internal use by the queue implementation only. + * The function should not be used by application writers. + * + * Removes the highest priority co-routine from the event list and places it in + * the pending ready list. + */ +signed portBASE_TYPE xCoRoutineRemoveFromEventList( const xList *pxEventList ); + +#ifdef __cplusplus +} +#endif + +#endif /* CO_ROUTINE_H */ diff --git a/TP1_labyrinth_etu/FreeRTOS_include/list.h b/TP1_labyrinth_etu/FreeRTOS_include/list.h new file mode 100644 index 0000000000000000000000000000000000000000..e8b47c4392a085b1572884066ffb3d4681e310aa --- /dev/null +++ b/TP1_labyrinth_etu/FreeRTOS_include/list.h @@ -0,0 +1,314 @@ +/* + FreeRTOS V7.0.1 - Copyright (C) 2011 Real Time Engineers Ltd. + + + FreeRTOS supports many tools and architectures. V7.0.0 is sponsored by: + Atollic AB - Atollic provides professional embedded systems development + tools for C/C++ development, code analysis and test automation. + See http://www.atollic.com + + + *************************************************************************** + * * + * FreeRTOS tutorial books are available in pdf and paperback. * + * Complete, revised, and edited pdf reference manuals are also * + * available. * + * * + * Purchasing FreeRTOS documentation will not only help you, by * + * ensuring you get running as quickly as possible and with an * + * in-depth knowledge of how to use FreeRTOS, it will also help * + * the FreeRTOS project to continue with its mission of providing * + * professional grade, cross platform, de facto standard solutions * + * for microcontrollers - completely free of charge! * + * * + * >>> See http://www.FreeRTOS.org/Documentation for details. <<< * + * * + * Thank you for using FreeRTOS, and thank you for your support! * + * * + *************************************************************************** + + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation AND MODIFIED BY the FreeRTOS exception. + >>>NOTE<<< The modification to the GPL is included to allow you to + distribute a combined work that includes FreeRTOS without being obliged to + provide the source code for proprietary components outside of the FreeRTOS + kernel. FreeRTOS is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + more details. You should have received a copy of the GNU General Public + License and the FreeRTOS license exception along with FreeRTOS; if not it + can be viewed here: http://www.freertos.org/a00114.html and also obtained + by writing to Richard Barry, contact details for whom are available on the + FreeRTOS WEB site. + + 1 tab == 4 spaces! + + http://www.FreeRTOS.org - Documentation, latest information, license and + contact details. + + http://www.SafeRTOS.com - A version that is certified for use in safety + critical systems. + + http://www.OpenRTOS.com - Commercial support, development, porting, + licensing and training services. +*/ + +/* + * This is the list implementation used by the scheduler. While it is tailored + * heavily for the schedulers needs, it is also available for use by + * application code. + * + * xLists can only store pointers to xListItems. Each xListItem contains a + * numeric value (xItemValue). Most of the time the lists are sorted in + * descending item value order. + * + * Lists are created already containing one list item. The value of this + * item is the maximum possible that can be stored, it is therefore always at + * the end of the list and acts as a marker. The list member pxHead always + * points to this marker - even though it is at the tail of the list. This + * is because the tail contains a wrap back pointer to the true head of + * the list. + * + * In addition to it's value, each list item contains a pointer to the next + * item in the list (pxNext), a pointer to the list it is in (pxContainer) + * and a pointer to back to the object that contains it. These later two + * pointers are included for efficiency of list manipulation. There is + * effectively a two way link between the object containing the list item and + * the list item itself. + * + * + * \page ListIntroduction List Implementation + * \ingroup FreeRTOSIntro + */ + + +#ifndef LIST_H +#define LIST_H + +#ifdef __cplusplus +extern "C" { +#endif +/* + * Definition of the only type of object that a list can contain. + */ +struct xLIST_ITEM +{ + portTickType xItemValue; /*< The value being listed. In most cases this is used to sort the list in descending order. */ + volatile struct xLIST_ITEM * pxNext; /*< Pointer to the next xListItem in the list. */ + volatile struct xLIST_ITEM * pxPrevious;/*< Pointer to the previous xListItem in the list. */ + void * pvOwner; /*< Pointer to the object (normally a TCB) that contains the list item. There is therefore a two way link between the object containing the list item and the list item itself. */ + void * pvContainer; /*< Pointer to the list in which this list item is placed (if any). */ +}; +typedef struct xLIST_ITEM xListItem; /* For some reason lint wants this as two separate definitions. */ + +struct xMINI_LIST_ITEM +{ + portTickType xItemValue; + volatile struct xLIST_ITEM *pxNext; + volatile struct xLIST_ITEM *pxPrevious; +}; +typedef struct xMINI_LIST_ITEM xMiniListItem; + +/* + * Definition of the type of queue used by the scheduler. + */ +typedef struct xLIST +{ + volatile unsigned portBASE_TYPE uxNumberOfItems; + volatile xListItem * pxIndex; /*< Used to walk through the list. Points to the last item returned by a call to pvListGetOwnerOfNextEntry (). */ + volatile xMiniListItem xListEnd; /*< List item that contains the maximum possible item value meaning it is always at the end of the list and is therefore used as a marker. */ +} xList; + +/* + * Access macro to set the owner of a list item. The owner of a list item + * is the object (usually a TCB) that contains the list item. + * + * \page listSET_LIST_ITEM_OWNER listSET_LIST_ITEM_OWNER + * \ingroup LinkedList + */ +#define listSET_LIST_ITEM_OWNER( pxListItem, pxOwner ) ( pxListItem )->pvOwner = ( void * ) ( pxOwner ) + +/* + * Access macro to set the value of the list item. In most cases the value is + * used to sort the list in descending order. + * + * \page listSET_LIST_ITEM_VALUE listSET_LIST_ITEM_VALUE + * \ingroup LinkedList + */ +#define listSET_LIST_ITEM_VALUE( pxListItem, xValue ) ( pxListItem )->xItemValue = ( xValue ) + +/* + * Access macro the retrieve the value of the list item. The value can + * represent anything - for example a the priority of a task, or the time at + * which a task should be unblocked. + * + * \page listGET_LIST_ITEM_VALUE listGET_LIST_ITEM_VALUE + * \ingroup LinkedList + */ +#define listGET_LIST_ITEM_VALUE( pxListItem ) ( ( pxListItem )->xItemValue ) + +/* + * Access macro the retrieve the value of the list item at the head of a given + * list. + * + * \page listGET_LIST_ITEM_VALUE listGET_LIST_ITEM_VALUE + * \ingroup LinkedList + */ +#define listGET_ITEM_VALUE_OF_HEAD_ENTRY( pxList ) ( (&( ( pxList )->xListEnd ))->pxNext->xItemValue ) + +/* + * Access macro to determine if a list contains any items. The macro will + * only have the value true if the list is empty. + * + * \page listLIST_IS_EMPTY listLIST_IS_EMPTY + * \ingroup LinkedList + */ +#define listLIST_IS_EMPTY( pxList ) ( ( pxList )->uxNumberOfItems == ( unsigned portBASE_TYPE ) 0 ) + +/* + * Access macro to return the number of items in the list. + */ +#define listCURRENT_LIST_LENGTH( pxList ) ( ( pxList )->uxNumberOfItems ) + +/* + * Access function to obtain the owner of the next entry in a list. + * + * The list member pxIndex is used to walk through a list. Calling + * listGET_OWNER_OF_NEXT_ENTRY increments pxIndex to the next item in the list + * and returns that entries pxOwner parameter. Using multiple calls to this + * function it is therefore possible to move through every item contained in + * a list. + * + * The pxOwner parameter of a list item is a pointer to the object that owns + * the list item. In the scheduler this is normally a task control block. + * The pxOwner parameter effectively creates a two way link between the list + * item and its owner. + * + * @param pxList The list from which the next item owner is to be returned. + * + * \page listGET_OWNER_OF_NEXT_ENTRY listGET_OWNER_OF_NEXT_ENTRY + * \ingroup LinkedList + */ +#define listGET_OWNER_OF_NEXT_ENTRY( pxTCB, pxList ) \ +{ \ +xList * const pxConstList = ( pxList ); \ + /* Increment the index to the next item and return the item, ensuring */ \ + /* we don't return the marker used at the end of the list. */ \ + ( pxConstList )->pxIndex = ( pxConstList )->pxIndex->pxNext; \ + if( ( pxConstList )->pxIndex == ( xListItem * ) &( ( pxConstList )->xListEnd ) ) \ + { \ + ( pxConstList )->pxIndex = ( pxConstList )->pxIndex->pxNext; \ + } \ + ( pxTCB ) = ( pxConstList )->pxIndex->pvOwner; \ +} + + +/* + * Access function to obtain the owner of the first entry in a list. Lists + * are normally sorted in ascending item value order. + * + * This function returns the pxOwner member of the first item in the list. + * The pxOwner parameter of a list item is a pointer to the object that owns + * the list item. In the scheduler this is normally a task control block. + * The pxOwner parameter effectively creates a two way link between the list + * item and its owner. + * + * @param pxList The list from which the owner of the head item is to be + * returned. + * + * \page listGET_OWNER_OF_HEAD_ENTRY listGET_OWNER_OF_HEAD_ENTRY + * \ingroup LinkedList + */ +#define listGET_OWNER_OF_HEAD_ENTRY( pxList ) ( (&( ( pxList )->xListEnd ))->pxNext->pvOwner ) + +/* + * Check to see if a list item is within a list. The list item maintains a + * "container" pointer that points to the list it is in. All this macro does + * is check to see if the container and the list match. + * + * @param pxList The list we want to know if the list item is within. + * @param pxListItem The list item we want to know if is in the list. + * @return pdTRUE is the list item is in the list, otherwise pdFALSE. + * pointer against + */ +#define listIS_CONTAINED_WITHIN( pxList, pxListItem ) ( ( pxListItem )->pvContainer == ( void * ) ( pxList ) ) + +/* + * Must be called before a list is used! This initialises all the members + * of the list structure and inserts the xListEnd item into the list as a + * marker to the back of the list. + * + * @param pxList Pointer to the list being initialised. + * + * \page vListInitialise vListInitialise + * \ingroup LinkedList + */ +void vListInitialise( xList *pxList ); + +/* + * Must be called before a list item is used. This sets the list container to + * null so the item does not think that it is already contained in a list. + * + * @param pxItem Pointer to the list item being initialised. + * + * \page vListInitialiseItem vListInitialiseItem + * \ingroup LinkedList + */ +void vListInitialiseItem( xListItem *pxItem ); + +/* + * Insert a list item into a list. The item will be inserted into the list in + * a position determined by its item value (descending item value order). + * + * @param pxList The list into which the item is to be inserted. + * + * @param pxNewListItem The item to that is to be placed in the list. + * + * \page vListInsert vListInsert + * \ingroup LinkedList + */ +void vListInsert( xList *pxList, xListItem *pxNewListItem ); + +/* + * Insert a list item into a list. The item will be inserted in a position + * such that it will be the last item within the list returned by multiple + * calls to listGET_OWNER_OF_NEXT_ENTRY. + * + * The list member pvIndex is used to walk through a list. Calling + * listGET_OWNER_OF_NEXT_ENTRY increments pvIndex to the next item in the list. + * Placing an item in a list using vListInsertEnd effectively places the item + * in the list position pointed to by pvIndex. This means that every other + * item within the list will be returned by listGET_OWNER_OF_NEXT_ENTRY before + * the pvIndex parameter again points to the item being inserted. + * + * @param pxList The list into which the item is to be inserted. + * + * @param pxNewListItem The list item to be inserted into the list. + * + * \page vListInsertEnd vListInsertEnd + * \ingroup LinkedList + */ +void vListInsertEnd( xList *pxList, xListItem *pxNewListItem ); + +/* + * Remove an item from a list. The list item has a pointer to the list that + * it is in, so only the list item need be passed into the function. + * + * @param vListRemove The item to be removed. The item will remove itself from + * the list pointed to by it's pxContainer parameter. + * + * \page vListRemove vListRemove + * \ingroup LinkedList + */ +void vListRemove( xListItem *pxItemToRemove ); + +#ifdef __cplusplus +} +#endif + +#endif + diff --git a/TP1_labyrinth_etu/FreeRTOS_include/mpu_wrappers.h b/TP1_labyrinth_etu/FreeRTOS_include/mpu_wrappers.h new file mode 100644 index 0000000000000000000000000000000000000000..b7371b9ba9692de00ede3da58c7ec818bff2a4a8 --- /dev/null +++ b/TP1_labyrinth_etu/FreeRTOS_include/mpu_wrappers.h @@ -0,0 +1,141 @@ +/* + FreeRTOS V7.0.1 - Copyright (C) 2011 Real Time Engineers Ltd. + + + FreeRTOS supports many tools and architectures. V7.0.0 is sponsored by: + Atollic AB - Atollic provides professional embedded systems development + tools for C/C++ development, code analysis and test automation. + See http://www.atollic.com + + + *************************************************************************** + * * + * FreeRTOS tutorial books are available in pdf and paperback. * + * Complete, revised, and edited pdf reference manuals are also * + * available. * + * * + * Purchasing FreeRTOS documentation will not only help you, by * + * ensuring you get running as quickly as possible and with an * + * in-depth knowledge of how to use FreeRTOS, it will also help * + * the FreeRTOS project to continue with its mission of providing * + * professional grade, cross platform, de facto standard solutions * + * for microcontrollers - completely free of charge! * + * * + * >>> See http://www.FreeRTOS.org/Documentation for details. <<< * + * * + * Thank you for using FreeRTOS, and thank you for your support! * + * * + *************************************************************************** + + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation AND MODIFIED BY the FreeRTOS exception. + >>>NOTE<<< The modification to the GPL is included to allow you to + distribute a combined work that includes FreeRTOS without being obliged to + provide the source code for proprietary components outside of the FreeRTOS + kernel. FreeRTOS is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + more details. You should have received a copy of the GNU General Public + License and the FreeRTOS license exception along with FreeRTOS; if not it + can be viewed here: http://www.freertos.org/a00114.html and also obtained + by writing to Richard Barry, contact details for whom are available on the + FreeRTOS WEB site. + + 1 tab == 4 spaces! + + http://www.FreeRTOS.org - Documentation, latest information, license and + contact details. + + http://www.SafeRTOS.com - A version that is certified for use in safety + critical systems. + + http://www.OpenRTOS.com - Commercial support, development, porting, + licensing and training services. +*/ + +#ifndef MPU_WRAPPERS_H +#define MPU_WRAPPERS_H + +/* This file redefines API functions to be called through a wrapper macro, but +only for ports that are using the MPU. */ +#ifdef portUSING_MPU_WRAPPERS + + /* MPU_WRAPPERS_INCLUDED_FROM_API_FILE will be defined when this file is + included from queue.c or task.c to prevent it from having an effect within + those files. */ + #ifndef MPU_WRAPPERS_INCLUDED_FROM_API_FILE + + #define xTaskGenericCreate MPU_xTaskGenericCreate + #define vTaskAllocateMPURegions MPU_vTaskAllocateMPURegions + #define vTaskDelete MPU_vTaskDelete + #define vTaskDelayUntil MPU_vTaskDelayUntil + #define vTaskDelay MPU_vTaskDelay + #define uxTaskPriorityGet MPU_uxTaskPriorityGet + #define vTaskPrioritySet MPU_vTaskPrioritySet + #define vTaskSuspend MPU_vTaskSuspend + #define xTaskIsTaskSuspended MPU_xTaskIsTaskSuspended + #define vTaskResume MPU_vTaskResume + #define vTaskSuspendAll MPU_vTaskSuspendAll + #define xTaskResumeAll MPU_xTaskResumeAll + #define xTaskGetTickCount MPU_xTaskGetTickCount + #define uxTaskGetNumberOfTasks MPU_uxTaskGetNumberOfTasks + #define vTaskList MPU_vTaskList + #define vTaskGetRunTimeStats MPU_vTaskGetRunTimeStats + #define vTaskStartTrace MPU_vTaskStartTrace + #define ulTaskEndTrace MPU_ulTaskEndTrace + #define vTaskSetApplicationTaskTag MPU_vTaskSetApplicationTaskTag + #define xTaskGetApplicationTaskTag MPU_xTaskGetApplicationTaskTag + #define xTaskCallApplicationTaskHook MPU_xTaskCallApplicationTaskHook + #define uxTaskGetStackHighWaterMark MPU_uxTaskGetStackHighWaterMark + #define xTaskGetCurrentTaskHandle MPU_xTaskGetCurrentTaskHandle + #define xTaskGetSchedulerState MPU_xTaskGetSchedulerState + + #define xQueueCreate MPU_xQueueCreate + #define xQueueCreateMutex MPU_xQueueCreateMutex + #define xQueueGiveMutexRecursive MPU_xQueueGiveMutexRecursive + #define xQueueTakeMutexRecursive MPU_xQueueTakeMutexRecursive + #define xQueueCreateCountingSemaphore MPU_xQueueCreateCountingSemaphore + #define xQueueGenericSend MPU_xQueueGenericSend + #define xQueueAltGenericSend MPU_xQueueAltGenericSend + #define xQueueAltGenericReceive MPU_xQueueAltGenericReceive + #define xQueueGenericReceive MPU_xQueueGenericReceive + #define uxQueueMessagesWaiting MPU_uxQueueMessagesWaiting + #define vQueueDelete MPU_vQueueDelete + + #define pvPortMalloc MPU_pvPortMalloc + #define vPortFree MPU_vPortFree + #define xPortGetFreeHeapSize MPU_xPortGetFreeHeapSize + #define vPortInitialiseBlocks MPU_vPortInitialiseBlocks + + #if configQUEUE_REGISTRY_SIZE > 0 + #define vQueueAddToRegistry MPU_vQueueAddToRegistry + #define vQueueUnregisterQueue MPU_vQueueUnregisterQueue + #endif + + /* Remove the privileged function macro. */ + #define PRIVILEGED_FUNCTION + + #else /* MPU_WRAPPERS_INCLUDED_FROM_API_FILE */ + + /* Ensure API functions go in the privileged execution section. */ + #define PRIVILEGED_FUNCTION __attribute__((section("privileged_functions"))) + #define PRIVILEGED_DATA __attribute__((section("privileged_data"))) + //#define PRIVILEGED_DATA + + #endif /* MPU_WRAPPERS_INCLUDED_FROM_API_FILE */ + +#else /* portUSING_MPU_WRAPPERS */ + + #define PRIVILEGED_FUNCTION + #define PRIVILEGED_DATA + #define portUSING_MPU_WRAPPERS 0 + +#endif /* portUSING_MPU_WRAPPERS */ + + +#endif /* MPU_WRAPPERS_H */ + diff --git a/TP1_labyrinth_etu/FreeRTOS_include/portable.h b/TP1_labyrinth_etu/FreeRTOS_include/portable.h new file mode 100644 index 0000000000000000000000000000000000000000..5bb784d544422e63234ade775055668596de5e94 --- /dev/null +++ b/TP1_labyrinth_etu/FreeRTOS_include/portable.h @@ -0,0 +1,396 @@ +/* + FreeRTOS V7.0.1 - Copyright (C) 2011 Real Time Engineers Ltd. + + + FreeRTOS supports many tools and architectures. V7.0.0 is sponsored by: + Atollic AB - Atollic provides professional embedded systems development + tools for C/C++ development, code analysis and test automation. + See http://www.atollic.com + + + *************************************************************************** + * * + * FreeRTOS tutorial books are available in pdf and paperback. * + * Complete, revised, and edited pdf reference manuals are also * + * available. * + * * + * Purchasing FreeRTOS documentation will not only help you, by * + * ensuring you get running as quickly as possible and with an * + * in-depth knowledge of how to use FreeRTOS, it will also help * + * the FreeRTOS project to continue with its mission of providing * + * professional grade, cross platform, de facto standard solutions * + * for microcontrollers - completely free of charge! * + * * + * >>> See http://www.FreeRTOS.org/Documentation for details. <<< * + * * + * Thank you for using FreeRTOS, and thank you for your support! * + * * + *************************************************************************** + + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation AND MODIFIED BY the FreeRTOS exception. + >>>NOTE<<< The modification to the GPL is included to allow you to + distribute a combined work that includes FreeRTOS without being obliged to + provide the source code for proprietary components outside of the FreeRTOS + kernel. FreeRTOS is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + more details. You should have received a copy of the GNU General Public + License and the FreeRTOS license exception along with FreeRTOS; if not it + can be viewed here: http://www.freertos.org/a00114.html and also obtained + by writing to Richard Barry, contact details for whom are available on the + FreeRTOS WEB site. + + 1 tab == 4 spaces! + + http://www.FreeRTOS.org - Documentation, latest information, license and + contact details. + + http://www.SafeRTOS.com - A version that is certified for use in safety + critical systems. + + http://www.OpenRTOS.com - Commercial support, development, porting, + licensing and training services. +*/ + +/*----------------------------------------------------------- + * Portable layer API. Each function must be defined for each port. + *----------------------------------------------------------*/ + +#ifndef PORTABLE_H +#define PORTABLE_H + +/* Include the macro file relevant to the port being used. */ + +#ifdef OPEN_WATCOM_INDUSTRIAL_PC_PORT + #include "..\..\Source\portable\owatcom\16bitdos\pc\portmacro.h" + typedef void ( __interrupt __far *pxISR )(); +#endif + +#ifdef OPEN_WATCOM_FLASH_LITE_186_PORT + #include "..\..\Source\portable\owatcom\16bitdos\flsh186\portmacro.h" + typedef void ( __interrupt __far *pxISR )(); +#endif + +#ifdef GCC_MEGA_AVR +#include "portmacro.h" +#endif + +#ifdef IAR_MEGA_AVR +#include "portmacro.h" +#endif + +#ifdef MPLAB_PIC24_PORT + #include "..\..\Source\portable\MPLAB\PIC24_dsPIC\portmacro.h" +#endif + +#ifdef MPLAB_DSPIC_PORT + #include "..\..\Source\portable\MPLAB\PIC24_dsPIC\portmacro.h" +#endif + +#ifdef MPLAB_PIC18F_PORT + #include "..\..\Source\portable\MPLAB\PIC18F\portmacro.h" +#endif + +#ifdef MPLAB_PIC32MX_PORT + #include "..\..\Source\portable\MPLAB\PIC32MX\portmacro.h" +#endif + +#ifdef _FEDPICC +#include "portmacro.h" +#endif + +#ifdef SDCC_CYGNAL +#include "portmacro.h" +#endif + +#ifdef GCC_ARM7 +#include "portmacro.h" +#endif + +#ifdef GCC_ARM7_ECLIPSE + #include "portmacro.h" +#endif + +#ifdef ROWLEY_LPC23xx +#include "portmacro.h" +#endif + +#ifdef IAR_MSP430 + #include "..\..\Source\portable\IAR\MSP430\portmacro.h" +#endif + +#ifdef GCC_MSP430 +#include "portmacro.h" +#endif + +#ifdef ROWLEY_MSP430 +#include "portmacro.h" +#endif + +#ifdef ARM7_LPC21xx_KEIL_RVDS + #include "..\..\Source\portable\RVDS\ARM7_LPC21xx\portmacro.h" +#endif + +#ifdef SAM7_GCC +#include "portmacro.h" +#endif + +#ifdef SAM7_IAR + #include "..\..\Source\portable\IAR\AtmelSAM7S64\portmacro.h" +#endif + +#ifdef SAM9XE_IAR + #include "..\..\Source\portable\IAR\AtmelSAM9XE\portmacro.h" +#endif + +#ifdef LPC2000_IAR + #include "..\..\Source\portable\IAR\LPC2000\portmacro.h" +#endif + +#ifdef STR71X_IAR + #include "..\..\Source\portable\IAR\STR71x\portmacro.h" +#endif + +#ifdef STR75X_IAR + #include "..\..\Source\portable\IAR\STR75x\portmacro.h" +#endif + +#ifdef STR75X_GCC + #include "..\..\Source\portable\GCC\STR75x\portmacro.h" +#endif + +#ifdef STR91X_IAR + #include "..\..\Source\portable\IAR\STR91x\portmacro.h" +#endif + +#ifdef GCC_H8S +#include "portmacro.h" +#endif + +#ifdef GCC_AT91FR40008 +#include "portmacro.h" +#endif + +#ifdef RVDS_ARMCM3_LM3S102 +#include "portmacro.h" +#endif + +#ifdef GCC_ARMCM3_LM3S102 +#include "portmacro.h" +#endif + +#ifdef GCC_ARMCM3 +#include "portmacro.h" +#endif + +#ifdef IAR_ARM_CM3 +#include "portmacro.h" +#endif + +#ifdef IAR_ARMCM3_LM +#include "portmacro.h" +#endif + +#ifdef HCS12_CODE_WARRIOR +#include "portmacro.h" +#endif + +#ifdef MICROBLAZE_GCC +#include "portmacro.h" +#endif + +#ifdef TERN_EE + #include "..\..\Source\portable\Paradigm\Tern_EE\small\portmacro.h" +#endif + +#ifdef GCC_HCS12 +#include "portmacro.h" +#endif + +#ifdef GCC_MCF5235 +#include "portmacro.h" +#endif + +#ifdef COLDFIRE_V2_GCC +#include "portmacro.h" +#endif + +#ifdef COLDFIRE_V2_CODEWARRIOR +#include "portmacro.h" +#endif + +#ifdef GCC_PPC405 +#include "portmacro.h" +#endif + +#ifdef GCC_PPC440 +#include "portmacro.h" +#endif + +#ifdef _16FX_SOFTUNE + #include "..\..\Source\portable\Softune\MB96340\portmacro.h" +#endif + +#ifdef BCC_INDUSTRIAL_PC_PORT + /* A short file name has to be used in place of the normal + FreeRTOSConfig.h when using the Borland compiler. */ + #include "frconfig.h" + #include "..\portable\BCC\16BitDOS\PC\prtmacro.h" + typedef void ( __interrupt __far *pxISR )(); +#endif + +#ifdef BCC_FLASH_LITE_186_PORT + /* A short file name has to be used in place of the normal + FreeRTOSConfig.h when using the Borland compiler. */ + #include "frconfig.h" + #include "..\portable\BCC\16BitDOS\flsh186\prtmacro.h" + typedef void ( __interrupt __far *pxISR )(); +#endif + +#ifdef __GNUC__ + #ifdef __AVR32_AVR32A__ + #include "portmacro.h" + #endif +#endif + +#ifdef __ICCAVR32__ + #ifdef __CORE__ + #if __CORE__ == __AVR32A__ + #include "portmacro.h" + #endif + #endif +#endif + +#ifdef __91467D + #include "portmacro.h" +#endif + +#ifdef __96340 + #include "portmacro.h" +#endif + + +#ifdef __IAR_V850ES_Fx3__ +#include "portmacro.h" +#endif + +#ifdef __IAR_V850ES_Jx3__ +#include "portmacro.h" +#endif + +#ifdef __IAR_V850ES_Jx3_L__ +#include "portmacro.h" +#endif + +#ifdef __IAR_V850ES_Jx2__ +#include "portmacro.h" +#endif + +#ifdef __IAR_V850ES_Hx2__ +#include "portmacro.h" +#endif + +#ifdef __IAR_78K0R_Kx3__ +#include "portmacro.h" +#endif + +#ifdef __IAR_78K0R_Kx3L__ +#include "portmacro.h" +#endif + +/* Catch all to ensure portmacro.h is included in the build. Newer demos +have the path as part of the project options, rather than as relative from +the project location. If portENTER_CRITICAL() has not been defined then +portmacro.h has not yet been included - as every portmacro.h provides a +portENTER_CRITICAL() definition. Check the demo application for your demo +to find the path to the correct portmacro.h file. */ +#ifndef portENTER_CRITICAL + #include "portmacro.h" +#endif + +#if portBYTE_ALIGNMENT == 8 + #define portBYTE_ALIGNMENT_MASK ( 0x0007 ) +#endif + +#if portBYTE_ALIGNMENT == 4 + #define portBYTE_ALIGNMENT_MASK ( 0x0003 ) +#endif + +#if portBYTE_ALIGNMENT == 2 + #define portBYTE_ALIGNMENT_MASK ( 0x0001 ) +#endif + +#if portBYTE_ALIGNMENT == 1 + #define portBYTE_ALIGNMENT_MASK ( 0x0000 ) +#endif + +#ifndef portBYTE_ALIGNMENT_MASK + #error "Invalid portBYTE_ALIGNMENT definition" +#endif + +#ifndef portNUM_CONFIGURABLE_REGIONS + #define portNUM_CONFIGURABLE_REGIONS 1 +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +#include "mpu_wrappers.h" + +/* + * Setup the stack of a new task so it is ready to be placed under the + * scheduler control. The registers have to be placed on the stack in + * the order that the port expects to find them. + * + */ +#if( portUSING_MPU_WRAPPERS == 1 ) + portSTACK_TYPE *pxPortInitialiseStack( portSTACK_TYPE *pxTopOfStack, pdTASK_CODE pxCode, void *pvParameters, portBASE_TYPE xRunPrivileged ) PRIVILEGED_FUNCTION; +#else + portSTACK_TYPE *pxPortInitialiseStack( portSTACK_TYPE *pxTopOfStack, pdTASK_CODE pxCode, void *pvParameters ); +#endif + +/* + * Map to the memory management routines required for the port. + */ +void *pvPortMalloc( size_t xSize ) PRIVILEGED_FUNCTION; +void vPortFree( void *pv ) PRIVILEGED_FUNCTION; +void vPortInitialiseBlocks( void ) PRIVILEGED_FUNCTION; +size_t xPortGetFreeHeapSize( void ) PRIVILEGED_FUNCTION; + +/* + * Setup the hardware ready for the scheduler to take control. This generally + * sets up a tick interrupt and sets timers for the correct tick frequency. + */ +portBASE_TYPE xPortStartScheduler( void ) PRIVILEGED_FUNCTION; + +/* + * Undo any hardware/ISR setup that was performed by xPortStartScheduler() so + * the hardware is left in its original condition after the scheduler stops + * executing. + */ +void vPortEndScheduler( void ) PRIVILEGED_FUNCTION; + +/* + * The structures and methods of manipulating the MPU are contained within the + * port layer. + * + * Fills the xMPUSettings structure with the memory region information + * contained in xRegions. + */ +#if( portUSING_MPU_WRAPPERS == 1 ) + struct xMEMORY_REGION; + void vPortStoreTaskMPUSettings( xMPU_SETTINGS *xMPUSettings, const struct xMEMORY_REGION * const xRegions, portSTACK_TYPE *pxBottomOfStack, unsigned short usStackDepth ) PRIVILEGED_FUNCTION; +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* PORTABLE_H */ + diff --git a/TP1_labyrinth_etu/FreeRTOS_include/projdefs.h b/TP1_labyrinth_etu/FreeRTOS_include/projdefs.h new file mode 100644 index 0000000000000000000000000000000000000000..bf118a8ac1bcc2a939ee08ac9bf1f3bf359d7c4c --- /dev/null +++ b/TP1_labyrinth_etu/FreeRTOS_include/projdefs.h @@ -0,0 +1,83 @@ +/* + FreeRTOS V7.0.1 - Copyright (C) 2011 Real Time Engineers Ltd. + + + FreeRTOS supports many tools and architectures. V7.0.0 is sponsored by: + Atollic AB - Atollic provides professional embedded systems development + tools for C/C++ development, code analysis and test automation. + See http://www.atollic.com + + + *************************************************************************** + * * + * FreeRTOS tutorial books are available in pdf and paperback. * + * Complete, revised, and edited pdf reference manuals are also * + * available. * + * * + * Purchasing FreeRTOS documentation will not only help you, by * + * ensuring you get running as quickly as possible and with an * + * in-depth knowledge of how to use FreeRTOS, it will also help * + * the FreeRTOS project to continue with its mission of providing * + * professional grade, cross platform, de facto standard solutions * + * for microcontrollers - completely free of charge! * + * * + * >>> See http://www.FreeRTOS.org/Documentation for details. <<< * + * * + * Thank you for using FreeRTOS, and thank you for your support! * + * * + *************************************************************************** + + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation AND MODIFIED BY the FreeRTOS exception. + >>>NOTE<<< The modification to the GPL is included to allow you to + distribute a combined work that includes FreeRTOS without being obliged to + provide the source code for proprietary components outside of the FreeRTOS + kernel. FreeRTOS is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + more details. You should have received a copy of the GNU General Public + License and the FreeRTOS license exception along with FreeRTOS; if not it + can be viewed here: http://www.freertos.org/a00114.html and also obtained + by writing to Richard Barry, contact details for whom are available on the + FreeRTOS WEB site. + + 1 tab == 4 spaces! + + http://www.FreeRTOS.org - Documentation, latest information, license and + contact details. + + http://www.SafeRTOS.com - A version that is certified for use in safety + critical systems. + + http://www.OpenRTOS.com - Commercial support, development, porting, + licensing and training services. +*/ + +#ifndef PROJDEFS_H +#define PROJDEFS_H + +/* Defines the prototype to which task functions must conform. */ +typedef void (*pdTASK_CODE)( void * ); + +#define pdTRUE ( 1 ) +#define pdFALSE ( 0 ) + +#define pdPASS ( 1 ) +#define pdFAIL ( 0 ) +#define errQUEUE_EMPTY ( 0 ) +#define errQUEUE_FULL ( 0 ) + +/* Error definitions. */ +#define errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY ( -1 ) +#define errNO_TASK_TO_RUN ( -2 ) +#define errQUEUE_BLOCKED ( -4 ) +#define errQUEUE_YIELD ( -5 ) + +#endif /* PROJDEFS_H */ + + + diff --git a/TP1_labyrinth_etu/FreeRTOS_include/queue.h b/TP1_labyrinth_etu/FreeRTOS_include/queue.h new file mode 100644 index 0000000000000000000000000000000000000000..47add266f8ca0e7f3e0f583239f0ca24ed083a3c --- /dev/null +++ b/TP1_labyrinth_etu/FreeRTOS_include/queue.h @@ -0,0 +1,1270 @@ +/* + FreeRTOS V7.0.1 - Copyright (C) 2011 Real Time Engineers Ltd. + + + FreeRTOS supports many tools and architectures. V7.0.0 is sponsored by: + Atollic AB - Atollic provides professional embedded systems development + tools for C/C++ development, code analysis and test automation. + See http://www.atollic.com + + + *************************************************************************** + * * + * FreeRTOS tutorial books are available in pdf and paperback. * + * Complete, revised, and edited pdf reference manuals are also * + * available. * + * * + * Purchasing FreeRTOS documentation will not only help you, by * + * ensuring you get running as quickly as possible and with an * + * in-depth knowledge of how to use FreeRTOS, it will also help * + * the FreeRTOS project to continue with its mission of providing * + * professional grade, cross platform, de facto standard solutions * + * for microcontrollers - completely free of charge! * + * * + * >>> See http://www.FreeRTOS.org/Documentation for details. <<< * + * * + * Thank you for using FreeRTOS, and thank you for your support! * + * * + *************************************************************************** + + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation AND MODIFIED BY the FreeRTOS exception. + >>>NOTE<<< The modification to the GPL is included to allow you to + distribute a combined work that includes FreeRTOS without being obliged to + provide the source code for proprietary components outside of the FreeRTOS + kernel. FreeRTOS is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + more details. You should have received a copy of the GNU General Public + License and the FreeRTOS license exception along with FreeRTOS; if not it + can be viewed here: http://www.freertos.org/a00114.html and also obtained + by writing to Richard Barry, contact details for whom are available on the + FreeRTOS WEB site. + + 1 tab == 4 spaces! + + http://www.FreeRTOS.org - Documentation, latest information, license and + contact details. + + http://www.SafeRTOS.com - A version that is certified for use in safety + critical systems. + + http://www.OpenRTOS.com - Commercial support, development, porting, + licensing and training services. +*/ + + +#ifndef QUEUE_H +#define QUEUE_H + +#ifndef INC_FREERTOS_H + #error "#include FreeRTOS.h" must appear in source files before "#include queue.h" +#endif + +#ifdef __cplusplus +extern "C" { +#endif + + +#include "mpu_wrappers.h" + +/** + * Type by which queues are referenced. For example, a call to xQueueCreate + * returns (via a pointer parameter) an xQueueHandle variable that can then + * be used as a parameter to xQueueSend(), xQueueReceive(), etc. + */ +typedef void * xQueueHandle; + + +/* For internal use only. */ +#define queueSEND_TO_BACK ( 0 ) +#define queueSEND_TO_FRONT ( 1 ) + + +/** + * queue. h + * <pre> + xQueueHandle xQueueCreate( + unsigned portBASE_TYPE uxQueueLength, + unsigned portBASE_TYPE uxItemSize + ); + * </pre> + * + * Creates a new queue instance. This allocates the storage required by the + * new queue and returns a handle for the queue. + * + * @param uxQueueLength The maximum number of items that the queue can contain. + * + * @param uxItemSize The number of bytes each item in the queue will require. + * Items are queued by copy, not by reference, so this is the number of bytes + * that will be copied for each posted item. Each item on the queue must be + * the same size. + * + * @return If the queue is successfully create then a handle to the newly + * created queue is returned. If the queue cannot be created then 0 is + * returned. + * + * Example usage: + <pre> + struct AMessage + { + char ucMessageID; + char ucData[ 20 ]; + }; + + void vATask( void *pvParameters ) + { + xQueueHandle xQueue1, xQueue2; + + // Create a queue capable of containing 10 unsigned long values. + xQueue1 = xQueueCreate( 10, sizeof( unsigned long ) ); + if( xQueue1 == 0 ) + { + // Queue was not created and must not be used. + } + + // Create a queue capable of containing 10 pointers to AMessage structures. + // These should be passed by pointer as they contain a lot of data. + xQueue2 = xQueueCreate( 10, sizeof( struct AMessage * ) ); + if( xQueue2 == 0 ) + { + // Queue was not created and must not be used. + } + + // ... Rest of task code. + } + </pre> + * \defgroup xQueueCreate xQueueCreate + * \ingroup QueueManagement + */ +xQueueHandle xQueueCreate( unsigned portBASE_TYPE uxQueueLength, unsigned portBASE_TYPE uxItemSize ); + +/** + * queue. h + * <pre> + portBASE_TYPE xQueueSendToToFront( + xQueueHandle xQueue, + const void * pvItemToQueue, + portTickType xTicksToWait + ); + * </pre> + * + * This is a macro that calls xQueueGenericSend(). + * + * Post an item to the front of a queue. The item is queued by copy, not by + * reference. This function must not be called from an interrupt service + * routine. See xQueueSendFromISR () for an alternative which may be used + * in an ISR. + * + * @param xQueue The handle to the queue on which the item is to be posted. + * + * @param pvItemToQueue A pointer to the item that is to be placed on the + * queue. The size of the items the queue will hold was defined when the + * queue was created, so this many bytes will be copied from pvItemToQueue + * into the queue storage area. + * + * @param xTicksToWait The maximum amount of time the task should block + * waiting for space to become available on the queue, should it already + * be full. The call will return immediately if this is set to 0 and the + * queue is full. The time is defined in tick periods so the constant + * portTICK_RATE_MS should be used to convert to real time if this is required. + * + * @return pdTRUE if the item was successfully posted, otherwise errQUEUE_FULL. + * + * Example usage: + <pre> + struct AMessage + { + char ucMessageID; + char ucData[ 20 ]; + } xMessage; + + unsigned long ulVar = 10UL; + + void vATask( void *pvParameters ) + { + xQueueHandle xQueue1, xQueue2; + struct AMessage *pxMessage; + + // Create a queue capable of containing 10 unsigned long values. + xQueue1 = xQueueCreate( 10, sizeof( unsigned long ) ); + + // Create a queue capable of containing 10 pointers to AMessage structures. + // These should be passed by pointer as they contain a lot of data. + xQueue2 = xQueueCreate( 10, sizeof( struct AMessage * ) ); + + // ... + + if( xQueue1 != 0 ) + { + // Send an unsigned long. Wait for 10 ticks for space to become + // available if necessary. + if( xQueueSendToFront( xQueue1, ( void * ) &ulVar, ( portTickType ) 10 ) != pdPASS ) + { + // Failed to post the message, even after 10 ticks. + } + } + + if( xQueue2 != 0 ) + { + // Send a pointer to a struct AMessage object. Don't block if the + // queue is already full. + pxMessage = & xMessage; + xQueueSendToFront( xQueue2, ( void * ) &pxMessage, ( portTickType ) 0 ); + } + + // ... Rest of task code. + } + </pre> + * \defgroup xQueueSend xQueueSend + * \ingroup QueueManagement + */ +#define xQueueSendToFront( xQueue, pvItemToQueue, xTicksToWait ) xQueueGenericSend( ( xQueue ), ( pvItemToQueue ), ( xTicksToWait ), queueSEND_TO_FRONT ) + +/** + * queue. h + * <pre> + portBASE_TYPE xQueueSendToBack( + xQueueHandle xQueue, + const void * pvItemToQueue, + portTickType xTicksToWait + ); + * </pre> + * + * This is a macro that calls xQueueGenericSend(). + * + * Post an item to the back of a queue. The item is queued by copy, not by + * reference. This function must not be called from an interrupt service + * routine. See xQueueSendFromISR () for an alternative which may be used + * in an ISR. + * + * @param xQueue The handle to the queue on which the item is to be posted. + * + * @param pvItemToQueue A pointer to the item that is to be placed on the + * queue. The size of the items the queue will hold was defined when the + * queue was created, so this many bytes will be copied from pvItemToQueue + * into the queue storage area. + * + * @param xTicksToWait The maximum amount of time the task should block + * waiting for space to become available on the queue, should it already + * be full. The call will return immediately if this is set to 0 and the queue + * is full. The time is defined in tick periods so the constant + * portTICK_RATE_MS should be used to convert to real time if this is required. + * + * @return pdTRUE if the item was successfully posted, otherwise errQUEUE_FULL. + * + * Example usage: + <pre> + struct AMessage + { + char ucMessageID; + char ucData[ 20 ]; + } xMessage; + + unsigned long ulVar = 10UL; + + void vATask( void *pvParameters ) + { + xQueueHandle xQueue1, xQueue2; + struct AMessage *pxMessage; + + // Create a queue capable of containing 10 unsigned long values. + xQueue1 = xQueueCreate( 10, sizeof( unsigned long ) ); + + // Create a queue capable of containing 10 pointers to AMessage structures. + // These should be passed by pointer as they contain a lot of data. + xQueue2 = xQueueCreate( 10, sizeof( struct AMessage * ) ); + + // ... + + if( xQueue1 != 0 ) + { + // Send an unsigned long. Wait for 10 ticks for space to become + // available if necessary. + if( xQueueSendToBack( xQueue1, ( void * ) &ulVar, ( portTickType ) 10 ) != pdPASS ) + { + // Failed to post the message, even after 10 ticks. + } + } + + if( xQueue2 != 0 ) + { + // Send a pointer to a struct AMessage object. Don't block if the + // queue is already full. + pxMessage = & xMessage; + xQueueSendToBack( xQueue2, ( void * ) &pxMessage, ( portTickType ) 0 ); + } + + // ... Rest of task code. + } + </pre> + * \defgroup xQueueSend xQueueSend + * \ingroup QueueManagement + */ +#define xQueueSendToBack( xQueue, pvItemToQueue, xTicksToWait ) xQueueGenericSend( ( xQueue ), ( pvItemToQueue ), ( xTicksToWait ), queueSEND_TO_BACK ) + +/** + * queue. h + * <pre> + portBASE_TYPE xQueueSend( + xQueueHandle xQueue, + const void * pvItemToQueue, + portTickType xTicksToWait + ); + * </pre> + * + * This is a macro that calls xQueueGenericSend(). It is included for + * backward compatibility with versions of FreeRTOS.org that did not + * include the xQueueSendToFront() and xQueueSendToBack() macros. It is + * equivalent to xQueueSendToBack(). + * + * Post an item on a queue. The item is queued by copy, not by reference. + * This function must not be called from an interrupt service routine. + * See xQueueSendFromISR () for an alternative which may be used in an ISR. + * + * @param xQueue The handle to the queue on which the item is to be posted. + * + * @param pvItemToQueue A pointer to the item that is to be placed on the + * queue. The size of the items the queue will hold was defined when the + * queue was created, so this many bytes will be copied from pvItemToQueue + * into the queue storage area. + * + * @param xTicksToWait The maximum amount of time the task should block + * waiting for space to become available on the queue, should it already + * be full. The call will return immediately if this is set to 0 and the + * queue is full. The time is defined in tick periods so the constant + * portTICK_RATE_MS should be used to convert to real time if this is required. + * + * @return pdTRUE if the item was successfully posted, otherwise errQUEUE_FULL. + * + * Example usage: + <pre> + struct AMessage + { + char ucMessageID; + char ucData[ 20 ]; + } xMessage; + + unsigned long ulVar = 10UL; + + void vATask( void *pvParameters ) + { + xQueueHandle xQueue1, xQueue2; + struct AMessage *pxMessage; + + // Create a queue capable of containing 10 unsigned long values. + xQueue1 = xQueueCreate( 10, sizeof( unsigned long ) ); + + // Create a queue capable of containing 10 pointers to AMessage structures. + // These should be passed by pointer as they contain a lot of data. + xQueue2 = xQueueCreate( 10, sizeof( struct AMessage * ) ); + + // ... + + if( xQueue1 != 0 ) + { + // Send an unsigned long. Wait for 10 ticks for space to become + // available if necessary. + if( xQueueSend( xQueue1, ( void * ) &ulVar, ( portTickType ) 10 ) != pdPASS ) + { + // Failed to post the message, even after 10 ticks. + } + } + + if( xQueue2 != 0 ) + { + // Send a pointer to a struct AMessage object. Don't block if the + // queue is already full. + pxMessage = & xMessage; + xQueueSend( xQueue2, ( void * ) &pxMessage, ( portTickType ) 0 ); + } + + // ... Rest of task code. + } + </pre> + * \defgroup xQueueSend xQueueSend + * \ingroup QueueManagement + */ +#define xQueueSend( xQueue, pvItemToQueue, xTicksToWait ) xQueueGenericSend( ( xQueue ), ( pvItemToQueue ), ( xTicksToWait ), queueSEND_TO_BACK ) + + +/** + * queue. h + * <pre> + portBASE_TYPE xQueueGenericSend( + xQueueHandle xQueue, + const void * pvItemToQueue, + portTickType xTicksToWait + portBASE_TYPE xCopyPosition + ); + * </pre> + * + * It is preferred that the macros xQueueSend(), xQueueSendToFront() and + * xQueueSendToBack() are used in place of calling this function directly. + * + * Post an item on a queue. The item is queued by copy, not by reference. + * This function must not be called from an interrupt service routine. + * See xQueueSendFromISR () for an alternative which may be used in an ISR. + * + * @param xQueue The handle to the queue on which the item is to be posted. + * + * @param pvItemToQueue A pointer to the item that is to be placed on the + * queue. The size of the items the queue will hold was defined when the + * queue was created, so this many bytes will be copied from pvItemToQueue + * into the queue storage area. + * + * @param xTicksToWait The maximum amount of time the task should block + * waiting for space to become available on the queue, should it already + * be full. The call will return immediately if this is set to 0 and the + * queue is full. The time is defined in tick periods so the constant + * portTICK_RATE_MS should be used to convert to real time if this is required. + * + * @param xCopyPosition Can take the value queueSEND_TO_BACK to place the + * item at the back of the queue, or queueSEND_TO_FRONT to place the item + * at the front of the queue (for high priority messages). + * + * @return pdTRUE if the item was successfully posted, otherwise errQUEUE_FULL. + * + * Example usage: + <pre> + struct AMessage + { + char ucMessageID; + char ucData[ 20 ]; + } xMessage; + + unsigned long ulVar = 10UL; + + void vATask( void *pvParameters ) + { + xQueueHandle xQueue1, xQueue2; + struct AMessage *pxMessage; + + // Create a queue capable of containing 10 unsigned long values. + xQueue1 = xQueueCreate( 10, sizeof( unsigned long ) ); + + // Create a queue capable of containing 10 pointers to AMessage structures. + // These should be passed by pointer as they contain a lot of data. + xQueue2 = xQueueCreate( 10, sizeof( struct AMessage * ) ); + + // ... + + if( xQueue1 != 0 ) + { + // Send an unsigned long. Wait for 10 ticks for space to become + // available if necessary. + if( xQueueGenericSend( xQueue1, ( void * ) &ulVar, ( portTickType ) 10, queueSEND_TO_BACK ) != pdPASS ) + { + // Failed to post the message, even after 10 ticks. + } + } + + if( xQueue2 != 0 ) + { + // Send a pointer to a struct AMessage object. Don't block if the + // queue is already full. + pxMessage = & xMessage; + xQueueGenericSend( xQueue2, ( void * ) &pxMessage, ( portTickType ) 0, queueSEND_TO_BACK ); + } + + // ... Rest of task code. + } + </pre> + * \defgroup xQueueSend xQueueSend + * \ingroup QueueManagement + */ +signed portBASE_TYPE xQueueGenericSend( xQueueHandle pxQueue, const void * const pvItemToQueue, portTickType xTicksToWait, portBASE_TYPE xCopyPosition ); + +/** + * queue. h + * <pre> + portBASE_TYPE xQueuePeek( + xQueueHandle xQueue, + void *pvBuffer, + portTickType xTicksToWait + );</pre> + * + * This is a macro that calls the xQueueGenericReceive() function. + * + * Receive an item from a queue without removing the item from the queue. + * The item is received by copy so a buffer of adequate size must be + * provided. The number of bytes copied into the buffer was defined when + * the queue was created. + * + * Successfully received items remain on the queue so will be returned again + * by the next call, or a call to xQueueReceive(). + * + * This macro must not be used in an interrupt service routine. + * + * @param pxQueue The handle to the queue from which the item is to be + * received. + * + * @param pvBuffer Pointer to the buffer into which the received item will + * be copied. + * + * @param xTicksToWait The maximum amount of time the task should block + * waiting for an item to receive should the queue be empty at the time + * of the call. The time is defined in tick periods so the constant + * portTICK_RATE_MS should be used to convert to real time if this is required. + * xQueuePeek() will return immediately if xTicksToWait is 0 and the queue + * is empty. + * + * @return pdTRUE if an item was successfully received from the queue, + * otherwise pdFALSE. + * + * Example usage: + <pre> + struct AMessage + { + char ucMessageID; + char ucData[ 20 ]; + } xMessage; + + xQueueHandle xQueue; + + // Task to create a queue and post a value. + void vATask( void *pvParameters ) + { + struct AMessage *pxMessage; + + // Create a queue capable of containing 10 pointers to AMessage structures. + // These should be passed by pointer as they contain a lot of data. + xQueue = xQueueCreate( 10, sizeof( struct AMessage * ) ); + if( xQueue == 0 ) + { + // Failed to create the queue. + } + + // ... + + // Send a pointer to a struct AMessage object. Don't block if the + // queue is already full. + pxMessage = & xMessage; + xQueueSend( xQueue, ( void * ) &pxMessage, ( portTickType ) 0 ); + + // ... Rest of task code. + } + + // Task to peek the data from the queue. + void vADifferentTask( void *pvParameters ) + { + struct AMessage *pxRxedMessage; + + if( xQueue != 0 ) + { + // Peek a message on the created queue. Block for 10 ticks if a + // message is not immediately available. + if( xQueuePeek( xQueue, &( pxRxedMessage ), ( portTickType ) 10 ) ) + { + // pcRxedMessage now points to the struct AMessage variable posted + // by vATask, but the item still remains on the queue. + } + } + + // ... Rest of task code. + } + </pre> + * \defgroup xQueueReceive xQueueReceive + * \ingroup QueueManagement + */ +#define xQueuePeek( xQueue, pvBuffer, xTicksToWait ) xQueueGenericReceive( ( xQueue ), ( pvBuffer ), ( xTicksToWait ), pdTRUE ) + +/** + * queue. h + * <pre> + portBASE_TYPE xQueueReceive( + xQueueHandle xQueue, + void *pvBuffer, + portTickType xTicksToWait + );</pre> + * + * This is a macro that calls the xQueueGenericReceive() function. + * + * Receive an item from a queue. The item is received by copy so a buffer of + * adequate size must be provided. The number of bytes copied into the buffer + * was defined when the queue was created. + * + * Successfully received items are removed from the queue. + * + * This function must not be used in an interrupt service routine. See + * xQueueReceiveFromISR for an alternative that can. + * + * @param pxQueue The handle to the queue from which the item is to be + * received. + * + * @param pvBuffer Pointer to the buffer into which the received item will + * be copied. + * + * @param xTicksToWait The maximum amount of time the task should block + * waiting for an item to receive should the queue be empty at the time + * of the call. xQueueReceive() will return immediately if xTicksToWait + * is zero and the queue is empty. The time is defined in tick periods so the + * constant portTICK_RATE_MS should be used to convert to real time if this is + * required. + * + * @return pdTRUE if an item was successfully received from the queue, + * otherwise pdFALSE. + * + * Example usage: + <pre> + struct AMessage + { + char ucMessageID; + char ucData[ 20 ]; + } xMessage; + + xQueueHandle xQueue; + + // Task to create a queue and post a value. + void vATask( void *pvParameters ) + { + struct AMessage *pxMessage; + + // Create a queue capable of containing 10 pointers to AMessage structures. + // These should be passed by pointer as they contain a lot of data. + xQueue = xQueueCreate( 10, sizeof( struct AMessage * ) ); + if( xQueue == 0 ) + { + // Failed to create the queue. + } + + // ... + + // Send a pointer to a struct AMessage object. Don't block if the + // queue is already full. + pxMessage = & xMessage; + xQueueSend( xQueue, ( void * ) &pxMessage, ( portTickType ) 0 ); + + // ... Rest of task code. + } + + // Task to receive from the queue. + void vADifferentTask( void *pvParameters ) + { + struct AMessage *pxRxedMessage; + + if( xQueue != 0 ) + { + // Receive a message on the created queue. Block for 10 ticks if a + // message is not immediately available. + if( xQueueReceive( xQueue, &( pxRxedMessage ), ( portTickType ) 10 ) ) + { + // pcRxedMessage now points to the struct AMessage variable posted + // by vATask. + } + } + + // ... Rest of task code. + } + </pre> + * \defgroup xQueueReceive xQueueReceive + * \ingroup QueueManagement + */ +#define xQueueReceive( xQueue, pvBuffer, xTicksToWait ) xQueueGenericReceive( ( xQueue ), ( pvBuffer ), ( xTicksToWait ), pdFALSE ) + + +/** + * queue. h + * <pre> + portBASE_TYPE xQueueGenericReceive( + xQueueHandle xQueue, + void *pvBuffer, + portTickType xTicksToWait + portBASE_TYPE xJustPeek + );</pre> + * + * It is preferred that the macro xQueueReceive() be used rather than calling + * this function directly. + * + * Receive an item from a queue. The item is received by copy so a buffer of + * adequate size must be provided. The number of bytes copied into the buffer + * was defined when the queue was created. + * + * This function must not be used in an interrupt service routine. See + * xQueueReceiveFromISR for an alternative that can. + * + * @param pxQueue The handle to the queue from which the item is to be + * received. + * + * @param pvBuffer Pointer to the buffer into which the received item will + * be copied. + * + * @param xTicksToWait The maximum amount of time the task should block + * waiting for an item to receive should the queue be empty at the time + * of the call. The time is defined in tick periods so the constant + * portTICK_RATE_MS should be used to convert to real time if this is required. + * xQueueGenericReceive() will return immediately if the queue is empty and + * xTicksToWait is 0. + * + * @param xJustPeek When set to true, the item received from the queue is not + * actually removed from the queue - meaning a subsequent call to + * xQueueReceive() will return the same item. When set to false, the item + * being received from the queue is also removed from the queue. + * + * @return pdTRUE if an item was successfully received from the queue, + * otherwise pdFALSE. + * + * Example usage: + <pre> + struct AMessage + { + char ucMessageID; + char ucData[ 20 ]; + } xMessage; + + xQueueHandle xQueue; + + // Task to create a queue and post a value. + void vATask( void *pvParameters ) + { + struct AMessage *pxMessage; + + // Create a queue capable of containing 10 pointers to AMessage structures. + // These should be passed by pointer as they contain a lot of data. + xQueue = xQueueCreate( 10, sizeof( struct AMessage * ) ); + if( xQueue == 0 ) + { + // Failed to create the queue. + } + + // ... + + // Send a pointer to a struct AMessage object. Don't block if the + // queue is already full. + pxMessage = & xMessage; + xQueueSend( xQueue, ( void * ) &pxMessage, ( portTickType ) 0 ); + + // ... Rest of task code. + } + + // Task to receive from the queue. + void vADifferentTask( void *pvParameters ) + { + struct AMessage *pxRxedMessage; + + if( xQueue != 0 ) + { + // Receive a message on the created queue. Block for 10 ticks if a + // message is not immediately available. + if( xQueueGenericReceive( xQueue, &( pxRxedMessage ), ( portTickType ) 10 ) ) + { + // pcRxedMessage now points to the struct AMessage variable posted + // by vATask. + } + } + + // ... Rest of task code. + } + </pre> + * \defgroup xQueueReceive xQueueReceive + * \ingroup QueueManagement + */ +signed portBASE_TYPE xQueueGenericReceive( xQueueHandle xQueue, void * const pvBuffer, portTickType xTicksToWait, portBASE_TYPE xJustPeek ); + +/** + * queue. h + * <pre>unsigned portBASE_TYPE uxQueueMessagesWaiting( const xQueueHandle xQueue );</pre> + * + * Return the number of messages stored in a queue. + * + * @param xQueue A handle to the queue being queried. + * + * @return The number of messages available in the queue. + * + * \page uxQueueMessagesWaiting uxQueueMessagesWaiting + * \ingroup QueueManagement + */ +unsigned portBASE_TYPE uxQueueMessagesWaiting( const xQueueHandle xQueue ); + +/** + * queue. h + * <pre>void vQueueDelete( xQueueHandle xQueue );</pre> + * + * Delete a queue - freeing all the memory allocated for storing of items + * placed on the queue. + * + * @param xQueue A handle to the queue to be deleted. + * + * \page vQueueDelete vQueueDelete + * \ingroup QueueManagement + */ +void vQueueDelete( xQueueHandle pxQueue ); + +/** + * queue. h + * <pre> + portBASE_TYPE xQueueSendToFrontFromISR( + xQueueHandle pxQueue, + const void *pvItemToQueue, + portBASE_TYPE *pxHigherPriorityTaskWoken + ); + </pre> + * + * This is a macro that calls xQueueGenericSendFromISR(). + * + * Post an item to the front of a queue. It is safe to use this macro from + * within an interrupt service routine. + * + * Items are queued by copy not reference so it is preferable to only + * queue small items, especially when called from an ISR. In most cases + * it would be preferable to store a pointer to the item being queued. + * + * @param xQueue The handle to the queue on which the item is to be posted. + * + * @param pvItemToQueue A pointer to the item that is to be placed on the + * queue. The size of the items the queue will hold was defined when the + * queue was created, so this many bytes will be copied from pvItemToQueue + * into the queue storage area. + * + * @param pxHigherPriorityTaskWoken xQueueSendToFrontFromISR() will set + * *pxHigherPriorityTaskWoken to pdTRUE if sending to the queue caused a task + * to unblock, and the unblocked task has a priority higher than the currently + * running task. If xQueueSendToFromFromISR() sets this value to pdTRUE then + * a context switch should be requested before the interrupt is exited. + * + * @return pdTRUE if the data was successfully sent to the queue, otherwise + * errQUEUE_FULL. + * + * Example usage for buffered IO (where the ISR can obtain more than one value + * per call): + <pre> + void vBufferISR( void ) + { + char cIn; + portBASE_TYPE xHigherPrioritTaskWoken; + + // We have not woken a task at the start of the ISR. + xHigherPriorityTaskWoken = pdFALSE; + + // Loop until the buffer is empty. + do + { + // Obtain a byte from the buffer. + cIn = portINPUT_BYTE( RX_REGISTER_ADDRESS ); + + // Post the byte. + xQueueSendToFrontFromISR( xRxQueue, &cIn, &xHigherPriorityTaskWoken ); + + } while( portINPUT_BYTE( BUFFER_COUNT ) ); + + // Now the buffer is empty we can switch context if necessary. + if( xHigherPriorityTaskWoken ) + { + taskYIELD (); + } + } + </pre> + * + * \defgroup xQueueSendFromISR xQueueSendFromISR + * \ingroup QueueManagement + */ +#define xQueueSendToFrontFromISR( pxQueue, pvItemToQueue, pxHigherPriorityTaskWoken ) xQueueGenericSendFromISR( ( pxQueue ), ( pvItemToQueue ), ( pxHigherPriorityTaskWoken ), queueSEND_TO_FRONT ) + + +/** + * queue. h + * <pre> + portBASE_TYPE xQueueSendToBackFromISR( + xQueueHandle pxQueue, + const void *pvItemToQueue, + portBASE_TYPE *pxHigherPriorityTaskWoken + ); + </pre> + * + * This is a macro that calls xQueueGenericSendFromISR(). + * + * Post an item to the back of a queue. It is safe to use this macro from + * within an interrupt service routine. + * + * Items are queued by copy not reference so it is preferable to only + * queue small items, especially when called from an ISR. In most cases + * it would be preferable to store a pointer to the item being queued. + * + * @param xQueue The handle to the queue on which the item is to be posted. + * + * @param pvItemToQueue A pointer to the item that is to be placed on the + * queue. The size of the items the queue will hold was defined when the + * queue was created, so this many bytes will be copied from pvItemToQueue + * into the queue storage area. + * + * @param pxHigherPriorityTaskWoken xQueueSendToBackFromISR() will set + * *pxHigherPriorityTaskWoken to pdTRUE if sending to the queue caused a task + * to unblock, and the unblocked task has a priority higher than the currently + * running task. If xQueueSendToBackFromISR() sets this value to pdTRUE then + * a context switch should be requested before the interrupt is exited. + * + * @return pdTRUE if the data was successfully sent to the queue, otherwise + * errQUEUE_FULL. + * + * Example usage for buffered IO (where the ISR can obtain more than one value + * per call): + <pre> + void vBufferISR( void ) + { + char cIn; + portBASE_TYPE xHigherPriorityTaskWoken; + + // We have not woken a task at the start of the ISR. + xHigherPriorityTaskWoken = pdFALSE; + + // Loop until the buffer is empty. + do + { + // Obtain a byte from the buffer. + cIn = portINPUT_BYTE( RX_REGISTER_ADDRESS ); + + // Post the byte. + xQueueSendToBackFromISR( xRxQueue, &cIn, &xHigherPriorityTaskWoken ); + + } while( portINPUT_BYTE( BUFFER_COUNT ) ); + + // Now the buffer is empty we can switch context if necessary. + if( xHigherPriorityTaskWoken ) + { + taskYIELD (); + } + } + </pre> + * + * \defgroup xQueueSendFromISR xQueueSendFromISR + * \ingroup QueueManagement + */ +#define xQueueSendToBackFromISR( pxQueue, pvItemToQueue, pxHigherPriorityTaskWoken ) xQueueGenericSendFromISR( ( pxQueue ), ( pvItemToQueue ), ( pxHigherPriorityTaskWoken ), queueSEND_TO_BACK ) + +/** + * queue. h + * <pre> + portBASE_TYPE xQueueSendFromISR( + xQueueHandle pxQueue, + const void *pvItemToQueue, + portBASE_TYPE *pxHigherPriorityTaskWoken + ); + </pre> + * + * This is a macro that calls xQueueGenericSendFromISR(). It is included + * for backward compatibility with versions of FreeRTOS.org that did not + * include the xQueueSendToBackFromISR() and xQueueSendToFrontFromISR() + * macros. + * + * Post an item to the back of a queue. It is safe to use this function from + * within an interrupt service routine. + * + * Items are queued by copy not reference so it is preferable to only + * queue small items, especially when called from an ISR. In most cases + * it would be preferable to store a pointer to the item being queued. + * + * @param xQueue The handle to the queue on which the item is to be posted. + * + * @param pvItemToQueue A pointer to the item that is to be placed on the + * queue. The size of the items the queue will hold was defined when the + * queue was created, so this many bytes will be copied from pvItemToQueue + * into the queue storage area. + * + * @param pxHigherPriorityTaskWoken xQueueSendFromISR() will set + * *pxHigherPriorityTaskWoken to pdTRUE if sending to the queue caused a task + * to unblock, and the unblocked task has a priority higher than the currently + * running task. If xQueueSendFromISR() sets this value to pdTRUE then + * a context switch should be requested before the interrupt is exited. + * + * @return pdTRUE if the data was successfully sent to the queue, otherwise + * errQUEUE_FULL. + * + * Example usage for buffered IO (where the ISR can obtain more than one value + * per call): + <pre> + void vBufferISR( void ) + { + char cIn; + portBASE_TYPE xHigherPriorityTaskWoken; + + // We have not woken a task at the start of the ISR. + xHigherPriorityTaskWoken = pdFALSE; + + // Loop until the buffer is empty. + do + { + // Obtain a byte from the buffer. + cIn = portINPUT_BYTE( RX_REGISTER_ADDRESS ); + + // Post the byte. + xQueueSendFromISR( xRxQueue, &cIn, &xHigherPriorityTaskWoken ); + + } while( portINPUT_BYTE( BUFFER_COUNT ) ); + + // Now the buffer is empty we can switch context if necessary. + if( xHigherPriorityTaskWoken ) + { + // Actual macro used here is port specific. + taskYIELD_FROM_ISR (); + } + } + </pre> + * + * \defgroup xQueueSendFromISR xQueueSendFromISR + * \ingroup QueueManagement + */ +#define xQueueSendFromISR( pxQueue, pvItemToQueue, pxHigherPriorityTaskWoken ) xQueueGenericSendFromISR( ( pxQueue ), ( pvItemToQueue ), ( pxHigherPriorityTaskWoken ), queueSEND_TO_BACK ) + +/** + * queue. h + * <pre> + portBASE_TYPE xQueueGenericSendFromISR( + xQueueHandle pxQueue, + const void *pvItemToQueue, + portBASE_TYPE *pxHigherPriorityTaskWoken, + portBASE_TYPE xCopyPosition + ); + </pre> + * + * It is preferred that the macros xQueueSendFromISR(), + * xQueueSendToFrontFromISR() and xQueueSendToBackFromISR() be used in place + * of calling this function directly. + * + * Post an item on a queue. It is safe to use this function from within an + * interrupt service routine. + * + * Items are queued by copy not reference so it is preferable to only + * queue small items, especially when called from an ISR. In most cases + * it would be preferable to store a pointer to the item being queued. + * + * @param xQueue The handle to the queue on which the item is to be posted. + * + * @param pvItemToQueue A pointer to the item that is to be placed on the + * queue. The size of the items the queue will hold was defined when the + * queue was created, so this many bytes will be copied from pvItemToQueue + * into the queue storage area. + * + * @param pxHigherPriorityTaskWoken xQueueGenericSendFromISR() will set + * *pxHigherPriorityTaskWoken to pdTRUE if sending to the queue caused a task + * to unblock, and the unblocked task has a priority higher than the currently + * running task. If xQueueGenericSendFromISR() sets this value to pdTRUE then + * a context switch should be requested before the interrupt is exited. + * + * @param xCopyPosition Can take the value queueSEND_TO_BACK to place the + * item at the back of the queue, or queueSEND_TO_FRONT to place the item + * at the front of the queue (for high priority messages). + * + * @return pdTRUE if the data was successfully sent to the queue, otherwise + * errQUEUE_FULL. + * + * Example usage for buffered IO (where the ISR can obtain more than one value + * per call): + <pre> + void vBufferISR( void ) + { + char cIn; + portBASE_TYPE xHigherPriorityTaskWokenByPost; + + // We have not woken a task at the start of the ISR. + xHigherPriorityTaskWokenByPost = pdFALSE; + + // Loop until the buffer is empty. + do + { + // Obtain a byte from the buffer. + cIn = portINPUT_BYTE( RX_REGISTER_ADDRESS ); + + // Post each byte. + xQueueGenericSendFromISR( xRxQueue, &cIn, &xHigherPriorityTaskWokenByPost, queueSEND_TO_BACK ); + + } while( portINPUT_BYTE( BUFFER_COUNT ) ); + + // Now the buffer is empty we can switch context if necessary. Note that the + // name of the yield function required is port specific. + if( xHigherPriorityTaskWokenByPost ) + { + taskYIELD_YIELD_FROM_ISR(); + } + } + </pre> + * + * \defgroup xQueueSendFromISR xQueueSendFromISR + * \ingroup QueueManagement + */ +signed portBASE_TYPE xQueueGenericSendFromISR( xQueueHandle pxQueue, const void * const pvItemToQueue, signed portBASE_TYPE *pxHigherPriorityTaskWoken, portBASE_TYPE xCopyPosition ); + +/** + * queue. h + * <pre> + portBASE_TYPE xQueueReceiveFromISR( + xQueueHandle pxQueue, + void *pvBuffer, + portBASE_TYPE *pxTaskWoken + ); + * </pre> + * + * Receive an item from a queue. It is safe to use this function from within an + * interrupt service routine. + * + * @param pxQueue The handle to the queue from which the item is to be + * received. + * + * @param pvBuffer Pointer to the buffer into which the received item will + * be copied. + * + * @param pxTaskWoken A task may be blocked waiting for space to become + * available on the queue. If xQueueReceiveFromISR causes such a task to + * unblock *pxTaskWoken will get set to pdTRUE, otherwise *pxTaskWoken will + * remain unchanged. + * + * @return pdTRUE if an item was successfully received from the queue, + * otherwise pdFALSE. + * + * Example usage: + <pre> + + xQueueHandle xQueue; + + // Function to create a queue and post some values. + void vAFunction( void *pvParameters ) + { + char cValueToPost; + const portTickType xBlockTime = ( portTickType )0xff; + + // Create a queue capable of containing 10 characters. + xQueue = xQueueCreate( 10, sizeof( char ) ); + if( xQueue == 0 ) + { + // Failed to create the queue. + } + + // ... + + // Post some characters that will be used within an ISR. If the queue + // is full then this task will block for xBlockTime ticks. + cValueToPost = 'a'; + xQueueSend( xQueue, ( void * ) &cValueToPost, xBlockTime ); + cValueToPost = 'b'; + xQueueSend( xQueue, ( void * ) &cValueToPost, xBlockTime ); + + // ... keep posting characters ... this task may block when the queue + // becomes full. + + cValueToPost = 'c'; + xQueueSend( xQueue, ( void * ) &cValueToPost, xBlockTime ); + } + + // ISR that outputs all the characters received on the queue. + void vISR_Routine( void ) + { + portBASE_TYPE xTaskWokenByReceive = pdFALSE; + char cRxedChar; + + while( xQueueReceiveFromISR( xQueue, ( void * ) &cRxedChar, &xTaskWokenByReceive) ) + { + // A character was received. Output the character now. + vOutputCharacter( cRxedChar ); + + // If removing the character from the queue woke the task that was + // posting onto the queue cTaskWokenByReceive will have been set to + // pdTRUE. No matter how many times this loop iterates only one + // task will be woken. + } + + if( cTaskWokenByPost != ( char ) pdFALSE; + { + taskYIELD (); + } + } + </pre> + * \defgroup xQueueReceiveFromISR xQueueReceiveFromISR + * \ingroup QueueManagement + */ +signed portBASE_TYPE xQueueReceiveFromISR( xQueueHandle pxQueue, void * const pvBuffer, signed portBASE_TYPE *pxTaskWoken ); + +/* + * Utilities to query queue that are safe to use from an ISR. These utilities + * should be used only from witin an ISR, or within a critical section. + */ +signed portBASE_TYPE xQueueIsQueueEmptyFromISR( const xQueueHandle pxQueue ); +signed portBASE_TYPE xQueueIsQueueFullFromISR( const xQueueHandle pxQueue ); +unsigned portBASE_TYPE uxQueueMessagesWaitingFromISR( const xQueueHandle pxQueue ); + + +/* + * xQueueAltGenericSend() is an alternative version of xQueueGenericSend(). + * Likewise xQueueAltGenericReceive() is an alternative version of + * xQueueGenericReceive(). + * + * The source code that implements the alternative (Alt) API is much + * simpler because it executes everything from within a critical section. + * This is the approach taken by many other RTOSes, but FreeRTOS.org has the + * preferred fully featured API too. The fully featured API has more + * complex code that takes longer to execute, but makes much less use of + * critical sections. Therefore the alternative API sacrifices interrupt + * responsiveness to gain execution speed, whereas the fully featured API + * sacrifices execution speed to ensure better interrupt responsiveness. + */ +signed portBASE_TYPE xQueueAltGenericSend( xQueueHandle pxQueue, const void * const pvItemToQueue, portTickType xTicksToWait, portBASE_TYPE xCopyPosition ); +signed portBASE_TYPE xQueueAltGenericReceive( xQueueHandle pxQueue, void * const pvBuffer, portTickType xTicksToWait, portBASE_TYPE xJustPeeking ); +#define xQueueAltSendToFront( xQueue, pvItemToQueue, xTicksToWait ) xQueueAltGenericSend( ( xQueue ), ( pvItemToQueue ), ( xTicksToWait ), queueSEND_TO_FRONT ) +#define xQueueAltSendToBack( xQueue, pvItemToQueue, xTicksToWait ) xQueueAltGenericSend( ( xQueue ), ( pvItemToQueue ), ( xTicksToWait ), queueSEND_TO_BACK ) +#define xQueueAltReceive( xQueue, pvBuffer, xTicksToWait ) xQueueAltGenericReceive( ( xQueue ), ( pvBuffer ), ( xTicksToWait ), pdFALSE ) +#define xQueueAltPeek( xQueue, pvBuffer, xTicksToWait ) xQueueAltGenericReceive( ( xQueue ), ( pvBuffer ), ( xTicksToWait ), pdTRUE ) + +/* + * The functions defined above are for passing data to and from tasks. The + * functions below are the equivalents for passing data to and from + * co-routines. + * + * These functions are called from the co-routine macro implementation and + * should not be called directly from application code. Instead use the macro + * wrappers defined within croutine.h. + */ +signed portBASE_TYPE xQueueCRSendFromISR( xQueueHandle pxQueue, const void *pvItemToQueue, signed portBASE_TYPE xCoRoutinePreviouslyWoken ); +signed portBASE_TYPE xQueueCRReceiveFromISR( xQueueHandle pxQueue, void *pvBuffer, signed portBASE_TYPE *pxTaskWoken ); +signed portBASE_TYPE xQueueCRSend( xQueueHandle pxQueue, const void *pvItemToQueue, portTickType xTicksToWait ); +signed portBASE_TYPE xQueueCRReceive( xQueueHandle pxQueue, void *pvBuffer, portTickType xTicksToWait ); + +/* + * For internal use only. Use xSemaphoreCreateMutex() or + * xSemaphoreCreateCounting() instead of calling these functions directly. + */ +xQueueHandle xQueueCreateMutex( void ); +xQueueHandle xQueueCreateCountingSemaphore( unsigned portBASE_TYPE uxCountValue, unsigned portBASE_TYPE uxInitialCount ); + +/* + * For internal use only. Use xSemaphoreTakeMutexRecursive() or + * xSemaphoreGiveMutexRecursive() instead of calling these functions directly. + */ +portBASE_TYPE xQueueTakeMutexRecursive( xQueueHandle pxMutex, portTickType xBlockTime ); +portBASE_TYPE xQueueGiveMutexRecursive( xQueueHandle pxMutex ); + +/* + * The registry is provided as a means for kernel aware debuggers to + * locate queues, semaphores and mutexes. Call vQueueAddToRegistry() add + * a queue, semaphore or mutex handle to the registry if you want the handle + * to be available to a kernel aware debugger. If you are not using a kernel + * aware debugger then this function can be ignored. + * + * configQUEUE_REGISTRY_SIZE defines the maximum number of handles the + * registry can hold. configQUEUE_REGISTRY_SIZE must be greater than 0 + * within FreeRTOSConfig.h for the registry to be available. Its value + * does not effect the number of queues, semaphores and mutexes that can be + * created - just the number that the registry can hold. + * + * @param xQueue The handle of the queue being added to the registry. This + * is the handle returned by a call to xQueueCreate(). Semaphore and mutex + * handles can also be passed in here. + * + * @param pcName The name to be associated with the handle. This is the + * name that the kernel aware debugger will display. + */ +#if configQUEUE_REGISTRY_SIZE > 0U + void vQueueAddToRegistry( xQueueHandle xQueue, signed char *pcName ); +#endif + +/* Not a public API function, hence the 'Restricted' in the name. */ +void vQueueWaitForMessageRestricted( xQueueHandle pxQueue, portTickType xTicksToWait ); + + +#ifdef __cplusplus +} +#endif + +#endif /* QUEUE_H */ + diff --git a/TP1_labyrinth_etu/FreeRTOS_include/semphr.h b/TP1_labyrinth_etu/FreeRTOS_include/semphr.h new file mode 100644 index 0000000000000000000000000000000000000000..0130f1d79aee4bd7d3863ab84ceed0d6798c37bf --- /dev/null +++ b/TP1_labyrinth_etu/FreeRTOS_include/semphr.h @@ -0,0 +1,717 @@ +/* + FreeRTOS V7.0.1 - Copyright (C) 2011 Real Time Engineers Ltd. + + + FreeRTOS supports many tools and architectures. V7.0.0 is sponsored by: + Atollic AB - Atollic provides professional embedded systems development + tools for C/C++ development, code analysis and test automation. + See http://www.atollic.com + + + *************************************************************************** + * * + * FreeRTOS tutorial books are available in pdf and paperback. * + * Complete, revised, and edited pdf reference manuals are also * + * available. * + * * + * Purchasing FreeRTOS documentation will not only help you, by * + * ensuring you get running as quickly as possible and with an * + * in-depth knowledge of how to use FreeRTOS, it will also help * + * the FreeRTOS project to continue with its mission of providing * + * professional grade, cross platform, de facto standard solutions * + * for microcontrollers - completely free of charge! * + * * + * >>> See http://www.FreeRTOS.org/Documentation for details. <<< * + * * + * Thank you for using FreeRTOS, and thank you for your support! * + * * + *************************************************************************** + + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation AND MODIFIED BY the FreeRTOS exception. + >>>NOTE<<< The modification to the GPL is included to allow you to + distribute a combined work that includes FreeRTOS without being obliged to + provide the source code for proprietary components outside of the FreeRTOS + kernel. FreeRTOS is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + more details. You should have received a copy of the GNU General Public + License and the FreeRTOS license exception along with FreeRTOS; if not it + can be viewed here: http://www.freertos.org/a00114.html and also obtained + by writing to Richard Barry, contact details for whom are available on the + FreeRTOS WEB site. + + 1 tab == 4 spaces! + + http://www.FreeRTOS.org - Documentation, latest information, license and + contact details. + + http://www.SafeRTOS.com - A version that is certified for use in safety + critical systems. + + http://www.OpenRTOS.com - Commercial support, development, porting, + licensing and training services. +*/ + +#ifndef SEMAPHORE_H +#define SEMAPHORE_H + +#ifndef INC_FREERTOS_H + #error "#include FreeRTOS.h" must appear in source files before "#include semphr.h" +#endif + +#include "queue.h" + +typedef xQueueHandle xSemaphoreHandle; + +#define semBINARY_SEMAPHORE_QUEUE_LENGTH ( ( unsigned char ) 1U ) +#define semSEMAPHORE_QUEUE_ITEM_LENGTH ( ( unsigned char ) 0U ) +#define semGIVE_BLOCK_TIME ( ( portTickType ) 0U ) + + +/** + * semphr. h + * <pre>vSemaphoreCreateBinary( xSemaphoreHandle xSemaphore )</pre> + * + * <i>Macro</i> that implements a semaphore by using the existing queue mechanism. + * The queue length is 1 as this is a binary semaphore. The data size is 0 + * as we don't want to actually store any data - we just want to know if the + * queue is empty or full. + * + * This type of semaphore can be used for pure synchronisation between tasks or + * between an interrupt and a task. The semaphore need not be given back once + * obtained, so one task/interrupt can continuously 'give' the semaphore while + * another continuously 'takes' the semaphore. For this reason this type of + * semaphore does not use a priority inheritance mechanism. For an alternative + * that does use priority inheritance see xSemaphoreCreateMutex(). + * + * @param xSemaphore Handle to the created semaphore. Should be of type xSemaphoreHandle. + * + * Example usage: + <pre> + xSemaphoreHandle xSemaphore; + + void vATask( void * pvParameters ) + { + // Semaphore cannot be used before a call to vSemaphoreCreateBinary (). + // This is a macro so pass the variable in directly. + vSemaphoreCreateBinary( xSemaphore ); + + if( xSemaphore != NULL ) + { + // The semaphore was created successfully. + // The semaphore can now be used. + } + } + </pre> + * \defgroup vSemaphoreCreateBinary vSemaphoreCreateBinary + * \ingroup Semaphores + */ +#define vSemaphoreCreateBinary( xSemaphore ) { \ + ( xSemaphore ) = xQueueCreate( ( unsigned portBASE_TYPE ) 1, semSEMAPHORE_QUEUE_ITEM_LENGTH ); \ + if( ( xSemaphore ) != NULL ) \ + { \ + xSemaphoreGive( ( xSemaphore ) ); \ + } \ + } + +/** + * semphr. h + * <pre>xSemaphoreTake( + * xSemaphoreHandle xSemaphore, + * portTickType xBlockTime + * )</pre> + * + * <i>Macro</i> to obtain a semaphore. The semaphore must have previously been + * created with a call to vSemaphoreCreateBinary(), xSemaphoreCreateMutex() or + * xSemaphoreCreateCounting(). + * + * @param xSemaphore A handle to the semaphore being taken - obtained when + * the semaphore was created. + * + * @param xBlockTime The time in ticks to wait for the semaphore to become + * available. The macro portTICK_RATE_MS can be used to convert this to a + * real time. A block time of zero can be used to poll the semaphore. A block + * time of portMAX_DELAY can be used to block indefinitely (provided + * INCLUDE_vTaskSuspend is set to 1 in FreeRTOSConfig.h). + * + * @return pdTRUE if the semaphore was obtained. pdFALSE + * if xBlockTime expired without the semaphore becoming available. + * + * Example usage: + <pre> + xSemaphoreHandle xSemaphore = NULL; + + // A task that creates a semaphore. + void vATask( void * pvParameters ) + { + // Create the semaphore to guard a shared resource. + vSemaphoreCreateBinary( xSemaphore ); + } + + // A task that uses the semaphore. + void vAnotherTask( void * pvParameters ) + { + // ... Do other things. + + if( xSemaphore != NULL ) + { + // See if we can obtain the semaphore. If the semaphore is not available + // wait 10 ticks to see if it becomes free. + if( xSemaphoreTake( xSemaphore, ( portTickType ) 10 ) == pdTRUE ) + { + // We were able to obtain the semaphore and can now access the + // shared resource. + + // ... + + // We have finished accessing the shared resource. Release the + // semaphore. + xSemaphoreGive( xSemaphore ); + } + else + { + // We could not obtain the semaphore and can therefore not access + // the shared resource safely. + } + } + } + </pre> + * \defgroup xSemaphoreTake xSemaphoreTake + * \ingroup Semaphores + */ +#define xSemaphoreTake( xSemaphore, xBlockTime ) xQueueGenericReceive( ( xQueueHandle ) ( xSemaphore ), NULL, ( xBlockTime ), pdFALSE ) + +/** + * semphr. h + * xSemaphoreTakeRecursive( + * xSemaphoreHandle xMutex, + * portTickType xBlockTime + * ) + * + * <i>Macro</i> to recursively obtain, or 'take', a mutex type semaphore. + * The mutex must have previously been created using a call to + * xSemaphoreCreateRecursiveMutex(); + * + * configUSE_RECURSIVE_MUTEXES must be set to 1 in FreeRTOSConfig.h for this + * macro to be available. + * + * This macro must not be used on mutexes created using xSemaphoreCreateMutex(). + * + * A mutex used recursively can be 'taken' repeatedly by the owner. The mutex + * doesn't become available again until the owner has called + * xSemaphoreGiveRecursive() for each successful 'take' request. For example, + * if a task successfully 'takes' the same mutex 5 times then the mutex will + * not be available to any other task until it has also 'given' the mutex back + * exactly five times. + * + * @param xMutex A handle to the mutex being obtained. This is the + * handle returned by xSemaphoreCreateRecursiveMutex(); + * + * @param xBlockTime The time in ticks to wait for the semaphore to become + * available. The macro portTICK_RATE_MS can be used to convert this to a + * real time. A block time of zero can be used to poll the semaphore. If + * the task already owns the semaphore then xSemaphoreTakeRecursive() will + * return immediately no matter what the value of xBlockTime. + * + * @return pdTRUE if the semaphore was obtained. pdFALSE if xBlockTime + * expired without the semaphore becoming available. + * + * Example usage: + <pre> + xSemaphoreHandle xMutex = NULL; + + // A task that creates a mutex. + void vATask( void * pvParameters ) + { + // Create the mutex to guard a shared resource. + xMutex = xSemaphoreCreateRecursiveMutex(); + } + + // A task that uses the mutex. + void vAnotherTask( void * pvParameters ) + { + // ... Do other things. + + if( xMutex != NULL ) + { + // See if we can obtain the mutex. If the mutex is not available + // wait 10 ticks to see if it becomes free. + if( xSemaphoreTakeRecursive( xSemaphore, ( portTickType ) 10 ) == pdTRUE ) + { + // We were able to obtain the mutex and can now access the + // shared resource. + + // ... + // For some reason due to the nature of the code further calls to + // xSemaphoreTakeRecursive() are made on the same mutex. In real + // code these would not be just sequential calls as this would make + // no sense. Instead the calls are likely to be buried inside + // a more complex call structure. + xSemaphoreTakeRecursive( xMutex, ( portTickType ) 10 ); + xSemaphoreTakeRecursive( xMutex, ( portTickType ) 10 ); + + // The mutex has now been 'taken' three times, so will not be + // available to another task until it has also been given back + // three times. Again it is unlikely that real code would have + // these calls sequentially, but instead buried in a more complex + // call structure. This is just for illustrative purposes. + xSemaphoreGiveRecursive( xMutex ); + xSemaphoreGiveRecursive( xMutex ); + xSemaphoreGiveRecursive( xMutex ); + + // Now the mutex can be taken by other tasks. + } + else + { + // We could not obtain the mutex and can therefore not access + // the shared resource safely. + } + } + } + </pre> + * \defgroup xSemaphoreTakeRecursive xSemaphoreTakeRecursive + * \ingroup Semaphores + */ +#define xSemaphoreTakeRecursive( xMutex, xBlockTime ) xQueueTakeMutexRecursive( ( xMutex ), ( xBlockTime ) ) + + +/* + * xSemaphoreAltTake() is an alternative version of xSemaphoreTake(). + * + * The source code that implements the alternative (Alt) API is much + * simpler because it executes everything from within a critical section. + * This is the approach taken by many other RTOSes, but FreeRTOS.org has the + * preferred fully featured API too. The fully featured API has more + * complex code that takes longer to execute, but makes much less use of + * critical sections. Therefore the alternative API sacrifices interrupt + * responsiveness to gain execution speed, whereas the fully featured API + * sacrifices execution speed to ensure better interrupt responsiveness. + */ +#define xSemaphoreAltTake( xSemaphore, xBlockTime ) xQueueAltGenericReceive( ( xQueueHandle ) ( xSemaphore ), NULL, ( xBlockTime ), pdFALSE ) + +/** + * semphr. h + * <pre>xSemaphoreGive( xSemaphoreHandle xSemaphore )</pre> + * + * <i>Macro</i> to release a semaphore. The semaphore must have previously been + * created with a call to vSemaphoreCreateBinary(), xSemaphoreCreateMutex() or + * xSemaphoreCreateCounting(). and obtained using sSemaphoreTake(). + * + * This macro must not be used from an ISR. See xSemaphoreGiveFromISR () for + * an alternative which can be used from an ISR. + * + * This macro must also not be used on semaphores created using + * xSemaphoreCreateRecursiveMutex(). + * + * @param xSemaphore A handle to the semaphore being released. This is the + * handle returned when the semaphore was created. + * + * @return pdTRUE if the semaphore was released. pdFALSE if an error occurred. + * Semaphores are implemented using queues. An error can occur if there is + * no space on the queue to post a message - indicating that the + * semaphore was not first obtained correctly. + * + * Example usage: + <pre> + xSemaphoreHandle xSemaphore = NULL; + + void vATask( void * pvParameters ) + { + // Create the semaphore to guard a shared resource. + vSemaphoreCreateBinary( xSemaphore ); + + if( xSemaphore != NULL ) + { + if( xSemaphoreGive( xSemaphore ) != pdTRUE ) + { + // We would expect this call to fail because we cannot give + // a semaphore without first "taking" it! + } + + // Obtain the semaphore - don't block if the semaphore is not + // immediately available. + if( xSemaphoreTake( xSemaphore, ( portTickType ) 0 ) ) + { + // We now have the semaphore and can access the shared resource. + + // ... + + // We have finished accessing the shared resource so can free the + // semaphore. + if( xSemaphoreGive( xSemaphore ) != pdTRUE ) + { + // We would not expect this call to fail because we must have + // obtained the semaphore to get here. + } + } + } + } + </pre> + * \defgroup xSemaphoreGive xSemaphoreGive + * \ingroup Semaphores + */ +#define xSemaphoreGive( xSemaphore ) xQueueGenericSend( ( xQueueHandle ) ( xSemaphore ), NULL, semGIVE_BLOCK_TIME, queueSEND_TO_BACK ) + +/** + * semphr. h + * <pre>xSemaphoreGiveRecursive( xSemaphoreHandle xMutex )</pre> + * + * <i>Macro</i> to recursively release, or 'give', a mutex type semaphore. + * The mutex must have previously been created using a call to + * xSemaphoreCreateRecursiveMutex(); + * + * configUSE_RECURSIVE_MUTEXES must be set to 1 in FreeRTOSConfig.h for this + * macro to be available. + * + * This macro must not be used on mutexes created using xSemaphoreCreateMutex(). + * + * A mutex used recursively can be 'taken' repeatedly by the owner. The mutex + * doesn't become available again until the owner has called + * xSemaphoreGiveRecursive() for each successful 'take' request. For example, + * if a task successfully 'takes' the same mutex 5 times then the mutex will + * not be available to any other task until it has also 'given' the mutex back + * exactly five times. + * + * @param xMutex A handle to the mutex being released, or 'given'. This is the + * handle returned by xSemaphoreCreateMutex(); + * + * @return pdTRUE if the semaphore was given. + * + * Example usage: + <pre> + xSemaphoreHandle xMutex = NULL; + + // A task that creates a mutex. + void vATask( void * pvParameters ) + { + // Create the mutex to guard a shared resource. + xMutex = xSemaphoreCreateRecursiveMutex(); + } + + // A task that uses the mutex. + void vAnotherTask( void * pvParameters ) + { + // ... Do other things. + + if( xMutex != NULL ) + { + // See if we can obtain the mutex. If the mutex is not available + // wait 10 ticks to see if it becomes free. + if( xSemaphoreTakeRecursive( xMutex, ( portTickType ) 10 ) == pdTRUE ) + { + // We were able to obtain the mutex and can now access the + // shared resource. + + // ... + // For some reason due to the nature of the code further calls to + // xSemaphoreTakeRecursive() are made on the same mutex. In real + // code these would not be just sequential calls as this would make + // no sense. Instead the calls are likely to be buried inside + // a more complex call structure. + xSemaphoreTakeRecursive( xMutex, ( portTickType ) 10 ); + xSemaphoreTakeRecursive( xMutex, ( portTickType ) 10 ); + + // The mutex has now been 'taken' three times, so will not be + // available to another task until it has also been given back + // three times. Again it is unlikely that real code would have + // these calls sequentially, it would be more likely that the calls + // to xSemaphoreGiveRecursive() would be called as a call stack + // unwound. This is just for demonstrative purposes. + xSemaphoreGiveRecursive( xMutex ); + xSemaphoreGiveRecursive( xMutex ); + xSemaphoreGiveRecursive( xMutex ); + + // Now the mutex can be taken by other tasks. + } + else + { + // We could not obtain the mutex and can therefore not access + // the shared resource safely. + } + } + } + </pre> + * \defgroup xSemaphoreGiveRecursive xSemaphoreGiveRecursive + * \ingroup Semaphores + */ +#define xSemaphoreGiveRecursive( xMutex ) xQueueGiveMutexRecursive( ( xMutex ) ) + +/* + * xSemaphoreAltGive() is an alternative version of xSemaphoreGive(). + * + * The source code that implements the alternative (Alt) API is much + * simpler because it executes everything from within a critical section. + * This is the approach taken by many other RTOSes, but FreeRTOS.org has the + * preferred fully featured API too. The fully featured API has more + * complex code that takes longer to execute, but makes much less use of + * critical sections. Therefore the alternative API sacrifices interrupt + * responsiveness to gain execution speed, whereas the fully featured API + * sacrifices execution speed to ensure better interrupt responsiveness. + */ +#define xSemaphoreAltGive( xSemaphore ) xQueueAltGenericSend( ( xQueueHandle ) ( xSemaphore ), NULL, semGIVE_BLOCK_TIME, queueSEND_TO_BACK ) + +/** + * semphr. h + * <pre> + xSemaphoreGiveFromISR( + xSemaphoreHandle xSemaphore, + signed portBASE_TYPE *pxHigherPriorityTaskWoken + )</pre> + * + * <i>Macro</i> to release a semaphore. The semaphore must have previously been + * created with a call to vSemaphoreCreateBinary() or xSemaphoreCreateCounting(). + * + * Mutex type semaphores (those created using a call to xSemaphoreCreateMutex()) + * must not be used with this macro. + * + * This macro can be used from an ISR. + * + * @param xSemaphore A handle to the semaphore being released. This is the + * handle returned when the semaphore was created. + * + * @param pxHigherPriorityTaskWoken xSemaphoreGiveFromISR() will set + * *pxHigherPriorityTaskWoken to pdTRUE if giving the semaphore caused a task + * to unblock, and the unblocked task has a priority higher than the currently + * running task. If xSemaphoreGiveFromISR() sets this value to pdTRUE then + * a context switch should be requested before the interrupt is exited. + * + * @return pdTRUE if the semaphore was successfully given, otherwise errQUEUE_FULL. + * + * Example usage: + <pre> + \#define LONG_TIME 0xffff + \#define TICKS_TO_WAIT 10 + xSemaphoreHandle xSemaphore = NULL; + + // Repetitive task. + void vATask( void * pvParameters ) + { + for( ;; ) + { + // We want this task to run every 10 ticks of a timer. The semaphore + // was created before this task was started. + + // Block waiting for the semaphore to become available. + if( xSemaphoreTake( xSemaphore, LONG_TIME ) == pdTRUE ) + { + // It is time to execute. + + // ... + + // We have finished our task. Return to the top of the loop where + // we will block on the semaphore until it is time to execute + // again. Note when using the semaphore for synchronisation with an + // ISR in this manner there is no need to 'give' the semaphore back. + } + } + } + + // Timer ISR + void vTimerISR( void * pvParameters ) + { + static unsigned char ucLocalTickCount = 0; + static signed portBASE_TYPE xHigherPriorityTaskWoken; + + // A timer tick has occurred. + + // ... Do other time functions. + + // Is it time for vATask () to run? + xHigherPriorityTaskWoken = pdFALSE; + ucLocalTickCount++; + if( ucLocalTickCount >= TICKS_TO_WAIT ) + { + // Unblock the task by releasing the semaphore. + xSemaphoreGiveFromISR( xSemaphore, &xHigherPriorityTaskWoken ); + + // Reset the count so we release the semaphore again in 10 ticks time. + ucLocalTickCount = 0; + } + + if( xHigherPriorityTaskWoken != pdFALSE ) + { + // We can force a context switch here. Context switching from an + // ISR uses port specific syntax. Check the demo task for your port + // to find the syntax required. + } + } + </pre> + * \defgroup xSemaphoreGiveFromISR xSemaphoreGiveFromISR + * \ingroup Semaphores + */ +#define xSemaphoreGiveFromISR( xSemaphore, pxHigherPriorityTaskWoken ) xQueueGenericSendFromISR( ( xQueueHandle ) ( xSemaphore ), NULL, ( pxHigherPriorityTaskWoken ), queueSEND_TO_BACK ) + +/** + * semphr. h + * <pre>xSemaphoreHandle xSemaphoreCreateMutex( void )</pre> + * + * <i>Macro</i> that implements a mutex semaphore by using the existing queue + * mechanism. + * + * Mutexes created using this macro can be accessed using the xSemaphoreTake() + * and xSemaphoreGive() macros. The xSemaphoreTakeRecursive() and + * xSemaphoreGiveRecursive() macros should not be used. + * + * This type of semaphore uses a priority inheritance mechanism so a task + * 'taking' a semaphore MUST ALWAYS 'give' the semaphore back once the + * semaphore it is no longer required. + * + * Mutex type semaphores cannot be used from within interrupt service routines. + * + * See vSemaphoreCreateBinary() for an alternative implementation that can be + * used for pure synchronisation (where one task or interrupt always 'gives' the + * semaphore and another always 'takes' the semaphore) and from within interrupt + * service routines. + * + * @return xSemaphore Handle to the created mutex semaphore. Should be of type + * xSemaphoreHandle. + * + * Example usage: + <pre> + xSemaphoreHandle xSemaphore; + + void vATask( void * pvParameters ) + { + // Semaphore cannot be used before a call to xSemaphoreCreateMutex(). + // This is a macro so pass the variable in directly. + xSemaphore = xSemaphoreCreateMutex(); + + if( xSemaphore != NULL ) + { + // The semaphore was created successfully. + // The semaphore can now be used. + } + } + </pre> + * \defgroup vSemaphoreCreateMutex vSemaphoreCreateMutex + * \ingroup Semaphores + */ +#define xSemaphoreCreateMutex() xQueueCreateMutex() + + +/** + * semphr. h + * <pre>xSemaphoreHandle xSemaphoreCreateRecursiveMutex( void )</pre> + * + * <i>Macro</i> that implements a recursive mutex by using the existing queue + * mechanism. + * + * Mutexes created using this macro can be accessed using the + * xSemaphoreTakeRecursive() and xSemaphoreGiveRecursive() macros. The + * xSemaphoreTake() and xSemaphoreGive() macros should not be used. + * + * A mutex used recursively can be 'taken' repeatedly by the owner. The mutex + * doesn't become available again until the owner has called + * xSemaphoreGiveRecursive() for each successful 'take' request. For example, + * if a task successfully 'takes' the same mutex 5 times then the mutex will + * not be available to any other task until it has also 'given' the mutex back + * exactly five times. + * + * This type of semaphore uses a priority inheritance mechanism so a task + * 'taking' a semaphore MUST ALWAYS 'give' the semaphore back once the + * semaphore it is no longer required. + * + * Mutex type semaphores cannot be used from within interrupt service routines. + * + * See vSemaphoreCreateBinary() for an alternative implementation that can be + * used for pure synchronisation (where one task or interrupt always 'gives' the + * semaphore and another always 'takes' the semaphore) and from within interrupt + * service routines. + * + * @return xSemaphore Handle to the created mutex semaphore. Should be of type + * xSemaphoreHandle. + * + * Example usage: + <pre> + xSemaphoreHandle xSemaphore; + + void vATask( void * pvParameters ) + { + // Semaphore cannot be used before a call to xSemaphoreCreateMutex(). + // This is a macro so pass the variable in directly. + xSemaphore = xSemaphoreCreateRecursiveMutex(); + + if( xSemaphore != NULL ) + { + // The semaphore was created successfully. + // The semaphore can now be used. + } + } + </pre> + * \defgroup vSemaphoreCreateMutex vSemaphoreCreateMutex + * \ingroup Semaphores + */ +#define xSemaphoreCreateRecursiveMutex() xQueueCreateMutex() + +/** + * semphr. h + * <pre>xSemaphoreHandle xSemaphoreCreateCounting( unsigned portBASE_TYPE uxMaxCount, unsigned portBASE_TYPE uxInitialCount )</pre> + * + * <i>Macro</i> that creates a counting semaphore by using the existing + * queue mechanism. + * + * Counting semaphores are typically used for two things: + * + * 1) Counting events. + * + * In this usage scenario an event handler will 'give' a semaphore each time + * an event occurs (incrementing the semaphore count value), and a handler + * task will 'take' a semaphore each time it processes an event + * (decrementing the semaphore count value). The count value is therefore + * the difference between the number of events that have occurred and the + * number that have been processed. In this case it is desirable for the + * initial count value to be zero. + * + * 2) Resource management. + * + * In this usage scenario the count value indicates the number of resources + * available. To obtain control of a resource a task must first obtain a + * semaphore - decrementing the semaphore count value. When the count value + * reaches zero there are no free resources. When a task finishes with the + * resource it 'gives' the semaphore back - incrementing the semaphore count + * value. In this case it is desirable for the initial count value to be + * equal to the maximum count value, indicating that all resources are free. + * + * @param uxMaxCount The maximum count value that can be reached. When the + * semaphore reaches this value it can no longer be 'given'. + * + * @param uxInitialCount The count value assigned to the semaphore when it is + * created. + * + * @return Handle to the created semaphore. Null if the semaphore could not be + * created. + * + * Example usage: + <pre> + xSemaphoreHandle xSemaphore; + + void vATask( void * pvParameters ) + { + xSemaphoreHandle xSemaphore = NULL; + + // Semaphore cannot be used before a call to xSemaphoreCreateCounting(). + // The max value to which the semaphore can count should be 10, and the + // initial value assigned to the count should be 0. + xSemaphore = xSemaphoreCreateCounting( 10, 0 ); + + if( xSemaphore != NULL ) + { + // The semaphore was created successfully. + // The semaphore can now be used. + } + } + </pre> + * \defgroup xSemaphoreCreateCounting xSemaphoreCreateCounting + * \ingroup Semaphores + */ +#define xSemaphoreCreateCounting( uxMaxCount, uxInitialCount ) xQueueCreateCountingSemaphore( ( uxMaxCount ), ( uxInitialCount ) ) + + +#endif /* SEMAPHORE_H */ + + diff --git a/TP1_labyrinth_etu/FreeRTOS_include/task.h b/TP1_labyrinth_etu/FreeRTOS_include/task.h new file mode 100644 index 0000000000000000000000000000000000000000..3c44904dc3ecbe036989a918752a6d3fc0dad564 --- /dev/null +++ b/TP1_labyrinth_etu/FreeRTOS_include/task.h @@ -0,0 +1,1307 @@ +/* + FreeRTOS V7.0.1 - Copyright (C) 2011 Real Time Engineers Ltd. + + + FreeRTOS supports many tools and architectures. V7.0.0 is sponsored by: + Atollic AB - Atollic provides professional embedded systems development + tools for C/C++ development, code analysis and test automation. + See http://www.atollic.com + + + *************************************************************************** + * * + * FreeRTOS tutorial books are available in pdf and paperback. * + * Complete, revised, and edited pdf reference manuals are also * + * available. * + * * + * Purchasing FreeRTOS documentation will not only help you, by * + * ensuring you get running as quickly as possible and with an * + * in-depth knowledge of how to use FreeRTOS, it will also help * + * the FreeRTOS project to continue with its mission of providing * + * professional grade, cross platform, de facto standard solutions * + * for microcontrollers - completely free of charge! * + * * + * >>> See http://www.FreeRTOS.org/Documentation for details. <<< * + * * + * Thank you for using FreeRTOS, and thank you for your support! * + * * + *************************************************************************** + + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation AND MODIFIED BY the FreeRTOS exception. + >>>NOTE<<< The modification to the GPL is included to allow you to + distribute a combined work that includes FreeRTOS without being obliged to + provide the source code for proprietary components outside of the FreeRTOS + kernel. FreeRTOS is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + more details. You should have received a copy of the GNU General Public + License and the FreeRTOS license exception along with FreeRTOS; if not it + can be viewed here: http://www.freertos.org/a00114.html and also obtained + by writing to Richard Barry, contact details for whom are available on the + FreeRTOS WEB site. + + 1 tab == 4 spaces! + + http://www.FreeRTOS.org - Documentation, latest information, license and + contact details. + + http://www.SafeRTOS.com - A version that is certified for use in safety + critical systems. + + http://www.OpenRTOS.com - Commercial support, development, porting, + licensing and training services. +*/ + + +#ifndef TASK_H +#define TASK_H + +#ifndef INC_FREERTOS_H + #error "include FreeRTOS.h must appear in source files before include task.h" +#endif + +#include "portable.h" +#include "list.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/*----------------------------------------------------------- + * MACROS AND DEFINITIONS + *----------------------------------------------------------*/ + +#define tskKERNEL_VERSION_NUMBER "V7.0.1" + +/** + * task. h + * + * Type by which tasks are referenced. For example, a call to xTaskCreate + * returns (via a pointer parameter) an xTaskHandle variable that can then + * be used as a parameter to vTaskDelete to delete the task. + * + * \page xTaskHandle xTaskHandle + * \ingroup Tasks + */ +typedef void * xTaskHandle; + +/* + * Used internally only. + */ +typedef struct xTIME_OUT +{ + portBASE_TYPE xOverflowCount; + portTickType xTimeOnEntering; +} xTimeOutType; + +/* + * Defines the memory ranges allocated to the task when an MPU is used. + */ +typedef struct xMEMORY_REGION +{ + void *pvBaseAddress; + unsigned long ulLengthInBytes; + unsigned long ulParameters; +} xMemoryRegion; + +/* + * Parameters required to create an MPU protected task. + */ +typedef struct xTASK_PARAMTERS +{ + pdTASK_CODE pvTaskCode; + const signed char * const pcName; + unsigned short usStackDepth; + void *pvParameters; + unsigned portBASE_TYPE uxPriority; + portSTACK_TYPE *puxStackBuffer; + xMemoryRegion xRegions[ portNUM_CONFIGURABLE_REGIONS ]; +} xTaskParameters; + +/* + * Defines the priority used by the idle task. This must not be modified. + * + * \ingroup TaskUtils + */ +#define tskIDLE_PRIORITY ( ( unsigned portBASE_TYPE ) 0U ) + +/** + * task. h + * + * Macro for forcing a context switch. + * + * \page taskYIELD taskYIELD + * \ingroup SchedulerControl + */ +#define taskYIELD() portYIELD() + +/** + * task. h + * + * Macro to mark the start of a critical code region. Preemptive context + * switches cannot occur when in a critical region. + * + * NOTE: This may alter the stack (depending on the portable implementation) + * so must be used with care! + * + * \page taskENTER_CRITICAL taskENTER_CRITICAL + * \ingroup SchedulerControl + */ +#define taskENTER_CRITICAL() portENTER_CRITICAL() + +/** + * task. h + * + * Macro to mark the end of a critical code region. Preemptive context + * switches cannot occur when in a critical region. + * + * NOTE: This may alter the stack (depending on the portable implementation) + * so must be used with care! + * + * \page taskEXIT_CRITICAL taskEXIT_CRITICAL + * \ingroup SchedulerControl + */ +#define taskEXIT_CRITICAL() portEXIT_CRITICAL() + +/** + * task. h + * + * Macro to disable all maskable interrupts. + * + * \page taskDISABLE_INTERRUPTS taskDISABLE_INTERRUPTS + * \ingroup SchedulerControl + */ +#define taskDISABLE_INTERRUPTS() portDISABLE_INTERRUPTS() + +/** + * task. h + * + * Macro to enable microcontroller interrupts. + * + * \page taskENABLE_INTERRUPTS taskENABLE_INTERRUPTS + * \ingroup SchedulerControl + */ +#define taskENABLE_INTERRUPTS() portENABLE_INTERRUPTS() + +/* Definitions returned by xTaskGetSchedulerState(). */ +#define taskSCHEDULER_NOT_STARTED 0 +#define taskSCHEDULER_RUNNING 1 +#define taskSCHEDULER_SUSPENDED 2 + +/*----------------------------------------------------------- + * TASK CREATION API + *----------------------------------------------------------*/ + +/** + * task. h + *<pre> + portBASE_TYPE xTaskCreate( + pdTASK_CODE pvTaskCode, + const char * const pcName, + unsigned short usStackDepth, + void *pvParameters, + unsigned portBASE_TYPE uxPriority, + xTaskHandle *pvCreatedTask + );</pre> + * + * Create a new task and add it to the list of tasks that are ready to run. + * + * xTaskCreate() can only be used to create a task that has unrestricted + * access to the entire microcontroller memory map. Systems that include MPU + * support can alternatively create an MPU constrained task using + * xTaskCreateRestricted(). + * + * @param pvTaskCode Pointer to the task entry function. Tasks + * must be implemented to never return (i.e. continuous loop). + * + * @param pcName A descriptive name for the task. This is mainly used to + * facilitate debugging. Max length defined by tskMAX_TASK_NAME_LEN - default + * is 16. + * + * @param usStackDepth The size of the task stack specified as the number of + * variables the stack can hold - not the number of bytes. For example, if + * the stack is 16 bits wide and usStackDepth is defined as 100, 200 bytes + * will be allocated for stack storage. + * + * @param pvParameters Pointer that will be used as the parameter for the task + * being created. + * + * @param uxPriority The priority at which the task should run. Systems that + * include MPU support can optionally create tasks in a privileged (system) + * mode by setting bit portPRIVILEGE_BIT of the priority parameter. For + * example, to create a privileged task at priority 2 the uxPriority parameter + * should be set to ( 2 | portPRIVILEGE_BIT ). + * + * @param pvCreatedTask Used to pass back a handle by which the created task + * can be referenced. + * + * @return pdPASS if the task was successfully created and added to a ready + * list, otherwise an error code defined in the file errors. h + * + * Example usage: + <pre> + // Task to be created. + void vTaskCode( void * pvParameters ) + { + for( ;; ) + { + // Task code goes here. + } + } + + // Function that creates a task. + void vOtherFunction( void ) + { + static unsigned char ucParameterToPass; + xTaskHandle xHandle; + + // Create the task, storing the handle. Note that the passed parameter ucParameterToPass + // must exist for the lifetime of the task, so in this case is declared static. If it was just an + // 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. + xTaskCreate( vTaskCode, "NAME", STACK_SIZE, &ucParameterToPass, tskIDLE_PRIORITY, &xHandle ); + + // Use the handle to delete the task. + vTaskDelete( xHandle ); + } + </pre> + * \defgroup xTaskCreate xTaskCreate + * \ingroup Tasks + */ +#define xTaskCreate( pvTaskCode, pcName, usStackDepth, pvParameters, uxPriority, pxCreatedTask ) xTaskGenericCreate( ( pvTaskCode ), ( pcName ), ( usStackDepth ), ( pvParameters ), ( uxPriority ), ( pxCreatedTask ), ( NULL ), ( NULL ) ) + +/** + * task. h + *<pre> + portBASE_TYPE xTaskCreateRestricted( xTaskParameters *pxTaskDefinition, xTaskHandle *pxCreatedTask );</pre> + * + * xTaskCreateRestricted() should only be used in systems that include an MPU + * implementation. + * + * Create a new task and add it to the list of tasks that are ready to run. + * The function parameters define the memory regions and associated access + * permissions allocated to the task. + * + * @param pxTaskDefinition Pointer to a structure that contains a member + * for each of the normal xTaskCreate() parameters (see the xTaskCreate() API + * documentation) plus an optional stack buffer and the memory region + * definitions. + * + * @param pxCreatedTask Used to pass back a handle by which the created task + * can be referenced. + * + * @return pdPASS if the task was successfully created and added to a ready + * list, otherwise an error code defined in the file errors. h + * + * Example usage: + <pre> +// Create an xTaskParameters structure that defines the task to be created. +static const xTaskParameters xCheckTaskParameters = +{ + vATask, // pvTaskCode - the function that implements the task. + "ATask", // pcName - just a text name for the task to assist debugging. + 100, // usStackDepth - the stack size DEFINED IN WORDS. + NULL, // pvParameters - passed into the task function as the function parameters. + ( 1UL | portPRIVILEGE_BIT ),// uxPriority - task priority, set the portPRIVILEGE_BIT if the task should run in a privileged state. + cStackBuffer,// puxStackBuffer - the buffer to be used as the task stack. + + // xRegions - Allocate up to three separate memory regions for access by + // the task, with appropriate access permissions. Different processors have + // different memory alignment requirements - refer to the FreeRTOS documentation + // for full information. + { + // Base address Length Parameters + { cReadWriteArray, 32, portMPU_REGION_READ_WRITE }, + { cReadOnlyArray, 32, portMPU_REGION_READ_ONLY }, + { cPrivilegedOnlyAccessArray, 128, portMPU_REGION_PRIVILEGED_READ_WRITE } + } +}; + +int main( void ) +{ +xTaskHandle xHandle; + + // Create a task from the const structure defined above. The task handle + // is requested (the second parameter is not NULL) but in this case just for + // demonstration purposes as its not actually used. + xTaskCreateRestricted( &xRegTest1Parameters, &xHandle ); + + // Start the scheduler. + vTaskStartScheduler(); + + // Will only get here if there was insufficient memory to create the idle + // task. + for( ;; ); +} + </pre> + * \defgroup xTaskCreateRestricted xTaskCreateRestricted + * \ingroup Tasks + */ +#define xTaskCreateRestricted( x, pxCreatedTask ) xTaskGenericCreate( ((x)->pvTaskCode), ((x)->pcName), ((x)->usStackDepth), ((x)->pvParameters), ((x)->uxPriority), (pxCreatedTask), ((x)->puxStackBuffer), ((x)->xRegions) ) + +/** + * task. h + *<pre> + void vTaskAllocateMPURegions( xTaskHandle xTask, const xMemoryRegion * const pxRegions );</pre> + * + * Memory regions are assigned to a restricted task when the task is created by + * a call to xTaskCreateRestricted(). These regions can be redefined using + * vTaskAllocateMPURegions(). + * + * @param xTask The handle of the task being updated. + * + * @param xRegions A pointer to an xMemoryRegion structure that contains the + * new memory region definitions. + * + * Example usage: + <pre> +// Define an array of xMemoryRegion structures that configures an MPU region +// allowing read/write access for 1024 bytes starting at the beginning of the +// ucOneKByte array. The other two of the maximum 3 definable regions are +// unused so set to zero. +static const xMemoryRegion xAltRegions[ portNUM_CONFIGURABLE_REGIONS ] = +{ + // Base address Length Parameters + { ucOneKByte, 1024, portMPU_REGION_READ_WRITE }, + { 0, 0, 0 }, + { 0, 0, 0 } +}; + +void vATask( void *pvParameters ) +{ + // This task was created such that it has access to certain regions of + // memory as defined by the MPU configuration. At some point it is + // desired that these MPU regions are replaced with that defined in the + // xAltRegions const struct above. Use a call to vTaskAllocateMPURegions() + // for this purpose. NULL is used as the task handle to indicate that this + // function should modify the MPU regions of the calling task. + vTaskAllocateMPURegions( NULL, xAltRegions ); + + // Now the task can continue its function, but from this point on can only + // access its stack and the ucOneKByte array (unless any other statically + // defined or shared regions have been declared elsewhere). +} + </pre> + * \defgroup xTaskCreateRestricted xTaskCreateRestricted + * \ingroup Tasks + */ +void vTaskAllocateMPURegions( xTaskHandle xTask, const xMemoryRegion * const pxRegions ) PRIVILEGED_FUNCTION; + +/** + * task. h + * <pre>void vTaskDelete( xTaskHandle pxTask );</pre> + * + * INCLUDE_vTaskDelete must be defined as 1 for this function to be available. + * See the configuration section for more information. + * + * Remove a task from the RTOS real time kernels management. The task being + * deleted will be removed from all ready, blocked, suspended and event lists. + * + * NOTE: The idle task is responsible for freeing the kernel allocated + * memory from tasks that have been deleted. It is therefore important that + * the idle task is not starved of microcontroller processing time if your + * application makes any calls to vTaskDelete (). Memory allocated by the + * task code is not automatically freed, and should be freed before the task + * is deleted. + * + * See the demo application file death.c for sample code that utilises + * vTaskDelete (). + * + * @param pxTask The handle of the task to be deleted. Passing NULL will + * cause the calling task to be deleted. + * + * Example usage: + <pre> + void vOtherFunction( void ) + { + xTaskHandle xHandle; + + // Create the task, storing the handle. + xTaskCreate( vTaskCode, "NAME", STACK_SIZE, NULL, tskIDLE_PRIORITY, &xHandle ); + + // Use the handle to delete the task. + vTaskDelete( xHandle ); + } + </pre> + * \defgroup vTaskDelete vTaskDelete + * \ingroup Tasks + */ +void vTaskDelete( xTaskHandle pxTaskToDelete ) PRIVILEGED_FUNCTION; + +/*----------------------------------------------------------- + * TASK CONTROL API + *----------------------------------------------------------*/ + +/** + * task. h + * <pre>void vTaskDelay( portTickType xTicksToDelay );</pre> + * + * Delay a task for a given number of ticks. The actual time that the + * task remains blocked depends on the tick rate. The constant + * portTICK_RATE_MS can be used to calculate real time from the tick + * rate - with the resolution of one tick period. + * + * INCLUDE_vTaskDelay must be defined as 1 for this function to be available. + * See the configuration section for more information. + * + * + * vTaskDelay() specifies a time at which the task wishes to unblock relative to + * the time at which vTaskDelay() is called. For example, specifying a block + * period of 100 ticks will cause the task to unblock 100 ticks after + * vTaskDelay() is called. vTaskDelay() does not therefore provide a good method + * of controlling the frequency of a cyclical task as the path taken through the + * code, as well as other task and interrupt activity, will effect the frequency + * at which vTaskDelay() gets called and therefore the time at which the task + * next executes. See vTaskDelayUntil() for an alternative API function designed + * to facilitate fixed frequency execution. It does this by specifying an + * absolute time (rather than a relative time) at which the calling task should + * unblock. + * + * @param xTicksToDelay The amount of time, in tick periods, that + * the calling task should block. + * + * Example usage: + + void vTaskFunction( void * pvParameters ) + { + void vTaskFunction( void * pvParameters ) + { + // Block for 500ms. + const portTickType xDelay = 500 / portTICK_RATE_MS; + + for( ;; ) + { + // Simply toggle the LED every 500ms, blocking between each toggle. + vToggleLED(); + vTaskDelay( xDelay ); + } + } + + * \defgroup vTaskDelay vTaskDelay + * \ingroup TaskCtrl + */ +void vTaskDelay( portTickType xTicksToDelay ) PRIVILEGED_FUNCTION; + +/** + * task. h + * <pre>void vTaskDelayUntil( portTickType *pxPreviousWakeTime, portTickType xTimeIncrement );</pre> + * + * INCLUDE_vTaskDelayUntil must be defined as 1 for this function to be available. + * See the configuration section for more information. + * + * Delay a task until a specified time. This function can be used by cyclical + * tasks to ensure a constant execution frequency. + * + * This function differs from vTaskDelay () in one important aspect: vTaskDelay () will + * cause a task to block for the specified number of ticks from the time vTaskDelay () is + * called. It is therefore difficult to use vTaskDelay () by itself to generate a fixed + * execution frequency as the time between a task starting to execute and that task + * calling vTaskDelay () may not be fixed [the task may take a different path though the + * code between calls, or may get interrupted or preempted a different number of times + * each time it executes]. + * + * Whereas vTaskDelay () specifies a wake time relative to the time at which the function + * is called, vTaskDelayUntil () specifies the absolute (exact) time at which it wishes to + * unblock. + * + * The constant portTICK_RATE_MS can be used to calculate real time from the tick + * rate - with the resolution of one tick period. + * + * @param pxPreviousWakeTime Pointer to a variable that holds the time at which the + * task was last unblocked. The variable must be initialised with the current time + * prior to its first use (see the example below). Following this the variable is + * automatically updated within vTaskDelayUntil (). + * + * @param xTimeIncrement The cycle time period. The task will be unblocked at + * time *pxPreviousWakeTime + xTimeIncrement. Calling vTaskDelayUntil with the + * same xTimeIncrement parameter value will cause the task to execute with + * a fixed interface period. + * + * Example usage: + <pre> + // Perform an action every 10 ticks. + void vTaskFunction( void * pvParameters ) + { + portTickType xLastWakeTime; + const portTickType xFrequency = 10; + + // Initialise the xLastWakeTime variable with the current time. + xLastWakeTime = xTaskGetTickCount (); + for( ;; ) + { + // Wait for the next cycle. + vTaskDelayUntil( &xLastWakeTime, xFrequency ); + + // Perform action here. + } + } + </pre> + * \defgroup vTaskDelayUntil vTaskDelayUntil + * \ingroup TaskCtrl + */ +void vTaskDelayUntil( portTickType * const pxPreviousWakeTime, portTickType xTimeIncrement ) PRIVILEGED_FUNCTION; + +/** + * task. h + * <pre>unsigned portBASE_TYPE uxTaskPriorityGet( xTaskHandle pxTask );</pre> + * + * INCLUDE_xTaskPriorityGet must be defined as 1 for this function to be available. + * See the configuration section for more information. + * + * Obtain the priority of any task. + * + * @param pxTask Handle of the task to be queried. Passing a NULL + * handle results in the priority of the calling task being returned. + * + * @return The priority of pxTask. + * + * Example usage: + <pre> + void vAFunction( void ) + { + xTaskHandle xHandle; + + // Create a task, storing the handle. + xTaskCreate( vTaskCode, "NAME", STACK_SIZE, NULL, tskIDLE_PRIORITY, &xHandle ); + + // ... + + // Use the handle to obtain the priority of the created task. + // It was created with tskIDLE_PRIORITY, but may have changed + // it itself. + if( uxTaskPriorityGet( xHandle ) != tskIDLE_PRIORITY ) + { + // The task has changed it's priority. + } + + // ... + + // Is our priority higher than the created task? + if( uxTaskPriorityGet( xHandle ) < uxTaskPriorityGet( NULL ) ) + { + // Our priority (obtained using NULL handle) is higher. + } + } + </pre> + * \defgroup uxTaskPriorityGet uxTaskPriorityGet + * \ingroup TaskCtrl + */ +unsigned portBASE_TYPE uxTaskPriorityGet( xTaskHandle pxTask ) PRIVILEGED_FUNCTION; + +/** + * task. h + * <pre>void vTaskPrioritySet( xTaskHandle pxTask, unsigned portBASE_TYPE uxNewPriority );</pre> + * + * INCLUDE_vTaskPrioritySet must be defined as 1 for this function to be available. + * See the configuration section for more information. + * + * Set the priority of any task. + * + * A context switch will occur before the function returns if the priority + * being set is higher than the currently executing task. + * + * @param pxTask Handle to the task for which the priority is being set. + * Passing a NULL handle results in the priority of the calling task being set. + * + * @param uxNewPriority The priority to which the task will be set. + * + * Example usage: + <pre> + void vAFunction( void ) + { + xTaskHandle xHandle; + + // Create a task, storing the handle. + xTaskCreate( vTaskCode, "NAME", STACK_SIZE, NULL, tskIDLE_PRIORITY, &xHandle ); + + // ... + + // Use the handle to raise the priority of the created task. + vTaskPrioritySet( xHandle, tskIDLE_PRIORITY + 1 ); + + // ... + + // Use a NULL handle to raise our priority to the same value. + vTaskPrioritySet( NULL, tskIDLE_PRIORITY + 1 ); + } + </pre> + * \defgroup vTaskPrioritySet vTaskPrioritySet + * \ingroup TaskCtrl + */ +void vTaskPrioritySet( xTaskHandle pxTask, unsigned portBASE_TYPE uxNewPriority ) PRIVILEGED_FUNCTION; + +/** + * task. h + * <pre>void vTaskSuspend( xTaskHandle pxTaskToSuspend );</pre> + * + * INCLUDE_vTaskSuspend must be defined as 1 for this function to be available. + * See the configuration section for more information. + * + * Suspend any task. When suspended a task will never get any microcontroller + * processing time, no matter what its priority. + * + * Calls to vTaskSuspend are not accumulative - + * i.e. calling vTaskSuspend () twice on the same task still only requires one + * call to vTaskResume () to ready the suspended task. + * + * @param pxTaskToSuspend Handle to the task being suspended. Passing a NULL + * handle will cause the calling task to be suspended. + * + * Example usage: + <pre> + void vAFunction( void ) + { + xTaskHandle xHandle; + + // Create a task, storing the handle. + xTaskCreate( vTaskCode, "NAME", STACK_SIZE, NULL, tskIDLE_PRIORITY, &xHandle ); + + // ... + + // Use the handle to suspend the created task. + vTaskSuspend( xHandle ); + + // ... + + // The created task will not run during this period, unless + // another task calls vTaskResume( xHandle ). + + //... + + + // Suspend ourselves. + vTaskSuspend( NULL ); + + // We cannot get here unless another task calls vTaskResume + // with our handle as the parameter. + } + </pre> + * \defgroup vTaskSuspend vTaskSuspend + * \ingroup TaskCtrl + */ +void vTaskSuspend( xTaskHandle pxTaskToSuspend ) PRIVILEGED_FUNCTION; + +/** + * task. h + * <pre>void vTaskResume( xTaskHandle pxTaskToResume );</pre> + * + * INCLUDE_vTaskSuspend must be defined as 1 for this function to be available. + * See the configuration section for more information. + * + * Resumes a suspended task. + * + * A task that has been suspended by one of more calls to vTaskSuspend () + * will be made available for running again by a single call to + * vTaskResume (). + * + * @param pxTaskToResume Handle to the task being readied. + * + * Example usage: + <pre> + void vAFunction( void ) + { + xTaskHandle xHandle; + + // Create a task, storing the handle. + xTaskCreate( vTaskCode, "NAME", STACK_SIZE, NULL, tskIDLE_PRIORITY, &xHandle ); + + // ... + + // Use the handle to suspend the created task. + vTaskSuspend( xHandle ); + + // ... + + // The created task will not run during this period, unless + // another task calls vTaskResume( xHandle ). + + //... + + + // Resume the suspended task ourselves. + vTaskResume( xHandle ); + + // The created task will once again get microcontroller processing + // time in accordance with it priority within the system. + } + </pre> + * \defgroup vTaskResume vTaskResume + * \ingroup TaskCtrl + */ +void vTaskResume( xTaskHandle pxTaskToResume ) PRIVILEGED_FUNCTION; + +/** + * task. h + * <pre>void xTaskResumeFromISR( xTaskHandle pxTaskToResume );</pre> + * + * INCLUDE_xTaskResumeFromISR must be defined as 1 for this function to be + * available. See the configuration section for more information. + * + * An implementation of vTaskResume() that can be called from within an ISR. + * + * A task that has been suspended by one of more calls to vTaskSuspend () + * will be made available for running again by a single call to + * xTaskResumeFromISR (). + * + * @param pxTaskToResume Handle to the task being readied. + * + * \defgroup vTaskResumeFromISR vTaskResumeFromISR + * \ingroup TaskCtrl + */ +portBASE_TYPE xTaskResumeFromISR( xTaskHandle pxTaskToResume ) PRIVILEGED_FUNCTION; + +/*----------------------------------------------------------- + * SCHEDULER CONTROL + *----------------------------------------------------------*/ + +/** + * task. h + * <pre>void vTaskStartScheduler( void );</pre> + * + * Starts the real time kernel tick processing. After calling the kernel + * has control over which tasks are executed and when. This function + * does not return until an executing task calls vTaskEndScheduler (). + * + * At least one task should be created via a call to xTaskCreate () + * before calling vTaskStartScheduler (). The idle task is created + * automatically when the first application task is created. + * + * See the demo application file main.c for an example of creating + * tasks and starting the kernel. + * + * Example usage: + <pre> + void vAFunction( void ) + { + // Create at least one task before starting the kernel. + xTaskCreate( vTaskCode, "NAME", STACK_SIZE, NULL, tskIDLE_PRIORITY, NULL ); + + // Start the real time kernel with preemption. + vTaskStartScheduler (); + + // Will not get here unless a task calls vTaskEndScheduler () + } + </pre> + * + * \defgroup vTaskStartScheduler vTaskStartScheduler + * \ingroup SchedulerControl + */ +void vTaskStartScheduler( void ) PRIVILEGED_FUNCTION; + +/** + * task. h + * <pre>void vTaskEndScheduler( void );</pre> + * + * Stops the real time kernel tick. All created tasks will be automatically + * deleted and multitasking (either preemptive or cooperative) will + * stop. Execution then resumes from the point where vTaskStartScheduler () + * was called, as if vTaskStartScheduler () had just returned. + * + * See the demo application file main. c in the demo/PC directory for an + * example that uses vTaskEndScheduler (). + * + * vTaskEndScheduler () requires an exit function to be defined within the + * portable layer (see vPortEndScheduler () in port. c for the PC port). This + * performs hardware specific operations such as stopping the kernel tick. + * + * vTaskEndScheduler () will cause all of the resources allocated by the + * kernel to be freed - but will not free resources allocated by application + * tasks. + * + * Example usage: + <pre> + void vTaskCode( void * pvParameters ) + { + for( ;; ) + { + // Task code goes here. + + // At some point we want to end the real time kernel processing + // so call ... + vTaskEndScheduler (); + } + } + + void vAFunction( void ) + { + // Create at least one task before starting the kernel. + xTaskCreate( vTaskCode, "NAME", STACK_SIZE, NULL, tskIDLE_PRIORITY, NULL ); + + // Start the real time kernel with preemption. + vTaskStartScheduler (); + + // Will only get here when the vTaskCode () task has called + // vTaskEndScheduler (). When we get here we are back to single task + // execution. + } + </pre> + * + * \defgroup vTaskEndScheduler vTaskEndScheduler + * \ingroup SchedulerControl + */ +void vTaskEndScheduler( void ) PRIVILEGED_FUNCTION; + +/** + * task. h + * <pre>void vTaskSuspendAll( void );</pre> + * + * Suspends all real time kernel activity while keeping interrupts (including the + * kernel tick) enabled. + * + * After calling vTaskSuspendAll () the calling task will continue to execute + * without risk of being swapped out until a call to xTaskResumeAll () has been + * made. + * + * API functions that have the potential to cause a context switch (for example, + * vTaskDelayUntil(), xQueueSend(), etc.) must not be called while the scheduler + * is suspended. + * + * Example usage: + <pre> + void vTask1( void * pvParameters ) + { + for( ;; ) + { + // Task code goes here. + + // ... + + // At some point the task wants to perform a long operation during + // which it does not want to get swapped out. It cannot use + // taskENTER_CRITICAL ()/taskEXIT_CRITICAL () as the length of the + // operation may cause interrupts to be missed - including the + // ticks. + + // Prevent the real time kernel swapping out the task. + vTaskSuspendAll (); + + // Perform the operation here. There is no need to use critical + // sections as we have all the microcontroller processing time. + // During this time interrupts will still operate and the kernel + // tick count will be maintained. + + // ... + + // The operation is complete. Restart the kernel. + xTaskResumeAll (); + } + } + </pre> + * \defgroup vTaskSuspendAll vTaskSuspendAll + * \ingroup SchedulerControl + */ +void vTaskSuspendAll( void ) PRIVILEGED_FUNCTION; + +/** + * task. h + * <pre>char xTaskResumeAll( void );</pre> + * + * Resumes real time kernel activity following a call to vTaskSuspendAll (). + * After a call to vTaskSuspendAll () the kernel will take control of which + * task is executing at any time. + * + * @return If resuming the scheduler caused a context switch then pdTRUE is + * returned, otherwise pdFALSE is returned. + * + * Example usage: + <pre> + void vTask1( void * pvParameters ) + { + for( ;; ) + { + // Task code goes here. + + // ... + + // At some point the task wants to perform a long operation during + // which it does not want to get swapped out. It cannot use + // taskENTER_CRITICAL ()/taskEXIT_CRITICAL () as the length of the + // operation may cause interrupts to be missed - including the + // ticks. + + // Prevent the real time kernel swapping out the task. + vTaskSuspendAll (); + + // Perform the operation here. There is no need to use critical + // sections as we have all the microcontroller processing time. + // During this time interrupts will still operate and the real + // time kernel tick count will be maintained. + + // ... + + // The operation is complete. Restart the kernel. We want to force + // a context switch - but there is no point if resuming the scheduler + // caused a context switch already. + if( !xTaskResumeAll () ) + { + taskYIELD (); + } + } + } + </pre> + * \defgroup xTaskResumeAll xTaskResumeAll + * \ingroup SchedulerControl + */ +signed portBASE_TYPE xTaskResumeAll( void ) PRIVILEGED_FUNCTION; + +/** + * task. h + * <pre>signed portBASE_TYPE xTaskIsTaskSuspended( xTaskHandle xTask );</pre> + * + * Utility task that simply returns pdTRUE if the task referenced by xTask is + * currently in the Suspended state, or pdFALSE if the task referenced by xTask + * is in any other state. + * + */ +signed portBASE_TYPE xTaskIsTaskSuspended( xTaskHandle xTask ) PRIVILEGED_FUNCTION; + +/*----------------------------------------------------------- + * TASK UTILITIES + *----------------------------------------------------------*/ + +/** + * task. h + * <PRE>portTickType xTaskGetTickCount( void );</PRE> + * + * @return The count of ticks since vTaskStartScheduler was called. + * + * \page xTaskGetTickCount xTaskGetTickCount + * \ingroup TaskUtils + */ +portTickType xTaskGetTickCount( void ) PRIVILEGED_FUNCTION; + +/** + * task. h + * <PRE>portTickType xTaskGetTickCountFromISR( void );</PRE> + * + * @return The count of ticks since vTaskStartScheduler was called. + * + * This is a version of xTaskGetTickCount() that is safe to be called from an + * ISR - provided that portTickType is the natural word size of the + * microcontroller being used or interrupt nesting is either not supported or + * not being used. + * + * \page xTaskGetTickCount xTaskGetTickCount + * \ingroup TaskUtils + */ +portTickType xTaskGetTickCountFromISR( void ) PRIVILEGED_FUNCTION; + +/** + * task. h + * <PRE>unsigned short uxTaskGetNumberOfTasks( void );</PRE> + * + * @return The number of tasks that the real time kernel is currently managing. + * This includes all ready, blocked and suspended tasks. A task that + * has been deleted but not yet freed by the idle task will also be + * included in the count. + * + * \page uxTaskGetNumberOfTasks uxTaskGetNumberOfTasks + * \ingroup TaskUtils + */ +unsigned portBASE_TYPE uxTaskGetNumberOfTasks( void ) PRIVILEGED_FUNCTION; + +/** + * task. h + * <PRE>void vTaskList( char *pcWriteBuffer );</PRE> + * + * configUSE_TRACE_FACILITY must be defined as 1 for this function to be + * available. See the configuration section for more information. + * + * NOTE: This function will disable interrupts for its duration. It is + * not intended for normal application runtime use but as a debug aid. + * + * Lists all the current tasks, along with their current state and stack + * usage high water mark. + * + * Tasks are reported as blocked ('B'), ready ('R'), deleted ('D') or + * suspended ('S'). + * + * @param pcWriteBuffer A buffer into which the above mentioned details + * will be written, in ascii form. This buffer is assumed to be large + * enough to contain the generated report. Approximately 40 bytes per + * task should be sufficient. + * + * \page vTaskList vTaskList + * \ingroup TaskUtils + */ +void vTaskList( signed char *pcWriteBuffer ) PRIVILEGED_FUNCTION; + +/** + * task. h + * <PRE>void vTaskGetRunTimeStats( char *pcWriteBuffer );</PRE> + * + * configGENERATE_RUN_TIME_STATS must be defined as 1 for this function + * to be available. The application must also then provide definitions + * for portCONFIGURE_TIMER_FOR_RUN_TIME_STATS() and + * portGET_RUN_TIME_COUNTER_VALUE to configure a peripheral timer/counter + * and return the timers current count value respectively. The counter + * should be at least 10 times the frequency of the tick count. + * + * NOTE: This function will disable interrupts for its duration. It is + * not intended for normal application runtime use but as a debug aid. + * + * Setting configGENERATE_RUN_TIME_STATS to 1 will result in a total + * accumulated execution time being stored for each task. The resolution + * of the accumulated time value depends on the frequency of the timer + * configured by the portCONFIGURE_TIMER_FOR_RUN_TIME_STATS() macro. + * Calling vTaskGetRunTimeStats() writes the total execution time of each + * task into a buffer, both as an absolute count value and as a percentage + * of the total system execution time. + * + * @param pcWriteBuffer A buffer into which the execution times will be + * written, in ascii form. This buffer is assumed to be large enough to + * contain the generated report. Approximately 40 bytes per task should + * be sufficient. + * + * \page vTaskGetRunTimeStats vTaskGetRunTimeStats + * \ingroup TaskUtils + */ +void vTaskGetRunTimeStats( signed char *pcWriteBuffer ) PRIVILEGED_FUNCTION; + +/** + * task. h + * <PRE>void vTaskStartTrace( char * pcBuffer, unsigned portBASE_TYPE uxBufferSize );</PRE> + * + * Starts a real time kernel activity trace. The trace logs the identity of + * which task is running when. + * + * The trace file is stored in binary format. A separate DOS utility called + * convtrce.exe is used to convert this into a tab delimited text file which + * can be viewed and plotted in a spread sheet. + * + * @param pcBuffer The buffer into which the trace will be written. + * + * @param ulBufferSize The size of pcBuffer in bytes. The trace will continue + * until either the buffer in full, or ulTaskEndTrace () is called. + * + * \page vTaskStartTrace vTaskStartTrace + * \ingroup TaskUtils + */ +void vTaskStartTrace( signed char * pcBuffer, unsigned long ulBufferSize ) PRIVILEGED_FUNCTION; + +/** + * task. h + * <PRE>unsigned long ulTaskEndTrace( void );</PRE> + * + * Stops a kernel activity trace. See vTaskStartTrace (). + * + * @return The number of bytes that have been written into the trace buffer. + * + * \page usTaskEndTrace usTaskEndTrace + * \ingroup TaskUtils + */ +unsigned long ulTaskEndTrace( void ) PRIVILEGED_FUNCTION; + +/** + * task.h + * <PRE>unsigned portBASE_TYPE uxTaskGetStackHighWaterMark( xTaskHandle xTask );</PRE> + * + * INCLUDE_uxTaskGetStackHighWaterMark must be set to 1 in FreeRTOSConfig.h for + * this function to be available. + * + * Returns the high water mark of the stack associated with xTask. That is, + * the minimum free stack space there has been (in words, so on a 32 bit machine + * a value of 1 means 4 bytes) since the task started. The smaller the returned + * number the closer the task has come to overflowing its stack. + * + * @param xTask Handle of the task associated with the stack to be checked. + * Set xTask to NULL to check the stack of the calling task. + * + * @return The smallest amount of free stack space there has been (in bytes) + * since the task referenced by xTask was created. + */ +unsigned portBASE_TYPE uxTaskGetStackHighWaterMark( xTaskHandle xTask ) PRIVILEGED_FUNCTION; + +/* When using trace macros it is sometimes necessary to include tasks.h before +FreeRTOS.h. When this is done pdTASK_HOOK_CODE will not yet have been defined, +so the following two prototypes will cause a compilation error. This can be +fixed by simply guarding against the inclusion of these two prototypes unless +they are explicitly required by the configUSE_APPLICATION_TASK_TAG configuration +constant. */ +#ifdef configUSE_APPLICATION_TASK_TAG + #if configUSE_APPLICATION_TASK_TAG == 1 + /** + * task.h + * <pre>void vTaskSetApplicationTaskTag( xTaskHandle xTask, pdTASK_HOOK_CODE pxHookFunction );</pre> + * + * Sets pxHookFunction to be the task hook function used by the task xTask. + * Passing xTask as NULL has the effect of setting the calling tasks hook + * function. + */ + void vTaskSetApplicationTaskTag( xTaskHandle xTask, pdTASK_HOOK_CODE pxHookFunction ) PRIVILEGED_FUNCTION; + + /** + * task.h + * <pre>void xTaskGetApplicationTaskTag( xTaskHandle xTask );</pre> + * + * Returns the pxHookFunction value assigned to the task xTask. + */ + pdTASK_HOOK_CODE xTaskGetApplicationTaskTag( xTaskHandle xTask ) PRIVILEGED_FUNCTION; + #endif /* configUSE_APPLICATION_TASK_TAG ==1 */ +#endif /* ifdef configUSE_APPLICATION_TASK_TAG */ + +/** + * task.h + * <pre>portBASE_TYPE xTaskCallApplicationTaskHook( xTaskHandle xTask, pdTASK_HOOK_CODE pxHookFunction );</pre> + * + * Calls the hook function associated with xTask. Passing xTask as NULL has + * the effect of calling the Running tasks (the calling task) hook function. + * + * pvParameter is passed to the hook function for the task to interpret as it + * wants. + */ +portBASE_TYPE xTaskCallApplicationTaskHook( xTaskHandle xTask, void *pvParameter ) PRIVILEGED_FUNCTION; + + +/*----------------------------------------------------------- + * SCHEDULER INTERNALS AVAILABLE FOR PORTING PURPOSES + *----------------------------------------------------------*/ + +/* + * THIS FUNCTION MUST NOT BE USED FROM APPLICATION CODE. IT IS ONLY + * INTENDED FOR USE WHEN IMPLEMENTING A PORT OF THE SCHEDULER AND IS + * AN INTERFACE WHICH IS FOR THE EXCLUSIVE USE OF THE SCHEDULER. + * + * Called from the real time kernel tick (either preemptive or cooperative), + * this increments the tick count and checks if any tasks that are blocked + * for a finite period required removing from a blocked list and placing on + * a ready list. + */ +void vTaskIncrementTick( void ) PRIVILEGED_FUNCTION; + +/* + * THIS FUNCTION MUST NOT BE USED FROM APPLICATION CODE. IT IS AN + * INTERFACE WHICH IS FOR THE EXCLUSIVE USE OF THE SCHEDULER. + * + * THIS FUNCTION MUST BE CALLED WITH INTERRUPTS DISABLED. + * + * Removes the calling task from the ready list and places it both + * on the list of tasks waiting for a particular event, and the + * list of delayed tasks. The task will be removed from both lists + * and replaced on the ready list should either the event occur (and + * there be no higher priority tasks waiting on the same event) or + * the delay period expires. + * + * @param pxEventList The list containing tasks that are blocked waiting + * for the event to occur. + * + * @param xTicksToWait The maximum amount of time that the task should wait + * for the event to occur. This is specified in kernel ticks,the constant + * portTICK_RATE_MS can be used to convert kernel ticks into a real time + * period. + */ +void vTaskPlaceOnEventList( const xList * const pxEventList, portTickType xTicksToWait ) PRIVILEGED_FUNCTION; + +/* + * THIS FUNCTION MUST NOT BE USED FROM APPLICATION CODE. IT IS AN + * INTERFACE WHICH IS FOR THE EXCLUSIVE USE OF THE SCHEDULER. + * + * THIS FUNCTION MUST BE CALLED WITH INTERRUPTS DISABLED. + * + * This function performs nearly the same function as vTaskPlaceOnEventList(). + * The difference being that this function does not permit tasks to block + * indefinitely, whereas vTaskPlaceOnEventList() does. + * + * @return pdTRUE if the task being removed has a higher priority than the task + * making the call, otherwise pdFALSE. + */ +void vTaskPlaceOnEventListRestricted( const xList * const pxEventList, portTickType xTicksToWait ) PRIVILEGED_FUNCTION; + +/* + * THIS FUNCTION MUST NOT BE USED FROM APPLICATION CODE. IT IS AN + * INTERFACE WHICH IS FOR THE EXCLUSIVE USE OF THE SCHEDULER. + * + * THIS FUNCTION MUST BE CALLED WITH INTERRUPTS DISABLED. + * + * Removes a task from both the specified event list and the list of blocked + * tasks, and places it on a ready queue. + * + * xTaskRemoveFromEventList () will be called if either an event occurs to + * unblock a task, or the block timeout period expires. + * + * @return pdTRUE if the task being removed has a higher priority than the task + * making the call, otherwise pdFALSE. + */ +signed portBASE_TYPE xTaskRemoveFromEventList( const xList * const pxEventList ) PRIVILEGED_FUNCTION; + +/* + * THIS FUNCTION MUST NOT BE USED FROM APPLICATION CODE. IT IS AN + * INTERFACE WHICH IS FOR THE EXCLUSIVE USE OF THE SCHEDULER. + * + * INCLUDE_vTaskCleanUpResources and INCLUDE_vTaskSuspend must be defined as 1 + * for this function to be available. + * See the configuration section for more information. + * + * Empties the ready and delayed queues of task control blocks, freeing the + * memory allocated for the task control block and task stacks as it goes. + */ +void vTaskCleanUpResources( void ) PRIVILEGED_FUNCTION; + +/* + * THIS FUNCTION MUST NOT BE USED FROM APPLICATION CODE. IT IS ONLY + * INTENDED FOR USE WHEN IMPLEMENTING A PORT OF THE SCHEDULER AND IS + * AN INTERFACE WHICH IS FOR THE EXCLUSIVE USE OF THE SCHEDULER. + * + * Sets the pointer to the current TCB to the TCB of the highest priority task + * that is ready to run. + */ +void vTaskSwitchContext( void ) PRIVILEGED_FUNCTION; + +/* + * Return the handle of the calling task. + */ +xTaskHandle xTaskGetCurrentTaskHandle( void ) PRIVILEGED_FUNCTION; + +/* + * Capture the current time status for future reference. + */ +void vTaskSetTimeOutState( xTimeOutType * const pxTimeOut ) PRIVILEGED_FUNCTION; + +/* + * Compare the time status now with that previously captured to see if the + * timeout has expired. + */ +portBASE_TYPE xTaskCheckForTimeOut( xTimeOutType * const pxTimeOut, portTickType * const pxTicksToWait ) PRIVILEGED_FUNCTION; + +/* + * Shortcut used by the queue implementation to prevent unnecessary call to + * taskYIELD(); + */ +void vTaskMissedYield( void ) PRIVILEGED_FUNCTION; + +/* + * Returns the scheduler state as taskSCHEDULER_RUNNING, + * taskSCHEDULER_NOT_STARTED or taskSCHEDULER_SUSPENDED. + */ +portBASE_TYPE xTaskGetSchedulerState( void ) PRIVILEGED_FUNCTION; + +/* + * Raises the priority of the mutex holder to that of the calling task should + * the mutex holder have a priority less than the calling task. + */ +void vTaskPriorityInherit( xTaskHandle * const pxMutexHolder ) PRIVILEGED_FUNCTION; + +/* + * Set the priority of a task back to its proper priority in the case that it + * inherited a higher priority while it was holding a semaphore. + */ +void vTaskPriorityDisinherit( xTaskHandle * const pxMutexHolder ) PRIVILEGED_FUNCTION; + +/* + * Generic version of the task creation function which is in turn called by the + * xTaskCreate() and xTaskCreateRestricted() macros. + */ +signed portBASE_TYPE xTaskGenericCreate( pdTASK_CODE pxTaskCode, const signed char * const pcName, unsigned short usStackDepth, void *pvParameters, unsigned portBASE_TYPE uxPriority, xTaskHandle *pxCreatedTask, portSTACK_TYPE *puxStackBuffer, const xMemoryRegion * const xRegions ) PRIVILEGED_FUNCTION; + +#ifdef __cplusplus +} +#endif +#endif /* TASK_H */ + + + diff --git a/TP1_labyrinth_etu/FreeRTOS_include/timers.h b/TP1_labyrinth_etu/FreeRTOS_include/timers.h new file mode 100644 index 0000000000000000000000000000000000000000..3d78c0ae035a58d9677d80a5432212ca81d9ec21 --- /dev/null +++ b/TP1_labyrinth_etu/FreeRTOS_include/timers.h @@ -0,0 +1,936 @@ +/* + FreeRTOS V7.0.1 - Copyright (C) 2011 Real Time Engineers Ltd. + + + FreeRTOS supports many tools and architectures. V7.0.0 is sponsored by: + Atollic AB - Atollic provides professional embedded systems development + tools for C/C++ development, code analysis and test automation. + See http://www.atollic.com + + + *************************************************************************** + * * + * FreeRTOS tutorial books are available in pdf and paperback. * + * Complete, revised, and edited pdf reference manuals are also * + * available. * + * * + * Purchasing FreeRTOS documentation will not only help you, by * + * ensuring you get running as quickly as possible and with an * + * in-depth knowledge of how to use FreeRTOS, it will also help * + * the FreeRTOS project to continue with its mission of providing * + * professional grade, cross platform, de facto standard solutions * + * for microcontrollers - completely free of charge! * + * * + * >>> See http://www.FreeRTOS.org/Documentation for details. <<< * + * * + * Thank you for using FreeRTOS, and thank you for your support! * + * * + *************************************************************************** + + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation AND MODIFIED BY the FreeRTOS exception. + >>>NOTE<<< The modification to the GPL is included to allow you to + distribute a combined work that includes FreeRTOS without being obliged to + provide the source code for proprietary components outside of the FreeRTOS + kernel. FreeRTOS is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + more details. You should have received a copy of the GNU General Public + License and the FreeRTOS license exception along with FreeRTOS; if not it + can be viewed here: http://www.freertos.org/a00114.html and also obtained + by writing to Richard Barry, contact details for whom are available on the + FreeRTOS WEB site. + + 1 tab == 4 spaces! + + http://www.FreeRTOS.org - Documentation, latest information, license and + contact details. + + http://www.SafeRTOS.com - A version that is certified for use in safety + critical systems. + + http://www.OpenRTOS.com - Commercial support, development, porting, + licensing and training services. +*/ + + +#ifndef TIMERS_H +#define TIMERS_H + +#ifndef INC_FREERTOS_H + #error "include FreeRTOS.h must appear in source files before include timers.h" +#endif + +#include "portable.h" +#include "list.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* IDs for commands that can be sent/received on the timer queue. These are to +be used solely through the macros that make up the public software timer API, +as defined below. */ +#define tmrCOMMAND_START 0 +#define tmrCOMMAND_STOP 1 +#define tmrCOMMAND_CHANGE_PERIOD 2 +#define tmrCOMMAND_DELETE 3 + +/*----------------------------------------------------------- + * MACROS AND DEFINITIONS + *----------------------------------------------------------*/ + + /** + * Type by which software timers are referenced. For example, a call to + * xTimerCreate() returns an xTimerHandle variable that can then be used to + * reference the subject timer in calls to other software timer API functions + * (for example, xTimerStart(), xTimerReset(), etc.). + */ +typedef void * xTimerHandle; + +/* Define the prototype to which timer callback functions must conform. */ +typedef void (*tmrTIMER_CALLBACK)( xTimerHandle xTimer ); + +/** + * xTimerHandle xTimerCreate( const signed char *pcTimerName, + * portTickType xTimerPeriod, + * unsigned portBASE_TYPE uxAutoReload, + * void * pvTimerID, + * tmrTIMER_CALLBACK pxCallbackFunction ); + * + * Creates a new software timer instance. This allocates the storage required + * by the new timer, initialises the new timers internal state, and returns a + * handle by which the new timer can be referenced. + * + * Timers are created in the dormant state. The xTimerStart(), xTimerReset(), + * xTimerStartFromISR(), xTimerResetFromISR(), xTimerChangePeriod() and + * xTimerChangePeriodFromISR() API functions can all be used to transition a timer into the + * active state. + * + * @param pcTimerName A text name that is assigned to the timer. This is done + * purely to assist debugging. The kernel itself only ever references a timer by + * its handle, and never by its name. + * + * @param xTimerPeriod The timer period. The time is defined in tick periods so + * the constant portTICK_RATE_MS can be used to convert a time that has been + * specified in milliseconds. For example, if the timer must expire after 100 + * ticks, then xTimerPeriod should be set to 100. Alternatively, if the timer + * must expire after 500ms, then xPeriod can be set to ( 500 / portTICK_RATE_MS ) + * provided configTICK_RATE_HZ is less than or equal to 1000. + * + * @param uxAutoReload If uxAutoReload is set to pdTRUE then the timer will + * expire repeatedly with a frequency set by the xTimerPeriod parameter. If + * uxAutoReload is set to pdFALSE then the timer will be a one-shot timer and + * enter the dormant state after it expires. + * + * @param pvTimerID An identifier that is assigned to the timer being created. + * Typically this would be used in the timer callback function to identify which + * timer expired when the same callback function is assigned to more than one + * timer. + * + * @param pxCallbackFunction The function to call when the timer expires. + * Callback functions must have the prototype defined by tmrTIMER_CALLBACK, + * which is "void vCallbackFunction( xTIMER *xTimer );". + * + * @return If the timer is successfully create then a handle to the newly + * created timer is returned. If the timer cannot be created (because either + * there is insufficient FreeRTOS heap remaining to allocate the timer + * structures, or the timer period was set to 0) then 0 is returned. + * + * Example usage: + * + * + * #define NUM_TIMERS 5 + * + * // An array to hold handles to the created timers. + * xTimerHandle xTimers[ NUM_TIMERS ]; + * + * // An array to hold a count of the number of times each timer expires. + * long lExpireCounters[ NUM_TIMERS ] = { 0 }; + * + * // Define a callback function that will be used by multiple timer instances. + * // The callback function does nothing but count the number of times the + * // associated timer expires, and stop the timer once the timer has expired + * // 10 times. + * void vTimerCallback( xTIMER *pxTimer ) + * { + * long lArrayIndex; + * const long xMaxExpiryCountBeforeStopping = 10; + * + * // Optionally do something if the pxTimer parameter is NULL. + * configASSERT( pxTimer ); + * + * // Which timer expired? + * lArrayIndex = ( long ) pvTimerGetTimerID( pxTimer ); + * + * // Increment the number of times that pxTimer has expired. + * lExpireCounters[ lArrayIndex ] += 1; + * + * // If the timer has expired 10 times then stop it from running. + * if( lExpireCounters[ lArrayIndex ] == xMaxExpiryCountBeforeStopping ) + * { + * // Do not use a block time if calling a timer API function from a + * // timer callback function, as doing so could cause a deadlock! + * xTimerStop( pxTimer, 0 ); + * } + * } + * + * void main( void ) + * { + * long x; + * + * // Create then start some timers. Starting the timers before the scheduler + * // has been started means the timers will start running immediately that + * // the scheduler starts. + * for( x = 0; x < NUM_TIMERS; x++ ) + * { + * xTimers[ x ] = xTimerCreate( "Timer", // Just a text name, not used by the kernel. + * ( 100 * x ), // The timer period in ticks. + * pdTRUE, // The timers will auto-reload themselves when they expire. + * ( void * ) x, // Assign each timer a unique id equal to its array index. + * vTimerCallback // Each timer calls the same callback when it expires. + * ); + * + * if( xTimers[ x ] == NULL ) + * { + * // The timer was not created. + * } + * else + * { + * // Start the timer. No block time is specified, and even if one was + * // it would be ignored because the scheduler has not yet been + * // started. + * if( xTimerStart( xTimers[ x ], 0 ) != pdPASS ) + * { + * // The timer could not be set into the Active state. + * } + * } + * } + * + * // ... + * // Create tasks here. + * // ... + * + * // Starting the scheduler will start the timers running as they have already + * // been set into the active state. + * xTaskStartScheduler(); + * + * // Should not reach here. + * for( ;; ); + * } + */ +xTimerHandle xTimerCreate( const signed char *pcTimerName, portTickType xTimerPeriodInTicks, unsigned portBASE_TYPE uxAutoReload, void * pvTimerID, tmrTIMER_CALLBACK pxCallbackFunction ) PRIVILEGED_FUNCTION; + +/** + * void *pvTimerGetTimerID( xTimerHandle xTimer ); + * + * Returns the ID assigned to the timer. + * + * IDs are assigned to timers using the pvTimerID parameter of the call to + * xTimerCreated() that was used to create the timer. + * + * If the same callback function is assigned to multiple timers then the timer + * ID can be used within the callback function to identify which timer actually + * expired. + * + * @param xTimer The timer being queried. + * + * @return The ID assigned to the timer being queried. + * + * Example usage: + * + * See the xTimerCreate() API function example usage scenario. + */ +void *pvTimerGetTimerID( xTimerHandle xTimer ) PRIVILEGED_FUNCTION; + +/** + * portBASE_TYPE xTimerIsTimerActive( xTimerHandle xTimer ); + * + * Queries a timer to see if it is active or dormant. + * + * A timer will be dormant if: + * 1) It has been created but not started, or + * 2) It is an expired on-shot timer that has not been restarted. + * + * Timers are created in the dormant state. The xTimerStart(), xTimerReset(), + * xTimerStartFromISR(), xTimerResetFromISR(), xTimerChangePeriod() and + * xTimerChangePeriodFromISR() API functions can all be used to transition a timer into the + * active state. + * + * @param xTimer The timer being queried. + * + * @return pdFALSE will be returned if the timer is dormant. A value other than + * pdFALSE will be returned if the timer is active. + * + * Example usage: + * + * // This function assumes xTimer has already been created. + * void vAFunction( xTimerHandle xTimer ) + * { + * if( xTimerIsTimerActive( xTimer ) != pdFALSE ) // or more simply and equivalently "if( xTimerIsTimerActive( xTimer ) )" + * { + * // xTimer is active, do something. + * } + * else + * { + * // xTimer is not active, do something else. + * } + * } + */ +portBASE_TYPE xTimerIsTimerActive( xTimerHandle xTimer ) PRIVILEGED_FUNCTION; + +/** + * portBASE_TYPE xTimerStart( xTimerHandle xTimer, portTickType xBlockTime ); + * + * Timer functionality is provided by a timer service/daemon task. Many of the + * public FreeRTOS timer API functions send commands to the timer service task + * though a queue called the timer command queue. The timer command queue is + * private to the kernel itself and is not directly accessible to application + * code. The length of the timer command queue is set by the + * configTIMER_QUEUE_LENGTH configuration constant. + * + * xTimerStart() starts a timer that was previously created using the + * xTimerCreate() API function. If the timer had already been started and was + * already in the active state, then xTimerStart() has equivalent functionality + * to the xTimerReset() API function. + * + * Starting a timer ensures the timer is in the active state. If the timer + * is not stopped, deleted, or reset in the mean time, the callback function + * associated with the timer will get called 'n' ticks after xTimerStart() was + * called, where 'n' is the timers defined period. + * + * It is valid to call xTimerStart() before the scheduler has been started, but + * when this is done the timer will not actually start until the scheduler is + * started, and the timers expiry time will be relative to when the scheduler is + * started, not relative to when xTimerStart() was called. + * + * The configUSE_TIMERS configuration constant must be set to 1 for xTimerStart() + * to be available. + * + * @param xTimer The handle of the timer being started/restarted. + * + * @param xBlockTime Specifies the time, in ticks, that the calling task should + * be held in the Blocked state to wait for the start command to be successfully + * sent to the timer command queue, should the queue already be full when + * xTimerStart() was called. xBlockTime is ignored if xTimerStart() is called + * before the scheduler is started. + * + * @return pdFAIL will be returned if the start command could not be sent to + * the timer command queue even after xBlockTime ticks had passed. pdPASS will + * be returned if the command was successfully sent to the timer command queue. + * When the command is actually processed will depend on the priority of the + * timer service/daemon task relative to other tasks in the system, although the + * timers expiry time is relative to when xTimerStart() is actually called. The + * timer service/daemon task priority is set by the configTIMER_TASK_PRIORITY + * configuration constant. + * + * Example usage: + * + * See the xTimerCreate() API function example usage scenario. + * + */ +#define xTimerStart( xTimer, xBlockTime ) xTimerGenericCommand( ( xTimer ), tmrCOMMAND_START, ( xTaskGetTickCount() ), NULL, ( xBlockTime ) ) + +/** + * portBASE_TYPE xTimerStop( xTimerHandle xTimer, portTickType xBlockTime ); + * + * Timer functionality is provided by a timer service/daemon task. Many of the + * public FreeRTOS timer API functions send commands to the timer service task + * though a queue called the timer command queue. The timer command queue is + * private to the kernel itself and is not directly accessible to application + * code. The length of the timer command queue is set by the + * configTIMER_QUEUE_LENGTH configuration constant. + * + * xTimerStop() stops a timer that was previously started using either of the + * The xTimerStart(), xTimerReset(), xTimerStartFromISR(), xTimerResetFromISR(), + * xTimerChangePeriod() or xTimerChangePeriodFromISR() API functions. + * + * Stopping a timer ensures the timer is not in the active state. + * + * The configUSE_TIMERS configuration constant must be set to 1 for xTimerStop() + * to be available. + * + * @param xTimer The handle of the timer being stopped. + * + * @param xBlockTime Specifies the time, in ticks, that the calling task should + * be held in the Blocked state to wait for the stop command to be successfully + * sent to the timer command queue, should the queue already be full when + * xTimerStop() was called. xBlockTime is ignored if xTimerStop() is called + * before the scheduler is started. + * + * @return pdFAIL will be returned if the stop command could not be sent to + * the timer command queue even after xBlockTime ticks had passed. pdPASS will + * be returned if the command was successfully sent to the timer command queue. + * When the command is actually processed will depend on the priority of the + * timer service/daemon task relative to other tasks in the system. The timer + * service/daemon task priority is set by the configTIMER_TASK_PRIORITY + * configuration constant. + * + * Example usage: + * + * See the xTimerCreate() API function example usage scenario. + * + */ +#define xTimerStop( xTimer, xBlockTime ) xTimerGenericCommand( ( xTimer ), tmrCOMMAND_STOP, 0U, NULL, ( xBlockTime ) ) + +/** + * portBASE_TYPE xTimerChangePeriod( xTimerHandle xTimer, + * portTickType xNewPeriod, + * portTickType xBlockTime ); + * + * Timer functionality is provided by a timer service/daemon task. Many of the + * public FreeRTOS timer API functions send commands to the timer service task + * though a queue called the timer command queue. The timer command queue is + * private to the kernel itself and is not directly accessible to application + * code. The length of the timer command queue is set by the + * configTIMER_QUEUE_LENGTH configuration constant. + * + * xTimerChangePeriod() changes the period of a timer that was previously + * created using the xTimerCreate() API function. + * + * xTimerChangePeriod() can be called to change the period of an active or + * dormant state timer. + * + * The configUSE_TIMERS configuration constant must be set to 1 for + * xTimerChangePeriod() to be available. + * + * @param xTimer The handle of the timer that is having its period changed. + * + * @param xNewPeriod The new period for xTimer. Timer periods are specified in + * tick periods, so the constant portTICK_RATE_MS can be used to convert a time + * that has been specified in milliseconds. For example, if the timer must + * expire after 100 ticks, then xNewPeriod should be set to 100. Alternatively, + * if the timer must expire after 500ms, then xNewPeriod can be set to + * ( 500 / portTICK_RATE_MS ) provided configTICK_RATE_HZ is less than + * or equal to 1000. + * + * @param xBlockTime Specifies the time, in ticks, that the calling task should + * be held in the Blocked state to wait for the change period command to be + * successfully sent to the timer command queue, should the queue already be + * full when xTimerChangePeriod() was called. xBlockTime is ignored if + * xTimerChangePeriod() is called before the scheduler is started. + * + * @return pdFAIL will be returned if the change period command could not be + * sent to the timer command queue even after xBlockTime ticks had passed. + * pdPASS will be returned if the command was successfully sent to the timer + * command queue. When the command is actually processed will depend on the + * priority of the timer service/daemon task relative to other tasks in the + * system. The timer service/daemon task priority is set by the + * configTIMER_TASK_PRIORITY configuration constant. + * + * Example usage: + * + * // This function assumes xTimer has already been created. If the timer + * // referenced by xTimer is already active when it is called, then the timer + * // is deleted. If the timer referenced by xTimer is not active when it is + * // called, then the period of the timer is set to 500ms and the timer is + * // started. + * void vAFunction( xTimerHandle xTimer ) + * { + * if( xTimerIsTimerActive( xTimer ) != pdFALSE ) // or more simply and equivalently "if( xTimerIsTimerActive( xTimer ) )" + * { + * // xTimer is already active - delete it. + * xTimerDelete( xTimer ); + * } + * else + * { + * // xTimer is not active, change its period to 500ms. This will also + * // cause the timer to start. Block for a maximum of 100 ticks if the + * // change period command cannot immediately be sent to the timer + * // command queue. + * if( xTimerChangePeriod( xTimer, 500 / portTICK_RATE_MS, 100 ) == pdPASS ) + * { + * // The command was successfully sent. + * } + * else + * { + * // The command could not be sent, even after waiting for 100 ticks + * // to pass. Take appropriate action here. + * } + * } + * } + */ + #define xTimerChangePeriod( xTimer, xNewPeriod, xBlockTime ) xTimerGenericCommand( ( xTimer ), tmrCOMMAND_CHANGE_PERIOD, ( xNewPeriod ), NULL, ( xBlockTime ) ) + +/** + * portBASE_TYPE xTimerDelete( xTimerHandle xTimer, portTickType xBlockTime ); + * + * Timer functionality is provided by a timer service/daemon task. Many of the + * public FreeRTOS timer API functions send commands to the timer service task + * though a queue called the timer command queue. The timer command queue is + * private to the kernel itself and is not directly accessible to application + * code. The length of the timer command queue is set by the + * configTIMER_QUEUE_LENGTH configuration constant. + * + * xTimerDelete() deletes a timer that was previously created using the + * xTimerCreate() API function. + * + * The configUSE_TIMERS configuration constant must be set to 1 for + * xTimerDelete() to be available. + * + * @param xTimer The handle of the timer being deleted. + * + * @param xBlockTime Specifies the time, in ticks, that the calling task should + * be held in the Blocked state to wait for the delete command to be + * successfully sent to the timer command queue, should the queue already be + * full when xTimerDelete() was called. xBlockTime is ignored if xTimerDelete() + * is called before the scheduler is started. + * + * @return pdFAIL will be returned if the delete command could not be sent to + * the timer command queue even after xBlockTime ticks had passed. pdPASS will + * be returned if the command was successfully sent to the timer command queue. + * When the command is actually processed will depend on the priority of the + * timer service/daemon task relative to other tasks in the system. The timer + * service/daemon task priority is set by the configTIMER_TASK_PRIORITY + * configuration constant. + * + * Example usage: + * + * See the xTimerChangePeriod() API function example usage scenario. + */ +#define xTimerDelete( xTimer, xBlockTime ) xTimerGenericCommand( ( xTimer ), tmrCOMMAND_DELETE, 0U, NULL, ( xBlockTime ) ) + +/** + * portBASE_TYPE xTimerReset( xTimerHandle xTimer, portTickType xBlockTime ); + * + * Timer functionality is provided by a timer service/daemon task. Many of the + * public FreeRTOS timer API functions send commands to the timer service task + * though a queue called the timer command queue. The timer command queue is + * private to the kernel itself and is not directly accessible to application + * code. The length of the timer command queue is set by the + * configTIMER_QUEUE_LENGTH configuration constant. + * + * xTimerReset() re-starts a timer that was previously created using the + * xTimerCreate() API function. If the timer had already been started and was + * already in the active state, then xTimerReset() will cause the timer to + * re-evaluate its expiry time so that it is relative to when xTimerReset() was + * called. If the timer was in the dormant state then xTimerReset() has + * equivalent functionality to the xTimerStart() API function. + * + * Resetting a timer ensures the timer is in the active state. If the timer + * is not stopped, deleted, or reset in the mean time, the callback function + * associated with the timer will get called 'n' ticks after xTimerReset() was + * called, where 'n' is the timers defined period. + * + * It is valid to call xTimerReset() before the scheduler has been started, but + * when this is done the timer will not actually start until the scheduler is + * started, and the timers expiry time will be relative to when the scheduler is + * started, not relative to when xTimerReset() was called. + * + * The configUSE_TIMERS configuration constant must be set to 1 for xTimerReset() + * to be available. + * + * @param xTimer The handle of the timer being reset/started/restarted. + * + * @param xBlockTime Specifies the time, in ticks, that the calling task should + * be held in the Blocked state to wait for the reset command to be successfully + * sent to the timer command queue, should the queue already be full when + * xTimerReset() was called. xBlockTime is ignored if xTimerReset() is called + * before the scheduler is started. + * + * @return pdFAIL will be returned if the reset command could not be sent to + * the timer command queue even after xBlockTime ticks had passed. pdPASS will + * be returned if the command was successfully sent to the timer command queue. + * When the command is actually processed will depend on the priority of the + * timer service/daemon task relative to other tasks in the system, although the + * timers expiry time is relative to when xTimerStart() is actually called. The + * timer service/daemon task priority is set by the configTIMER_TASK_PRIORITY + * configuration constant. + * + * Example usage: + * + * // When a key is pressed, an LCD back-light is switched on. If 5 seconds pass + * // without a key being pressed, then the LCD back-light is switched off. In + * // this case, the timer is a one-shot timer. + * + * xTimerHandle xBacklightTimer = NULL; + * + * // The callback function assigned to the one-shot timer. In this case the + * // parameter is not used. + * void vBacklightTimerCallback( xTIMER *pxTimer ) + * { + * // The timer expired, therefore 5 seconds must have passed since a key + * // was pressed. Switch off the LCD back-light. + * vSetBacklightState( BACKLIGHT_OFF ); + * } + * + * // The key press event handler. + * void vKeyPressEventHandler( char cKey ) + * { + * // Ensure the LCD back-light is on, then reset the timer that is + * // responsible for turning the back-light off after 5 seconds of + * // key inactivity. Wait 10 ticks for the command to be successfully sent + * // if it cannot be sent immediately. + * vSetBacklightState( BACKLIGHT_ON ); + * if( xTimerReset( xBacklightTimer, 100 ) != pdPASS ) + * { + * // The reset command was not executed successfully. Take appropriate + * // action here. + * } + * + * // Perform the rest of the key processing here. + * } + * + * void main( void ) + * { + * long x; + * + * // Create then start the one-shot timer that is responsible for turning + * // the back-light off if no keys are pressed within a 5 second period. + * xBacklightTimer = xTimerCreate( "BacklightTimer", // Just a text name, not used by the kernel. + * ( 5000 / portTICK_RATE_MS), // The timer period in ticks. + * pdFALSE, // The timer is a one-shot timer. + * 0, // The id is not used by the callback so can take any value. + * vBacklightTimerCallback // The callback function that switches the LCD back-light off. + * ); + * + * if( xBacklightTimer == NULL ) + * { + * // The timer was not created. + * } + * else + * { + * // Start the timer. No block time is specified, and even if one was + * // it would be ignored because the scheduler has not yet been + * // started. + * if( xTimerStart( xBacklightTimer, 0 ) != pdPASS ) + * { + * // The timer could not be set into the Active state. + * } + * } + * + * // ... + * // Create tasks here. + * // ... + * + * // Starting the scheduler will start the timer running as it has already + * // been set into the active state. + * xTaskStartScheduler(); + * + * // Should not reach here. + * for( ;; ); + * } + */ +#define xTimerReset( xTimer, xBlockTime ) xTimerGenericCommand( ( xTimer ), tmrCOMMAND_START, ( xTaskGetTickCount() ), NULL, ( xBlockTime ) ) + +/** + * portBASE_TYPE xTimerStartFromISR( xTimerHandle xTimer, + * portBASE_TYPE *pxHigherPriorityTaskWoken ); + * + * A version of xTimerStart() that can be called from an interrupt service + * routine. + * + * @param xTimer The handle of the timer being started/restarted. + * + * @param pxHigherPriorityTaskWoken The timer service/daemon task spends most + * of its time in the Blocked state, waiting for messages to arrive on the timer + * command queue. Calling xTimerStartFromISR() writes a message to the timer + * command queue, so has the potential to transition the timer service/daemon + * task out of the Blocked state. If calling xTimerStartFromISR() causes the + * timer service/daemon task to leave the Blocked state, and the timer service/ + * daemon task has a priority equal to or greater than the currently executing + * task (the task that was interrupted), then *pxHigherPriorityTaskWoken will + * get set to pdTRUE internally within the xTimerStartFromISR() function. If + * xTimerStartFromISR() sets this value to pdTRUE then a context switch should + * be performed before the interrupt exits. + * + * @return pdFAIL will be returned if the start command could not be sent to + * the timer command queue. pdPASS will be returned if the command was + * successfully sent to the timer command queue. When the command is actually + * processed will depend on the priority of the timer service/daemon task + * relative to other tasks in the system, although the timers expiry time is + * relative to when xTimerStartFromISR() is actually called. The timer service/daemon + * task priority is set by the configTIMER_TASK_PRIORITY configuration constant. + * + * Example usage: + * + * // This scenario assumes xBacklightTimer has already been created. When a + * // key is pressed, an LCD back-light is switched on. If 5 seconds pass + * // without a key being pressed, then the LCD back-light is switched off. In + * // this case, the timer is a one-shot timer, and unlike the example given for + * // the xTimerReset() function, the key press event handler is an interrupt + * // service routine. + * + * // The callback function assigned to the one-shot timer. In this case the + * // parameter is not used. + * void vBacklightTimerCallback( xTIMER *pxTimer ) + * { + * // The timer expired, therefore 5 seconds must have passed since a key + * // was pressed. Switch off the LCD back-light. + * vSetBacklightState( BACKLIGHT_OFF ); + * } + * + * // The key press interrupt service routine. + * void vKeyPressEventInterruptHandler( void ) + * { + * portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE; + * + * // Ensure the LCD back-light is on, then restart the timer that is + * // responsible for turning the back-light off after 5 seconds of + * // key inactivity. This is an interrupt service routine so can only + * // call FreeRTOS API functions that end in "FromISR". + * vSetBacklightState( BACKLIGHT_ON ); + * + * // xTimerStartFromISR() or xTimerResetFromISR() could be called here + * // as both cause the timer to re-calculate its expiry time. + * // xHigherPriorityTaskWoken was initialised to pdFALSE when it was + * // declared (in this function). + * if( xTimerStartFromISR( xBacklightTimer, &xHigherPriorityTaskWoken ) != pdPASS ) + * { + * // The start command was not executed successfully. Take appropriate + * // action here. + * } + * + * // Perform the rest of the key processing here. + * + * // If xHigherPriorityTaskWoken equals pdTRUE, then a context switch + * // should be performed. The syntax required to perform a context switch + * // from inside an ISR varies from port to port, and from compiler to + * // compiler. Inspect the demos for the port you are using to find the + * // actual syntax required. + * if( xHigherPriorityTaskWoken != pdFALSE ) + * { + * // Call the interrupt safe yield function here (actual function + * // depends on the FreeRTOS port being used. + * } + * } + */ +#define xTimerStartFromISR( xTimer, pxHigherPriorityTaskWoken ) xTimerGenericCommand( ( xTimer ), tmrCOMMAND_START, ( xTaskGetTickCountFromISR() ), ( pxHigherPriorityTaskWoken ), 0U ) + +/** + * portBASE_TYPE xTimerStopFromISR( xTimerHandle xTimer, + * portBASE_TYPE *pxHigherPriorityTaskWoken ); + * + * A version of xTimerStop() that can be called from an interrupt service + * routine. + * + * @param xTimer The handle of the timer being stopped. + * + * @param pxHigherPriorityTaskWoken The timer service/daemon task spends most + * of its time in the Blocked state, waiting for messages to arrive on the timer + * command queue. Calling xTimerStopFromISR() writes a message to the timer + * command queue, so has the potential to transition the timer service/daemon + * task out of the Blocked state. If calling xTimerStopFromISR() causes the + * timer service/daemon task to leave the Blocked state, and the timer service/ + * daemon task has a priority equal to or greater than the currently executing + * task (the task that was interrupted), then *pxHigherPriorityTaskWoken will + * get set to pdTRUE internally within the xTimerStopFromISR() function. If + * xTimerStopFromISR() sets this value to pdTRUE then a context switch should + * be performed before the interrupt exits. + * + * @return pdFAIL will be returned if the stop command could not be sent to + * the timer command queue. pdPASS will be returned if the command was + * successfully sent to the timer command queue. When the command is actually + * processed will depend on the priority of the timer service/daemon task + * relative to other tasks in the system. The timer service/daemon task + * priority is set by the configTIMER_TASK_PRIORITY configuration constant. + * + * Example usage: + * + * // This scenario assumes xTimer has already been created and started. When + * // an interrupt occurs, the timer should be simply stopped. + * + * // The interrupt service routine that stops the timer. + * void vAnExampleInterruptServiceRoutine( void ) + * { + * portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE; + * + * // The interrupt has occurred - simply stop the timer. + * // xHigherPriorityTaskWoken was set to pdFALSE where it was defined + * // (within this function). As this is an interrupt service routine, only + * // FreeRTOS API functions that end in "FromISR" can be used. + * if( xTimerStopFromISR( xTimer, &xHigherPriorityTaskWoken ) != pdPASS ) + * { + * // The stop command was not executed successfully. Take appropriate + * // action here. + * } + * + * // If xHigherPriorityTaskWoken equals pdTRUE, then a context switch + * // should be performed. The syntax required to perform a context switch + * // from inside an ISR varies from port to port, and from compiler to + * // compiler. Inspect the demos for the port you are using to find the + * // actual syntax required. + * if( xHigherPriorityTaskWoken != pdFALSE ) + * { + * // Call the interrupt safe yield function here (actual function + * // depends on the FreeRTOS port being used. + * } + * } + */ +#define xTimerStopFromISR( xTimer, pxHigherPriorityTaskWoken ) xTimerGenericCommand( ( xTimer ), tmrCOMMAND_STOP, 0, ( pxHigherPriorityTaskWoken ), 0U ) + +/** + * portBASE_TYPE xTimerChangePeriodFromISR( xTimerHandle xTimer, + * portTickType xNewPeriod, + * portBASE_TYPE *pxHigherPriorityTaskWoken ); + * + * A version of xTimerChangePeriod() that can be called from an interrupt + * service routine. + * + * @param xTimer The handle of the timer that is having its period changed. + * + * @param xNewPeriod The new period for xTimer. Timer periods are specified in + * tick periods, so the constant portTICK_RATE_MS can be used to convert a time + * that has been specified in milliseconds. For example, if the timer must + * expire after 100 ticks, then xNewPeriod should be set to 100. Alternatively, + * if the timer must expire after 500ms, then xNewPeriod can be set to + * ( 500 / portTICK_RATE_MS ) provided configTICK_RATE_HZ is less than + * or equal to 1000. + * + * @param pxHigherPriorityTaskWoken The timer service/daemon task spends most + * of its time in the Blocked state, waiting for messages to arrive on the timer + * command queue. Calling xTimerChangePeriodFromISR() writes a message to the + * timer command queue, so has the potential to transition the timer service/ + * daemon task out of the Blocked state. If calling xTimerChangePeriodFromISR() + * causes the timer service/daemon task to leave the Blocked state, and the + * timer service/daemon task has a priority equal to or greater than the + * currently executing task (the task that was interrupted), then + * *pxHigherPriorityTaskWoken will get set to pdTRUE internally within the + * xTimerChangePeriodFromISR() function. If xTimerChangePeriodFromISR() sets + * this value to pdTRUE then a context switch should be performed before the + * interrupt exits. + * + * @return pdFAIL will be returned if the command to change the timers period + * could not be sent to the timer command queue. pdPASS will be returned if the + * command was successfully sent to the timer command queue. When the command + * is actually processed will depend on the priority of the timer service/daemon + * task relative to other tasks in the system. The timer service/daemon task + * priority is set by the configTIMER_TASK_PRIORITY configuration constant. + * + * Example usage: + * + * // This scenario assumes xTimer has already been created and started. When + * // an interrupt occurs, the period of xTimer should be changed to 500ms. + * + * // The interrupt service routine that changes the period of xTimer. + * void vAnExampleInterruptServiceRoutine( void ) + * { + * portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE; + * + * // The interrupt has occurred - change the period of xTimer to 500ms. + * // xHigherPriorityTaskWoken was set to pdFALSE where it was defined + * // (within this function). As this is an interrupt service routine, only + * // FreeRTOS API functions that end in "FromISR" can be used. + * if( xTimerChangePeriodFromISR( xTimer, &xHigherPriorityTaskWoken ) != pdPASS ) + * { + * // The command to change the timers period was not executed + * // successfully. Take appropriate action here. + * } + * + * // If xHigherPriorityTaskWoken equals pdTRUE, then a context switch + * // should be performed. The syntax required to perform a context switch + * // from inside an ISR varies from port to port, and from compiler to + * // compiler. Inspect the demos for the port you are using to find the + * // actual syntax required. + * if( xHigherPriorityTaskWoken != pdFALSE ) + * { + * // Call the interrupt safe yield function here (actual function + * // depends on the FreeRTOS port being used. + * } + * } + */ +#define xTimerChangePeriodFromISR( xTimer, xNewPeriod, pxHigherPriorityTaskWoken ) xTimerGenericCommand( ( xTimer ), tmrCOMMAND_CHANGE_PERIOD, ( xNewPeriod ), ( pxHigherPriorityTaskWoken ), 0U ) + +/** + * portBASE_TYPE xTimerResetFromISR( xTimerHandle xTimer, + * portBASE_TYPE *pxHigherPriorityTaskWoken ); + * + * A version of xTimerReset() that can be called from an interrupt service + * routine. + * + * @param xTimer The handle of the timer that is to be started, reset, or + * restarted. + * + * @param pxHigherPriorityTaskWoken The timer service/daemon task spends most + * of its time in the Blocked state, waiting for messages to arrive on the timer + * command queue. Calling xTimerResetFromISR() writes a message to the timer + * command queue, so has the potential to transition the timer service/daemon + * task out of the Blocked state. If calling xTimerResetFromISR() causes the + * timer service/daemon task to leave the Blocked state, and the timer service/ + * daemon task has a priority equal to or greater than the currently executing + * task (the task that was interrupted), then *pxHigherPriorityTaskWoken will + * get set to pdTRUE internally within the xTimerResetFromISR() function. If + * xTimerResetFromISR() sets this value to pdTRUE then a context switch should + * be performed before the interrupt exits. + * + * @return pdFAIL will be returned if the reset command could not be sent to + * the timer command queue. pdPASS will be returned if the command was + * successfully sent to the timer command queue. When the command is actually + * processed will depend on the priority of the timer service/daemon task + * relative to other tasks in the system, although the timers expiry time is + * relative to when xTimerResetFromISR() is actually called. The timer service/daemon + * task priority is set by the configTIMER_TASK_PRIORITY configuration constant. + * + * Example usage: + * + * // This scenario assumes xBacklightTimer has already been created. When a + * // key is pressed, an LCD back-light is switched on. If 5 seconds pass + * // without a key being pressed, then the LCD back-light is switched off. In + * // this case, the timer is a one-shot timer, and unlike the example given for + * // the xTimerReset() function, the key press event handler is an interrupt + * // service routine. + * + * // The callback function assigned to the one-shot timer. In this case the + * // parameter is not used. + * void vBacklightTimerCallback( xTIMER *pxTimer ) + * { + * // The timer expired, therefore 5 seconds must have passed since a key + * // was pressed. Switch off the LCD back-light. + * vSetBacklightState( BACKLIGHT_OFF ); + * } + * + * // The key press interrupt service routine. + * void vKeyPressEventInterruptHandler( void ) + * { + * portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE; + * + * // Ensure the LCD back-light is on, then reset the timer that is + * // responsible for turning the back-light off after 5 seconds of + * // key inactivity. This is an interrupt service routine so can only + * // call FreeRTOS API functions that end in "FromISR". + * vSetBacklightState( BACKLIGHT_ON ); + * + * // xTimerStartFromISR() or xTimerResetFromISR() could be called here + * // as both cause the timer to re-calculate its expiry time. + * // xHigherPriorityTaskWoken was initialised to pdFALSE when it was + * // declared (in this function). + * if( xTimerResetFromISR( xBacklightTimer, &xHigherPriorityTaskWoken ) != pdPASS ) + * { + * // The reset command was not executed successfully. Take appropriate + * // action here. + * } + * + * // Perform the rest of the key processing here. + * + * // If xHigherPriorityTaskWoken equals pdTRUE, then a context switch + * // should be performed. The syntax required to perform a context switch + * // from inside an ISR varies from port to port, and from compiler to + * // compiler. Inspect the demos for the port you are using to find the + * // actual syntax required. + * if( xHigherPriorityTaskWoken != pdFALSE ) + * { + * // Call the interrupt safe yield function here (actual function + * // depends on the FreeRTOS port being used. + * } + * } + */ +#define xTimerResetFromISR( xTimer, pxHigherPriorityTaskWoken ) xTimerGenericCommand( ( xTimer ), tmrCOMMAND_START, ( xTaskGetTickCountFromISR() ), ( pxHigherPriorityTaskWoken ), 0U ) + +/* + * Functions beyond this part are not part of the public API and are intended + * for use by the kernel only. + */ +portBASE_TYPE xTimerCreateTimerTask( void ) PRIVILEGED_FUNCTION; +portBASE_TYPE xTimerGenericCommand( xTimerHandle xTimer, portBASE_TYPE xCommandID, portTickType xOptionalValue, portBASE_TYPE *pxHigherPriorityTaskWoken, portTickType xBlockTime ) PRIVILEGED_FUNCTION; + +#ifdef __cplusplus +} +#endif +#endif /* TIMERS_H */ + + + diff --git a/TP1_labyrinth_etu/FreeRTOS_portable/MemMang/heap_1.c b/TP1_labyrinth_etu/FreeRTOS_portable/MemMang/heap_1.c new file mode 100644 index 0000000000000000000000000000000000000000..f063be198986f515d3a43bad75852f47361c03ef --- /dev/null +++ b/TP1_labyrinth_etu/FreeRTOS_portable/MemMang/heap_1.c @@ -0,0 +1,152 @@ +/* + FreeRTOS V7.0.1 - Copyright (C) 2011 Real Time Engineers Ltd. + + + *************************************************************************** + * * + * FreeRTOS tutorial books are available in pdf and paperback. * + * Complete, revised, and edited pdf reference manuals are also * + * available. * + * * + * Purchasing FreeRTOS documentation will not only help you, by * + * ensuring you get running as quickly as possible and with an * + * in-depth knowledge of how to use FreeRTOS, it will also help * + * the FreeRTOS project to continue with its mission of providing * + * professional grade, cross platform, de facto standard solutions * + * for microcontrollers - completely free of charge! * + * * + * >>> See http://www.FreeRTOS.org/Documentation for details. <<< * + * * + * Thank you for using FreeRTOS, and thank you for your support! * + * * + *************************************************************************** + + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation AND MODIFIED BY the FreeRTOS exception. + >>>NOTE<<< The modification to the GPL is included to allow you to + distribute a combined work that includes FreeRTOS without being obliged to + provide the source code for proprietary components outside of the FreeRTOS + kernel. FreeRTOS is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + more details. You should have received a copy of the GNU General Public + License and the FreeRTOS license exception along with FreeRTOS; if not it + can be viewed here: http://www.freertos.org/a00114.html and also obtained + by writing to Richard Barry, contact details for whom are available on the + FreeRTOS WEB site. + + 1 tab == 4 spaces! + + http://www.FreeRTOS.org - Documentation, latest information, license and + contact details. + + http://www.SafeRTOS.com - A version that is certified for use in safety + critical systems. + + http://www.OpenRTOS.com - Commercial support, development, porting, + licensing and training services. +*/ + + +/* + * The simplest possible implementation of pvPortMalloc(). Note that this + * implementation does NOT allow allocated memory to be freed again. + * + * See heap_2.c and heap_3.c for alternative implementations, and the memory + * management pages of http://www.FreeRTOS.org for more information. + */ +#include <stdlib.h> + +/* Defining MPU_WRAPPERS_INCLUDED_FROM_API_FILE prevents task.h from redefining +all the API functions to use the MPU wrappers. That should only be done when +task.h is included from an application file. */ +#define MPU_WRAPPERS_INCLUDED_FROM_API_FILE + +#include "FreeRTOS.h" +#include "task.h" + +#undef MPU_WRAPPERS_INCLUDED_FROM_API_FILE + +/* Allocate the memory for the heap. The struct is used to force byte +alignment without using any non-portable code. */ +static union xRTOS_HEAP +{ + #if portBYTE_ALIGNMENT == 8 + volatile portDOUBLE dDummy; + #else + volatile unsigned long ulDummy; + #endif + unsigned char ucHeap[ configTOTAL_HEAP_SIZE ]; +} xHeap; + +static size_t xNextFreeByte = ( size_t ) 0; +/*-----------------------------------------------------------*/ + +void *pvPortMalloc( size_t xWantedSize ) +{ +void *pvReturn = NULL; + + /* Ensure that blocks are always aligned to the required number of bytes. */ + #if portBYTE_ALIGNMENT != 1 + if( xWantedSize & portBYTE_ALIGNMENT_MASK ) + { + /* Byte alignment required. */ + xWantedSize += ( portBYTE_ALIGNMENT - ( xWantedSize & portBYTE_ALIGNMENT_MASK ) ); + } + #endif + + vTaskSuspendAll(); + { + /* Check there is enough room left for the allocation. */ + if( ( ( xNextFreeByte + xWantedSize ) < configTOTAL_HEAP_SIZE ) && + ( ( xNextFreeByte + xWantedSize ) > xNextFreeByte ) )/* Check for overflow. */ + { + /* Return the next free byte then increment the index past this + block. */ + pvReturn = &( xHeap.ucHeap[ xNextFreeByte ] ); + xNextFreeByte += xWantedSize; + } + } + xTaskResumeAll(); + + #if( configUSE_MALLOC_FAILED_HOOK == 1 ) + { + if( pvReturn == NULL ) + { + extern void vApplicationMallocFailedHook( void ); + vApplicationMallocFailedHook(); + } + } + #endif + + return pvReturn; +} +/*-----------------------------------------------------------*/ + +void vPortFree( void *pv ) +{ + /* Memory cannot be freed using this scheme. See heap_2.c and heap_3.c + for alternative implementations, and the memory management pages of + http://www.FreeRTOS.org for more information. */ + ( void ) pv; +} +/*-----------------------------------------------------------*/ + +void vPortInitialiseBlocks( void ) +{ + /* Only required when static memory is not cleared. */ + xNextFreeByte = ( size_t ) 0; +} +/*-----------------------------------------------------------*/ + +size_t xPortGetFreeHeapSize( void ) +{ + return ( configTOTAL_HEAP_SIZE - xNextFreeByte ); +} + + + diff --git a/TP1_labyrinth_etu/FreeRTOS_portable/MemMang/heap_2.c b/TP1_labyrinth_etu/FreeRTOS_portable/MemMang/heap_2.c new file mode 100644 index 0000000000000000000000000000000000000000..1d1c76a60e48af77f6e69e93bc1328b0ac1dea82 --- /dev/null +++ b/TP1_labyrinth_etu/FreeRTOS_portable/MemMang/heap_2.c @@ -0,0 +1,278 @@ +/* + FreeRTOS V7.0.1 - Copyright (C) 2011 Real Time Engineers Ltd. + + + *************************************************************************** + * * + * FreeRTOS tutorial books are available in pdf and paperback. * + * Complete, revised, and edited pdf reference manuals are also * + * available. * + * * + * Purchasing FreeRTOS documentation will not only help you, by * + * ensuring you get running as quickly as possible and with an * + * in-depth knowledge of how to use FreeRTOS, it will also help * + * the FreeRTOS project to continue with its mission of providing * + * professional grade, cross platform, de facto standard solutions * + * for microcontrollers - completely free of charge! * + * * + * >>> See http://www.FreeRTOS.org/Documentation for details. <<< * + * * + * Thank you for using FreeRTOS, and thank you for your support! * + * * + *************************************************************************** + + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation AND MODIFIED BY the FreeRTOS exception. + >>>NOTE<<< The modification to the GPL is included to allow you to + distribute a combined work that includes FreeRTOS without being obliged to + provide the source code for proprietary components outside of the FreeRTOS + kernel. FreeRTOS is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + more details. You should have received a copy of the GNU General Public + License and the FreeRTOS license exception along with FreeRTOS; if not it + can be viewed here: http://www.freertos.org/a00114.html and also obtained + by writing to Richard Barry, contact details for whom are available on the + FreeRTOS WEB site. + + 1 tab == 4 spaces! + + http://www.FreeRTOS.org - Documentation, latest information, license and + contact details. + + http://www.SafeRTOS.com - A version that is certified for use in safety + critical systems. + + http://www.OpenRTOS.com - Commercial support, development, porting, + licensing and training services. +*/ + +/* + * A sample implementation of pvPortMalloc() and vPortFree() that permits + * allocated blocks to be freed, but does not combine adjacent free blocks + * into a single larger block. + * + * See heap_1.c and heap_3.c for alternative implementations, and the memory + * management pages of http://www.FreeRTOS.org for more information. + */ +#include <stdlib.h> + +/* Defining MPU_WRAPPERS_INCLUDED_FROM_API_FILE prevents task.h from redefining +all the API functions to use the MPU wrappers. That should only be done when +task.h is included from an application file. */ +#define MPU_WRAPPERS_INCLUDED_FROM_API_FILE + +#include "FreeRTOS.h" +#include "task.h" + +#undef MPU_WRAPPERS_INCLUDED_FROM_API_FILE + +/* Allocate the memory for the heap. The struct is used to force byte +alignment without using any non-portable code. */ +static union xRTOS_HEAP +{ + #if portBYTE_ALIGNMENT == 8 + volatile portDOUBLE dDummy; + #else + volatile unsigned long ulDummy; + #endif + unsigned char ucHeap[ configTOTAL_HEAP_SIZE ]; +} xHeap; + +/* Define the linked list structure. This is used to link free blocks in order +of their size. */ +typedef struct A_BLOCK_LINK +{ + struct A_BLOCK_LINK *pxNextFreeBlock; /*<< The next free block in the list. */ + size_t xBlockSize; /*<< The size of the free block. */ +} xBlockLink; + + +static const unsigned short heapSTRUCT_SIZE = ( sizeof( xBlockLink ) + portBYTE_ALIGNMENT - ( sizeof( xBlockLink ) % portBYTE_ALIGNMENT ) ); +#define heapMINIMUM_BLOCK_SIZE ( ( size_t ) ( heapSTRUCT_SIZE * 2 ) ) + +/* Create a couple of list links to mark the start and end of the list. */ +static xBlockLink xStart, xEnd; + +/* Keeps track of the number of free bytes remaining, but says nothing about +fragmentation. */ +static size_t xFreeBytesRemaining = configTOTAL_HEAP_SIZE; + +/* STATIC FUNCTIONS ARE DEFINED AS MACROS TO MINIMIZE THE FUNCTION CALL DEPTH. */ + +/* + * Insert a block into the list of free blocks - which is ordered by size of + * the block. Small blocks at the start of the list and large blocks at the end + * of the list. + */ +#define prvInsertBlockIntoFreeList( pxBlockToInsert ) \ +{ \ +xBlockLink *pxIterator; \ +size_t xBlockSize; \ + \ + xBlockSize = pxBlockToInsert->xBlockSize; \ + \ + /* Iterate through the list until a block is found that has a larger size */ \ + /* than the block we are inserting. */ \ + for( pxIterator = &xStart; pxIterator->pxNextFreeBlock->xBlockSize < xBlockSize; pxIterator = pxIterator->pxNextFreeBlock ) \ + { \ + /* There is nothing to do here - just iterate to the correct position. */ \ + } \ + \ + /* Update the list to include the block being inserted in the correct */ \ + /* position. */ \ + pxBlockToInsert->pxNextFreeBlock = pxIterator->pxNextFreeBlock; \ + pxIterator->pxNextFreeBlock = pxBlockToInsert; \ +} +/*-----------------------------------------------------------*/ + +#define prvHeapInit() \ +{ \ +xBlockLink *pxFirstFreeBlock; \ + \ + /* xStart is used to hold a pointer to the first item in the list of free */ \ + /* blocks. The void cast is used to prevent compiler warnings. */ \ + xStart.pxNextFreeBlock = ( void * ) xHeap.ucHeap; \ + xStart.xBlockSize = ( size_t ) 0; \ + \ + /* xEnd is used to mark the end of the list of free blocks. */ \ + xEnd.xBlockSize = configTOTAL_HEAP_SIZE; \ + xEnd.pxNextFreeBlock = NULL; \ + \ + /* To start with there is a single free block that is sized to take up the \ + entire heap space. */ \ + pxFirstFreeBlock = ( void * ) xHeap.ucHeap; \ + pxFirstFreeBlock->xBlockSize = configTOTAL_HEAP_SIZE; \ + pxFirstFreeBlock->pxNextFreeBlock = &xEnd; \ +} +/*-----------------------------------------------------------*/ + +void *pvPortMalloc( size_t xWantedSize ) +{ +xBlockLink *pxBlock, *pxPreviousBlock, *pxNewBlockLink; +static portBASE_TYPE xHeapHasBeenInitialised = pdFALSE; +void *pvReturn = NULL; + + vTaskSuspendAll(); + { + /* If this is the first call to malloc then the heap will require + initialisation to setup the list of free blocks. */ + if( xHeapHasBeenInitialised == pdFALSE ) + { + prvHeapInit(); + xHeapHasBeenInitialised = pdTRUE; + } + + /* The wanted size is increased so it can contain a xBlockLink + structure in addition to the requested amount of bytes. */ + if( xWantedSize > 0 ) + { + xWantedSize += heapSTRUCT_SIZE; + + /* Ensure that blocks are always aligned to the required number of bytes. */ + if( xWantedSize & portBYTE_ALIGNMENT_MASK ) + { + /* Byte alignment required. */ + xWantedSize += ( portBYTE_ALIGNMENT - ( xWantedSize & portBYTE_ALIGNMENT_MASK ) ); + } + } + + if( ( xWantedSize > 0 ) && ( xWantedSize < configTOTAL_HEAP_SIZE ) ) + { + /* Blocks are stored in byte order - traverse the list from the start + (smallest) block until one of adequate size is found. */ + pxPreviousBlock = &xStart; + pxBlock = xStart.pxNextFreeBlock; + while( ( pxBlock->xBlockSize < xWantedSize ) && ( pxBlock->pxNextFreeBlock ) ) + { + pxPreviousBlock = pxBlock; + pxBlock = pxBlock->pxNextFreeBlock; + } + + /* If we found the end marker then a block of adequate size was not found. */ + if( pxBlock != &xEnd ) + { + /* Return the memory space - jumping over the xBlockLink structure + at its start. */ + pvReturn = ( void * ) ( ( ( unsigned char * ) pxPreviousBlock->pxNextFreeBlock ) + heapSTRUCT_SIZE ); + + /* This block is being returned for use so must be taken our of the + list of free blocks. */ + pxPreviousBlock->pxNextFreeBlock = pxBlock->pxNextFreeBlock; + + /* If the block is larger than required it can be split into two. */ + if( ( pxBlock->xBlockSize - xWantedSize ) > heapMINIMUM_BLOCK_SIZE ) + { + /* This block is to be split into two. Create a new block + following the number of bytes requested. The void cast is + used to prevent byte alignment warnings from the compiler. */ + pxNewBlockLink = ( void * ) ( ( ( unsigned char * ) pxBlock ) + xWantedSize ); + + /* Calculate the sizes of two blocks split from the single + block. */ + pxNewBlockLink->xBlockSize = pxBlock->xBlockSize - xWantedSize; + pxBlock->xBlockSize = xWantedSize; + + /* Insert the new block into the list of free blocks. */ + prvInsertBlockIntoFreeList( ( pxNewBlockLink ) ); + } + + xFreeBytesRemaining -= pxBlock->xBlockSize; + } + } + } + xTaskResumeAll(); + + #if( configUSE_MALLOC_FAILED_HOOK == 1 ) + { + if( pvReturn == NULL ) + { + extern void vApplicationMallocFailedHook( void ); + vApplicationMallocFailedHook(); + } + } + #endif + + return pvReturn; +} +/*-----------------------------------------------------------*/ + +void vPortFree( void *pv ) +{ +unsigned char *puc = ( unsigned char * ) pv; +xBlockLink *pxLink; + + if( pv ) + { + /* The memory being freed will have an xBlockLink structure immediately + before it. */ + puc -= heapSTRUCT_SIZE; + + /* This casting is to keep the compiler from issuing warnings. */ + pxLink = ( void * ) puc; + + vTaskSuspendAll(); + { + /* Add this block to the list of free blocks. */ + prvInsertBlockIntoFreeList( ( ( xBlockLink * ) pxLink ) ); + xFreeBytesRemaining += pxLink->xBlockSize; + } + xTaskResumeAll(); + } +} +/*-----------------------------------------------------------*/ + +size_t xPortGetFreeHeapSize( void ) +{ + return xFreeBytesRemaining; +} +/*-----------------------------------------------------------*/ + +void vPortInitialiseBlocks( void ) +{ + /* This just exists to keep the linker quiet. */ +} diff --git a/TP1_labyrinth_etu/FreeRTOS_portable/MemMang/heap_3.c b/TP1_labyrinth_etu/FreeRTOS_portable/MemMang/heap_3.c new file mode 100644 index 0000000000000000000000000000000000000000..fa799a0c21ae6cf15560ffc7ba286847f124d496 --- /dev/null +++ b/TP1_labyrinth_etu/FreeRTOS_portable/MemMang/heap_3.c @@ -0,0 +1,117 @@ +/* + FreeRTOS V7.0.1 - Copyright (C) 2011 Real Time Engineers Ltd. + + + *************************************************************************** + * * + * FreeRTOS tutorial books are available in pdf and paperback. * + * Complete, revised, and edited pdf reference manuals are also * + * available. * + * * + * Purchasing FreeRTOS documentation will not only help you, by * + * ensuring you get running as quickly as possible and with an * + * in-depth knowledge of how to use FreeRTOS, it will also help * + * the FreeRTOS project to continue with its mission of providing * + * professional grade, cross platform, de facto standard solutions * + * for microcontrollers - completely free of charge! * + * * + * >>> See http://www.FreeRTOS.org/Documentation for details. <<< * + * * + * Thank you for using FreeRTOS, and thank you for your support! * + * * + *************************************************************************** + + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation AND MODIFIED BY the FreeRTOS exception. + >>>NOTE<<< The modification to the GPL is included to allow you to + distribute a combined work that includes FreeRTOS without being obliged to + provide the source code for proprietary components outside of the FreeRTOS + kernel. FreeRTOS is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + more details. You should have received a copy of the GNU General Public + License and the FreeRTOS license exception along with FreeRTOS; if not it + can be viewed here: http://www.freertos.org/a00114.html and also obtained + by writing to Richard Barry, contact details for whom are available on the + FreeRTOS WEB site. + + 1 tab == 4 spaces! + + http://www.FreeRTOS.org - Documentation, latest information, license and + contact details. + + http://www.SafeRTOS.com - A version that is certified for use in safety + critical systems. + + http://www.OpenRTOS.com - Commercial support, development, porting, + licensing and training services. +*/ + + +/* + * Implementation of pvPortMalloc() and vPortFree() that relies on the + * compilers own malloc() and free() implementations. + * + * This file can only be used if the linker is configured to to generate + * a heap memory area. + * + * See heap_2.c and heap_1.c for alternative implementations, and the memory + * management pages of http://www.FreeRTOS.org for more information. + */ + +#include <stdlib.h> + +/* Defining MPU_WRAPPERS_INCLUDED_FROM_API_FILE prevents task.h from redefining +all the API functions to use the MPU wrappers. That should only be done when +task.h is included from an application file. */ +#define MPU_WRAPPERS_INCLUDED_FROM_API_FILE + +#include "FreeRTOS.h" +#include "task.h" + +#undef MPU_WRAPPERS_INCLUDED_FROM_API_FILE + +/*-----------------------------------------------------------*/ + +void *pvPortMalloc( size_t xWantedSize ) +{ +void *pvReturn; + + vTaskSuspendAll(); + { + pvReturn = malloc( xWantedSize ); + } + xTaskResumeAll(); + + #if( configUSE_MALLOC_FAILED_HOOK == 1 ) + { + if( pvReturn == NULL ) + { + extern void vApplicationMallocFailedHook( void ); + vApplicationMallocFailedHook(); + } + } + #endif + + return pvReturn; +} +/*-----------------------------------------------------------*/ + +void vPortFree( void *pv ) +{ + if( pv ) + { + vTaskSuspendAll(); + { + free( pv ); + } + xTaskResumeAll(); + } +} + + + diff --git a/TP1_labyrinth_etu/FreeRTOS_portable/port.c b/TP1_labyrinth_etu/FreeRTOS_portable/port.c new file mode 100644 index 0000000000000000000000000000000000000000..70c74912a48a5c884d610f69ba505d692e32a969 --- /dev/null +++ b/TP1_labyrinth_etu/FreeRTOS_portable/port.c @@ -0,0 +1,283 @@ +/* + FreeRTOS V7.0.1 - Copyright (C) 2011 Real Time Engineers Ltd. + + + *************************************************************************** + * * + * FreeRTOS tutorial books are available in pdf and paperback. * + * Complete, revised, and edited pdf reference manuals are also * + * available. * + * * + * Purchasing FreeRTOS documentation will not only help you, by * + * ensuring you get running as quickly as possible and with an * + * in-depth knowledge of how to use FreeRTOS, it will also help * + * the FreeRTOS project to continue with its mission of providing * + * professional grade, cross platform, de facto standard solutions * + * for microcontrollers - completely free of charge! * + * * + * >>> See http://www.FreeRTOS.org/Documentation for details. <<< * + * * + * Thank you for using FreeRTOS, and thank you for your support! * + * * + *************************************************************************** + + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation AND MODIFIED BY the FreeRTOS exception. + >>>NOTE<<< The modification to the GPL is included to allow you to + distribute a combined work that includes FreeRTOS without being obliged to + provide the source code for proprietary components outside of the FreeRTOS + kernel. FreeRTOS is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + more details. You should have received a copy of the GNU General Public + License and the FreeRTOS license exception along with FreeRTOS; if not it + can be viewed here: http://www.freertos.org/a00114.html and also obtained + by writing to Richard Barry, contact details for whom are available on the + FreeRTOS WEB site. + + 1 tab == 4 spaces! + + http://www.FreeRTOS.org - Documentation, latest information, license and + contact details. + + http://www.SafeRTOS.com - A version that is certified for use in safety + critical systems. + + http://www.OpenRTOS.com - Commercial support, development, porting, + licensing and training services. +*/ + +/*----------------------------------------------------------- + * Implementation of functions defined in portable.h for the ARM CM3 port. + *----------------------------------------------------------*/ + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" + +/* For backward compatibility, ensure configKERNEL_INTERRUPT_PRIORITY is +defined. The value should also ensure backward compatibility. +FreeRTOS.org versions prior to V4.4.0 did not include this definition. */ +#ifndef configKERNEL_INTERRUPT_PRIORITY + #define configKERNEL_INTERRUPT_PRIORITY 255 +#endif + +/* Constants required to manipulate the NVIC. */ +#define portNVIC_SYSTICK_CTRL ( ( volatile unsigned long *) 0xe000e010 ) +#define portNVIC_SYSTICK_LOAD ( ( volatile unsigned long *) 0xe000e014 ) +#define portNVIC_INT_CTRL ( ( volatile unsigned long *) 0xe000ed04 ) +#define portNVIC_SYSPRI2 ( ( volatile unsigned long *) 0xe000ed20 ) +#define portNVIC_SYSTICK_CLK 0x00000004 +#define portNVIC_SYSTICK_INT 0x00000002 +#define portNVIC_SYSTICK_ENABLE 0x00000001 +#define portNVIC_PENDSVSET 0x10000000 +#define portNVIC_PENDSV_PRI ( ( ( unsigned long ) configKERNEL_INTERRUPT_PRIORITY ) << 16 ) +#define portNVIC_SYSTICK_PRI ( ( ( unsigned long ) configKERNEL_INTERRUPT_PRIORITY ) << 24 ) + +/* Constants required to set up the initial stack. */ +#define portINITIAL_XPSR ( 0x01000000 ) + +/* The priority used by the kernel is assigned to a variable to make access +from inline assembler easier. */ +const unsigned long ulKernelPriority = configKERNEL_INTERRUPT_PRIORITY; + +/* Each task maintains its own interrupt status in the critical nesting +variable. */ +static unsigned portBASE_TYPE uxCriticalNesting = 0xaaaaaaaa; + +/* + * Setup the timer to generate the tick interrupts. + */ +static void prvSetupTimerInterrupt( void ); + +/* + * Exception handlers. + */ +void xPortPendSVHandler( void ) __attribute__ (( naked )); +void xPortSysTickHandler( void ); +void vPortSVCHandler( void ) __attribute__ (( naked )); + +/* + * Start first task is a separate function so it can be tested in isolation. + */ +void vPortStartFirstTask( void ) __attribute__ (( naked )); + +/*-----------------------------------------------------------*/ + +/* + * See header file for description. + */ +portSTACK_TYPE *pxPortInitialiseStack( portSTACK_TYPE *pxTopOfStack, pdTASK_CODE pxCode, void *pvParameters ) +{ + /* Simulate the stack frame as it would be created by a context switch + interrupt. */ + pxTopOfStack--; /* Offset added to account for the way the MCU uses the stack on entry/exit of interrupts. */ + *pxTopOfStack = portINITIAL_XPSR; /* xPSR */ + pxTopOfStack--; + *pxTopOfStack = ( portSTACK_TYPE ) pxCode; /* PC */ + pxTopOfStack--; + *pxTopOfStack = 0; /* LR */ + pxTopOfStack -= 5; /* R12, R3, R2 and R1. */ + *pxTopOfStack = ( portSTACK_TYPE ) pvParameters; /* R0 */ + pxTopOfStack -= 8; /* R11, R10, R9, R8, R7, R6, R5 and R4. */ + + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +void vPortSVCHandler( void ) +{ + __asm volatile ( + " ldr r3, pxCurrentTCBConst2 \n" /* Restore the context. */ + " ldr r1, [r3] \n" /* Use pxCurrentTCBConst to get the pxCurrentTCB address. */ + " ldr r0, [r1] \n" /* The first item in pxCurrentTCB is the task top of stack. */ + " ldmia r0!, {r4-r11} \n" /* Pop the registers that are not automatically saved on exception entry and the critical nesting count. */ + " msr psp, r0 \n" /* Restore the task stack pointer. */ + " mov r0, #0 \n" + " msr basepri, r0 \n" + " orr r14, #0xd \n" + " bx r14 \n" + " \n" + " .align 2 \n" + "pxCurrentTCBConst2: .word pxCurrentTCB \n" + ); +} +/*-----------------------------------------------------------*/ + +void vPortStartFirstTask( void ) +{ + __asm volatile( + " ldr r0, =0xE000ED08 \n" /* Use the NVIC offset register to locate the stack. */ + " ldr r0, [r0] \n" + " ldr r0, [r0] \n" + " msr msp, r0 \n" /* Set the msp back to the start of the stack. */ + " cpsie i \n" /* Globally enable interrupts. */ + " svc 0 \n" /* System call to start first task. */ + " nop \n" + ); +} +/*-----------------------------------------------------------*/ + +/* + * See header file for description. + */ +portBASE_TYPE xPortStartScheduler( void ) +{ + /* Make PendSV, CallSV and SysTick the same priroity as the kernel. */ + *(portNVIC_SYSPRI2) |= portNVIC_PENDSV_PRI; + *(portNVIC_SYSPRI2) |= portNVIC_SYSTICK_PRI; + + /* Start the timer that generates the tick ISR. Interrupts are disabled + here already. */ + prvSetupTimerInterrupt(); + + /* Initialise the critical nesting count ready for the first task. */ + uxCriticalNesting = 0; + + /* Start the first task. */ + vPortStartFirstTask(); + + /* Should not get here! */ + return 0; +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* It is unlikely that the CM3 port will require this function as there + is nothing to return to. */ +} +/*-----------------------------------------------------------*/ + +void vPortYieldFromISR( void ) +{ + /* Set a PendSV to request a context switch. */ + *(portNVIC_INT_CTRL) = portNVIC_PENDSVSET; +} +/*-----------------------------------------------------------*/ + +void vPortEnterCritical( void ) +{ + portDISABLE_INTERRUPTS(); + uxCriticalNesting++; +} +/*-----------------------------------------------------------*/ + +void vPortExitCritical( void ) +{ + uxCriticalNesting--; + if( uxCriticalNesting == 0 ) + { + portENABLE_INTERRUPTS(); + } +} +/*-----------------------------------------------------------*/ + +void xPortPendSVHandler( void ) +{ + /* This is a naked function. */ + + __asm volatile + ( + " mrs r0, psp \n" + " \n" + " ldr r3, pxCurrentTCBConst \n" /* Get the location of the current TCB. */ + " ldr r2, [r3] \n" + " \n" + " stmdb r0!, {r4-r11} \n" /* Save the remaining registers. */ + " str r0, [r2] \n" /* Save the new top of stack into the first member of the TCB. */ + " \n" + " stmdb sp!, {r3, r14} \n" + " mov r0, %0 \n" + " msr basepri, r0 \n" + " bl vTaskSwitchContext \n" + " mov r0, #0 \n" + " msr basepri, r0 \n" + " ldmia sp!, {r3, r14} \n" + " \n" /* Restore the context, including the critical nesting count. */ + " ldr r1, [r3] \n" + " ldr r0, [r1] \n" /* The first item in pxCurrentTCB is the task top of stack. */ + " ldmia r0!, {r4-r11} \n" /* Pop the registers. */ + " msr psp, r0 \n" + " bx r14 \n" + " \n" + " .align 2 \n" + "pxCurrentTCBConst: .word pxCurrentTCB \n" + ::"i"(configMAX_SYSCALL_INTERRUPT_PRIORITY) + ); +} +/*-----------------------------------------------------------*/ + +void xPortSysTickHandler( void ) +{ +unsigned long ulDummy; + + /* If using preemption, also force a context switch. */ + #if configUSE_PREEMPTION == 1 + *(portNVIC_INT_CTRL) = portNVIC_PENDSVSET; + #endif + + ulDummy = portSET_INTERRUPT_MASK_FROM_ISR(); + { + vTaskIncrementTick(); + } + portCLEAR_INTERRUPT_MASK_FROM_ISR( ulDummy ); +} +/*-----------------------------------------------------------*/ + +/* + * Setup the systick timer to generate the tick interrupts at the required + * frequency. + */ +void prvSetupTimerInterrupt( void ) +{ + /* Configure SysTick to interrupt at the requested rate. */ + *(portNVIC_SYSTICK_LOAD) = ( configCPU_CLOCK_HZ / configTICK_RATE_HZ ) - 1UL; + *(portNVIC_SYSTICK_CTRL) = portNVIC_SYSTICK_CLK | portNVIC_SYSTICK_INT | portNVIC_SYSTICK_ENABLE; +} +/*-----------------------------------------------------------*/ + diff --git a/TP1_labyrinth_etu/FreeRTOS_portable/portmacro.h b/TP1_labyrinth_etu/FreeRTOS_portable/portmacro.h new file mode 100644 index 0000000000000000000000000000000000000000..461bf90521b9837f0c0728c20b385c09e6f52e3d --- /dev/null +++ b/TP1_labyrinth_etu/FreeRTOS_portable/portmacro.h @@ -0,0 +1,156 @@ +/* + FreeRTOS V7.0.1 - Copyright (C) 2011 Real Time Engineers Ltd. + + + *************************************************************************** + * * + * FreeRTOS tutorial books are available in pdf and paperback. * + * Complete, revised, and edited pdf reference manuals are also * + * available. * + * * + * Purchasing FreeRTOS documentation will not only help you, by * + * ensuring you get running as quickly as possible and with an * + * in-depth knowledge of how to use FreeRTOS, it will also help * + * the FreeRTOS project to continue with its mission of providing * + * professional grade, cross platform, de facto standard solutions * + * for microcontrollers - completely free of charge! * + * * + * >>> See http://www.FreeRTOS.org/Documentation for details. <<< * + * * + * Thank you for using FreeRTOS, and thank you for your support! * + * * + *************************************************************************** + + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation AND MODIFIED BY the FreeRTOS exception. + >>>NOTE<<< The modification to the GPL is included to allow you to + distribute a combined work that includes FreeRTOS without being obliged to + provide the source code for proprietary components outside of the FreeRTOS + kernel. FreeRTOS is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + more details. You should have received a copy of the GNU General Public + License and the FreeRTOS license exception along with FreeRTOS; if not it + can be viewed here: http://www.freertos.org/a00114.html and also obtained + by writing to Richard Barry, contact details for whom are available on the + FreeRTOS WEB site. + + 1 tab == 4 spaces! + + http://www.FreeRTOS.org - Documentation, latest information, license and + contact details. + + http://www.SafeRTOS.com - A version that is certified for use in safety + critical systems. + + http://www.OpenRTOS.com - Commercial support, development, porting, + licensing and training services. +*/ + + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +#ifdef __cplusplus +extern "C" { +#endif + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* Type definitions. */ +#define portCHAR char +#define portFLOAT float +#define portDOUBLE double +#define portLONG long +#define portSHORT short +#define portSTACK_TYPE unsigned portLONG +#define portBASE_TYPE long + +#if( configUSE_16_BIT_TICKS == 1 ) + typedef unsigned portSHORT portTickType; + #define portMAX_DELAY ( portTickType ) 0xffff +#else + typedef unsigned portLONG portTickType; + #define portMAX_DELAY ( portTickType ) 0xffffffff +#endif +/*-----------------------------------------------------------*/ + +/* Architecture specifics. */ +#define portSTACK_GROWTH ( -1 ) +#define portTICK_RATE_MS ( ( portTickType ) 1000 / configTICK_RATE_HZ ) +#define portBYTE_ALIGNMENT 8 +/*-----------------------------------------------------------*/ + + +/* Scheduler utilities. */ +extern void vPortYieldFromISR( void ); + +#define portYIELD() vPortYieldFromISR() + +#define portEND_SWITCHING_ISR( xSwitchRequired ) if( xSwitchRequired ) vPortYieldFromISR() +/*-----------------------------------------------------------*/ + + +/* Critical section management. */ + +/* + * Set basepri to portMAX_SYSCALL_INTERRUPT_PRIORITY without effecting other + * registers. r0 is clobbered. + */ +#define portSET_INTERRUPT_MASK() \ + __asm volatile \ + ( \ + " mov r0, %0 \n" \ + " msr basepri, r0 \n" \ + ::"i"(configMAX_SYSCALL_INTERRUPT_PRIORITY):"r0" \ + ) + +/* + * Set basepri back to 0 without effective other registers. + * r0 is clobbered. + */ +#define portCLEAR_INTERRUPT_MASK() \ + __asm volatile \ + ( \ + " mov r0, #0 \n" \ + " msr basepri, r0 \n" \ + :::"r0" \ + ) + +#define portSET_INTERRUPT_MASK_FROM_ISR() 0;portSET_INTERRUPT_MASK() +#define portCLEAR_INTERRUPT_MASK_FROM_ISR(x) portCLEAR_INTERRUPT_MASK();(void)x + + +extern void vPortEnterCritical( void ); +extern void vPortExitCritical( void ); + +#define portDISABLE_INTERRUPTS() portSET_INTERRUPT_MASK() +#define portENABLE_INTERRUPTS() portCLEAR_INTERRUPT_MASK() +#define portENTER_CRITICAL() vPortEnterCritical() +#define portEXIT_CRITICAL() vPortExitCritical() +/*-----------------------------------------------------------*/ + +/* Task function macros as described on the FreeRTOS.org WEB site. */ +#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void *pvParameters ) +#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void *pvParameters ) + +#define portNOP() + +#ifdef __cplusplus +} +#endif + +#endif /* PORTMACRO_H */ + diff --git a/TP1_labyrinth_etu/FreeRTOS_src/croutine.c b/TP1_labyrinth_etu/FreeRTOS_src/croutine.c new file mode 100644 index 0000000000000000000000000000000000000000..58fb1bf4b846b0fd1d11fdeb335db97e4a591b85 --- /dev/null +++ b/TP1_labyrinth_etu/FreeRTOS_src/croutine.c @@ -0,0 +1,380 @@ +/* + FreeRTOS V7.0.1 - Copyright (C) 2011 Real Time Engineers Ltd. + + + FreeRTOS supports many tools and architectures. V7.0.0 is sponsored by: + Atollic AB - Atollic provides professional embedded systems development + tools for C/C++ development, code analysis and test automation. + See http://www.atollic.com + + + *************************************************************************** + * * + * FreeRTOS tutorial books are available in pdf and paperback. * + * Complete, revised, and edited pdf reference manuals are also * + * available. * + * * + * Purchasing FreeRTOS documentation will not only help you, by * + * ensuring you get running as quickly as possible and with an * + * in-depth knowledge of how to use FreeRTOS, it will also help * + * the FreeRTOS project to continue with its mission of providing * + * professional grade, cross platform, de facto standard solutions * + * for microcontrollers - completely free of charge! * + * * + * >>> See http://www.FreeRTOS.org/Documentation for details. <<< * + * * + * Thank you for using FreeRTOS, and thank you for your support! * + * * + *************************************************************************** + + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation AND MODIFIED BY the FreeRTOS exception. + >>>NOTE<<< The modification to the GPL is included to allow you to + distribute a combined work that includes FreeRTOS without being obliged to + provide the source code for proprietary components outside of the FreeRTOS + kernel. FreeRTOS is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + more details. You should have received a copy of the GNU General Public + License and the FreeRTOS license exception along with FreeRTOS; if not it + can be viewed here: http://www.freertos.org/a00114.html and also obtained + by writing to Richard Barry, contact details for whom are available on the + FreeRTOS WEB site. + + 1 tab == 4 spaces! + + http://www.FreeRTOS.org - Documentation, latest information, license and + contact details. + + http://www.SafeRTOS.com - A version that is certified for use in safety + critical systems. + + http://www.OpenRTOS.com - Commercial support, development, porting, + licensing and training services. +*/ + +#include "FreeRTOS.h" +#include "task.h" +#include "croutine.h" + +/* + * Some kernel aware debuggers require data to be viewed to be global, rather + * than file scope. + */ +#ifdef portREMOVE_STATIC_QUALIFIER + #define static +#endif + + +/* Lists for ready and blocked co-routines. --------------------*/ +static xList pxReadyCoRoutineLists[ configMAX_CO_ROUTINE_PRIORITIES ]; /*< Prioritised ready co-routines. */ +static xList xDelayedCoRoutineList1; /*< Delayed co-routines. */ +static xList xDelayedCoRoutineList2; /*< Delayed co-routines (two lists are used - one for delays that have overflowed the current tick count. */ +static xList * pxDelayedCoRoutineList; /*< Points to the delayed co-routine list currently being used. */ +static xList * pxOverflowDelayedCoRoutineList; /*< Points to the delayed co-routine list currently being used to hold co-routines that have overflowed the current tick count. */ +static xList xPendingReadyCoRoutineList; /*< Holds co-routines that have been readied by an external event. They cannot be added directly to the ready lists as the ready lists cannot be accessed by interrupts. */ + +/* Other file private variables. --------------------------------*/ +corCRCB * pxCurrentCoRoutine = NULL; +static unsigned portBASE_TYPE uxTopCoRoutineReadyPriority = 0; +static portTickType xCoRoutineTickCount = 0, xLastTickCount = 0, xPassedTicks = 0; + +/* The initial state of the co-routine when it is created. */ +#define corINITIAL_STATE ( 0 ) + +/* + * Place the co-routine represented by pxCRCB into the appropriate ready queue + * for the priority. It is inserted at the end of the list. + * + * This macro accesses the co-routine ready lists and therefore must not be + * used from within an ISR. + */ +#define prvAddCoRoutineToReadyQueue( pxCRCB ) \ +{ \ + if( pxCRCB->uxPriority > uxTopCoRoutineReadyPriority ) \ + { \ + uxTopCoRoutineReadyPriority = pxCRCB->uxPriority; \ + } \ + vListInsertEnd( ( xList * ) &( pxReadyCoRoutineLists[ pxCRCB->uxPriority ] ), &( pxCRCB->xGenericListItem ) ); \ +} + +/* + * Utility to ready all the lists used by the scheduler. This is called + * automatically upon the creation of the first co-routine. + */ +static void prvInitialiseCoRoutineLists( void ); + +/* + * Co-routines that are readied by an interrupt cannot be placed directly into + * the ready lists (there is no mutual exclusion). Instead they are placed in + * in the pending ready list in order that they can later be moved to the ready + * list by the co-routine scheduler. + */ +static void prvCheckPendingReadyList( void ); + +/* + * Macro that looks at the list of co-routines that are currently delayed to + * see if any require waking. + * + * Co-routines are stored in the queue in the order of their wake time - + * meaning once one co-routine has been found whose timer has not expired + * we need not look any further down the list. + */ +static void prvCheckDelayedList( void ); + +/*-----------------------------------------------------------*/ + +signed portBASE_TYPE xCoRoutineCreate( crCOROUTINE_CODE pxCoRoutineCode, unsigned portBASE_TYPE uxPriority, unsigned portBASE_TYPE uxIndex ) +{ +signed portBASE_TYPE xReturn; +corCRCB *pxCoRoutine; + + /* Allocate the memory that will store the co-routine control block. */ + pxCoRoutine = ( corCRCB * ) pvPortMalloc( sizeof( corCRCB ) ); + if( pxCoRoutine ) + { + /* If pxCurrentCoRoutine is NULL then this is the first co-routine to + be created and the co-routine data structures need initialising. */ + if( pxCurrentCoRoutine == NULL ) + { + pxCurrentCoRoutine = pxCoRoutine; + prvInitialiseCoRoutineLists(); + } + + /* Check the priority is within limits. */ + if( uxPriority >= configMAX_CO_ROUTINE_PRIORITIES ) + { + uxPriority = configMAX_CO_ROUTINE_PRIORITIES - 1; + } + + /* Fill out the co-routine control block from the function parameters. */ + pxCoRoutine->uxState = corINITIAL_STATE; + pxCoRoutine->uxPriority = uxPriority; + pxCoRoutine->uxIndex = uxIndex; + pxCoRoutine->pxCoRoutineFunction = pxCoRoutineCode; + + /* Initialise all the other co-routine control block parameters. */ + vListInitialiseItem( &( pxCoRoutine->xGenericListItem ) ); + vListInitialiseItem( &( pxCoRoutine->xEventListItem ) ); + + /* Set the co-routine control block as a link back from the xListItem. + This is so we can get back to the containing CRCB from a generic item + in a list. */ + listSET_LIST_ITEM_OWNER( &( pxCoRoutine->xGenericListItem ), pxCoRoutine ); + listSET_LIST_ITEM_OWNER( &( pxCoRoutine->xEventListItem ), pxCoRoutine ); + + /* Event lists are always in priority order. */ + listSET_LIST_ITEM_VALUE( &( pxCoRoutine->xEventListItem ), configMAX_PRIORITIES - ( portTickType ) uxPriority ); + + /* Now the co-routine has been initialised it can be added to the ready + list at the correct priority. */ + prvAddCoRoutineToReadyQueue( pxCoRoutine ); + + xReturn = pdPASS; + } + else + { + xReturn = errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY; + } + + return xReturn; +} +/*-----------------------------------------------------------*/ + +void vCoRoutineAddToDelayedList( portTickType xTicksToDelay, xList *pxEventList ) +{ +portTickType xTimeToWake; + + /* Calculate the time to wake - this may overflow but this is + not a problem. */ + xTimeToWake = xCoRoutineTickCount + xTicksToDelay; + + /* We must remove ourselves from the ready list before adding + ourselves to the blocked list as the same list item is used for + both lists. */ + vListRemove( ( xListItem * ) &( pxCurrentCoRoutine->xGenericListItem ) ); + + /* The list item will be inserted in wake time order. */ + listSET_LIST_ITEM_VALUE( &( pxCurrentCoRoutine->xGenericListItem ), xTimeToWake ); + + if( xTimeToWake < xCoRoutineTickCount ) + { + /* Wake time has overflowed. Place this item in the + overflow list. */ + vListInsert( ( xList * ) pxOverflowDelayedCoRoutineList, ( xListItem * ) &( pxCurrentCoRoutine->xGenericListItem ) ); + } + else + { + /* The wake time has not overflowed, so we can use the + current block list. */ + vListInsert( ( xList * ) pxDelayedCoRoutineList, ( xListItem * ) &( pxCurrentCoRoutine->xGenericListItem ) ); + } + + if( pxEventList ) + { + /* Also add the co-routine to an event list. If this is done then the + function must be called with interrupts disabled. */ + vListInsert( pxEventList, &( pxCurrentCoRoutine->xEventListItem ) ); + } +} +/*-----------------------------------------------------------*/ + +static void prvCheckPendingReadyList( void ) +{ + /* Are there any co-routines waiting to get moved to the ready list? These + are co-routines that have been readied by an ISR. The ISR cannot access + the ready lists itself. */ + while( listLIST_IS_EMPTY( &xPendingReadyCoRoutineList ) == pdFALSE ) + { + corCRCB *pxUnblockedCRCB; + + /* The pending ready list can be accessed by an ISR. */ + portDISABLE_INTERRUPTS(); + { + pxUnblockedCRCB = ( corCRCB * ) listGET_OWNER_OF_HEAD_ENTRY( (&xPendingReadyCoRoutineList) ); + vListRemove( &( pxUnblockedCRCB->xEventListItem ) ); + } + portENABLE_INTERRUPTS(); + + vListRemove( &( pxUnblockedCRCB->xGenericListItem ) ); + prvAddCoRoutineToReadyQueue( pxUnblockedCRCB ); + } +} +/*-----------------------------------------------------------*/ + +static void prvCheckDelayedList( void ) +{ +corCRCB *pxCRCB; + + xPassedTicks = xTaskGetTickCount() - xLastTickCount; + while( xPassedTicks ) + { + xCoRoutineTickCount++; + xPassedTicks--; + + /* If the tick count has overflowed we need to swap the ready lists. */ + if( xCoRoutineTickCount == 0 ) + { + xList * pxTemp; + + /* Tick count has overflowed so we need to swap the delay lists. If there are + any items in pxDelayedCoRoutineList here then there is an error! */ + pxTemp = pxDelayedCoRoutineList; + pxDelayedCoRoutineList = pxOverflowDelayedCoRoutineList; + pxOverflowDelayedCoRoutineList = pxTemp; + } + + /* See if this tick has made a timeout expire. */ + while( listLIST_IS_EMPTY( pxDelayedCoRoutineList ) == pdFALSE ) + { + pxCRCB = ( corCRCB * ) listGET_OWNER_OF_HEAD_ENTRY( pxDelayedCoRoutineList ); + + if( xCoRoutineTickCount < listGET_LIST_ITEM_VALUE( &( pxCRCB->xGenericListItem ) ) ) + { + /* Timeout not yet expired. */ + break; + } + + portDISABLE_INTERRUPTS(); + { + /* The event could have occurred just before this critical + section. If this is the case then the generic list item will + have been moved to the pending ready list and the following + line is still valid. Also the pvContainer parameter will have + been set to NULL so the following lines are also valid. */ + vListRemove( &( pxCRCB->xGenericListItem ) ); + + /* Is the co-routine waiting on an event also? */ + if( pxCRCB->xEventListItem.pvContainer ) + { + vListRemove( &( pxCRCB->xEventListItem ) ); + } + } + portENABLE_INTERRUPTS(); + + prvAddCoRoutineToReadyQueue( pxCRCB ); + } + } + + xLastTickCount = xCoRoutineTickCount; +} +/*-----------------------------------------------------------*/ + +void vCoRoutineSchedule( void ) +{ + /* See if any co-routines readied by events need moving to the ready lists. */ + prvCheckPendingReadyList(); + + /* See if any delayed co-routines have timed out. */ + prvCheckDelayedList(); + + /* Find the highest priority queue that contains ready co-routines. */ + while( listLIST_IS_EMPTY( &( pxReadyCoRoutineLists[ uxTopCoRoutineReadyPriority ] ) ) ) + { + if( uxTopCoRoutineReadyPriority == 0 ) + { + /* No more co-routines to check. */ + return; + } + --uxTopCoRoutineReadyPriority; + } + + /* listGET_OWNER_OF_NEXT_ENTRY walks through the list, so the co-routines + of the same priority get an equal share of the processor time. */ + listGET_OWNER_OF_NEXT_ENTRY( pxCurrentCoRoutine, &( pxReadyCoRoutineLists[ uxTopCoRoutineReadyPriority ] ) ); + + /* Call the co-routine. */ + ( pxCurrentCoRoutine->pxCoRoutineFunction )( pxCurrentCoRoutine, pxCurrentCoRoutine->uxIndex ); + + return; +} +/*-----------------------------------------------------------*/ + +static void prvInitialiseCoRoutineLists( void ) +{ +unsigned portBASE_TYPE uxPriority; + + for( uxPriority = 0; uxPriority < configMAX_CO_ROUTINE_PRIORITIES; uxPriority++ ) + { + vListInitialise( ( xList * ) &( pxReadyCoRoutineLists[ uxPriority ] ) ); + } + + vListInitialise( ( xList * ) &xDelayedCoRoutineList1 ); + vListInitialise( ( xList * ) &xDelayedCoRoutineList2 ); + vListInitialise( ( xList * ) &xPendingReadyCoRoutineList ); + + /* Start with pxDelayedCoRoutineList using list1 and the + pxOverflowDelayedCoRoutineList using list2. */ + pxDelayedCoRoutineList = &xDelayedCoRoutineList1; + pxOverflowDelayedCoRoutineList = &xDelayedCoRoutineList2; +} +/*-----------------------------------------------------------*/ + +signed portBASE_TYPE xCoRoutineRemoveFromEventList( const xList *pxEventList ) +{ +corCRCB *pxUnblockedCRCB; +signed portBASE_TYPE xReturn; + + /* This function is called from within an interrupt. It can only access + event lists and the pending ready list. This function assumes that a + check has already been made to ensure pxEventList is not empty. */ + pxUnblockedCRCB = ( corCRCB * ) listGET_OWNER_OF_HEAD_ENTRY( pxEventList ); + vListRemove( &( pxUnblockedCRCB->xEventListItem ) ); + vListInsertEnd( ( xList * ) &( xPendingReadyCoRoutineList ), &( pxUnblockedCRCB->xEventListItem ) ); + + if( pxUnblockedCRCB->uxPriority >= pxCurrentCoRoutine->uxPriority ) + { + xReturn = pdTRUE; + } + else + { + xReturn = pdFALSE; + } + + return xReturn; +} + diff --git a/TP1_labyrinth_etu/FreeRTOS_src/list.c b/TP1_labyrinth_etu/FreeRTOS_src/list.c new file mode 100644 index 0000000000000000000000000000000000000000..c3ef2a89dd717defcc730c4d1d94a9187600db33 --- /dev/null +++ b/TP1_labyrinth_etu/FreeRTOS_src/list.c @@ -0,0 +1,197 @@ +/* + FreeRTOS V7.0.1 - Copyright (C) 2011 Real Time Engineers Ltd. + + + FreeRTOS supports many tools and architectures. V7.0.0 is sponsored by: + Atollic AB - Atollic provides professional embedded systems development + tools for C/C++ development, code analysis and test automation. + See http://www.atollic.com + + + *************************************************************************** + * * + * FreeRTOS tutorial books are available in pdf and paperback. * + * Complete, revised, and edited pdf reference manuals are also * + * available. * + * * + * Purchasing FreeRTOS documentation will not only help you, by * + * ensuring you get running as quickly as possible and with an * + * in-depth knowledge of how to use FreeRTOS, it will also help * + * the FreeRTOS project to continue with its mission of providing * + * professional grade, cross platform, de facto standard solutions * + * for microcontrollers - completely free of charge! * + * * + * >>> See http://www.FreeRTOS.org/Documentation for details. <<< * + * * + * Thank you for using FreeRTOS, and thank you for your support! * + * * + *************************************************************************** + + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation AND MODIFIED BY the FreeRTOS exception. + >>>NOTE<<< The modification to the GPL is included to allow you to + distribute a combined work that includes FreeRTOS without being obliged to + provide the source code for proprietary components outside of the FreeRTOS + kernel. FreeRTOS is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + more details. You should have received a copy of the GNU General Public + License and the FreeRTOS license exception along with FreeRTOS; if not it + can be viewed here: http://www.freertos.org/a00114.html and also obtained + by writing to Richard Barry, contact details for whom are available on the + FreeRTOS WEB site. + + 1 tab == 4 spaces! + + http://www.FreeRTOS.org - Documentation, latest information, license and + contact details. + + http://www.SafeRTOS.com - A version that is certified for use in safety + critical systems. + + http://www.OpenRTOS.com - Commercial support, development, porting, + licensing and training services. +*/ + + +#include <stdlib.h> +#include "FreeRTOS.h" +#include "list.h" + +/*----------------------------------------------------------- + * PUBLIC LIST API documented in list.h + *----------------------------------------------------------*/ + +void vListInitialise( xList *pxList ) +{ + /* The list structure contains a list item which is used to mark the + end of the list. To initialise the list the list end is inserted + as the only list entry. */ + pxList->pxIndex = ( xListItem * ) &( pxList->xListEnd ); + + /* The list end value is the highest possible value in the list to + ensure it remains at the end of the list. */ + pxList->xListEnd.xItemValue = portMAX_DELAY; + + /* The list end next and previous pointers point to itself so we know + when the list is empty. */ + pxList->xListEnd.pxNext = ( xListItem * ) &( pxList->xListEnd ); + pxList->xListEnd.pxPrevious = ( xListItem * ) &( pxList->xListEnd ); + + pxList->uxNumberOfItems = ( unsigned portBASE_TYPE ) 0U; +} +/*-----------------------------------------------------------*/ + +void vListInitialiseItem( xListItem *pxItem ) +{ + /* Make sure the list item is not recorded as being on a list. */ + pxItem->pvContainer = NULL; +} +/*-----------------------------------------------------------*/ + +void vListInsertEnd( xList *pxList, xListItem *pxNewListItem ) +{ +volatile xListItem * pxIndex; + + /* Insert a new list item into pxList, but rather than sort the list, + makes the new list item the last item to be removed by a call to + pvListGetOwnerOfNextEntry. This means it has to be the item pointed to by + the pxIndex member. */ + pxIndex = pxList->pxIndex; + + pxNewListItem->pxNext = pxIndex->pxNext; + pxNewListItem->pxPrevious = pxList->pxIndex; + pxIndex->pxNext->pxPrevious = ( volatile xListItem * ) pxNewListItem; + pxIndex->pxNext = ( volatile xListItem * ) pxNewListItem; + pxList->pxIndex = ( volatile xListItem * ) pxNewListItem; + + /* Remember which list the item is in. */ + pxNewListItem->pvContainer = ( void * ) pxList; + + ( pxList->uxNumberOfItems )++; +} +/*-----------------------------------------------------------*/ + +void vListInsert( xList *pxList, xListItem *pxNewListItem ) +{ +volatile xListItem *pxIterator; +portTickType xValueOfInsertion; + + /* Insert the new list item into the list, sorted in ulListItem order. */ + xValueOfInsertion = pxNewListItem->xItemValue; + + /* If the list already contains a list item with the same item value then + the new list item should be placed after it. This ensures that TCB's which + are stored in ready lists (all of which have the same ulListItem value) + get an equal share of the CPU. However, if the xItemValue is the same as + the back marker the iteration loop below will not end. This means we need + to guard against this by checking the value first and modifying the + algorithm slightly if necessary. */ + if( xValueOfInsertion == portMAX_DELAY ) + { + pxIterator = pxList->xListEnd.pxPrevious; + } + else + { + /* *** NOTE *********************************************************** + If you find your application is crashing here then likely causes are: + 1) Stack overflow - + see http://www.freertos.org/Stacks-and-stack-overflow-checking.html + 2) Incorrect interrupt priority assignment, especially on Cortex-M3 + parts where numerically high priority values denote low actual + interrupt priories, which can seem counter intuitive. See + configMAX_SYSCALL_INTERRUPT_PRIORITY on http://www.freertos.org/a00110.html + 3) Calling an API function from within a critical section or when + the scheduler is suspended. + 4) Using a queue or semaphore before it has been initialised or + before the scheduler has been started (are interrupts firing + before vTaskStartScheduler() has been called?). + See http://www.freertos.org/FAQHelp.html for more tips. + **********************************************************************/ + + for( pxIterator = ( xListItem * ) &( pxList->xListEnd ); pxIterator->pxNext->xItemValue <= xValueOfInsertion; pxIterator = pxIterator->pxNext ) + { + /* There is nothing to do here, we are just iterating to the + wanted insertion position. */ + } + } + + pxNewListItem->pxNext = pxIterator->pxNext; + pxNewListItem->pxNext->pxPrevious = ( volatile xListItem * ) pxNewListItem; + pxNewListItem->pxPrevious = pxIterator; + pxIterator->pxNext = ( volatile xListItem * ) pxNewListItem; + + /* Remember which list the item is in. This allows fast removal of the + item later. */ + pxNewListItem->pvContainer = ( void * ) pxList; + + ( pxList->uxNumberOfItems )++; +} +/*-----------------------------------------------------------*/ + +void vListRemove( xListItem *pxItemToRemove ) +{ +xList * pxList; + + pxItemToRemove->pxNext->pxPrevious = pxItemToRemove->pxPrevious; + pxItemToRemove->pxPrevious->pxNext = pxItemToRemove->pxNext; + + /* The list item knows which list it is in. Obtain the list from the list + item. */ + pxList = ( xList * ) pxItemToRemove->pvContainer; + + /* Make sure the index is left pointing to a valid item. */ + if( pxList->pxIndex == pxItemToRemove ) + { + pxList->pxIndex = pxItemToRemove->pxPrevious; + } + + pxItemToRemove->pvContainer = NULL; + ( pxList->uxNumberOfItems )--; +} +/*-----------------------------------------------------------*/ + diff --git a/TP1_labyrinth_etu/FreeRTOS_src/queue.c b/TP1_labyrinth_etu/FreeRTOS_src/queue.c new file mode 100644 index 0000000000000000000000000000000000000000..2ae7c7030d709346aaca69cd83296bcd0b1ed95f --- /dev/null +++ b/TP1_labyrinth_etu/FreeRTOS_src/queue.c @@ -0,0 +1,1539 @@ +/* + FreeRTOS V7.0.1 - Copyright (C) 2011 Real Time Engineers Ltd. + + + FreeRTOS supports many tools and architectures. V7.0.0 is sponsored by: + Atollic AB - Atollic provides professional embedded systems development + tools for C/C++ development, code analysis and test automation. + See http://www.atollic.com + + + *************************************************************************** + * * + * FreeRTOS tutorial books are available in pdf and paperback. * + * Complete, revised, and edited pdf reference manuals are also * + * available. * + * * + * Purchasing FreeRTOS documentation will not only help you, by * + * ensuring you get running as quickly as possible and with an * + * in-depth knowledge of how to use FreeRTOS, it will also help * + * the FreeRTOS project to continue with its mission of providing * + * professional grade, cross platform, de facto standard solutions * + * for microcontrollers - completely free of charge! * + * * + * >>> See http://www.FreeRTOS.org/Documentation for details. <<< * + * * + * Thank you for using FreeRTOS, and thank you for your support! * + * * + *************************************************************************** + + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation AND MODIFIED BY the FreeRTOS exception. + >>>NOTE<<< The modification to the GPL is included to allow you to + distribute a combined work that includes FreeRTOS without being obliged to + provide the source code for proprietary components outside of the FreeRTOS + kernel. FreeRTOS is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + more details. You should have received a copy of the GNU General Public + License and the FreeRTOS license exception along with FreeRTOS; if not it + can be viewed here: http://www.freertos.org/a00114.html and also obtained + by writing to Richard Barry, contact details for whom are available on the + FreeRTOS WEB site. + + 1 tab == 4 spaces! + + http://www.FreeRTOS.org - Documentation, latest information, license and + contact details. + + http://www.SafeRTOS.com - A version that is certified for use in safety + critical systems. + + http://www.OpenRTOS.com - Commercial support, development, porting, + licensing and training services. +*/ + +#include <stdlib.h> +#include <string.h> + +/* Defining MPU_WRAPPERS_INCLUDED_FROM_API_FILE prevents task.h from redefining +all the API functions to use the MPU wrappers. That should only be done when +task.h is included from an application file. */ +#define MPU_WRAPPERS_INCLUDED_FROM_API_FILE + +#include "FreeRTOS.h" +#include "task.h" +#include "croutine.h" + +#undef MPU_WRAPPERS_INCLUDED_FROM_API_FILE + +/*----------------------------------------------------------- + * PUBLIC LIST API documented in list.h + *----------------------------------------------------------*/ + +/* Constants used with the cRxLock and cTxLock structure members. */ +#define queueUNLOCKED ( ( signed portBASE_TYPE ) -1 ) +#define queueLOCKED_UNMODIFIED ( ( signed portBASE_TYPE ) 0 ) + +#define queueERRONEOUS_UNBLOCK ( -1 ) + +/* For internal use only. */ +#define queueSEND_TO_BACK ( 0 ) +#define queueSEND_TO_FRONT ( 1 ) + +/* Effectively make a union out of the xQUEUE structure. */ +#define pxMutexHolder pcTail +#define uxQueueType pcHead +#define uxRecursiveCallCount pcReadFrom +#define queueQUEUE_IS_MUTEX NULL + +/* Semaphores do not actually store or copy data, so have an items size of +zero. */ +#define queueSEMAPHORE_QUEUE_ITEM_LENGTH ( 0 ) +#define queueDONT_BLOCK ( ( portTickType ) 0 ) +#define queueMUTEX_GIVE_BLOCK_TIME ( ( portTickType ) 0 ) + +/* + * Definition of the queue used by the scheduler. + * Items are queued by copy, not reference. + */ +typedef struct QueueDefinition +{ + signed char *pcHead; /*< Points to the beginning of the queue storage area. */ + signed char *pcTail; /*< Points to the byte at the end of the queue storage area. Once more byte is allocated than necessary to store the queue items, this is used as a marker. */ + + signed char *pcWriteTo; /*< Points to the free next place in the storage area. */ + signed char *pcReadFrom; /*< Points to the last place that a queued item was read from. */ + + xList xTasksWaitingToSend; /*< List of tasks that are blocked waiting to post onto this queue. Stored in priority order. */ + xList xTasksWaitingToReceive; /*< List of tasks that are blocked waiting to read from this queue. Stored in priority order. */ + + volatile unsigned portBASE_TYPE uxMessagesWaiting;/*< The number of items currently in the queue. */ + unsigned portBASE_TYPE uxLength; /*< The length of the queue defined as the number of items it will hold, not the number of bytes. */ + unsigned portBASE_TYPE uxItemSize; /*< The size of each items that the queue will hold. */ + + signed portBASE_TYPE xRxLock; /*< Stores the number of items received from the queue (removed from the queue) while the queue was locked. Set to queueUNLOCKED when the queue is not locked. */ + signed portBASE_TYPE xTxLock; /*< Stores the number of items transmitted to the queue (added to the queue) while the queue was locked. Set to queueUNLOCKED when the queue is not locked. */ + +} xQUEUE; +/*-----------------------------------------------------------*/ + +/* + * Inside this file xQueueHandle is a pointer to a xQUEUE structure. + * To keep the definition private the API header file defines it as a + * pointer to void. + */ +typedef xQUEUE * xQueueHandle; + +/* + * Prototypes for public functions are included here so we don't have to + * include the API header file (as it defines xQueueHandle differently). These + * functions are documented in the API header file. + */ +xQueueHandle xQueueCreate( unsigned portBASE_TYPE uxQueueLength, unsigned portBASE_TYPE uxItemSize ) PRIVILEGED_FUNCTION; +signed portBASE_TYPE xQueueGenericSend( xQueueHandle xQueue, const void * const pvItemToQueue, portTickType xTicksToWait, portBASE_TYPE xCopyPosition ) PRIVILEGED_FUNCTION; +unsigned portBASE_TYPE uxQueueMessagesWaiting( const xQueueHandle pxQueue ) PRIVILEGED_FUNCTION; +void vQueueDelete( xQueueHandle xQueue ) PRIVILEGED_FUNCTION; +signed portBASE_TYPE xQueueGenericSendFromISR( xQueueHandle pxQueue, const void * const pvItemToQueue, signed portBASE_TYPE *pxHigherPriorityTaskWoken, portBASE_TYPE xCopyPosition ) PRIVILEGED_FUNCTION; +signed portBASE_TYPE xQueueGenericReceive( xQueueHandle pxQueue, void * const pvBuffer, portTickType xTicksToWait, portBASE_TYPE xJustPeeking ) PRIVILEGED_FUNCTION; +signed portBASE_TYPE xQueueReceiveFromISR( xQueueHandle pxQueue, void * const pvBuffer, signed portBASE_TYPE *pxTaskWoken ) PRIVILEGED_FUNCTION; +xQueueHandle xQueueCreateMutex( void ) PRIVILEGED_FUNCTION; +xQueueHandle xQueueCreateCountingSemaphore( unsigned portBASE_TYPE uxCountValue, unsigned portBASE_TYPE uxInitialCount ) PRIVILEGED_FUNCTION; +portBASE_TYPE xQueueTakeMutexRecursive( xQueueHandle xMutex, portTickType xBlockTime ) PRIVILEGED_FUNCTION; +portBASE_TYPE xQueueGiveMutexRecursive( xQueueHandle xMutex ) PRIVILEGED_FUNCTION; +signed portBASE_TYPE xQueueAltGenericSend( xQueueHandle pxQueue, const void * const pvItemToQueue, portTickType xTicksToWait, portBASE_TYPE xCopyPosition ) PRIVILEGED_FUNCTION; +signed portBASE_TYPE xQueueAltGenericReceive( xQueueHandle pxQueue, void * const pvBuffer, portTickType xTicksToWait, portBASE_TYPE xJustPeeking ) PRIVILEGED_FUNCTION; +signed portBASE_TYPE xQueueIsQueueEmptyFromISR( const xQueueHandle pxQueue ) PRIVILEGED_FUNCTION; +signed portBASE_TYPE xQueueIsQueueFullFromISR( const xQueueHandle pxQueue ) PRIVILEGED_FUNCTION; +unsigned portBASE_TYPE uxQueueMessagesWaitingFromISR( const xQueueHandle pxQueue ) PRIVILEGED_FUNCTION; +void vQueueWaitForMessageRestricted( xQueueHandle pxQueue, portTickType xTicksToWait ) PRIVILEGED_FUNCTION; + +/* + * Co-routine queue functions differ from task queue functions. Co-routines are + * an optional component. + */ +#if configUSE_CO_ROUTINES == 1 + signed portBASE_TYPE xQueueCRSendFromISR( xQueueHandle pxQueue, const void *pvItemToQueue, signed portBASE_TYPE xCoRoutinePreviouslyWoken ) PRIVILEGED_FUNCTION; + signed portBASE_TYPE xQueueCRReceiveFromISR( xQueueHandle pxQueue, void *pvBuffer, signed portBASE_TYPE *pxTaskWoken ) PRIVILEGED_FUNCTION; + signed portBASE_TYPE xQueueCRSend( xQueueHandle pxQueue, const void *pvItemToQueue, portTickType xTicksToWait ) PRIVILEGED_FUNCTION; + signed portBASE_TYPE xQueueCRReceive( xQueueHandle pxQueue, void *pvBuffer, portTickType xTicksToWait ) PRIVILEGED_FUNCTION; +#endif + +/* + * The queue registry is just a means for kernel aware debuggers to locate + * queue structures. It has no other purpose so is an optional component. + */ +#if configQUEUE_REGISTRY_SIZE > 0 + + /* The type stored within the queue registry array. This allows a name + to be assigned to each queue making kernel aware debugging a little + more user friendly. */ + typedef struct QUEUE_REGISTRY_ITEM + { + signed char *pcQueueName; + xQueueHandle xHandle; + } xQueueRegistryItem; + + /* The queue registry is simply an array of xQueueRegistryItem structures. + The pcQueueName member of a structure being NULL is indicative of the + array position being vacant. */ + xQueueRegistryItem xQueueRegistry[ configQUEUE_REGISTRY_SIZE ]; + + /* Removes a queue from the registry by simply setting the pcQueueName + member to NULL. */ + static void vQueueUnregisterQueue( xQueueHandle xQueue ) PRIVILEGED_FUNCTION; + void vQueueAddToRegistry( xQueueHandle xQueue, signed char *pcQueueName ) PRIVILEGED_FUNCTION; +#endif + +/* + * Unlocks a queue locked by a call to prvLockQueue. Locking a queue does not + * prevent an ISR from adding or removing items to the queue, but does prevent + * an ISR from removing tasks from the queue event lists. If an ISR finds a + * queue is locked it will instead increment the appropriate queue lock count + * to indicate that a task may require unblocking. When the queue in unlocked + * these lock counts are inspected, and the appropriate action taken. + */ +static void prvUnlockQueue( xQueueHandle pxQueue ) PRIVILEGED_FUNCTION; + +/* + * Uses a critical section to determine if there is any data in a queue. + * + * @return pdTRUE if the queue contains no items, otherwise pdFALSE. + */ +static signed portBASE_TYPE prvIsQueueEmpty( const xQueueHandle pxQueue ) PRIVILEGED_FUNCTION; + +/* + * Uses a critical section to determine if there is any space in a queue. + * + * @return pdTRUE if there is no space, otherwise pdFALSE; + */ +static signed portBASE_TYPE prvIsQueueFull( const xQueueHandle pxQueue ) PRIVILEGED_FUNCTION; + +/* + * Copies an item into the queue, either at the front of the queue or the + * back of the queue. + */ +static void prvCopyDataToQueue( xQUEUE *pxQueue, const void *pvItemToQueue, portBASE_TYPE xPosition ) PRIVILEGED_FUNCTION; + +/* + * Copies an item out of a queue. + */ +static void prvCopyDataFromQueue( xQUEUE * const pxQueue, const void *pvBuffer ) PRIVILEGED_FUNCTION; +/*-----------------------------------------------------------*/ + +/* + * Macro to mark a queue as locked. Locking a queue prevents an ISR from + * accessing the queue event lists. + */ +#define prvLockQueue( pxQueue ) \ + taskENTER_CRITICAL(); \ + { \ + if( ( pxQueue )->xRxLock == queueUNLOCKED ) \ + { \ + ( pxQueue )->xRxLock = queueLOCKED_UNMODIFIED; \ + } \ + if( ( pxQueue )->xTxLock == queueUNLOCKED ) \ + { \ + ( pxQueue )->xTxLock = queueLOCKED_UNMODIFIED; \ + } \ + } \ + taskEXIT_CRITICAL() +/*-----------------------------------------------------------*/ + + +/*----------------------------------------------------------- + * PUBLIC QUEUE MANAGEMENT API documented in queue.h + *----------------------------------------------------------*/ + +xQueueHandle xQueueCreate( unsigned portBASE_TYPE uxQueueLength, unsigned portBASE_TYPE uxItemSize ) +{ +xQUEUE *pxNewQueue; +size_t xQueueSizeInBytes; +xQueueHandle xReturn = NULL; + + /* Allocate the new queue structure. */ + if( uxQueueLength > ( unsigned portBASE_TYPE ) 0 ) + { + pxNewQueue = ( xQUEUE * ) pvPortMalloc( sizeof( xQUEUE ) ); + if( pxNewQueue != NULL ) + { + /* Create the list of pointers to queue items. The queue is one byte + longer than asked for to make wrap checking easier/faster. */ + xQueueSizeInBytes = ( size_t ) ( uxQueueLength * uxItemSize ) + ( size_t ) 1; + + pxNewQueue->pcHead = ( signed char * ) pvPortMalloc( xQueueSizeInBytes ); + if( pxNewQueue->pcHead != NULL ) + { + /* Initialise the queue members as described above where the + queue type is defined. */ + pxNewQueue->pcTail = pxNewQueue->pcHead + ( uxQueueLength * uxItemSize ); + pxNewQueue->uxMessagesWaiting = ( unsigned portBASE_TYPE ) 0U; + pxNewQueue->pcWriteTo = pxNewQueue->pcHead; + pxNewQueue->pcReadFrom = pxNewQueue->pcHead + ( ( uxQueueLength - ( unsigned portBASE_TYPE ) 1U ) * uxItemSize ); + pxNewQueue->uxLength = uxQueueLength; + pxNewQueue->uxItemSize = uxItemSize; + pxNewQueue->xRxLock = queueUNLOCKED; + pxNewQueue->xTxLock = queueUNLOCKED; + + /* Likewise ensure the event queues start with the correct state. */ + vListInitialise( &( pxNewQueue->xTasksWaitingToSend ) ); + vListInitialise( &( pxNewQueue->xTasksWaitingToReceive ) ); + + traceQUEUE_CREATE( pxNewQueue ); + xReturn = pxNewQueue; + } + else + { + traceQUEUE_CREATE_FAILED(); + vPortFree( pxNewQueue ); + } + } + } + + configASSERT( xReturn ); + + return xReturn; +} +/*-----------------------------------------------------------*/ + +#if ( configUSE_MUTEXES == 1 ) + + xQueueHandle xQueueCreateMutex( void ) + { + xQUEUE *pxNewQueue; + + /* Allocate the new queue structure. */ + pxNewQueue = ( xQUEUE * ) pvPortMalloc( sizeof( xQUEUE ) ); + if( pxNewQueue != NULL ) + { + /* Information required for priority inheritance. */ + pxNewQueue->pxMutexHolder = NULL; + pxNewQueue->uxQueueType = queueQUEUE_IS_MUTEX; + + /* Queues used as a mutex no data is actually copied into or out + of the queue. */ + pxNewQueue->pcWriteTo = NULL; + pxNewQueue->pcReadFrom = NULL; + + /* Each mutex has a length of 1 (like a binary semaphore) and + an item size of 0 as nothing is actually copied into or out + of the mutex. */ + pxNewQueue->uxMessagesWaiting = ( unsigned portBASE_TYPE ) 0U; + pxNewQueue->uxLength = ( unsigned portBASE_TYPE ) 1U; + pxNewQueue->uxItemSize = ( unsigned portBASE_TYPE ) 0U; + pxNewQueue->xRxLock = queueUNLOCKED; + pxNewQueue->xTxLock = queueUNLOCKED; + + /* Ensure the event queues start with the correct state. */ + vListInitialise( &( pxNewQueue->xTasksWaitingToSend ) ); + vListInitialise( &( pxNewQueue->xTasksWaitingToReceive ) ); + + /* Start with the semaphore in the expected state. */ + xQueueGenericSend( pxNewQueue, NULL, ( portTickType ) 0U, queueSEND_TO_BACK ); + + traceCREATE_MUTEX( pxNewQueue ); + } + else + { + traceCREATE_MUTEX_FAILED(); + } + + configASSERT( pxNewQueue ); + return pxNewQueue; + } + +#endif /* configUSE_MUTEXES */ +/*-----------------------------------------------------------*/ + +#if configUSE_RECURSIVE_MUTEXES == 1 + + portBASE_TYPE xQueueGiveMutexRecursive( xQueueHandle pxMutex ) + { + portBASE_TYPE xReturn; + + configASSERT( pxMutex ); + + /* If this is the task that holds the mutex then pxMutexHolder will not + change outside of this task. If this task does not hold the mutex then + pxMutexHolder can never coincidentally equal the tasks handle, and as + this is the only condition we are interested in it does not matter if + pxMutexHolder is accessed simultaneously by another task. Therefore no + mutual exclusion is required to test the pxMutexHolder variable. */ + if( pxMutex->pxMutexHolder == xTaskGetCurrentTaskHandle() ) + { + traceGIVE_MUTEX_RECURSIVE( pxMutex ); + + /* uxRecursiveCallCount cannot be zero if pxMutexHolder is equal to + the task handle, therefore no underflow check is required. Also, + uxRecursiveCallCount is only modified by the mutex holder, and as + there can only be one, no mutual exclusion is required to modify the + uxRecursiveCallCount member. */ + ( pxMutex->uxRecursiveCallCount )--; + + /* Have we unwound the call count? */ + if( pxMutex->uxRecursiveCallCount == 0 ) + { + /* Return the mutex. This will automatically unblock any other + task that might be waiting to access the mutex. */ + xQueueGenericSend( pxMutex, NULL, queueMUTEX_GIVE_BLOCK_TIME, queueSEND_TO_BACK ); + } + + xReturn = pdPASS; + } + else + { + /* We cannot give the mutex because we are not the holder. */ + xReturn = pdFAIL; + + traceGIVE_MUTEX_RECURSIVE_FAILED( pxMutex ); + } + + return xReturn; + } + +#endif /* configUSE_RECURSIVE_MUTEXES */ +/*-----------------------------------------------------------*/ + +#if configUSE_RECURSIVE_MUTEXES == 1 + + portBASE_TYPE xQueueTakeMutexRecursive( xQueueHandle pxMutex, portTickType xBlockTime ) + { + portBASE_TYPE xReturn; + + configASSERT( pxMutex ); + + /* Comments regarding mutual exclusion as per those within + xQueueGiveMutexRecursive(). */ + + traceTAKE_MUTEX_RECURSIVE( pxMutex ); + + if( pxMutex->pxMutexHolder == xTaskGetCurrentTaskHandle() ) + { + ( pxMutex->uxRecursiveCallCount )++; + xReturn = pdPASS; + } + else + { + xReturn = xQueueGenericReceive( pxMutex, NULL, xBlockTime, pdFALSE ); + + /* pdPASS will only be returned if we successfully obtained the mutex, + we may have blocked to reach here. */ + if( xReturn == pdPASS ) + { + ( pxMutex->uxRecursiveCallCount )++; + } + else + { + traceTAKE_MUTEX_RECURSIVE_FAILED( pxMutex ); + } + } + + return xReturn; + } + +#endif /* configUSE_RECURSIVE_MUTEXES */ +/*-----------------------------------------------------------*/ + +#if configUSE_COUNTING_SEMAPHORES == 1 + + xQueueHandle xQueueCreateCountingSemaphore( unsigned portBASE_TYPE uxCountValue, unsigned portBASE_TYPE uxInitialCount ) + { + xQueueHandle pxHandle; + + pxHandle = xQueueCreate( ( unsigned portBASE_TYPE ) uxCountValue, queueSEMAPHORE_QUEUE_ITEM_LENGTH ); + + if( pxHandle != NULL ) + { + pxHandle->uxMessagesWaiting = uxInitialCount; + + traceCREATE_COUNTING_SEMAPHORE(); + } + else + { + traceCREATE_COUNTING_SEMAPHORE_FAILED(); + } + + configASSERT( pxHandle ); + return pxHandle; + } + +#endif /* configUSE_COUNTING_SEMAPHORES */ +/*-----------------------------------------------------------*/ + +signed portBASE_TYPE xQueueGenericSend( xQueueHandle pxQueue, const void * const pvItemToQueue, portTickType xTicksToWait, portBASE_TYPE xCopyPosition ) +{ +signed portBASE_TYPE xEntryTimeSet = pdFALSE; +xTimeOutType xTimeOut; + + configASSERT( pxQueue ); + configASSERT( !( ( pvItemToQueue == NULL ) && ( pxQueue->uxItemSize != ( unsigned portBASE_TYPE ) 0U ) ) ); + + /* This function relaxes the coding standard somewhat to allow return + statements within the function itself. This is done in the interest + of execution time efficiency. */ + for( ;; ) + { + taskENTER_CRITICAL(); + { + /* Is there room on the queue now? To be running we must be + the highest priority task wanting to access the queue. */ + if( pxQueue->uxMessagesWaiting < pxQueue->uxLength ) + { + traceQUEUE_SEND( pxQueue ); + prvCopyDataToQueue( pxQueue, pvItemToQueue, xCopyPosition ); + + /* If there was a task waiting for data to arrive on the + queue then unblock it now. */ + if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToReceive ) ) == pdFALSE ) + { + if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToReceive ) ) == pdTRUE ) + { + /* The unblocked task has a priority higher than + our own so yield immediately. Yes it is ok to do + this from within the critical section - the kernel + takes care of that. */ + portYIELD_WITHIN_API(); + } + } + + taskEXIT_CRITICAL(); + + /* Return to the original privilege level before exiting the + function. */ + return pdPASS; + } + else + { + if( xTicksToWait == ( portTickType ) 0 ) + { + /* The queue was full and no block time is specified (or + the block time has expired) so leave now. */ + taskEXIT_CRITICAL(); + + /* Return to the original privilege level before exiting + the function. */ + traceQUEUE_SEND_FAILED( pxQueue ); + return errQUEUE_FULL; + } + else if( xEntryTimeSet == pdFALSE ) + { + /* The queue was full and a block time was specified so + configure the timeout structure. */ + vTaskSetTimeOutState( &xTimeOut ); + xEntryTimeSet = pdTRUE; + } + } + } + taskEXIT_CRITICAL(); + + /* Interrupts and other tasks can send to and receive from the queue + now the critical section has been exited. */ + + vTaskSuspendAll(); + prvLockQueue( pxQueue ); + + /* Update the timeout state to see if it has expired yet. */ + if( xTaskCheckForTimeOut( &xTimeOut, &xTicksToWait ) == pdFALSE ) + { + if( prvIsQueueFull( pxQueue ) ) + { + traceBLOCKING_ON_QUEUE_SEND( pxQueue ); + vTaskPlaceOnEventList( &( pxQueue->xTasksWaitingToSend ), xTicksToWait ); + + /* Unlocking the queue means queue events can effect the + event list. It is possible that interrupts occurring now + remove this task from the event list again - but as the + scheduler is suspended the task will go onto the pending + ready last instead of the actual ready list. */ + prvUnlockQueue( pxQueue ); + + /* Resuming the scheduler will move tasks from the pending + ready list into the ready list - so it is feasible that this + task is already in a ready list before it yields - in which + case the yield will not cause a context switch unless there + is also a higher priority task in the pending ready list. */ + if( !xTaskResumeAll() ) + { + portYIELD_WITHIN_API(); + } + } + else + { + /* Try again. */ + prvUnlockQueue( pxQueue ); + ( void ) xTaskResumeAll(); + } + } + else + { + /* The timeout has expired. */ + prvUnlockQueue( pxQueue ); + ( void ) xTaskResumeAll(); + + /* Return to the original privilege level before exiting the + function. */ + traceQUEUE_SEND_FAILED( pxQueue ); + return errQUEUE_FULL; + } + } +} +/*-----------------------------------------------------------*/ + +#if configUSE_ALTERNATIVE_API == 1 + + signed portBASE_TYPE xQueueAltGenericSend( xQueueHandle pxQueue, const void * const pvItemToQueue, portTickType xTicksToWait, portBASE_TYPE xCopyPosition ) + { + signed portBASE_TYPE xEntryTimeSet = pdFALSE; + xTimeOutType xTimeOut; + + configASSERT( pxQueue ); + configASSERT( !( ( pvItemToQueue == NULL ) && ( pxQueue->uxItemSize != ( unsigned portBASE_TYPE ) 0U ) ) ); + + for( ;; ) + { + taskENTER_CRITICAL(); + { + /* Is there room on the queue now? To be running we must be + the highest priority task wanting to access the queue. */ + if( pxQueue->uxMessagesWaiting < pxQueue->uxLength ) + { + traceQUEUE_SEND( pxQueue ); + prvCopyDataToQueue( pxQueue, pvItemToQueue, xCopyPosition ); + + /* If there was a task waiting for data to arrive on the + queue then unblock it now. */ + if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToReceive ) ) == pdFALSE ) + { + if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToReceive ) ) == pdTRUE ) + { + /* The unblocked task has a priority higher than + our own so yield immediately. */ + portYIELD_WITHIN_API(); + } + } + + taskEXIT_CRITICAL(); + return pdPASS; + } + else + { + if( xTicksToWait == ( portTickType ) 0 ) + { + taskEXIT_CRITICAL(); + return errQUEUE_FULL; + } + else if( xEntryTimeSet == pdFALSE ) + { + vTaskSetTimeOutState( &xTimeOut ); + xEntryTimeSet = pdTRUE; + } + } + } + taskEXIT_CRITICAL(); + + taskENTER_CRITICAL(); + { + if( xTaskCheckForTimeOut( &xTimeOut, &xTicksToWait ) == pdFALSE ) + { + if( prvIsQueueFull( pxQueue ) ) + { + traceBLOCKING_ON_QUEUE_SEND( pxQueue ); + vTaskPlaceOnEventList( &( pxQueue->xTasksWaitingToSend ), xTicksToWait ); + portYIELD_WITHIN_API(); + } + } + else + { + taskEXIT_CRITICAL(); + traceQUEUE_SEND_FAILED( pxQueue ); + return errQUEUE_FULL; + } + } + taskEXIT_CRITICAL(); + } + } + +#endif /* configUSE_ALTERNATIVE_API */ +/*-----------------------------------------------------------*/ + +#if configUSE_ALTERNATIVE_API == 1 + + signed portBASE_TYPE xQueueAltGenericReceive( xQueueHandle pxQueue, void * const pvBuffer, portTickType xTicksToWait, portBASE_TYPE xJustPeeking ) + { + signed portBASE_TYPE xEntryTimeSet = pdFALSE; + xTimeOutType xTimeOut; + signed char *pcOriginalReadPosition; + + configASSERT( pxQueue ); + configASSERT( !( ( pvBuffer == NULL ) && ( pxQueue->uxItemSize != ( unsigned portBASE_TYPE ) 0U ) ) ); + + for( ;; ) + { + taskENTER_CRITICAL(); + { + if( pxQueue->uxMessagesWaiting > ( unsigned portBASE_TYPE ) 0 ) + { + /* Remember our read position in case we are just peeking. */ + pcOriginalReadPosition = pxQueue->pcReadFrom; + + prvCopyDataFromQueue( pxQueue, pvBuffer ); + + if( xJustPeeking == pdFALSE ) + { + traceQUEUE_RECEIVE( pxQueue ); + + /* We are actually removing data. */ + --( pxQueue->uxMessagesWaiting ); + + #if ( configUSE_MUTEXES == 1 ) + { + if( pxQueue->uxQueueType == queueQUEUE_IS_MUTEX ) + { + /* Record the information required to implement + priority inheritance should it become necessary. */ + pxQueue->pxMutexHolder = xTaskGetCurrentTaskHandle(); + } + } + #endif + + if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToSend ) ) == pdFALSE ) + { + if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToSend ) ) == pdTRUE ) + { + portYIELD_WITHIN_API(); + } + } + } + else + { + traceQUEUE_PEEK( pxQueue ); + + /* We are not removing the data, so reset our read + pointer. */ + pxQueue->pcReadFrom = pcOriginalReadPosition; + + /* The data is being left in the queue, so see if there are + any other tasks waiting for the data. */ + if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToReceive ) ) == pdFALSE ) + { + /* Tasks that are removed from the event list will get added to + the pending ready list as the scheduler is still suspended. */ + if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToReceive ) ) != pdFALSE ) + { + /* The task waiting has a higher priority than this task. */ + portYIELD_WITHIN_API(); + } + } + + } + + taskEXIT_CRITICAL(); + return pdPASS; + } + else + { + if( xTicksToWait == ( portTickType ) 0 ) + { + taskEXIT_CRITICAL(); + traceQUEUE_RECEIVE_FAILED( pxQueue ); + return errQUEUE_EMPTY; + } + else if( xEntryTimeSet == pdFALSE ) + { + vTaskSetTimeOutState( &xTimeOut ); + xEntryTimeSet = pdTRUE; + } + } + } + taskEXIT_CRITICAL(); + + taskENTER_CRITICAL(); + { + if( xTaskCheckForTimeOut( &xTimeOut, &xTicksToWait ) == pdFALSE ) + { + if( prvIsQueueEmpty( pxQueue ) ) + { + traceBLOCKING_ON_QUEUE_RECEIVE( pxQueue ); + + #if ( configUSE_MUTEXES == 1 ) + { + if( pxQueue->uxQueueType == queueQUEUE_IS_MUTEX ) + { + portENTER_CRITICAL(); + vTaskPriorityInherit( ( void * ) pxQueue->pxMutexHolder ); + portEXIT_CRITICAL(); + } + } + #endif + + vTaskPlaceOnEventList( &( pxQueue->xTasksWaitingToReceive ), xTicksToWait ); + portYIELD_WITHIN_API(); + } + } + else + { + taskEXIT_CRITICAL(); + traceQUEUE_RECEIVE_FAILED( pxQueue ); + return errQUEUE_EMPTY; + } + } + taskEXIT_CRITICAL(); + } + } + + +#endif /* configUSE_ALTERNATIVE_API */ +/*-----------------------------------------------------------*/ + +signed portBASE_TYPE xQueueGenericSendFromISR( xQueueHandle pxQueue, const void * const pvItemToQueue, signed portBASE_TYPE *pxHigherPriorityTaskWoken, portBASE_TYPE xCopyPosition ) +{ +signed portBASE_TYPE xReturn; +unsigned portBASE_TYPE uxSavedInterruptStatus; + + configASSERT( pxQueue ); + configASSERT( pxHigherPriorityTaskWoken ); + configASSERT( !( ( pvItemToQueue == NULL ) && ( pxQueue->uxItemSize != ( unsigned portBASE_TYPE ) 0U ) ) ); + + /* Similar to xQueueGenericSend, except we don't block if there is no room + in the queue. Also we don't directly wake a task that was blocked on a + queue read, instead we return a flag to say whether a context switch is + required or not (i.e. has a task with a higher priority than us been woken + by this post). */ + uxSavedInterruptStatus = portSET_INTERRUPT_MASK_FROM_ISR(); + { + if( pxQueue->uxMessagesWaiting < pxQueue->uxLength ) + { + traceQUEUE_SEND_FROM_ISR( pxQueue ); + + prvCopyDataToQueue( pxQueue, pvItemToQueue, xCopyPosition ); + + /* If the queue is locked we do not alter the event list. This will + be done when the queue is unlocked later. */ + if( pxQueue->xTxLock == queueUNLOCKED ) + { + if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToReceive ) ) == pdFALSE ) + { + if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToReceive ) ) != pdFALSE ) + { + /* The task waiting has a higher priority so record that a + context switch is required. */ + *pxHigherPriorityTaskWoken = pdTRUE; + } + } + } + else + { + /* Increment the lock count so the task that unlocks the queue + knows that data was posted while it was locked. */ + ++( pxQueue->xTxLock ); + } + + xReturn = pdPASS; + } + else + { + traceQUEUE_SEND_FROM_ISR_FAILED( pxQueue ); + xReturn = errQUEUE_FULL; + } + } + portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedInterruptStatus ); + + return xReturn; +} +/*-----------------------------------------------------------*/ + +signed portBASE_TYPE xQueueGenericReceive( xQueueHandle pxQueue, void * const pvBuffer, portTickType xTicksToWait, portBASE_TYPE xJustPeeking ) +{ +signed portBASE_TYPE xEntryTimeSet = pdFALSE; +xTimeOutType xTimeOut; +signed char *pcOriginalReadPosition; + + configASSERT( pxQueue ); + configASSERT( !( ( pvBuffer == NULL ) && ( pxQueue->uxItemSize != ( unsigned portBASE_TYPE ) 0U ) ) ); + + /* This function relaxes the coding standard somewhat to allow return + statements within the function itself. This is done in the interest + of execution time efficiency. */ + + for( ;; ) + { + taskENTER_CRITICAL(); + { + /* Is there data in the queue now? To be running we must be + the highest priority task wanting to access the queue. */ + if( pxQueue->uxMessagesWaiting > ( unsigned portBASE_TYPE ) 0 ) + { + /* Remember our read position in case we are just peeking. */ + pcOriginalReadPosition = pxQueue->pcReadFrom; + + prvCopyDataFromQueue( pxQueue, pvBuffer ); + + if( xJustPeeking == pdFALSE ) + { + traceQUEUE_RECEIVE( pxQueue ); + + /* We are actually removing data. */ + --( pxQueue->uxMessagesWaiting ); + + #if ( configUSE_MUTEXES == 1 ) + { + if( pxQueue->uxQueueType == queueQUEUE_IS_MUTEX ) + { + /* Record the information required to implement + priority inheritance should it become necessary. */ + pxQueue->pxMutexHolder = xTaskGetCurrentTaskHandle(); + } + } + #endif + + if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToSend ) ) == pdFALSE ) + { + if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToSend ) ) == pdTRUE ) + { + portYIELD_WITHIN_API(); + } + } + } + else + { + traceQUEUE_PEEK( pxQueue ); + + /* We are not removing the data, so reset our read + pointer. */ + pxQueue->pcReadFrom = pcOriginalReadPosition; + + /* The data is being left in the queue, so see if there are + any other tasks waiting for the data. */ + if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToReceive ) ) == pdFALSE ) + { + /* Tasks that are removed from the event list will get added to + the pending ready list as the scheduler is still suspended. */ + if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToReceive ) ) != pdFALSE ) + { + /* The task waiting has a higher priority than this task. */ + portYIELD_WITHIN_API(); + } + } + + } + + taskEXIT_CRITICAL(); + return pdPASS; + } + else + { + if( xTicksToWait == ( portTickType ) 0 ) + { + /* The queue was empty and no block time is specified (or + the block time has expired) so leave now. */ + taskEXIT_CRITICAL(); + traceQUEUE_RECEIVE_FAILED( pxQueue ); + return errQUEUE_EMPTY; + } + else if( xEntryTimeSet == pdFALSE ) + { + /* The queue was empty and a block time was specified so + configure the timeout structure. */ + vTaskSetTimeOutState( &xTimeOut ); + xEntryTimeSet = pdTRUE; + } + } + } + taskEXIT_CRITICAL(); + + /* Interrupts and other tasks can send to and receive from the queue + now the critical section has been exited. */ + + vTaskSuspendAll(); + prvLockQueue( pxQueue ); + + /* Update the timeout state to see if it has expired yet. */ + if( xTaskCheckForTimeOut( &xTimeOut, &xTicksToWait ) == pdFALSE ) + { + if( prvIsQueueEmpty( pxQueue ) ) + { + traceBLOCKING_ON_QUEUE_RECEIVE( pxQueue ); + + #if ( configUSE_MUTEXES == 1 ) + { + if( pxQueue->uxQueueType == queueQUEUE_IS_MUTEX ) + { + portENTER_CRITICAL(); + { + vTaskPriorityInherit( ( void * ) pxQueue->pxMutexHolder ); + } + portEXIT_CRITICAL(); + } + } + #endif + + vTaskPlaceOnEventList( &( pxQueue->xTasksWaitingToReceive ), xTicksToWait ); + prvUnlockQueue( pxQueue ); + if( !xTaskResumeAll() ) + { + portYIELD_WITHIN_API(); + } + } + else + { + /* Try again. */ + prvUnlockQueue( pxQueue ); + ( void ) xTaskResumeAll(); + } + } + else + { + prvUnlockQueue( pxQueue ); + ( void ) xTaskResumeAll(); + traceQUEUE_RECEIVE_FAILED( pxQueue ); + return errQUEUE_EMPTY; + } + } +} +/*-----------------------------------------------------------*/ + +signed portBASE_TYPE xQueueReceiveFromISR( xQueueHandle pxQueue, void * const pvBuffer, signed portBASE_TYPE *pxTaskWoken ) +{ +signed portBASE_TYPE xReturn; +unsigned portBASE_TYPE uxSavedInterruptStatus; + + configASSERT( pxQueue ); + configASSERT( pxTaskWoken ); + configASSERT( !( ( pvBuffer == NULL ) && ( pxQueue->uxItemSize != ( unsigned portBASE_TYPE ) 0U ) ) ); + + uxSavedInterruptStatus = portSET_INTERRUPT_MASK_FROM_ISR(); + { + /* We cannot block from an ISR, so check there is data available. */ + if( pxQueue->uxMessagesWaiting > ( unsigned portBASE_TYPE ) 0 ) + { + traceQUEUE_RECEIVE_FROM_ISR( pxQueue ); + + prvCopyDataFromQueue( pxQueue, pvBuffer ); + --( pxQueue->uxMessagesWaiting ); + + /* If the queue is locked we will not modify the event list. Instead + we update the lock count so the task that unlocks the queue will know + that an ISR has removed data while the queue was locked. */ + if( pxQueue->xRxLock == queueUNLOCKED ) + { + if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToSend ) ) == pdFALSE ) + { + if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToSend ) ) != pdFALSE ) + { + /* The task waiting has a higher priority than us so + force a context switch. */ + *pxTaskWoken = pdTRUE; + } + } + } + else + { + /* Increment the lock count so the task that unlocks the queue + knows that data was removed while it was locked. */ + ++( pxQueue->xRxLock ); + } + + xReturn = pdPASS; + } + else + { + xReturn = pdFAIL; + traceQUEUE_RECEIVE_FROM_ISR_FAILED( pxQueue ); + } + } + portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedInterruptStatus ); + + return xReturn; +} +/*-----------------------------------------------------------*/ + +unsigned portBASE_TYPE uxQueueMessagesWaiting( const xQueueHandle pxQueue ) +{ +unsigned portBASE_TYPE uxReturn; + + configASSERT( pxQueue ); + + taskENTER_CRITICAL(); + uxReturn = pxQueue->uxMessagesWaiting; + taskEXIT_CRITICAL(); + + return uxReturn; +} +/*-----------------------------------------------------------*/ + +unsigned portBASE_TYPE uxQueueMessagesWaitingFromISR( const xQueueHandle pxQueue ) +{ +unsigned portBASE_TYPE uxReturn; + + configASSERT( pxQueue ); + + uxReturn = pxQueue->uxMessagesWaiting; + + return uxReturn; +} +/*-----------------------------------------------------------*/ + +void vQueueDelete( xQueueHandle pxQueue ) +{ + configASSERT( pxQueue ); + + traceQUEUE_DELETE( pxQueue ); + vQueueUnregisterQueue( pxQueue ); + vPortFree( pxQueue->pcHead ); + vPortFree( pxQueue ); +} +/*-----------------------------------------------------------*/ + +static void prvCopyDataToQueue( xQUEUE *pxQueue, const void *pvItemToQueue, portBASE_TYPE xPosition ) +{ + if( pxQueue->uxItemSize == ( unsigned portBASE_TYPE ) 0 ) + { + #if ( configUSE_MUTEXES == 1 ) + { + if( pxQueue->uxQueueType == queueQUEUE_IS_MUTEX ) + { + /* The mutex is no longer being held. */ + vTaskPriorityDisinherit( ( void * ) pxQueue->pxMutexHolder ); + pxQueue->pxMutexHolder = NULL; + } + } + #endif + } + else if( xPosition == queueSEND_TO_BACK ) + { + memcpy( ( void * ) pxQueue->pcWriteTo, pvItemToQueue, ( unsigned ) pxQueue->uxItemSize ); + pxQueue->pcWriteTo += pxQueue->uxItemSize; + if( pxQueue->pcWriteTo >= pxQueue->pcTail ) + { + pxQueue->pcWriteTo = pxQueue->pcHead; + } + } + else + { + memcpy( ( void * ) pxQueue->pcReadFrom, pvItemToQueue, ( unsigned ) pxQueue->uxItemSize ); + pxQueue->pcReadFrom -= pxQueue->uxItemSize; + if( pxQueue->pcReadFrom < pxQueue->pcHead ) + { + pxQueue->pcReadFrom = ( pxQueue->pcTail - pxQueue->uxItemSize ); + } + } + + ++( pxQueue->uxMessagesWaiting ); +} +/*-----------------------------------------------------------*/ + +static void prvCopyDataFromQueue( xQUEUE * const pxQueue, const void *pvBuffer ) +{ + if( pxQueue->uxQueueType != queueQUEUE_IS_MUTEX ) + { + pxQueue->pcReadFrom += pxQueue->uxItemSize; + if( pxQueue->pcReadFrom >= pxQueue->pcTail ) + { + pxQueue->pcReadFrom = pxQueue->pcHead; + } + memcpy( ( void * ) pvBuffer, ( void * ) pxQueue->pcReadFrom, ( unsigned ) pxQueue->uxItemSize ); + } +} +/*-----------------------------------------------------------*/ + +static void prvUnlockQueue( xQueueHandle pxQueue ) +{ + /* THIS FUNCTION MUST BE CALLED WITH THE SCHEDULER SUSPENDED. */ + + /* The lock counts contains the number of extra data items placed or + removed from the queue while the queue was locked. When a queue is + locked items can be added or removed, but the event lists cannot be + updated. */ + taskENTER_CRITICAL(); + { + /* See if data was added to the queue while it was locked. */ + while( pxQueue->xTxLock > queueLOCKED_UNMODIFIED ) + { + /* Data was posted while the queue was locked. Are any tasks + blocked waiting for data to become available? */ + if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToReceive ) ) == pdFALSE ) + { + /* Tasks that are removed from the event list will get added to + the pending ready list as the scheduler is still suspended. */ + if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToReceive ) ) != pdFALSE ) + { + /* The task waiting has a higher priority so record that a + context switch is required. */ + vTaskMissedYield(); + } + + --( pxQueue->xTxLock ); + } + else + { + break; + } + } + + pxQueue->xTxLock = queueUNLOCKED; + } + taskEXIT_CRITICAL(); + + /* Do the same for the Rx lock. */ + taskENTER_CRITICAL(); + { + while( pxQueue->xRxLock > queueLOCKED_UNMODIFIED ) + { + if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToSend ) ) == pdFALSE ) + { + if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToSend ) ) != pdFALSE ) + { + vTaskMissedYield(); + } + + --( pxQueue->xRxLock ); + } + else + { + break; + } + } + + pxQueue->xRxLock = queueUNLOCKED; + } + taskEXIT_CRITICAL(); +} +/*-----------------------------------------------------------*/ + +static signed portBASE_TYPE prvIsQueueEmpty( const xQueueHandle pxQueue ) +{ +signed portBASE_TYPE xReturn; + + taskENTER_CRITICAL(); + xReturn = ( pxQueue->uxMessagesWaiting == ( unsigned portBASE_TYPE ) 0 ); + taskEXIT_CRITICAL(); + + return xReturn; +} +/*-----------------------------------------------------------*/ + +signed portBASE_TYPE xQueueIsQueueEmptyFromISR( const xQueueHandle pxQueue ) +{ +signed portBASE_TYPE xReturn; + + configASSERT( pxQueue ); + xReturn = ( pxQueue->uxMessagesWaiting == ( unsigned portBASE_TYPE ) 0 ); + + return xReturn; +} +/*-----------------------------------------------------------*/ + +static signed portBASE_TYPE prvIsQueueFull( const xQueueHandle pxQueue ) +{ +signed portBASE_TYPE xReturn; + + taskENTER_CRITICAL(); + xReturn = ( pxQueue->uxMessagesWaiting == pxQueue->uxLength ); + taskEXIT_CRITICAL(); + + return xReturn; +} +/*-----------------------------------------------------------*/ + +signed portBASE_TYPE xQueueIsQueueFullFromISR( const xQueueHandle pxQueue ) +{ +signed portBASE_TYPE xReturn; + + configASSERT( pxQueue ); + xReturn = ( pxQueue->uxMessagesWaiting == pxQueue->uxLength ); + + return xReturn; +} +/*-----------------------------------------------------------*/ + +#if configUSE_CO_ROUTINES == 1 +signed portBASE_TYPE xQueueCRSend( xQueueHandle pxQueue, const void *pvItemToQueue, portTickType xTicksToWait ) +{ +signed portBASE_TYPE xReturn; + + /* If the queue is already full we may have to block. A critical section + is required to prevent an interrupt removing something from the queue + between the check to see if the queue is full and blocking on the queue. */ + portDISABLE_INTERRUPTS(); + { + if( prvIsQueueFull( pxQueue ) ) + { + /* The queue is full - do we want to block or just leave without + posting? */ + if( xTicksToWait > ( portTickType ) 0 ) + { + /* As this is called from a coroutine we cannot block directly, but + return indicating that we need to block. */ + vCoRoutineAddToDelayedList( xTicksToWait, &( pxQueue->xTasksWaitingToSend ) ); + portENABLE_INTERRUPTS(); + return errQUEUE_BLOCKED; + } + else + { + portENABLE_INTERRUPTS(); + return errQUEUE_FULL; + } + } + } + portENABLE_INTERRUPTS(); + + portNOP(); + + portDISABLE_INTERRUPTS(); + { + if( pxQueue->uxMessagesWaiting < pxQueue->uxLength ) + { + /* There is room in the queue, copy the data into the queue. */ + prvCopyDataToQueue( pxQueue, pvItemToQueue, queueSEND_TO_BACK ); + xReturn = pdPASS; + + /* Were any co-routines waiting for data to become available? */ + if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToReceive ) ) == pdFALSE ) + { + /* In this instance the co-routine could be placed directly + into the ready list as we are within a critical section. + Instead the same pending ready list mechanism is used as if + the event were caused from within an interrupt. */ + if( xCoRoutineRemoveFromEventList( &( pxQueue->xTasksWaitingToReceive ) ) != pdFALSE ) + { + /* The co-routine waiting has a higher priority so record + that a yield might be appropriate. */ + xReturn = errQUEUE_YIELD; + } + } + } + else + { + xReturn = errQUEUE_FULL; + } + } + portENABLE_INTERRUPTS(); + + return xReturn; +} +#endif +/*-----------------------------------------------------------*/ + +#if configUSE_CO_ROUTINES == 1 +signed portBASE_TYPE xQueueCRReceive( xQueueHandle pxQueue, void *pvBuffer, portTickType xTicksToWait ) +{ +signed portBASE_TYPE xReturn; + + /* If the queue is already empty we may have to block. A critical section + is required to prevent an interrupt adding something to the queue + between the check to see if the queue is empty and blocking on the queue. */ + portDISABLE_INTERRUPTS(); + { + if( pxQueue->uxMessagesWaiting == ( unsigned portBASE_TYPE ) 0 ) + { + /* There are no messages in the queue, do we want to block or just + leave with nothing? */ + if( xTicksToWait > ( portTickType ) 0 ) + { + /* As this is a co-routine we cannot block directly, but return + indicating that we need to block. */ + vCoRoutineAddToDelayedList( xTicksToWait, &( pxQueue->xTasksWaitingToReceive ) ); + portENABLE_INTERRUPTS(); + return errQUEUE_BLOCKED; + } + else + { + portENABLE_INTERRUPTS(); + return errQUEUE_FULL; + } + } + } + portENABLE_INTERRUPTS(); + + portNOP(); + + portDISABLE_INTERRUPTS(); + { + if( pxQueue->uxMessagesWaiting > ( unsigned portBASE_TYPE ) 0 ) + { + /* Data is available from the queue. */ + pxQueue->pcReadFrom += pxQueue->uxItemSize; + if( pxQueue->pcReadFrom >= pxQueue->pcTail ) + { + pxQueue->pcReadFrom = pxQueue->pcHead; + } + --( pxQueue->uxMessagesWaiting ); + memcpy( ( void * ) pvBuffer, ( void * ) pxQueue->pcReadFrom, ( unsigned ) pxQueue->uxItemSize ); + + xReturn = pdPASS; + + /* Were any co-routines waiting for space to become available? */ + if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToSend ) ) == pdFALSE ) + { + /* In this instance the co-routine could be placed directly + into the ready list as we are within a critical section. + Instead the same pending ready list mechanism is used as if + the event were caused from within an interrupt. */ + if( xCoRoutineRemoveFromEventList( &( pxQueue->xTasksWaitingToSend ) ) != pdFALSE ) + { + xReturn = errQUEUE_YIELD; + } + } + } + else + { + xReturn = pdFAIL; + } + } + portENABLE_INTERRUPTS(); + + return xReturn; +} +#endif +/*-----------------------------------------------------------*/ + + + +#if configUSE_CO_ROUTINES == 1 +signed portBASE_TYPE xQueueCRSendFromISR( xQueueHandle pxQueue, const void *pvItemToQueue, signed portBASE_TYPE xCoRoutinePreviouslyWoken ) +{ + /* Cannot block within an ISR so if there is no space on the queue then + exit without doing anything. */ + if( pxQueue->uxMessagesWaiting < pxQueue->uxLength ) + { + prvCopyDataToQueue( pxQueue, pvItemToQueue, queueSEND_TO_BACK ); + + /* We only want to wake one co-routine per ISR, so check that a + co-routine has not already been woken. */ + if( !xCoRoutinePreviouslyWoken ) + { + if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToReceive ) ) == pdFALSE ) + { + if( xCoRoutineRemoveFromEventList( &( pxQueue->xTasksWaitingToReceive ) ) != pdFALSE ) + { + return pdTRUE; + } + } + } + } + + return xCoRoutinePreviouslyWoken; +} +#endif +/*-----------------------------------------------------------*/ + +#if configUSE_CO_ROUTINES == 1 +signed portBASE_TYPE xQueueCRReceiveFromISR( xQueueHandle pxQueue, void *pvBuffer, signed portBASE_TYPE *pxCoRoutineWoken ) +{ +signed portBASE_TYPE xReturn; + + /* We cannot block from an ISR, so check there is data available. If + not then just leave without doing anything. */ + if( pxQueue->uxMessagesWaiting > ( unsigned portBASE_TYPE ) 0 ) + { + /* Copy the data from the queue. */ + pxQueue->pcReadFrom += pxQueue->uxItemSize; + if( pxQueue->pcReadFrom >= pxQueue->pcTail ) + { + pxQueue->pcReadFrom = pxQueue->pcHead; + } + --( pxQueue->uxMessagesWaiting ); + memcpy( ( void * ) pvBuffer, ( void * ) pxQueue->pcReadFrom, ( unsigned ) pxQueue->uxItemSize ); + + if( !( *pxCoRoutineWoken ) ) + { + if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToSend ) ) == pdFALSE ) + { + if( xCoRoutineRemoveFromEventList( &( pxQueue->xTasksWaitingToSend ) ) != pdFALSE ) + { + *pxCoRoutineWoken = pdTRUE; + } + } + } + + xReturn = pdPASS; + } + else + { + xReturn = pdFAIL; + } + + return xReturn; +} +#endif +/*-----------------------------------------------------------*/ + +#if configQUEUE_REGISTRY_SIZE > 0 + + void vQueueAddToRegistry( xQueueHandle xQueue, signed char *pcQueueName ) + { + unsigned portBASE_TYPE ux; + + /* See if there is an empty space in the registry. A NULL name denotes + a free slot. */ + for( ux = ( unsigned portBASE_TYPE ) 0U; ux < configQUEUE_REGISTRY_SIZE; ux++ ) + { + if( xQueueRegistry[ ux ].pcQueueName == NULL ) + { + /* Store the information on this queue. */ + xQueueRegistry[ ux ].pcQueueName = pcQueueName; + xQueueRegistry[ ux ].xHandle = xQueue; + break; + } + } + } + +#endif +/*-----------------------------------------------------------*/ + +#if configQUEUE_REGISTRY_SIZE > 0 + + static void vQueueUnregisterQueue( xQueueHandle xQueue ) + { + unsigned portBASE_TYPE ux; + + /* See if the handle of the queue being unregistered in actually in the + registry. */ + for( ux = ( unsigned portBASE_TYPE ) 0U; ux < configQUEUE_REGISTRY_SIZE; ux++ ) + { + if( xQueueRegistry[ ux ].xHandle == xQueue ) + { + /* Set the name to NULL to show that this slot if free again. */ + xQueueRegistry[ ux ].pcQueueName = NULL; + break; + } + } + + } + +#endif +/*-----------------------------------------------------------*/ + +#if configUSE_TIMERS == 1 + + void vQueueWaitForMessageRestricted( xQueueHandle pxQueue, portTickType xTicksToWait ) + { + /* This function should not be called by application code hence the + 'Restricted' in its name. It is not part of the public API. It is + designed for use by kernel code, and has special calling requirements. + It can result in vListInsert() being called on a list that can only + possibly ever have one item in it, so the list will be fast, but even + so it should be called with the scheduler locked and not from a critical + section. */ + + /* Only do anything if there are no messages in the queue. This function + will not actually cause the task to block, just place it on a blocked + list. It will not block until the scheduler is unlocked - at which + time a yield will be performed. If an item is added to the queue while + the queue is locked, and the calling task blocks on the queue, then the + calling task will be immediately unblocked when the queue is unlocked. */ + prvLockQueue( pxQueue ); + if( pxQueue->uxMessagesWaiting == ( unsigned portBASE_TYPE ) 0U ) + { + /* There is nothing in the queue, block for the specified period. */ + vTaskPlaceOnEventListRestricted( &( pxQueue->xTasksWaitingToReceive ), xTicksToWait ); + } + prvUnlockQueue( pxQueue ); + } + +#endif + diff --git a/TP1_labyrinth_etu/FreeRTOS_src/readme.txt b/TP1_labyrinth_etu/FreeRTOS_src/readme.txt new file mode 100644 index 0000000000000000000000000000000000000000..81518ecb4339e35363d844853fde09116e314cea --- /dev/null +++ b/TP1_labyrinth_etu/FreeRTOS_src/readme.txt @@ -0,0 +1,17 @@ +Each real time kernel port consists of three files that contain the core kernel +components and are common to every port, and one or more files that are +specific to a particular microcontroller and or compiler. + ++ The FreeRTOS/Source directory contains the three files that are common to +every port - list.c, queue.c and tasks.c. The kernel is contained within these +three files. croutine.c implements the optional co-routine functionality - which +is normally only used on very memory limited systems. + ++ The FreeRTOS/Source/Portable directory contains the files that are specific to +a particular microcontroller and or compiler. + ++ The FreeRTOS/Source/include directory contains the real time kernel header +files. + +See the readme file in the FreeRTOS/Source/Portable directory for more +information. \ No newline at end of file diff --git a/TP1_labyrinth_etu/FreeRTOS_src/tasks.c b/TP1_labyrinth_etu/FreeRTOS_src/tasks.c new file mode 100644 index 0000000000000000000000000000000000000000..1d9857083b34df57c2dc3cb9a3e3ae133fe4e50a --- /dev/null +++ b/TP1_labyrinth_etu/FreeRTOS_src/tasks.c @@ -0,0 +1,2542 @@ +/* + FreeRTOS V7.0.1 - Copyright (C) 2011 Real Time Engineers Ltd. + + + FreeRTOS supports many tools and architectures. V7.0.0 is sponsored by: + Atollic AB - Atollic provides professional embedded systems development + tools for C/C++ development, code analysis and test automation. + See http://www.atollic.com + + + *************************************************************************** + * * + * FreeRTOS tutorial books are available in pdf and paperback. * + * Complete, revised, and edited pdf reference manuals are also * + * available. * + * * + * Purchasing FreeRTOS documentation will not only help you, by * + * ensuring you get running as quickly as possible and with an * + * in-depth knowledge of how to use FreeRTOS, it will also help * + * the FreeRTOS project to continue with its mission of providing * + * professional grade, cross platform, de facto standard solutions * + * for microcontrollers - completely free of charge! * + * * + * >>> See http://www.FreeRTOS.org/Documentation for details. <<< * + * * + * Thank you for using FreeRTOS, and thank you for your support! * + * * + *************************************************************************** + + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation AND MODIFIED BY the FreeRTOS exception. + >>>NOTE<<< The modification to the GPL is included to allow you to + distribute a combined work that includes FreeRTOS without being obliged to + provide the source code for proprietary components outside of the FreeRTOS + kernel. FreeRTOS is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + more details. You should have received a copy of the GNU General Public + License and the FreeRTOS license exception along with FreeRTOS; if not it + can be viewed here: http://www.freertos.org/a00114.html and also obtained + by writing to Richard Barry, contact details for whom are available on the + FreeRTOS WEB site. + + 1 tab == 4 spaces! + + http://www.FreeRTOS.org - Documentation, latest information, license and + contact details. + + http://www.SafeRTOS.com - A version that is certified for use in safety + critical systems. + + http://www.OpenRTOS.com - Commercial support, development, porting, + licensing and training services. +*/ + + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> + +/* Defining MPU_WRAPPERS_INCLUDED_FROM_API_FILE prevents task.h from redefining +all the API functions to use the MPU wrappers. That should only be done when +task.h is included from an application file. */ +#define MPU_WRAPPERS_INCLUDED_FROM_API_FILE + +#include "FreeRTOS.h" +#include "task.h" +#include "timers.h" +#include "StackMacros.h" + +#undef MPU_WRAPPERS_INCLUDED_FROM_API_FILE + +/* + * Macro to define the amount of stack available to the idle task. + */ +#define tskIDLE_STACK_SIZE configMINIMAL_STACK_SIZE + +/* + * Task control block. A task control block (TCB) is allocated to each task, + * and stores the context of the task. + */ +typedef struct tskTaskControlBlock +{ + volatile portSTACK_TYPE *pxTopOfStack; /*< Points to the location of the last item placed on the tasks stack. THIS MUST BE THE FIRST MEMBER OF THE STRUCT. */ + + #if ( portUSING_MPU_WRAPPERS == 1 ) + xMPU_SETTINGS xMPUSettings; /*< The MPU settings are defined as part of the port layer. THIS MUST BE THE SECOND MEMBER OF THE STRUCT. */ + #endif + + xListItem xGenericListItem; /*< List item used to place the TCB in ready and blocked queues. */ + xListItem xEventListItem; /*< List item used to place the TCB in event lists. */ + unsigned portBASE_TYPE uxPriority; /*< The priority of the task where 0 is the lowest priority. */ + portSTACK_TYPE *pxStack; /*< Points to the start of the stack. */ + signed char pcTaskName[ configMAX_TASK_NAME_LEN ];/*< Descriptive name given to the task when created. Facilitates debugging only. */ + + #if ( portSTACK_GROWTH > 0 ) + portSTACK_TYPE *pxEndOfStack; /*< Used for stack overflow checking on architectures where the stack grows up from low memory. */ + #endif + + #if ( portCRITICAL_NESTING_IN_TCB == 1 ) + unsigned portBASE_TYPE uxCriticalNesting; + #endif + + #if ( configUSE_TRACE_FACILITY == 1 ) + unsigned portBASE_TYPE uxTCBNumber; /*< This is used for tracing the scheduler and making debugging easier only. */ + #endif + #if ( configHEPIA_TRACING == 1 ) + unsigned char task_id; + #endif + #if ( configUSE_MUTEXES == 1 ) + unsigned portBASE_TYPE uxBasePriority; /*< The priority last assigned to the task - used by the priority inheritance mechanism. */ + #endif + + #if ( configUSE_APPLICATION_TASK_TAG == 1 ) + pdTASK_HOOK_CODE pxTaskTag; + #endif + + #if ( configGENERATE_RUN_TIME_STATS == 1 ) + unsigned long ulRunTimeCounter; /*< Used for calculating how much CPU time each task is utilising. */ + #endif + +} tskTCB; + +#if ( configHEPIA_TRACING == 1 ) +void write_trace(unsigned char sig_idx, short val); +static unsigned previous_id_in=0xFF; +#endif + +/* + * Some kernel aware debuggers require data to be viewed to be global, rather + * than file scope. + */ +#ifdef portREMOVE_STATIC_QUALIFIER + #define static +#endif + +/*lint -e956 */ +PRIVILEGED_DATA tskTCB * volatile pxCurrentTCB = NULL; + +/* Lists for ready and blocked tasks. --------------------*/ + +PRIVILEGED_DATA static xList pxReadyTasksLists[ configMAX_PRIORITIES ]; /*< Prioritised ready tasks. */ +PRIVILEGED_DATA static xList xDelayedTaskList1; /*< Delayed tasks. */ +PRIVILEGED_DATA static xList xDelayedTaskList2; /*< Delayed tasks (two lists are used - one for delays that have overflowed the current tick count. */ +PRIVILEGED_DATA static xList * volatile pxDelayedTaskList ; /*< Points to the delayed task list currently being used. */ +PRIVILEGED_DATA static xList * volatile pxOverflowDelayedTaskList; /*< Points to the delayed task list currently being used to hold tasks that have overflowed the current tick count. */ +PRIVILEGED_DATA static xList xPendingReadyList; /*< Tasks that have been readied while the scheduler was suspended. They will be moved to the ready queue when the scheduler is resumed. */ + +#if ( INCLUDE_vTaskDelete == 1 ) + + PRIVILEGED_DATA static volatile xList xTasksWaitingTermination; /*< Tasks that have been deleted - but the their memory not yet freed. */ + PRIVILEGED_DATA static volatile unsigned portBASE_TYPE uxTasksDeleted = ( unsigned portBASE_TYPE ) 0; + +#endif + +#if ( INCLUDE_vTaskSuspend == 1 ) + + PRIVILEGED_DATA static xList xSuspendedTaskList; /*< Tasks that are currently suspended. */ + +#endif + +/* File private variables. --------------------------------*/ +PRIVILEGED_DATA static volatile unsigned portBASE_TYPE uxCurrentNumberOfTasks = ( unsigned portBASE_TYPE ) 0; +PRIVILEGED_DATA static volatile portTickType xTickCount = ( portTickType ) 0; +PRIVILEGED_DATA static unsigned portBASE_TYPE uxTopUsedPriority = tskIDLE_PRIORITY; +PRIVILEGED_DATA static volatile unsigned portBASE_TYPE uxTopReadyPriority = tskIDLE_PRIORITY; +PRIVILEGED_DATA static volatile signed portBASE_TYPE xSchedulerRunning = pdFALSE; +PRIVILEGED_DATA static volatile unsigned portBASE_TYPE uxSchedulerSuspended = ( unsigned portBASE_TYPE ) pdFALSE; +PRIVILEGED_DATA static volatile unsigned portBASE_TYPE uxMissedTicks = ( unsigned portBASE_TYPE ) 0; +PRIVILEGED_DATA static volatile portBASE_TYPE xMissedYield = ( portBASE_TYPE ) pdFALSE; +PRIVILEGED_DATA static volatile portBASE_TYPE xNumOfOverflows = ( portBASE_TYPE ) 0; +PRIVILEGED_DATA static unsigned portBASE_TYPE uxTaskNumber = ( unsigned portBASE_TYPE ) 0; +PRIVILEGED_DATA static portTickType xNextTaskUnblockTime = ( portTickType ) portMAX_DELAY; + +#if ( configGENERATE_RUN_TIME_STATS == 1 ) + + PRIVILEGED_DATA static char pcStatsString[ 50 ] ; + PRIVILEGED_DATA static unsigned long ulTaskSwitchedInTime = 0UL; /*< Holds the value of a timer/counter the last time a task was switched in. */ + static void prvGenerateRunTimeStatsForTasksInList( const signed char *pcWriteBuffer, xList *pxList, unsigned long ulTotalRunTime ) PRIVILEGED_FUNCTION; + +#endif + +/* Debugging and trace facilities private variables and macros. ------------*/ + +/* + * The value used to fill the stack of a task when the task is created. This + * is used purely for checking the high water mark for tasks. + */ +#define tskSTACK_FILL_BYTE ( 0xa5U ) + +/* + * Macros used by vListTask to indicate which state a task is in. + */ +#define tskBLOCKED_CHAR ( ( signed char ) 'B' ) +#define tskREADY_CHAR ( ( signed char ) 'R' ) +#define tskDELETED_CHAR ( ( signed char ) 'D' ) +#define tskSUSPENDED_CHAR ( ( signed char ) 'S' ) + +/* + * Macros and private variables used by the trace facility. + */ +#if ( configUSE_TRACE_FACILITY == 1 ) + + #define tskSIZE_OF_EACH_TRACE_LINE ( ( unsigned long ) ( sizeof( unsigned long ) + sizeof( unsigned long ) ) ) + PRIVILEGED_DATA static volatile signed char * volatile pcTraceBuffer; + PRIVILEGED_DATA static signed char *pcTraceBufferStart; + PRIVILEGED_DATA static signed char *pcTraceBufferEnd; + PRIVILEGED_DATA static signed portBASE_TYPE xTracing = pdFALSE; + static unsigned portBASE_TYPE uxPreviousTask = 255U; + PRIVILEGED_DATA static char pcStatusString[ 50 ]; + +#endif + +/*-----------------------------------------------------------*/ + +/* + * Macro that writes a trace of scheduler activity to a buffer. This trace + * shows which task is running when and is very useful as a debugging tool. + * As this macro is called each context switch it is a good idea to undefine + * it if not using the facility. + */ +#if ( configUSE_TRACE_FACILITY == 1 ) + + #define vWriteTraceToBuffer() \ + { \ + if( xTracing ) \ + { \ + if( uxPreviousTask != pxCurrentTCB->uxTCBNumber ) \ + { \ + if( ( pcTraceBuffer + tskSIZE_OF_EACH_TRACE_LINE ) < pcTraceBufferEnd ) \ + { \ + uxPreviousTask = pxCurrentTCB->uxTCBNumber; \ + *( unsigned long * ) pcTraceBuffer = ( unsigned long ) xTickCount; \ + pcTraceBuffer += sizeof( unsigned long ); \ + *( unsigned long * ) pcTraceBuffer = ( unsigned long ) uxPreviousTask; \ + pcTraceBuffer += sizeof( unsigned long ); \ + } \ + else \ + { \ + xTracing = pdFALSE; \ + } \ + } \ + } \ + } + +#else + + #define vWriteTraceToBuffer() + +#endif +/*-----------------------------------------------------------*/ + +/* + * Place the task represented by pxTCB into the appropriate ready queue for + * the task. It is inserted at the end of the list. One quirk of this is + * that if the task being inserted is at the same priority as the currently + * executing task, then it will only be rescheduled after the currently + * executing task has been rescheduled. + */ +#define prvAddTaskToReadyQueue( pxTCB ) \ + if( ( pxTCB )->uxPriority > uxTopReadyPriority ) \ + { \ + uxTopReadyPriority = ( pxTCB )->uxPriority; \ + } \ + vListInsertEnd( ( xList * ) &( pxReadyTasksLists[ ( pxTCB )->uxPriority ] ), &( ( pxTCB )->xGenericListItem ) ) +/*-----------------------------------------------------------*/ + +/* + * Macro that looks at the list of tasks that are currently delayed to see if + * any require waking. + * + * Tasks are stored in the queue in the order of their wake time - meaning + * once one tasks has been found whose timer has not expired we need not look + * any further down the list. + */ +#define prvCheckDelayedTasks() \ +{ \ +portTickType xItemValue; \ + \ + /* Is the tick count greater than or equal to the wake time of the first \ + task referenced from the delayed tasks list? */ \ + if( xTickCount >= xNextTaskUnblockTime ) \ + { \ + for( ;; ) \ + { \ + if( listLIST_IS_EMPTY( pxDelayedTaskList ) != pdFALSE ) \ + { \ + /* The delayed list is empty. Set xNextTaskUnblockTime to the \ + maximum possible value so it is extremely unlikely that the \ + if( xTickCount >= xNextTaskUnblockTime ) test will pass next \ + time through. */ \ + xNextTaskUnblockTime = portMAX_DELAY; \ + break; \ + } \ + else \ + { \ + /* The delayed list is not empty, get the value of the item at \ + the head of the delayed list. This is the time at which the \ + task at the head of the delayed list should be removed from \ + the Blocked state. */ \ + pxTCB = ( tskTCB * ) listGET_OWNER_OF_HEAD_ENTRY( pxDelayedTaskList ); \ + xItemValue = listGET_LIST_ITEM_VALUE( &( pxTCB->xGenericListItem ) ); \ + \ + if( xTickCount < xItemValue ) \ + { \ + /* It is not time to unblock this item yet, but the item \ + value is the time at which the task at the head of the \ + blocked list should be removed from the Blocked state - \ + so record the item value in xNextTaskUnblockTime. */ \ + xNextTaskUnblockTime = xItemValue; \ + break; \ + } \ + \ + /* It is time to remove the item from the Blocked state. */ \ + vListRemove( &( pxTCB->xGenericListItem ) ); \ + \ + /* Is the task waiting on an event also? */ \ + if( pxTCB->xEventListItem.pvContainer ) \ + { \ + vListRemove( &( pxTCB->xEventListItem ) ); \ + } \ + prvAddTaskToReadyQueue( pxTCB ); \ + } \ + } \ + } \ +} +/*-----------------------------------------------------------*/ + +/* + * Several functions take an xTaskHandle parameter that can optionally be NULL, + * where NULL is used to indicate that the handle of the currently executing + * task should be used in place of the parameter. This macro simply checks to + * see if the parameter is NULL and returns a pointer to the appropriate TCB. + */ +#define prvGetTCBFromHandle( pxHandle ) ( ( ( pxHandle ) == NULL ) ? ( tskTCB * ) pxCurrentTCB : ( tskTCB * ) ( pxHandle ) ) + +/* Callback function prototypes. --------------------------*/ +extern void vApplicationStackOverflowHook( xTaskHandle *pxTask, signed char *pcTaskName ); +extern void vApplicationTickHook( void ); + +/* File private functions. --------------------------------*/ + +/* + * Utility to ready a TCB for a given task. Mainly just copies the parameters + * into the TCB structure. + */ +static void prvInitialiseTCBVariables( tskTCB *pxTCB, const signed char * const pcName, unsigned portBASE_TYPE uxPriority, const xMemoryRegion * const xRegions, unsigned short usStackDepth ) PRIVILEGED_FUNCTION; + +/* + * Utility to ready all the lists used by the scheduler. This is called + * automatically upon the creation of the first task. + */ +static void prvInitialiseTaskLists( void ) PRIVILEGED_FUNCTION; + +/* + * The idle task, which as all tasks is implemented as a never ending loop. + * The idle task is automatically created and added to the ready lists upon + * creation of the first user task. + * + * The portTASK_FUNCTION_PROTO() macro is used to allow port/compiler specific + * language extensions. The equivalent prototype for this function is: + * + * void prvIdleTask( void *pvParameters ); + * + */ +static portTASK_FUNCTION_PROTO( prvIdleTask, pvParameters ); + +/* + * Utility to free all memory allocated by the scheduler to hold a TCB, + * including the stack pointed to by the TCB. + * + * This does not free memory allocated by the task itself (i.e. memory + * allocated by calls to pvPortMalloc from within the tasks application code). + */ +#if ( ( INCLUDE_vTaskDelete == 1 ) || ( INCLUDE_vTaskCleanUpResources == 1 ) ) + + static void prvDeleteTCB( tskTCB *pxTCB ) PRIVILEGED_FUNCTION; + +#endif + +/* + * Used only by the idle task. This checks to see if anything has been placed + * in the list of tasks waiting to be deleted. If so the task is cleaned up + * and its TCB deleted. + */ +static void prvCheckTasksWaitingTermination( void ) PRIVILEGED_FUNCTION; + +/* + * The currently executing task is entering the Blocked state. Add the task to + * either the current or the overflow delayed task list. + */ +static void prvAddCurrentTaskToDelayedList( portTickType xTimeToWake ) PRIVILEGED_FUNCTION; + +/* + * Allocates memory from the heap for a TCB and associated stack. Checks the + * allocation was successful. + */ +static tskTCB *prvAllocateTCBAndStack( unsigned short usStackDepth, portSTACK_TYPE *puxStackBuffer ) PRIVILEGED_FUNCTION; + +/* + * Called from vTaskList. vListTasks details all the tasks currently under + * control of the scheduler. The tasks may be in one of a number of lists. + * prvListTaskWithinSingleList accepts a list and details the tasks from + * within just that list. + * + * THIS FUNCTION IS INTENDED FOR DEBUGGING ONLY, AND SHOULD NOT BE CALLED FROM + * NORMAL APPLICATION CODE. + */ +#if ( configUSE_TRACE_FACILITY == 1 ) + + static void prvListTaskWithinSingleList( const signed char *pcWriteBuffer, xList *pxList, signed char cStatus ) PRIVILEGED_FUNCTION; + +#endif + +/* + * When a task is created, the stack of the task is filled with a known value. + * This function determines the 'high water mark' of the task stack by + * determining how much of the stack remains at the original preset value. + */ +#if ( ( configUSE_TRACE_FACILITY == 1 ) || ( INCLUDE_uxTaskGetStackHighWaterMark == 1 ) ) + + static unsigned short usTaskCheckFreeStackSpace( const unsigned char * pucStackByte ) PRIVILEGED_FUNCTION; + +#endif + + +/*lint +e956 */ + + + +/*----------------------------------------------------------- + * TASK CREATION API documented in task.h + *----------------------------------------------------------*/ + +signed portBASE_TYPE xTaskGenericCreate( pdTASK_CODE pxTaskCode, const signed char * const pcName, unsigned short usStackDepth, void *pvParameters, unsigned portBASE_TYPE uxPriority, xTaskHandle *pxCreatedTask, portSTACK_TYPE *puxStackBuffer, const xMemoryRegion * const xRegions ) +{ +signed portBASE_TYPE xReturn; +tskTCB * pxNewTCB; + + configASSERT( pxTaskCode ); + configASSERT( ( uxPriority < configMAX_PRIORITIES ) ); + + /* Allocate the memory required by the TCB and stack for the new task, + checking that the allocation was successful. */ + pxNewTCB = prvAllocateTCBAndStack( usStackDepth, puxStackBuffer ); + + if( pxNewTCB != NULL ) + { + portSTACK_TYPE *pxTopOfStack; + + #if( portUSING_MPU_WRAPPERS == 1 ) + /* Should the task be created in privileged mode? */ + portBASE_TYPE xRunPrivileged; + if( ( uxPriority & portPRIVILEGE_BIT ) != 0x00 ) + { + xRunPrivileged = pdTRUE; + } + else + { + xRunPrivileged = pdFALSE; + } + uxPriority &= ~portPRIVILEGE_BIT; + #endif /* portUSING_MPU_WRAPPERS == 1 */ + + /* Calculate the top of stack address. This depends on whether the + stack grows from high memory to low (as per the 80x86) or visa versa. + portSTACK_GROWTH is used to make the result positive or negative as + required by the port. */ + #if( portSTACK_GROWTH < 0 ) + { + pxTopOfStack = pxNewTCB->pxStack + ( usStackDepth - ( unsigned short ) 1 ); + pxTopOfStack = ( portSTACK_TYPE * ) ( ( ( unsigned long ) pxTopOfStack ) & ( ( unsigned long ) ~portBYTE_ALIGNMENT_MASK ) ); + + /* Check the alignment of the calculated top of stack is correct. */ + configASSERT( ( ( ( unsigned long ) pxTopOfStack & ( unsigned long ) portBYTE_ALIGNMENT_MASK ) == 0UL ) ); + } + #else + { + pxTopOfStack = pxNewTCB->pxStack; + + /* Check the alignment of the stack buffer is correct. */ + configASSERT( ( ( ( unsigned long ) pxNewTCB->pxStack & ( unsigned long ) portBYTE_ALIGNMENT_MASK ) == 0UL ) ); + + /* If we want to use stack checking on architectures that use + a positive stack growth direction then we also need to store the + other extreme of the stack space. */ + pxNewTCB->pxEndOfStack = pxNewTCB->pxStack + ( usStackDepth - 1 ); + } + #endif + + /* Setup the newly allocated TCB with the initial state of the task. */ + prvInitialiseTCBVariables( pxNewTCB, pcName, uxPriority, xRegions, usStackDepth ); + + /* Initialize the TCB stack to look as if the task was already running, + but had been interrupted by the scheduler. The return address is set + to the start of the task function. Once the stack has been initialised + the top of stack variable is updated. */ + #if( portUSING_MPU_WRAPPERS == 1 ) + { + pxNewTCB->pxTopOfStack = pxPortInitialiseStack( pxTopOfStack, pxTaskCode, pvParameters, xRunPrivileged ); + } + #else + { + pxNewTCB->pxTopOfStack = pxPortInitialiseStack( pxTopOfStack, pxTaskCode, pvParameters ); + } + #endif + + /* Check the alignment of the initialised stack. */ + configASSERT( ( ( ( unsigned long ) pxNewTCB->pxTopOfStack & ( unsigned long ) portBYTE_ALIGNMENT_MASK ) == 0UL ) ); + + if( ( void * ) pxCreatedTask != NULL ) + { + /* Pass the TCB out - in an anonymous way. The calling function/ + task can use this as a handle to delete the task later if + required.*/ + *pxCreatedTask = ( xTaskHandle ) pxNewTCB; + } + + /* We are going to manipulate the task queues to add this task to a + ready list, so must make sure no interrupts occur. */ + taskENTER_CRITICAL(); + { + uxCurrentNumberOfTasks++; + if( pxCurrentTCB == NULL ) + { + /* There are no other tasks, or all the other tasks are in + the suspended state - make this the current task. */ + pxCurrentTCB = pxNewTCB; + + if( uxCurrentNumberOfTasks == ( unsigned portBASE_TYPE ) 1 ) + { + /* This is the first task to be created so do the preliminary + initialisation required. We will not recover if this call + fails, but we will report the failure. */ + prvInitialiseTaskLists(); + } + } + else + { + /* If the scheduler is not already running, make this task the + current task if it is the highest priority task to be created + so far. */ + if( xSchedulerRunning == pdFALSE ) + { + if( pxCurrentTCB->uxPriority <= uxPriority ) + { + pxCurrentTCB = pxNewTCB; + } + } + } + + /* Remember the top priority to make context switching faster. Use + the priority in pxNewTCB as this has been capped to a valid value. */ + if( pxNewTCB->uxPriority > uxTopUsedPriority ) + { + uxTopUsedPriority = pxNewTCB->uxPriority; + } + + #if ( configUSE_TRACE_FACILITY == 1 ) + { + /* Add a counter into the TCB for tracing only. */ + pxNewTCB->uxTCBNumber = uxTaskNumber; + } + #endif + #if ( configHEPIA_TRACING == 1 ) + { + pxNewTCB->task_id = (unsigned char)uxTaskNumber; + } + #endif + uxTaskNumber++; + + prvAddTaskToReadyQueue( pxNewTCB ); + + xReturn = pdPASS; + traceTASK_CREATE( pxNewTCB ); + } + taskEXIT_CRITICAL(); + } + else + { + xReturn = errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY; + traceTASK_CREATE_FAILED(); + } + + if( xReturn == pdPASS ) + { + if( xSchedulerRunning != pdFALSE ) + { + /* If the created task is of a higher priority than the current task + then it should run now. */ + if( pxCurrentTCB->uxPriority < uxPriority ) + { + portYIELD_WITHIN_API(); + } + } + } + + return xReturn; +} +/*-----------------------------------------------------------*/ + +#if ( INCLUDE_vTaskDelete == 1 ) + + void vTaskDelete( xTaskHandle pxTaskToDelete ) + { + tskTCB *pxTCB; + + taskENTER_CRITICAL(); + { + /* Ensure a yield is performed if the current task is being + deleted. */ + if( pxTaskToDelete == pxCurrentTCB ) + { + pxTaskToDelete = NULL; + } + + /* If null is passed in here then we are deleting ourselves. */ + pxTCB = prvGetTCBFromHandle( pxTaskToDelete ); + + /* Remove task from the ready list and place in the termination list. + This will stop the task from be scheduled. The idle task will check + the termination list and free up any memory allocated by the + scheduler for the TCB and stack. */ + vListRemove( &( pxTCB->xGenericListItem ) ); + + /* Is the task waiting on an event also? */ + if( pxTCB->xEventListItem.pvContainer ) + { + vListRemove( &( pxTCB->xEventListItem ) ); + } + + vListInsertEnd( ( xList * ) &xTasksWaitingTermination, &( pxTCB->xGenericListItem ) ); + + /* Increment the ucTasksDeleted variable so the idle task knows + there is a task that has been deleted and that it should therefore + check the xTasksWaitingTermination list. */ + ++uxTasksDeleted; + + /* Increment the uxTaskNumberVariable also so kernel aware debuggers + can detect that the task lists need re-generating. */ + uxTaskNumber++; + + traceTASK_DELETE( pxTCB ); + } + taskEXIT_CRITICAL(); + + /* Force a reschedule if we have just deleted the current task. */ + if( xSchedulerRunning != pdFALSE ) + { + if( ( void * ) pxTaskToDelete == NULL ) + { + portYIELD_WITHIN_API(); + } + } + } + +#endif + + + + + + +/*----------------------------------------------------------- + * TASK CONTROL API documented in task.h + *----------------------------------------------------------*/ + +#if ( INCLUDE_vTaskDelayUntil == 1 ) + + void vTaskDelayUntil( portTickType * const pxPreviousWakeTime, portTickType xTimeIncrement ) + { + portTickType xTimeToWake; + portBASE_TYPE xAlreadyYielded, xShouldDelay = pdFALSE; + + configASSERT( pxPreviousWakeTime ); + configASSERT( ( xTimeIncrement > 0 ) ); + + vTaskSuspendAll(); + { + /* Generate the tick time at which the task wants to wake. */ + xTimeToWake = *pxPreviousWakeTime + xTimeIncrement; + + if( xTickCount < *pxPreviousWakeTime ) + { + /* The tick count has overflowed since this function was + lasted called. In this case the only time we should ever + actually delay is if the wake time has also overflowed, + and the wake time is greater than the tick time. When this + is the case it is as if neither time had overflowed. */ + if( ( xTimeToWake < *pxPreviousWakeTime ) && ( xTimeToWake > xTickCount ) ) + { + xShouldDelay = pdTRUE; + } + } + else + { + /* The tick time has not overflowed. In this case we will + delay if either the wake time has overflowed, and/or the + tick time is less than the wake time. */ + if( ( xTimeToWake < *pxPreviousWakeTime ) || ( xTimeToWake > xTickCount ) ) + { + xShouldDelay = pdTRUE; + } + } + + /* Update the wake time ready for the next call. */ + *pxPreviousWakeTime = xTimeToWake; + + if( xShouldDelay != pdFALSE ) + { + traceTASK_DELAY_UNTIL(); + + /* We must remove ourselves from the ready list before adding + ourselves to the blocked list as the same list item is used for + both lists. */ + vListRemove( ( xListItem * ) &( pxCurrentTCB->xGenericListItem ) ); + prvAddCurrentTaskToDelayedList( xTimeToWake ); + } + } + xAlreadyYielded = xTaskResumeAll(); + + /* Force a reschedule if xTaskResumeAll has not already done so, we may + have put ourselves to sleep. */ + if( !xAlreadyYielded ) + { + portYIELD_WITHIN_API(); + } + } + +#endif +/*-----------------------------------------------------------*/ + +#if ( INCLUDE_vTaskDelay == 1 ) + + void vTaskDelay( portTickType xTicksToDelay ) + { + portTickType xTimeToWake; + signed portBASE_TYPE xAlreadyYielded = pdFALSE; + + /* A delay time of zero just forces a reschedule. */ + if( xTicksToDelay > ( portTickType ) 0 ) + { + vTaskSuspendAll(); + { + traceTASK_DELAY(); + + /* A task that is removed from the event list while the + scheduler is suspended will not get placed in the ready + list or removed from the blocked list until the scheduler + is resumed. + + This task cannot be in an event list as it is the currently + executing task. */ + + /* Calculate the time to wake - this may overflow but this is + not a problem. */ + xTimeToWake = xTickCount + xTicksToDelay; + + /* We must remove ourselves from the ready list before adding + ourselves to the blocked list as the same list item is used for + both lists. */ + vListRemove( ( xListItem * ) &( pxCurrentTCB->xGenericListItem ) ); + prvAddCurrentTaskToDelayedList( xTimeToWake ); + } + xAlreadyYielded = xTaskResumeAll(); + } + + /* Force a reschedule if xTaskResumeAll has not already done so, we may + have put ourselves to sleep. */ + if( !xAlreadyYielded ) + { + portYIELD_WITHIN_API(); + } + } + +#endif +/*-----------------------------------------------------------*/ + +#if ( INCLUDE_uxTaskPriorityGet == 1 ) + + unsigned portBASE_TYPE uxTaskPriorityGet( xTaskHandle pxTask ) + { + tskTCB *pxTCB; + unsigned portBASE_TYPE uxReturn; + + taskENTER_CRITICAL(); + { + /* If null is passed in here then we are changing the + priority of the calling function. */ + pxTCB = prvGetTCBFromHandle( pxTask ); + uxReturn = pxTCB->uxPriority; + } + taskEXIT_CRITICAL(); + + return uxReturn; + } + +#endif +/*-----------------------------------------------------------*/ + +#if ( INCLUDE_vTaskPrioritySet == 1 ) + + void vTaskPrioritySet( xTaskHandle pxTask, unsigned portBASE_TYPE uxNewPriority ) + { + tskTCB *pxTCB; + unsigned portBASE_TYPE uxCurrentPriority; + portBASE_TYPE xYieldRequired = pdFALSE; + + configASSERT( ( uxNewPriority < configMAX_PRIORITIES ) ); + + /* Ensure the new priority is valid. */ + if( uxNewPriority >= configMAX_PRIORITIES ) + { + uxNewPriority = configMAX_PRIORITIES - ( unsigned portBASE_TYPE ) 1U; + } + + taskENTER_CRITICAL(); + { + if( pxTask == pxCurrentTCB ) + { + pxTask = NULL; + } + + /* If null is passed in here then we are changing the + priority of the calling function. */ + pxTCB = prvGetTCBFromHandle( pxTask ); + + traceTASK_PRIORITY_SET( pxTask, uxNewPriority ); + + #if ( configUSE_MUTEXES == 1 ) + { + uxCurrentPriority = pxTCB->uxBasePriority; + } + #else + { + uxCurrentPriority = pxTCB->uxPriority; + } + #endif + + if( uxCurrentPriority != uxNewPriority ) + { + /* The priority change may have readied a task of higher + priority than the calling task. */ + if( uxNewPriority > uxCurrentPriority ) + { + if( pxTask != NULL ) + { + /* The priority of another task is being raised. If we + were raising the priority of the currently running task + there would be no need to switch as it must have already + been the highest priority task. */ + xYieldRequired = pdTRUE; + } + } + else if( pxTask == NULL ) + { + /* Setting our own priority down means there may now be another + task of higher priority that is ready to execute. */ + xYieldRequired = pdTRUE; + } + + + + #if ( configUSE_MUTEXES == 1 ) + { + /* Only change the priority being used if the task is not + currently using an inherited priority. */ + if( pxTCB->uxBasePriority == pxTCB->uxPriority ) + { + pxTCB->uxPriority = uxNewPriority; + } + + /* The base priority gets set whatever. */ + pxTCB->uxBasePriority = uxNewPriority; + } + #else + { + pxTCB->uxPriority = uxNewPriority; + } + #endif + + listSET_LIST_ITEM_VALUE( &( pxTCB->xEventListItem ), ( configMAX_PRIORITIES - ( portTickType ) uxNewPriority ) ); + + /* If the task is in the blocked or suspended list we need do + nothing more than change it's priority variable. However, if + the task is in a ready list it needs to be removed and placed + in the queue appropriate to its new priority. */ + if( listIS_CONTAINED_WITHIN( &( pxReadyTasksLists[ uxCurrentPriority ] ), &( pxTCB->xGenericListItem ) ) ) + { + /* The task is currently in its ready list - remove before adding + it to it's new ready list. As we are in a critical section we + can do this even if the scheduler is suspended. */ + vListRemove( &( pxTCB->xGenericListItem ) ); + prvAddTaskToReadyQueue( pxTCB ); + } + + if( xYieldRequired == pdTRUE ) + { + portYIELD_WITHIN_API(); + } + } + } + taskEXIT_CRITICAL(); + } + +#endif +/*-----------------------------------------------------------*/ + +#if ( INCLUDE_vTaskSuspend == 1 ) + + void vTaskSuspend( xTaskHandle pxTaskToSuspend ) + { + tskTCB *pxTCB; + + taskENTER_CRITICAL(); + { + /* Ensure a yield is performed if the current task is being + suspended. */ + if( pxTaskToSuspend == pxCurrentTCB ) + { + pxTaskToSuspend = NULL; + } + + /* If null is passed in here then we are suspending ourselves. */ + pxTCB = prvGetTCBFromHandle( pxTaskToSuspend ); + + traceTASK_SUSPEND( pxTCB ); + + /* Remove task from the ready/delayed list and place in the suspended list. */ + vListRemove( &( pxTCB->xGenericListItem ) ); + + /* Is the task waiting on an event also? */ + if( pxTCB->xEventListItem.pvContainer ) + { + vListRemove( &( pxTCB->xEventListItem ) ); + } + + vListInsertEnd( ( xList * ) &xSuspendedTaskList, &( pxTCB->xGenericListItem ) ); + } + taskEXIT_CRITICAL(); + + if( ( void * ) pxTaskToSuspend == NULL ) + { + if( xSchedulerRunning != pdFALSE ) + { + /* We have just suspended the current task. */ + portYIELD_WITHIN_API(); + } + else + { + /* The scheduler is not running, but the task that was pointed + to by pxCurrentTCB has just been suspended and pxCurrentTCB + must be adjusted to point to a different task. */ + if( listCURRENT_LIST_LENGTH( &xSuspendedTaskList ) == uxCurrentNumberOfTasks ) + { + /* No other tasks are ready, so set pxCurrentTCB back to + NULL so when the next task is created pxCurrentTCB will + be set to point to it no matter what its relative priority + is. */ + pxCurrentTCB = NULL; + } + else + { + vTaskSwitchContext(); + } + } + } + } + +#endif +/*-----------------------------------------------------------*/ + +#if ( INCLUDE_vTaskSuspend == 1 ) + + signed portBASE_TYPE xTaskIsTaskSuspended( xTaskHandle xTask ) + { + portBASE_TYPE xReturn = pdFALSE; + const tskTCB * const pxTCB = ( tskTCB * ) xTask; + + /* It does not make sense to check if the calling task is suspended. */ + configASSERT( xTask ); + + /* Is the task we are attempting to resume actually in the + suspended list? */ + if( listIS_CONTAINED_WITHIN( &xSuspendedTaskList, &( pxTCB->xGenericListItem ) ) != pdFALSE ) + { + /* Has the task already been resumed from within an ISR? */ + if( listIS_CONTAINED_WITHIN( &xPendingReadyList, &( pxTCB->xEventListItem ) ) != pdTRUE ) + { + /* Is it in the suspended list because it is in the + Suspended state? It is possible to be in the suspended + list because it is blocked on a task with no timeout + specified. */ + if( listIS_CONTAINED_WITHIN( NULL, &( pxTCB->xEventListItem ) ) == pdTRUE ) + { + xReturn = pdTRUE; + } + } + } + + return xReturn; + } + +#endif +/*-----------------------------------------------------------*/ + +#if ( INCLUDE_vTaskSuspend == 1 ) + + void vTaskResume( xTaskHandle pxTaskToResume ) + { + tskTCB *pxTCB; + + /* It does not make sense to resume the calling task. */ + configASSERT( pxTaskToResume ); + + /* Remove the task from whichever list it is currently in, and place + it in the ready list. */ + pxTCB = ( tskTCB * ) pxTaskToResume; + + /* The parameter cannot be NULL as it is impossible to resume the + currently executing task. */ + if( ( pxTCB != NULL ) && ( pxTCB != pxCurrentTCB ) ) + { + taskENTER_CRITICAL(); + { + if( xTaskIsTaskSuspended( pxTCB ) == pdTRUE ) + { + traceTASK_RESUME( pxTCB ); + + /* As we are in a critical section we can access the ready + lists even if the scheduler is suspended. */ + vListRemove( &( pxTCB->xGenericListItem ) ); + prvAddTaskToReadyQueue( pxTCB ); + + /* We may have just resumed a higher priority task. */ + if( pxTCB->uxPriority >= pxCurrentTCB->uxPriority ) + { + /* This yield may not cause the task just resumed to run, but + will leave the lists in the correct state for the next yield. */ + portYIELD_WITHIN_API(); + } + } + } + taskEXIT_CRITICAL(); + } + } + +#endif + +/*-----------------------------------------------------------*/ + +#if ( ( INCLUDE_xTaskResumeFromISR == 1 ) && ( INCLUDE_vTaskSuspend == 1 ) ) + + portBASE_TYPE xTaskResumeFromISR( xTaskHandle pxTaskToResume ) + { + portBASE_TYPE xYieldRequired = pdFALSE; + tskTCB *pxTCB; + + configASSERT( pxTaskToResume ); + + pxTCB = ( tskTCB * ) pxTaskToResume; + + if( xTaskIsTaskSuspended( pxTCB ) == pdTRUE ) + { + traceTASK_RESUME_FROM_ISR( pxTCB ); + + if( uxSchedulerSuspended == ( unsigned portBASE_TYPE ) pdFALSE ) + { + xYieldRequired = ( pxTCB->uxPriority >= pxCurrentTCB->uxPriority ); + vListRemove( &( pxTCB->xGenericListItem ) ); + prvAddTaskToReadyQueue( pxTCB ); + } + else + { + /* We cannot access the delayed or ready lists, so will hold this + task pending until the scheduler is resumed, at which point a + yield will be performed if necessary. */ + vListInsertEnd( ( xList * ) &( xPendingReadyList ), &( pxTCB->xEventListItem ) ); + } + } + + return xYieldRequired; + } + +#endif + + + + +/*----------------------------------------------------------- + * PUBLIC SCHEDULER CONTROL documented in task.h + *----------------------------------------------------------*/ + + +void vTaskStartScheduler( void ) +{ +portBASE_TYPE xReturn; + + /* Add the idle task at the lowest priority. */ + xReturn = xTaskCreate( prvIdleTask, ( signed char * ) "IDLE", tskIDLE_STACK_SIZE, ( void * ) NULL, ( tskIDLE_PRIORITY | portPRIVILEGE_BIT ), ( xTaskHandle * ) NULL ); + + #if ( configUSE_TIMERS == 1 ) + { + if( xReturn == pdPASS ) + { + xReturn = xTimerCreateTimerTask(); + } + } + #endif + + if( xReturn == pdPASS ) + { + /* Interrupts are turned off here, to ensure a tick does not occur + before or during the call to xPortStartScheduler(). The stacks of + the created tasks contain a status word with interrupts switched on + so interrupts will automatically get re-enabled when the first task + starts to run. + + STEPPING THROUGH HERE USING A DEBUGGER CAN CAUSE BIG PROBLEMS IF THE + DEBUGGER ALLOWS INTERRUPTS TO BE PROCESSED. */ + portDISABLE_INTERRUPTS(); + + xSchedulerRunning = pdTRUE; + xTickCount = ( portTickType ) 0; + + /* If configGENERATE_RUN_TIME_STATS is defined then the following + macro must be defined to configure the timer/counter used to generate + the run time counter time base. */ + portCONFIGURE_TIMER_FOR_RUN_TIME_STATS(); + + /* Setting up the timer tick is hardware specific and thus in the + portable interface. */ + if( xPortStartScheduler() ) + { + /* Should not reach here as if the scheduler is running the + function will not return. */ + } + else + { + /* Should only reach here if a task calls xTaskEndScheduler(). */ + } + } + + /* This line will only be reached if the kernel could not be started. */ + configASSERT( xReturn ); +} +/*-----------------------------------------------------------*/ + +void vTaskEndScheduler( void ) +{ + /* Stop the scheduler interrupts and call the portable scheduler end + routine so the original ISRs can be restored if necessary. The port + layer must ensure interrupts enable bit is left in the correct state. */ + portDISABLE_INTERRUPTS(); + xSchedulerRunning = pdFALSE; + vPortEndScheduler(); +} +/*----------------------------------------------------------*/ + +void vTaskSuspendAll( void ) +{ + /* A critical section is not required as the variable is of type + portBASE_TYPE. */ + ++uxSchedulerSuspended; +} +/*----------------------------------------------------------*/ + +signed portBASE_TYPE xTaskResumeAll( void ) +{ +register tskTCB *pxTCB; +signed portBASE_TYPE xAlreadyYielded = pdFALSE; + + /* If uxSchedulerSuspended is zero then this function does not match a + previous call to vTaskSuspendAll(). */ + configASSERT( uxSchedulerSuspended ); + + /* It is possible that an ISR caused a task to be removed from an event + list while the scheduler was suspended. If this was the case then the + removed task will have been added to the xPendingReadyList. Once the + scheduler has been resumed it is safe to move all the pending ready + tasks from this list into their appropriate ready list. */ + taskENTER_CRITICAL(); + { + --uxSchedulerSuspended; + + if( uxSchedulerSuspended == ( unsigned portBASE_TYPE ) pdFALSE ) + { + if( uxCurrentNumberOfTasks > ( unsigned portBASE_TYPE ) 0 ) + { + portBASE_TYPE xYieldRequired = pdFALSE; + + /* Move any readied tasks from the pending list into the + appropriate ready list. */ + while( listLIST_IS_EMPTY( ( xList * ) &xPendingReadyList ) == pdFALSE ) + { + pxTCB = ( tskTCB * ) listGET_OWNER_OF_HEAD_ENTRY( ( ( xList * ) &xPendingReadyList ) ); + vListRemove( &( pxTCB->xEventListItem ) ); + vListRemove( &( pxTCB->xGenericListItem ) ); + prvAddTaskToReadyQueue( pxTCB ); + + /* If we have moved a task that has a priority higher than + the current task then we should yield. */ + if( pxTCB->uxPriority >= pxCurrentTCB->uxPriority ) + { + xYieldRequired = pdTRUE; + } + } + + /* If any ticks occurred while the scheduler was suspended then + they should be processed now. This ensures the tick count does not + slip, and that any delayed tasks are resumed at the correct time. */ + if( uxMissedTicks > ( unsigned portBASE_TYPE ) 0 ) + { + while( uxMissedTicks > ( unsigned portBASE_TYPE ) 0 ) + { + vTaskIncrementTick(); + --uxMissedTicks; + } + + /* As we have processed some ticks it is appropriate to yield + to ensure the highest priority task that is ready to run is + the task actually running. */ + #if configUSE_PREEMPTION == 1 + { + xYieldRequired = pdTRUE; + } + #endif + } + + if( ( xYieldRequired == pdTRUE ) || ( xMissedYield == pdTRUE ) ) + { + xAlreadyYielded = pdTRUE; + xMissedYield = pdFALSE; + portYIELD_WITHIN_API(); + } + } + } + } + taskEXIT_CRITICAL(); + + return xAlreadyYielded; +} + + + + + + +/*----------------------------------------------------------- + * PUBLIC TASK UTILITIES documented in task.h + *----------------------------------------------------------*/ + + + +portTickType xTaskGetTickCount( void ) +{ +portTickType xTicks; + + /* Critical section required if running on a 16 bit processor. */ + taskENTER_CRITICAL(); + { + xTicks = xTickCount; + } + taskEXIT_CRITICAL(); + + return xTicks; +} +/*-----------------------------------------------------------*/ + +portTickType xTaskGetTickCountFromISR( void ) +{ +portTickType xReturn; +unsigned portBASE_TYPE uxSavedInterruptStatus; + + uxSavedInterruptStatus = portSET_INTERRUPT_MASK_FROM_ISR(); + xReturn = xTickCount; + portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedInterruptStatus ); + + return xReturn; +} +/*-----------------------------------------------------------*/ + +unsigned portBASE_TYPE uxTaskGetNumberOfTasks( void ) +{ + /* A critical section is not required because the variables are of type + portBASE_TYPE. */ + return uxCurrentNumberOfTasks; +} +/*-----------------------------------------------------------*/ + +#if ( configUSE_TRACE_FACILITY == 1 ) + + void vTaskList( signed char *pcWriteBuffer ) + { + unsigned portBASE_TYPE uxQueue; + + /* This is a VERY costly function that should be used for debug only. + It leaves interrupts disabled for a LONG time. */ + + vTaskSuspendAll(); + { + /* Run through all the lists that could potentially contain a TCB and + report the task name, state and stack high water mark. */ + + *pcWriteBuffer = ( signed char ) 0x00; + strcat( ( char * ) pcWriteBuffer, ( const char * ) "\r\n" ); + + uxQueue = uxTopUsedPriority + ( unsigned portBASE_TYPE ) 1U; + + do + { + uxQueue--; + + if( listLIST_IS_EMPTY( &( pxReadyTasksLists[ uxQueue ] ) ) == pdFALSE ) + { + prvListTaskWithinSingleList( pcWriteBuffer, ( xList * ) &( pxReadyTasksLists[ uxQueue ] ), tskREADY_CHAR ); + } + }while( uxQueue > ( unsigned short ) tskIDLE_PRIORITY ); + + if( listLIST_IS_EMPTY( pxDelayedTaskList ) == pdFALSE ) + { + prvListTaskWithinSingleList( pcWriteBuffer, ( xList * ) pxDelayedTaskList, tskBLOCKED_CHAR ); + } + + if( listLIST_IS_EMPTY( pxOverflowDelayedTaskList ) == pdFALSE ) + { + prvListTaskWithinSingleList( pcWriteBuffer, ( xList * ) pxOverflowDelayedTaskList, tskBLOCKED_CHAR ); + } + + #if( INCLUDE_vTaskDelete == 1 ) + { + if( listLIST_IS_EMPTY( &xTasksWaitingTermination ) == pdFALSE ) + { + prvListTaskWithinSingleList( pcWriteBuffer, ( xList * ) &xTasksWaitingTermination, tskDELETED_CHAR ); + } + } + #endif + + #if ( INCLUDE_vTaskSuspend == 1 ) + { + if( listLIST_IS_EMPTY( &xSuspendedTaskList ) == pdFALSE ) + { + prvListTaskWithinSingleList( pcWriteBuffer, ( xList * ) &xSuspendedTaskList, tskSUSPENDED_CHAR ); + } + } + #endif + } + xTaskResumeAll(); + } + +#endif +/*----------------------------------------------------------*/ + +#if ( configGENERATE_RUN_TIME_STATS == 1 ) + + void vTaskGetRunTimeStats( signed char *pcWriteBuffer ) + { + unsigned portBASE_TYPE uxQueue; + unsigned long ulTotalRunTime; + + /* This is a VERY costly function that should be used for debug only. + It leaves interrupts disabled for a LONG time. */ + + vTaskSuspendAll(); + { + #ifdef portALT_GET_RUN_TIME_COUNTER_VALUE + portALT_GET_RUN_TIME_COUNTER_VALUE( ulTotalRunTime ); + #else + ulTotalRunTime = portGET_RUN_TIME_COUNTER_VALUE(); + #endif + + /* Divide ulTotalRunTime by 100 to make the percentage caluclations + simpler in the prvGenerateRunTimeStatsForTasksInList() function. */ + ulTotalRunTime /= 100UL; + + /* Run through all the lists that could potentially contain a TCB, + generating a table of run timer percentages in the provided + buffer. */ + + *pcWriteBuffer = ( signed char ) 0x00; + strcat( ( char * ) pcWriteBuffer, ( const char * ) "\r\n" ); + + uxQueue = uxTopUsedPriority + ( unsigned portBASE_TYPE ) 1U; + + do + { + uxQueue--; + + if( listLIST_IS_EMPTY( &( pxReadyTasksLists[ uxQueue ] ) ) == pdFALSE ) + { + prvGenerateRunTimeStatsForTasksInList( pcWriteBuffer, ( xList * ) &( pxReadyTasksLists[ uxQueue ] ), ulTotalRunTime ); + } + }while( uxQueue > ( unsigned short ) tskIDLE_PRIORITY ); + + if( listLIST_IS_EMPTY( pxDelayedTaskList ) == pdFALSE ) + { + prvGenerateRunTimeStatsForTasksInList( pcWriteBuffer, ( xList * ) pxDelayedTaskList, ulTotalRunTime ); + } + + if( listLIST_IS_EMPTY( pxOverflowDelayedTaskList ) == pdFALSE ) + { + prvGenerateRunTimeStatsForTasksInList( pcWriteBuffer, ( xList * ) pxOverflowDelayedTaskList, ulTotalRunTime ); + } + + #if ( INCLUDE_vTaskDelete == 1 ) + { + if( listLIST_IS_EMPTY( &xTasksWaitingTermination ) == pdFALSE ) + { + prvGenerateRunTimeStatsForTasksInList( pcWriteBuffer, ( xList * ) &xTasksWaitingTermination, ulTotalRunTime ); + } + } + #endif + + #if ( INCLUDE_vTaskSuspend == 1 ) + { + if( listLIST_IS_EMPTY( &xSuspendedTaskList ) == pdFALSE ) + { + prvGenerateRunTimeStatsForTasksInList( pcWriteBuffer, ( xList * ) &xSuspendedTaskList, ulTotalRunTime ); + } + } + #endif + } + xTaskResumeAll(); + } + +#endif +/*----------------------------------------------------------*/ + +#if ( configUSE_TRACE_FACILITY == 1 ) + + void vTaskStartTrace( signed char * pcBuffer, unsigned long ulBufferSize ) + { + configASSERT( pcBuffer ); + configASSERT( ulBufferSize ); + + taskENTER_CRITICAL(); + { + pcTraceBuffer = ( signed char * )pcBuffer; + pcTraceBufferStart = pcBuffer; + pcTraceBufferEnd = pcBuffer + ( ulBufferSize - tskSIZE_OF_EACH_TRACE_LINE ); + xTracing = pdTRUE; + } + taskEXIT_CRITICAL(); + } + +#endif +/*----------------------------------------------------------*/ + +#if ( configUSE_TRACE_FACILITY == 1 ) + + unsigned long ulTaskEndTrace( void ) + { + unsigned long ulBufferLength; + + taskENTER_CRITICAL(); + xTracing = pdFALSE; + taskEXIT_CRITICAL(); + + ulBufferLength = ( unsigned long ) ( pcTraceBuffer - pcTraceBufferStart ); + + return ulBufferLength; + } + +#endif + + + +/*----------------------------------------------------------- + * SCHEDULER INTERNALS AVAILABLE FOR PORTING PURPOSES + * documented in task.h + *----------------------------------------------------------*/ + + +void vTaskIncrementTick( void ) +{ +tskTCB * pxTCB; + + /* Called by the portable layer each time a tick interrupt occurs. + Increments the tick then checks to see if the new tick value will cause any + tasks to be unblocked. */ + if( uxSchedulerSuspended == ( unsigned portBASE_TYPE ) pdFALSE ) + { + ++xTickCount; + if( xTickCount == ( portTickType ) 0 ) + { + xList *pxTemp; + + /* Tick count has overflowed so we need to swap the delay lists. + If there are any items in pxDelayedTaskList here then there is + an error! */ + configASSERT( ( listLIST_IS_EMPTY( pxDelayedTaskList ) ) ); + + pxTemp = pxDelayedTaskList; + pxDelayedTaskList = pxOverflowDelayedTaskList; + pxOverflowDelayedTaskList = pxTemp; + xNumOfOverflows++; + + if( listLIST_IS_EMPTY( pxDelayedTaskList ) != pdFALSE ) + { + /* The new current delayed list is empty. Set + xNextTaskUnblockTime to the maximum possible value so it is + extremely unlikely that the + if( xTickCount >= xNextTaskUnblockTime ) test will pass until + there is an item in the delayed list. */ + xNextTaskUnblockTime = portMAX_DELAY; + } + else + { + /* The new current delayed list is not empty, get the value of + the item at the head of the delayed list. This is the time at + which the task at the head of the delayed list should be removed + from the Blocked state. */ + pxTCB = ( tskTCB * ) listGET_OWNER_OF_HEAD_ENTRY( pxDelayedTaskList ); + xNextTaskUnblockTime = listGET_LIST_ITEM_VALUE( &( pxTCB->xGenericListItem ) ); + } + } + + /* See if this tick has made a timeout expire. */ + prvCheckDelayedTasks(); + } + else + { + ++uxMissedTicks; + + /* The tick hook gets called at regular intervals, even if the + scheduler is locked. */ + #if ( configUSE_TICK_HOOK == 1 ) + { + vApplicationTickHook(); + } + #endif + } + + #if ( configUSE_TICK_HOOK == 1 ) + { + /* Guard against the tick hook being called when the missed tick + count is being unwound (when the scheduler is being unlocked. */ + if( uxMissedTicks == ( unsigned portBASE_TYPE ) 0U ) + { + vApplicationTickHook(); + } + } + #endif + + traceTASK_INCREMENT_TICK( xTickCount ); +} +/*-----------------------------------------------------------*/ + +#if ( ( INCLUDE_vTaskCleanUpResources == 1 ) && ( INCLUDE_vTaskSuspend == 1 ) ) + + void vTaskCleanUpResources( void ) + { + unsigned short usQueue; + volatile tskTCB *pxTCB; + + usQueue = ( unsigned short ) uxTopUsedPriority + ( unsigned short ) 1; + + /* Remove any TCB's from the ready queues. */ + do + { + usQueue--; + + while( listLIST_IS_EMPTY( &( pxReadyTasksLists[ usQueue ] ) ) == pdFALSE ) + { + listGET_OWNER_OF_NEXT_ENTRY( pxTCB, &( pxReadyTasksLists[ usQueue ] ) ); + vListRemove( ( xListItem * ) &( pxTCB->xGenericListItem ) ); + + prvDeleteTCB( ( tskTCB * ) pxTCB ); + } + }while( usQueue > ( unsigned short ) tskIDLE_PRIORITY ); + + /* Remove any TCB's from the delayed queue. */ + while( listLIST_IS_EMPTY( &xDelayedTaskList1 ) == pdFALSE ) + { + listGET_OWNER_OF_NEXT_ENTRY( pxTCB, &xDelayedTaskList1 ); + vListRemove( ( xListItem * ) &( pxTCB->xGenericListItem ) ); + + prvDeleteTCB( ( tskTCB * ) pxTCB ); + } + + /* Remove any TCB's from the overflow delayed queue. */ + while( listLIST_IS_EMPTY( &xDelayedTaskList2 ) == pdFALSE ) + { + listGET_OWNER_OF_NEXT_ENTRY( pxTCB, &xDelayedTaskList2 ); + vListRemove( ( xListItem * ) &( pxTCB->xGenericListItem ) ); + + prvDeleteTCB( ( tskTCB * ) pxTCB ); + } + + while( listLIST_IS_EMPTY( &xSuspendedTaskList ) == pdFALSE ) + { + listGET_OWNER_OF_NEXT_ENTRY( pxTCB, &xSuspendedTaskList ); + vListRemove( ( xListItem * ) &( pxTCB->xGenericListItem ) ); + + prvDeleteTCB( ( tskTCB * ) pxTCB ); + } + } + +#endif +/*-----------------------------------------------------------*/ + +#if ( configUSE_APPLICATION_TASK_TAG == 1 ) + + void vTaskSetApplicationTaskTag( xTaskHandle xTask, pdTASK_HOOK_CODE pxHookFunction ) + { + tskTCB *xTCB; + + /* If xTask is NULL then we are setting our own task hook. */ + if( xTask == NULL ) + { + xTCB = ( tskTCB * ) pxCurrentTCB; + } + else + { + xTCB = ( tskTCB * ) xTask; + } + + /* Save the hook function in the TCB. A critical section is required as + the value can be accessed from an interrupt. */ + taskENTER_CRITICAL(); + xTCB->pxTaskTag = pxHookFunction; + taskEXIT_CRITICAL(); + } + +#endif +/*-----------------------------------------------------------*/ + +#if ( configUSE_APPLICATION_TASK_TAG == 1 ) + + pdTASK_HOOK_CODE xTaskGetApplicationTaskTag( xTaskHandle xTask ) + { + tskTCB *xTCB; + pdTASK_HOOK_CODE xReturn; + + /* If xTask is NULL then we are setting our own task hook. */ + if( xTask == NULL ) + { + xTCB = ( tskTCB * ) pxCurrentTCB; + } + else + { + xTCB = ( tskTCB * ) xTask; + } + + /* Save the hook function in the TCB. A critical section is required as + the value can be accessed from an interrupt. */ + taskENTER_CRITICAL(); + xReturn = xTCB->pxTaskTag; + taskEXIT_CRITICAL(); + + return xReturn; + } + +#endif +/*-----------------------------------------------------------*/ + +#if ( configUSE_APPLICATION_TASK_TAG == 1 ) + + portBASE_TYPE xTaskCallApplicationTaskHook( xTaskHandle xTask, void *pvParameter ) + { + tskTCB *xTCB; + portBASE_TYPE xReturn; + + /* If xTask is NULL then we are calling our own task hook. */ + if( xTask == NULL ) + { + xTCB = ( tskTCB * ) pxCurrentTCB; + } + else + { + xTCB = ( tskTCB * ) xTask; + } + + if( xTCB->pxTaskTag != NULL ) + { + xReturn = xTCB->pxTaskTag( pvParameter ); + } + else + { + xReturn = pdFAIL; + } + + return xReturn; + } + +#endif +/*-----------------------------------------------------------*/ + +void vTaskSwitchContext( void ) +{ + if( uxSchedulerSuspended != ( unsigned portBASE_TYPE ) pdFALSE ) + { + /* The scheduler is currently suspended - do not allow a context + switch. */ + xMissedYield = pdTRUE; + } + else + { + traceTASK_SWITCHED_OUT(); + //id_out=pxCurrentTCB->task_id; + + + #if ( configGENERATE_RUN_TIME_STATS == 1 ) + { + unsigned long ulTempCounter; + + #ifdef portALT_GET_RUN_TIME_COUNTER_VALUE + portALT_GET_RUN_TIME_COUNTER_VALUE( ulTempCounter ); + #else + ulTempCounter = portGET_RUN_TIME_COUNTER_VALUE(); + #endif + + /* Add the amount of time the task has been running to the accumulated + time so far. The time the task started running was stored in + ulTaskSwitchedInTime. Note that there is no overflow protection here + so count values are only valid until the timer overflows. Generally + this will be about 1 hour assuming a 1uS timer increment. */ + pxCurrentTCB->ulRunTimeCounter += ( ulTempCounter - ulTaskSwitchedInTime ); + ulTaskSwitchedInTime = ulTempCounter; + } + #endif + + taskFIRST_CHECK_FOR_STACK_OVERFLOW(); + taskSECOND_CHECK_FOR_STACK_OVERFLOW(); + + /* Find the highest priority queue that contains ready tasks. */ + while( listLIST_IS_EMPTY( &( pxReadyTasksLists[ uxTopReadyPriority ] ) ) ) + { + configASSERT( uxTopReadyPriority ); + --uxTopReadyPriority; + } + + /* listGET_OWNER_OF_NEXT_ENTRY walks through the list, so the tasks of the + same priority get an equal share of the processor time. */ + listGET_OWNER_OF_NEXT_ENTRY( pxCurrentTCB, &( pxReadyTasksLists[ uxTopReadyPriority ] ) ); + + traceTASK_SWITCHED_IN(); + /*if (previous_id_in!=pxCurrentTCB->task_id) + { + if (previous_id_in!=0xFF) + write_trace_vcd(previous_id_in, 0); + write_trace_vcd(pxCurrentTCB->task_id, 1); + previous_id_in=pxCurrentTCB->task_id; + }*/ + vWriteTraceToBuffer(); + } +} +/*-----------------------------------------------------------*/ + +void vTaskPlaceOnEventList( const xList * const pxEventList, portTickType xTicksToWait ) +{ +portTickType xTimeToWake; + + configASSERT( pxEventList ); + + /* THIS FUNCTION MUST BE CALLED WITH INTERRUPTS DISABLED OR THE + SCHEDULER SUSPENDED. */ + + /* Place the event list item of the TCB in the appropriate event list. + This is placed in the list in priority order so the highest priority task + is the first to be woken by the event. */ + vListInsert( ( xList * ) pxEventList, ( xListItem * ) &( pxCurrentTCB->xEventListItem ) ); + + /* We must remove ourselves from the ready list before adding ourselves + to the blocked list as the same list item is used for both lists. We have + exclusive access to the ready lists as the scheduler is locked. */ + vListRemove( ( xListItem * ) &( pxCurrentTCB->xGenericListItem ) ); + + + #if ( INCLUDE_vTaskSuspend == 1 ) + { + if( xTicksToWait == portMAX_DELAY ) + { + /* Add ourselves to the suspended task list instead of a delayed task + list to ensure we are not woken by a timing event. We will block + indefinitely. */ + vListInsertEnd( ( xList * ) &xSuspendedTaskList, ( xListItem * ) &( pxCurrentTCB->xGenericListItem ) ); + } + else + { + /* Calculate the time at which the task should be woken if the event does + not occur. This may overflow but this doesn't matter. */ + xTimeToWake = xTickCount + xTicksToWait; + prvAddCurrentTaskToDelayedList( xTimeToWake ); + } + } + #else + { + /* Calculate the time at which the task should be woken if the event does + not occur. This may overflow but this doesn't matter. */ + xTimeToWake = xTickCount + xTicksToWait; + prvAddCurrentTaskToDelayedList( xTimeToWake ); + } + #endif +} +/*-----------------------------------------------------------*/ + +#if configUSE_TIMERS == 1 + + void vTaskPlaceOnEventListRestricted( const xList * const pxEventList, portTickType xTicksToWait ) + { + portTickType xTimeToWake; + + configASSERT( pxEventList ); + + /* This function should not be called by application code hence the + 'Restricted' in its name. It is not part of the public API. It is + designed for use by kernel code, and has special calling requirements - + it should be called from a critical section. */ + + + /* Place the event list item of the TCB in the appropriate event list. + In this case it is assume that this is the only task that is going to + be waiting on this event list, so the faster vListInsertEnd() function + can be used in place of vListInsert. */ + vListInsertEnd( ( xList * ) pxEventList, ( xListItem * ) &( pxCurrentTCB->xEventListItem ) ); + + /* We must remove this task from the ready list before adding it to the + blocked list as the same list item is used for both lists. This + function is called form a critical section. */ + vListRemove( ( xListItem * ) &( pxCurrentTCB->xGenericListItem ) ); + + /* Calculate the time at which the task should be woken if the event does + not occur. This may overflow but this doesn't matter. */ + xTimeToWake = xTickCount + xTicksToWait; + prvAddCurrentTaskToDelayedList( xTimeToWake ); + } + +#endif /* configUSE_TIMERS */ +/*-----------------------------------------------------------*/ + +signed portBASE_TYPE xTaskRemoveFromEventList( const xList * const pxEventList ) +{ +tskTCB *pxUnblockedTCB; +portBASE_TYPE xReturn; + + /* THIS FUNCTION MUST BE CALLED WITH INTERRUPTS DISABLED OR THE + SCHEDULER SUSPENDED. It can also be called from within an ISR. */ + + /* The event list is sorted in priority order, so we can remove the + first in the list, remove the TCB from the delayed list, and add + it to the ready list. + + If an event is for a queue that is locked then this function will never + get called - the lock count on the queue will get modified instead. This + means we can always expect exclusive access to the event list here. + + This function assumes that a check has already been made to ensure that + pxEventList is not empty. */ + pxUnblockedTCB = ( tskTCB * ) listGET_OWNER_OF_HEAD_ENTRY( pxEventList ); + configASSERT( pxUnblockedTCB ); + vListRemove( &( pxUnblockedTCB->xEventListItem ) ); + + if( uxSchedulerSuspended == ( unsigned portBASE_TYPE ) pdFALSE ) + { + vListRemove( &( pxUnblockedTCB->xGenericListItem ) ); + prvAddTaskToReadyQueue( pxUnblockedTCB ); + } + else + { + /* We cannot access the delayed or ready lists, so will hold this + task pending until the scheduler is resumed. */ + vListInsertEnd( ( xList * ) &( xPendingReadyList ), &( pxUnblockedTCB->xEventListItem ) ); + } + + if( pxUnblockedTCB->uxPriority >= pxCurrentTCB->uxPriority ) + { + /* Return true if the task removed from the event list has + a higher priority than the calling task. This allows + the calling task to know if it should force a context + switch now. */ + xReturn = pdTRUE; + } + else + { + xReturn = pdFALSE; + } + + return xReturn; +} +/*-----------------------------------------------------------*/ + +void vTaskSetTimeOutState( xTimeOutType * const pxTimeOut ) +{ + configASSERT( pxTimeOut ); + pxTimeOut->xOverflowCount = xNumOfOverflows; + pxTimeOut->xTimeOnEntering = xTickCount; +} +/*-----------------------------------------------------------*/ + +portBASE_TYPE xTaskCheckForTimeOut( xTimeOutType * const pxTimeOut, portTickType * const pxTicksToWait ) +{ +portBASE_TYPE xReturn; + + configASSERT( pxTimeOut ); + configASSERT( pxTicksToWait ); + + taskENTER_CRITICAL(); + { + #if ( INCLUDE_vTaskSuspend == 1 ) + /* If INCLUDE_vTaskSuspend is set to 1 and the block time specified is + the maximum block time then the task should block indefinitely, and + therefore never time out. */ + if( *pxTicksToWait == portMAX_DELAY ) + { + xReturn = pdFALSE; + } + else /* We are not blocking indefinitely, perform the checks below. */ + #endif + + if( ( xNumOfOverflows != pxTimeOut->xOverflowCount ) && ( ( portTickType ) xTickCount >= ( portTickType ) pxTimeOut->xTimeOnEntering ) ) + { + /* The tick count is greater than the time at which vTaskSetTimeout() + was called, but has also overflowed since vTaskSetTimeOut() was called. + It must have wrapped all the way around and gone past us again. This + passed since vTaskSetTimeout() was called. */ + xReturn = pdTRUE; + } + else if( ( ( portTickType ) ( ( portTickType ) xTickCount - ( portTickType ) pxTimeOut->xTimeOnEntering ) ) < ( portTickType ) *pxTicksToWait ) + { + /* Not a genuine timeout. Adjust parameters for time remaining. */ + *pxTicksToWait -= ( ( portTickType ) xTickCount - ( portTickType ) pxTimeOut->xTimeOnEntering ); + vTaskSetTimeOutState( pxTimeOut ); + xReturn = pdFALSE; + } + else + { + xReturn = pdTRUE; + } + } + taskEXIT_CRITICAL(); + + return xReturn; +} +/*-----------------------------------------------------------*/ + +void vTaskMissedYield( void ) +{ + xMissedYield = pdTRUE; +} + +/* + * ----------------------------------------------------------- + * The Idle task. + * ---------------------------------------------------------- + * + * The portTASK_FUNCTION() macro is used to allow port/compiler specific + * language extensions. The equivalent prototype for this function is: + * + * void prvIdleTask( void *pvParameters ); + * + */ +static portTASK_FUNCTION( prvIdleTask, pvParameters ) +{ + /* Stop warnings. */ + ( void ) pvParameters; + + for( ;; ) + { + /* See if any tasks have been deleted. */ + prvCheckTasksWaitingTermination(); + + #if ( configUSE_PREEMPTION == 0 ) + { + /* If we are not using preemption we keep forcing a task switch to + see if any other task has become available. If we are using + preemption we don't need to do this as any task becoming available + will automatically get the processor anyway. */ + taskYIELD(); + } + #endif + + #if ( ( configUSE_PREEMPTION == 1 ) && ( configIDLE_SHOULD_YIELD == 1 ) ) + { + /* When using preemption tasks of equal priority will be + timesliced. If a task that is sharing the idle priority is ready + to run then the idle task should yield before the end of the + timeslice. + + A critical region is not required here as we are just reading from + the list, and an occasional incorrect value will not matter. If + the ready list at the idle priority contains more than one task + then a task other than the idle task is ready to execute. */ + if( listCURRENT_LIST_LENGTH( &( pxReadyTasksLists[ tskIDLE_PRIORITY ] ) ) > ( unsigned portBASE_TYPE ) 1 ) + { + taskYIELD(); + } + } + #endif + + #if ( configUSE_IDLE_HOOK == 1 ) + { + extern void vApplicationIdleHook( void ); + + /* Call the user defined function from within the idle task. This + allows the application designer to add background functionality + without the overhead of a separate task. + NOTE: vApplicationIdleHook() MUST NOT, UNDER ANY CIRCUMSTANCES, + CALL A FUNCTION THAT MIGHT BLOCK. */ + vApplicationIdleHook(); + } + #endif + } +} /*lint !e715 pvParameters is not accessed but all task functions require the same prototype. */ + + + + + + + +/*----------------------------------------------------------- + * File private functions documented at the top of the file. + *----------------------------------------------------------*/ + + + +static void prvInitialiseTCBVariables( tskTCB *pxTCB, const signed char * const pcName, unsigned portBASE_TYPE uxPriority, const xMemoryRegion * const xRegions, unsigned short usStackDepth ) +{ + /* Store the function name in the TCB. */ + #if configMAX_TASK_NAME_LEN > 1 + { + /* Don't bring strncpy into the build unnecessarily. */ + strncpy( ( char * ) pxTCB->pcTaskName, ( const char * ) pcName, ( unsigned short ) configMAX_TASK_NAME_LEN ); + } + #endif + pxTCB->pcTaskName[ ( unsigned short ) configMAX_TASK_NAME_LEN - ( unsigned short ) 1 ] = ( signed char ) '\0'; + + /* This is used as an array index so must ensure it's not too large. First + remove the privilege bit if one is present. */ + if( uxPriority >= configMAX_PRIORITIES ) + { + uxPriority = configMAX_PRIORITIES - ( unsigned portBASE_TYPE ) 1U; + } + + pxTCB->uxPriority = uxPriority; + #if ( configUSE_MUTEXES == 1 ) + { + pxTCB->uxBasePriority = uxPriority; + } + #endif + + vListInitialiseItem( &( pxTCB->xGenericListItem ) ); + vListInitialiseItem( &( pxTCB->xEventListItem ) ); + + /* Set the pxTCB as a link back from the xListItem. This is so we can get + back to the containing TCB from a generic item in a list. */ + listSET_LIST_ITEM_OWNER( &( pxTCB->xGenericListItem ), pxTCB ); + + /* Event lists are always in priority order. */ + listSET_LIST_ITEM_VALUE( &( pxTCB->xEventListItem ), configMAX_PRIORITIES - ( portTickType ) uxPriority ); + listSET_LIST_ITEM_OWNER( &( pxTCB->xEventListItem ), pxTCB ); + + #if ( portCRITICAL_NESTING_IN_TCB == 1 ) + { + pxTCB->uxCriticalNesting = ( unsigned portBASE_TYPE ) 0; + } + #endif + + #if ( configUSE_APPLICATION_TASK_TAG == 1 ) + { + pxTCB->pxTaskTag = NULL; + } + #endif + + #if ( configGENERATE_RUN_TIME_STATS == 1 ) + { + pxTCB->ulRunTimeCounter = 0UL; + } + #endif + + #if ( portUSING_MPU_WRAPPERS == 1 ) + { + vPortStoreTaskMPUSettings( &( pxTCB->xMPUSettings ), xRegions, pxTCB->pxStack, usStackDepth ); + } + #else + { + ( void ) xRegions; + ( void ) usStackDepth; + } + #endif +} +/*-----------------------------------------------------------*/ + +#if ( portUSING_MPU_WRAPPERS == 1 ) + + void vTaskAllocateMPURegions( xTaskHandle xTaskToModify, const xMemoryRegion * const xRegions ) + { + tskTCB *pxTCB; + + if( xTaskToModify == pxCurrentTCB ) + { + xTaskToModify = NULL; + } + + /* If null is passed in here then we are deleting ourselves. */ + pxTCB = prvGetTCBFromHandle( xTaskToModify ); + + vPortStoreTaskMPUSettings( &( pxTCB->xMPUSettings ), xRegions, NULL, 0 ); + } + /*-----------------------------------------------------------*/ +#endif + +static void prvInitialiseTaskLists( void ) +{ +unsigned portBASE_TYPE uxPriority; + + for( uxPriority = ( unsigned portBASE_TYPE ) 0U; uxPriority < configMAX_PRIORITIES; uxPriority++ ) + { + vListInitialise( ( xList * ) &( pxReadyTasksLists[ uxPriority ] ) ); + } + + vListInitialise( ( xList * ) &xDelayedTaskList1 ); + vListInitialise( ( xList * ) &xDelayedTaskList2 ); + vListInitialise( ( xList * ) &xPendingReadyList ); + + #if ( INCLUDE_vTaskDelete == 1 ) + { + vListInitialise( ( xList * ) &xTasksWaitingTermination ); + } + #endif + + #if ( INCLUDE_vTaskSuspend == 1 ) + { + vListInitialise( ( xList * ) &xSuspendedTaskList ); + } + #endif + + /* Start with pxDelayedTaskList using list1 and the pxOverflowDelayedTaskList + using list2. */ + pxDelayedTaskList = &xDelayedTaskList1; + pxOverflowDelayedTaskList = &xDelayedTaskList2; +} +/*-----------------------------------------------------------*/ + +static void prvCheckTasksWaitingTermination( void ) +{ + #if ( INCLUDE_vTaskDelete == 1 ) + { + portBASE_TYPE xListIsEmpty; + + /* ucTasksDeleted is used to prevent vTaskSuspendAll() being called + too often in the idle task. */ + if( uxTasksDeleted > ( unsigned portBASE_TYPE ) 0 ) + { + vTaskSuspendAll(); + xListIsEmpty = listLIST_IS_EMPTY( &xTasksWaitingTermination ); + xTaskResumeAll(); + + if( xListIsEmpty == pdFALSE ) + { + tskTCB *pxTCB; + + taskENTER_CRITICAL(); + { + pxTCB = ( tskTCB * ) listGET_OWNER_OF_HEAD_ENTRY( ( ( xList * ) &xTasksWaitingTermination ) ); + vListRemove( &( pxTCB->xGenericListItem ) ); + --uxCurrentNumberOfTasks; + --uxTasksDeleted; + } + taskEXIT_CRITICAL(); + + prvDeleteTCB( pxTCB ); + } + } + } + #endif +} +/*-----------------------------------------------------------*/ + +static void prvAddCurrentTaskToDelayedList( portTickType xTimeToWake ) +{ + /* The list item will be inserted in wake time order. */ + listSET_LIST_ITEM_VALUE( &( pxCurrentTCB->xGenericListItem ), xTimeToWake ); + + if( xTimeToWake < xTickCount ) + { + /* Wake time has overflowed. Place this item in the overflow list. */ + vListInsert( ( xList * ) pxOverflowDelayedTaskList, ( xListItem * ) &( pxCurrentTCB->xGenericListItem ) ); + } + else + { + /* The wake time has not overflowed, so we can use the current block list. */ + vListInsert( ( xList * ) pxDelayedTaskList, ( xListItem * ) &( pxCurrentTCB->xGenericListItem ) ); + + /* If the task entering the blocked state was placed at the head of the + list of blocked tasks then xNextTaskUnblockTime needs to be updated + too. */ + if( xTimeToWake < xNextTaskUnblockTime ) + { + xNextTaskUnblockTime = xTimeToWake; + } + } +} +/*-----------------------------------------------------------*/ + +static tskTCB *prvAllocateTCBAndStack( unsigned short usStackDepth, portSTACK_TYPE *puxStackBuffer ) +{ +tskTCB *pxNewTCB; + + /* Allocate space for the TCB. Where the memory comes from depends on + the implementation of the port malloc function. */ + pxNewTCB = ( tskTCB * ) pvPortMalloc( sizeof( tskTCB ) ); + + if( pxNewTCB != NULL ) + { + /* Allocate space for the stack used by the task being created. + The base of the stack memory stored in the TCB so the task can + be deleted later if required. */ + pxNewTCB->pxStack = ( portSTACK_TYPE * ) pvPortMallocAligned( ( ( ( size_t )usStackDepth ) * sizeof( portSTACK_TYPE ) ), puxStackBuffer ); + + if( pxNewTCB->pxStack == NULL ) + { + /* Could not allocate the stack. Delete the allocated TCB. */ + vPortFree( pxNewTCB ); + pxNewTCB = NULL; + } + else + { + /* Just to help debugging. */ + memset( pxNewTCB->pxStack, tskSTACK_FILL_BYTE, usStackDepth * sizeof( portSTACK_TYPE ) ); + } + } + + return pxNewTCB; +} +/*-----------------------------------------------------------*/ + +#if ( configUSE_TRACE_FACILITY == 1 ) + + static void prvListTaskWithinSingleList( const signed char *pcWriteBuffer, xList *pxList, signed char cStatus ) + { + volatile tskTCB *pxNextTCB, *pxFirstTCB; + unsigned short usStackRemaining; + + /* Write the details of all the TCB's in pxList into the buffer. */ + listGET_OWNER_OF_NEXT_ENTRY( pxFirstTCB, pxList ); + do + { + listGET_OWNER_OF_NEXT_ENTRY( pxNextTCB, pxList ); + #if ( portSTACK_GROWTH > 0 ) + { + usStackRemaining = usTaskCheckFreeStackSpace( ( unsigned char * ) pxNextTCB->pxEndOfStack ); + } + #else + { + usStackRemaining = usTaskCheckFreeStackSpace( ( unsigned char * ) pxNextTCB->pxStack ); + } + #endif + + sprintf( pcStatusString, ( char * ) "%s\t\t%c\t%u\t%u\t%u\r\n", pxNextTCB->pcTaskName, cStatus, ( unsigned int ) pxNextTCB->uxPriority, usStackRemaining, ( unsigned int ) pxNextTCB->uxTCBNumber ); + strcat( ( char * ) pcWriteBuffer, ( char * ) pcStatusString ); + + } while( pxNextTCB != pxFirstTCB ); + } + +#endif +/*-----------------------------------------------------------*/ + +#if ( configGENERATE_RUN_TIME_STATS == 1 ) + + static void prvGenerateRunTimeStatsForTasksInList( const signed char *pcWriteBuffer, xList *pxList, unsigned long ulTotalRunTime ) + { + volatile tskTCB *pxNextTCB, *pxFirstTCB; + unsigned long ulStatsAsPercentage; + + /* Write the run time stats of all the TCB's in pxList into the buffer. */ + listGET_OWNER_OF_NEXT_ENTRY( pxFirstTCB, pxList ); + do + { + /* Get next TCB in from the list. */ + listGET_OWNER_OF_NEXT_ENTRY( pxNextTCB, pxList ); + + /* Divide by zero check. */ + if( ulTotalRunTime > 0UL ) + { + /* Has the task run at all? */ + if( pxNextTCB->ulRunTimeCounter == 0 ) + { + /* The task has used no CPU time at all. */ + sprintf( pcStatsString, ( char * ) "%s\t\t0\t\t0%%\r\n", pxNextTCB->pcTaskName ); + } + else + { + /* What percentage of the total run time has the task used? + This will always be rounded down to the nearest integer. + ulTotalRunTime has already been divided by 100. */ + ulStatsAsPercentage = pxNextTCB->ulRunTimeCounter / ulTotalRunTime; + + if( ulStatsAsPercentage > 0UL ) + { + #ifdef portLU_PRINTF_SPECIFIER_REQUIRED + { + sprintf( pcStatsString, ( char * ) "%s\t\t%lu\t\t%lu%%\r\n", pxNextTCB->pcTaskName, pxNextTCB->ulRunTimeCounter, ulStatsAsPercentage ); + } + #else + { + /* sizeof( int ) == sizeof( long ) so a smaller + printf() library can be used. */ + sprintf( pcStatsString, ( char * ) "%s\t\t%u\t\t%u%%\r\n", pxNextTCB->pcTaskName, ( unsigned int ) pxNextTCB->ulRunTimeCounter, ( unsigned int ) ulStatsAsPercentage ); + } + #endif + } + else + { + /* If the percentage is zero here then the task has + consumed less than 1% of the total run time. */ + #ifdef portLU_PRINTF_SPECIFIER_REQUIRED + { + sprintf( pcStatsString, ( char * ) "%s\t\t%lu\t\t<1%%\r\n", pxNextTCB->pcTaskName, pxNextTCB->ulRunTimeCounter ); + } + #else + { + /* sizeof( int ) == sizeof( long ) so a smaller + printf() library can be used. */ + sprintf( pcStatsString, ( char * ) "%s\t\t%u\t\t<1%%\r\n", pxNextTCB->pcTaskName, ( unsigned int ) pxNextTCB->ulRunTimeCounter ); + } + #endif + } + } + + strcat( ( char * ) pcWriteBuffer, ( char * ) pcStatsString ); + } + + } while( pxNextTCB != pxFirstTCB ); + } + +#endif +/*-----------------------------------------------------------*/ + +#if ( ( configUSE_TRACE_FACILITY == 1 ) || ( INCLUDE_uxTaskGetStackHighWaterMark == 1 ) ) + + static unsigned short usTaskCheckFreeStackSpace( const unsigned char * pucStackByte ) + { + register unsigned short usCount = 0; + + while( *pucStackByte == tskSTACK_FILL_BYTE ) + { + pucStackByte -= portSTACK_GROWTH; + usCount++; + } + + usCount /= sizeof( portSTACK_TYPE ); + + return usCount; + } + +#endif +/*-----------------------------------------------------------*/ + +#if ( INCLUDE_uxTaskGetStackHighWaterMark == 1 ) + + unsigned portBASE_TYPE uxTaskGetStackHighWaterMark( xTaskHandle xTask ) + { + tskTCB *pxTCB; + unsigned char *pcEndOfStack; + unsigned portBASE_TYPE uxReturn; + + pxTCB = prvGetTCBFromHandle( xTask ); + + #if portSTACK_GROWTH < 0 + { + pcEndOfStack = ( unsigned char * ) pxTCB->pxStack; + } + #else + { + pcEndOfStack = ( unsigned char * ) pxTCB->pxEndOfStack; + } + #endif + + uxReturn = ( unsigned portBASE_TYPE ) usTaskCheckFreeStackSpace( pcEndOfStack ); + + return uxReturn; + } + +#endif +/*-----------------------------------------------------------*/ + +#if ( ( INCLUDE_vTaskDelete == 1 ) || ( INCLUDE_vTaskCleanUpResources == 1 ) ) + + static void prvDeleteTCB( tskTCB *pxTCB ) + { + /* 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. */ + vPortFreeAligned( pxTCB->pxStack ); + vPortFree( pxTCB ); + } + +#endif + + +/*-----------------------------------------------------------*/ + +#if ( ( INCLUDE_xTaskGetCurrentTaskHandle == 1 ) || ( configUSE_MUTEXES == 1 ) ) + + xTaskHandle xTaskGetCurrentTaskHandle( void ) + { + xTaskHandle xReturn; + + /* A critical section is not required as this is not called from + an interrupt and the current TCB will always be the same for any + individual execution thread. */ + xReturn = pxCurrentTCB; + + return xReturn; + } + +#endif + +/*-----------------------------------------------------------*/ + +#if ( ( INCLUDE_xTaskGetSchedulerState == 1 ) || ( configUSE_TIMERS == 1 ) ) + + portBASE_TYPE xTaskGetSchedulerState( void ) + { + portBASE_TYPE xReturn; + + if( xSchedulerRunning == pdFALSE ) + { + xReturn = taskSCHEDULER_NOT_STARTED; + } + else + { + if( uxSchedulerSuspended == ( unsigned portBASE_TYPE ) pdFALSE ) + { + xReturn = taskSCHEDULER_RUNNING; + } + else + { + xReturn = taskSCHEDULER_SUSPENDED; + } + } + + return xReturn; + } + +#endif +/*-----------------------------------------------------------*/ + +#if ( configUSE_MUTEXES == 1 ) + + void vTaskPriorityInherit( xTaskHandle * const pxMutexHolder ) + { + tskTCB * const pxTCB = ( tskTCB * ) pxMutexHolder; + + configASSERT( pxMutexHolder ); + + if( pxTCB->uxPriority < pxCurrentTCB->uxPriority ) + { + /* Adjust the mutex holder state to account for its new priority. */ + listSET_LIST_ITEM_VALUE( &( pxTCB->xEventListItem ), configMAX_PRIORITIES - ( portTickType ) pxCurrentTCB->uxPriority ); + + /* If the task being modified is in the ready state it will need to + be moved in to a new list. */ + if( listIS_CONTAINED_WITHIN( &( pxReadyTasksLists[ pxTCB->uxPriority ] ), &( pxTCB->xGenericListItem ) ) ) + { + vListRemove( &( pxTCB->xGenericListItem ) ); + + /* Inherit the priority before being moved into the new list. */ + pxTCB->uxPriority = pxCurrentTCB->uxPriority; + prvAddTaskToReadyQueue( pxTCB ); + } + else + { + /* Just inherit the priority. */ + pxTCB->uxPriority = pxCurrentTCB->uxPriority; + } + } + } + +#endif +/*-----------------------------------------------------------*/ + +#if ( configUSE_MUTEXES == 1 ) + + void vTaskPriorityDisinherit( xTaskHandle * const pxMutexHolder ) + { + tskTCB * const pxTCB = ( tskTCB * ) pxMutexHolder; + + if( pxMutexHolder != NULL ) + { + if( pxTCB->uxPriority != pxTCB->uxBasePriority ) + { + /* We must be the running task to be able to give the mutex back. + Remove ourselves from the ready list we currently appear in. */ + vListRemove( &( pxTCB->xGenericListItem ) ); + + /* Disinherit the priority before adding ourselves into the new + ready list. */ + pxTCB->uxPriority = pxTCB->uxBasePriority; + listSET_LIST_ITEM_VALUE( &( pxTCB->xEventListItem ), configMAX_PRIORITIES - ( portTickType ) pxTCB->uxPriority ); + prvAddTaskToReadyQueue( pxTCB ); + } + } + } + +#endif +/*-----------------------------------------------------------*/ + +#if ( portCRITICAL_NESTING_IN_TCB == 1 ) + + void vTaskEnterCritical( void ) + { + portDISABLE_INTERRUPTS(); + + if( xSchedulerRunning != pdFALSE ) + { + ( pxCurrentTCB->uxCriticalNesting )++; + } + } + +#endif +/*-----------------------------------------------------------*/ + +#if ( portCRITICAL_NESTING_IN_TCB == 1 ) + +void vTaskExitCritical( void ) +{ + if( xSchedulerRunning != pdFALSE ) + { + if( pxCurrentTCB->uxCriticalNesting > 0 ) + { + ( pxCurrentTCB->uxCriticalNesting )--; + + if( pxCurrentTCB->uxCriticalNesting == 0 ) + { + portENABLE_INTERRUPTS(); + } + } + } +} + +#endif +/*-----------------------------------------------------------*/ + + + + diff --git a/TP1_labyrinth_etu/FreeRTOS_src/timers.c b/TP1_labyrinth_etu/FreeRTOS_src/timers.c new file mode 100644 index 0000000000000000000000000000000000000000..7e5ef22addaf00433a7a10800cca496cdca84111 --- /dev/null +++ b/TP1_labyrinth_etu/FreeRTOS_src/timers.c @@ -0,0 +1,649 @@ +/* + FreeRTOS V7.0.1 - Copyright (C) 2011 Real Time Engineers Ltd. + + + FreeRTOS supports many tools and architectures. V7.0.0 is sponsored by: + Atollic AB - Atollic provides professional embedded systems development + tools for C/C++ development, code analysis and test automation. + See http://www.atollic.com + + + *************************************************************************** + * * + * FreeRTOS tutorial books are available in pdf and paperback. * + * Complete, revised, and edited pdf reference manuals are also * + * available. * + * * + * Purchasing FreeRTOS documentation will not only help you, by * + * ensuring you get running as quickly as possible and with an * + * in-depth knowledge of how to use FreeRTOS, it will also help * + * the FreeRTOS project to continue with its mission of providing * + * professional grade, cross platform, de facto standard solutions * + * for microcontrollers - completely free of charge! * + * * + * >>> See http://www.FreeRTOS.org/Documentation for details. <<< * + * * + * Thank you for using FreeRTOS, and thank you for your support! * + * * + *************************************************************************** + + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation AND MODIFIED BY the FreeRTOS exception. + >>>NOTE<<< The modification to the GPL is included to allow you to + distribute a combined work that includes FreeRTOS without being obliged to + provide the source code for proprietary components outside of the FreeRTOS + kernel. FreeRTOS is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + more details. You should have received a copy of the GNU General Public + License and the FreeRTOS license exception along with FreeRTOS; if not it + can be viewed here: http://www.freertos.org/a00114.html and also obtained + by writing to Richard Barry, contact details for whom are available on the + FreeRTOS WEB site. + + 1 tab == 4 spaces! + + http://www.FreeRTOS.org - Documentation, latest information, license and + contact details. + + http://www.SafeRTOS.com - A version that is certified for use in safety + critical systems. + + http://www.OpenRTOS.com - Commercial support, development, porting, + licensing and training services. +*/ + +/* Defining MPU_WRAPPERS_INCLUDED_FROM_API_FILE prevents task.h from redefining +all the API functions to use the MPU wrappers. That should only be done when +task.h is included from an application file. */ +#define MPU_WRAPPERS_INCLUDED_FROM_API_FILE + +#include "FreeRTOS.h" +#include "task.h" +#include "queue.h" +#include "timers.h" + +#undef MPU_WRAPPERS_INCLUDED_FROM_API_FILE + +/* This entire source file will be skipped if the application is not configured +to include software timer functionality. This #if is closed at the very bottom +of this file. If you want to include software timer functionality then ensure +configUSE_TIMERS is set to 1 in FreeRTOSConfig.h. */ +#if ( configUSE_TIMERS == 1 ) + +/* Misc definitions. */ +#define tmrNO_DELAY ( portTickType ) 0U + +/* The definition of the timers themselves. */ +typedef struct tmrTimerControl +{ + const signed char *pcTimerName; /*<< Text name. This is not used by the kernel, it is included simply to make debugging easier. */ + xListItem xTimerListItem; /*<< Standard linked list item as used by all kernel features for event management. */ + portTickType xTimerPeriodInTicks;/*<< How quickly and often the timer expires. */ + unsigned portBASE_TYPE uxAutoReload; /*<< Set to pdTRUE if the timer should be automatically restarted once expired. Set to pdFALSE if the timer is, in effect, a one shot timer. */ + void *pvTimerID; /*<< An ID to identify the timer. This allows the timer to be identified when the same callback is used for multiple timers. */ + tmrTIMER_CALLBACK pxCallbackFunction; /*<< The function that will be called when the timer expires. */ +} xTIMER; + +/* The definition of messages that can be sent and received on the timer +queue. */ +typedef struct tmrTimerQueueMessage +{ + portBASE_TYPE xMessageID; /*<< The command being sent to the timer service task. */ + portTickType xMessageValue; /*<< An optional value used by a subset of commands, for example, when changing the period of a timer. */ + xTIMER * pxTimer; /*<< The timer to which the command will be applied. */ +} xTIMER_MESSAGE; + + +/* The list in which active timers are stored. Timers are referenced in expire +time order, with the nearest expiry time at the front of the list. Only the +timer service task is allowed to access xActiveTimerList. */ +PRIVILEGED_DATA static xList xActiveTimerList1; +PRIVILEGED_DATA static xList xActiveTimerList2; +PRIVILEGED_DATA static xList *pxCurrentTimerList; +PRIVILEGED_DATA static xList *pxOverflowTimerList; + +/* A queue that is used to send commands to the timer service task. */ +PRIVILEGED_DATA static xQueueHandle xTimerQueue = NULL; + +/*-----------------------------------------------------------*/ + +/* + * Initialise the infrastructure used by the timer service task if it has not + * been initialised already. + */ +static void prvCheckForValidListAndQueue( void ) PRIVILEGED_FUNCTION; + +/* + * The timer service task (daemon). Timer functionality is controlled by this + * task. Other tasks communicate with the timer service task using the + * xTimerQueue queue. + */ +static void prvTimerTask( void *pvParameters ) PRIVILEGED_FUNCTION; + +/* + * Called by the timer service task to interpret and process a command it + * received on the timer queue. + */ +static void prvProcessReceivedCommands( void ) PRIVILEGED_FUNCTION; + +/* + * Insert the timer into either xActiveTimerList1, or xActiveTimerList2, + * depending on if the expire time causes a timer counter overflow. + */ +static portBASE_TYPE prvInsertTimerInActiveList( xTIMER *pxTimer, portTickType xNextExpiryTime, portTickType xTimeNow, portTickType xCommandTime ) PRIVILEGED_FUNCTION; + +/* + * An active timer has reached its expire time. Reload the timer if it is an + * auto reload timer, then call its callback. + */ +static void prvProcessExpiredTimer( portTickType xNextExpireTime, portTickType xTimeNow ) PRIVILEGED_FUNCTION; + +/* + * The tick count has overflowed. Switch the timer lists after ensuring the + * current timer list does not still reference some timers. + */ +static void prvSwitchTimerLists( portTickType xLastTime ) PRIVILEGED_FUNCTION; + +/* + * Obtain the current tick count, setting *pxTimerListsWereSwitched to pdTRUE + * if a tick count overflow occurred since prvSampleTimeNow() was last called. + */ +static portTickType prvSampleTimeNow( portBASE_TYPE *pxTimerListsWereSwitched ) PRIVILEGED_FUNCTION; + +/* + * If the timer list contains any active timers then return the expire time of + * the timer that will expire first and set *pxListWasEmpty to false. If the + * timer list does not contain any timers then return 0 and set *pxListWasEmpty + * to pdTRUE. + */ +static portTickType prvGetNextExpireTime( portBASE_TYPE *pxListWasEmpty ) PRIVILEGED_FUNCTION; + +/* + * If a timer has expired, process it. Otherwise, block the timer service task + * until either a timer does expire or a command is received. + */ +static void prvProcessTimerOrBlockTask( portTickType xNextExpireTime, portBASE_TYPE xListWasEmpty ) PRIVILEGED_FUNCTION; + +/*-----------------------------------------------------------*/ + +portBASE_TYPE xTimerCreateTimerTask( void ) +{ +portBASE_TYPE xReturn = pdFAIL; + + /* This function is called when the scheduler is started if + configUSE_TIMERS is set to 1. Check that the infrastructure used by the + timer service task has been created/initialised. If timers have already + been created then the initialisation will already have been performed. */ + prvCheckForValidListAndQueue(); + + if( xTimerQueue != NULL ) + { + xReturn = xTaskCreate( prvTimerTask, ( const signed char * ) "Tmr Svc", ( unsigned short ) configTIMER_TASK_STACK_DEPTH, NULL, ( unsigned portBASE_TYPE ) configTIMER_TASK_PRIORITY, NULL); + } + + configASSERT( xReturn ); + return xReturn; +} +/*-----------------------------------------------------------*/ + +xTimerHandle xTimerCreate( const signed char *pcTimerName, portTickType xTimerPeriodInTicks, unsigned portBASE_TYPE uxAutoReload, void *pvTimerID, tmrTIMER_CALLBACK pxCallbackFunction ) +{ +xTIMER *pxNewTimer; + + /* Allocate the timer structure. */ + if( xTimerPeriodInTicks == ( portTickType ) 0U ) + { + pxNewTimer = NULL; + configASSERT( ( xTimerPeriodInTicks > 0 ) ); + } + else + { + pxNewTimer = ( xTIMER * ) pvPortMalloc( sizeof( xTIMER ) ); + if( pxNewTimer != NULL ) + { + /* Ensure the infrastructure used by the timer service task has been + created/initialised. */ + prvCheckForValidListAndQueue(); + + /* Initialise the timer structure members using the function parameters. */ + pxNewTimer->pcTimerName = pcTimerName; + pxNewTimer->xTimerPeriodInTicks = xTimerPeriodInTicks; + pxNewTimer->uxAutoReload = uxAutoReload; + pxNewTimer->pvTimerID = pvTimerID; + pxNewTimer->pxCallbackFunction = pxCallbackFunction; + vListInitialiseItem( &( pxNewTimer->xTimerListItem ) ); + + traceTIMER_CREATE( pxNewTimer ); + } + else + { + traceTIMER_CREATE_FAILED(); + } + } + + return ( xTimerHandle ) pxNewTimer; +} +/*-----------------------------------------------------------*/ + +portBASE_TYPE xTimerGenericCommand( xTimerHandle xTimer, portBASE_TYPE xCommandID, portTickType xOptionalValue, portBASE_TYPE *pxHigherPriorityTaskWoken, portTickType xBlockTime ) +{ +portBASE_TYPE xReturn = pdFAIL; +xTIMER_MESSAGE xMessage; + + /* Send a message to the timer service task to perform a particular action + on a particular timer definition. */ + if( xTimerQueue != NULL ) + { + /* Send a command to the timer service task to start the xTimer timer. */ + xMessage.xMessageID = xCommandID; + xMessage.xMessageValue = xOptionalValue; + xMessage.pxTimer = ( xTIMER * ) xTimer; + + if( pxHigherPriorityTaskWoken == NULL ) + { + if( xTaskGetSchedulerState() == taskSCHEDULER_RUNNING ) + { + xReturn = xQueueSendToBack( xTimerQueue, &xMessage, xBlockTime ); + } + else + { + xReturn = xQueueSendToBack( xTimerQueue, &xMessage, tmrNO_DELAY ); + } + } + else + { + xReturn = xQueueSendToBackFromISR( xTimerQueue, &xMessage, pxHigherPriorityTaskWoken ); + } + + traceTIMER_COMMAND_SEND( xTimer, xCommandID, xOptionalValue, xReturn ); + } + + return xReturn; +} +/*-----------------------------------------------------------*/ + +static void prvProcessExpiredTimer( portTickType xNextExpireTime, portTickType xTimeNow ) +{ +xTIMER *pxTimer; +portBASE_TYPE xResult; + + /* Remove the timer from the list of active timers. A check has already + been performed to ensure the list is not empty. */ + pxTimer = ( xTIMER * ) listGET_OWNER_OF_HEAD_ENTRY( pxCurrentTimerList ); + vListRemove( &( pxTimer->xTimerListItem ) ); + traceTIMER_EXPIRED( pxTimer ); + + /* 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. */ + if( pxTimer->uxAutoReload == ( unsigned portBASE_TYPE ) pdTRUE ) + { + /* This is the only time a timer is inserted into a list using + a time relative to anything other than the current time. It + will therefore be inserted into the correct list relative to + the time this task thinks it is now, even if a command to + switch lists due to a tick count overflow is already waiting in + the timer queue. */ + if( prvInsertTimerInActiveList( pxTimer, ( xNextExpireTime + pxTimer->xTimerPeriodInTicks ), xTimeNow, xNextExpireTime ) == pdTRUE ) + { + /* The timer expired before it was added to the active timer + list. Reload it now. */ + xResult = xTimerGenericCommand( pxTimer, tmrCOMMAND_START, xNextExpireTime, NULL, tmrNO_DELAY ); + configASSERT( xResult ); + ( void ) xResult; + } + } + + /* Call the timer callback. */ + pxTimer->pxCallbackFunction( ( xTimerHandle ) pxTimer ); +} +/*-----------------------------------------------------------*/ + +static void prvTimerTask( void *pvParameters ) +{ +portTickType xNextExpireTime; +portBASE_TYPE xListWasEmpty; + + /* Just to avoid compiler warnings. */ + ( void ) pvParameters; + + for( ;; ) + { + /* Query the timers list to see if it contains any timers, and if so, + obtain the time at which the next timer will expire. */ + xNextExpireTime = prvGetNextExpireTime( &xListWasEmpty ); + + /* If a timer has expired, process it. Otherwise, block this task + until either a timer does expire, or a command is received. */ + prvProcessTimerOrBlockTask( xNextExpireTime, xListWasEmpty ); + + /* Empty the command queue. */ + prvProcessReceivedCommands(); + } +} +/*-----------------------------------------------------------*/ + +static void prvProcessTimerOrBlockTask( portTickType xNextExpireTime, portBASE_TYPE xListWasEmpty ) +{ +portTickType xTimeNow; +portBASE_TYPE xTimerListsWereSwitched; + + vTaskSuspendAll(); + { + /* Obtain the time now to make an assessment as to whether the timer + has expired or not. If obtaining the time causes the lists to switch + then don't process this timer as any timers that remained in the list + when the lists were switched will have been processed within the + prvSampelTimeNow() function. */ + xTimeNow = prvSampleTimeNow( &xTimerListsWereSwitched ); + if( xTimerListsWereSwitched == pdFALSE ) + { + /* The tick count has not overflowed, has the timer expired? */ + if( ( xListWasEmpty == pdFALSE ) && ( xNextExpireTime <= xTimeNow ) ) + { + xTaskResumeAll(); + prvProcessExpiredTimer( xNextExpireTime, xTimeNow ); + } + else + { + /* The tick count has not overflowed, and the next expire + time has not been reached yet. This task should therefore + block to wait for the next expire time or a command to be + received - whichever comes first. The following line cannot + be reached unless xNextExpireTime > xTimeNow, except in the + case when the current timer list is empty. */ + vQueueWaitForMessageRestricted( xTimerQueue, ( xNextExpireTime - xTimeNow ) ); + + if( xTaskResumeAll() == pdFALSE ) + { + /* Yield to wait for either a command to arrive, or the block time + to expire. If a command arrived between the critical section being + exited and this yield then the yield will not cause the task + to block. */ + portYIELD_WITHIN_API(); + } + } + } + else + { + xTaskResumeAll(); + } + } +} +/*-----------------------------------------------------------*/ + +static portTickType prvGetNextExpireTime( portBASE_TYPE *pxListWasEmpty ) +{ +portTickType xNextExpireTime; + + /* Timers are listed in expiry time order, with the head of the list + referencing the task that will expire first. Obtain the time at which + the timer with the nearest expiry time will expire. If there are no + active timers then just set the next expire time to 0. That will cause + this task to unblock when the tick count overflows, at which point the + timer lists will be switched and the next expiry time can be + re-assessed. */ + *pxListWasEmpty = listLIST_IS_EMPTY( pxCurrentTimerList ); + if( *pxListWasEmpty == pdFALSE ) + { + xNextExpireTime = listGET_ITEM_VALUE_OF_HEAD_ENTRY( pxCurrentTimerList ); + } + else + { + /* Ensure the task unblocks when the tick count rolls over. */ + xNextExpireTime = ( portTickType ) 0U; + } + + return xNextExpireTime; +} +/*-----------------------------------------------------------*/ + +static portTickType prvSampleTimeNow( portBASE_TYPE *pxTimerListsWereSwitched ) +{ +portTickType xTimeNow; +static portTickType xLastTime = ( portTickType ) 0U; + + xTimeNow = xTaskGetTickCount(); + + if( xTimeNow < xLastTime ) + { + prvSwitchTimerLists( xLastTime ); + *pxTimerListsWereSwitched = pdTRUE; + } + else + { + *pxTimerListsWereSwitched = pdFALSE; + } + + xLastTime = xTimeNow; + + return xTimeNow; +} +/*-----------------------------------------------------------*/ + +static portBASE_TYPE prvInsertTimerInActiveList( xTIMER *pxTimer, portTickType xNextExpiryTime, portTickType xTimeNow, portTickType xCommandTime ) +{ +portBASE_TYPE xProcessTimerNow = pdFALSE; + + listSET_LIST_ITEM_VALUE( &( pxTimer->xTimerListItem ), xNextExpiryTime ); + listSET_LIST_ITEM_OWNER( &( pxTimer->xTimerListItem ), pxTimer ); + + if( xNextExpiryTime <= xTimeNow ) + { + /* Has the expiry time elapsed between the command to start/reset a + timer was issued, and the time the command was processed? */ + if( ( ( portTickType ) ( xTimeNow - xCommandTime ) ) >= pxTimer->xTimerPeriodInTicks ) + { + /* The time between a command being issued and the command being + processed actually exceeds the timers period. */ + xProcessTimerNow = pdTRUE; + } + else + { + vListInsert( pxOverflowTimerList, &( pxTimer->xTimerListItem ) ); + } + } + else + { + if( ( xTimeNow < xCommandTime ) && ( xNextExpiryTime >= xCommandTime ) ) + { + /* If, since the command was issued, the tick count has overflowed + but the expiry time has not, then the timer must have already passed + its expiry time and should be processed immediately. */ + xProcessTimerNow = pdTRUE; + } + else + { + vListInsert( pxCurrentTimerList, &( pxTimer->xTimerListItem ) ); + } + } + + return xProcessTimerNow; +} +/*-----------------------------------------------------------*/ + +static void prvProcessReceivedCommands( void ) +{ +xTIMER_MESSAGE xMessage; +xTIMER *pxTimer; +portBASE_TYPE xTimerListsWereSwitched, xResult; +portTickType xTimeNow; + + /* In this case the xTimerListsWereSwitched parameter is not used, but it + must be present in the function call. */ + xTimeNow = prvSampleTimeNow( &xTimerListsWereSwitched ); + + while( xQueueReceive( xTimerQueue, &xMessage, tmrNO_DELAY ) != pdFAIL ) + { + pxTimer = xMessage.pxTimer; + + /* Is the timer already in a list of active timers? When the command + is trmCOMMAND_PROCESS_TIMER_OVERFLOW, the timer will be NULL as the + command is to the task rather than to an individual timer. */ + if( pxTimer != NULL ) + { + if( listIS_CONTAINED_WITHIN( NULL, &( pxTimer->xTimerListItem ) ) == pdFALSE ) + { + /* The timer is in a list, remove it. */ + vListRemove( &( pxTimer->xTimerListItem ) ); + } + } + + traceTIMER_COMMAND_RECEIVED( pxTimer, xMessage.xMessageID, xMessage.xMessageValue ); + + switch( xMessage.xMessageID ) + { + case tmrCOMMAND_START : + /* Start or restart a timer. */ + if( prvInsertTimerInActiveList( pxTimer, xMessage.xMessageValue + pxTimer->xTimerPeriodInTicks, xTimeNow, xMessage.xMessageValue ) == pdTRUE ) + { + /* The timer expired before it was added to the active timer + list. Process it now. */ + pxTimer->pxCallbackFunction( ( xTimerHandle ) pxTimer ); + + if( pxTimer->uxAutoReload == ( unsigned portBASE_TYPE ) pdTRUE ) + { + xResult = xTimerGenericCommand( pxTimer, tmrCOMMAND_START, xMessage.xMessageValue + pxTimer->xTimerPeriodInTicks, NULL, tmrNO_DELAY ); + configASSERT( xResult ); + ( void ) xResult; + } + } + break; + + case tmrCOMMAND_STOP : + /* The timer has already been removed from the active list. + There is nothing to do here. */ + break; + + case tmrCOMMAND_CHANGE_PERIOD : + pxTimer->xTimerPeriodInTicks = xMessage.xMessageValue; + configASSERT( ( pxTimer->xTimerPeriodInTicks > 0 ) ); + prvInsertTimerInActiveList( pxTimer, ( xTimeNow + pxTimer->xTimerPeriodInTicks ), xTimeNow, xTimeNow ); + break; + + case tmrCOMMAND_DELETE : + /* The timer has already been removed from the active list, + just free up the memory. */ + vPortFree( pxTimer ); + break; + + default : + /* Don't expect to get here. */ + break; + } + } +} +/*-----------------------------------------------------------*/ + +static void prvSwitchTimerLists( portTickType xLastTime ) +{ +portTickType xNextExpireTime, xReloadTime; +xList *pxTemp; +xTIMER *pxTimer; +portBASE_TYPE xResult; + + /* Remove compiler warnings if configASSERT() is not defined. */ + ( void ) xLastTime; + + /* The tick count has overflowed. The timer lists must be switched. + If there are any timers still referenced from the current timer list + then they must have expired and should be processed before the lists + are switched. */ + while( listLIST_IS_EMPTY( pxCurrentTimerList ) == pdFALSE ) + { + xNextExpireTime = listGET_ITEM_VALUE_OF_HEAD_ENTRY( pxCurrentTimerList ); + + /* Remove the timer from the list. */ + pxTimer = ( xTIMER * ) listGET_OWNER_OF_HEAD_ENTRY( pxCurrentTimerList ); + vListRemove( &( pxTimer->xTimerListItem ) ); + + /* Execute its callback, then send a command to restart the timer if + it is an auto-reload timer. It cannot be restarted here as the lists + have not yet been switched. */ + pxTimer->pxCallbackFunction( ( xTimerHandle ) pxTimer ); + + if( pxTimer->uxAutoReload == ( unsigned portBASE_TYPE ) pdTRUE ) + { + /* Calculate the reload value, and if the reload value results in + the timer going into the same timer list then it has already expired + and the timer should be re-inserted into the current list so it is + processed again within this loop. Otherwise a command should be sent + to restart the timer to ensure it is only inserted into a list after + the lists have been swapped. */ + xReloadTime = ( xNextExpireTime + pxTimer->xTimerPeriodInTicks ); + if( xReloadTime > xNextExpireTime ) + { + listSET_LIST_ITEM_VALUE( &( pxTimer->xTimerListItem ), xReloadTime ); + listSET_LIST_ITEM_OWNER( &( pxTimer->xTimerListItem ), pxTimer ); + vListInsert( pxCurrentTimerList, &( pxTimer->xTimerListItem ) ); + } + else + { + xResult = xTimerGenericCommand( pxTimer, tmrCOMMAND_START, xNextExpireTime, NULL, tmrNO_DELAY ); + configASSERT( xResult ); + ( void ) xResult; + } + } + } + + pxTemp = pxCurrentTimerList; + pxCurrentTimerList = pxOverflowTimerList; + pxOverflowTimerList = pxTemp; +} +/*-----------------------------------------------------------*/ + +static void prvCheckForValidListAndQueue( void ) +{ + /* Check that the list from which active timers are referenced, and the + queue used to communicate with the timer service, have been + initialised. */ + taskENTER_CRITICAL(); + { + if( xTimerQueue == NULL ) + { + vListInitialise( &xActiveTimerList1 ); + vListInitialise( &xActiveTimerList2 ); + pxCurrentTimerList = &xActiveTimerList1; + pxOverflowTimerList = &xActiveTimerList2; + xTimerQueue = xQueueCreate( ( unsigned portBASE_TYPE ) configTIMER_QUEUE_LENGTH, sizeof( xTIMER_MESSAGE ) ); + } + } + taskEXIT_CRITICAL(); +} +/*-----------------------------------------------------------*/ + +portBASE_TYPE xTimerIsTimerActive( xTimerHandle xTimer ) +{ +portBASE_TYPE xTimerIsInActiveList; +xTIMER *pxTimer = ( xTIMER * ) xTimer; + + /* Is the timer in the list of active timers? */ + taskENTER_CRITICAL(); + { + /* Checking to see if it is in the NULL list in effect checks to see if + it is referenced from either the current or the overflow timer lists in + one go, but the logic has to be reversed, hence the '!'. */ + xTimerIsInActiveList = !( listIS_CONTAINED_WITHIN( NULL, &( pxTimer->xTimerListItem ) ) ); + } + taskEXIT_CRITICAL(); + + return xTimerIsInActiveList; +} +/*-----------------------------------------------------------*/ + +void *pvTimerGetTimerID( xTimerHandle xTimer ) +{ +xTIMER *pxTimer = ( xTIMER * ) xTimer; + + return pxTimer->pvTimerID; +} +/*-----------------------------------------------------------*/ + +/* This entire source file will be skipped if the application is not configured +to include software timer functionality. If you want to include software timer +functionality then ensure configUSE_TIMERS is set to 1 in FreeRTOSConfig.h. */ +#endif /* configUSE_TIMERS == 1 */ diff --git a/TP1_labyrinth_etu/TP1_labyrinth_etu Debug.launch b/TP1_labyrinth_etu/TP1_labyrinth_etu Debug.launch new file mode 100644 index 0000000000000000000000000000000000000000..1d67fe31b425ed55412058e8c975c5839f2ca142 --- /dev/null +++ b/TP1_labyrinth_etu/TP1_labyrinth_etu Debug.launch @@ -0,0 +1,23 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<launchConfiguration type="com.crt.dsfdebug.crtmcu.launchType"> +<stringAttribute key="com.crt.ctrlcenter.OFSemuDetails" value="LinkServer"/> +<booleanAttribute key="com.crt.ctrlcenter.crtInit" value="true"/> +<stringAttribute key="com.crt.ctrlcenter.currentWireType" value="SWD"/> +<stringAttribute key="com.crt.ctrlcenter.serialNumber" value="LinkServerNXPNXP CMSIS-DAP"/> +<stringAttribute key="com.crt.ctrlcenter.targetbase" value="NXP LPC17xx"/> +<stringAttribute key="com.crt.ctrlcenter.targetconfig" value="<?xml version="1.0" encoding="UTF-8"?> <config chipvendor="NXP" genname="NXP LPC17xx" id="config.gdb.stub"><parameters><params><param default="true" description="Vector catch" name="Vector catch" value="false" var="vector.catch"><enum value="True"/> <enum value="False"/> </param> </params> <initValue value="false" var="vector.catch"/> <params><param default="On" description="Enablement of semihosting support" name="Semihosting support" value="On" var="internal.semihost"><enum value="On"/> <enum value="Off"/> <enum value="Auto"/> </param> </params> <params><param default="" description="Maximum wire speed in KHz (leave blank to Auto-detect). Not all values are supported by all targets" name="Maximum wire speed" probe="^(?!Redlink Server|LinkServer$).*$" type="nullString" value="" var="emu.speed"><enum value=""/> <enum value="30000"/> <enum value="15000"/> <enum value="10000"/> <enum value="7500"/> <enum value="6000"/> <enum value="5000"/> <enum value="3750"/> <enum value="3000"/> <enum value="2500"/> <enum value="2000"/> <enum value="1500"/> <enum value="1250"/> <enum value="1200"/> <enum value="1000"/> <enum value="750"/> <enum value="600"/> <enum value="500"/> <enum value="400"/> <enum value="300"/> <enum value="250"/> <enum value="200"/> <enum value="150"/> </param> </params> <params><param content="serverScript" description="Connect script" name="Connect Script" probe="(?i)(Redlink\s+Server|CMSIS-DAP|LinkServer)" required="false" type="nullString" var="internal.connect.script"/> <param content="serverScript" description="Reset script" name="Reset Script" probe="(?i)(Redlink\s+Server|CMSIS-DAP|LinkServer)" required="false" type="nullString" var="internal.reset.script"/> <param default="" description="Select the reset handling type for this debug connection" name="Reset Handling" probe="(?i)(Redlink\s+Server|CMSIS-DAP|LinkServer)" value="VECTRESET" var="internal.resethandling"><enum value="SYSRESETREQ"/> <enum value="VECTRESET"/> <enum value="Default"/> <enum value=""/> </param> <param default="" description="Additional options" name="Additional options" value="" var="misc.options"/> <param default="2" description="Set stub debug level (1-4)" name="Debug Level " value="2" var="debug.level"/> <param default="False" description="when True, attach to running target only (without loading image)" name="Attach only" required="true" value="False" var="attach"><enum value="True"/> <enum value="False"/> </param> <param default="True" description="Deprecated. Functionality superseded by &apos;Attach only&apos;" name="Load image" type="boolean" value="True" var="load"><enum value="True"/> <enum value="False"/> </param> <param default="cont" description="Run, continue or (do nothing)" name="Run/Continue image" value="cont" var="run"><enum value="run"/> <enum value="cont"/> <enum value=""/> </param> <param default="off" description="If on is specified, make the debugger treat unknown memory as non-existent and refuse \naccesses to such memory. If off is specified, treat the memory as RAM" name="Memory Access Checking" value="off" var="mem.access"><enum value="on"/> <enum value="off"/> </param> <param default="cont" description="choose the disconnect behavior for the target" name="Disconnect behavior" value="cont" var="ondisconnect"><enum value="nochange"/> <enum value="stop"/> <enum value="cont"/> <enum value="run_cont"/> </param> <param default="" description="Command to run before starting the debugger" name="Pre launch command" value="" var="internal.prelaunch.command"/> <param default="" description="Target Wirespeed in Hz" name="Wirespeed (Hz)" probe="(?i)(Redlink\s+Server|CMSIS-DAP|LinkServer)" value="" var="internal.wirespeed"/> </params> <initvalue value="VECTRESET" var="internal.resethandling"/> <params><param default="SWD" description="Internal wiretypes" mode="hidden" name="Wiretype" probe="NEVER" value="SWD*,JTAG" var="internal.wiretype"></param> <param default="false" description="Chip supports SWO" mode="hidden" name="Has SWO" probe="NEVER" value="true" var="internal.has_swo"></param> </params> <initvalue value="SWD*,JTAG" var="internal.wiretype"/> <initvalue value="true" var="internal.has_swo"/> </parameters> <script emulators="${gdb.stub} -mi -info-emu" silent="false" swv="true" type="init">set remotetimeout 60000&#x0A;##target_extended_remote##&#x0A;set mem inaccessible-by-default ${mem.access}&#x0A;mon ondisconnect ${ondisconnect}&#x0A;set arm force-mode thumb&#x0A;${load}</script> <script silent="false" type="run">${run}</script> </config> "/> +<intAttribute key="com.crt.ctrlcenter.version" value="3"/> +<stringAttribute key="org.eclipse.cdt.debug.mi.core.DEBUG_NAME" value="arm-none-eabi-gdb"/> +<stringAttribute key="org.eclipse.cdt.debug.mi.core.GDB_INIT" value=""/> +<stringAttribute key="org.eclipse.cdt.dsf.gdb.DEBUG_NAME" value="arm-none-eabi-gdb"/> +<booleanAttribute key="org.eclipse.cdt.dsf.gdb.NON_STOP" value="false"/> +<stringAttribute key="org.eclipse.cdt.launch.DEBUGGER_START_MODE" value="remote"/> +<booleanAttribute key="org.eclipse.cdt.launch.DEBUGGER_STOP_AT_MAIN" value="true"/> +<stringAttribute key="org.eclipse.cdt.launch.DEBUGGER_STOP_AT_MAIN_SYMBOL" value="main"/> +<stringAttribute key="org.eclipse.cdt.launch.PROGRAM_NAME" value="Debug\TP1_labyrinth_etu.axf"/> +<stringAttribute key="org.eclipse.cdt.launch.PROJECT_ATTR" value="TP1_labyrinth_etu"/> +<stringAttribute key="org.eclipse.cdt.launch.PROJECT_BUILD_CONFIG_ID_ATTR" value="com.crt.advproject.config.exe.debug.215110136"/> +<booleanAttribute key="org.eclipse.cdt.launch.use_terminal" value="false"/> +<stringAttribute key="org.eclipse.dsf.launch.MEMORY_BLOCKS" value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <memoryBlockExpressionList context="reserved-for-future-use"/> "/> +<stringAttribute key="process_factory_id" value="org.eclipse.cdt.dsf.gdb.GdbProcessFactory"/> +</launchConfiguration> diff --git a/TP1_labyrinth_etu/TP1_labyrinth_etu Release.launch b/TP1_labyrinth_etu/TP1_labyrinth_etu Release.launch new file mode 100644 index 0000000000000000000000000000000000000000..f616365a3116ce8f9a375eb7a70f1b8fd79ef8b1 --- /dev/null +++ b/TP1_labyrinth_etu/TP1_labyrinth_etu Release.launch @@ -0,0 +1,18 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<launchConfiguration type="com.crt.dsfdebug.crtmcu.launchType"> +<booleanAttribute key="com.crt.ctrlcenter.crtInit" value="true"/> +<stringAttribute key="com.crt.ctrlcenter.targetbase" value="NXP LPC17xx"/> +<stringAttribute key="com.crt.ctrlcenter.targetconfig" value="<?xml version="1.0" encoding="UTF-8"?> <config chipvendor="NXP" genname="NXP LPC17xx" id="config.gdb.stub"><parameters><params><param default="true" description="Vector catch" name="Vector catch" value="false" var="vector.catch"><enum value="True"/> <enum value="False"/> </param> </params> <initValue value="false" var="vector.catch"/> <params><param default="On" description="Enablement of semihosting support" name="Semihosting support" value="On" var="internal.semihost"><enum value="On"/> <enum value="Off"/> <enum value="Auto"/> </param> </params> <params><param default="" description="Maximum wire speed in KHz (leave blank to Auto-detect). Not all values are supported by all targets" name="Maximum wire speed" probe="^(?!Redlink Server|LinkServer$).*$" type="nullString" value="" var="emu.speed"><enum value=""/> <enum value="30000"/> <enum value="15000"/> <enum value="10000"/> <enum value="7500"/> <enum value="6000"/> <enum value="5000"/> <enum value="3750"/> <enum value="3000"/> <enum value="2500"/> <enum value="2000"/> <enum value="1500"/> <enum value="1250"/> <enum value="1200"/> <enum value="1000"/> <enum value="750"/> <enum value="600"/> <enum value="500"/> <enum value="400"/> <enum value="300"/> <enum value="250"/> <enum value="200"/> <enum value="150"/> </param> </params> <params><param content="serverScript" description="Connect script" name="Connect Script" probe="(?i)(Redlink\s+Server|CMSIS-DAP|LinkServer)" required="false" type="nullString" var="internal.connect.script"/> <param content="serverScript" description="Reset script" name="Reset Script" probe="(?i)(Redlink\s+Server|CMSIS-DAP|LinkServer)" required="false" type="nullString" var="internal.reset.script"/> <param default="" description="Select the reset handling type for this debug connection" name="Reset Handling" probe="(?i)(Redlink\s+Server|CMSIS-DAP|LinkServer)" value="VECTRESET" var="internal.resethandling"><enum value="SYSRESETREQ"/> <enum value="VECTRESET"/> <enum value="Default"/> <enum value=""/> </param> <param default="" description="Additional options" name="Additional options" value="" var="misc.options"/> <param default="2" description="Set stub debug level (1-4)" name="Debug Level " value="2" var="debug.level"/> <param default="False" description="when True, attach to running target only (without loading image)" name="Attach only" required="true" value="False" var="attach"><enum value="True"/> <enum value="False"/> </param> <param default="True" description="Deprecated. Functionality superseded by &apos;Attach only&apos;" name="Load image" type="boolean" value="True" var="load"><enum value="True"/> <enum value="False"/> </param> <param default="cont" description="Run, continue or (do nothing)" name="Run/Continue image" value="cont" var="run"><enum value="run"/> <enum value="cont"/> <enum value=""/> </param> <param default="off" description="If on is specified, make the debugger treat unknown memory as non-existent and refuse \naccesses to such memory. If off is specified, treat the memory as RAM" name="Memory Access Checking" value="off" var="mem.access"><enum value="on"/> <enum value="off"/> </param> <param default="cont" description="choose the disconnect behavior for the target" name="Disconnect behavior" value="cont" var="ondisconnect"><enum value="nochange"/> <enum value="stop"/> <enum value="cont"/> <enum value="run_cont"/> </param> <param default="" description="Command to run before starting the debugger" name="Pre launch command" value="" var="internal.prelaunch.command"/> <param default="" description="Target Wirespeed in Hz" name="Wirespeed (Hz)" probe="(?i)(Redlink\s+Server|CMSIS-DAP|LinkServer)" value="" var="internal.wirespeed"/> </params> <initvalue value="VECTRESET" var="internal.resethandling"/> <params><param default="SWD" description="Internal wiretypes" mode="hidden" name="Wiretype" probe="NEVER" value="SWD*,JTAG" var="internal.wiretype"></param> <param default="false" description="Chip supports SWO" mode="hidden" name="Has SWO" probe="NEVER" value="true" var="internal.has_swo"></param> </params> <initvalue value="SWD*,JTAG" var="internal.wiretype"/> <initvalue value="true" var="internal.has_swo"/> </parameters> <script emulators="${gdb.stub} -mi -info-emu" silent="false" swv="true" type="init">set remotetimeout 60000&#x0A;##target_extended_remote##&#x0A;set mem inaccessible-by-default ${mem.access}&#x0A;mon ondisconnect ${ondisconnect}&#x0A;set arm force-mode thumb&#x0A;${load}</script> <script silent="false" type="run">${run}</script> </config> "/> +<intAttribute key="com.crt.ctrlcenter.version" value="3"/> +<stringAttribute key="org.eclipse.cdt.debug.mi.core.DEBUG_NAME" value="arm-none-eabi-gdb"/> +<stringAttribute key="org.eclipse.cdt.debug.mi.core.GDB_INIT" value=""/> +<stringAttribute key="org.eclipse.cdt.dsf.gdb.DEBUG_NAME" value="arm-none-eabi-gdb"/> +<booleanAttribute key="org.eclipse.cdt.dsf.gdb.NON_STOP" value="false"/> +<stringAttribute key="org.eclipse.cdt.launch.DEBUGGER_START_MODE" value="remote"/> +<booleanAttribute key="org.eclipse.cdt.launch.DEBUGGER_STOP_AT_MAIN" value="true"/> +<stringAttribute key="org.eclipse.cdt.launch.DEBUGGER_STOP_AT_MAIN_SYMBOL" value="main"/> +<stringAttribute key="org.eclipse.cdt.launch.PROGRAM_NAME" value="Release\TP1_labyrinth_etu.axf"/> +<stringAttribute key="org.eclipse.cdt.launch.PROJECT_ATTR" value="TP1_labyrinth_etu"/> +<stringAttribute key="org.eclipse.cdt.launch.PROJECT_BUILD_CONFIG_ID_ATTR" value="com.crt.advproject.config.exe.release.888357251"/> +<booleanAttribute key="org.eclipse.cdt.launch.use_terminal" value="false"/> +</launchConfiguration> diff --git a/TP1_labyrinth_etu/src/FreeRTOSConfig.h b/TP1_labyrinth_etu/src/FreeRTOSConfig.h new file mode 100644 index 0000000000000000000000000000000000000000..cd81dddc9482e9bb971d763641c85a22437477af --- /dev/null +++ b/TP1_labyrinth_etu/src/FreeRTOSConfig.h @@ -0,0 +1,180 @@ +/* + FreeRTOS V7.0.1 - Copyright (C) 2011 Real Time Engineers Ltd. + + + *************************************************************************** + * * + * FreeRTOS tutorial books are available in pdf and paperback. * + * Complete, revised, and edited pdf reference manuals are also * + * available. * + * * + * Purchasing FreeRTOS documentation will not only help you, by * + * ensuring you get running as quickly as possible and with an * + * in-depth knowledge of how to use FreeRTOS, it will also help * + * the FreeRTOS project to continue with its mission of providing * + * professional grade, cross platform, de facto standard solutions * + * for microcontrollers - completely free of charge! * + * * + * >>> See http://www.FreeRTOS.org/Documentation for details. <<< * + * * + * Thank you for using FreeRTOS, and thank you for your support! * + * * + *************************************************************************** + + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation AND MODIFIED BY the FreeRTOS exception. + >>>NOTE<<< The modification to the GPL is included to allow you to + distribute a combined work that includes FreeRTOS without being obliged to + provide the source code for proprietary components outside of the FreeRTOS + kernel. FreeRTOS is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + more details. You should have received a copy of the GNU General Public + License and the FreeRTOS license exception along with FreeRTOS; if not it + can be viewed here: http://www.freertos.org/a00114.html and also obtained + by writing to Richard Barry, contact details for whom are available on the + FreeRTOS WEB site. + + 1 tab == 4 spaces! + + http://www.FreeRTOS.org - Documentation, latest information, license and + contact details. + + http://www.SafeRTOS.com - A version that is certified for use in safety + critical systems. + + http://www.OpenRTOS.com - Commercial support, development, porting, + licensing and training services. +*/ + +#ifndef FREERTOS_CONFIG_H +#define FREERTOS_CONFIG_H + + + +/*----------------------------------------------------------- + * Application specific definitions. + * + * These definitions should be adjusted for your particular hardware and + * application requirements. + * + * THESE PARAMETERS ARE DESCRIBED WITHIN THE 'CONFIGURATION' SECTION OF THE + * FreeRTOS API DOCUMENTATION AVAILABLE ON THE FreeRTOS.org WEB SITE. + *----------------------------------------------------------*/ + +#define configUSE_PREEMPTION 0 +#define configMAX_PRIORITIES ( ( unsigned portBASE_TYPE ) 5 ) +#define configUSE_TICK_HOOK 0 +#define configCPU_CLOCK_HZ ( ( unsigned long ) 100000000 ) +#define configTICK_RATE_HZ ( ( portTickType ) 200 ) +#define configMINIMAL_STACK_SIZE ( ( unsigned short ) 200 ) +#define configTOTAL_HEAP_SIZE ( ( size_t ) ( 19 * 1024 ) ) +#define configMAX_TASK_NAME_LEN ( 12 ) +#define configUSE_TRACE_FACILITY 0 +#define configUSE_16_BIT_TICKS 0 +#define configIDLE_SHOULD_YIELD 0 +#define configUSE_CO_ROUTINES 0 +#define configUSE_MUTEXES 0 +#define configHEPIA_TRACING 1 +#define configUSE_IDLE_HOOK 0 + + +#if configHEPIA_TRACING +// TRACE WITHOUT TRACING TASK: +// condition task_id!=uxTaskNumber-1 can be useful to avoid tracing the tracing task itself! +#define traceTASK_SWITCHED_IN() {if (previous_id_in!=pxCurrentTCB->task_id) {\ + if (previous_id_in!=0xFF && previous_id_in!=uxTaskNumber-1) \ + write_trace(previous_id_in, 0); \ + if (pxCurrentTCB->task_id!=uxTaskNumber-1) \ + write_trace(pxCurrentTCB->task_id, 1); \ + previous_id_in=pxCurrentTCB->task_id;}} + +// TRACE INCLUDING TRACING TASK: +/*#define traceTASK_SWITCHED_IN() {if (previous_id_in!=pxCurrentTCB->task_id) {\ + if (previous_id_in!=0xFF) \ + write_trace(previous_id_in, 0); \ + write_trace(pxCurrentTCB->task_id, 1); \ + previous_id_in=pxCurrentTCB->task_id;}}*/ +#endif + + +#define configMAX_CO_ROUTINE_PRIORITIES ( 2 ) + +#define configUSE_COUNTING_SEMAPHORES 1 +#define configUSE_ALTERNATIVE_API 0 +#define configCHECK_FOR_STACK_OVERFLOW 0 +#define configUSE_RECURSIVE_MUTEXES 1 +#define configQUEUE_REGISTRY_SIZE 10 +#define configGENERATE_RUN_TIME_STATS 0 + +/* Set the following definitions to 1 to include the API function, or zero +to exclude the API function. */ + +#define INCLUDE_vTaskPrioritySet 1 +#define INCLUDE_uxTaskPriorityGet 1 +#define INCLUDE_vTaskDelete 1 +#define INCLUDE_vTaskCleanUpResources 0 +#define INCLUDE_vTaskSuspend 1 +#define INCLUDE_vTaskDelayUntil 1 +#define INCLUDE_vTaskDelay 1 +#define INCLUDE_uxTaskGetStackHighWaterMark 1 + +/*----------------------------------------------------------- + * Ethernet configuration. + *-----------------------------------------------------------*/ + +/* MAC address configuration. */ +#define configMAC_ADDR0 0x00 +#define configMAC_ADDR1 0x12 +#define configMAC_ADDR2 0x13 +#define configMAC_ADDR3 0x10 +#define configMAC_ADDR4 0x15 +#define configMAC_ADDR5 0x11 + +/* IP address configuration. */ +#define configIP_ADDR0 192 +#define configIP_ADDR1 168 +#define configIP_ADDR2 0 +#define configIP_ADDR3 201 + +/* Netmask configuration. */ +#define configNET_MASK0 255 +#define configNET_MASK1 255 +#define configNET_MASK2 255 +#define configNET_MASK3 0 + +/* Use the system definition, if there is one */ +#ifdef __NVIC_PRIO_BITS + #define configPRIO_BITS __NVIC_PRIO_BITS +#else + #define configPRIO_BITS 5 /* 32 priority levels */ +#endif + +/* The lowest priority. */ +#define configKERNEL_INTERRUPT_PRIORITY ( 31 << (8 - configPRIO_BITS) ) +/* Priority 5, or 160 as only the top three bits are implemented. */ +#define configMAX_SYSCALL_INTERRUPT_PRIORITY ( 5 << (8 - configPRIO_BITS) ) + +/* Priorities passed to NVIC_SetPriority() do not require shifting as the +function does the shifting itself. Note these priorities need to be equal to +or lower than configMAX_SYSCALL_INTERRUPT_PRIORITY - therefore the numeric +value needs to be equal to or greater than 5 (on the Cortex-M3 the lower the +numeric value the higher the interrupt priority). */ +#define configEMAC_INTERRUPT_PRIORITY 5 +#define configUSB_INTERRUPT_PRIORITY 6 + + + +/*----------------------------------------------------------- + * Macros required to setup the timer for the run time stats. + *-----------------------------------------------------------*/ +extern void vConfigureTimerForRunTimeStats( void ); + +#define portGET_RUN_TIME_COUNTER_VALUE() LPC_TIM0->TC + + +#endif /* FREERTOS_CONFIG_H */ diff --git a/TP1_labyrinth_etu/src/accelerometer.h b/TP1_labyrinth_etu/src/accelerometer.h new file mode 100644 index 0000000000000000000000000000000000000000..b0647413eac2d5ca4c0adfc8f545a05c108cd000 --- /dev/null +++ b/TP1_labyrinth_etu/src/accelerometer.h @@ -0,0 +1,89 @@ +/***************************************************************************** + +This software is released under the LGPL-3.0 license: http://www.opensource.org/licenses/lgpl-3.0.html + +Copyright (c) 2013, hepia (ITI) http://www.hepialight.ch + +This library is free software; you can redistribute it and/or +modify it under the terms of the GNU Lesser General Public +License as published by the Free Software Foundation; either +version 3.0 of the License, or (at your option) any later version. + +This library is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public +License along with this library; if not, write to the Free Software +Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +*****************************************************************************/ + + +#ifndef ACCELEROMETER_H_ +#define ACCELEROMETER_H_ + +#include <stdint.h> + +#define accel_addr_X 0x00 +#define accel_addr_Y 0x01 +#define accel_addr_Z 0x02 +#define accel_mode_reg 0x07 + +#define ACCEL_INT_PIN 11 +#define ACCEL_I2C_ADDR 0x1D<<1 + +#define LSM303D_REG_WHOAMI 0x0F +#define LSM303D_REG_CTRL0 0x1F +#define LSM303D_REG_CTRL1 0x20 +#define LSM303D_REG_CTRL2 0x21 +#define LSM303D_REG_CTRL3 0x22 +#define LSM303D_REG_CTRL4 0x23 +#define LSM303D_REG_CTRL5 0x24 +#define LSM303D_REG_CTRL6 0x25 +#define LSM303D_REG_CTRL7 0x26 +#define LSM303D_REG_TEMP_OUT_L 0x05 +#define LSM303D_REG_TEMP_OUT_H 0x06 +#define LSM303D_REG_STATUS_M 0x07 +#define LSM303D_REG_OUT_X_L_M 0x08 +#define LSM303D_REG_OUT_X_H_M 0x09 +#define LSM303D_REG_OUT_Y_L_M 0x0a +#define LSM303D_REG_OUT_Y_H_M 0x0b +#define LSM303D_REG_OUT_Z_L_M 0x0c +#define LSM303D_REG_OUT_Z_H_M 0x0d +#define LSM303D_REG_STATUS_A 0x27 +#define LSM303D_REG_OUT_X_L_A 0x28 +#define LSM303D_REG_OUT_X_H_A 0x29 +#define LSM303D_REG_OUT_Y_L_A 0x2a +#define LSM303D_REG_OUT_Y_H_A 0x2b +#define LSM303D_REG_OUT_Z_L_A 0x2c +#define LSM303D_REG_OUT_Z_H_A 0x2d + +#define ACC_NOT_INITIALISED -21 +#define ACC_INIT_I2C_FAILED -22 +#define ACC_NOERROR 0 + + +typedef struct +{ + float accel_x; + float accel_y; + float accel_z; + int16_t magneto_x; + int16_t magneto_y; + int16_t magneto_z; + int16_t temperature; +} accel_t; + +int accel_init(void); + +/* + * Accelerometer reading. each component read has a value in the range [-1, 1] + * Parameter: accel: pointer on (x,y,z) acceleration to be returned + * Return: ACC_NOERROR if no error or error code + */ +int accel_read(accel_t *accel); + + +#endif /* ACCELEROMETER_H_ */ diff --git a/TP1_labyrinth_etu/src/cr_startup_lpc17.c b/TP1_labyrinth_etu/src/cr_startup_lpc17.c new file mode 100644 index 0000000000000000000000000000000000000000..ec9b3f7757ac267c8fcb1d3204b60b778e9c8ab5 --- /dev/null +++ b/TP1_labyrinth_etu/src/cr_startup_lpc17.c @@ -0,0 +1,403 @@ +//***************************************************************************** +// +--+ +// | ++----+ +// +-++ | +// | | +// +-+--+ | +// | +--+--+ +// +----+ Copyright (c) 2009-10 Code Red Technologies Ltd. +// +// Microcontroller Startup code for use with Red Suite +// +// Software License Agreement +// +// The software is owned by Code Red Technologies and/or its suppliers, and is +// protected under applicable copyright laws. All rights are reserved. Any +// use in violation of the foregoing restrictions may subject the user to criminal +// sanctions under applicable laws, as well as to civil liability for the breach +// of the terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// USE OF THIS SOFTWARE FOR COMMERCIAL DEVELOPMENT AND/OR EDUCATION IS SUBJECT +// TO A CURRENT END USER LICENSE AGREEMENT (COMMERCIAL OR EDUCATIONAL) WITH +// CODE RED TECHNOLOGIES LTD. +// +//***************************************************************************** +#if defined (__cplusplus) +#ifdef __REDLIB__ +#error Redlib does not support C++ +#else +//***************************************************************************** +// +// The entry point for the C++ library startup +// +//***************************************************************************** +extern "C" { + extern void __libc_init_array(void); +} +#endif +#endif + +#define WEAK __attribute__ ((weak)) +#define ALIAS(f) __attribute__ ((weak, alias (#f))) + +// Code Red - if CMSIS is being used, then SystemInit() routine +// will be called by startup code rather than in application's main() +#if defined (__USE_CMSIS) +#include "system_LPC17xx.h" +#endif + +//***************************************************************************** +#if defined (__cplusplus) +extern "C" { +#endif + +//***************************************************************************** +// +// Forward declaration of the default handlers. These are aliased. +// When the application defines a handler (with the same name), this will +// automatically take precedence over these weak definitions +// +//***************************************************************************** + void ResetISR(void); +WEAK void NMI_Handler(void); +WEAK void HardFault_Handler(void); +WEAK void MemManage_Handler(void); +WEAK void BusFault_Handler(void); +WEAK void UsageFault_Handler(void); +WEAK void SVCall_Handler(void); +WEAK void DebugMon_Handler(void); +WEAK void PendSV_Handler(void); +WEAK void SysTick_Handler(void); +WEAK void IntDefaultHandler(void); + +//***************************************************************************** +// +// Forward declaration of the specific IRQ handlers. These are aliased +// to the IntDefaultHandler, which is a 'forever' loop. When the application +// defines a handler (with the same name), this will automatically take +// precedence over these weak definitions +// +//***************************************************************************** +void WDT_IRQHandler(void) ALIAS(IntDefaultHandler); +void TIMER0_IRQHandler(void) ALIAS(IntDefaultHandler); +void TIMER1_IRQHandler(void) ALIAS(IntDefaultHandler); +void TIMER2_IRQHandler(void) ALIAS(IntDefaultHandler); +void TIMER3_IRQHandler(void) ALIAS(IntDefaultHandler); +void UART0_IRQHandler(void) ALIAS(IntDefaultHandler); +void UART1_IRQHandler(void) ALIAS(IntDefaultHandler); +void UART2_IRQHandler(void) ALIAS(IntDefaultHandler); +void UART3_IRQHandler(void) ALIAS(IntDefaultHandler); +void PWM1_IRQHandler(void) ALIAS(IntDefaultHandler); +void I2C0_IRQHandler(void) ALIAS(IntDefaultHandler); +void I2C1_IRQHandler(void) ALIAS(IntDefaultHandler); +void I2C2_IRQHandler(void) ALIAS(IntDefaultHandler); +void SPI_IRQHandler(void) ALIAS(IntDefaultHandler); +void SSP0_IRQHandler(void) ALIAS(IntDefaultHandler); +void SSP1_IRQHandler(void) ALIAS(IntDefaultHandler); +void PLL0_IRQHandler(void) ALIAS(IntDefaultHandler); +void RTC_IRQHandler(void) ALIAS(IntDefaultHandler); +void EINT0_IRQHandler(void) ALIAS(IntDefaultHandler); +void EINT1_IRQHandler(void) ALIAS(IntDefaultHandler); +void EINT2_IRQHandler(void) ALIAS(IntDefaultHandler); +void EINT3_IRQHandler(void) ALIAS(IntDefaultHandler); +void ADC_IRQHandler(void) ALIAS(IntDefaultHandler); +void BOD_IRQHandler(void) ALIAS(IntDefaultHandler); +void USB_IRQHandler(void) ALIAS(IntDefaultHandler); +void CAN_IRQHandler(void) ALIAS(IntDefaultHandler); +void DMA_IRQHandler(void) ALIAS(IntDefaultHandler); +void I2S_IRQHandler(void) ALIAS(IntDefaultHandler); +void ENET_IRQHandler(void) ALIAS(IntDefaultHandler); +void RIT_IRQHandler(void) ALIAS(IntDefaultHandler); +void MCPWM_IRQHandler(void) ALIAS(IntDefaultHandler); +void QEI_IRQHandler(void) ALIAS(IntDefaultHandler); +void PLL1_IRQHandler(void) ALIAS(IntDefaultHandler); +void USBActivity_IRQHandler(void) ALIAS(IntDefaultHandler); +void CANActivity_IRQHandler(void) ALIAS(IntDefaultHandler); + +extern void xPortSysTickHandler(void); +extern void xPortPendSVHandler(void); +extern void vPortSVCHandler( void ); +extern void vEMAC_ISR( void ); + +//***************************************************************************** +// +// The entry point for the application. +// __main() is the entry point for Redlib based applications +// main() is the entry point for Newlib based applications +// +//***************************************************************************** +#if defined (__REDLIB__) +extern void __main(void); +#endif +extern int main(void); +//***************************************************************************** +// +// External declaration for the pointer to the stack top from the Linker Script +// +//***************************************************************************** +extern void _vStackTop(void); + +//***************************************************************************** +#if defined (__cplusplus) +} // extern "C" +#endif +//***************************************************************************** +// +// The vector table. +// This relies on the linker script to place at correct location in memory. +// +//***************************************************************************** +extern void (* const g_pfnVectors[])(void); +__attribute__ ((section(".isr_vector"))) +void (* const g_pfnVectors[])(void) = +{ + // Core Level - CM3 + (void *)&_vStackTop, // The initial stack pointer + ResetISR, // The reset handler + NMI_Handler, // The NMI handler + HardFault_Handler, // The hard fault handler + MemManage_Handler, // The MPU fault handler + BusFault_Handler, // The bus fault handler + UsageFault_Handler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + vPortSVCHandler, // SVCall handler + DebugMon_Handler, // Debug monitor handler + 0, // Reserved + xPortPendSVHandler, // The PendSV handler + xPortSysTickHandler, // The SysTick handler + + // Chip Level - LPC17 + WDT_IRQHandler, // 16, 0x40 - WDT + TIMER0_IRQHandler, // 17, 0x44 - TIMER0 + TIMER1_IRQHandler, // 18, 0x48 - TIMER1 + TIMER2_IRQHandler, // 19, 0x4c - TIMER2 + TIMER3_IRQHandler, // 20, 0x50 - TIMER3 + UART0_IRQHandler, // 21, 0x54 - UART0 + UART1_IRQHandler, // 22, 0x58 - UART1 + UART2_IRQHandler, // 23, 0x5c - UART2 + UART3_IRQHandler, // 24, 0x60 - UART3 + PWM1_IRQHandler, // 25, 0x64 - PWM1 + I2C0_IRQHandler, // 26, 0x68 - I2C0 + I2C1_IRQHandler, // 27, 0x6c - I2C1 + I2C2_IRQHandler, // 28, 0x70 - I2C2 + SPI_IRQHandler, // 29, 0x74 - SPI + SSP0_IRQHandler, // 30, 0x78 - SSP0 + SSP1_IRQHandler, // 31, 0x7c - SSP1 + PLL0_IRQHandler, // 32, 0x80 - PLL0 (Main PLL) + RTC_IRQHandler, // 33, 0x84 - RTC + EINT0_IRQHandler, // 34, 0x88 - EINT0 + EINT1_IRQHandler, // 35, 0x8c - EINT1 + EINT2_IRQHandler, // 36, 0x90 - EINT2 + EINT3_IRQHandler, // 37, 0x94 - EINT3 + ADC_IRQHandler, // 38, 0x98 - ADC + BOD_IRQHandler, // 39, 0x9c - BOD + USB_IRQHandler, // 40, 0xA0 - USB + CAN_IRQHandler, // 41, 0xa4 - CAN + DMA_IRQHandler, // 42, 0xa8 - GP DMA + I2S_IRQHandler, // 43, 0xac - I2S + ENET_IRQHandler, // Ethernet. + RIT_IRQHandler, // 45, 0xb4 - RITINT + MCPWM_IRQHandler, // 46, 0xb8 - Motor Control PWM + QEI_IRQHandler, // 47, 0xbc - Quadrature Encoder + PLL1_IRQHandler, // 48, 0xc0 - PLL1 (USB PLL) + USBActivity_IRQHandler, // 49, 0xc4 - USB Activity interrupt to wakeup + CANActivity_IRQHandler, // 50, 0xc8 - CAN Activity interrupt to wakeup +}; + +//***************************************************************************** +// Functions to carry out the initialization of RW and BSS data sections. These +// are written as separate functions rather than being inlined within the +// ResetISR() function in order to cope with MCUs with multiple banks of +// memory. +//***************************************************************************** +__attribute__ ((section(".after_vectors"))) +void data_init(unsigned int romstart, unsigned int start, unsigned int len) { + unsigned int *pulDest = (unsigned int*) start; + unsigned int *pulSrc = (unsigned int*) romstart; + unsigned int loop; + for (loop = 0; loop < len; loop = loop + 4) + *pulDest++ = *pulSrc++; +} + +__attribute__ ((section(".after_vectors"))) +void bss_init(unsigned int start, unsigned int len) { + unsigned int *pulDest = (unsigned int*) start; + unsigned int loop; + for (loop = 0; loop < len; loop = loop + 4) + *pulDest++ = 0; +} + + +//***************************************************************************** +// +// The following are constructs created by the linker, indicating where the +// the "data" and "bss" segments reside in memory. The initializers for the +// for the "data" segment resides immediately following the "text" segment. +// +//***************************************************************************** +extern unsigned long _etext; +extern unsigned long _data; +extern unsigned long _edata; +extern unsigned long _bss; +extern unsigned long _ebss; + +extern unsigned int __data_section_table; +extern unsigned int __data_section_table_end; +extern unsigned int __bss_section_table; +extern unsigned int __bss_section_table_end; + + +//***************************************************************************** +// Reset entry point for your code. +// Sets up a simple runtime environment and initializes the C/C++ +// library. +// +//***************************************************************************** +__attribute__ ((section(".after_vectors"))) +void +ResetISR(void) { + unsigned int LoadAddr, ExeAddr, SectionLen; + unsigned int *SectionTableAddr; + + // Load base address of Global Section Table + SectionTableAddr = &__data_section_table; + + // Copy the data sections from flash to SRAM. + while (SectionTableAddr < &__data_section_table_end) { + LoadAddr = *SectionTableAddr++; + ExeAddr = *SectionTableAddr++; + SectionLen = *SectionTableAddr++; + data_init(LoadAddr, ExeAddr, SectionLen); + } + // At this point, SectionTableAddr = &__bss_section_table; + // Zero fill the bss segment + while (SectionTableAddr < &__bss_section_table_end) { + ExeAddr = *SectionTableAddr++; + SectionLen = *SectionTableAddr++; + bss_init(ExeAddr, SectionLen); + } +/* unsigned long *pulSrc, *pulDest; + + // + // Copy the data segment initializers from flash to SRAM. + // + pulSrc = &_etext; + for(pulDest = &_data; pulDest < &_edata; ) + { + *pulDest++ = *pulSrc++; + } + + // + // Zero fill the bss segment. This is done with inline assembly since this + // will clear the value of pulDest if it is not kept in a register. + // + __asm(" ldr r0, =_bss\n" + " ldr r1, =_ebss\n" + " mov r2, #0\n" + " .thumb_func\n" + "zero_loop:\n" + " cmp r0, r1\n" + " it lt\n" + " strlt r2, [r0], #4\n" + " blt zero_loop");*/ + +#ifdef __USE_CMSIS + SystemInit(); +#endif + +#if defined (__cplusplus) + // + // Call C++ library initialisation + // + __libc_init_array(); +#endif + +#if defined (__REDLIB__) + // Call the Redlib library, which in turn calls main() + __main() ; +#else + main(); +#endif + + // + // main() shouldn't return, but if it does, we'll just enter an infinite loop + // + while (1) { + ; + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +__attribute__ ((section(".after_vectors"))) +void NMI_Handler(void) +{ + while(1) + { + } +} + +__attribute__ ((section(".after_vectors"))) +void HardFault_Handler(void) +{ + while(1) + { + } +} +__attribute__ ((section(".after_vectors"))) +void MemManage_Handler(void) +{ + while(1) + { + } +} +__attribute__ ((section(".after_vectors"))) +void BusFault_Handler(void) +{ + while(1) + { + } +} +__attribute__ ((section(".after_vectors"))) +void UsageFault_Handler(void) +{ + while(1) + { + } +} + +__attribute__ ((section(".after_vectors"))) +void DebugMon_Handler(void) +{ + while(1) + { + } +} + +//***************************************************************************** +// +// Processor ends up here if an unexpected interrupt occurs or a handler +// is not present in the application code. +// +//***************************************************************************** +__attribute__ ((section(".after_vectors"))) +void IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/TP1_labyrinth_etu/src/custom_rand.h b/TP1_labyrinth_etu/src/custom_rand.h new file mode 100644 index 0000000000000000000000000000000000000000..08d1f799f60f3431802a6008cd95f4bed0a0cc96 --- /dev/null +++ b/TP1_labyrinth_etu/src/custom_rand.h @@ -0,0 +1,20 @@ +//--------------------------------------------------------------------------- + +#ifndef custom_randH +#define custom_randH +//--------------------------------------------------------------------------- + +#include <stdint.h> + +/* Pseudo-random generator intialisation. + * Parameter: seed: random-generator starting point + */ +void init_rnd32(uint32_t seed); + +/* Generate a new random sample based on the last call of this function + * Return: random value + * */ +uint32_t rnd32(void); + + +#endif diff --git a/TP1_labyrinth_etu/src/ethernet_mgt.h b/TP1_labyrinth_etu/src/ethernet_mgt.h new file mode 100644 index 0000000000000000000000000000000000000000..c7ba8bc8c1303fb6bfc53d3fe30950f7e1003113 --- /dev/null +++ b/TP1_labyrinth_etu/src/ethernet_mgt.h @@ -0,0 +1,53 @@ +/* + * ethernet_mgt.h + * + * Description: Ethernet driver. Note: RX/TX buffers must be in RAM2 + * since SRAM is deactivated during WFI (the DMA can not copy data during a WFI in SRAM) + * Created on: 13.4.2018 + * Author: Pilloux V. + */ + +#ifndef ETHERNET_MGT_H_ +#define ETHERNET_MGT_H_ + +/* Description: callback prototype for ethernet_init() + * + * Parameter: data: pointer on data to be received + * length: data length [bytes] + */ +typedef void (*rx_eth_callback_t)(void *data, int len); + +/* Description: initialise Ethernet connection. RX/TX buffers MUST be declared in RAM2 + * since SRAM is deactivated during WFI (the DMA can not copy data during a WFI in SRAM) + * + * Parameters: + * tx_double_buf: pointer on the transmission double buffer (can be NULL if not used) + * rx_double_buf: pointer on the receiving double buffer (can be NULL if not used) + * double_len_tx: maximum length of the transmission double buffers + * double_len_rx: maximum length of the receiving double buffers + * rx_callback: pointer on a callback function which is called + * each time data is received by Ethernet. If rx_callback==NULL, + * no callback is used. + * Return: pointer on the data frame to be filled for transmission + */ +unsigned char *ethernet_init(unsigned char *tx_double_buf, int double_len_tx, unsigned char *rx_double_buf, + int double_len_rx, rx_eth_callback_t rx_callback); + +/* Description: send raw data to Ethernet (no address management) + * + * Parameter: length: data length [bytes]. Note that length can be lower than double_len/2 + * but not bigger + * blocking: if true, waits the frame transmission + * Return: pointer on the next data frame to transmit + */ +unsigned char *send_eth(int length, bool blocking); + +/* Description: receive raw data from Ethernet (no address management). + * This function blocks until data is received. + * + * Parameter: length: pointer on the received data length [bytes] + * Return: pointer on the received data + */ +unsigned char *rec_eth(int *length); + +#endif /* ETHERNET_MGT_H_ */ diff --git a/TP1_labyrinth_etu/src/ethmac.h b/TP1_labyrinth_etu/src/ethmac.h new file mode 100644 index 0000000000000000000000000000000000000000..86c0018b4367c6bccab85c65eae3c4cb0e65fb06 --- /dev/null +++ b/TP1_labyrinth_etu/src/ethmac.h @@ -0,0 +1,347 @@ +/****************************************************************** + ***** ***** + ***** Name: cs8900.h ***** + ***** Ver.: 1.0 ***** + ***** Date: 07/05/2001 ***** + ***** Auth: Andreas Dannenberg ***** + ***** HTWK Leipzig ***** + ***** university of applied sciences ***** + ***** Germany ***** + ***** adannenb@et.htwk-leipzig.de ***** + ***** Func: header-file for cs8900.c ***** + ***** ***** + ******************************************************************/ + +// Modifications by Code Red Technologies for NXP LPC1768 +// Filename changed to ethmac.h as no longer for cs8900 + +// CodeRed - update for new header filename + +#ifndef __ETHMAC_H +#define __ETHMAC_H + +#define MYMAC_1 1 // our ethernet (MAC) address +#define MYMAC_2 2 // (MUST be unique in LAN!) +#define MYMAC_3 3 +#define MYMAC_4 4 +#define MYMAC_5 5 +#define MYMAC_6 6 + + +// ******* +// CodeRed - defines for LPC1768 ethernet +// ******* + +/* EMAC Memory Buffer configuration for 16K Ethernet RAM. */ +#define NUM_RX_FRAG 4 /* Num.of RX Fragments 4*1536= 6.0kB */ +#define NUM_TX_FRAG 2 /* Num.of TX Fragments 3*1536= 4.6kB */ +#define ETH_FRAG_SIZE 1536 /* Packet Fragment size 1536 Bytes */ + +#define ETH_MAX_FLEN 1536 /* Max. Ethernet Frame Size */ + +/* EMAC variables located in AHB SRAM bank 1*/ +// Below is base address for first silicon +//#define RX_DESC_BASE 0x20004000 +// Below is base address for production silicon +#define RX_DESC_BASE 0x2007c000 +#define RX_STAT_BASE (RX_DESC_BASE + NUM_RX_FRAG*8) +#define TX_DESC_BASE (RX_STAT_BASE + NUM_RX_FRAG*8) +#define TX_STAT_BASE (TX_DESC_BASE + NUM_TX_FRAG*8) +#define RX_BUF_BASE (TX_STAT_BASE + NUM_TX_FRAG*4) +#define TX_BUF_BASE (RX_BUF_BASE + NUM_RX_FRAG*ETH_FRAG_SIZE) + +/* RX and TX descriptor and status definitions. */ +#define RX_DESC_PACKET(i) (*(unsigned int *)(RX_DESC_BASE + 8*i)) +#define RX_DESC_CTRL(i) (*(unsigned int *)(RX_DESC_BASE+4 + 8*i)) +#define RX_STAT_INFO(i) (*(unsigned int *)(RX_STAT_BASE + 8*i)) +#define RX_STAT_HASHCRC(i) (*(unsigned int *)(RX_STAT_BASE+4 + 8*i)) +#define TX_DESC_PACKET(i) (*(unsigned int *)(TX_DESC_BASE + 8*i)) +#define TX_DESC_CTRL(i) (*(unsigned int *)(TX_DESC_BASE+4 + 8*i)) +#define TX_STAT_INFO(i) (*(unsigned int *)(TX_STAT_BASE + 4*i)) +#define RX_BUF(i) (RX_BUF_BASE + ETH_FRAG_SIZE*i) +#define TX_BUF(i) (TX_BUF_BASE + ETH_FRAG_SIZE*i) + +/* MAC Configuration Register 1 */ +#define MAC1_REC_EN 0x00000001 /* Receive Enable */ +#define MAC1_PASS_ALL 0x00000002 /* Pass All Receive Frames */ +#define MAC1_RX_FLOWC 0x00000004 /* RX Flow Control */ +#define MAC1_TX_FLOWC 0x00000008 /* TX Flow Control */ +#define MAC1_LOOPB 0x00000010 /* Loop Back Mode */ +#define MAC1_RES_TX 0x00000100 /* Reset TX Logic */ +#define MAC1_RES_MCS_TX 0x00000200 /* Reset MAC TX Control Sublayer */ +#define MAC1_RES_RX 0x00000400 /* Reset RX Logic */ +#define MAC1_RES_MCS_RX 0x00000800 /* Reset MAC RX Control Sublayer */ +#define MAC1_SIM_RES 0x00004000 /* Simulation Reset */ +#define MAC1_SOFT_RES 0x00008000 /* Soft Reset MAC */ + +/* MAC Configuration Register 2 */ +#define MAC2_FULL_DUP 0x00000001 /* Full Duplex Mode */ +#define MAC2_FRM_LEN_CHK 0x00000002 /* Frame Length Checking */ +#define MAC2_HUGE_FRM_EN 0x00000004 /* Huge Frame Enable */ +#define MAC2_DLY_CRC 0x00000008 /* Delayed CRC Mode */ +#define MAC2_CRC_EN 0x00000010 /* Append CRC to every Frame */ +#define MAC2_PAD_EN 0x00000020 /* Pad all Short Frames */ +#define MAC2_VLAN_PAD_EN 0x00000040 /* VLAN Pad Enable */ +#define MAC2_ADET_PAD_EN 0x00000080 /* Auto Detect Pad Enable */ +#define MAC2_PPREAM_ENF 0x00000100 /* Pure Preamble Enforcement */ +#define MAC2_LPREAM_ENF 0x00000200 /* Long Preamble Enforcement */ +#define MAC2_NO_BACKOFF 0x00001000 /* No Backoff Algorithm */ +#define MAC2_BACK_PRESSURE 0x00002000 /* Backoff Presurre / No Backoff */ +#define MAC2_EXCESS_DEF 0x00004000 /* Excess Defer */ + +/* Back-to-Back Inter-Packet-Gap Register */ +#define IPGT_FULL_DUP 0x00000015 /* Recommended value for Full Duplex */ +#define IPGT_HALF_DUP 0x00000012 /* Recommended value for Half Duplex */ + +/* Non Back-to-Back Inter-Packet-Gap Register */ +#define IPGR_DEF 0x00000012 /* Recommended value */ + +/* Collision Window/Retry Register */ +#define CLRT_DEF 0x0000370F /* Default value */ + +/* PHY Support Register */ +#define SUPP_SPEED 0x00000100 /* Reduced MII Logic Current Speed */ + +/* Test Register */ +#define TEST_SHCUT_PQUANTA 0x00000001 /* Shortcut Pause Quanta */ +#define TEST_TST_PAUSE 0x00000002 /* Test Pause */ +#define TEST_TST_BACKP 0x00000004 /* Test Back Pressure */ + +/* MII Management Configuration Register */ +#define MCFG_SCAN_INC 0x00000001 /* Scan Increment PHY Address */ +#define MCFG_SUPP_PREAM 0x00000002 /* Suppress Preamble */ +#define MCFG_CLK_SEL 0x0000001C /* Clock Select Mask */ +#define MCFG_RES_MII 0x00008000 /* Reset MII Management Hardware */ + +#define MCFG_CLK_DIV28 0x0000001C /* MDC = hclk / 28 */ +#define MCFG_CLK_DIV36 0x00000020 +#define MCFG_CLK_DIV64 0x0000003c + +/* MII Management Command Register */ +#define MCMD_READ 0x00000001 /* MII Read */ +#define MCMD_SCAN 0x00000002 /* MII Scan continuously */ + +#define MII_WR_TOUT 0x00050000 /* MII Write timeout count */ +#define MII_RD_TOUT 0x00050000 /* MII Read timeout count */ + +/* MII Management Address Register */ +#define MADR_REG_ADR 0x0000001F /* MII Register Address Mask */ +#define MADR_PHY_ADR 0x00001F00 /* PHY Address Mask */ + +/* MII Management Indicators Register */ +#define MIND_BUSY 0x00000001 /* MII is Busy */ +#define MIND_SCAN 0x00000002 /* MII Scanning in Progress */ +#define MIND_NOT_VAL 0x00000004 /* MII Read Data not valid */ +#define MIND_MII_LINK_FAIL 0x00000008 /* MII Link Failed */ + +/* Command Register */ +#define CR_RX_EN 0x00000001 /* Enable Receive */ +#define CR_TX_EN 0x00000002 /* Enable Transmit */ +#define CR_REG_RES 0x00000008 /* Reset Host Registers */ +#define CR_TX_RES 0x00000010 /* Reset Transmit Datapath */ +#define CR_RX_RES 0x00000020 /* Reset Receive Datapath */ +#define CR_PASS_RUNT_FRM 0x00000040 /* Pass Runt Frames */ +#define CR_PASS_RX_FILT 0x00000080 /* Pass RX Filter */ +#define CR_TX_FLOW_CTRL 0x00000100 /* TX Flow Control */ +#define CR_RMII 0x00000200 /* Reduced MII Interface */ +#define CR_FULL_DUP 0x00000400 /* Full Duplex */ + +/* Status Register */ +#define SR_RX_EN 0x00000001 /* Enable Receive */ +#define SR_TX_EN 0x00000002 /* Enable Transmit */ + +/* Transmit Status Vector 0 Register */ +#define TSV0_CRC_ERR 0x00000001 /* CRC error */ +#define TSV0_LEN_CHKERR 0x00000002 /* Length Check Error */ +#define TSV0_LEN_OUTRNG 0x00000004 /* Length Out of Range */ +#define TSV0_DONE 0x00000008 /* Tramsmission Completed */ +#define TSV0_MCAST 0x00000010 /* Multicast Destination */ +#define TSV0_BCAST 0x00000020 /* Broadcast Destination */ +#define TSV0_PKT_DEFER 0x00000040 /* Packet Deferred */ +#define TSV0_EXC_DEFER 0x00000080 /* Excessive Packet Deferral */ +#define TSV0_EXC_COLL 0x00000100 /* Excessive Collision */ +#define TSV0_LATE_COLL 0x00000200 /* Late Collision Occured */ +#define TSV0_GIANT 0x00000400 /* Giant Frame */ +#define TSV0_UNDERRUN 0x00000800 /* Buffer Underrun */ +#define TSV0_BYTES 0x0FFFF000 /* Total Bytes Transferred */ +#define TSV0_CTRL_FRAME 0x10000000 /* Control Frame */ +#define TSV0_PAUSE 0x20000000 /* Pause Frame */ +#define TSV0_BACK_PRESS 0x40000000 /* Backpressure Method Applied */ +#define TSV0_VLAN 0x80000000 /* VLAN Frame */ + +/* Transmit Status Vector 1 Register */ +#define TSV1_BYTE_CNT 0x0000FFFF /* Transmit Byte Count */ +#define TSV1_COLL_CNT 0x000F0000 /* Transmit Collision Count */ + +/* Receive Status Vector Register */ +#define RSV_BYTE_CNT 0x0000FFFF /* Receive Byte Count */ +#define RSV_PKT_IGNORED 0x00010000 /* Packet Previously Ignored */ +#define RSV_RXDV_SEEN 0x00020000 /* RXDV Event Previously Seen */ +#define RSV_CARR_SEEN 0x00040000 /* Carrier Event Previously Seen */ +#define RSV_REC_CODEV 0x00080000 /* Receive Code Violation */ +#define RSV_CRC_ERR 0x00100000 /* CRC Error */ +#define RSV_LEN_CHKERR 0x00200000 /* Length Check Error */ +#define RSV_LEN_OUTRNG 0x00400000 /* Length Out of Range */ +#define RSV_REC_OK 0x00800000 /* Frame Received OK */ +#define RSV_MCAST 0x01000000 /* Multicast Frame */ +#define RSV_BCAST 0x02000000 /* Broadcast Frame */ +#define RSV_DRIB_NIBB 0x04000000 /* Dribble Nibble */ +#define RSV_CTRL_FRAME 0x08000000 /* Control Frame */ +#define RSV_PAUSE 0x10000000 /* Pause Frame */ +#define RSV_UNSUPP_OPC 0x20000000 /* Unsupported Opcode */ +#define RSV_VLAN 0x40000000 /* VLAN Frame */ + +/* Flow Control Counter Register */ +#define FCC_MIRR_CNT 0x0000FFFF /* Mirror Counter */ +#define FCC_PAUSE_TIM 0xFFFF0000 /* Pause Timer */ + +/* Flow Control Status Register */ +#define FCS_MIRR_CNT 0x0000FFFF /* Mirror Counter Current */ + +/* Receive Filter Control Register */ +#define RFC_UCAST_EN 0x00000001 /* Accept Unicast Frames Enable */ +#define RFC_BCAST_EN 0x00000002 /* Accept Broadcast Frames Enable */ +#define RFC_MCAST_EN 0x00000004 /* Accept Multicast Frames Enable */ +#define RFC_UCAST_HASH_EN 0x00000008 /* Accept Unicast Hash Filter Frames */ +#define RFC_MCAST_HASH_EN 0x00000010 /* Accept Multicast Hash Filter Fram.*/ +#define RFC_PERFECT_EN 0x00000020 /* Accept Perfect Match Enable */ +#define RFC_MAGP_WOL_EN 0x00001000 /* Magic Packet Filter WoL Enable */ +#define RFC_PFILT_WOL_EN 0x00002000 /* Perfect Filter WoL Enable */ + +/* Receive Filter WoL Status/Clear Registers */ +#define WOL_UCAST 0x00000001 /* Unicast Frame caused WoL */ +#define WOL_BCAST 0x00000002 /* Broadcast Frame caused WoL */ +#define WOL_MCAST 0x00000004 /* Multicast Frame caused WoL */ +#define WOL_UCAST_HASH 0x00000008 /* Unicast Hash Filter Frame WoL */ +#define WOL_MCAST_HASH 0x00000010 /* Multicast Hash Filter Frame WoL */ +#define WOL_PERFECT 0x00000020 /* Perfect Filter WoL */ +#define WOL_RX_FILTER 0x00000080 /* RX Filter caused WoL */ +#define WOL_MAG_PACKET 0x00000100 /* Magic Packet Filter caused WoL */ + +/* Interrupt Status/Enable/Clear/Set Registers */ +#define INT_RX_OVERRUN 0x00000001 /* Overrun Error in RX Queue */ +#define INT_RX_ERR 0x00000002 /* Receive Error */ +#define INT_RX_FIN 0x00000004 /* RX Finished Process Descriptors */ +#define INT_RX_DONE 0x00000008 /* Receive Done */ +#define INT_TX_UNDERRUN 0x00000010 /* Transmit Underrun */ +#define INT_TX_ERR 0x00000020 /* Transmit Error */ +#define INT_TX_FIN 0x00000040 /* TX Finished Process Descriptors */ +#define INT_TX_DONE 0x00000080 /* Transmit Done */ +#define INT_SOFT_INT 0x00001000 /* Software Triggered Interrupt */ +#define INT_WAKEUP 0x00002000 /* Wakeup Event Interrupt */ + +/* Power Down Register */ +#define PD_POWER_DOWN 0x80000000 /* Power Down MAC */ + +/* RX Descriptor Control Word */ +#define RCTRL_SIZE 0x000007FF /* Buffer size mask */ +#define RCTRL_INT 0x80000000 /* Generate RxDone Interrupt */ + +/* RX Status Hash CRC Word */ +#define RHASH_SA 0x000001FF /* Hash CRC for Source Address */ +#define RHASH_DA 0x001FF000 /* Hash CRC for Destination Address */ + +/* RX Status Information Word */ +#define RINFO_SIZE 0x000007FF /* Data size in bytes */ +#define RINFO_CTRL_FRAME 0x00040000 /* Control Frame */ +#define RINFO_VLAN 0x00080000 /* VLAN Frame */ +#define RINFO_FAIL_FILT 0x00100000 /* RX Filter Failed */ +#define RINFO_MCAST 0x00200000 /* Multicast Frame */ +#define RINFO_BCAST 0x00400000 /* Broadcast Frame */ +#define RINFO_CRC_ERR 0x00800000 /* CRC Error in Frame */ +#define RINFO_SYM_ERR 0x01000000 /* Symbol Error from PHY */ +#define RINFO_LEN_ERR 0x02000000 /* Length Error */ +#define RINFO_RANGE_ERR 0x04000000 /* Range Error (exceeded max. size) */ +#define RINFO_ALIGN_ERR 0x08000000 /* Alignment Error */ +#define RINFO_OVERRUN 0x10000000 /* Receive overrun */ +#define RINFO_NO_DESCR 0x20000000 /* No new Descriptor available */ +#define RINFO_LAST_FLAG 0x40000000 /* Last Fragment in Frame */ +#define RINFO_ERR 0x80000000 /* Error Occured (OR of all errors) */ + +#define RINFO_ERR_MASK (RINFO_FAIL_FILT | RINFO_CRC_ERR | RINFO_SYM_ERR | \ + RINFO_LEN_ERR | RINFO_ALIGN_ERR | RINFO_OVERRUN) + +/* TX Descriptor Control Word */ +#define TCTRL_SIZE 0x000007FF /* Size of data buffer in bytes */ +#define TCTRL_OVERRIDE 0x04000000 /* Override Default MAC Registers */ +#define TCTRL_HUGE 0x08000000 /* Enable Huge Frame */ +#define TCTRL_PAD 0x10000000 /* Pad short Frames to 64 bytes */ +#define TCTRL_CRC 0x20000000 /* Append a hardware CRC to Frame */ +#define TCTRL_LAST 0x40000000 /* Last Descriptor for TX Frame */ +#define TCTRL_INT 0x80000000 /* Generate TxDone Interrupt */ + +/* TX Status Information Word */ +#define TINFO_COL_CNT 0x01E00000 /* Collision Count */ +#define TINFO_DEFER 0x02000000 /* Packet Deferred (not an error) */ +#define TINFO_EXCESS_DEF 0x04000000 /* Excessive Deferral */ +#define TINFO_EXCESS_COL 0x08000000 /* Excessive Collision */ +#define TINFO_LATE_COL 0x10000000 /* Late Collision Occured */ +#define TINFO_UNDERRUN 0x20000000 /* Transmit Underrun */ +#define TINFO_NO_DESCR 0x40000000 /* No new Descriptor available */ +#define TINFO_ERR 0x80000000 /* Error Occured (OR of all errors) */ + +/* ENET Device Revision ID */ +#define OLD_EMAC_MODULE_ID 0x39022000 /* Rev. ID for first rev '-' */ + +/* DP83848C PHY Registers */ +#define PHY_REG_BMCR 0x00 /* Basic Mode Control Register */ +#define PHY_REG_BMSR 0x01 /* Basic Mode Status Register */ +#define PHY_REG_IDR1 0x02 /* PHY Identifier 1 */ +#define PHY_REG_IDR2 0x03 /* PHY Identifier 2 */ +#define PHY_REG_ANAR 0x04 /* Auto-Negotiation Advertisement */ +#define PHY_REG_ANLPAR 0x05 /* Auto-Neg. Link Partner Abitily */ +#define PHY_REG_ANER 0x06 /* Auto-Neg. Expansion Register */ +#define PHY_REG_ANNPTR 0x07 /* Auto-Neg. Next Page TX */ + +/* PHY Extended Registers */ +#define PHY_REG_STS 0x10 /* Status Register */ +#define PHY_REG_MICR 0x11 /* MII Interrupt Control Register */ +#define PHY_REG_MISR 0x12 /* MII Interrupt Status Register */ +#define PHY_REG_FCSCR 0x14 /* False Carrier Sense Counter */ +#define PHY_REG_RECR 0x15 /* Receive Error Counter */ +#define PHY_REG_PCSR 0x16 /* PCS Sublayer Config. and Status */ +#define PHY_REG_RBR 0x17 /* RMII and Bypass Register */ +#define PHY_REG_LEDCR 0x18 /* LED Direct Control Register */ +#define PHY_REG_PHYCR 0x19 /* PHY Control Register */ +#define PHY_REG_10BTSCR 0x1A /* 10Base-T Status/Control Register */ +#define PHY_REG_CDCTRL1 0x1B /* CD Test Control and BIST Extens. */ +#define PHY_REG_EDCR 0x1D /* Energy Detect Control Register */ + +#define PHY_FULLD_100M 0x2100 /* Full Duplex 100Mbit */ +#define PHY_HALFD_100M 0x2000 /* Half Duplex 100Mbit */ +#define PHY_FULLD_10M 0x0100 /* Full Duplex 10Mbit */ +#define PHY_HALFD_10M 0x0000 /* Half Duplex 10MBit */ +#define PHY_AUTO_NEG 0x3000 /* Select Auto Negotiation */ + +#define DP83848C_DEF_ADR 0x0100 /* Default PHY device address */ +#define DP83848C_ID 0x20005C90 /* PHY Identifier */ + +// Ethernet power/clock control bit in PCONP register +#define PCENET 0x40000000 +// Ethernet configuration for PINSEL2, as per user guide section 5.3 +#define ENET_PINSEL2_CONFIG 0x50150105 +// Ethernet configuration for PINSEL3, as per user guide section 5.4 +#define ENET_PINSEL3_CONFIG 0x00000005 +// Only bottom byte of PINSEL3 relevant to Ethernet +#define ENET_PINSEL3_MASK 0x0000000F + + +/************************************************* + * CodeRed - PHY definitions for RDB1768 rev 2 + * which uses SMSC LAN8720 PHY instead of DP83848C + *************************************************/ +#define LAN8720_ID 0x0007C0F0 /* PHY Identifier */ + + +void Init_EthMAC(void); +void RequestSend(unsigned short FrameSize); +unsigned short StartReadingFrame(void); +void StopReadingFrame(void); +unsigned int CheckIfFrameReceived(void); +void WriteFrame_EthMAC(unsigned char Data); +unsigned char ReadFrame_EthMAC(void); +void ethernet_power_down(void); + + +#endif + diff --git a/TP1_labyrinth_etu/src/fonts.h b/TP1_labyrinth_etu/src/fonts.h new file mode 100644 index 0000000000000000000000000000000000000000..602ae770ff158d01c9526709b2d73b3e2ef57e34 --- /dev/null +++ b/TP1_labyrinth_etu/src/fonts.h @@ -0,0 +1,18 @@ +/* + * fonts.h + * + * Created on: 19 avr. 2016 + * Author: cma + */ + +#ifndef INC_FONTS_H_ +#define INC_FONTS_H_ + +#define fontdatatype const unsigned char +extern fontdatatype SmallFont[]; +extern fontdatatype BigFont[]; + +#define SMALLFONT 0 +#define BIGFONT 1 + +#endif /* INC_FONTS_H_ */ diff --git a/TP1_labyrinth_etu/src/labyrinth.c b/TP1_labyrinth_etu/src/labyrinth.c new file mode 100644 index 0000000000000000000000000000000000000000..9e0d083b229ae592b5267bce83e63e76eaca2233 --- /dev/null +++ b/TP1_labyrinth_etu/src/labyrinth.c @@ -0,0 +1,119 @@ +/** + * Name : tp1_labyrinth.c + * Author : VP + * Date : 23.10.2017 + * Description : Labyrinth (TP1). Master implementation must contain: + * - 5 balls management, 1 of the master controlled by the local accelerometer + * - 1 ball controlled by the slave (accelerometer of the slave board) + * - 3 balls with random accelerations + * - FreeRTOS used in cooperative mode + * - use of global variables allowed + * Only the slave acceleration is given by the slave. All ball positions are + * managed by the master. + */ + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <stdbool.h> +#include <math.h> +#include "FreeRTOS.h" +#include "task.h" +#include "queue.h" +#include "semphr.h" +#include "lcd.h" +#include "accelerometer.h" +#include "ethernet_mgt.h" +#include "tools.h" +#include "custom_rand.h" +#include "traces_ref.h" + +#define NUMBER_OF_BALLS 5 // min 1 +#define BALL_DISP_PERIOD 20 // ms +#define BOT1_BALL_DISP_PERIOD 30 // ms +#define BOT2_BALL_DISP_PERIOD 50 // ms +#define BOT3_BALL_DISP_PERIOD 45 // ms +#define SPEED_MAX 5. +#define BALL_RADIUS 5 +#define BOT1_BALL_RADIUS 7 +#define BOT2_BALL_RADIUS 8 +#define BOT3_BALL_RADIUS 8 +#define REBOUND_FACTOR 0.9 // speed ratio after a rebound +#define PI 3.141592 +#define LCD_YELLOW (LCD_GREEN | LCD_RED) + +#define GOAL_H_WALL (LCD_MAX_WIDTH-(2*BALL_RADIUS+1+WALL_WIDTH)) +#define GOAL_V_WALL (LCD_MAX_HEIGHT-(2*BALL_RADIUS+1+WALL_WIDTH)-1) + +// Ball identifiers +enum { + NONE = -1, // NONE is used if ball has reached the goal (winner field) + MASTER_BALL, + SLAVE_BALL, + BOT1_BALL, + BOT2_BALL, + BOT3_BALL +}; + +// ball descriptor +typedef struct { + int thread_id; + object_t ball; +} ball_param_th_t; + +static coord_fx_t labyrinth_points[]={ + {80,280},{40,280},{40,190},{END_OF_LINE,LCD_WHITE}, + {40,100},{150,100},{150,160},{70,160},{END_OF_LINE,LCD_WHITE}, + {0,160},{40,160},{END_OF_LINE,LCD_WHITE}, + {70,190},{180,190},{180,80},{END_OF_LINE,LCD_WHITE}, + {210,100},{238,100},{END_OF_LINE,LCD_WHITE}, + {180,220},{238,220},{END_OF_LINE,LCD_WHITE}, + {0,40},{100,40},{END_OF_LINE,LCD_WHITE}, + {140,40},{237,40},{END_OF_LINE,LCD_WHITE}, + {120,220},{120,300},{END_OF_LINE,LCD_GREEN}, + {GOAL_H_WALL-2*BALL_RADIUS,GOAL_V_WALL},{LCD_MAX_WIDTH-1,GOAL_V_WALL},{END_OF_LINE,LCD_GREEN}, + {GOAL_H_WALL-4*BALL_RADIUS-WALL_WIDTH-1,LCD_MAX_HEIGHT-WALL_WIDTH},{GOAL_H_WALL-4*BALL_RADIUS-WALL_WIDTH-1,GOAL_V_WALL},{END_OF_WALLS,END_OF_WALLS} +}; + + +/* Description: Callback of ethernet module. This function is called when a message is received + * Parameters: data: pointer on data received + * len: length of the data [bytes] + */ +void slave_info_rx(void *data, int len) +{ + // code executed when the slave sends an ethernet frame +} + +int main(void) +{ + accel_t ball_accel; + static ball_param_th_t ball_param_th[NUMBER_OF_BALLS]={ // balls description + {MASTER_BALL,{{10,10}, {0, 0}, BALL_RADIUS, LCD_YELLOW, BALL_DISP_PERIOD}}, + {SLAVE_BALL,{{30,10}, {0, 0}, BALL_RADIUS, LCD_GREEN, BALL_DISP_PERIOD}}, + {BOT1_BALL,{{200,10}, {0, 0}, BOT1_BALL_RADIUS, LCD_RED| (LCD_BLUE>>2), BOT1_BALL_DISP_PERIOD}}, + {BOT2_BALL,{{70,70}, {0, 0}, BOT2_BALL_RADIUS, LCD_RED | (LCD_BLUE>>1), BOT2_BALL_DISP_PERIOD}}, + {BOT3_BALL,{{200,280}, {0, 0}, BOT3_BALL_RADIUS, LCD_RED | LCD_BLUE, BOT3_BALL_DISP_PERIOD}} + }; + + init_rnd32(0); // initialise random generator + init_lcd(); // initialise screen + if(accel_init() != 0) // initialise accelerometer + { + printf("Accelerometer initialisation failed!\n"); + return 1; + } + //ethernet_init(..., slave_info_rx); // initialise ethernet and determine its callback function + + draw_labyrinth(labyrinth_points); + init_traces(115200, 1, true); // initialise traces. Line to be removed if you implement your own traces + + accel_read(&ball_accel); // example: reading of the accelerometer + + // creating tasks... + // xTaskCreate(...); + // vTaskStartScheduler(); // launch scheduler + while(1); + + return 1; +} diff --git a/TP1_labyrinth_etu/src/lcd.h b/TP1_labyrinth_etu/src/lcd.h new file mode 100644 index 0000000000000000000000000000000000000000..b07e4d8f7f58be869289a33ac38e1667e4cf321e --- /dev/null +++ b/TP1_labyrinth_etu/src/lcd.h @@ -0,0 +1,231 @@ +/* + * lcd.h + * + * Created on: 27 févr. 2014 + * Updated on: 28.9.2016 + * Authors: F. Vannel, V. Pilloux + * + * Note: the RGB screen colors (if coded with 16 bits) have the following format: + * blue: bits 4..0 + * green: bits 10..5 + * red: bits 15..11 + */ + +#ifndef LCD_H_ +#define LCD_H_ + +#ifdef __USE_CMSIS +#include "LPC17xx.h" +#endif + +#include <stdarg.h> +#include <stdbool.h> +#include <stdint.h> +#include "ssp.h" +#include "fonts.h" + +// LCD predefined colors +#define LCD_BLUE (0xF<<1) +#define LCD_GREEN (0x3f<<5) +#define LCD_RED (0x1f<<11) +#define LCD_WHITE 0xFFFF +#define LCD_BLACK 0 + +// screen size +#define LCD_MAX_HEIGHT (320) +#define LCD_MAX_WIDTH (240) + + +#define DISPLAY_ON() Write_Instruction(0xaf) // Display on +#define DISPLAY_OFF() Write_Instruction(0xae) // Display off +#define SET_ADC() Write_Instruction(0xa1) // Reverse disrect (SEG128-SEG0) +#define CLEAR_ADC() Write_Instruction(0xa0) // Normal disrect (SEG0-SEG128) +#define REVERSE_DISPLAY_ON() Write_Instruction(0xa7) // Reverse display : 0 illuminated +#define REVERSE_DISPLAY_OFF() Write_Instruction(0xa6) // Normal display : 1 illuminated +#define ENTIRE_DISPLAY_ON() Write_Instruction(0xa5) // Entire display Force whole LCD point +#define ENTIRE_DISPLAY_OFF() Write_Instruction(0xa4) // Normal display +#define SET_BIAS() Write_Instruction(0xa3) // bias 1 1/7 bias +#define CLEAR_BIAS() Write_Instruction(0xa2) // bias 0 1/9 bias +#define SET_MODIFY_READ() Write_Instruction(0xe0) // Stop automatic increment of the column address by the read instruction +#define RESET_MODIFY_READ() Write_Instruction(0xee) // Cancel Modify_read, column address return to its initial value just before the Set Modify Read instruction is started +#define RESET() Write_Instruction(0xe2) +#define SET_SHL() Write_Instruction(0xc8) // SHL 1,COM33-COM0 +#define CLEAR_SHL() Write_Instruction(0xc0) // SHL 0,COM0-COM33 + +#define LCD_CS_PIN 16 +#define LCD_RS_PORT 1 // D/C DATA/COMMAND SELECT +#define LCD_RS_PIN 30 + +// sck, mosi, miso is setup within ssp_init +// LCD_RS = D/Cx line. Must be 0 for a command, 1 for data. +// WARNING: LCD_CS_ENA() is called by lcd_init() only. If another peripheral uses SSP, LCD_CS_DIS() must be called. +// If the screen is required again, LCD_CS_ENA() must be called again! +#define LCD_CS_ENA() {LPC_GPIO0->FIOCLR=(1<<LCD_CS_PIN);} +#define LCD_CS_DIS() { while ((LPC_SSP0->SR & SSPSR_BSY)); \ + LPC_GPIO0->FIOSET=(1<<LCD_CS_PIN);} + + +/* Description: LCD initialisation. Must be called before any other function. */ +void init_lcd(void); + +/* Description: fill the screen with the defined color in RGB format (see above) + * Parameter: color: RGB 16 bits color (see format description above) + */ +void clear_screen(unsigned int color); + +/* Description: print text (with printf equivalent formatting) at the last line of screen with + * specified color. Automatic line wrapping is implemented, as \n and \r characters. + * Parameters: color: RGB 16 bits color of the text + * back_color: RGB 16 bits color of the text backround + * st: string in "printf format" followed by any parameter + * Return: string length [pixels] + */ +uint16_t lcd_printf(int color, int back_color, char *st, ...); + +/* Description: print text (with printf equivalent formatting) at the specified position and color + * Parameters: x: horizontal position of the text to print + * y: vertical position of the text to print + * font_size: BIGFONT or SMALLFONT + * color: RGB 16 bits color of the text + * back_color: RGB 16 bits color of the text backround + * st: string in "printf format" followed by any parameter + * Return: string length [char] + */ +uint16_t lcd_print(int x, int y, int font_size, int color, int back_color, char *st, ...); + +/* Description: setup scroll type + * Parameter: top_fixed_lines: number of the first lines that are fixed (not scrolled) + * scroll_lines: number of lines to scroll + * bottom_fixed_lines: number of the last lines that are fixed (not scrolled) + */ +void setup_scroll(uint16_t top_fixed_lines, uint16_t scroll_lines, uint16_t bottom_fixed_lines); + +/* Description: scroll the screen vertically + * Parameter: offset: scroll length [pixels] + */ +void lcd_scroll(int offset); + +/* Description: print one character at any position + * Parameter: c: character to print + * x: horizontal position of the character to print + * y: vertical position of the character to print + * color:RGB 16 bits color of the text + * font_size: BIGFONT or SMALLFONT + */ +void lcd_print_char(char c, int x, int y, int color, int back_color, int font_size); + +/* Description: draw an empty circle + * Parameter: x_centre: horizontal position of the center of the circle + * y_centre: vertical position of the center of the circle + * r: circle radius + * color:RGB 16 bits color of the text + */ +void lcd_circle(int x_centre, int y_centre, int r, unsigned int color); + +/* Description: draw a filled circle + * Parameter: x_centre: horizontal position of the center of the circle + * y_centre: vertical position of the center of the circle + * r: circle radius + * color:RGB 16 bits color of the circle + */ +void lcd_filled_circle(int x_centre, int y_centre, int r, unsigned int color); + +/* Description: draw a filled circle + * Parameter: x_centre: horizontal position of the center of the circle + * y_centre: vertical position of the center of the circle + * r: circle radius + * color:RGB 16 bits foreground color of the circle + * background_color: background color of the square around the circle + */ +void lcd_filled_circle_on_square(int x_centre, int y_centre, int r, + unsigned int color, unsigned int background_color); + +/* Description: draw a line + * Parameter: x1: horizontal position of one line extremity + * y1: vertical position of one line extremity + * x2: horizontal position of the second line extremity + * y2: vertical position of the second line extremity + * color:RGB 16 bits color of the text + */ +void lcd_line(int x1, int y1, int x2, int y2, unsigned int color); + +/* Description: draw an horizontal line + * Parameter: x1: left horizontal position of one the line + * y1: vertical position of the line + * l: line length + * color:RGB 16 bits color of the text + */ +void lcd_lineH(int x, int y, int l, unsigned int color) ; + +/* Description: draw an vertical line + * Parameter: x1: left horizontal position of one the line + * y1: vertical position of the line + * l: line length + * color:RGB 16 bits color of the text + */ +void lcd_lineV(int x, int y, int l, unsigned int color); + +/* Description: draw an empty rectangle + * Parameter: x1: horizontal position of the top left corner + * y1: vertical position of the top left corner + * x2: horizontal position of the bottom right corner + * y2: vertical position of the bottom right corner + * color:RGB 16 bits color of the text + */ +void lcd_empty_rectangle(int x1, int y1, int x2, int y2, int color); + +/* Description: draw plain rectangle + * Parameter: x1: horizontal position of the top left corner + * y1: vertical position of the top left corner + * x2: horizontal position of the bottom right corner + * y2: vertical position of the bottom right corner + * color:RGB 16 bits color of the text + */ +void lcd_filled_rectangle(int x1, int y1, int x2, int y2, int color); + +/* Description: read an image in a file of BMP format, adapts it to the LCD format and + * put it in memory. The number of pixel of the image width must be a multiple of 4. + * Parameter: filename: filename of a BMP file + * + * Return: width: image width [pixels] + * height: image height [pixels] + * return value: pointer on the image in memory or NULL if an error occurred + */ +uint16_t *read_bmp_file(char *filename, uint16_t *width, uint16_t *height); + +/* Description: display an image stored in memory + * Parameter: bitmap: pointer on the image in memory. Each word of 16 bits represents the + * color of one pixel. The pixel are stored from left to right line by + * line from top to bottom. + * x: horizontal position of the top left corner + * y: vertical position of the top left corner + * width: image width + * height: image height + */ +void display_bitmap16(uint16_t *bitmap, uint16_t x, uint16_t y, uint16_t width, uint16_t height); + +/* Description: get pixel colors in a rectangle (16 bits format) + * Parameter: x1: horizontal position of the top left corner + * y1: vertical position of the top left corner + * x2: horizontal position of the bottom right corner + * y2: vertical position of the bottom right corner + * out: pointer on the 16 bits colors of the pixels in the rectangle + */ +void read_pixels(uint8_t x1, uint16_t y1, uint8_t x2, uint16_t y2, uint16_t *out); + + +/* Description: reads data of any command that gets data on LCD + * Parameter: read_cmd: LCD command word + * data_read: pointer on data to be read + * len: data length + */ +void read_cmd(uint8_t read_cmd, uint8_t *data_read, uint16_t len); + +// macro utilities +#define swap(type, i, j) {type t = i; i = j; j = t;} +#define MAX(x,y) (((x)>(y))?(x):(y)) +#define MIN(x,y) (((x)<(y))?(x):(y)) +#define ABS(x) (((x)<0)?-(x):(x)) + + +#endif /* LCD_H_ */ diff --git a/TP1_labyrinth_etu/src/ssp.h b/TP1_labyrinth_etu/src/ssp.h new file mode 100644 index 0000000000000000000000000000000000000000..5584d85c06dbd3cb32c8d21c4c88a7bd509a14a2 --- /dev/null +++ b/TP1_labyrinth_etu/src/ssp.h @@ -0,0 +1,24 @@ +/* + * ssp.h + * + * Created on: 12 mars 2014 + * Author: christian + */ + +#ifndef SSP_H_ +#define SSP_H_ + +#include "LPC17xx.h" + +#define SSPSR_TFE (1 << 0) +#define SSPSR_TNF (1 << 1) +#define SSPSR_RNE (1 << 2) +#define SSPSR_RFF (1 << 3) +#define SSPSR_BSY (1 << 4) + + +void ssp_init_custom(uint8_t data_size_select, uint8_t scr); +void ssp_send_buf(uint8_t *buf, uint32_t length); +void ssp_receive_buf(uint8_t *buf, uint32_t length); + +#endif /* SSP_H_ */ diff --git a/TP1_labyrinth_etu/src/tools.c b/TP1_labyrinth_etu/src/tools.c new file mode 100644 index 0000000000000000000000000000000000000000..eda7a0d1e7daa62fc0036042080b4ef3ee8e7875 --- /dev/null +++ b/TP1_labyrinth_etu/src/tools.c @@ -0,0 +1,128 @@ +/* + * tools.c + * + * Created on: 22 oct. 2017 + * Author: vince + */ + +#include <math.h> +#include "tools.h" +#include "lcd.h" + +int round(float x) +{ + if (x>=.5) + return (int)ceil(x); + if (x<=-.5) + return (int)floor(x); + return 0; +} + + +void draw_labyrinth(coord_fx_t *labyrinth_points) +{ + int i=0, color=LCD_WHITE; + + clear_screen(LCD_BLACK); + do { + while (labyrinth_points[++i].x>=0) + { + lcd_filled_rectangle( + labyrinth_points[i-1].x>labyrinth_points[i].x?labyrinth_points[i-1].x+WALL_WIDTH-1:labyrinth_points[i-1].x, + labyrinth_points[i-1].y>labyrinth_points[i].y?labyrinth_points[i-1].y+WALL_WIDTH-1:labyrinth_points[i-1].y, + labyrinth_points[i-1].x==labyrinth_points[i].x?labyrinth_points[i].x+WALL_WIDTH-1:labyrinth_points[i].x, + labyrinth_points[i-1].y==labyrinth_points[i].y?labyrinth_points[i].y+WALL_WIDTH-1:labyrinth_points[i].y, + color); + } + color=labyrinth_points[i].y; + } while (labyrinth_points[i++].x!=END_OF_WALLS); +} + + + +/* detect all collisions among all object in every direction + * Return: collision vector index or NO_COLLISION + */ +int test_collision(object_t *object) +{ + uint16_t tp[2*MAX_RADIUS+1], i, k; + int offset_x, offset_y; + int col_dir_idx=0; // keep track of collision points around max_dir + coord_fx_t speed, pos; + float speed_max; + + // test collision at next position of the object. ! to rounding ! + pos.x=round(object->pos.x+object->speed.x); + pos.y=round(object->pos.y+object->speed.y); + speed.x=pos.x-round(object->pos.x); + speed.y=pos.y-round(object->pos.y); + // test screen bounds: + if (pos.x<object->radius) + col_dir_idx|=TOUCH_LEFT; + if (pos.x>LCD_MAX_WIDTH-object->radius-1) + col_dir_idx|=TOUCH_RIGHT; + if (pos.y<object->radius) + col_dir_idx|=TOUCH_UP; + if (pos.y>LCD_MAX_HEIGHT-object->radius-1) + col_dir_idx|=TOUCH_DOWN; + if (col_dir_idx) + return col_dir_idx; + + speed_max=MAX(ABS(speed.x), ABS(speed.y)); + for (k=1; k<=speed_max; k++) // test line by line if there is a collision, going forward of 1 pixel + { + pos.x=round(object->pos.x+object->speed.x*(float)k/speed_max); + pos.y=round(object->pos.y+object->speed.y*(float)k/speed_max); + speed.x=pos.x-round(object->pos.x); + speed.y=pos.y-round(object->pos.y); + offset_x=speed.x?1:0; // to adjust size of the front detection line + offset_y=speed.y?1:0; + if (speed.y>0) // test low horizontal line of pixel of the object width (on new position), except pixel on corner! + { + read_pixels((uint8_t)(pos.x-object->radius+offset_x), (uint16_t)(pos.y+object->radius), + (uint8_t)(pos.x+object->radius-offset_x), (uint16_t)(pos.y+object->radius), tp); + for (i=0; i<=2*(object->radius-offset_x); i++) + if (tp[i]) + { + col_dir_idx|=TOUCH_DOWN; + break; + } + } + if (speed.y<0) + { + read_pixels((uint8_t)(pos.x-object->radius+offset_x), (uint16_t)(pos.y-object->radius), + (uint8_t)(pos.x+object->radius-offset_x), (uint16_t)(pos.y-object->radius), tp); + for (i=0; i<=2*(object->radius-offset_x); i++) + if (tp[i]) + { + col_dir_idx|=TOUCH_UP; + break; + } + } + if (speed.x>0) // test right vertical line of pixel of the object width (on new position) except corner pixel + { + read_pixels((uint8_t)(pos.x+object->radius), (uint16_t)(pos.y-object->radius+offset_y), + (uint8_t)(pos.x+object->radius), (uint16_t)(pos.y+object->radius-offset_y), tp); + for (i=0; i<=2*(object->radius-offset_y); i++) + if (tp[i]) + { + col_dir_idx|=TOUCH_RIGHT; + break; + } + } + if (speed.x<0) + { + read_pixels((uint8_t)(pos.x-object->radius), (uint16_t)(pos.y-object->radius+offset_y), + (uint8_t)(pos.x-object->radius), (uint16_t)(pos.y+object->radius-offset_y), tp); + for (i=0; i<=2*(object->radius-offset_y); i++) + if (tp[i]) + { + col_dir_idx|=TOUCH_LEFT; + break; + } + } + if (col_dir_idx) + break; + } + return col_dir_idx; +} diff --git a/TP1_labyrinth_etu/src/tools.h b/TP1_labyrinth_etu/src/tools.h new file mode 100644 index 0000000000000000000000000000000000000000..701c2d943282b2d0feecab57cdb3d590c4ea3362 --- /dev/null +++ b/TP1_labyrinth_etu/src/tools.h @@ -0,0 +1,77 @@ +/* + * Name : tools.h + * Author : VP + * Date : 23.10.2017 + * Description : utility functions to draw the labyrinth and to test object collisions + */ + +#ifndef TOOLS_H_ +#define TOOLS_H_ + +#include <stdint.h> + +#define MAX_RADIUS 15 // maximum radius of an object +#define WALL_WIDTH 3 // labyrinth wall width +#define END_OF_LINE -1 // 'x' coordinate of labyrinth indicating the end of a wall +#define END_OF_WALLS -2 // ^y' coordinate of labyrinth indicating the end of the point table + +// constants used to build the collision vector (see function test_collision) +enum { + NO_COLLISION=0, + TOUCH_LEFT=(1<<2), + TOUCH_RIGHT=(1<<0), + TOUCH_UP=(1<<1), + TOUCH_DOWN=(1<<3), +}; + +typedef struct +{ + float x; + float y; +} coord_t; + +typedef struct +{ + int x; + int y; +} coord_fx_t; + +// defines a "squared" object. "pos" defines the position of the center of the object +// and radius is the number of pixels considered around pos in x and y directions +typedef struct +{ + coord_t pos; + coord_t speed; + uint8_t radius; + uint16_t color; + uint16_t period; // display period [ms] +} object_t; + +typedef struct { + int ball_id; + coord_fx_t ball_coord; + uint16_t color; + uint8_t radius; + int8_t winner; +} master_tx_t; + +// rounds a float on an integer, whatever its sign +int round(float x); + + +/* draw the labyrinth. The wall description is an array of points. 2 successive points must have at least + * one common coordinate, either x or y since only vertical or horizontal lines are allowed. To end a line, + * END_OF_LINE must replace the x coordinate, while feeding y with the line color of the next line. The end of the array + * is marked with the point {END_OF_WALLS,END_OF_WALLS} + * Parameter: labyrinth_points: pointer on the array of points + * */ +void draw_labyrinth(coord_fx_t *labyrinth_points); + +/* detect all collisions among all objects in every direction. + * Parameter: object: object that tests collisions + * Return: collision vector index or NO_COLLISION. The vector is a bit vector indicating where the object touched + * an obstacle. Example of value returned: TOUCH_RIGHT | TOUCH_UP. + */ +int test_collision(object_t *object); + +#endif /* TOOLS_H_ */ diff --git a/TP1_labyrinth_etu/src/trace_mgt.c b/TP1_labyrinth_etu/src/trace_mgt.c new file mode 100644 index 0000000000000000000000000000000000000000..4f6d5d4a944d73038c6ca7edac2544488784fd3d --- /dev/null +++ b/TP1_labyrinth_etu/src/trace_mgt.c @@ -0,0 +1,39 @@ + +/* + * Description: trace management using UART + * Created on : 23.3.2017 + * Author : VP + */ +#ifdef __USE_CMSIS +#include "LPC17xx.h" +#endif +#include <traces_ref.h> +#include "FreeRTOS.h" +#include "task.h" +#include "queue.h" +#include "semphr.h" +#include "uart.h" + +/* Description: write a trace to a memory buffer. Note that this function is + * automatically called by FreeRTOS in privileged mode. + * + * Parameters: trace_id: trace ID. Usually the task number in FreeRTOS. + * val: 1 if task becomes active, 0 otherwise + */ +void write_trace(uint8_t trace_id, short val) +{ + write_trace_ref(trace_id, val); // to be replaced by your own implementation +} + + + +/*void vApplicationIdleHook( void ) +{ + while (1) + { + // implement trace sending here after having set configUSE_IDLE_HOOK to 1 in FreeRTOSConfig.h + taskYIELD(); // force changement de contexte + } +}*/ + + diff --git a/TP1_labyrinth_etu/src/traces_ref.h b/TP1_labyrinth_etu/src/traces_ref.h new file mode 100644 index 0000000000000000000000000000000000000000..814d3d157d10627fa2e0718452b19b9597559b10 --- /dev/null +++ b/TP1_labyrinth_etu/src/traces_ref.h @@ -0,0 +1,45 @@ +/* + * Description: trace management using UART (and FreeRTOS) + * Created on : 30 sept. 2013 + * Author : VP + */ +#ifndef TRACES_REF_H_ +#define TRACES_REF_H_ + +#include <stdio.h> +#include <stdint.h> +#include <stdbool.h> + +// definition of the synchronisation word defining the start of each trace +#define SYNCHRO_WORD 0x55 + +/* Description: initialize UART0 and specified timer for traces. If enabled, + * the interrupts occur after each trace sending. + * DO NOT CALL send_traces_to_uart0() but only write_trace_ref() + * if interrupts are enabled. + * Parameters: baudrate: valid UART baudrate [bit/s] + * timer_id: 0 to 3 to identify the timer used as a free running counter + * interrupt_enabled: enable UART0 interrupt if true + */ +void init_traces(uint32_t baudrate, int timer_id, bool interrupt_enabled); + +/* Description: store a trace in a memory buffer + * + * Parameters: trace_id: trace ID. Usually the task number in FreeRTOS. + * val: 1 if task becomes active, 0 otherwise + */ +void write_trace_ref(uint8_t trace_id, short val); + +/* Description: if new traces are available, send them to UART. + * Polling is used here instead of interrupts */ +void send_traces_to_uart0(void); + +// trace structure +typedef struct { + uint8_t synchro; + uint8_t sig_idx; /* bit 8 indicates other traces than VCD */ + short val; + uint32_t time; +} trace_t; + +#endif diff --git a/TP1_labyrinth_etu/src/uart.h b/TP1_labyrinth_etu/src/uart.h new file mode 100644 index 0000000000000000000000000000000000000000..ccd49ea0b9d00e460ae60ef185d8f1e6842380ad --- /dev/null +++ b/TP1_labyrinth_etu/src/uart.h @@ -0,0 +1,50 @@ +/* + * Description: UART 0 driver + * Created on : 30 sept. 2013 + * Author : VP + */ +#ifndef __UART_H +#define __UART_H + +#define IER_RX 0x1 // interrupt enable flags +#define IER_TX 0x2 + +#define IIR_TX 0x2 // interrupt identification flags +#define IIR_RX 0x4 +#define IS_TX_EMPTY (1<<5) // status flags on LSR register +#define IS_RX_NOT_EMPTY (1<<2) + +/* Callback function prototype for UART interrupt */ +typedef void (*uart_callback_t)(int int_status); + +/* Description: UART 0 initialisation. Callbacks can be used, but at most once for TX and once for RX data. + * Note that only the first call of uart0_init_ref is setting up the baudrate, which can't be + * modified during further calls. + * + * Parameters: baudrate [bit/s] + * tx_callback: pointer on callback function called by interrupt at the end of TX character + * transmission. Note that calling uart0_init_ref() does NOT activate IER_THRE to avoid + * continuous calls of tx_callback when the transmission buffer is empty. It is up to + * the user to enable it when necessary (LPC_UART0->IER |= IER_THRE) and to disable it at + * the end of the transmission (LPC_UART0->IER &= ~IER_THRE). Once IER configured to enable + * the interrupt, the first interrupt can be provoked either by sending a character on the UART + * or by forcing the VIC to rise it with NVIC_SetPendingIRQ(UART0_IRQn). Note that if this last + * method is used, the int_flags of the callback parameter are not significant. In this case, + * LPC_UART0->LSR must be read to know if a transmission has been done. + * rx_callback: pointer on callback function called by interrupt on RX character + * receiving. if NULL is given, no interrupt is configured. The callback + * will be called each time a character is received. + */ +void uart0_init_ref(uint32_t baudrate, uart_callback_t tx_callback, uart_callback_t rx_callback); + +/* Description: UART 0 initialisation + * + * Parameters: data: pointer on data to be sent + * length: data length [bytes] + */ +void uart0_send_ref(uint8_t *data, uint32_t length); + +/* Description: stop UART0 interrupts. The switch off is only managed by the VIC. */ +void uart0_stop_interrupt(); + +#endif diff --git a/TP1_labyrinth_slave_etu/.DS_Store b/TP1_labyrinth_slave_etu/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..5008ddfcf53c02e82d7eee2e57c38e5672ef89f6 Binary files /dev/null and b/TP1_labyrinth_slave_etu/.DS_Store differ diff --git a/TP1_labyrinth_slave_etu/.cproject b/TP1_labyrinth_slave_etu/.cproject new file mode 100644 index 0000000000000000000000000000000000000000..414114adba1805e05d3a13c48435be8b254e93eb --- /dev/null +++ b/TP1_labyrinth_slave_etu/.cproject @@ -0,0 +1,230 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<?fileVersion 4.0.0?><cproject storage_type_id="org.eclipse.cdt.core.XmlProjectDescriptionStorage"> + <storageModule moduleId="org.eclipse.cdt.core.settings"> + <cconfiguration id="com.crt.advproject.config.exe.debug.1961788077"> + <storageModule buildSystemId="org.eclipse.cdt.managedbuilder.core.configurationDataProvider" id="com.crt.advproject.config.exe.debug.1961788077" moduleId="org.eclipse.cdt.core.settings" name="Debug"> + <externalSettings/> + <extensions> + <extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser"/> + <extension id="org.eclipse.cdt.core.GNU_ELF" point="org.eclipse.cdt.core.BinaryParser"/> + <extension id="org.eclipse.cdt.core.GmakeErrorParser" point="org.eclipse.cdt.core.ErrorParser"/> + <extension id="org.eclipse.cdt.core.CWDLocator" point="org.eclipse.cdt.core.ErrorParser"/> + <extension id="org.eclipse.cdt.core.GCCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/> + <extension id="org.eclipse.cdt.core.GASErrorParser" point="org.eclipse.cdt.core.ErrorParser"/> + <extension id="org.eclipse.cdt.core.GLDErrorParser" point="org.eclipse.cdt.core.ErrorParser"/> + </extensions> + </storageModule> + <storageModule moduleId="cdtBuildSystem" version="4.0.0"> + <configuration artifactExtension="axf" artifactName="${ProjName}" buildArtefactType="org.eclipse.cdt.build.core.buildArtefactType.exe" buildProperties="org.eclipse.cdt.build.core.buildArtefactType=org.eclipse.cdt.build.core.buildArtefactType.exe" cleanCommand="rm -rf" description="Debug build" errorParsers="org.eclipse.cdt.core.CWDLocator;org.eclipse.cdt.core.GmakeErrorParser;org.eclipse.cdt.core.GCCErrorParser;org.eclipse.cdt.core.GLDErrorParser;org.eclipse.cdt.core.GASErrorParser" id="com.crt.advproject.config.exe.debug.1961788077" name="Debug" parent="com.crt.advproject.config.exe.debug" postannouncebuildStep="Performing post-build steps" postbuildStep="arm-none-eabi-size "${BuildArtifactFileName}"; # arm-none-eabi-objcopy -v -O binary "${BuildArtifactFileName}" "${BuildArtifactFileBaseName}.bin" ; # checksum -p ${TargetChip} -d "${BuildArtifactFileBaseName}.bin"; "> + <folderInfo id="com.crt.advproject.config.exe.debug.1961788077." name="/" resourcePath=""> + <toolChain id="com.crt.advproject.toolchain.exe.debug.830538228" name="Code Red MCU Tools" superClass="com.crt.advproject.toolchain.exe.debug"> + <targetPlatform binaryParser="org.eclipse.cdt.core.ELF;org.eclipse.cdt.core.GNU_ELF" id="com.crt.advproject.platform.exe.debug.1482556786" name="ARM-based MCU (Debug)" superClass="com.crt.advproject.platform.exe.debug"/> + <builder buildPath="${workspace_loc:/Labo1}/Debug" id="com.crt.advproject.builder.exe.debug.766322327" keepEnvironmentInBuildfile="false" managedBuildOn="true" name="Gnu Make Builder" superClass="com.crt.advproject.builder.exe.debug"/> + <tool id="com.crt.advproject.cpp.exe.debug.2114699748" name="MCU C++ Compiler" superClass="com.crt.advproject.cpp.exe.debug"/> + <tool id="com.crt.advproject.gcc.exe.debug.504230289" name="MCU C Compiler" superClass="com.crt.advproject.gcc.exe.debug"> + <option id="com.crt.advproject.gcc.arch.1052075906" name="Architecture" superClass="com.crt.advproject.gcc.arch" value="com.crt.advproject.gcc.target.cm3" valueType="enumerated"/> + <option id="com.crt.advproject.gcc.thumb.559004851" name="Thumb mode" superClass="com.crt.advproject.gcc.thumb" value="true" valueType="boolean"/> + <option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="gnu.c.compiler.option.preprocessor.def.symbols.1212555079" name="Defined symbols (-D)" superClass="gnu.c.compiler.option.preprocessor.def.symbols" valueType="definedSymbols"> + <listOptionValue builtIn="false" value="__REDLIB__"/> + <listOptionValue builtIn="false" value="DEBUG"/> + <listOptionValue builtIn="false" value="__CODE_RED"/> + <listOptionValue builtIn="false" value="CORE_M3"/> + <listOptionValue builtIn="false" value="__USE_CMSIS=CMSIS_CORE_LPC17xx"/> + <listOptionValue builtIn="false" value="__LPC17XX__"/> + </option> + <option id="gnu.c.compiler.option.misc.other.2130493681" name="Other flags" superClass="gnu.c.compiler.option.misc.other" value="-c -fmessage-length=0 -fno-builtin -ffunction-sections -fdata-sections" valueType="string"/> + <option id="com.crt.advproject.gcc.hdrlib.1230238397" name="Library headers" superClass="com.crt.advproject.gcc.hdrlib" value="com.crt.advproject.gcc.hdrlib.codered" valueType="enumerated"/> + <option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="gnu.c.compiler.option.include.paths.587235853" name="Include paths (-I)" superClass="gnu.c.compiler.option.include.paths" valueType="includePath"> + <listOptionValue builtIn="false" value=""${workspace_loc:/CMSISv2p00_LPC17xx/inc}""/> + </option> + <option id="com.crt.advproject.gcc.exe.debug.option.optimization.level.1584171154" name="Optimization Level" superClass="com.crt.advproject.gcc.exe.debug.option.optimization.level" value="gnu.c.optimization.level.none" valueType="enumerated"/> + <inputType id="com.crt.advproject.compiler.input.2000624862" superClass="com.crt.advproject.compiler.input"/> + </tool> + <tool id="com.crt.advproject.gas.exe.debug.1415986929" name="MCU Assembler" superClass="com.crt.advproject.gas.exe.debug"> + <option id="com.crt.advproject.gas.arch.548681547" name="Architecture" superClass="com.crt.advproject.gas.arch" value="com.crt.advproject.gas.target.cm3" valueType="enumerated"/> + <option id="com.crt.advproject.gas.thumb.1661478602" name="Thumb mode" superClass="com.crt.advproject.gas.thumb" value="true" valueType="boolean"/> + <option id="gnu.both.asm.option.flags.crt.572280974" name="Assembler flags" superClass="gnu.both.asm.option.flags.crt" value="-c -x assembler-with-cpp -D__REDLIB__ -DDEBUG -D__CODE_RED" valueType="string"/> + <option id="com.crt.advproject.gas.hdrlib.2076415884" name="Library headers" superClass="com.crt.advproject.gas.hdrlib" value="com.crt.advproject.gas.hdrlib.codered" valueType="enumerated"/> + <inputType id="cdt.managedbuild.tool.gnu.assembler.input.248721909" superClass="cdt.managedbuild.tool.gnu.assembler.input"/> + <inputType id="com.crt.advproject.assembler.input.968568522" name="Additional Assembly Source Files" superClass="com.crt.advproject.assembler.input"/> + </tool> + <tool id="com.crt.advproject.link.cpp.exe.debug.753747237" name="MCU C++ Linker" superClass="com.crt.advproject.link.cpp.exe.debug"/> + <tool id="com.crt.advproject.link.exe.debug.183992099" name="MCU Linker" superClass="com.crt.advproject.link.exe.debug"> + <option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="true" id="com.crt.advproject.link.gcc.multicore.master.userobjs.1782236783" name="Slave Objects (not visible)" superClass="com.crt.advproject.link.gcc.multicore.master.userobjs" valueType="userObjs"/> + <option id="com.crt.advproject.link.arch.563245846" name="Architecture" superClass="com.crt.advproject.link.arch" value="com.crt.advproject.link.target.cm3" valueType="enumerated"/> + <option id="com.crt.advproject.link.thumb.1587210223" name="Thumb mode" superClass="com.crt.advproject.link.thumb" value="true" valueType="boolean"/> + <option id="com.crt.advproject.link.script.1660719451" name="Linker script" superClass="com.crt.advproject.link.script" value=""Labo4_langton_Debug.ld"" valueType="string"/> + <option id="com.crt.advproject.link.manage.212894868" name="Manage linker script" superClass="com.crt.advproject.link.manage" value="true" valueType="boolean"/> + <option id="gnu.c.link.option.nostdlibs.1735300984" name="No startup or default libs (-nostdlib)" superClass="gnu.c.link.option.nostdlibs" value="true" valueType="boolean"/> + <option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="gnu.c.link.option.other.681311213" name="Other options (-Xlinker [option])" superClass="gnu.c.link.option.other" valueType="stringList"> + <listOptionValue builtIn="false" value="-Map="${BuildArtifactFileBaseName}.map""/> + <listOptionValue builtIn="false" value="--gc-sections"/> + </option> + <option id="com.crt.advproject.link.gcc.hdrlib.1667564543" name="Library" superClass="com.crt.advproject.link.gcc.hdrlib" value="com.crt.advproject.gcc.link.hdrlib.codered.semihost" valueType="enumerated"/> + <option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="gnu.c.link.option.libs.73205768" name="Libraries (-l)" superClass="gnu.c.link.option.libs" valueType="libs"> + <listOptionValue builtIn="false" value="MyLab_lib"/> + <listOptionValue builtIn="false" value="CMSISv2p00_LPC17xx"/> + </option> + <option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="gnu.c.link.option.paths.1697219173" name="Library search path (-L)" superClass="gnu.c.link.option.paths" valueType="libPaths"> + <listOptionValue builtIn="false" value=""${workspace_loc:/${ProjName}/Debug}""/> + <listOptionValue builtIn="false" value=""${workspace_loc:/CMSISv2p00_LPC17xx/Debug}""/> + </option> + <option id="com.crt.advproject.link.crpenable.899096388" name="Enable Code Read Protection" superClass="com.crt.advproject.link.crpenable" value="true" valueType="boolean"/> + <option id="com.crt.advproject.link.gcc.multicore.slave.241458873" name="Multicore configuration" superClass="com.crt.advproject.link.gcc.multicore.slave"/> + <option id="com.crt.advproject.link.memory.load.image.645908871" superClass="com.crt.advproject.link.memory.load.image" value="" valueType="string"/> + <option id="com.crt.advproject.link.memory.heapAndStack.408591348" superClass="com.crt.advproject.link.memory.heapAndStack" value="&Heap:Default;Post Data;Default&Stack:Default;End;Default" valueType="string"/> + <option id="com.crt.advproject.link.memory.data.1066803441" superClass="com.crt.advproject.link.memory.data" value="" valueType="string"/> + <option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="true" id="com.crt.advproject.link.memory.sections.1615005549" superClass="com.crt.advproject.link.memory.sections" valueType="stringList"/> + <inputType id="cdt.managedbuild.tool.gnu.c.linker.input.1851823283" superClass="cdt.managedbuild.tool.gnu.c.linker.input"> + <additionalInput kind="additionalinputdependency" paths="$(USER_OBJS)"/> + <additionalInput kind="additionalinput" paths="$(LIBS)"/> + </inputType> + </tool> + <tool id="com.crt.advproject.tool.debug.debug.790069747" name="MCU Debugger" superClass="com.crt.advproject.tool.debug.debug"/> + </toolChain> + </folderInfo> + <sourceEntries> + <entry excluding="Labo4.c|Labo_mylab1.c|Labo2_mylab1_correction.c|Labo1.c|Labo1_mylab1_correction.c|Labo1_correction.c" flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="src"/> + </sourceEntries> + </configuration> + </storageModule> + <storageModule moduleId="org.eclipse.cdt.core.externalSettings"/> + </cconfiguration> + <cconfiguration id="com.crt.advproject.config.exe.release.955237986"> + <storageModule buildSystemId="org.eclipse.cdt.managedbuilder.core.configurationDataProvider" id="com.crt.advproject.config.exe.release.955237986" moduleId="org.eclipse.cdt.core.settings" name="Release"> + <externalSettings/> + <extensions> + <extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser"/> + <extension id="org.eclipse.cdt.core.GNU_ELF" point="org.eclipse.cdt.core.BinaryParser"/> + <extension id="org.eclipse.cdt.core.GmakeErrorParser" point="org.eclipse.cdt.core.ErrorParser"/> + <extension id="org.eclipse.cdt.core.CWDLocator" point="org.eclipse.cdt.core.ErrorParser"/> + <extension id="org.eclipse.cdt.core.GCCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/> + <extension id="org.eclipse.cdt.core.GASErrorParser" point="org.eclipse.cdt.core.ErrorParser"/> + <extension id="org.eclipse.cdt.core.GLDErrorParser" point="org.eclipse.cdt.core.ErrorParser"/> + </extensions> + </storageModule> + <storageModule moduleId="cdtBuildSystem" version="4.0.0"> + <configuration artifactExtension="axf" artifactName="${ProjName}" buildArtefactType="org.eclipse.cdt.build.core.buildArtefactType.exe" buildProperties="org.eclipse.cdt.build.core.buildArtefactType=org.eclipse.cdt.build.core.buildArtefactType.exe" cleanCommand="rm -rf" description="Release build" errorParsers="org.eclipse.cdt.core.CWDLocator;org.eclipse.cdt.core.GmakeErrorParser;org.eclipse.cdt.core.GCCErrorParser;org.eclipse.cdt.core.GLDErrorParser;org.eclipse.cdt.core.GASErrorParser" id="com.crt.advproject.config.exe.release.955237986" name="Release" parent="com.crt.advproject.config.exe.release" postannouncebuildStep="Performing post-build steps" postbuildStep="arm-none-eabi-size "${BuildArtifactFileName}"; # arm-none-eabi-objcopy -v -O binary "${BuildArtifactFileName}" "${BuildArtifactFileBaseName}.bin" ; # checksum -p ${TargetChip} -d "${BuildArtifactFileBaseName}.bin"; "> + <folderInfo id="com.crt.advproject.config.exe.release.955237986." name="/" resourcePath=""> + <toolChain id="com.crt.advproject.toolchain.exe.release.2026634147" name="Code Red MCU Tools" superClass="com.crt.advproject.toolchain.exe.release"> + <targetPlatform binaryParser="org.eclipse.cdt.core.ELF;org.eclipse.cdt.core.GNU_ELF" id="com.crt.advproject.platform.exe.release.392374634" name="ARM-based MCU (Release)" superClass="com.crt.advproject.platform.exe.release"/> + <builder buildPath="${workspace_loc:/Labo1}/Release" id="com.crt.advproject.builder.exe.release.927746786" keepEnvironmentInBuildfile="false" managedBuildOn="true" name="Gnu Make Builder" superClass="com.crt.advproject.builder.exe.release"/> + <tool id="com.crt.advproject.cpp.exe.release.1901145628" name="MCU C++ Compiler" superClass="com.crt.advproject.cpp.exe.release"/> + <tool id="com.crt.advproject.gcc.exe.release.1579904955" name="MCU C Compiler" superClass="com.crt.advproject.gcc.exe.release"> + <option id="com.crt.advproject.gcc.arch.1766743211" name="Architecture" superClass="com.crt.advproject.gcc.arch" value="com.crt.advproject.gcc.target.cm3" valueType="enumerated"/> + <option id="com.crt.advproject.gcc.thumb.1007793482" name="Thumb mode" superClass="com.crt.advproject.gcc.thumb" value="true" valueType="boolean"/> + <option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="gnu.c.compiler.option.preprocessor.def.symbols.1279704342" name="Defined symbols (-D)" superClass="gnu.c.compiler.option.preprocessor.def.symbols" valueType="definedSymbols"> + <listOptionValue builtIn="false" value="__REDLIB__"/> + <listOptionValue builtIn="false" value="NDEBUG"/> + <listOptionValue builtIn="false" value="__CODE_RED"/> + <listOptionValue builtIn="false" value="CORE_M3"/> + <listOptionValue builtIn="false" value="__USE_CMSIS=CMSIS_CORE_LPC17xx"/> + <listOptionValue builtIn="false" value="__LPC17XX__"/> + </option> + <option id="gnu.c.compiler.option.misc.other.58542398" name="Other flags" superClass="gnu.c.compiler.option.misc.other" value="-c -fmessage-length=0 -fno-builtin -ffunction-sections -fdata-sections" valueType="string"/> + <option id="com.crt.advproject.gcc.hdrlib.1441429566" name="Library headers" superClass="com.crt.advproject.gcc.hdrlib" value="Redlib" valueType="enumerated"/> + <option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="gnu.c.compiler.option.include.paths.225061442" name="Include paths (-I)" superClass="gnu.c.compiler.option.include.paths" valueType="includePath"> + <listOptionValue builtIn="false" value=""${workspace_loc:/CMSIS_CORE_LPC17xx/inc}""/> + </option> + <inputType id="com.crt.advproject.compiler.input.347615753" superClass="com.crt.advproject.compiler.input"/> + </tool> + <tool id="com.crt.advproject.gas.exe.release.532066257" name="MCU Assembler" superClass="com.crt.advproject.gas.exe.release"> + <option id="com.crt.advproject.gas.arch.1319352587" name="Architecture" superClass="com.crt.advproject.gas.arch" value="com.crt.advproject.gas.target.cm3" valueType="enumerated"/> + <option id="com.crt.advproject.gas.thumb.755379561" name="Thumb mode" superClass="com.crt.advproject.gas.thumb" value="true" valueType="boolean"/> + <option id="gnu.both.asm.option.flags.crt.1760599231" name="Assembler flags" superClass="gnu.both.asm.option.flags.crt" value="-c -x assembler-with-cpp -D__REDLIB__ -DNDEBUG -D__CODE_RED" valueType="string"/> + <option id="com.crt.advproject.gas.hdrlib.2083300418" name="Library headers" superClass="com.crt.advproject.gas.hdrlib" value="Redlib" valueType="enumerated"/> + <inputType id="cdt.managedbuild.tool.gnu.assembler.input.143327671" superClass="cdt.managedbuild.tool.gnu.assembler.input"/> + <inputType id="com.crt.advproject.assembler.input.1888299321" name="Additional Assembly Source Files" superClass="com.crt.advproject.assembler.input"/> + </tool> + <tool id="com.crt.advproject.link.cpp.exe.release.814798268" name="MCU C++ Linker" superClass="com.crt.advproject.link.cpp.exe.release"/> + <tool id="com.crt.advproject.link.exe.release.1858913969" name="MCU Linker" superClass="com.crt.advproject.link.exe.release"> + <option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="true" id="com.crt.advproject.link.gcc.multicore.master.userobjs.1718464634" name="Slave Objects (not visible)" superClass="com.crt.advproject.link.gcc.multicore.master.userobjs" valueType="userObjs"/> + <option id="com.crt.advproject.link.arch.159478323" name="Architecture" superClass="com.crt.advproject.link.arch" value="com.crt.advproject.link.target.cm3" valueType="enumerated"/> + <option id="com.crt.advproject.link.thumb.1244812174" name="Thumb mode" superClass="com.crt.advproject.link.thumb" value="true" valueType="boolean"/> + <option id="com.crt.advproject.link.script.576834230" name="Linker script" superClass="com.crt.advproject.link.script" value=""Labo4_langton_Release.ld"" valueType="string"/> + <option id="com.crt.advproject.link.manage.1650657076" name="Manage linker script" superClass="com.crt.advproject.link.manage" value="true" valueType="boolean"/> + <option id="gnu.c.link.option.nostdlibs.654698344" name="No startup or default libs (-nostdlib)" superClass="gnu.c.link.option.nostdlibs" value="true" valueType="boolean"/> + <option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="gnu.c.link.option.other.1132050710" name="Other options (-Xlinker [option])" superClass="gnu.c.link.option.other" valueType="stringList"> + <listOptionValue builtIn="false" value="-Map="${BuildArtifactFileBaseName}.map""/> + <listOptionValue builtIn="false" value="--gc-sections"/> + </option> + <option id="com.crt.advproject.link.gcc.hdrlib.192956249" name="Library" superClass="com.crt.advproject.link.gcc.hdrlib" value="com.crt.advproject.gcc.link.hdrlib.codered.none" valueType="enumerated"/> + <option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="gnu.c.link.option.libs.1765968732" name="Libraries (-l)" superClass="gnu.c.link.option.libs" valueType="libs"> + <listOptionValue builtIn="false" value="CMSIS_CORE_LPC17xx"/> + </option> + <option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="gnu.c.link.option.paths.1367035601" name="Library search path (-L)" superClass="gnu.c.link.option.paths" valueType="libPaths"> + <listOptionValue builtIn="false" value=""${workspace_loc:/CMSIS_CORE_LPC17xx/Release}""/> + </option> + <option id="com.crt.advproject.link.crpenable.1792752219" name="Enable Code Read Protection" superClass="com.crt.advproject.link.crpenable" value="true" valueType="boolean"/> + <option id="com.crt.advproject.link.memory.load.image.821269017" superClass="com.crt.advproject.link.memory.load.image" value="" valueType="string"/> + <option id="com.crt.advproject.link.memory.heapAndStack.474272577" superClass="com.crt.advproject.link.memory.heapAndStack" value="&Heap:Default;Post Data;Default&Stack:Default;End;Default" valueType="string"/> + <option id="com.crt.advproject.link.memory.data.823306993" superClass="com.crt.advproject.link.memory.data" value="" valueType="string"/> + <option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="true" id="com.crt.advproject.link.memory.sections.1470075254" superClass="com.crt.advproject.link.memory.sections" valueType="stringList"/> + <inputType id="cdt.managedbuild.tool.gnu.c.linker.input.1616302402" superClass="cdt.managedbuild.tool.gnu.c.linker.input"> + <additionalInput kind="additionalinputdependency" paths="$(USER_OBJS)"/> + <additionalInput kind="additionalinput" paths="$(LIBS)"/> + </inputType> + </tool> + <tool id="com.crt.advproject.tool.debug.release.846881125" name="MCU Debugger" superClass="com.crt.advproject.tool.debug.release"/> + </toolChain> + </folderInfo> + <sourceEntries> + <entry excluding="Labo4.c|Labo_mylab1.c|Labo2_mylab1_correction.c|Labo1.c|Labo1_mylab1_correction.c|Labo1_correction.c" flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="src"/> + </sourceEntries> + </configuration> + </storageModule> + <storageModule moduleId="org.eclipse.cdt.core.externalSettings"/> + </cconfiguration> + </storageModule> + <storageModule moduleId="cdtBuildSystem" version="4.0.0"> + <project id="Labo1.com.crt.advproject.projecttype.exe.1063722119" name="Executable" projectType="com.crt.advproject.projecttype.exe"/> + </storageModule> + <storageModule moduleId="org.eclipse.cdt.core.LanguageSettingsProviders"/> + <storageModule moduleId="com.crt.config"> + <projectStorage><?xml version="1.0" encoding="UTF-8"?> +<TargetConfig> +<Properties property_2="LPC175x_6x_512.cfx" property_3="NXP" property_4="LPC1769" property_count="5" version="100300"/> +<infoList vendor="NXP"> +<info chip="LPC1769" flash_driver="LPC175x_6x_512.cfx" match_id="0x26113F37" name="LPC1769" package="lpc17_lqfp100.xml" stub="crt_emu_cm3_nxp"> +<chip> +<name>LPC1769</name> +<family>LPC17xx</family> +<vendor>NXP (formerly Philips)</vendor> +<reset board="None" core="Real" sys="Real"/> +<clock changeable="TRUE" freq="20MHz" is_accurate="TRUE"/> +<memory can_program="true" id="Flash" is_ro="true" type="Flash"/> +<memory id="RAM" type="RAM"/> +<memory id="Periph" is_volatile="true" type="Peripheral"/> +<memoryInstance derived_from="Flash" id="MFlash512" location="0x00000000" size="0x80000"/> +<memoryInstance derived_from="RAM" id="RamLoc32" location="0x10000000" size="0x8000"/> +<memoryInstance derived_from="RAM" id="RamAHB32" location="0x2007c000" size="0x8000"/> +<prog_flash blocksz="0x1000" location="0" maxprgbuff="0x1000" progwithcode="TRUE" size="0x10000"/> +<prog_flash blocksz="0x8000" location="0x10000" maxprgbuff="0x1000" progwithcode="TRUE" size="0x70000"/> +</chip> +<processor> +<name gcc_name="cortex-m3">Cortex-M3</name> +<family>Cortex-M</family> +</processor> +</info> +</infoList> +</TargetConfig></projectStorage> + </storageModule> + <storageModule moduleId="refreshScope" versionNumber="2"> + <configuration configurationName="Release"> + <resource resourceType="PROJECT" workspacePath="/Labo1"/> + </configuration> + <configuration configurationName="Debug"> + <resource resourceType="PROJECT" workspacePath="/Labo1"/> + </configuration> + </storageModule> + <storageModule moduleId="scannerConfiguration"> + <autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId=""/> + <scannerConfigBuildInfo instanceId="com.crt.advproject.config.exe.debug.1961788077;com.crt.advproject.config.exe.debug.1961788077.;com.crt.advproject.gas.exe.debug.1415986929;com.crt.advproject.assembler.input.968568522"> + <autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId="com.crt.advproject.GCCManagedMakePerProjectProfile"/> + </scannerConfigBuildInfo> + <scannerConfigBuildInfo instanceId="com.crt.advproject.config.exe.debug.1961788077;com.crt.advproject.config.exe.debug.1961788077.;com.crt.advproject.gcc.exe.debug.504230289;com.crt.advproject.compiler.input.2000624862"> + <autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId="com.crt.advproject.GCCManagedMakePerProjectProfile"/> + </scannerConfigBuildInfo> + </storageModule> + <storageModule moduleId="com.crt.advproject"/> +</cproject> diff --git a/TP1_labyrinth_slave_etu/.project b/TP1_labyrinth_slave_etu/.project new file mode 100644 index 0000000000000000000000000000000000000000..9844d91f1132701795b616b6e255299eb548a05b --- /dev/null +++ b/TP1_labyrinth_slave_etu/.project @@ -0,0 +1,27 @@ +<?xml version="1.0" encoding="UTF-8"?> +<projectDescription> + <name>TP1_labyrinth_slave_etu</name> + <comment></comment> + <projects> + <project>CMSISv2p00_LPC17xx</project> + </projects> + <buildSpec> + <buildCommand> + <name>org.eclipse.cdt.managedbuilder.core.genmakebuilder</name> + <triggers>clean,full,incremental,</triggers> + <arguments> + </arguments> + </buildCommand> + <buildCommand> + <name>org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder</name> + <triggers>full,incremental,</triggers> + <arguments> + </arguments> + </buildCommand> + </buildSpec> + <natures> + <nature>org.eclipse.cdt.core.cnature</nature> + <nature>org.eclipse.cdt.managedbuilder.core.managedBuildNature</nature> + <nature>org.eclipse.cdt.managedbuilder.core.ScannerConfigNature</nature> + </natures> +</projectDescription> diff --git a/TP1_labyrinth_slave_etu/.settings/language.settings.xml b/TP1_labyrinth_slave_etu/.settings/language.settings.xml new file mode 100644 index 0000000000000000000000000000000000000000..fbee3d0ea42a6171b3808450e3f2429fcf3236f9 --- /dev/null +++ b/TP1_labyrinth_slave_etu/.settings/language.settings.xml @@ -0,0 +1,25 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<project> + <configuration id="com.crt.advproject.config.exe.debug.1961788077" name="Debug"> + <extension point="org.eclipse.cdt.core.LanguageSettingsProvider"> + <provider copy-of="extension" id="org.eclipse.cdt.ui.UserLanguageSettingsProvider"/> + <provider copy-of="extension" id="com.crt.advproject.GCCBuildCommandParser"/> + <provider class="com.crt.advproject.specs.MCUGCCBuiltinSpecsDetector" console="false" env-hash="1414881416772095426" id="com.crt.advproject.GCCBuildSpecCompilerParser" keep-relative-paths="false" name="MCU GCC Built-in Compiler Parser" parameter="${COMMAND} ${FLAGS} -E -P -v -dD "${INPUTS}"" prefer-non-shared="true"> + <language-scope id="org.eclipse.cdt.core.gcc"/> + <language-scope id="org.eclipse.cdt.core.g++"/> + </provider> + <provider-reference id="org.eclipse.cdt.managedbuilder.core.MBSLanguageSettingsProvider" ref="shared-provider"/> + </extension> + </configuration> + <configuration id="com.crt.advproject.config.exe.release.955237986" name="Release"> + <extension point="org.eclipse.cdt.core.LanguageSettingsProvider"> + <provider copy-of="extension" id="org.eclipse.cdt.ui.UserLanguageSettingsProvider"/> + <provider copy-of="extension" id="com.crt.advproject.GCCBuildCommandParser"/> + <provider class="com.crt.advproject.specs.MCUGCCBuiltinSpecsDetector" console="false" env-hash="1461310508609114466" id="com.crt.advproject.GCCBuildSpecCompilerParser" keep-relative-paths="false" name="MCU GCC Built-in Compiler Parser" parameter="${COMMAND} ${FLAGS} -E -P -v -dD "${INPUTS}"" prefer-non-shared="true"> + <language-scope id="org.eclipse.cdt.core.gcc"/> + <language-scope id="org.eclipse.cdt.core.g++"/> + </provider> + <provider-reference id="org.eclipse.cdt.managedbuilder.core.MBSLanguageSettingsProvider" ref="shared-provider"/> + </extension> + </configuration> +</project> \ No newline at end of file diff --git a/TP1_labyrinth_slave_etu/.settings/org.eclipse.core.resources.prefs b/TP1_labyrinth_slave_etu/.settings/org.eclipse.core.resources.prefs new file mode 100644 index 0000000000000000000000000000000000000000..99f26c0203a7844de00dbfc56e6a35d8ed3c022c --- /dev/null +++ b/TP1_labyrinth_slave_etu/.settings/org.eclipse.core.resources.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +encoding/<project>=UTF-8 diff --git a/TP1_labyrinth_slave_etu/Debug/Labo4_langton_Debug.ld b/TP1_labyrinth_slave_etu/Debug/Labo4_langton_Debug.ld new file mode 100644 index 0000000000000000000000000000000000000000..65f700f3a6b8ed6c8ed64eff57f9450f73ccd9cb --- /dev/null +++ b/TP1_labyrinth_slave_etu/Debug/Labo4_langton_Debug.ld @@ -0,0 +1,158 @@ +/* + * GENERATED FILE - DO NOT EDIT + * (c) Code Red Technologies Ltd, 2008-2013 + * (c) NXP Semiconductors 2013-2018 + * Generated linker script file for LPC1769 + * Created from linkscript.ldt by FMCreateLinkLibraries + * Using Freemarker v2.3.23 + * LPCXpresso v8.2.2 [Build 650] [2016-09-09] on 11 juin 2018 18:05:16 + */ + +INCLUDE "Labo4_langton_Debug_library.ld" +INCLUDE "Labo4_langton_Debug_memory.ld" + +ENTRY(ResetISR) + +SECTIONS +{ + /* MAIN TEXT SECTION */ + .text : ALIGN(4) + { + FILL(0xff) + __vectors_start__ = ABSOLUTE(.) ; + KEEP(*(.isr_vector)) + /* Global Section Table */ + . = ALIGN(4) ; + __section_table_start = .; + __data_section_table = .; + LONG(LOADADDR(.data)); + LONG( ADDR(.data)); + LONG( SIZEOF(.data)); + LONG(LOADADDR(.data_RAM2)); + LONG( ADDR(.data_RAM2)); + LONG( SIZEOF(.data_RAM2)); + __data_section_table_end = .; + __bss_section_table = .; + LONG( ADDR(.bss)); + LONG( SIZEOF(.bss)); + LONG( ADDR(.bss_RAM2)); + LONG( SIZEOF(.bss_RAM2)); + __bss_section_table_end = .; + __section_table_end = . ; + /* End of Global Section Table */ + + *(.after_vectors*) + + /* Code Read Protection data */ + . = 0x000002FC ; + PROVIDE(__CRP_WORD_START__ = .) ; + KEEP(*(.crp)) + PROVIDE(__CRP_WORD_END__ = .) ; + ASSERT(!(__CRP_WORD_START__ == __CRP_WORD_END__), "Linker CRP Enabled, but no CRP_WORD provided within application"); + /* End of Code Read Protection */ + } >MFlash512 + + .text : ALIGN(4) + { + *(.text*) + *(.rodata .rodata.* .constdata .constdata.*) + . = ALIGN(4); + } > MFlash512 + /* + * for exception handling/unwind - some Newlib functions (in common + * with C++ and STDC++) use this. + */ + .ARM.extab : ALIGN(4) + { + *(.ARM.extab* .gnu.linkonce.armextab.*) + } > MFlash512 + __exidx_start = .; + + .ARM.exidx : ALIGN(4) + { + *(.ARM.exidx* .gnu.linkonce.armexidx.*) + } > MFlash512 + __exidx_end = .; + + _etext = .; + + /* DATA section for RamAHB32 */ + .data_RAM2 : ALIGN(4) + { + FILL(0xff) + PROVIDE(__start_data_RAM2 = .) ; + *(.ramfunc.$RAM2) + *(.ramfunc.$RamAHB32) + *(.data.$RAM2*) + *(.data.$RamAHB32*) + . = ALIGN(4) ; + PROVIDE(__end_data_RAM2 = .) ; + } > RamAHB32 AT>MFlash512 + + /* MAIN DATA SECTION */ + .uninit_RESERVED : ALIGN(4) + { + KEEP(*(.bss.$RESERVED*)) + . = ALIGN(4) ; + _end_uninit_RESERVED = .; + } > RamLoc32 + /* Main DATA section (RamLoc32) */ + .data : ALIGN(4) + { + FILL(0xff) + _data = . ; + *(vtable) + *(.ramfunc*) + *(.data*) + . = ALIGN(4) ; + _edata = . ; + } > RamLoc32 AT>MFlash512 + /* BSS section for RamAHB32 */ + .bss_RAM2 : ALIGN(4) + { + PROVIDE(__start_bss_RAM2 = .) ; + *(.bss.$RAM2*) + *(.bss.$RamAHB32*) + . = ALIGN (. != 0 ? 4 : 1) ; /* avoid empty segment */ + PROVIDE(__end_bss_RAM2 = .) ; + } > RamAHB32 + /* MAIN BSS SECTION */ + .bss : ALIGN(4) + { + _bss = .; + *(.bss*) + *(COMMON) + . = ALIGN(4) ; + _ebss = .; + PROVIDE(end = .); + } > RamLoc32 + /* NOINIT section for RamAHB32 */ + .noinit_RAM2 (NOLOAD) : ALIGN(4) + { + *(.noinit.$RAM2*) + *(.noinit.$RamAHB32*) + . = ALIGN(4) ; + } > RamAHB32 + /* DEFAULT NOINIT SECTION */ + .noinit (NOLOAD): ALIGN(4) + { + _noinit = .; + *(.noinit*) + . = ALIGN(4) ; + _end_noinit = .; + } > RamLoc32 + + PROVIDE(_pvHeapStart = DEFINED(__user_heap_base) ? __user_heap_base : .); + PROVIDE(_vStackTop = DEFINED(__user_stack_top) ? __user_stack_top : __top_RamLoc32 - 0); + + /* ## Create checksum value (used in startup) ## */ + PROVIDE(__valid_user_code_checksum = 0 - + (_vStackTop + + (ResetISR + 1) + + (NMI_Handler + 1) + + (HardFault_Handler + 1) + + (( DEFINED(MemManage_Handler) ? MemManage_Handler : 0 ) + 1) /* MemManage_Handler may not be defined */ + + (( DEFINED(BusFault_Handler) ? BusFault_Handler : 0 ) + 1) /* BusFault_Handler may not be defined */ + + (( DEFINED(UsageFault_Handler) ? UsageFault_Handler : 0 ) + 1) /* UsageFault_Handler may not be defined */ + ) ); +} \ No newline at end of file diff --git a/TP1_labyrinth_slave_etu/Debug/Labo4_langton_Debug_library.ld b/TP1_labyrinth_slave_etu/Debug/Labo4_langton_Debug_library.ld new file mode 100644 index 0000000000000000000000000000000000000000..1b030c76e98f0fa2da08c0b0ef044ce7b4a2b1fe --- /dev/null +++ b/TP1_labyrinth_slave_etu/Debug/Labo4_langton_Debug_library.ld @@ -0,0 +1,15 @@ +/* + * GENERATED FILE - DO NOT EDIT + * (c) Code Red Technologies Ltd, 2008-2013 + * (c) NXP Semiconductors 2013-2018 + * Generated linker script file for LPC1769 + * Created from library.ldt by FMCreateLinkLibraries + * Using Freemarker v2.3.23 + * LPCXpresso v8.2.2 [Build 650] [2016-09-09] on 11 juin 2018 18:05:16 + */ + +GROUP ( + libcr_semihost.a + libcr_c.a + libcr_eabihelpers.a +) diff --git a/TP1_labyrinth_slave_etu/Debug/Labo4_langton_Debug_memory.ld b/TP1_labyrinth_slave_etu/Debug/Labo4_langton_Debug_memory.ld new file mode 100644 index 0000000000000000000000000000000000000000..4de804ee87ead828a7e782c06672fdc06c41c414 --- /dev/null +++ b/TP1_labyrinth_slave_etu/Debug/Labo4_langton_Debug_memory.ld @@ -0,0 +1,31 @@ +/* + * GENERATED FILE - DO NOT EDIT + * (c) Code Red Technologies Ltd, 2008-2013 + * (c) NXP Semiconductors 2013-2018 + * Generated linker script file for LPC1769 + * Created from memory.ldt by FMCreateLinkMemory + * Using Freemarker v2.3.23 + * LPCXpresso v8.2.2 [Build 650] [2016-09-09] on 11 juin 2018 18:05:16 + */ + +MEMORY +{ + /* Define each memory region */ + MFlash512 (rx) : ORIGIN = 0x0, LENGTH = 0x80000 /* 512K bytes (alias Flash) */ + RamLoc32 (rwx) : ORIGIN = 0x10000000, LENGTH = 0x8000 /* 32K bytes (alias RAM) */ + RamAHB32 (rwx) : ORIGIN = 0x2007c000, LENGTH = 0x8000 /* 32K bytes (alias RAM2) */ +} + + /* Define a symbol for the top of each memory region */ + __base_MFlash512 = 0x0 ; /* MFlash512 */ + __base_Flash = 0x0 ; /* Flash */ + __top_MFlash512 = 0x0 + 0x80000 ; /* 512K bytes */ + __top_Flash = 0x0 + 0x80000 ; /* 512K bytes */ + __base_RamLoc32 = 0x10000000 ; /* RamLoc32 */ + __base_RAM = 0x10000000 ; /* RAM */ + __top_RamLoc32 = 0x10000000 + 0x8000 ; /* 32K bytes */ + __top_RAM = 0x10000000 + 0x8000 ; /* 32K bytes */ + __base_RamAHB32 = 0x2007c000 ; /* RamAHB32 */ + __base_RAM2 = 0x2007c000 ; /* RAM2 */ + __top_RamAHB32 = 0x2007c000 + 0x8000 ; /* 32K bytes */ + __top_RAM2 = 0x2007c000 + 0x8000 ; /* 32K bytes */ diff --git a/TP1_labyrinth_slave_etu/Debug/TP1_labyrinth_slave.map b/TP1_labyrinth_slave_etu/Debug/TP1_labyrinth_slave.map new file mode 100644 index 0000000000000000000000000000000000000000..abdc8f883dd513da8f92c3226b384bc9e2a5f7d4 --- /dev/null +++ b/TP1_labyrinth_slave_etu/Debug/TP1_labyrinth_slave.map @@ -0,0 +1,1719 @@ +Archive member included to satisfy reference by file (symbol) + +C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(accelerometer.o) + ./src/labyrinth_slave.o (accel_init) +C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(ethernet_mgt.o) + ./src/labyrinth_slave.o (ethernet_init) +C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(ethmac.o) + C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(ethernet_mgt.o) (Init_EthMAC) +C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(lcd.o) + ./src/labyrinth_slave.o (init_lcd) +C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(ssp.o) + C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(lcd.o) (ssp_init_custom) +C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(I2C.o) + C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(accelerometer.o) (init_i2c) +C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(fonts.o) + C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(lcd.o) (SmallFont) +C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\CMSISv2p00_LPC17xx\Debug\libCMSISv2p00_LPC17xx.a(system_LPC17xx.o) + ./src/cr_startup_lpc175x_6x.o (SystemInit) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(_cr__main.o) + ./src/cr_startup_lpc175x_6x.o (__main) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(memcpy.o) + C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(ethernet_mgt.o) (memcpy) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(memset.o) + ./src/labyrinth_slave.o (memset) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(alloc.o) + C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(lcd.o) (malloc) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(ceil.o) + ./src/tools.o (ceil) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fclose.o) + C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(lcd.o) (fclose) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fflush.o) + c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fclose.o) (fflush) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(floor.o) + ./src/tools.o (floor) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fopen.o) + C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(lcd.o) (fopen) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fpprintf.o) + C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(lcd.o) (vsprintf) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fread.o) + C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(lcd.o) (fread) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(freopen.o) + c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fopen.o) (freopen) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fseek.o) + C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(lcd.o) (fseek) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(ftell.o) + c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fseek.o) (ftell) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(initio.o) + c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(_cr__main.o) (_initio) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(printf.o) + c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fpprintf.o) (__vfprintf) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(remove.o) + c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fclose.o) (remove) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(setvbuf.o) + c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(initio.o) (setvbuf) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(sqrt.o) + C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(lcd.o) (sqrt) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(stdio.o) + c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fflush.o) (__Ciob) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(stdlib.o) + C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(lcd.o) (exit) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(strlen.o) + C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(lcd.o) (strlen) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(__fillbuf.o) + c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(stdio.o) (__filbuf) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(__init_alloc.o) + c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(alloc.o) (__heaps) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_cr_sbrk.o) + c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(alloc.o) (_sbrk) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_deferredlazyseek.o) + c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(__fillbuf.o) (_deferredlazyseek) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_do_fflush.o) + c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fflush.o) (_do_fflush) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_fdopen.o) + c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(initio.o) (_fdopen) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_fflush.o) + c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(__fillbuf.o) (_fflush) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_frexpl.o) + c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fpprintf.o) (_frexpl) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_hugeval.o) + c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(sqrt.o) (__huge_val) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_ldexpl.o) + c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fpprintf.o) (_ldexpl) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_read.o) + c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fread.o) (_Cread) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_writebuf.o) + c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_deferredlazyseek.o) (_Cwritebuf) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(errno.o) + c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(ftell.o) (errno) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(raise.o) + c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(stdlib.o) (raise) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_cr_check_heap.o) + c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_cr_sbrk.o) (__check_heap_overflow) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(division_64.o) + C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\CMSISv2p00_LPC17xx\Debug\libCMSISv2p00_LPC17xx.a(system_LPC17xx.o) (__aeabi_uldivmod) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(division_idiv0.o) + c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(division_64.o) (__aeabi_idiv0) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(double.o) + c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fpprintf.o) (__aeabi_dmul) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(float.o) + ./src/tools.o (__aeabi_fmul) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(memcpy.o) + c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(memcpy.o) (__aeabi_memcpy) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_appexit.o) + c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(alloc.o) (__sys_appexit) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_close.o) + c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fclose.o) (__sys_close) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_flen.o) + c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fseek.o) (__sys_flen) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_istty.o) + c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fseek.o) (__sys_istty) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_open.o) + c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(freopen.o) (__sys_open) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_read.o) + c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(__fillbuf.o) (__sys_read) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_readc.o) + c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(__fillbuf.o) (__sys_readc) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_remove.o) + c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(remove.o) (__sys_remove) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_rename.o) + c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(remove.o) (__sys_rename) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_seek.o) + c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(__fillbuf.o) (__sys_seek) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_tmpnam.o) + c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fclose.o) (__sys_tmpnam) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_write.o) + c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(alloc.o) (__sys_write) + +Allocating common symbols +Common symbol size file + +last_ball_coord 0x28 ./src/labyrinth_slave.o +master_tx 0x50 ./src/labyrinth_slave.o + +Discarded input sections + + .group 0x00000000 0x8 ./src/cr_startup_lpc175x_6x.o + .text 0x00000000 0x0 ./src/cr_startup_lpc175x_6x.o + .data 0x00000000 0x0 ./src/cr_startup_lpc175x_6x.o + .bss 0x00000000 0x0 ./src/cr_startup_lpc175x_6x.o + .group 0x00000000 0x8 ./src/crp.o + .group 0x00000000 0x8 ./src/crp.o + .text 0x00000000 0x0 ./src/crp.o + .data 0x00000000 0x0 ./src/crp.o + .bss 0x00000000 0x0 ./src/crp.o + .debug_macro 0x00000000 0x892 ./src/crp.o + .group 0x00000000 0x8 ./src/labyrinth_slave.o + .group 0x00000000 0x8 ./src/labyrinth_slave.o + .group 0x00000000 0x8 ./src/labyrinth_slave.o + .group 0x00000000 0x8 ./src/labyrinth_slave.o + .group 0x00000000 0x8 ./src/labyrinth_slave.o + .group 0x00000000 0x8 ./src/labyrinth_slave.o + .group 0x00000000 0x8 ./src/labyrinth_slave.o + .group 0x00000000 0x8 ./src/labyrinth_slave.o + .group 0x00000000 0x8 ./src/labyrinth_slave.o + .group 0x00000000 0x8 ./src/labyrinth_slave.o + .group 0x00000000 0x8 ./src/labyrinth_slave.o + .group 0x00000000 0x8 ./src/labyrinth_slave.o + .group 0x00000000 0x8 ./src/labyrinth_slave.o + .group 0x00000000 0x8 ./src/labyrinth_slave.o + .group 0x00000000 0x8 ./src/labyrinth_slave.o + .group 0x00000000 0x8 ./src/labyrinth_slave.o + .group 0x00000000 0x8 ./src/labyrinth_slave.o + .group 0x00000000 0x8 ./src/labyrinth_slave.o + .text 0x00000000 0x0 ./src/labyrinth_slave.o + .data 0x00000000 0x0 ./src/labyrinth_slave.o + .bss 0x00000000 0x0 ./src/labyrinth_slave.o + .bss.winner 0x00000000 0x1 ./src/labyrinth_slave.o + .debug_macro 0x00000000 0x892 ./src/labyrinth_slave.o + .group 0x00000000 0x8 ./src/timer.o + .group 0x00000000 0x8 ./src/timer.o + .group 0x00000000 0x8 ./src/timer.o + .group 0x00000000 0x8 ./src/timer.o + .group 0x00000000 0x8 ./src/timer.o + .group 0x00000000 0x8 ./src/timer.o + .group 0x00000000 0x8 ./src/timer.o + .group 0x00000000 0x8 ./src/timer.o + .group 0x00000000 0x8 ./src/timer.o + .group 0x00000000 0x8 ./src/timer.o + .text 0x00000000 0x0 ./src/timer.o + .data 0x00000000 0x0 ./src/timer.o + .bss 0x00000000 0x0 ./src/timer.o + .text.delay_ms + 0x00000000 0x48 ./src/timer.o + .debug_macro 0x00000000 0x892 ./src/timer.o + .debug_macro 0x00000000 0x10 ./src/timer.o + .debug_macro 0x00000000 0x12d ./src/timer.o + .debug_macro 0x00000000 0x1c ./src/timer.o + .debug_macro 0x00000000 0x2e ./src/timer.o + .debug_macro 0x00000000 0x5b2 ./src/timer.o + .debug_macro 0x00000000 0x18 ./src/timer.o + .debug_macro 0x00000000 0x7af ./src/timer.o + .debug_macro 0x00000000 0x2c7 ./src/timer.o + .group 0x00000000 0x8 ./src/tools.o + .group 0x00000000 0x8 ./src/tools.o + .group 0x00000000 0x8 ./src/tools.o + .group 0x00000000 0x8 ./src/tools.o + .group 0x00000000 0x8 ./src/tools.o + .group 0x00000000 0x8 ./src/tools.o + .group 0x00000000 0x8 ./src/tools.o + .group 0x00000000 0x8 ./src/tools.o + .group 0x00000000 0x8 ./src/tools.o + .group 0x00000000 0x8 ./src/tools.o + .group 0x00000000 0x8 ./src/tools.o + .group 0x00000000 0x8 ./src/tools.o + .group 0x00000000 0x8 ./src/tools.o + .group 0x00000000 0x8 ./src/tools.o + .group 0x00000000 0x8 ./src/tools.o + .group 0x00000000 0x8 ./src/tools.o + .text 0x00000000 0x0 ./src/tools.o + .data 0x00000000 0x0 ./src/tools.o + .bss 0x00000000 0x0 ./src/tools.o + .text.round 0x00000000 0x78 ./src/tools.o + .text.test_collision + 0x00000000 0x450 ./src/tools.o + .debug_macro 0x00000000 0x892 ./src/tools.o + .debug_macro 0x00000000 0x10 ./src/tools.o + .debug_macro 0x00000000 0x12d ./src/tools.o + .debug_macro 0x00000000 0x5b2 ./src/tools.o + .debug_macro 0x00000000 0x1c ./src/tools.o + .debug_macro 0x00000000 0x2e ./src/tools.o + .debug_macro 0x00000000 0x18 ./src/tools.o + .debug_macro 0x00000000 0x7af ./src/tools.o + .debug_macro 0x00000000 0x2c7 ./src/tools.o + .debug_macro 0x00000000 0x1c ./src/tools.o + .debug_macro 0x00000000 0x22 ./src/tools.o + .debug_macro 0x00000000 0x28 ./src/tools.o + .debug_macro 0x00000000 0x1c ./src/tools.o + .debug_macro 0x00000000 0xc2 ./src/tools.o + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(accelerometer.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(accelerometer.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(accelerometer.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(accelerometer.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(accelerometer.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(accelerometer.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(accelerometer.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(accelerometer.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(accelerometer.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(accelerometer.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(accelerometer.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(accelerometer.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(accelerometer.o) + .text 0x00000000 0x0 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(accelerometer.o) + .data 0x00000000 0x0 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(accelerometer.o) + .bss 0x00000000 0x0 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(accelerometer.o) + .debug_macro 0x00000000 0x10 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(accelerometer.o) + .debug_macro 0x00000000 0x12d C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(accelerometer.o) + .debug_macro 0x00000000 0x28 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(accelerometer.o) + .debug_macro 0x00000000 0x1c C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(accelerometer.o) + .debug_macro 0x00000000 0x2e C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(accelerometer.o) + .debug_macro 0x00000000 0x5b2 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(accelerometer.o) + .debug_macro 0x00000000 0x18 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(accelerometer.o) + .debug_macro 0x00000000 0x7af C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(accelerometer.o) + .debug_macro 0x00000000 0x2c7 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(accelerometer.o) + .debug_macro 0x00000000 0xd6 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(accelerometer.o) + .debug_macro 0x00000000 0x22 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(accelerometer.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(ethernet_mgt.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(ethernet_mgt.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(ethernet_mgt.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(ethernet_mgt.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(ethernet_mgt.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(ethernet_mgt.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(ethernet_mgt.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(ethernet_mgt.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(ethernet_mgt.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(ethernet_mgt.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(ethernet_mgt.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(ethernet_mgt.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(ethernet_mgt.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(ethernet_mgt.o) + .text 0x00000000 0x0 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(ethernet_mgt.o) + .data 0x00000000 0x0 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(ethernet_mgt.o) + .bss 0x00000000 0x0 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(ethernet_mgt.o) + .text.rec_eth 0x00000000 0x40 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(ethernet_mgt.o) + .debug_macro 0x00000000 0x898 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(ethernet_mgt.o) + .debug_macro 0x00000000 0x10 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(ethernet_mgt.o) + .debug_macro 0x00000000 0x12d C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(ethernet_mgt.o) + .debug_macro 0x00000000 0x28 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(ethernet_mgt.o) + .debug_macro 0x00000000 0x82 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(ethernet_mgt.o) + .debug_macro 0x00000000 0x1c C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(ethernet_mgt.o) + .debug_macro 0x00000000 0x2e C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(ethernet_mgt.o) + .debug_macro 0x00000000 0x5b2 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(ethernet_mgt.o) + .debug_macro 0x00000000 0x18 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(ethernet_mgt.o) + .debug_macro 0x00000000 0x7af C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(ethernet_mgt.o) + .debug_macro 0x00000000 0x2c7 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(ethernet_mgt.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(ethmac.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(ethmac.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(ethmac.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(ethmac.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(ethmac.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(ethmac.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(ethmac.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(ethmac.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(ethmac.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(ethmac.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(ethmac.o) + .text 0x00000000 0x0 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(ethmac.o) + .data 0x00000000 0x0 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(ethmac.o) + .bss 0x00000000 0x0 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(ethmac.o) + .text.ethernet_power_down + 0x00000000 0xcc C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(ethmac.o) + .text.CheckIfFrameReceived + 0x00000000 0x28 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(ethmac.o) + .debug_macro 0x00000000 0x898 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(ethmac.o) + .debug_macro 0x00000000 0x10 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(ethmac.o) + .debug_macro 0x00000000 0x12d C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(ethmac.o) + .debug_macro 0x00000000 0xa0 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(ethmac.o) + .debug_macro 0x00000000 0x5c3 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(ethmac.o) + .debug_macro 0x00000000 0x1c C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(ethmac.o) + .debug_macro 0x00000000 0x2e C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(ethmac.o) + .debug_macro 0x00000000 0x5b2 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(ethmac.o) + .debug_macro 0x00000000 0x18 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(ethmac.o) + .debug_macro 0x00000000 0x7af C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(ethmac.o) + .debug_macro 0x00000000 0x2c7 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(ethmac.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(lcd.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(lcd.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(lcd.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(lcd.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(lcd.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(lcd.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(lcd.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(lcd.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(lcd.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(lcd.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(lcd.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(lcd.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(lcd.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(lcd.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(lcd.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(lcd.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(lcd.o) + .text 0x00000000 0x0 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(lcd.o) + .data 0x00000000 0x0 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(lcd.o) + .bss 0x00000000 0x0 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(lcd.o) + .text.LCD_SetPosR + 0x00000000 0x90 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(lcd.o) + .text.read_pixels + 0x00000000 0xf8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(lcd.o) + .text.read_cmd + 0x00000000 0x64 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(lcd.o) + .text.setup_scroll + 0x00000000 0x68 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(lcd.o) + .text.lcd_scroll + 0x00000000 0x60 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(lcd.o) + .text.lcd_set_fenetre_pixel + 0x00000000 0x24 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(lcd.o) + .text.Ecran_Croix + 0x00000000 0x78 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(lcd.o) + .text.lcd_lineH + 0x00000000 0x64 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(lcd.o) + .text.lcd_lineV + 0x00000000 0x60 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(lcd.o) + .text.lcd_line + 0x00000000 0x158 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(lcd.o) + .text.lcd_circle + 0x00000000 0x1ac C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(lcd.o) + .text.lcd_filled_circle_on_square + 0x00000000 0xcc C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(lcd.o) + .text.lcd_empty_rectangle + 0x00000000 0x80 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(lcd.o) + .text.lcd_printf + 0x00000000 0x254 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(lcd.o) + .text.read_bmp_file + 0x00000000 0x1d0 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(lcd.o) + .text.display_bitmap16 + 0x00000000 0x70 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(lcd.o) + .bss.is_scroll_setup.5886 + 0x00000000 0x1 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(lcd.o) + .bss.x.5883 0x00000000 0x4 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(lcd.o) + .data.offset.5885 + 0x00000000 0x4 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(lcd.o) + .data.y.5884 0x00000000 0x4 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(lcd.o) + .debug_macro 0x00000000 0x898 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(lcd.o) + .debug_macro 0x00000000 0x10 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(lcd.o) + .debug_macro 0x00000000 0x12d C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(lcd.o) + .debug_macro 0x00000000 0x9a C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(lcd.o) + .debug_macro 0x00000000 0x1c C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(lcd.o) + .debug_macro 0x00000000 0x2e C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(lcd.o) + .debug_macro 0x00000000 0x5b2 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(lcd.o) + .debug_macro 0x00000000 0x18 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(lcd.o) + .debug_macro 0x00000000 0x7af C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(lcd.o) + .debug_macro 0x00000000 0x2c7 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(lcd.o) + .debug_macro 0x00000000 0x1c C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(lcd.o) + .debug_macro 0x00000000 0x22 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(lcd.o) + .debug_macro 0x00000000 0x28 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(lcd.o) + .debug_macro 0x00000000 0x1c C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(lcd.o) + .debug_macro 0x00000000 0xc2 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(lcd.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(ssp.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(ssp.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(ssp.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(ssp.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(ssp.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(ssp.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(ssp.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(ssp.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(ssp.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(ssp.o) + .text 0x00000000 0x0 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(ssp.o) + .data 0x00000000 0x0 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(ssp.o) + .bss 0x00000000 0x0 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(ssp.o) + .text.ssp_receive_buf + 0x00000000 0x70 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(ssp.o) + .debug_macro 0x00000000 0x898 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(ssp.o) + .debug_macro 0x00000000 0x1c C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(ssp.o) + .debug_macro 0x00000000 0x2e C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(ssp.o) + .debug_macro 0x00000000 0x10 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(ssp.o) + .debug_macro 0x00000000 0x12d C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(ssp.o) + .debug_macro 0x00000000 0x5b2 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(ssp.o) + .debug_macro 0x00000000 0x18 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(ssp.o) + .debug_macro 0x00000000 0x7af C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(ssp.o) + .debug_macro 0x00000000 0x2c7 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(ssp.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(I2C.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(I2C.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(I2C.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(I2C.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(I2C.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(I2C.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(I2C.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(I2C.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(I2C.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(I2C.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(I2C.o) + .text 0x00000000 0x0 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(I2C.o) + .data 0x00000000 0x0 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(I2C.o) + .bss 0x00000000 0x0 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(I2C.o) + .text.I2C_slave_read + 0x00000000 0x1c8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(I2C.o) + .text.I2C_slave_write + 0x00000000 0x168 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(I2C.o) + .debug_macro 0x00000000 0x898 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(I2C.o) + .debug_macro 0x00000000 0x1c C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(I2C.o) + .debug_macro 0x00000000 0x2e C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(I2C.o) + .debug_macro 0x00000000 0x10 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(I2C.o) + .debug_macro 0x00000000 0x12d C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(I2C.o) + .debug_macro 0x00000000 0x5b2 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(I2C.o) + .debug_macro 0x00000000 0x18 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(I2C.o) + .debug_macro 0x00000000 0x7af C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(I2C.o) + .debug_macro 0x00000000 0x2c7 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(I2C.o) + .debug_macro 0x00000000 0x22 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(I2C.o) + .debug_macro 0x00000000 0x52 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(I2C.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(fonts.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(fonts.o) + .text 0x00000000 0x0 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(fonts.o) + .data 0x00000000 0x0 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(fonts.o) + .bss 0x00000000 0x0 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(fonts.o) + .rodata.SevenSegNumFont + 0x00000000 0x7d4 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(fonts.o) + .debug_macro 0x00000000 0x898 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(fonts.o) + .debug_macro 0x00000000 0x1c C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(fonts.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\CMSISv2p00_LPC17xx\Debug\libCMSISv2p00_LPC17xx.a(system_LPC17xx.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\CMSISv2p00_LPC17xx\Debug\libCMSISv2p00_LPC17xx.a(system_LPC17xx.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\CMSISv2p00_LPC17xx\Debug\libCMSISv2p00_LPC17xx.a(system_LPC17xx.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\CMSISv2p00_LPC17xx\Debug\libCMSISv2p00_LPC17xx.a(system_LPC17xx.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\CMSISv2p00_LPC17xx\Debug\libCMSISv2p00_LPC17xx.a(system_LPC17xx.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\CMSISv2p00_LPC17xx\Debug\libCMSISv2p00_LPC17xx.a(system_LPC17xx.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\CMSISv2p00_LPC17xx\Debug\libCMSISv2p00_LPC17xx.a(system_LPC17xx.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\CMSISv2p00_LPC17xx\Debug\libCMSISv2p00_LPC17xx.a(system_LPC17xx.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\CMSISv2p00_LPC17xx\Debug\libCMSISv2p00_LPC17xx.a(system_LPC17xx.o) + .text 0x00000000 0x0 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\CMSISv2p00_LPC17xx\Debug\libCMSISv2p00_LPC17xx.a(system_LPC17xx.o) + .data 0x00000000 0x0 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\CMSISv2p00_LPC17xx\Debug\libCMSISv2p00_LPC17xx.a(system_LPC17xx.o) + .bss 0x00000000 0x0 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\CMSISv2p00_LPC17xx\Debug\libCMSISv2p00_LPC17xx.a(system_LPC17xx.o) + .text.SystemCoreClockUpdate + 0x00000000 0xb4 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\CMSISv2p00_LPC17xx\Debug\libCMSISv2p00_LPC17xx.a(system_LPC17xx.o) + .data.SystemCoreClock + 0x00000000 0x4 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\CMSISv2p00_LPC17xx\Debug\libCMSISv2p00_LPC17xx.a(system_LPC17xx.o) + .debug_macro 0x00000000 0x10 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\CMSISv2p00_LPC17xx\Debug\libCMSISv2p00_LPC17xx.a(system_LPC17xx.o) + .debug_macro 0x00000000 0x12d C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\CMSISv2p00_LPC17xx\Debug\libCMSISv2p00_LPC17xx.a(system_LPC17xx.o) + .debug_macro 0x00000000 0x5b2 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\CMSISv2p00_LPC17xx\Debug\libCMSISv2p00_LPC17xx.a(system_LPC17xx.o) + .debug_macro 0x00000000 0x1c C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\CMSISv2p00_LPC17xx\Debug\libCMSISv2p00_LPC17xx.a(system_LPC17xx.o) + .debug_macro 0x00000000 0x2e C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\CMSISv2p00_LPC17xx\Debug\libCMSISv2p00_LPC17xx.a(system_LPC17xx.o) + .debug_macro 0x00000000 0x18 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\CMSISv2p00_LPC17xx\Debug\libCMSISv2p00_LPC17xx.a(system_LPC17xx.o) + .debug_macro 0x00000000 0x7af C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\CMSISv2p00_LPC17xx\Debug\libCMSISv2p00_LPC17xx.a(system_LPC17xx.o) + .debug_macro 0x00000000 0x2c7 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\CMSISv2p00_LPC17xx\Debug\libCMSISv2p00_LPC17xx.a(system_LPC17xx.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(_cr__main.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(_cr__main.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(_cr__main.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(memcpy.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(memcpy.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(memcpy.o) + .text.memcpy 0x00000000 0x4 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(memcpy.o) + .comment 0x00000000 0x6f c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(memcpy.o) + .ARM.attributes + 0x00000000 0x33 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(memcpy.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(memset.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(memset.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(memset.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(alloc.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(alloc.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(alloc.o) + .text.calloc 0x00000000 0x50 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(alloc.o) + .text.realloc 0x00000000 0x24 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(alloc.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(ceil.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(ceil.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(ceil.o) + .text.ceil 0x00000000 0x90 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(ceil.o) + .comment 0x00000000 0x6f c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(ceil.o) + .ARM.attributes + 0x00000000 0x33 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(ceil.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fclose.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fclose.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fclose.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fflush.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fflush.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fflush.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(floor.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(floor.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(floor.o) + .text.floor 0x00000000 0x94 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(floor.o) + .comment 0x00000000 0x6f c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(floor.o) + .ARM.attributes + 0x00000000 0x33 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(floor.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fopen.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fopen.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fopen.o) + .text.fopen 0x00000000 0x28 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fopen.o) + .comment 0x00000000 0x6f c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fopen.o) + .ARM.attributes + 0x00000000 0x33 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fopen.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fpprintf.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fpprintf.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fpprintf.o) + .text.fprintf 0x00000000 0x30 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fpprintf.o) + .text.printf_char + 0x00000000 0x34 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fpprintf.o) + .text.snprintf + 0x00000000 0x68 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fpprintf.o) + .text.vfprintf + 0x00000000 0x1c c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fpprintf.o) + .text.vprintf 0x00000000 0x24 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fpprintf.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fread.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fread.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fread.o) + .text.fread 0x00000000 0x1a c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fread.o) + .comment 0x00000000 0x6f c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fread.o) + .ARM.attributes + 0x00000000 0x33 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fread.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(freopen.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(freopen.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(freopen.o) + .text.freopen 0x00000000 0x88 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(freopen.o) + .comment 0x00000000 0x6f c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(freopen.o) + .ARM.attributes + 0x00000000 0x33 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(freopen.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fseek.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fseek.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fseek.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(ftell.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(ftell.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(ftell.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(initio.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(initio.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(initio.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(printf.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(printf.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(printf.o) + .text.no_fp_display + 0x00000000 0x4 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(printf.o) + .text._fprintf + 0x00000000 0x30 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(printf.o) + .text._printf_char + 0x00000000 0x34 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(printf.o) + .text._sprintf + 0x00000000 0x6c c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(printf.o) + .text._snprintf + 0x00000000 0x68 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(printf.o) + .text._vfprintf + 0x00000000 0x20 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(printf.o) + .text._vprintf + 0x00000000 0x24 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(printf.o) + .text._vsprintf + 0x00000000 0x5c c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(printf.o) + .text._vsnprintf + 0x00000000 0x5c c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(printf.o) + .text._printf 0x00000000 0x54 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(printf.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(remove.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(remove.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(remove.o) + .text.rename 0x00000000 0x28 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(remove.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(setvbuf.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(setvbuf.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(setvbuf.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(sqrt.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(sqrt.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(sqrt.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(stdio.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(stdio.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(stdio.o) + .text.getc 0x00000000 0x18 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(stdio.o) + .text.fgetc 0x00000000 0x4 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(stdio.o) + .text.getchar 0x00000000 0x20 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(stdio.o) + .text.putc 0x00000000 0x24 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(stdio.o) + .text.fputc 0x00000000 0x4 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(stdio.o) + .text.putchar 0x00000000 0x24 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(stdio.o) + .text.feof 0x00000000 0x8 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(stdio.o) + .text.ferror 0x00000000 0x8 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(stdio.o) + .text.clearerr + 0x00000000 0xe c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(stdio.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(stdlib.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(stdlib.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(stdlib.o) + .text.__rand 0x00000000 0x20 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(stdlib.o) + .text.__srand 0x00000000 0xc c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(stdlib.o) + .text.rand 0x00000000 0x3c c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(stdlib.o) + .text.srand 0x00000000 0x40 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(stdlib.o) + .text._exit_init + 0x00000000 0xc c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(stdlib.o) + .text.atexit 0x00000000 0x24 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(stdlib.o) + .text.abort 0x00000000 0x12 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(stdlib.o) + .text.abs 0x00000000 0x8 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(stdlib.o) + .text.labs 0x00000000 0x8 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(stdlib.o) + .text.div 0x00000000 0x10 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(stdlib.o) + .text.ldiv 0x00000000 0x10 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(stdlib.o) + .data.next 0x00000000 0x4 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(stdlib.o) + .data._random_number_seed + 0x00000000 0xdc c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(stdlib.o) + .data._random_j + 0x00000000 0x4 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(stdlib.o) + .data._random_k + 0x00000000 0x4 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(stdlib.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(strlen.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(strlen.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(strlen.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(__fillbuf.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(__fillbuf.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(__fillbuf.o) + .text._Csys_read_ + 0x00000000 0x22 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(__fillbuf.o) + .text.__filbuf + 0x00000000 0x178 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(__fillbuf.o) + .text._fillb2 0x00000000 0x1c c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(__fillbuf.o) + .comment 0x00000000 0x6f c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(__fillbuf.o) + .ARM.attributes + 0x00000000 0x33 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(__fillbuf.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(__init_alloc.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(__init_alloc.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(__init_alloc.o) + .text._init_alloc + 0x00000000 0x14 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(__init_alloc.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_cr_sbrk.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_cr_sbrk.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_cr_sbrk.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_deferredlazyseek.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_deferredlazyseek.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_deferredlazyseek.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_do_fflush.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_do_fflush.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_do_fflush.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_fdopen.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_fdopen.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_fdopen.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_fflush.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_fflush.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_fflush.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_frexpl.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_frexpl.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_frexpl.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_hugeval.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_hugeval.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_hugeval.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_ldexpl.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_ldexpl.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_ldexpl.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_read.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_read.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_read.o) + .text._Cread 0x00000000 0x8c c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_read.o) + .comment 0x00000000 0x6f c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_read.o) + .ARM.attributes + 0x00000000 0x33 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_read.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_writebuf.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_writebuf.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_writebuf.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(errno.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(errno.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(errno.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(raise.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(raise.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(raise.o) + .text.raise 0x00000000 0x6 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(raise.o) + .comment 0x00000000 0x6f c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(raise.o) + .ARM.attributes + 0x00000000 0x33 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(raise.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_cr_check_heap.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_cr_check_heap.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_cr_check_heap.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(division_64.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(division_64.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(division_64.o) + .text.__aeabi_division_ldivmod + 0x00000000 0x26 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(division_64.o) + .text.__aeabi_division_uldivmod + 0x00000000 0x174 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(division_64.o) + .ARM.attributes + 0x00000000 0x21 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(division_64.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(division_idiv0.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(division_idiv0.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(division_idiv0.o) + .text.__aeabi_division_idiv0 + 0x00000000 0x2 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(division_idiv0.o) + .ARM.attributes + 0x00000000 0x21 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(division_idiv0.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(double.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(double.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(double.o) + .text.__aeabi_drsub + 0x00000000 0x1c c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(double.o) + .text.__aeabi_dneg + 0x00000000 0x8 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(double.o) + .text.__aeabi_d2f + 0x00000000 0x54 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(double.o) + .text.__aeabi_d2uiz + 0x00000000 0x30 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(double.o) + .text.__aeabi_d2lz + 0x00000000 0x6a c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(double.o) + .text.__aeabi_d2ulz + 0x00000000 0x54 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(double.o) + .text.__bhs_ul2d + 0x00000000 0x88 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(double.o) + .text.__aeabi_ui2d + 0x00000000 0x8 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(double.o) + .text.__aeabi_l2d + 0x00000000 0x18 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(double.o) + .text.__aeabi_ul2d + 0x00000000 0x8 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(double.o) + .text.__aeabi_dcmpgt + 0x00000000 0x54 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(double.o) + .text.__aeabi_dcmpun + 0x00000000 0x1a c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(double.o) + .text.__aeabi_cdcmple + 0x00000000 0x24 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(double.o) + .text.__aeabi_cdrcmple + 0x00000000 0x14 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(double.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(float.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(float.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(float.o) + .text.__aeabi_fmul + 0x00000000 0xb0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(float.o) + .text.__aeabi_fsub + 0x00000000 0xe0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(float.o) + .text.__aeabi_fadd + 0x00000000 0xac c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(float.o) + .text.__aeabi_frsub + 0x00000000 0xc c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(float.o) + .text.__aeabi_fneg + 0x00000000 0x6 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(float.o) + .text.__aeabi_f2iz + 0x00000000 0x32 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(float.o) + .text.__aeabi_f2uiz + 0x00000000 0x28 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(float.o) + .text.__aeabi_f2lz + 0x00000000 0x5a c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(float.o) + .text.__aeabi_f2ulz + 0x00000000 0x3e c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(float.o) + .text.__bhs_ul2f + 0x00000000 0x46 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(float.o) + .text.__aeabi_ui2f + 0x00000000 0x8 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(float.o) + .text.__aeabi_l2f + 0x00000000 0x18 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(float.o) + .text.__aeabi_ul2f + 0x00000000 0x8 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(float.o) + .text.__aeabi_f2d + 0x00000000 0x38 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(float.o) + .text.__aeabi_fcmpeq + 0x00000000 0x1e c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(float.o) + .text.__aeabi_fcmplt + 0x00000000 0x3a c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(float.o) + .text.__aeabi_fcmpgt + 0x00000000 0x3a c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(float.o) + .text.__aeabi_fcmple + 0x00000000 0x3e c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(float.o) + .text.__aeabi_fcmpge + 0x00000000 0x3e c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(float.o) + .text.__aeabi_fcmpun + 0x00000000 0x1a c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(float.o) + .text.__aeabi_cfcmple + 0x00000000 0x20 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(float.o) + .text.__aeabi_cfrcmple + 0x00000000 0xa c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(float.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(memcpy.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(memcpy.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(memcpy.o) + .text.__aeabi_memcpy + 0x00000000 0x34 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(memcpy.o) + .text.__aeabi_memmove + 0x00000000 0x1c c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(memcpy.o) + .text.__aeabi_memclr + 0x00000000 0x8 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(memcpy.o) + .text.__aeabi_memset + 0x00000000 0xa c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(memcpy.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_appexit.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_appexit.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_appexit.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_close.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_close.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_close.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_flen.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_flen.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_flen.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_istty.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_istty.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_istty.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_open.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_open.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_open.o) + .text.__sys_open + 0x00000000 0xc c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_open.o) + .ARM.attributes + 0x00000000 0x21 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_open.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_read.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_read.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_read.o) + .text.__sys_read + 0x00000000 0xc c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_read.o) + .ARM.attributes + 0x00000000 0x21 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_read.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_readc.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_readc.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_readc.o) + .text.__sys_readc + 0x00000000 0x8 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_readc.o) + .ARM.attributes + 0x00000000 0x21 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_readc.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_remove.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_remove.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_remove.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_rename.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_rename.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_rename.o) + .text.__sys_rename + 0x00000000 0xc c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_rename.o) + .ARM.attributes + 0x00000000 0x21 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_rename.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_seek.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_seek.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_seek.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_tmpnam.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_tmpnam.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_tmpnam.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_write.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_write.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_write.o) + +Memory Configuration + +Name Origin Length Attributes +MFlash512 0x00000000 0x00080000 xr +RamLoc32 0x10000000 0x00008000 xrw +RamAHB32 0x2007c000 0x00008000 xrw +*default* 0x00000000 0xffffffff + +Linker script and memory map + +LOAD ./src/cr_startup_lpc175x_6x.o +LOAD ./src/crp.o +LOAD ./src/labyrinth_slave.o +LOAD ./src/timer.o +LOAD ./src/tools.o +LOAD C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a +LOAD C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\CMSISv2p00_LPC17xx\Debug\libCMSISv2p00_LPC17xx.a +START GROUP +LOAD c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a +LOAD c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a +LOAD c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a +END GROUP + 0x00000000 __base_MFlash512 = 0x0 + 0x00000000 __base_Flash = 0x0 + 0x00080000 __top_MFlash512 = 0x80000 + 0x00080000 __top_Flash = 0x80000 + 0x10000000 __base_RamLoc32 = 0x10000000 + 0x10000000 __base_RAM = 0x10000000 + 0x10008000 __top_RamLoc32 = 0x10008000 + 0x10008000 __top_RAM = 0x10008000 + 0x2007c000 __base_RamAHB32 = 0x2007c000 + 0x2007c000 __base_RAM2 = 0x2007c000 + 0x20084000 __top_RamAHB32 = 0x20084000 + 0x20084000 __top_RAM2 = 0x20084000 + +.text 0x00000000 0x5ae0 + FILL mask 0xff + 0x00000000 __vectors_start__ = ABSOLUTE (.) + *(.isr_vector) + .isr_vector 0x00000000 0xcc ./src/cr_startup_lpc175x_6x.o + 0x00000000 g_pfnVectors + 0x000000cc . = ALIGN (0x4) + 0x000000cc __section_table_start = . + 0x000000cc __data_section_table = . + 0x000000cc 0x4 LONG 0x5ae0 LOADADDR (.data) + 0x000000d0 0x4 LONG 0x10000000 ADDR (.data) + 0x000000d4 0x4 LONG 0x128 SIZEOF (.data) + 0x000000d8 0x4 LONG 0x5ae0 LOADADDR (.data_RAM2) + 0x000000dc 0x4 LONG 0x2007c000 ADDR (.data_RAM2) + 0x000000e0 0x4 LONG 0x0 SIZEOF (.data_RAM2) + 0x000000e4 __data_section_table_end = . + 0x000000e4 __bss_section_table = . + 0x000000e4 0x4 LONG 0x10000128 ADDR (.bss) + 0x000000e8 0x4 LONG 0x2a4 SIZEOF (.bss) + 0x000000ec 0x4 LONG 0x2007c000 ADDR (.bss_RAM2) + 0x000000f0 0x4 LONG 0x0 SIZEOF (.bss_RAM2) + 0x000000f4 __bss_section_table_end = . + 0x000000f4 __section_table_end = . + *(.after_vectors*) + .after_vectors + 0x000000f4 0x144 ./src/cr_startup_lpc175x_6x.o + 0x000000f4 data_init + 0x00000138 bss_init + 0x00000170 ResetISR + 0x000001e8 NMI_Handler + 0x000001f0 HardFault_Handler + 0x000001f8 MemManage_Handler + 0x00000200 BusFault_Handler + 0x00000208 UsageFault_Handler + 0x00000210 SVC_Handler + 0x00000218 DebugMon_Handler + 0x00000220 PendSV_Handler + 0x00000228 SysTick_Handler + 0x00000230 EINT3_IRQHandler + 0x00000230 CANActivity_IRQHandler + 0x00000230 TIMER3_IRQHandler + 0x00000230 UART0_IRQHandler + 0x00000230 UART1_IRQHandler + 0x00000230 EINT2_IRQHandler + 0x00000230 USBActivity_IRQHandler + 0x00000230 IntDefaultHandler + 0x00000230 PLL0_IRQHandler + 0x00000230 I2C0_IRQHandler + 0x00000230 I2C1_IRQHandler + 0x00000230 SSP0_IRQHandler + 0x00000230 I2S_IRQHandler + 0x00000230 I2C2_IRQHandler + 0x00000230 RTC_IRQHandler + 0x00000230 SPI_IRQHandler + 0x00000230 RIT_IRQHandler + 0x00000230 EINT1_IRQHandler + 0x00000230 TIMER1_IRQHandler + 0x00000230 UART2_IRQHandler + 0x00000230 ADC_IRQHandler + 0x00000230 SSP1_IRQHandler + 0x00000230 USB_IRQHandler + 0x00000230 BOD_IRQHandler + 0x00000230 PLL1_IRQHandler + 0x00000230 WDT_IRQHandler + 0x00000230 PWM1_IRQHandler + 0x00000230 QEI_IRQHandler + 0x00000230 EINT0_IRQHandler + 0x00000230 CAN_IRQHandler + 0x00000230 DMA_IRQHandler + 0x00000230 TIMER2_IRQHandler + 0x00000230 UART3_IRQHandler + 0x00000230 MCPWM_IRQHandler + 0x000002fc . = 0x2fc + *fill* 0x00000238 0xc4 ff + 0x000002fc PROVIDE (__CRP_WORD_START__, .) + *(.crp) + .crp 0x000002fc 0x4 ./src/crp.o + 0x000002fc CRP_WORD + 0x00000300 PROVIDE (__CRP_WORD_END__, .) + 0x00000001 ASSERT (! ((__CRP_WORD_START__ == __CRP_WORD_END__)), Linker CRP Enabled, but no CRP_WORD provided within application) + *(.text*) + .text.NVIC_EnableIRQ + 0x00000300 0x30 ./src/labyrinth_slave.o + .text.NVIC_DisableIRQ + 0x00000330 0x34 ./src/labyrinth_slave.o + .text.master_info_rx + 0x00000364 0x30 ./src/labyrinth_slave.o + 0x00000364 master_info_rx + .text.main 0x00000394 0x1a8 ./src/labyrinth_slave.o + 0x00000394 main + .text.NVIC_EnableIRQ + 0x0000053c 0x30 ./src/timer.o + .text.TIMER0_IRQHandler + 0x0000056c 0x24 ./src/timer.o + 0x0000056c TIMER0_IRQHandler + .text.get_tick + 0x00000590 0x14 ./src/timer.o + 0x00000590 get_tick + .text.init_timer0 + 0x000005a4 0x38 ./src/timer.o + 0x000005a4 init_timer0 + .text.draw_labyrinth + 0x000005dc 0x150 ./src/tools.o + 0x000005dc draw_labyrinth + .text.accel_write_byte + 0x0000072c 0x44 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(accelerometer.o) + 0x0000072c accel_write_byte + .text.accel_read_byte + 0x00000770 0x54 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(accelerometer.o) + 0x00000770 accel_read_byte + .text.accel_init + 0x000007c4 0xb4 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(accelerometer.o) + 0x000007c4 accel_init + .text.accel_read + 0x00000878 0xcc C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(accelerometer.o) + 0x00000878 accel_read + .text.NVIC_EnableIRQ + 0x00000944 0x30 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(ethernet_mgt.o) + .text.ENET_IRQHandler + 0x00000974 0x78 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(ethernet_mgt.o) + 0x00000974 ENET_IRQHandler + .text.ethernet_init + 0x000009ec 0x4c C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(ethernet_mgt.o) + 0x000009ec ethernet_init + .text.send_eth + 0x00000a38 0x64 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(ethernet_mgt.o) + 0x00000a38 send_eth + .text.WriteToPHY + 0x00000a9c 0x50 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(ethmac.o) + 0x00000a9c WriteToPHY + .text.ReadFromPHY + 0x00000aec 0x60 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(ethmac.o) + 0x00000aec ReadFromPHY + .text.Init_EthMAC + 0x00000b4c 0x3e0 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(ethmac.o) + 0x00000b4c Init_EthMAC + .text.WriteFrame_EthMAC + 0x00000f2c 0x28 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(ethmac.o) + 0x00000f2c WriteFrame_EthMAC + .text.ReadFrame_EthMAC + 0x00000f54 0x1c C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(ethmac.o) + 0x00000f54 ReadFrame_EthMAC + .text.RequestSend + 0x00000f70 0x50 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(ethmac.o) + 0x00000f70 RequestSend + .text.StartReadingFrame + 0x00000fc0 0x50 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(ethmac.o) + 0x00000fc0 StartReadingFrame + .text.StopReadingFrame + 0x00001010 0x34 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(ethmac.o) + 0x00001010 StopReadingFrame + .text.LCD_RS_ENA + 0x00001044 0x38 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(lcd.o) + .text.LCD_RS_DIS + 0x0000107c 0x38 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(lcd.o) + .text.Write_Cmd_Data + 0x000010b4 0x28 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(lcd.o) + 0x000010b4 Write_Cmd_Data + .text.Write_Cmd + 0x000010dc 0x28 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(lcd.o) + 0x000010dc Write_Cmd + .text.Write_Data + 0x00001104 0x30 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(lcd.o) + 0x00001104 Write_Data + .text.Write_Data_U16 + 0x00001134 0x28 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(lcd.o) + 0x00001134 Write_Data_U16 + .text.Delay 0x0000115c 0x30 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(lcd.o) + 0x0000115c Delay + .text.ILI9341_Initial + 0x0000118c 0x220 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(lcd.o) + 0x0000118c ILI9341_Initial + .text.init_lcd + 0x000013ac 0x54 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(lcd.o) + 0x000013ac init_lcd + .text.LCD_SetPos + 0x00001400 0xb8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(lcd.o) + 0x00001400 LCD_SetPos + .text.clear_screen + 0x000014b8 0x4c C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(lcd.o) + 0x000014b8 clear_screen + .text.lcd_filled_circle + 0x00001504 0xd8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(lcd.o) + 0x00001504 lcd_filled_circle + .text.lcd_filled_rectangle + 0x000015dc 0xa4 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(lcd.o) + 0x000015dc lcd_filled_rectangle + .text.lcd_print_char + 0x00001680 0x10c C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(lcd.o) + 0x00001680 lcd_print_char + .text.lcd_print + 0x0000178c 0xf4 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(lcd.o) + 0x0000178c lcd_print + .text.ssp_init_custom + 0x00001880 0x84 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(ssp.o) + 0x00001880 ssp_init_custom + .text.ssp_send_buf + 0x00001904 0x48 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(ssp.o) + 0x00001904 ssp_send_buf + .text.init_i2c + 0x0000194c 0xfc C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(I2C.o) + 0x0000194c init_i2c + .text.wait_SI 0x00001a48 0x44 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(I2C.o) + 0x00001a48 wait_SI + .text.I2C_master_write + 0x00001a8c 0xec C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(I2C.o) + 0x00001a8c I2C_master_write + .text.I2C_master_read + 0x00001b78 0x120 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(I2C.o) + 0x00001b78 I2C_master_read + .text.SystemInit + 0x00001c98 0xe4 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\CMSISv2p00_LPC17xx\Debug\libCMSISv2p00_LPC17xx.a(system_LPC17xx.o) + 0x00001c98 SystemInit + .text.__main 0x00001d7c 0x14 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(_cr__main.o) + 0x00001d7c __CR_SEMIHOST + 0x00001d7c __main + .text.memset 0x00001d90 0x4 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(memset.o) + 0x00001d90 memset + .text.malloc 0x00001d94 0xc8 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(alloc.o) + 0x00001d94 malloc + .text.free 0x00001e5c 0x30 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(alloc.o) + 0x00001e5c free + .text._Csys_alloc + 0x00001e8c 0x20 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(alloc.o) + 0x00001e8c _Csys_alloc + .text.fclose 0x00001eac 0x6c c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fclose.o) + 0x00001eac fclose + .text.fflush 0x00001f18 0x30 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fflush.o) + 0x00001f18 fflush + .text.fp_round + 0x00001f48 0x4c c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fpprintf.o) + .text.pr_dec.constprop.1 + 0x00001f94 0x26 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fpprintf.o) + *fill* 0x00001fba 0x2 ff + .text.sprintf 0x00001fbc 0x6c c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fpprintf.o) + 0x00001fbc sprintf + .text.fp_display + 0x00002028 0x8ec c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fpprintf.o) + .text.vsprintf + 0x00002914 0x5c c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fpprintf.o) + 0x00002914 vsprintf + .text.vsnprintf + 0x00002970 0x5c c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fpprintf.o) + 0x00002970 vsnprintf + .text.printf 0x000029cc 0x54 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fpprintf.o) + 0x000029cc printf + .text.fseek 0x00002a20 0x110 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fseek.o) + 0x00002a20 fseek + .text.ftell 0x00002b30 0x4c c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(ftell.o) + 0x00002b30 ftell + .text._initio 0x00002b7c 0xa4 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(initio.o) + 0x00002b7c _initio + .text._terminateio + 0x00002c20 0x44 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(initio.o) + 0x00002c20 _terminateio + .text.__vfprintf + 0x00002c64 0xd28 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(printf.o) + 0x00002c64 __vfprintf + .text.remove 0x0000398c 0x14 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(remove.o) + 0x0000398c remove + .text.setvbuf 0x000039a0 0x40 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(setvbuf.o) + 0x000039a0 setvbuf + .text.sqrt 0x000039e0 0x11c c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(sqrt.o) + 0x000039e0 sqrt + .text.exit 0x00003afc 0x2c c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(stdlib.o) + 0x00003afc exit + .text.strlen 0x00003b28 0x4a c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(strlen.o) + 0x00003b28 strlen + *fill* 0x00003b72 0x2 ff + .text._sbrk 0x00003b74 0x40 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_cr_sbrk.o) + 0x00003b74 _sbrk + .text._deferredlazyseek + 0x00003bb4 0x44 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_deferredlazyseek.o) + 0x00003bb4 _deferredlazyseek + .text.__flsbuf + 0x00003bf8 0x140 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_deferredlazyseek.o) + 0x00003bf8 __flsbuf + .text._do_fflush + 0x00003d38 0x44 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_do_fflush.o) + 0x00003d38 _do_fflush + .text._fdopen 0x00003d7c 0x6a c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_fdopen.o) + 0x00003d7c _fdopen + .text._fflush 0x00003de6 0x58 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_fflush.o) + 0x00003de6 _fflush + .text._frexpl 0x00003e3e 0x5a c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_frexpl.o) + 0x00003e3e _frexpl + .text._ldexpl 0x00003e98 0x4c c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_ldexpl.o) + 0x00003e98 _ldexpl + .text._Cwritebuf + 0x00003ee4 0x68 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_writebuf.o) + 0x00003ee4 _Cwritebuf + .text.__check_heap_overflow + 0x00003f4c 0x18 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_cr_check_heap.o) + 0x00003f4c __check_heap_overflow + .text.__aeabi_dmul + 0x00003f64 0x110 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(double.o) + 0x00003f64 __aeabi_dmul + .text.__aeabi_ddiv + 0x00004074 0x138 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(double.o) + 0x00004074 __aeabi_ddiv + .text.__aeabi_dsub + 0x000041ac 0x1a0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(double.o) + 0x000041ac __aeabi_dsub + .text.__aeabi_dadd + 0x0000434c 0x10c c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(double.o) + 0x0000434c __aeabi_dadd + .text.__aeabi_d2iz + 0x00004458 0x40 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(double.o) + 0x00004458 __aeabi_d2iz + .text.__bhs_ui2d + 0x00004498 0x46 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(double.o) + 0x00004498 __bhs_ui2d + .text.__aeabi_i2d + 0x000044de 0x10 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(double.o) + 0x000044de __aeabi_i2d + .text.__aeabi_dcmpeq + 0x000044ee 0x2c c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(double.o) + 0x000044ee __aeabi_dcmpeq + .text.__aeabi_dcmplt + 0x0000451a 0x54 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(double.o) + 0x0000451a __aeabi_dcmplt + .text.__aeabi_dcmple + 0x0000456e 0x54 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(double.o) + 0x0000456e __aeabi_dcmple + .text.__aeabi_dcmpge + 0x000045c2 0x54 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(double.o) + 0x000045c2 __aeabi_dcmpge + *fill* 0x00004616 0x2 ff + .text.__aeabi_fdiv + 0x00004618 0xc0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(float.o) + 0x00004618 __aeabi_fdiv + .text.__bhs_ui2f + 0x000046d8 0x26 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(float.o) + 0x000046d8 __bhs_ui2f + .text.__aeabi_i2f + 0x000046fe 0x10 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(float.o) + 0x000046fe __aeabi_i2f + .text.__aeabi_memset_lowlevel + 0x0000470e 0x32 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(memcpy.o) + 0x0000470e __aeabi_lowlevel_memset + .text.__sys_appexit + 0x00004740 0xc c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_appexit.o) + 0x00004740 __sys_appexit + 0x00004740 __exit + .text.__sys_close + 0x0000474c 0xc c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_close.o) + 0x0000474c __sys_close + .text.__sys_flen + 0x00004758 0xc c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_flen.o) + 0x00004758 __sys_flen + .text.__sys_istty + 0x00004764 0xc c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_istty.o) + 0x00004764 __sys_istty + .text.__sys_remove + 0x00004770 0xc c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_remove.o) + 0x00004770 __sys_remove + .text.__sys_seek + 0x0000477c 0xc c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_seek.o) + 0x0000477c __sys_seek + .text.__sys_tmpnam + 0x00004788 0xc c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_tmpnam.o) + 0x00004788 __sys_tmpnam + .text.__sys_write + 0x00004794 0xc c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_write.o) + 0x00004794 __sys_write + 0x00004794 __write + *(.rodata .rodata.* .constdata .constdata.*) + .rodata 0x000047a0 0x52 ./src/labyrinth_slave.o + *fill* 0x000047f2 0x2 ff + .rodata 0x000047f4 0x28 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(ethernet_mgt.o) + .rodata 0x0000481c 0x37 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(ethmac.o) + *fill* 0x00004853 0x1 ff + .rodata 0x00004854 0x19b C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(lcd.o) + *fill* 0x000049ef 0x1 ff + .rodata.SmallFont + 0x000049f0 0x478 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(fonts.o) + 0x000049f0 SmallFont + .rodata.BigFont + 0x00004e68 0xbe4 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(fonts.o) + 0x00004e68 BigFont + .rodata.str1.1 + 0x00005a4c 0x18 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(alloc.o) + .rodata.str1.1 + 0x00005a64 0x34 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fpprintf.o) + 0x35 (size before relaxing) + .rodata.str1.1 + 0x00005a98 0x4 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(initio.o) + .rodata.str1.1 + 0x00005a9c 0x31 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(printf.o) + 0x38 (size before relaxing) + *fill* 0x00005acd 0x3 ff + .rodata.__huge_val + 0x00005ad0 0x8 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_hugeval.o) + 0x00005ad0 __huge_val + .rodata.__huge_vall + 0x00005ad8 0x8 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_hugeval.o) + 0x00005ad8 __huge_vall + 0x00005ae0 . = ALIGN (0x4) + +.glue_7 0x00005ae0 0x0 + .glue_7 0x00005ae0 0x0 linker stubs + +.glue_7t 0x00005ae0 0x0 + .glue_7t 0x00005ae0 0x0 linker stubs + +.vfp11_veneer 0x00005ae0 0x0 + .vfp11_veneer 0x00005ae0 0x0 linker stubs + +.v4_bx 0x00005ae0 0x0 + .v4_bx 0x00005ae0 0x0 linker stubs + +.iplt 0x00005ae0 0x0 + .iplt 0x00005ae0 0x0 ./src/cr_startup_lpc175x_6x.o + +.rel.dyn 0x00005ae0 0x0 + .rel.iplt 0x00005ae0 0x0 ./src/cr_startup_lpc175x_6x.o + +.ARM.extab + *(.ARM.extab* .gnu.linkonce.armextab.*) + 0x00005ae0 __exidx_start = . + +.ARM.exidx + *(.ARM.exidx* .gnu.linkonce.armexidx.*) + 0x00005ae0 __exidx_end = . + 0x00005ae0 _etext = . + +.data_RAM2 0x2007c000 0x0 load address 0x00005ae0 + FILL mask 0xff + [!provide] PROVIDE (__start_data_RAM2, .) + *(.ramfunc.$RAM2) + *(.ramfunc.$RamAHB32) + *(.data.$RAM2*) + *(.data.$RamAHB32*) + 0x2007c000 . = ALIGN (0x4) + [!provide] PROVIDE (__end_data_RAM2, .) + +.uninit_RESERVED + 0x10000000 0x0 + *(.bss.$RESERVED*) + 0x10000000 . = ALIGN (0x4) + 0x10000000 _end_uninit_RESERVED = . + +.data 0x10000000 0x128 load address 0x00005ae0 + FILL mask 0xff + 0x10000000 _data = . + *(vtable) + *(.ramfunc*) + *(.data*) + .data.labyrinth_points + 0x10000000 0x128 ./src/labyrinth_slave.o + 0x10000128 . = ALIGN (0x4) + 0x10000128 _edata = . + +.igot.plt 0x10000128 0x0 load address 0x00005c08 + .igot.plt 0x10000128 0x0 ./src/cr_startup_lpc175x_6x.o + +.bss_RAM2 0x2007c000 0x0 + [!provide] PROVIDE (__start_bss_RAM2, .) + *(.bss.$RAM2*) + *(.bss.$RamAHB32*) + 0x2007c000 . = ALIGN ((. != 0x0)?0x4:0x1) + [!provide] PROVIDE (__end_bss_RAM2, .) + +.bss 0x10000128 0x2a4 + 0x10000128 _bss = . + *(.bss*) + .bss.timer_count + 0x10000128 0x4 ./src/timer.o + .bss.i2c_h 0x1000012c 0x4 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(accelerometer.o) + .bss.rx_irq_callback + 0x10000130 0x4 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(ethernet_mgt.o) + .bss.dat 0x10000134 0x3c C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(ethernet_mgt.o) + .bss.rx 0x10000170 0x4 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(ethernet_mgt.o) + 0x10000170 rx + .bss.rxptr 0x10000174 0x4 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(ethmac.o) + .bss.txptr 0x10000178 0x4 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(ethmac.o) + .bss._extra 0x1000017c 0x4 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(initio.o) + 0x1000017c _extra + .bss.__Ciob 0x10000180 0x140 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(stdio.o) + 0x10000180 __Ciob + .bss._exitvector + 0x100002c0 0x84 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(stdlib.o) + 0x100002c0 _exitvector + .bss._number_of_exit_functions + 0x10000344 0x4 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(stdlib.o) + 0x10000344 _number_of_exit_functions + .bss.__heaps 0x10000348 0x4 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(__init_alloc.o) + 0x10000348 __heaps + .bss.__end_of_heap + 0x1000034c 0x4 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(__init_alloc.o) + 0x1000034c __end_of_heap + .bss.errno 0x10000350 0x4 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(errno.o) + 0x10000350 errno + *(COMMON) + COMMON 0x10000354 0x78 ./src/labyrinth_slave.o + 0x10000354 last_ball_coord + 0x1000037c master_tx + 0x100003cc . = ALIGN (0x4) + 0x100003cc _ebss = . + [!provide] PROVIDE (end, .) + +.noinit_RAM2 0x2007c000 0x0 + *(.noinit.$RAM2*) + *(.noinit.$RamAHB32*) + 0x2007c000 . = ALIGN (0x4) + +.noinit 0x100003cc 0x0 + 0x100003cc _noinit = . + *(.noinit*) + 0x100003cc . = ALIGN (0x4) + 0x100003cc _end_noinit = . + 0x100003cc PROVIDE (_pvHeapStart, DEFINED (__user_heap_base)?__user_heap_base:.) + 0x10008000 PROVIDE (_vStackTop, DEFINED (__user_stack_top)?__user_stack_top:(__top_RamLoc32 - 0x0)) + [!provide] PROVIDE (__valid_user_code_checksum, (0x0 - ((((((_vStackTop + (ResetISR + 0x1)) + (NMI_Handler + 0x1)) + (HardFault_Handler + 0x1)) + (DEFINED (MemManage_Handler)?MemManage_Handler:0x0 + 0x1)) + (DEFINED (BusFault_Handler)?BusFault_Handler:0x0 + 0x1)) + (DEFINED (UsageFault_Handler)?UsageFault_Handler:0x0 + 0x1)))) +OUTPUT(TP1_labyrinth_slave.axf elf32-littlearm) + +.debug_info 0x00000000 0x48a3 + .debug_info 0x00000000 0x250 ./src/cr_startup_lpc175x_6x.o + .debug_info 0x00000250 0x3f ./src/crp.o + .debug_info 0x0000028f 0x581 ./src/labyrinth_slave.o + .debug_info 0x00000810 0x4d9 ./src/timer.o + .debug_info 0x00000ce9 0x2a0 ./src/tools.o + .debug_info 0x00000f89 0x362 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(accelerometer.o) + .debug_info 0x000012eb 0x7d8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(ethernet_mgt.o) + .debug_info 0x00001ac3 0x9cb C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(ethmac.o) + .debug_info 0x0000248e 0x129f C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(lcd.o) + .debug_info 0x0000372d 0x5ab C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(ssp.o) + .debug_info 0x00003cd8 0x809 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(I2C.o) + .debug_info 0x000044e1 0xaa C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(fonts.o) + .debug_info 0x0000458b 0x318 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\CMSISv2p00_LPC17xx\Debug\libCMSISv2p00_LPC17xx.a(system_LPC17xx.o) + +.debug_abbrev 0x00000000 0x1109 + .debug_abbrev 0x00000000 0xf5 ./src/cr_startup_lpc175x_6x.o + .debug_abbrev 0x000000f5 0x36 ./src/crp.o + .debug_abbrev 0x0000012b 0x1b5 ./src/labyrinth_slave.o + .debug_abbrev 0x000002e0 0x1c3 ./src/timer.o + .debug_abbrev 0x000004a3 0x122 ./src/tools.o + .debug_abbrev 0x000005c5 0x111 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(accelerometer.o) + .debug_abbrev 0x000006d6 0x1fc C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(ethernet_mgt.o) + .debug_abbrev 0x000008d2 0x205 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(ethmac.o) + .debug_abbrev 0x00000ad7 0x274 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(lcd.o) + .debug_abbrev 0x00000d4b 0x13a C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(ssp.o) + .debug_abbrev 0x00000e85 0x156 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(I2C.o) + .debug_abbrev 0x00000fdb 0x48 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(fonts.o) + .debug_abbrev 0x00001023 0xe6 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\CMSISv2p00_LPC17xx\Debug\libCMSISv2p00_LPC17xx.a(system_LPC17xx.o) + +.debug_aranges 0x00000000 0x3e8 + .debug_aranges + 0x00000000 0x80 ./src/cr_startup_lpc175x_6x.o + .debug_aranges + 0x00000080 0x18 ./src/crp.o + .debug_aranges + 0x00000098 0x38 ./src/labyrinth_slave.o + .debug_aranges + 0x000000d0 0x40 ./src/timer.o + .debug_aranges + 0x00000110 0x30 ./src/tools.o + .debug_aranges + 0x00000140 0x38 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(accelerometer.o) + .debug_aranges + 0x00000178 0x40 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(ethernet_mgt.o) + .debug_aranges + 0x000001b8 0x68 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(ethmac.o) + .debug_aranges + 0x00000220 0x110 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(lcd.o) + .debug_aranges + 0x00000330 0x30 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(ssp.o) + .debug_aranges + 0x00000360 0x48 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(I2C.o) + .debug_aranges + 0x000003a8 0x18 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(fonts.o) + .debug_aranges + 0x000003c0 0x28 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\CMSISv2p00_LPC17xx\Debug\libCMSISv2p00_LPC17xx.a(system_LPC17xx.o) + +.debug_ranges 0x00000000 0x338 + .debug_ranges 0x00000000 0x70 ./src/cr_startup_lpc175x_6x.o + .debug_ranges 0x00000070 0x28 ./src/labyrinth_slave.o + .debug_ranges 0x00000098 0x30 ./src/timer.o + .debug_ranges 0x000000c8 0x20 ./src/tools.o + .debug_ranges 0x000000e8 0x28 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(accelerometer.o) + .debug_ranges 0x00000110 0x30 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(ethernet_mgt.o) + .debug_ranges 0x00000140 0x58 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(ethmac.o) + .debug_ranges 0x00000198 0x130 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(lcd.o) + .debug_ranges 0x000002c8 0x20 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(ssp.o) + .debug_ranges 0x000002e8 0x38 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(I2C.o) + .debug_ranges 0x00000320 0x18 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\CMSISv2p00_LPC17xx\Debug\libCMSISv2p00_LPC17xx.a(system_LPC17xx.o) + +.debug_macro 0x00000000 0x4085 + .debug_macro 0x00000000 0x1d ./src/cr_startup_lpc175x_6x.o + .debug_macro 0x0000001d 0x892 ./src/cr_startup_lpc175x_6x.o + .debug_macro 0x000008af 0x1a ./src/crp.o + .debug_macro 0x000008c9 0x34 ./src/crp.o + .debug_macro 0x000008fd 0x122 ./src/labyrinth_slave.o + .debug_macro 0x00000a1f 0x1c ./src/labyrinth_slave.o + .debug_macro 0x00000a3b 0x2e ./src/labyrinth_slave.o + .debug_macro 0x00000a69 0x10 ./src/labyrinth_slave.o + .debug_macro 0x00000a79 0x12d ./src/labyrinth_slave.o + .debug_macro 0x00000ba6 0x5b2 ./src/labyrinth_slave.o + .debug_macro 0x00001158 0x18 ./src/labyrinth_slave.o + .debug_macro 0x00001170 0x7af ./src/labyrinth_slave.o + .debug_macro 0x0000191f 0x2c7 ./src/labyrinth_slave.o + .debug_macro 0x00001be6 0x22 ./src/labyrinth_slave.o + .debug_macro 0x00001c08 0xa0 ./src/labyrinth_slave.o + .debug_macro 0x00001ca8 0x82 ./src/labyrinth_slave.o + .debug_macro 0x00001d2a 0x1c ./src/labyrinth_slave.o + .debug_macro 0x00001d46 0x28 ./src/labyrinth_slave.o + .debug_macro 0x00001d6e 0x1c ./src/labyrinth_slave.o + .debug_macro 0x00001d8a 0xc2 ./src/labyrinth_slave.o + .debug_macro 0x00001e4c 0xd6 ./src/labyrinth_slave.o + .debug_macro 0x00001f22 0x22 ./src/labyrinth_slave.o + .debug_macro 0x00001f44 0x92 ./src/timer.o + .debug_macro 0x00001fd6 0x28 ./src/timer.o + .debug_macro 0x00001ffe 0xc0 ./src/tools.o + .debug_macro 0x000020be 0xc4 ./src/tools.o + .debug_macro 0x00002182 0x1c ./src/tools.o + .debug_macro 0x0000219e 0xaf C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(accelerometer.o) + .debug_macro 0x0000224d 0x898 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(accelerometer.o) + .debug_macro 0x00002ae5 0x52 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(accelerometer.o) + .debug_macro 0x00002b37 0xd4 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(ethernet_mgt.o) + .debug_macro 0x00002c0b 0x9a C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(ethernet_mgt.o) + .debug_macro 0x00002ca5 0x7c C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(ethernet_mgt.o) + .debug_macro 0x00002d21 0x5c3 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(ethernet_mgt.o) + .debug_macro 0x000032e4 0xa9 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(ethmac.o) + .debug_macro 0x0000338d 0x108 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(lcd.o) + .debug_macro 0x00003495 0x22 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(lcd.o) + .debug_macro 0x000034b7 0xc4 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(lcd.o) + .debug_macro 0x0000357b 0x90 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(ssp.o) + .debug_macro 0x0000360b 0x22 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(ssp.o) + .debug_macro 0x0000362d 0x8d C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(I2C.o) + .debug_macro 0x000036ba 0x1a C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(fonts.o) + .debug_macro 0x000036d4 0x12b C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\CMSISv2p00_LPC17xx\Debug\libCMSISv2p00_LPC17xx.a(system_LPC17xx.o) + .debug_macro 0x000037ff 0x886 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\CMSISv2p00_LPC17xx\Debug\libCMSISv2p00_LPC17xx.a(system_LPC17xx.o) + +.debug_line 0x00000000 0x2363 + .debug_line 0x00000000 0xd5 ./src/cr_startup_lpc175x_6x.o + .debug_line 0x000000d5 0x78 ./src/crp.o + .debug_line 0x0000014d 0x324 ./src/labyrinth_slave.o + .debug_line 0x00000471 0x212 ./src/timer.o + .debug_line 0x00000683 0x32f ./src/tools.o + .debug_line 0x000009b2 0x299 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(accelerometer.o) + .debug_line 0x00000c4b 0x320 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(ethernet_mgt.o) + .debug_line 0x00000f6b 0x3db C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(ethmac.o) + .debug_line 0x00001346 0x80d C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(lcd.o) + .debug_line 0x00001b53 0x25a C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(ssp.o) + .debug_line 0x00001dad 0x360 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(I2C.o) + .debug_line 0x0000210d 0x83 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(fonts.o) + .debug_line 0x00002190 0x1d3 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\CMSISv2p00_LPC17xx\Debug\libCMSISv2p00_LPC17xx.a(system_LPC17xx.o) + +.debug_str 0x00000000 0xc443 + .debug_str 0x00000000 0x26ab ./src/cr_startup_lpc175x_6x.o + 0x26be (size before relaxing) + .debug_str 0x000026ab 0xe9 ./src/crp.o + 0x25d6 (size before relaxing) + .debug_str 0x00002794 0x6bc4 ./src/labyrinth_slave.o + 0x916a (size before relaxing) + .debug_str 0x00009358 0x111 ./src/timer.o + 0x80e8 (size before relaxing) + .debug_str 0x00009469 0x58f ./src/tools.o + 0x88a8 (size before relaxing) + .debug_str 0x000099f8 0x230 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(accelerometer.o) + 0x8393 (size before relaxing) + .debug_str 0x00009c28 0x1a14 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(ethernet_mgt.o) + 0xa130 (size before relaxing) + .debug_str 0x0000b63c 0x317 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(ethmac.o) + 0x9a75 (size before relaxing) + .debug_str 0x0000b953 0x548 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(lcd.o) + 0x9006 (size before relaxing) + .debug_str 0x0000be9b 0xa7 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(ssp.o) + 0x80e2 (size before relaxing) + .debug_str 0x0000bf42 0xda C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(I2C.o) + 0x823f (size before relaxing) + .debug_str 0x0000c01c 0x1f C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(fonts.o) + 0x2587 (size before relaxing) + .debug_str 0x0000c03b 0x408 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\CMSISv2p00_LPC17xx\Debug\libCMSISv2p00_LPC17xx.a(system_LPC17xx.o) + 0x814e (size before relaxing) + +.comment 0x00000000 0xdc + .comment 0x00000000 0x6e ./src/cr_startup_lpc175x_6x.o + 0x6f (size before relaxing) + .comment 0x0000006e 0x6f ./src/crp.o + .comment 0x0000006e 0x6f ./src/labyrinth_slave.o + .comment 0x0000006e 0x6f ./src/timer.o + .comment 0x0000006e 0x6f ./src/tools.o + .comment 0x0000006e 0x6f C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(accelerometer.o) + .comment 0x0000006e 0x6f C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(ethernet_mgt.o) + .comment 0x0000006e 0x6f C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(ethmac.o) + .comment 0x0000006e 0x6f C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(lcd.o) + .comment 0x0000006e 0x6f C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(ssp.o) + .comment 0x0000006e 0x6f C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(I2C.o) + .comment 0x0000006e 0x6f C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(fonts.o) + .comment 0x0000006e 0x6f C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\CMSISv2p00_LPC17xx\Debug\libCMSISv2p00_LPC17xx.a(system_LPC17xx.o) + .comment 0x0000006e 0x6e c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(_cr__main.o) + 0x6f (size before relaxing) + .comment 0x000000dc 0x6f c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(memset.o) + .comment 0x000000dc 0x6f c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(alloc.o) + .comment 0x000000dc 0x6f c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fclose.o) + .comment 0x000000dc 0x6f c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fflush.o) + .comment 0x000000dc 0x6f c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fpprintf.o) + .comment 0x000000dc 0x6f c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fseek.o) + .comment 0x000000dc 0x6f c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(ftell.o) + .comment 0x000000dc 0x6f c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(initio.o) + .comment 0x000000dc 0x6f c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(printf.o) + .comment 0x000000dc 0x6f c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(remove.o) + .comment 0x000000dc 0x6f c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(setvbuf.o) + .comment 0x000000dc 0x6f c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(sqrt.o) + .comment 0x000000dc 0x6f c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(stdio.o) + .comment 0x000000dc 0x6f c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(stdlib.o) + .comment 0x000000dc 0x6f c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(strlen.o) + .comment 0x000000dc 0x6f c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(__init_alloc.o) + .comment 0x000000dc 0x6f c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_cr_sbrk.o) + .comment 0x000000dc 0x6f c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_deferredlazyseek.o) + .comment 0x000000dc 0x6f c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_do_fflush.o) + .comment 0x000000dc 0x6f c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_fdopen.o) + .comment 0x000000dc 0x6f c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_fflush.o) + .comment 0x000000dc 0x6f c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_frexpl.o) + .comment 0x000000dc 0x6f c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_hugeval.o) + .comment 0x000000dc 0x6f c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_ldexpl.o) + .comment 0x000000dc 0x6f c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_writebuf.o) + .comment 0x000000dc 0x6f c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(errno.o) + .comment 0x000000dc 0x6f c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_cr_check_heap.o) + .comment 0x000000dc 0x6f c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(double.o) + .comment 0x000000dc 0x6f c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(float.o) + +.ARM.attributes + 0x00000000 0x31 + .ARM.attributes + 0x00000000 0x33 ./src/cr_startup_lpc175x_6x.o + .ARM.attributes + 0x00000033 0x33 ./src/crp.o + .ARM.attributes + 0x00000066 0x33 ./src/labyrinth_slave.o + .ARM.attributes + 0x00000099 0x33 ./src/timer.o + .ARM.attributes + 0x000000cc 0x33 ./src/tools.o + .ARM.attributes + 0x000000ff 0x33 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(accelerometer.o) + .ARM.attributes + 0x00000132 0x33 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(ethernet_mgt.o) + .ARM.attributes + 0x00000165 0x33 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(ethmac.o) + .ARM.attributes + 0x00000198 0x33 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(lcd.o) + .ARM.attributes + 0x000001cb 0x33 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(ssp.o) + .ARM.attributes + 0x000001fe 0x33 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(I2C.o) + .ARM.attributes + 0x00000231 0x33 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(fonts.o) + .ARM.attributes + 0x00000264 0x33 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\CMSISv2p00_LPC17xx\Debug\libCMSISv2p00_LPC17xx.a(system_LPC17xx.o) + .ARM.attributes + 0x00000297 0x33 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(_cr__main.o) + .ARM.attributes + 0x000002ca 0x33 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(memset.o) + .ARM.attributes + 0x000002fd 0x33 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(alloc.o) + .ARM.attributes + 0x00000330 0x33 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fclose.o) + .ARM.attributes + 0x00000363 0x33 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fflush.o) + .ARM.attributes + 0x00000396 0x33 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fpprintf.o) + .ARM.attributes + 0x000003c9 0x33 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fseek.o) + .ARM.attributes + 0x000003fc 0x33 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(ftell.o) + .ARM.attributes + 0x0000042f 0x33 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(initio.o) + .ARM.attributes + 0x00000462 0x33 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(printf.o) + .ARM.attributes + 0x00000495 0x33 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(remove.o) + .ARM.attributes + 0x000004c8 0x33 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(setvbuf.o) + .ARM.attributes + 0x000004fb 0x33 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(sqrt.o) + .ARM.attributes + 0x0000052e 0x33 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(stdio.o) + .ARM.attributes + 0x00000561 0x33 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(stdlib.o) + .ARM.attributes + 0x00000594 0x33 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(strlen.o) + .ARM.attributes + 0x000005c7 0x33 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(__init_alloc.o) + .ARM.attributes + 0x000005fa 0x33 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_cr_sbrk.o) + .ARM.attributes + 0x0000062d 0x33 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_deferredlazyseek.o) + .ARM.attributes + 0x00000660 0x33 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_do_fflush.o) + .ARM.attributes + 0x00000693 0x33 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_fdopen.o) + .ARM.attributes + 0x000006c6 0x33 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_fflush.o) + .ARM.attributes + 0x000006f9 0x33 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_frexpl.o) + .ARM.attributes + 0x0000072c 0x33 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_hugeval.o) + .ARM.attributes + 0x0000075f 0x33 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_ldexpl.o) + .ARM.attributes + 0x00000792 0x33 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_writebuf.o) + .ARM.attributes + 0x000007c5 0x33 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(errno.o) + .ARM.attributes + 0x000007f8 0x33 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_cr_check_heap.o) + .ARM.attributes + 0x0000082b 0x33 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(double.o) + .ARM.attributes + 0x0000085e 0x33 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(float.o) + .ARM.attributes + 0x00000891 0x21 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(memcpy.o) + .ARM.attributes + 0x000008b2 0x21 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_appexit.o) + .ARM.attributes + 0x000008d3 0x21 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_close.o) + .ARM.attributes + 0x000008f4 0x21 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_flen.o) + .ARM.attributes + 0x00000915 0x21 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_istty.o) + .ARM.attributes + 0x00000936 0x21 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_remove.o) + .ARM.attributes + 0x00000957 0x21 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_seek.o) + .ARM.attributes + 0x00000978 0x21 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_tmpnam.o) + .ARM.attributes + 0x00000999 0x21 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_write.o) + +.debug_frame 0x00000000 0xcb4 + .debug_frame 0x00000000 0x170 ./src/cr_startup_lpc175x_6x.o + .debug_frame 0x00000170 0xb0 ./src/labyrinth_slave.o + .debug_frame 0x00000220 0xc4 ./src/timer.o + .debug_frame 0x000002e4 0x90 ./src/tools.o + .debug_frame 0x00000374 0xa0 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(accelerometer.o) + .debug_frame 0x00000414 0xc8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(ethernet_mgt.o) + .debug_frame 0x000004dc 0x18c C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(ethmac.o) + .debug_frame 0x00000668 0x490 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(lcd.o) + .debug_frame 0x00000af8 0x88 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(ssp.o) + .debug_frame 0x00000b80 0xf8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\TP1_labyrinth_slave\Debug\libMyLab_lib.a(I2C.o) + .debug_frame 0x00000c78 0x3c C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\w_exercices\CMSISv2p00_LPC17xx\Debug\libCMSISv2p00_LPC17xx.a(system_LPC17xx.o) diff --git a/TP1_labyrinth_slave_etu/Debug/TP1_labyrinth_slave_etu.axf b/TP1_labyrinth_slave_etu/Debug/TP1_labyrinth_slave_etu.axf new file mode 100644 index 0000000000000000000000000000000000000000..98e39381b78ca08e6fca8a5c34c0e2c51f188b0c Binary files /dev/null and b/TP1_labyrinth_slave_etu/Debug/TP1_labyrinth_slave_etu.axf differ diff --git a/TP1_labyrinth_slave_etu/Debug/TP1_labyrinth_slave_etu.map b/TP1_labyrinth_slave_etu/Debug/TP1_labyrinth_slave_etu.map new file mode 100644 index 0000000000000000000000000000000000000000..9cfa86240a0bc7042891f6ec2459611ff6e37be4 --- /dev/null +++ b/TP1_labyrinth_slave_etu/Debug/TP1_labyrinth_slave_etu.map @@ -0,0 +1,1505 @@ +Archive member included to satisfy reference by file (symbol) + +C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(accelerometer.o) + ./src/labyrinth_slave.o (accel_init) +C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(lcd.o) + ./src/labyrinth_slave.o (init_lcd) +C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(ssp.o) + C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(lcd.o) (ssp_init_custom) +C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(I2C.o) + C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(accelerometer.o) (init_i2c) +C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(fonts.o) + C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(lcd.o) (SmallFont) +C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\CMSISv2p00_LPC17xx\Debug\libCMSISv2p00_LPC17xx.a(system_LPC17xx.o) + ./src/cr_startup_lpc175x_6x.o (SystemInit) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(_cr__main.o) + ./src/cr_startup_lpc175x_6x.o (__main) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(alloc.o) + C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(lcd.o) (malloc) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(ceil.o) + ./src/tools.o (ceil) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fclose.o) + C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(lcd.o) (fclose) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fflush.o) + c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fclose.o) (fflush) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(floor.o) + ./src/tools.o (floor) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fopen.o) + C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(lcd.o) (fopen) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fpprintf.o) + C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(lcd.o) (vsprintf) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fread.o) + C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(lcd.o) (fread) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(freopen.o) + c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fopen.o) (freopen) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fseek.o) + C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(lcd.o) (fseek) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(ftell.o) + c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fseek.o) (ftell) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(initio.o) + c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(_cr__main.o) (_initio) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(printf.o) + c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fpprintf.o) (__vfprintf) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(remove.o) + c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fclose.o) (remove) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(setvbuf.o) + c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(initio.o) (setvbuf) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(sqrt.o) + C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(lcd.o) (sqrt) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(stdio.o) + c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fflush.o) (__Ciob) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(stdlib.o) + C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(lcd.o) (exit) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(strlen.o) + C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(lcd.o) (strlen) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(memcpy.o) + c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(alloc.o) (memcpy) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(memset.o) + c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(alloc.o) (memset) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(__fillbuf.o) + c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(stdio.o) (__filbuf) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(__init_alloc.o) + c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(alloc.o) (__heaps) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_cr_sbrk.o) + c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(alloc.o) (_sbrk) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_deferredlazyseek.o) + c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(__fillbuf.o) (_deferredlazyseek) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_do_fflush.o) + c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fflush.o) (_do_fflush) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_fdopen.o) + c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(initio.o) (_fdopen) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_fflush.o) + c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(__fillbuf.o) (_fflush) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_frexpl.o) + c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fpprintf.o) (_frexpl) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_hugeval.o) + c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(sqrt.o) (__huge_val) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_ldexpl.o) + c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fpprintf.o) (_ldexpl) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_read.o) + c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fread.o) (_Cread) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_writebuf.o) + c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_deferredlazyseek.o) (_Cwritebuf) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(errno.o) + c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(ftell.o) (errno) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(raise.o) + c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(stdlib.o) (raise) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_cr_check_heap.o) + c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_cr_sbrk.o) (__check_heap_overflow) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(division_64.o) + C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\CMSISv2p00_LPC17xx\Debug\libCMSISv2p00_LPC17xx.a(system_LPC17xx.o) (__aeabi_uldivmod) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(division_idiv0.o) + c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(division_64.o) (__aeabi_idiv0) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(double.o) + c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fpprintf.o) (__aeabi_dmul) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(float.o) + ./src/tools.o (__aeabi_fmul) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(memcpy.o) + c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(memcpy.o) (__aeabi_memcpy) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_appexit.o) + c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(alloc.o) (__sys_appexit) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_close.o) + c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fclose.o) (__sys_close) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_flen.o) + c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fseek.o) (__sys_flen) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_istty.o) + c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fseek.o) (__sys_istty) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_open.o) + c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(freopen.o) (__sys_open) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_read.o) + c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(__fillbuf.o) (__sys_read) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_readc.o) + c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(__fillbuf.o) (__sys_readc) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_remove.o) + c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(remove.o) (__sys_remove) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_rename.o) + c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(remove.o) (__sys_rename) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_seek.o) + c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(__fillbuf.o) (__sys_seek) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_tmpnam.o) + c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fclose.o) (__sys_tmpnam) +c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_write.o) + c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(alloc.o) (__sys_write) + +Discarded input sections + + .group 0x00000000 0x8 ./src/cr_startup_lpc175x_6x.o + .text 0x00000000 0x0 ./src/cr_startup_lpc175x_6x.o + .data 0x00000000 0x0 ./src/cr_startup_lpc175x_6x.o + .bss 0x00000000 0x0 ./src/cr_startup_lpc175x_6x.o + .group 0x00000000 0x8 ./src/crp.o + .group 0x00000000 0x8 ./src/crp.o + .text 0x00000000 0x0 ./src/crp.o + .data 0x00000000 0x0 ./src/crp.o + .bss 0x00000000 0x0 ./src/crp.o + .debug_macro 0x00000000 0x892 ./src/crp.o + .group 0x00000000 0x8 ./src/labyrinth_slave.o + .group 0x00000000 0x8 ./src/labyrinth_slave.o + .group 0x00000000 0x8 ./src/labyrinth_slave.o + .group 0x00000000 0x8 ./src/labyrinth_slave.o + .group 0x00000000 0x8 ./src/labyrinth_slave.o + .group 0x00000000 0x8 ./src/labyrinth_slave.o + .group 0x00000000 0x8 ./src/labyrinth_slave.o + .group 0x00000000 0x8 ./src/labyrinth_slave.o + .group 0x00000000 0x8 ./src/labyrinth_slave.o + .group 0x00000000 0x8 ./src/labyrinth_slave.o + .group 0x00000000 0x8 ./src/labyrinth_slave.o + .group 0x00000000 0x8 ./src/labyrinth_slave.o + .group 0x00000000 0x8 ./src/labyrinth_slave.o + .group 0x00000000 0x8 ./src/labyrinth_slave.o + .group 0x00000000 0x8 ./src/labyrinth_slave.o + .group 0x00000000 0x8 ./src/labyrinth_slave.o + .group 0x00000000 0x8 ./src/labyrinth_slave.o + .group 0x00000000 0x8 ./src/labyrinth_slave.o + .text 0x00000000 0x0 ./src/labyrinth_slave.o + .data 0x00000000 0x0 ./src/labyrinth_slave.o + .bss 0x00000000 0x0 ./src/labyrinth_slave.o + .text.master_info_rx + 0x00000000 0x14 ./src/labyrinth_slave.o + .debug_macro 0x00000000 0x892 ./src/labyrinth_slave.o + .group 0x00000000 0x8 ./src/tools.o + .group 0x00000000 0x8 ./src/tools.o + .group 0x00000000 0x8 ./src/tools.o + .group 0x00000000 0x8 ./src/tools.o + .group 0x00000000 0x8 ./src/tools.o + .group 0x00000000 0x8 ./src/tools.o + .group 0x00000000 0x8 ./src/tools.o + .group 0x00000000 0x8 ./src/tools.o + .group 0x00000000 0x8 ./src/tools.o + .group 0x00000000 0x8 ./src/tools.o + .group 0x00000000 0x8 ./src/tools.o + .group 0x00000000 0x8 ./src/tools.o + .group 0x00000000 0x8 ./src/tools.o + .group 0x00000000 0x8 ./src/tools.o + .group 0x00000000 0x8 ./src/tools.o + .group 0x00000000 0x8 ./src/tools.o + .text 0x00000000 0x0 ./src/tools.o + .data 0x00000000 0x0 ./src/tools.o + .bss 0x00000000 0x0 ./src/tools.o + .text.round 0x00000000 0x78 ./src/tools.o + .text.test_collision + 0x00000000 0x450 ./src/tools.o + .debug_macro 0x00000000 0x892 ./src/tools.o + .debug_macro 0x00000000 0x10 ./src/tools.o + .debug_macro 0x00000000 0x12d ./src/tools.o + .debug_macro 0x00000000 0x5b2 ./src/tools.o + .debug_macro 0x00000000 0x1c ./src/tools.o + .debug_macro 0x00000000 0x2e ./src/tools.o + .debug_macro 0x00000000 0x18 ./src/tools.o + .debug_macro 0x00000000 0x7af ./src/tools.o + .debug_macro 0x00000000 0x2c7 ./src/tools.o + .debug_macro 0x00000000 0x1c ./src/tools.o + .debug_macro 0x00000000 0x22 ./src/tools.o + .debug_macro 0x00000000 0x28 ./src/tools.o + .debug_macro 0x00000000 0x1c ./src/tools.o + .debug_macro 0x00000000 0xc2 ./src/tools.o + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(accelerometer.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(accelerometer.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(accelerometer.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(accelerometer.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(accelerometer.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(accelerometer.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(accelerometer.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(accelerometer.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(accelerometer.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(accelerometer.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(accelerometer.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(accelerometer.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(accelerometer.o) + .text 0x00000000 0x0 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(accelerometer.o) + .data 0x00000000 0x0 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(accelerometer.o) + .bss 0x00000000 0x0 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(accelerometer.o) + .text.accel_read + 0x00000000 0xcc C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(accelerometer.o) + .debug_macro 0x00000000 0x10 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(accelerometer.o) + .debug_macro 0x00000000 0x12d C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(accelerometer.o) + .debug_macro 0x00000000 0x1c C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(accelerometer.o) + .debug_macro 0x00000000 0x2e C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(accelerometer.o) + .debug_macro 0x00000000 0x5b2 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(accelerometer.o) + .debug_macro 0x00000000 0x18 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(accelerometer.o) + .debug_macro 0x00000000 0x7af C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(accelerometer.o) + .debug_macro 0x00000000 0x2c7 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(accelerometer.o) + .debug_macro 0x00000000 0xd6 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(accelerometer.o) + .debug_macro 0x00000000 0x22 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(accelerometer.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(lcd.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(lcd.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(lcd.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(lcd.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(lcd.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(lcd.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(lcd.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(lcd.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(lcd.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(lcd.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(lcd.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(lcd.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(lcd.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(lcd.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(lcd.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(lcd.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(lcd.o) + .text 0x00000000 0x0 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(lcd.o) + .data 0x00000000 0x0 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(lcd.o) + .bss 0x00000000 0x0 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(lcd.o) + .bss.str 0x00000000 0x30c C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(lcd.o) + .text.LCD_SetPosR + 0x00000000 0x90 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(lcd.o) + .text.read_pixels + 0x00000000 0xf8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(lcd.o) + .text.read_cmd + 0x00000000 0x64 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(lcd.o) + .text.setup_scroll + 0x00000000 0x68 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(lcd.o) + .text.lcd_scroll + 0x00000000 0x60 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(lcd.o) + .text.lcd_set_fenetre_pixel + 0x00000000 0x24 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(lcd.o) + .text.Ecran_Croix + 0x00000000 0x78 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(lcd.o) + .text.lcd_lineH + 0x00000000 0x64 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(lcd.o) + .text.lcd_lineV + 0x00000000 0x60 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(lcd.o) + .text.lcd_line + 0x00000000 0x158 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(lcd.o) + .text.lcd_circle + 0x00000000 0x1ac C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(lcd.o) + .text.lcd_filled_circle + 0x00000000 0xd8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(lcd.o) + .text.lcd_filled_circle_on_square + 0x00000000 0xcc C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(lcd.o) + .text.lcd_empty_rectangle + 0x00000000 0x80 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(lcd.o) + .text.lcd_print_char + 0x00000000 0x10c C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(lcd.o) + .text.lcd_print + 0x00000000 0xe0 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(lcd.o) + .text.lcd_printf + 0x00000000 0x20c C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(lcd.o) + .text.read_bmp_file + 0x00000000 0x1d0 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(lcd.o) + .text.display_bitmap16 + 0x00000000 0x70 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(lcd.o) + .bss.is_scroll_setup.5885 + 0x00000000 0x1 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(lcd.o) + .bss.x.5882 0x00000000 0x4 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(lcd.o) + .data.offset.5884 + 0x00000000 0x4 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(lcd.o) + .data.y.5883 0x00000000 0x4 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(lcd.o) + .debug_macro 0x00000000 0x898 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(lcd.o) + .debug_macro 0x00000000 0x10 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(lcd.o) + .debug_macro 0x00000000 0x12d C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(lcd.o) + .debug_macro 0x00000000 0x1c C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(lcd.o) + .debug_macro 0x00000000 0x2e C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(lcd.o) + .debug_macro 0x00000000 0x5b2 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(lcd.o) + .debug_macro 0x00000000 0x18 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(lcd.o) + .debug_macro 0x00000000 0x7af C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(lcd.o) + .debug_macro 0x00000000 0x2c7 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(lcd.o) + .debug_macro 0x00000000 0x1c C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(lcd.o) + .debug_macro 0x00000000 0x22 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(lcd.o) + .debug_macro 0x00000000 0x28 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(lcd.o) + .debug_macro 0x00000000 0x1c C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(lcd.o) + .debug_macro 0x00000000 0xc2 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(lcd.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(ssp.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(ssp.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(ssp.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(ssp.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(ssp.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(ssp.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(ssp.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(ssp.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(ssp.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(ssp.o) + .text 0x00000000 0x0 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(ssp.o) + .data 0x00000000 0x0 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(ssp.o) + .bss 0x00000000 0x0 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(ssp.o) + .text.ssp_receive_buf + 0x00000000 0x70 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(ssp.o) + .debug_macro 0x00000000 0x898 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(ssp.o) + .debug_macro 0x00000000 0x1c C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(ssp.o) + .debug_macro 0x00000000 0x2e C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(ssp.o) + .debug_macro 0x00000000 0x10 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(ssp.o) + .debug_macro 0x00000000 0x12d C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(ssp.o) + .debug_macro 0x00000000 0x5b2 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(ssp.o) + .debug_macro 0x00000000 0x18 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(ssp.o) + .debug_macro 0x00000000 0x7af C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(ssp.o) + .debug_macro 0x00000000 0x2c7 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(ssp.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(I2C.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(I2C.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(I2C.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(I2C.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(I2C.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(I2C.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(I2C.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(I2C.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(I2C.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(I2C.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(I2C.o) + .text 0x00000000 0x0 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(I2C.o) + .data 0x00000000 0x0 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(I2C.o) + .bss 0x00000000 0x0 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(I2C.o) + .text.I2C_slave_read + 0x00000000 0x1c8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(I2C.o) + .text.I2C_slave_write + 0x00000000 0x168 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(I2C.o) + .debug_macro 0x00000000 0x898 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(I2C.o) + .debug_macro 0x00000000 0x1c C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(I2C.o) + .debug_macro 0x00000000 0x2e C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(I2C.o) + .debug_macro 0x00000000 0x10 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(I2C.o) + .debug_macro 0x00000000 0x12d C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(I2C.o) + .debug_macro 0x00000000 0x5b2 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(I2C.o) + .debug_macro 0x00000000 0x18 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(I2C.o) + .debug_macro 0x00000000 0x7af C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(I2C.o) + .debug_macro 0x00000000 0x2c7 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(I2C.o) + .debug_macro 0x00000000 0x22 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(I2C.o) + .debug_macro 0x00000000 0x58 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(I2C.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(fonts.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(fonts.o) + .text 0x00000000 0x0 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(fonts.o) + .data 0x00000000 0x0 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(fonts.o) + .bss 0x00000000 0x0 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(fonts.o) + .rodata.SmallFont + 0x00000000 0x478 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(fonts.o) + .rodata.BigFont + 0x00000000 0xbe4 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(fonts.o) + .rodata.SevenSegNumFont + 0x00000000 0x7d4 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(fonts.o) + .debug_info 0x00000000 0xaa C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(fonts.o) + .debug_abbrev 0x00000000 0x48 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(fonts.o) + .debug_aranges + 0x00000000 0x18 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(fonts.o) + .debug_macro 0x00000000 0x1a C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(fonts.o) + .debug_macro 0x00000000 0x898 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(fonts.o) + .debug_macro 0x00000000 0x1c C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(fonts.o) + .debug_line 0x00000000 0x7b C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(fonts.o) + .debug_str 0x00000000 0x257f C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(fonts.o) + .comment 0x00000000 0x6f C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(fonts.o) + .ARM.attributes + 0x00000000 0x33 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(fonts.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\CMSISv2p00_LPC17xx\Debug\libCMSISv2p00_LPC17xx.a(system_LPC17xx.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\CMSISv2p00_LPC17xx\Debug\libCMSISv2p00_LPC17xx.a(system_LPC17xx.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\CMSISv2p00_LPC17xx\Debug\libCMSISv2p00_LPC17xx.a(system_LPC17xx.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\CMSISv2p00_LPC17xx\Debug\libCMSISv2p00_LPC17xx.a(system_LPC17xx.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\CMSISv2p00_LPC17xx\Debug\libCMSISv2p00_LPC17xx.a(system_LPC17xx.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\CMSISv2p00_LPC17xx\Debug\libCMSISv2p00_LPC17xx.a(system_LPC17xx.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\CMSISv2p00_LPC17xx\Debug\libCMSISv2p00_LPC17xx.a(system_LPC17xx.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\CMSISv2p00_LPC17xx\Debug\libCMSISv2p00_LPC17xx.a(system_LPC17xx.o) + .group 0x00000000 0x8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\CMSISv2p00_LPC17xx\Debug\libCMSISv2p00_LPC17xx.a(system_LPC17xx.o) + .text 0x00000000 0x0 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\CMSISv2p00_LPC17xx\Debug\libCMSISv2p00_LPC17xx.a(system_LPC17xx.o) + .data 0x00000000 0x0 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\CMSISv2p00_LPC17xx\Debug\libCMSISv2p00_LPC17xx.a(system_LPC17xx.o) + .bss 0x00000000 0x0 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\CMSISv2p00_LPC17xx\Debug\libCMSISv2p00_LPC17xx.a(system_LPC17xx.o) + .text.SystemCoreClockUpdate + 0x00000000 0xb4 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\CMSISv2p00_LPC17xx\Debug\libCMSISv2p00_LPC17xx.a(system_LPC17xx.o) + .debug_macro 0x00000000 0x10 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\CMSISv2p00_LPC17xx\Debug\libCMSISv2p00_LPC17xx.a(system_LPC17xx.o) + .debug_macro 0x00000000 0x12d C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\CMSISv2p00_LPC17xx\Debug\libCMSISv2p00_LPC17xx.a(system_LPC17xx.o) + .debug_macro 0x00000000 0x5b2 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\CMSISv2p00_LPC17xx\Debug\libCMSISv2p00_LPC17xx.a(system_LPC17xx.o) + .debug_macro 0x00000000 0x1c C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\CMSISv2p00_LPC17xx\Debug\libCMSISv2p00_LPC17xx.a(system_LPC17xx.o) + .debug_macro 0x00000000 0x2e C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\CMSISv2p00_LPC17xx\Debug\libCMSISv2p00_LPC17xx.a(system_LPC17xx.o) + .debug_macro 0x00000000 0x18 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\CMSISv2p00_LPC17xx\Debug\libCMSISv2p00_LPC17xx.a(system_LPC17xx.o) + .debug_macro 0x00000000 0x7af C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\CMSISv2p00_LPC17xx\Debug\libCMSISv2p00_LPC17xx.a(system_LPC17xx.o) + .debug_macro 0x00000000 0x2c7 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\CMSISv2p00_LPC17xx\Debug\libCMSISv2p00_LPC17xx.a(system_LPC17xx.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(_cr__main.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(_cr__main.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(_cr__main.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(alloc.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(alloc.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(alloc.o) + .text.calloc 0x00000000 0x50 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(alloc.o) + .text.realloc 0x00000000 0x24 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(alloc.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(ceil.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(ceil.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(ceil.o) + .text.ceil 0x00000000 0x90 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(ceil.o) + .comment 0x00000000 0x6f c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(ceil.o) + .ARM.attributes + 0x00000000 0x33 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(ceil.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fclose.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fclose.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fclose.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fflush.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fflush.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fflush.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(floor.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(floor.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(floor.o) + .text.floor 0x00000000 0x94 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(floor.o) + .comment 0x00000000 0x6f c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(floor.o) + .ARM.attributes + 0x00000000 0x33 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(floor.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fopen.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fopen.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fopen.o) + .text.fopen 0x00000000 0x28 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fopen.o) + .comment 0x00000000 0x6f c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fopen.o) + .ARM.attributes + 0x00000000 0x33 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fopen.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fpprintf.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fpprintf.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fpprintf.o) + .text.fprintf 0x00000000 0x30 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fpprintf.o) + .text.printf_char + 0x00000000 0x34 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fpprintf.o) + .text.snprintf + 0x00000000 0x68 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fpprintf.o) + .text.vfprintf + 0x00000000 0x1c c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fpprintf.o) + .text.vprintf 0x00000000 0x24 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fpprintf.o) + .text.vsprintf + 0x00000000 0x5c c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fpprintf.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fread.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fread.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fread.o) + .text.fread 0x00000000 0x1a c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fread.o) + .comment 0x00000000 0x6f c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fread.o) + .ARM.attributes + 0x00000000 0x33 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fread.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(freopen.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(freopen.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(freopen.o) + .text.freopen 0x00000000 0x88 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(freopen.o) + .comment 0x00000000 0x6f c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(freopen.o) + .ARM.attributes + 0x00000000 0x33 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(freopen.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fseek.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fseek.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fseek.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(ftell.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(ftell.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(ftell.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(initio.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(initio.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(initio.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(printf.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(printf.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(printf.o) + .text.no_fp_display + 0x00000000 0x4 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(printf.o) + .text._fprintf + 0x00000000 0x30 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(printf.o) + .text._printf_char + 0x00000000 0x34 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(printf.o) + .text._sprintf + 0x00000000 0x6c c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(printf.o) + .text._snprintf + 0x00000000 0x68 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(printf.o) + .text._vfprintf + 0x00000000 0x20 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(printf.o) + .text._vprintf + 0x00000000 0x24 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(printf.o) + .text._vsprintf + 0x00000000 0x5c c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(printf.o) + .text._vsnprintf + 0x00000000 0x5c c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(printf.o) + .text._printf 0x00000000 0x54 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(printf.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(remove.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(remove.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(remove.o) + .text.rename 0x00000000 0x28 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(remove.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(setvbuf.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(setvbuf.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(setvbuf.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(sqrt.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(sqrt.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(sqrt.o) + .text.sqrt 0x00000000 0x11c c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(sqrt.o) + .comment 0x00000000 0x6f c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(sqrt.o) + .ARM.attributes + 0x00000000 0x33 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(sqrt.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(stdio.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(stdio.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(stdio.o) + .text.getc 0x00000000 0x18 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(stdio.o) + .text.fgetc 0x00000000 0x4 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(stdio.o) + .text.getchar 0x00000000 0x20 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(stdio.o) + .text.putc 0x00000000 0x24 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(stdio.o) + .text.fputc 0x00000000 0x4 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(stdio.o) + .text.putchar 0x00000000 0x24 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(stdio.o) + .text.feof 0x00000000 0x8 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(stdio.o) + .text.ferror 0x00000000 0x8 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(stdio.o) + .text.clearerr + 0x00000000 0xe c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(stdio.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(stdlib.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(stdlib.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(stdlib.o) + .text.__rand 0x00000000 0x20 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(stdlib.o) + .text.__srand 0x00000000 0xc c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(stdlib.o) + .text.rand 0x00000000 0x3c c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(stdlib.o) + .text.srand 0x00000000 0x40 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(stdlib.o) + .text._exit_init + 0x00000000 0xc c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(stdlib.o) + .text.atexit 0x00000000 0x24 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(stdlib.o) + .text.abort 0x00000000 0x12 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(stdlib.o) + .text.abs 0x00000000 0x8 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(stdlib.o) + .text.labs 0x00000000 0x8 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(stdlib.o) + .text.div 0x00000000 0x10 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(stdlib.o) + .text.ldiv 0x00000000 0x10 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(stdlib.o) + .data.next 0x00000000 0x4 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(stdlib.o) + .data._random_number_seed + 0x00000000 0xdc c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(stdlib.o) + .data._random_j + 0x00000000 0x4 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(stdlib.o) + .data._random_k + 0x00000000 0x4 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(stdlib.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(strlen.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(strlen.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(strlen.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(memcpy.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(memcpy.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(memcpy.o) + .text.memcpy 0x00000000 0x4 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(memcpy.o) + .comment 0x00000000 0x6f c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(memcpy.o) + .ARM.attributes + 0x00000000 0x33 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(memcpy.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(memset.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(memset.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(memset.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(__fillbuf.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(__fillbuf.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(__fillbuf.o) + .text._Csys_read_ + 0x00000000 0x22 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(__fillbuf.o) + .text.__filbuf + 0x00000000 0x178 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(__fillbuf.o) + .text._fillb2 0x00000000 0x1c c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(__fillbuf.o) + .comment 0x00000000 0x6f c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(__fillbuf.o) + .ARM.attributes + 0x00000000 0x33 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(__fillbuf.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(__init_alloc.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(__init_alloc.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(__init_alloc.o) + .text._init_alloc + 0x00000000 0x14 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(__init_alloc.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_cr_sbrk.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_cr_sbrk.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_cr_sbrk.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_deferredlazyseek.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_deferredlazyseek.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_deferredlazyseek.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_do_fflush.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_do_fflush.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_do_fflush.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_fdopen.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_fdopen.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_fdopen.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_fflush.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_fflush.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_fflush.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_frexpl.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_frexpl.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_frexpl.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_hugeval.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_hugeval.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_hugeval.o) + .rodata.__huge_val + 0x00000000 0x8 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_hugeval.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_ldexpl.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_ldexpl.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_ldexpl.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_read.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_read.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_read.o) + .text._Cread 0x00000000 0x8c c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_read.o) + .comment 0x00000000 0x6f c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_read.o) + .ARM.attributes + 0x00000000 0x33 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_read.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_writebuf.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_writebuf.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_writebuf.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(errno.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(errno.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(errno.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(raise.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(raise.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(raise.o) + .text.raise 0x00000000 0x6 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(raise.o) + .comment 0x00000000 0x6f c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(raise.o) + .ARM.attributes + 0x00000000 0x33 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(raise.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_cr_check_heap.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_cr_check_heap.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_cr_check_heap.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(division_64.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(division_64.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(division_64.o) + .text.__aeabi_division_ldivmod + 0x00000000 0x26 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(division_64.o) + .text.__aeabi_division_uldivmod + 0x00000000 0x174 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(division_64.o) + .ARM.attributes + 0x00000000 0x21 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(division_64.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(division_idiv0.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(division_idiv0.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(division_idiv0.o) + .text.__aeabi_division_idiv0 + 0x00000000 0x2 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(division_idiv0.o) + .ARM.attributes + 0x00000000 0x21 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(division_idiv0.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(double.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(double.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(double.o) + .text.__aeabi_drsub + 0x00000000 0x1c c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(double.o) + .text.__aeabi_dneg + 0x00000000 0x8 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(double.o) + .text.__aeabi_d2f + 0x00000000 0x54 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(double.o) + .text.__aeabi_d2uiz + 0x00000000 0x30 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(double.o) + .text.__aeabi_d2lz + 0x00000000 0x6a c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(double.o) + .text.__aeabi_d2ulz + 0x00000000 0x54 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(double.o) + .text.__bhs_ul2d + 0x00000000 0x88 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(double.o) + .text.__aeabi_ui2d + 0x00000000 0x8 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(double.o) + .text.__aeabi_l2d + 0x00000000 0x18 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(double.o) + .text.__aeabi_ul2d + 0x00000000 0x8 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(double.o) + .text.__aeabi_dcmpgt + 0x00000000 0x54 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(double.o) + .text.__aeabi_dcmpun + 0x00000000 0x1a c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(double.o) + .text.__aeabi_cdcmple + 0x00000000 0x24 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(double.o) + .text.__aeabi_cdrcmple + 0x00000000 0x14 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(double.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(float.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(float.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(float.o) + .text.__aeabi_fmul + 0x00000000 0xb0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(float.o) + .text.__aeabi_fdiv + 0x00000000 0xc0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(float.o) + .text.__aeabi_fsub + 0x00000000 0xe0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(float.o) + .text.__aeabi_fadd + 0x00000000 0xac c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(float.o) + .text.__aeabi_frsub + 0x00000000 0xc c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(float.o) + .text.__aeabi_fneg + 0x00000000 0x6 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(float.o) + .text.__aeabi_f2iz + 0x00000000 0x32 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(float.o) + .text.__aeabi_f2uiz + 0x00000000 0x28 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(float.o) + .text.__aeabi_f2lz + 0x00000000 0x5a c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(float.o) + .text.__aeabi_f2ulz + 0x00000000 0x3e c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(float.o) + .text.__bhs_ui2f + 0x00000000 0x26 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(float.o) + .text.__bhs_ul2f + 0x00000000 0x46 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(float.o) + .text.__aeabi_i2f + 0x00000000 0x10 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(float.o) + .text.__aeabi_ui2f + 0x00000000 0x8 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(float.o) + .text.__aeabi_l2f + 0x00000000 0x18 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(float.o) + .text.__aeabi_ul2f + 0x00000000 0x8 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(float.o) + .text.__aeabi_f2d + 0x00000000 0x38 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(float.o) + .text.__aeabi_fcmpeq + 0x00000000 0x1e c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(float.o) + .text.__aeabi_fcmplt + 0x00000000 0x3a c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(float.o) + .text.__aeabi_fcmpgt + 0x00000000 0x3a c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(float.o) + .text.__aeabi_fcmple + 0x00000000 0x3e c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(float.o) + .text.__aeabi_fcmpge + 0x00000000 0x3e c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(float.o) + .text.__aeabi_fcmpun + 0x00000000 0x1a c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(float.o) + .text.__aeabi_cfcmple + 0x00000000 0x20 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(float.o) + .text.__aeabi_cfrcmple + 0x00000000 0xa c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(float.o) + .comment 0x00000000 0x6f c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(float.o) + .ARM.attributes + 0x00000000 0x33 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(float.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(memcpy.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(memcpy.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(memcpy.o) + .text.__aeabi_memcpy + 0x00000000 0x34 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(memcpy.o) + .text.__aeabi_memmove + 0x00000000 0x1c c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(memcpy.o) + .text.__aeabi_memclr + 0x00000000 0x8 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(memcpy.o) + .text.__aeabi_memset + 0x00000000 0xa c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(memcpy.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_appexit.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_appexit.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_appexit.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_close.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_close.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_close.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_flen.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_flen.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_flen.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_istty.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_istty.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_istty.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_open.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_open.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_open.o) + .text.__sys_open + 0x00000000 0xc c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_open.o) + .ARM.attributes + 0x00000000 0x21 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_open.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_read.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_read.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_read.o) + .text.__sys_read + 0x00000000 0xc c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_read.o) + .ARM.attributes + 0x00000000 0x21 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_read.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_readc.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_readc.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_readc.o) + .text.__sys_readc + 0x00000000 0x8 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_readc.o) + .ARM.attributes + 0x00000000 0x21 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_readc.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_remove.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_remove.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_remove.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_rename.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_rename.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_rename.o) + .text.__sys_rename + 0x00000000 0xc c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_rename.o) + .ARM.attributes + 0x00000000 0x21 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_rename.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_seek.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_seek.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_seek.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_tmpnam.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_tmpnam.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_tmpnam.o) + .text 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_write.o) + .data 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_write.o) + .bss 0x00000000 0x0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_write.o) + +Memory Configuration + +Name Origin Length Attributes +MFlash512 0x00000000 0x00080000 xr +RamLoc32 0x10000000 0x00008000 xrw +RamAHB32 0x2007c000 0x00008000 xrw +*default* 0x00000000 0xffffffff + +Linker script and memory map + +LOAD ./src/cr_startup_lpc175x_6x.o +LOAD ./src/crp.o +LOAD ./src/labyrinth_slave.o +LOAD ./src/tools.o +LOAD C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a +LOAD C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\CMSISv2p00_LPC17xx\Debug\libCMSISv2p00_LPC17xx.a +START GROUP +LOAD c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a +LOAD c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a +LOAD c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a +END GROUP + 0x00000000 __base_MFlash512 = 0x0 + 0x00000000 __base_Flash = 0x0 + 0x00080000 __top_MFlash512 = 0x80000 + 0x00080000 __top_Flash = 0x80000 + 0x10000000 __base_RamLoc32 = 0x10000000 + 0x10000000 __base_RAM = 0x10000000 + 0x10008000 __top_RamLoc32 = 0x10008000 + 0x10008000 __top_RAM = 0x10008000 + 0x2007c000 __base_RamAHB32 = 0x2007c000 + 0x2007c000 __base_RAM2 = 0x2007c000 + 0x20084000 __top_RamAHB32 = 0x20084000 + 0x20084000 __top_RAM2 = 0x20084000 + +.text 0x00000000 0x3ab8 + FILL mask 0xff + 0x00000000 __vectors_start__ = ABSOLUTE (.) + *(.isr_vector) + .isr_vector 0x00000000 0xcc ./src/cr_startup_lpc175x_6x.o + 0x00000000 g_pfnVectors + 0x000000cc . = ALIGN (0x4) + 0x000000cc __section_table_start = . + 0x000000cc __data_section_table = . + 0x000000cc 0x4 LONG 0x3ab8 LOADADDR (.data) + 0x000000d0 0x4 LONG 0x10000000 ADDR (.data) + 0x000000d4 0x4 LONG 0x12c SIZEOF (.data) + 0x000000d8 0x4 LONG 0x3ab8 LOADADDR (.data_RAM2) + 0x000000dc 0x4 LONG 0x2007c000 ADDR (.data_RAM2) + 0x000000e0 0x4 LONG 0x0 SIZEOF (.data_RAM2) + 0x000000e4 __data_section_table_end = . + 0x000000e4 __bss_section_table = . + 0x000000e4 0x4 LONG 0x1000012c ADDR (.bss) + 0x000000e8 0x4 LONG 0x1dc SIZEOF (.bss) + 0x000000ec 0x4 LONG 0x2007c000 ADDR (.bss_RAM2) + 0x000000f0 0x4 LONG 0x0 SIZEOF (.bss_RAM2) + 0x000000f4 __bss_section_table_end = . + 0x000000f4 __section_table_end = . + *(.after_vectors*) + .after_vectors + 0x000000f4 0x144 ./src/cr_startup_lpc175x_6x.o + 0x000000f4 data_init + 0x00000138 bss_init + 0x00000170 ResetISR + 0x000001e8 NMI_Handler + 0x000001f0 HardFault_Handler + 0x000001f8 MemManage_Handler + 0x00000200 BusFault_Handler + 0x00000208 UsageFault_Handler + 0x00000210 SVC_Handler + 0x00000218 DebugMon_Handler + 0x00000220 PendSV_Handler + 0x00000228 SysTick_Handler + 0x00000230 EINT3_IRQHandler + 0x00000230 CANActivity_IRQHandler + 0x00000230 TIMER3_IRQHandler + 0x00000230 UART0_IRQHandler + 0x00000230 UART1_IRQHandler + 0x00000230 EINT2_IRQHandler + 0x00000230 USBActivity_IRQHandler + 0x00000230 IntDefaultHandler + 0x00000230 PLL0_IRQHandler + 0x00000230 I2C0_IRQHandler + 0x00000230 I2C1_IRQHandler + 0x00000230 SSP0_IRQHandler + 0x00000230 I2S_IRQHandler + 0x00000230 I2C2_IRQHandler + 0x00000230 RTC_IRQHandler + 0x00000230 TIMER0_IRQHandler + 0x00000230 SPI_IRQHandler + 0x00000230 RIT_IRQHandler + 0x00000230 EINT1_IRQHandler + 0x00000230 TIMER1_IRQHandler + 0x00000230 UART2_IRQHandler + 0x00000230 ADC_IRQHandler + 0x00000230 SSP1_IRQHandler + 0x00000230 USB_IRQHandler + 0x00000230 BOD_IRQHandler + 0x00000230 PLL1_IRQHandler + 0x00000230 WDT_IRQHandler + 0x00000230 PWM1_IRQHandler + 0x00000230 QEI_IRQHandler + 0x00000230 EINT0_IRQHandler + 0x00000230 CAN_IRQHandler + 0x00000230 DMA_IRQHandler + 0x00000230 TIMER2_IRQHandler + 0x00000230 UART3_IRQHandler + 0x00000230 MCPWM_IRQHandler + 0x00000230 ENET_IRQHandler + 0x000002fc . = 0x2fc + *fill* 0x00000238 0xc4 ff + 0x000002fc PROVIDE (__CRP_WORD_START__, .) + *(.crp) + .crp 0x000002fc 0x4 ./src/crp.o + 0x000002fc CRP_WORD + 0x00000300 PROVIDE (__CRP_WORD_END__, .) + 0x00000001 ASSERT (! ((__CRP_WORD_START__ == __CRP_WORD_END__)), Linker CRP Enabled, but no CRP_WORD provided within application) + *(.text*) + .text.main 0x00000300 0x30 ./src/labyrinth_slave.o + 0x00000300 main + .text.draw_labyrinth + 0x00000330 0x150 ./src/tools.o + 0x00000330 draw_labyrinth + .text.accel_write_byte + 0x00000480 0x44 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(accelerometer.o) + 0x00000480 accel_write_byte + .text.accel_read_byte + 0x000004c4 0x54 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(accelerometer.o) + 0x000004c4 accel_read_byte + .text.accel_init + 0x00000518 0xb8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(accelerometer.o) + 0x00000518 accel_init + .text.LCD_RS_ENA + 0x000005d0 0x38 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(lcd.o) + .text.LCD_RS_DIS + 0x00000608 0x38 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(lcd.o) + .text.Write_Cmd_Data + 0x00000640 0x28 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(lcd.o) + 0x00000640 Write_Cmd_Data + .text.Write_Cmd + 0x00000668 0x28 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(lcd.o) + 0x00000668 Write_Cmd + .text.Write_Data + 0x00000690 0x30 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(lcd.o) + 0x00000690 Write_Data + .text.Write_Data_U16 + 0x000006c0 0x28 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(lcd.o) + 0x000006c0 Write_Data_U16 + .text.Delay 0x000006e8 0x30 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(lcd.o) + 0x000006e8 Delay + .text.ILI9341_Initial + 0x00000718 0x220 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(lcd.o) + 0x00000718 ILI9341_Initial + .text.init_lcd + 0x00000938 0x54 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(lcd.o) + 0x00000938 init_lcd + .text.LCD_SetPos + 0x0000098c 0xb8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(lcd.o) + 0x0000098c LCD_SetPos + .text.clear_screen + 0x00000a44 0x4c C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(lcd.o) + 0x00000a44 clear_screen + .text.lcd_filled_rectangle + 0x00000a90 0xa4 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(lcd.o) + 0x00000a90 lcd_filled_rectangle + .text.ssp_init_custom + 0x00000b34 0x84 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(ssp.o) + 0x00000b34 ssp_init_custom + .text.ssp_send_buf + 0x00000bb8 0x48 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(ssp.o) + 0x00000bb8 ssp_send_buf + .text.init_i2c + 0x00000c00 0x180 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(I2C.o) + 0x00000c00 init_i2c + .text.wait_SI 0x00000d80 0x44 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(I2C.o) + 0x00000d80 wait_SI + .text.I2C_master_write + 0x00000dc4 0xec C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(I2C.o) + 0x00000dc4 I2C_master_write + .text.I2C_master_read + 0x00000eb0 0x120 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(I2C.o) + 0x00000eb0 I2C_master_read + .text.SystemInit + 0x00000fd0 0xe4 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\CMSISv2p00_LPC17xx\Debug\libCMSISv2p00_LPC17xx.a(system_LPC17xx.o) + 0x00000fd0 SystemInit + .text.__main 0x000010b4 0x14 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(_cr__main.o) + 0x000010b4 __CR_SEMIHOST + 0x000010b4 __main + .text.malloc 0x000010c8 0xc8 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(alloc.o) + 0x000010c8 malloc + .text.free 0x00001190 0x30 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(alloc.o) + 0x00001190 free + .text._Csys_alloc + 0x000011c0 0x20 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(alloc.o) + 0x000011c0 _Csys_alloc + .text.fclose 0x000011e0 0x6c c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fclose.o) + 0x000011e0 fclose + .text.fflush 0x0000124c 0x30 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fflush.o) + 0x0000124c fflush + .text.fp_round + 0x0000127c 0x4c c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fpprintf.o) + .text.pr_dec.constprop.1 + 0x000012c8 0x26 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fpprintf.o) + *fill* 0x000012ee 0x2 ff + .text.sprintf 0x000012f0 0x6c c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fpprintf.o) + 0x000012f0 sprintf + *fill* 0x0000135c 0x4 ff + .text.fp_display + 0x00001360 0x8ec c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fpprintf.o) + .text.vsnprintf + 0x00001c4c 0x5c c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fpprintf.o) + 0x00001c4c vsnprintf + .text.printf 0x00001ca8 0x54 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fpprintf.o) + 0x00001ca8 printf + .text.fseek 0x00001cfc 0x110 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fseek.o) + 0x00001cfc fseek + .text.ftell 0x00001e0c 0x4c c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(ftell.o) + 0x00001e0c ftell + .text._initio 0x00001e58 0xa4 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(initio.o) + 0x00001e58 _initio + .text._terminateio + 0x00001efc 0x44 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(initio.o) + 0x00001efc _terminateio + .text.__vfprintf + 0x00001f40 0xd28 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(printf.o) + 0x00001f40 __vfprintf + .text.remove 0x00002c68 0x14 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(remove.o) + 0x00002c68 remove + .text.setvbuf 0x00002c7c 0x40 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(setvbuf.o) + 0x00002c7c setvbuf + .text.exit 0x00002cbc 0x2c c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(stdlib.o) + 0x00002cbc exit + .text.strlen 0x00002ce8 0x4a c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(strlen.o) + 0x00002ce8 strlen + .text.memset 0x00002d32 0x4 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(memset.o) + 0x00002d32 memset + *fill* 0x00002d36 0x2 ff + .text._sbrk 0x00002d38 0x40 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_cr_sbrk.o) + 0x00002d38 _sbrk + .text._deferredlazyseek + 0x00002d78 0x44 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_deferredlazyseek.o) + 0x00002d78 _deferredlazyseek + .text.__flsbuf + 0x00002dbc 0x140 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_deferredlazyseek.o) + 0x00002dbc __flsbuf + .text._do_fflush + 0x00002efc 0x44 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_do_fflush.o) + 0x00002efc _do_fflush + .text._fdopen 0x00002f40 0x6a c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_fdopen.o) + 0x00002f40 _fdopen + .text._fflush 0x00002faa 0x58 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_fflush.o) + 0x00002faa _fflush + .text._frexpl 0x00003002 0x5a c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_frexpl.o) + 0x00003002 _frexpl + .text._ldexpl 0x0000305c 0x4c c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_ldexpl.o) + 0x0000305c _ldexpl + .text._Cwritebuf + 0x000030a8 0x68 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_writebuf.o) + 0x000030a8 _Cwritebuf + .text.__check_heap_overflow + 0x00003110 0x18 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_cr_check_heap.o) + 0x00003110 __check_heap_overflow + .text.__aeabi_dmul + 0x00003128 0x110 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(double.o) + 0x00003128 __aeabi_dmul + .text.__aeabi_ddiv + 0x00003238 0x138 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(double.o) + 0x00003238 __aeabi_ddiv + .text.__aeabi_dsub + 0x00003370 0x1a0 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(double.o) + 0x00003370 __aeabi_dsub + .text.__aeabi_dadd + 0x00003510 0x10c c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(double.o) + 0x00003510 __aeabi_dadd + .text.__aeabi_d2iz + 0x0000361c 0x40 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(double.o) + 0x0000361c __aeabi_d2iz + .text.__bhs_ui2d + 0x0000365c 0x46 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(double.o) + 0x0000365c __bhs_ui2d + .text.__aeabi_i2d + 0x000036a2 0x10 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(double.o) + 0x000036a2 __aeabi_i2d + .text.__aeabi_dcmpeq + 0x000036b2 0x2c c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(double.o) + 0x000036b2 __aeabi_dcmpeq + .text.__aeabi_dcmplt + 0x000036de 0x54 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(double.o) + 0x000036de __aeabi_dcmplt + .text.__aeabi_dcmple + 0x00003732 0x54 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(double.o) + 0x00003732 __aeabi_dcmple + .text.__aeabi_dcmpge + 0x00003786 0x54 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(double.o) + 0x00003786 __aeabi_dcmpge + .text.__aeabi_memset_lowlevel + 0x000037da 0x32 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(memcpy.o) + 0x000037da __aeabi_lowlevel_memset + .text.__sys_appexit + 0x0000380c 0xc c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_appexit.o) + 0x0000380c __sys_appexit + 0x0000380c __exit + .text.__sys_close + 0x00003818 0xc c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_close.o) + 0x00003818 __sys_close + .text.__sys_flen + 0x00003824 0xc c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_flen.o) + 0x00003824 __sys_flen + .text.__sys_istty + 0x00003830 0xc c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_istty.o) + 0x00003830 __sys_istty + .text.__sys_remove + 0x0000383c 0xc c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_remove.o) + 0x0000383c __sys_remove + .text.__sys_seek + 0x00003848 0xc c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_seek.o) + 0x00003848 __sys_seek + .text.__sys_tmpnam + 0x00003854 0xc c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_tmpnam.o) + 0x00003854 __sys_tmpnam + .text.__sys_write + 0x00003860 0xc c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_write.o) + 0x00003860 __sys_write + 0x00003860 __write + *(.rodata .rodata.* .constdata .constdata.*) + .rodata 0x0000386c 0x26 ./src/labyrinth_slave.o + *fill* 0x00003892 0x2 ff + .rodata 0x00003894 0x19b C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(lcd.o) + .rodata.str1.1 + 0x00003a2f 0x18 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(alloc.o) + .rodata.str1.1 + 0x00003a47 0x34 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fpprintf.o) + 0x35 (size before relaxing) + .rodata.str1.1 + 0x00003a7b 0x4 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(initio.o) + .rodata.str1.1 + 0x00003a7f 0x31 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(printf.o) + 0x38 (size before relaxing) + .rodata.__huge_vall + 0x00003ab0 0x8 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_hugeval.o) + 0x00003ab0 __huge_vall + 0x00003ab8 . = ALIGN (0x4) + +.glue_7 0x00003ab8 0x0 + .glue_7 0x00003ab8 0x0 linker stubs + +.glue_7t 0x00003ab8 0x0 + .glue_7t 0x00003ab8 0x0 linker stubs + +.vfp11_veneer 0x00003ab8 0x0 + .vfp11_veneer 0x00003ab8 0x0 linker stubs + +.v4_bx 0x00003ab8 0x0 + .v4_bx 0x00003ab8 0x0 linker stubs + +.iplt 0x00003ab8 0x0 + .iplt 0x00003ab8 0x0 ./src/cr_startup_lpc175x_6x.o + +.rel.dyn 0x00003ab8 0x0 + .rel.iplt 0x00003ab8 0x0 ./src/cr_startup_lpc175x_6x.o + +.ARM.extab + *(.ARM.extab* .gnu.linkonce.armextab.*) + 0x00003ab8 __exidx_start = . + +.ARM.exidx + *(.ARM.exidx* .gnu.linkonce.armexidx.*) + 0x00003ab8 __exidx_end = . + 0x00003ab8 _etext = . + +.data_RAM2 0x2007c000 0x0 load address 0x00003ab8 + FILL mask 0xff + [!provide] PROVIDE (__start_data_RAM2, .) + *(.ramfunc.$RAM2) + *(.ramfunc.$RamAHB32) + *(.data.$RAM2*) + *(.data.$RamAHB32*) + 0x2007c000 . = ALIGN (0x4) + [!provide] PROVIDE (__end_data_RAM2, .) + +.uninit_RESERVED + 0x10000000 0x0 + *(.bss.$RESERVED*) + 0x10000000 . = ALIGN (0x4) + 0x10000000 _end_uninit_RESERVED = . + +.data 0x10000000 0x12c load address 0x00003ab8 + FILL mask 0xff + 0x10000000 _data = . + *(vtable) + *(.ramfunc*) + *(.data*) + .data.labyrinth_points + 0x10000000 0x128 ./src/labyrinth_slave.o + .data.SystemCoreClock + 0x10000128 0x4 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\CMSISv2p00_LPC17xx\Debug\libCMSISv2p00_LPC17xx.a(system_LPC17xx.o) + 0x10000128 SystemCoreClock + 0x1000012c . = ALIGN (0x4) + 0x1000012c _edata = . + +.igot.plt 0x1000012c 0x0 load address 0x00003be4 + .igot.plt 0x1000012c 0x0 ./src/cr_startup_lpc175x_6x.o + +.bss_RAM2 0x2007c000 0x0 + [!provide] PROVIDE (__start_bss_RAM2, .) + *(.bss.$RAM2*) + *(.bss.$RamAHB32*) + 0x2007c000 . = ALIGN ((. != 0x0)?0x4:0x1) + [!provide] PROVIDE (__end_bss_RAM2, .) + +.bss 0x1000012c 0x1dc + 0x1000012c _bss = . + *(.bss*) + .bss.i2c_h 0x1000012c 0x4 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(accelerometer.o) + .bss._extra 0x10000130 0x4 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(initio.o) + 0x10000130 _extra + .bss.__Ciob 0x10000134 0x140 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(stdio.o) + 0x10000134 __Ciob + .bss._exitvector + 0x10000274 0x84 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(stdlib.o) + 0x10000274 _exitvector + .bss._number_of_exit_functions + 0x100002f8 0x4 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(stdlib.o) + 0x100002f8 _number_of_exit_functions + .bss.__heaps 0x100002fc 0x4 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(__init_alloc.o) + 0x100002fc __heaps + .bss.__end_of_heap + 0x10000300 0x4 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(__init_alloc.o) + 0x10000300 __end_of_heap + .bss.errno 0x10000304 0x4 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(errno.o) + 0x10000304 errno + *(COMMON) + 0x10000308 . = ALIGN (0x4) + 0x10000308 _ebss = . + [!provide] PROVIDE (end, .) + +.noinit_RAM2 0x2007c000 0x0 + *(.noinit.$RAM2*) + *(.noinit.$RamAHB32*) + 0x2007c000 . = ALIGN (0x4) + +.noinit 0x10000308 0x0 + 0x10000308 _noinit = . + *(.noinit*) + 0x10000308 . = ALIGN (0x4) + 0x10000308 _end_noinit = . + 0x10000308 PROVIDE (_pvHeapStart, DEFINED (__user_heap_base)?__user_heap_base:.) + 0x10008000 PROVIDE (_vStackTop, DEFINED (__user_stack_top)?__user_stack_top:(__top_RamLoc32 - 0x0)) + [!provide] PROVIDE (__valid_user_code_checksum, (0x0 - ((((((_vStackTop + (ResetISR + 0x1)) + (NMI_Handler + 0x1)) + (HardFault_Handler + 0x1)) + (DEFINED (MemManage_Handler)?MemManage_Handler:0x0 + 0x1)) + (DEFINED (BusFault_Handler)?BusFault_Handler:0x0 + 0x1)) + (DEFINED (UsageFault_Handler)?UsageFault_Handler:0x0 + 0x1)))) +OUTPUT(TP1_labyrinth_slave_etu.axf elf32-littlearm) + +.debug_info 0x00000000 0x2d38 + .debug_info 0x00000000 0x250 ./src/cr_startup_lpc175x_6x.o + .debug_info 0x00000250 0x3f ./src/crp.o + .debug_info 0x0000028f 0x133 ./src/labyrinth_slave.o + .debug_info 0x000003c2 0x2a0 ./src/tools.o + .debug_info 0x00000662 0x362 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(accelerometer.o) + .debug_info 0x000009c4 0x127b C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(lcd.o) + .debug_info 0x00001c3f 0x5ab C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(ssp.o) + .debug_info 0x000021ea 0x836 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(I2C.o) + .debug_info 0x00002a20 0x318 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\CMSISv2p00_LPC17xx\Debug\libCMSISv2p00_LPC17xx.a(system_LPC17xx.o) + +.debug_abbrev 0x00000000 0xa8a + .debug_abbrev 0x00000000 0xf5 ./src/cr_startup_lpc175x_6x.o + .debug_abbrev 0x000000f5 0x36 ./src/crp.o + .debug_abbrev 0x0000012b 0xe8 ./src/labyrinth_slave.o + .debug_abbrev 0x00000213 0x122 ./src/tools.o + .debug_abbrev 0x00000335 0x111 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(accelerometer.o) + .debug_abbrev 0x00000446 0x274 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(lcd.o) + .debug_abbrev 0x000006ba 0x13a C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(ssp.o) + .debug_abbrev 0x000007f4 0x1b0 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(I2C.o) + .debug_abbrev 0x000009a4 0xe6 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\CMSISv2p00_LPC17xx\Debug\libCMSISv2p00_LPC17xx.a(system_LPC17xx.o) + +.debug_aranges 0x00000000 0x2d8 + .debug_aranges + 0x00000000 0x80 ./src/cr_startup_lpc175x_6x.o + .debug_aranges + 0x00000080 0x18 ./src/crp.o + .debug_aranges + 0x00000098 0x28 ./src/labyrinth_slave.o + .debug_aranges + 0x000000c0 0x30 ./src/tools.o + .debug_aranges + 0x000000f0 0x38 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(accelerometer.o) + .debug_aranges + 0x00000128 0x110 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(lcd.o) + .debug_aranges + 0x00000238 0x30 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(ssp.o) + .debug_aranges + 0x00000268 0x48 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(I2C.o) + .debug_aranges + 0x000002b0 0x28 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\CMSISv2p00_LPC17xx\Debug\libCMSISv2p00_LPC17xx.a(system_LPC17xx.o) + +.debug_ranges 0x00000000 0x270 + .debug_ranges 0x00000000 0x70 ./src/cr_startup_lpc175x_6x.o + .debug_ranges 0x00000070 0x18 ./src/labyrinth_slave.o + .debug_ranges 0x00000088 0x20 ./src/tools.o + .debug_ranges 0x000000a8 0x28 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(accelerometer.o) + .debug_ranges 0x000000d0 0x130 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(lcd.o) + .debug_ranges 0x00000200 0x20 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(ssp.o) + .debug_ranges 0x00000220 0x38 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(I2C.o) + .debug_ranges 0x00000258 0x18 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\CMSISv2p00_LPC17xx\Debug\libCMSISv2p00_LPC17xx.a(system_LPC17xx.o) + +.debug_macro 0x00000000 0x3819 + .debug_macro 0x00000000 0x1d ./src/cr_startup_lpc175x_6x.o + .debug_macro 0x0000001d 0x892 ./src/cr_startup_lpc175x_6x.o + .debug_macro 0x000008af 0x1a ./src/crp.o + .debug_macro 0x000008c9 0x34 ./src/crp.o + .debug_macro 0x000008fd 0x118 ./src/labyrinth_slave.o + .debug_macro 0x00000a15 0x1c ./src/labyrinth_slave.o + .debug_macro 0x00000a31 0x2e ./src/labyrinth_slave.o + .debug_macro 0x00000a5f 0x10 ./src/labyrinth_slave.o + .debug_macro 0x00000a6f 0x12d ./src/labyrinth_slave.o + .debug_macro 0x00000b9c 0x5b2 ./src/labyrinth_slave.o + .debug_macro 0x0000114e 0x18 ./src/labyrinth_slave.o + .debug_macro 0x00001166 0x7af ./src/labyrinth_slave.o + .debug_macro 0x00001915 0x2c7 ./src/labyrinth_slave.o + .debug_macro 0x00001bdc 0x22 ./src/labyrinth_slave.o + .debug_macro 0x00001bfe 0xa0 ./src/labyrinth_slave.o + .debug_macro 0x00001c9e 0x82 ./src/labyrinth_slave.o + .debug_macro 0x00001d20 0x1c ./src/labyrinth_slave.o + .debug_macro 0x00001d3c 0x28 ./src/labyrinth_slave.o + .debug_macro 0x00001d64 0x1c ./src/labyrinth_slave.o + .debug_macro 0x00001d80 0xc2 ./src/labyrinth_slave.o + .debug_macro 0x00001e42 0xd6 ./src/labyrinth_slave.o + .debug_macro 0x00001f18 0x22 ./src/labyrinth_slave.o + .debug_macro 0x00001f3a 0xc0 ./src/tools.o + .debug_macro 0x00001ffa 0xc4 ./src/tools.o + .debug_macro 0x000020be 0x1c ./src/tools.o + .debug_macro 0x000020da 0xaf C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(accelerometer.o) + .debug_macro 0x00002189 0x898 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(accelerometer.o) + .debug_macro 0x00002a21 0x28 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(accelerometer.o) + .debug_macro 0x00002a49 0x58 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(accelerometer.o) + .debug_macro 0x00002aa1 0x108 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(lcd.o) + .debug_macro 0x00002ba9 0x9a C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(lcd.o) + .debug_macro 0x00002c43 0x22 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(lcd.o) + .debug_macro 0x00002c65 0xc4 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(lcd.o) + .debug_macro 0x00002d29 0x90 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(ssp.o) + .debug_macro 0x00002db9 0x22 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(ssp.o) + .debug_macro 0x00002ddb 0x8d C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(I2C.o) + .debug_macro 0x00002e68 0x12b C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\CMSISv2p00_LPC17xx\Debug\libCMSISv2p00_LPC17xx.a(system_LPC17xx.o) + .debug_macro 0x00002f93 0x886 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\CMSISv2p00_LPC17xx\Debug\libCMSISv2p00_LPC17xx.a(system_LPC17xx.o) + +.debug_line 0x00000000 0x18fd + .debug_line 0x00000000 0xd5 ./src/cr_startup_lpc175x_6x.o + .debug_line 0x000000d5 0x78 ./src/crp.o + .debug_line 0x0000014d 0x28f ./src/labyrinth_slave.o + .debug_line 0x000003dc 0x327 ./src/tools.o + .debug_line 0x00000703 0x289 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(accelerometer.o) + .debug_line 0x0000098c 0x7fc C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(lcd.o) + .debug_line 0x00001188 0x24a C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(ssp.o) + .debug_line 0x000013d2 0x358 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(I2C.o) + .debug_line 0x0000172a 0x1d3 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\CMSISv2p00_LPC17xx\Debug\libCMSISv2p00_LPC17xx.a(system_LPC17xx.o) + +.debug_str 0x00000000 0xa65e + .debug_str 0x00000000 0x26af ./src/cr_startup_lpc175x_6x.o + 0x26c2 (size before relaxing) + .debug_str 0x000026af 0xe9 ./src/crp.o + 0x25da (size before relaxing) + .debug_str 0x00002798 0x68c9 ./src/labyrinth_slave.o + 0x8df5 (size before relaxing) + .debug_str 0x00009061 0x5a7 ./src/tools.o + 0x88a4 (size before relaxing) + .debug_str 0x00009608 0x300 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(accelerometer.o) + 0x83a7 (size before relaxing) + .debug_str 0x00009908 0x552 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(lcd.o) + 0x8ffe (size before relaxing) + .debug_str 0x00009e5a 0x2fa C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(ssp.o) + 0x80da (size before relaxing) + .debug_str 0x0000a154 0x10a C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(I2C.o) + 0x8278 (size before relaxing) + .debug_str 0x0000a25e 0x400 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\CMSISv2p00_LPC17xx\Debug\libCMSISv2p00_LPC17xx.a(system_LPC17xx.o) + 0x8146 (size before relaxing) + +.comment 0x00000000 0xdc + .comment 0x00000000 0x6e ./src/cr_startup_lpc175x_6x.o + 0x6f (size before relaxing) + .comment 0x0000006e 0x6f ./src/crp.o + .comment 0x0000006e 0x6f ./src/labyrinth_slave.o + .comment 0x0000006e 0x6f ./src/tools.o + .comment 0x0000006e 0x6f C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(accelerometer.o) + .comment 0x0000006e 0x6f C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(lcd.o) + .comment 0x0000006e 0x6f C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(ssp.o) + .comment 0x0000006e 0x6f C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(I2C.o) + .comment 0x0000006e 0x6f C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\CMSISv2p00_LPC17xx\Debug\libCMSISv2p00_LPC17xx.a(system_LPC17xx.o) + .comment 0x0000006e 0x6e c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(_cr__main.o) + 0x6f (size before relaxing) + .comment 0x000000dc 0x6f c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(alloc.o) + .comment 0x000000dc 0x6f c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fclose.o) + .comment 0x000000dc 0x6f c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fflush.o) + .comment 0x000000dc 0x6f c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fpprintf.o) + .comment 0x000000dc 0x6f c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fseek.o) + .comment 0x000000dc 0x6f c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(ftell.o) + .comment 0x000000dc 0x6f c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(initio.o) + .comment 0x000000dc 0x6f c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(printf.o) + .comment 0x000000dc 0x6f c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(remove.o) + .comment 0x000000dc 0x6f c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(setvbuf.o) + .comment 0x000000dc 0x6f c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(stdio.o) + .comment 0x000000dc 0x6f c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(stdlib.o) + .comment 0x000000dc 0x6f c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(strlen.o) + .comment 0x000000dc 0x6f c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(memset.o) + .comment 0x000000dc 0x6f c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(__init_alloc.o) + .comment 0x000000dc 0x6f c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_cr_sbrk.o) + .comment 0x000000dc 0x6f c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_deferredlazyseek.o) + .comment 0x000000dc 0x6f c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_do_fflush.o) + .comment 0x000000dc 0x6f c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_fdopen.o) + .comment 0x000000dc 0x6f c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_fflush.o) + .comment 0x000000dc 0x6f c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_frexpl.o) + .comment 0x000000dc 0x6f c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_hugeval.o) + .comment 0x000000dc 0x6f c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_ldexpl.o) + .comment 0x000000dc 0x6f c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_writebuf.o) + .comment 0x000000dc 0x6f c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(errno.o) + .comment 0x000000dc 0x6f c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_cr_check_heap.o) + .comment 0x000000dc 0x6f c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(double.o) + +.ARM.attributes + 0x00000000 0x31 + .ARM.attributes + 0x00000000 0x33 ./src/cr_startup_lpc175x_6x.o + .ARM.attributes + 0x00000033 0x33 ./src/crp.o + .ARM.attributes + 0x00000066 0x33 ./src/labyrinth_slave.o + .ARM.attributes + 0x00000099 0x33 ./src/tools.o + .ARM.attributes + 0x000000cc 0x33 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(accelerometer.o) + .ARM.attributes + 0x000000ff 0x33 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(lcd.o) + .ARM.attributes + 0x00000132 0x33 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(ssp.o) + .ARM.attributes + 0x00000165 0x33 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(I2C.o) + .ARM.attributes + 0x00000198 0x33 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\CMSISv2p00_LPC17xx\Debug\libCMSISv2p00_LPC17xx.a(system_LPC17xx.o) + .ARM.attributes + 0x000001cb 0x33 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(_cr__main.o) + .ARM.attributes + 0x000001fe 0x33 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(alloc.o) + .ARM.attributes + 0x00000231 0x33 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fclose.o) + .ARM.attributes + 0x00000264 0x33 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fflush.o) + .ARM.attributes + 0x00000297 0x33 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fpprintf.o) + .ARM.attributes + 0x000002ca 0x33 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(fseek.o) + .ARM.attributes + 0x000002fd 0x33 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(ftell.o) + .ARM.attributes + 0x00000330 0x33 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(initio.o) + .ARM.attributes + 0x00000363 0x33 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(printf.o) + .ARM.attributes + 0x00000396 0x33 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(remove.o) + .ARM.attributes + 0x000003c9 0x33 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(setvbuf.o) + .ARM.attributes + 0x000003fc 0x33 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(stdio.o) + .ARM.attributes + 0x0000042f 0x33 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(stdlib.o) + .ARM.attributes + 0x00000462 0x33 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(strlen.o) + .ARM.attributes + 0x00000495 0x33 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(memset.o) + .ARM.attributes + 0x000004c8 0x33 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(__init_alloc.o) + .ARM.attributes + 0x000004fb 0x33 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_cr_sbrk.o) + .ARM.attributes + 0x0000052e 0x33 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_deferredlazyseek.o) + .ARM.attributes + 0x00000561 0x33 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_do_fflush.o) + .ARM.attributes + 0x00000594 0x33 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_fdopen.o) + .ARM.attributes + 0x000005c7 0x33 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_fflush.o) + .ARM.attributes + 0x000005fa 0x33 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_frexpl.o) + .ARM.attributes + 0x0000062d 0x33 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_hugeval.o) + .ARM.attributes + 0x00000660 0x33 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_ldexpl.o) + .ARM.attributes + 0x00000693 0x33 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_writebuf.o) + .ARM.attributes + 0x000006c6 0x33 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(errno.o) + .ARM.attributes + 0x000006f9 0x33 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_c.a(_cr_check_heap.o) + .ARM.attributes + 0x0000072c 0x33 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(double.o) + .ARM.attributes + 0x0000075f 0x21 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m\libcr_eabihelpers.a(memcpy.o) + .ARM.attributes + 0x00000780 0x21 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_appexit.o) + .ARM.attributes + 0x000007a1 0x21 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_close.o) + .ARM.attributes + 0x000007c2 0x21 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_flen.o) + .ARM.attributes + 0x000007e3 0x21 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_istty.o) + .ARM.attributes + 0x00000804 0x21 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_remove.o) + .ARM.attributes + 0x00000825 0x21 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_seek.o) + .ARM.attributes + 0x00000846 0x21 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_tmpnam.o) + .ARM.attributes + 0x00000867 0x21 c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libcr_semihost.a(__sys_write.o) + +.debug_frame 0x00000000 0x93c + .debug_frame 0x00000000 0x170 ./src/cr_startup_lpc175x_6x.o + .debug_frame 0x00000170 0x54 ./src/labyrinth_slave.o + .debug_frame 0x000001c4 0x90 ./src/tools.o + .debug_frame 0x00000254 0xa0 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(accelerometer.o) + .debug_frame 0x000002f4 0x48c C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(lcd.o) + .debug_frame 0x00000780 0x88 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(ssp.o) + .debug_frame 0x00000808 0xf8 C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug\libMyLab_lib.a(I2C.o) + .debug_frame 0x00000900 0x3c C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\CMSISv2p00_LPC17xx\Debug\libCMSISv2p00_LPC17xx.a(system_LPC17xx.o) diff --git a/TP1_labyrinth_slave_etu/Debug/TP1_labyrinth_slave_ref.axf b/TP1_labyrinth_slave_etu/Debug/TP1_labyrinth_slave_ref.axf new file mode 100644 index 0000000000000000000000000000000000000000..91185f24e048658ea9856d999c6ebdc0aa8746ce Binary files /dev/null and b/TP1_labyrinth_slave_etu/Debug/TP1_labyrinth_slave_ref.axf differ diff --git a/TP1_labyrinth_slave_etu/Debug/libMyLab_lib.a b/TP1_labyrinth_slave_etu/Debug/libMyLab_lib.a new file mode 100644 index 0000000000000000000000000000000000000000..a1719c2b85c94b5e654936c41a3f48c616a4ae6a Binary files /dev/null and b/TP1_labyrinth_slave_etu/Debug/libMyLab_lib.a differ diff --git a/TP1_labyrinth_slave_etu/Debug/makefile b/TP1_labyrinth_slave_etu/Debug/makefile new file mode 100644 index 0000000000000000000000000000000000000000..f02c0d316222843958035ae07f7b746574c9e079 --- /dev/null +++ b/TP1_labyrinth_slave_etu/Debug/makefile @@ -0,0 +1,50 @@ +################################################################################ +# Automatically-generated file. Do not edit! +################################################################################ + +-include ../makefile.init + +RM := rm -rf + +# All of the sources participating in the build are defined here +-include sources.mk +-include src/subdir.mk +-include subdir.mk +-include objects.mk + +ifneq ($(MAKECMDGOALS),clean) +ifneq ($(strip $(C_DEPS)),) +-include $(C_DEPS) +endif +endif + +-include ../makefile.defs + +# Add inputs and outputs from these tool invocations to the build variables + +# All Target +all: TP1_labyrinth_slave_etu.axf + +# Tool invocations +TP1_labyrinth_slave_etu.axf: $(OBJS) $(USER_OBJS) + @echo 'Building target: $@' + @echo 'Invoking: MCU Linker' + arm-none-eabi-gcc -nostdlib -L"C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\TP1_labyrinth_slave_etu\Debug" -L"C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\CMSISv2p00_LPC17xx\Debug" -Xlinker -Map="TP1_labyrinth_slave_etu.map" -Xlinker --gc-sections -mcpu=cortex-m3 -mthumb -T "Labo4_langton_Debug.ld" -o "TP1_labyrinth_slave_etu.axf" $(OBJS) $(USER_OBJS) $(LIBS) + @echo 'Finished building target: $@' + @echo ' ' + $(MAKE) --no-print-directory post-build + +# Other Targets +clean: + -$(RM) $(EXECUTABLES)$(OBJS)$(C_DEPS) TP1_labyrinth_slave_etu.axf + -@echo ' ' + +post-build: + -@echo 'Performing post-build steps' + -arm-none-eabi-size "TP1_labyrinth_slave_etu.axf"; # arm-none-eabi-objcopy -v -O binary "TP1_labyrinth_slave_etu.axf" "TP1_labyrinth_slave_etu.bin" ; # checksum -p LPC1769 -d "TP1_labyrinth_slave_etu.bin"; + -@echo ' ' + +.PHONY: all clean dependents +.SECONDARY: post-build + +-include ../makefile.targets diff --git a/TP1_labyrinth_slave_etu/Debug/objects.mk b/TP1_labyrinth_slave_etu/Debug/objects.mk new file mode 100644 index 0000000000000000000000000000000000000000..17104bb69fe4e96fa80fd07d522c74dde40ac48f --- /dev/null +++ b/TP1_labyrinth_slave_etu/Debug/objects.mk @@ -0,0 +1,8 @@ +################################################################################ +# Automatically-generated file. Do not edit! +################################################################################ + +USER_OBJS := + +LIBS := -lMyLab_lib -lCMSISv2p00_LPC17xx + diff --git a/TP1_labyrinth_slave_etu/Debug/sources.mk b/TP1_labyrinth_slave_etu/Debug/sources.mk new file mode 100644 index 0000000000000000000000000000000000000000..2cc4ffba0948b388b04e3155f014047ab0417a1d --- /dev/null +++ b/TP1_labyrinth_slave_etu/Debug/sources.mk @@ -0,0 +1,18 @@ +################################################################################ +# Automatically-generated file. Do not edit! +################################################################################ + +OBJ_SRCS := +S_SRCS := +ASM_SRCS := +C_SRCS := +S_UPPER_SRCS := +O_SRCS := +EXECUTABLES := +OBJS := +C_DEPS := + +# Every subdirectory with source files must be described here +SUBDIRS := \ +src \ + diff --git a/TP1_labyrinth_slave_etu/Debug/src/Labo1_mylab2_correction2.d b/TP1_labyrinth_slave_etu/Debug/src/Labo1_mylab2_correction2.d new file mode 100644 index 0000000000000000000000000000000000000000..80adc3dc808bc3999246143ce21762328667fa6a --- /dev/null +++ b/TP1_labyrinth_slave_etu/Debug/src/Labo1_mylab2_correction2.d @@ -0,0 +1,26 @@ +src/Labo1_mylab2_correction2.o src/Labo1_mylab2_correction2.d: \ + ../src/Labo1_mylab2_correction2.c \ + C:\Users\Vincent\Documents\LPCXpresso_5.2.6_2137\snu\CMSISv2p00_LPC17xx\inc/LPC17xx.h \ + C:\Users\Vincent\Documents\LPCXpresso_5.2.6_2137\snu\CMSISv2p00_LPC17xx\inc/core_cm3.h \ + C:\Users\Vincent\Documents\LPCXpresso_5.2.6_2137\snu\CMSISv2p00_LPC17xx\inc/core_cmInstr.h \ + C:\Users\Vincent\Documents\LPCXpresso_5.2.6_2137\snu\CMSISv2p00_LPC17xx\inc/core_cmFunc.h \ + C:\Users\Vincent\Documents\LPCXpresso_5.2.6_2137\snu\CMSISv2p00_LPC17xx\inc/system_LPC17xx.h \ + C:\Users\Vincent\Documents\LPCXpresso_5.2.6_2137\snu\MyLab_lib\inc/lcd.h \ + C:\Users\Vincent\Documents\LPCXpresso_5.2.6_2137\snu\MyLab_lib\inc/ssp.h \ + C:\Users\Vincent\Documents\LPCXpresso_5.2.6_2137\snu\MyLab_lib\inc/fonts.h + +C:\Users\Vincent\Documents\LPCXpresso_5.2.6_2137\snu\CMSISv2p00_LPC17xx\inc/LPC17xx.h: + +C:\Users\Vincent\Documents\LPCXpresso_5.2.6_2137\snu\CMSISv2p00_LPC17xx\inc/core_cm3.h: + +C:\Users\Vincent\Documents\LPCXpresso_5.2.6_2137\snu\CMSISv2p00_LPC17xx\inc/core_cmInstr.h: + +C:\Users\Vincent\Documents\LPCXpresso_5.2.6_2137\snu\CMSISv2p00_LPC17xx\inc/core_cmFunc.h: + +C:\Users\Vincent\Documents\LPCXpresso_5.2.6_2137\snu\CMSISv2p00_LPC17xx\inc/system_LPC17xx.h: + +C:\Users\Vincent\Documents\LPCXpresso_5.2.6_2137\snu\MyLab_lib\inc/lcd.h: + +C:\Users\Vincent\Documents\LPCXpresso_5.2.6_2137\snu\MyLab_lib\inc/ssp.h: + +C:\Users\Vincent\Documents\LPCXpresso_5.2.6_2137\snu\MyLab_lib\inc/fonts.h: diff --git a/TP1_labyrinth_slave_etu/Debug/src/Labo1_mylab2_correction2.o b/TP1_labyrinth_slave_etu/Debug/src/Labo1_mylab2_correction2.o new file mode 100644 index 0000000000000000000000000000000000000000..6008df21886f74bdbae56ef310af70f69b9dc262 Binary files /dev/null and b/TP1_labyrinth_slave_etu/Debug/src/Labo1_mylab2_correction2.o differ diff --git a/TP1_labyrinth_slave_etu/Debug/src/Labo2_mylab2_correction2.d b/TP1_labyrinth_slave_etu/Debug/src/Labo2_mylab2_correction2.d new file mode 100644 index 0000000000000000000000000000000000000000..67614e0598d5e4ca9562ad871354b8394775e57e --- /dev/null +++ b/TP1_labyrinth_slave_etu/Debug/src/Labo2_mylab2_correction2.d @@ -0,0 +1,24 @@ +src/Labo2_mylab2_correction2.o src/Labo2_mylab2_correction2.d: \ + ../src/Labo2_mylab2_correction2.c \ + C:\Users\Vincent\Documents\LPCXpresso_5.2.6_2137\snu\CMSISv2p00_LPC17xx\inc/LPC17xx.h \ + C:\Users\Vincent\Documents\LPCXpresso_5.2.6_2137\snu\CMSISv2p00_LPC17xx\inc/core_cm3.h \ + C:\Users\Vincent\Documents\LPCXpresso_5.2.6_2137\snu\CMSISv2p00_LPC17xx\inc/core_cmInstr.h \ + C:\Users\Vincent\Documents\LPCXpresso_5.2.6_2137\snu\CMSISv2p00_LPC17xx\inc/core_cmFunc.h \ + C:\Users\Vincent\Documents\LPCXpresso_5.2.6_2137\snu\CMSISv2p00_LPC17xx\inc/system_LPC17xx.h \ + ../src/lcd.h ../src/ssp.h ../src/fonts.h + +C:\Users\Vincent\Documents\LPCXpresso_5.2.6_2137\snu\CMSISv2p00_LPC17xx\inc/LPC17xx.h: + +C:\Users\Vincent\Documents\LPCXpresso_5.2.6_2137\snu\CMSISv2p00_LPC17xx\inc/core_cm3.h: + +C:\Users\Vincent\Documents\LPCXpresso_5.2.6_2137\snu\CMSISv2p00_LPC17xx\inc/core_cmInstr.h: + +C:\Users\Vincent\Documents\LPCXpresso_5.2.6_2137\snu\CMSISv2p00_LPC17xx\inc/core_cmFunc.h: + +C:\Users\Vincent\Documents\LPCXpresso_5.2.6_2137\snu\CMSISv2p00_LPC17xx\inc/system_LPC17xx.h: + +../src/lcd.h: + +../src/ssp.h: + +../src/fonts.h: diff --git a/TP1_labyrinth_slave_etu/Debug/src/Labo2_mylab2_correction2.o b/TP1_labyrinth_slave_etu/Debug/src/Labo2_mylab2_correction2.o new file mode 100644 index 0000000000000000000000000000000000000000..3ae29261285f42a317c5dd5e4c768cf0ec19daa1 Binary files /dev/null and b/TP1_labyrinth_slave_etu/Debug/src/Labo2_mylab2_correction2.o differ diff --git a/TP1_labyrinth_slave_etu/Debug/src/Labo4_mylab2_correction.d b/TP1_labyrinth_slave_etu/Debug/src/Labo4_mylab2_correction.d new file mode 100644 index 0000000000000000000000000000000000000000..a8c4af5730be10cad13d8e100a47a5e4c5496e8b --- /dev/null +++ b/TP1_labyrinth_slave_etu/Debug/src/Labo4_mylab2_correction.d @@ -0,0 +1,24 @@ +src/Labo4_mylab2_correction.o src/Labo4_mylab2_correction.d: \ + ../src/Labo4_mylab2_correction.c \ + C:\Users\pillouxv\Documents\Hepia\LPCXpresso_5.2.6_2137\snu\CMSISv2p00_LPC17xx\inc/LPC17xx.h \ + C:\Users\pillouxv\Documents\Hepia\LPCXpresso_5.2.6_2137\snu\CMSISv2p00_LPC17xx\inc/core_cm3.h \ + C:\Users\pillouxv\Documents\Hepia\LPCXpresso_5.2.6_2137\snu\CMSISv2p00_LPC17xx\inc/core_cmInstr.h \ + C:\Users\pillouxv\Documents\Hepia\LPCXpresso_5.2.6_2137\snu\CMSISv2p00_LPC17xx\inc/core_cmFunc.h \ + C:\Users\pillouxv\Documents\Hepia\LPCXpresso_5.2.6_2137\snu\CMSISv2p00_LPC17xx\inc/system_LPC17xx.h \ + ../src/lcd.h ../src/ssp.h ../src/fonts.h + +C:\Users\pillouxv\Documents\Hepia\LPCXpresso_5.2.6_2137\snu\CMSISv2p00_LPC17xx\inc/LPC17xx.h: + +C:\Users\pillouxv\Documents\Hepia\LPCXpresso_5.2.6_2137\snu\CMSISv2p00_LPC17xx\inc/core_cm3.h: + +C:\Users\pillouxv\Documents\Hepia\LPCXpresso_5.2.6_2137\snu\CMSISv2p00_LPC17xx\inc/core_cmInstr.h: + +C:\Users\pillouxv\Documents\Hepia\LPCXpresso_5.2.6_2137\snu\CMSISv2p00_LPC17xx\inc/core_cmFunc.h: + +C:\Users\pillouxv\Documents\Hepia\LPCXpresso_5.2.6_2137\snu\CMSISv2p00_LPC17xx\inc/system_LPC17xx.h: + +../src/lcd.h: + +../src/ssp.h: + +../src/fonts.h: diff --git a/TP1_labyrinth_slave_etu/Debug/src/Labo4_mylab2_correction.o b/TP1_labyrinth_slave_etu/Debug/src/Labo4_mylab2_correction.o new file mode 100644 index 0000000000000000000000000000000000000000..60ac82dd8cf275a88c6231bd0f18379a9308cb6d Binary files /dev/null and b/TP1_labyrinth_slave_etu/Debug/src/Labo4_mylab2_correction.o differ diff --git a/TP1_labyrinth_slave_etu/Debug/src/cr_startup_lpc175x_6x.d b/TP1_labyrinth_slave_etu/Debug/src/cr_startup_lpc175x_6x.d new file mode 100644 index 0000000000000000000000000000000000000000..f77cbd4abad2ce1b198bac637d891975acdf7d09 --- /dev/null +++ b/TP1_labyrinth_slave_etu/Debug/src/cr_startup_lpc175x_6x.d @@ -0,0 +1,2 @@ +src/cr_startup_lpc175x_6x.o src/cr_startup_lpc175x_6x.d: \ + ../src/cr_startup_lpc175x_6x.c diff --git a/TP1_labyrinth_slave_etu/Debug/src/cr_startup_lpc175x_6x.o b/TP1_labyrinth_slave_etu/Debug/src/cr_startup_lpc175x_6x.o new file mode 100644 index 0000000000000000000000000000000000000000..f58840b00e351ef0994a1731dedfdbe15fb1c8ee Binary files /dev/null and b/TP1_labyrinth_slave_etu/Debug/src/cr_startup_lpc175x_6x.o differ diff --git a/TP1_labyrinth_slave_etu/Debug/src/crp.d b/TP1_labyrinth_slave_etu/Debug/src/crp.d new file mode 100644 index 0000000000000000000000000000000000000000..2548921148dc0a7e5b2bcf79589c12760157b399 --- /dev/null +++ b/TP1_labyrinth_slave_etu/Debug/src/crp.d @@ -0,0 +1 @@ +src/crp.o src/crp.d: ../src/crp.c diff --git a/TP1_labyrinth_slave_etu/Debug/src/crp.o b/TP1_labyrinth_slave_etu/Debug/src/crp.o new file mode 100644 index 0000000000000000000000000000000000000000..34563a69e3ea18ccb5fc4be4cad35d8f9e768831 Binary files /dev/null and b/TP1_labyrinth_slave_etu/Debug/src/crp.o differ diff --git a/TP1_labyrinth_slave_etu/Debug/src/labyrinth_slave.d b/TP1_labyrinth_slave_etu/Debug/src/labyrinth_slave.d new file mode 100644 index 0000000000000000000000000000000000000000..be1af7cef27c96c4877bba0a5be694ad043a5fc1 --- /dev/null +++ b/TP1_labyrinth_slave_etu/Debug/src/labyrinth_slave.d @@ -0,0 +1,30 @@ +src/labyrinth_slave.o src/labyrinth_slave.d: ../src/labyrinth_slave.c \ + C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\CMSISv2p00_LPC17xx\inc/LPC17xx.h \ + C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\CMSISv2p00_LPC17xx\inc/core_cm3.h \ + C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\CMSISv2p00_LPC17xx\inc/core_cmInstr.h \ + C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\CMSISv2p00_LPC17xx\inc/core_cmFunc.h \ + C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\CMSISv2p00_LPC17xx\inc/system_LPC17xx.h \ + ../src/lcd.h ../src/ssp.h ../src/fonts.h ../src/accelerometer.h \ + ../src/ethernet_mgt.h ../src/tools.h + +C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\CMSISv2p00_LPC17xx\inc/LPC17xx.h: + +C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\CMSISv2p00_LPC17xx\inc/core_cm3.h: + +C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\CMSISv2p00_LPC17xx\inc/core_cmInstr.h: + +C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\CMSISv2p00_LPC17xx\inc/core_cmFunc.h: + +C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\CMSISv2p00_LPC17xx\inc/system_LPC17xx.h: + +../src/lcd.h: + +../src/ssp.h: + +../src/fonts.h: + +../src/accelerometer.h: + +../src/ethernet_mgt.h: + +../src/tools.h: diff --git a/TP1_labyrinth_slave_etu/Debug/src/labyrinth_slave.o b/TP1_labyrinth_slave_etu/Debug/src/labyrinth_slave.o new file mode 100644 index 0000000000000000000000000000000000000000..4b647049efb0027404b29ef2fea81beb2d0af587 Binary files /dev/null and b/TP1_labyrinth_slave_etu/Debug/src/labyrinth_slave.o differ diff --git a/TP1_labyrinth_slave_etu/Debug/src/subdir.mk b/TP1_labyrinth_slave_etu/Debug/src/subdir.mk new file mode 100644 index 0000000000000000000000000000000000000000..599854070823db3b76ed07e704b78dfa1b4e0d25 --- /dev/null +++ b/TP1_labyrinth_slave_etu/Debug/src/subdir.mk @@ -0,0 +1,33 @@ +################################################################################ +# Automatically-generated file. Do not edit! +################################################################################ + +# Add inputs and outputs from these tool invocations to the build variables +C_SRCS += \ +../src/cr_startup_lpc175x_6x.c \ +../src/crp.c \ +../src/labyrinth_slave.c \ +../src/tools.c + +OBJS += \ +./src/cr_startup_lpc175x_6x.o \ +./src/crp.o \ +./src/labyrinth_slave.o \ +./src/tools.o + +C_DEPS += \ +./src/cr_startup_lpc175x_6x.d \ +./src/crp.d \ +./src/labyrinth_slave.d \ +./src/tools.d + + +# Each subdirectory must supply rules for building sources it contributes +src/%.o: ../src/%.c + @echo 'Building file: $<' + @echo 'Invoking: MCU C Compiler' + arm-none-eabi-gcc -D__REDLIB__ -DDEBUG -D__CODE_RED -DCORE_M3 -D__USE_CMSIS=CMSIS_CORE_LPC17xx -D__LPC17XX__ -I"C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\CMSISv2p00_LPC17xx\inc" -O0 -g3 -Wall -c -fmessage-length=0 -fno-builtin -ffunction-sections -fdata-sections -mcpu=cortex-m3 -mthumb -D__REDLIB__ -specs=redlib.specs -MMD -MP -MF"$(@:%.o=%.d)" -MT"$(@:%.o=%.o)" -MT"$(@:%.o=%.d)" -o "$@" "$<" + @echo 'Finished building: $<' + @echo ' ' + + diff --git a/TP1_labyrinth_slave_etu/Debug/src/tools.d b/TP1_labyrinth_slave_etu/Debug/src/tools.d new file mode 100644 index 0000000000000000000000000000000000000000..11be791ca2eff3d9e55794e982f9407a551f5248 --- /dev/null +++ b/TP1_labyrinth_slave_etu/Debug/src/tools.d @@ -0,0 +1,25 @@ +src/tools.o src/tools.d: ../src/tools.c ../src/tools.h ../src/lcd.h \ + C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\CMSISv2p00_LPC17xx\inc/LPC17xx.h \ + C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\CMSISv2p00_LPC17xx\inc/core_cm3.h \ + C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\CMSISv2p00_LPC17xx\inc/core_cmInstr.h \ + C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\CMSISv2p00_LPC17xx\inc/core_cmFunc.h \ + C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\CMSISv2p00_LPC17xx\inc/system_LPC17xx.h \ + ../src/ssp.h ../src/fonts.h + +../src/tools.h: + +../src/lcd.h: + +C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\CMSISv2p00_LPC17xx\inc/LPC17xx.h: + +C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\CMSISv2p00_LPC17xx\inc/core_cm3.h: + +C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\CMSISv2p00_LPC17xx\inc/core_cmInstr.h: + +C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\CMSISv2p00_LPC17xx\inc/core_cmFunc.h: + +C:\Users\vince\Documents\LPCXpresso_5.2.6_2137\ptr\CMSISv2p00_LPC17xx\inc/system_LPC17xx.h: + +../src/ssp.h: + +../src/fonts.h: diff --git a/TP1_labyrinth_slave_etu/Debug/src/tools.o b/TP1_labyrinth_slave_etu/Debug/src/tools.o new file mode 100644 index 0000000000000000000000000000000000000000..996020e2e74f8c7d81a644f48fe0b4f9962f3a48 Binary files /dev/null and b/TP1_labyrinth_slave_etu/Debug/src/tools.o differ diff --git a/TP1_labyrinth_slave_etu/TP1_labyrinth_slave_etu Debug.launch b/TP1_labyrinth_slave_etu/TP1_labyrinth_slave_etu Debug.launch new file mode 100644 index 0000000000000000000000000000000000000000..dee0ea7c1574ccd090be9563b83d1205c01c0756 --- /dev/null +++ b/TP1_labyrinth_slave_etu/TP1_labyrinth_slave_etu Debug.launch @@ -0,0 +1,23 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<launchConfiguration type="com.crt.dsfdebug.crtmcu.launchType"> +<stringAttribute key="com.crt.ctrlcenter.OFSemuDetails" value="LinkServer"/> +<booleanAttribute key="com.crt.ctrlcenter.crtInit" value="true"/> +<stringAttribute key="com.crt.ctrlcenter.currentWireType" value="SWD"/> +<stringAttribute key="com.crt.ctrlcenter.serialNumber" value="LinkServerNXPNXP CMSIS-DAP"/> +<stringAttribute key="com.crt.ctrlcenter.targetbase" value="NXP LPC17xx"/> +<stringAttribute key="com.crt.ctrlcenter.targetconfig" value="<?xml version="1.0" encoding="UTF-8"?> <config chipvendor="NXP" genname="NXP LPC17xx" id="config.gdb.stub"><parameters><params><param default="true" description="Vector catch" name="Vector catch" value="false" var="vector.catch"><enum value="True"/> <enum value="False"/> </param> </params> <initValue value="false" var="vector.catch"/> <params><param default="On" description="Enablement of semihosting support" name="Semihosting support" value="On" var="internal.semihost"><enum value="On"/> <enum value="Off"/> <enum value="Auto"/> </param> </params> <params><param default="" description="Maximum wire speed in KHz (leave blank to Auto-detect). Not all values are supported by all targets" name="Maximum wire speed" probe="^(?!Redlink Server|LinkServer$).*$" type="nullString" value="" var="emu.speed"><enum value=""/> <enum value="30000"/> <enum value="15000"/> <enum value="10000"/> <enum value="7500"/> <enum value="6000"/> <enum value="5000"/> <enum value="3750"/> <enum value="3000"/> <enum value="2500"/> <enum value="2000"/> <enum value="1500"/> <enum value="1250"/> <enum value="1200"/> <enum value="1000"/> <enum value="750"/> <enum value="600"/> <enum value="500"/> <enum value="400"/> <enum value="300"/> <enum value="250"/> <enum value="200"/> <enum value="150"/> </param> </params> <params><param content="serverScript" description="Connect script" name="Connect Script" probe="(?i)(Redlink\s+Server|CMSIS-DAP|LinkServer)" required="false" type="nullString" var="internal.connect.script"/> <param content="serverScript" description="Reset script" name="Reset Script" probe="(?i)(Redlink\s+Server|CMSIS-DAP|LinkServer)" required="false" type="nullString" var="internal.reset.script"/> <param default="" description="Select the reset handling type for this debug connection" name="Reset Handling" probe="(?i)(Redlink\s+Server|CMSIS-DAP|LinkServer)" value="VECTRESET" var="internal.resethandling"><enum value="SYSRESETREQ"/> <enum value="VECTRESET"/> <enum value="Default"/> <enum value=""/> </param> <param default="" description="Additional options" name="Additional options" value="" var="misc.options"/> <param default="2" description="Set stub debug level (1-4)" name="Debug Level " value="2" var="debug.level"/> <param default="False" description="when True, attach to running target only (without loading image)" name="Attach only" required="true" value="False" var="attach"><enum value="True"/> <enum value="False"/> </param> <param default="True" description="Deprecated. Functionality superseded by &apos;Attach only&apos;" name="Load image" type="boolean" value="True" var="load"><enum value="True"/> <enum value="False"/> </param> <param default="cont" description="Run, continue or (do nothing)" name="Run/Continue image" value="cont" var="run"><enum value="run"/> <enum value="cont"/> <enum value=""/> </param> <param default="off" description="If on is specified, make the debugger treat unknown memory as non-existent and refuse \naccesses to such memory. If off is specified, treat the memory as RAM" name="Memory Access Checking" value="off" var="mem.access"><enum value="on"/> <enum value="off"/> </param> <param default="cont" description="choose the disconnect behavior for the target" name="Disconnect behavior" value="cont" var="ondisconnect"><enum value="nochange"/> <enum value="stop"/> <enum value="cont"/> <enum value="run_cont"/> </param> <param default="" description="Command to run before starting the debugger" name="Pre launch command" value="" var="internal.prelaunch.command"/> <param default="" description="Target Wirespeed in Hz" name="Wirespeed (Hz)" probe="(?i)(Redlink\s+Server|CMSIS-DAP|LinkServer)" value="" var="internal.wirespeed"/> </params> <initvalue value="VECTRESET" var="internal.resethandling"/> <params><param default="SWD" description="Internal wiretypes" mode="hidden" name="Wiretype" probe="NEVER" value="SWD*,JTAG" var="internal.wiretype"></param> <param default="false" description="Chip supports SWO" mode="hidden" name="Has SWO" probe="NEVER" value="true" var="internal.has_swo"></param> </params> <initvalue value="SWD*,JTAG" var="internal.wiretype"/> <initvalue value="true" var="internal.has_swo"/> </parameters> <script emulators="${gdb.stub} -mi -info-emu" silent="false" swv="true" type="init">set remotetimeout 60000&#x0A;##target_extended_remote##&#x0A;set mem inaccessible-by-default ${mem.access}&#x0A;mon ondisconnect ${ondisconnect}&#x0A;set arm force-mode thumb&#x0A;${load}</script> <script silent="false" type="run">${run}</script> </config> "/> +<intAttribute key="com.crt.ctrlcenter.version" value="3"/> +<stringAttribute key="org.eclipse.cdt.debug.mi.core.DEBUG_NAME" value="arm-none-eabi-gdb"/> +<stringAttribute key="org.eclipse.cdt.debug.mi.core.GDB_INIT" value=""/> +<stringAttribute key="org.eclipse.cdt.dsf.gdb.DEBUG_NAME" value="arm-none-eabi-gdb"/> +<booleanAttribute key="org.eclipse.cdt.dsf.gdb.NON_STOP" value="false"/> +<stringAttribute key="org.eclipse.cdt.launch.DEBUGGER_START_MODE" value="remote"/> +<booleanAttribute key="org.eclipse.cdt.launch.DEBUGGER_STOP_AT_MAIN" value="true"/> +<stringAttribute key="org.eclipse.cdt.launch.DEBUGGER_STOP_AT_MAIN_SYMBOL" value="main"/> +<stringAttribute key="org.eclipse.cdt.launch.PROGRAM_NAME" value="Debug\TP1_labyrinth_slave_etu.axf"/> +<stringAttribute key="org.eclipse.cdt.launch.PROJECT_ATTR" value="TP1_labyrinth_slave_etu"/> +<stringAttribute key="org.eclipse.cdt.launch.PROJECT_BUILD_CONFIG_ID_ATTR" value="com.crt.advproject.config.exe.debug.1961788077"/> +<booleanAttribute key="org.eclipse.cdt.launch.use_terminal" value="false"/> +<stringAttribute key="org.eclipse.dsf.launch.MEMORY_BLOCKS" value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <memoryBlockExpressionList context="reserved-for-future-use"/> "/> +<stringAttribute key="process_factory_id" value="org.eclipse.cdt.dsf.gdb.GdbProcessFactory"/> +</launchConfiguration> diff --git a/TP1_labyrinth_slave_etu/TP1_labyrinth_slave_etu Release.launch b/TP1_labyrinth_slave_etu/TP1_labyrinth_slave_etu Release.launch new file mode 100644 index 0000000000000000000000000000000000000000..0adcebc7b26de107956d5a0a041bf6c04f2c66dd --- /dev/null +++ b/TP1_labyrinth_slave_etu/TP1_labyrinth_slave_etu Release.launch @@ -0,0 +1,18 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<launchConfiguration type="com.crt.dsfdebug.crtmcu.launchType"> +<booleanAttribute key="com.crt.ctrlcenter.crtInit" value="true"/> +<stringAttribute key="com.crt.ctrlcenter.targetbase" value="NXP LPC17xx"/> +<stringAttribute key="com.crt.ctrlcenter.targetconfig" value="<?xml version="1.0" encoding="UTF-8"?> <config chipvendor="NXP" genname="NXP LPC17xx" id="config.gdb.stub"><parameters><params><param default="true" description="Vector catch" name="Vector catch" value="false" var="vector.catch"><enum value="True"/> <enum value="False"/> </param> </params> <initValue value="false" var="vector.catch"/> <params><param default="On" description="Enablement of semihosting support" name="Semihosting support" value="On" var="internal.semihost"><enum value="On"/> <enum value="Off"/> <enum value="Auto"/> </param> </params> <params><param default="" description="Maximum wire speed in KHz (leave blank to Auto-detect). Not all values are supported by all targets" name="Maximum wire speed" probe="^(?!Redlink Server|LinkServer$).*$" type="nullString" value="" var="emu.speed"><enum value=""/> <enum value="30000"/> <enum value="15000"/> <enum value="10000"/> <enum value="7500"/> <enum value="6000"/> <enum value="5000"/> <enum value="3750"/> <enum value="3000"/> <enum value="2500"/> <enum value="2000"/> <enum value="1500"/> <enum value="1250"/> <enum value="1200"/> <enum value="1000"/> <enum value="750"/> <enum value="600"/> <enum value="500"/> <enum value="400"/> <enum value="300"/> <enum value="250"/> <enum value="200"/> <enum value="150"/> </param> </params> <params><param content="serverScript" description="Connect script" name="Connect Script" probe="(?i)(Redlink\s+Server|CMSIS-DAP|LinkServer)" required="false" type="nullString" var="internal.connect.script"/> <param content="serverScript" description="Reset script" name="Reset Script" probe="(?i)(Redlink\s+Server|CMSIS-DAP|LinkServer)" required="false" type="nullString" var="internal.reset.script"/> <param default="" description="Select the reset handling type for this debug connection" name="Reset Handling" probe="(?i)(Redlink\s+Server|CMSIS-DAP|LinkServer)" value="VECTRESET" var="internal.resethandling"><enum value="SYSRESETREQ"/> <enum value="VECTRESET"/> <enum value="Default"/> <enum value=""/> </param> <param default="" description="Additional options" name="Additional options" value="" var="misc.options"/> <param default="2" description="Set stub debug level (1-4)" name="Debug Level " value="2" var="debug.level"/> <param default="False" description="when True, attach to running target only (without loading image)" name="Attach only" required="true" value="False" var="attach"><enum value="True"/> <enum value="False"/> </param> <param default="True" description="Deprecated. Functionality superseded by &apos;Attach only&apos;" name="Load image" type="boolean" value="True" var="load"><enum value="True"/> <enum value="False"/> </param> <param default="cont" description="Run, continue or (do nothing)" name="Run/Continue image" value="cont" var="run"><enum value="run"/> <enum value="cont"/> <enum value=""/> </param> <param default="off" description="If on is specified, make the debugger treat unknown memory as non-existent and refuse \naccesses to such memory. If off is specified, treat the memory as RAM" name="Memory Access Checking" value="off" var="mem.access"><enum value="on"/> <enum value="off"/> </param> <param default="cont" description="choose the disconnect behavior for the target" name="Disconnect behavior" value="cont" var="ondisconnect"><enum value="nochange"/> <enum value="stop"/> <enum value="cont"/> <enum value="run_cont"/> </param> <param default="" description="Command to run before starting the debugger" name="Pre launch command" value="" var="internal.prelaunch.command"/> <param default="" description="Target Wirespeed in Hz" name="Wirespeed (Hz)" probe="(?i)(Redlink\s+Server|CMSIS-DAP|LinkServer)" value="" var="internal.wirespeed"/> </params> <initvalue value="VECTRESET" var="internal.resethandling"/> <params><param default="SWD" description="Internal wiretypes" mode="hidden" name="Wiretype" probe="NEVER" value="SWD*,JTAG" var="internal.wiretype"></param> <param default="false" description="Chip supports SWO" mode="hidden" name="Has SWO" probe="NEVER" value="true" var="internal.has_swo"></param> </params> <initvalue value="SWD*,JTAG" var="internal.wiretype"/> <initvalue value="true" var="internal.has_swo"/> </parameters> <script emulators="${gdb.stub} -mi -info-emu" silent="false" swv="true" type="init">set remotetimeout 60000&#x0A;##target_extended_remote##&#x0A;set mem inaccessible-by-default ${mem.access}&#x0A;mon ondisconnect ${ondisconnect}&#x0A;set arm force-mode thumb&#x0A;${load}</script> <script silent="false" type="run">${run}</script> </config> "/> +<intAttribute key="com.crt.ctrlcenter.version" value="3"/> +<stringAttribute key="org.eclipse.cdt.debug.mi.core.DEBUG_NAME" value="arm-none-eabi-gdb"/> +<stringAttribute key="org.eclipse.cdt.debug.mi.core.GDB_INIT" value=""/> +<stringAttribute key="org.eclipse.cdt.dsf.gdb.DEBUG_NAME" value="arm-none-eabi-gdb"/> +<booleanAttribute key="org.eclipse.cdt.dsf.gdb.NON_STOP" value="false"/> +<stringAttribute key="org.eclipse.cdt.launch.DEBUGGER_START_MODE" value="remote"/> +<booleanAttribute key="org.eclipse.cdt.launch.DEBUGGER_STOP_AT_MAIN" value="true"/> +<stringAttribute key="org.eclipse.cdt.launch.DEBUGGER_STOP_AT_MAIN_SYMBOL" value="main"/> +<stringAttribute key="org.eclipse.cdt.launch.PROGRAM_NAME" value="Release\TP1_labyrinth_slave_etu.axf"/> +<stringAttribute key="org.eclipse.cdt.launch.PROJECT_ATTR" value="TP1_labyrinth_slave_etu"/> +<stringAttribute key="org.eclipse.cdt.launch.PROJECT_BUILD_CONFIG_ID_ATTR" value="com.crt.advproject.config.exe.release.955237986"/> +<booleanAttribute key="org.eclipse.cdt.launch.use_terminal" value="false"/> +</launchConfiguration> diff --git a/TP1_labyrinth_slave_etu/src/accelerometer.h b/TP1_labyrinth_slave_etu/src/accelerometer.h new file mode 100644 index 0000000000000000000000000000000000000000..6c2cef1c0f6ad0137be2a24586ca97fa88e76159 --- /dev/null +++ b/TP1_labyrinth_slave_etu/src/accelerometer.h @@ -0,0 +1,83 @@ +/***************************************************************************** + +This software is released under the LGPL-3.0 license: http://www.opensource.org/licenses/lgpl-3.0.html + +Copyright (c) 2013, hepia (ITI) http://www.hepialight.ch + +This library is free software; you can redistribute it and/or +modify it under the terms of the GNU Lesser General Public +License as published by the Free Software Foundation; either +version 3.0 of the License, or (at your option) any later version. + +This library is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public +License along with this library; if not, write to the Free Software +Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +*****************************************************************************/ + + +#ifndef ACCELEROMETER_H_ +#define ACCELEROMETER_H_ + +#include <stdint.h> + +#define accel_addr_X 0x00 +#define accel_addr_Y 0x01 +#define accel_addr_Z 0x02 +#define accel_mode_reg 0x07 + +#define ACCEL_INT_PIN 11 +#define ACCEL_I2C_ADDR 0x1D<<1 + +#define LSM303D_REG_WHOAMI 0x0F +#define LSM303D_REG_CTRL0 0x1F +#define LSM303D_REG_CTRL1 0x20 +#define LSM303D_REG_CTRL2 0x21 +#define LSM303D_REG_CTRL3 0x22 +#define LSM303D_REG_CTRL4 0x23 +#define LSM303D_REG_CTRL5 0x24 +#define LSM303D_REG_CTRL6 0x25 +#define LSM303D_REG_CTRL7 0x26 +#define LSM303D_REG_TEMP_OUT_L 0x05 +#define LSM303D_REG_TEMP_OUT_H 0x06 +#define LSM303D_REG_STATUS_M 0x07 +#define LSM303D_REG_OUT_X_L_M 0x08 +#define LSM303D_REG_OUT_X_H_M 0x09 +#define LSM303D_REG_OUT_Y_L_M 0x0a +#define LSM303D_REG_OUT_Y_H_M 0x0b +#define LSM303D_REG_OUT_Z_L_M 0x0c +#define LSM303D_REG_OUT_Z_H_M 0x0d +#define LSM303D_REG_STATUS_A 0x27 +#define LSM303D_REG_OUT_X_L_A 0x28 +#define LSM303D_REG_OUT_X_H_A 0x29 +#define LSM303D_REG_OUT_Y_L_A 0x2a +#define LSM303D_REG_OUT_Y_H_A 0x2b +#define LSM303D_REG_OUT_Z_L_A 0x2c +#define LSM303D_REG_OUT_Z_H_A 0x2d + +#define ACC_NOT_INITIALISED -21 +#define ACC_INIT_I2C_FAILED -22 +#define ACC_NOERROR 0 + + +typedef struct +{ + float accel_x; + float accel_y; + float accel_z; + int16_t magneto_x; + int16_t magneto_y; + int16_t magneto_z; + int16_t temperature; +} accel_t; + +int accel_init(void); +int accel_read(accel_t *accel); + + +#endif /* ACCELEROMETER_H_ */ diff --git a/TP1_labyrinth_slave_etu/src/cr_startup_lpc175x_6x.c b/TP1_labyrinth_slave_etu/src/cr_startup_lpc175x_6x.c new file mode 100644 index 0000000000000000000000000000000000000000..f4624e0b247d48750b5fe1b6203be95d4e36d18a --- /dev/null +++ b/TP1_labyrinth_slave_etu/src/cr_startup_lpc175x_6x.c @@ -0,0 +1,371 @@ +//***************************************************************************** +// LPC175x_6x Microcontroller Startup code for use with LPCXpresso IDE +// +// Version : 140114 +//***************************************************************************** +// +// Copyright(C) NXP Semiconductors, 2014 +// All rights reserved. +// +// Software that is described herein is for illustrative purposes only +// which provides customers with programming information regarding the +// LPC products. This software is supplied "AS IS" without any warranties of +// any kind, and NXP Semiconductors and its licensor disclaim any and +// all warranties, express or implied, including all implied warranties of +// merchantability, fitness for a particular purpose and non-infringement of +// intellectual property rights. NXP Semiconductors assumes no responsibility +// or liability for the use of the software, conveys no license or rights under any +// patent, copyright, mask work right, or any other intellectual property rights in +// or to any products. NXP Semiconductors reserves the right to make changes +// in the software without notification. NXP Semiconductors also makes no +// representation or warranty that such application will be suitable for the +// specified use without further testing or modification. +// +// Permission to use, copy, modify, and distribute this software and its +// documentation is hereby granted, under NXP Semiconductors' and its +// licensor's relevant copyrights in the software, without fee, provided that it +// is used in conjunction with NXP Semiconductors microcontrollers. This +// copyright, permission, and disclaimer notice must appear in all copies of +// this code. +//***************************************************************************** + +#if defined (__cplusplus) +#ifdef __REDLIB__ +#error Redlib does not support C++ +#else +//***************************************************************************** +// +// The entry point for the C++ library startup +// +//***************************************************************************** +extern "C" { + extern void __libc_init_array(void); +} +#endif +#endif + +#define WEAK __attribute__ ((weak)) +#define ALIAS(f) __attribute__ ((weak, alias (#f))) + +//***************************************************************************** +#if defined (__cplusplus) +extern "C" { +#endif + +//***************************************************************************** +#if defined (__USE_CMSIS) || defined (__USE_LPCOPEN) +// Declaration of external SystemInit function +extern void SystemInit(void); +#endif + +//***************************************************************************** +// +// Forward declaration of the default handlers. These are aliased. +// When the application defines a handler (with the same name), this will +// automatically take precedence over these weak definitions +// +//***************************************************************************** + void ResetISR(void); +WEAK void NMI_Handler(void); +WEAK void HardFault_Handler(void); +WEAK void MemManage_Handler(void); +WEAK void BusFault_Handler(void); +WEAK void UsageFault_Handler(void); +WEAK void SVC_Handler(void); +WEAK void DebugMon_Handler(void); +WEAK void PendSV_Handler(void); +WEAK void SysTick_Handler(void); +WEAK void IntDefaultHandler(void); + +//***************************************************************************** +// +// Forward declaration of the specific IRQ handlers. These are aliased +// to the IntDefaultHandler, which is a 'forever' loop. When the application +// defines a handler (with the same name), this will automatically take +// precedence over these weak definitions +// +//***************************************************************************** +void WDT_IRQHandler(void) ALIAS(IntDefaultHandler); +void TIMER0_IRQHandler(void) ALIAS(IntDefaultHandler); +void TIMER1_IRQHandler(void) ALIAS(IntDefaultHandler); +void TIMER2_IRQHandler(void) ALIAS(IntDefaultHandler); +void TIMER3_IRQHandler(void) ALIAS(IntDefaultHandler); +void UART0_IRQHandler(void) ALIAS(IntDefaultHandler); +void UART1_IRQHandler(void) ALIAS(IntDefaultHandler); +void UART2_IRQHandler(void) ALIAS(IntDefaultHandler); +void UART3_IRQHandler(void) ALIAS(IntDefaultHandler); +void PWM1_IRQHandler(void) ALIAS(IntDefaultHandler); +void I2C0_IRQHandler(void) ALIAS(IntDefaultHandler); +void I2C1_IRQHandler(void) ALIAS(IntDefaultHandler); +void I2C2_IRQHandler(void) ALIAS(IntDefaultHandler); +void SPI_IRQHandler(void) ALIAS(IntDefaultHandler); +void SSP0_IRQHandler(void) ALIAS(IntDefaultHandler); +void SSP1_IRQHandler(void) ALIAS(IntDefaultHandler); +void PLL0_IRQHandler(void) ALIAS(IntDefaultHandler); +void RTC_IRQHandler(void) ALIAS(IntDefaultHandler); +void EINT0_IRQHandler(void) ALIAS(IntDefaultHandler); +void EINT1_IRQHandler(void) ALIAS(IntDefaultHandler); +void EINT2_IRQHandler(void) ALIAS(IntDefaultHandler); +void EINT3_IRQHandler(void) ALIAS(IntDefaultHandler); +void ADC_IRQHandler(void) ALIAS(IntDefaultHandler); +void BOD_IRQHandler(void) ALIAS(IntDefaultHandler); +void USB_IRQHandler(void) ALIAS(IntDefaultHandler); +void CAN_IRQHandler(void) ALIAS(IntDefaultHandler); +void DMA_IRQHandler(void) ALIAS(IntDefaultHandler); +void I2S_IRQHandler(void) ALIAS(IntDefaultHandler); +#if defined (__USE_LPCOPEN) +void ETH_IRQHandler(void) ALIAS(IntDefaultHandler); +#else +void ENET_IRQHandler(void) ALIAS(IntDefaultHandler); +#endif +void RIT_IRQHandler(void) ALIAS(IntDefaultHandler); +void MCPWM_IRQHandler(void) ALIAS(IntDefaultHandler); +void QEI_IRQHandler(void) ALIAS(IntDefaultHandler); +void PLL1_IRQHandler(void) ALIAS(IntDefaultHandler); +void USBActivity_IRQHandler(void) ALIAS(IntDefaultHandler); +void CANActivity_IRQHandler(void) ALIAS(IntDefaultHandler); + +//***************************************************************************** +// +// The entry point for the application. +// __main() is the entry point for Redlib based applications +// main() is the entry point for Newlib based applications +// +//***************************************************************************** +#if defined (__REDLIB__) +extern void __main(void); +#endif +extern int main(void); +//***************************************************************************** +// +// External declaration for the pointer to the stack top from the Linker Script +// +//***************************************************************************** +extern void _vStackTop(void); + +//***************************************************************************** +#if defined (__cplusplus) +} // extern "C" +#endif +//***************************************************************************** +// +// The vector table. +// This relies on the linker script to place at correct location in memory. +// +//***************************************************************************** +extern void (* const g_pfnVectors[])(void); +__attribute__ ((section(".isr_vector"))) +void (* const g_pfnVectors[])(void) = { + // Core Level - CM3 + &_vStackTop, // The initial stack pointer + ResetISR, // The reset handler + NMI_Handler, // The NMI handler + HardFault_Handler, // The hard fault handler + MemManage_Handler, // The MPU fault handler + BusFault_Handler, // The bus fault handler + UsageFault_Handler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + SVC_Handler, // SVCall handler + DebugMon_Handler, // Debug monitor handler + 0, // Reserved + PendSV_Handler, // The PendSV handler + SysTick_Handler, // The SysTick handler + + // Chip Level - LPC17 + WDT_IRQHandler, // 16, 0x40 - WDT + TIMER0_IRQHandler, // 17, 0x44 - TIMER0 + TIMER1_IRQHandler, // 18, 0x48 - TIMER1 + TIMER2_IRQHandler, // 19, 0x4c - TIMER2 + TIMER3_IRQHandler, // 20, 0x50 - TIMER3 + UART0_IRQHandler, // 21, 0x54 - UART0 + UART1_IRQHandler, // 22, 0x58 - UART1 + UART2_IRQHandler, // 23, 0x5c - UART2 + UART3_IRQHandler, // 24, 0x60 - UART3 + PWM1_IRQHandler, // 25, 0x64 - PWM1 + I2C0_IRQHandler, // 26, 0x68 - I2C0 + I2C1_IRQHandler, // 27, 0x6c - I2C1 + I2C2_IRQHandler, // 28, 0x70 - I2C2 + SPI_IRQHandler, // 29, 0x74 - SPI + SSP0_IRQHandler, // 30, 0x78 - SSP0 + SSP1_IRQHandler, // 31, 0x7c - SSP1 + PLL0_IRQHandler, // 32, 0x80 - PLL0 (Main PLL) + RTC_IRQHandler, // 33, 0x84 - RTC + EINT0_IRQHandler, // 34, 0x88 - EINT0 + EINT1_IRQHandler, // 35, 0x8c - EINT1 + EINT2_IRQHandler, // 36, 0x90 - EINT2 + EINT3_IRQHandler, // 37, 0x94 - EINT3 + ADC_IRQHandler, // 38, 0x98 - ADC + BOD_IRQHandler, // 39, 0x9c - BOD + USB_IRQHandler, // 40, 0xA0 - USB + CAN_IRQHandler, // 41, 0xa4 - CAN + DMA_IRQHandler, // 42, 0xa8 - GP DMA + I2S_IRQHandler, // 43, 0xac - I2S +#if defined (__USE_LPCOPEN) + ETH_IRQHandler, // 44, 0xb0 - Ethernet +#else + ENET_IRQHandler, // 44, 0xb0 - Ethernet +#endif + RIT_IRQHandler, // 45, 0xb4 - RITINT + MCPWM_IRQHandler, // 46, 0xb8 - Motor Control PWM + QEI_IRQHandler, // 47, 0xbc - Quadrature Encoder + PLL1_IRQHandler, // 48, 0xc0 - PLL1 (USB PLL) + USBActivity_IRQHandler, // 49, 0xc4 - USB Activity interrupt to wakeup + CANActivity_IRQHandler, // 50, 0xc8 - CAN Activity interrupt to wakeup +}; + +//***************************************************************************** +// Functions to carry out the initialization of RW and BSS data sections. These +// are written as separate functions rather than being inlined within the +// ResetISR() function in order to cope with MCUs with multiple banks of +// memory. +//***************************************************************************** +__attribute__ ((section(".after_vectors"))) +void data_init(unsigned int romstart, unsigned int start, unsigned int len) { + unsigned int *pulDest = (unsigned int*) start; + unsigned int *pulSrc = (unsigned int*) romstart; + unsigned int loop; + for (loop = 0; loop < len; loop = loop + 4) + *pulDest++ = *pulSrc++; +} + +__attribute__ ((section(".after_vectors"))) +void bss_init(unsigned int start, unsigned int len) { + unsigned int *pulDest = (unsigned int*) start; + unsigned int loop; + for (loop = 0; loop < len; loop = loop + 4) + *pulDest++ = 0; +} + +//***************************************************************************** +// The following symbols are constructs generated by the linker, indicating +// the location of various points in the "Global Section Table". This table is +// created by the linker via the Code Red managed linker script mechanism. It +// contains the load address, execution address and length of each RW data +// section and the execution and length of each BSS (zero initialized) section. +//***************************************************************************** +extern unsigned int __data_section_table; +extern unsigned int __data_section_table_end; +extern unsigned int __bss_section_table; +extern unsigned int __bss_section_table_end; + +//***************************************************************************** +// Reset entry point for your code. +// Sets up a simple runtime environment and initializes the C/C++ +// library. +//***************************************************************************** +__attribute__ ((section(".after_vectors"))) +void +ResetISR(void) { + + // + // Copy the data sections from flash to SRAM. + // + unsigned int LoadAddr, ExeAddr, SectionLen; + unsigned int *SectionTableAddr; + + // Load base address of Global Section Table + SectionTableAddr = &__data_section_table; + + // Copy the data sections from flash to SRAM. + while (SectionTableAddr < &__data_section_table_end) { + LoadAddr = *SectionTableAddr++; + ExeAddr = *SectionTableAddr++; + SectionLen = *SectionTableAddr++; + data_init(LoadAddr, ExeAddr, SectionLen); + } + // At this point, SectionTableAddr = &__bss_section_table; + // Zero fill the bss segment + while (SectionTableAddr < &__bss_section_table_end) { + ExeAddr = *SectionTableAddr++; + SectionLen = *SectionTableAddr++; + bss_init(ExeAddr, SectionLen); + } + +#if defined (__USE_CMSIS) || defined (__USE_LPCOPEN) + SystemInit(); +#endif + +#if defined (__cplusplus) + // + // Call C++ library initialisation + // + __libc_init_array(); +#endif + +#if defined (__REDLIB__) + // Call the Redlib library, which in turn calls main() + __main() ; +#else + main(); +#endif + + // + // main() shouldn't return, but if it does, we'll just enter an infinite loop + // + while (1) { + ; + } +} + +//***************************************************************************** +// Default exception handlers. Override the ones here by defining your own +// handler routines in your application code. +//***************************************************************************** +__attribute__ ((section(".after_vectors"))) +void NMI_Handler(void) +{ while(1) {} +} + +__attribute__ ((section(".after_vectors"))) +void HardFault_Handler(void) +{ while(1) {} +} + +__attribute__ ((section(".after_vectors"))) +void MemManage_Handler(void) +{ while(1) {} +} + +__attribute__ ((section(".after_vectors"))) +void BusFault_Handler(void) +{ while(1) {} +} + +__attribute__ ((section(".after_vectors"))) +void UsageFault_Handler(void) +{ while(1) {} +} + +__attribute__ ((section(".after_vectors"))) +void SVC_Handler(void) +{ while(1) {} +} + +__attribute__ ((section(".after_vectors"))) +void DebugMon_Handler(void) +{ while(1) {} +} + +__attribute__ ((section(".after_vectors"))) +void PendSV_Handler(void) +{ while(1) {} +} + +__attribute__ ((section(".after_vectors"))) +void SysTick_Handler(void) +{ while(1) {} +} + +//***************************************************************************** +// +// Processor ends up here if an unexpected interrupt occurs or a specific +// handler is not present in the application code. +// +//***************************************************************************** +__attribute__ ((section(".after_vectors"))) +void IntDefaultHandler(void) +{ while(1) {} +} diff --git a/TP1_labyrinth_slave_etu/src/crp.c b/TP1_labyrinth_slave_etu/src/crp.c new file mode 100644 index 0000000000000000000000000000000000000000..fa9a0d5bd65bbcec67b8a45b49cc7ce55b4ace1c --- /dev/null +++ b/TP1_labyrinth_slave_etu/src/crp.c @@ -0,0 +1,38 @@ +//***************************************************************************** +// crp.c +// +// Source file to create CRP word expected by LPCXpresso IDE linker +//***************************************************************************** +// +// Copyright(C) NXP Semiconductors, 2013 +// All rights reserved. +// +// Software that is described herein is for illustrative purposes only +// which provides customers with programming information regarding the +// LPC products. This software is supplied "AS IS" without any warranties of +// any kind, and NXP Semiconductors and its licensor disclaim any and +// all warranties, express or implied, including all implied warranties of +// merchantability, fitness for a particular purpose and non-infringement of +// intellectual property rights. NXP Semiconductors assumes no responsibility +// or liability for the use of the software, conveys no license or rights under any +// patent, copyright, mask work right, or any other intellectual property rights in +// or to any products. NXP Semiconductors reserves the right to make changes +// in the software without notification. NXP Semiconductors also makes no +// representation or warranty that such application will be suitable for the +// specified use without further testing or modification. +// +// Permission to use, copy, modify, and distribute this software and its +// documentation is hereby granted, under NXP Semiconductors' and its +// licensor's relevant copyrights in the software, without fee, provided that it +// is used in conjunction with NXP Semiconductors microcontrollers. This +// copyright, permission, and disclaimer notice must appear in all copies of +// this code. +//***************************************************************************** + +#if defined (__CODE_RED) +#include <NXP/crp.h> +// Variable to store CRP value in. Will be placed automatically +// by the linker when "Enable Code Read Protect" selected. +// See crp.h header for more information +__CRP const unsigned int CRP_WORD = CRP_NO_CRP ; +#endif diff --git a/TP1_labyrinth_slave_etu/src/ethernet_mgt.h b/TP1_labyrinth_slave_etu/src/ethernet_mgt.h new file mode 100644 index 0000000000000000000000000000000000000000..c7ba8bc8c1303fb6bfc53d3fe30950f7e1003113 --- /dev/null +++ b/TP1_labyrinth_slave_etu/src/ethernet_mgt.h @@ -0,0 +1,53 @@ +/* + * ethernet_mgt.h + * + * Description: Ethernet driver. Note: RX/TX buffers must be in RAM2 + * since SRAM is deactivated during WFI (the DMA can not copy data during a WFI in SRAM) + * Created on: 13.4.2018 + * Author: Pilloux V. + */ + +#ifndef ETHERNET_MGT_H_ +#define ETHERNET_MGT_H_ + +/* Description: callback prototype for ethernet_init() + * + * Parameter: data: pointer on data to be received + * length: data length [bytes] + */ +typedef void (*rx_eth_callback_t)(void *data, int len); + +/* Description: initialise Ethernet connection. RX/TX buffers MUST be declared in RAM2 + * since SRAM is deactivated during WFI (the DMA can not copy data during a WFI in SRAM) + * + * Parameters: + * tx_double_buf: pointer on the transmission double buffer (can be NULL if not used) + * rx_double_buf: pointer on the receiving double buffer (can be NULL if not used) + * double_len_tx: maximum length of the transmission double buffers + * double_len_rx: maximum length of the receiving double buffers + * rx_callback: pointer on a callback function which is called + * each time data is received by Ethernet. If rx_callback==NULL, + * no callback is used. + * Return: pointer on the data frame to be filled for transmission + */ +unsigned char *ethernet_init(unsigned char *tx_double_buf, int double_len_tx, unsigned char *rx_double_buf, + int double_len_rx, rx_eth_callback_t rx_callback); + +/* Description: send raw data to Ethernet (no address management) + * + * Parameter: length: data length [bytes]. Note that length can be lower than double_len/2 + * but not bigger + * blocking: if true, waits the frame transmission + * Return: pointer on the next data frame to transmit + */ +unsigned char *send_eth(int length, bool blocking); + +/* Description: receive raw data from Ethernet (no address management). + * This function blocks until data is received. + * + * Parameter: length: pointer on the received data length [bytes] + * Return: pointer on the received data + */ +unsigned char *rec_eth(int *length); + +#endif /* ETHERNET_MGT_H_ */ diff --git a/TP1_labyrinth_slave_etu/src/ethmac.h b/TP1_labyrinth_slave_etu/src/ethmac.h new file mode 100644 index 0000000000000000000000000000000000000000..86c0018b4367c6bccab85c65eae3c4cb0e65fb06 --- /dev/null +++ b/TP1_labyrinth_slave_etu/src/ethmac.h @@ -0,0 +1,347 @@ +/****************************************************************** + ***** ***** + ***** Name: cs8900.h ***** + ***** Ver.: 1.0 ***** + ***** Date: 07/05/2001 ***** + ***** Auth: Andreas Dannenberg ***** + ***** HTWK Leipzig ***** + ***** university of applied sciences ***** + ***** Germany ***** + ***** adannenb@et.htwk-leipzig.de ***** + ***** Func: header-file for cs8900.c ***** + ***** ***** + ******************************************************************/ + +// Modifications by Code Red Technologies for NXP LPC1768 +// Filename changed to ethmac.h as no longer for cs8900 + +// CodeRed - update for new header filename + +#ifndef __ETHMAC_H +#define __ETHMAC_H + +#define MYMAC_1 1 // our ethernet (MAC) address +#define MYMAC_2 2 // (MUST be unique in LAN!) +#define MYMAC_3 3 +#define MYMAC_4 4 +#define MYMAC_5 5 +#define MYMAC_6 6 + + +// ******* +// CodeRed - defines for LPC1768 ethernet +// ******* + +/* EMAC Memory Buffer configuration for 16K Ethernet RAM. */ +#define NUM_RX_FRAG 4 /* Num.of RX Fragments 4*1536= 6.0kB */ +#define NUM_TX_FRAG 2 /* Num.of TX Fragments 3*1536= 4.6kB */ +#define ETH_FRAG_SIZE 1536 /* Packet Fragment size 1536 Bytes */ + +#define ETH_MAX_FLEN 1536 /* Max. Ethernet Frame Size */ + +/* EMAC variables located in AHB SRAM bank 1*/ +// Below is base address for first silicon +//#define RX_DESC_BASE 0x20004000 +// Below is base address for production silicon +#define RX_DESC_BASE 0x2007c000 +#define RX_STAT_BASE (RX_DESC_BASE + NUM_RX_FRAG*8) +#define TX_DESC_BASE (RX_STAT_BASE + NUM_RX_FRAG*8) +#define TX_STAT_BASE (TX_DESC_BASE + NUM_TX_FRAG*8) +#define RX_BUF_BASE (TX_STAT_BASE + NUM_TX_FRAG*4) +#define TX_BUF_BASE (RX_BUF_BASE + NUM_RX_FRAG*ETH_FRAG_SIZE) + +/* RX and TX descriptor and status definitions. */ +#define RX_DESC_PACKET(i) (*(unsigned int *)(RX_DESC_BASE + 8*i)) +#define RX_DESC_CTRL(i) (*(unsigned int *)(RX_DESC_BASE+4 + 8*i)) +#define RX_STAT_INFO(i) (*(unsigned int *)(RX_STAT_BASE + 8*i)) +#define RX_STAT_HASHCRC(i) (*(unsigned int *)(RX_STAT_BASE+4 + 8*i)) +#define TX_DESC_PACKET(i) (*(unsigned int *)(TX_DESC_BASE + 8*i)) +#define TX_DESC_CTRL(i) (*(unsigned int *)(TX_DESC_BASE+4 + 8*i)) +#define TX_STAT_INFO(i) (*(unsigned int *)(TX_STAT_BASE + 4*i)) +#define RX_BUF(i) (RX_BUF_BASE + ETH_FRAG_SIZE*i) +#define TX_BUF(i) (TX_BUF_BASE + ETH_FRAG_SIZE*i) + +/* MAC Configuration Register 1 */ +#define MAC1_REC_EN 0x00000001 /* Receive Enable */ +#define MAC1_PASS_ALL 0x00000002 /* Pass All Receive Frames */ +#define MAC1_RX_FLOWC 0x00000004 /* RX Flow Control */ +#define MAC1_TX_FLOWC 0x00000008 /* TX Flow Control */ +#define MAC1_LOOPB 0x00000010 /* Loop Back Mode */ +#define MAC1_RES_TX 0x00000100 /* Reset TX Logic */ +#define MAC1_RES_MCS_TX 0x00000200 /* Reset MAC TX Control Sublayer */ +#define MAC1_RES_RX 0x00000400 /* Reset RX Logic */ +#define MAC1_RES_MCS_RX 0x00000800 /* Reset MAC RX Control Sublayer */ +#define MAC1_SIM_RES 0x00004000 /* Simulation Reset */ +#define MAC1_SOFT_RES 0x00008000 /* Soft Reset MAC */ + +/* MAC Configuration Register 2 */ +#define MAC2_FULL_DUP 0x00000001 /* Full Duplex Mode */ +#define MAC2_FRM_LEN_CHK 0x00000002 /* Frame Length Checking */ +#define MAC2_HUGE_FRM_EN 0x00000004 /* Huge Frame Enable */ +#define MAC2_DLY_CRC 0x00000008 /* Delayed CRC Mode */ +#define MAC2_CRC_EN 0x00000010 /* Append CRC to every Frame */ +#define MAC2_PAD_EN 0x00000020 /* Pad all Short Frames */ +#define MAC2_VLAN_PAD_EN 0x00000040 /* VLAN Pad Enable */ +#define MAC2_ADET_PAD_EN 0x00000080 /* Auto Detect Pad Enable */ +#define MAC2_PPREAM_ENF 0x00000100 /* Pure Preamble Enforcement */ +#define MAC2_LPREAM_ENF 0x00000200 /* Long Preamble Enforcement */ +#define MAC2_NO_BACKOFF 0x00001000 /* No Backoff Algorithm */ +#define MAC2_BACK_PRESSURE 0x00002000 /* Backoff Presurre / No Backoff */ +#define MAC2_EXCESS_DEF 0x00004000 /* Excess Defer */ + +/* Back-to-Back Inter-Packet-Gap Register */ +#define IPGT_FULL_DUP 0x00000015 /* Recommended value for Full Duplex */ +#define IPGT_HALF_DUP 0x00000012 /* Recommended value for Half Duplex */ + +/* Non Back-to-Back Inter-Packet-Gap Register */ +#define IPGR_DEF 0x00000012 /* Recommended value */ + +/* Collision Window/Retry Register */ +#define CLRT_DEF 0x0000370F /* Default value */ + +/* PHY Support Register */ +#define SUPP_SPEED 0x00000100 /* Reduced MII Logic Current Speed */ + +/* Test Register */ +#define TEST_SHCUT_PQUANTA 0x00000001 /* Shortcut Pause Quanta */ +#define TEST_TST_PAUSE 0x00000002 /* Test Pause */ +#define TEST_TST_BACKP 0x00000004 /* Test Back Pressure */ + +/* MII Management Configuration Register */ +#define MCFG_SCAN_INC 0x00000001 /* Scan Increment PHY Address */ +#define MCFG_SUPP_PREAM 0x00000002 /* Suppress Preamble */ +#define MCFG_CLK_SEL 0x0000001C /* Clock Select Mask */ +#define MCFG_RES_MII 0x00008000 /* Reset MII Management Hardware */ + +#define MCFG_CLK_DIV28 0x0000001C /* MDC = hclk / 28 */ +#define MCFG_CLK_DIV36 0x00000020 +#define MCFG_CLK_DIV64 0x0000003c + +/* MII Management Command Register */ +#define MCMD_READ 0x00000001 /* MII Read */ +#define MCMD_SCAN 0x00000002 /* MII Scan continuously */ + +#define MII_WR_TOUT 0x00050000 /* MII Write timeout count */ +#define MII_RD_TOUT 0x00050000 /* MII Read timeout count */ + +/* MII Management Address Register */ +#define MADR_REG_ADR 0x0000001F /* MII Register Address Mask */ +#define MADR_PHY_ADR 0x00001F00 /* PHY Address Mask */ + +/* MII Management Indicators Register */ +#define MIND_BUSY 0x00000001 /* MII is Busy */ +#define MIND_SCAN 0x00000002 /* MII Scanning in Progress */ +#define MIND_NOT_VAL 0x00000004 /* MII Read Data not valid */ +#define MIND_MII_LINK_FAIL 0x00000008 /* MII Link Failed */ + +/* Command Register */ +#define CR_RX_EN 0x00000001 /* Enable Receive */ +#define CR_TX_EN 0x00000002 /* Enable Transmit */ +#define CR_REG_RES 0x00000008 /* Reset Host Registers */ +#define CR_TX_RES 0x00000010 /* Reset Transmit Datapath */ +#define CR_RX_RES 0x00000020 /* Reset Receive Datapath */ +#define CR_PASS_RUNT_FRM 0x00000040 /* Pass Runt Frames */ +#define CR_PASS_RX_FILT 0x00000080 /* Pass RX Filter */ +#define CR_TX_FLOW_CTRL 0x00000100 /* TX Flow Control */ +#define CR_RMII 0x00000200 /* Reduced MII Interface */ +#define CR_FULL_DUP 0x00000400 /* Full Duplex */ + +/* Status Register */ +#define SR_RX_EN 0x00000001 /* Enable Receive */ +#define SR_TX_EN 0x00000002 /* Enable Transmit */ + +/* Transmit Status Vector 0 Register */ +#define TSV0_CRC_ERR 0x00000001 /* CRC error */ +#define TSV0_LEN_CHKERR 0x00000002 /* Length Check Error */ +#define TSV0_LEN_OUTRNG 0x00000004 /* Length Out of Range */ +#define TSV0_DONE 0x00000008 /* Tramsmission Completed */ +#define TSV0_MCAST 0x00000010 /* Multicast Destination */ +#define TSV0_BCAST 0x00000020 /* Broadcast Destination */ +#define TSV0_PKT_DEFER 0x00000040 /* Packet Deferred */ +#define TSV0_EXC_DEFER 0x00000080 /* Excessive Packet Deferral */ +#define TSV0_EXC_COLL 0x00000100 /* Excessive Collision */ +#define TSV0_LATE_COLL 0x00000200 /* Late Collision Occured */ +#define TSV0_GIANT 0x00000400 /* Giant Frame */ +#define TSV0_UNDERRUN 0x00000800 /* Buffer Underrun */ +#define TSV0_BYTES 0x0FFFF000 /* Total Bytes Transferred */ +#define TSV0_CTRL_FRAME 0x10000000 /* Control Frame */ +#define TSV0_PAUSE 0x20000000 /* Pause Frame */ +#define TSV0_BACK_PRESS 0x40000000 /* Backpressure Method Applied */ +#define TSV0_VLAN 0x80000000 /* VLAN Frame */ + +/* Transmit Status Vector 1 Register */ +#define TSV1_BYTE_CNT 0x0000FFFF /* Transmit Byte Count */ +#define TSV1_COLL_CNT 0x000F0000 /* Transmit Collision Count */ + +/* Receive Status Vector Register */ +#define RSV_BYTE_CNT 0x0000FFFF /* Receive Byte Count */ +#define RSV_PKT_IGNORED 0x00010000 /* Packet Previously Ignored */ +#define RSV_RXDV_SEEN 0x00020000 /* RXDV Event Previously Seen */ +#define RSV_CARR_SEEN 0x00040000 /* Carrier Event Previously Seen */ +#define RSV_REC_CODEV 0x00080000 /* Receive Code Violation */ +#define RSV_CRC_ERR 0x00100000 /* CRC Error */ +#define RSV_LEN_CHKERR 0x00200000 /* Length Check Error */ +#define RSV_LEN_OUTRNG 0x00400000 /* Length Out of Range */ +#define RSV_REC_OK 0x00800000 /* Frame Received OK */ +#define RSV_MCAST 0x01000000 /* Multicast Frame */ +#define RSV_BCAST 0x02000000 /* Broadcast Frame */ +#define RSV_DRIB_NIBB 0x04000000 /* Dribble Nibble */ +#define RSV_CTRL_FRAME 0x08000000 /* Control Frame */ +#define RSV_PAUSE 0x10000000 /* Pause Frame */ +#define RSV_UNSUPP_OPC 0x20000000 /* Unsupported Opcode */ +#define RSV_VLAN 0x40000000 /* VLAN Frame */ + +/* Flow Control Counter Register */ +#define FCC_MIRR_CNT 0x0000FFFF /* Mirror Counter */ +#define FCC_PAUSE_TIM 0xFFFF0000 /* Pause Timer */ + +/* Flow Control Status Register */ +#define FCS_MIRR_CNT 0x0000FFFF /* Mirror Counter Current */ + +/* Receive Filter Control Register */ +#define RFC_UCAST_EN 0x00000001 /* Accept Unicast Frames Enable */ +#define RFC_BCAST_EN 0x00000002 /* Accept Broadcast Frames Enable */ +#define RFC_MCAST_EN 0x00000004 /* Accept Multicast Frames Enable */ +#define RFC_UCAST_HASH_EN 0x00000008 /* Accept Unicast Hash Filter Frames */ +#define RFC_MCAST_HASH_EN 0x00000010 /* Accept Multicast Hash Filter Fram.*/ +#define RFC_PERFECT_EN 0x00000020 /* Accept Perfect Match Enable */ +#define RFC_MAGP_WOL_EN 0x00001000 /* Magic Packet Filter WoL Enable */ +#define RFC_PFILT_WOL_EN 0x00002000 /* Perfect Filter WoL Enable */ + +/* Receive Filter WoL Status/Clear Registers */ +#define WOL_UCAST 0x00000001 /* Unicast Frame caused WoL */ +#define WOL_BCAST 0x00000002 /* Broadcast Frame caused WoL */ +#define WOL_MCAST 0x00000004 /* Multicast Frame caused WoL */ +#define WOL_UCAST_HASH 0x00000008 /* Unicast Hash Filter Frame WoL */ +#define WOL_MCAST_HASH 0x00000010 /* Multicast Hash Filter Frame WoL */ +#define WOL_PERFECT 0x00000020 /* Perfect Filter WoL */ +#define WOL_RX_FILTER 0x00000080 /* RX Filter caused WoL */ +#define WOL_MAG_PACKET 0x00000100 /* Magic Packet Filter caused WoL */ + +/* Interrupt Status/Enable/Clear/Set Registers */ +#define INT_RX_OVERRUN 0x00000001 /* Overrun Error in RX Queue */ +#define INT_RX_ERR 0x00000002 /* Receive Error */ +#define INT_RX_FIN 0x00000004 /* RX Finished Process Descriptors */ +#define INT_RX_DONE 0x00000008 /* Receive Done */ +#define INT_TX_UNDERRUN 0x00000010 /* Transmit Underrun */ +#define INT_TX_ERR 0x00000020 /* Transmit Error */ +#define INT_TX_FIN 0x00000040 /* TX Finished Process Descriptors */ +#define INT_TX_DONE 0x00000080 /* Transmit Done */ +#define INT_SOFT_INT 0x00001000 /* Software Triggered Interrupt */ +#define INT_WAKEUP 0x00002000 /* Wakeup Event Interrupt */ + +/* Power Down Register */ +#define PD_POWER_DOWN 0x80000000 /* Power Down MAC */ + +/* RX Descriptor Control Word */ +#define RCTRL_SIZE 0x000007FF /* Buffer size mask */ +#define RCTRL_INT 0x80000000 /* Generate RxDone Interrupt */ + +/* RX Status Hash CRC Word */ +#define RHASH_SA 0x000001FF /* Hash CRC for Source Address */ +#define RHASH_DA 0x001FF000 /* Hash CRC for Destination Address */ + +/* RX Status Information Word */ +#define RINFO_SIZE 0x000007FF /* Data size in bytes */ +#define RINFO_CTRL_FRAME 0x00040000 /* Control Frame */ +#define RINFO_VLAN 0x00080000 /* VLAN Frame */ +#define RINFO_FAIL_FILT 0x00100000 /* RX Filter Failed */ +#define RINFO_MCAST 0x00200000 /* Multicast Frame */ +#define RINFO_BCAST 0x00400000 /* Broadcast Frame */ +#define RINFO_CRC_ERR 0x00800000 /* CRC Error in Frame */ +#define RINFO_SYM_ERR 0x01000000 /* Symbol Error from PHY */ +#define RINFO_LEN_ERR 0x02000000 /* Length Error */ +#define RINFO_RANGE_ERR 0x04000000 /* Range Error (exceeded max. size) */ +#define RINFO_ALIGN_ERR 0x08000000 /* Alignment Error */ +#define RINFO_OVERRUN 0x10000000 /* Receive overrun */ +#define RINFO_NO_DESCR 0x20000000 /* No new Descriptor available */ +#define RINFO_LAST_FLAG 0x40000000 /* Last Fragment in Frame */ +#define RINFO_ERR 0x80000000 /* Error Occured (OR of all errors) */ + +#define RINFO_ERR_MASK (RINFO_FAIL_FILT | RINFO_CRC_ERR | RINFO_SYM_ERR | \ + RINFO_LEN_ERR | RINFO_ALIGN_ERR | RINFO_OVERRUN) + +/* TX Descriptor Control Word */ +#define TCTRL_SIZE 0x000007FF /* Size of data buffer in bytes */ +#define TCTRL_OVERRIDE 0x04000000 /* Override Default MAC Registers */ +#define TCTRL_HUGE 0x08000000 /* Enable Huge Frame */ +#define TCTRL_PAD 0x10000000 /* Pad short Frames to 64 bytes */ +#define TCTRL_CRC 0x20000000 /* Append a hardware CRC to Frame */ +#define TCTRL_LAST 0x40000000 /* Last Descriptor for TX Frame */ +#define TCTRL_INT 0x80000000 /* Generate TxDone Interrupt */ + +/* TX Status Information Word */ +#define TINFO_COL_CNT 0x01E00000 /* Collision Count */ +#define TINFO_DEFER 0x02000000 /* Packet Deferred (not an error) */ +#define TINFO_EXCESS_DEF 0x04000000 /* Excessive Deferral */ +#define TINFO_EXCESS_COL 0x08000000 /* Excessive Collision */ +#define TINFO_LATE_COL 0x10000000 /* Late Collision Occured */ +#define TINFO_UNDERRUN 0x20000000 /* Transmit Underrun */ +#define TINFO_NO_DESCR 0x40000000 /* No new Descriptor available */ +#define TINFO_ERR 0x80000000 /* Error Occured (OR of all errors) */ + +/* ENET Device Revision ID */ +#define OLD_EMAC_MODULE_ID 0x39022000 /* Rev. ID for first rev '-' */ + +/* DP83848C PHY Registers */ +#define PHY_REG_BMCR 0x00 /* Basic Mode Control Register */ +#define PHY_REG_BMSR 0x01 /* Basic Mode Status Register */ +#define PHY_REG_IDR1 0x02 /* PHY Identifier 1 */ +#define PHY_REG_IDR2 0x03 /* PHY Identifier 2 */ +#define PHY_REG_ANAR 0x04 /* Auto-Negotiation Advertisement */ +#define PHY_REG_ANLPAR 0x05 /* Auto-Neg. Link Partner Abitily */ +#define PHY_REG_ANER 0x06 /* Auto-Neg. Expansion Register */ +#define PHY_REG_ANNPTR 0x07 /* Auto-Neg. Next Page TX */ + +/* PHY Extended Registers */ +#define PHY_REG_STS 0x10 /* Status Register */ +#define PHY_REG_MICR 0x11 /* MII Interrupt Control Register */ +#define PHY_REG_MISR 0x12 /* MII Interrupt Status Register */ +#define PHY_REG_FCSCR 0x14 /* False Carrier Sense Counter */ +#define PHY_REG_RECR 0x15 /* Receive Error Counter */ +#define PHY_REG_PCSR 0x16 /* PCS Sublayer Config. and Status */ +#define PHY_REG_RBR 0x17 /* RMII and Bypass Register */ +#define PHY_REG_LEDCR 0x18 /* LED Direct Control Register */ +#define PHY_REG_PHYCR 0x19 /* PHY Control Register */ +#define PHY_REG_10BTSCR 0x1A /* 10Base-T Status/Control Register */ +#define PHY_REG_CDCTRL1 0x1B /* CD Test Control and BIST Extens. */ +#define PHY_REG_EDCR 0x1D /* Energy Detect Control Register */ + +#define PHY_FULLD_100M 0x2100 /* Full Duplex 100Mbit */ +#define PHY_HALFD_100M 0x2000 /* Half Duplex 100Mbit */ +#define PHY_FULLD_10M 0x0100 /* Full Duplex 10Mbit */ +#define PHY_HALFD_10M 0x0000 /* Half Duplex 10MBit */ +#define PHY_AUTO_NEG 0x3000 /* Select Auto Negotiation */ + +#define DP83848C_DEF_ADR 0x0100 /* Default PHY device address */ +#define DP83848C_ID 0x20005C90 /* PHY Identifier */ + +// Ethernet power/clock control bit in PCONP register +#define PCENET 0x40000000 +// Ethernet configuration for PINSEL2, as per user guide section 5.3 +#define ENET_PINSEL2_CONFIG 0x50150105 +// Ethernet configuration for PINSEL3, as per user guide section 5.4 +#define ENET_PINSEL3_CONFIG 0x00000005 +// Only bottom byte of PINSEL3 relevant to Ethernet +#define ENET_PINSEL3_MASK 0x0000000F + + +/************************************************* + * CodeRed - PHY definitions for RDB1768 rev 2 + * which uses SMSC LAN8720 PHY instead of DP83848C + *************************************************/ +#define LAN8720_ID 0x0007C0F0 /* PHY Identifier */ + + +void Init_EthMAC(void); +void RequestSend(unsigned short FrameSize); +unsigned short StartReadingFrame(void); +void StopReadingFrame(void); +unsigned int CheckIfFrameReceived(void); +void WriteFrame_EthMAC(unsigned char Data); +unsigned char ReadFrame_EthMAC(void); +void ethernet_power_down(void); + + +#endif + diff --git a/TP1_labyrinth_slave_etu/src/fonts.h b/TP1_labyrinth_slave_etu/src/fonts.h new file mode 100644 index 0000000000000000000000000000000000000000..602ae770ff158d01c9526709b2d73b3e2ef57e34 --- /dev/null +++ b/TP1_labyrinth_slave_etu/src/fonts.h @@ -0,0 +1,18 @@ +/* + * fonts.h + * + * Created on: 19 avr. 2016 + * Author: cma + */ + +#ifndef INC_FONTS_H_ +#define INC_FONTS_H_ + +#define fontdatatype const unsigned char +extern fontdatatype SmallFont[]; +extern fontdatatype BigFont[]; + +#define SMALLFONT 0 +#define BIGFONT 1 + +#endif /* INC_FONTS_H_ */ diff --git a/TP1_labyrinth_slave_etu/src/labyrinth_slave.c b/TP1_labyrinth_slave_etu/src/labyrinth_slave.c new file mode 100644 index 0000000000000000000000000000000000000000..ac49ec0041de70ee25585a5b32e0f5a38dd8afa3 --- /dev/null +++ b/TP1_labyrinth_slave_etu/src/labyrinth_slave.c @@ -0,0 +1,77 @@ +/* +=============================================================================== + Name : labyrinth_slave.c + Author : V. Pilloux + Date : 23.10.2017 + Description : TP1 Labyrinth solution, slave code. The slave only transmits + the accelerometer data to the master and displays the balls at + the positions given by the master. + The Ethernet interrupt is masked when the data has to be used + in the main to avoid an overriding during the variables use. +=============================================================================== +*/ + +#include "LPC17xx.h" + +#include <stdbool.h> +#include <stdio.h> +#include <string.h> +#include <cr_section_macros.h> +#include "lcd.h" +#include "accelerometer.h" +#include "ethernet_mgt.h" +#include "tools.h" + +#define NUMBER_OF_BALLS 5 // min 1 +#define BALL_DISP_PERIOD 20 // ms +#define BALL_RADIUS 5 +#define LCD_YELLOW (LCD_GREEN | LCD_RED) +#define NONE -1 + +#define GOAL_H_WALL (LCD_MAX_WIDTH-(2*BALL_RADIUS+1+WALL_WIDTH)) +#define GOAL_V_WALL (LCD_MAX_HEIGHT-(2*BALL_RADIUS+1+WALL_WIDTH)-1) + + +static coord_fx_t labyrinth_points[]={ + {80,280},{40,280},{40,190},{END_OF_LINE,LCD_WHITE}, + {40,100},{150,100},{150,160},{70,160},{END_OF_LINE,LCD_WHITE}, + {0,160},{40,160},{END_OF_LINE,LCD_WHITE}, + {70,190},{180,190},{180,80},{END_OF_LINE,LCD_WHITE}, + {210,100},{238,100},{END_OF_LINE,LCD_WHITE}, + {180,220},{238,220},{END_OF_LINE,LCD_WHITE}, + {0,40},{100,40},{END_OF_LINE,LCD_WHITE}, + {140,40},{237,40},{END_OF_LINE,LCD_WHITE}, + {120,220},{120,300},{END_OF_LINE,LCD_GREEN}, + {GOAL_H_WALL-2*BALL_RADIUS,GOAL_V_WALL},{LCD_MAX_WIDTH-1,GOAL_V_WALL},{END_OF_LINE,LCD_GREEN}, + {GOAL_H_WALL-4*BALL_RADIUS-WALL_WIDTH-1,LCD_MAX_HEIGHT-WALL_WIDTH},{GOAL_H_WALL-4*BALL_RADIUS-WALL_WIDTH-1,GOAL_V_WALL},{END_OF_WALLS,END_OF_WALLS} +}; + + +/* Description: Callback of ethernet module. This function is called when a message is received. + * Each ball of the master send its own coordinates that are saved here. + * Parameters: data: pointer on data received + * len: length of the data [bytes] + */ +void master_info_rx(void *data, int len) +{ + // receive master_tx structure +} + +int main(void) +{ + init_lcd(); + if(accel_init() != 0) + { + printf("Accelerometer initialisation failed!\n"); + return 1; + } + //ethernet_init(..., master_info_rx); + + draw_labyrinth(labyrinth_points); + + while(1) + { + + } +} + diff --git a/TP1_labyrinth_slave_etu/src/lcd.h b/TP1_labyrinth_slave_etu/src/lcd.h new file mode 100644 index 0000000000000000000000000000000000000000..b07e4d8f7f58be869289a33ac38e1667e4cf321e --- /dev/null +++ b/TP1_labyrinth_slave_etu/src/lcd.h @@ -0,0 +1,231 @@ +/* + * lcd.h + * + * Created on: 27 févr. 2014 + * Updated on: 28.9.2016 + * Authors: F. Vannel, V. Pilloux + * + * Note: the RGB screen colors (if coded with 16 bits) have the following format: + * blue: bits 4..0 + * green: bits 10..5 + * red: bits 15..11 + */ + +#ifndef LCD_H_ +#define LCD_H_ + +#ifdef __USE_CMSIS +#include "LPC17xx.h" +#endif + +#include <stdarg.h> +#include <stdbool.h> +#include <stdint.h> +#include "ssp.h" +#include "fonts.h" + +// LCD predefined colors +#define LCD_BLUE (0xF<<1) +#define LCD_GREEN (0x3f<<5) +#define LCD_RED (0x1f<<11) +#define LCD_WHITE 0xFFFF +#define LCD_BLACK 0 + +// screen size +#define LCD_MAX_HEIGHT (320) +#define LCD_MAX_WIDTH (240) + + +#define DISPLAY_ON() Write_Instruction(0xaf) // Display on +#define DISPLAY_OFF() Write_Instruction(0xae) // Display off +#define SET_ADC() Write_Instruction(0xa1) // Reverse disrect (SEG128-SEG0) +#define CLEAR_ADC() Write_Instruction(0xa0) // Normal disrect (SEG0-SEG128) +#define REVERSE_DISPLAY_ON() Write_Instruction(0xa7) // Reverse display : 0 illuminated +#define REVERSE_DISPLAY_OFF() Write_Instruction(0xa6) // Normal display : 1 illuminated +#define ENTIRE_DISPLAY_ON() Write_Instruction(0xa5) // Entire display Force whole LCD point +#define ENTIRE_DISPLAY_OFF() Write_Instruction(0xa4) // Normal display +#define SET_BIAS() Write_Instruction(0xa3) // bias 1 1/7 bias +#define CLEAR_BIAS() Write_Instruction(0xa2) // bias 0 1/9 bias +#define SET_MODIFY_READ() Write_Instruction(0xe0) // Stop automatic increment of the column address by the read instruction +#define RESET_MODIFY_READ() Write_Instruction(0xee) // Cancel Modify_read, column address return to its initial value just before the Set Modify Read instruction is started +#define RESET() Write_Instruction(0xe2) +#define SET_SHL() Write_Instruction(0xc8) // SHL 1,COM33-COM0 +#define CLEAR_SHL() Write_Instruction(0xc0) // SHL 0,COM0-COM33 + +#define LCD_CS_PIN 16 +#define LCD_RS_PORT 1 // D/C DATA/COMMAND SELECT +#define LCD_RS_PIN 30 + +// sck, mosi, miso is setup within ssp_init +// LCD_RS = D/Cx line. Must be 0 for a command, 1 for data. +// WARNING: LCD_CS_ENA() is called by lcd_init() only. If another peripheral uses SSP, LCD_CS_DIS() must be called. +// If the screen is required again, LCD_CS_ENA() must be called again! +#define LCD_CS_ENA() {LPC_GPIO0->FIOCLR=(1<<LCD_CS_PIN);} +#define LCD_CS_DIS() { while ((LPC_SSP0->SR & SSPSR_BSY)); \ + LPC_GPIO0->FIOSET=(1<<LCD_CS_PIN);} + + +/* Description: LCD initialisation. Must be called before any other function. */ +void init_lcd(void); + +/* Description: fill the screen with the defined color in RGB format (see above) + * Parameter: color: RGB 16 bits color (see format description above) + */ +void clear_screen(unsigned int color); + +/* Description: print text (with printf equivalent formatting) at the last line of screen with + * specified color. Automatic line wrapping is implemented, as \n and \r characters. + * Parameters: color: RGB 16 bits color of the text + * back_color: RGB 16 bits color of the text backround + * st: string in "printf format" followed by any parameter + * Return: string length [pixels] + */ +uint16_t lcd_printf(int color, int back_color, char *st, ...); + +/* Description: print text (with printf equivalent formatting) at the specified position and color + * Parameters: x: horizontal position of the text to print + * y: vertical position of the text to print + * font_size: BIGFONT or SMALLFONT + * color: RGB 16 bits color of the text + * back_color: RGB 16 bits color of the text backround + * st: string in "printf format" followed by any parameter + * Return: string length [char] + */ +uint16_t lcd_print(int x, int y, int font_size, int color, int back_color, char *st, ...); + +/* Description: setup scroll type + * Parameter: top_fixed_lines: number of the first lines that are fixed (not scrolled) + * scroll_lines: number of lines to scroll + * bottom_fixed_lines: number of the last lines that are fixed (not scrolled) + */ +void setup_scroll(uint16_t top_fixed_lines, uint16_t scroll_lines, uint16_t bottom_fixed_lines); + +/* Description: scroll the screen vertically + * Parameter: offset: scroll length [pixels] + */ +void lcd_scroll(int offset); + +/* Description: print one character at any position + * Parameter: c: character to print + * x: horizontal position of the character to print + * y: vertical position of the character to print + * color:RGB 16 bits color of the text + * font_size: BIGFONT or SMALLFONT + */ +void lcd_print_char(char c, int x, int y, int color, int back_color, int font_size); + +/* Description: draw an empty circle + * Parameter: x_centre: horizontal position of the center of the circle + * y_centre: vertical position of the center of the circle + * r: circle radius + * color:RGB 16 bits color of the text + */ +void lcd_circle(int x_centre, int y_centre, int r, unsigned int color); + +/* Description: draw a filled circle + * Parameter: x_centre: horizontal position of the center of the circle + * y_centre: vertical position of the center of the circle + * r: circle radius + * color:RGB 16 bits color of the circle + */ +void lcd_filled_circle(int x_centre, int y_centre, int r, unsigned int color); + +/* Description: draw a filled circle + * Parameter: x_centre: horizontal position of the center of the circle + * y_centre: vertical position of the center of the circle + * r: circle radius + * color:RGB 16 bits foreground color of the circle + * background_color: background color of the square around the circle + */ +void lcd_filled_circle_on_square(int x_centre, int y_centre, int r, + unsigned int color, unsigned int background_color); + +/* Description: draw a line + * Parameter: x1: horizontal position of one line extremity + * y1: vertical position of one line extremity + * x2: horizontal position of the second line extremity + * y2: vertical position of the second line extremity + * color:RGB 16 bits color of the text + */ +void lcd_line(int x1, int y1, int x2, int y2, unsigned int color); + +/* Description: draw an horizontal line + * Parameter: x1: left horizontal position of one the line + * y1: vertical position of the line + * l: line length + * color:RGB 16 bits color of the text + */ +void lcd_lineH(int x, int y, int l, unsigned int color) ; + +/* Description: draw an vertical line + * Parameter: x1: left horizontal position of one the line + * y1: vertical position of the line + * l: line length + * color:RGB 16 bits color of the text + */ +void lcd_lineV(int x, int y, int l, unsigned int color); + +/* Description: draw an empty rectangle + * Parameter: x1: horizontal position of the top left corner + * y1: vertical position of the top left corner + * x2: horizontal position of the bottom right corner + * y2: vertical position of the bottom right corner + * color:RGB 16 bits color of the text + */ +void lcd_empty_rectangle(int x1, int y1, int x2, int y2, int color); + +/* Description: draw plain rectangle + * Parameter: x1: horizontal position of the top left corner + * y1: vertical position of the top left corner + * x2: horizontal position of the bottom right corner + * y2: vertical position of the bottom right corner + * color:RGB 16 bits color of the text + */ +void lcd_filled_rectangle(int x1, int y1, int x2, int y2, int color); + +/* Description: read an image in a file of BMP format, adapts it to the LCD format and + * put it in memory. The number of pixel of the image width must be a multiple of 4. + * Parameter: filename: filename of a BMP file + * + * Return: width: image width [pixels] + * height: image height [pixels] + * return value: pointer on the image in memory or NULL if an error occurred + */ +uint16_t *read_bmp_file(char *filename, uint16_t *width, uint16_t *height); + +/* Description: display an image stored in memory + * Parameter: bitmap: pointer on the image in memory. Each word of 16 bits represents the + * color of one pixel. The pixel are stored from left to right line by + * line from top to bottom. + * x: horizontal position of the top left corner + * y: vertical position of the top left corner + * width: image width + * height: image height + */ +void display_bitmap16(uint16_t *bitmap, uint16_t x, uint16_t y, uint16_t width, uint16_t height); + +/* Description: get pixel colors in a rectangle (16 bits format) + * Parameter: x1: horizontal position of the top left corner + * y1: vertical position of the top left corner + * x2: horizontal position of the bottom right corner + * y2: vertical position of the bottom right corner + * out: pointer on the 16 bits colors of the pixels in the rectangle + */ +void read_pixels(uint8_t x1, uint16_t y1, uint8_t x2, uint16_t y2, uint16_t *out); + + +/* Description: reads data of any command that gets data on LCD + * Parameter: read_cmd: LCD command word + * data_read: pointer on data to be read + * len: data length + */ +void read_cmd(uint8_t read_cmd, uint8_t *data_read, uint16_t len); + +// macro utilities +#define swap(type, i, j) {type t = i; i = j; j = t;} +#define MAX(x,y) (((x)>(y))?(x):(y)) +#define MIN(x,y) (((x)<(y))?(x):(y)) +#define ABS(x) (((x)<0)?-(x):(x)) + + +#endif /* LCD_H_ */ diff --git a/TP1_labyrinth_slave_etu/src/ssp.h b/TP1_labyrinth_slave_etu/src/ssp.h new file mode 100644 index 0000000000000000000000000000000000000000..5584d85c06dbd3cb32c8d21c4c88a7bd509a14a2 --- /dev/null +++ b/TP1_labyrinth_slave_etu/src/ssp.h @@ -0,0 +1,24 @@ +/* + * ssp.h + * + * Created on: 12 mars 2014 + * Author: christian + */ + +#ifndef SSP_H_ +#define SSP_H_ + +#include "LPC17xx.h" + +#define SSPSR_TFE (1 << 0) +#define SSPSR_TNF (1 << 1) +#define SSPSR_RNE (1 << 2) +#define SSPSR_RFF (1 << 3) +#define SSPSR_BSY (1 << 4) + + +void ssp_init_custom(uint8_t data_size_select, uint8_t scr); +void ssp_send_buf(uint8_t *buf, uint32_t length); +void ssp_receive_buf(uint8_t *buf, uint32_t length); + +#endif /* SSP_H_ */ diff --git a/TP1_labyrinth_slave_etu/src/tools.c b/TP1_labyrinth_slave_etu/src/tools.c new file mode 100644 index 0000000000000000000000000000000000000000..a7b6264d8e04d96978be30afa38a12d7ba4534b6 --- /dev/null +++ b/TP1_labyrinth_slave_etu/src/tools.c @@ -0,0 +1,127 @@ +/* + * tools.c + * + * Created on: 22 oct. 2017 + * Author: vince + */ + +#include <math.h> +#include "tools.h" +#include "lcd.h" + +int round(float x) +{ + if (x>=.5) + return (int)ceil(x); + if (x<=-.5) + return (int)floor(x); + return 0; +} + + +void draw_labyrinth(coord_fx_t *labyrinth_points) +{ + int i=0, color=LCD_WHITE; + + clear_screen(LCD_BLACK); + do { + while (labyrinth_points[++i].x>=0) + { + lcd_filled_rectangle( + labyrinth_points[i-1].x>labyrinth_points[i].x?labyrinth_points[i-1].x+WALL_WIDTH-1:labyrinth_points[i-1].x, + labyrinth_points[i-1].y>labyrinth_points[i].y?labyrinth_points[i-1].y+WALL_WIDTH-1:labyrinth_points[i-1].y, + labyrinth_points[i-1].x==labyrinth_points[i].x?labyrinth_points[i].x+WALL_WIDTH-1:labyrinth_points[i].x, + labyrinth_points[i-1].y==labyrinth_points[i].y?labyrinth_points[i].y+WALL_WIDTH-1:labyrinth_points[i].y, + color); + } + color=labyrinth_points[i].y; + } while (labyrinth_points[i++].x!=END_OF_WALLS); +} + + +/* detect all collisions among all object in every direction + * Return: collision vector index or NO_COLLISION + */ +int test_collision(object_t *object) +{ + uint16_t tp[2*MAX_RADIUS+1], i, k; + int offset_x, offset_y; + int col_dir_idx=0; // keep track of collision points around max_dir + coord_fx_t speed, pos; + float speed_max; + + // test collision at next position of the object. ! to rounding ! + pos.x=round(object->pos.x+object->speed.x); + pos.y=round(object->pos.y+object->speed.y); + speed.x=pos.x-round(object->pos.x); + speed.y=pos.y-round(object->pos.y); + // test screen bounds: + if (pos.x<object->radius) + col_dir_idx|=TOUCH_LEFT; + if (pos.x>LCD_MAX_WIDTH-object->radius-1) + col_dir_idx|=TOUCH_RIGHT; + if (pos.y<object->radius) + col_dir_idx|=TOUCH_UP; + if (pos.y>LCD_MAX_HEIGHT-object->radius-1) + col_dir_idx|=TOUCH_DOWN; + if (col_dir_idx) + return col_dir_idx; + + speed_max=MAX(ABS(speed.x), ABS(speed.y)); + for (k=1; k<=speed_max; k++) // test line by line if there is a collision, going forward of 1 pixel + { + pos.x=round(object->pos.x+object->speed.x*(float)k/speed_max); + pos.y=round(object->pos.y+object->speed.y*(float)k/speed_max); + speed.x=pos.x-round(object->pos.x); + speed.y=pos.y-round(object->pos.y); + offset_x=speed.x?1:0; // to adjust size of the front detection line + offset_y=speed.y?1:0; + if (speed.y>0) // test low horizontal line of pixel of the object width (on new position), except pixel on corner! + { + read_pixels((uint8_t)(pos.x-object->radius+offset_x), (uint16_t)(pos.y+object->radius), + (uint8_t)(pos.x+object->radius-offset_x), (uint16_t)(pos.y+object->radius), tp); + for (i=0; i<=2*(object->radius-offset_x); i++) + if (tp[i]) + { + col_dir_idx|=TOUCH_DOWN; + break; + } + } + if (speed.y<0) + { + read_pixels((uint8_t)(pos.x-object->radius+offset_x), (uint16_t)(pos.y-object->radius), + (uint8_t)(pos.x+object->radius-offset_x), (uint16_t)(pos.y-object->radius), tp); + for (i=0; i<=2*(object->radius-offset_x); i++) + if (tp[i]) + { + col_dir_idx|=TOUCH_UP; + break; + } + } + if (speed.x>0) // test right vertical line of pixel of the object width (on new position) except corner pixel + { + read_pixels((uint8_t)(pos.x+object->radius), (uint16_t)(pos.y-object->radius+offset_y), + (uint8_t)(pos.x+object->radius), (uint16_t)(pos.y+object->radius-offset_y), tp); + for (i=0; i<=2*(object->radius-offset_y); i++) + if (tp[i]) + { + col_dir_idx|=TOUCH_RIGHT; + break; + } + } + if (speed.x<0) + { + read_pixels((uint8_t)(pos.x-object->radius), (uint16_t)(pos.y-object->radius+offset_y), + (uint8_t)(pos.x-object->radius), (uint16_t)(pos.y+object->radius-offset_y), tp); + for (i=0; i<=2*(object->radius-offset_y); i++) + if (tp[i]) + { + col_dir_idx|=TOUCH_LEFT; + break; + } + } + if (col_dir_idx) + break; + } + return col_dir_idx; +} diff --git a/TP1_labyrinth_slave_etu/src/tools.h b/TP1_labyrinth_slave_etu/src/tools.h new file mode 100644 index 0000000000000000000000000000000000000000..e996599435e1130f7e050bf1eced03ade09c6d11 --- /dev/null +++ b/TP1_labyrinth_slave_etu/src/tools.h @@ -0,0 +1,78 @@ +/* + * Name : tools.h + * Author : VP + * Date : 23.10.2017 + * Description : utility functions to draw the labyrinth and to test object collisions + */ + +#ifndef TOOLS_H_ +#define TOOLS_H_ + +#include <stdint.h> + +#define MAX_RADIUS 15 // maximum radius of an object +#define WALL_WIDTH 3 // labyrinth wall width +#define END_OF_LINE -1 // 'x' coordinate of labyrinth indicating the end of a wall +#define END_OF_WALLS -2 // ^y' coordinate of labyrinth indicating the end of the point table + +// constants used to build the collision vector (see function test_collision) +enum { + NO_COLLISION=0, + TOUCH_LEFT=(1<<2), + TOUCH_RIGHT=(1<<0), + TOUCH_UP=(1<<1), + TOUCH_DOWN=(1<<3), +}; + +typedef struct +{ + float x; + float y; +} coord_t; + +typedef struct +{ + int x; + int y; +} coord_fx_t; + +// defines a "squared" object. "pos" defines the position of the center of the object +// and radius is the number of pixels considered around pos in x and y directions +typedef struct +{ + coord_t pos; + coord_t speed; + uint8_t radius; + uint16_t color; + uint16_t period; // display period [ms] +} object_t; + +typedef struct { + int ball_id; + coord_fx_t ball_coord; + uint16_t color; + uint8_t radius; + int8_t winner; + //uint32_t dbg_cptr; +} master_tx_t; + +// rounds a float on an integer, whatever its sign +int round(float x); + + +/* draw the labyrinth. The wall description is an array of points. 2 successive points must have at least + * one common coordinate, either x or y since only vertical or horizontal lines are allowed. To end a line, + * END_OF_LINE must replace the x coordinate, while feeding y with the line color of the next line. The end of the array + * is marked with the point {END_OF_WALLS,END_OF_WALLS} + * Parameter: labyrinth_points: pointer on the array of points + * */ +void draw_labyrinth(coord_fx_t *labyrinth_points); + +/* detect all collisions among all objects in every direction. + * Parameter: object: object that tests collisions + * Return: collision vector index or NO_COLLISION. The vector is a bit vector indicating where the object touched + * an obstacle. Example of value returned: TOUCH_RIGHT | TOUCH_UP. + */ +int test_collision(object_t *object); + +#endif /* TOOLS_H_ */