diff --git a/.gitignore b/.gitignore index 7c96fd5b28..a60bae301c 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ +build_info.json ^bin/dep/all bin/* @@ -5,6 +6,9 @@ bin/* .project .settings/* *~ -config.mk +tools/make/config.mk cflie.* //version.c + +/cf2.* +/cf1.* diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000000..5e3d71a687 --- /dev/null +++ b/.travis.yml @@ -0,0 +1,21 @@ +sudo: required +language: c +services: + - docker +before_install: + - docker pull bitcraze/builder +script: + # Build CF2 basic + - docker run --rm -v ${PWD}:/module bitcraze/builder ./tools/build/build PLATFORM=CF2 + + # Build CF2 with "all" features enabled + - docker run --rm -v ${PWD}:/module bitcraze/builder ./tools/build/build clean + - docker run --rm -v ${PWD}:/module bitcraze/builder ./tools/build/build PLATFORM=CF2 DEBUG=1 "EXTRA_CFLAGS=-DCALIBRATED_LED_MORSE -DIMU_TAKE_ACCEL_BIAS -DIMU_MPU6500_DLPF_256HZ -DMADWICK_QUATERNION_IMU -DDEBUG_QUEUE_MONITOR" + + # Build CF1 + - docker run --rm -v ${PWD}:/module bitcraze/builder ./tools/build/build clean + - docker run --rm -v ${PWD}:/module bitcraze/builder ./tools/build/build PLATFORM=CF1 + + # Build CF1 with "all" features enabled + - docker run --rm -v ${PWD}:/module bitcraze/builder ./tools/build/build clean + - docker run --rm -v ${PWD}:/module bitcraze/builder ./tools/build/build PLATFORM=CF1 DEBUG=1 diff --git a/Makefile b/Makefile index 9ccae3e4f8..d50a8318d8 100644 --- a/Makefile +++ b/Makefile @@ -3,8 +3,11 @@ # This Makefile compiles all the objet file to ./bin/ and the resulting firmware # image in ./cfX.elf and ./cfX.bin -#Put your personal build config in config.mk and DO NOT COMMIT IT! --include config.mk +# Put your personal build config in tools/make/config.mk and DO NOT COMMIT IT! +# Make a copy of tools/make/config.mk.example to get you started +-include tools/make/config.mk + +CFLAGS += $(EXTRA_CFLAGS) ######### JTAG and environment configuration ########## OPENOCD ?= openocd @@ -26,9 +29,6 @@ OPENOCD_TARGET ?= target/stm32f4x_stlink.cfg USE_FPU ?= 1 endif -## Flag that can be added to config.mk -# CFLAGS += -DUSE_ESKYLINK # Set CRTP link to E-SKY receiver -# CFLAGS += -DDEBUG_PRINT_ON_UART # Redirect the console output to the UART ifeq ($(PLATFORM), CF1) REV ?= F @@ -52,12 +52,12 @@ PORT = $(FREERTOS)/portable/GCC/ARM_CM3 endif ifeq ($(PLATFORM), CF1) -LINKER_DIR = scripts/F103/linker -ST_OBJ_DIR = scripts/F103 +LINKER_DIR = tools/make/F103/linker +ST_OBJ_DIR = tools/make/F103 endif ifeq ($(PLATFORM), CF2) -LINKER_DIR = scripts/F405/linker -ST_OBJ_DIR = scripts/F405 +LINKER_DIR = tools/make/F405/linker +ST_OBJ_DIR = tools/make/F405 endif STLIB = lib @@ -75,7 +75,7 @@ VPATH_CF2 += $(STLIB)/STM32_CPAL_Driver/src VPATH_CF2 += $(STLIB)/STM32_USB_Device_Library/Core/src VPATH_CF2 += $(STLIB)/STM32_USB_OTG_Driver/src VPATH_CF2 += $(STLIB)/STM32_CPAL_Driver/devices/stm32f4xx -VPATH_CF2 += deck/api +VPATH_CF2 += deck/api deck/core deck/drivers/src CRT0_CF2 = startup_stm32f40xx.o system_stm32f4xx.o # Should maybe be in separate file? @@ -115,41 +115,51 @@ endif ############### Source files configuration ################ # Init -PROJ_OBJ = main.o -PROJ_OBJ_CF1 = platform_cf1.o -PROJ_OBJ_CF2 = platform_cf2.o +PROJ_OBJ += main.o +PROJ_OBJ_CF1 += platform_cf1.o +PROJ_OBJ_CF2 += platform_cf2.o # Drivers PROJ_OBJ += exti.o nvic.o motors.o -PROJ_OBJ_CF1 += led_f103.o i2cdev_f103.o i2croutines.o adc_f103.o mpu6050.o hmc5883l.o ms5611.o nrf24l01.o eeprom.o -PROJ_OBJ_CF2 += led_f405.o mpu6500.o i2cdev_f405.o ws2812.o lps25h.o ak8963.o eeprom.o maxsonar.o -PROJ_OBJ_CF2 += uart_syslink.o swd.o uart1.o uart2.o +PROJ_OBJ_CF1 += led_f103.o i2cdev_f103.o i2croutines.o adc_f103.o mpu6050.o +PROJ_OBJ_CF1 += hmc5883l.o ms5611.o nrf24l01.o eeprom.o watchdog.o +PROJ_OBJ_CF2 += led_f405.o mpu6500.o i2cdev_f405.o ws2812_cf2.o lps25h.o +PROJ_OBJ_CF2 += ak8963.o eeprom.o maxsonar.o piezo.o +PROJ_OBJ_CF2 += uart_syslink.o swd.o uart1.o uart2.o watchdog.o PROJ_OBJ_CF2 += sonar.o # USB Files PROJ_OBJ_CF2 += usb_bsp.o usblink.o usbd_desc.o usb.o # Hal -PROJ_OBJ += crtp.o ledseq.o freeRTOSdebug.o +PROJ_OBJ += crtp.o ledseq.o freeRTOSdebug.o buzzer.o PROJ_OBJ_CF1 += imu_cf1.o pm_f103.o nrf24link.o ow_none.o uart.o PROJ_OBJ_CF2 += imu_cf2.o pm_f405.o syslink.o radiolink.o ow_syslink.o proximity.o # Modules PROJ_OBJ += system.o comm.o console.o pid.o crtpservice.o param.o mem.o PROJ_OBJ += commander.o controller.o sensfusion6.o stabilizer.o -PROJ_OBJ += log.o worker.o trigger.o sitaw.o -PROJ_OBJ_CF2 += neopixelring.o expbrd.o platformservice.o bigquad.o +PROJ_OBJ += log.o worker.o trigger.o sitaw.o queuemonitor.o +PROJ_OBJ_CF1 += sound_cf1.o +PROJ_OBJ_CF2 += platformservice.o sound_cf2.o +# Deck Core +PROJ_OBJ_CF2 += deck.o deck_info.o deck_drivers.o -# Expansion boards -PROJ_OBJ_CF2 += exptest.o +# Deck API PROJ_OBJ_CF2 += deck_constants.o PROJ_OBJ_CF2 += deck_digital.o PROJ_OBJ_CF2 += deck_analog.o +PROJ_OBJ_CF2 += buzzdeck.o + +# Decks +PROJ_OBJ_CF2 += bigquad.o +PROJ_OBJ_CF2 += exptest.o +PROJ_OBJ_CF2 += ledring12.o # Utilities PROJ_OBJ += filter.o cpuid.o cfassert.o eprintf.o crc.o fp16.o debug.o -PROJ_OBJ += version.o +PROJ_OBJ += version.o FreeRTOS-openocd.o PROJ_OBJ_CF1 += configblockflash.o PROJ_OBJ_CF2 += configblockeeprom.o @@ -188,7 +198,7 @@ INCLUDES_CF2 += -I$(STLIB)/STM32_CPAL_Driver/inc INCLUDES_CF2 += -I$(STLIB)/STM32_CPAL_Driver/devices/stm32f4xx INCLUDES_CF2 += -I$(STLIB)/STM32_USB_Device_Library/Core/inc INCLUDES_CF2 += -I$(STLIB)/STM32_USB_OTG_Driver/inc -INCLUDES_CF2 += -Ideck/interface +INCLUDES_CF2 += -Ideck/interface -I deck/drivers/interface ifeq ($(USE_FPU), 1) PROCESSOR = -mcpu=cortex-m4 -mthumb -mfloat-abi=hard -mfpu=fpv4-sp-d16 @@ -237,7 +247,7 @@ CFLAGS += -MD -MP -MF $(BIN)/dep/$(@).d -MQ $(@) CFLAGS += -ffunction-sections -fdata-sections ASFLAGS = $(PROCESSOR) $(INCLUDES) -LDFLAGS = --specs=nano.specs $(PROCESSOR) -Wl,-Map=$(PROG).map,--cref,--gc-sections +LDFLAGS = --specs=nano.specs $(PROCESSOR) -Wl,-Map=$(PROG).map,--cref,--gc-sections,--undefined=uxTopUsedPriority #Flags required by the ST library ifeq ($(CLOAD), 1) @@ -287,15 +297,13 @@ ifeq ($(SHELL),/bin/sh) endif print_version: compile -ifeq ($(SHELL),/bin/sh) - @./scripts/print_revision.sh -endif ifeq ($(PLATFORM), CF1) @echo "Crazyflie Nano (1.0) build!" endif ifeq ($(PLATFORM), CF2) - @echo "Crazyflie 2.0 build!" + @echo "SkyRoverNano 2.0 build!" endif +# @$(PYTHON2) tools/make/versionTemplate.py --print-version ifeq ($(CLOAD), 1) @echo "Crazyloader build!" endif @@ -328,13 +336,16 @@ reset: $(OPENOCD) -d0 -f $(OPENOCD_INTERFACE) -f $(OPENOCD_TARGET) -c init -c targets -c "reset" -c shutdown openocd: - $(OPENOCD) -d2 -f $(OPENOCD_INTERFACE) -f $(OPENOCD_TARGET) -c init -c targets + $(OPENOCD) -d2 -f $(OPENOCD_INTERFACE) -f $(OPENOCD_TARGET) -c init -c targets -c "\$$_TARGETNAME configure -rtos auto" + +trace: + $(OPENOCD) -d2 -f $(OPENOCD_INTERFACE) -f $(OPENOCD_TARGET) -c init -c targets -f tools/trace/enable_trace.cfg #Print preprocessor #defines prep: @$(CC) -dD -include scripts/targets.mk +include tools/make/targets.mk #include dependencies -include $(DEPS) diff --git a/README.md b/README.md index a41834a7cb..8e017ed68b 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# Crazyflie 1.0/2.0 Firmware +# Crazyflie 1.0/2.0 Firmware [![Build Status](https://api.travis-ci.org/bitcraze/crazyflie-firmware.svg)](https://travis-ci.org/bitcraze/crazyflie-firmware) This project contains the source code for the Crazyflie 1.0/2.0 firmware. @@ -7,8 +7,10 @@ This project contains the source code for the Crazyflie 1.0/2.0 firmware. You'll need to use either the Crazyflie VM or install some of an ARM toolchain. ### OS X - -> `TODO: Please share!` +```bash +brew tap PX4/homebrew-px4 +brew install gcc-arm-none-eabi +``` ### Debian/Ubuntu @@ -66,7 +68,7 @@ More information can be found on the | + src | Utils source code | + interface | Utils header files. Interface with the other parts of the program + platform | Platform specific files. Not really used yet - + scripts | Misc. scripts for LD, OpenOCD, make, version control, ... + + tools | Misc. scripts for LD, OpenOCD, make, version control, ... | | *** The two following folders contains the unmodified files *** + lib | Libraries | + FreeRTOS | Source FreeRTOS folder. Cleaned up from the useless files diff --git a/cf2.bin b/cf2.bin index 7efa011cc1..135d3ea9fe 100755 Binary files a/cf2.bin and b/cf2.bin differ diff --git a/cf2.elf b/cf2.elf index 336441e2d4..e9213bc2ea 100755 Binary files a/cf2.elf and b/cf2.elf differ diff --git a/cf2.hex b/cf2.hex index ed99209fb0..35e8fe5678 100644 --- a/cf2.hex +++ b/cf2.hex @@ -1,29 +1,29 @@ :020000040800F2 -:10400000FFFF012089A300083773000839730008F7 -:104010005174000853740008557400080000000033 -:104020000000000000000000000000009D64000887 -:104030005774000800000000096500082973000893 -:10404000CDA30008CDA30008CDA30008CDA3000890 -:10405000CDA30008CDA30008CDA30008CDA3000880 -:10406000CDA30008CDA3000821E7000841B7000850 -:10407000CDA30008A9B7000875B700089DB70008D0 -:104080005974000835B70008CDA30008CDA3000877 -:10409000CDA30008CDA30008CDA30008CDA3000840 -:1040A000CDA30008CDA30008CDA30008CDA3000830 -:1040B000CDA30008CDA30008CDA3000819B70008C0 -:1040C00025B700084DB7000859B70008CDA3000870 -:1040D000CDA30008CDA3000825E70008CDA3000864 -:1040E00003730008CDA30008CDA30008CDA30008EA -:1040F000CDA30008CDA30008CDA3000869B7000830 -:10410000CDA30008CDA30008CDA30008CDA30008CF -:1041100029E70008CDA30008CDA30008CDA300081F -:10412000CDA30008CDA30008CDA30008CDA30008AF -:10413000CDA30008CDA30008CDA30008CDA300089F -:10414000CDA30008CDA30008CDA30008F1C300084B -:10415000CDA30008CDA3000831E700082DE7000833 -:1041600081B700088DB70008CDA30008CDA30008D3 -:10417000CDA30008CDA30008CDA30008CDA300085F -:08418000CDA30008CDA3000847 +:10400000FFFF0120E9AB00081B7A00081D7A0008B9 +:10401000357B0008377B0008397B00080000000072 +:10402000000000000000000000000000B56900086A +:104030003B7B000800000000496A00080D7A000878 +:104040002DAC00082DAC00082DAC00082DAC0008EC +:104050002DAC00082DAC00082DAC00082DAC0008DC +:104060002DAC00082DAC000849F000089DBF0008E9 +:104070002DAC000805C00008D1BF0008F9BF00083A +:104080003D7B000891BF00082DAC00082DAC000856 +:104090002DAC00082DAC00082DAC00082DAC00089C +:1040A0002DAC00082DAC00082DAC00082DAC00088C +:1040B0002DAC00082DAC00082DAC000875BF000821 +:1040C00081BF0008A9BF0008B5BF00082DAC0008DB +:1040D0002DAC00082DAC00084DF000082DAC0008F8 +:1040E000E77900082DAC00082DAC00082DAC0008C5 +:1040F0002DAC00082DAC00082DAC0008C5BF000891 +:104100002DAC00082DAC00082DAC00082DAC00082B +:1041100051F000082DAC00082DAC00082DAC0008B3 +:104120002DAC00082DAC00082DAC00082DAC00080B +:104130002DAC00082DAC00082DAC00082DAC0008FB +:104140002DAC00082DAC00082DAC00084DCC0008AB +:104150002DAC00082DAC000859F0000855F00008FF +:10416000DDBF0008E9BF00082DAC00082DAC000839 +:104170002DAC00082DAC00082DAC00082DAC0008BB +:084180002DAC00082DAC000875 :1041880081F0004102E000BF83F0004330B54FEA00 :1041980041044FEA430594EA050F08BF90EA020F6D :1041A8001FBF54EA000C55EA020C7FEA645C7FEA00 @@ -264,4237 +264,4800 @@ :10505800A0D9023C19449EE71046DFE70E46C9E78F :105068000238294443E700BF10F8012B11F8013B2F :10507800012A28BF9A42F7D0D01A704700F10803D6 -:105088004FF0FF3282604360C36003610023036016 -:10509800704700230361704743685A684A60426852 -:1050A8008A605A68916059604160086103680133F9 -:1050B800036070470A68531C10B501D1036907E003 -:1050C80000F108035C682468944201D85B68F9E73A -:1050D8005A684A6091608B605960086103680133BF -:1050E800036010BD436882689A60836842685A60AA -:1050F80003695A68824204BF82685A6000220261CA -:105108001A68013A1A601868704708B502F038FF43 -:10511800FCE7000010B50E4B1A6850600D4A126883 -:105128009042044607D20C4A10681968BDE810403E -:105138000431FFF7BFBF094A106819680431FFF747 -:10514800B9FF074B1A68944238BF1C6010BD00BFF6 -:105158001806002030060020340600203C050020F8 -:10516800000000200B4B1B6800230B4A1268934277 -:105178000AD20A4A52F82320126B013A12F8011F88 -:10518800BE29FBD00133F0E7054B1868054B1B68B7 -:10519800184470471806002048060020D80500204B -:1051A80014060020400600202DE9F74F0C9EDDF87C -:1051B80038B08A4615469946804628B967486849EE -:1051C80040F2272204F05CFF042E05D965486449A3 -:1051D8004FF40A7204F054FF4C2001F0C1F8624AFF -:1051E80013684C3313600446D0B1AF00BBF1000F15 -:1051F80003D1384601F0B4F883465C49C4F830B0AE -:105208000B683B440B60BBF1000F04D1204601F052 -:1052180001F95C4604E05846BE213A460DF02BFFE2 -:10522800534A13682B44136044B952484C494FF40D -:105238000C7204F025FF4FF0FF308CE005F1804B35 -:10524800AD00013D25644C4D236B29684B4A0BF199 -:10525800FF3B03EB8B0342F8214004F13400514635 -:105268000A2223F0070B0DF01EFF042E33464FF0E1 -:10527800000728BF042304F1040AE362636450466C -:1052880084F83D700193FFF704FF04F11800FFF75D -:1052980000FF019B2461C3F10503A3616462A76455 -:1052A800584641464A4601F0E5F80D9B20600BB18F -:1052B8000D9B1C6001F00CF92B68DFF8E8800133C6 -:1052C8002B602F4D2F68EFB92B4B2C601B68012BDF -:1052D80020D108EB07001437FFF7D0FE642FF8D170 -:1052E800DFF8C490274F4846FFF7C8FE3846FFF757 -:1052F800C5FE2548FFF7C2FE244BC3F80090244B97 -:105308001F6007E0234B1B6823B92B68DB6AB34295 -:1053180098BF2C60204AE36A11688B421F4988BFF6 -:1053280013600A6801320A601D4A116814208B4212 -:1053380000FB0380514688BF1360FFF7ADFE01F004 -:10534800D5F8144B1B682BB12B68DB6AB34201D22A -:1053580001F0AEF8012003B0BDE8F08FDC300108A1 -:10536800E7300108FC300108140600204006002040 -:10537800700500203F31010848060020D8050020AC -:10538800180600205C0500201C0600203C050020B3 -:1053980034060020400500204C0600203C06002072 -:1053A80038060020740500204805002030B585B077 -:1053B80000240094019402940394124812499622FE -:1053C8002346FFF7F1FE012805460FD100F036FE0F -:1053D800012805460AD101F073F80C4B1D600C4BEF -:1053E8001C6005B0BDE8304001F0CEB845B90948A9 -:1053F800094940F24A5205B0BDE8304004F040BEC9 -:1054080005B030BD1351000848310108400500209F -:10541800300600204D310108E7300108024A1368C0 -:1054280001331360704700BF4405002010B501F038 -:105438004FF8034B1C6801F059F8204610BD00BF17 -:1054480030060020F8B52E4B1B68002B52D12D4B8F -:105458002D4D1A6801321A601A681E46F2B92B4C93 -:1054680023681B682BB12A482A4940F2B66204F027 -:1054780007FE294B2268196821601A60274A1368B9 -:105488000133136023681B6813B94FF0FF3304E03E -:105498001E4B1B68DB68DB685B682B6032682B6817 -:1054A8009A422BD3194B1A68126812B94FF0FF337E -:1054B80006E01B68DB68DC68326863689A4201D2E0 -:1054C8002B60F8BD271D3846FFF70CFEA36A1BB1F9 -:1054D80004F11800FFF706FE114AE36A11688B42CF -:1054E80088BF13600F4A142000FB03203946FFF7DA -:1054F800D3FDD7E70C4A136801331360F8BD00BF2A -:105508004405002030060020000000203C05002053 -:1055180055310108E730010834060020380500201D -:1055280038060020740500203405002070B52B4C87 -:1055380023682BB92A482B4940F2855204F0A0FD74 -:1055480000F0C6FF2368013B236024680CB10024E7 -:1055580040E0254B1B68002BF9D0244B1A68F2B1A8 -:10556800DB68DD682E1D05F11800FFF7BBFD30462E -:10557800FFF7B8FD1E4AEB6A11688B4288BF1360BB -:105588001C4A142000FB03203146FFF785FD1A4B07 -:10559800EA6A1B68DB6A9A4228BF0124DDE7174BD9 -:1055A8001A681D4642B12B68144C3BB1FFF74AFFFD -:1055B8002368013B2360F6E7012C06D1104B00223B -:1055C8001A60012400F074FF04E00D4B1B68012BE6 -:1055D800BDD1F3E700F08AFF204670BD44050020E6 -:1055E80080310108E7300108480600201C06002029 -:1055F8003806002074050020180600203405002015 -:105608004406002038B50C46054628B91A481B49F7 -:105618004FF4447204F034FD2CB91948174940F28C -:10562800113204F02DFDFFF7F9FE164A2B681168B8 -:1056380099421C4402D29C4208D201E09C4207D302 -:1056480013689C4294BF0023012302E0002300E07A -:1056580001232C603BB10C4B18680430FFF742FD66 -:105668002046FFF757FDFFF761FF18B9BDE838403E -:1056780000F01EBF38BD00BF95310108E7300108B2 -:10568800A8310108300600201806002010B504468D -:1056980018B9BDE8104000F00BBFFFF7BFFE084B7C -:1056A8001B681C44074B18680430FFF71BFD204695 -:1056B800FFF730FDFFF73AFF0028EAD010BD00BF22 -:1056C800300600201806002038B50D46044608B9F3 -:1056D800044B1C6800F0FCFEA564BDE8384000F0EF -:1056E80005BF00BF1806002038B51D4B1B681BB14D -:1056F8001C4B01221A6038BD1B4C226823681268B3 -:105708001B6B9A4210D820682168343102F0F0FAF5 -:105718000AE02B682BB91548154940F2667204F067 -:10572800AFFC2B68013B2B60124D134A29681423E8 -:10573800594351580029ECD029684B43D0180833F5 -:1057480045686D68456013449D4204BF6B684360BB -:10575800142303FB01225368DB68236038BD00BFB4 -:10576800440500204406002018060020C031010826 -:10577800E7300108380600207405002070B50E4691 -:10578800054628B90B480C4940F2717204F078FCC0 -:105798000A4C216828461831FFF78CFC2068043031 -:1057A800FFF7A0FC064B18683044BDE87040FFF7CF -:1057B800B1BC00BFD3310108E7300108180600204A -:1057C8003006002070B50E46054628B90B480C492E -:1057D80040F2A77204F054FC0A4C2168284618319C -:1057E800FFF75AFC20680430FFF77CFC064B18686A -:1057F8003044BDE87040FFF78DBC00BFD3310108CD -:10580800E7300108180600203006002038B5C368C4 -:10581800DC682CB91448154940F2DD7204F030FCFC -:1058280004F118052846FFF75DFC114B1B6873B996 -:10583800251D2846FFF756FC0E4AE36A11688B427D -:1058480088BF13600C4A142000FB032000E00B48BB -:105858002946FFF721FC0A4BE06A1B68DB6A98427D -:1058680034BF0020012038BDDF310108E7300108CE -:105878004405002038060020740500201C0600207E -:105888001806002010B5044628B90648064940F213 -:10589800FF7204F0F5FB054B1B682360044B1B6883 -:1058A800636010BDEE310108E730010838050020BB -:1058B8003006002038B50D46044628B91648174961 -:1058C80040F6090204F0DCFB2DB91548134940F6EF -:1058D8000A0204F0D5FB00F0FBFD124B61681A6860 -:1058E80023689A42104B02D01A688A420ED21A686C -:1058F8002B68521A9A4209D20B4A1268521A9B1AFA -:1059080020462B60FFF7BEFF002400E0012400F0D2 -:10591800EDFD204638BD00BFEE310108E730010833 -:10592800F83101083805002030060020014B01221B -:105938001A60704744060020014B1868704700BF82 -:1059480018060020044B186828B1044B1B68002B6C -:105958000CBF0120022070474005002044050020AC -:10596800F8B5044648B3154DC36A2A68D26A93420B -:1059780023D22A68D26AC2F1050282611048142231 -:1059880002FB030362699A42064613D1271D384673 -:10599800FFF7A8FB2B680B4ADB6A1168E3628B42AE -:1059A80088BF1360142000FB03603946BDE8F84047 -:1059B800FFF772BB2B68DB6AE362F8BD18060020AC -:1059C800740500203806002038B50446D0B1C26AF4 -:1059D800436C9A4216D0051D2846FFF783FB636C7B -:1059E800E362C3F10502A261074A11688B4288BFCE -:1059F8001360064A142000FB03202946BDE83840FE -:105A0800FFF74ABB38BD00BF3806002074050020E8 -:105A180038B51346026C044632B9056805BB4068C0 -:105A2800FFF7D2FF65601BE063B980680DF018FBD3 -:105A3800A268236C13446268A360934210D323685E -:105A4800A3600DE0C0680DF00BFB236CE2682168D1 -:105A58005B421A448A42E2603EBF62689B18E36078 -:105A6800A36B0133A36338BD30B5056803466DB138 -:105A7800C468026C1444C4604068844228BFDD6076 -:105A88000846BDE83040D9680DF0EABA30BD10B517 -:105A9800044600F01DFDA36C002B0CDD636A53B1B6 -:105AA80004F12400FFF7B2FE08B1FFF73FFFA36C33 -:105AB800013BA364EFE74FF0FF33A36400F016FD4A -:105AC80000F006FD636C002B0CDD236953B104F173 -:105AD8001000FFF79BFE08B1FFF728FF636C013B3E -:105AE8006364EFE74FF0FF336364BDE8104000F0F4 -:105AF800FDBC000038B50D46044620B917481849C2 -:105B0800F12204F0BDFA00F0E3FC216CE36B22689B -:105B1800A2604B43D0185B1A13446060E360002016 -:105B28004FF0FF33A0636364A36455B9236983B15D -:105B380004F11000FFF76AFE01280AD100F0B8FC52 -:105B480007E004F11000FFF799FA04F12400FFF7C9 -:105B580095FA00F0CBFC012038BD00BF06320108E1 -:105B68000E32010870B50E460546A8B14C2000F06B -:105B7800F7FB044680B106FB05F0013000F0F0FBAE -:105B8800206030B1E563266420460121FFF7B2FFAB -:105B980009E0204600F03EFC044805494FF4A7728E -:105BA80004F06EFA0024204670BD00BF4D31010894 -:105BB8000E3201082DE9FF410E460192984604462F -:105BC80028B93948394940F2312204F059FA16B94E -:105BD800236C002B5ED1002700F07AFCA26BE36BEC -:105BE8009A4212D2204631464246FFF711FF636AB5 -:105BF8003BB104F12400FFF709FE012801D100F0B0 -:105C080057FC00F073FC01204BE0019D15B900F032 -:105C18006DFC3DE017B902A8FFF734FE00F066FC02 -:105C2800FFF7FCFB00F054FC636C013304BF002356 -:105C38006364A36C013304BF0023A36400F056FC23 -:105C480002A801A9FFF736FEE8B900F041FCA76BEE -:105C5800E56B00F04BFCAF420FD104F11000019945 -:105C6800FFF78CFD2046FFF712FFFFF75FFC08B136 -:105C78000127B1E700F01CFCFAE72046FFF707FF11 -:105C8800FFF754FCF4E72046FFF701FFFFF74EFC4F -:105C9800002006E00648054940F2322204F0F0F9F7 -:105CA80099E704B0BDE8F081063201080E32010818 -:105CB8002332010838B54C2000F052FB0446D0B11D -:105CC80001230025C3634FF0FF33856345604364B8 -:105CD800056083648560C56005641030FFF7CEF900 -:105CE80004F12400FFF7CAF9204629462A462B4624 -:105CF800FFF760FF05E0044804494FF4C77204F059 -:105D0800BFF9204638BD00BF7E3201080E320108B7 -:105D18002DE9F0410D4616469846044628B91B4819 -:105D28001B4940F29F3204F0ABF90DB9236C03BB59 -:105D380000F0C6FBA26BE36B9A42074617D22046D7 -:105D480029464246FFF764FEA36C01330AD1636A11 -:105D58005BB104F12400FFF759FD30B12EB10124E5 -:105D680034600DE0A36C0133A364012408E000242F -:105D780006E0084806494FF4687204F081F9D7E74D -:105D8800384600F0AFFB2046BDE8F0810632010836 -:105D98000E320108233201082DE9FF410E46019217 -:105DA8009846044628B9464846494FF4806204F0AC -:105DB80067F916B9236C002B78D1002700F088FB0F -:105DC800A36B3BB320463146E568FFF74DFEB8F1BB -:105DD800000F12D1A36B013BA363236813B9FFF72C -:105DE800ABFD606023698BB104F11000FFF70EFD75 -:105DF80001280BD100F05CFB08E0636AE5602BB179 -:105E080004F12400FFF702FD0028F3D100F06EFB37 -:105E1800012052E0019D15B900F068FB44E017B974 -:105E280002A8FFF72FFD00F061FBFFF7F7FA00F07B -:105E38004FFB636C013304BF00236364A36C01331D -:105E480004BF0023A36400F051FB02A801A9FFF7D7 -:105E580031FD20BB00F03CFBA56B00F047FBC5B94A -:105E6800236833B900F034FB6068FFF779FD00F070 -:105E78003DFB04F124000199FFF780FC2046FFF761 -:105E880006FEFFF753FB08B1012797E700F010FB68 -:105E9800FAE72046FFF7FBFDFFF748FBF4E720464B -:105EA800FFF7F5FDFFF742FB002006E0064805492D -:105EB80040F2014204F0E4F87FE704B0BDE8F08165 -:105EC800063201080E32010889320108F8B50E467B -:105ED8001746044628B91B481B4940F2964204F06D -:105EE800CFF80EB9236C03BB00F0EAFAA36B0546A2 -:105EF800CBB120463146FFF7B7FDA36B013BA36347 -:105F0800636C01330AD123695BB104F11000FFF718 -:105F18007DFC30B12FB101243C600DE0636C01338E -:105F28006364012408E01C4606E00848064940F27C -:105F3800974204F0A5F8D7E7284600F0D3FA2046A0 -:105F4800F8BD00BF063201080E3201088932010887 -:105F580010B5044628B90648064940F2CE4204F076 -:105F68008FF800F0B5FAA46B00F0C0FA204610BD17 -:105F7800073201080E32010838B504460D4600F014 -:105F8800A7FA636C013304BF00236364A36C013375 -:105F980004BF0023A36400F0A9FAA36B23B904F19A -:105FA80024002946FFF70EFC2046BDE83840FFF7DD -:105FB8006EBD0000F8B50D4C00F08AFA25688DB961 -:105FC8000B4F0C4E3846FFF759F83046FFF756F896 -:105FD800094B1F60094B14200C212A461E60FFF74D -:105FE800C1FD2060BDE8F84000F080BA80060020BE -:105FF8005406002068060020500600208406002071 -:1060080010B5044691424160206105D8D21A8369CF -:106018009A420CD2074B04E09A4201D2994206D226 -:10602800054B1868211DFFF745F8002010BD012019 -:1060380010BD00BF84060020500600201FB5FFF7E2 -:10604800B9FF0D4B1B6833B90C480D49DD2204F02C -:1060580017F800200CE0012300930023019302931A -:106068000393084808499622FFF79EF80028EBD0CA -:1060780005B05DF804FB00BF800600204D31010823 -:10608800DF3201089D610008F53201082DE9F04171 -:10609800804617461E460D4631B90D480D49EA227D -:1060A80003F0EEFF2C4610E0282000F059F90446D2 -:1060B80058B1FFF77FFF069BC4F80080A561E76130 -:1060C80026626362201DFEF7E4FF2046BDE8F081EA -:1060D800FD320108DF3201087FB50F4D06462868FA -:1060E8001C46B8B101910292039673B9FFF72AFCD6 -:1060F800012818BF2246286808BF089A01A90CBFC2 -:1061080023461346FFF756FD04E01A4601A900236B -:10611800FFF7FEFD04B070BD80060020F7B5194DED -:106128002B681A6842B3DA681668DB68DC68271DD2 -:106138003846FEF7D7FF636A20469847E369012B84 -:10614800EDD1A3693344B34206D96360246128685A -:106158003946FEF7AFFFE2E70021009120463246BC -:106168000B46FFF7B9FF0028D9D10748074940F285 -:10617800762203F085FFD2E7054A1168296013608B -:1061880003B0F0BD5006002019330108DF320108C2 -:10619800840600202DE9F04786B0DFF870A1DAF810 -:1061A80000301C68B4FA84F4640914B9DB681E680A -:1061B80000E00026504DFFF731F9FFF737F92B685B -:1061C80098428146A84603D2FFF7A8FF012300E0C2 -:1061D8000023C5F80090494FA3BB44BB4E4526D8C1 -:1061E800FFF7A4F9DAF80030DB68DD68281DFEF750 -:1061F80079FFEB69012B16D1A969284631444A4633 -:106208003346FFF7FDFE01280DD1009428462146AC -:1062180032462346FFF760FF28B93948394940F22A -:10622800551203F02DFF6B6A2846984724E038681A -:10623800C9EB0601FFF7A0FEFFF778F9E0B900F017 -:1062480037F919E0FFF772F916E0059C636913B195 -:10625800201DFEF747FFFFF7E9F8D8F8003098420D -:10626800054601D2FFF75AFF039EC8F80050022ED8 -:106278002CD0032E3BD046B10022386803A9134620 -:10628800FFF78AFD0028E0D187E7049BA169204633 -:1062980019442A46FFF7B4FE0128EDD1636A204667 -:1062A8009847E369012BE7D1A269049B00961A4439 -:1062B800204631463346FFF70FFF0028DCD110484F -:1062C800104940F22A2203F0DBFED5E7049BA361C4 -:1062D8002BB90D480B4940F2372203F0D1FEA169D2 -:1062E800204629442A462B46FFF78AFEC4E7204663 -:1062F80000F090F8C0E700BF7C0600208006002070 -:1063080019330108DF320108213301085006002043 -:10631800006A704710B5104B1A68824201D21346C2 -:10632800FAE759685C18844201BF406809181846A2 -:10633800596041684418944209D1084C2468A24223 -:106348001FBF5268891841601A6818BF1268026036 -:10635800834218BF186010BD8C06002088060020F4 -:1063680070B50446FFF75AF8264A106898B9264BC4 -:10637800264923F007030B60486003F59C41083168 -:1063880044F6086548601160585183E822002049A6 -:106398000B68103B0B602CB1103463071CBF24F052 -:1063A80007040834611E44F61663994222D8174B35 -:1063B8001D686968A14203D31268954206D119E0A5 -:1063C80029680029F8D02B460D46F2E72A681E688E -:1063D8001A606B681B1B202B06F1100604D92819BC -:1063E80043606C60FFF796FF094A696813685B1A97 -:1063F800136000E00026FFF799F80EB901F064FC7D -:10640800304670BD880600209C0600208C060020BF -:106418000400002010B5044678B1FEF7FFFF074AD4 -:1064280054F80C1C1368A4F110000B441360FFF718 -:1064380071FFBDE81040FFF779B810BD04000020D7 -:10644800014B1868704700BF04000020034800682B -:10645800006880F3088862B600DF00BF08ED00E03E -:10646800DFF80C00016841F470010160704700001A -:1064780088ED00E04FF0807300E90A00002340F83F -:106488000C3C6FF0020340F8202C40F8243C4438C0 -:1064980070470000054B19680868B0E8F04F80F3B2 -:1064A80009884FF0000080F3118870471806002013 -:1064B800024B4FF080521A60704700BF04ED00E0B5 -:1064C800EFF311804FF05F0181F3118870470020CE -:1064D80008B5FFF7F5FF024A13680133136008BDDA -:1064E8000800002080F3118870470000034B1868EB -:1064F8000138186008B9FFF7F5BF70470800002099 -:10650800EFF30980114B1A681EF0100F08BF20ED39 -:10651800108A20E9F04F10602DE908404FF05F0025 -:1065280080F31188FFF7E0F84FF0000080F311883E -:10653800BDE8084019680868B0E8F04F1EF0100F71 -:1065480008BFB0EC108A80F309887047180600204D -:1065580008B5064B4FF080521A60FFF7B1FFFEF7FF -:1065680071FF0020BDE80840FFF7BCBF04ED00E064 -:10657800034B044A1A60072243F8042C704700BFF3 -:1065880014E000E03F90020010B50C4B1A6842F48A -:106598007F021A601A6842F07F421A60FFF7E8FF2C -:1065A800074B00241C60FFF75BFF064A136843F0A3 -:1065B80040431360FFF74AFF204610BD20ED00E07E -:1065C8000800002034EF00E008B54FF48070012186 -:1065D80000F02AFB4FF480700021BDE8084000F06D -:1065E80023BB0000436823F040720B6822F48072DA -:1065F80013430A7943EA022343600B69CA681A43C2 -:106608008B6810B51A438468084B234013434A79B2 -:1066180043EA42038360C36A23F470020B7D013BA3 -:10662800DBB242EA0353C36210BD00BFFDF7FFC0EF -:1066380000230360037143718360C3600361012316 -:106648000375704710B5074C074B6268134090E814 -:106658000600114382681143C2680A43134363600A -:1066680010BD00BF00230140E030FCFF00230360A1 -:1066780043608360C3607047836811B143F00103CE -:1066880001E023F00103836070470000044BDA68DF -:1066980009B1104301E022EA0000D860704700BF4A -:1066A800002004E0036823F0010303600023036073 -:1066B80043608360C360036121234361294B98428F -:1066C80017D0294B98421BD0284B984220D0284BF2 -:1066D800984225D0274B98422AD0274B98422ED053 -:1066E800264B984232D0264B984236D0254B9842BA -:1066F80003D13D2243F8082C7047234B984204D11C -:106708004FF4746243F8202C7047204B984204D110 -:106718004FF4741243F8382C70471D4B984204D13B -:106728004FF0746243F8502C70471A4B984203D1CB -:10673800194A43F8642C7047184B984203D1184AF9 -:1067480043F87C2C7047174B984203D1164A43F8FC -:10675800942C7047154B984203D14FF03D5243F8A3 -:10676800AC2C704710600240286002404060024034 -:10677800586002407060024088600240A060024099 -:10678800B86002401064024028640240406402403D -:1067980058640240706402403D0000208864024052 -:1067A800400F0020A064024000003D20B864024071 -:1067B8000268134B10B51340CC680A6814434A6941 -:1067C80014438A691443CA6914430A6A14434A6A17 -:1067D80014438A6A14434A6B14438A6B2243134353 -:1067E800036043690C6B23F00702CB6A234313430E -:1067F80043610B6943604B6883608B68C36010BD5D -:106808003F801CF0036811B143F0010301E023F05D -:1068180001030360704741607047406880B2704769 -:10682800006800F0010070470B0611D543694AB1B2 -:1068380043F080038029436114D0036801F01E01EE -:1068480019430EE023F080038029436104D1704787 -:10685800802907D0002AF0D1036801F01E0123EA3D -:106868000101016070470000104A114B10B5114C2E -:10687800A04294BF1C46144621F0F02323F0C31213 -:106888002AB1006800F01E0000EAD12202E0406947 -:1068980000F0800289004CBF6068206823F08213F2 -:1068A800184002D0101C18BF012010BD006402401F -:1068B800006002400F64024010B5084A084B094CBA -:1068C800A04294BF1846104611F0005F21F0F02155 -:1068D80021F0821114BFC160816010BD00640240C4 -:1068E800006002400F640240837910B50468002BF1 -:1068F80031D01E4B196821EA04021A605A680168EF -:1069080022EA01025A600279016802F1804202F526 -:106918009E321468214311609A68016822EA0102D4 -:106928009A60DA68016822EA0102DA60427901684D -:10693800102A0BBF9A6802F18043114303F59E3376 -:1069480003BF9960D96802681A680BBF0A431143EC -:10695800DA60196010BD037903F1804303F59E33B3 -:106968001A6822EA04021A6010BD00BF003C014008 -:10697800014B5861704700BF003C0140034B5B6905 -:10698800184214BF01200020704700BF003C01409E -:10699800014B5861704700BF003C0140F0B5002230 -:1069A80001230C6893401C409C4229D155000323C5 -:1069B8000668AB40DB431E4006600E790768AE40B0 -:1069C8003E4306600E79013E012E11D886681E40AE -:1069D80086604E798768AE403E438660466826EA00 -:1069E800040444608C7946689440A4B234434460FB -:1069F800C4682340C360CB79C468AB402343C360F9 -:106A08000132102ACCD1F0BD4FF6FF73036000238A -:106A1800037143718371C37170470369194214BFCD -:106A2800012000207047018370474183704710B5EB -:106A380001F00703C90800EB81009B00046A0F21DD -:106A4800994024EA01010162016A9A4011430162F6 -:106A580010BD00007FB5868826F03F060446360440 -:106A680068460D46360C00F05FF8029A2C48B2FBD7 -:106A7800F0F081B20E43A68023882A4E23F001034A -:106A88001B041B0C23802B68B3420AD85B0001311E -:106A9800B2FBF3F39BB2032B89B298BF0423218482 -:106AA80023E0EE884BF6FF718E421BBF19214B4342 -:106AB80003EB4303B2FBF3F315BF9BB2B2FBF3F353 -:106AC80043F480439BB2C3F30B020AB943F00103BA -:106AD8004FF4967101FB00F24FF47A7192FBF1F2D8 -:106AE800013292B243F400432284A38323889BB2E9 -:106AF80043F00103238023886989AA8823F48163EA -:106B080023F002031B040A431B0C13439BB223808C -:106B18002A89AB8913439BB2238104B070BD00BF9F -:106B280040420F00A086010010B51D4A936803F08B -:106B38000C03042B03D0082B03D01A4B18E01A4B74 -:106B480016E05168536811F4800F03F03F03516851 -:106B580014BF154A134AB2FBF3F3114A5268C2F341 -:106B68000142C1F3881101324B435200B3FBF2F3E7 -:106B78000B4A036093680D49C3F30313CC5C0368A5 -:106B8800E34043609468C4F382240C5D23FA04F460 -:106B980084609268C2F342328A5CD340C36010BDFD -:106BA800003802400024F40000127A000C00002093 -:106BB800044B1A6B09B1104301E022EA0000186384 -:106BC800704700BF00380240044B5A6B09B11043AC -:106BD80001E022EA00005863704700BF0038024015 -:106BE800044B1A6C09B1104301E022EA0000186452 -:106BF800704700BF00380240044B5A6C09B110437B -:106C080001E022EA00005864704700BF00380240E3 -:106C1800044B1A6A09B1104301E022EA0000186225 -:106C2800704700BF00380240044B5A6A09B110434C -:106C380001E022EA00005862704700BF00380240B5 -:106C480008B5474B984205D101200146FFF7ECFFF4 -:106C580001203DE0B0F1804F05D101200146FFF74A -:106C6800D7FF012076E03F4B984205D10220012151 -:106C7800FFF7CEFF02206DE03B4B984205D1042080 -:106C88000121FFF7C5FF042064E0384B984205D185 -:106C980008200121FFF7BCFF08205BE0344B984235 -:106CA80005D110200121FFF7B3FF102052E0314B2E -:106CB800984205D120200121FFF7AAFF202049E0B2 -:106CC8002D4B984209D102200121FFF7ADFF022088 -:106CD8000021BDE80840FFF7A7BF284B984207D11D -:106CE8004FF480300121FFF79FFF4FF48030EFE72A -:106CF800234B984207D14FF400300121FFF794FF4E -:106D08004FF40030E4E71F4B984207D14FF480203E -:106D18000121FFF789FF4FF48020D9E71A4B9842E9 -:106D280005D140200121FFF773FF402012E0174BE7 -:106D3800984205D180200121FFF76AFF802009E0F1 -:106D4800134B98420BD14FF480700121FFF760FF7D -:106D58004FF480700021BDE80840FFF759BF08BD17 -:106D6800000001400004004000080040000C004002 -:106D780000100040001400400004014000400140A1 -:106D8800004401400048014000180040001C004039 -:106D9800002000401C4A038890429BB212D002F5A2 -:106DA800806290420ED0B0F1804F0BD0A2F58032B5 -:106DB800904207D002F58062904203D002F58062CB -:106DC800904203D14A8823F0700313430F4A90423C -:106DD80008D002F5806290421FBF23F440730A89ED -:106DE8009BB2134303804B68C3620B880385064B31 -:106DF800984203D003F58063984201D18B7A0386C9 -:106E080001238382704700BF00000140001000404A -:106E18004FF0FF3343600023038003814380837274 -:106E28007047038819B19BB243F0010303E023F0D4 -:106E380001031B041B0C038070470000038C23F024 -:106E480001031B041B0C0384038C70B58488028B1C -:106E58000E8822F073021204120C23F00205164366 -:106E68004B888A892D0413430F4A2D0C2B439042DB -:106E7800A4B29BB203D002F5806290420ED1CA89B7 -:106E88004D8A23F0080313438A8823F0040313432D -:106E98000A8A24F4407415432C43A4B284800683E0 -:106EA8008A684263038470BD00000140038C23F0AC -:106EB80010031B041B0C0384038C30B58588028BDC -:106EC8000C8822F4E6421204120C42EA042223F04F -:106ED800200394B21B048A891B0C43EA02134A88D4 -:106EE80043EA0213124A9042ADB29BB203D002F5B4 -:106EF8008062904215D123F08003CA899BB243EA8D -:106F080002124FF6BF7313408A8843EA02130A8AB3 -:106F180025F4406545EA82054A8A45EA82059BB21E -:106F2800ADB2858004838A688263038430BD00BF64 -:106F380000000140038C23F480731B041B0C0384A2 -:106F4800038C30B58488828B0D8822F0730212047A -:106F5800120C23F4007315431B048A891B0C43EAA3 -:106F680002234A8843EA0223124A9042A4B29BB2FF -:106F780003D002F58062904215D123F40063CA89D8 -:106F88009BB243EA02224FF6FF3313408A8843EA52 -:106F980002230A8A24F4405444EA02144A8A44EA3E -:106FA80002149BB2A4B2848085838A68C263038476 -:106FB80030BD00BF00000140038C23F480531B0444 -:106FC8001B0C0384038C30B58488828B0D8822F4D3 -:106FD800E6421204120C23F4005342EA05221B0471 -:106FE8008D891B0C43EA05334D8843EA05330B4D65 -:106FF800A842A4B292B29BB203D005F58065A8421C -:1070080005D10D8A24F4804444EA8514A4B284800E -:1070180082838A680264038430BD00BF0000014097 -:107028004163704781637047C1637047016470476B -:10703800038B23F008031B041B0C194301837047BF -:10704800038B23F400631B041B0C43EA012189B260 -:1070580001837047838B23F008031B041B0C19431F -:1070680081837047838B23F400631B041B0C43EA62 -:10707800012189B281837047406B7047806B7047EC -:10708800C06B7047006C7047B0F8443029B16FEAA4 -:1070980043436FEA53439BB201E0C3F30E03A0F8E6 -:1070A8004430704783899BB20AB1194301E023EA4F -:1070B80001018181704700007FB5038ACA889BB2AD -:1070C80023F440531343038283890E469BB223F46F -:1070D800B053098923F00C02B3880B4371890B4321 -:1070E8009BB213438381838AB2899BB223F4407392 -:1070F8001343838204466846FFF716FD1A4B9C42E9 -:1071080003D003F580639C4201D1039D00E0029DFA -:10711800A38931681BB2002B4FF0190202FB05F25C -:10712800B4BF4D008D00B2FBF5F5A2896426B5FB0E -:10713800F6F00001010912B2002A06FB1153ADBF97 -:107148001A01D90032313232B5BFB1FBF6F2B2FBC7 -:10715800F6F302F0070203F00F03B4BF104318431D -:1071680080B2208104B070BD00100140838919B13C -:107178009BB243F4005303E023F400531B041B0C9D -:1071880083817047C1F30801818070478088C0F30C -:1071980008007047838A9BB20AB1194301E023EAC9 -:1071A80001018182704710B5C1F34214012301F037 -:1071B8001F01012C03FA01F301D10C3003E0022C6A -:1071C8000CBF1030143012B10268134302E0026899 -:1071D80022EA0303036010BDC94389B201807047E6 -:1071E800012310B5C1F3421401F01F029C4203FAB7 -:1071F80002F201D1838903E0022C0CBF038A838A3F -:107208009BB21340028892B23BB1090A01238B401A -:10721800134214BF0120002010BD184610BD090AF2 -:1072280001238B40DB439BB20380704740F0BF6073 -:10723800024B40F40030D860704700BF00ED00E01A -:10724800C278037810B512B3164AD1684278C94398 -:10725800C1F30221C1F10404E4B2A240D4B20F2266 -:107268000A4181780A40224303F1604303F56143F0 -:107278001201D2B283F8002303780122590903F0DE -:107288001F0302FA03F3084A42F8213010BD5A09D5 -:10729800012103F01F03994002F12003024A42F83A -:1072A800231010BD00ED00E000E100E010B501F092 -:1072B800030301F0FC0101F1804101F59C319B00C1 -:1072C8008C680F229A4024EA02028A608A689840F1 -:1072D80002438A6010BD08B505F0FCFC00F01CFDF7 -:1072E800FEF764F805F01EFD0020012105F014FDED -:1072F8000120014605F010FDFEE708B54FF4806057 -:10730800FFF73CFB012803D14FF48060FFF740FBF7 -:10731800BDE8084007F058BA4FF44070FFF786BF41 -:1073280008B5FFF715F9BDE8084003F075BB7047CD -:107338001EF0040F0CBFEFF30880EFF3098000F094 -:1073480001B870472DE9F84FD0F800B0D0F804A084 -:10735800D0F80890D0F80C80076946698569C46937 -:107368002549264802F09EFF254924485A4602F03E -:1073780099FF24492148524602F094FF22491F48A8 -:107388004A4602F08FFF21491C48424602F08AFF14 -:107398001F491A483A4602F085FF1E4917483246E7 -:1073A80002F080FF1C4915482A4602F07BFF1B4962 -:1073B8001248224602F076FF194B1A491A680F48FC -:1073C80002F070FF184B19491A680C4802F06AFF5E -:1073D800174B18491A68094802F064FF164B1749F9 -:1073E8001A68064802F05EFF154B04481A681549EA -:1073F80002F058FFFEE700BF46330108DDE400084D -:107408005C330108653301086E33010877330108DE -:10741800803301088A330108933301089C3301083B -:1074280038ED00E0A633010828ED00E0B13301088B -:107438002CED00E0BC33010830ED00E0C733010853 -:107448003CED00E0D2330108FEE7FEE7FEE77047B7 -:1074580006F002BC37B500240E4D6846FFF7D4FA93 -:107468002B681A59D26800921B5969469868FFF729 -:1074780095FA2B681B5900229868198AFFF7D7FAE2 -:107488002B681B590434186AFFF7DAFB102CE3D178 -:1074980003B030BD386100202DE9F0413F4F404D29 -:1074A8003B788AB0044613B12868FFF7D3FF2C60F5 -:1074B80000242B681B5901215868FFF779FB2B68BA -:1074C8001B590121D869FFF78BFB6846FFF79CFA27 -:1074D80002238DF804308DF805302B681A5952694B -:1074E8008DF806201A59D26800921B596946986887 -:1074F800FFF754FA2B681B599868198A1A7EFFF708 -:1075080096FA2B681A59D26A03921A590026128ED3 -:10751800ADF80820ADF81060ADF80A608DF812607B -:107528001B5902A9186AFFF735FC6023ADF814301F -:107538004FF001082B68ADF8168007961A59928CFF -:10754800ADF820204FF48072ADF824201B5905A90E -:10755800DA6B186A90472B681B5908211A6C186A4D -:1075680090472B681B594146986AFFF78FF82B689C -:107578001B594146186A0434FFF786FD102C98D130 -:107588002B689B590121186A0436FFF74AFC102E14 -:10759800F6D101233B700AB0BDE8F081B454002055 -:1075A80038610020000000002DE9F0472DED028B26 -:1075B800032882B005460C4604D93D483D49D222ED -:1075C80002F05EFD3C4B1A6852F8252012789A4664 -:1075D800002A44D107EE104ADFED387ABBEEC87AAC -:1075E80067EE277A17EE900AFCF72EFF8046894649 -:1075F80007F038FF2AA3D3E9002340464946B0EEF6 -:10760800408AFCF775FF42464B46FCF771FF26A3FC -:10761800D3E9002306460F4640464946FCF768FF73 -:1076280002460B4630463946FCF7B0FDFDF7FAF93D -:1076380007EE900A87EE880AF7EE007AB4EE670A3A -:10764800F1EE10FAC8BFB0EE670ADFED1D7A20EE42 -:10765800270ABCEEC00A8DED010ABDF80440DAF82D -:10766800003053F825301A78012A01BF45F2082165 -:107678004C434FF6FF71B4FBF1F104BF01F5A4418F -:1076880008315A6B0BBF186A186A89B2210A02B00E -:10769800BDEC028BBDE8F047104700BFAFF3008098 -:1076A8009FE3480CA77144BFBA490C022B87B63F29 -:1076B800F83401080B3501083861002000007042D9 -:1076C80000FF7F4703282DE9FF41044688461746F7 -:1076D8001E4605DD1848194940F2091202F0D0FC8F -:1076E80001A8FFF795FB164DB8F1000F08D0042349 -:1076F800144A92FBF7F292B2ADF80430029209E014 -:107708002B6853F82420D26A029253F824301B8E37 -:10771800ADF804302B6853F8243001A9186AFFF734 -:1077280039FB2B6853F8243031465A6B186A904756 -:1077380004B0BDE8F08100BFF83401080B3501083A -:10774800386100200059000170B50024114B1B68F6 -:1077580053F824301D78BDB90F4B53F824600F4BF4 -:10776800012133F81420304640F27573FFF7AAFF61 -:107778003220FDF78BFF304629462A462B46FFF775 -:10778800A1FF9620FDF782FF0134042CDED1044BC3 -:10779800187870BD38610020203501086834010868 -:1077A800B45400207320704700B589B0124B1B6891 -:1077B80068469B68984702460028F7D19DF8013033 -:1077C8000E491B0951F8230020B169461346FEF7FC -:1077D800F1F903E00A4A1368013313609DF8013098 -:1077E800084A1B0952F823100029DFD052F8233029 -:1077F80068469847DAE700BF50000020B8540020D8 -:1078080044550020FC54002010B588B00D4B0E4A9A -:10781800196891421C4610D00C4B694618684FF005 -:10782800FF320023FEF7B8FA0128EFD12368684633 -:107838005B6898470028F9D0E8E70A20FDF726FF9B -:10784800E4E700BF500000203C0000204055002025 -:107858007FB5154D2C7824BB202122463C20FEF70D -:1078680081F9124B2021186022460220FEF77AF98E -:107878000F4B104918600226962223460096019461 -:10788800029403940C48FDF78FFC2346009601945C -:107898000294039409480A499622FDF785FC0123BE -:1078A8002B7004B070BD00BF3C550020405500202F -:1078B800F85400204036010811780008B177000814 -:1078C80048360108014B1878704700BF3C55002026 -:1078D80038B5094B53F8202005461C4622B1074805 -:1078E80007495C2202F0CCFB012020210022FEF790 -:1078F80039F944F8250038BDB8540020503601083D -:107908006736010870B50E4B53F8202006460D4621 -:107918001C4622B90B480C496B2202F0B1FB25B971 -:107928000A4809496C2202F0ABFB54F826002946A4 -:107938004FF0FF320023BDE87040FEF72DBA00BFBC -:10794800B85400207A36010867360108BE44010899 -:1079580008B5034B1868FEF7FBFAC0F13C0008BDF8 -:10796800405500201028DCBF014B43F82010704719 -:10797800FC54002010B5044620B90B480B49B62228 -:1079880002F07EFB23781E2B04D909480749B72249 -:1079980002F076FB074B0022186821461346BDE823 -:1079A8001040FEF707B900BFBE440108673601085A -:1079B800893601084055002008B5064B0021186893 -:1079C800FEF798F8044B1B681B6903B19847002021 -:1079D80008BD00BF4055002050000020034B1B6825 -:1079E800DB6803B118470120704700BF5000002032 -:1079F80070B5094C2368054613B11B6800209847E9 -:107A08000DB1256001E0054B2360236801201B6848 -:107A1800BDE87040184700BF500000203C0000201F -:107A280038B50C4C4FF0FF330021054644F82030A0 -:107A380005F072F9084A282303FB0522002352F8AF -:107A48002310013102D044F8253038BD01330A2B08 -:107A5800F5D138BD14560020485500202DE9F74FC0 -:107A68008046FEF755FC2C4B1B78002B50D0C5B236 -:107A78002A4B53F82530581C4AD00A2606FB0536EF -:107A8800DFF8A490264A59F8264052F823B0254F2B -:107A98000021631C0BEBC40A49F8263038680B46F2 -:107AA8004FF0FF32FEF778F9DAF80430991C08D065 -:107AB8005A1C0AD1284649F826300024FFF7B0FF9F -:107AC8001EE0002449F826401AE01BF83410284626 -:107AD80005F022F9DAF80420002482B123460221B5 -:107AE80000944046FEF7F8FAFDF7A0FC0094024621 -:107AF800214623464046FEF7EFFA012400E01446EB -:107B0800002138680A460B46FEF754F8002CAFD01F -:107B180003B0BDE8F08F00BF1056002014560020B7 -:107B2800A83601083C5600204855002037B51E4BA2 -:107B38001C781D46ACBB05F0F5F823461B4A4FF0F0 -:107B4800FF3142F823101A49282202FB03110022B0 -:107B58004FF0FF3041F8220001320A2AF8D10133F0 -:107B6800052BEBD10024134B0093134823464FF405 -:107B78007A710022FEF78AFA104B43F82400013488 -:107B8800052CF0D1032201200021FDF7EBFF0C4A60 -:107B9800106020B100210A460B46FEF70BF80123BE -:107BA8002B7003B030BD00BF1156002014560020C2 -:107BB80048550020657A0008D0360108285600206C -:107BC8003C56002010B5044B1C7805F0E1F8034B37 -:107BD80001221A70204010BD1156002010560020B6 -:107BE800F8B505460024174B53F824308B4223D1AF -:107BF800154F00210B464FF0FF323868FEF7CCF8DE -:107C08000A2303FB0543114A0026284642F823604D -:107C1800FFF706FF3346386831463246FDF7CAFF9C -:107C28000B4B53F82530A3420AD10A4B53F82500D1 -:107C3800BDE8F840FFF712BF01340A2CD3D1F8BDD4 -:107C4800F8BD00BFA83601083C5600204855002062 -:107C580014560020285600204160C260704700007A -:107C680070B505460024144B53F824308B421FD1BD -:107C7800124E00210B4630684FF0FF32FEF78CF8A9 -:107C88000A2303FB05440E4B4FF0FF32284643F806 -:107C98002420FFF7C5FE002130680B460A46FDF791 -:107CA80089FF084B53F82500BDE87040FFF7D6BEA2 -:107CB80001340A2CD7D170BDA83601083C560020E3 -:107CC800485500202856002008B5FEF7F9FB06495C -:107CD800064802F0E7FA0220012105F01DF8042009 -:107CE800012105F019F8FEE7DC3601087D8000085F -:107CF80008B5FEF7E5FB0649064802F0D3FA02206C -:107D0800012105F009F80420012105F005F8FEE736 -:107D1800ED3601087D8000081FB50223009300237B -:107D2800019302930393044904484FF49672FDF7B4 -:107D38003BFA05B05DF804FBFF360108557E0008E4 -:107D480073B5254C2578002D44D10120FDF7B2FFED -:107D5800224B234E18604FF0FF322B462946FEF780 -:107D68001BF8FFF775FD00F061F91E491E4802F087 -:107D780099FA1E491C4802F095FA1D491D4B0D68D9 -:107D88001D4836781D491A681D4B002E18BF01463C -:107D98001B681548019100951A4902F083FA1A4B9D -:107DA8001A491B6800931A4B0F48B3F90030019326 -:107DB800184B1A68043B1B6802F074FA09F05AF869 -:107DC80002F008F909F010F8FFF7B0FE07F01EFB03 -:107DD8000123237002B070BD415600203C61002091 -:107DE800FD3A0108153701087D8000083837010879 -:107DF800EC010020F0010020063701080F370108C8 -:107E0800E80100205F370108107AFF1F7937010861 -:107E1800227AFF1F187AFF1F38B5064B1C78FFF728 -:107E2800D1FE054607F018FB2840044002F0DEF8B2 -:107E3800204038BD41560020034B002118680A46EF -:107E48000B46FDF7B7BE00BF3C61002038B504F013 -:107E580069FF0020012104F05FFF06F075FAFFF7C3 -:107E68006FFF0121022004F057FF00F09DF800F099 -:107E7800D5FC01F08BFC08F08DFD00F07DFC06F0D0 -:107E880055FCFFF7C9FF044609F0A0F82040C4B22A -:107E980000F0A4F8044000F0E1FC044001F0AAFC62 -:107EA800044008F011FE04401E4D00F087FC6CB140 -:107EB80060B101242C70FFF7BFFF04201A49FFF7B7 -:107EC8008FFE20461949FFF78BFE1CE000232B701C -:107ED800FFF7A2FF88B104201449FFF781FE4FF491 -:107EE800FA60FDF7D3FB2B78002BF4D0104911482A -:107EF80002F0D8F9FFF7A0FF05E004F013FF042013 -:107F0800012104F009FFFEF79BFA0B4902460948D4 -:107F180002F0C8F902F072F84FF0FF30FDF7B6FB37 -:107F2800FAE700BF40560020CC0000205400002093 -:107F3800A73701087D800008BB37010810B50B4B37 -:107F48001B781BB90220FDF7A1FBF8E7084C0021BC -:107F58000B4620684FF0FF32FDF71EFF0021206816 -:107F68000A460B46BDE81040FDF724BE41560020E6 -:107F78003C610020014B1870704700BF425600203A -:107F880010B5084CFDF752FA2368C01A42F2107374 -:107F9800984204D9FDF74AFA2060FDF7E3F830BFAC -:107FA80010BD00BF9401002010B50B4C23788BB98D -:107FB80006F016FD07F0A4FC07F00CFDFFF718FD0E -:107FC80000F022F908F0F0FD01F020FF00F04EF972 -:107FD8000123237010BD00BF4356002038B50B4B5A -:107FE8001C7807F055FC0546FFF76CFC2840044058 -:107FF80000F01AF9044008F0E7FD044000F034F8F6 -:10800800044000F079F9204038BD00BF43560020F5 -:1080180010B5054C2046FFF7ADFC01284FF00003D2 -:108028000CBF2370184610BD4061002038B50B4BBB -:108038001C781D468CB90A4B0322012021461C706E -:108048005C70FDF78FFD074A106020B1214622467B -:108058002346FDF7AFFD01232B7038BD485600209D -:108068004061002044560020014B1878704700BF3B -:108078004856002070B51C4B0646187890B31B4D27 -:10808800002128684FF0FF320B46FDF785FE0128D6 -:1080980027D1174C23781D2B04D9FFF759FC012849 -:1080A80017D109E0E2180133DBB20A2E967023706B -:1080B800F3D01E2BF1D00EE0207800231A18002AE6 -:1080C80007DD0C491944224409799170013B5A1D76 -:1080D800F4D1FFF79DFF002128680A460B46FDF7FB -:1080E80069FDF0B270BD00BF48560020445600201C -:1080F8004061002021380108002343608360C36089 -:108108000361074BC362074B80ED000AC0ED050A07 -:1081180080ED061AC0ED071A036380ED0D2A70473B -:1081280000409C4500409CC529B1D0ED007A37EE4F -:10813800C00A80ED010A90ED037A90ED016A90ED96 -:108148000D0AD0ED0B7AA6EE007AB4EEE77AF1EEDE -:1081580010FA80ED037A06DCD0ED0C7AB4EEE77AFB -:10816800F1EE10FA01D5C0ED037AD0ED027AD0ED28 -:10817800066A90ED057A80ED026A76EE677A26EE59 -:10818800077AC7EE807A90ED030AC0ED047A26EEEE -:10819800800AD0ED076A80ED090A67EEA67A37EE05 -:1081A800000A80ED087AC0ED0A7A30EE270A704797 -:1081B80080ED0B0A7047002343608360C36003614E -:1081C800704780ED010A704780ED000A7047000093 -:1081D80038B5437813F0030305460FD0012B00D0C0 -:1081E80038BD04461E2204F8022B002120460AF05E -:1081F80042FF204603490AF046FF2846BDE83840BA -:10820800FFF7B8BB2638010810B5054C23782BB901 -:108218000F200449FFF7A6FB0123237010BD00BF00 -:1082280049560020D9810008014B1878704700BFD3 -:108238004956002030B50B4B1C680B4B00221D68BB -:108248001346A34209DA0C2159436956002902DB77 -:10825800824205D001320133F3E74FF0FF3030BDE1 -:10826800184630BD5C56002054560020F0B5184D15 -:108278002C7885B04CBB1748174B1849184E194F26 -:1082880030601B1A9B105943396002F019F8164ADE -:10829800164B3F683668116818602346BB4207DAF8 -:1082A8000C205843013330560028A8BF0131F5E7A8 -:1082B8000023012411600E48009401930293039354 -:1082C8000C499622FCF770FF2C7005B0F0BD00BF7A -:1082D800585600200C4C01085C500108ABAAAAAA09 -:1082E800545600205C5600204C5600205056002062 -:1082F800FD83000839380108014B1878704700BF22 -:10830800585600202DE9F04118B101281ED0BDE8CB -:10831800F081314B314A324C1F68136894F803E0FE -:10832800304D04330146B9424BDA13F8046C16F0A9 -:10833800800F03D0F50705D51D6804E0704513D0FC -:10834800013000E0274D01310C33ECE7244B2022AB -:108358005A7006221A70244A98701268DA70234AF2 -:1083680010685860184633E0202363700023A37018 -:108378000C231268E0704B43D7182846D35C23714E -:108388000AF089FE2946421C19480AF069FE284667 -:108398000AF081FED7F80480064640460AF07BFEC4 -:1083A8002644421C4146B01D0AF05AFE28460AF0EF -:1083B80072FE054678680AF06EFE28440530207083 -:1083C80005E0202363700023A37001232370044871 -:1083D800BDE8F041FFF7CEBA5C56002054560020A5 -:1083E80060610020EC3601084C56002050560020F1 -:1083F800656100202DE9F74F0220FFF769FA804CEC -:1084080002202146FFF77EFA6678A57816F0030663 -:10841800274603D12846FFF775FFF0E7012E30D134 -:108428002846FFF707FF002805DAFF23A370022379 -:10843800E570237130E00C235843724B1B681A5CBB -:10844800191802F00302022A8B680CD0032A0FD0F5 -:10845800012A15BF1B781B88E370A4F8033014BFEA -:10846800022303230BE01B68C4F80330052306E04E -:108478001A68C4F803205A68C4F80720092323702F -:108488002EE0022E2ED12846FFF7D4FE002807DA68 -:10849800FF23A370E57026710323237020469CE018 -:1084A8000C235843574B1B681A181B5C5906A6D453 -:1084B80003F00303022B926809D0032B0BD0012B86 -:1084C80015BFE378B4F803301370138008E0D4F8CC -:1084D8000330136004E054F8031F636882E80A005D -:1084E80047487AE0002D8AD12B46FA18927802B9CB -:1084F800013501331E2BF8D1012D7EDD42480AF0EB -:10850800CAFD07EB000808F10408814640460AF056 -:10851800C2FD00EB09030093FB18DFF8F8905E79C1 -:108528003A4B1B680193374BD3F800A04FF0000B70 -:108538005546019B9B4518DA29780A0604D5CB07CE -:108548000DD5D5F804900CE068684146FCF78CFD21 -:1085580038B948462C49FCF787FD10B907E0DFF821 -:10856800B4900BF1010B0C35E3E7022520E00C2356 -:1085780003FB0BF30AEB03021AF803309E423AD1CD -:1085880006F0400303F0FF05002B32D1009B9168F1 -:10859800043306F003063B44022E03F102001FD009 -:1085A800032E21D0012E15BF9B785B880B700B80A2 -:1085B80015480AF070FD064640460AF06CFD37443F -:1085C8003844457110480AF066FD054640460AF0F1 -:1085D80062FD2844043020700D48FFF7CBF90EE700 -:1085E800D3F802300B60E3E7D0E90023C1E90023A8 -:1085F800DEE70D25DCE71625DAE703B0BDE8F08FE6 -:108608006061002054560020636100205C56002001 -:1086180060610020EC36010807B50420FFF758F91F -:10862800504C04202146FFF76DF9627802F00302EE -:10863800012A234644D0022A6DD0002AF0D1A3781B -:10864800012B02D0022B0BD0EAE7A370464B1B7814 -:1086580040226270013302222270E37020467EE0DD -:10866800E078237040226270A37080B93F4B20717C -:1086780041F6FF721A603E4A18681368C4F8093058 -:108688005368C4F80D30C4F805000F2365E0394D70 -:108698000138C0B2294607F047FA00285ED0334AAD -:1086A800702101231160106823712A682378C4F8A7 -:1086B80009206A68C4F80500C4F80D200D334CE0A1 -:1086C800D4F80300A278019041216170E5790199FD -:1086D80062B96A18B2F5005F13D204F1080089B2D2 -:1086E8002A4605F0B5FD60B100230BE06818702834 -:1086F80007D8501E89B22A460833C0B207F08EFA4E -:10870800F1E70523174AE37113B90635157025E01B -:108718000623137022E0D4F8030022780190422146 -:10872800053A6170A5780199D2B250184DB9B0F5E3 -:10873800005F0FD2E01D89B205F0A2FD50B1002301 -:1087480009E0702806D8681E89B20733C0B207F05E -:10875800C9FAF3E70523E371062323700148FFF7FD -:1087680009F95DE7685600208D56002088560020DC -:10877800433801086056002030B50C4D2C7885B080 -:108788008CB90B4807F0AEF9003018BF012001235F -:1087980028708DE81800029403940648064996222A -:1087A8002346FCF701FD05B030BD00BF8C56002004 -:1087B8008D560020218600083F380108014B1878A3 -:1087C800704700BF8C56002070B5104C10492368C4 -:1087D800B3FA83F30E225B09851C02FB03120E30E9 -:1087E80055F8046B42F8046B8542F9D1288810804B -:1087F8000E22236002FB03139B890BB9054A1370F1 -:10880800FCF714FE044B186070BD00BF90560020A2 -:1088180094560020B3560020B856002010B50A4CD4 -:1088280023787BB9FFF714F803200849FFF79AF873 -:10883800FCF7FCFD064B074A186001231370064A33 -:108848002370137010BD00BFB4560020D1870008F4 -:10885800B8560020B0560020B356002008B5FFF7E0 -:1088680031F8014B187808BDB456002070B5114B8B -:10887800114C1E68FCF7DAFD104B1B68C01AB0F5E6 -:10888800FA7F14D90E4D0E2303FB06F2A918002314 -:10889800B0F5FA6FAB504B608B6008D9094A0B737F -:1088A8001370094A4B7301232370137070BD0023A2 -:1088B800237070BD90560020B0560020B856002096 -:1088C800945600208E560020B356002008B5FCF7B9 -:1088D800ADFD024B1B68C01A08BD00BFB85600208A -:1088E80030B5064B1C68064B0E2505FB04331C6887 -:1088F8000460586808609B68136030BD905600207B -:108908009456002030B5144B1C7804701348057831 -:1089180004460DB9187800E0002000F00100087046 -:10892800197889B10E499FED0F7A08680E490E250E -:1089380005FB0011898907EE901AF8EE677A77EE41 -:10894800C77AC7EE877A01E0DFED087AC2ED007AD0 -:108958001B78237030BD00BF8E560020B156002012 -:108968009056002000FEFF469456002000000000AC -:10897800044B1B780370044B1B780B70034B1B785C -:1089880013707047990100209A010020B256002008 -:108998000B4B1A680B4B0E2101FB023399890A4BCA -:1089A8001B780BB1002307E0B1F57A7FFAD94EF6B0 -:1089B8006023994298BF0B460380FFF757BF00BF5B -:1089C8009056002094560020B3560020014B18788A -:1089D800704700BF98010020014B1878704700BF0E -:1089E800BC56002010B5394C2378002B6DD19FED73 -:1089F800380A3848DFED380A9FED382AB0EE401AB9 -:108A0800F0EE401AFFF778FB9FED310A3448DFEDAE -:108A1800320A9FED322AB0EE401AF0EE401AFFF704 -:108A28006BFB9FED2B0ADFED2C0A9FED2E1A9FEDB5 -:108A38002B2A2D48F0EE401AFFF75EFB25489FEDE4 -:108A48002B0AFFF7B5FB26489FED280AFFF7B0FB76 -:108A580025489FED270AFFF7ABFB9FED1D0A254828 -:108A68009FED1E2AF0EE401AF0EE0C0AB0EE001A46 -:108A7800FFF742FB9FED160A1F489FED182AF0EEFC -:108A8800401AF0EE0C0AB0EE001AFFF735FB9FED26 -:108A9800100A9FED122A1948F0EE400AB0EE401A6B -:108AA800F0EE401AFFF728FB1248B3EE040AFFF76E -:108AB8007FFB1148B3EE040AFFF77AFB0F489FEDDE -:108AC800100AFFF775FB0123237010BDBD56002067 -:108AD800000000006862002000008C426F12033B17 -:108AE800F86100209A998541BC6100203333054222 -:108AF80033B326438061002030620020A06200204A -:108B08000000B443014B1878704700BFBD560020E1 -:108B180000B52DED068B4048B0EE408A83B0B0EE2C -:108B2800610AF0EE609AF0EE418AB0EE42AAB0EE29 -:108B3800629AFFF749FBB0EE480A37489FED378A3B -:108B48000121FFF7F1FAB4EEC80AF1EE10FA0DDCD4 -:108B5800DFED337AB4EEE70AF1EE10FA09D4BDEE90 -:108B6800C00A8DED010ABDF8043004E047F6FF7332 -:108B780001E048F201032B4A2B481380B0EE4A0A61 -:108B8800FFF722FB2848B0EE690A0121FFF7CCFA6B -:108B9800B4EEC80AF1EE10FA0DDCDFED217AB4EE7E -:108BA800E70AF1EE10FA09D4BDEEC00A8DED010A0C -:108BB800BDF8043004E047F6FF7301E048F2010312 -:108BC8001A4A1B481380B0EE490AFFF7FDFA184805 -:108BD800B0EE680A0121FFF7A7FAB4EEC80AF1EE71 -:108BE80010FA0DDCDFED0E7AB4EEE70AF1EE10FABA -:108BF80009D4BDEEC00A8DED010ABDF8043004E0C9 -:108C080047F6FF7301E048F201030A4A138003B0F4 -:108C1800BDEC068B5DF804FB6862002000FEFF4691 -:108C280000FEFFC6F4610020F8610020BA61002050 -:108C3800BC610020B861002070B506462DED068B9A -:108C48002648B0EE40AAB0EE610AB0EE609AF0EEA7 -:108C5800418AF0EE429AB0EE628A14460D46FFF75A -:108C6800B3FA01211D48B0EE4A0AFFF75DFA1C4825 -:108C780086ED000AB0EE690AFFF7A6FA1848B0EECA -:108C8800490A0121FFF750FADFED167A85ED000A4F -:108C980038EE680AB4EEE70AF1EE10FA04DDDFED0B -:108CA800127A30EE670A0AE0DFED107AB4EEE70ACE -:108CB800F1EE10FA44BFDFED0C7A30EE270A0C48CB -:108CC800FFF77FFAB0EE680A09480021FFF72CFA8F -:108CD800BDEC068B84ED000A70BD00BF80610020EA -:108CE80030620020000034430000B443000034C365 -:108CF800A062002008B50A48FFF75DFA0948FFF7A7 -:108D08005AFA0948FFF757FA0848FFF754FA08488B -:108D1800FFF751FA0748BDE80840FFF74CBA00BF13 -:108D28008061002030620020A0620020686200207C -:108D3800F8610020BC610020044B1B880380044BB1 -:108D48001B880B80034B1B8813807047F46100203D -:108D5800BA610020B8610020024B1A780AB90122D2 -:108D68001A707047C4560020014B1878704700BF2E -:108D7800C4560020DFED817A9FED817A8148824ACE -:108D8800824920EE270A60EEA70A21EE271AF5EE9F -:108D9800401AF1EE10FAF0B580EE070A7C4C80EE2E -:108DA800875A81EE071AF6EE004AF7EE087A09D1DB -:108DB800B5EE402AF1EE10FA04D1F5EE402AF1EEB4 -:108DC80010FA7CD062EE026A94ED004AD1ED005AA6 -:108DD800704F714EE1EEA16A0025E2EEA26A16EE2E -:108DE800903A5B10C3F1BE4303F55D1303F5CE5310 -:108DF8001F3307EE103A66EEA46A06EE103A67EEE5 -:108E0800666AB0EE677AA6EE867A644BD0ED006AA1 -:108E180026EE077A25EEC46A61EE871A22EE072A43 -:108E280062EE872A92ED007A65EE875AA6EE876A87 -:108E3800E4EE265AFEEE006AE4EE046A25EEE24A03 -:108E4800E7EE076A93ED007A554BA2EE264AB5EE97 -:108E5800C07A66EEE16A26EE422AF1EE10FAE2EEF8 -:108E6800866AA1EEA52A1EDD27EE046AD7ED003A30 -:108E7800D6ED005AE6EE033A27EE266A27EE027A86 -:108E8800E6EE035A93ED006AC7ED003AA7EE036ACF -:108E9800C6ED005A83ED006A30EE230A35EE255AF6 -:108EA80031EE061A02E03D6035601D603D4B93EDE2 -:108EB800007AA7EE040AA7EE265AA7EE021A23EEB6 -:108EC800243A91ED004AD4ED003A92ED007A21EE71 -:108ED800031A20EE030A24EE016A65EE030AA3EEE4 -:108EE800806A90ED005A60EEC45AF1EE476AE5EEEA -:108EF800405AA6EEA06AE6EE815A35EE066A61EEA1 -:108F0800456A25EE205AE3EEA06AA3EE815A73EE75 -:108F1800A55AA4EE405AE7EE006A37EE055A26EE47 -:108F2800067A74EE266AA5EEA57AA6EEA67AA5EECE -:108F3800057A17EE103A5B10C3F1BE4303F55D13D3 -:108F480003F5CE531F3327EE247A04EE903A24EE2D -:108F5800C77AE7EE247A64EEA77A65EEA75A26EE7A -:108F6800276A66EEA76A25EE275AC4ED005A80EDF7 -:108F7800006AC1ED006A82ED005AF0BDDB0F49407E -:108F880000003443C8560020D0560020CC5600209C -:108F98009C010020D4560020D8560020A0010020B3 -:108FA800C0560020A401002070B52DED068B364B6D -:108FB800D3ED007A354BD3ED006A354B93ED006A5B -:108FC800344B93ED000A20EE267A20EE468AA6EE70 -:108FD800277A04460D46A7EEA68A164677EE079A24 -:108FE80027EEA75A26EE067A38EE088A60EE005A6F -:108FF80037EE459AF7EE004A66EEA60A39EE659A0C -:10900800B4EEE48AF1EE10FA39EE209A09DCFFEEAC -:10901800004AB4EE648AF1EE10FA48BFB0EE648AF2 -:1090280001E0B0EE648A27EE800A37EE057AA6EEF4 -:10903800260A37EE657A30EE000A77EE600A08F005 -:10904800F9F9DFED158A9FED15AA20EE280A80EEC2 -:109058000A0A86ED000AB0EE480A08F08DF920EEFB -:10906800280AF0EE490A80EE0A0A85ED000AB0EEF9 -:10907800690A08F0DFF920EE280A80EE0A0ABDEC3A -:10908800068B84ED000A70BDC8560020D05600201B -:109098009C010020CC56002000003443DB0F4940DF -:1090A800164B93ED007A164B93ED006A154B93ED32 -:1090B800005A154BD3ED005A65EE867A65EEC56AFF -:1090C800E5EE077AE7EE066A27EE477A77EEA77AA3 -:1090D800A5EE057A60EEA70AA5EEE57A76EEA66A11 -:1090E800F0EE607AE0EE267AA6EE067AB7EE000A8F -:1090F800E1EE077A37EEC00A704700BFC856002075 -:10910800D05600209C010020CC560020F0EEC07AFA -:10911800F4EEE07AF1EE10FA0BD4B5EEC00AF1EEF7 -:1091280010FA02DD30EE600A704704D530EE200AEE -:1091380070479FED010A7047000000002DE9F041DB -:109148004E10851B5210AC181C444FF6FF7724EACA -:10915800E474BC421B49DFF87880A5EB0205A8BF80 -:109168003C460644ED1A0C6025EAE575B11ABD4285 -:10917800D4BFC8F80050C8F800703244124D134EDE -:10918800194421EAE171D31A23EAE373B942D4BF3F -:1091980029602F600020A1B2BB42D4BF3360376082 -:1091A800FEF702FAB8F800100120FEF7FDF9298849 -:1091B8000220FEF7F9F931880320BDE8F041FEF7F7 -:1091C800F3B900BFEC620020D8620020E4620020FE -:1091D800E06200202DE9F04F2DED048B002083B0D4 -:1091E8000321FCF771FAFEF7A9FE04206449FEF793 -:1091F800F7FCFCF71BF94FF0000A0190D046614CD0 -:10920800614F01A80221FCF7FDF9204639465F4A63 -:1092180006F09CF806F094F80028F0D05C4E5D4DFE -:109228005D4A30462946FFF75BFB0DF101000DF161 -:1092380002010DF10302FFF79BFBB8F1000F00F0EC -:10924800CB809FED568ADFF88C81D7ED001A97ED19 -:10925800012AD7ED022A94ED000AD4ED010A94ED13 -:10926800021AB0EE483AFFF785FD4D484D4942468F -:10927800FFF79AFED7ED010A97ED021A97ED000A5B -:10928800FFF70EFFD7ED017AD7ED006A97ED027A66 -:10929800454B67EEA77A83ED000AE6EEA67A434BC4 -:1092A800E7EE077AC3ED007A414BD3ED000AFFF7EA -:1092B8002DFF404BD3ED007AE0EE087AC3ED007A3B -:1092C800FFF784FBA0B1012841D19FED3B7AD5ED92 -:1092D800007AD6ED006A67EE877AB0EE676A96EE96 -:1092E800876AE6EE877A86ED006AC5ED007A2EE099 -:1092F800FFF772FBD6ED008A304B10B1D8F800208A -:109308001A6093ED008AD8ED007A37EEC88ADFED4F -:109318002C7A68EE277A9FED2B8A87EE888AB0EE42 -:10932800480A07F079FFB0EE409AB0EE480A07F015 -:10933800B7FF95ED007A60EE477AE8EE897A68EE35 -:10934800808AC6ED007AE7EE098AC5ED008A124BDD -:1093580098ED001AD3ED002A114BD6ED001A93EDC3 -:10936800000A104B95ED002AD3ED000A164817495C -:10937800174AF1EE622AFFF75FFC4FF000082DE074 -:10938800540000206C570020E8560020F4560020B6 -:10939800A857002004570020A05700206F12833BD5 -:1093A800DC56002024570020785700207C570020E6 -:1093B800E001002068570020F304353F645700207F -:1093C800DB0F494000003443985700201057002015 -:1093D80090570020005700204FF0010805F0F2FFD9 -:1093E800DFF8A493002800F02B810AF1010ABAF1F2 -:1093F800040F40F22581BB4FBB49BC4A4846FFF7E2 -:1094080081FA3A46BA49BB4804F04CFDBA4B97ED8D -:10941800007AD3ED007AB94FB94BD7ED006AB7EEB1 -:10942800008A38EE670AF0EE488A27EE000AA6EEB0 -:10943800A70AD3ED007AB34B87ED000A78EE676A86 -:1094480027EE267AD3ED006AA6EEA77A83ED007A96 -:10945800AD4B30EE470AD3ED000AFFF757FEAB4B92 -:10946800AB4A83ED000AAB4B92ED007AD3ED006A6C -:10947800B1EE476AB4EEE66AF1EE10FAD4BFF0EE48 -:10948800667AF0EE467AB4EEE77AF1EE10FA08D48E -:10949800B4EEE66AF1EE10FAD4BFB0EE667AB0EE3A -:1094A800467A9D4AD2ED007A78EEE76A20EE260ADF -:1094B800A7EE270A83ED000A984B83ED000A06F011 -:1094C800A5F810B9964B0022DA60874BDFF898B2FE -:1094D8001A7802B3934ADFF848A2D2ED000A924AFA -:1094E80097ED000A92ED001A904A9AED038AD2EDA0 -:1094F800001A9FED8F2A8BED000A5046FEF7FCFDFF -:10950800504697ED000A8AED038A0021FEF70CFE0B -:10951800884A82ED000A99F80020DFF818A2002A8C -:1095280000F08680714A7E4892ED007A824A92ED78 -:10953800000A87EE007A9BED000A37EE000A8BEDF1 -:10954800000AFEF741FEDBED007A7C4B97ED000A3E -:10955800D3ED000A30EE670AFFF7D8FD784B93ED9C -:10956800007AF1EE476AF4EEC06AF1EE10FAD4BF61 -:10957800F0EE407AF0EE667AB4EEE77AF1EE10FAA1 -:1095880008D4F4EEC06AF1EE10FAD4BFB0EE407A17 -:10959800B0EE667A6B4B624883ED007AB1EE470A0B -:1095A800FEF70FFE684B5E4893ED009A574B97ED18 -:1095B800000A93ED007A654BDAED009A93ED008A84 -:1095C800564B27EE088A93ED007A614BD3ED007A6B -:1095D8000021A7EE278AFEF7A7FD78EEC97A38EEB4 -:1095E800000A5C485C4B27EE800AD0ED007A1A88A6 -:1095F8005A4BA9EE290A1988594B8AED000A20EE20 -:10960800270A1B88BDEEC00A10EE100A034483F334 -:10961800100398B2814238BF0B469A4203DC884255 -:10962800024628BF0A464F4B4FF0000A1A8007E04F -:109638004D4900230B604349CAF800300B6092463D -:109648009DF8013049490BB933680B609DF8023029 -:10965800474A0BB92B6813609DF80300454B30B996 -:109668004548D0ED007AF1EE677AC3ED007AD4ED83 -:10967800010AD1ED001A92ED002AD3ED002A94EDEB -:10968800000A94ED021AF1EE600AFFF741FA3B482E -:109698003B493C4AFFF750FB99F800301BB9314869 -:1096A800FFF776F905E005F08DFE0028F7D0FFF703 -:1096B800DDF82C4B188860B1324B304A1B88B2F960 -:1096C80000102F4A5B42B2F900201BB2FFF736FDAB -:1096D80095E5014602460346FFF730FDFFF70AFB12 -:1096E8008DE500BF60570020A45700208C5700204C -:1096F8000857002018570020B40100208057002088 -:10970800E40100209C570020D0010020E4560020EE -:10971800D801002068570020BC0100200C57002009 -:1097280028570020CC010020C80100201457002031 -:109738000AD7233C84570020B00100208857002016 -:10974800B80100201C570020A8010020E056002086 -:10975800D4010020C401002022570020C0010020AD -:10976800AC010020DE620020DC01002098570020B8 -:109778001057002090570020A0570020E8620020D2 -:10978800F0620020DC6200209457002030B5124DB2 -:109798002C7885B0ECB91148FDF77EFE05F0BCFACF -:1097A800FFF7DAFAFFF71EF90D4A0E480E490023B3 -:1097B80013600E4A13600E4A136004238DE81800E4 -:1097C8000294234603944FF4E172FBF7EDFC012366 -:1097D8002B7005B030BD00BF205700201C000020B2 -:1097E80098570020DD91000814390108105700200F -:1097F8009057002010B5FDF7A7FF044605F060FB61 -:109808002040C4B2FFF7B0FA0440FFF77BF92040CC -:1098180010BD00002DE9F34100260C23184D7343B9 -:109828005A59824204D00136082EF6D1022024E08B -:109838002B449C6824B123680022A2601C46F9E7E7 -:109848000C2707FB0657786888B14FF0FF380121CD -:1098580022462346CDF80080FCF73EFCCDF8008078 -:109868007868032122462346FCF736FC7C600C23EB -:109878005E434FF0FF33AB51002002B0BDE8F081EA -:10988800EC5A002013B500210C220C4C02FB01F30A -:109898001A59824204D001310829F5D102200AE080 -:1098A80023444FF0FF3200920022586801211346EA -:1098B800FCF712FC002002B010BD00BFEC5A0020DB -:1098C80038B5124B124D1B780BB900230DE000245C -:1098D8002859431C05D0FFF7D5FF0D4BE058FFF77B -:1098E80099FF0C34602CF3D1EFE74FF0FF32EA50C8 -:1098F8000C33602BF9D10023064A1A440C3300219B -:10990800B3F5407F9160F7D138BD00BF545B0020AC -:10991800EC5A0020AC57002008B5FCF7F9FCBDE86C -:1099280008400146014800F07FBB00BFC99C000801 -:109938002DE9F74F019100210C23414A4B439C58D4 -:10994800844204D001310829F6D1022075E01A4476 -:109958003C4B1B6800933C4BD3F800800021019BD3 -:10996800994224DA976800253B46384C2BB1187980 -:109978001B680009205C0544F7E7354810F811C05A -:109988000CF00F0E4E0014F80E402C441E2C00EB69 -:10999800060A81460DDCDFF8BCE00C2505FB03E474 -:1099A800A06840B10133402BF5D1284645E000209E -:1099B80043E0072041E09AF801A0BAF1FF0F10D068 -:1099C8000646009DAE42C0DA0C2505FB06F918F9DB -:1099D80009B0BBF1000F02DB50451DD00130013644 -:1099E800EFE720794FEA1C15023665F303004E4471 -:1099F8006CF30710A660207102310C20434300204D -:109A08004EF803000FB9946004E03B680BB11F46A1 -:109A1800FBE73C600131A2E7002E96DB08EB09006A -:109A280005FB03E58068A86018F80960287966F3E3 -:109A380003006CF307102871DFE703B0BDE8F08F6F -:109A4800EC5A0020505B0020585B0020E43A0108E3 -:109A5800B05A0020AC5700202DE99F480520FDF79B -:109A680037FF8A4C8A4E21460520FDF74BFF00211F -:109A78000B4630684FF0FF32FCF78EF9637813F02D -:109A8800030F274663D1A3788BB1012B5FD1A37055 -:109A9800804B1B68E370804B50221868627040232B -:109AA8000822606022702272637220464DE07B4A71 -:109AB8007B48D2F800C0026894F80380794D0432DC -:109AC8001946614580F2DB8012F804EC1EF0800F25 -:109AD80004D01EF0010F05D0156804E0434505D0F9 -:109AE800013300E0704D01310C32EAE75022627018 -:109AF800E37000220C234B43A2700268284602EB55 -:109B08000309D35C237109F0C6FA2946421C674849 -:109B180009F0A6FA284609F0BEFAD9F804A080464A -:109B2800504609F0B8FA4744421C5146B81D09F09E -:109B380097FA284609F0AFFA0546D9F8040009F063 -:109B4800AAFA2844053020705048FDF713FF6378BF -:109B580003F00303012B67D14C4B9B78052B5AD894 -:109B6800DFE803F0031F262A515594F803A094F860 -:109B780000B000214E4BCA5892451A464DD00C31C0 -:109B88006029F7D100230C2505FB03F8DFF82091A5 -:109B980052F808C0BCF1FF3F1CD00133082BF2D1AA -:109BA8002FE02178E07802394908FFF7C1FE35E057 -:109BB800E078FFF72FFE31E0E178207900220C23CE -:109BC8003B4F5343DD598D4239D00132082AF6D133 -:109BD800022023E009EB0807364B49F808A036486D -:109BE80000934FF47A713B460122CDF80CC0FCF784 -:109BF8004DFA00237860BB60DDF80CC0D8B949F88D -:109C080008C028460AE0E078FFF73CFE06E0FFF7C8 -:109C180057FE002002E0082000E0112020710323F5 -:109C28001A482370FDF7A6FE002130680A460B4645 -:109C3800FBF7C0FF15E7ABF102015046B4E700EBB4 -:109C4800800045001F4415D04FF06408CDF800800F -:109C58002A46022100237868FCF73EFA7D68FBF764 -:109C6800E5FB00210246CDF8008028460B46FCF7AC -:109C780033FACEE73946114800F0D6F9C1E7502348 -:109C880063700023A370012323705DE7AC5A0020A2 -:109C9800605B00204C5B00205C5B0020505B002078 -:109CA800585B0020B53A0108EC360108B15A00208B -:109CB800EC5A002021990008BA3A0108C99C00080A -:109CC8002DE9FF414E4E8568002104464FF0FF32D2 -:109CD8000B463068FCF760F8FBF7A8FB494B5222AB -:109CE8005A7004221A7022689A70D870020A000CFE -:109CF8001A7158711C46002D6BD000230293002363 -:109D08000393AB6819682B79019103F00F02013AAC -:109D1800062A1AD8DFE802F0040A10070D1012000C -:109D28009DF8042010E09DF904200DE0BDF8042002 -:109D38000AE0BDF9042007E00A4605E007EE901A9C -:109D4800FDEEE77A17EE902A029203F0F002702AED -:109D580001D0802A28D103F00F03072B17BFDDEDB0 -:109D6800027A0391F8EEE77ACDED037A702A0AD1E8 -:109D78002378244A1A2B2CD813440398C3F80200DA -:109D8800137804330EE09DED030A00F0CFFA237830 -:109D980002901C2B1B4A1CD81344BDF8081059808C -:109DA80013780233137012E01B09174A207812F84F -:109DB8000380144FC8F11E0398420AD8384442461B -:109DC800023002A909F04CF93A7842443A702D68F9 -:109DD80091E700210A460B463068FBF7EBFEFDF7DA -:109DE800FDFD30B9FFF76CFD04B0BDE8F041FDF7AB -:109DF800E3BD044804B0BDE8F041FDF7BBBD00BFBA -:109E0800605B0020CC5A0020E43A0108F0B5204DF0 -:109E18002C7885B0002C38D11E481F4B1F49204E86 -:109E2800204F30601B1A9B105943396000F048FAE4 -:109E38001D4B18600120FBF73DFF1C4A1C4B3F6877 -:109E48003668116818602346BB4207DA0C2058436D -:109E5800013330560028A8BF0131F5E7116000230F -:109E6800144A4FF0FF3199500C33602BF8D1FFF7AB -:109E780027FD0124002300940193029303930E48C5 -:109E88000E499622FBF790F92C7005B0F0BD00BF83 -:109E9800545B00205C50010898530108ABAAAAAA99 -:109EA800585B0020505B00205C5B00204C5B00206E -:109EB800605B0020EC5A0020619A0008C33A010850 -:109EC8002DE9F843114B124E1F68124B1D6880464E -:109ED80089460024BC4212DA2B781A0602D5DB0721 -:109EE80048BF6E6840463146FBF7BEF820B9484681 -:109EF8006968FBF7B9F830B101340C35EAE74FF07F -:109F0800FF30BDE8F8832046BDE8F883505B0020A9 -:109F1800EC360108585B002010B5041E05DA184815 -:109F280018494FF42F7200F0ABF8174B0C20604320 -:109F38001A681318125C013A062A1ED8DFE802F0E4 -:109F4800040B12070E1215009B68187810BD9B6849 -:109F580093F9000010BD9B68188810BD9B68B3F981 -:109F6800000010BD9B68186810BD9B68D3ED007A8F -:109F7800FDEEE77A17EE900A10BD002010BD00BF75 -:109F8800C73A0108D23A0108585B002010B5041EF0 -:109F980005DA0D480D494FF4377200F071F80C4A94 -:109FA8000C2363431268D118D35C072B03D18B6849 -:109FB80093ED000A10BD2046FFF7AEFF07EE900AAA -:109FC800B8EEE70A10BD00BFC73A0108D23A010847 -:109FD800585B002010B5044C226822B905200821DE -:109FE800FBF7C0FD206010BD645B0020024B1868C1 -:109FF800003018BF01207047645B002013B5094B7F -:10A008001A681C4662B10023206869464FF0FF3287 -:10A01800FBF7C2FE009B002BF5D001989847F2E7AA -:10A0280002B010BD645B002007B568B1084B002280 -:10A038008DE80300186869461346FBF7BBFD002846 -:10A048000CBF0C20002000E0082003B05DF804FBE2 -:10A05800645B0020B1F5807F136803DC0129B8BF79 -:10A06800012101E04FF48071C3EB0020001201FBD5 -:10A078000031C1F3C01000EB2120116000B270471D -:10A0880008B502F07BFE0220012102F045FE042003 -:10A09800012102F041FEFEE70123092804DD0A221E -:10A0A800013390FBF2F0F8E7184670472DE9F84FB6 -:10A0B800824608460D4693461C46FFF7EDFF002DE5 -:10A0C800064604D13020D0470120BDE8F88F05DAD4 -:10A0D800BBF10A0F02D12D206D42D047A6420ADA01 -:10A0E800A41B2646002E03DD3020D047013EF9E7A9 -:10A0F80024EAE47400E00024012600273B462846B1 -:10A1080000213246FAF7DEFC50EA0103D8464FEA4E -:10A11800EB7907D006FB09F30BFB0733A6FB0B67AC -:10A128001F44EBE7304639464B464246FAF7CAFC2D -:10A1380006460F4656EA07030ED032463B462846E7 -:10A148000021FAF7BFFC42464B46FAF7BBFC044B2A -:10A15800985CD0470134E5E72046BDE8F88F00BF9A -:10A16800ED3A01082DE9F8432DED028B07460E461E -:10A17800154600243078002800F08C80252840F00F -:10A188008580474B19684FF006080136324612F8A9 -:10A19800013BC818407880070AD12E2BF5D1737877 -:10A1A800C8184078460748BFA3F130081646ECE7C0 -:10A1B800662B16461BD003D8582B0DD0642B04E011 -:10A1C800732B53D0782B07D0692BD3D105F1040812 -:10A1D800384629680A2204E0296805F10408384647 -:10A1E80010220023FFF762FF45460444C2E7073503 -:10A1F80025F00703D3E9000103F10805FAF712FC7B -:10A2080008EE100AB5EEC08AF1EE10FA04D52D203A -:10A21800B847B1EE488A0134FDEEC88A0A2218EE22 -:10A22800901A00233846FFF741FF04442E20B84710 -:10A23800F8EEE88A013438EE688A0A23012242459A -:10A2480003DA0A214B430132F9E707EE903AF8EEB8 -:10A25800E77A384628EE278A0A22FDEEC87A43466E -:10A2680017EE901AFFF722FF044483E7D5F8008021 -:10A2780005F104094546C8EB04032B4415F8010B06 -:10A2880008B1B847F7E74D461C4673E70136B847AB -:10A2980001346FE7BDEC028B2046BDE8F88300BFB0 -:10A2A800CC0400200EB403B503AA52F8041B019293 -:10A2B800FFF758FF02B05DF804EB03B070470000E9 -:10A2C800F0B54FF0FF330446221A8A421EDA14F81A -:10A2D800016B07220025F70742BF012797403D433E -:10A2E80012F1FF324FEA5606F5D283EA05630822D7 -:10A2F800002B4FEA4305B8BF0B4B02F1FF32B4BF46 -:10A308006B402B4612F0FF02F2D1DDE71F2200203E -:10A31800D90742BF01219140084312F1FF324FEAA9 -:10A328005303F5D2C043F0BDB71DC10410EE103A77 -:10A33800C3F3C751FF2910B54FEAD37003D1C3F354 -:10A348001602C2B901E08E2906D9002814BF4FF4BD -:10A358007C404FF4F84010BD6F290FD9C3F3003487 -:10A36800C3F34932A31843EAC033A1F1700043EAAA -:10A37800802080B210BD4FF4FC4010BD002010BDFD -:10A38800002103E00A4B5B584350043109480A4B4B -:10A3980042189A42F6D3094A02E0002342F8043BE5 -:10A3A800074B9A42F9D300F00FF8FCF794FF704777 -:10A3B800A0530108000000203405002034050020C7 -:10A3C800886D0020FEE70000354AD2F8883043F453 -:10A3D8007003C2F88830334B1A68002142F001023A -:10A3E8001A6099601A6822F0847222F480321A6026 -:10A3F8002D4A5A601A6882B022F480221A60D96005 -:10A40800009101911A6842F480321A60254B1A684B -:10A4180002F400320192009A01320092019A1AB9AC -:10A42800009AB2F5A04FF1D11B6813F4003318BF9E -:10A4380001230193019B012B2FD11A4B1B491A6C45 -:10A4480042F080521A640A6842F440420A609A68EC -:10A458009A609A6842F400429A609A6842F4A0525C -:10A468009A60134A5A601A6842F080721A60196832 -:10A478000C4A8901FBD50F4B40F2057119609368AE -:10A4880023F003039360936843F002039360054B42 -:10A498009B6803F00C03082BF9D102B0704700BF8A -:10A4A80000ED00E000380240103000240070004049 -:10A4B80008544007003C02404FF44070FCF7B6BE19 -:10A4C8004FF0FF32826110220273FF22026100F016 -:10A4D80021BF000038B5037B012B044605D0037B60 -:10A4E800102B02D0037B002B72D12378394D55F8FD -:10A4F8002320138823F001031B041B0C13802078EE -:10A5080000F092FF207800F01BFFE378022B03D1C4 -:10A518002078617801F044F8207800F0FDFE20787A -:10A5280000F022FF237855F8232013889BB243F0CC -:10A53800010313802378E16955F82300FCF78AFAB0 -:10A548006369D90208D52278224B53F82220138850 -:10A558009BB243F0400313806369DA071AD5237866 -:10A5680055F8232093899BB243F001039381237804 -:10A5780055F82320938923F0FE031B041B0C9381B9 -:10A58800237855F823108B899AB2636903F0FE0388 -:10A5980013438B8163695B0008D5237855F8232022 -:10A5A800138823F480631B041B0C1380E378022BAD -:10A5B80004D120786178626900F05EFF2078E37842 -:10A5C8006169627801F004F801232373002038BD23 -:10A5D800012038BD6C0200200F4A104911604BF66B -:10A5E800FF71D1804FF48061034651814FF480415F -:10A5F8000020918103211081908059700221D97027 -:10A608004FF0FF311873987018615860986058615E -:10A618009961DA61704700BFF4620020A0860100EA -:10A6280013B58378414A012B03783ED141684C68C1 -:10A63800002C3AD1017B012902D0017B062934D1B3 -:10A6480052F8233039494FF2FF029A82C378012B1E -:10A6580068D1037851F82320938823F400731B04EE -:10A668001B0C9380037851F82320938823F480638C -:10A678001B041B0C938046F2A8130193037851F82E -:10A6880023100B8B9B0705D4019B4BB9FFF718FFD1 -:10A69800044647E0019B5A1E0192002BF1D1F3E7D3 -:10A6A8000123037303F090F93CE052F823101F4C88 -:10A6B800898A01F4706101611021017352F8233015 -:10A6C8004FF2FF0199820369D90510D5037854F830 -:10A6D80023100B886FEA43436FEA53439BB20B8006 -:10A6E800037854F823100B88C3F30E030B80036917 -:10A6F8009B0510D5037852F823100B886FEA434363 -:10A708006FEA53439BB20B80037852F823201388D7 -:10A71800C3F30E031380036903690169007803F02A -:10A7280049F90024204602B010BD00BF6C02002089 -:10A7380073B54FF0FF338361574E0378574D56F882 -:10A74800232055F8231012F0005F14BF49680968E8 -:10A758000A4214BF012200220446002A59D0436845 -:10A7680000225A6043695A044FD48378002B4CD195 -:10A7780003784B4951F82320938823F400631B0482 -:10A788001B0C938044F620630093037851F8232030 -:10A79800938A5B0702D5009B33B91FE0009B581EC4 -:10A7A8000090002BF4D1F6E7636918021AD41388D5 -:10A7B8009BB243F40073138046F2A81301932378E5 -:10A7C80051F82300038B9B0702D4019B53B905E082 -:10A7D800019B5A1E0192002BF4D1F6E72046FFF7A1 -:10A7E8006FFE56E022782F4B53F82220136823F08F -:10A7F80001031360237851F82320938823F400730E -:10A808001B041B0C938001232373204603F0DCF800 -:10A8180023E0254A55F8231052F8232090004CBF16 -:10A82800496809680A4214BF01220022AAB91F4ACE -:10A8380055F8231052F8232090004CBF4968096846 -:10A848000A4214BF012200223AB11022154922738C -:10A8580051F8233062685B6853602378124956F8D0 -:10A868002320124C12F000500AD051F8231055F84A -:10A87800230054F823300A431A43C260002008E03A -:10A8880051F8231055F8235054F823300A431A433B -:10A89800AA6002B070BD00BFC83B0108900200204A -:10A8A8006C02002078020020783B0108BC3B0108BC -:10A8B800F7B54FF0FF338361514E0378514D56F889 -:10A8C800232055F8231012F0005F14BF4968096867 -:10A8D8000A4214BF012200220446002A4ED083688F -:10A8E80000225A604369180444D4A378002B69D124 -:10A8F8002378454A52F823100B889BB243F400731F -:10A908000B80237852F823108B8823F400631B04F0 -:10A918001B0C8B8046F2A8130193237852F82370FE -:10A92800398B890705D4019949B92046FFF7C8FD35 -:10A9380064E00199481E01900029F1D1F3E73349F9 -:10A9480051F823100B6823F001030B60237852F8A9 -:10A9580023108B8823F400731B041B0C8B80237833 -:10A9680052F82320938823F480531B041B0C9380F4 -:10A9780001232373204603F03DF823E0244A55F8C9 -:10A98800231052F8232097004CBF496809680A42EF -:10A9980014BF01220022AAB91E4A55F8231052F802 -:10A9A800232090004CBF496809680A4214BF01225D -:10A9B80000223AB110221549227351F82330A268B7 -:10A9C8005B6853602378124956F82320114C12F023 -:10A9D80000500AD051F8231055F8230054F82330BA -:10A9E8000A431A43C260002008E051F8231055F8C2 -:10A9F800235054F823300A431A43AA6003B0F0BD29 -:10AA0800903B0108900200206C0200209C0200206C -:10AA18001C3C0108DC3B010838B5104C04F10C055E -:10AA280054F8043FBBB19A6972B94FF0FF329A618A -:10AA3800236810221A7323681A6962B9FF221A61FF -:10AA4800206800F067FC06E09A6901321EBF9A6927 -:10AA580002F1FF329A61AC42E2D138BD3C020020DB -:10AA680038B5C378012B044602D0022B0AD04FE038 -:10AA780002782A4B53F8222093889BB243F48063D0 -:10AA8800938049E0254A037852F82300838823F409 -:10AA980000731B041B0C8380237852F823008388DF -:10AAA8009BB243F400638380237B062B154601D0B9 -:10AAB800012910D162692078616800F025FD2378AA -:10AAC80055F82320938823F480531B041B0C938090 -:10AAD8002278134B15E0237B0A2B01D002291BD1C6 -:10AAE8002078A168626900F035FDA3783BB9237826 -:10AAF80055F8232093889BB243F48053938022789F -:10AB0800084B53F82220136843F00103136003E055 -:10AB180010230373012038BD002038BD6C020020CB -:10AB2800780200209C02002038B5037B9907044670 -:10AB38004CD4037B032B49D0037B052B46D0037BE6 -:10AB4800002B43D0037B102B40D0022303734369AF -:10AB58001F4D13F0807F03781AD10622826155F8C1 -:10AB680023100A8B920705D5A269012A02D0A2698F -:10AB78000132F6D1A269012A02D0A269013204D1B8 -:10AB88002046BDE83840FFF79BBC4FF0FF32A2617A -:10AB9800A2788AB955F8232013889BB243F48073AE -:10ABA80013806369DB0303D520460121FFF758FFB3 -:10ABB800032323731F23A361237855F82320938845 -:10ABC8009BB243F400739380002038BD012038BD48 -:10ABD8006C02002038B5037B9D07044600F11781FD -:10ABE800037B032B00F01381037B052B00F00F81FF -:10ABF800037B002B00F00B81037B102B00F00781F7 -:10AC0800022303734369834D13F0807F18D1062212 -:10AC18008261027855F822100A8B900705D5A2693F -:10AC2800012A02D0A2690132F6D1A269012A00F0F4 -:10AC3800C780A269013200F0C3804FF0FF32A261E1 -:10AC4800E278022A07D1A2685268012A02BF43F4B7 -:10AC580000136361E2706369D90300F1BA80A378D5 -:10AC6800002B40F0B680237855F8232013889BB238 -:10AC780043F4807313801F23A361237855F82310AE -:10AC88008A8AD20703D5A269012A07D198E0A26966 -:10AC9800012AF8D0A2690132F2D1F4E7A26901329F -:10ACA80000F08E804FF0FF32A261E2699289B2F51E -:10ACB800804F1DD155F82320A3689B6803F0FE033D -:10ACC80013820423A361237855F82320938A9B07D2 -:10ACD80005D4A369012B02D0A3690133F6D1A36976 -:10ACE800012B6DD0A36901336AD04FF0FF33A36104 -:10ACF800237855F82320918A128B0322A26155F8F4 -:10AD080023108A8A100605D4A269012A02D0A269F2 -:10AD18000132F6D1A269012A52D0A26901324FD07C -:10AD28004FF0FF32A261626955F8233012F4003FF8 -:10AD3800A26810D1127B1A820323A361237855F8E5 -:10AD48002320938A190635D4A369012B32D0A3692D -:10AD58000133F6D12EE0527B1A820323A3612378B4 -:10AD680055F823108A8A120603D5A269012A07D149 -:10AD780026E0A269012AF8D0A2690132F2D1F4E7EB -:10AD8800A26901321CD04FF0FF32A261A26855F8C7 -:10AD98002330127B1A820323A361A361237855F819 -:10ADA8002320938A1B0605D4A369012B02D0A3692B -:10ADB8000133F6D1A369012B02D0A369013304D171 -:10ADC8002046BDE83840FFF77BBB4FF0FF33A36157 -:10ADD80005E0E178022902D12046FFF741FE05236C -:10ADE8002373A3784BB9237855F8232013889BB293 -:10ADF80043F4807313801F23A361237855F823201D -:10AE080093889BB243F400739380002038BD0120DF -:10AE180038BD00BF6C02002070B58B4A01788AB03B -:10AE28000023ADF8023052F821300446988A00F029 -:10AE3800DF00ADF80200A078154610BBBDF802008F -:10AE4800C60720D54FF0FF33A361E3699B89B3F5AB -:10AE5800804F16D1237B52F82120052B0BBFA36806 -:10AE680063689B689B6805BF43F00103DBB203F08E -:10AE7800FE03138216BF13820A23062323730423B7 -:10AE8800A361002642E2BDF8022002F0020292B25B -:10AE9800002A00F0BB80E278022A0BD1237B062B24 -:10AEA80001D1636803E0237B0A2B03D1A3685B68A5 -:10AEB800013301E04FF0FF33A361237B0A2B12D14A -:10AEC800012A10D1A3685E686EB955F821100B8865 -:10AED8009BB243F400730B80237855F82330998A8A -:10AEE8001B8B227312E2237B0A2B05D1012A03D183 -:10AEF80020460221FFF7B4FD237B0A2B237816D1C5 -:10AF0800A2685268012A12D155F82320138823F425 -:10AF180080631B041B0C1380237855F82320938A25 -:10AF2800138B13889BB243F4007313801EE0E278FE -:10AF3800012A17D1227B0A2A14D1A2685268022A50 -:10AF480010D155F82320138823F480631B041B0CAD -:10AF58001380237855F8232013889BB243F40063A9 -:10AF68001380237855F823309A8A1B8B636913F46E -:10AF7800803686D1227B062A43D1227813F4003FFB -:10AF880055F82220636812D11B7B138242F210739A -:10AF98000193237855F823108B8A180601D5019B55 -:10AFA8002CE0019B5A1E0192002BF5D1F7E75B7B41 -:10AFB800138242F210730293237855F823309A8A49 -:10AFC80012060DD5029A002A00F088816268127B69 -:10AFD8001A8242F210730393237855F8231009E07C -:10AFE800029A511E0291002AE9D1EBE7039B5A1EEF -:10AFF800039213B18B8A1806F8D5039B002B00F037 -:10B008006D8120460321FFF72BFD7FE1BDF802107B -:10B01800090662D5217B06295FD1E17801297FF4F1 -:10B0280030AF61684E688EB1096809781982616825 -:10B038004B68013B4B606368596800293FF421AFB6 -:10B048001968013119601CE76C020020626912025C -:10B058005FBF1A8892B242F400721A8023789E4A1F -:10B0680055F823108B8823F400731B041B0C8B806A -:10B07800237855F823108B8823F480631B041B0C5A -:10B088008B80636913F4000F46F2A81123780ED160 -:10B09800049152F823108B8A03F084030BB9049BA4 -:10B0A8000CE0049B5A1E0492002BF4D1F7E705919B -:10B0B80052F823108B8A180609D4059B002B00F040 -:10B0C8000D8101232373204602F07EFC1EE1059BBF -:10B0D8005A1E0592002BEDD1EFE7BDF8022052066B -:10B0E8007FF5CFAE227B0A2A7FF4CBAEE278012A25 -:10B0F8007FF4C7AEA2685168032900F2AC8051689A -:10B10800012906D112681B8A1370A2685368013B93 -:10B118005360A3685B68022B3BD1237855F8232042 -:10B12800938823F480631B041B0C938044F62063EC -:10B138000693237855F82320938A5B0723D5069B2B -:10B14800002B00F0CB8013889BB243F4007313806C -:10B158002278A36855F822201B68128A1A70A26800 -:10B16800136801331360A2685368013B5360227867 -:10B17800A36855F822201B68128A1A70A2685368BF -:10B18800013B536005E0069B591E0691002BD3D165 -:10B19800D5E7A3685B68032B68D1237855F823208B -:10B1A800938823F480631B041B0C938044F620636C -:10B1B8000793237855F82320938A5E071FD5079BAA -:10B1C800002B00F08B80138823F480631B041B0C76 -:10B1D80013802278A36855F822201B68128A1A70F7 -:10B1E800A268136801331360A2685368013B536077 -:10B1F80044F620630893237855F8232009E0079B39 -:10B20800591E0791002BD7D1D9E7089B591E0891E1 -:10B2180013B1938A5807F8D5089B002B5ED0138882 -:10B228009BB243F4007313802278A36855F8222058 -:10B238001B68128A1A70A268136801331360A26827 -:10B248005368013B53602278A36855F822201B6895 -:10B25800128A1A7006E012681B8A1370A2681368B3 -:10B2680001331360A2685368013B5360A3685E68AA -:10B27800002E7FF406AE237855F82320938823F414 -:10B2880000731B041B0C9380237855F823209388A4 -:10B2980023F480631B041B0C9380227855F822301A -:10B2A800998A1B8A6369990241BF23F40013636179 -:10B2B8000223E37055F8222046F2A8130993138B52 -:10B2C8009B0702D4099B73B908E0099B591E099191 -:10B2D800002BF4D1F6E700BF6C0200202046FFF7F0 -:10B2E800EFF8064612E013889BB243F4806313809C -:10B2F800237855F82320138823F400631B041B0CC0 -:10B30800138001232373204602F074FB30460AB0F1 -:10B3180070BD00BF00207047084B10B553F820409F -:10B3280001212046FBF774FC20460021FBF770FC46 -:10B3380020460121BDE81040FBF752BC403C010803 -:10B34800084B10B553F8204001212046FBF760FC5C -:10B3580020460021FBF75CFC20460021BDE8104098 -:10B36800FBF73EBC403C0108264B2DE9F743044659 -:10B3780053F82000244B254F53F82430244E18430B -:10B388000121FBF715FC234B57F8240013F8245030 -:10B39800214B2A4633F81410FBF749FB1F4B56F88C -:10B3A800240033F814102A46FBF741FB02238DF8DA -:10B3B80005308DF8043001238DF8063000238DF810 -:10B3C8000730174B57F8240033F8149002AD45F8AE -:10B3D800089D2946FBF7E2FA124B56F8240033F889 -:10B3E8001480CDF800802946FBF7D8FA57F82400D6 -:10B3F80056F824104A46434602F080FA03B0BDE8E6 -:10B40800F08300BFF83B0108343C010834020020F7 -:10B4180084020020AC3B01086A3B0108EC3B0108B0 -:10B42800A63B0108883B010837B502238DF8053093 -:10B4380000238DF804300C4B02AC33F8103044F87C -:10B44800083D0A4B0546214653F82000FBF7A6FAAB -:10B45800074B33F815300093064B214653F8250067 -:10B46800FBF79CFA03B030BDA63B0108340200206C -:10B47800883B0108840200201D4B70B505460E4626 -:10B4880053F820000121FBF793FB1A4B1A4953F894 -:10B4980025300B6000238B600B614B61CB610B6225 -:10B4A8004B62CB620B634B638B63144B4FF480622C -:10B4B8008A6153F825304B604FF4403216F0010F83 -:10B4C8008A620C4606D04023CB600D4B53F825000A -:10B4D800FBF76EF9B30709D50023E360094B06496A -:10B4E80053F82500BDE87040FBF762B970BD00BF96 -:10B4F800103C0108283C010804630020043C0108B2 -:10B50800780200209C02002010B50E4C0E4B54F817 -:10B5180020401C600C689C604968196112F48042E4 -:10B528000A4918BF4FF4807251F820105A6240221D -:10B538005960DA60064B044953F82000BDE8104012 -:10B54800FBF736B9283C010804630020043C0108D5 -:10B558007802002010B50E4C0E4B54F820401C60A9 -:10B568000C689C604968196112F400420A4918BFC6 -:10B578004FF4807251F820105A6200225960DA6044 -:10B58800064B044953F82000BDE81040FBF710B9FA -:10B59800283C010804630020043C01089C020020A8 -:10B5A800CA0738B504460D4604D5074B53F82000A2 -:10B5B800FBF778F8AB0706D5044B53F82400BDE831 -:10B5C8003840FBF76FB838BD780200209C02002095 -:10B5D800F7B504460D4616461F46FEF76DFF0123D4 -:10B5E8008DF807303B4B1B5D8DF804303A4B1B5DE3 -:10B5F8008DF80530394B01A81B5D8DF80630FBF737 -:10B608001FFE6B0216D4364B1B5D8DF80430354B8C -:10B618001B5D8DF80530344B01A81B5D8DF8063095 -:10B62800FBF70EFE314B53F8242093889BB243F46A -:10B6380080739380022F4BD1F70723D52C4B1B5DCA -:10B648008DF804302B4B1B5D8DF805302A4B01A873 -:10B658001B5D8DF80630FBF7F3FD284B53F82410DB -:10B668000A6842F010020A6053F824100A6842F08F -:10B678000402A8050A6041BF53F82420136843F068 -:10B6880008031360B10723D51D4B1B5D8DF80430EB -:10B698001C4B1B5D8DF805301B4B01A81B5D8DF8FD -:10B6A8000630FBF7CDFD194B53F824100A6842F019 -:10B6B80010020A6053F824100A6842F004020A6073 -:10B6C800EA0441BF53F82420136843F008031360C9 -:10B6D80003B0F0BD9C3B0108E83B0108733B01083F -:10B6E800843B01089F3B0108F23B01086C020020E3 -:10B6F800D43B0108D73B0108703B010878020020C1 -:10B70800B83B0108A23B0108F53B01089C02002058 -:10B718000148FFF781BB00BFF401002008B50248CB -:10B72800FEF77EFF002008BDF40100200148FEF767 -:10B73800FFBF00BFF40100200148FFF7B9B800BF00 -:10B74800F40100200148FFF767BB00BF1402002086 -:10B7580008B50248FEF764FF002008BD1402002067 -:10B768000148FEF7E5BF00BF140200200148FFF7BB -:10B778009FB800BF140200200148FFF74DBB00BF6F -:10B788004C02002008B50248FEF74AFF002008BD19 -:10B798004C0200200148FEF7CBBF00BF4C0200203E -:10B7A8000148FFF785B800BF4C02002037B50023D9 -:10B7B800114C01930546032003F0A4F82A68013CC4 -:10B7C8001369019314D0019B002BF4DA019B43F019 -:10B7D80001030193019B13612968074B0A690192D0 -:10B7E800013B02D0019AD207F8D4032003F08AF86B -:10B7F800002003B030BD00BF410D030010B5C47870 -:10B808006CB900EB82000333D0F8D0009B102246BD -:10B818009A4204D051F8224004600132F8E700202F -:10B8280010BD10B50332D0F8D030921000209042ED -:10B8380004D01C6841F820400130F8E701EB800093 -:10B8480010BD00000122F0B50023827001294FF0DD -:10B858004002C37082800CD1082303700423437014 -:10B868004FF4A073C38002230372C1724FF0A04348 -:10B8780009E041B90C230370062343704FF4A06319 -:10B88800C380224BC17203F5006245780261C36030 -:10B8980001461A460024AC4202F1200601F10401D7 -:10B8A80008D202F5106702F530620A654F6101346B -:10B8B8003246F0E703F580624261044603F5886288 -:10B8C800C0F8CC2014F88C2B03EB421503F5A061CB -:10B8D80005F5A065A94203D044F8041F2031F9E713 -:10B8E80003EB023203F5805100F1CC0402F58052DB -:10B8F800914204D044F8041F01F58051F8E703F59C -:10B908006063C0F80C310020F0BD00BF00000440A7 -:10B9180038B5037A012B05464FF0000450F80C2F78 -:10B928001FD1936B697A64F3104309B143F4801310 -:10B938009363EA68D3686FF386136FF396536FF3D4 -:10B9480051436FF3D343D360FFF730FFEB78012BFC -:10B9580019D1052363F34404EB6844F020049C6088 -:10B9680011E0D36843F04003D360FFF71FFF6B7A01 -:10B97800EA68002B0CBF4FF434134FF4741393632D -:10B98800142002F0C9FFEB78012B01BFEB689C681B -:10B99800052262F3440404BF44F020049C600020A4 -:10B9A80038BDC268936843F0010393600020704774 -:10B9B800C268936823F00103936000207047000079 -:10B9C80007B500230193019B43F020030193019BDA -:10B9D80001F01F0123F4F86343EA81110191C36860 -:10B9E800019A1A61C168074B0A690192013B02D0AA -:10B9F800019A9206F8D4032002F084FF002003B0D5 -:10BA08005DF804FB410D030007B500230193019B7A -:10BA180043F010030193C368019A1A61C168074B88 -:10BA28000A690192013B02D0019AD206F8D4032098 -:10BA380002F068FF002003B05DF804FB410D03002D -:10BA480008B5C268D36801296FF35D736FF39E73FD -:10BA580002D143F0005302E009B943F08043D360B8 -:10BA6800322002F059FF002008BDC368586900F071 -:10BA7800010080F001007047C3685A699869104056 -:10BA880070470269136861F301031360704700008F -:10BA980010B5C26800239361C1686FF080424A61A3 -:10BAA800C1684FF0FF344C60C1684A61C2680949F7 -:10BAB8009161C278C1689A4208BF102343F4701399 -:10BAC8008A6943F4605343F0080313438B610020F1 -:10BAD80010BD00BF0008008038B500231D46D0F80F -:10BAE8000C311D600269136865F3CC231360C37AB7 -:10BAF800012B044625D10321FFF7C3FFE368802209 -:10BB08005A62E1684FF4001362F30F038B62A023BB -:10BB180063F30F05E36862F31F45C3F804514FF45C -:10BB2800907363F30F05E368C0F22005C3F808516A -:10BB38004FF4A07363F30F05E3686FF31F45C3F871 -:10BB48000C5110212046FFF73BFF2046FFF75CFF12 -:10BB58002269002313612269536122694FF0FF3182 -:10BB680091612269D36104F1180261788B4210D285 -:10BB7800106801680029ACBF00214FF090410160B6 -:10BB880011680020086152F8041BFF208860013307 -:10BB9800EBE704F15403002261788A4210D2186856 -:10BBA80001680029ACBF00214FF09041016019687D -:10BBB8000020086153F8041BFF2088600132EBE77E -:10BBC8002269136943F480731361E378012B01BF81 -:10BBD800054B402262F359432269204608BF13638C -:10BBE800FFF756FF002038BD0301010003699B6879 -:10BBF800C3F34103022B05D0032B01D0012B03D142 -:10BC0800022070470120704703207047036981694B -:10BC18009A680B68C2F34102022A06BF032262F344 -:10BC28000A036FF30A030B600269536843F48073D5 -:10BC38005360002070474A780B7830B5012A15BF49 -:10BC480000EB830200EB8305556DAD691CBF012233 -:10BC580002FA03F34FF000040CBF9A4063F31F4449 -:10BC68002B6808BF62F30F041A040DD48A6862F3C4 -:10BC78000A03CA7862F39343CA8862F3995343F07C -:10BC8800805343F400432B600269D3692343D36193 -:10BC9800002030BD30B54A780B78012A15BF00EB7B -:10BCA800830200EB8301516D89694FF000052C4632 -:10BCB8006FF3CF3508BF9A400D601ABF012202FA10 -:10BCC80003F362F30F04026918BF63F31F44D369D7 -:10BCD80023EA0403D361002030BD70B54E780B46CB -:10BCE80009785A69012E00EB810146D18D692968CE -:10BCF8002C6962F3120412B966F3DC440BE09E6807 -:10BD08003244013AB2FBF6F262F3DC44DA78012AF3 -:10BD180008BF62F35E742C61C278012A1A7805D1D3 -:10BD280000EB82021C69926954610BE0DC78012CFB -:10BD380008D05C6934B106690125746B05FA02F212 -:10BD480022437263DA78012A07D102699268D20520 -:10BD580054BF41F0005141F080511A7800EB820243 -:10BD680041F0044192691160DA78012A37D1D96823 -:10BD78001A789B8AFFF742FD31E04E6D9D68316865 -:10BD880034692AB965F31204012262F3DC440AE03B -:10BD98002A44013AB2FBF5F262F3DC44C2F3090229 -:10BDA8006A4362F312043461C278012A01BF1A7827 -:10BDB8001C6900EB8202526D08BF5461DA78012ACF -:10BDC80006D15A7912B141F0005101E041F0805199 -:10BDD8001B7800EB830041F00441436D196000209B -:10BDE80070BDF7B54F784D69012F3CD1866934682D -:10BDF80033690093DAB2C3F3074335B965F3060232 -:10BE08008DF8002067F3C4030EE08F68BD428CBF35 -:10BE180067F3060265F306028DF800204FF0010271 -:10BE280088BF4F6162F3C4038DF80230009B336111 -:10BE3800C378012B02BF0B780A6900EB830344F037 -:10BE4800044404BF9B695A613460C378002B34D121 -:10BE58004B69002B31D000690978426B01238B4074 -:10BE68001343436329E00E788F6800EB8606736DF1 -:10BE78001C681B690093DAB2C3F3074305B14F612D -:10BE880067F306028DF80020012262F3C4038DF8DF -:10BE98000230736D009A1A61C378012B02BF0B78C8 -:10BEA8000A6900EB830344F0044404BF5B6D5A61E4 -:10BEB8000B7800EB8300436D1C60002003B0F0BDDD -:10BEC8004B78012B0B7800EB830006D1826913684D -:10BED800002B04DA43F0804301E0426D136843F419 -:10BEE80000131360002070474B78012B0B78C9783A -:10BEF80000EB8300A1F102010CBF8269426D136857 -:10BF080001296FF3555398BF43F080531360002005 -:10BF1800704702699369D0691840000C704700EBBC -:10BF2800810102694B6D9B6850691840704703692D -:10BF38009869DB69184080B2704782B0002300938B -:10BF4800C0238DF8033001224FF0000362F3C403CD -:10BF58008DF8023018238DF80030436D009A1A616D -:10BF6800C378012B08D1436D00F2CC525A61436D5E -:10BF78001A684FF080221A6002B070472DE9F04F1E -:10BF880085B00446FFF771FD08B9002026E2204677 -:10BF9800FFF772FD06460028F7D0C0F3074909F0FD -:10BFA800080303F0FF00002B55D02046FFF7B1FF30 -:10BFB80004F154078046A3464FF0000AB8F1000F79 -:10BFC80048D018F0010F3DD05FFA8AF2114620469A -:10BFD8000192FFF7A4FF10F0010F0546019A22D045 -:10BFE8003B6801259D60E378AB4201BF3B681B6954 -:10BFF800C3F31201DBF87C3304BF5B1ACBF88C3334 -:10C00800A74B1B6820461B6811469847E378012B0D -:10C0180009D1BAF1000F06D194F81131052B02D1DC -:10C028002046FFF78AFFAB0742BF3B6802259D60A9 -:10C038002D0707D59A4B1B6820469B6898473B6895 -:10C0480008259D600AF1010A4FEA580804370BF1E8 -:10C05800280BB3E7012019F0040F00F0A180204657 -:10C06800FFF765FF04F11808824627464FF00009DC -:10C07800BAF1000F00F093801AF0010F00F08780EA -:10C0880022695FFA89FB1569536B04EB8B0123FA6C -:10C098000BF38969DB018968DBB22B4303EA0105ED -:10C0A800E8071CD5536B012505FA09F123EA0103BA -:10C0B8005363D8F800309D60794B1B6820465B6855 -:10C0C80059469847E378AB4209D1B9F1000F06D138 -:10C0D80094F81131042B02D12046FFF72EFF2907CF -:10C0E80042BFD8F8003008259D60EA0642BFD8F85C -:10C0F800003010259D606B0642BFD8F800304025FF -:10C108009D60A80742BFD8F8003002259D60290627 -:10C118003DD5D7F83031D7F834515D1BD7F82431E5 -:10C12800AB4228BF2B46DD1CAD08D8F800309B6910 -:10C138009BB2AB4227D9D7F83421D7F830319A428D -:10C1480021D203B3C2EB030CD7F82431D7F8281156 -:10C158009C4528BF9C461FFA8CF320465A460CF192 -:10C168000305CDF804C0FFF749FBD7F82831DDF8FF -:10C1780004C06344C7F82831D7F834316344AD08A4 -:10C18800C7F83431D1E7D8F8003080259D6009F12F -:10C1980001094FEA5A0A08F10408283768E701201C -:10C1A800F5B2AA0742BFE36802225A61002E19DAE3 -:10C1B800A37A43B1D4F80C31D4F80C216FF34103BE -:10C1C8006FF3000313602269536823F0010353607F -:10C1D800334B1B6820469B699847E3684FF0004241 -:10C1E8005A610120C6F307273B072FD500238DF896 -:10C1F8000F3094F812318DF80F30294B1B68204608 -:10C208005B6998472369E2689B684FF40061516154 -:10C21800A27AD2B1D90718D594F81531012B14D1C7 -:10C228009DF80F30032B10D1D4F80C21136843F07C -:10C2380001031360D4F80C21136843F0030313605F -:10C24800184A136943F00603136101202A0708D529 -:10C25800134B1B682046DB689847E36808225A613D -:10C268000120EB0640D5E268936923F0100393613F -:10C27800E368D3F82080C8F34343022B08F00F0586 -:10C2880012D0062B2AD1204604F2CC510822FFF7FF -:10C29800C8FA282303FB0545C8F30A1819E000BFAC -:10C2A800A802002000ED00E047F6F07308EA030357 -:10C2B800A3B1282303FB0545C8F30A182046D5F87F -:10C2C80080134246FFF7ADFAD5F880334344C5F8EA -:10C2D8008033D5F88C334344C5F88C33E2689369CE -:10C2E80043F0100393610120FD063BD52269536892 -:10C2F8004FF0000823F00103536020464146FFF742 -:10C308005FFB04F11402434661788B4207D252F86E -:10C31800040FFF218160D06B01338160F4E723694A -:10C328004FF0FF329A610125236965F30F0865F321 -:10C338001F48C3F81C8022690B23536122691361CB -:10C34800226913686FF30A1313602046FFF7F5FD9F -:10C35800E3684FF480525A61224B1B6820461B69E0 -:10C3680098472846B9061FD52046FFF74FFCE368D3 -:10C378002046DD68FFF73AFC03280BBF00230123A2 -:10C38800A370A3700BBF4FF400734023A380A38056 -:10C398000CBF0923052363F38D25E368DD60E3689B -:10C3A8004FF400525A610120C6F30746F20609D538 -:10C3B8000C4B1B682046DB699847E3684FF48012F2 -:10C3C8005A610120B30609D5064B1B6820461B6A33 -:10C3D8009847E3684FF400125A61012005B0BDE8A0 -:10C3E800F08F00BFA80200200148FFF7C7BD00BFBB -:10C3F8007864002038B50446FFF724FA01230022A8 -:10C40800607884F8123184F8142104F21D138242F2 -:10C4180003F1280312D2012103F8281C402500212A -:10C4280003F8292C23F8232C03F8261C43F8215C55 -:10C4380043F81D1C43F8151C0132E8E704F2753374 -:10C448000022824203F1280311D20021402503F87B -:10C45800292C23F8232C03F8281C03F8261C43F85E -:10C46800215C43F81D1C43F8151C0132E9E72046FE -:10C47800FFF79EFA2046FFF74BFA20460021FFF708 -:10C48800DFFA2046FFF728FB2046BDE83840FFF7D3 -:10C4980088BA70B5CDB215F0800F01F07F044FF067 -:10C4A800280615BF06FB040106FB010101F58E7184 -:10C4B80001F55D71E4B2ED090C704D708A60CB70C6 -:10C4C80005B1CC80022B04BF00230B71FFF7B3FB2F -:10C4D800002070BDCBB213F0800F10B54FF02802CA -:10C4E80001F07F0415BF02FB040102FB010101F505 -:10C4F8008E7101F55D71DB090C704B70FFF7CAFB9B -:10C50800002010BDF8B501F07F05282606FB05F4CC -:10C518000119044404F56077C4F88833002384F8CB -:10C528007453C4F88023C4F88C3384F87533C37803 -:10C5380006FB0505012B08BF7A6095F8743301F5F1 -:10C548005D7113B9FFF74DFC01E0FFF7C6FB002052 -:10C55800F8BDF8B501F07F0528246C43011904449F -:10C5680004F59476C4F82821C4F82C210127002268 -:10C5780084F81D7184F81C51C4F8342101F58E71BA -:10C58800B36015B9FFF72DFC01E0FFF7A6FB00200B -:10C59800F8BDCBB213F0800F10B54FF0280201F0B0 -:10C5A8007F0415BF02FB040102FB010101F58E7136 -:10C5B80001F55D710122DB098A700C704B70FFF781 -:10C5C8007FFC002010BD38B5CBB213F0800F01F00E -:10C5D8007F054FF0280215BF02FB050102FB010190 -:10C5E80001F58E7101F55D710024DB098C700D7009 -:10C5F8004B70FFF779FC204638BD10B5026900245E -:10C60800136861F30A142343136010BD38B5044658 -:10C618000D46C4F83C21C4F838211346022280F89C -:10C62800112100212A46FFF794FF002038BD10B5DC -:10C638000C46134600212246FFF78BFF002010BD51 -:10C6480010B50C46134600212246FFF75BFF002079 -:10C6580010BD10B50021042304460A4680F81131A4 -:10C668000B46FFF776FF2046FFF767FC002010BD5A -:10C6780010B50021052304460A4680F811310B46FF -:10C68800FFF740FF2046FFF758FC002010BD90F848 -:10C69800CC350B7090F8CD354B7090F8CF2590F8CD -:10C6A800CE3503EB02234B8090F8D12590F8D03596 -:10C6B80003EB02238B8090F8D32590F8D23503EB57 -:10C6C80002239BB2CB80C0F84031012380F811319E -:10C6D800704710B580210446FFF75BFF2046002114 -:10C6E800FFF757FF2046BDE81040FFF726BC0000C3 -:10C6F80073B54B7804460D46092B00F21681DFE826 -:10C7080013F0C70002011401DA0014016E000A00D8 -:10C718001401B9008D004B881A0A013A062A00F262 -:10C728000481DFE812F007001A0027000201020165 -:10C7380002010201D0F8EC3580781B680DF1060182 -:10C748009847EB88402B014603D094F81231012B0F -:10C7580035D10823ADF8063031E0D0F8E4358078DB -:10C768009B6A0DF106019847022343700146C4F8FD -:10C77800F00524E0DBB2052B00F2D780DFE803F0F8 -:10C7880003070B0F1317D0F8EC355B6812E0D0F8ED -:10C79800EC359B680EE0D0F8EC35DB680AE0D0F8A1 -:10C7A800EC351B6906E0D0F8EC355B6902E0D0F89F -:10C7B800EC359B69A0780DF1060198470146BDF854 -:10C7C8000630002B00F0B580EA88002A00F0B1801E -:10C7D8009A4228BF1A46ADF80620204668E08B88A2 -:10C7E800002B40F0A280CB88002B40F09E8090F870 -:10C7F80012318E78032B06F07F0600F0968080F8C1 -:10C8080014613146FFF7F9FE2046FFF722FF0EB10B -:10C81800022300E0012384F812318AE08978464E29 -:10C828000129317000F2818090F81231022B02D078 -:10C83800032B09D079E0002961D00121032380F876 -:10C84800101180F8123111E039B9022380F8123141 -:10C8580080F8101100F037FA51E090F81011012912 -:10C868004DD000F030FA317884F81011204600F0ED -:10C878001EFA44E0CA88012A57D190F81231022BD7 -:10C8880004D0032B51D100F5887111E02B490FE03A -:10C8980090F81231023B012B47D8294B01221A602C -:10C8A800D0F818210AB103221A602549204602222D -:10C8B800FFF7ACFE3DE04B88012B2DD0022B38D181 -:10C8C8008B8813F0FF0F34D102691B0A013B5268B1 -:10C8D800042B0FD8DFE803F0030507090B00012339 -:10C8E80006E0022304E0032302E0042300E005231A -:10C8F80063F30612134B1A60012384F8163120469D -:10C90800FFF7A7FE15E090F81231023B012B0CD877 -:10C918004B88012B0DD10023C4F81831D4F8E43525 -:10C9280020469B6829469847E9E720462946FFF7AD -:10C93800D0FE002002B070BD6C5B0020745B00204C -:10C94800685B00204064002038B590F81231032B52 -:10C9580004460D460CD10B79012B09D8D0F8E435E3 -:10C968009B689847EB882BB92046FFF772FE01E0D9 -:10C97800FFF7AFFE002038BD70B54E788A88012ECB -:10C9880004460D46D3B210D027D3032E50D190F8C9 -:10C998001221022A28D0032A48D14A889AB95E0669 -:10C9A80011D01946FFF7F5FD0DE090F81221022A83 -:10C9B8001AD0032A3AD14A88002A39D1590608D010 -:10C9C8001946FFF700FED4F8E43520469B6829464F -:10C9D80098472046FFF73DFE2AE090F81251022DB5 -:10C9E80002D0032D06D021E05A0621D01946FFF7C0 -:10C9F800D0FD1DE012F0800F4FF028000D4910D037 -:10CA080003F07F0200FB024393F81E310BB10123B0 -:10CA180000E000230B60204606490222FFF7F6FDDE -:10CA280006E000FB034393F87633EFE7FFF751FE88 -:10CA3800002070BD705B002030B5C8B10446231AD1 -:10CA480014F8015BDBB2002DF9D15B0002331380CF -:10CA58000B7003234B700138022310F8014F3CB1CF -:10CA68005A1CD2B2CC5402330024DBB28C54F4E703 -:10CA780030BD10B5D0F8E83504461B699847032344 -:10CA880084F81231002010BD08B590F8123180F8F2 -:10CA98001331042380F81231D0F8E835DB68984761 -:10CAA800002008BD08B5D0F8E435DB6903B1984724 -:10CAB800002008BD08B5D0F8E4351B6A9847002067 -:10CAC80008BD08B5D0F8E4355B6A9847002008BD72 -:10CAD800002110B50B4604464022FFF7DAFC8021FE -:10CAE800402220460023FFF7D4FC012384F81231AA -:10CAF800D4F8E835A0785B689847002010BD13B5D6 -:10CB080069460446FFF7C3FD9DF8001001F01F03B6 -:10CB1800012B0CD006D3022B0ED120466946FFF715 -:10CB28002BFF0EE020466946FFF7E2FD09E02046AC -:10CB38006946FFF709FF04E0204601F08001FFF78E -:10CB480028FD002002B010BD38B50446002949D19F -:10CB580090F81131022B39D1D0F83821D0F824318E -:10CB68009A4213D9C178012908BFD0F82811A2EB3D -:10CB7800030208BF5B18C0F8382108BFC0F8283185 -:10CB8800D4F8281192B2FFF752FD1FE0D0F83C21EB -:10CB9800B2FBF3F503FB15255DB99A4209D3D0F82A -:10CBA80040319A4205D22A46FFF741FDC4F8405168 -:10CBB8000CE0D4F8E435DB682BB194F81221032A91 -:10CBC80001D1204698472046FFF752FD94F81631C8 -:10CBD800012B10D1094A236912685A60002384F88E -:10CBE800163108E0D0F8E4355B6923B190F81221DA -:10CBF800032A00D19847002038BD00BF40640020B8 -:10CC080010B5044661BB90F81131032B31D1D0F82F -:10CC18009023D0F87C339A4215D9C178012908BFEE -:10CC2800D0F88013A2EB030204BFC918C0F8801320 -:10CC38009A42C0F8902328BF1A46D0F8801392B2BF -:10CC4800FFF7FEFC15E0D0F8E4351B6923B190F836 -:10CC58001221032A00D198472046FFF7FAFC08E082 -:10CC6800D0F8E4359B6923B190F81221032A00D14A -:10CC78009847002010BD2DE9F04104461646984615 -:10CC88000D46069F01F0E0FD20462946C4F8E485DC -:10CC9800C4F8E875C4F8EC65FFF7ACFBD4F8E835E0 -:10CCA8001B6898472046BDE8F04101F015BE10B555 -:10CCB800D0F8E43504461B689847D4F8E8359B68F3 -:10CCC8009847002010BD08B5D0F8E4355B68984750 -:10CCD800002008BD08B5FAF71FFB002008BD0000BA -:10CCE8000A4A52F820200346012A0948094A50F8FE -:10CCF800230008BF81F0010119B132F82310F9F7B8 -:10CD080092BE32F82310F9F790BE00BF4C3C0108E0 -:10CD1800743C0108603C0108052801D8FFF7E0BF12 -:10CD280070470000F7B5124B1C781D46ECB90C2073 -:10CD38000121F9F73DFF0F4B53F8243000930E4BB8 -:10CD4800012653F824008DF80460002769468DF801 -:10CD580006708DF80560F9F721FEE0B239463444D3 -:10CD6800FFF7DAFF052CE6D12E7003B0F0BD00BF47 -:10CD7800785B0020603C0108743C010810B5002471 -:10CD8800E0B200210134FFF7C7FF052CF8D110BD30 -:10CD9800012008B50146FFF7A3FF03200121FFF793 -:10CDA8009FFF02200021FFF79BFF00210420FFF7CF -:10CDB80097FFFA20F8F76AFC01200021FFF790FF9F -:10CDC80003200021FFF78CFF02200121FFF788FFD5 -:10CDD80001210420FFF784FFFA20F8F757FCFFF73A -:10CDE800CDFF00200121FFF77BFF014B187808BD1C -:10CDF800785B0020054B1A7832B9054A1060054A5D -:10CE08006921117001221A70704700BF7A5B0020F7 -:10CE18007C5B0020795B002010B52DED028BB4EE11 -:10CE2800C01AF1EE10FA86B0F0EE608AB0EE418AD0 -:10CE3800044604D4B4EEE01AF1EE10FA18DD10EE50 -:10CE4800100AF7F701FBCDE9000118EE900AF7F791 -:10CE5800FBFACDE9020118EE100AF7F7F5FA2246B7 -:10CE6800CDE9040105480649FDF71CFA002000E059 -:10CE7800012006B0BDEC028B10BD00BF7D8000080C -:10CE8800883E01082DE9F04FA1B0002708AE3946C9 -:10CE98000C2230460DF12C090497ADF814700DF1F1 -:10CEA800380A06F0E8F839460C224846CB4DCC4CF7 -:10CEB80006F0E1F80DF1440839460C22504606F018 -:10CEC800DAF839460C22404606F0D5F82178286869 -:10CED800192202AB00F030FC217828681A220DF1E3 -:10CEE800090300F029FC217828681B220DF10A03A8 -:10CEF80000F022FC217828681D220DF10B0300F0B8 -:10CF08001BFC217828681C2203AB00F015FC217853 -:10CF1800286819223B4600F082FC217828681A22EA -:10CF2800022300F07CFC217828681B22012300F0F2 -:10CF380076FC217828681D22022300F070FC2868FE -:10CF480021781C22012300F06AFC4FF0C80B04AFC3 -:10CF5800217800973B220623286800F0C9FB9DF83A -:10CF680010209DF811302178009743EA02230B9A8C -:10CF7800286802FA83F30B939DF812209DF813306A -:10CF880043EA02230C9A02FA83F30C939DF81420C7 -:10CF98009DF8153043EA02230D9A02FA83F30D93A4 -:10CFA8004322062300F0A4FB9DF910209DF81130C0 -:10CFB80043EA0223089A134408939DF912209DF826 -:10CFC800133043EA0223099A134409939DF9142064 -:10CFD8009DF8153043EA02230A9ABBF1010B13446A -:10CFE8000A93B4D15B4659F823204FF0C80B92FB43 -:10CFF800FBF249F8232056F8232092FBFBF246F86F -:10D0080023200133032BEED1217828681C22E0234A -:10D0180000F005FC286821781B22E02300F0FFFBC4 -:10D028001920F8F733FB04AF217800973B22062339 -:10D03800286800F05DFB9DF810209DF811302178DC -:10D04800009743EA02230E9A286802FA83F30E93A4 -:10D058009DF812209DF8133043EA02230F9A02FA32 -:10D0680083F30F939DF814209DF8153043EA0223AB -:10D07800109A02FA83F310934322062300F038FB38 -:10D088009DF810209DF8113043EA0223119A02FA04 -:10D0980083F311939DF812209DF8133043EA02237D -:10D0A800129A02FA83F312939DF814209DF8153012 -:10D0B80043EA0223139ABBF1010B02FA83F3139399 -:10D0C800B1D15B465AF8231058F82320C82091FBA9 -:10D0D800F0F192FBF0F24AF8231048F823200133CC -:10D0E800032BEFD1217828681C22002300F097FB3E -:10D0F800217828681B22002300F091FB06AF192035 -:10D10800F8F7C4FA217828680D223B4600F014FB92 -:10D11800217828680E220DF1190300F00DFB217803 -:10D1280028680F220DF11A0300F006FB2178286801 -:10D1380000220DF11B0300F0FFFA21782868012274 -:10D1480007AB00F0F9FA0DF11D03286821780222D7 -:10D1580000F0F2FA0023FA5C1AA91AB1013A214840 -:10D1680030F8122041F823200133062BF3D1002395 -:10D1780020AAD71859F803005AF80320DFED1A7AC5 -:10D18800121AC858121A06EE902A07EE100AF8EE7C -:10D19800E66AB8EEC76A66EEA76ACA18C6EE866A75 -:10D1A800F05847ED0C6AD76820AA02EB030E58F82E -:10D1B8000320121AD21B07EE102AB8EEC77A0433DE -:10D1C80027EE277A07EE907AF8EEE77A0C2BC7EE6F -:10D1D800277A4EED097ACBD108E000BF7C5B0020AE -:10D1E800795B0020883C01080000C84221789DF83E -:10D1F80008302868192200F012FB21789DF80930C0 -:10D2080028681A2200F00BFB21789DF80A3028685C -:10D218001B2200F004FB21789DF80B3028681D22A2 -:10D2280000F0FDFA286821789DF80C301C2200F0E7 -:10D23800F6FABAEE0C0AF2EE0C0A9DED171A22481D -:10D24800FFF7EAFD08B900203BE0BAEE0C0AF2EE5F -:10D258000C0A9DED181A1D48FFF7DEFD0028F2D0D4 -:10D26800BAEE0C0AF2EE0C0A9DED191A1848FFF7EF -:10D27800D3FD0028E7D0BAEE0C0AF2EE0C0A9DEDB9 -:10D28800141A1448FFF7C8FD0028DCD0BAEE0C0ABF -:10D29800F2EE0C0A9DED151A0F48FFF7BDFD0028A8 -:10D2A800D1D0BAEE0C0AF2EE0C0A9DED161A0B4814 -:10D2B800FFF7B2FD0028C6D009480A49FCF7F2FF7B -:10D2C800012021B0BDE8F08FD03E0108D73E01080B -:10D2D800DE3E0108E53E0108EB3E0108F13E01088B -:10D2E8007D800008F73E0108034A03461068034A98 -:10D2F8001178192200F093BA7C5B0020795B00203A -:10D3080007B5074B1978019003230093054B1A22A0 -:10D318001868022300F0ABFA03B05DF804FB00BF05 -:10D32800795B00207C5B002007B5074B19780190DA -:10D3380002230093054B1B221868042300F097FA78 -:10D3480003B05DF804FB00BF795B00207C5B002024 -:10D3580007B5074B1978019002230093054B1C224F -:10D368001868042300F083FA03B05DF804FB00BFDB -:10D37800795B00207C5B002007B5064B1978064BCB -:10D38800009018683722012300F053FA03B05DF8C3 -:10D3980004FB00BF795B00207C5B0020034A034646 -:10D3A8001068034A1178382200F039BA7C5B0020F3 -:10D3B800795B00202DE9F3411D46184B184C0F46A8 -:10D3C8001978184B00948046164618683B220E239D -:10D3D80000F08EF92278637843EA0223A8F8003037 -:10D3E800A278E37843EA02233B802279637943EA0F -:10D3F80002233380227A637A43EA02232B80A27ABB -:10D40800E37A43EA0223089A1380227B637B43EA88 -:10D418000223099A138002B0BDE8F081795B0020ED -:10D42800805B00207C5B002007B5064B1978012340 -:10D438000093054B6B221868072300F0FAF903B034 -:10D448005DF804FB795B00207C5B002007B5064B88 -:10D458001978064B009018686B22062300F0E9F94A -:10D4680003B05DF804FB00BF795B00207C5B002003 -:10D4780007B5074B80F001001978064B0090186833 -:10D488006B22032300F0D5F903B05DF804FB00BF5D -:10D49800795B00207C5B002007B5074B1978019069 -:10D4A80003230093054B6B221868022300F0DFF971 -:10D4B80003B05DF804FB00BF795B00207C5B0020B3 -:10D4C80013B5074B074C1978074A019406230093B4 -:10D4D8001068752200F038F9207802B010BD00BF3E -:10D4E800795B0020805B00207C5B002008B5FFF79B -:10D4F800E7FFA0F138035842584108BD07B5084B6B -:10D5080002AA0021186842F8041D0B46F8F700FC2F -:10D51800019B0BB1F8F7CCFF03B05DF804FB00BF2B -:10D528004864002007B5084B02AA0021186842F891 -:10D53800041D0B46F8F7ECFB019B0BB1F8F7B8FF9D -:10D5480003B05DF804FB00BF5C64002007B5084B1E -:10D5580002AA0021186842F8041D0B46F8F7D8FB08 -:10D56800019B0BB1F8F7A4FF03B05DF804FB00BF03 -:10D5780044640020134B984210B5044601D1124B65 -:10D5880008E0124B984201D1114B03E0114B98422D -:10D5980006D1114B186800211E220B46F8F7FCFB38 -:10D5A800237B012B02D0237B102BF9D1207BC0B227 -:10D5B800012803D0207B103818BF012000F001009B -:10D5C80010BD00BFF40100204864002014020020B0 -:10D5D8005C6400204C02002044640020134B9842F5 -:10D5E80010B5044601D1124B08E0124B984201D104 -:10D5F800114B03E0114B984206D1114B18680021DA -:10D608001E220B46F8F7C8FB237B012B02D0237B95 -:10D61800102BF9D1207BC0B2012803D0207B103811 -:10D6280018BF012000F0010010BD00BFF401002068 -:10D6380048640020140200205C6400204C02002092 -:10D648004464002082B0FA230193019B13B1019B2B -:10D65800013BF9E702B0704770B50446FCF7BCFF20 -:10D668000223E370E3691C4A00250326A57066704F -:10D678001A60E36974221A81184BA360184B63601F -:10D688002046FCF727FF324601202946F8F76AFAB8 -:10D69800144A106020B129462A462B46F8F78AFA20 -:10D6A800032201200021F8F75DFA0F4A106020B12B -:10D6B80000210A460B46F8F77DFA032201200021D3 -:10D6C800F8F750FA094A106020B100210A460B46C3 -:10D6D800F8F770FA012070BD801A06006064002017 -:10D6E8004C640020486400205C64002044640020EE -:10D6F80038B5044680684360A36804981860A36836 -:10D7080049009960A368FF2ADA6014BF4FF080735C -:10D71800084B636101250023A37025732046FDF79C -:10D7280059FA20B92046BDE83840FFF723BF2846FC -:10D7380038BD00BF0000010107B500930123FFF7C2 -:10D74800D7FF03B05DF804FB37B51C460DF107039E -:10D758009DF81850FFF7F0FF58B10122631BAA404B -:10D768000133013A9DF807109A400A401A41079B75 -:10D778001A7003B030BD1FB51C460DF10F0300939E -:10D788000123FFF7B5FF9DF80F200123A3401340A5 -:10D79800069A137004B010BD38B585686B6083684D -:10D7A800049D1D608368490099608368DA604FF0C2 -:10D7B8008173436101250023837005730446FDF7D7 -:10D7C80009FA20B92046BDE83840FFF7D3BE2846FD -:10D7D80038BD38B5044640684360636804981860EB -:10D7E8006368490099606368FF2ADA6008BF636963 -:10D7F8004FF0000208BF43F480334FF0010514BF17 -:10D8080062616361A27025732046FDF78DF920B926 -:10D818002046BDE83840FFF7E1BE284638BD1FB5B1 -:10D8280004AC04F8013D01230094FFF7D2FF04B0D3 -:10D8380010BDF7B51F460DF107030D461446064601 -:10D84800FFF77AFF9DF820109DF807200123BB40C1 -:10D8580011B11343DBB201E022EA03033046294643 -:10D8680022468DF80730FFF7DAFF03B0F0BD2DE947 -:10D87800F3411F460DF1070306460D4614469DF871 -:10D888002080FFF759FFC8B10122C8EB070102FA4F -:10D8980008F29DF824300131013A8A408B409DF806 -:10D8A8000710DBB221EA02011A4041EA02033046BE -:10D8B800294622468DF80730FFF7B1FF02B0BDE8D0 -:10D8C800F08138B545686B604368049D1D60436806 -:10D8D800490099604368DA604FF08173436101251C -:10D8E8000023837005730446FDF71EF920B920460E -:10D8F800BDE83840FFF772BE284638BD2DE9F04133 -:10D9080004460E460846194615461F46F9F78BF891 -:10D9180030463946F9F781F8E0B920462946F9F743 -:10D9280082F84CF2513820462946F9F776F810B9B2 -:10D93800B8F10108F7D1FFF785FE20462946F9F727 -:10D9480074F8FFF77FFE20462946F9F76CF8FFF7D1 -:10D9580079FEDDE720462946F9F765F8FFF772FEFC -:10D9680030463946F9F761F8FFF76CFE304639461C -:10D97800F9F75BF8FFF766FE30463946F9F753F8D2 -:10D9880020462946F9F74FF84CF2513820462946E7 -:10D99800F9F743F810B9B8F10108F7D14CF251344E -:10D9A80030463946F9F739F808B9013CF8D1BDE8ED -:10D9B800F08100000A4602480249FCF773BC00BF28 -:10D9C8007D800008113F0108074B984201D1FFF7FD -:10D9D80095BD064B984201D1FFF7A4BD044B984270 -:10D9E80001D1FFF7B3BD7047F401002014020020F5 -:10D9F8004C020020074B984201D1FFF77FBD064B30 -:10DA0800984201D1FFF78EBD044B984201D1FFF730 -:10DA18009DBD7047F4010020140200204C02002034 -:10DA280010B500234A789A4012F0800F14BF4B2299 -:10DA38001D2220F813200133082BF3D100F10E0426 -:10DA480000230A789A4012F0800F03F1010314BFF3 -:10DA58004B221D22082B24F8022FF2D11E3000235E -:10DA68008A789A4012F0800F03F1010314BF4B2209 -:10DA78001D22082B20F8022FF2D110BD2DE9F0410C -:10DA88000220494E0121F9F793F8022001210024D0 -:10DA9800F9F7A6F8012520234FF00208314643483C -:10DAA8003360102786F80480B471F4717571F8F743 -:10DAB80075FF31463D48357186F807803760F8F7BD -:10DAC8006DFF424639480521F8F7B1FF3849394812 -:10DAD8000C8068234B600C814C808C72F9F75AF9E2 -:10DAE800354934484D8060230B808C608C81F9F770 -:10DAF800DDF930480821F9F7A3FA2E482946F9F745 -:10DB0800C3FA29464FF40010F9F752F82B48F8F7F2 -:10DB1800C9FD2B492B4B4B602B4B8B604FF40053AB -:10DB28000B624FF40063CB614023CB604FF48073EA -:10DB38004B624FF480338B624FF480664FF0206362 -:10DB48001E480B608E614C630C614C618C63CC6227 -:10DB58000C63F8F72DFE1D480B2343700770847083 -:10DB6800C570F9F76DFB154839462A46F8F75CFE8B -:10DB7800124808212A46F8F757FE0E4831462A4629 -:10DB8800F9F790FA032228462146F7F7EBFF104AE7 -:10DB9800106030B1214622462346BDE8F041F8F72F -:10DBA80009B8BDE8F08100BF005C00200004024015 -:10DBB800905B002000040040E05B00208860024089 -:10DBC8009C5B002038040040085C0020FC5B0020BF -:10DBD800DC5B002038B50C1E05462CDD164B0021F9 -:10DBE8004FF0FF3218680B46F8F7D6F8134B144875 -:10DBF8001C60144B29461D60FFF712FF124B134897 -:10DC0800012294421A601C4604D10021302205F0FA -:10DC180032FA02E0E91CFFF703FF0D4802232360F4 -:10DC2800302343600121F8F7EDFD0A480121BDE8E2 -:10DC38003840F9F7F6B838BDDC5B0020D85B002027 -:10DC4800085C0020F45B0020F85B0020385C0020B2 -:10DC58008860024000040040F7B5264D2C683CB9A6 -:10DC680025482146F9F7DDF824482146F8F7CAFD8A -:10DC780022482349F8F7F8FD18B120482049F8F759 -:10DC88001BFE1E481F49F8F7EFFD28B11B481D4928 -:10DC9800F8F712FE1C4800E01C481D4E2B6834683B -:10DCA8005F1CA7420FDB9C4204DB0021302205F0F9 -:10DCB800E2F906E0174B1B6804EB44011944FFF72F -:10DCC800AFFE0134346033689F4210DA124B0021F2 -:10DCD80001AA18680B46F8F71BF807480021F9F75E -:10DCE800A0F806480021F8F78DFD00232B6003B04B -:10DCF800F0BD00BFD85B00200004004088600240EF -:10DD08000044002000880020385C0020085C0020C7 -:10DD1800F85B0020F45B0020DC5B002010B5074CAA -:10DD280023784BB9064B1860064B5D2205201A7004 -:10DD3800F7F7ACFC01232370012010BD695C0020BB -:10DD48006C5C0020685C00201FB50C4B187888B10B -:10DD58000B4B19780DF10F0300930A4B0F2218682B -:10DD68000123FFF7C5FC28B19DF80F00A0F1BD0302 -:10DD78005842584105B05DF804FB00BF695C0020BB -:10DD8800685C00206C5C002010B52DED028BB4EEB1 -:10DD9800C01AF1EE10FA86B0F0EE608AB0EE418A51 -:10DDA800044604D4B4EEE01AF1EE10FA18DD10EED1 -:10DDB800100AF6F749FBCDE9000118EE900AF6F7CC -:10DDC80043FBCDE9020118EE100AF6F73DFB2246A7 -:10DDD800CDE9040105480649FCF764FA002000E093 -:10DDE800012006B0BDEC028B10BD00BF7D8000088D -:10DDF800303F01087FB5134A03461078F8B1124C3A -:10DE0800124E0DF10F058BB1C6238DF80F30317806 -:10DE18000095202201232068FFF7DBFC0F238DF8F3 -:10DE28000F30317800952068102205E0317820689D -:10DE38008DF80F30009520220123FFF7CAFC04B0AB -:10DE480070BD00BF695C00206C5C0020685C00202D -:10DE5800D0ED007AF5EEC07AF1EE10FA08B514DDCF -:10DE68009FED0B0ADFED0B0A80EE270A03F0E4FAB8 -:10DE7800F7EE007A30EE670ADFED077A20EE270A20 -:10DE8800DFED067A80EE270A08BD9FED050A08BD7A -:10DE9800CDEC7D4454D4423E33139543F4FDD43B3A -:10DEA80000000000F0B51E4B85B00E46197802AB95 -:10DEB80000931C4B044615461868A8220523FFF753 -:10DEC80017FC9DF809309DF80A209FED177A1B0270 -:10DED80043EA02429DF80830134307EE903A9DF852 -:10DEE8000C209DF80B30FAEECA7A43EA02231BB2E3 -:10DEF800C4ED007A07EE903AF8EEE77A0746C7EEE7 -:10DF0800877A20469FED097A77EE877AC6ED007A00 -:10DF1800FFF79EFF384685ED000A05B0F0BD00BF4B -:10DF2800685C00206C5C00200000F04300002A427E -:10DF38001FB5144B1B780BB900241FE001A802A9D8 -:10DF480003AAFFF7AFFF9FED100ADFED100A9DED62 -:10DF5800011A0F48FFF718FF0028EDD0BBEE040A9E -:10DF6800DFED0C0A9DED021A0B48FFF70DFF044682 -:10DF78000028E1D009480A49FCF794F9204604B082 -:10DF880010BD00BF695C00200000E14300808944A7 -:10DF9800353A01080000A042773F01087D8000085B -:10DFA800833F0108824213B5044601DB8A4209DD3A -:10DFB8008DE80600054806491A462346FCF772F91B -:10DFC800002000E0012002B010BD00BF7D800008E5 -:10DFD8009C3F0108024B1860024B0C221A707047D4 -:10DFE800745C0020705C002010B5084B084C186861 -:10DFF800084B002219782346FFF79EFB20B12078B2 -:10E00800A0F148035842584110BD00BF745C00207D -:10E01800785C0020705C002013B5084B084C197818 -:10E02800084B0094186802220023FFF7A4FB20780D -:10E03800003018BF012002B010BD00BF705C002086 -:10E04800785C0020745C0020F7B50F4B0F4C0E462F -:10E0580019780F4B009407461546186803220623C3 -:10E06800FFF746FB6278237843EA02233B80E27895 -:10E07800A37843EA022333806279237943EA0223AF -:10E088002B8003B0F0BD00BF705C0020785C0020DE -:10E09800745C002013B5084B084C1978084B0094A1 -:10E0A800186809220323FFF766FB2078003018BFA1 -:10E0B800012002B010BD00BF705C0020785C002019 -:10E0C800745C0020034A03461068034A11780A2248 -:10E0D800FFF7A5BB745C0020705C002007B5064BF9 -:10E0E8001978064B009018680C220623FFF7A1FB4D -:10E0F80003B05DF804FB00BF705C0020745C002076 -:10E1080013B52B4B18682B4B0A2219780DF1010314 -:10E11800FFF712FB002848D00020FFF7D3FF0120AB -:10E12800FFF7DCFF1820FFF7CDFFFFF7B3FF15243B -:10E13800FFF772FF38B9013C14F0FF0403D0012047 -:10E14800F7F7A4FAF4E701A90DF106020DF10200B0 -:10E15800FFF77AFF0020FFF7B5FF6FF0C700C8216F -:10E16800BDF90220144BFFF71DFF08B9002417E082 -:10E178006FF0C700C821BDF90420104BFFF712FF4C -:10E188000028F3D00E480F49BDF906200E4BFFF7C3 -:10E1980009FF0028EAD00D480D49FCF783F801244F -:10E1A8009DF80100FFF78EFF204602B010BD00BFAA -:10E1B800745C0020705C0020E93E0108EF3E010815 -:10E1C80080F3FFFFE0FCFFFFF53E01087D800008BB -:10E1D800DA3F0108054B1A7832B9054A1060054A3A -:10E1E8005021117001221A70012070477F5C0020B5 -:10E1F800805C00207E5C00201FB5084B187850B169 -:10E20800074B19780DF10F030093064B002218688D -:10E218000123FFF7C1FA05B05DF804FB7F5C00201D -:10E228007E5C0020805C002010B5FFF7E5FF044607 -:10E2380004480CB1044900E00449FCF733F82046CF -:10E2480010BD00BF7D800008F33F010811400108A0 -:10E2580013468A18B2F5005F13B50C4608D2064A71 -:10E268001178064A009010682246FFF795FA00E0F8 -:10E27800002002B010BD00BF7E5C0020805C002042 -:10E288008B18B3F5005F2DE9F34180460F4616461B -:10E2980018D200250124B54212D08CB10B4B197845 -:10E2A80008EB050300930A4B7A19186892B2012308 -:10E2B800FFF707FB04460620F7F7E8F90135EAE718 -:10E2C800204600E0002002B0BDE8F0817E5C00201E -:10E2D800805C002013B54FF480000121F8F768FC3A -:10E2E800154B164A5A604021154A9A60D9604FF476 -:10E2F80080624FF400319A61996200224FF02061E8 -:10E308005A631A621A615A61DA619A635A62DA6266 -:10E318001A63196046238DF804300124062301A8E6 -:10E328008DF805308DF806208DF80740F8F788FF3E -:10E33800044B1C7002B010BDE45C002004140140C2 -:10E348008E5C00208C5C002070B504208AB001210E -:10E35800F8F72EFC20200121F8F74EFC0125802338 -:10E3680002264248029302A900248DF80C608DF819 -:10E378000F50F8F713FB40233C48029302A98DF88D -:10E388000D508DF80E408DF80C60F8F707FB3748F4 -:10E3980006210822F8F74BFB082234480721F8F732 -:10E3A80046FB334B06930C2306A93248ADF82230BE -:10E3B8004FF40073ADF82430ADF81C40ADF81E40A2 -:10E3C800ADF82040F8F778FEFFF784FF47238DF873 -:10E3D800043001A806238DF805308DF806408DF825 -:10E3E8000750F8F72DFF032228462146F7F7BAFB16 -:10E3F800214A106020B1214622462346F7F7DAFB6E -:10E40800012100222820F7F7ADFB1C4B01221860E0 -:10E4180040F225511748F8F7C6FE01200146F8F7E3 -:10E42800C7FB10250124002602A91548039602956A -:10E438008DF80C608DF80F40F8F7B0FA0DEB050079 -:10E4480004958DF814608DF815508DF81640F8F77E -:10E458004BFA0C4B07484FF480621A602146F8F7D4 -:10E4680085FE094B1C700AB070BD00BF0008024051 -:10E4780040420F0000140140885C0020E05C00204E -:10E488000000024000E100E0D85C002008B5064B1F -:10E4980001464FF47A7218680023F7F77DFC431E93 -:10E4A8005842584108BD00BFE05C0020074B1B786C -:10E4B80053B10844814207D0054B1A881206FBD590 -:10E4C80011F8012B9A80F5E7704700BFD85C00204F -:10E4D8000014014007B502A941F8040D0120FFF717 -:10E4E800E5FF9DF8040003B05DF804FB38B5194B4F -:10E4F8001B7804460D4663B3174B002118684FF08C -:10E50800FF320B46F7F748FC1448F8F789F900285A -:10E51800FAD122462946124804F0A2FD114B1249AD -:10E528000E481C600C61F8F743F90C4810210122D1 -:10E53800F8F77AF90D4880210122F8F72BFE0B48ED -:10E548004021F8F749FE05480121BDE83840F8F7B1 -:10E5580059B938BD8C5C0020885C0020B864024042 -:10E568008E5C0020D45C0020E45C00200014014094 -:10E5780073B5114E002402AD22463046102145F8ED -:10E58800044DF8F751F930464FF02051F8F794F957 -:10E5980022460A488021F8F7FDFD30462146F8F763 -:10E5A80031F9074B1C60074B214618682A46234659 -:10E5B800F7F7AEFB02B070BDB8640240001401402A -:10E5C800DC5C0020885C002013B500231F48019301 -:10E5D80040F22771F8F704FEF0B11D4B1B481A688A -:10E5E80062B11C4C1C4923780978994206D9D15C40 -:10E5F800F8F7C8FD2378013323700DE040F2277146 -:10E608000022F8F7D0FD154B02AA0021186842F83D -:10E61800041D0B46F7F77CFB0C4840F22771F8F70E -:10E62800FEFD0A4840F22551F8F7DAFD58B10748CF -:10E63800F8F7ACFD0A4B02A901AA01F8050D186804 -:10E648000023F7F765FB02B010BD00BF00140140BE -:10E65800D05C00208D5C0020D95C0020885C002004 -:10E66800E05C002070B51020F8F782F923481021EB -:10E67800F8F7D3F9012820D12148F8F7D1F8012873 -:10E688003AD11F4810210022F8F7CEF81C48002183 -:10E69800F8F7B8F81A48F8F7C3F80028FAD1184874 -:10E6A8004FF02051F8F708F91548F8F7B6F8154B68 -:10E6B8001860154B01221A7070BD134D2B78DBB111 -:10E6C8000F4C104E20463188F8F7A5F80F4B3268EA -:10E6D8001B689B1A0E4A1344E3600122204610214E -:10E6E800F8F7A2F80B484021F8F776FD20460121FB -:10E6F800F8F788F800232B7070BD00BF00000240B7 -:10E70800B8640240DC5C0020845C0020D45C0020FB -:10E718008E5C002000140140FFF7A4BFFFF754BF30 -:10E72800FFF752BFFFF750BFFFF722BFF0B5224EE9 -:10E73800347889B0002C3CD110200121F8F750FA28 -:10E748004FF6FF7306931D48ADF81C40532305A9E7 -:10E75800ADF81430ADF816408DF81E40F8F71AFBE6 -:10E7680016480121F8F75DFB04200121F8F720FA8B -:10E77800012501A94FF400671148029401978DF80B -:10E7880008408DF80B50F8F709F9102303A88DF805 -:10E79800113003978DF810408DF81250F8F7A4F84F -:10E7A80002200B21F8F782FD064B4FF480725A6065 -:10E7B800357009B0F0BD00BF245D00200010004096 -:10E7C8000008024000E100E008B54FF40060F8F7E7 -:10E7D800D5F8012829D1154A154813881549013358 -:10E7E8009BB21380144B1A8892B212B9426A92B241 -:10E7F8000FE0426A114892B2028002880988521AD0 -:10E808000F4992B20A800A88392192B2B2FBF1F21A -:10E818000C490A801A8892B282F001021A804FF4D9 -:10E828000060BDE80840F8F7B3B808BD205D0020D7 -:10E838000010004072640020225D002074640020F3 -:10E84800766400207064002073B501200146F8F753 -:10E85800AFF9204C4FF4C8530093022303268DF8D8 -:10E8680004302046002369468DF806308DF80730BD -:10E878008DF80560F8F792F8204608210A22F8F783 -:10E88800D6F820460B210A22F8F7D1F820460A22AA -:10E898000C21F8F7CCF801254FF48063204669462F -:10E8A80000938DF806508DF807508DF80560F8F73D -:10E8B80075F80A210A462046F8F7B9F829464FF4B0 -:10E8C8008040F8F799F980202946F8F77DF902B0D9 -:10E8D80070BD00BF0000024007B54FF4C060F8F7F4 -:10E8E800A5FC43238DF804300322012301A88DF8E9 -:10E8F80005308DF806208DF80730F8F7A1FC03B035 -:10E908005DF804FB782358430723B0FBF3F000239A -:10E9180001338342FCD970474FF47A735843FFF7A9 -:10E92800F1BF00207047000008B50B4C204600F0EE -:10E93800CBF92146094C11F8012B2046531E00F84B -:10E94800013B04F08DFB064B002218682146134654 -:10E95800F7F730F9E9E700BF8C5D0020255D00205E -:10E96800885D002008B5084B01466422186800231A -:10E97800F7F712FA012804D10449F9F731F9002010 -:10E9880008BD4FF0FF3008BD885D00200C01002055 -:10E9980010B503781F2B044604D90D480D495F2292 -:10E9A800FBF76EFB0C486378037022781E2A03D8A5 -:10E9B8000130A11C04F054FB2478084901340220DA -:10E9C800F9F70EF92046044900F08EF910BD00BF92 -:10E9D800474001085D400108455D00200C0100200A -:10E9E80030B50E4D2C7885B0ACB900F041F9202136 -:10E9F80022460520F7F7B6F8094B0A4918600323A1 -:10EA08008DE8180002942346039407489622F6F7E7 -:10EA1800CBFB01232B7005B030BD00BF855D002006 -:10EA2800885D00206F40010831E900080048704700 -:10EA3800D802002012230B80004870470C030020E6 -:10EA480004230B80004870470803002010B5044CCD -:10EA580004480A462146FDF7EFFF204610BD00BFD7 -:10EA6800406300207740010870B588B000238DF816 -:10EA78001C300D4B0A4613F8011F0C4C01A80E0957 -:10EA880000EB43050A48A65D465501F00F01013029 -:10EA9800615C415507498B42EDD101A80649FDF754 -:10EAA800CBFF054808B070BD0F7AFF1FD0400108A2 -:10EAB800E00B01C01B7AFF1F4063002008B50A461F -:10EAC80008B9044800E004480449FDF7B5FF0348C5 -:10EAD80008BD00BF83400108293B010840630020AE -:10EAE80010B5044C04480A462146FDF7A5FF204608 -:10EAF80010BD00BF40630020A440010808B50A46C5 -:10EB080008B9044800E004480449FDF795FF0348A4 -:10EB180008BD00BFAF400108BD40010840630020A8 -:10EB280039230B80004870476C03002070477047FA -:10EB3800704770477047000073B5282303FB010135 -:10EB48000B4DD1F88C332B7002AA0A4B00240646D1 -:10EB580042F8044D294618682346F7F7D9F80121E9 -:10EB680030466A184023FDF7CDFC204602B070BD40 -:10EB78005C5E0020505E002008B500F02BFFBDE869 -:10EB88000840F8F735BF08B500F024FFBDE8084095 -:10EB9800F8F72EBF10B581210446FDF79BFC2046EF -:10EBA8000121FDF797FC002010BD000010B5812160 -:10EBB800044640220223FDF76CFC20460121402236 -:10EBC8000223FDF766FC20460121034A4023FDF796 -:10EBD80099FC002010BD00BF5D5E002037B502AA79 -:10EBE800002342F8043D094C094B054621461868A4 -:10EBF800F7F76CF9012806D122462846812112F838 -:10EC0800013BFDF7A6FC002003B030BD0E5E0020DE -:10EC1800585E002037B502AA002342F8043D094C8B -:10EC2800094B054621461868F7F750F9012806D11F -:10EC380022462846812112F8013BFDF78AFC002074 -:10EC480003B030BD0E5E0020585E002008B58B88EA -:10EC5800064A012B136002D1FFF7E8FE01E000F03D -:10EC6800B9FEF8F7C5FE002008BD00BF6803002004 -:10EC780007B50E4B00930E480E4B0F4A0121FDF7C6 -:10EC8800FAFF412100220520F6F76CFF0B4B4121CA -:10EC9800186000220120F6F765FF094B1860094B40 -:10ECA80001221A7003B05DF804FB00BF20030020A6 -:10ECB800786400203C030020EC020020505E002015 -:10ECC800585E0020545E002010B50446054B2146CE -:10ECD80018684FF0FF320023F7F75EF80128F5D1E6 -:10ECE80010BD00BF505E002010B5094C02462046FA -:10ECF80000F8012B04F0B4F9064B21461868642289 -:10ED08000023F6F757FF431E5842584110BD00BF75 -:10ED1800CD5D0020585E002070B52DED028B534B61 -:10ED280019781E46002940F09D80514A514B1170B8 -:10ED3800197015461C46F6F779FBB0F57A7FFAD3B9 -:10ED48004D48FEF789FC4C48FEF754F8FEF7CEFB19 -:10ED580010B14A484A4901E048484A49FBF7A2FA33 -:10ED6800FEF762FB3220F6F791FC0020FEF76EFBFF -:10ED78000120FEF77DFB0020FEF710FB0120FEF7C7 -:10ED8800FBFA0120FEF788FB0320FEF7CDFA0220EC -:10ED9800FEF7DEFA0120FEF7A7FA0220FEF7B0FA26 -:10EDA8003548FFF717F9FFF71FF938B10123162087 -:10EDB8002B70FFF787F93148334901E02F48334971 -:10EDC800FBF770FA2C48FEF7A9FFFEF7BDFF38B134 -:10EDD8000120FFF70FF80123237028482C4901E090 -:10EDE80026482C499FED2C8ADFED2C8AFBF75AFA2E -:10EDF8002B4B0022DA7103F10C029A60294B2A4A44 -:10EE08001A602A4B0D221A7002F00AF920EE080A3D -:10EE180080EE280A02F000FA254B83ED000A02F082 -:10EE2800FFF820EE080A80EE280A02F039FA214B92 -:10EE380083ED000A02F004F920EE080A80EE280AA1 -:10EE480002F0EAF91C4B83ED000A02F0F9F820EE13 -:10EE5800080A80EE280A02F023FA184B83ED000A0C -:10EE680001233370BDEC028B70BD00BFB65E00207D -:10EE7800BE5E0020D45E00204C0200207D80000889 -:10EE8800E040010803410108284101084A410108FE -:10EE98006E41010890410108DB0F494000003443EE -:10EEA800786A0020A05E002019FCFFFFC65E0020E3 -:10EEB8006C6A0020746A0020706A0020846D00204B -:10EEC80010B50D4B1C782CB90C480D49FBF7EAF925 -:10EED800204600E001200B4B1B78184003D0FFF7B9 -:10EEE8000FF9094B1870094B1B78184003D0FFF72E -:10EEF8001FF8074B187010BDB65E00207D80000813 -:10EF0800B4410108BE5E0020A5030020D45E0020A5 -:10EF1800A70300202DE9F04FB14D87B08146B148D5 -:10EF280000952B1D0193821CAB1C8846811EFEF7A1 -:10EF380041FAAD4B29889A6811809A68698851808E -:10EF48009A68A98891809A689C79063203F543717A -:10EF58008A4223BF03F10C029A6001229A6028BFFB -:10EF6800DA71A14A002C40F08880D379002B79D03F -:10EF780000200021CDE90401CDE90201134626460F -:10EF88002746DDE902ABB3F80CC01A8AB3F80EE0E5 -:10EF9800CCFB8CABCDE902ABDDE904AB04FA82F41F -:10EFA800C2FB8201914A0633CEFB8EAB934207FA2D -:10EFB8008CF706FA8EF6CDE904ABE2D18C4B012230 -:10EFC8001A7087FB0723002A73F1000E02DA7F32DA -:10EFD80043F100034FEAD21E4EEA436E029BCEEB8A -:10EFE8000303B3F57A6F3DDA86FB0623002A73F133 -:10EFF800000E02DA7F3243F100034FEAD21E4EEAD6 -:10F00800436E049BCEEB0303B3F57A6F2ADA84FBD5 -:10F018000423002A73F1000E02DA7F3243F1000361 -:10F02800D10941EA4361401AB0F57A6F1ADADFF87C -:10F0380000B2DBF8003003F57A7AF6F7F7F9824583 -:10F0480010D2F6F7F3F9684BCBF80000802297FB53 -:10F05800F2F796FBF2F694FBF2F401221F805E8031 -:10F068009C809A71604B9B793BB104206149F8F709 -:10F07800F7FD03206049F8F7B3FD604B604F1E7839 -:10F08800B7F900005F4A604C3146FAF7E3FF3146B2 -:10F0980020805E4AB7F90200FAF7DCFF314660804B -:10F0A8005B4AB7F90400FAF7D5FFB4F90230B4F9AE -:10F0B8000010584AA08007EE900A05EE903A564B89 -:10F0C800B5F9000093ED004A544BB8EEE76AD3ED6A -:10F0D800006A534BF8EEE55A26EE047AD3ED004A5F -:10F0E800A5EEA67A66EEC66ABDEEC77AE5EE846A34 -:10F0F8008DED027ABDF9083007EE103A494BF8EE6B -:10F10800C77A93ED005A07EE101AF8EEC73A25EEC3 -:10F11800677A4942A3EEA47A67EEA47ABDEEC77A6D -:10F1280017EE103ABDEEE67A138017EE103A07EEA6 -:10F13800101AB8EEC77A5380E7EE057A2A49DFED50 -:10F148003A6AFDEEE77A17EE903A9380B1F900300B -:10F158001B1A07EE103AB8EEC77A27EE267A89ED21 -:10F16800007AB1F90200B5F902301B1A07EE103A1D -:10F17800B8EEC77A27EE267A89ED017AB5F9043018 -:10F18800B1F904105B1A07EE903AF8EEE77AB2F993 -:10F19800003067EEA67A5B42C9ED027A07EE903A34 -:10F1A800DFED226AF8EEE77A67EEA67AC8ED007A14 -:10F1B800B2F9023007EE103AB8EEC77A27EE267A8F -:10F1C80088ED017AB2F9043007EE903AF8EEE77A62 -:10F1D80067EEA67AC8ED027A07B0BDE8F08F00BFE7 -:10F1E800C85E0020D05E0020786A0020786D00207C -:10F1F800B65E0020CC00002024010020C65E00205E -:10F20800CE5E0020A45E0020B05E0020A85E002034 -:10F21800AC5E0020B85E0020706A0020846D00207B -:10F228006C6A0020746A002000007A3D0000803972 -:10F23800A05E002070B52DED068B88B0F6F7F6F8C5 -:10F248000646FDF71FFE0446002864D0F6F7EEF8E0 -:10F25800801BB0F57A7F324D0AD202A805A9FFF7C4 -:10F2680059FEAB79002BF1D02E482F49FBF71AF83D -:10F27800AD79002D4AD09DED079ADDED069A9DEDFA -:10F28800050A9FED2A8A9FED2AAA69EE097AB1EE4E -:10F29800400AE9EEA97AF1EEE77A80EE270A02F051 -:10F2A8003DF820EE080AC0EE0A8A89EE890A02F0C3 -:10F2B80035F820EE080AF1EE047A80EE0A0AB0EE7C -:10F2C800C07AB4EEE77AF1EE10FA0BD5B0EEE87A30 -:10F2D800B4EEE77AF1EE10FA04D516491148FAF7B8 -:10F2E800E1FF18E010EE100AF5F7AEF8044618EE44 -:10F2F800900A0D46F5F7A8F82246CDE900012B46FD -:10F3080008480D49FAF7CEFF002404E005480B49E8 -:10F31800FAF7C8FF2C46204608B0BDEC068B70BD36 -:10F32800786A00207D800008C74101080000344346 -:10F33800DB0F4940E5410108FF410108334201085C -:10F34800014B9879704700BF786A002038B5144699 -:10F35800FFF7E0FD184B1B7843B3184D2846A91C4E -:10F368002A1DFEF771FEFEF795FEB5F90030DFEDB8 -:10F37800146A07EE103AB8EEC77A87EE267A84ED5B -:10F38800007AB5F9023007EE103AB8EEC77A87EE80 -:10F39800267A84ED017AB5F9043007EE903AF8EE52 -:10F3A800E77AC7EEA67AC4ED027A38BD0023236057 -:10F3B8006360A36038BD00BFBE5E0020C05E002051 -:10F3C800CDAC2644014B1878704700BFD45E0020AE -:10F3D8000B4B83ED000A0B4BD3ED007AF4EEC07AA9 -:10F3E800F1EE10FA48BF83ED000A074BD3ED007A1F -:10F3F800F4EEC07AF1EE10FAC8BF83ED000A704748 -:10F40800F05E0020D85E0020A80300201FB50D4C38 -:10F418002378ABB900930193029303930A490B48ED -:10F428009622F5F7C1FE0A4A0123237000EE102A3E -:10F43800084BC3F8012004B0BDE81040FFF7C8BF6F -:10F4480004B010BDF45E0020D8420108D9F40008C9 -:10F45800CDCC6C40DC5E0020014B1878704700BFB3 -:10F46800F45E0020014B93ED000A7047F05E002027 -:10F47800064B50F8022F1A6042685A60027A1A72D4 -:10F48800D3F8013000EE103AFFF7A2BFDC5E00208F -:10F4980038B50D4B1878C0F3400500F00104F5F7B6 -:10F4A800C5FF0A4B1B6824B1002D14BF01200220A0 -:10F4B80038BD3DB9C01A41F2883398428CBF032049 -:10F4C800002038BD204638BDDC5E0020E85E002004 -:10F4D8002DE9F04105212DED028B0020F6F7F4F817 -:10F4E800F5F7A4FF3F4C404D206028604FF4FA70B8 -:10F4F800F6F7CCF80026DFF810813C4F6420F6F7C9 -:10F50800C5F8F5F793FF98ED007ADFED397AB4EE98 -:10F51800E77AF0EE087AF1EE10FAB4EEE77AC8BFAF -:10F528002060F1EE10FAC8BF2860B0EE678AFFF7D6 -:10F53800AFFFB042387029D0032823D8DFE800F0A5 -:10F548001A09021700202B49F8F78AFB00202A49DC -:10F5580009E004202949F8F783FB00202649F8F739 -:10F568007FFB24490020F8F73BFB00200BE0042038 -:10F57800224905E000201F49F8F772FB1E490020C8 -:10F58800F8F72EFB0120F8F7F5FC3E783B782BB313 -:10F59800012BB0D1D8ED007AF4EEC87AF1EE10FA6A -:10F5A80011D49FED177AF4EEC77AF1EE10FA0CDC5D -:10F5B800144B0021B3EC017AF4EEC77AF1EE10FA9D -:10F5C80004DD0131F6E7002100E0092164235943F5 -:10F5D8000848C1F57A72F8F73FFB8CE7F9F776F936 -:10F5E80089E700BFE85E0020EC5E0020F55E0020A1 -:10F5F800CDCC4C40E40000203C010020FC00002061 -:10F6080033338340B0420108F05E002008B5FFF7AD -:10F618003FFF03281ABFB0FA80F04009012008BD57 -:10F62800F0B500258BB02E462F4600240DF10300BF -:10F63800FEF72CFF0028F8D0062C62D8DFE804F08B -:10F64800040B12192A3C43009DF80340A4F1BC03A3 -:10F658005C425C41EAE79DF80330CF2B0CBF0224E3 -:10F668000024E3E79DF803508DF804502E46032448 -:10F67800DCE79DF80330202BD7D81E44F6B2002BC8 -:10F6880035448DF80530EDB24FF0000714BF04245F -:10F698000524CBE79DF803300AAA3A441E4402F831 -:10F6A800223CF6B201379DF805303544FFB2EDB281 -:10F6B800BB4208BF0524B9E79DF80340B4420CBF1C -:10F6C80006240024B2E79DF80330AB42ADD19DF883 -:10F6D800042002F0F004102C06D0202C08D05CB9CD -:10F6E80001A800F043F9A1E701A8FFF7C1FE9CE7D4 -:10F6F80001A800F0D7F998E705490648FAF7D2FDBE -:10F7080093E7054805498122FAF7BAFC8EE700BF5E -:10F71800014301087D800008D03A01081943010817 -:10F7280030B5114B1D7885B01C46D5B90322012090 -:10F738002946F6F717FA0D4A106020B129462A46DD -:10F748002B46F6F737FA032300930023019302931D -:10F758000393074807499622F5F726FD012808BFB5 -:10F76800207005B030BD00BF365F0020385F002034 -:10F7780029F600082B430108014B1878704700BF91 -:10F78800365F0020F8B5204E054600210B4630684C -:10F798004FF0FF32F6F700FB6B78202B04D91B489B -:10F7A8001B49C322FAF76CFC1A4CBC232370CF23E5 -:10F7B80063702B78A3706B78E3706A78A91C201D9E -:10F7C80003F04EFC6D780023A81DA71C1A4605F10E -:10F7D800040EC4EB070CF4450E4906DA17F8011BB2 -:10F7E8000A44D2B21344DBB2F1E70D4401F80E200B -:10F7F8006B71FEF77BFE002130680A460B46F6F770 -:10F80800D9F90020F8BD00BF385F00203343010854 -:10F8180019430108F65E00200020704770B5037890 -:10F828001E2B044604D90E480E499C22FAF728FCE0 -:10F838000D4D00262E702278214601326A7011F88B -:10F84800012BA81C013203F00BFC084B2946186851 -:10F8580064223346F6F7AEF9431E5842584170BD4C -:10F86800893601084E4301085E5F0020845F00204E -:10F8780008B5064B0146642218680023F6F78CFA8F -:10F8880010F1FF3018BF4FF0FF3008BD885F00202F -:10F89800FFF772BF00B58BB001238DF8060001A8F1 -:10F8A8008DF804308DF80530FFF76CFF0BB05DF86C -:10F8B80004FB00B58BB002238DF804308DF80600E8 -:10F8C800012301A88DF80530FFF75CFF0BB05DF848 -:10F8D80004FB00B58DB0CDE9000105238DF80C308F -:10F8E8008DF80D300CAB53F8300DCDF80E001B79A8 -:10F8F8008DF8123003A8FFF745FF0DB05DF804FB43 -:10F9080038B5154B1D781C462DBB22212A460120EF -:10F91800F6F728F9114B202118602A460520F6F73A -:10F9280021F90F4B186020B90E480F494A22FAF7FF -:10F93800A7FBFFF7F5FE01F04BFBC0B2FFF7AAFFEC -:10F9480001F052FBC0B2FFF7B4FF01F057FBFFF71D -:10F95800C0FF0123237038BD815F0020845F002031 -:10F96800885F0020624301084E43010810B50478FF -:10F9780004BB43780146013B01F8013F104B224686 -:10F9880018682346F6F716F901200E49F8F728F902 -:10F998000D4B0E49186822462346F6F7FDF9012853 -:10F9A8000DD102200749F8F71BF90848BDE81040B7 -:10F9B800FFF7E8BE042C02BF054B82781A7010BD11 -:10F9C800885F00200C010020845F00203C5F00203D -:10F9D800805F002000487047AC03002030B5202924 -:10F9E8008BB005460C4604D915481649BC22FAF7CF -:10F9F80047FB15498DF8045022460DF106008DF895 -:10FA0800054003F02DFB01A8FFF7BCFE0F4B0021BA -:10FA1800186841F288320B46F6F7BEF9012805D17D -:10FA28000B4B187848B100221A7006E009480A49B9 -:10FA38009DF80420FAF736FC00200BB030BD00BF5B -:10FA48003843010885430108915F0020B45F002016 -:10FA5800905F00207D8000089A43010810B5FFF7E9 -:10FA68005FFE012000210322F6F77CF80B4B18609B -:10FA78001C4620B100210A460B46F6F79BF80120E8 -:10FA8800F6F718F9064B002118604FF0FF3220688E -:10FA98000B46BDE81040F6F77FB900BFB45F002001 -:10FAA8008C5F00200378203B032B0AD80A4A831C6A -:10FAB800223053F8041B42F8041B8342F9D1012277 -:10FAC80000E00022054B1A70054B002118680A4611 -:10FAD8000B46F6F76FB800BF915F0020905F0020DB -:10FAE800B45F002038B50E4C00210B464FF0FF32B2 -:10FAF80005462068F6F750F920200021FFF76EFF31 -:10FB0800234620B1074A12782A70012400E00446EF -:10FB1800002118680A460B46F6F74CF8204638BD0F -:10FB28008C5F0020915F0020F8B5134C134D0E46F2 -:10FB380000210B4607464FF0FF322068F6F72CF9F4 -:10FB4800212001212F70FFF749FF234650B1294694 -:10FB580051F8012F32602C784A687260FF3C18BF58 -:10FB6800012400E00446002118680A460B46F6F70F -:10FB780021F82046F8BD00BF8C5F0020915F00206F -:10FB880030B58BB00AA8002300F8093DFFF7AAFF9B -:10FB980030B11D499DF81F201C48FAF783FB03E08C -:10FBA8001A481B49FAF77EFB00259DF81F30ECB276 -:10FBB800A34226D9204608A9FFF7B6FFD0B19DF881 -:10FBC800221000919DF8231001919DF824100291B4 -:10FBD8009DF8251003919DF8261004919DF8271093 -:10FBE80005919DF820209DF821300A490748FAF729 -:10FBF80059FB04E0054808492246FAF753FB01354A -:10FC0800D3E701200BB030BDB14301087D80000867 -:10FC1800C0430108D4430108FB4301082DE9F0471C -:10FC2800702A01EB020506460C469946ADB205D985 -:10FC38002748284940F20B12FAF722FADFF8A08089 -:10FC4800254FD8F8000000214FF0FF320B46F6F799 -:10FC5800A3F83E700026AC422FD2C4EB050ABAF1D5 -:10FC68001C0FA7F8014010DCE91C091B2220C9B2AF -:10FC7800FFF7B4FE08B9002420E009EB0600174995 -:10FC8800524603F0EDF92C46E5E722202021FFF744 -:10FC9800A5FE0028EFD0114B09EB060203F11C0169 -:10FCA80053F8040B42F8040B8B42F9D11B781370FC -:10FCB8001D341D36A4B2F6B2CDE701240021D8F8D0 -:10FCC80000000A460B46F5F775FF2046BDE8F087A9 -:10FCD8001944010885430108915F0020945F0020C2 -:10FCE8008C5F00202DE9F843702A01EB020681465B -:10FCF8000C469846B6B205D929482A494FF49F724E -:10FD0800FAF7BEF9284F294D386800214FF0FF3225 -:10FD18000B46F6F741F885F800904FF00009B44219 -:10FD280033D2331B192BA5F8014008EB09010EDC6F -:10FD38009CB21F48A5F80340224603F091F9611DC3 -:10FD48002320C9B2FFF74AFEE8B900241EE01A23AF -:10FD5800EB7000232B71164B01F1180251F8040BBC -:10FD680043F8040B9142F9D10A881A8023201F21F5 -:10FD7800FFF734FE0028E8D01A3409F11A09A4B2B2 -:10FD88005FFA89F9CBE73446C9E7012400213868CE -:10FD98000A460B46F5F70EFF2046BDE8F88300BF7C -:10FDA80019440108854301088C5F0020915F0020F9 -:10FDB800965F002070B531B9047841788278C31C09 -:10FDC80000F11B050FE0014600230F4A9C5CC45458 -:10FDD8001A44033354784C7092788A701B2B01F1C3 -:10FDE8000301F2D1E8E71E7803F8036C5E7803F8A4 -:10FDF800026C9E7803F8016C0333AB42F3D10476AE -:10FE08004176827670BD00BFE1440108234B09B1F9 -:10FE180000221A60D3ED007A204AB7EE007AF4EE99 -:10FE2800C77AF1EE10FA49BF9FED1D7A82ED007A8C -:10FE380077EE877AC2ED007A93ED007A00F11B0223 -:10FE4800184B1B7807EE903AF8EEE77A033067EE26 -:10FE5800877AFCEEE77A17EE903A00F8033C124BEB -:10FE68001B7807EE903AF8EEE77A67EE877AFCEEB1 -:10FE7800E77A17EE903A00F8023C0C4B1B7807EE35 -:10FE8800903AF8EEE77A67EE877AFCEEE77A17EEB3 -:10FE9800903A00F8013C9042D2D17047246000208B -:10FEA800CDCC4C3D00040020C003002008040020F5 -:10FEB80030B5194A85B0034610681179009052F898 -:10FEC800050F8DF8041002AC1279029022710021FE -:10FED8001DF8012002EB42029818FF2501319D54BC -:10FEE80005294FF0000242708270F1D1A05C00EB4E -:10FEF80040001D18002101321954052A4FF0FF0057 -:10FF08006870A970F2D11870587098709974D97483 -:10FF1800197505B030BD00BFD230010870B531B9D0 -:10FF2800047841788278C31C00F11B050FE0014674 -:10FF380000230F4A9C5CC4541A44033354784C7011 -:10FF480092788A701B2B01F10301F2D1E8E71E7841 -:10FF580003F8036C5E7803F8026C9E7803F8016C72 -:10FF68000333AB42F3D104764176827670BD00BF8D -:10FF78005344010870B531B9047E417E827E034640 -:10FF8800A0F11B0516E012490922092392FBF3F39D -:10FF980003EBC303D31A03EB430311F8015CC55405 -:10FFA800C4180B7863704B78A370013A01F1030110 -:10FFB800EBD1E1E75E7D1E769E7D5E76DE7D9E76E8 -:10FFC800033BAB42F6D104704170827070BD00BF34 -:10FFD8003044010870B504460D4611B1164B002295 -:10FFE8001A6029461548FFF7E5FE29461448FFF729 -:08FFF800C1FF25460023114959 +:1050880043604FF0FF32C360036100238260036016 +:10509800704700230361704743684B609A688A60D1 +:1050A8009A6851609960086103680133036070472A +:1050B8000A68531C30B501D1036907E000F1080301 +:1050C8005C682568954201D82346F9E75A684A6022 +:1050D80091608B605960086103680133036030BDDB +:1050E80042688168036991608268416851605A68C2 +:1050F800824204BF82685A6000220261186801383F +:105108001860704708B503F0DBFAFCE710B50E4BE2 +:105118001A6850600D4A12689042044607D20C4A39 +:1051280010681968BDE810400431FFF7C1BF094A8B +:10513800106819680431FFF7BBFF074B1A689442DF +:1051480038BF1C6010BD00BF600600206806002044 +:105158006C060020D4050020640600202DE9F84FD5 +:105168000A9E0C9C0F4615469A46814628B9644803 +:10517800644940F22D2205F087FB052E05D96248C7 +:10518800604940F22E2205F07FFB3CB9A80001F0EF +:10519800E3FA8346002800F0AE8000E0A3465C20D6 +:1051A80001F0DAFA044688B1AD002A46C0F830B0FA +:1051B800A52158460EF06BFE236B043D1D4425F0D7 +:1051C80007057B1E04F13302093705E0584601F054 +:1051D80061FB90E0BB4206D013F8011F02F8011FE3 +:1051E80019780029F6D1052E4FF0000BB04604F1CE +:1051F800040728BF4FF00508384684F83DB0C4F8C6 +:105208002C80C4F84880C4F84CB0FFF742FF04F182 +:105218001800FFF73EFFC8F10603A361C4F854B0B5 +:1052280024616462C4F850B084F858B028464946EE +:10523800524601F0A9FB0B9B206003B11C6001F0F2 +:10524800C5FB324A324D1368DFF8E490013313602E +:105258002B680BBB2C601268012A25D1984609EBF4 +:10526800080008F11408FFF709FFB8F1780FF6D124 +:10527800DFF8C0A0DFF8C0805046FFF7FFFE4046C9 +:10528800FFF7FCFE2348FFF7F9FE234BC3F800A005 +:10529800224BC3F8008007E0214B1B6823B92B6819 +:1052A800DB6AB34298BF2C601E4A1F49136801335A +:1052B8001360E26A23640B68012404FA02F00343D2 +:1052C80014200B6000FB02903946FFF7E5FE01F061 +:1052D8009FFB134B1B685BB12B68DB6AB34207D299 +:1052E800124B4FF080521A60BFF34F8FBFF36F8F8E +:1052F8002046BDE8F88F4FF0FF30BDE8F88F00BFBB +:105308001C3F0108273F01083C3F0108B006002068 +:105318006006002070060020D40500206C060020DE +:10532800D805002084060020B406002004ED00E023 +:10533800E8050020880600209C0600201FB50024F0 +:105348000094019402940394164817499622234620 +:10535800FFF704FF012818D101F028F8012814D11B +:105368004FF05F0383F31188BFF36F8FBFF34F8F45 +:105378000E4B4FF0FF321A600D4B18600D4B1C603E +:1053880004B0BDE8104001F0AFBB40B90A480B4972 +:1053980040F2516204B0BDE8104005F075BA04B09F +:1053A80010BD00BF0D5100089F3F01086406002092 +:1053B800D805002068060020A43F0108273F0108FF +:1053C800024A136801331360704700BFDC050020F0 +:1053D800014B1868704700BF680600202DE9F047A8 +:1053E8003E4B3F4A196811603E4A1268002A46D16E +:1053F8001A683D4E01321A601F68F7B93B4C2368A2 +:105408001B682BB13A483B4940F2AA7205F03CFAB6 +:10541800394B2268196821601A60384A13680133C9 +:10542800136023681B6813B94FF0FF3304E02F4B58 +:105438001B68DB68DB685B6833603368DFF8CC8047 +:10544800DFF8CC909F424FF000040DD3274B1A6829 +:10545800126812B94FF0FF3305E01B68DB68DD689E +:105468006B689F4211D23360D9F80030DA6A14238E +:10547800534358F80330022B28BF012425E0204A63 +:1054880013680133136000241FE005F1040A504635 +:10549800FFF726FEAB6A1BB105F11800FFF720FEE7 +:1054A8001848E96A026801238B40134303601420FB +:1054B80000FB01805146FFF7EFFDD9F80030EA6A9A +:1054C800DB6A9A4228BF0124C0E70F4B1B68002BF8 +:1054D80018BF01242046BDE8F08700BF68060020F9 +:1054E800080000E0DC05002064060020D405002048 +:1054F800AC3F0108273F01086C060020E0050020AA +:10550800E4050020B4060020B8060020E8050020C5 +:105518006006002070B52E4C23682BB92D482E4903 +:1055280040F28E6205F0B0F901F050FA2368013BB1 +:10553800236023680BB1002445E0284B1B68002B2F +:10554800F9D0274B1A680AB3DB68DC68261D04F11A +:105558001800FFF7C5FD3046FFF7C2FD2149E26A92 +:105568000B68012505FA02F003430B601E4B14205B +:1055780000FB02303146FFF78FFD1C4BE26A1B68C7 +:10558800DB6A9A4224BF1A4B1D60DAE7194C23687C +:10559800ABB9174B1C68012CCDD1174B4FF080527B +:1055A8001A60BFF34F8FBFF36F8F0CE0FFF716FF42 +:1055B80010B10F4B01221A602368013B2360236856 +:1055C800002BF3D1E5E701F023FA204670BD00BFB8 +:1055D800DC050020D73F0108273F0108B00600205E +:1055E80070060020B4060020E805002060060020B0 +:1055F800B8060020E405002004ED00E038B50C46AC +:10560800054628B92548264940F23F3205F03CF9BD +:105618002CB9244822494FF4507205F035F9224B31 +:105628001B682BB121481E4940F2413205F02CF984 +:10563800FFF7C6FE1E4B2A681B689342144402D229 +:10564800944207D201E0944206D39C4294BF0023BF +:10565800012302E0002300E001232C608BB1154DEB +:1056680028680430FFF73CFD40B92B681249D86A16 +:105678000A680123834022EA03030B602046FFF7F0 +:1056880045FDFFF747FF38B90C4B4FF080521A60C1 +:10569800BFF34F8FBFF36F8F38BD00BFEC3F0108DA +:1056A800273F0108FF3F0108DC05002017400108DB +:1056B8006806002060060020B406002004ED00E023 +:1056C80038B5044640B9174B4FF080521A60BFF303 +:1056D8004F8FBFF36F8F38BD134B1B682BB1134827 +:1056E800134940F2A33205F0CFF8FFF769FE114DD8 +:1056F800114B1B68286804301C44FFF7F1FC40B9C3 +:105708002B680E49D86A0A680123834022EA0303FA +:105718000B602046FFF7FAFCFFF7FCFE0028D2D00A +:1057280038BD00BF04ED00E0DC050020174001088B +:10573800273F01086006002068060020B406002004 +:1057480038B50D46044608B9044B1C6801F03EF90B +:105758002565BDE8384001F05BB900BF6006002050 +:1057680070B51E4B1A681E4B0AB1012233E01D4E5C +:105778001A603268336812681B6B9A4204D8306822 +:105788003168343102F020FE174B1C68B4FA84F4F7 +:10579800E4B2C4F11F041423144D6343EB582BB92E +:1057A8001348144940F6C80205F06EF8142202FBAB +:1057B80004F3E91808334868406848602B44984265 +:1057C80004BF43684B6002FB04546368DB683360C2 +:1057D80033685A6B084B1A6070BD00BFDC050020A7 +:1057E800B806002060060020B4060020E805002066 +:1057F80031400108273F0108040000E070B50E465B +:10580800054628B91048114940F6DA0205F03CF877 +:105818000F4C216828461831FFF74AFC20680430ED +:10582800FFF75EFC40B923680A49D86A0A68012371 +:10583800834022EA03030B60074B18683044BDE835 +:105848007040FFF763BC00BF78400108273F01089C +:1058580060060020B40600206806002070B50E46D9 +:10586800054628B91048114940F6591205F00CF8B8 +:105878000F4C216828461831FFF70EFC20680430C9 +:10588800FFF72EFC40B923680A49D86A0A68012341 +:10589800834022EA03030B60074B18683044BDE8D5 +:1058A8007040FFF733BC00BF78400108273F01086C +:1058B80060060020B40600206806002038B5C368DA +:1058C800DC682CB91648174940F6B41204F0DCFF1E +:1058D80004F118052846FFF703FC134B1B687BB936 +:1058E800251D2846FFF7FCFB1048E16A02680123E2 +:1058F8008B40134303600E4B142000FB013000E083 +:105908000C482946FFF7C8FB0B4BE26A1B68DB6AA9 +:105918009A4283BF094B01201860002038BD00BFA0 +:105928009E400108273F0108DC050020B40600203E +:10593800E80500207006002060060020B806002058 +:1059480010B5044628B90648064940F6142204F062 +:105958009BFF054B1B682360044B1B68636010BDED +:10596800CD400108273F0108E00500206806002017 +:1059780038B50D46044628B91448154940F61E2284 +:1059880004F082FF2DB91348114940F61F2204F094 +:105998007BFF01F01BF8104B1968104B1A6823683D +:1059A8009A42636801D099420BD22A68C81A904279 +:1059B80007D25B1A134420462B60FFF7C1FF00246F +:1059C80000E0012401F024F8204638BDCD4001084C +:1059D800273F0108D740010868060020E00500209D +:1059E800014B01221A607047B8060020054B1B685E +:1059F80033B1054B1B68002B0CBF022000207047F9 +:105A080001207047D8050020DC0500202DE9F04171 +:105A18000446002838D01D4DC36A2A68D26A9342CA +:105A280032D282691A4E002AA1BF2A68D26AC2F10C +:105A3800060282611427426907FB03639A4220D158 +:105A480000F104084046FFF74BFB124B48B9E06AE7 +:105A58004743F2592AB919680122824021EA020211 +:105A68001A602A68D26AE26201201C6890402043CA +:105A78001860142000FB02604146BDE8F041FFF7C2 +:105A88000BBB2B68DB6AC362BDE8F08160060020AF +:105A9800E8050020B406002070B5044608B90020C7 +:105AA80070BD204B1B68984205D01F481F4940F61F +:105AB800A75204F0E9FEE36C2BB91D481B4940F6D8 +:105AC800A95204F0E1FEE36CE16AA26C013B914249 +:105AD800E364E4D0002BE2D1251D2846FFF700FB44 +:105AE8001449154A50B9E66A14237343CB582BB9A5 +:105AF80010680123B34020EA03031360A36CE36238 +:105B0800C3F10600A0611068012404FA03F63043CB +:105B18001060142000FB03102946FFF7BDFA204649 +:105B280070BD00BF60060020E5400108273F01085E +:105B3800FB400108E8050020B4060020044B1A6861 +:105B48001AB11968CA6C0132CA641868704700BF74 +:105B58006006002038B51546026C044632B905685F +:105B680045BB4068FFF798FF656024E06DB9806821 +:105B78000EF082F9A268236C13446268A360934212 +:105B880018D32368A360284615E0C0680EF074F99E +:105B9800236CE26821685B421A448A42E2603EBF95 +:105BA80062689B18E360022D04D1A36B13B1A36B49 +:105BB800013BA3630020A36B0133A36338BD10B579 +:105BC800026C03466AB1C4681444C46040688442E5 +:105BD80024BF1868D860BDE810400846D9680EF0A0 +:105BE8004BB910BD10B5044600F0F0FEA36C002BB5 +:105BF8000CDD636A53B104F12400FFF75FFE08B1BE +:105C0800FFF7EEFEA36C013BA364EFE74FF0FF3311 +:105C1800A36400F0FDFE00F0D9FE636C002B0CDDE0 +:105C2800236953B104F11000FFF748FE08B1FFF7EC +:105C3800D7FE636C013B6364EFE74FF0FF336364A7 +:105C4800BDE8104000F0E4BE38B50D46044628B95A +:105C58001A481B494FF4847204F016FE00F0B6FE91 +:105C6800216CE36B2268A2604B43D0185B1A134483 +:105C78006060E36000204FF0FF33A0636364A364B7 +:105C880085B92369B3B104F11000FFF717FE0128A5 +:105C980010D10C4B4FF080521A60BFF34F8FBFF3F7 +:105CA8006F8F07E004F11000FFF7E8F904F1240012 +:105CB800FFF7E4F900F0ACFE012038BD5C410108B3 +:105CC8006441010804ED00E0F8B50D4617460646A4 +:105CD80028B91448144940F2431204F0D5FD1DB107 +:105CE80005FB06F0013000E02846543000F034FD92 +:105CF800044670B10DB9206002E000F1540303605E +:105D0800E663256420460121FFF79EFF84F8507062 +:105D180005E00648044940F27F1204F0B5FD20462C +:105D2800F8BD00BF7941010864410108A43F01089A +:105D38002DE9FF410F4601921E46044628B95948ED +:105D4800594940F2672204F09FFD1FB9236C002BCC +:105D580040F09080022E03D1E36B012B40F091803C +:105D6800FFF744FE18B9019B002B40F091804FF0DB +:105D7800000800F02BFEA26BE36B9A4201D3022EBF +:105D88001FD1E36C494A43F48073136020463946B7 +:105D98003246FFF7DFFE636A33B104F12400FFF7F0 +:105DA8008DFD012809D100E038B1414B4FF08052F8 +:105DB8001A60BFF34F8FBFF36F8F00F029FE0120E9 +:105DC8006DE0019D15B900F023FE4CE0B8F1000F1D +:105DD80002D102A8FFF7B4FD00F01AFEFFF7F0FAAF +:105DE80000F0F4FD636C013304BF00236364A36C0B +:105DF800013304BF0023A36400F00AFE02A801A92E +:105E0800FFF7B6FD50BB00F0E1FDD4F83880E56B34 +:105E180000F0FEFDA8451BD1E36C244A43F48063DF +:105E2800136004F110000199FFF7E8FC2046FFF722 +:105E3800D9FEFFF76FFB10B14FF0010899E71C4B33 +:105E48004FF080521A60BFF34F8FBFF36F8FF3E7A5 +:105E58002046FFF7C7FEFFF75DFBEDE72046FFF79B +:105E6800C1FEFFF757FBE36C104A43F4007313605D +:105E7800002014E00F480C494FF41A7204F004FD96 +:105E880068E70D48084940F2692204F0FDFC67E71D +:105E98000A4805494FF41B7204F0F6FC67E704B0A2 +:105EA800BDE8F0815C410108644101080C0000E094 +:105EB80004ED00E09B410108EB4101083242010872 +:105EC80070B50646542000F047FC0446D8B10123BB +:105ED8000025C3634FF0FF33856345604364056065 +:105EE80083648560C560056480F850601030FFF7F2 +:105EF800C5F804F12400FFF7C1F8204629462A46D0 +:105F08002B46FFF715FF204670BD00002DE9F04134 +:105F18000E4690461D46044628B92748274940F2B0 +:105F2800244204F0B1FC0EB9236C9BBB022D02D1B4 +:105F3800E36B012B35D100F049FEEFF311874FF0E9 +:105F48005F0383F31188BFF36F8FBFF34F8FA26B8B +:105F5800E36B9A4201D3022D1AD1204631462A46D4 +:105F6800FFF7F8FDA36C01330DD1636A73B104F137 +:105F78002400FFF7A3FC48B1B8F1000F06D00120B8 +:105F8800C8F8000014E0A36C0133A36401200FE0FB +:105F980000200DE00A48094940F2254204F074FC4B +:105FA800C4E70848054940F2264204F06DFCC2E700 +:105FB80087F31188BDE8F0815C410108644101085C +:105FC8009B410108EB41010870B50D46044628B90C +:105FD8002148224940F2BF4204F056FC236C2BB101 +:105FE8001F481E4940F2C34204F04EFC23680BB917 +:105FF80063683BBB00F0EAFDEFF311864FF05F03E7 +:1060080083F31188BFF36F8FBFF34F8FA26BE36BDE +:106018009A4215D2A36B0133A363A36C01330AD14F +:10602800636A5BB104F12400FFF748FC30B12DB17D +:10603800012028600DE0A36C0133A364012008E06F +:10604800002006E0074805494FF4996204F01CFC5B +:10605800D0E786F3118870BD5C41010864410108EE +:1060680088420108A14201082DE9FF410E4601922C +:106078009846044628B95648564940F25B5204F0FF +:1060880003FC1EB9236C002B40F09080FFF7AEFC98 +:1060980018B9019B002B40F09080002700F096FC77 +:1060A800A36B63B320463146E568FFF788FDB8F176 +:1060B800000F10D1A36B013BA363236813B9FFF74B +:1060C8003DFD60602369B3B104F11000FFF7F6FBF2 +:1060D800012810D107E0636AE56063B104F1240088 +:1060E800FFF7ECFB38B13C4B4FF080521A60BFF31E +:1060F8004F8FBFF36F8F00F08BFC012064E0019D90 +:1061080015B900F085FC4FE017B902A8FFF718FC95 +:1061180000F07EFCFFF754F900F058FC636C013383 +:1061280004BF00236364A36C013304BF0023A3648A +:1061380000F06EFC02A801A9FFF71AFC78BB00F07A +:1061480045FCA56B00F064FC1DBBE36C234A43F4DB +:1061580040731360236833B900F038FC6068FFF7B8 +:1061680055FC00F055FC04F124000199FFF746FBAB +:106178002046FFF737FDFFF7CDF908B101278DE776 +:10618800154B4FF080521A60BFF34F8FBFF36F8FDC +:10619800F4E72046FFF726FDFFF7BCF9EEE72046B7 +:1061A800FFF720FDFFF7B6F900200DE00C4809497C +:1061B80040F25C5204F068FB68E70A48054940F27F +:1061C8005F5204F061FB68E704B0BDE8F08100BFEE +:1061D8005C4101086441010804ED00E00C0000E0A6 +:1061E800FC42010832420108F8B50E46174604463B +:1061F80028B91D481D4940F2156204F045FB0EB947 +:10620800236C3BBB00F0E2FCEFF311854FF05F031A +:1062180083F31188BFF36F8FBFF34F8FA06B00B369 +:1062280020463146FFF7CBFCA36B013BA363636CAD +:1062380001330AD123695BB104F11000FFF73EFB7B +:1062480030B12FB1012038600BE0636C0133636417 +:10625800012006E00648054940F2166204F014FBE6 +:10626800D0E785F31188F8BD5C4101086441010855 +:10627800FC42010810B5044628B9064806494FF4FF +:10628800D46204F001FB00F0A1FBA46B00F0C0FB9A +:10629800204610BD5D4101086441010830B5002366 +:1062A800064A52F8335002EBC3041DB942F83310C2 +:1062B800606030BD01330A2BF2D130BDC06B0020C5 +:1062C80070B504460E46154600F080FB636C01333A +:1062D80004BF00236364A36C013304BF0023A364D9 +:1062E80000F096FBA36B2BB904F1240031462A4633 +:1062F800FFF7B4FA2046BDE87040FFF773BC000012 +:10630800F8B5134C00F062FB2568EDB9114F124E39 +:106318003846FEF7B3FE3046FEF7B0FE0F4B1F605F +:106328000F4B14200C212A461E60FFF7CDFC20607D +:1063380028B90C480C4940F21A3204F0A5FA206832 +:1063480010B10A49FFF7AAFFBDE8F84000F060BBAA +:10635800EC060020C0060020D4060020BC06002061 +:10636800F0060020604301086C43010882430108DD +:1063780010B5044691424160206105D8D21A83695C +:106388009A420CD2074B04E09A4201D2994206D2B3 +:10639800054B1868211DFEF78BFE002010BD01205B +:1063A80010BD00BFF0060020BC0600201FB5FFF797 +:1063B800A7FF0D4B1B683BB90C480D494FF487727A +:1063C80004F062FA00200CE00123009300230193FB +:1063D80002930393074808499622FEF7BFFE002858 +:1063E800EAD005B05DF804FBEC060020A43F0108E4 +:1063F8006C43010835650008874301082DE9F04121 +:10640800804617461E460D4689B12C2000F0A4F997 +:10641800044698B1FFF774FF069BC4F80080A56195 +:10642800E76126626362201DFEF733FE06E0054839 +:1064380005494FF49B7204F027FA2C462046BDE824 +:10644800F08100BF8F4301086C4301082DE9FF412B +:106458000D4690461F46064628B91348134940F290 +:10646800411204F011FA124C2068C8B1052D0195AB +:10647800CDF8088003960EDCFFF7B8FA022818BF9B +:106488000022206808BF0A9A01A90CBF00231346FE +:10649800FFF74EFC04E001A93A460023FFF736FD5A +:1064A80004B0BDE8F08100BFAB4301086C430108AC +:1064B800EC060020F7B5194D2B681A683AB3DB686B +:1064C800DC681E68271D3846FEF70AFE636A204608 +:1064D8009847E369012BEED1A3693344B34206D947 +:1064E8006360246128683946FEF7E2FDE3E700218E +:1064F8000091204632460B46FFF7A8FF0028DAD164 +:10650800074808494FF43F7204F0BEF9D3E7064A3A +:1065180011682960136003B0F0BD00BFBC060020FD +:10652800B24301086C430108F00600202DE9F0474A +:1065380086B0DFF8ACA1DAF800301C68B4FA84F44D +:1065480064091CB9DB68D3F8008001E04FF000084B +:106558005C4DFEF735FFFEF73BFF2B6898428146FE +:106568002F4603D2FFF7A6FF012300E00023C5F85A +:106578000090554E002B42D144BBC8452DD8FEF79C +:10658800C9FFDAF80030DB68DD68281DFEF7A8FDD2 +:10659800EB69012B16D1A969284641444A4643466E +:1065A800FFF7E6FE01280DD1009428462146424611 +:1065B8002346FFF74BFF28B94448454940F2931258 +:1065C80004F062F96B6A284698471EE0414B1B6845 +:1065D8001C68B4FA84F2520900E022463068C9EB1C +:1065E8000801FFF76DFEFEF795FF70B93A4B4FF0C3 +:1065F80080521A60BFF34F8FBFF36F8F05E0FEF72D +:1066080089FF02E0039B002B08DA0022306803A907 +:106618001346FFF729FD0028F4D18AE7059C636932 +:1066280013B1201DFEF75CFDFEF7D2FE3B689842D1 +:10663800054601D2FFF73EFF039A3D60092AE4D8D8 +:106648000123934013F404782AD113F0C70F05D11E +:106658009B06DAD5204600F01DF9D6E7049BA16910 +:10666800204619442A46FFF783FE0128CDD1636AE4 +:1066780020469847E369012BC7D1A269049BCDF84E +:1066880000801A44204641464346FFF7DFFE0028B3 +:10669800BBD10E480E494FF4287204F0F5F8B4E760 +:1066A800049BA3612BB90D48094940F2B72204F0B5 +:1066B800EBF8A169204629442A462B46FFF758FEE5 +:1066C800A3E700BFE8060020EC060020B24301085B +:1066D8006C430108F006002004ED00E0BA4301080D +:1066E800BC06002010B5044628B9064806494FF4F0 +:1066F800537204F0C9F800F069F9246A00F088F9C7 +:10670800204610BDAB4301086C43010810B5104B7F +:106718001A68824201D21346FAE759685C18844223 +:1067280001BF4068091818465960416844189442E6 +:1067380009D1084C2468A2421FBF526889184160D9 +:106748001A6818BF12680260834218BF186010BD2B +:10675800FC060020F80600202DE9F8430446FEF761 +:106768002FFE4249424D0B68FBB9424A424E500740 +:106778001FBF0732414B22F007029B1A08BF45F2A0 +:10678800F0531344083B23F0070300207060326085 +:10679800586018600B60981A1360394B5060186085 +:1067A800384B18604FF000432B602B681C424BD1CC +:1067B800002C47D0083462071CBF24F007040834B3 +:1067C800002C3FD02F4B1A68944298463CD82A4B4D +:1067D8001E687268A24203D30A68964206D133E063 +:1067E8003268002AF8D033461646F2E732681F6846 +:1067F8001A6073681B1B102B07F1080711D906EBE9 +:10680800040919F0070F04D01F482049E82204F0B2 +:106818003BF873681B1BC9F8043048467460FFF7DF +:1068280075FF17497268D8F8003008689B1A8342C8 +:10683800C8F8003038BF0B602B681A430023726019 +:10684800336002E0274600E00027FEF763FE0FB939 +:1068580001F0A0FD7B0705D00D480C494FF4947258 +:1068680004F012F83846BDE8F88300BFF8060020A7 +:10687800F45C002004070020FC060020F45C0020E3 +:10688800F85C0020F4060020DF43010820440108DA +:106898004744010838B5044688B3194B50F8042C0E +:1068A800196811421D4605D1164817494FF49E72C2 +:1068B80003F0EAFF54F8083C2BB11448124940F29F +:1068C8003D1203F0E1FF54F8043C2A681A4216D03E +:1068D80054F8081C99B923EA020344F8043CFEF76B +:1068E8006FFD0B4A54F8041C1368A4F108000B440C +:1068F8001360FFF70BFFBDE83840FEF70BBE38BD4D +:10690800F45C00208444010820440108B5440108CF +:10691800F4060020014B1868704700BFF4060020F9 +:1069280006480068006880F3088862B661B6BFF35D +:106938004F8FBFF36F8F00DF00BF000008ED00E04E +:10694800DFF80C00016841F4700101607047000035 +:1069580088ED00E008B5094B1B68013305D00848ED +:10696800084940F2071203F08FFF4FF05F0383F3EB +:106978001188BFF36F8FBFF34F8FFEE70000002031 +:10698800D5440108EF4401084FF0807300E90A007C +:10699800054B40F80C3C6FF0020340F8202C40F8FF +:1069A800243C4438704700BF5D690008064B1968ED +:1069B8000868B0E8F04F80F30988BFF36F8F4FF095 +:1069C800000080F311887047600600204FF05F03D5 +:1069D80083F31188BFF36F8FBFF34F8F084A136893 +:1069E8000133012B13600AD1064B1B6813F0FF0F0C +:1069F80005D00548054940F29F1203F045BF70478E +:106A08000000002004ED00E035450108EF440108CE +:106A180010B5084C23682BB9074808494FF4D372BE +:106A280003F032FF2368013B23600BB983F311881D +:106A380010BD00BF000000206A450108EF440108AE +:106A4800EFF30980BFF36F8F144B1A681EF0100F15 +:106A580008BF20ED108A20E9F04F10604DF8043D82 +:106A68004FF05F0080F31188BFF34F8FBFF36F8F34 +:106A7800FEF776FE4FF0000080F3118808BC196815 +:106A88000868B0E8F04F1EF0100F08BFB0EC108A8D +:106A980080F30988BFF36F8F704700BF600600203E +:106AA80008B5EFF311834FF05F0282F31188BFF34B +:106AB8006F8FBFF34F8FFEF791FC18B1034B4FF068 +:106AC80080521A60002383F3118808BD04ED00E0AA +:106AD800034B044A1A60072243F8042C704700BF8E +:106AE80014E000E03F90020013B52C4B2C4A1968C3 +:106AF80091421C4605D12B482B4940F23D1203F028 +:106B0800C3FE2268294B9A4205D1294826494FF4E9 +:106B18009F7203F0B9FE274B1A78D2B20192FF2276 +:106B28001A701B78244ADBB28DF803309DF80330C5 +:106B380003F05F031370214A072313609DF80310C5 +:106B4800090603F1FF3007D59DF803305B00DBB27F +:106B58008DF803300346F1E71B0203F4E06313608A +:106B6800019B144ADBB21370154B1A6842F47F027A +:106B78001A601A6842F07F421A60FFF7A9FF114BAA +:106B880000221A60FFF7DCFE0F4A136843F0404307 +:106B98001360FFF7C5FEFFF7DDFE00BF00ED00E064 +:106BA80071C20F417C450108EF44010870C20F41D2 +:106BB8009F45010800E400E0FC5C0020005D002027 +:106BC80020ED00E00000002034EF00E008B5EFF30E +:106BD80005830F2B0BD90E4A9B5C0E4A12789A42FA +:106BE80005D90D480D494FF4387203F04DFE0C4B92 +:106BF8000C4A1B68126803F4E063934207D90A48F9 +:106C080006494FF43C72BDE8084003F03DBE08BD9C +:106C1800F0E300E0FC5C0020C2450108EF440108F5 +:106C28000CED00E0005D0020EC45010808B54FF4CC +:106C38008070012100F04CFB4FF480700021BDE80A +:106C4800084000F045BB0000436823F040720B6821 +:106C580022F4807213430A7943EA022343600B69E2 +:106C6800CA681A438B6810B51A438468084B2340D6 +:106C780013434A7943EA42038360C36A23F47002E8 +:106C88000B7D013BDBB242EA0353C36210BD00BF78 +:106C9800FDF7FFC000230360037143718360C36085 +:106CA800036101230375704710B5074C074B6268F1 +:106CB800134090E80600114382681143C2680A43F2 +:106CC8001343636010BD00BF00230140E030FCFFA8 +:106CD8000023036043608360C3607047836811B119 +:106CE80043F0010301E023F00103836070470000D3 +:106CF800044BDA6809B1104301E022EA0000D860C9 +:106D0800704700BF002004E0036823F0010303601C +:106D18000023036043608360C360036121234361F0 +:106D2800294B984217D0294B98421BD0284B9842A0 +:106D380020D0284B984225D0274B98422AD0274B61 +:106D480098422ED0264B984232D0264B984236D0C5 +:106D5800254B984203D13D2243F8082C7047234B1A +:106D6800984204D14FF4746243F8202C7047204BAA +:106D7800984204D14FF4741243F8382C70471D4BD5 +:106D8800984204D14FF0746243F8502C70471A4B64 +:106D9800984203D1194A43F8642C7047184B98421B +:106DA80003D1184A43F87C2C7047174B984203D1FB +:106DB800164A43F8942C7047154B984203D14FF06C +:106DC8003D5243F8AC2C70471060024028600240E6 +:106DD8004060024058600240706002408860024093 +:106DE800A0600240B860024010640240286402407B +:106DF8004064024058640240706402403D00002034 +:106E080088640240400F0020A064024000003D203A +:106E1800B86402400268134B10B51340CC680A6886 +:106E280014434A6914438A691443CA6914430A6AB1 +:106E380014434A6A14438A6A14434A6B14438A6B9C +:106E480022431343036043690C6B23F00702CB6AA8 +:106E58002343134343610B6943604B6883608B682A +:106E6800C36010BD3F801CF0036811B143F00103FB +:106E780001E023F0010303607047416070474068F8 +:106E880080B27047006800F0010070470B0611D50A +:106E980043694AB143F080038029436114D00368F1 +:106EA80001F01E0119430EE023F08003802943619D +:106EB80004D17047802907D0002AF0D1036801F077 +:106EC8001E0123EA0101016070470000104A114BBE +:106ED80010B5114CA04294BF1C46144621F0F02373 +:106EE80023F0C3122AB1006800F01E0000EAD12284 +:106EF80002E0406900F0800289004CBF60682068A9 +:106F080023F08213184002D0101C18BF012010BDB6 +:106F180000640240006002400F64024010B5084A55 +:106F2800084B094CA04294BF1846104611F0005F68 +:106F380021F0F02121F0821114BFC160816010BDE1 +:106F480000640240006002400F640240837910B57B +:106F58000468002B31D01E4B196821EA04021A601C +:106F68005A68016822EA01025A600279016802F14E +:106F7800804202F59E321468214311609A680168C4 +:106F880022EA01029A60DA68016822EA0102DA60FC +:106F980042790168102A0BBF9A6802F180431143B5 +:106FA80003F59E3303BF9960D96802681A680BBF5E +:106FB8000A431143DA60196010BD037903F1804375 +:106FC80003F59E331A6822EA04021A6010BD00BF56 +:106FD800003C0140014B5861704700BF003C014034 +:106FE800034B5B69184214BF01200020704700BFA3 +:106FF800003C0140014B5861704700BF003C014014 +:10700800F0B5002201230C6893401C409C4229D112 +:10701800550003230668AB40DB431E4006600E792B +:107028000768AE403E4306600E79013E012E11D836 +:1070380086681E4086604E798768AE403E4386600B +:10704800466826EA040444608C7946689440A4B2F1 +:1070580034434460C4682340C360CB79C468AB4000 +:107068002343C3600132102ACCD1F0BD4FF6FF7321 +:1070780003600023037143718371C371704703690F +:10708800194214BF012000207047018370474183D3 +:10709800704710B501F00703C90800EB81009B0099 +:1070A800046A0F21994024EA01010162016A9A40A9 +:1070B8001143016210BD00007FB5868826F03F06A7 +:1070C8000446360468460D46360C00F081F8029AEC +:1070D8002C48B2FBF0F081B20E43A68023882A4EDA +:1070E80023F001031B041B0C23802B68B3420AD82E +:1070F8005B000131B2FBF3F39BB2032B89B298BF5B +:107108000423218423E0EE884BF6FF718E421BBFD7 +:1071180019214B4303EB4303B2FBF3F315BF9BB2B7 +:10712800B2FBF3F343F480439BB2C3F30B020AB9F7 +:1071380043F001034FF4967101FB00F24FF47A71AA +:1071480092FBF1F2013292B243F400432284A3830A +:1071580023889BB243F00103238023886989AA8886 +:1071680023F4816323F002031B040A431B0C13431B +:107178009BB223802A89AB8913439BB2238104B035 +:1071880070BD00BF40420F00A0860100014B18608F +:10719800704700BF00300040014B5860704700BF87 +:1071A80000300040014B9860704700BF003000403D +:1071B800024B4AF6AA221A60704700BF003000400E +:1071C800024B4CF6CC421A60704700BF00300040BA +:1071D80010B51D4A936803F00C03042B03D0082B49 +:1071E80003D01A4B18E01A4B16E05168536811F493 +:1071F800800F03F03F03516814BF154A134AB2FBCE +:10720800F3F3114A5268C2F30142C1F38811013203 +:107218004B435200B3FBF2F30B4A036093680D49EA +:10722800C3F30313CC5C0368E34043609468C4F37E +:1072380082240C5D23FA04F484609268C2F342321B +:107248008A5CD340C36010BD003802400024F400BB +:1072580000127A0004000020044B1A6B09B1104395 +:1072680001E022EA00001863704700BF00380240BE +:10727800044B5A6B09B1104301E022EA000058633D +:10728800704700BF00380240044B1A6C09B1104324 +:1072980001E022EA00001864704700BF003802408D +:1072A800044B5A6C09B1104301E022EA000058640B +:1072B800704700BF00380240044B1A6A09B11043F6 +:1072C80001E022EA00001862704700BF003802405F +:1072D800044B5A6A09B1104301E022EA00005862DF +:1072E800704700BF003802404209012A074B01D10C +:1072F8001B6803E0022A0CBF1B6F5B6F00F01F00C6 +:1073080023FA00F000F00100704700BF0038024087 +:10731800024A536F43F08073536770470038024046 +:1073280008B5474B984205D101200146FFF7D0FF29 +:1073380001203DE0B0F1804F05D101200146FFF763 +:10734800BBFF012076E03F4B984205D10220012186 +:10735800FFF7B2FF02206DE03B4B984205D10420B5 +:107368000121FFF7A9FF042064E0384B984205D1BA +:1073780008200121FFF7A0FF08205BE0344B98426A +:1073880005D110200121FFF797FF102052E0314B63 +:10739800984205D120200121FFF78EFF202049E0E7 +:1073A8002D4B984209D102200121FFF791FF0220BD +:1073B8000021BDE80840FFF78BBF284B984207D152 +:1073C8004FF480300121FFF783FF4FF48030EFE75F +:1073D800234B984207D14FF400300121FFF778FF83 +:1073E8004FF40030E4E71F4B984207D14FF4802058 +:1073F8000121FFF76DFF4FF48020D9E71A4B98421F +:1074080005D140200121FFF757FF402012E0174B1C +:10741800984205D180200121FFF74EFF802009E026 +:10742800134B98420BD14FF480700121FFF744FFB2 +:107438004FF480700021BDE80840FFF73DBF08BD4C +:10744800000001400004004000080040000C00401B +:1074580000100040001400400004014000400140BA +:10746800004401400048014000180040001C004052 +:10747800002000401C4A038890429BB212D002F5BB +:10748800806290420ED0B0F1804F0BD0A2F58032CE +:10749800904207D002F58062904203D002F58062E4 +:1074A800904203D14A8823F0700313430F4A904255 +:1074B80008D002F5806290421FBF23F440730A8906 +:1074C8009BB2134303804B68C3620B880385064B4A +:1074D800984203D003F58063984201D18B7A0386E2 +:1074E80001238382704700BF000001400010004064 +:1074F8004FF0FF334360002303800381438083728E +:107508007047018582827047038819B19BB243F0A6 +:10751800010303E023F001031B041B0C03807047E5 +:10752800038C23F001031B041B0C0384038C70B52C +:107538008488028B0E8822F073021204120C23F046 +:10754800020516434B888A892D0413430F4A2D0CD4 +:107558002B439042A4B29BB203D002F580629042C2 +:107568000ED1CA894D8A23F0080313438A8823F071 +:10757800040313430A8A24F4407415432C43A4B229 +:10758800848006838A684263038470BD00000140DA +:10759800038C23F010031B041B0C0384038C30B5ED +:1075A8008588028B0C8822F4E6421204120C42EA07 +:1075B800042223F0200394B21B048A891B0C43EA9B +:1075C80002134A8843EA0213124A9042ADB29BB2B0 +:1075D80003D002F58062904215D123F08003CA8956 +:1075E8009BB243EA02124FF6BF7313408A8843EAFC +:1075F80002130A8A25F4406545EA82054A8A45EA63 +:1076080082059BB2ADB2858004838A688263038455 +:1076180030BD00BF00000140038C23F480731B04BD +:107628001B0C0384038C30B58488828B0D8822F070 +:1076380073021204120C23F4007315431B048A8985 +:107648001B0C43EA02234A8843EA0223124A904267 +:10765800A4B29BB203D002F58062904215D123F404 +:107668000063CA899BB243EA02224FF6FF331340F4 +:107678008A8843EA02230A8A24F4405444EA02141A +:107688004A8A44EA02149BB2A4B2848085838A6839 +:10769800C263038430BD00BF00000140038C23F4A3 +:1076A80080531B041B0C0384038C30B58488828BA5 +:1076B8000D8822F4E6421204120C23F4005342EA25 +:1076C80005221B048D891B0C43EA05334D8843EAC8 +:1076D80005330B4DA842A4B292B29BB203D005F574 +:1076E8008065A84205D10D8A24F4804444EA8514B3 +:1076F800A4B2848082838A680264038430BD00BF98 +:10770800000001404163704781637047C16370475F +:1077180001647047038B23F008031B041B0C1943F7 +:1077280001837047038B23F400631B041B0C43EA9B +:10773800012189B201837047838B23F008031B045E +:107748001B0C194381837047838B23F400631B044C +:107758001B0C43EA012189B281837047406B704753 +:10776800806B7047C06B7047006C7047B0F844304E +:1077780029B16FEA43436FEA53439BB201E0C3F375 +:107788000E03A0F84430704783899BB20AB11943AD +:1077980001E023EA01018181704700007FB5038A77 +:1077A800CA889BB223F440531343038283890E464D +:1077B8009BB223F4B053098923F00C02B3880B431E +:1077C80071890B439BB213438381838AB2899BB22D +:1077D80023F440731343838204466846FFF7F8FC9A +:1077E8001A4B9C4203D003F580639C4201D1039D50 +:1077F80000E0029DA38931681BB2002B4FF01902EB +:1078080002FB05F2B4BF4D008D00B2FBF5F5A2896D +:107818006426B5FBF6F00001010912B2002A06FB46 +:107828001153ADBF1A01D90032313232B5BFB1FBA5 +:10783800F6F2B2FBF6F302F0070203F00F03B4BF4F +:107848001043184380B2208104B070BD001001407D +:10785800838919B19BB243F4005303E023F4005326 +:107868001B041B0C83817047C1F30801818070479A +:107878008088C0F308007047838A9BB20AB1194315 +:1078880001E023EA01018182704710B5C1F3421477 +:10789800012301F01F01012C03FA01F301D10C307F +:1078A80003E0022C0CBF1030143012B102681343ED +:1078B80002E0026822EA0303036010BDC94389B2EB +:1078C80001807047012310B5C1F3421401F01F0273 +:1078D8009C4203FA02F201D1838903E0022C0CBF17 +:1078E800038A838A9BB21340028892B23BB1090A89 +:1078F80001238B40134214BF0120002010BD1846FD +:1079080010BD090A01238B40DB439BB203807047FB +:1079180040F0BF60024B40F40030D860704700BFB1 +:1079280000ED00E0C278037810B512B3164AD168AA +:107938004278C943C1F30221C1F10404E4B2A24070 +:10794800D4B20F220A4181780A40224303F16043EE +:1079580003F561431201D2B283F8002303780122B0 +:10796800590903F01F0302FA03F3084A42F82130C9 +:1079780010BD5A09012103F01F03994002F12003A9 +:10798800024A42F8231010BD00ED00E000E100E0DB +:1079980010B501F0030301F0FC0101F1804101F58C +:1079A8009C319B008C680F229A4024EA02028A606C +:1079B8008A68984002438A6010BD08B505F0B8FD92 +:1079C80000F036FDFDF7BAFC05F0DAFD00200121D4 +:1079D80005F0D0FD0120014605F0CCFDFEE708B515 +:1079E8004FF48060FFF7FCFA012803D14FF4806060 +:1079F800FFF700FBBDE8084007F0A2BB4FF440705A +:107A0800FFF786BF08B5FFF74BF8BDE8084003F05D +:107A180033BC70471EF0040F0CBFEFF30880EFF380 +:107A2800098000F001B870472DE9F84FD0F800B090 +:107A3800D0F804A0D0F80890D0F80C8007694669FF +:107A48008569C4692549264803F05CF82549244816 +:107A58005A4603F057F824492148524603F052F891 +:107A680022491F484A4603F04DF821491C4842461E +:107A780003F048F81F491A483A4603F043F81E49EC +:107A88001748324603F03EF81C4915482A4603F0C9 +:107A980039F81B491248224603F034F8194B1A49A1 +:107AA8001A680F4803F02EF8184B19491A680C4841 +:107AB80003F028F8174B18491A68094803F022F808 +:107AC800164B17491A68064803F01CF8154B04486A +:107AD8001A68154903F016F8FEE700BF2E4601089C +:107AE8000DEE0008444601084D46010856460108B7 +:107AF8005F46010868460108724601087B4601088E +:107B08008446010838ED00E08E46010828ED00E0C3 +:107B1800994601082CED00E0A446010830ED00E08C +:107B2800AF4601083CED00E0BA460108FEE7FEE773 +:107B3800FEE7704706F092BC37B500240E4D684644 +:107B4800FFF794FA2B681A59D26800921B596946B4 +:107B58009868FFF755FA2B681B5900229868198A0C +:107B6800FFF797FA2B681B590434186AFFF7D8FBFC +:107B7800102CE3D103B030BD106C00202DE9F0418A +:107B88003F4F404D3B788AB0044613B12868FFF751 +:107B9800D3FF2C6000242B681B5901215868FFF77C +:107BA8005BFB2B681B590121D869FFF76DFB684601 +:107BB800FFF75CFA02238DF804308DF805302B6846 +:107BC8001A5952698DF806201A59D26800921B5921 +:107BD80069469868FFF714FA2B681B599868198A40 +:107BE8001A7EFFF756FA2B681A59D26A03921A5965 +:107BF8000026128EADF80820ADF81060ADF80A60C6 +:107C08008DF812601B5902A9186AFFF733FC60232C +:107C1800ADF814304FF001082B68ADF816800796C0 +:107C28001A59928CADF820204FF48072ADF82420B8 +:107C38001B5905A9DA6B186A90472B681B5908214C +:107C48001A6C186A90472B681B594146986AFFF7C7 +:107C58004FF82B681B594146186A0434FFF786FD14 +:107C6800102C98D12B689B590121186A0436FFF70C +:107C78004BFC102EF6D101233B700AB0BDE8F08111 +:107C8800045D0020106C00202DE9F0472DED028BDB +:107C9800032882B005460C4604D93D483D49D12207 +:107CA80002F0F2FD3C4B1A6852F8252012789A46E9 +:107CB800002A44D107EE104ADFED387ABBEEC87AC5 +:107CC80067EE277A17EE900AFCF7BEFB80468946D6 +:107CD80008F086F82AA3D3E9002340464946B0EEC7 +:107CE800408AFCF705FC42464B46FCF701FC26A3FC +:107CF800D3E9002306460F4640464946FCF7F8FB01 +:107D080002460B4630463946FCF740FAFCF78AFE35 +:107D180007EE900A87EE880AF7EE007AB4EE670A53 +:107D2800F1EE10FAC8BFB0EE670ADFED1D7A20EE5B +:107D3800270ABCEEC00A8DED010ABDF80440DAF846 +:107D4800003053F825301A78012A01BF45F208217E +:107D58004C434FF6FF71B4FBF1F104BF01F5A441A8 +:107D680008315A6B0BBF186A186A89B2210A02B027 +:107D7800BDEC028BBDE8F047104700BFAFF30080B1 +:107D88009FE3480CA77144BFBA490C022B87B63F42 +:107D9800E0470108F3470108106C0020000070421A +:107DA80000FF7F4703282DE9FF4104468846174610 +:107DB8001E4605DD184819494FF4847202F064FD27 +:107DC80001A8FFF795FB164DB8F1000F08D0042362 +:107DD800144A92FBF7F292B2ADF80430029209E02D +:107DE8002B6853F82420D26A029253F824301B8E51 +:107DF800ADF804302B6853F8243001A9186AFFF74E +:107E080039FB2B6853F8243031465A6B186A90476F +:107E180004B0BDE8F08100BFE0470108F34701085E +:107E2800106C00200059000170B50024114B1B682C +:107E380053F824301D78BDB90F4B53F824600F4B0D +:107E4800012133F81420304640F27573FFF7AAFF7A +:107E58003220FDF735FC304629462A462B46FFF7E7 +:107E6800A1FF9620FDF72CFC0134042CDED1044B35 +:107E7800187870BD106C00200848010850470108A8 +:107E8800045D00207320704700B589B0124B1B6851 +:107E980068469B68984702460028F7D19DF801304C +:107EA8000E491B0951F8230020B169461346FDF716 +:107EB8003FFF03E00A4A1368013313609DF801305D +:107EC800084A1B0952F823100029DFD052F8233042 +:107ED80068469847DAE700BF48000020085D0020A0 +:107EE800485D0020545D002010B588B00D4B0E4A47 +:107EF800196891421C4610D00C4B694618684FF01F +:107F0800FF320023FEF7B0F80128EFD12368684656 +:107F18005B6898470028F9D0E8E70A20FDF7D0FB0E +:107F2800E4E700BF4800002034000020505D002036 +:107F38007FB5114D2C78ECB9202122463C20FDF765 +:107F4800C3FE0E4B0E491860022696222346009661 +:107F58000194029403940B48FDF700F92346009618 +:107F6800019402940394084808499622FDF7F6F80C +:107F780001232B7004B070BD4C5D0020505D0020C3 +:107F880028490108F17E0008917E0008304901085F +:107F9800014B1878704700BF4C5D002038B5094B7D +:107FA80053F8202005461C4622B1074807495C22A1 +:107FB80002F06AFC012020210022FDF785FE44F82A +:107FC800250038BD085D0020384901084F490108DF +:107FD80070B50E4B53F8202006460D461C4622B9B4 +:107FE8000B480C496C2202F04FFC25B90A48094994 +:107FF8006D2202F049FC54F8260029464FF0FF3262 +:108008000023BDE87040FEF72FB800BF085D0020D0 +:10801800624901084F4901086D68010808B5034B1A +:108028001868FEF727F9C0F13C0008BD505D002034 +:108038001028DCBF014B43F820107047545D002026 +:1080480010B5044620B90B480B49B72202F01CFCB6 +:1080580023781E2B04D909480749B82202F014FCDA +:10806800074B0022186821461346BDE81040FDF76B +:108078005FBE00BF6D6801084F49010871490108DA +:10808800505D002008B5064B00211868FDF7DCFD9F +:10809800044B1B681B6903B19847002008BD00BF4B +:1080A800505D002048000020034B1B68DB6803B1CB +:1080B80018470120704700BF4800002070B5094CE0 +:1080C8002368054613B11B68002098470DB1256049 +:1080D80001E0054B2360236801201B68BDE8704060 +:1080E800184700BF480000203400002038B50C4C69 +:1080F8004FF0FF330021054644F8203005F03AFAE6 +:10810800084A282303FB0522002352F823100131D3 +:1081180002D044F8253038BD01330A2BF5D138BDDB +:10812800605E0020945D00202DE9F74F8046FEF741 +:10813800D9FA2C4B1B78002B50D0C5B22A4B53F8D8 +:108148002530581C4AD00A2606FB0536DFF8A490CD +:10815800264A59F8264052F823B0254F0021631CBF +:108168000BEBC40A49F8263038680B464FF0FF324B +:10817800FDF77AFFDAF80430991C08D05A1C0AD1A6 +:10818800284649F826300024FFF7B0FF1EE00024F7 +:1081980049F826401AE01BF83410284605F0EAF999 +:1081A800DAF80420002482B12346042100944046D2 +:1081B800FEF74CF9FDF70CF90094024623464046B9 +:1081C8000121FEF743F9012400E014460021386834 +:1081D8000A460B46FDF7ACFD002CAFD003B0BDE856 +:1081E800F08F00BF5C5E0020605E002090490108AF +:1081F800885E0020945D002037B51E4B1C781D4614 +:10820800ACBB05F0BDF923461B4A4FF0FF3142F8DD +:1082180023101A49282202FB031100224FF0FF30D5 +:1082280041F8220001320A2AF8D10133052BEBD19B +:108238000024134B0093134823464FF47A7100220D +:10824800FEF7DCF8104B43F824000134052CF0D17C +:10825800032201200021FDF737FD0C4A106020B1F0 +:1082680000210A460B46FDF763FD01232B7003B07E +:1082780030BD00BF5D5E0020605E0020945D002080 +:1082880031810008B8490108745E0020885E00202A +:1082980010B5044B1C7805F0A9F9034B01221A709C +:1082A800204010BD5D5E00205C5E0020F8B50546EC +:1082B8000024174B53F824308B4223D1154F00214B +:1082C8000B464FF0FF323868FDF7CEFE0A2303FB5A +:1082D8000543114A0026284642F82360FFF706FFA7 +:1082E8003346386831463246FDF722FD0B4B53F8CA +:1082F8002530A3420AD10A4B53F82500BDE8F840BF +:10830800FFF712BF01340A2CD3D1F8BDF8BD00BF66 +:1083180090490108885E0020945D0020605E00207E +:10832800745E00204160C2607047000070B5054669 +:108338000024144B53F824308B421FD1124E0021D5 +:108348000B4630684FF0FF32FDF78EFE0A2303FB21 +:1083580005440E4B4FF0FF32284643F82420FFF720 +:10836800C5FE002130680B460A46FDF7E1FC084BC4 +:1083780053F82500BDE87040FFF7D6BE01340A2C3B +:10838800D7D170BD90490108885E0020945D002017 +:10839800745E002008B54FF05F0383F31188BFF3C4 +:1083A8006F8FBFF34F8F0649064802F0ABFB0220E0 +:1083B800012105F0DFF80420012105F0DBF8FEE7D4 +:1083C800C4490108B587000808B54FF05F0383F377 +:1083D8001188BFF36F8FBFF34F8F0649064802F02D +:1083E80091FB0220012105F0C5F80420012105F0C8 +:1083F800C1F8FEE7D5490108B58700087047012094 +:1084080070470000024B1B680BB11B681847704788 +:108418008C5E0020024B1B680BB15B6818477047E5 +:108428008C5E0020014B1860704700BF8C5E0020F6 +:108438001FB5022300930023019302930393044979 +:1084480004484FF49672FCF789FE05B05DF804FB0A +:10845800E74901088185000873B5264C2578002D69 +:1084680046D10120FDF72CFD234B244E18604FF018 +:10847800FF322B462946FDF7F7FDFFF759FD00F0BF +:1084880071F91F491F4802F03DFB1F491D4802F0C2 +:1084980039FB1E491E4B0D681E4836781E491A685E +:1084A8001E4B002E18BF01461B6816480191009507 +:1084B8001B4902F027FB1B4B1B491B6800931B4BF6 +:1084C8001048B3F900300193194B1A68043B1B6834 +:1084D80002F018FB09F0DAFB02F080F908F058FC0A +:1084E800FFF78AFE07F050FCFFF788FF012323708F +:1084F80002B070BD915E0020146C0020454E01084A +:10850800FD490108B5870008204A0108E00100205C +:10851800E4010020EE490108F7490108DC010020C8 +:10852800474A0108107AFF1F614A0108227AFF1F93 +:10853800187AFF1F38B5084B1C78FFF7A9FE0546C7 +:1085480007F048FC2840044002F054F90440FFF7C3 +:1085580056FF204038BD00BF915E002008B5054B8E +:10856800002118680A460B46FDF7E2FBBDE8084003 +:1085780006F086BD146C002038B505F001F800201F +:10858800012104F0F7FF06F077FBFFF765FF0121F3 +:10859800022004F0EFFF00F0A3F800F0FDFC01F06A +:1085A800F9FC08F0D1F908F099F900F0A3FC06F0FD +:1085B80079FDFFF7BFFF044609F014FC2040C4B260 +:1085C80000F0A8F8044000F007FD044001F016FD93 +:1085D800044008F0D7F9044008F0AAF9044000F074 +:1085E800ABFC04401F4D06F035FD84B178B1012481 +:1085F8002C70FFF7B3FF052008F0A0F904201A49F2 +:10860800FFF754FE20461949FFF750FE1CE00023EF +:108618002B70FFF78FFF88B104201449FFF746FE3F +:108628004FF4FA60FDF74CF82B78002BF4D0104982 +:10863800104802F067FAFFF791FF05E004F0A0FF89 +:108648000420012104F096FFFEF764F90A49024666 +:10865800084802F057FA02F0D5F84FF0FF30FDF75E +:108668002FF8FAE7905E0020C40000204C0000209C +:108678008F4A0108B5870008A34A010810B50B4BBB +:108688001B781BB90220FDF71BF8F8E7084C0021FE +:108698000B4620684FF0FF32FDF7E6FC002120680A +:1086A8000A460B46BDE81040FDF742BB915E00202C +:1086B800146C0020014B1870704700BF925E0020B8 +:1086C80008B5FCF785FE054A1368C31A502B02D972 +:1086D8001060FEF76DFD30BF08BD00BF945E00203E +:1086E80010B50B4C23788BB906F036FE07F0D2FD97 +:1086F80007F03AFEFFF7E2FC00F022F908F010F864 +:1087080001F088FF00F04EF90123237010BD00BF6F +:10871800985E002038B50B4B1C7807F083FD0546A2 +:10872800FFF736FC2840044000F01AF9044008F02E +:1087380007F8044000F034F8044000F079F92040CC +:1087480038BD00BF985E002010B5054C2046FFF7E5 +:1087580077FC01284FF000030CBF2370184610BDAA +:10876800186C002038B50B4B1C781D468CB90A4B89 +:108778000322012021461C705C70FDF7A5FA074A08 +:10878800106020B1214622462346FDF7D1FA012385 +:108798002B7038BDA05E0020186C00209C5E002065 +:1087A800014B1878704700BFA05E002070B51C4BC5 +:1087B8000646187890B31B4D002128684FF0FF3209 +:1087C8000B46FDF751FC012827D1174C23781D2BA8 +:1087D80004D9FFF723FC012817D109E0E218013377 +:1087E800DBB20A2E96702370F3D01E2BF1D00EE068 +:1087F800207800231A18002A07DD0C49194422445E +:1088080009799170013B5A1DF4D1FFF79DFF0021B2 +:1088180028680A460B46FDF78BFAF0B270BD00BF18 +:10882800A05E00209C5E0020186C0020094B010807 +:10883800002343608360C3600361074BC362074B37 +:1088480080ED000AC0ED050A80ED061AC0ED071A92 +:10885800036380ED0D2A704700409C4500409CC58D +:1088680029B1D0ED007A37EEC00A80ED010A90ED0B +:10887800037A90ED016A90ED0D0AD0ED0B7AA6EE21 +:10888800007AB4EEE77AF1EE10FA80ED037A06DCAE +:10889800D0ED0C7AB4EEE77AF1EE10FA01D5C0ED1E +:1088A800037AD0ED027AD0ED066A90ED057A80ED74 +:1088B800026A76EE677A26EE077AC7EE807A90ED3E +:1088C800030AC0ED047A26EE800AD0ED076A80ED2F +:1088D800090A67EEA67A37EE000A80ED087AC0ED3D +:1088E8000A7A30EE270A704780ED0B0A704700239A +:1088F80043608360C3600361704780ED010A70477D +:1089080080ED000A7047000038B5437813F0030380 +:1089180005460FD0012B00D038BD04461E2204F8AE +:10892800022B002120460BF0B2FA204603490BF037 +:10893800B6FA2846BDE83840FFF782BB0E4B01085F +:1089480010B5054C23782BB90F200449FFF770FBAD +:108958000123237010BD00BFA15E0020118900080B +:10896800014B1878704700BFA15E002030B50B4B53 +:108978001C680B4B00221D681346A34209DA0C2120 +:1089880059436956002902DB824205D0013201337E +:10899800F3E74FF0FF3030BD184630BDB45E00201D +:1089A800AC5E0020F0B5184D2C7885B04CBB17484C +:1089B8001749184B184E194F3060091A8A1053433B +:1089C8003B6002F0ADF8164A164B3F6836681168EE +:1089D80018602346BB4207DA0C205843013330564F +:1089E8000028A8BF0131F5E70023012411600E48D3 +:1089F80000940193029303930C499622FCF7AEFB73 +:108A08002C7005B0F0BD00BFB05E00202C6E0108D0 +:108A1800D0720108ABAAAAAAAC5E0020B45E0020FE +:108A2800A45E0020A85E0020358B0008214B0108B9 +:108A3800014B1878704700BFB05E00202DE9F04167 +:108A480018B101281ED0BDE8F081314B314A324CB3 +:108A58001F68136894F803E0304D04330146B942A7 +:108A68004BDA13F8046C16F0800F03D0F50705D520 +:108A78001D6804E0704513D0013000E0274D013136 +:108A88000C33ECE7244B20225A7006221A70244A31 +:108A980098701268DA70234A10685860184633E0F4 +:108AA800202363700023A3700C231268E0704B43EB +:108AB800D7182846D35C23710BF0F9F92946421CD4 +:108AC80019480BF0D9F928460BF0F1F9D7F80480CA +:108AD800064640460BF0EBF92644421C4146B01DC1 +:108AE8000BF0CAF928460BF0E2F9054678680BF056 +:108AF800DEF928440530207005E020236370002348 +:108B0800A370012323700448BDE8F041FFF798BA29 +:108B1800B45E0020AC5E0020386C0020D449010807 +:108B2800A45E0020A85E00203D6C00202DE9F74FD0 +:108B38000220FFF733FA804C02202146FFF748FA5B +:108B48006678A57816F00306274603D12846FFF76E +:108B580075FFF0E7012E30D12846FFF707FF002800 +:108B680005DAFF23A3700223E570237130E00C239C +:108B78005843724B1B681A5C191802F00302022A48 +:108B88008B680CD0032A0FD0012A15BF1B781B88CD +:108B9800E370A4F8033014BF022303230BE01B681F +:108BA800C4F80330052306E01A68C4F803205A689D +:108BB800C4F80720092323702EE0022E2ED1284660 +:108BC800FFF7D4FE002807DAFF23A370E5702671AB +:108BD8000323237020469CE00C235843574B1B6803 +:108BE8001A181B5C5906A6D403F00303022B9268DB +:108BF80009D0032B0BD0012B15BFE378B4F8033051 +:108C08001370138008E0D4F80330136004E054F8BC +:108C1800031F636882E80A0047487AE0002D8AD17A +:108C28002B46FA18927802B9013501331E2BF8D178 +:108C3800012D7EDD42480BF03AF907EB000808F1F8 +:108C48000408814640460BF032F900EB0903009313 +:108C5800FB18DFF8F8905E793A4B1B680193374BA5 +:108C6800D3F800A04FF0000B5546019B9B4518DA3E +:108C780029780A0604D5CB070DD5D5F804900CE061 +:108C880068684146FCF7F0F938B948462C49FCF7C2 +:108C9800EBF910B907E0DFF8B4900BF1010B0C35D4 +:108CA800E3E7022520E00C2303FB0BF30AEB0302A6 +:108CB8001AF803309E423AD106F0400303F0FF054C +:108CC800002B32D1009B9168043306F003063B4425 +:108CD800022E03F102001FD0032E21D0012E15BF52 +:108CE8009B785B880B700B8015480BF0E0F8064604 +:108CF80040460BF0DCF837443844457110480BF017 +:108D0800D6F8054640460BF0D2F8284404302070C7 +:108D18000D48FFF795F90EE7D3F802300B60E3E74B +:108D2800D0E90023C1E90023DEE70D25DCE716259D +:108D3800DAE703B0BDE8F08F386C0020AC5E0020A5 +:108D48003B6C0020B45E0020386C0020D449010838 +:108D580007B50420FFF722F9604C04202146FFF7ED +:108D680037F9627802F00302012A23464CD0022A1E +:108D780000F08280002AEFD1A378012B02D0022BC9 +:108D88000BD0E9E7A370564B40221B786270022291 +:108D980013442270E37020469CE0E0782370402260 +:108DA8006270A37020B920714E4B41F6FF7205E046 +:108DB800012810D1102323714A4B12221A604A4A03 +:108DC80018681368C4F809305368C4F80D30C4F83B +:108DD80005000F237CE0454D0238C0B2294607F054 +:108DE8006DFB002875D03F4A70210123116010687F +:108DF80023712A682378C4F809206A68C4F8050032 +:108E0800C4F80D200D3363E0D4F80300A278019074 +:108E180041216170E579019962B96A18B2F5005F7C +:108E280020D204F1080089B22A4605F011FEC8B123 +:108E3800002318E0012A0AD16A18122A12D82C4BEA +:108E480004F1080019442A460BF016F8EFE76818F1 +:108E5800702807D8901E89B22A460833C0B207F096 +:108E680059FBE4E705231D4AE37113B9063515706C +:108E78002FE0062313702CE0D4F803002278019029 +:108E88004221053A6170A5780199D2B2501845B9C6 +:108E9800B0F5005F19D2E01D89B205F0F1FDA0B16F +:108EA80008E0012D08D1122804D811480844E11D12 +:108EB8000AF0E2FF002309E0702806D8A81E89B24C +:108EC8000733C0B207F08AFBE9E70523E3710623FD +:108ED80023700248FFF7B4F83EE700BFC05E0020E9 +:108EE800E55E0020E05E00202B4B0108B85E002004 +:108EF8006078002030B50C4D2C7885B08CB90B48C3 +:108F080007F0BAFA003018BF0120012328708DE855 +:108F18001800029403940648064996222346FCF753 +:108F28001DF905B030BD00BFE45E0020E55E0020FD +:108F3800598D0008274B0108014B1878704700BF6E +:108F4800E45E002070B5104C10492368B3FA83F32F +:108F58000E225B09851C02FB03120E3055F8046BC8 +:108F680042F8046B8542F9D1288810800E222360CC +:108F780002FB03139B890BB9054A1370FCF728FA07 +:108F8800044B186070BD00BFE85E0020EC5E002056 +:108F98000B5F0020105F002010B50A4C23787BB9C6 +:108FA800FEF7C6FF03200849FFF742F8FCF710FA5E +:108FB800064B074A186001231370064A2370137082 +:108FC80010BD00BF0C5F00204D8F0008105F00200F +:108FD800085F00200B5F002008B5FEF7D9FF014BA2 +:108FE800187808BD0C5F002070B5114B114C1E6835 +:108FF800FCF7EEF9104B1B68C01AB0F5FA7F14D9CC +:109008000E4D0E2303FB06F2A9180023B0F5FA6FE4 +:10901800AB504B608B6008D9094A0B731370094A2F +:109028004B7301232370137070BD0023237070BD30 +:10903800E85E0020085F0020105F0020EC5E002042 +:10904800E65E00200B5F002008B5FCF7C1F9024B73 +:109058001B68C01A08BD00BF105F002030B5064B62 +:109068001C68064B0E2505FB04331C680460586811 +:1090780008609B68136030BDE85E0020EC5E00204D +:1090880030B5144B1C7804701348057804460DB9A4 +:10909800187800E0002000F001000870197889B104 +:1090A8000E499FED0F7A08680E490E2505FB001141 +:1090B800898907EE901AF8EE677A77EEC77AC7EED5 +:1090C800877A01E0DFED087AC2ED007A1B78237019 +:1090D80030BD00BFE65E0020095F0020E85E00208A +:1090E80000FEFF46EC5E002000000000044B1B78E9 +:1090F8000370044B1B780B70034B1B78137070477D +:109108008D0100208E0100200A5F00200B4B1A6899 +:109118000B4B0E2101FB023399890A4B1B780BB1CB +:10912800002307E0B1F57A7FFAD94EF66023994219 +:1091380098BF0B460380FFF757BF00BFE85E0020CB +:10914800EC5E00200B5F0020014B1878704700BFD1 +:109158008C010020014B1878704700BF145F002075 +:1091680010B5394C2378002B6DD19FED380A38485B +:10917800DFED380A9FED382AB0EE401AF0EE401ABB +:10918800FFF756FB9FED310A3448DFED320A9FEDB9 +:10919800322AB0EE401AF0EE401AFFF749FB9FED75 +:1091A8002B0ADFED2C0A9FED2E1A9FED2B2A2D4856 +:1091B800F0EE401AFFF73CFB25489FED2B0AFFF71E +:1091C80093FB26489FED280AFFF78EFB25489FED65 +:1091D800270AFFF789FB9FED1D0A25489FED1E2AE8 +:1091E800F0EE401AF0EE0C0AB0EE001AFFF720FB82 +:1091F8009FED160A1F489FED182AF0EE401AF0EE70 +:109208000C0AB0EE001AFFF713FBF2EE040AB7EEF1 +:10921800001ADFED191A9FED102A18489FED0B0A66 +:10922800FFF706FB1248B3EE040AFFF75DFB11488F +:10923800B3EE040AFFF758FB10489FED110AFFF739 +:1092480053FB0123237010BD155F002000000000B0 +:10925800406D002000008C426F12033BD06C002050 +:109268009A998541946C00203333054233B32643E1 +:10927800586C0020086D00203333B33E786D002011 +:109288000000B443014B1878704700BF155F0020F9 +:1092980000B52DED068B4048B0EE408A83B0B0EEA5 +:1092A800610AF0EE609AF0EE418AB0EE42AAB0EEA2 +:1092B800629AFFF725FBB0EE480A37489FED378AD8 +:1092C8000121FFF7CDFAB4EEC80AF1EE10FA0DDC71 +:1092D800DFED337AB4EEE70AF1EE10FA09D4BDEE09 +:1092E800C00A8DED010ABDF8043004E047F6FF73AB +:1092F80001E048F201032B4A2B481380B0EE4A0ADA +:10930800FFF7FEFA2848B0EE690A0121FFF7A8FA2C +:10931800B4EEC80AF1EE10FA0DDCDFED217AB4EEF6 +:10932800E70AF1EE10FA09D4BDEEC00A8DED010A84 +:10933800BDF8043004E047F6FF7301E048F201038A +:109348001A4A1B481380B0EE490AFFF7D9FA1848A1 +:10935800B0EE680A0121FFF783FAB4EEC80AF1EE0D +:1093680010FA0DDCDFED0E7AB4EEE70AF1EE10FA32 +:1093780009D4BDEEC00A8DED010ABDF8043004E041 +:1093880047F6FF7301E048F201030A4A138003B06D +:10939800BDEC068B5DF804FB406D002000FEFF4627 +:1093A80000FEFFC6CC6C0020D06C0020926C002020 +:1093B800946C0020906C002070B506462DED068B4D +:1093C8002648B0EE40AAB0EE610AB0EE609AF0EE20 +:1093D800418AF0EE429AB0EE628A14460D46FFF7D3 +:1093E8008FFA01211D48B0EE4A0AFFF739FA1C48E6 +:1093F80086ED000AB0EE690AFFF782FA1848B0EE67 +:10940800490A0121FFF72CFADFED167A85ED000AEB +:1094180038EE680AB4EEE70AF1EE10FA04DDDFED83 +:10942800127A30EE670A0AE0DFED107AB4EEE70A46 +:10943800F1EE10FA44BFDFED0C7A30EE270A0C4843 +:10944800FFF75BFAB0EE680A09480021FFF708FA4F +:10945800BDEC068B84ED000A70BD00BF586C00207F +:10946800086D0020000034430000B443000034C3FA +:10947800786D002008B50A48FFF739FA0948FFF760 +:1094880036FA0948FFF733FA0848FFF730FA084870 +:10949800FFF72DFA0748BDE80840FFF728BA00BFD4 +:1094A800586C0020086D0020786D0020406D002069 +:1094B800D06C0020946C0020044B1B880380044B64 +:1094C8001B880B80034B1B8813807047CC6C0020D3 +:1094D800926C0020906C0020024B1A780AB9012285 +:1094E8001A7070471C5F0020014B1878704700BF46 +:1094F8001C5F0020DFED817A9FED817A8148824AE6 +:10950800824920EE270A60EEA70A21EE271AF5EE17 +:10951800401AF1EE10FAF0B580EE070A7C4C80EEA6 +:10952800875A81EE071AF6EE004AF7EE087A09D153 +:10953800B5EE402AF1EE10FA04D1F5EE402AF1EE2C +:1095480010FA7CD062EE026A94ED004AD1ED005A1E +:10955800704F714EE1EEA16A0025E2EEA26A16EEA6 +:10956800903A5B10C3F1BE4303F55D1303F5CE5388 +:109578001F3307EE103A66EEA46A06EE103A67EE5D +:10958800666AB0EE677AA6EE867A644BD0ED006A1A +:1095980026EE077A25EEC46A61EE871A22EE072ABC +:1095A80062EE872A92ED007A65EE875AA6EE876A00 +:1095B800E4EE265AFEEE006AE4EE046A25EEE24A7C +:1095C800E7EE076A93ED007A554BA2EE264AB5EE10 +:1095D800C07A66EEE16A26EE422AF1EE10FAE2EE71 +:1095E800866AA1EEA52A1EDD27EE046AD7ED003AA9 +:1095F800D6ED005AE6EE033A27EE266A27EE027AFF +:10960800E6EE035A93ED006AC7ED003AA7EE036A47 +:10961800C6ED005A83ED006A30EE230A35EE255A6E +:1096280031EE061A02E03D6035601D603D4B93ED5A +:10963800007AA7EE040AA7EE265AA7EE021A23EE2E +:10964800243A91ED004AD4ED003A92ED007A21EEE9 +:10965800031A20EE030A24EE016A65EE030AA3EE5C +:10966800806A90ED005A60EEC45AF1EE476AE5EE62 +:10967800405AA6EEA06AE6EE815A35EE066A61EE19 +:10968800456A25EE205AE3EEA06AA3EE815A73EEEE +:10969800A55AA4EE405AE7EE006A37EE055A26EEC0 +:1096A800067A74EE266AA5EEA57AA6EEA67AA5EE47 +:1096B800057A17EE103A5B10C3F1BE4303F55D134C +:1096C80003F5CE531F3327EE247A04EE903A24EEA6 +:1096D800C77AE7EE247A64EEA77A65EEA75A26EEF3 +:1096E800276A66EEA76A25EE275AC4ED005A80ED70 +:1096F800006AC1ED006A82ED005AF0BDDB0F4940F7 +:1097080000003443205F0020285F0020245F0020F1 +:10971800900100202C5F0020305F00209401002081 +:10972800185F00209801002070B52DED068B364B90 +:10973800D3ED007A354BD3ED006A354B93ED006AD3 +:10974800344B93ED000A20EE267A20EE468AA6EEE8 +:10975800277A04460D46A7EEA68A164677EE079A9C +:1097680027EEA75A26EE067A38EE088A60EE005AE7 +:1097780037EE459AF7EE004A66EEA60A39EE659A84 +:10978800B4EEE48AF1EE10FA39EE209A09DCFFEE25 +:10979800004AB4EE648AF1EE10FA48BFB0EE648A6B +:1097A80001E0B0EE648A27EE800A37EE057AA6EE6D +:1097B800260A37EE657A30EE000A77EE600A08F07E +:1097C80045FDDFED158A9FED15AA20EE280A80EEEB +:1097D8000A0A86ED000AB0EE480A08F0D9FC20EE25 +:1097E800280AF0EE490A80EE0A0A85ED000AB0EE72 +:1097F800690A08F02BFD20EE280A80EE0A0ABDEC63 +:10980800068B84ED000A70BD205F0020285F0020D1 +:1098180090010020245F002000003443DB0F494002 +:10982800164B93ED007A164B93ED006A154B93EDAA +:10983800005A154BD3ED005A65EE867A65EEC56A77 +:10984800E5EE077AE7EE066A27EE477A77EEA77A1B +:10985800A5EE057A60EEA70AA5EEE57A76EEA66A89 +:10986800F0EE607AE0EE267AA6EE067AB7EE000A07 +:10987800E1EE077A37EEC00A704700BF205F00208C +:10988800285F002090010020245F0020F0EEC07ABD +:10989800F4EEE07AF1EE10FA0BD4B5EEC00AF1EE70 +:1098A80010FA02DD30EE600A704704D530EE200A67 +:1098B80070479FED010A7047000000002DE9F04154 +:1098C8004E10851B5210AC181C444FF6FF7724EA43 +:1098D800E474BC421B49DFF87880A5EB0205A8BFF9 +:1098E8003C460644ED1A0C6025EAE575B11ABD42FE +:1098F800D4BFC8F80050C8F800703244124D134E57 +:10990800194421EAE171D31A23EAE373B942D4BFB7 +:1099180029602F600020A1B2BB42D4BF33603760FA +:10992800FEF7B2F9B8F800100120FEF7ADF9298862 +:109938000220FEF7A9F931880320BDE8F041FEF7BF +:10994800A3B900BFC46D0020B06D0020BC6D00201D +:10995800B86D00202DE9F04F2DED068B002085B065 +:109968000321FBF7EDFEFEF789FE04208049DFEDB9 +:10997800818AFEF79BFCFBF72BFD4FF00008039054 +:109988004546B0EE689A03A80221FBF737FE7A48ED +:109998007A497B4A06F098F906F090F90028F2D047 +:1099A800DFF83092774878494A46FFF757FB0DF1C0 +:1099B80009000DF10A010DF10B02FFF797FB9DF865 +:1099C8000B309BBB18EE900AFAF73EFD0646D9F815 +:1099D80000000F46FAF738FD00226C4BFAF7B2FE8A +:1099E80002460B4630463946FAF7CEFBFBF71AF823 +:1099F80008EE900ADFED667AF4EEE78AF1EE10FAE7 +:109A080004DDDFED647A78EEE78AF3E7DFED627A6A +:109A1800F4EEE78AF1EE10FA04D5DFED5E7A78EE1F +:109A2800A78AF3E7F1EE687AC9ED007A524C002D67 +:109A380000F0D280514D9FED598A594FD5ED001A4B +:109A480095ED012AD5ED022A94ED000AD4ED010A1C +:109A580094ED021A4B4EB0EE483AFFF74BFD5148D1 +:109A680051493A46FFF760FE95ED021AD5ED010A15 +:109A780095ED000AFFF7D4FED5ED017AD5ED006A21 +:109A880095ED027A494B404D83ED000A67EEA77ABF +:109A9800474BE6EEA67AE7EE077AC3ED007A454B28 +:109AA800D3ED000AFFF7F2FE434BD3ED007AE0EE68 +:109AB800087AC3ED007AFFF747FBA0B1012840D12F +:109AC8009FED3E7AD5ED007AD6ED006A67EE877A8B +:109AD800B0EE676A96EE876AE6EE877A86ED006AE8 +:109AE800C5ED007A2DE0FFF735FBD6ED009A344B33 +:109AF80008B13A681A6093ED008AD7ED007A37EE1C +:109B0800C88ADFED307A68EE277A9FED218A87EEE2 +:109B1800888AB0EE480A08F08BFAB0EE40AAB0EE98 +:109B2800480A08F0C9FA95ED007A60EE477AE9EE3E +:109B38008A7A69EE809AC6ED007AE7EE0A9AC5ED50 +:109B4800009A184BD9ED002A93ED000A164B95EDB3 +:109B5800002AD3ED000A97ED001AD6ED001A1A482C +:109B68001A491B4AF1EE622AFFF726FC002534E069 +:109B78004C00002000000000C45F0020405F00206F +:109B88004C5F0020046000205C5F002000407F40A4 +:109B9800000034430000B443000034C36F12833B19 +:109BA800585F0020345F0020DC5F0020D05F002079 +:109BB800D45F0020D4010020C05F0020F304353FAB +:109BC800BC5F0020DB0F4940F45F0020685F002085 +:109BD800EC5F0020FC5F0020012506F0B1F8C04EC4 +:109BE800002800F0318108F10108B8F1040F40F2B3 +:109BF8002B81BC4FBC49BD4ADFF88C93DFF88C83BE +:109C08003046FFF73DFA3A46B949BA4804F04AFDEA +:109C1800B94BD7ED007A93ED000AB84BD9ED006A3D +:109C280093ED007AB64BB7EE008A77EEC07A38EE3D +:109C3800470AC7ED007A27EE800AA6EE870A93ED59 +:109C4800007AB04B89ED000A78EE476A67EEA67A8B +:109C5800D3ED006AE6EE877AC3ED007AAA4B30EEC0 +:109C6800670AD3ED000AFFF711FEA84AA84BD2ED08 +:109C7800007A93ED007A88ED000AF1EE676AF4EE57 +:109C8800C76AF1EE10FAD4BFB0EE476AB0EE666A62 +:109C9800F4EEC67AF1EE10FA08D4F4EEC76AF1EEE3 +:109CA80010FAD4BFF0EE477AF0EE667A994ADFF8F8 +:109CB800E0B292ED007A78EE476A20EE260AA7EE27 +:109CC800870A83ED000A8BED000A06F069F910B9DE +:109CD800914B83ED039A844B904F1A7802B3904AC4 +:109CE800DFF834A2D2ED000A8E4A99ED000A92ED0F +:109CF800001A8D4ADAED039AD2ED001A9FED8B2AED +:109D080087ED000A5046FEF793FD504699ED000A8C +:109D1800CAED039A0021FEF7A3FD854A82ED000AE9 +:109D28003278DFF80CA28349002A00F085806F4A58 +:109D38007948D2ED007A804A019192ED000A87EEC7 +:109D4800800AD7ED007A30EE270A87ED000AFEF781 +:109D5800D7FDD7ED007A794B99ED000AD3ED000ACB +:109D680030EE670AFFF792FD754B0199D3ED007A43 +:109D7800B1EE677AB4EEC07AF1EE10FAD4BFF0EE25 +:109D8800406AF0EE476AF4EEE67AF1EE10FA08D48B +:109D9800B4EEC07AF1EE10FAD4BFF0EE407AF0EEED +:109DA800477AB1EE670A5C48C1ED007AFEF7A5FD77 +:109DB800644BD8ED007A93ED00AA634B9BED007AD3 +:109DC800D3ED009A614B544899ED000ADAED00AAE8 +:109DD80067EEA99AD3ED007A0021E7EE279AFEF7FD +:109DE8003FFD38EE4A8A39EE800A5948594B28EE29 +:109DF800000A90ED008A1A88574BAAEE2A0A198899 +:109E0800564B8AED000A20EE080A1B88BDEEC00AF0 +:109E180010EE100A034483F3100398B2814238BF4E +:109E28000B469A4203DC8842024628BF0A464C4B3E +:109E38004FF000081A8007E0384B81ED009A83ED57 +:109E4800009A8AED009A90469DF80930454A13B960 +:109E5800454B1B6813609DF80A10444B11B94449DF +:109E68000968196093ED002AD4ED010A414BD2ED3F +:109E7800001AD3ED002A94ED000A94ED021AF1EECF +:109E8800600AFFF705FA3C483C493D4AFFF714FBD6 +:109E980033781BB93248FFF739F905E005F050FF70 +:109EA8000028F7D0FFF7A0F82D4B188860B1344B85 +:109EB800314A1B88B2F90010304A5B42B2F90020DF +:109EC8001BB2FFF7FBFC5EE5034601460246FFF7BF +:109ED800F5FCFFF7CFFA2B4BD3ED008A53E500BF13 +:109EE800F05F0020B85F002000600020E85F0020DD +:109EF800605F0020705F00207C5F0020A8010020C8 +:109F0800D8010020F85F0020C4010020CC01002007 +:109F1800C05F0020B0010020805F0020D001002039 +:109F2800C0010020BC0100206C5F00200AD7233C40 +:109F3800E05F0020745F0020A4010020E45F00209F +:109F4800AC0100209C010020385F0020C8010020DF +:109F5800B80100207A5F0020B4010020A001002091 +:109F6800B66D0020F45F002004600020685F0020C8 +:109F78005C5F0020EC5F0020C06D0020C86D0020F1 +:109F8800B46D0020585F0020D85F00203C5F00209F +:109F9800645F002030B5124D2C7885B0ECB91148BB +:109FA800FDF7ECFD05F074FBFFF796FAFFF7D8F81C +:109FB8000D4A0E480E49002313600E4A13600E4ADC +:109FC800136004238DE818000294234603944FF489 +:109FD800E172FBF7C3F801232B7005B030BD00BF59 +:109FE800785F002014000020F45F00205D990008CD +:109FF800FC4B0108685F0020EC5F002010B5FDF7FE +:10A0080013FF044605F018FC2040C4B2FFF76CFAB1 +:10A018000440FFF737F9204010BD00002DE9F34157 +:10A0280000260C23184D73435A59824204D0013636 +:10A03800082EF6D1022024E02B449C6824B1236822 +:10A048000022A2601C46F9E70C2707FB0657786830 +:10A0580088B14FF0FF38032122462346CDF800800F +:10A06800FCF7F4F9CDF800807868052122462346EC +:10A07800FCF7ECF97C600C235E434FF0FF33AB51E7 +:10A08800002002B0BDE8F0814863002013B500212C +:10A098000C220C4C02FB01F31A59824204D0013104 +:10A0A8000829F5D102200AE023444FF0FF3200923C +:10A0B8000022586803211346FCF7C8F9002002B0B3 +:10A0C80010BD00BF4863002038B5124B124D1B78F5 +:10A0D8000BB900230DE000242859431C05D0FFF7D5 +:10A0E800D5FF0D4BE058FFF799FF0C34602CF3D1E6 +:10A0F800EFE74FF0FF32EA500C33602BF9D1002321 +:10A10800064A1A440C330021B3F5407F9160F7D119 +:10A1180038BD00BFB06300204863002008600020FD +:10A1280008B5FCF7DFFABDE808400146014800F031 +:10A138007FBB00BFD1A400082DE9F74F0191002192 +:10A148000C23414A4B439C58844204D001310829CE +:10A15800F6D1022075E01A443C4B1B6800933C4B37 +:10A16800D3F800800021019B994224DA97680025E2 +:10A178003B46384C2BB118791B680009205C054414 +:10A18800F7E7354810F811C00CF00F0E4E0014F820 +:10A198000E402C441E2C00EB060A81460DDCDFF82D +:10A1A800BCE00C2505FB03E4A06840B10133402B5B +:10A1B800F5D1284645E0002043E0072041E09AF821 +:10A1C80001A0BAF1FF0F10D00646009DAE42C0DADA +:10A1D8000C2505FB06F918F909B0BBF1000F02DBE5 +:10A1E80050451DD001300136EFE720794FEA1C15A4 +:10A1F800023665F303004E446CF30710A660207125 +:10A2080002310C20434300204EF803000FB994603C +:10A2180004E03B680BB11F46FBE73C600131A2E755 +:10A22800002E96DB08EB090005FB03E58068A860B3 +:10A2380018F80960287966F303006CF30710287191 +:10A24800DFE703B0BDE8F08F48630020AC6300206F +:10A25800B4630020D34D01080C630020086000207F +:10A268002DE99F480520FDF799FE8A4C8A4E214624 +:10A278000520FDF7ADFE00210B4630684FF0FF3298 +:10A28800FBF7F2FE637813F0030F274663D1A37838 +:10A298008BB1012B5FD1A370804B1B68E370804B9F +:10A2A800502218686270402308226060227022726F +:10A2B800637220464DE07B4A7B48D2F800C00268B2 +:10A2C80094F80380794D04321946614580F2DB80A9 +:10A2D80012F804EC1EF0800F04D01EF0010F05D018 +:10A2E800156804E0434505D0013300E0704D0131A5 +:10A2F8000C32EAE750226270E37000220C234B43D1 +:10A30800A2700268284602EB0309D35C237109F0A6 +:10A31800CEFD2946421C674809F0AEFD284609F0E3 +:10A32800C6FDD9F804A08046504609F0C0FD474450 +:10A33800421C5146B81D09F09FFD284609F0B7FD9B +:10A348000546D9F8040009F0B2FD2844053020700C +:10A358005048FDF775FE637803F00303012B67D1BE +:10A368004C4B9B78052B5AD8DFE803F0031F262AAD +:10A37800515594F803A094F800B000214E4BCA58E8 +:10A3880092451A464DD00C316029F7D100230C258F +:10A3980005FB03F8DFF8209152F808C0BCF1FF3F35 +:10A3A8001CD00133082BF2D12FE02178E078023954 +:10A3B8004908FFF7C1FE35E0E078FFF72FFE31E0EE +:10A3C800E178207900220C233B4F5343DD598D421D +:10A3D80039D00132082AF6D1022023E009EB080718 +:10A3E800364B49F808A0364800934FF47A713B463B +:10A3F8000122CDF80CC0FCF701F800237860BB609F +:10A40800DDF80CC0D8B949F808C028460AE0E07859 +:10A41800FFF73CFE06E0FFF757FE002002E00820A9 +:10A4280000E01120207103231A482370FDF708FE6D +:10A43800002130680A460B46FBF77AFC15E7ABF1BA +:10A4480002015046B4E700EB800045001F4415D0D8 +:10A458004FF06408CDF800802A460421002378686C +:10A46800FBF7F4FF7D68FAF7B3FFCDF800800246EA +:10A47800012128460023FBF7E9FFCEE739461148BA +:10A4880000F0D6F9C1E7502363700023A3700123BD +:10A4980023705DE708630020BC630020A8630020E8 +:10A4A800B8630020AC630020B4630020A44D010809 +:10A4B800D44901080D6300204863002029A1000841 +:10A4C800A94D0108D1A400082DE9FF414E4E856829 +:10A4D800002104464FF0FF320B463068FBF7C4FDFD +:10A4E800FAF776FF494B52225A7004221A702268F2 +:10A4F8009A70D870020A000C1A7158711C46002D07 +:10A508006BD00023029300230393AB6819682B795F +:10A51800019103F00F02013A062A1AD8DFE802F087 +:10A52800040A10070D1012009DF8042010E09DF990 +:10A5380004200DE0BDF804200AE0BDF9042007E07E +:10A548000A4605E007EE901AFDEEE77A17EE902A24 +:10A55800029203F0F002702A01D0802A28D103F079 +:10A568000F03072B17BFDDED027A0391F8EEE77AA8 +:10A57800CDED037A702A0AD12378244A1A2B2CD8D5 +:10A5880013440398C3F80200137804330EE09DEDDA +:10A59800030A00F0FBFA237802901C2B1B4A1CD8F4 +:10A5A8001344BDF80810598013780233137012E071 +:10A5B8001B09174A207812F80380144FC8F11E03AC +:10A5C80098420AD838444246023002A909F054FC9D +:10A5D8003A7842443A702D6891E700210A460B46C2 +:10A5E8003068FBF7A5FBFDF75FFD30B9FFF76CFDA1 +:10A5F80004B0BDE8F041FDF745BD044804B0BDE82E +:10A60800F041FDF71DBD00BFBC630020286300209A +:10A61800D34D0108F0B5204D2C7885B0002C38D1E9 +:10A628001E481F491F4B204E204F3060091A8A10C0 +:10A6380053433B6000F074FA1D4B18600120FBF790 +:10A648003FFC1C4A1C4B3F6836681168186023465B +:10A65800BB4207DA0C205843013330560028A8BF04 +:10A668000131F5E711600023144A4FF0FF3199508A +:10A678000C33602BF8D1FFF727FD01240023009449 +:10A688000193029303930E480E499622FAF766FD4A +:10A698002C7005B0F0BD00BFB0630020D072010877 +:10A6A8000C760108ABAAAAAAB4630020AC63002008 +:10A6B800B8630020A8630020BC6300204863002022 +:10A6C80069A20008B24D01082DE9F843114B124E5A +:10A6D8001F68124B1D68804689460024BC4212DA66 +:10A6E8002B781A0602D5DB0748BF6E68404631460C +:10A6F800FAF7BAFC20B948466968FAF7B5FC30B1F0 +:10A7080001340C35EAE74FF0FF30BDE8F883204606 +:10A71800BDE8F883AC630020D4490108B463002085 +:10A7280010B5041E05DA184818494FF42F7200F0C6 +:10A73800ABF8174B0C2060431A681318125C013AE7 +:10A74800062A1ED8DFE802F0040B12070E121500C5 +:10A758009B68187810BD9B6893F9000010BD9B6832 +:10A76800188810BD9B68B3F9000010BD9B68186875 +:10A7780010BD9B68D3ED007AFDEEE77A17EE900ADC +:10A7880010BD002010BD00BFB64D0108C14D010825 +:10A79800B463002010B5041E05DA0D480D494FF4C6 +:10A7A800377200F071F80C4A0C2363431268D11811 +:10A7B800D35C072B03D18B6893ED000A10BD2046AC +:10A7C800FFF7AEFF07EE900AB8EEE70A10BD00BF2C +:10A7D800B64D0108C14D0108B463002010B5044C02 +:10A7E800226822B905200821FBF76EFA206010BD07 +:10A7F800C0630020024B1868003018BF0120704762 +:10A80800C063002013B5094B1A681C4662B10023C7 +:10A81800206869464FF0FF32FBF726FC009B002BAF +:10A82800F5D001989847F2E702B010BDC063002048 +:10A8380007B568B1084B00228DE80300186869461F +:10A848001346FBF775FA00280CBF0C20002000E027 +:10A85800082003B05DF804FBC0630020B1F5807FD9 +:10A86800136803DC0129B8BF012101E04FF48071AE +:10A87800C3EB0020001201FB0031C1F3C01000EB54 +:10A888002120116000B2704708B50C4613460A49EA +:10A898000A4A0B48936082E812000A49224600F0EF +:10A8A80031F902F099FE0220012102F063FE042032 +:10A8B800012102F05FFEFEE71F008A2F7478002056 +:10A8C800B5870008DC4D0108064B074A1968074898 +:10A8D800914204D15A6806499B6800F013B90549AA +:10A8E80000F010B9747800201F008A2FB58700087F +:10A8F800F64D0108134E01080123092804DD0A2238 +:10A90800013390FBF2F0F8E7184670472DE9F84F4D +:10A91800824608460D4693461C46FFF7EDFF002D7C +:10A92800064604D13020D0470120BDE8F88F05DA6B +:10A93800BBF10A0F02D12D206D42D047A6420ADA98 +:10A94800A41B2646002E03DD3020D047013EF9E740 +:10A9580024EAE47400E00024012600273B46284648 +:10A9680000213246FAF7AEF850EA0103D8464FEA1A +:10A97800EB7907D006FB09F30BFB0733A6FB0B6744 +:10A988001F44EBE7304639464B464246FAF79AF8F9 +:10A9980006460F4656EA07030ED032463B4628467F +:10A9A8000021FAF78FF842464B46FAF78BF8044B2A +:10A9B800985CD0470134E5E72046BDE8F88F00BF32 +:10A9C800354E01082DE9F8432DED028B07460E465A +:10A9D800154600243078002800F08C80252840F0A7 +:10A9E8008580474B19684FF006080136324612F841 +:10A9F800013BC818407880070AD12E2BF5D173780F +:10AA0800C8184078460748BFA3F130081646ECE757 +:10AA1800662B16461BD003D8582B0DD0642B04E0A8 +:10AA2800732B53D0782B07D0692BD3D105F10408A9 +:10AA3800384629680A2204E0296805F104083846DE +:10AA480010220023FFF762FF45460444C2E707359A +:10AA580025F00703D3E9000103F10805F9F7E2FF40 +:10AA680008EE100AB5EEC08AF1EE10FA04D52D20D2 +:10AA7800B847B1EE488A0134FDEEC88A0A2218EEBA +:10AA8800901A00233846FFF741FF04442E20B847A8 +:10AA9800F8EEE88A013438EE688A0A230122424532 +:10AAA80003DA0A214B430132F9E707EE903AF8EE50 +:10AAB800E77A384628EE278A0A22FDEEC87A434606 +:10AAC80017EE901AFFF722FF044483E7D5F80080B9 +:10AAD80005F104094546C8EB04032B4415F8010B9E +:10AAE80008B1B847F7E74D461C4673E70136B84743 +:10AAF80001346FE7BDEC028B2046BDE8F88300BF48 +:10AB08006C0500200EB403B503AA52F8041B019289 +:10AB1800FFF758FF02B05DF804EB03B07047000080 +:10AB2800F0B54FF0FF330446221A8A421EDA14F8B1 +:10AB3800016B07220025F70742BF012797403D43D5 +:10AB480012F1FF324FEA5606F5D283EA056308226E +:10AB5800002B4FEA4305B8BF0B4B02F1FF32B4BFDD +:10AB68006B402B4612F0FF02F2D1DDE71F220020D6 +:10AB7800D90742BF01219140084312F1FF324FEA41 +:10AB88005303F5D2C043F0BDB71DC10410EE103A0F +:10AB9800C3F3C751FF2910B54FEAD37003D1C3F3EC +:10ABA8001602C2B901E08E2906D9002814BF4FF455 +:10ABB8007C404FF4F84010BD6F290FD9C3F300341F +:10ABC800C3F34932A31843EAC033A1F1700043EA42 +:10ABD800802080B210BD4FF4FC4010BD002010BD95 +:10ABE800002103E00A4B5B584350043109480A4BE3 +:10ABF80042189A42F6D3094A02E0002342F8043B7D +:10AC0800074B9A42F9D300F00FF8FCF7D6FE7047CD +:10AC18002476010800000020D4050020D405002077 +:10AC280074780020FEE70000354AD2F8883043F4F3 +:10AC38007003C2F88830334B1A68002142F00102D1 +:10AC48001A6099601A6822F0847222F480321A60BD +:10AC58002D4A5A601A6882B022F480221A60D9609C +:10AC6800009101911A6842F480321A60254B1A68E3 +:10AC780002F400320192009A01320092019A1AB944 +:10AC8800009AB2F5A04FF1D11B6813F4003318BF36 +:10AC980001230193019B012B2FD11A4B1B491A6CDD +:10ACA80042F080521A640A6842F440420A609A6884 +:10ACB8009A609A6842F400429A609A6842F4A052F4 +:10ACC8009A60134A5A601A6842F080721A601968CA +:10ACD8000C4A8901FBD50F4B40F205711960936846 +:10ACE80023F003039360936843F002039360054BDA +:10ACF8009B6803F00C03082BF9D102B0704700BF22 +:10AD080000ED00E0003802401030002400700040E0 +:10AD180008544007003C02404FF44070FCF7F8BD6F +:10AD28004FF0FF32826110220273FF22026103F0AA +:10AD380063BA000038B5037B012B044605D0037BBA +:10AD4800102B02D0037B002B72D12378394D55F894 +:10AD58002320138823F001031B041B0C1380207885 +:10AD680000F090FF207800F019FFE378022B03D160 +:10AD78002078617801F042F8207800F0FBFE207816 +:10AD880000F020FF237855F8232013889BB243F066 +:10AD9800010313802378E16955F82300FCF78CF947 +:10ADA8006369D90208D52278224B53F822201388E8 +:10ADB8009BB243F0400313806369DA071AD52378FE +:10ADC80055F8232093899BB243F00103938123789C +:10ADD80055F82320938923F0FE031B041B0C938151 +:10ADE800237855F823108B899AB2636903F0FE0320 +:10ADF80013438B8163695B0008D5237855F82320BA +:10AE0800138823F480631B041B0C1380E378022B44 +:10AE180004D120786178626900F05CFF2078E378DB +:10AE28006169627801F002F801232373002038BDBC +:10AE3800012038BD600200200F4A104911604BF60E +:10AE4800FF71D1804FF48061034651814FF48041F6 +:10AE58000020918103211081908059700221D970BE +:10AE68004FF0FF31187398701861586098605861F6 +:10AE78009961DA61704700BFCC6D0020A08601009F +:10AE880013B58378414A012B03783ED141684C6859 +:10AE9800002C3AD1017B012902D0017B062934D14B +:10AEA80052F8233039494FF2FF029A82C378012BB6 +:10AEB80068D1037851F82320938823F400731B0486 +:10AEC8001B0C9380037851F82320938823F4806324 +:10AED8001B041B0C938046F2A8130193037851F8C6 +:10AEE80023100B8B9B0705D4019B4BB9FFF718FF69 +:10AEF800044647E0019B5A1E0192002BF1D1F3E76B +:10AF08000123037303F088F93CE052F823101F4C27 +:10AF1800898A01F4706101611021017352F82330AC +:10AF28004FF2FF0199820369D90510D5037854F8C7 +:10AF380023100B886FEA43436FEA53439BB20B809D +:10AF4800037854F823100B88C3F30E030B800369AE +:10AF58009B0510D5037852F823100B886FEA4343FA +:10AF68006FEA53439BB20B80037852F8232013886F +:10AF7800C3F30E031380036903690169007803F0C2 +:10AF880029F90024204602B010BD00BF600200204D +:10AF980073B54FF0FF338361574E0378574D56F81A +:10AFA800232055F8231012F0005F14BF4968096880 +:10AFB8000A4214BF012200220446002A59D04368DD +:10AFC80000225A6043695A044FD48378002B4CD12D +:10AFD80003784B4951F82320938823F400631B041A +:10AFE8001B0C938044F620630093037851F82320C8 +:10AFF800938A5B0702D5009B33B91FE0009B581E5C +:10B008000090002BF4D1F6E7636918021AD413886C +:10B018009BB243F40073138046F2A813019323787C +:10B0280051F82300038B9B0702D4019B53B905E019 +:10B03800019B5A1E0192002BF4D1F6E72046FFF738 +:10B048006FFE56E022782F4B53F82220136823F026 +:10B0580001031360237851F82320938823F40073A5 +:10B068001B041B0C938001232373204603F0D4F8A0 +:10B0780023E0254A55F8231052F8232090004CBFAE +:10B08800496809680A4214BF01220022AAB91F4A66 +:10B0980055F8231052F8232090004CBF49680968DE +:10B0A8000A4214BF012200223AB110221549227324 +:10B0B80051F8233062685B6853602378124956F868 +:10B0C8002320124C12F000500AD051F8231055F8E2 +:10B0D800230054F823300A431A43C260002008E0D2 +:10B0E80051F8231055F8235054F823300A431A43D3 +:10B0F800AA6002B070BD00BF144F0108840200208E +:10B10800600200206C020020C44E0108084F0108AC +:10B11800F7B54FF0FF338361514E0378514D56F820 +:10B12800232055F8231012F0005F14BF49680968FE +:10B138000A4214BF012200220446002A4ED0836826 +:10B1480000225A604369180444D4A378002B69D1BB +:10B158002378454A52F823100B889BB243F40073B6 +:10B168000B80237852F823108B8823F400631B0488 +:10B178001B0C8B8046F2A8130193237852F8237096 +:10B18800398B890705D4019949B92046FFF7C8FDCD +:10B1980064E00199481E01900029F1D1F3E7334991 +:10B1A80051F823100B6823F001030B60237852F841 +:10B1B80023108B8823F400731B041B0C8B802378CB +:10B1C80052F82320938823F480531B041B0C93808C +:10B1D80001232373204603F022F823E0244A55F87C +:10B1E800231052F8232097004CBF496809680A4287 +:10B1F80014BF01220022AAB91E4A55F8231052F89A +:10B20800232090004CBF496809680A4214BF0122F4 +:10B2180000223AB110221549227351F82330A2684E +:10B228005B6853602378124956F82320114C12F0BA +:10B2380000500AD051F8231055F8230054F8233051 +:10B248000A431A43C260002008E051F8231055F859 +:10B25800235054F823300A431A43AA6003B0F0BDC0 +:10B26800DC4E0108840200206002002090020020C9 +:10B27800684F0108284F010838B5104C04F10C0537 +:10B2880054F8043FBBB19A6972B94FF0FF329A6122 +:10B29800236810221A7323681A6962B9FF221A6197 +:10B2A800206802F0A9FF06E09A6901321EBF9A6978 +:10B2B80002F1FF329A61AC42E2D138BD300200207F +:10B2C80038B5C378012B044602D0022B0AD04FE0D0 +:10B2D80002782A4B53F8222093889BB243F4806368 +:10B2E800938049E0254A037852F82300838823F4A1 +:10B2F80000731B041B0C8380237852F82300838877 +:10B308009BB243F400638380237B062B154601D050 +:10B31800012910D162692078616800F023FD237843 +:10B3280055F82320938823F480531B041B0C938027 +:10B338002278134B15E0237B0A2B01D002291BD15D +:10B348002078A168626900F033FDA3783BB92378BF +:10B3580055F8232093889BB243F480539380227836 +:10B36800084B53F82220136843F00103136003E0ED +:10B3780010230373012038BD002038BD600200206F +:10B388006C0200209002002038B5037B9907044620 +:10B398004CD4037B032B49D0037B052B46D0037B7E +:10B3A800002B43D0037B102B40D002230373436947 +:10B3B8001F4D13F0807F03781AD10622826155F859 +:10B3C80023100A8B920705D5A269012A02D0A26927 +:10B3D8000132F6D1A269012A02D0A269013204D150 +:10B3E8002046BDE83840FFF79BBC4FF0FF32A26112 +:10B3F800A2788AB955F8232013889BB243F4807346 +:10B4080013806369DB0303D520460121FFF758FF4A +:10B41800032323731F23A361237855F823209388DC +:10B428009BB243F400739380002038BD012038BDDF +:10B438006002002038B5037B9D07044600F11781A0 +:10B44800037B032B00F01381037B052B00F00F8196 +:10B45800037B002B00F00B81037B102B00F007818E +:10B46800022303734369834D13F0807F18D10622AA +:10B478008261027855F822100A8B900705D5A269D7 +:10B48800012A02D0A2690132F6D1A269012A00F08C +:10B49800C780A269013200F0C3804FF0FF32A26179 +:10B4A800E278022A07D1A2685268012A02BF43F44F +:10B4B80000136361E2706369D90300F1BA80A3786D +:10B4C800002B40F0B680237855F8232013889BB2D0 +:10B4D80043F4807313801F23A361237855F8231046 +:10B4E8008A8AD20703D5A269012A07D198E0A269FE +:10B4F800012AF8D0A2690132F2D1F4E7A269013237 +:10B5080000F08E804FF0FF32A261E2699289B2F5B5 +:10B51800804F1DD155F82320A3689B6803F0FE03D4 +:10B5280013820423A361237855F82320938A9B0769 +:10B5380005D4A369012B02D0A3690133F6D1A3690D +:10B54800012B6DD0A36901336AD04FF0FF33A3619B +:10B55800237855F82320918A128B0322A26155F88B +:10B5680023108A8A100605D4A269012A02D0A2698A +:10B578000132F6D1A269012A52D0A26901324FD014 +:10B588004FF0FF32A261626955F8233012F4003F90 +:10B59800A26810D1127B1A820323A361237855F87D +:10B5A8002320938A190635D4A369012B32D0A369C5 +:10B5B8000133F6D12EE0527B1A820323A36123784C +:10B5C80055F823108A8A120603D5A269012A07D1E1 +:10B5D80026E0A269012AF8D0A2690132F2D1F4E783 +:10B5E800A26901321CD04FF0FF32A261A26855F85F +:10B5F8002330127B1A820323A361A361237855F8B1 +:10B608002320938A1B0605D4A369012B02D0A369C2 +:10B618000133F6D1A369012B02D0A369013304D108 +:10B628002046BDE83840FFF77BBB4FF0FF33A361EE +:10B6380005E0E178022902D12046FFF741FE052303 +:10B648002373A3784BB9237855F8232013889BB22A +:10B6580043F4807313801F23A361237855F82320B4 +:10B6680093889BB243F400739380002038BD012077 +:10B6780038BD00BF6002002070B58B4A01788AB0DF +:10B688000023ADF8023052F821300446988A00F0C1 +:10B69800DF00ADF80200A078154610BBBDF8020027 +:10B6A800C60720D54FF0FF33A361E3699B89B3F543 +:10B6B800804F16D1237B52F82120052B0BBFA3689E +:10B6C80063689B689B6805BF43F00103DBB203F026 +:10B6D800FE03138216BF13820A230623237304234F +:10B6E800A361002642E2BDF8022002F0020292B2F3 +:10B6F800002A00F0BB80E278022A0BD1237B062BBC +:10B7080001D1636803E0237B0A2B03D1A3685B683C +:10B71800013301E04FF0FF33A361237B0A2B12D1E1 +:10B72800012A10D1A3685E686EB955F821100B88FC +:10B738009BB243F400730B80237855F82330998A21 +:10B748001B8B227312E2237B0A2B05D1012A03D11A +:10B7580020460221FFF7B4FD237B0A2B237816D15C +:10B76800A2685268012A12D155F82320138823F4BD +:10B7780080631B041B0C1380237855F82320938ABD +:10B78800138B13889BB243F4007313801EE0E27896 +:10B79800012A17D1227B0A2A14D1A2685268022AE8 +:10B7A80010D155F82320138823F480631B041B0C45 +:10B7B8001380237855F8232013889BB243F4006341 +:10B7C8001380237855F823309A8A1B8B636913F406 +:10B7D800803686D1227B062A43D1227813F4003F93 +:10B7E80055F82220636812D11B7B138242F2107332 +:10B7F8000193237855F823108B8A180601D5019BED +:10B808002CE0019B5A1E0192002BF5D1F7E75B7BD8 +:10B81800138242F210730293237855F823309A8AE0 +:10B8280012060DD5029A002A00F088816268127B00 +:10B838001A8242F210730393237855F8231009E013 +:10B84800029A511E0291002AE9D1EBE7039B5A1E86 +:10B85800039213B18B8A1806F8D5039B002B00F0CE +:10B868006D8120460321FFF72BFD7FE1BDF8021013 +:10B87800090662D5217B06295FD1E17801297FF489 +:10B8880030AF61684E688EB10968097819826168BD +:10B898004B68013B4B606368596800293FF421AF4E +:10B8A8001968013119601CE7600200206269120200 +:10B8B8005FBF1A8892B242F400721A8023789E4AB7 +:10B8C80055F823108B8823F400731B041B0C8B8002 +:10B8D800237855F823108B8823F480631B041B0CF2 +:10B8E8008B80636913F4000F46F2A81123780ED1F8 +:10B8F800049152F823108B8A03F084030BB9049B3C +:10B908000CE0049B5A1E0492002BF4D1F7E7059132 +:10B9180052F823108B8A180609D4059B002B00F0D7 +:10B928000D8101232373204602F076FC1EE1059B5E +:10B938005A1E0592002BEDD1EFE7BDF80220520602 +:10B948007FF5CFAE227B0A2A7FF4CBAEE278012ABC +:10B958007FF4C7AEA2685168032900F2AC80516831 +:10B96800012906D112681B8A1370A2685368013B2B +:10B978005360A3685B68022B3BD1237855F82320DA +:10B98800938823F480631B041B0C938044F6206384 +:10B998000693237855F82320938A5B0723D5069BC3 +:10B9A800002B00F0CB8013889BB243F40073138004 +:10B9B8002278A36855F822201B68128A1A70A26898 +:10B9C800136801331360A2685368013B53602278FF +:10B9D800A36855F822201B68128A1A70A268536857 +:10B9E800013B536005E0069B591E0691002BD3D1FD +:10B9F800D5E7A3685B68032B68D1237855F8232023 +:10BA0800938823F480631B041B0C938044F6206303 +:10BA18000793237855F82320938A5E071FD5079B41 +:10BA2800002B00F08B80138823F480631B041B0C0D +:10BA380013802278A36855F822201B68128A1A708E +:10BA4800A268136801331360A2685368013B53600E +:10BA580044F620630893237855F8232009E0079BD0 +:10BA6800591E0791002BD7D1D9E7089B591E089179 +:10BA780013B1938A5807F8D5089B002B5ED013881A +:10BA88009BB243F4007313802278A36855F82220F0 +:10BA98001B68128A1A70A268136801331360A268BF +:10BAA8005368013B53602278A36855F822201B682D +:10BAB800128A1A7006E012681B8A1370A26813684B +:10BAC80001331360A2685368013B5360A3685E6842 +:10BAD800002E7FF406AE237855F82320938823F4AC +:10BAE80000731B041B0C9380237855F8232093883C +:10BAF80023F480631B041B0C9380227855F82230B2 +:10BB0800998A1B8A6369990241BF23F40013636110 +:10BB18000223E37055F8222046F2A8130993138BE9 +:10BB28009B0702D4099B73B908E0099B591E099128 +:10BB3800002BF4D1F6E700BF600200202046FFF793 +:10BB4800EFF8064612E013889BB243F48063138033 +:10BB5800237855F82320138823F400631B041B0C57 +:10BB6800138001232373204602F059FB30460AB0A4 +:10BB780070BD00BF084B10B553F820400121204686 +:10BB8800FBF79AFB20460021FBF796FB2046012194 +:10BB9800BDE81040FBF778BB8C4F0108084B10B587 +:10BBA80053F8204001212046FBF786FB2046002160 +:10BBB800FBF782FB20460021BDE81040FBF764BB81 +:10BBC8008C4F0108264B2DE9F743044653F8200013 +:10BBD800244B254F53F82430244E18430121FBF7FA +:10BBE8003BFB234B57F8240013F82450214B2A46DB +:10BBF80033F81410FBF74DFA1F4B56F8240033F8AE +:10BC080014102A46FBF745FA02238DF805308DF803 +:10BC1800043001238DF8063000238DF80730174BC8 +:10BC280057F8240033F8149002AD45F8089D2946CA +:10BC3800FBF7E6F9124B56F8240033F81480CDF8D8 +:10BC480000802946FBF7DCF957F8240056F8241041 +:10BC58004A46434602F062FA03B0BDE8F08300BFEB +:10BC6800444F0108804F0108280200207802002074 +:10BC7800F84E0108B84E0108384F0108F24E010885 +:10BC8800D44E010837B502238DF8053000238DF80E +:10BC980004300C4B02AC33F8103044F8083D0A4B22 +:10BCA8000546214653F82000FBF7AAF9074B33F85D +:10BCB80015300093064B214653F82500FBF7A0F9F1 +:10BCC80003B030BDF24E010828020020D44E01080E +:10BCD800780200201D4B70B505460E4653F820002B +:10BCE8000121FBF7B9FA1A4B1A4953F825300B60B2 +:10BCF80000238B600B614B61CB610B624B62CB62A3 +:10BD08000B634B638B63144B4FF480628A6153F867 +:10BD180025304B604FF4403216F0010F8A620C4612 +:10BD280006D04023CB600D4B53F82500FBF772F883 +:10BD3800B30709D50023E360094B064953F82500EA +:10BD4800BDE87040FBF766B870BD00BF5C4F0108E6 +:10BD5800744F0108DC6D0020504F01086C02002070 +:10BD68009002002010B50E4C0E4B54F820401C6079 +:10BD78000C689C604968196112F480420A4918BF2E +:10BD88004FF4807251F820105A6240225960DA60EC +:10BD9800064B044953F82000BDE81040FBF73AB8B9 +:10BDA800744F0108DC6D0020504F01086C02002020 +:10BDB80010B50E4C0E4B54F820401C600C689C606B +:10BDC8004968196112F400420A4918BF4FF4807299 +:10BDD80051F820105A6200225960DA60064B044973 +:10BDE80053F82000BDE81040FBF714B8744F010861 +:10BDF800DC6D0020504F010890020020CA0738B5BA +:10BE080004460D4604D5074B53F82000FAF77CFF8B +:10BE1800AB0706D5044B53F82400BDE83840FAF7C1 +:10BE280073BF38BD6C02002090020020F7B50446AD +:10BE38000D4616461F46FEF76FFF01238DF80730A3 +:10BE48003B4B1B5D8DF804303A4B1B5D8DF805307C +:10BE5800394B01A81B5D8DF80630FBF763FD6B02BB +:10BE680016D4364B1B5D8DF80430354B1B5D8DF8B1 +:10BE78000530344B01A81B5D8DF80630FBF752FDE9 +:10BE8800314B53F8242093889BB243F480739380FA +:10BE9800022F4BD1F70723D52C4B1B5D8DF80430AF +:10BEA8002B4B1B5D8DF805302A4B01A81B5D8DF8C7 +:10BEB8000630FBF737FD284B53F824100A6842F088 +:10BEC80010020A6053F824100A6842F00402A80518 +:10BED8000A6041BF53F82420136843F00803136035 +:10BEE800B10723D51D4B1B5D8DF804301C4B1B5D22 +:10BEF8008DF805301B4B01A81B5D8DF80630FBF74C +:10BF080011FD194B53F824100A6842F010020A6018 +:10BF180053F824100A6842F004020A60EA0441BF98 +:10BF280053F82420136843F00803136003B0F0BDEE +:10BF3800E84E0108344F0108C14E0108D04E0108EF +:10BF4800EB4E01083E4F010860020020204F010817 +:10BF5800234F0108BE4E01086C020020044F01085F +:10BF6800EE4E0108414F0108900200200148FFF7FA +:10BF780083BB00BFE801002008B50248FEF780FF38 +:10BF8800002008BDE80100200148FFF701B800BF04 +:10BF9800E80100200148FFF7BBB800BFE801002016 +:10BFA8000148FFF769BB00BF0802002008B5024836 +:10BFB800FEF766FF002008BD080200200148FEF7D2 +:10BFC800E7BF00BF080200200148FFF7A1B800BF83 +:10BFD800080200200148FFF74FBB00BF40020020C5 +:10BFE80008B50248FEF74CFF002008BD40020020BB +:10BFF8000148FEF7CDBF00BF400200200148FFF70F +:10C0080087B800BF4002002037B50023114C0193C8 +:10C018000546032003F033F92A68013C13690193AC +:10C0280014D0019B002BF4DA019B43F00103019328 +:10C03800019B13612968074B0A690192013B02D0F1 +:10C04800019AD207F8D4032003F019F9002003B0AD +:10C0580030BD00BF410D030010B5C4786CB900EBCA +:10C0680082000333D0F8D0009B1022469A4204D0B5 +:10C0780051F8224004600132F8E7002010BD10B5E5 +:10C088000332D0F8D03092100020904204D01C68BF +:10C0980041F820400130F8E701EB800010BD0000B6 +:10C0A8000122F0B50023827001294FF04002C370CD +:10C0B80082800CD108230370042343704FF4A073CB +:10C0C800C38002230372C1724FF0A04309E041B953 +:10C0D8000C230370062343704FF4A063C380224BE4 +:10C0E800C17203F5006245780261C36001461A46D1 +:10C0F8000024AC4202F1200601F1040108D202F545 +:10C10800106702F530620A654F6101343246F0E784 +:10C1180003F580624261044603F58862C0F8CC20CA +:10C1280014F88C2B03EB421503F5A06105F5A06507 +:10C13800A94203D044F8041F2031F9E703EB023287 +:10C1480003F5805100F1CC0402F58052914204D0ED +:10C1580044F8041F01F58051F8E703F56063C0F85F +:10C168000C310020F0BD00BF0000044038B5037A50 +:10C17800012B05464FF0000450F80C2F1FD1936B8C +:10C18800697A64F3104309B143F480139363EA684E +:10C19800D3686FF386136FF396536FF351436FF3BE +:10C1A800D343D360FFF730FFEB78012B19D1052378 +:10C1B80063F34404EB6844F020049C6011E0D36806 +:10C1C80043F04003D360FFF71FFF6B7AEA68002B48 +:10C1D8000CBF4FF434134FF474139363142003F01B +:10C1E80058F8EB78012B01BFEB689C68052262F3D5 +:10C1F800440404BF44F020049C60002038BDC26899 +:10C20800936843F00103936000207047C268936805 +:10C2180023F00103936000207047000007B5002356 +:10C228000193019B43F020030193019B01F01F013F +:10C2380023F4F86343EA81110191C368019A1A61F2 +:10C24800C168074B0A690192013B02D0019A920624 +:10C25800F8D4032003F013F8002003B05DF804FBC2 +:10C26800410D030007B500230193019B43F0100320 +:10C278000193C368019A1A61C168074B0A69019260 +:10C28800013B02D0019AD206F8D4032002F0F7FF4E +:10C29800002003B05DF804FB410D030008B5C26837 +:10C2A800D36801296FF35D736FF39E7302D143F076 +:10C2B800005302E009B943F08043D360322002F012 +:10C2C800E8FF002008BDC368586900F0010080F04D +:10C2D80001007047C3685A6998691040704702693D +:10C2E800136861F3010313607047000010B5C2685A +:10C2F80000239361C1686FF080424A61C1684FF0C2 +:10C30800FF344C60C1684A61C26809499161C278CA +:10C31800C1689A4208BF102343F470138A6943F432 +:10C32800605343F0080313438B61002010BD00BF26 +:10C338000008008038B500231D46D0F80C311D6078 +:10C348000269136865F3CC231360C37A012B044692 +:10C3580025D10321FFF7C3FFE36880225A62E16811 +:10C368004FF4001362F30F038B62A02363F30F05EE +:10C37800E36862F31F45C3F804514FF4907363F305 +:10C388000F05E368C0F22005C3F808514FF4A07305 +:10C3980063F30F05E3686FF31F45C3F80C511021D1 +:10C3A8002046FFF73BFF2046FFF75CFF226900238A +:10C3B80013612269536122694FF0FF31916122694B +:10C3C800D36104F1180261788B4210D210680168B9 +:10C3D8000029ACBF00214FF0904101601168002096 +:10C3E800086152F8041BFF2088600133EBE704F171 +:10C3F8005403002261788A4210D218680168002923 +:10C40800ACBF00214FF0904101601968002008611D +:10C4180053F8041BFF2088600132EBE72269136997 +:10C4280043F480731361E378012B01BF054B40226D +:10C4380062F359432269204608BF1363FFF756FF8A +:10C44800002038BD0301010003699B68C3F3410361 +:10C45800022B05D0032B01D0012B03D102207047FA +:10C468000120704703207047036981699A680B6847 +:10C47800C2F34102022A06BF032262F30A036FF3E2 +:10C488000A030B600269536843F480735360002009 +:10C4980070474A780B7830B5012A15BF00EB830244 +:10C4A80000EB8305556DAD691CBF012202FA03F349 +:10C4B8004FF000040CBF9A4063F31F442B6808BF79 +:10C4C80062F30F041A040DD48A6862F30A03CA7867 +:10C4D80062F39343CA8862F3995343F0805343F459 +:10C4E80000432B600269D3692343D361002030BD28 +:10C4F80030B54A780B78012A15BF00EB830200EBB0 +:10C508008301516D89694FF000052C466FF3CF35D3 +:10C5180008BF9A400D601ABF012202FA03F362F3C2 +:10C528000F04026918BF63F31F44D36923EA0403A5 +:10C53800D361002030BD70B54E780B4609785A6932 +:10C54800012E00EB810146D18D6929682C6962F3BF +:10C55800120412B966F3DC440BE09E683244013AD7 +:10C56800B2FBF6F262F3DC44DA78012A08BF62F320 +:10C578005E742C61C278012A1A7805D100EB820218 +:10C588001C69926954610BE0DC78012C08D05C6965 +:10C5980034B106690125746B05FA02F2224372630D +:10C5A800DA78012A07D102699268D20554BF41F0AE +:10C5B800005141F080511A7800EB820241F00441A9 +:10C5C80092691160DA78012A37D1D9681A789B8A7A +:10C5D800FFF742FD31E04E6D9D68316834692AB934 +:10C5E80065F31204012262F3DC440AE02A44013AAA +:10C5F800B2FBF5F262F3DC44C2F309026A4362F368 +:10C6080012043461C278012A01BF1A781C6900EB50 +:10C618008202526D08BF5461DA78012A06D15A792C +:10C6280012B141F0005101E041F080511B7800EB5C +:10C63800830041F00441436D1960002070BDF7B5D7 +:10C648004F784D69012F3CD186693468336900936E +:10C65800DAB2C3F3074335B965F306028DF8002053 +:10C6680067F3C4030EE08F68BD428CBF67F3060210 +:10C6780065F306028DF800204FF0010288BF4F6174 +:10C6880062F3C4038DF80230009B3361C378012B39 +:10C6980002BF0B780A6900EB830344F0044404BF2B +:10C6A8009B695A613460C378002B34D14B69002BE5 +:10C6B80031D000690978426B01238B4013434363EF +:10C6C80029E00E788F6800EB8606736D1C681B697D +:10C6D8000093DAB2C3F3074305B14F6167F306026B +:10C6E8008DF80020012262F3C4038DF80230736DC7 +:10C6F800009A1A61C378012B02BF0B780A6900EB14 +:10C70800830344F0044404BF5B6D5A610B7800EB6B +:10C718008300436D1C60002003B0F0BD4B78012BF3 +:10C728000B7800EB830006D182691368002B04DACA +:10C7380043F0804301E0426D136843F40013136033 +:10C74800002070474B78012B0B78C97800EB8300E9 +:10C75800A1F102010CBF8269426D136801296FF3D0 +:10C76800555398BF43F08053136000207047026907 +:10C778009369D0691840000C704700EB8101026989 +:10C788004B6D9B6850691840704703699869DB696D +:10C79800184080B2704782B000230093C0238DF800 +:10C7A800033001224FF0000362F3C4038DF8023016 +:10C7B80018238DF80030436D009A1A61C378012B55 +:10C7C80008D1436D00F2CC525A61436D1A684FF09C +:10C7D80080221A6002B070472DE9F04F85B00446F8 +:10C7E800FFF771FD08B9002026E22046FFF772FD29 +:10C7F80006460028F7D0C0F3074909F0080303F0FC +:10C80800FF00002B55D02046FFF7B1FF04F1540775 +:10C818008046A3464FF0000AB8F1000F48D018F040 +:10C82800010F3DD05FFA8AF2114620460192FFF7C8 +:10C83800A4FF10F0010F0546019A22D03B6801259C +:10C848009D60E378AB4201BF3B681B69C3F31201EB +:10C85800DBF87C3304BF5B1ACBF88C33A74B1B681F +:10C8680020461B6811469847E378012B09D1BAF195 +:10C87800000F06D194F81131052B02D12046FFF79D +:10C888008AFFAB0742BF3B6802259D602D0707D58D +:10C898009A4B1B6820469B6898473B6808259D6013 +:10C8A8000AF1010A4FEA580804370BF1280BB3E7DD +:10C8B800012019F0040F00F0A1802046FFF765FF62 +:10C8C80004F11808824627464FF00009BAF1000F14 +:10C8D80000F093801AF0010F00F0878022695FFA58 +:10C8E80089FB1569536B04EB8B0123FA0BF38969F8 +:10C8F800DB018968DBB22B4303EA0105E8071CD595 +:10C90800536B012505FA09F123EA01035363D8F8AB +:10C9180000309D60794B1B6820465B6859469847F4 +:10C92800E378AB4209D1B9F1000F06D194F811317F +:10C93800042B02D12046FFF72EFF290742BFD8F863 +:10C94800003008259D60EA0642BFD8F8003010255F +:10C958009D606B0642BFD8F8003040259D60A8074F +:10C9680042BFD8F8003002259D6029063DD5D7F88A +:10C978003031D7F834515D1BD7F82431AB4228BF8A +:10C988002B46DD1CAD08D8F800309B699BB2AB4242 +:10C9980027D9D7F83421D7F830319A4221D203B3B6 +:10C9A800C2EB030CD7F82431D7F828119C4528BFCF +:10C9B8009C461FFA8CF320465A460CF10305CDF825 +:10C9C80004C0FFF749FBD7F82831DDF804C06344F9 +:10C9D800C7F82831D7F834316344AD08C7F8343183 +:10C9E800D1E7D8F8003080259D6009F101094FEAA8 +:10C9F8005A0A08F10408283768E70120F5B2AA079F +:10CA080042BFE36802225A61002E19DAA37A43B1C1 +:10CA1800D4F80C31D4F80C216FF341036FF3000301 +:10CA280013602269536823F001035360334B1B687A +:10CA380020469B699847E3684FF000425A610120FD +:10CA4800C6F307273B072FD500238DF80F3094F83E +:10CA580012318DF80F30294B1B6820465B699847C7 +:10CA68002369E2689B684FF400615161A27AD2B1F0 +:10CA7800D90718D594F81531012B14D19DF80F302A +:10CA8800032B10D1D4F80C21136843F00103136071 +:10CA9800D4F80C21136843F003031360184A136990 +:10CAA80043F00603136101202A0708D5134B1B68BE +:10CAB8002046DB689847E36808225A610120EB06A4 +:10CAC80040D5E268936923F010039361E368D3F8D3 +:10CAD8002080C8F34343022B08F00F0512D0062B21 +:10CAE8002AD1204604F2CC510822FFF7C8FA28239D +:10CAF80003FB0545C8F30A1819E000BF9C02002093 +:10CB080000ED00E047F6F07308EA0303A3B1282319 +:10CB180003FB0545C8F30A182046D5F8801342469A +:10CB2800FFF7ADFAD5F880334344C5F88033D5F81C +:10CB38008C334344C5F88C33E268936943F010039F +:10CB480093610120FD063BD5226953684FF0000828 +:10CB580023F00103536020464146FFF75FFB04F1D1 +:10CB68001402434661788B4207D252F8040FFF2122 +:10CB78008160D06B01338160F4E723694FF0FF32A5 +:10CB88009A610125236965F30F0865F31F48C3F807 +:10CB98001C8022690B23536122691361226913687F +:10CBA8006FF30A1313602046FFF7F5FDE3684FF4AF +:10CBB80080525A61224B1B6820461B6998472846B9 +:10CBC800B9061FD52046FFF74FFCE3682046DD680D +:10CBD800FFF73AFC03280BBF00230123A370A370BF +:10CBE8000BBF4FF400734023A380A3800CBF09231D +:10CBF800052363F38D25E368DD60E3684FF4005295 +:10CC08005A610120C6F30746F20609D50C4B1B688A +:10CC18002046DB699847E3684FF480125A61012087 +:10CC2800B30609D5064B1B6820461B6A9847E3687C +:10CC38004FF400125A61012005B0BDE8F08F00BF23 +:10CC48009C0200200148FFF7C7BD00BF506F0020BD +:10CC580038B50446FFF724FA01230022607884F8E7 +:10CC6800123184F8142104F21D13824203F12803BF +:10CC780012D2012103F8281C4025002103F8292C91 +:10CC880023F8232C03F8261C43F8215C43F81D1CC9 +:10CC980043F8151C0132E8E704F27533002282429A +:10CCA80003F1280311D20021402503F8292C23F889 +:10CCB800232C03F8281C03F8261C43F8215C43F8AE +:10CCC8001D1C43F8151C0132E9E72046FFF79EFAC0 +:10CCD8002046FFF74BFA20460021FFF7DFFA2046EF +:10CCE800FFF728FB2046BDE83840FFF788BA70B543 +:10CCF800CDB215F0800F01F07F044FF0280615BF64 +:10CD080006FB040106FB010101F58E7101F55D7159 +:10CD1800E4B2ED090C704D708A60CB7005B1CC801F +:10CD2800022B04BF00230B71FFF7B3FB002070BD7B +:10CD3800CBB213F0800F10B54FF0280201F07F043A +:10CD480015BF02FB040102FB010101F58E7101F51B +:10CD58005D71DB090C704B70FFF7CAFB002010BD3A +:10CD6800F8B501F07F05282606FB05F401190444EF +:10CD780004F56077C4F88833002384F87453C4F842 +:10CD88008023C4F88C3384F87533C37806FB050513 +:10CD9800012B08BF7A6095F8743301F55D7113B9FA +:10CDA800FFF74DFC01E0FFF7C6FB0020F8BDF8B522 +:10CDB80001F07F0528246C430119044404F5947696 +:10CDC800C4F82821C4F82C210127002284F81D71F9 +:10CDD80084F81C51C4F8342101F58E71B36015B97B +:10CDE800FFF72DFC01E0FFF7A6FB0020F8BDCBB252 +:10CDF80013F0800F10B54FF0280201F07F0415BF23 +:10CE080002FB040102FB010101F58E7101F55D7160 +:10CE18000122DB098A700C704B70FFF77FFC002041 +:10CE280010BD38B5CBB213F0800F01F07F054FF07D +:10CE3800280215BF02FB050102FB010101F58E71F5 +:10CE480001F55D710024DB098C700D704B70FFF7E4 +:10CE580079FC204638BD10B502690024136861F3D7 +:10CE68000A142343136010BD38B504460D46C4F8B0 +:10CE78003C21C4F838211346022280F811210021F0 +:10CE88002A46FFF794FF002038BD10B50C4613461C +:10CE980000212246FFF78BFF002010BD10B50C467D +:10CEA800134600212246FFF75BFF002010BD10B596 +:10CEB8000021042304460A4680F811310B46FFF787 +:10CEC80076FF2046FFF767FC002010BD10B5002153 +:10CED800052304460A4680F811310B46FFF740FF48 +:10CEE8002046FFF758FC002010BD90F8CC350B7099 +:10CEF80090F8CD354B7090F8CF2590F8CE3503EBF0 +:10CF080002234B8090F8D12590F8D03503EB02230B +:10CF18008B8090F8D32590F8D23503EB02239BB28F +:10CF2800CB80C0F84031012380F81131704710B52B +:10CF380080210446FFF75BFF20460021FFF757FFDB +:10CF48002046BDE81040FFF726BC000073B54B78BB +:10CF580004460D46092B00F21681DFE813F0C700DE +:10CF680002011401DA0014016E000A001401B9006C +:10CF78008D004B881A0A013A062A00F20481DFE87C +:10CF880012F007001A002700020102010201020143 +:10CF9800D0F8EC3580781B680DF106019847EB88CE +:10CFA800402B014603D094F81231012B35D10823C8 +:10CFB800ADF8063031E0D0F8E43580789B6A0DF1A1 +:10CFC80006019847022343700146C4F8F00524E09F +:10CFD800DBB2052B00F2D780DFE803F003070B0F65 +:10CFE8001317D0F8EC355B6812E0D0F8EC359B6885 +:10CFF8000EE0D0F8EC35DB680AE0D0F8EC351B69B8 +:10D0080006E0D0F8EC355B6902E0D0F8EC359B69B6 +:10D01800A0780DF1060198470146BDF80630002BAF +:10D0280000F0B580EA88002A00F0B1809A4228BF53 +:10D038001A46ADF80620204668E08B88002B40F0A1 +:10D04800A280CB88002B40F09E8090F812318E7819 +:10D05800032B06F07F0600F0968080F814613146B5 +:10D06800FFF7F9FE2046FFF722FF0EB1022300E08A +:10D07800012384F812318AE08978464E01293170FB +:10D0880000F2818090F81231022B02D0032B09D0D4 +:10D0980079E0002961D00121032380F8101180F87C +:10D0A800123111E039B9022380F8123180F81011D9 +:10D0B80000F037FA51E090F8101101294DD000F036 +:10D0C80030FA317884F81011204600F01EFA44E056 +:10D0D800CA88012A57D190F81231022B04D0032BA9 +:10D0E80051D100F5887111E02B490FE090F8123109 +:10D0F800023B012B47D8294B01221A60D0F818218E +:10D108000AB103221A60254920460222FFF7ACFE25 +:10D118003DE04B88012B2DD0022B38D18B8813F0A2 +:10D12800FF0F34D102691B0A013B5268042B0FD848 +:10D13800DFE803F0030507090B00012306E00223DB +:10D1480004E0032302E0042300E0052363F306124E +:10D15800134B1A60012384F816312046FFF7A7FE07 +:10D1680015E090F81231023B012B0CD84B88012BAB +:10D178000DD10023C4F81831D4F8E43520469B6853 +:10D1880029469847E9E720462946FFF7D0FE0020C0 +:10D1980002B070BDC8630020D0630020C4630020C3 +:10D1A800186F002038B590F81231032B04460D464D +:10D1B8000CD10B79012B09D8D0F8E4359B68984736 +:10D1C800EB882BB92046FFF772FE01E0FFF7AFFEB0 +:10D1D800002038BD70B54E788A88012E04460D4669 +:10D1E800D3B210D027D3032E50D190F81221022A9F +:10D1F80028D0032A48D14A889AB95E0611D0194620 +:10D20800FFF7F5FD0DE090F81221022A1AD0032A43 +:10D218003AD14A88002A39D1590608D01946FFF769 +:10D2280000FED4F8E43520469B68294698472046F6 +:10D23800FFF73DFE2AE090F81251022D02D0032D8F +:10D2480006D021E05A0621D01946FFF7D0FD1DE08F +:10D2580012F0800F4FF028000D4910D003F07F0224 +:10D2680000FB024393F81E310BB1012300E00023B9 +:10D278000B60204606490222FFF7F6FD06E000FB98 +:10D28800034393F87633EFE7FFF751FE002070BDB4 +:10D29800CC63002030B5C8B10446231A14F8015BEA +:10D2A800DBB2002DF9D15B00023313800B7003232E +:10D2B8004B700138022310F8014F3CB15A1CD2B20E +:10D2C800CC5402330024DBB28C54F4E730BD10B5E3 +:10D2D800D0F8E83504461B699847032384F81231CF +:10D2E800002010BD08B590F8123180F813310423DE +:10D2F80080F81231D0F8E835DB689847002008BD7F +:10D3080008B5D0F8E435DB6903B19847002008BDBB +:10D3180008B5D0F8E4351B6A9847002008BD08B561 +:10D32800D0F8E4355B6A9847002008BD002110B5A5 +:10D338000B4604464022FFF7DAFC802140222046B3 +:10D348000023FFF7D4FC012384F81231D4F8E83520 +:10D35800A0785B689847002010BD13B5694604465D +:10D36800FFF7C3FD9DF8001001F01F03012B0CD03F +:10D3780006D3022B0ED120466946FFF72BFF0EE09D +:10D3880020466946FFF7E2FD09E020466946FFF7B7 +:10D3980009FF04E0204601F08001FFF728FD002086 +:10D3A80002B010BD38B50446002949D190F81131B2 +:10D3B800022B39D1D0F83821D0F824319A4213D928 +:10D3C800C178012908BFD0F82811A2EB030208BFD1 +:10D3D8005B18C0F8382108BFC0F82831D4F82811E4 +:10D3E80092B2FFF752FD1FE0D0F83C21B2FBF3F5F3 +:10D3F80003FB15255DB99A4209D3D0F840319A420A +:10D4080005D22A46FFF741FDC4F840510CE0D4F894 +:10D41800E435DB682BB194F81221032A01D12046A8 +:10D4280098472046FFF752FD94F81631012B10D18A +:10D43800094A236912685A60002384F8163108E003 +:10D44800D0F8E4355B6923B190F81221032A00D1A2 +:10D458009847002038BD00BF186F002010B504465B +:10D4680061BB90F81131032B31D1D0F89023D0F85B +:10D478007C339A4215D9C178012908BFD0F88013A6 +:10D48800A2EB030204BFC918C0F880139A42C0F87F +:10D49800902328BF1A46D0F8801392B2FFF7FEFCFB +:10D4A80015E0D0F8E4351B6923B190F81221032A5E +:10D4B80000D198472046FFF7FAFC08E0D0F8E43599 +:10D4C8009B6923B190F81221032A00D198470020C4 +:10D4D80010BD2DE9F0410446164698460D46069FB4 +:10D4E80001F06EFE20462946C4F8E485C4F8E875C4 +:10D4F800C4F8EC65FFF7ACFBD4F8E8351B6898472F +:10D508002046BDE8F04101F0A3BE10B5D0F8E435DF +:10D5180004461B689847D4F8E8359B68984700206C +:10D5280010BD08B5D0F8E4355B689847002008BD01 +:10D5380008B5FAF763FA002008BD00000A4A52F855 +:10D5480020200346012A0948094A50F8230008BF49 +:10D5580081F0010119B132F82310F9F796BD32F8BC +:10D568002310F9F794BD00BF984F0108C04F010878 +:10D57800AC4F0108052801D8FFF7E0BF704700004D +:10D58800F7B5124B1C781D46ECB90C200121F9F7B0 +:10D5980063FE0F4B53F8243000930E4B012653F8CB +:10D5A80024008DF80460002769468DF806708DF810 +:10D5B8000560F9F725FDE0B239463444FFF7DAFF94 +:10D5C800052CE6D12E7003B0F0BD00BFD463002057 +:10D5D800AC4F0108C04F010810B50024E0B200218B +:10D5E8000134FFF7C7FF052CF8D110BD012008B59D +:10D5F8000146FFF7A3FF03200121FFF79FFF022049 +:10D608000021FFF79BFF00210420FFF797FFFA2076 +:10D61800F8F756F801200021FFF790FF03200021BA +:10D62800FFF78CFF02200121FFF788FF012104206A +:10D63800FFF784FFFA20F8F743F8FFF7CDFF002043 +:10D648000121FFF77BFF014B187808BDD463002048 +:10D65800054B1A7832B9054A1060054A69211170DC +:10D6680001221A70704700BFD6630020D8630020DB +:10D67800D563002010B52DED028BB4EEC01AF1EE83 +:10D6880010FA86B0F0EE608AB0EE418A044604D4FF +:10D69800B4EEE01AF1EE10FA18DD10EE100AF6F703 +:10D6A800D3FECDE9000118EE900AF6F7CDFECDE9DC +:10D6B800020118EE100AF6F7C7FE2246CDE904016A +:10D6C80005480649FDF71EFA002000E0012006B0D3 +:10D6D800BDEC028B10BD00BFB5870008D45101080E +:10D6E8002DE9F04FA1B0002708AE39460C2230468C +:10D6F8000DF12C090497ADF814700DF1380A06F0F5 +:10D70800C6FB39460C224846CB4DCC4C06F0BFFB35 +:10D718000DF1440839460C22504606F0B8FB39464C +:10D728000C22404606F0B3FB21782868192202AB88 +:10D7380000F012FC217828681A220DF1090300F084 +:10D748000BFC217828681B220DF10A0300F004FC69 +:10D75800217828681D220DF10B0300F0FDFB2178CC +:10D7680028681C2203AB00F0F7FB217828681922EF +:10D778003B4600F064FC217828681A22022300F056 +:10D788005EFC217828681B22012300F058FC2178D0 +:10D7980028681D22022300F052FC286821781C22E8 +:10D7A800012300F04CFC4FF0C80B04AF2178009720 +:10D7B8003B220623286800F0ABFB9DF810209DF85B +:10D7C80011302178009743EA02230B9A286802FA5D +:10D7D80083F30B939DF812209DF8133043EA02233C +:10D7E8000C9A02FA83F30C939DF814209DF81530D7 +:10D7F80043EA02230D9A02FA83F30D934322062388 +:10D8080000F086FB9DF910209DF8113043EA0223B1 +:10D81800089A134408939DF912209DF8133043EA9F +:10D828000223099A134409939DF914209DF8153091 +:10D8380043EA02230A9ABBF1010B13440A93B4D1B9 +:10D848005B4659F823204FF0C80B92FBFBF249F8CE +:10D85800232056F8232092FBFBF246F823200133BD +:10D86800032BEED1217828681C22E02300F0E7FB87 +:10D87800286821781B22E02300F0E1FB1920F7F744 +:10D888001FFF04AF217800973B220623286800F089 +:10D898003FFB9DF810209DF811302178009743EA4E +:10D8A80002230E9A286802FA83F30E939DF8122039 +:10D8B8009DF8133043EA02230F9A02FA83F30F9379 +:10D8C8009DF814209DF8153043EA0223109A02FAB5 +:10D8D80083F310934322062300F01AFB9DF81020CF +:10D8E8009DF8113043EA0223119A02FA83F3119347 +:10D8F8009DF812209DF8133043EA0223129A02FA87 +:10D9080083F312939DF814209DF8153043EA0223FF +:10D91800139ABBF1010B02FA83F31393B1D15B465F +:10D928005AF8231058F82320C82091FBF0F192FBF5 +:10D93800F0F24AF8231048F823200133032BEFD1E3 +:10D94800217828681C22002300F079FB21782868B8 +:10D958001B22002300F073FB06AF1920F7F7B0FE77 +:10D96800217828680D223B4600F0F6FA21782868CD +:10D978000E220DF1190300F0EFFA217828680F2222 +:10D988000DF11A0300F0E8FA2178286800220DF159 +:10D998001B0300F0E1FA21782868012207AB00F0A8 +:10D9A800DBFA0DF11D0328682178022200F0D4FA71 +:10D9B8000023FA5C1AA91AB1013A214830F812205A +:10D9C80041F823200133062BF3D1002320AAD718CE +:10D9D80059F803005AF80320DFED1A7A121AC858CA +:10D9E800121A06EE902A07EE100AF8EEE66AB8EE6A +:10D9F800C76A66EEA76ACA18C6EE866AF05847ED87 +:10DA08000C6AD76820AA02EB030E58F80320121AF2 +:10DA1800D21B07EE102AB8EEC77A043327EE277A0E +:10DA280007EE907AF8EEE77A0C2BC7EE277A4EEDE0 +:10DA3800097ACBD108E000BFD8630020D563002065 +:10DA4800D44F01080000C84221789DF808302868A2 +:10DA5800192200F0F4FA21789DF8093028681A2272 +:10DA680000F0EDFA21789DF80A3028681B2200F0B2 +:10DA7800E6FA21789DF80B3028681D2200F0DFFABD +:10DA8800286821789DF80C301C2200F0D8FABAEEEC +:10DA98000C0AF2EE0C0A9DED171A2248FFF7EAFD70 +:10DAA80008B900203BE0BAEE0C0AF2EE0C0A9DED34 +:10DAB800181A1D48FFF7DEFD0028F2D0BAEE0C0A4E +:10DAC800F2EE0C0A9DED191A1848FFF7D3FD00284D +:10DAD800E7D0BAEE0C0AF2EE0C0A9DED141A1448BF +:10DAE800FFF7C8FD0028DCD0BAEE0C0AF2EE0C0AEB +:10DAF8009DED151A0F48FFF7BDFD0028D1D0BAEEED +:10DB08000C0AF2EE0C0A9DED161A0B48FFF7B2FD4F +:10DB18000028C6D009480A49FCF7F4FF012021B0C3 +:10DB2800BDE8F08F1C520108235201082A5201084F +:10DB380031520108375201083D520108B5870008E3 +:10DB480043520108034A03461068034A1178192210 +:10DB580000F075BAD8630020D563002007B5074BDD +:10DB68001978019003230093054B1A2218680223A1 +:10DB780000F08DFA03B05DF804FB00BFD563002008 +:10DB8800D863002007B5074B19780190022300934A +:10DB9800054B1B221868042300F079FA03B05DF8DE +:10DBA80004FB00BFD5630020D863002007B5074BEE +:10DBB8001978019002230093054B1C22186804234E +:10DBC80000F065FA03B05DF804FB00BFD5630020E0 +:10DBD800D863002007B5064B1978064B00901868E3 +:10DBE8003722012300F035FA03B05DF804FB00BFCB +:10DBF800D5630020D8630020034A03461068034A0F +:10DC08001178382200F01BBAD8630020D5630020B1 +:10DC18002DE9F3411D46184B184C0F461978184B3F +:10DC280000948046164618683B220E2300F070F9CF +:10DC38002278637843EA0223A8F80030A278E378D0 +:10DC480043EA02233B802279637943EA0223338043 +:10DC5800227A637A43EA02232B80A27AE37A43EAA0 +:10DC68000223089A1380227B637B43EA0223099AE2 +:10DC7800138002B0BDE8F081D5630020DC6300208A +:10DC8800D863002007B5064B197801230093054B8C +:10DC98006B221868072300F0DCF903B05DF804FB79 +:10DCA800D5630020D863002007B5064B1978064BCA +:10DCB800009018686B22062300F0CBF903B05DF8DA +:10DCC80004FB00BFD5630020D863002007B5074BCD +:10DCD80080F001001978064B009018686B22032326 +:10DCE80000F0B7F903B05DF804FB00BFD56300206E +:10DCF800D863002007B5074B1978019003230093D8 +:10DD0800054B6B221868022300F0C1F903B05DF8D7 +:10DD180004FB00BFD5630020D863002013B5074B70 +:10DD2800074C1978074A0194062300931068752256 +:10DD380000F01AF9207802B010BD00BFD5630020AA +:10DD4800DC630020D863002008B5FFF7E7FFA0F1E7 +:10DD580038035842584108BD08B50D4B1B7883421B +:10DD680001D10C4B04E00C4B1B78834202D10B4BC6 +:10DD7800186808BD0A4B1B78834201D1094BF7E7A5 +:10DD880009480A494FF4A972FCF77EFD002008BD36 +:10DD9800E8010020206F002008020020346F0020D6 +:10DDA800400200201C6F0020D44901085D52010880 +:10DDB80010B5FFF7D1FF00211E220B46BDE8104029 +:10DDC800F8F752B907B5FFF7C7FF0E4B5968C1F30B +:10DDD800080181B102A9002341F8043DF8F7F4F8DD +:10DDE800019B63B1084B4FF080521A60BFF34F8F0D +:10DDF800BFF36F8F03E00A460B46F7F799FF03B0AE +:10DE08005DF804FB00ED00E004ED00E010B5044609 +:10DE18000078FFF7CDFF237B012B02D0237B102B4B +:10DE2800F9D1207BC0B2012803D0207B103818BF5D +:10DE3800012000F0010010BD10B504460078FFF77E +:10DE4800B7FF237B012B02D0237B102BF9D1207B3A +:10DE5800C0B2012803D0207B103818BF012000F081 +:10DE6800010010BD82B0FA230193019B13B1019BFD +:10DE7800013BF9E702B0704770B50446FCF7DCFFD8 +:10DE88000223E370E3691C4A00250326A570667027 +:10DE98001A60E36974221A81184BA360184B6360F7 +:10DEA8002046FCF747FF324601202946F7F70CFFCA +:10DEB800144A106020B129462A462B46F7F738FF46 +:10DEC800032201200021F7F7FFFE0F4A106020B15E +:10DED80000210A460B46F7F72BFF032201200021F9 +:10DEE800F7F7F2FE094A106020B100210A460B46F6 +:10DEF800F7F71EFF012070BD801A0600386F00205A +:10DF0800246F0020206F0020346F00201C6F002039 +:10DF180038B5044680684360A36804981860A3680D +:10DF280049009960A368FF2ADA6014BF4FF0807334 +:10DF3800084B636101250023A37025732046FDF774 +:10DF480079FA20B92046BDE83840FFF75FBF284678 +:10DF580038BD00BF0000010107B500930123FFF79A +:10DF6800D7FF03B05DF804FB37B51C460DF1070376 +:10DF78009DF81850FFF7F0FF58B10122631BAA4023 +:10DF88000133013A9DF807109A400A401A41079B4D +:10DF98001A7003B030BD1FB51C460DF10F03009376 +:10DFA8000123FFF7B5FF9DF80F200123A34013407D +:10DFB800069A137004B010BD38B585686B60836825 +:10DFC800049D1D608368490099608368DA604FF09A +:10DFD8008173436101250023837005730446FDF7AF +:10DFE80029FA20B92046BDE83840FFF70FBF284678 +:10DFF80038BD38B5044640684360636804981860C3 +:10E008006368490099606368FF2ADA6008BF63693A +:10E018004FF0000208BF43F480334FF0010514BFEE +:10E0280062616361A27025732046FDF7ADF920B9DE +:10E038002046BDE83840FFF7FFBE284638BD1FB56B +:10E0480004AC04F8013D01230094FFF7D2FF04B0AB +:10E0580010BDF7B51F460DF107030D4614460646D9 +:10E06800FFF77AFF9DF820109DF807200123BB4099 +:10E0780011B11343DBB201E022EA0303304629461B +:10E0880022468DF80730FFF7DAFF03B0F0BD2DE91F +:10E09800F3411F460DF1070306460D4614469DF849 +:10E0A8002080FFF759FFC8B10122C8EB070102FA27 +:10E0B80008F29DF824300131013A8A408B409DF8DE +:10E0C8000710DBB221EA02011A4041EA0203304696 +:10E0D800294622468DF80730FFF7B1FF02B0BDE8A8 +:10E0E800F08138B545686B604368049D1D604368DE +:10E0F800490099604368DA604FF0817343610125F4 +:10E108000023837005730446FDF73EF920B92046C5 +:10E11800BDE83840FFF790BE284638BD2DE9F041EC +:10E1280004460E460846194615461F46F8F7ADFF41 +:10E1380030463946F8F7A3FFE0B920462946F8F7F4 +:10E14800A4FF4CF2513820462946F8F798FF10B939 +:10E15800B8F10108F7D1FFF785FE20462946F8F700 +:10E1680096FFFFF77FFE20462946F8F78EFFFFF758 +:10E1780079FEDDE720462946F8F787FFFFF772FEAC +:10E1880030463946F8F783FFFFF76CFE30463946CC +:10E19800F8F77DFFFFF766FE30463946F8F775FF5A +:10E1A80020462946F8F771FF4CF251382046294697 +:10E1B800F8F765FF10B9B8F10108F7D14CF25134FE +:10E1C80030463946F8F75BFF08B9013CF8D1BDE89D +:10E1D800F081000010B504460B4622460448054964 +:10E1E800FCF790FC2046BDE81040FFF7EBBD00BFF0 +:10E1F800B58700087752010810B50446044922780B +:10E208000448FCF77FFC2078FFF7DCFD002010BDF8 +:10E21800A4520108B58700080078FFF7D3BD00783D +:10E22800FFF7D0BD10B500234A789A4012F0800F4E +:10E2380014BF4B221D2220F813200133082BF3D1E1 +:10E2480000F10E0400230A789A4012F0800F03F1BF +:10E25800010314BF4B221D22082B24F8022FF2D1F0 +:10E268001E3000238A789A4012F0800F03F10103D0 +:10E2780014BF4B221D22082B20F8022FF2D110BD0B +:10E288002DE9F0410220494E0121F8F7E5FF02206F +:10E2980001210024F8F7F8FF012520234FF0020898 +:10E2A800314643483360102786F80480B471F4710E +:10E2B8007571F8F7A5FE31463D48357186F8078037 +:10E2C8003760F8F79DFE424639480521F8F7E1FE28 +:10E2D800384939480C8068234B600C814C808C721B +:10E2E800F9F7C8F8354934484D8060230B808C60B5 +:10E2F8008C81F9F74DF930480821F9F713FA2E48BF +:10E308002946F9F733FA29464FF40010F8F7A4FF25 +:10E318002B48F8F7F9FC2B492B4B4B602B4B8B60A8 +:10E328004FF400530B624FF40063CB614023CB6082 +:10E338004FF480734B624FF480338B624FF48066E6 +:10E348004FF020631E480B608E614C630C614C617A +:10E358008C63CC620C63F8F75DFD1D480D23437098 +:10E3680007708470C570F9F7DDFA154839462A46F2 +:10E37800F8F78CFD124808212A46F8F787FD0E4861 +:10E3880031462A46F9F700FA032228462146F7F7CC +:10E398009BFC104A106030B1214622462346BDE856 +:10E3A800F041F7F7C5BCBDE8F08100BF5C64002010 +:10E3B80000040240EC630020000400403C6400209C +:10E3C80088600240F863002038040040646400203C +:10E3D800586400203864002038B50C1E05462CDD32 +:10E3E800164B00214FF0FF3218680B46F7F73CFE3A +:10E3F800134B14481C60144B29461D60FFF712FF8D +:10E40800124B1348012294421A601C4604D1002181 +:10E41800302205F03CFD02E0E91CFFF703FF0D4840 +:10E4280002232360302343600121F8F71DFD0A48C9 +:10E438000121BDE83840F9F767B838BD38640020D5 +:10E448003464002064640020506400205464002078 +:10E45800946400208860024000040040F7B5254D10 +:10E468002C683CB924482146F9F74EF82348214640 +:10E47800F8F7FAFC21482249F8F728FD18B11F4897 +:10E488001F49F8F74BFD1D481E49F8F71FFD28B135 +:10E498001A481C49F8F742FD1B4800E01B481C4E6F +:10E4A8002B6834685F1CA7420FDB9C4204DB002109 +:10E4B800302205F0ECFC06E0164B1B6804EB440127 +:10E4C8001944FFF7AFFE0134346033689F420EDA17 +:10E4D800114B01A91868F7F777FD07480021F9F7EC +:10E4E80013F806480021F8F7BFFC00232B6003B09F +:10E4F800F0BD00BF34640020000400408860024082 +:10E5080000440020008800209464002064640020F7 +:10E5180054640020506400203864002010B5074C73 +:10E5280023784BB9064B1860064B5D2205201A70FC +:10E53800F7F7C6F801232370012010BDC564002039 +:10E54800C8640020C46400201FB50C4B187888B13B +:10E558000B4B19780DF10F0300930A4B0F22186823 +:10E568000123FFF7D5FC28B19DF80F00A0F1BD03EA +:10E578005842584105B05DF804FB00BFC56400204F +:10E58800C4640020C864002010B52DED028BB4EEE1 +:10E59800C01AF1EE10FA86B0F0EE608AB0EE418A49 +:10E5A800044604D4B4EEE01AF1EE10FA18DD10EEC9 +:10E5B800100AF5F749FFCDE9000118EE900AF5F7C2 +:10E5C80043FFCDE9020118EE100AF5F73DFF224698 +:10E5D800CDE9040105480649FCF794FA002000E05B +:10E5E800012006B0BDEC028B10BD00BFB587000846 +:10E5F800CA5201087FB5134A03461078F8B1124C85 +:10E60800124E0DF10F058BB1C6238DF80F303178FE +:10E618000095202201232068FFF7EBFC0F238DF8DB +:10E628000F30317800952068102205E03178206895 +:10E638008DF80F30009520220123FFF7DAFC04B093 +:10E6480070BD00BFC5640020C8640020C4640020F9 +:10E65800D0ED007AF5EEC07AF1EE10FA08B514DDC7 +:10E668009FED0B0ADFED0B0A80EE270A03F0F0FDA1 +:10E67800F7EE007A30EE670ADFED077A20EE270A18 +:10E68800DFED067A80EE270A08BD9FED050A08BD72 +:10E69800CDEC7D4454D4423E33139543F4FDD43B32 +:10E6A80000000000F0B51E4B85B00E46197802AB8D +:10E6B80000931C4B044615461868A8220523FFF74B +:10E6C80027FC9DF809309DF80A209FED177A1B0258 +:10E6D80043EA02429DF80830134307EE903A9DF84A +:10E6E8000C209DF80B30FAEECA7A43EA02231BB2DB +:10E6F800C4ED007A07EE903AF8EEE77A0746C7EEDF +:10E70800877A20469FED097A77EE877AC6ED007AF8 +:10E71800FFF79EFF384685ED000A05B0F0BD00BF43 +:10E72800C4640020C86400200000F04300002A42AE +:10E738001FB5144B1B780BB900241FE001A802A9D0 +:10E7480003AAFFF7AFFF9FED100ADFED100A9DED5A +:10E75800011A0F48FFF718FF0028EDD0BBEE040A96 +:10E76800DFED0C0A9DED021A0B48FFF70DFF04467A +:10E778000028E1D009480A49FCF7C4F9204604B04A +:10E7880010BD00BFC56400200000E143008089443B +:10E79800244D01080000A04211530108B587000864 +:10E7A8001D530108824213B5044601DB8A4209DD84 +:10E7B8008DE80600054806491A462346FCF7A2F9E3 +:10E7C800002000E0012002B010BD00BFB58700089E +:10E7D80036530108024B1860024B0C221A7070471E +:10E7E800D0640020CC64002010B5084B084C186891 +:10E7F800084B002219782346FFF7AEFB20B120789A +:10E80800A0F148035842584110BD00BFD064002011 +:10E81800D4640020CC64002013B5084B084C197848 +:10E82800084B0094186802220023FFF7B4FB2078F5 +:10E83800003018BF012002B010BD00BFCC6400201A +:10E84800D4640020D0640020F7B50F4B0F4C0E465F +:10E8580019780F4B009407461546186803220623BB +:10E86800FFF756FB6278237843EA02233B80E2787D +:10E87800A37843EA022333806279237943EA0223A7 +:10E888002B8003B0F0BD00BFCC640020D46400200E +:10E89800D064002013B5084B084C1978084B009435 +:10E8A800186809220323FFF776FB2078003018BF89 +:10E8B800012002B010BD00BFCC640020D464002049 +:10E8C800D0640020034A03461068034A11780A22DC +:10E8D800FFF7B5BBD0640020CC64002007B5064B19 +:10E8E8001978064B009018680C220623FFF7B1FB35 +:10E8F80003B05DF804FB00BFCC640020D0640020A6 +:10E9080013B52B4B18682B4B0A2219780DF101030C +:10E91800FFF722FB002848D00020FFF7D3FF012093 +:10E92800FFF7DCFF1820FFF7CDFFFFF7B3FF152433 +:10E93800FFF772FF38B9013C14F0FF0403D001203F +:10E94800F6F7BEFEF4E701A90DF106020DF102008B +:10E95800FFF77AFF0020FFF7B5FF6FF0C700C82167 +:10E96800BDF90220144BFFF71DFF08B9002417E07A +:10E978006FF0C700C821BDF90420104BFFF712FF44 +:10E988000028F3D00E480F49BDF906200E4BFFF7BB +:10E9980009FF0028EAD00D480D49FCF7B3F8012417 +:10E9A8009DF80100FFF78EFF204602B010BD00BFA2 +:10E9B800D0640020CC640020355201083B52010885 +:10E9C80080F3FFFFE0FCFFFF41520108B587000814 +:10E9D80074530108054B1A7832B9054A1060054A84 +:10E9E8005021117001221A7001207047DB64002049 +:10E9F800DC640020DA6400201FB5084B187850B199 +:10EA0800074B19780DF10F030093064B0022186885 +:10EA18000123FFF7D1FA05B05DF804FBDB640020A1 +:10EA2800DA640020DC64002010B5FFF7E5FF044637 +:10EA380004480CB1044900E00449FCF763F8204697 +:10EA480010BD00BFB58700088D530108AB530108FE +:10EA580013468A18B2F5005F13B50C4608D2064A69 +:10EA68001178064A009010682246FFF7A5FA00E0E0 +:10EA7800002002B010BD00BFDA640020DC64002072 +:10EA88008B18B3F5005F2DE9F34180460F46164613 +:10EA980018D200250124B54212D08CB10B4B19783D +:10EAA80008EB050300930A4B7A19186892B2012300 +:10EAB800FFF717FB04460620F6F702FE0135EAE7E2 +:10EAC800204600E0002002B0BDE8F081DA640020B2 +:10EAD800DC6400202DE9F041DFF8EC8098F8004074 +:10EAE8008AB0002C68D101200146F8F7B5FB0AAEC0 +:10EAF80008200121F8F7C8FB042346F8283D022521 +:10EB080031462F488DF8045008278DF806408DF8B7 +:10EB180007508DF80540F8F773FA314628480097F2 +:10EB2800F8F76EFA264829462A46F8F7B2FA2A462E +:10EB380023480321F8F7ADFAFF23224803930DEB8E +:10EB48000701ADF80840ADF81040ADF80A408DF85F +:10EB58001240F8F78FFC60230126ADF814301948ED +:10EB6800ADF816604FF4807305A9ADF8243007940A +:10EB7800ADF82050F8F750FD12483946F8F7DCFD9B +:10EB88001048ADF8204005A9F8F788FD0D4839462A +:10EB9800F8F7DAFD0B483146F8F7E8FD0948214651 +:10EBA800F8F7B4FD07482146F8F7B2FD05483146A5 +:10EBB800F8F7AAFC88F800600AB0BDE8F08100BF49 +:10EBC80000000240000C0040E064002038B5064D0B +:10EBD800044621462846F8F799FD28462146BDE80F +:10EBE8003840F8F795BD00BF000C0040034991FB81 +:10EBF800F0F10022024889B2F8F783BC1C0705002F +:10EC0800000C004013B54FF480000121F8F724FBF5 +:10EC1800154B164A5A604021154A9A60D9604FF43C +:10EC280080624FF400319A61996200224FF02061AE +:10EC38005A631A621A615A61DA619A635A62DA622D +:10EC48001A63196046238DF8043001240D2301A8A6 +:10EC58008DF805308DF806208DF80740F8F762FE2C +:10EC6800044B1C7002B010BD406500200414014024 +:10EC7800EA640020E864002070B504208AB001210D +:10EC8800F8F7EAFA20200121F8F70AFB012580238A +:10EC980002264248029302A900248DF80C608DF8E0 +:10ECA8000F50F8F7ADF940233C48029302A98DF8BC +:10ECB8000D508DF80E408DF80C60F8F7A1F9374823 +:10ECC80006210822F8F7E5F9082234480721F8F761 +:10ECD800E0F9334B06930C2306A93248ADF82230ED +:10ECE8004FF40073ADF82430ADF81C40ADF81E4069 +:10ECF800ADF82040F8F752FDFFF784FF47238DF861 +:10ED0800043001A807238DF805308DF806408DF8EA +:10ED18000750F8F707FE032228462146F6F7D4FFE6 +:10ED2800214A106020B1214622462346F7F700F811 +:10ED3800012100222820F6F7C7FF1C4B012218608A +:10ED480040F225511748F8F7A0FD01200146F8F7D1 +:10ED580083FA10250124002602A915480396029576 +:10ED68008DF80C608DF80F40F8F74AF90DEB0500A7 +:10ED780004958DF814608DF815508DF81640F8F745 +:10ED8800E5F80C4B07484FF480621A602146F8F703 +:10ED98005FFD094B1C700AB070BD00BF000802403F +:10EDA80040420F0000140140E46400203C6500204C +:10EDB8000000024000E100E03465002008B5064B81 +:10EDC80001464FF47A7218680023F7F74DF9431E8D +:10EDD8005842584108BD00BF3C650020074B1B78CE +:10EDE80053B10844814207D0054B1A881206FBD557 +:10EDF80011F8012B9A80F5E7704700BF34650020B1 +:10EE08000014014007B502A941F8040D0120FFF7DD +:10EE1800E5FF9DF8040003B05DF804FB38B5194B15 +:10EE28001B7804460D4663B3174B002118684FF052 +:10EE3800FF320B46F7F718F91448F8F723F80028BB +:10EE4800FAD122462946124805F016F8114B124904 +:10EE58000E481C600C61F7F7DDFF0C4810210122F9 +:10EE6800F8F714F80D4880210122F8F705FD0B4842 +:10EE78004021F8F723FD05480121BDE83840F7F7A0 +:10EE8800F3BF38BDE8640020E4640020B8640240A1 +:10EE9800EA6400203065002040650020001401402D +:10EEA80073B5104E002402AD22463046102145F8B5 +:10EEB800044DF7F7EBFF30464FF02051F8F72EF8E6 +:10EEC800224609488021F8F7D7FC30462146F7F753 +:10EED800CBFF064B1C60064B29461868F7F774F8F9 +:10EEE80002B070BDB86402400014014038650020CB +:10EEF800E464002013B500231E48019340F22771F3 +:10EF0800F8F7E0FCE8B11C4B1A481A6862B11B4CD0 +:10EF18001B4923780978994206D9D15CF8F7A4FCF3 +:10EF28002378013323700CE040F227710022F8F7B0 +:10EF3800ACFC02A9002341F8043D124B1868F7F70E +:10EF480043F80C4840F22771F8F7DBFC094840F217 +:10EF58002551F8F7B7FC58B10648F8F789FC0A4B71 +:10EF680002A901AA01F8050D18680023F6F7CEFFDB +:10EF780002B010BD001401402C650020E964002097 +:10EF880035650020E46400203C65002070B5102041 +:10EF9800F8F720F823481021F8F771F8012820D154 +:10EFA8002148F7F76FFF01283AD11F4810210022A6 +:10EFB800F7F76CFF1C480021F7F756FF1A48F7F7D8 +:10EFC80061FF0028FAD118484FF02051F7F7A6FF43 +:10EFD8001548F7F754FF154B1860154B01221A70A6 +:10EFE80070BD134D2B78DBB10F4C104E2046318885 +:10EFF800F7F743FF0F4B32681B689B1A0E4A1344FE +:10F00800E360012220461021F7F740FF0B4840211A +:10F01800F8F754FC20460121F7F726FF00232B7050 +:10F0280070BD00BF00000240B8640240386500208F +:10F03800E164002030650020EA64002000140140EB +:10F04800FFF7A4BFFFF756BFFFF754BFFFF752BF44 +:10F05800FFF726BF08B57D20F8F746F948B1F8F75D +:10F0680057F905490548FBF74DFDFBF72DFC002036 +:10F0780008BD012008BD00BFCB530108B5870008B3 +:10F0880008B545F25550F8F781F80320F8F784F8E9 +:10F098006620F8F787F8F8F78BF8BDE80840F8F726 +:10F0A8008FB80000F0B5224E347889B0002C3CD1DE +:10F0B80010200121F8F7E8F84FF6FF7306931D4872 +:10F0C800ADF81C40532305A9ADF81430ADF816402F +:10F0D8008DF81E40F8F7CEF916480121F8F714FA12 +:10F0E80004200121F8F7B8F8012501A94FF40067B9 +:10F0F8001148029401978DF808408DF80B50F7F7E6 +:10F108007FFF102303A88DF8113003978DF8104066 +:10F118008DF81250F7F71AFF02200B21F8F738FC88 +:10F12800064B4FF480725A60357009B0F0BD00BFCD +:10F1380080650020001000400008024000E100E067 +:10F1480008B54FF40060F7F74BFF012829D1154A9D +:10F1580015481388154901339BB21380144B1A883C +:10F1680092B212B9426A92B20FE0426A114892B260 +:10F17800028002880988521A0F4992B20A800A88C6 +:10F18800392192B2B2FBF1F20C490A801A8892B284 +:10F1980082F001021A804FF40060BDE80840F7F7DA +:10F1A80029BF08BD7C650020001000404A6F002080 +:10F1B8007E6500204C6F00204E6F0020486F0020B5 +:10F1C80073B501200146F8F747F8204C4FF4C853AF +:10F1D8000093022303268DF8043020460023694655 +:10F1E8008DF806308DF807308DF80560F7F708FFC1 +:10F1F800204608210A22F7F74CFF20460B210A2255 +:10F20800F7F747FF20460A220C21F7F742FF0125AE +:10F218004FF480632046694600938DF806508DF8B8 +:10F2280007508DF80560F7F7EBFE0A210A462046DD +:10F23800F7F72FFF29464FF48040F8F731F8802080 +:10F248002946F8F715F802B070BD00BF000002406B +:10F2580007B54FF44070F8F75BFB43238DF8043093 +:10F268000A238DF8053000238DF8063001A8012304 +:10F278008DF80730F8F756FB03B05DF804FB7823E8 +:10F2880058430723B0FBF3F0002301338342FCD932 +:10F2980070474FF47A735843FFF7F1BF0020704767 +:10F2A80008B50B4C204600F0CBF92146094C11F863 +:10F2B800012B2046531E00F8013B04F0DDFD064BF0 +:10F2C8000022186821461346F6F732FDE9E700BF29 +:10F2D800E865002081650020E465002008B5084B3A +:10F2E8000146642218680023F6F7BEFE012804D1FF +:10F2F8000449F8F7DBFF002008BD4FF0FF3008BDD8 +:10F30800E46500200401002010B503781F2B044693 +:10F3180004D90D480D496022FBF7B6FA0C4863780A +:10F32800037022781E2A03D80130A11C04F0A4FD22 +:10F338002478084901340220F8F7B8FF2046044928 +:10F3480000F08EF910BD00BF1B54010831540108AC +:10F35800A16500200401002030B50E4D2C7885B041 +:10F36800ACB900F041F9202122460520F6F7ACFCA3 +:10F37800094B0A49186003238DE8180002942346B4 +:10F38800039407489622F5F7E9FE01232B7005B090 +:10F3980030BD00BFE1650020E4650020435401084A +:10F3A800A9F2000800487047CC02002012230B8005 +:10F3B800004870470003002004230B800048704772 +:10F3C800FC02002010B5044C04480A462146FDF70B +:10F3D80061FF204610BD00BF186E00204B54010885 +:10F3E80070B588B000238DF81C300D4B0A4613F811 +:10F3F800011F0C4C01A80E0900EB43050A48A65D45 +:10F40800465501F00F010130615C415507498B42B7 +:10F41800EDD101A80649FDF73DFF054808B070BDCC +:10F428000F7AFF1FA4540108E00B01C01B7AFF1FCD +:10F43800186E002008B50A4608B9044800E00448D8 +:10F448000449FDF727FF034808BD00BF57540108CA +:10F45800714E0108186E002010B5044C04480A4685 +:10F468002146FDF717FF204610BD00BF186E00208B +:10F478007854010808B50A4608B9044800E0044869 +:10F488000449FDF707FF034808BD00BF835401087E +:10F4980091540108186E002039230B8000487047EA +:10F4A800600300207047704770477047704700003E +:10F4B80073B5282303FB01010B4DD1F88C332B7056 +:10F4C80002AA0A4B0024064642F8044D2946186849 +:10F4D8002346F6F71BFD012130466A184023FDF745 +:10F4E8003FFC204602B070BDB8660020AC66002024 +:10F4F80008B500F039FFBDE80840F8F7DFBD08B5EA +:10F5080000F032FFBDE80840F8F7D8BD10B58121FA +:10F518000446FDF70DFC20460121FDF709FC0020FB +:10F5280010BD000010B58121044640220223FDF7DA +:10F53800DEFB2046012140220223FDF7D8FB2046AE +:10F548000121034A4023FDF70BFC002010BD00BF3A +:10F55800B966002037B502AA002342F8043D094CD9 +:10F56800094B054621461868F6F73EFE012806D1E4 +:10F5780022462846812112F8013BFDF718FC00209D +:10F5880003B030BD6A660020B466002037B502AA11 +:10F59800002342F8043D094C094B054621461868EA +:10F5A800F6F722FE012806D122462846812112F8C4 +:10F5B800013BFDF7FCFB002003B030BD6A6600206C +:10F5C800B466002008B58B88064A012B136002D167 +:10F5D800FFF7E8FE01E000F0C7FEF8F76FFD002036 +:10F5E80008BD00BF5C03002007B50E4B00930E4812 +:10F5F8000E4B0F4A0121FDF76CFF41210022052027 +:10F60800F6F762FB0B4B4121186000220120F6F748 +:10F618005BFB094B1860094B01221A7003B05DF8B7 +:10F6280004FB00BF14030020506F002030030020AB +:10F63800E0020020AC660020B4660020B06600201E +:10F6480010B50446054B214618684FF0FF320023D9 +:10F65800F6F70AFD0128F5D110BD00BFAC66002001 +:10F6680010B5094C0246204600F8012B04F004FCB2 +:10F67800064B2146186864220023F6F759FB431EFF +:10F688005842584110BD00BF29660020B4660020CA +:10F6980070B52DED028B534B19781E46002940F0AA +:10F6A8009D80514A514B1170197015461C46F5F74B +:10F6B8008FFEB0F57A7FFAD34D48FEF7DDFB4C4854 +:10F6C800FDF7C6FFFEF740FB10B14A484A4901E082 +:10F6D80048484A49FBF716FAFEF7D4FA3220F5F7FC +:10F6E800EFFF0020FEF7E0FA0120FEF7EFFA002016 +:10F6F800FEF782FA0120FEF76DFA0120FEF7FAFA0A +:10F708000320FEF73FFA0220FEF750FA0120FEF729 +:10F7180019FA0220FEF722FA3548FFF75BF8FFF7DF +:10F7280063F838B1012316202B70FFF7CBF8314866 +:10F73800334901E02F483349FBF7E4F92C48FEF739 +:10F74800EDFEFEF701FF38B10120FEF753FF01235C +:10F75800237028482C4901E026482C499FED2C8A23 +:10F76800DFED2C8AFBF7CEF92B4B0022DA7103F17F +:10F778000C029A60294B2A4A1A602A4B0D221A70E9 +:10F7880002F05AFB20EE080A80EE280A02F050FC2C +:10F79800254B83ED000A02F04FFB20EE080A80EEAD +:10F7A800280A02F089FC214B83ED000A02F054FB81 +:10F7B80020EE080A80EE280A02F03AFC1C4B83ED82 +:10F7C800000A02F049FB20EE080A80EE280A02F03F +:10F7D80073FC184B83ED000A01233370BDEC028BD8 +:10F7E80070BD00BF126700201A6700203067002034 +:10F7F80040020020B5870008B4540108D754010816 +:10F80800FC5401081E5501084255010864550108B9 +:10F81800DB0F49400000344350750020FC6600208F +:10F8280019FCFFFF22670020447500204C7500205A +:10F83800487500205C78002010B50D4B1C782CB959 +:10F848000C480D49FBF75EF9204600E001200B4B00 +:10F858001B78184003D0FFF753F8094B1870094B71 +:10F868001B78184003D0FEF763FF074B187010BDD4 +:10F8780012670020B5870008885501081A6700201C +:10F8880099030020306700209B0300202DE9F04FEA +:10F89800B24D87B08146B24800952B1D0193821C5A +:10F8A800AB1C8846811EFEF7B3F9AE4B29889A68CF +:10F8B80011809A68698851809A68A98891809A68A5 +:10F8C8009C79063203F543718A4223BF03F10C0287 +:10F8D8009A6001229A6028BFDA71A24A002C40F08F +:10F8E8008B80D379002B79D000200021CDE9040149 +:10F8F800CDE90201134626462746DDE902ABB3F8F7 +:10F908000CC01A8AB3F80EE0CCFB8CABCDE902AB85 +:10F91800DDE904AB04FA82F4C2FB8201924A0633A1 +:10F92800CEFB8EAB934207FA8CF706FA8EF6CDE93A +:10F9380004ABE2D18D4B01221A7087FB0723002A02 +:10F9480073F1000E02DA7F3243F100034FEAD21E50 +:10F958004EEA436E029BCEEB0303B3F57A6F3DDAB2 +:10F9680086FB0623002A73F1000E02DA7F3243F188 +:10F9780000034FEAD21E4EEA436E049BCEEB03030C +:10F98800B3F57A6F2ADA84FB0423002A73F1000E98 +:10F9980002DA7F3243F10003D10941EA4361401A98 +:10F9A800B0F57A6F1ADADFF804B2DBF8003003F545 +:10F9B8007A7AF5F70DFD824510D2F5F709FD694B06 +:10F9C800CBF80000802297FBF2F796FBF2F694FB47 +:10F9D800F2F401221F805E809C809A71614B9B79B2 +:10F9E80053B1062000F0AAFF04206149F8F79EFCF5 +:10F9F80003206049F8F75AFC5F4B604F1E78B7F94F +:10FA080000005F4A5F4C3146FAF728FF31462080F4 +:10FA18005D4AB7F90200FAF721FF314660805B4A78 +:10FA2800B7F90400FAF71AFFB4F90230B4F9001074 +:10FA3800574AA08007EE900A05EE903A554BB5F963 +:10FA4800000093ED004A544BB8EEE76AD3ED006A24 +:10FA5800524BF8EEE55A26EE047AD3ED004AA5EEAD +:10FA6800A67A66EEC66ABDEEC77AE5EE846A8DEDC3 +:10FA7800027ABDF9083007EE103A494BF8EEC77A1A +:10FA880093ED005A07EE101AF8EEC73A25EE677A9A +:10FA98004942A3EEA47A67EEA47ABDEEC77A17EEC0 +:10FAA800103ABDEEE67A138017EE103A07EE101AF8 +:10FAB800B8EEC77A5380E7EE057A2A49DFED396A4E +:10FAC800FDEEE77A17EE903A9380B1F900301B1AF1 +:10FAD80007EE103AB8EEC77A27EE267A89ED007A53 +:10FAE800B1F90200B5F902301B1A07EE103AB8EE68 +:10FAF800C77A27EE267A89ED017AB5F90430B1F98B +:10FB080004105B1A07EE903AF8EEE77AB2F9003083 +:10FB180067EEA67A5B42C9ED027A07EE903ADFED0E +:10FB2800226AF8EEE77A67EEA67AC8ED007AB2F9AB +:10FB3800023007EE103AB8EEC77A27EE267A88ED3B +:10FB4800017AB2F9043007EE903AF8EEE77A67EEF8 +:10FB5800A67AC8ED027A07B0BDE8F08F24670020C6 +:10FB68002C67002050750020507800201267002074 +:10FB7800C40000201C010020226700202A67002002 +:10FB8800006700200C670020046700200867002039 +:10FB980014670020487500205C7800204475002018 +:10FBA8004C75002000007A3D00008039FC6600207A +:10FBB80070B52DED068B88B0F5F70AFC0646FDF703 +:10FBC8008FFD0446002864D0F5F702FC801BB0F5D1 +:10FBD8007A7F324D0AD202A805A9FFF757FEAB7902 +:10FBE800002BF1D02E482F49FAF78CFFAD79002D64 +:10FBF8004AD09DED079ADDED069A9DED050A9FED29 +:10FC08002A8A9FED2AAA69EE097AB1EE400AE9EE3E +:10FC1800A97AF1EEE77A80EE270A02F08BFA20EE55 +:10FC2800080AC0EE0A8A89EE890A02F083FA20EEF1 +:10FC3800080AF1EE047A80EE0A0AB0EEC07AB4EE51 +:10FC4800E77AF1EE10FA0BD5B0EEE87AB4EEE77A7F +:10FC5800F1EE10FA04D516491148FAF753FF18E0E7 +:10FC680010EE100AF4F7F0FB044618EE900A0D4661 +:10FC7800F4F7EAFB2246CDE900012B4608480D4976 +:10FC8800FAF740FF002404E005480B49FAF73AFF69 +:10FC98002C46204608B0BDEC068B70BD5075002080 +:10FCA800B58700089B55010800003443DB0F494025 +:10FCB800B9550108D355010807560108014B987931 +:10FCC800704700BF5075002038B51446FFF7DEFDB9 +:10FCD800184B1B7843B3184D2846A91C2A1DFEF75C +:10FCE800B3FDFEF7D7FDB5F90030DFED146A07EE76 +:10FCF800103AB8EEC77A87EE267A84ED007AB5F91D +:10FD0800023007EE103AB8EEC77A87EE267A84ED0D +:10FD1800017AB5F9043007EE903AF8EEE77AC7EEC3 +:10FD2800A67AC4ED027A38BD002323606360A3601D +:10FD380038BD00BF1A6700201C670020CDAC2644E0 +:10FD4800014B1878704700BF306700200B4B83EDDC +:10FD5800000A0B4BD3ED007AF4EEC07AF1EE10FAFC +:10FD680048BF83ED000A074BD3ED007AF4EEC07A62 +:10FD7800F1EE10FAC8BF83ED000A70474C67002007 +:10FD8800346700209C0300201FB50D4C2378ABB9C5 +:10FD980000930193029303930A490B489622F5F7BF +:10FDA800DDF90A4A0123237000EE102A084BC3F834 +:10FDB800012004B0BDE81040FFF7C8BF04B010BD73 +:10FDC80050670020AC56010855FE0008CDCC6C40A9 +:10FDD80038670020014B1878704700BF5067002033 +:10FDE800014B93ED000A70474C670020064B50F812 +:10FDF800022F1A6042685A60027A1A72D3F80130E8 +:10FE080000EE103AFFF7A2BF3867002038B50D4B57 +:10FE18001878C0F3400500F00104F5F7D9FA0A4B49 +:10FE28001B6824B1002D14BF0120022038BD3DB944 +:10FE3800C01A41F2883398428CBF0320002038BD95 +:10FE4800204638BD38670020446700202DE9F0417E +:10FE580005212DED028B0020F5F772FCF5F7B8FAB5 +:10FE6800454C464D206028604FF4FA70F5F728FCA1 +:10FE78000026DFF82881424F6420F5F721FCF5F7CA +:10FE8800A7FA98ED007ADFED3F7AB4EEE77AF0EE64 +:10FE9800087AF1EE10FAB4EEE77AC8BF2060F1EE06 +:10FEA80010FAC8BF2860B0EE678AFFF7AFFFB0420C +:10FEB800387035D003282FD8DFE800F0230C021D56 +:10FEC80000203149F8F732FA00203049F8F7EEF906 +:10FED80003200CE004202E49F8F728FA00202B49CB +:10FEE800F8F724FA00202849F8F7E0F9022000F092 +:10FEF80025FD002011E004202549F8F7D7F9042052 +:10FF080008E000202049F8F711FA00201F49F8F707 +:10FF1800CDF9012000F012FD0120F8F7CBFB3E7867 +:10FF28003B782BB3012BA4D1D8ED007AF4EEC87A34 +:10FF3800F1EE10FA11D49FED177AF4EEC77AF1EECC +:10FF480010FA0CDC144B0021B3EC017AF4EEC77AFA +:10FF5800F1EE10FA04DD0131F6E7002100E0092195 +:10FF6800642359430848C1F57A72F8F7DBF980E74A +:10FF7800F9F76AF87DE700BF44670020486700206A +:10FF880051670020CDCC4C40DC000020340100201B +:10FF9800F400002033338340845601084C67002066 +:10FFA80008B5FFF733FF03281ABFB0FA80F04009FD +:10FFB800012008BDF0B500258BB02E462F46002441 +:10FFC8000DF10300FEF7FAFE0028F8D0062C62D8DF +:10FFD800DFE804F0040B12192A3C43009DF80340A3 +:10FFE800A4F1BC035C425C41EAE79DF80330CF2BE7 +:08FFF8000CBF02240024E3E722 :020000040801F1 -:10000000114A585C9E5C400800EB5600E0541944CD -:100010001A4448785678400800EB5600687090788B -:100020008A780333520802EB50021B2BAA7005F1A9 -:100030000305E4D1024A13680133136070BD00BFA9 -:10004000B85F0020516000200460002010B500F16E -:100050001B0421B9134A1368092B09DD17E0034675 -:1000600000221A705A709A700333A342F8D1F1E754 -:10007000D9070CD5002101704170FF218170033038 -:10008000A042F7D10133132B09DD002307E0002143 -:100090000170417081700330A042F8D1F2E7136023 -:1000A00010BD00BF4860002013B504462E492F48FC -:1000B000F9F70AFF2E4B1860F9F76CFFA21C1D34EC -:1000C0002C482D49D0ED007AD1ED006A9FED2B7AB6 -:1000D00076EEE76A70EE677AC7EE266A9FED287AB9 -:1000E000B0EE476AA6EEA76AB4EEC76AF1EE10FA60 -:1000F0000BDCB5EEC06AF1EE10FA08D4FCEEC67A5D -:10010000CDED017A9DF8043002E0FF2300E00023EA -:1001100002F8023C002302F8013CD0ED007AD1ED58 -:10012000006A76EEE76A30EE676AC7EE266ADFEDB0 -:10013000157AE6EE867AF4EEC77AF1EE10FA0BDC69 -:10014000F5EEC07AF1EE10FA07D4FCEEE77ACDEDC9 -:10015000017A9DF8043000E0FF2302F8033BA2423D -:10016000AED102B010BD00BFE0420108FE4201085E -:1001700070600020C80300201004002000007FC32E -:1001800000007F4300000000F8B5464E464D474F43 -:100190000446306800280FDA45494648F9F794FECE -:1001A000454930604348F9F78FFE4449286041488B -:1001B000F9F78AFE3860F8BDF9F7ECFEFDEEC07A7B -:1001C000286817EE906AF9F7E5FEFDEEC07A386808 -:1001D00017EE905AF9F7DEFE394A96423146B8BF1B -:1001E0001146B1F5007FBDEEC00AA8BF4FF4007103 -:1001F000954210EE103A2846B8BF1046B0F5007F81 -:10020000A8BF4FF400709342B8BF1346B3F5007F08 -:100210001A46A8BF4FF400720029ACBF01234FF06B -:10022000FF33002801FB03F1ACBF01234FF0FF3384 -:10023000002A00FB03F04FF00205A8BF012391FB49 -:10024000F5F1B8BF4FF0FF33042990FBF5F0D8BFAC -:1002500000210428D8BF00205A4392FBF5F3042B59 -:10026000D8BF0023B3F5807F08BF4FF0FF33B0F550 -:10027000807F08BF4FF0FF30B1F5807F08BF4FF09F -:10028000FF31C2B2DBB2C9B204F11B00237062704D -:10029000A17003348442F9D10A4A137801331370F0 -:1002A000F8BD00BFC403002038600020E45F0020D8 -:1002B0005F390108793A0108DA370108693A01081B -:1002C00000FEFFFFBC5F0020F0B52DED028B044661 -:1002D00083B0A9B9D44FD54E3B68D54D002B1ADA5F -:1002E000D449D548F9F7F0FDD4493060D248F9F740 -:1002F000EBFDD3492860D048F9F7E6FD38608EE180 -:10030000034600F11B0100221A705A709A700333E1 -:100310008B42F8D1DEE73068F9F73CFE2868B1EE91 -:10032000408AF9F737FEF3EE047AB4EEE78AF1EE8D -:1003300010FAB1EE400A00F36A81BBEE047AB4EE23 -:10034000C78AF1EE10FAB4EEE70A00F13E81F1EE51 -:1003500010FA00F34381FBEE047AB4EEE70AF1EE03 -:1003600010FAB5EEC08A00F14581F1EE10FA0CDB0F -:10037000F7EE007A0BE0B4EEC70AF1EE10FA40F1A6 -:100380002A81B0EE470AB0EE478AFFEE007A67EEA8 -:10039000887AB5EEC00A27EE888AF1EE10FABFEE31 -:1003A000007AF7EE007AB8BFF0EE477A67EE807A0F -:1003B000DFEDA46A60EE277AB2EE040A38EE007A26 -:1003C000B4EEE67AF1EE10FA0BDCB5EEC07AF1EE9F -:1003D00010FA08D4BCEEC76A8DED016A9DF80430AE -:1003E00002E0FF2300E00023B4EEE67AF1EE10FA1B -:1003F00084F821300BDCB5EEC07AF1EE10FA08D4A7 -:10040000BCEEC76A8DED016A9DF8043002E0FF235F -:1004100000E00023B4EEE67AF1EE10FA23700BDC74 -:10042000B5EEC07AF1EE10FA08D4BCEEC77A8DEDC5 -:10043000017A9DF8043002E0FF2300E0002330EE53 -:10044000677AE370B4EEE67AF1EE10FA0BDCB5EE03 -:10045000C07AF1EE10FA08D4BCEEC76A8DED016ADD -:100460009DF8043002E0FF2300E00023B4EEE67ABA -:10047000F1EE10FA23720BDCB5EEC07AF1EE10FA51 -:1004800008D4BCEEC76A8DED016A9DF8043002E025 -:10049000FF2300E00023B4EEE67AF1EE10FAE372F7 -:1004A0000BDCB5EEC07AF1EE10FA08D4BCEEC77AD8 -:1004B0008DED017A9DF8043002E0FF2300E0002377 -:1004C00030EE488AA373B4EEE68AF1EE10FA0BDC44 -:1004D000B5EEC08AF1EE10FA08D4BCEEC87A8DED04 -:1004E000017A9DF8043002E0FF2300E00023B4EE1F -:1004F000E68AF1EE10FAE3730BDCB5EEC08AF1EE9A -:1005000010FA08D4BCEEC87A8DED017A9DF804305B -:1005100002E0FF2300E00023B4EEE68AF1EE10FAD9 -:10052000A3740BDCB5EEC08AF1EE10FA08D4BCEE71 -:10053000C88A8DED018A9DF8043002E0FF2300E0B7 -:10054000002337EE800A6375B4EEE60AF1EE10FA86 -:100550000BDCB5EEC00AF1EE10FA08D4FCEEC07A5E -:10056000CDED017A9DF8043002E0FF2300E0002386 -:10057000B4EEE60AF1EE10FAA3760BDCB5EEC00A93 -:10058000F1EE10FA08D4FCEEC07ACDED017A9DF8B8 -:10059000043002E0FF2300E00023B4EEE60AF1EEAF -:1005A00010FA63770BDCB5EEC00AF1EE10FA08D44E -:1005B000BCEEC00A8DED010A9DF8043002E0FF2375 -:1005C00000E0002384F8203029E0F1EE10FA7FF7F4 -:1005D000D2AEB0EE670AB0EE478AD6E6B5EEC08A74 -:1005E000F1EE10FA10DB28EE088AB3EE040AF7EEFB -:1005F000007ADBE6F1EE10FA06DBB0EE670A28EED1 -:10060000088AFFEE007AD1E6B0EE670ABDE6B4EEE6 -:10061000E70AF1EE10FAB0EE678AE4DC9BE603B07D -:10062000BDEC028BF0BD00BF040400203060002050 -:1006300074600020943A0108AA3A01088F3A010830 -:100640009E3A010800007F43F8B52DED028B474F1D -:10065000474E3B78474D04465BB947494748F9F751 -:1006600033FC474930604548F9F72EFC01232860E8 -:100670003B703068F9F78EFC2868F0EE408AF9F795 -:1006800089FCB5EE400AF1EE10FAB0EE408A11D0C6 -:1006900088EE800A00F0E8FCDFED3A7AB5EEC08A19 -:1006A000F1EE10FA30EE270A06D5DFED377A30EE9C -:1006B000270A01E09FED350ADFED357ADFED356A77 -:1006C000B2EE027A20EE070AB0EE046A80EE270A44 -:1006D000A01C002268EE087AE8EEA87AF1EEE77A2C -:1006E000F4EEE67AF1EE10FAD4BFFDEEE77ADFED34 -:1006F0002A7AF8EEE77AF0EE476A87EE866A07EE26 -:10070000102AB8EEC77AF1EE005A30EE477A01327D -:10071000B0EEC77AB4EEE57AF1EE10FAC8BF36EE65 -:10072000C77AF0EE675AE7EE465ABDEEE57A17EE65 -:10073000103AFF2BDABF23EAE371C9B2FF21FF2B86 -:1007400000F8021CDABF23EAE371C9B2FF21FF2BD4 -:10075000DABF23EAE373DBB2FF23092A00F8011CA6 -:1007600000F8033BCBD1BDEC028BF8BD3C60002010 -:100770004C60002040600020943A0108AA3A010829 -:100780008F3A0108DB0FC93FDB0F49400000000032 -:10079000DB0FC94000007F43FF00000008B5FEF7F3 -:1007A000D3FD20B100210A48F9F742FC03E00948D3 -:1007B0000921FDF713FA084B08481B7810211BB1DB -:1007C000BDE80840F6F733B9BDE80840F6F731B99F -:1007D000B1080108BD5F00202C6000200004024029 -:1007E00041B100F11B02002303704370837003309A -:1007F0009042F8D17047000070B5254A09B1002336 -:100800001360D2ED007A224B224C234DB7EE007AD2 -:10081000F4EEC77AF1EE10FA49BF9FED207A83ED2E -:10082000007A77EE877AC3ED007A237803EB4301F1 -:100830006A186E5C5578917800F11B02067045705D -:10084000817003309042F9D1154D1648297802780D -:100850000131C9B20132D2B204292970027009D91A -:10086000002101332970032193FBF1F101EB4101D8 -:100870005B1A23700C2A09D90B4A002303701378E2 -:10088000B3FA83F35B091370084A137070BD00BF9D -:10089000446000207860002005450108CDCC4C3D27 -:1008A000506000206C600020036000202C6000205D -:1008B00008B50C4A0C4B12681B68934201D90B48CF -:1008C0000BE00B4A0B48116813600B4AC91A52F827 -:1008D000232018BF0121904706480921BDE80840A0 -:1008E000FDF77CB93460002014040020BD5F0020B7 -:1008F00020600020E85F0020CC03002030B585B0E8 -:10090000FDF7C0F8144B154804A90C221A601023F7 -:100910000024012541F8083D8DF80C508DF80E405B -:100920008DF80F40F6F73EF80D4B00932A4637211D -:1009300023460C48F5F7AEFB0B4B05461860F4F761 -:1009400079FD642302460093284621462346F5F7A5 -:10095000C7FB05B030BD00BF34600020000402407A -:100960009D0701087744010828600020094B1B7887 -:100970005BB10023084A1A445179BC2902D192790B -:10098000824204D00833282BF4D100207047012084 -:10099000704700BFA2600020796000202DE9F84375 -:1009A0003B4F3B78002B71D13A4EFFF75BF8304656 -:1009B000FFF79CF838B1384838493278F9F776FCB7 -:1009C0004FF0000921E036493348F9F76FFCF7E7AB -:1009D000DFF8F88008EBC5042846002108222346EA -:1009E000FFF720F9D0B118F83520EB2A13D12046B3 -:1009F0000721F9F769FCE379C2B29A42264827D069 -:100A00002849F9F753FC09F1010933785FFA89F5B0 -:100A1000AB42DDD808E02048234902E01E482349C4 -:100A20002A46F9F743FCEEE70120FFF79FFF28B1C4 -:100A3000FFF764FF18481E49F9F738FC0320FFF759 -:100A400095FF08B100F0CAF801233B70BDE8F883B8 -:100A500018492A46F9F72AFC174918F835200E4894 -:100A6000F9F724FC1549D4F801200B48F9F71EFCCE -:100A7000134962790848F9F719FC1249A279064826 -:100A8000F9F714FC04481049E279CAE7BDE8F88395 -:100A9000A1600020A26000207D8000080E450108B2 -:100AA0002A45010842450108604501087F450108C3 -:100AB000A6450108C3450108DB450108E8450108D2 -:100AC000F745010804460108114601087960002035 -:100AD00010B5144B187820B3134B1B785BB100236F -:100AE000124A1A445179BC2902D19279FF2A07D0BF -:100AF0000833282BF4D10124FFF746F8204010BD1D -:100B0000FEF79CFB044600F09FF8204010F0FF0425 -:100B100002D00748074901E005480749F9F7C6FB35 -:100B2000EAE710BDA1600020A260002079600020EB -:100B30007D8000081E4601084146010830B5437813 -:100B400013F003038BB0044602D0012B0FD02BE02F -:100B5000837833BB03238DF8043001238DF80530EF -:100B6000C3788DF8063001A8FEF710FE19E08378EF -:100B70008BB1012B18D10D4D1D222968033002F0D5 -:100B800096FA286802F08BFA1D289ABF0130C0B28D -:100B90001E20207005E00223C0F8033005230370F7 -:100BA00000E02046F6F7EAFE0BB030BDEC01002075 -:100BB00010B5054C23782BB90D200449F6F7D6FE65 -:100BC0000123237010BD00BFA36000203D0B01086E -:100BD000014B1878704700BFA360002010B5064C89 -:100BE000237843B905490648F9F760FB0548F6F74D -:100BF00057FC0123237010BDA46000206646010845 -:100C00007D8000082C000020F8B50C4C064604F14D -:100C10008407012554F8060C34F8021CF5F701FF8F -:100C2000864206D00648074922463346F9F73EFB7E -:100C300000250C34BC42EDD12846F8BD3604002016 -:100C40007D80000888460108F0B5614B614D624C1B -:100C5000624E0121072085B01970F5F7ADFF0FCD69 -:100C60000FC40FCD0FC495E8030084E803000FCE36 -:100C700004F108050FC50FCE0FC596E8030085E8FF -:100C80000300574D0FCD30340FC40FCD0FC495E87E -:100C9000030084E803000024524D2B1960599B88FF -:100CA000029302A900230C348DF80C308DF80E301D -:100CB0008DF80F308DF80D30F5F774FE842CEBD1E4 -:100CC0002C1D7C35238802930026012354F8040C44 -:100CD0008DF80C3002A98DF80E608DF80D60F5F7D7 -:100CE00061FE54F8040C2188F5F7A1FE0196019BE2 -:100CF000B3F57A7F03DA019B01330193F7E7012013 -:100D0000FFF782FF2188074654F8040CF5F791FE9F -:100D100000230193019BB3F57A7F02DA019B013333 -:100D2000F7E70020FFF770FF0023002802A954F81E -:100D3000040C8DF80C3008BF0027F5F733FEAC42E9 -:100D400002D00C34002FBDD1234C224D0FCC0FC547 -:100D50000FCC0FC594E8030085E8030004F10806F2 -:100D60000FCE05F578750FC50FCE0FC596E80300B9 -:100D700085E8030030340FCC05F578750FC50FCC2E -:100D80000FC594E8030085E80300EFB1164D174C3A -:100D9000286801238DF80C3000238DF80E308DF873 -:100DA0000D3002A9AB880293F5F7FCFDA3882068FB -:100DB000029302A9F5F7F6FD2868A988F5F739FE30 -:100DC0002068A188F5F735FE384605B0F0BD00BFB4 -:100DD0002061002000000240A860002000040240C2 -:100DE00000080240300400201804002024040020E1 -:100DF00030B58BB0F5F7ECFB04A8F5F71DFC6846A1 -:100E0000F5F738FC124D01214FF400700024F5F77E -:100E1000F7FE68460094019402940394F5F716FCDB -:100E20004FF080738DF814408DF8154006940794A8 -:100E300008942846012404A904938DF82440F5F76A -:100E4000D5FB28462146F5F71BFC0BB030BD00BF93 -:100E50000021014010B500F11401024600238A422E -:100E600004D012F8014B2344DBB2F8E703750021EC -:100E70001522BDE81040FDF707BA0000F0B54B4D54 -:100E80002C7887B0002C58D14948FCF7E9FB48483A -:100E9000FDF7A4F9FDF7B4F9002836D0454E2146F8 -:100EA00030461522FDF7D8F9334670B33168424A0F -:100EB00091422AD13279012A18D1307D2146224629 -:100EC0005C5C013122441429D2B2F9D190423B4CEE -:100ED0003B4805D13B490122F9F7E8F9012303E03A -:100EE0003949F9F7E3F9002323700EE00AD8F07BC3 -:100EF000214622465C5C013122440F29D2B2F9D14D -:100F000090421FD000222D4B1A702C4B1A781C4691 -:100F10008AB92E4B274A03F1140153F8040B42F807 -:100F2000040B8B42F9D11B7813702848FFF792FF0E -:100F300028B10123237001232B70002033E04FF0F0 -:100F4000FF3030E0214B6C4603F110076A46186809 -:100F50005968264603C60833BB423446F7D11868A1 -:100F600030601B7933711A4B1968CDF80510596838 -:100F7000CDF809101989ADF80D10053B04AE1446E3 -:100F800003CCB44218605960224603F10803F6D13D -:100F90002068186022791A710648FFF75BFF002865 -:100FA000B3D00122AFE707B0F0BD00BF226100203F -:100FB000F4010020236100203078424321610020A9 -:100FC0007D800008A1460108C1460108B404002044 -:100FD00028610020FDF72CB9034B1B7813B1034B9C -:100FE000587970475020704721610020236100200C -:100FF000024B187808B1024B9879704721610020A4 -:1010000023610020064B1B782BB1064BD97B1B6953 -:101010000020184370474FF0E730E721704700BFCA -:101020002161002023610020054B1B781BB1054B7B -:10103000D3F8073000E0002300EE103A704700BFFD -:101040002161002023610020054B1B781BB1054B5B -:10105000D3F80B3000E0002300EE103A704700BFD9 -:10106000216100202361002038B510EE105A25F0D0 -:101070000044B4F1A14FF0EE407A0BDBB4F1FF4F26 -:1010800058DCDFED547A9FED540A002DC8BFB0EE56 -:10109000670A38BD514B9C425DDCB4F1445F4CDBC8 -:1010A0004FF0FF3367EEA75A9FED4D1A9FED4D2A83 -:1010B0009FED4D3ADFED4D1ADFED4D2A9FED4D4A84 -:1010C000DFED4D3A9FED4D5ADFED4D4A9FED4D6AF4 -:1010D000DFED4D6A25EEA57A5A1CA7EE012AE7EE50 -:1010E000212AA2EE073AE2EE873AA3EE074AE3EEA0 -:1010F000874AA4EE075AE4EE876AA5EE076A26EE51 -:10110000877A66EE256A3ED0404A41499B001A44E0 -:1011100076EE876A92ED007A96EEA77A0B44002D60 -:1011200093ED000A77EE677A70EE677A28DBB0EE0F -:10113000670A38BD30EE000A38BD9FED367A30EED2 -:10114000077AF7EE006AB4EEE67AF1EE10FAA7DD60 -:10115000B0EE670A38BD00F09FF82F4B9C4219DCB7 -:10116000A3F5D0039C422ADCF0EE007ABFEE007AB1 -:10117000A0EE277A002370EE277AC7EE277A91E750 -:10118000B1EE670A38BD76EE876AB0EE670AA6EE62 -:10119000E70A38BD214B9C420BDCF7EE087AB7EE2C -:1011A000007AA0EE277A022370EE677AC7EE877A7C -:1011B00078E7FFEE007AC7EE807A032372E7F7EE56 -:1011C000007A30EE677A70EE277A0123C7EE277A2D -:1011D00068E700BFDB0FC93FDB0FC9BFFFFFDF3E82 -:1011E000D769853C59DA4B3D356B883D21A215BD49 -:1011F0006BF16EBD6E2EBA3D95879DBD2549123EA1 -:10120000388EE3BDABAAAA3ECDCC4CBEE046010869 -:10121000F0460108CAF24971FFFF973FFFFF1B40EC -:1012200000B510EE103A1A4A23F00043934283B0FF -:1012300019DDB3F1FF4F04DB30EE400A03B05DF877 -:1012400004FB684600F048FF00F0030001289DED14 -:10125000000ADDED010A12D002280BD0A0B1012056 -:1012600001F048FCEAE7DFED0B0A01F0CFF803B02C -:101270005DF804FB01F0CAF8B1EE400ADEE701F0C8 -:1012800039FCB1EE400AD9E701F0C0F8D6E700BF5B -:10129000D80F493F0000000010EE103A23F0004341 -:1012A00000EE103A704700BF00B510EE103A1B4A2E -:1012B00023F00043934283B01ADDB3F1FF4F04DB08 -:1012C00030EE400A03B05DF804FB684600F004FF0E -:1012D00000F0030001289DED000ADDED010A15D0A4 -:1012E00002280DD0A8B101F091F8B1EE400AE9E76B -:1012F000DFED0B0A002001F0FDFB03B05DF804FBFD -:10130000012001F0F7FBB1EE400ADBE701F07EF8C7 -:10131000D8E7012001F0EEFBD4E700BFD80F493F2A -:101320000000000000B510EE103A134A23F000430D -:10133000934283B018DDB3F1FF4F04DB30EE400A77 -:1013400003B05DF804FB684600F0C6FE00F0010043 -:101350004000C0F101009DED000ADDED010A01F041 -:1013600011FC03B05DF804FBDFED040A012001F07D -:1013700009FC03B05DF804FBDA0F493F00000000F0 -:1013800010B52DED028B2A4C8AB0F0EE408A00F0A9 -:10139000F9F994F900300133B0EE408A04D0B0EE90 -:1013A000680A01F0C5FD28B9B0EE480A0AB0BDECE4 -:1013B000028B10BDB0EE680AFFF76EFFF7EE007A01 -:1013C000B4EEE70AF1EE10FAEEDD0123194A0093BC -:1013D00018EE900A002301920893F3F739F80246B9 -:1013E0000B461548CDE90423CDE9022301F0B4FCF6 -:1013F00094F90030022B8DED060B0FD0684601F0FA -:10140000A9FC58B1089B73B9DDE90601F3F70EFB9F -:1014100000EE100A0AB0BDEC028B10BD01F01EFEFA -:1014200021230360EEE701F019FE089B0360EBE760 -:10143000C9040020004701080C47010800F09EBACB -:10144000F0B52DED048BA74C8BB0B0EE409AF0EECA -:10145000608A00F049FB94F900300133B0EE408A15 -:1014600004D0B0EE680A01F063FD28B9B0EE480A76 -:101470000BB0BDEC048BF0BDB0EE490A01F058FD95 -:10148000002835D1F5EE408AF1EE10FAEED1964BF8 -:101490000890012219EE100A8DE80C00F2F7D8FF2F -:1014A000CDE9020118EE900AF2F7D2FF94F900306C -:1014B0008E4F00265A1CCDE90401CDE906670DD0F8 -:1014C000022B0BD0684601F045FC002800F0A480F8 -:1014D000089B1BB101F0C2FD089B0360DDE906011A -:1014E000F3F7A4FA00EE100A0BB0BDEC048BF0BDCC -:1014F000B5EE409AF1EE10FA23D1F5EE408AF1EE06 -:1015000010FA5CD10123784A009319EE100A0023E7 -:1015100008930192F2F79CFFCDE9020118EE900AC0 -:10152000F2F796FF94F9003000260027CDE9040178 -:10153000CDE90667002BC5D06C4B0022CDE9062310 -:10154000CCE7B0EE480A01F0A1FC0546002868D0BF -:10155000B5EE408AF1EE10FA88D1B0EE490A01F0FA -:1015600095FC002882D0B0EE680A01F08FFC0028BC -:101570003FF47CAF04235C4A009319EE100A002369 -:1015800008930192F2F764FFCDE9020118EE900A88 -:10159000F2F75EFF94F9003000260027022BCDE918 -:1015A0000401CDE9066700F09880684601F0D2FB9F -:1015B000002800F09280089B002B8FD08AE7B0EEC5 -:1015C000680A01F063FC00283FF450AFF5EEC08AD2 -:1015D000F1EE10FA7FF54AAF0123434A009319EE6A -:1015E000100A002308930192F2F732FFCDE90201BD -:1015F00018EE900AF2F72CFF2378CDE90401002BB6 -:1016000043D03B490020022BCDE9060137D101F040 -:1016100025FD21230360CEE701F020FD2123036097 -:1016200056E7B0EE490A01F031FC002890D0B0EE48 -:10163000680A01F02BFC00288AD0B0EE480A01F0BD -:1016400077FC38BB284B0890012219EE100A8DE870 -:101650000C00F2F7FDFECDE9020118EE900AF2F758 -:10166000F7FE2478CDE904017CB100200021024678 -:101670000B46F3F76BF8022CCDE90601C7D068469C -:1016800001F068FB002896D1C1E700220023CDE9D4 -:101690000623F4E7144B0895032219EE100A8DE88F -:1016A0000C00F2F7D5FECDE9020118EE900AF2F730 -:1016B000CFFE94F90030CDE90401EBB90D4BB5EE46 -:1016C000C09A4FF06042F1EE10FACDE9062337D40C -:1016D00094F90030022B7FF468AF01F0BFFC2223A5 -:1016E000036068E7C9040020084701080000F03FD4 -:1016F0000000F0FFFFFFEF471F4BB5EEC09A00223E -:10170000F1EE10FACDE90623E2D5F6EE007A68EEA6 -:10171000A77A17EE900AF2F79BFE06460F4647ECB3 -:10172000106B01F021FB3046394653EC102BF3F7D8 -:101730004BF90028CCD1114B0022CDE90623C7E795 -:10174000F6EE007A68EEA77A17EE900AF2F780FEBE -:1017500006460F4647EC106B01F006FB3046394653 -:1017600053EC102BF3F730F90028B1D1044B4FF0B4 -:101770006042CDE90623ABE70000F07F0000F0FFF8 -:10178000FFFFEFC738B510EE105A25F00044B4F152 -:101790007E5F2DED048B00F0918079DCB4F17C5FED -:1017A0000EDAB4F1485F80F29680DFED647A70EE75 -:1017B000277AB7EE007AF4EEC77AF1EE10FA6BDC16 -:1017C000FFF76AFDF7EE008A38EEC00AF6EE007AFF -:1017D00020EE278A9FED5A3A9FED5A4ADFED5A3A9A -:1017E0009FED5A5ADFED5A4A9FED5A6ADFED5A5A79 -:1017F000DFED5A6A9FED5A7ADFED5A7AA8EE034A76 -:10180000E8EE234AA4EE085AE4EE885AA5EE086AE8 -:10181000A5EE887AE6EE086AE7EE088AE6EE887AB0 -:10182000B0EE480AB0EE689A67EE888A00F09CFD38 -:101830004D4B9C4233DC10EE103A23F47F6323F0CF -:101840000F0307EE903AB1EE676AA6EE278A70EEB4 -:10185000277AC8EE898A88EE278A9FED447ADFEDE1 -:10186000447AF0EE006AA8EE667A30EE000AF0EEF6 -:10187000675AE6EE265A90EE287A37EE650A37EE7A -:10188000C00ABDEC048B002DD8BFB1EE400A38BDB4 -:1018900030EE400A80EE000ABDEC048B38BDC8EE85 -:1018A000898A9FED347ADFED347AA0EE280AF0EED3 -:1018B000006AA0EE267A37EEC70AE2E7DFED2B7A60 -:1018C0009FED2D7A60EE277ABDEC048BE0EE077A6F -:1018D000B0EE670A38BD60EE007ADFED192ADFED61 -:1018E000193ADFED1A4A9FED183A9FED194ADFEDDC -:1018F000196A9FED195ADFED195A9FED196A9FED8C -:10190000197AE7EEA23ABDEC048BE3EEA74AA7EE04 -:10191000834AE4EEA76AA4EE275AE6EEA75AA5EE9C -:10192000276AA5EEA77AF7EE006AE6EE276A67EE69 -:10193000277AC7EEA67AA0EE270A38BDCAF2497107 -:1019400008EF1138047F4F3A2EC69D3D461124BD45 -:10195000613330BFA80A4E3E2D57014090B0A6BE5D -:1019600039D119C0ABAA2A3E9999793F2EBD3BB314 -:10197000DB0F493F2EBD3B33DB0FC93F10B582B0B3 -:10198000CDED010A019B23F00042B2F1FF4FF0EED2 -:10199000407A19DC10EE100A20F00041B1F1FF4F3F -:1019A00012DCB3F17E5F49D09C1704F0020444EAD4 -:1019B000D07479B9022C3ED09FED400A032C18BF99 -:1019C000B0EE670A02B010BD9DED017A37EE270A2E -:1019D00002B010BD12B3B2F1FF4F34D0B1F1FF4FDE -:1019E0001CD08A1AD2153C2A22DC002B4BDB9DED41 -:1019F000017A87EE870AFFF74FFCFFF735FB012CD2 -:101A00003AD0022C2FD0002CE2D09FED2D7ADFEDC2 -:101A10002D7A30EE070A30EE670AD9E7DFED2A7A31 -:101A20009FED2A0A0028A8BFB0EE670A02B010BDD9 -:101A30009FED250AE3E79FED230AC9E702B0BDE861 -:101A40001040FFF711BBB1F1FF4F21D0022CF2D0B3 -:101A5000032C2AD0DFED1E7A9FED1E0A012C08BF51 -:101A6000B0EE670AB4E79FED167ADFED167A30EE36 -:101A7000070A37EEC00AABE710EE103A03F1004355 -:101A800000EE103AA4E73C32B1DA9FED120AB6E755 -:101A9000022C10D0032C0BD0DFED0F7A9FED0F0A34 -:101AA000012C08BFB0EE670A92E79FED040A8FE7AA -:101AB0009FED0B0A8CE79FED0B0A89E7DB0F49C00E -:101AC0002EBDBB33DB0F4940DB0FC93FDB0FC9BF66 -:101AD0000000008000000000DB0F49BFDB0F493F22 -:101AE000E4CB16C0E4CB16402DE9F0432DED028B7C -:101AF00010EE905A83B035F0004610EE904A8DED0E -:101B0000010A14D0DDF8048028F00047B7F1FF4F38 -:101B100007DD574803B0BDEC028BBDE8F04301F090 -:101B200023BAB6F1FF4F09DDB7F17E5FF1D1B7EE11 -:101B3000000A03B0BDEC028BBDE8F083B8F1000FE2 -:101B400052DB4FF00009B6F1FF4F44D0B6F17E5F93 -:101B50005DD0B4F1804F69D0B4F17C5F9DED010A96 -:101B60001BD0FFF799FBB7F1FF4F2AD04FB3B7F166 -:101B70007E5F26D04FEAD873013B59EA03026FD04B -:101B8000B6F19A4F7CDD3B4A974200F3DB81002C93 -:101B9000C0F2DE819FED380ACBE7B8F1000F4ADAD8 -:101BA000FFF77AFBB7F1FF4F01D0002FDFD1A7F18C -:101BB0007E5759EA07034CD130EE400A80EE000A06 -:101BC000B7E7002CBCBFF7EE007A87EE800AB8F1C9 -:101BD000000FAEDAEBE7B7F17E5FA8D01FDD002C77 -:101BE000D8DB00EE105AA4E7B6F1974F14DAB6F13D -:101BF0007E5F09DBF315C3F1960346FA03F202FA9E -:101C000003F3B34200F094814FF000099EE7002CEB -:101C100018DB9DED010A8CE74FF0020993E7002CD9 -:101C2000B8DA07EE905AB1EE670A82E7DDED017A85 -:101C300027EEA70A7DE703B0BDEC028BBDE8F043B9 -:101C400000F092BBDDED017AB7EE000A80EE270AC4 -:101C50006FE7B9F1010F7FF46CAFB1EE400A68E7AE -:101C6000DDED017A37EEE70A80EE000A61E700BF9A -:101C70000C470108F7FF7F3F000000000000804B89 -:101C8000B7F5000F80F25C815FED047A60EE277A91 -:101C90006FF0170117EE907AF048FA15C7F31607A0 -:101CA0007F3A8742114447F07E5240F34681EC4828 -:101CB000874240F39B8100260131A2F500023046A5 -:101CC000DFF80CC49FEDE72A9FEDE78A9FEDE70A56 -:101CD000DFEDE70A9FEDE71ADFEDE71AE74FDFEDEB -:101CE000E87ADFEDE82A9FEDE84ADFF8E8E38000D4 -:101CF000844407EE102ADCED006A77EE265AB7EE30 -:101D0000006AC6EE255A521042F0005202F58022B7 -:101D1000324437EE666A04EE902A26EE253A74EED7 -:101D2000E66A23EE035A37EE667AF0EE426AE5EE93 -:101D3000086A3A18704413EE106A26F47F66A6EE1D -:101D4000850A26F00F0603EE906AB1EE632AA2EE32 -:101D5000246AE0EE050AA2EE076AA0EE851A66EE96 -:101D6000255AE1EE051A33EE237A25EE055A27EEC1 -:101D7000257AF0EE084AB0EE646AA5EE217AA3EE69 -:101D8000A36AD2ED001A90ED005A36EE076A06EE0D -:101D9000901A16EE102A22F47F6222F00F0206EE4D -:101DA000102A76EE644AF8EEE66AE2EE234A37EE4F -:101DB000647A27EE037AA5EE867AF0EE475AE3EED0 -:101DC000865A15EE902A22F47F6222F00F0204EE6A -:101DD000902AE2EE064A05EE902A37EE647A67EE24 -:101DE000277AE5EEA27A77EEA17AB0EE677AA5EED1 -:101DF000847A37EE057A37EE267A17EE102A22F427 -:101E00007F6222F00F0207EE102A77EE666A36EE46 -:101E1000C57AA5EEC47A77EEC77A24F47F6424F0FD -:101E20000F0407EE105A06EE904A67EE277A77EE17 -:101E3000666A06EE104A07EE102A27EE067A06EECC -:101E4000102AE6EE867A09F1FF3959EA0303B7EE64 -:101E5000000A77EE876ABFEE006A16EE903A0CBF72 -:101E6000B0EE468AB0EE408A002B23F0004240F3E9 -:101E7000AA80B2F1864F7BDC6FD0B2F17C5F7EDC52 -:101E80000022104623F47F6323F00F0306EE103A7E -:101E9000DFED7E6A9FED7E2ADFED7E3ADFED7E2A62 -:101EA0009FED7E4ADFED7E4A9FED7E5ADFED7E5A42 -:101EB00036EE477AB0EE003A77EEC77A26EE267A0B -:101EC000B7EE000AA7EE827AF0EE476AE6EE236AE2 -:101ED000F0EE477A26EEA67AB0EE662AA7EE224A00 -:101EE000A6EE632AE4EE074AB0EE666AA4EE875ACD -:101EF00077EEC27AE5EE075AE6EEA77AA5EEC76A54 -:101F000026EE867A36EE436A87EE067A77EE677AB1 -:101F100077EEE67A30EE670A10EE103A1344B3F526 -:101F2000000FC0F2988000EE103A28EE000A00E69A -:101F300002F00102C2F1020908E600263046BFE6BF -:101F40000021A9E6594A974254DD002C7FF722AEC2 -:101F50009FED570A20EE000AEBE59FED566A76EEFC -:101F6000C76A37EE866AB4EEE66AF1EE10FA06DD6D -:101F7000DFED4F7A28EE270A20EE270AD9E5D215A1 -:101F80004FF400017E3A41FA02F21A44C2F3C751FB -:101F9000494CA1F17F052C41C2F3160022EA04024C -:101FA00006EE902AC1F1960140F4000037EE667A01 -:101FB000084180EAE37077EE876A00EBD370C205D0 -:101FC00016EE903A5EE73D498A4208DC7FF455AF51 -:101FD00076EEC76AF4EEE67AF1EE10FACFD8DFEDCE -:101FE000387A28EE270A20EE270AA2E54FF40016D9 -:101FF000012065E6F7EE007A30EE670ADFED1C6A35 -:10200000DFED307A9FED305A9FED306AF1EE405AA5 -:10201000B5EE007AE5EE876AB6EE007AA6EEC07AF3 -:10202000F0EE476A20EE007A27EE267A67EEC77A4E -:10203000E0EE057AB0EE677AA0EE067A17EE102A87 -:1020400022F47F6222F00F0207EE102AA5EE867AB4 -:1020500077EEC77AE1E600F08DFF66E771C41C00F9 -:10206000D6B35D0055326C3E42F1533E05A38B3E24 -:10207000ABAAAA3EB76DDB3E9A99193F18470108F3 -:102080004F38763FA0C39D360038763F8CBEBF35B3 -:102090001872313F0072313F4CBB31330EEADDB56F -:1020A00055B38A38610B36BBABAA2A3E0700803F86 -:1020B000CAF249713CAA3833FFFF7F000000164383 -:1020C0006042A20D3BAAB83F70A5EC3600AAB83F0B -:1020D000204701081047010870B510EE103A944AE5 -:1020E00023F00044944286B010EE106A054666DD87 -:1020F000904A94421ADC002BDFED8F7A8F4A24F04D -:102100000F0440F3DD80944270EE677A66D09FED55 -:102110008C7A77EEC76A012077EEE67AC5ED006A21 -:1021200077EEC77AC5ED017A06B070BD854A944254 -:1021300066DDB4F1FF4F49DAE215863AA4EBC253EB -:1021400007EE103AFDEEC76ADFED7F7AF8EEE66A39 -:1021500037EE667ACDED036A27EE277AFDEEC76A81 -:10216000F8EEE66A37EE667ACDED046A67EE277A16 -:10217000F5EE407AF1EE10FACDED057A40F0B3803D -:10218000F5EE406AF1EE10FA14BF022301236F4905 -:1021900002208DE8030003A8294600F0B9F9002EBB -:1021A00012DA95ED007AD5ED017AB1EE477AF1EECB -:1021B000677A404285ED007AC5ED017A04E000229D -:1021C00085ED000A4260002006B070BD70EE407AD6 -:1021D0000020C5ED017AC5ED007AF5E7DFED5C6A18 -:1021E0009FED5C7A77EEE67A012077EEC76A77EEAC -:1021F000E67AC5ED006A77EEC77AC5ED017AE3E7C6 -:10220000FFF74AF8DFED546ADFED4B5A9FED4C7A49 -:10221000F6EE007AE0EE267AFDEEE77A17EE900A07 -:10222000F8EEE76A1F28B1EE666AA6EE250A66EEAA -:10223000877A1DDC494A411E24F0FF0352F8212011 -:10224000934215D030EE677A85ED007A30EE470A7A -:10225000002E30EE670A85ED010AB5DAB1EE477A55 -:10226000B1EE400A85ED007A85ED010A4042ABE708 -:1022700030EE677AE41517EE103AC3F3C753E31A4A -:10228000082BE1DDDFED327A9FED327AF0EE405A35 -:10229000E6EE275A30EE650AA6EE270AF0EE407AFF -:1022A000D6EE877A35EEE77A17EE103AC3F3C753C6 -:1022B000E41A192C2CDC85ED007AB0EE650AC5E72E -:1022C000944270EE277A10D09FED1D7A77EE876AE0 -:1022D0004FF0FF3077EEE67AC5ED006A77EE877A49 -:1022E000C5ED017A70E7032351E7DFED196A9FED31 -:1022F000197A77EEA67A4FF0FF3077EE876A77EE9D -:10230000E67AC5ED006A77EE877AC5ED017A5BE77C -:102310009FED137A9FED135AB0EE650AA6EE070AF9 -:1023200075EEC07AE6EE077AD6EE857A8AE700BFC8 -:10233000D80F493FE3CB1640800FC93FD00FC93FAC -:1023400043443537800F494300008043A8470108C4 -:102350000044353708A3852E84F9223F2847010819 -:1023600000A3852E32318D2410EE103A23F0004266 -:10237000B2F1FF4F70B430D26AB3002B3DDBB2F53F -:10238000000F4FEAE3512CD3A1F17F02C3F31603F0 -:10239000D10743F4000348BF5B00002456105B00E4 -:1023A000254619214FF08072A818984202DC1B1AAA -:1023B0008518144401394FEA43034FEA5202F3D11E -:1023C00013B104F001031C44641004F17C5404EBC9 -:1023D000C65300EE103A70BC7047A0EE000A70BC05 -:1023E000704713F400020DD15B00180202F10102E4 -:1023F000FAD5C2F101021144C6E730EE400A80EE80 -:10240000000AE8E701221144BEE700BF10EE103ACF -:1024100023F00043B3F1485F2CDAFDEEC07A17EEEB -:10242000903A002B60D020EE007ADFED314A9FED2C -:10243000315ADFED315A9FED316ADFED317ADFED50 -:10244000316AA7EE245AE5EE075AA5EE876AE6EE52 -:10245000077AE7EE876A66EE876A60EEC00AB6EE34 -:10246000006AE7EE260AF7EE007AD7EE060A37EEA4 -:10247000E00A704720EE007ADFED1D4A9FED1D5AFD -:10248000DFED1D5A9FED1D6ADFED1D7ADFED1D6A40 -:102490001D4AA7EE245A9342E5EE075AA5EE876A35 -:1024A000E6EE077AE7EE876A66EE876AD5DD174AB9 -:1024B000934214DC03F17F4307EE903AB7EE006AD3 -:1024C00036EE676A60EEC00AF6EE005AE7EE260ABC -:1024D000D7EE257A77EEE07A36EE670A7047B6EEE9 -:1024E000076AF5EE027AEDE7B7EE000A704700BF23 -:1024F0004ED747ADF6740F317CF293B4010DD0374F -:10250000610BB6BAABAA2A3D9999993E0000483FA3 -:102510002DE9F04F2DED048BD7B05F1ED74C649D95 -:102520000293D31E48BF131D54F825600191DB10A0 -:1025300023EAE3736FEA030BB9190393824602EBB4 -:10254000CB0BA3EB070314D41944659801311AAAE5 -:10255000002BAABF50F82340DFEDCC7A07EE904A5B -:1025600003F10103A8BFF8EEE77A8B42E2EC017AAF -:10257000EED1002E1ADB029B1AA9741C01EB840415 -:1025800042A89D00002FC0F2BA81DFEDC07A52460A -:102590004B1933ED017AF2EC016A9942E6EE877A43 -:1025A000F7D10431A142E0EC017AEBD1029ADFEDE0 -:1025B000B48A9FEDB48A06F18043013B9B00C2EBD5 -:1025C000827906AA03F104081344904404934FEA65 -:1025D00089093446A50056AB2B44002C13ED140A90 -:1025E00018DD42A94B1905AA60EE287AB0EE407AB0 -:1025F000FDEEE77A73ED016AF8EEE77A8B42A7EE1B -:10260000C87A37EEA60ABDEEC77A17EE100A42F86E -:10261000040FE9D1584600F0ADFCB0EE409AB4EE9C -:10262000000A29EE000A00F03BFCF2EE007AA0EE70 -:10263000679ABBF1000FFDEEC99AF8EEE97A39EE20 -:10264000679A40F34181601E06AACBF1080352F855 -:10265000201041FA03F202FA03F30DF1180EC91A21 -:102660004EF8201019EE900A1044CBF1070309EE42 -:10267000900A1941002939DD19EE903A002C03F136 -:10268000010309EE903A40F3CB81002210460DF190 -:10269000140E08E0C3F5807C13B1CEF800C0012011 -:1026A000013294420CDD5EF8043F0028F2D0013282 -:1026B000C3F1FF039442CEF800304FF00100F2DC8A -:1026C000BBF1000F10DDBBF1010F00F00481BBF185 -:1026D000020F09D1621E06AB0DF1180E53F822301D -:1026E00003F03F034EF82230022959D0B5EE409A4C -:1026F000F1EE10FA66D1631E9E420BDC06AA154469 -:10270000002255F8040D454542EA0002F9D1002A9D -:1027100040F07081731E06AA52F82330002B40F05F -:102720007C81049B4FF0010E53F8042D0EF1010E35 -:10273000002AF9D0A644631C73452FDC039A9D1828 -:10274000029A05F18045A0180EEB020C659A013D36 -:1027500002EB85051AAA02EB800002EB8C0C42AA60 -:1027600002EB830455F8043F07EE903AF8EEE77A5F -:10277000002FE0EC017ADFED457A0BDB524600EBEF -:102780000901034633ED017AF2EC016A8B42E6EE71 -:10279000877AF7D16045E4EC017AE3D1744619E712 -:1027A000B7EE000A30EE499A00289FD058460591AE -:1027B00000F0E0FB39EE409A0599B5EE409AF1EE53 -:1027C00010FA98D0B0EE490ACBF10000029100F067 -:1027D000D1FB9FED2C7A0299B4EEC70AF1EE10FA04 -:1027E000C0F27E81DFED267A60EE277A06A8FDEE44 -:1027F000E77A631CF8EEE77A0BF1080BA7EEC70A3D -:10280000FDEEE77ABDEEC00A10EE102A40F8242053 -:1028100017EE902A40F823205846B7EE000A03939B -:10282000029100F0A7FB039B0299002BC0F2C78026 -:1028300003F1010E4FEA8E0242AC06A89FED107A1A -:102840001044A71870ED017AF8EEE77A67EE807A07 -:1028500020EE070A67ED017AA742F3D1043A174444 -:102860000025002EC0F2A880002DC0F2A580064CE5 -:10287000DFED067A384600220CE000BFC04A0108AE -:102880000000803B00008043CC4A010800000000AB -:10289000AA4208DCF4EC016AB0EC017A01329642FB -:1028A000E6EE877AF4DA56AA02EB85020135754521 -:1028B000A7F1040742ED287AD3D1649A032A5FD89E -:1028C000DFE802F0673737B010D1631E06AA52F86E -:1028D00023100912CEE6621E06AB0DF1180E53F856 -:1028E000223003F07F034EF82230FDE6F6EE007A48 -:1028F000B4EEE79AF1EE10FA0ADA0021F6E65FED9F -:102900001D7A0431A142E0EC017A7FF43BAE4DE642 -:1029100019EE903A002C03F1010309EE903AC8BF7A -:1029200002213FF7B2AEF7EE007A37EEC99A0221E4 -:10293000DCE62EAA5FED2B7A02EB8E0E3EED017ADD -:10294000964577EE877AF9D1002943D0DDED2E6ADE -:10295000019AB1EE677A002B76EEE77A82ED007A83 -:1029600009DD2FA80122B0EC017A0132934277EE03 -:10297000877AF8DA09B1F1EE677A019BC3ED017A43 -:1029800019EE903A03F0070057B0BDEC048BBDE898 -:10299000F08F2EAA5FED437A02EB8E0E3EED017AA8 -:1029A000013B5A1C77EE877AF8D109B1F1EE677ACC -:1029B000019BC3ED007AE3E75FED4C7A73E7649A1D -:1029C000032ADDD8DFE802F0130202805FED517ABE -:1029D0000029BBD19DED2E7A019A002BC2ED007A21 -:1029E00077EE677ABDDC019BC3ED017AC8E75FED46 -:1029F000597ADAE706AAABF1080B52F82320002A2D -:102A00007FF40AAF06AA02EB830252F8040D013BE1 -:102A1000ABF1080B0028F8D0FEE64FF0010E89E676 -:102A200000204DE6002B4FDD9A0056A810442EAD35 -:102A3000141D10ED287A2C44A81870ED017A77EE59 -:102A4000276AA84277EEE67A77EE277AB0EE667AC2 -:102A500064ED017AC0ED006AEFD1012B34DD131D66 -:102A600056AC1444034414ED287A02442FAC1846A3 -:102A700072ED017A77EE876AA24277EEE67A77EE18 -:102A8000877AB0EE667A60ED017AC2ED006AEFD126 -:102A90005FED827A30AA33ED017A934277EE877A3E -:102AA000F9D1A9B1DDED2E6A9DED2F7A019AF1EEF3 -:102AB000677AF1EE666AB1EE477AC2ED027AC2ED4C -:102AC000006A82ED017A5BE75FED907A0029E9D137 -:102AD00001982E9A2F9BC0ED027A026043604FE767 -:102AE000BDEEC00A06A810EE102A234640F82420A6 -:102AF00092E600BF10EE103A23F00043B3F1485FB6 -:102B000004DAFDEEC07A17EE903A23B360EE007A55 -:102B10009FED155ADFED155A9FED156ADFED156A29 -:102B20009FED157AE7EE855A27EE805AA5EEA76A43 -:102B3000E6EE276AA6EEA77A70B127EE457AF6EEA2 -:102B4000006AA0EEA67ADFED0D6AD7EE270AE5EE61 -:102B5000260A30EE600A7047DFED096AE7EE876A01 -:102B6000A6EE850A704700BFD3C92E2F342FD7B2E7 -:102B70001BEF3836010D50B98988083CABAA2A3EB4 -:102B8000ABAA2ABE08B510EE103A23F00042B2F10B -:102B9000465F2DED028BB0EE407A12DAFDEEC07A80 -:102BA00017EE901A19BB431C134300F0AA800128AA -:102BB00000F08480BDEC028BBFEE000A80EE070AB5 -:102BC00008BD53498A4212DD002BB8BFB1EE407AEE -:102BD000DFED507A9FED500AB8BFF1EE600A77EE54 -:102BE000E07A30EE477ADFED4D0A37EE277A67EE6E -:102BF000076A9FED4B8A9FED4B2ADFED4B8ADFED95 -:102C00004B1A9FED4B3ADFED4B2A9FED4B4ADFED20 -:102C10004B3A9FED4B5ADFED4B4A9FED4B6ADFED90 -:102C20004B5A9FED4B0A3A4966EEA67A26EE871A72 -:102C3000A7EE882A8A42E7EEA81AA2EE273AE1EE2A -:102C4000A72AA3EE274AE2EEA73AA4EE275AE3EE1C -:102C5000A74AA5EE276AE4EEA75AF0EE467AE5EE1B -:102C6000A67AB0EE606AA7EE816AE6EE260AE1EE89 -:102C7000000A37EE200A24DC01281FD0FFEE006A8C -:102C8000C6EE806A10EE103A16EE902A23F47F63A7 -:102C900022F47F6223F00F0322F00F0200EE102ACD -:102CA00006EE103AF7EE007AE6EE007A36EE477A54 -:102CB00070EEC70AE0EE807AA7EEA60ABDEC028BA2 -:102CC00008BD07EE900AB8EEE76A60EE006A70EEA3 -:102CD000067A9B17C6EEA77A03F00203C3F101033D -:102CE000BDEC028BF0EE005A77EEE00A00EE103AEF -:102CF00037EE607AF8EEC06AA7EE656A26EE860ABD -:102D000008BDFEF7C9FAB7EE007A87EE000AD5E7EC -:102D10003FA12C3F68212233DA0F493F0000000019 -:102D20005FAE9BB745F4A3388453D9377AC0953842 -:102D3000C8261A3AB937813916696B3B48DEBE3A64 -:102D4000A427B33C1F37113C8988083ED10D5D3D57 -:102D5000ABAAAA3E002070479FED010B704700BF51 -:102D6000000000000000F87FF0B551EC100BC1F33B -:102D70000A56A6F2FF32132A83B00B4610EE107AE1 -:102D80004FEAD17405462FDC002A48DB3D4E164140 -:102D900006EA010707432CD0760831400D430CD0DA -:102DA0004FF48021132A23EA060641FA02F343EA8C -:102DB00006030CBF4FF000450025334A02EBC40464 -:102DC0002846D4E90045024629462046F1F7E2F9B3 -:102DD000CDE9000122462B46DDE90001F1F7D8F9E3 -:102DE00041EC100B03B0F0BD332A06DDB2F5806F65 -:102DF0003FD041EC100B03B0F0BDA6F213464FF0EC -:102E0000FF32F2400242F4D052080242D5D04FF0D5 -:102E1000804127EA020241FA06F51543CDE721F089 -:102E200000420243E5D0C1F3130217437A4217432D -:102E3000154A4B0C3F0B5B0407F4002702EBC4025E -:102E400047EA0301D2E900670B460246394630469D -:102E5000F1F7A0F9CDE900013B463246DDE900017A -:102E6000F1F796F921F0004343EAC47141EC100BED -:102E7000C1E710EE102A0B46F1F78CF941EC100B6C -:102E8000B9E700BFFFFF0F00F84A010810EE103A43 -:102E900023F00040B0F1FF4FACBF0020012070478D -:102EA00010EE102A22F00041CB0D7F3B162B17DCD1 -:102EB000002B10EE100A19DB1A491941114222D0D9 -:102EC000DFED197A70EE277AF5EEC07AF1EE10FA9E -:102ED00019DD002A18DB20EA010300EE103A7047E2 -:102EE000B1F1FF4F0FD330EE000A7047DFED0E7ADD -:102EF00070EE277AF5EEC07AF1EE10FA03DD002AC3 -:102F000008DB9FED0A0A70474FF4000242FA03F310 -:102F10001844E0E70029FFEE007A18BFB0EE670A18 -:102F2000704700BFFFFF7F00CAF249710000000038 -:102F300010EE103A33F0004001D102207047A0F5A6 -:102F40000003B3F1FE4F01D204207047054B421E2F -:102F50009A4201D803207047A0F1FF40B0FA80F0F8 -:102F600040097047FEFF7F009FED010A704700BFD8 -:102F70000000C07F08B510EE103A33F000422DED8E -:102F8000028B11D0B2F1FF4F11D2B2F5000F13D363 -:102F9000D20D0244FE2A2EDC002A1ADD23F0FF4364 -:102FA00043EAC25300EE103ABDEC028B08BDBDEC03 -:102FB000028B30EE000A08BD1D4BDFED1E7A9842F1 -:102FC00020EE270A22DB10EE103AC3F3C752193A5B -:102FD000DFE712F1160F1EDA4CF2503398420ADC8A -:102FE0009FED158AF0EE400AB0EE480A00F02AF88C -:102FF00020EE080AD8E79FED118AF0EE400AB0EE05 -:10300000480A00F01FF820EE080ACDE7DFED0A0AB3 -:1030100020EE200AC8E7193223F0FF4343EAC253E7 -:10302000DFED077A00EE103A20EE270ABCE700BF7A -:10303000B03CFFFF0000004C6042A20DCAF2497193 -:103040000000003310EE103A23F0004210EE903AE8 -:1030500003F00043134300EE103A7047014B186829 -:10306000704700BF3005002010B5431E0A4491424E -:1030700004D011F8014B03F8014FF8E710BD0244EA -:103080000346934202D003F8011BFAE77047034658 -:1030900011F8012B03F8012B002AF9D170470346E0 -:1030A00013F8012B002AFBD1181A0138704710B50C -:1030B000034632B111F8014B03F8014B013A002CE1 -:1030C000F7D11A44934203D0002103F8011BF9E71A -:1030D00010BD01020304050708090A0B707854614A -:1030E000736B436F6465006C69622F46726565524D -:1030F000544F532F7461736B732E63002820282064 -:1031000075785072696F7269747920262028207E44 -:10311000706F727450524956494C4547455F424959 -:103120005420292029203C20636F6E6669674D4139 -:10313000585F5052494F5249544945532029007015 -:10314000784E65775443420049444C4500785265B7 -:103150007475726E0028206C6973744C4953545F07 -:1031600049535F454D5054592820707844656C612F -:103170007965645461736B4C69737420292029004C -:1031800075785363686564756C65725375737065A3 -:103190006E64656400707850726576696F757357F8 -:1031A000616B6554696D650028207854696D6549C7 -:1031B0006E6372656D656E74203E20305520290067 -:1031C0007578546F7052656164795072696F726975 -:1031D00074790070784576656E744C69737400700C -:1031E00078556E626C6F636B65645443420070780F -:1031F00054696D654F75740070785469636B7354CE -:103200006F576169740070785175657565006C69F8 -:10321000622F4672656552544F532F7175657565FF -:103220002E6300212820282070764974656D546F24 -:103230005175657565203D3D204E554C4C2029202B -:103240002626202820707851756575652D3E757885 -:103250004974656D53697A6520213D202820756E7B -:103260007369676E656420706F7274424153455F85 -:1032700054595045202920305520292029007078A4 -:103280004E65775175657565002128202820707678 -:10329000427566666572203D3D204E554C4C202996 -:1032A000202626202820707851756575652D3E757D -:1032B000784974656D53697A6520213D2028207511 -:1032C0006E7369676E656420706F72744241534516 -:1032D0005F54595045202920305520292029006C61 -:1032E00069622F4672656552544F532F74696D653C -:1032F00072732E6300546D72205376630028207819 -:1033000054696D6572506572696F64496E54696382 -:103310006B73203E203020290078526573756C74E1 -:10332000002820707854696D65722D3E7854696D5F -:103330006572506572696F64496E5469636B73207E -:103340003E20302029005B48617264206661756C04 -:10335000742068616E646C65725D0A005230203DB5 -:103360002025780A005231203D2025780A0052326B -:10337000203D2025780A005233203D2025780A0080 -:10338000523132203D2025780A004C52203D202524 -:10339000780A005043203D2025780A0050535220DF -:1033A0003D2025780A0042464152203D2025780ADA -:1033B0000043465352203D2025780A004846535288 -:1033C000203D2025780A0044465352203D20257890 -:1033D0000A0041465352203D2025780A0000000093 -:1033E0000000000002000000000402400002000093 -:1033F00009000000000000000200000004000000BE -:10340000000800400000000004000000FF00000071 -:1034100000000000357000088D700008C16F0008C2 -:103420006D70000801000000010000000000024073 -:10343000080000000300000001000000010000007F -:10344000010000000000004000000000010000003A -:1034500014CD000003000000357000088D700008D6 -:10346000C16F00086D700008B8017003BA024B020A -:103470000100000001000000000002400400000004 -:103480000200000001000000010000000100000037 -:1034900000000040000000000100000014CD00000A -:1034A0000300000031700008897000083D6F0008BB -:1034B0005D700008000000000100000000000240F4 -:1034C00002000000010000000000000001000000F8 -:1034D00001000000000000400000000001000000AA -:1034E000FF000000000000002D700008857000083B -:1034F000B56E0008497000086964203C204E4252B5 -:103500005F4F465F4D4F544F52530064726976656A -:1035100072732F7372632F6D6F746F72732E6300EB -:103520000000000001000000020000000300000095 -:10353000000000000200000000040240000800003B -:103540000B0000000000000001000000010000006E -:10355000000000400000000001000000FF0000002B -:1035600000000000357000088D700008C16F000871 -:103570006D70000800000000010000000000024023 -:10358000008000000F0000000000000001000000AB -:1035900001000000000000400000000001000000E9 -:1035A000FF00000000000000297000088170000882 -:1035B000456E00083970000801000000020000009C -:1035C000000402402000000005000000010000008F -:1035D00002000000020000000004004000000000A3 -:1035E0000200000014CD0000030000002D70000850 -:1035F00085700008B56E00084970000801000000E1 -:10360000020000000004024010000000040000005E -:103610000100000002000000020000000004004061 -:10362000000000000200000014CD000003000000B4 -:103630002970000881700008456E00083970000884 -:10364000435254502D545800435254502D52580058 -:103650007175657565735B706F727449645D203D4B -:103660003D204E554C4C006D6F64756C65732F7327 -:1036700072632F637274702E630071756575657364 -:103680005B706F727449645D00702D3E73697A657A -:10369000203C3D20435254505F4D41585F444154BB -:1036A000415F53495A45000054000020FC000020AF -:1036B0003C010020E40000207C0100206401002087 -:1036C0004C01002024010020CC0000200C0100202F -:1036D0006C656473657154696D6572000A4D616C47 -:1036E0006C6F63206661696C6564210A000A53741B -:1036F00061636B206F766572666C6F77210A005389 -:10370000595354454D004D4F4449464945440043A3 -:103710004C45414E005359533A202D2D2D2D2D2D22 -:103720002D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2DC9 -:103730002D2D2D2D2D2D0A005359533A2043726102 -:103740007A79666C696520322E3020697320757035 -:1037500020616E642072756E6E696E67210A005377 -:1037600059533A204275696C642025733A257320B9 -:10377000282573292025730A005359533A204920DC -:10378000616D20307825582558255820616E6420B9 -:103790004920686176652025644B42206F6620666B -:1037A0006C617368210A005359533A205374617253 -:1037B0007420666F726365642E0A005359533A2071 -:1037C0004672656520686561703A202564206279DB -:1037D0007465730A0063616E666C790073746F7050 -:1037E0005F7379730073797374656D0073656C66CC -:1037F000746573745061737365640073746F705F84 -:10380000737974656D00666C61736800696430007B -:10381000696431006964320073746F705F6370753E -:10382000003C463E0A004269746372617A65204337 -:1038300072617A79666C696500504152414D004D64 -:10384000454D000000000000000050616C74686F7E -:103850006C64007961774D6F6465007961775273AC -:103860007400737461624D6F6465526F6C6C0073A9 -:103870007461624D6F64655069746368007374614C -:10388000624D6F64655961770073746F705F666C29 -:10389000696768746D6F646500726F6C6C5F6B70E4 -:1038A00000726F6C6C5F6B6900726F6C6C5F6B6445 -:1038B0000070697463685F6B700070697463685F3F -:1038C0006B690070697463685F6B64007961775F2E -:1038D0006B70007961775F6B69007961775F6B640A -:1038E0000073746F705F7069645F726174650073F8 -:1038F000746F705F7069645F617474697475646516 -:103900000073746F705F73656E736F726675736941 -:103910006F6E360053544142494C495A455200613A -:10392000736C416C7068610061736C416C706861AC -:103930004C6F6E67006572724465616462616E64AB -:1039400000616C74486F6C644368616E67655365B1 -:103950006E7300616C74486F6C644572724D61786F -:1039600000706964416C7068610070696441736CD7 -:1039700046616300764163634465616462616E64BD -:10398000007642696173416C7068610076537065BE -:1039900065644163634661630076537065656441A5 -:1039A000534C4465616462616E6400765370656572 -:1039B0006441534C466163007653706565644C699D -:1039C0006D69740062617365546872757374006D1B -:1039D0006178546872757374006D696E546872759D -:1039E00073740073746F705F616C74486F6C640003 -:1039F00065727200746172676574007A53706565F0 -:103A00006400765370656564007653706565644143 -:103A1000534C007653706565644163630061736C59 -:103A20000061736C5261770061736C4C6F6E67005C -:103A300074656D7000707265737375726500737470 -:103A40006F705F6261726F0073746F705F76706920 -:103A500064006D34006D31006D32006D330073749D -:103A60006F705F6D6F746F72007A0073746F705F48 -:103A70006D61670073746F705F6779726F007A773A -:103A8000006D6167320073746F705F616363007211 -:103A90006F6C6C007069746368007961770074689A -:103AA000727573740073746F705F73746162696CA4 -:103AB000697A657200706C6F70006C6F6754696D25 -:103AC0006572004C4F47007661726964203E3D206C -:103AD00030006D6F64756C65732F7372632F6C6F3C -:103AE000672E630000010204010204040230313237 -:103AF00033343536373839414243444546017265DF -:103B0000766973696F6E30007265766973696F6E7E -:103B100031006D6F6469666965640073746F705F0E -:103B20006669726D77617265004372617A79666C5D -:103B3000696520322E30007B6272616E63687D00A1 -:103B4000536B79526F7665724E616E6F32007B7285 -:103B500065766973696F6E7D005631353038323164 -:103B60005231000001000000020006000A000800B7 -:103B700000000000000000000000102000000024F1 -:103B800010000020202249008000000800020000F0 -:103B90002000001000000018000020101F2148071E -:103BA00007070808080040000004000104000000A6 -:103BB00004000000040000000B0E0D0000000820AF -:103BC0000000002208000020000020200000002843 -:103BD00020000020112F0F08080800000800001026 -:103BE00000000012000008100909090007000B007E -:103BF00009000000000000000200000002000000B8 -:103C0000040000001054004010580040105C0040B8 -:103C10000000200000002000000020001000001024 -:103C20000000001400001010000000020000000E50 -:103C30000000000602000000020000000100000079 -:103C40000000200000004000000080000000000094 -:103C50000100000001000000010000000100000060 -:103C60000400000001000000020000000800000045 -:103C700004000000000C024000080240000802405E -:103C800000080240000802403C0A560A700A8B0AEB -:103C9000A60AC10ADD0AF80A150B310B4E0B6B0B95 -:103CA000880BA50BC30BE10B000C1E0C3D0C5D0C2F -:103CB0007C0C9C0CBD0CDD0CFE0C1F0D410D630D2E -:103CC000850DA80DCB0DEE0D120E360E5A0E7F0E81 -:103CD000A40ECA0EEF0E160F3C0F630F8B0FB30F1F -:103CE000DB0F03102C1056108010AA10D4100011F6 -:103CF0002B1157118311B011DE110B1239126812FA -:103D00009712C712F712271359138A13BC13EF1314 -:103D1000221455148914BE14F31429155F15951532 -:103D2000CD1504163D167616AF16E91624175F1743 -:103D30009B17D817151852189118CF180F194F192B -:103D40009019D119131A561A9A1ADE1A221B681BD7 -:103D5000AE1BF51B3D1C851CCE1C181D621DAD1D28 -:103D6000F91D461E941EE21E311F811FD11F232004 -:103D70007520C8201C217121C7211D227422CD224B -:103D800026238023DA2336249324F1244F25AF25DC -:103D90000F267126D32636279B2700286728CE2892 -:103DA0003629A0290B2A762AE32A512BC02B302C46 -:103DB000A12C132D862DFB2D712EE82E602FD92FCF -:103DC0005330CF304C31CA314A32CA324C33D033FF -:103DD0005434DA346235EA35743600378D371B389F -:103DE000AA383C39CE39623AF83A8F3B273CC13C7D -:103DF0005D3DFA3D983E383FDA3F7E402341CA415F -:103E000072421C43C84376442545D64589463D4702 -:103E1000F447AC486649224ADF4A9F4B614C244D27 -:103E2000EA4DB14E7B4F46501451E351B552895380 -:103E30005E5436551156ED56CB57AC588F59745ABF -:103E40005C5B465C325D215E125F0560FB60F36186 -:103E5000EE62EB63EB64ED65F266FA670469116A82 -:103E6000206B336C486D5F6E7A6F9770B871DB7240 -:103E700001742A7556768577B778EC79247B5F7C58 -:103E80009D7DDF7E24806C814D5055363530303A33 -:103E90002053656C662074657374202573205B461F -:103EA00041494C5D2E206C6F773A2025302E3266CA -:103EB0002C20686967683A2025302E32662C206DE8 -:103EC000656173757265643A2025302E32660A008A -:103ED0006779726F2058006779726F20590067798F -:103EE000726F205A00616363205800616363205938 -:103EF00000616363205A004D5055363530303A200A -:103F000053656C662074657374205B4F4B5D2E0A9D -:103F1000004932434445563A204572726F7220631D -:103F2000616C6C6261636B206E723A2025690A00D5 -:103F30004C50533235483A2053656C662074657393 -:103F400074202573205B4641494C5D2E206C6F77B1 -:103F50003A2025302E32662C20686967683A202581 -:103F6000302E32662C206D656173757265643A205F -:103F700025302E32660A0074656D70657261747545 -:103F80007265004C50533235483A2053656C6620B8 -:103F900074657374205B4F4B5D2E0A00414B3839BA -:103FA00036333A2053656C6620746573742025732C -:103FB000205B4641494C5D2E206C6F773A2025648A -:103FC0002C20686967683A2025642C206D65617330 -:103FD000757265643A2025640A00414B38393633DE -:103FE0003A2053656C662074657374205B4F4B5D9B -:103FF0002E0A00454550524F4D3A20493243206326 -:104000006F6E6E656374696F6E205B4F4B5D2E0A39 -:1040100000454550524F4D3A2049324320636F6E60 -:104020006E656374696F6E205B4641494C5D2E0A74 -:1040300000736F6E617252616E67650073746F70AA -:104040005F736F6E617200702D3E73697A65203CFC -:10405000205359534C494E4B5F4D54550068616C89 -:104060002F7372632F7573626C696E6B2E630055CC -:1040700053424C494E4B004269746372617A652029 -:1040800041420053544D3332205669727475616C4D -:1040900020436F6D506F727420696E204853206DFD -:1040A0006F64650056435020436F6E666967005623 -:1040B000435020496E746572666163650052617792 -:1040C000204352545020696E7465726661636500C6 -:1040D000303132333435363738394142434445463E -:1040E000494D553A204D50553932353020493243EB -:1040F00020636F6E6E656374696F6E205B4F4B5DFE -:104100002E0A00494D553A204D5055393235302050 -:1041100049324320636F6E6E656374696F6E205B16 -:104120004641494C5D2E0A00494D553A20414B38D5 -:104130003936332049324320636F6E6E656374698C -:104140006F6E205B4F4B5D2E0A00494D553A204162 -:104150004B383936332049324320636F6E6E6563C6 -:1041600074696F6E205B4641494C5D2E0A00494DD3 -:10417000553A204C50533235482049324320636F22 -:104180006E6E656374696F6E205B4F4B5D2E0A0027 -:10419000494D553A204C505332354820493243203E -:1041A000636F6E6E656374696F6E205B4641494C48 -:1041B0005D2E0A00494D553A20556E696E69746945 -:1041C000616C697A656400494D553A204779726F90 -:1041D0002076617269616E63652074657374205B1B -:1041E0004F4B5D0A00494D553A20416363206C6591 -:1041F00076656C2074657374205B4F4B5D0A0049D3 -:104200004D553A20416363206C6576656C2074657A -:10421000737420526F6C6C3A25302E32662C20500D -:10422000697463683A25302E3266205B4641494CFA -:104230005D0A00494D553A204779726F20766172C8 -:1042400069616E63652074657374205B4641494CF7 -:104250005D0A004D50553635303000484D433538F5 -:1042600038334C004D53353631310073746F705F05 -:10427000696D755F74657374730073746F705F69D3 -:104280006D755F73656E736F727300666163746FD3 -:10429000720073746F705F696D755F6163635F6CEB -:1042A00070660073746F705F6D61675F7261770035 -:1042B0000000404085EB7140B81E754014AE774059 -:1042C000C3F5784048E17A40A4707D40000080400A -:1042D000AE478140333383405057524D474E5400D0 -:1042E00076626174006368617267654375727265B6 -:1042F0006E740073746174650073746F705F706DB9 -:1043000000534C3A20556E6B6E6F776E2070616370 -:104310006B65743A25582E0A0068616C2F737263BE -:104320002F7379736C696E6B2E63005359534C492C -:104330004E4B00736C702D3E6C656E677468203C4C -:104340003D205359534C494E4B5F4D5455006861C5 -:104350006C2F7372632F726164696F6C696E6B2E60 -:104360006300637274705061636B657444656C695B -:104370007665727900727373690073746F705F721F -:104380006164696F0068616C2F7372632F6F775F70 -:104390007379736C696E6B2E63004F573A20436DCF -:1043A0006420307825582074696D656F75742E0A05 -:1043B000004F573A20466F756E642025642E0A0020 -:1043C0004F573A205363616E205B4641494C454448 -:1043D0005D2E0A004F573A2053657269616C203098 -:1043E0007825582025582025582025582025582044 -:1043F00025582025582025582E0A004F573A204D81 -:10440000656D3A256420476574696E666F205B466A -:1044100041494C45445D2E0A006C656E6774682006 -:104420003C3D204F575F4D41585F53495A4500402E -:1044300040FF20204008081000000000000000009D -:10444000000000000000000000000000000000006C -:104450000000000000200000100000080000041010 -:1044600010100808080404042000001000000800D0 -:104470000004000002000072696E6754696D657285 -:10448000006E65666665637400736F6C696452657F -:104490006400736F6C6964477265656E00736F6C5E -:1044A0006964426C756500686561646C696768740D -:1044B000456E61626C6500676C6F77737465700040 -:1044C000656D7074794368617267650066756C6CC0 -:1044D0004368617267650073746F705F72696E67BD -:1044E0000040FF40204020081008000000000000AD -:1044F00000000000000000000000000000000000BC -:1045000000000000001400000014000000144558D2 -:10451000504252443A20466F756E64202564206DE7 -:10452000656D6F726965732E0A004558504252449A -:104530003A205363616E205B4641494C45445D2EF1 -:104540000A004558504252443A2057726F6E672015 -:104550004352433A30782558213D307825580A0097 -:104560004558504252443A2057726F6E6720686532 -:10457000616465722069643A20307825580A0045E4 -:1045800058504252443A2052656164696E67206215 -:104590006F617264206E723A2564205B4641494C1B -:1045A00045445D2E0A004558504252443A206E65FB -:1045B0006F706978656C72696E67496E6974206F97 -:1045C0006B0A004558504252443A20496E666F20AB -:1045D000626F6172642025693A0A00202D48656186 -:1045E0006465723A25580A00202D50696E732020A8 -:1045F0003A307825580A00202D5669642020203A48 -:1046000025580A00202D5069642020203A25580A98 -:1046100000202D6372632020203A25580A00455857 -:10462000504252443A20457870616E73696F6E2033 -:10463000706F72742074657374205B4F4B5D2E0A2B -:10464000004558504252443A20457870616E736973 -:104650006F6E20706F72742074657374205B4641B6 -:10466000494C5D2E0A00424947515541443A205376 -:104670007769746368696E6720746F2062727573FE -:10468000686C6573732E0A0045543A2050696E3A7F -:10469000257320213D202564205B4641494C5D0A5D -:1046A00000434647424C4B3A207625642C207665E1 -:1046B00072696669636174696F6E205B4F4B5D0A56 -:1046C00000434647424C4B3A20566572696669631F -:1046D0006174696F6E205B4641494C5D0A000000C1 -:1046E0006937AC3168212233B40F14336821A23307 -:1046F0003863ED3EDA0F493F5E987B3FDA0FC93FE2 -:104700006173696E66000000706F776600000000DC -:104710000000000000C0153F00000000DCCFD135D4 -:104720000000803F0000C03F000FC93F000F49401C -:1047300000CB9640000FC9400053FB4000CB164110 -:1047400000ED2F41000F49410031624100537B4190 -:10475000003A8A4100CB9641005CA34100EDAF4195 -:10476000007EBC41000FC94100A0D5410031E241AB -:1047700000C2EE410053FB4100F20342003A0A42FC -:104780000083104200CB164200141D42005C2342FD -:1047900000A5294200ED2F4200363642007E3C4201 -:1047A00000C74242000F4942A2000000F900000089 -:1047B000830000006E0000004E0000004400000076 -:1047C0001500000029000000FC0000002700000088 -:1047D00057000000D1000000F50000003400000088 -:1047E000DD000000C0000000DB00000062000000EF -:1047F00095000000990000003C000000430000000C -:104800009000000041000000FE0000005100000088 -:1048100063000000AB000000DE000000BB000000F1 -:10482000C500000061000000B70000002400000087 -:104830006E0000003A000000420000004D00000041 -:10484000D2000000E0000000060000004900000067 -:104850002E000000EA00000009000000D100000066 -:10486000920000001C000000FE0000001D0000007F -:10487000EB0000001C000000B10000002900000057 -:10488000A70000003E000000E800000082000000D9 -:1048900035000000F50000002E000000BB00000005 -:1048A0004400000084000000E90000009C000000BB -:1048B0007000000026000000B40000005F0000004F -:1048C0007E0000004100000039000000910000005F -:1048D000D6000000390000008300000053000000F3 -:1048E00039000000F40000009C000000840000007B -:1048F0005F0000008B000000BD000000F900000018 -:10490000280000003B0000001F000000F80000002D -:1049100097000000FF000000DE000000050000001E -:10492000980000000F000000EF0000002F000000C2 -:10493000110000008B0000005A0000000A00000077 -:104940006D0000001F0000006D0000003600000038 -:104950007E000000CF00000027000000CB00000018 -:1049600009000000B70000004F00000046000000F2 -:104970003F000000660000009E0000005F00000095 -:10498000EA0000002D000000750000002700000074 -:10499000BA000000C7000000EB000000E5000000C6 -:1049A000F10000007B0000003D0000000700000057 -:1049B00039000000F70000008A00000052000000EB -:1049C00092000000EA0000006B000000FB00000005 -:1049D0005F000000B10000001F0000008D0000001B -:1049E0005D00000008000000560000000300000009 -:1049F0003000000046000000FC0000007B000000CA -:104A00006B000000AB000000F0000000CF000000D1 -:104A1000BC000000200000009A000000F40000002C -:104A2000360000001D000000A9000000E3000000A7 -:104A300091000000610000005E000000E600000040 -:104A40001B00000008000000650000009900000045 -:104A5000850000005F00000014000000A0000000BE -:104A600068000000400000008D000000FF00000012 -:104A7000D8000000800000004D000000730000001E -:104A800027000000310000000600000006000000C2 -:104A90001500000056000000CA000000730000006E -:104AA000A8000000C900000060000000E200000053 -:104AB0007B000000C00000008C0000006B000000C4 -:104AC0000400000007000000090000000000C93FCA -:104AD0000000F0390000DA370000A2330000842E15 -:104AE0000000502B0000C2270000D0220000C41F8D -:104AF0000000C61B00004417000000000000304307 -:104B000000000000000030C30020202020202020D2 -:104B1000202028282828282020202020202020206D -:104B2000202020202020202020881010101010107D -:104B300010101010101010101004040404040404C9 -:104B40000404041010101010101041414141414163 -:104B50000101010101010101010101010101010145 -:104B60000101010110101010101042424242424255 -:104B70000202020202020202020202020202020215 -:104B800002020202101010102000000000000000BD -:104B90000000000000000000000000000000000015 -:104BA0000000000000000000000000000000000005 -:104BB00000000000000000000000000000000000F5 -:104BC00000000000000000000000000000000000E5 -:104BD00000000000000000000000000000000000D5 -:104BE00000000000000000000000000000000000C5 -:104BF00000000000000000000000000000000000B5 -:104C000000000000000000000043000081000000E0 -:104C10001D380108000000004900000006380108A6 -:104C2000227AFF1F4A0000000C380108107AFF1F8B -:104C30004A00000010380108147AFF1F4A000000E3 -:104C400014380108187AFF1F800000001838010886 -:104C50000000000081000000E537010800000000AE -:104C600000000000EC3701084056002080000000E2 -:104C7000FB37010800000000810000008E380108A9 -:104C800000000000080000004B3801088E5600208C -:104C900008000000533801089801002008000000B7 -:104CA0005B380108BC56002008000000623801088B -:104CB00099010020080000006F3801089A010020C7 -:104CC000080000007D380108B25600208000000076 -:104CD000893801080000000081000000E638010862 -:104CE0000000000006000000993801087C620020E6 -:104CF00006000000A13801088062002006000000C4 -:104D0000A93801088462002006000000B1380108BB -:104D10000C62002006000000BA3801081062002072 -:104D200006000000C33801081462002006000000DD -:104D3000CC380108D061002006000000D3380108FB -:104D4000D461002006000000DA380108D861002094 -:104D500080000000E1380108000000008100000030 -:104D6000F43801080000000006000000993801082E -:104D70009461002006000000A1380108986100201D -:104D800006000000A93801089C6100200600000010 -:104D9000B13801084462002006000000BA3801085A -:104DA0004862002006000000C33801084C62002061 -:104DB00006000000CC380108B462002006000000A4 -:104DC000D3380108B862002006000000DA38010874 -:104DD000BC62002080000000EF38010800000000E5 -:104DE00081000000063901080000000006000000F4 -:104DF000B7380108A401002006000000C0380108EF -:104E0000A00100208000000001390108000000001E -:104E100081000000E83901080000000006000000E1 -:104E20001F390108B40100200600000028390108DC -:104E3000E4010020060000003539010888570020F1 -:104E40000600000041390108B00100200600000002 -:104E500053390108B801002006000000C9380108D4 -:104E60001457002006000000C0380108C8010020C7 -:104E700006000000B7380108CC0100200600000041 -:104E800061390108A8010020060000006A39010804 -:104E9000C40100200600000074390108E001002070 -:104EA0000600000081390108BC0100200600000056 -:104EB0008C390108D401002006000000993901084E -:104EC000D001002006000000AB390108E0560020A8 -:104ED00006000000B8390108D801002009000000D0 -:104EE000C4390108AC01002009000000CF390108D5 -:104EF000C001002009000000D93901082257002014 -:104F000080000000E339010800000000810000007B -:104F1000203B0108000000004A000000FE3A0108A2 -:104F2000643B010849000000083B0108683B010898 -:104F300048000000123B0108FD3A01088000000013 -:104F40001B3B010800000000810000007F420108B7 -:104F500000000000480000005B420108BE5E002027 -:104F60004800000064420108D45E00208000000078 -:104F70007A42010800000000810000007042010830 -:104F8000000000004800000053420108A603002072 -:104F9000480000005B420108A50300204800000013 -:104FA00064420108A7030020800000006B42010852 -:104FB000000000008100000097420108000000008E -:104FC000080000008B420108C65E0020800000003F -:104FD000924201080000000081000000DC4401084A -:104FE00000000000080000008244010814040020B2 -:104FF0004A000000814401083460002008000000DD -:1050000089440108000400200800000092440108BF -:10501000C0030020080000009D440108080400208F -:1050200008000000A74401082C60002006000000D2 -:10503000B74401080C04002006000000C044010829 -:10504000C803002006000000CC4401081004002022 -:1050500080000000D744010800000000810000002B -:10506000E13701080000000004000000D537010806 -:105070004256002080000000DC37010800000000DC -:10508000810000008B3A01080000000007000000CA -:105090005F390108E856002007000000DA370108F0 -:1050A000EC56002007000000693A0108F056002085 -:1050B000070000007E3A0108785700200700000032 -:1050C000813A01087C57002080000000863A0108E0 -:1050D0000000000081000000433A010800000000C9 -:1050E000070000001D3A010880570020070000005B -:1050F000213A01086057002007000000283A010803 -:105100009C57002007000000303A01080857002093 -:1051100007000000353A0108185700208000000001 -:105120003E3A01080000000081000000633A0108D7 -:105130000000000006000000523A0108E46200206E -:1051400006000000553A0108EC620020060000004D -:10515000583A0108E0620020060000005B3A0108AE -:10516000D8620020800000005E3A010800000000C4 -:1051700081000000AA3A01080000000007000000BA -:105180008F3A0108DC56002007000000943A01081D -:1051900024570020070000009A3A01080057002019 -:1051A000020000009E3A0108DE620020800000003C -:1051B000A53A01080000000081000000E83901085C -:1051C0000000000007000000F03901081C57002013 -:1051D00007000000F4390108DC010020070000008E -:1051E000FB3901086857002007000000023A010857 -:1051F0006857002007000000093A0108E456002023 -:1052000007000000133A01080C570020800000003E -:10521000E33901080000000081000000793A01082C -:1052200000000000070000005F3901086C570020F3 -:1052300007000000DA37010870570020070000005F -:10524000693A01087457002080000000743A010890 -:1052500000000000810000004D3A0108000000003D -:10526000070000004E3A0108285700200700000000 -:10527000BE4401084857002007000000C13801085B -:105280004C570020070000009044010850570020B0 -:1052900080000000483A0108000000008100000082 -:1052A000703A010800000000070000005F390108A3 -:1052B000F456002007000000DA370108F8560020F5 -:1052C00007000000693A0108FC5600208000000039 -:1052D0006B3A010800000000810000004140010815 -:1052E000000000000200000031400108706400204E -:1052F000800000003C400108000000008100000028 -:10530000A842010800000000050000005F39010804 -:10531000C05E002005000000DA370108C25E0020F0 -:1053200005000000693A0108C45E0020800000000A -:10533000A34201080000000081000000FE420108B5 -:105340000000000007000000E0420108F05E0020BD -:1053500007000000E5420108E15E002004000000B3 -:10536000F3420108F55E002080000000F9420108C8 -:1053700000000000810000007F43010800000000E1 -:105380000100000075430108805F002080000000DC -:085390007A430108000000004F -:08539800D0F7FE7F01000000C8 -:1053A000FFFFFFFF184E0000AAAAAAAA00000000F3 -:1053B000010203040102030406070809B4340108CA -:1053C0003035010874350108E033010870340108F4 -:1053D000FC350108B835010824340108AD77000810 -:1053E000AD770008AD770008000000000000000065 -:1053F0003C0000200100000032000000000000001E -:105400003200000001000000320000000000000037 -:105410003200000001000000320000000000000027 -:105420003200000001000000320000000000000017 -:105430003200000001000000320000000000000007 -:1054400032000000010000003200000000000000F7 -:1054500032000000010000003200000000000000E7 -:105460003200000000000000FFFFFFFF010000000D -:1054700032000000000000009E0700000000000055 -:10548000FEFFFFFF01000000C80000000000000058 -:105490002003000000000000FEFFFFFF01000000ED -:1054A000E803000000000000FEFFFFFF0100000015 -:1054B00001000000000000000000000000000000EB -:1054C000FFFFFFFF010000003200000000000000AD -:1054D000C201000000000000FEFFFFFF010000000D -:1054E000E803000000000000FEFFFFFF01000000D5 -:1054F0003200000000000000FA0000000000000080 -:10550000FEFFFFFF01000000F401000000000000AA -:10551000F401000000000000FEFFFFFF010000009A -:105520006400000000000000900100000000000086 -:10553000FEFFFFFF88130000020101000000803F12 -:105540006F12033BCDCC4C3FCDCC4C3FF8A70000B5 -:10555000000048431F856B3F0000803F48E17A3FD1 -:1055600060EA000000204B46EC51383E0000003F4E -:105570000AD7A33B000040C2CDCC4C3D000080BF09 -:10558000CDCC4C3D7B146E3F4E3B0108403B0108A7 -:10559000593B010800030002000000000000000069 -:1055A000000000000000000000000000FFFFFFFFFF -:1055B00000000000010300020000000000000000E5 -:1055C000000000000000000000000000FFFFFFFFDF -:1055D00000000000000402400004024000000240FD -:1055E000F4010020140200204C02002002030002FB -:1055F00000000000000000000000000000000000AB -:1056000000000000FFFFFFFF00000000005400400A -:1056100000580040005C0040A0600240B8600240BA -:105620007060024000040240000402400008024092 -:1056300000600240006002400060024010600240D2 -:105640005860024040600240AC02002009CC0008D3 -:1056500051CB000807CB0008ADCA0008D9CA000822 -:1056600091CA00087BCA0008BDCA0008CBCA00085E -:1056700000000000000000002BE9000899E9000884 -:105680006DE9000800000000000000003DEA00088D -:1056900049EA000855EA0008C5EA000871EA00086E -:1056A000E9EA000805EB00080403090412010002FE -:1056B0000000004083044057000201020301000083 -:1056C00035EB000837EB000839EB000881EB0008E8 -:1056D0003BEB00083DEB00088FEB0008B5EB000842 -:1056E0009DEB000855EC00080000000000000000E1 -:1056F0001DEC000841EB0008E5EB0008000000008D -:105700000000000029EB0008FF0000000902200053 -:1057100001010080320904000002FFFF00000705BC -:10572000810240000607050102400006000000005B -:105730000000000000000000000000000000000069 -:1057400000000000000101010000C04021F8000835 -:1057500025F8000879F800080000000000000000AB -:1057600014000000FFFFFFFF66664640E1070108E6 -:10577000BDFD000825FF0008C902010889010108D4 -:105780007DFF0008DDFF000815FE0008F90701088D -:10579000A9000108B9FE00084D00010849060108EA -:1057A00014000000FFFFFFFF14000000CDCC4C3DB3 -:1057B00066668640090000000004024080005344F1 -:1057C0004100000000040240400053434C00000030 -:1057D0000008024000045458310000000008024054 -:1057E00000085258310000000000024004005458E4 -:1057F0003200000000000240080052583200000051 -:1058000000000240200053434B0000000000024013 -:1058100040004D4F534900000000024080004D49B8 -:10582000534F0000000402400001494F31000000C6 -:10583000000402402000494F3200000000040240F2 -:105840001000494F33000000000802400010494F8B -:105850003400000030784243015000000000000096 -:10586000000000E7E7E7E7E700010000084B010858 -:105870000000000000000000000000000000000028 -:105880000000000000000000000000000000000018 -:10589000094C0108000000000000000000000000AA -:1058A00000000000000000000000000000000000F8 -:1058B00000000000000000000000000000000000E8 -:1058C00000000000000000000000000000000000D8 -:0458D000D0040020E0 +:100000009DF803508DF804502E460324DCE79DF83C +:100010000330202BD7D81E44F6B2002B35448DF880 +:100020000530EDB24FF0000714BF04240524CBE7E0 +:100030009DF803300AAA3A441E4402F8223CF6B264 +:1000400001379DF805303544FFB2EDB2BB4208BF21 +:100050000524B9E79DF80340B4420CBF06240024F0 +:10006000B2E79DF80330AB42ADD19DF8042002F019 +:10007000F004102C06D0202C08D05CB901A800F0A8 +:1000800043F9A1E701A8FFF7B5FE9CE701A800F03E +:10009000D7F998E705490648FAF738FD93E7054888 +:1000A00005498122FAF7F4FB8EE700BFD556010817 +:1000B000B587000899410108ED56010830B5114B8C +:1000C0001D7885B01C46D5B9032201202946F5F7D5 +:1000D000FFFD0D4A106020B129462A462B46F5F750 +:1000E0002BFE0523009300230193029303930748FB +:1000F00007499622F5F736F8012808BF207005B0A9 +:1001000030BD00BF9267002094670020BDFF00084B +:10011000FF560108014B1878704700BF9267002016 +:10012000F8B5204E054600210B4630684FF0FF32EF +:10013000F5F79EFF6B78202B04D91B481B49C3227F +:10014000FAF7A6FB1A4CBC232370CF2363702B78DD +:10015000A3706B78E3706A78A91C201D03F090FEF1 +:100160006D780023A81DA71C1A4605F1040EC4EBE8 +:10017000070CF4450E4906DA17F8011B0A44D2B2FF +:100180001344DBB2F1E70D4401F80E206B71FEF76A +:1001900049FE002130680A460B46F5F7CDFD0020E8 +:1001A000F8BD00BF9467002007570108ED5601080D +:1001B000526700200020704770B503781E2B04465C +:1001C00004D90E480E49A022FAF762FB0D4D002615 +:1001D0002E702278214601326A7011F8012BA81C7A +:1001E000013203F04DFE084B29461868642233465D +:1001F000F5F7A2FD431E5842584170BD71490108F0 +:1002000022570108A46700209C67002008B5064B10 +:100210000146642218680023F5F72AFF10F1FF3029 +:1002200018BF4FF0FF3008BDA0670020FFF772BF76 +:1002300000B58BB001238DF8060001A88DF80430BD +:100240008DF80530FFF76CFF0BB05DF804FB00B5CF +:100250008BB002238DF804308DF80600012301A82D +:100260008DF80530FFF75CFF0BB05DF804FB00B5BF +:100270008DB0CDE9000105238DF80C308DF80D30DF +:100280000CAB53F8300DCDF80E001B798DF8123001 +:1002900003A8FFF745FF0DB05DF804FB38B5154B1B +:1002A0001D781C462DBB22212A460120F5F710FDA2 +:1002B000114B202118602A460520F5F709FD0F4B48 +:1002C000186020B90E480F494E22FAF7E1FAFFF7FD +:1002D000F5FE01F08DFDC0B2FFF7AAFF01F094FD1D +:1002E000C0B2FFF7B4FF01F099FDFFF7C0FF012393 +:1002F000237038BD996700209C670020A06700200C +:10030000365701082257010810B5047804BB43781A +:100310000146013B01F8013F104B22461868234675 +:10032000F5F70AFD01200E49F7F7C4FF0D4B0E4902 +:10033000186822462346F5F79BFE01280DD10220BE +:100340000749F7F7B7FF0848BDE81040FFF7E8BED8 +:10035000042C02BF054B82781A7010BDA0670020E4 +:10036000040100209C670020C667002098670020D9 +:1003700000487047A003002030B520298BB0054607 +:100380000C4604D915481649BC22FAF781FA1549DA +:100390008DF8045022460DF106008DF8054003F05B +:1003A0006FFD01A8FFF7BCFE0F4B0021186841F25A +:1003B00088320B46F5F75CFE012805D10B4B187807 +:1003C00048B100221A7006E009480A499DF8042045 +:1003D000FAF79CFB00200BB030BD00BF0C570108A2 +:1003E00059570108ED67002010680020EC670020D5 +:1003F000B58700086E57010810B5FFF75FFE0120B2 +:1004000000210322F5F764FC0B4B18601C4620B159 +:1004100000210A460B46F5F78FFC0120F5F754FD45 +:10042000064B002118604FF0FF3220680B46BDE8F4 +:100430001040F5F71DBE00BF10680020E8670020DF +:100440000378203B032B0AD80A4A831C223053F836 +:10045000041B42F8041B8342F9D1012200E0002270 +:10046000054B1A70054B002118680A460B46F5F734 +:1004700063BC00BFED670020EC670020106800201F +:1004800038B50E4C00210B464FF0FF320546206870 +:10049000F5F7EEFD20200021FFF76EFF234620B187 +:1004A000074A12782A70012400E0044600211868E7 +:1004B0000A460B46F5F740FC204638BDE8670020A9 +:1004C000ED670020F8B5134C134D0E4600210B4686 +:1004D00007464FF0FF322068F5F7CAFD21200121C1 +:1004E0002F70FFF749FF234650B1294651F8012FDD +:1004F00032602C784A687260FF3C18BF012400E02B +:100500000446002118680A460B46F5F715FC2046FC +:10051000F8BD00BFE8670020ED6700202DE9F04737 +:10052000702A01EB020506460C469946ADB205D984 +:100530002748284940F20B12FAF7AAF9DFF8A08001 +:10054000254FD8F8000000214FF0FF320B46F5F799 +:100550008FFD3E700026AC422FD2C4EB050ABAF1E3 +:100560001C0FA7F8014010DCE91C091B2220C9B2AE +:10057000FFF702FF08B9002420E009EB0600174945 +:10058000524603F07DFC2C46E5E722202021FFF7B0 +:10059000F3FE0028EFD0114B09EB060203F11C011A +:1005A00053F8040B42F8040B8B42F9D11B781370FB +:1005B0001D341D36A4B2F6B2CDE701240021D8F8CF +:1005C00000000A460B46F5F7B7FB2046BDE8F0876A +:1005D000ED57010859570108ED670020F06700202A +:1005E000E86700202DE9F843702A01EB02068146F6 +:1005F0000C469846B6B205D929482A494FF49F724D +:10060000FAF746F9284F294D386800214FF0FF329C +:100610000B46F5F72DFD85F800904FF00009B44228 +:1006200033D2331B192BA5F8014008EB09010EDC6E +:100630009CB21F48A5F80340224603F021FC611D2F +:100640002320C9B2FFF798FEE8B900241EE01A2360 +:10065000EB7000232B71164B01F1180251F8040BBB +:1006600043F8040B9142F9D10A881A8023201F21F4 +:10067000FFF782FE0028E8D01A3409F11A09A4B263 +:100680005FFA89F9CBE73446C9E7012400213868CD +:100690000A460B46F5F750FB2046BDE8F88300BF3D +:1006A000ED57010859570108E8670020ED67002061 +:1006B000F267002030B5437813F003038BB0044693 +:1006C00002D0012B0FD02BE0837833BB03238DF8AE +:1006D000043001238DF80530C3788DF8063001A869 +:1006E000FFF71EFD19E083788BB1012B18D10D4D5A +:1006F0001D222968033003F0E6FB286803F0DBFBCA +:100700001D289ABF0130C0B21E20207005E00223D0 +:10071000C0F803300523037000E02046F7F794FC8F +:100720000BB030BDE001002010B5054C23782BB98B +:100730000D200449F7F780FC0123237010BD00BF92 +:1007400014680020B5060108014B1878704700BFF7 +:100750001468002010B50B4B1A6801321A600A4B5E +:100760001B680BB9094B1B6809480C214B43C41883 +:10077000C35833B10A205043211DA268BDE8104080 +:10078000184710BD346800202C6800202068002025 +:10079000B803002038B517491748184C184DF9F719 +:1007A00097FF184920601448F9F792FF28602068E5 +:1007B000154CF9F7B9FF20602868F9F7B5FF134B1E +:1007C0001860134B00221A60124A7F2111602168C1 +:1007D00081EAE172A2EBE172052AC1BF6FF031023A +:1007E0004A4302F6B8321A601868BDE83840F7F795 +:1007F00015BE00BF834D0108994D010830680020E7 +:10080000246800207E4D01081C68002048680020F4 +:1008100038680020446800200F4A104B108819885F +:10082000014489B2B1F57A6F198084BF4FF47A61BF +:100830001980198884BF40421080B1F5FA6F3FBF1C +:10084000118849421180054A3CBF4FF4FA6111807A +:100850001888F7F7E3BD00BFB6030020540400205A +:10086000014B1888F7F7DABDB403002070B50B68A8 +:10087000184E0233154632F82320FE2A0C4609D1C1 +:10088000154A1368002121600BB111601EE0134A64 +:1008900013601BE03368ABB9FF2A08BF0B600B681D +:1008A000023335F82300F7F7B9FD2268296805EB14 +:1008B0008205642301324B4369892260B3FBF1F363 +:1008C000336003E0012B01D1F7F7A0FD3368013B52 +:1008D000336070BD406800202C6800202068002034 +:1008E000F7F794BD73B50F4D2C78CCB90E4B0F486C +:1008F0000C221A600E4B00930A2101222346F5F7C1 +:1009000081FD0C4B06461860F4F766FD6423024631 +:100910000093304623460121F5F79CFD01232B70FF +:1009200002B070BD2868002018680020B45F01087C +:10093000550701083C680020014B1878704700BF3C +:1009400028680020014B1860704700BF2C68002009 +:1009500038B500F0DFF900F0D3F800F051F80546A3 +:10096000084909482A46FAF7D1F80024AC4208DAC7 +:10097000204600F04BF8836F1B6903B198470134A0 +:10098000F4E738BDB8630108B5870008F8B500F092 +:1009900037F8012507460024BC4215DA204600F04E +:1009A00035F8836F5B696BB198470646074826B1F7 +:1009B00007492246FAF7AAF804E006492246FAF760 +:1009C000A5F835460134E7E72846F8BDB5870008A5 +:1009D000D7630108F663010830B544680023A342D9 +:1009E00008DA0268D55C8D4207D01A445278023288 +:1009F0001344F4E74FF0FF3030BD184630BD00001F +:100A0000014B1868704700BF50680020044B1B68FA +:100A10009842BDBF034B7C2202FB00300020704790 +:100A2000506800206C68002008B5FFF7D5FFC04370 +:100A3000C00F08BD70B5044615461E46FFF7CCFF33 +:100A4000002810DB22681318811C5C78A642D8BFEE +:100A500006F1FF3411442846224603F011FA002320 +:100A60002B55204670BD00232B704FF0FF3070BD1A +:100A700030B51F4C8DB0A288A379ADF8142005467F +:100A80002068049000210DF1170017228DF8163010 +:100A900003F001FA54F81E0F0190A388ADF8083056 +:100AA00005F17004002320460121ADF80A30ADF8AD +:100AB0000C30FFF7B9FF28B12046012104AA1E23FC +:100AC000FFF7B8FF20460221FFF7AEFF28B120460E +:100AD000022101AA0A23FFF7ADFFAA6F054B9A4234 +:100AE00003D105480549FAF711F80DB030BD00BF34 +:100AF000EA3E010854680020B58700081764010821 +:100B00002DE9F04F614A13788BB09046002B40F0EE +:100B1000BA800AAC04F8213DFFF76EFC2046FFF7CF +:100B2000AFFC044680B19DF80720594B594C5A48F8 +:100B30005A49012A88BF2346F9F7E8FF0027584C95 +:100B4000B94601263D4640E053485649F9F7DEFFD5 +:100B50008DF80740F2E7C4F86A10C4F8664004F163 +:100B60006600012102AA1E23FFF764FF14F8050C9A +:100B700000286AD014F8041C00F0D4F84A4B00286E +:100B800008BF1846C4F86E005046FFF771FFD4F84E +:100B90006E309B6819EA030F04D03F484349F9F7C8 +:100BA000B5FF0026D4F86E30DB681F4204D03A4807 +:100BB0003F49F9F7ABFF0026D4F86E309A68DB683E +:100BC00049EA02091F4301357C349DF807309D42F4 +:100BD0004BDAA4F10A0AE8B2002170225346FFF76B +:100BE0009DFC8346002839D014F80A3CEB2B02D038 +:100BF0002948304910E050460721F9F795FF14F8CD +:100C0000033CC0B2834202D023482B4904E014F8CD +:100C1000023C23B120482949F9F778FF2CE014F869 +:100C2000011CA01E0231F9F77FFF254A14F8011CB0 +:100C30007C2303FB05230B44C2B29B7A9A428AD0E1 +:100C400020491548F9F762FF16E09DF808301BB1FE +:100C500002A800F083F891E7134893E70E481A4979 +:100C60002A46F9F753FF5E46ADE70EB1174A136007 +:100C7000012388F8003006E0074815492A46F9F7AD +:100C800045FF00269FE70BB0BDE8F08F5C6A0020AF +:100C90001C41010846640108B58700084A64010840 +:100CA000766800206D640108546800207B650108A7 +:100CB000F4650108BF640108E964010818650108CA +:100CC0006C680020486501086B66010850680020C8 +:100CD000B366010808490B786BB9084B084A1A60DB +:100CE000084B09489A1A094B92101A6001230B709D +:100CF0000749F9F70BBF7047646A0020686A002053 +:100D00000C7601081C760108B5870008606A00208F +:100D1000FF66010808B5FFF7DDFF014B186808BD45 +:100D2000606A0020F8B506460F46FFF7D3FF094B6F +:100D30001C68094B1D680022A24209DA55F82200FE +:100D40000178B14202D14178B94202D00132F3E7D1 +:100D50000020F8BD606A0020686A00202DE9F0419B +:100D60008046FFF7B7FF0A4B1E680A4B1F68002436 +:100D7000B44208DA57F8245040466968F4F778F925 +:100D800010B10134F4E700252846BDE8F08100BF2A +:100D9000606A0020686A002030B58BB0F5F74AFF22 +:100DA00004A8F5F77BFF6846F5F796FF124D012181 +:100DB0004FF400700024F6F777FA68460094019427 +:100DC00002940394F5F774FF4FF080738DF814408C +:100DD0008DF815400694079408942846012404A928 +:100DE00004938DF82440F5F733FF28462146F5F7A4 +:100DF00079FF0BB030BD00BF0021014008B5FDF701 +:100E00006DFE0248BDE80840F7F710BB580400200B +:100E10000020FDF7DFBE10B504468020FDF7DAFEA6 +:100E2000A0B2BDE81040FDF7E5BE0000024B187807 +:100E300008B1F6F7FDBF70476C6A002010B5064C8C +:100E4000237843B905490648F9F760FE0548F6F7E7 +:100E500099FE0123237010BD6C6A002041670108D0 +:100E6000B587000824000020F8B50C4C064604F1B4 +:100E70008407012554F8060C34F8021CF6F703F930 +:100E8000864206D00648074922463346F9F73EFE19 +:100E900000250C34BC42EDD12846F8BD7E0400206C +:100EA000B587000888670108F0B5634B634D644E51 +:100EB000012485B01C70FEF77FFE214607460720FF +:100EC000F6F7CEF90FCD5F4C0FC40FCD0FC495E8E8 +:100ED000030084E803000FCE04F108050FC50FCE10 +:100EE0000FC596E8030085E80300574D0FCD303459 +:100EF0000FC40FCD0FC495E8030084E8030000245D +:100F0000524D2B1960599B88029302A900230C347F +:100F10008DF80C308DF80E308DF80F308DF80D30C7 +:100F2000F6F772F8842CEBD12C1D8835002F40D0B9 +:100F3000238802930026012354F8040C8DF80C300A +:100F400002A98DF80E608DF80D60F6F75DF854F883 +:100F5000040C2188F6F79DF80196019BB3F57A7F82 +:100F600003DA019B01330193F7E70120FFF77CFFD0 +:100F70002188074654F8040CF6F78DF800230193F6 +:100F8000019BB3F57A7F02DA019B0133F7E700207A +:100F9000FFF76AFF0C3400284FF0000354F8100CE0 +:100FA0008DF80C3002A908BF0027F6F72DF8AC42E7 +:100FB000BCD1244C214D0FCC0FC50FCC0FC594E8EC +:100FC000030085E8030004F108060FCE05F57875E7 +:100FD0000FC50FCE0FC596E8030085E80300303437 +:100FE0000FCC05F578750FC50FCC0FC594E803003D +:100FF00085E80300EFB1164D164C286801238DF8E3 +:101000000C3000238DF80E308DF80D3002A9AB881E +:101010000293F5F7F9FFA3882068029302A9F5F778 +:10102000F3FF2868A988F6F736F82068A188F6F754 +:1010300032F8384605B0F0BDE86A002000000240F2 +:1010400000040240706A002000080240780400207A +:10105000600400206C04002070B531B90478417838 +:101060008278C31C00F11B050FE0014600230F4AE4 +:101070009C5CC4541A44033354784C7092788A7040 +:101080001B2B01F10301F2D1E8E71E7803F8036C92 +:101090005E7803F8026C9E7803F8016C0333AB4270 +:1010A000F3D104764176827670BD00BF996801085D +:1010B000234B09B100221A60D3ED007A204AB7EE23 +:1010C000007AF4EEC77AF1EE10FA49BF9FED1D7A6F +:1010D00082ED007A77EE877AC2ED007A93ED007A9E +:1010E00000F11B02184B1B7807EE903AF8EEE77AF6 +:1010F000033067EE877AFCEEE77A17EE903A00F855 +:10110000033C124B1B7807EE903AF8EEE77A67EE55 +:10111000877AFCEEE77A17EE903A00F8023C0C4B27 +:101120001B7807EE903AF8EEE77A67EE877AFCEEE6 +:10113000E77A17EE903A00F8013C9042D2D170471E +:101140003C6B0020CDCC4C3D08050020FC04002069 +:101150000905002030B509B900240AE0034600F172 +:101160001B0100221A705A709A7003338B42F8D117 +:10117000F2E7114BE25CE11840F20F234D78D10801 +:10118000594317318911017002F00702690941EAD8 +:10119000C20205F01F0540F203114A436B4321329E +:1011A0001733023492119B11122C4270837000F19C +:1011B0000300DED130BD00BF6078002030B5194A91 +:1011C00085B0034610681179009052F8050F8DF82C +:1011D000041002AC12790290227100211DF8012046 +:1011E00002EB42029818FF2501319D5405294FF06A +:1011F000000242708270F1D1A05C00EB40001D182B +:10120000002101321954052A4FF0FF006870A970BF +:10121000F2D11870587098709974D974197505B016 +:1012200030BD00BF123F010870B531B90478417874 +:101230008278C31C00F11B050FE0014600230F4A12 +:101240009C5CC4541A44033354784C7092788A706E +:101250001B2B01F10301F2D1E8E71E7803F8036CC0 +:101260005E7803F8026C9E7803F8016C0333AB429E +:10127000F3D104764176827670BD00BFE86701083D +:1012800070B531B9047E417E827E0346A0F11B0514 +:1012900016E012490922092392FBF3F303EBC3037F +:1012A000D31A03EB430311F8015CC554C4180B783F +:1012B00063704B78A370013A01F10301EBD1E1E7D0 +:1012C0005E7D1E769E7D5E76DE7D9E76033BAB4226 +:1012D000F6D104704170827070BD00BFC56701080F +:1012E00070B504460D4611B1164B00221A6029460E +:1012F0001548FFF7B1FE29461448FFF7C1FF254600 +:1013000000231149114A585C9E5C400800EB5600CE +:10131000E05419441A4448785678400800EB5600C7 +:10132000687090788A780333520802EB50021B2BC6 +:10133000AA7005F10305E4D1024A13680133136072 +:1013400070BD00BF846B00204D6B00208B6B0020B4 +:1013500010B500F11B0421B9134A1368092B09DDEC +:1013600017E0034600221A705A709A700333A342A2 +:10137000F8D1F1E7D9070CD5002101704170FF21A8 +:1013800081700330A042F7D10133132B09DD002314 +:1013900007E000210170417081700330A042F8D154 +:1013A000F2E7136010BD00BF446B002013B5044684 +:1013B0002E492F48F9F78CF92E4B1860F9F7EEF902 +:1013C000A21C1D342C482D49D0ED007AD1ED006AC5 +:1013D0009FED2B7A76EEE76A70EE677AC7EE266AA3 +:1013E0009FED287AB0EE476AA6EEA76AB4EEC76A08 +:1013F000F1EE10FA0BDCB5EEC06AF1EE10FA08D48B +:10140000FCEEC67ACDED017A9DF8043002E0FF23B0 +:1014100000E0002302F8023C002302F8013CD0ED7A +:10142000007AD1ED006A76EEE76A30EE676AC7EEC1 +:10143000266ADFED157AE6EE867AF4EEC77AF1EEEB +:1014400010FA0BDCF5EEC07AF1EE10FA07D4FCEEE0 +:10145000E77ACDED017A9DF8043000E0FF2302F831 +:10146000033BA242AED102B010BD00BFB45601088A +:10147000D25601086C6B00200005002014050020E6 +:1014800000007FC300007F4300000000F8B5464E17 +:10149000464D474F0446306800280FDA4549464814 +:1014A000F9F716F9454930604348F9F711F944490D +:1014B00028604148F9F70CF93860F8BDF9F76EF982 +:1014C000FDEEC07A286817EE906AF9F767F9FDEE2D +:1014D000C07A386817EE905AF9F760F9394A96429F +:1014E0003146B8BF1146B1F5007FBDEEC00AA8BFB6 +:1014F0004FF40071954210EE103A2846B8BF1046DE +:10150000B0F5007FA8BF4FF400709342B8BF1346F8 +:10151000B3F5007F1A46A8BF4FF400720029ACBF94 +:1015200001234FF0FF33002801FB03F1ACBF01237F +:101530004FF0FF33002A00FB03F04FF00205A8BF75 +:10154000012391FBF5F1B8BF4FF0FF33042990FB65 +:10155000F5F0D8BF00210428D8BF00205A4392FBE1 +:10156000F5F3042BD8BF0023B3F5807F08BF4FF0FD +:10157000FF33B0F5807F08BF4FF0FF30B1F5807FBB +:1015800008BF4FF0FF31C2B2DBB2C9B204F11B0099 +:1015900023706270A17003348442F9D10A4A13782F +:1015A00001331370F8BD00BF10050020746B0020DC +:1015B000F06A00204E4C0108684D01081C410108EA +:1015C000584D010800FEFFFF886B0020F0B52DED9F +:1015D000028B044683B0A9B9D44FD54E3B68D54D94 +:1015E000002B1ADAD449D548F9F772F8D44930609B +:1015F000D248F9F76DF8D3492860D048F9F768F870 +:1016000038608EE1034600F11B0100221A705A7007 +:101610009A7003338B42F8D1DEE73068F9F7BEF8F1 +:101620002868B1EE408AF9F7B9F8F3EE047AB4EE1F +:10163000E78AF1EE10FAB1EE400A00F36A81BBEEE0 +:10164000047AB4EEC78AF1EE10FAB4EEE70A00F1BC +:101650003E81F1EE10FA00F34381FBEE047AB4EE22 +:10166000E70AF1EE10FAB5EEC08A00F14581F1EE1D +:1016700010FA0CDBF7EE007A0BE0B4EEC70AF1EEDD +:1016800010FA40F12A81B0EE470AB0EE478AFFEE29 +:10169000007A67EE887AB5EEC00A27EE888AF1EE06 +:1016A00010FABFEE007AF7EE007AB8BFF0EE477A94 +:1016B00067EE807ADFEDA46A60EE277AB2EE040A64 +:1016C00038EE007AB4EEE67AF1EE10FA0BDCB5EE05 +:1016D000C07AF1EE10FA08D4BCEEC76A8DED016A4B +:1016E0009DF8043002E0FF2300E00023B4EEE67A28 +:1016F000F1EE10FA84F821300BDCB5EEC07AF1EE91 +:1017000010FA08D4BCEEC76A8DED016A9DF804306A +:1017100002E0FF2300E00023B4EEE67AF1EE10FAD7 +:1017200023700BDCB5EEC07AF1EE10FA08D4BCEEF3 +:10173000C77A8DED017A9DF8043002E0FF2300E0C6 +:10174000002330EE677AE370B4EEE67AF1EE10FA39 +:101750000BDCB5EEC07AF1EE10FA08D4BCEEC76A25 +:101760008DED016A9DF8043002E0FF2300E00023C4 +:10177000B4EEE67AF1EE10FA23720BDCB5EEC07A25 +:10178000F1EE10FA08D4BCEEC76A8DED016A9DF83F +:10179000043002E0FF2300E00023B4EEE67AF1EE2D +:1017A00010FAE3720BDCB5EEC07AF1EE10FA08D451 +:1017B000BCEEC77A8DED017A9DF8043002E0FF237C +:1017C00000E0002330EE488AA373B4EEE68AF1EE1F +:1017D00010FA0BDCB5EEC08AF1EE10FA08D4BCEEBC +:1017E000C87A8DED017A9DF8043002E0FF2300E015 +:1017F0000023B4EEE68AF1EE10FAE3730BDCB5EEEB +:10180000C08AF1EE10FA08D4BCEEC87A8DED017AE8 +:101810009DF8043002E0FF2300E00023B4EEE68AE6 +:10182000F1EE10FAA3740BDCB5EEC08AF1EE10FAFB +:1018300008D4BCEEC88A8DED018A9DF8043002E020 +:10184000FF2300E0002337EE800A6375B4EEE60A5A +:10185000F1EE10FA0BDCB5EEC00AF1EE10FA08D486 +:10186000FCEEC07ACDED017A9DF8043002E0FF2352 +:1018700000E00023B4EEE60AF1EE10FAA3760BDCEA +:10188000B5EEC00AF1EE10FA08D4FCEEC07ACDED48 +:10189000017A9DF8043002E0FF2300E00023B4EE5B +:1018A000E60AF1EE10FA63770BDCB5EEC00AF1EE52 +:1018B00010FA08D4BCEEC00A8DED010A9DF8043080 +:1018C00002E0FF2300E0002384F8203029E0F1EE5D +:1018D00010FA7FF7D2AEB0EE670AB0EE478AD6E6CE +:1018E000B5EEC08AF1EE10FA10DB28EE088AB3EEEE +:1018F000040AF7EE007ADBE6F1EE10FA06DBB0EE52 +:10190000670A28EE088AFFEE007AD1E6B0EE670A91 +:10191000BDE6B4EEE70AF1EE10FAB0EE678AE4DC59 +:101920009BE603B0BDEC028BF0BD00BF04050020B8 +:10193000186B0020706B0020834D0108994D010841 +:101940007E4D01088D4D010800007F43F8B52DED57 +:10195000028B474F474E3B78474D04465BB947499A +:101960004748F8F7B5FE474930604548F8F7B0FEFC +:10197000012328603B703068F8F710FF2868F0EE0C +:10198000408AF8F70BFFB5EE400AF1EE10FAB0EE20 +:10199000408A11D088EE800A00F072FADFED3A7AC0 +:1019A000B5EEC08AF1EE10FA30EE270A06D5DFED6B +:1019B000377A30EE270A01E09FED350ADFED357A00 +:1019C000DFED356AB2EE027A20EE070AB0EE046A65 +:1019D00080EE270AA01C002268EE087AE8EEA87ABA +:1019E000F1EEE77AF4EEE67AF1EE10FAD4BFFDEE0E +:1019F000E77ADFED2A7AF8EEE77AF0EE476A87EECB +:101A0000866A07EE102AB8EEC77AF1EE005A30EE79 +:101A1000477A0132B0EEC77AB4EEE57AF1EE10FA09 +:101A2000C8BF36EEC77AF0EE675AE7EE465ABDEE0B +:101A3000E57A17EE103AFF2BDABF23EAE371C9B259 +:101A4000FF21FF2B00F8021CDABF23EAE371C9B2C1 +:101A5000FF21FF2BDABF23EAE373DBB2FF23092A5E +:101A600000F8011C00F8033BCBD1BDEC028BF8BDA4 +:101A70008A6B0020486B0020786B0020834D0108A2 +:101A8000994D01087E4D0108DB0FC93FDB0F49402E +:101A900000000000DB0FC94000007F43FF00000092 +:101AA0007FB5FCF7F1FB144B144804A90D221A6012 +:101AB00010230024012541F8083D8DF80C508DF8C5 +:101AC0000E408DF80F40F5F79FFA0D4B00932A4614 +:101AD000322123460B48F4F795FC0B4B0646186061 +:101AE000F3F77AFC642302460093304629462346E6 +:101AF000F4F7B0FC04B070BD1C6B00200004024081 +:101B00000D1B0108246801087C6B002008B5FEF756 +:101B1000D9F820B100210A48F8F78EFE03E0094801 +:101B20000921FCF75DFC084B08481B7810211BB10C +:101B3000BDE80840F5F7ADBABDE80840F5F7ABBA27 +:101B4000211C0108F46A0020686B00200004024098 +:101B500041B100F11B020023037043708370033016 +:101B60009042F8D17047000070B5254A09B10023B2 +:101B70001360D2ED007A224B224C234DB7EE007A4F +:101B8000F4EEC77AF1EE10FA49BF9FED207A83EDAB +:101B9000007A77EE877AC3ED007A237803EB43016E +:101BA0006A186E5C5578917800F11B0206704570DA +:101BB000817003309042F9D1154D1648297802788A +:101BC0000131C9B20132D2B204292970027009D997 +:101BD000002101332970032193FBF1F101EB410155 +:101BE0005B1A23700C2A09D90B4A0023037013785F +:101BF000B3FA83F35B091370084A137070BD00BF1A +:101C0000EC6A0020896B002090680108CDCC4C3D27 +:101C1000406B00204C6B0020696B0020686B00203B +:101C200008B50C4A0C4B12681B68934201D90B484B +:101C30000BE00B4A0B48116813600B4AC91A52F8A3 +:101C4000232018BF0121904706480921BDE808401C +:101C5000FCF7C6BB1C6B002050050020F46A002076 +:101C6000806B0020206B00201805002010B500F1CB +:101C70001401024600238A4204D012F8014B234487 +:101C8000DBB2F8E7037500211522BDE81040FCF730 +:101C9000FBBE0000F0B54B4D2C7887B0002C58D11E +:101CA0004948FCF7EDF84848FCF798FEFCF7A8FE19 +:101CB000002836D0454E214630461522FCF7CCFE92 +:101CC000334670B33168424A91422AD13279012AAF +:101CD00018D1307D214622465C5C01312244142912 +:101CE000D2B2F9D190423B4C3B4805D13B4901224D +:101CF000F8F70CFF012303E03949F8F707FF002349 +:101D000023700EE00AD8F07B214622465C5C01314C +:101D100022440F29D2B2F9D190421FD000222D4B7C +:101D20001A702C4B1A781C468AB92E4B274A03F19D +:101D3000140153F8040B42F8040B8B42F9D11B78C1 +:101D400013702848FFF792FF28B101232370012365 +:101D50002B70002033E04FF0FF3030E0214B6C4619 +:101D600003F110076A4618685968264603C6083307 +:101D7000BB423446F7D1186830601B7933711A4B77 +:101D80001968CDF805105968CDF809101989ADF812 +:101D90000D10053B04AE144603CCB44218605960E4 +:101DA000224603F10803F6D12068186022791A71DF +:101DB0000648FFF75BFF0028B3D00122AFE707B06A +:101DC000F0BD00BFA76B0020E8010020A86B002039 +:101DD00030784243A66B0020B5870008BD68010833 +:101DE000DD68010854050020AD6B0020FCF720BE23 +:101DF000034B1B7813B1034B587970475020704741 +:101E0000A66B0020A86B0020024B187808B1024B8B +:101E100098797047A66B0020A86B0020064B1B78B2 +:101E20002BB1064BD97B1B690020184370474FF03C +:101E3000E730E721704700BFA66B0020A86B0020A9 +:101E4000054B1B781BB1054BD3F8073000E000238E +:101E500000EE103A704700BFA66B0020A86B002070 +:101E6000054B1B781BB1054BD3F80B3000E000236A +:101E700000EE103A704700BFA66B0020A86B002050 +:101E800038B510EE105A25F00044B4F1A14FF0EE31 +:101E9000407A0BDBB4F1FF4F58DCDFED547A9FED55 +:101EA000540A002DC8BFB0EE670A38BD514B9C42A2 +:101EB0005DDCB4F1445F4CDB4FF0FF3367EEA75AB3 +:101EC0009FED4D1A9FED4D2A9FED4D3ADFED4D1AD6 +:101ED000DFED4D2A9FED4D4ADFED4D3A9FED4D5A16 +:101EE000DFED4D4A9FED4D6ADFED4D6A25EEA57A97 +:101EF0005A1CA7EE012AE7EE212AA2EE073AE2EEEB +:101F0000873AA3EE074AE3EE874AA4EE075AE4EEC7 +:101F1000876AA5EE076A26EE877A66EE256A3ED0C6 +:101F2000404A41499B001A4476EE876A92ED007A56 +:101F300096EEA77A0B44002D93ED000A77EE677AB0 +:101F400070EE677A28DBB0EE670A38BD30EE000A23 +:101F500038BD9FED367A30EE077AF7EE006AB4EEC0 +:101F6000E67AF1EE10FAA7DDB0EE670A38BD00F0B0 +:101F70009FF82F4B9C4219DCA3F5D0039C422ADC2E +:101F8000F0EE007ABFEE007AA0EE277A002370EE22 +:101F9000277AC7EE277A91E7B1EE670A38BD76EE69 +:101FA000876AB0EE670AA6EEE70A38BD214B9C426D +:101FB0000BDCF7EE087AB7EE007AA0EE277A022360 +:101FC00070EE677AC7EE877A78E7FFEE007AC7EEA1 +:101FD000807A032372E7F7EE007A30EE677A70EECC +:101FE000277A0123C7EE277A68E700BFDB0FC93FD6 +:101FF000DB0FC9BFFFFFDF3ED769853C59DA4B3D98 +:10200000356B883D21A215BD6BF16EBD6E2EBA3DBC +:1020100095879DBD2549123E388EE3BDABAAAA3EE9 +:10202000CDCC4CBEFC6801080C690108CAF24971AC +:10203000FFFF973FFFFF1B4000B510EE103A1A4A12 +:1020400023F00043934283B019DDB3F1FF4F04DB6B +:1020500030EE400A03B05DF804FB684600F048FF2C +:1020600000F0030001289DED000ADDED010A12D009 +:1020700002280BD0A0B1012001F048FCEAE7DFED17 +:102080000B0A01F0CFF803B05DF804FB01F0CAF8C9 +:10209000B1EE400ADEE701F039FCB1EE400AD9E7C3 +:1020A00001F0C0F8D6E700BFD80F493F000000009C +:1020B00010EE103A23F0004300EE103A704700BFD4 +:1020C00000B510EE103A1B4A23F00043934283B050 +:1020D0001ADDB3F1FF4F04DB30EE400A03B05DF8C8 +:1020E00004FB684600F004FF00F0030001289DEDAA +:1020F000000ADDED010A15D002280DD0A8B101F0CB +:1021000091F8B1EE400AE9E7DFED0B0A002001F09B +:10211000FDFB03B05DF804FB012001F0F7FBB1EE1D +:10212000400ADBE701F07EF8D8E7012001F0EEFB82 +:10213000D4E700BFD80F493F0000000000B510EE03 +:10214000103A134A23F00043934283B018DDB3F1F1 +:10215000FF4F04DB30EE400A03B05DF804FB684635 +:1021600000F0C6FE00F001004000C0F101009DED4E +:10217000000ADDED010A01F011FC03B05DF804FB7B +:10218000DFED040A012001F009FC03B05DF804FB57 +:10219000DA0F493F0000000010B52DED028B2A4CEC +:1021A0008AB0F0EE408A00F0F9F994F9003001337A +:1021B000B0EE408A04D0B0EE680A01F0C5FD28B93F +:1021C000B0EE480A0AB0BDEC028B10BDB0EE680A52 +:1021D000FFF76EFFF7EE007AB4EEE70AF1EE10FAC1 +:1021E000EEDD0123194A009318EE900A00230192B4 +:1021F0000893F2F72DF902460B461548CDE9042362 +:10220000CDE9022301F0B4FC94F90030022B8DEDEE +:10221000060B0FD0684601F0A9FC58B1089B73B9B2 +:10222000DDE90601F2F702FC00EE100A0AB0BDEC8F +:10223000028B10BD01F01EFE21230360EEE701F0CA +:1022400019FE089B0360EBE7690500201C69010883 +:102250002869010800F09EBAF0B52DED048BA74C5B +:102260008BB0B0EE409AF0EE608A00F049FB94F932 +:1022700000300133B0EE408A04D0B0EE680A01F0BD +:1022800063FD28B9B0EE480A0BB0BDEC048BF0BD7D +:10229000B0EE490A01F058FD002835D1F5EE408A2C +:1022A000F1EE10FAEED1964B0890012219EE100AC9 +:1022B0008DE80C00F2F7CCF8CDE9020118EE900A97 +:1022C000F2F7C6F894F900308E4F00265A1CCDE97B +:1022D0000401CDE906670DD0022B0BD0684601F052 +:1022E00045FC002800F0A480089B1BB101F0C2FD52 +:1022F000089B0360DDE90601F2F798FB00EE100A87 +:102300000BB0BDEC048BF0BDB5EE409AF1EE10FAC7 +:1023100023D1F5EE408AF1EE10FA5CD10123784A20 +:10232000009319EE100A002308930192F2F790F837 +:10233000CDE9020118EE900AF2F78AF894F900301C +:1023400000260027CDE90401CDE90667002BC5D0A2 +:102350006C4B0022CDE90623CCE7B0EE480A01F031 +:10236000A1FC0546002868D0B5EE408AF1EE10FACF +:1023700088D1B0EE490A01F095FC002882D0B0EE79 +:10238000680A01F08FFC00283FF47CAF04235C4A0C +:10239000009319EE100A002308930192F2F758F8FF +:1023A000CDE9020118EE900AF2F752F894F90030E4 +:1023B00000260027022BCDE90401CDE9066700F0D5 +:1023C0009880684601F0D2FB002800F09280089BBC +:1023D000002B8FD08AE7B0EE680A01F063FC00287A +:1023E0003FF450AFF5EEC08AF1EE10FA7FF54AAF38 +:1023F0000123434A009319EE100A00230893019227 +:10240000F2F726F8CDE9020118EE900AF2F720F86B +:102410002378CDE90401002B43D03B490020022B57 +:10242000CDE9060137D101F025FD21230360CEE778 +:1024300001F020FD2123036056E7B0EE490A01F0C8 +:1024400031FC002890D0B0EE680A01F02BFC002887 +:102450008AD0B0EE480A01F077FC38BB284B0890D0 +:10246000012219EE100A8DE80C00F1F7F1FFCDE919 +:10247000020118EE900AF1F7EBFF2478CDE9040190 +:102480007CB10020002102460B46F2F75FF9022CD6 +:10249000CDE90601C7D0684601F068FB002896D157 +:1024A000C1E700220023CDE90623F4E7144B089589 +:1024B000032219EE100A8DE80C00F1F7C9FFCDE9EF +:1024C000020118EE900AF1F7C3FF94F90030CDE94C +:1024D0000401EBB90D4BB5EEC09A4FF06042F1EE3E +:1024E00010FACDE9062337D494F90030022B7FF49B +:1024F00068AF01F0BFFC2223036068E76905002094 +:10250000246901080000F03F0000F0FFFFFFEF47E3 +:102510001F4BB5EEC09A0022F1EE10FACDE906236A +:10252000E2D5F6EE007A68EEA77A17EE900AF1F798 +:102530008FFF06460F4647EC106B01F021FB30463B +:10254000394653EC102BF2F73FFA0028CCD1114B4F +:102550000022CDE90623C7E7F6EE007A68EEA77AF7 +:1025600017EE900AF1F774FF06460F4647EC106B22 +:1025700001F006FB3046394653EC102BF2F724FAF3 +:102580000028B1D1044B4FF06042CDE90623ABE700 +:102590000000F07F0000F0FFFFFFEFC738B510EE3E +:1025A000105A25F00044B4F17E5F2DED048B00F04D +:1025B000918079DCB4F17C5F0EDAB4F1485F80F28F +:1025C0009680DFED647A70EE277AB7EE007AF4EE4B +:1025D000C77AF1EE10FA6BDCFFF76AFDF7EE008ABE +:1025E00038EEC00AF6EE007A20EE278A9FED5A3ABE +:1025F0009FED5A4ADFED5A3A9FED5A5ADFED5A4A9B +:102600009FED5A6ADFED5A5ADFED5A6A9FED5A7A0A +:10261000DFED5A7AA8EE034AE8EE234AA4EE085A00 +:10262000E4EE885AA5EE086AA5EE887AE6EE086A16 +:10263000E7EE088AE6EE887AB0EE480AB0EE689ACD +:1026400067EE888A00F09CFD4D4B9C4233DC10EE17 +:10265000103A23F47F6323F00F0307EE903AB1EEB4 +:10266000676AA6EE278A70EE277AC8EE898A88EE16 +:10267000278A9FED447ADFED447AF0EE006AA8EEF7 +:10268000667A30EE000AF0EE675AE6EE265A90EED1 +:10269000287A37EE650A37EEC00ABDEC048B002DB0 +:1026A000D8BFB1EE400A38BD30EE400A80EE000AD5 +:1026B000BDEC048B38BDC8EE898A9FED347ADFED1E +:1026C000347AA0EE280AF0EE006AA0EE267A37EE01 +:1026D000C70AE2E7DFED2B7A9FED2D7A60EE277ACD +:1026E000BDEC048BE0EE077AB0EE670A38BD60EE11 +:1026F000007ADFED192ADFED193ADFED1A4A9FED76 +:10270000183A9FED194ADFED196A9FED195ADFED6E +:10271000195A9FED196A9FED197AE7EEA23ABDECBE +:10272000048BE3EEA74AA7EE834AE4EEA76AA4EE81 +:10273000275AE6EEA75AA5EE276AA5EEA77AF7EE86 +:10274000006AE6EE276A67EE277AC7EEA67AA0EE61 +:10275000270A38BDCAF2497108EF1138047F4F3A91 +:102760002EC69D3D461124BD613330BFA80A4E3EA2 +:102770002D57014090B0A6BE39D119C0ABAA2A3E50 +:102780009999793F2EBD3BB3DB0F493F2EBD3B33BB +:10279000DB0FC93F10B582B0CDED010A019B23F0DC +:1027A0000042B2F1FF4FF0EE407A19DC10EE100A51 +:1027B00020F00041B1F1FF4F12DCB3F17E5F49D050 +:1027C0009C1704F0020444EAD07479B9022C3ED07C +:1027D0009FED400A032C18BFB0EE670A02B010BD8F +:1027E0009DED017A37EE270A02B010BD12B3B2F1A7 +:1027F000FF4F34D0B1F1FF4F1CD08A1AD2153C2ABA +:1028000022DC002B4BDB9DED017A87EE870AFFF778 +:102810004FFCFFF735FB012C3AD0022C2FD0002CB7 +:10282000E2D09FED2D7ADFED2D7A30EE070A30EE03 +:10283000670AD9E7DFED2A7A9FED2A0A0028A8BFA8 +:10284000B0EE670A02B010BD9FED250AE3E79FEDE9 +:10285000230AC9E702B0BDE81040FFF711BBB1F190 +:10286000FF4F21D0022CF2D0032C2AD0DFED1E7AAC +:102870009FED1E0A012C08BFB0EE670AB4E79FED7A +:10288000167ADFED167A30EE070A37EEC00AABE7AC +:1028900010EE103A03F1004300EE103AA4E73C3288 +:1028A000B1DA9FED120AB6E7022C10D0032C0BD040 +:1028B000DFED0F7A9FED0F0A012C08BFB0EE670A1B +:1028C00092E79FED040A8FE79FED0B0A8CE79FEDDF +:1028D0000B0A89E7DB0F49C02EBDBB33DB0F494034 +:1028E000DB0FC93FDB0FC9BF000000800000000004 +:1028F000DB0F49BFDB0F493FE4CB16C0E4CB1640EA +:102900002DE9F0432DED028B10EE905A83B035F097 +:10291000004610EE904A8DED010A14D0DDF80480D7 +:1029200028F00047B7F1FF4F07DD574803B0BDEC73 +:10293000028BBDE8F04301F023BAB6F1FF4F09DD89 +:10294000B7F17E5FF1D1B7EE000A03B0BDEC028BA8 +:10295000BDE8F083B8F1000F52DB4FF00009B6F18B +:10296000FF4F44D0B6F17E5F5DD0B4F1804F69D0A7 +:10297000B4F17C5F9DED010A1BD0FFF799FBB7F125 +:10298000FF4F2AD04FB3B7F17E5F26D04FEAD873FE +:10299000013B59EA03026FD0B6F19A4F7CDD3B4A06 +:1029A000974200F3DB81002CC0F2DE819FED380AF4 +:1029B000CBE7B8F1000F4ADAFFF77AFBB7F1FF4F28 +:1029C00001D0002FDFD1A7F17E5759EA07034CD180 +:1029D00030EE400A80EE000AB7E7002CBCBFF7EEED +:1029E000007A87EE800AB8F1000FAEDAEBE7B7F1B4 +:1029F0007E5FA8D01FDD002CD8DB00EE105AA4E7C4 +:102A0000B6F1974F14DAB6F17E5F09DBF315C3F127 +:102A1000960346FA03F202FA03F3B34200F09481FC +:102A20004FF000099EE7002C18DB9DED010A8CE7B2 +:102A30004FF0020993E7002CB8DA07EE905AB1EE96 +:102A4000670A82E7DDED017A27EEA70A7DE703B08A +:102A5000BDEC028BBDE8F04300F092BBDDED017AE6 +:102A6000B7EE000A80EE270A6FE7B9F1010F7FF495 +:102A70006CAFB1EE400A68E7DDED017A37EEE70AA8 +:102A800080EE000A61E700BF28690108F7FF7F3F79 +:102A9000000000000000804BB7F5000F80F25C8161 +:102AA0005FED047A60EE277A6FF0170117EE907AE7 +:102AB000F048FA15C7F316077F3A8742114447F0EA +:102AC0007E5240F34681EC48874240F39B810026CA +:102AD0000131A2F500023046DFF80CC49FEDE72A71 +:102AE0009FEDE78A9FEDE70ADFEDE70A9FEDE71A22 +:102AF000DFEDE71AE74FDFEDE87ADFEDE82A9FED3B +:102B0000E84ADFF8E8E38000844407EE102ADCEDB1 +:102B1000006A77EE265AB7EE006AC6EE255A5210C2 +:102B200042F0005202F58022324437EE666A04EE2B +:102B3000902A26EE253A74EEE66A23EE035A37EE23 +:102B4000667AF0EE426AE5EE086A3A18704413EECF +:102B5000106A26F47F66A6EE850A26F00F0603EEBD +:102B6000906AB1EE632AA2EE246AE0EE050AA2EEB4 +:102B7000076AA0EE851A66EE255AE1EE051A33EED5 +:102B8000237A25EE055A27EE257AF0EE084AB0EEB4 +:102B9000646AA5EE217AA3EEA36AD2ED001A90ED45 +:102BA000005A36EE076A06EE901A16EE102A22F444 +:102BB0007F6222F00F0206EE102A76EE644AF8EEEB +:102BC000E66AE2EE234A37EE647A27EE037AA5EE50 +:102BD000867AF0EE475AE3EE865A15EE902A22F4F2 +:102BE0007F6222F00F0204EE902AE2EE064A05EE22 +:102BF000902A37EE647A67EE277AE5EEA27A77EECE +:102C0000A17AB0EE677AA5EE847A37EE057A37EED0 +:102C1000267A17EE102A22F47F6222F00F0207EEC6 +:102C2000102A77EE666A36EEC57AA5EEC47A77EE9C +:102C3000C77A24F47F6424F00F0407EE105A06EEDE +:102C4000904A67EE277A77EE666A06EE104A07EE3C +:102C5000102A27EE067A06EE102AE6EE867A09F1A9 +:102C6000FF3959EA0303B7EE000A77EE876ABFEE31 +:102C7000006A16EE903A0CBFB0EE468AB0EE408A7B +:102C8000002B23F0004240F3AA80B2F1864F7BDC98 +:102C90006FD0B2F17C5F7EDC0022104623F47F63AC +:102CA00023F00F0306EE103ADFED7E6A9FED7E2AD9 +:102CB000DFED7E3ADFED7E2A9FED7E4ADFED7E4A34 +:102CC0009FED7E5ADFED7E5A36EE477AB0EE003A3F +:102CD00077EEC77A26EE267AB7EE000AA7EE827A5A +:102CE000F0EE476AE6EE236AF0EE477A26EEA67A21 +:102CF000B0EE662AA7EE224AA6EE632AE4EE074A61 +:102D0000B0EE666AA4EE875A77EEC27AE5EE075A0D +:102D1000E6EEA77AA5EEC76A26EE867A36EE436A15 +:102D200087EE067A77EE677A77EEE67A30EE670A14 +:102D300010EE103A1344B3F5000FC0F2988000EE85 +:102D4000103A28EE000A00E602F00102C2F1020980 +:102D500008E600263046BFE60021A9E6594A974218 +:102D600054DD002C7FF722AE9FED570A20EE000ABB +:102D7000EBE59FED566A76EEC76A37EE866AB4EEEB +:102D8000E66AF1EE10FA06DDDFED4F7A28EE270A4B +:102D900020EE270AD9E5D2154FF400017E3A41FA18 +:102DA00002F21A44C2F3C751494CA1F17F052C41EC +:102DB000C2F3160022EA040206EE902AC1F196013F +:102DC00040F4000037EE667A084180EAE37077EE5F +:102DD000876A00EBD370C20516EE903A5EE73D4974 +:102DE0008A4208DC7FF455AF76EEC76AF4EEE67AE5 +:102DF000F1EE10FACFD8DFED387A28EE270A20EE70 +:102E0000270AA2E54FF40016012065E6F7EE007AE6 +:102E100030EE670ADFED1C6ADFED307A9FED305A45 +:102E20009FED306AF1EE405AB5EE007AE5EE876A22 +:102E3000B6EE007AA6EEC07AF0EE476A20EE007A8F +:102E400027EE267A67EEC77AE0EE057AB0EE677A6B +:102E5000A0EE067A17EE102A22F47F6222F00F020B +:102E600007EE102AA5EE867A77EEC77AE1E600F043 +:102E70008DFF66E771C41C00D6B35D0055326C3E11 +:102E800042F1533E05A38B3EABAAAA3EB76DDB3E93 +:102E90009A99193F346901084F38763FA0C39D368F +:102EA0000038763F8CBEBF351872313F0072313F1B +:102EB0004CBB31330EEADDB555B38A38610B36BBF6 +:102EC000ABAA2A3E0700803FCAF249713CAA3833B8 +:102ED000FFFF7F00000016436042A20D3BAAB83FEF +:102EE00070A5EC3600AAB83F3C6901082C690108BE +:102EF00070B510EE103A944A23F00044944286B024 +:102F000010EE106A054666DD904A94421ADC002BEA +:102F1000DFED8F7A8F4A24F00F0440F3DD80944276 +:102F200070EE677A66D09FED8C7A77EEC76A0120E3 +:102F300077EEE67AC5ED006A77EEC77AC5ED017ADD +:102F400006B070BD854A944266DDB4F1FF4F49DAA0 +:102F5000E215863AA4EBC25307EE103AFDEEC76ABB +:102F6000DFED7F7AF8EEE66A37EE667ACDED036A3A +:102F700027EE277AFDEEC76AF8EEE66A37EE667A44 +:102F8000CDED046A67EE277AF5EE407AF1EE10FA9D +:102F9000CDED057A40F0B380F5EE406AF1EE10FA1F +:102FA00014BF022301236F4902208DE8030003A808 +:102FB000294600F0B9F9002E12DA95ED007AD5ED28 +:102FC000017AB1EE477AF1EE677A404285ED007AF8 +:102FD000C5ED017A04E0002285ED000A4260002080 +:102FE00006B070BD70EE407A0020C5ED017AC5EDE7 +:102FF000007AF5E7DFED5C6A9FED5C7A77EEE67AC2 +:10300000012077EEC76A77EEE67AC5ED006A77EEC3 +:10301000C77AC5ED017AE3E7FFF74AF8DFED546AB6 +:10302000DFED4B5A9FED4C7AF6EE007AE0EE267A11 +:10303000FDEEE77A17EE900AF8EEE76A1F28B1EE88 +:10304000666AA6EE250A66EE877A1DDC494A411EAD +:1030500024F0FF0352F82120934215D030EE677A16 +:1030600085ED007A30EE470A002E30EE670A85EDD6 +:10307000010AB5DAB1EE477AB1EE400A85ED007A81 +:1030800085ED010A4042ABE730EE677AE41517EEB2 +:10309000103AC3F3C753E31A082BE1DDDFED327AB0 +:1030A0009FED327AF0EE405AE6EE275A30EE650A8E +:1030B000A6EE270AF0EE407AD6EE877A35EEE77A6A +:1030C00017EE103AC3F3C753E41A192C2CDC85ED24 +:1030D000007AB0EE650AC5E7944270EE277A10D008 +:1030E0009FED1D7A77EE876A4FF0FF3077EEE67A34 +:1030F000C5ED006A77EE877AC5ED017A70E70323A4 +:1031000051E7DFED196A9FED197A77EEA67A4FF055 +:10311000FF3077EE876A77EEE67AC5ED006A77EEE4 +:10312000877AC5ED017A5BE79FED137A9FED135A1D +:10313000B0EE650AA6EE070A75EEC07AE6EE077AEB +:10314000D6EE857A8AE700BFD80F493FE3CB164019 +:10315000800FC93FD00FC93F43443537800F4943E3 +:1031600000008043C46901080044353708A3852E58 +:1031700084F9223F4469010800A3852E32318D2451 +:1031800010EE103A23F00042B2F1FF4F70B430D28B +:103190006AB3002B3DDBB2F5000F4FEAE3512CD3AD +:1031A000A1F17F02C3F31603D10743F4000348BF24 +:1031B0005B00002456105B00254619214FF08072F9 +:1031C000A818984202DC1B1A8518144401394FEAEA +:1031D00043034FEA5202F3D113B104F001031C443C +:1031E000641004F17C5404EBC65300EE103A70BC3A +:1031F0007047A0EE000A70BC704713F400020DD1B6 +:103200005B00180202F10102FAD5C2F10102114479 +:10321000C6E730EE400A80EE000AE8E701221144DA +:10322000BEE700BF10EE103A23F00043B3F1485F51 +:103230002CDAFDEEC07A17EE903A002B60D020EE2B +:10324000007ADFED314A9FED315ADFED315A9FEDC3 +:10325000316ADFED317ADFED316AA7EE245AE5EE0F +:10326000075AA5EE876AE6EE077AE7EE876A66EE0A +:10327000876A60EEC00AB6EE006AE7EE260AF7EE4D +:10328000007AD7EE060A37EEE00A704720EE007AA1 +:10329000DFED1D4A9FED1D5ADFED1D5A9FED1D6AA2 +:1032A000DFED1D7ADFED1D6A1D4AA7EE245A934219 +:1032B000E5EE075AA5EE876AE6EE077AE7EE876A3B +:1032C00066EE876AD5DD174A934214DC03F17F432B +:1032D00007EE903AB7EE006A36EE676A60EEC00A13 +:1032E000F6EE005AE7EE260AD7EE257A77EEE07A78 +:1032F00036EE670A7047B6EE076AF5EE027AEDE73A +:10330000B7EE000A704700BF4ED747ADF6740F31D5 +:103310007CF293B4010DD037610BB6BAABAA2A3D4B +:103320009999993E0000483F2DE9F04F2DED048B0F +:10333000D7B05F1ED74C649D0293D31E48BF131DA8 +:1033400054F825600191DB1023EAE3736FEA030B65 +:10335000B9190393824602EBCB0BA3EB070314D4FA +:103360001944659801311AAA002BAABF50F82340CE +:10337000DFEDCC7A07EE904A03F10103A8BFF8EE27 +:10338000E77A8B42E2EC017AEED1002E1ADB029B47 +:103390001AA9741C01EB840442A89D00002FC0F2FE +:1033A000BA81DFEDC07A52464B1933ED017AF2EC67 +:1033B000016A9942E6EE877AF7D10431A142E0EC46 +:1033C000017AEBD1029ADFEDB48A9FEDB48A06F15F +:1033D0008043013B9B00C2EB827906AA03F10408FB +:1033E0001344904404934FEA89093446A50056AB30 +:1033F0002B44002C13ED140A18DD42A94B1905AA21 +:1034000060EE287AB0EE407AFDEEE77A73ED016A5D +:10341000F8EEE77A8B42A7EEC87A37EEA60ABDEE41 +:10342000C77A17EE100A42F8040FE9D1584600F0A7 +:10343000ADFCB0EE409AB4EE000A29EE000A00F0AE +:103440003BFCF2EE007AA0EE679ABBF1000FFDEEB6 +:10345000C99AF8EEE97A39EE679A40F34181601E25 +:1034600006AACBF1080352F8201041FA03F202FA3F +:1034700003F30DF1180EC91A4EF8201019EE900A38 +:103480001044CBF1070309EE900A1941002939DDF8 +:1034900019EE903A002C03F1010309EE903A40F343 +:1034A000CB81002210460DF1140E08E0C3F5807C9C +:1034B00013B1CEF800C00120013294420CDD5EF859 +:1034C000043F0028F2D00132C3F1FF039442CEF84A +:1034D00000304FF00100F2DCBBF1000F10DDBBF15A +:1034E000010F00F00481BBF1020F09D1621E06AB8F +:1034F0000DF1180E53F8223003F03F034EF822303E +:10350000022959D0B5EE409AF1EE10FA66D1631E49 +:103510009E420BDC06AA1544002255F8040D4545D1 +:1035200042EA0002F9D1002A40F07081731E06AA17 +:1035300052F82330002B40F07C81049B4FF0010EA9 +:1035400053F8042D0EF1010E002AF9D0A644631C95 +:1035500073452FDC039A9D18029A05F18045A01847 +:103560000EEB020C659A013D02EB85051AAA02EBEF +:10357000800002EB8C0C42AA02EB830455F8043F56 +:1035800007EE903AF8EEE77A002FE0EC017ADFEDF3 +:10359000457A0BDB524600EB0901034633ED017A15 +:1035A000F2EC016A8B42E6EE877AF7D16045E4ECF3 +:1035B000017AE3D1744619E7B7EE000A30EE499A72 +:1035C00000289FD05846059100F0E0FB39EE409A64 +:1035D0000599B5EE409AF1EE10FA98D0B0EE490A8E +:1035E000CBF10000029100F0D1FB9FED2C7A029903 +:1035F000B4EEC70AF1EE10FAC0F27E81DFED267A52 +:1036000060EE277A06A8FDEEE77A631CF8EEE77A0B +:103610000BF1080BA7EEC70AFDEEE77ABDEEC00A74 +:1036200010EE102A40F8242017EE902A40F82320AC +:103630005846B7EE000A0393029100F0A7FB039BE4 +:103640000299002BC0F2C78003F1010E4FEA8E02EF +:1036500042AC06A89FED107A1044A71870ED017ACD +:10366000F8EEE77A67EE807A20EE070A67ED017AD6 +:10367000A742F3D1043A17440025002EC0F2A880D7 +:10368000002DC0F2A580064CDFED067A38460022F8 +:103690000CE000BFDC6C01080000803B00008043B0 +:1036A000E86C010800000000AA4208DCF4EC016AA2 +:1036B000B0EC017A01329642E6EE877AF4DA56AA45 +:1036C00002EB850201357545A7F1040742ED287A22 +:1036D000D3D1649A032A5FD8DFE802F0673737B0A6 +:1036E00010D1631E06AA52F823100912CEE6621EFC +:1036F00006AB0DF1180E53F8223003F07F034EF89D +:103700002230FDE6F6EE007AB4EEE79AF1EE10FA1A +:103710000ADA0021F6E65FED1D7A0431A142E0EC01 +:10372000017A7FF43BAE4DE619EE903A002C03F19E +:10373000010309EE903AC8BF02213FF7B2AEF7EE9F +:10374000007A37EEC99A0221DCE62EAA5FED2B7AC9 +:1037500002EB8E0E3EED017A964577EE877AF9D12F +:10376000002943D0DDED2E6A019AB1EE677A002B75 +:1037700076EEE77A82ED007A09DD2FA80122B0EC1F +:10378000017A0132934277EE877AF8DA09B1F1EEE5 +:10379000677A019BC3ED017A19EE903A03F00700B6 +:1037A00057B0BDEC048BBDE8F08F2EAA5FED437AD5 +:1037B00002EB8E0E3EED017A013B5A1C77EE877AC2 +:1037C000F8D109B1F1EE677A019BC3ED007AE3E726 +:1037D0005FED4C7A73E7649A032ADDD8DFE802F0E4 +:1037E000130202805FED517A0029BBD19DED2E7A44 +:1037F000019A002BC2ED007A77EE677ABDDC019B5F +:10380000C3ED017AC8E75FED597ADAE706AAABF1B2 +:10381000080B52F82320002A7FF40AAF06AA02EB15 +:10382000830252F8040D013BABF1080B0028F8D0DD +:10383000FEE64FF0010E89E600204DE6002B4FDD3D +:103840009A0056A810442EAD141D10ED287A2C4471 +:10385000A81870ED017A77EE276AA84277EEE67A2B +:1038600077EE277AB0EE667A64ED017AC0ED006AF1 +:10387000EFD1012B34DD131D56AC1444034414ED79 +:10388000287A02442FAC184672ED017A77EE876AE7 +:10389000A24277EEE67A77EE877AB0EE667A60ED4E +:1038A000017AC2ED006AEFD15FED827A30AA33ED82 +:1038B000017A934277EE877AF9D1A9B1DDED2E6ACC +:1038C0009DED2F7A019AF1EE677AF1EE666AB1EE1C +:1038D000477AC2ED027AC2ED006A82ED017A5BE7B7 +:1038E0005FED907A0029E9D101982E9A2F9BC0EDC7 +:1038F000027A026043604FE7BDEEC00A06A810EEF0 +:10390000102A234640F8242092E600BF10EE103A19 +:1039100023F00043B3F1485F04DAFDEEC07A17EEFE +:10392000903A23B360EE007A9FED155ADFED155AF9 +:103930009FED156ADFED156A9FED157AE7EE855A62 +:1039400027EE805AA5EEA76AE6EE276AA6EEA77ACA +:1039500070B127EE457AF6EE006AA0EEA67ADFEDAA +:103960000D6AD7EE270AE5EE260A30EE600A7047A8 +:10397000DFED096AE7EE876AA6EE850A704700BFA9 +:10398000D3C92E2F342FD7B21BEF3836010D50B9C3 +:103990008988083CABAA2A3EABAA2ABE08B510EE1D +:1039A000103A23F00042B2F1465F2DED028BB0EEEB +:1039B000407A12DAFDEEC07A17EE901A19BB431C5A +:1039C000134300F0AA80012800F08480BDEC028B34 +:1039D000BFEE000A80EE070A08BD53498A4212DD95 +:1039E000002BB8BFB1EE407ADFED507A9FED500A60 +:1039F000B8BFF1EE600A77EEE07A30EE477ADFED9D +:103A00004D0A37EE277A67EE076A9FED4B8A9FEDE6 +:103A10004B2ADFED4B8ADFED4B1A9FED4B3ADFED82 +:103A20004B2A9FED4B4ADFED4B3A9FED4B5ADFEDB2 +:103A30004B4A9FED4B6ADFED4B5A9FED4B0A3A49DB +:103A400066EEA67A26EE871AA7EE882A8A42E7EE65 +:103A5000A81AA2EE273AE1EEA72AA3EE274AE2EE41 +:103A6000A73AA4EE275AE3EEA74AA5EE276AE4EEAA +:103A7000A75AF0EE467AE5EEA67AB0EE606AA7EEB7 +:103A8000816AE6EE260AE1EE000A37EE200A24DC1F +:103A900001281FD0FFEE006AC6EE806A10EE103AD1 +:103AA00016EE902A23F47F6322F47F6223F00F0343 +:103AB00022F00F0200EE102A06EE103AF7EE007A1E +:103AC000E6EE007A36EE477A70EEC70AE0EE807ACC +:103AD000A7EEA60ABDEC028B08BD07EE900AB8EE71 +:103AE000E76A60EE006A70EE067A9B17C6EEA77A68 +:103AF00003F00203C3F10103BDEC028BF0EE005AA8 +:103B000077EEE00A00EE103A37EE607AF8EEC06A1F +:103B1000A7EE656A26EE860A08BDFEF7C9FAB7EE7B +:103B2000007A87EE000AD5E73FA12C3F68212233B7 +:103B3000DA0F493F000000005FAE9BB745F4A338A1 +:103B40008453D9377AC09538C8261A3AB93781399B +:103B500016696B3B48DEBE3AA427B33C1F37113CC5 +:103B60008988083ED10D5D3DABAAAA3E0020704772 +:103B70009FED010B704700BF000000000000F87FC0 +:103B8000F0B551EC100BC1F30A56A6F2FF32132A1E +:103B900083B00B4610EE107A4FEAD17405462FDC45 +:103BA000002A48DB3D4E164106EA010707432CD0A8 +:103BB000760831400D430CD04FF48021132A23EABC +:103BC000060641FA02F343EA06030CBF4FF0004534 +:103BD0000025334A02EBC4042846D4E900450246D6 +:103BE00029462046F0F7D6FACDE9000122462B46B9 +:103BF000DDE90001F0F7CCFA41EC100B03B0F0BDA9 +:103C0000332A06DDB2F5806F3FD041EC100B03B0D4 +:103C1000F0BDA6F213464FF0FF32F2400242F4D05C +:103C200052080242D5D04FF0804127EA020241FA01 +:103C300006F51543CDE721F000420243E5D0C1F37C +:103C4000130217437A421743154A4B0C3F0B5B0490 +:103C500007F4002702EBC40247EA0301D2E9006738 +:103C60000B46024639463046F0F794FACDE900019A +:103C70003B463246DDE90001F0F78AFA21F00043C5 +:103C800043EAC47141EC100BC1E710EE102A0B4659 +:103C9000F0F780FA41EC100BB9E700BFFFFF0F000F +:103CA000186D010810EE103A23F00040B0F1FF4FFC +:103CB000ACBF00200120704710EE102A22F0004116 +:103CC000CB0D7F3B162B17DC002B10EE100A19DBF7 +:103CD0001A491941114222D0DFED197A70EE277A84 +:103CE000F5EEC07AF1EE10FA19DD002A18DB20EAB1 +:103CF000010300EE103A7047B1F1FF4F0FD330EEE1 +:103D0000000A7047DFED0E7A70EE277AF5EEC07A82 +:103D1000F1EE10FA03DD002A08DB9FED0A0A704776 +:103D20004FF4000242FA03F31844E0E70029FFEEE3 +:103D3000007A18BFB0EE670A704700BFFFFF7F0030 +:103D4000CAF249710000000010EE103A33F0004052 +:103D500001D102207047A0F50003B3F1FE4F01D25C +:103D600004207047054B421E9A4201D80320704739 +:103D7000A0F1FF40B0FA80F040097047FEFF7F00DD +:103D80009FED010A704700BF0000C07F08B510EE2C +:103D9000103A33F000422DED028B11D0B2F1FF4FFB +:103DA00011D2B2F5000F13D3D20D0244FE2A2EDC3D +:103DB000002A1ADD23F0FF4343EAC25300EE103A13 +:103DC000BDEC028B08BDBDEC028B30EE000A08BDD5 +:103DD0001D4BDFED1E7A984220EE270A22DB10EE03 +:103DE000103AC3F3C752193ADFE712F1160F1EDA81 +:103DF0004CF2503398420ADC9FED158AF0EE400AEF +:103E0000B0EE480A00F02AF820EE080AD8E79FED45 +:103E1000118AF0EE400AB0EE480A00F01FF820EEDA +:103E2000080ACDE7DFED0A0A20EE200AC8E71932BA +:103E300023F0FF4343EAC253DFED077A00EE103A66 +:103E400020EE270ABCE700BFB03CFFFF0000004C9B +:103E50006042A20DCAF249710000003310EE103A20 +:103E600023F0004210EE903A03F00043134300EEBB +:103E7000103A7047014B1868704700BFD00500200A +:103E800010B5431E0A44914204D011F8014B03F8C7 +:103E9000014FF8E710BD02440346934202D003F8F5 +:103EA000011BFAE77047034611F8012B03F8012BB9 +:103EB000002AF9D17047034613F8012B002AFBD1E1 +:103EC000181A0138704710B5034632B111F8014B8A +:103ED00003F8014B013A002CF7D11A44934203D066 +:103EE000002103F8011BF9E710BD4E6F4E616D65AF +:103EF00000000000000000000000000000000000C2 +:103F000000000000000000004E6F526576000000C7 +:103F1000000001020304050708090A0B70785461C8 +:103F2000736B436F6465006C69622F4672656552FE +:103F3000544F532F7461736B732E63002820282015 +:103F400075785072696F726974792026202820551F +:103F500042617365547970655F7420292028207E42 +:103F6000706F727450524956494C4547455F4249FB +:103F70005420292029203C20282055426173655473 +:103F80007970655F74202920636F6E6669674D41A3 +:103F9000585F5052494F52495449455320290049CE +:103FA000444C45007852657475726E0028206C6927 +:103FB00073744C4953545F49535F454D50545928CD +:103FC00020707844656C617965645461736B4C69E9 +:103FD0007374202920290075785363686564756CB3 +:103FE000657253757370656E6465640070785072A5 +:103FF0006576696F757357616B6554696D650028E7 +:10400000207854696D65496E6372656D656E7420C4 +:104010003E20305520290075785363686564756CBF +:10402000657253757370656E646564203D3D203024 +:10403000006C69737443555252454E545F4C49535A +:10404000545F4C454E47544828202628207078520B +:10405000656164795461736B734C697374735B202D +:104060007578546F705072696F72697479205D2031 +:10407000292029203E20300070784576656E744CEA +:104080006973740075785363686564756C65725301 +:10409000757370656E64656420213D203000707812 +:1040A000556E626C6F636B65645443420075785360 +:1040B00063686564756C657253757370656E64656D +:1040C0006420213D20706446414C53450070785473 +:1040D000696D654F75740070785469636B73546FC4 +:1040E00057616974007078544342203D3D207078D8 +:1040F00043757272656E7454434200707854434243 +:104100002D3E75784D75746578657348656C6400EF +:10411000785461736B546F4E6F74696679006C6983 +:1041200073744C4953545F4954454D5F434F4E544B +:1041300041494E4552282026282070785443422D6C +:104140003E784576656E744C6973744974656D206C +:10415000292029203D3D204E554C4C00707851754A +:10416000657565006C69622F4672656552544F53E0 +:104170002F71756575652E63007578517565756568 +:104180004C656E677468203E202820554261736537 +:10419000547970655F742029203000212820282060 +:1041A00070764974656D546F5175657565203D3D38 +:1041B000204E554C4C20292026262028207078514E +:1041C000756575652D3E75784974656D53697A65B9 +:1041D00020213D2028205542617365547970655F28 +:1041E000742029203055202920290021282028202A +:1041F00078436F7079506F736974696F6E203D3DBD +:104200002071756575654F56455257524954452082 +:1042100029202626202820707851756575652D3E49 +:1042200075784C656E67746820213D203120292007 +:1042300029002128202820785461736B4765745326 +:1042400063686564756C65725374617465282920B0 +:104250003D3D207461736B5343484544554C455272 +:104260005F53555350454E4445442029202626206F +:104270002820785469636B73546F576169742021E7 +:104280003D20302029202900707851756575652DF5 +:104290003E75784974656D53697A65203D3D2030DF +:1042A000002128202820707851756575652D3E7590 +:1042B00078517565756554797065203D3D2071753F +:1042C00065756551554555455F49535F4D55544595 +:1042D000582029202626202820707851756575657C +:1042E0002D3E70784D75746578486F6C64657220EA +:1042F000213D204E554C4C202920290021282028E2 +:10430000207076427566666572203D3D204E554CA4 +:104310004C20292026262028207078517565756547 +:104320002D3E75784974656D53697A6520213D206D +:1043300028205542617365547970655F7420292087 +:1043400030552029202900707851756575652D3EFE +:1043500075784974656D53697A6520213D20300078 +:104360007854696D65725175657565006C69622F69 +:104370004672656552544F532F74696D6572732E82 +:104380006300546D725100546D722053766300289F +:10439000207854696D6572506572696F64496E5416 +:1043A00069636B73203E20302029007854696D6565 +:1043B000720078526573756C7400282070785469A7 +:1043C0006D65722D3E7854696D6572506572696FC6 +:1043D00064496E5469636B73203E203020290028A5 +:1043E000202820282073697A655F7420292070783E +:1043F0004E6577426C6F636B4C696E6B202920268B +:1044000020706F7274425954455F414C49474E4D7C +:10441000454E545F4D41534B2029203D3D203000F7 +:104420006C69622F4672656552544F532F706F72DC +:104430007461626C652F4D656D4D616E672F6865A7 +:1044400061705F342E630028202820282075696E53 +:104450007433325F74202920707652657475726EE1 +:104460002029202620706F7274425954455F414CB8 +:1044700049474E4D454E545F4D41534B2029203DF9 +:104480003D203000282070784C696E6B2D3E7842BC +:104490006C6F636B53697A6520262078426C6F637A +:1044A0006B416C6C6F636174656442697420292090 +:1044B000213D20300070784C696E6B2D3E70784E37 +:1044C00065787446726565426C6F636B203D3D2074 +:1044D0004E554C4C007578437269746963616C4E3B +:1044E000657374696E67203D3D207E30554C006CCD +:1044F00069622F4672656552544F532F706F727404 +:1045000061626C652F4743432F41524D5F434D34E9 +:10451000462F706F72742E630075784372697469E8 +:1045200063616C4E657374696E67203D3D20313068 +:104530003030554C002820706F72744E5649435FDE +:10454000494E545F4354524C5F52454720262070D9 +:104550006F7274564543544143544956455F4D412B +:10456000534B2029203D3D203000757843726974FB +:104570006963616C4E657374696E6700706F727405 +:10458000435055494420213D20706F7274434F526F +:104590005445585F4D375F723070315F4944007049 +:1045A0006F7274435055494420213D20706F7274DE +:1045B000434F525445585F4D375F723070305F49FA +:1045C0004400756343757272656E745072696F72E0 +:1045D000697479203E3D2075634D6178537973434A +:1045E000616C6C5072696F72697479002820706F09 +:1045F000727441495243525F524547202620706FE2 +:1046000072745052494F524954595F47524F555056 +:104610005F4D41534B2029203C3D20756C4D617806 +:1046200050524947524F555056616C7565005B4872 +:10463000617264206661756C742068616E646C657B +:10464000725D0A005230203D2025780A0052312048 +:104650003D2025780A005232203D2025780A00525C +:1046600033203D2025780A00523132203D20257824 +:104670000A004C52203D2025780A005043203D205E +:1046800025780A00505352203D2025780A004246E2 +:104690004152203D2025780A0043465352203D20B8 +:1046A00025780A0048465352203D2025780A0044C8 +:1046B000465352203D2025780A0041465352203D62 +:1046C0002025780A00000000000000000200000021 +:1046D0000004024000020000090000000000000089 +:1046E000020000000400000000080040000000007C +:1046F00004000000FF00000000000000197700081F +:1047000071770008A57600085177000801000000C5 +:10471000010000000000024008000000030000004B +:104720000100000001000000010000000000004046 +:10473000000000000100000014CD00000300000094 +:104740001977000871770008A576000851770008EE +:10475000B8017003BA024B02010000000100000022 +:104760000000024004000000020000000100000000 +:1047700001000000010000000000004000000000F7 +:104780000100000014CD00000300000015770008B0 +:104790006D770008217600084177000800000000CE +:1047A00001000000000002400200000001000000C3 +:1047B00000000000010000000100000000000040B7 +:1047C0000000000001000000FF00000000000000E9 +:1047D0001177000869770008997500082D7700089F +:1047E0006964203C204E42525F4F465F4D4F544F0C +:1047F000525300647269766572732F7372632F6D02 +:104800006F746F72732E63000000000001000000DF +:104810000200000003000000000000000200000091 +:1048200000040240000800000B000000000000002F +:104830000100000001000000000000400000000036 +:1048400001000000FF0000000000000019770008D0 +:1048500071770008A5760008517700080000000075 +:104860000100000000000240008000000F00000076 +:1048700000000000010000000100000000000040F6 +:104880000000000001000000FF0000000000000028 +:104890000D77000865770008297500081D77000866 +:1048A000010000000200000000040240200000009F +:1048B00005000000010000000200000002000000EE +:1048C00000040040000000000200000014CD0000C1 +:1048D0000300000011770008697700089975000847 +:1048E0002D770008010000000200000000040240D3 +:1048F00010000000040000000100000002000000A1 +:10490000020000000004004000000000020000005F +:1049100014CD0000030000000D7700086577000843 +:10492000297500081D770008435254502D54580033 +:10493000435254502D5258007175657565735B7004 +:104940006F727449645D203D3D204E554C4C006DA6 +:104950006F64756C65732F7372632F637274702E3E +:1049600063007175657565735B706F727449645D22 +:1049700000702D3E73697A65203C3D2043525450AF +:104980005F4D41585F444154415F53495A450000CF +:104990004C000020F400002034010020DC00002046 +:1049A000740100205C010020440100201C01002053 +:1049B000C4000020040100206C65647365715469B3 +:1049C0006D6572000A4D616C6C6F63206661696C85 +:1049D0006564210A000A537461636B206F76657207 +:1049E000666C6F77210A0053595354454D004D4F63 +:1049F00044494649454400434C45414E00535953B0 +:104A00003A202D2D2D2D2D2D2D2D2D2D2D2D2D2DD6 +:104A10002D2D2D2D2D2D2D2D2D2D2D2D2D2D0A0016 +:104A20005359533A204372617A79666C6965203232 +:104A30002E3020697320757020616E642072756E4F +:104A40006E696E67210A005359533A204275696CAA +:104A5000642025733A257320282573292025730A9D +:104A6000005359533A204920616D2030782558254C +:104A700058255820616E642049206861766520259C +:104A8000644B42206F6620666C617368210A005394 +:104A900059533A20537461727420666F726365646F +:104AA0002E0A005359533A204672656520686561A5 +:104AB000703A2025642062797465730A0063616E20 +:104AC000666C790073746F705F73797300737973B8 +:104AD00074656D0073656C6674657374506173738F +:104AE00065640073746F705F737974656D00666CD4 +:104AF0006173680069643000696431006964320080 +:104B000073746F705F637075003C463E0A004269C3 +:104B1000746372617A65204372617A79666C696543 +:104B200000504152414D004D454D00000000000035 +:104B3000000050616C74686F6C64007961774D6F30 +:104B400064650079617752737400737461624D6FAC +:104B50006465526F6C6C00737461624D6F64655074 +:104B60006974636800737461624D6F64655961773D +:104B70000073746F705F666C696768746D6F6465ED +:104B800000726F6C6C5F6B7000726F6C6C5F6B6946 +:104B900000726F6C6C5F6B640070697463685F6B4C +:104BA000700070697463685F6B6900706974636832 +:104BB0005F6B64007961775F6B70007961775F6B21 +:104BC00069007961775F6B640073746F705F7069FF +:104BD000645F726174650073746F705F7069645FA5 +:104BE00061747469747564650073746F705F736564 +:104BF0006E736F72667573696F6E360053544142FF +:104C0000494C495A45520061736C416C70686100AF +:104C100061736C416C7068614C6F6E670061736C9E +:104C2000526566006572724465616462616E64001B +:104C3000616C74486F6C644368616E676553656E40 +:104C40007300616C74486F6C644572724D617800DA +:104C5000706964416C7068610070696441736C468E +:104C6000616300764163634465616462616E640000 +:104C70007642696173416C70686100765370656556 +:104C800064416363466163007653706565644153B4 +:104C90004C4465616462616E64007653706565645E +:104CA00041534C466163007653706565644C696D91 +:104CB00069740062617365546872757374006D6124 +:104CC00078546872757374006D696E546872757388 +:104CD000740073746F705F616C74486F6C6400650E +:104CE000727200746172676574007A5370656564EE +:104CF0000076537065656400765370656564415352 +:104D00004C007653706565644163630061736C00A9 +:104D100061736C5261770061736C4C6F6E670074E5 +:104D2000656D700070726573737572650073746F72 +:104D3000705F6261726F0073746F705F7670696428 +:104D4000006D34006D31006D32006D330073746F8F +:104D5000705F6D6F746F72007A0073746F705F6D47 +:104D600061670073746F705F6779726F007A7700A4 +:104D70006D6167320073746F705F61636300726F9F +:104D80006C6C007069746368007961770074687294 +:104D90007573740073746F705F73746162696C69AA +:104DA0007A657200706C6F70006C6F6754696D6526 +:104DB00072004C4F47007661726964203E3D20309E +:104DC000006D6F64756C65732F7372632F6C6F6702 +:104DD0002E63000001020401020404025359533AF5 +:104DE00020417373657274206661696C6564202567 +:104DF000733A25640A005359533A2041737365721C +:104E000074206661696C65642061742025733A259D +:104E1000640A005359533A204E6F206173736572D0 +:104E20007420696E666F726D6174696F6E20666F53 +:104E3000756E640A003031323334353637383941D3 +:104E40004243444546017265766973696F6E30006E +:104E50007265766973696F6E31006D6F646966693A +:104E600065640073746F705F6669726D77617265F7 +:104E7000004372617A79666C696520322E30007B5E +:104E80006272616E63687D00536B79526F766572F2 +:104E90004E616E6F32007B7265766973696F6E7DED +:104EA00000563135313230315231000001000000FE +:104EB000020000000600000006000A0008000000D2 +:104EC000000000000000102000000024100000205E +:104ED000202249008000000800020000200000108D +:104EE00000000018000020101F21480707070808CD +:104EF000080040000004000104000000040000005D +:104F0000040000000B0E0D0000000820000000222D +:104F100008000020000020200000002820000020C1 +:104F2000112F0F08080800000800001000000012F0 +:104F3000000008100909090007000B000900000023 +:104F40000000000002000000020000000400000059 +:104F50001054004010580040105C00400000200039 +:104F600000002000000020001000001000000014CD +:104F700000001010000000020000000E00000006FB +:104F800002000000020000000100000000002000FC +:104F90000000400000008000000000000100000050 +:104FA00001000000010000000100000004000000FA +:104FB00001000000020000000800000004000000E2 +:104FC000000C0240000802400008024000080240B5 +:104FD000000802403C0A560A700A8B0AA60AC10A57 +:104FE000DD0AF80A150B310B4E0B6B0B880BA50B6A +:104FF000C30BE10B000C1E0C3D0C5D0C7C0C9C0CDF +:10500000BD0CDD0CFE0C1F0D410D630D850DA80DB3 +:10501000CB0DEE0D120E360E5A0E7F0EA40ECA0EDA +:10502000EF0E160F3C0F630F8B0FB30FDB0F031048 +:105030002C1056108010AA10D41000112B115711EB +:105040008311B011DE110B12391268129712C712B8 +:10505000F712271359138A13BC13EF132214551494 +:105060008914BE14F31429155F159515CD15041672 +:105070003D167616AF16E91624175F179B17D8173B +:10508000151852189118CF180F194F199019D119D6 +:10509000131A561A9A1ADE1A221B681BAE1BF51B2E +:1050A0003D1C851CCE1C181D621DAD1DF91D461E24 +:1050B000941EE21E311F811FD11F23207520C8209E +:1050C0001C217121C7211D227422CD222623802379 +:1050D000DA2336249324F1244F25AF250F26712699 +:1050E000D32636279B2700286728CE283629A029D3 +:1050F0000B2A762AE32A512BC02B302CA12C132DFE +:10510000862DFB2D712EE82E602FD92F5330CF30F6 +:105110004C31CA314A32CA324C33D0335434DA3487 +:105120006235EA35743600378D371B38AA383C397A +:10513000CE39623AF83A8F3B273CC13C5D3DFA3D9F +:10514000983E383FDA3F7E402341CA4172421C43B9 +:10515000C84376442545D64589463D47F447AC4883 +:105160006649224ADF4A9F4B614C244DEA4DB14EBD +:105170007B4F46501451E351B55289535E54365516 +:105180001156ED56CB57AC588F59745A5C5B465C40 +:10519000325D215E125F0560FB60F361EE62EB63DE +:1051A000EB64ED65F266FA670469116A206B336C93 +:1051B000486D5F6E7A6F9770B871DB7201742A75F3 +:1051C00056768577B778EC79247B5F7C9D7DDF7E92 +:1051D00024806C814D5055363530303A2053656C03 +:1051E000662074657374202573205B4641494C5DCD +:1051F0002E206C6F773A2025302E32662C2068697D +:1052000067683A2025302E32662C206D65617375F3 +:105210007265643A2025302E32660A006779726F13 +:105220002058006779726F2059006779726F205A91 +:105230000061636320580061636320590061636308 +:10524000205A004D5055363530303A2053656C6643 +:105250002074657374205B4F4B5D2E0A0064726985 +:10526000766572732F7372632F6932636465765F3C +:10527000663430352E63004932434445563A20495E +:105280003243206572726F722063616C6C6261637D +:105290006B206465763A2025692C206572723A206D +:1052A00025690A004932434445563A204932432091 +:1052B00074696D656F75742063616C6C6261636B9A +:1052C000206465763A2025690A004C5053323548EF +:1052D0003A2053656C662074657374202573205BD7 +:1052E0004641494C5D2E206C6F773A2025302E3296 +:1052F000662C20686967683A2025302E32662C209B +:105300006D656173757265643A2025302E32660AC8 +:105310000074656D7065726174757265004C5053F0 +:105320003235483A2053656C662074657374205B8F +:105330004F4B5D2E0A00414B383936333A205365C6 +:105340006C662074657374202573205B4641494C5C +:105350005D2E206C6F773A2025642C206869676881 +:105360003A2025642C206D656173757265643A205E +:1053700025640A00414B383936333A2053656C6650 +:105380002074657374205B4F4B5D2E0A00454550B9 +:10539000524F4D3A2049324320636F6E6E656374FD +:1053A000696F6E205B4F4B5D2E0A00454550524F92 +:1053B0004D3A2049324320636F6E6E656374696FA6 +:1053C0006E205B4641494C5D2E0A005359533A20EA +:1053D0005468652073797374656D20726573756D9B +:1053E0006564206166746572207761746368646FB8 +:1053F000672074696D656F7574205B5741524E4923 +:105400004E475D0A00736F6E617252616E67650090 +:1054100073746F705F736F6E617200702D3E73698D +:105420007A65203C205359534C494E4B5F4D54559F +:105430000068616C2F7372632F7573626C696E6B99 +:105440002E63005553424C494E4B004269746372BF +:10545000617A652041420053544D333220566972BF +:105460007475616C20436F6D506F727420696E208B +:105470004853206D6F64650056435020436F6E663D +:1054800069670056435020496E74657266616365B2 +:1054900000526177204352545020696E74657266E1 +:1054A0006163650030313233343536373839414243 +:1054B00043444546494D553A204D505539323530D3 +:1054C0002049324320636F6E6E656374696F6E208E +:1054D0005B4F4B5D2E0A00494D553A204D505539D2 +:1054E0003235302049324320636F6E6E65637469D4 +:1054F0006F6E205B4641494C5D2E0A00494D553A7E +:1055000020414B383936332049324320636F6E6E69 +:10551000656374696F6E205B4F4B5D2E0A00494DC9 +:10552000553A20414B383936332049324320636F96 +:105530006E6E656374696F6E205B4641494C5D2EEB +:105540000A00494D553A204C5053323548204932D3 +:105550004320636F6E6E656374696F6E205B4F4BA3 +:105560005D2E0A00494D553A204C505332354820A3 +:1055700049324320636F6E6E656374696F6E205BA2 +:105580004641494C5D2E0A00494D553A20556E69F9 +:105590006E697469616C697A656400494D553A2099 +:1055A0004779726F2076617269616E6365207465F8 +:1055B0007374205B4F4B5D0A00494D553A2041639F +:1055C00063206C6576656C2074657374205B4F4B4B +:1055D0005D0A00494D553A20416363206C6576654C +:1055E0006C207465737420526F6C6C3A25302E32C7 +:1055F000662C2050697463683A25302E3266205B31 +:105600004641494C5D0A00494D553A204779726F31 +:105610002076617269616E63652074657374205BC6 +:105620004641494C5D0A004D5055363530300048F2 +:105630004D43353838334C004D53353631310073D6 +:10564000746F705F696D755F7465737473007374E4 +:105650006F705F696D755F73656E736F72730066EF +:105660006163746F720073746F705F696D755F61F1 +:1056700063635F6C70660073746F705F6D61675F0A +:10568000726177000000404085EB7140B81E7540A4 +:1056900014AE7740C3F5784048E17A40A4707D406D +:1056A00000008040AE478140333383405057524D15 +:1056B000474E5400766261740063686172676543A7 +:1056C000757272656E740073746174650073746FC3 +:1056D000705F706D00534C3A20556E6B6E6F776E35 +:1056E000207061636B65743A25582E0A0068616CFE +:1056F0002F7372632F7379736C696E6B2E63005313 +:1057000059534C494E4B00736C702D3E6C656E675F +:105710007468203C3D205359534C494E4B5F4D54C7 +:10572000550068616C2F7372632F726164696F6CCE +:10573000696E6B2E6300637274705061636B657485 +:1057400044656C697665727900727373690073746D +:105750006F705F726164696F0068616C2F73726350 +:105760002F6F775F7379736C696E6B2E63004F5781 +:105770003A20436D6420307825582074696D656F38 +:1057800075742E0A004F573A20466F756E642025B7 +:10579000642E0A004F573A205363616E205B4641E6 +:1057A000494C45445D2E0A004F573A2053657269B3 +:1057B000616C203078255820255820255820255800 +:1057C0002025582025582025582025582E0A004FDE +:1057D000573A204D656D3A256420476574696E66B9 +:1057E0006F205B4641494C45445D2E0A006C656E56 +:1057F000677468203C3D204F575F4D41585F5349C7 +:105800005A4500007800000001000000DC00F000B4 +:10581000DC00F000DC00F000AE0068010501C00310 +:10582000DC00F000AE0068010501C003DC00780078 +:105830004901F0004901F0004901F0005D016801F3 +:105840000501C003CF00F000AE0068010501C003F0 +:10585000DC007800B801F000DC006801DC00C00367 +:10586000B801F0009F0168018801C0037101C00305 +:105870004901C0035D01E0010000E001E900E00131 +:105880003701F000250168011501C0030501C003BF +:10589000F600C0030501E0010000E001AE00E001F8 +:1058A000CF00F000AE006801DC00C0030501F0008D +:1058B000DC0068010501C00349017800B801F0006F +:1058C000DC006801DC00C003B801F0009F01680142 +:1058D0008801C0037101C0034901C0035D01E001FB +:1058E0000000E001E900E0013701F0002501680156 +:1058F0001501C0037101C0034901C0035D01E0014E +:105900000000E001E900E0013701F0002501680135 +:105910001501C0030501C003F600C0030501E00145 +:105920000000E001AE00E001CF00F000AE00680131 +:105930000501C003DC00F000AE0068010501C003F2 +:10594000DC00780000007800FF0000007800000014 +:1059500001000000B801E001FE00000000000000AE +:105960000000000000000000000000000000000037 +:105970000000000000000000000000000000000027 +:105980000000000000000000000000000000000017 +:105990000000000000000000000000000000000007 +:1059A00000000000000000000000000000000000F7 +:1059B00000000000000000000000000000000000E7 +:1059C00000000000000000000000000000000000D7 +:1059D00000000000000000000000000000000000C7 +:1059E00000000000000000000000000000000000B7 +:1059F00000000000000000000000000000000000A7 +:105A00000000000000000000000000000000000096 +:105A10000000000000000000000000000000000086 +:105A20000000000000000000000000000000000076 +:105A30000000000000000000000000000000000066 +:105A40000000000000000000000000000000000056 +:105A50000000000000000000000000000000000046 +:105A60000000000000000000000000000000000036 +:105A70000000000000000000000000000000000026 +:105A80000000000000000000000000000000000016 +:105A90000000000078000000010000000501E001A6 +:105AA000FE000000000000000000000000000000F8 +:105AB00000000000000000000000000000000000E6 +:105AC00000000000000000000000000000000000D6 +:105AD00000000000000000000000000000000000C6 +:105AE00000000000000000000000000000000000B6 +:105AF00000000000000000000000000000000000A6 +:105B00000000000000000000000000000000000095 +:105B10000000000000000000000000000000000085 +:105B20000000000000000000000000000000000075 +:105B30000000000000000000000000000000000065 +:105B40000000000000000000000000000000000055 +:105B50000000000000000000000000000000000045 +:105B60000000000000000000000000000000000035 +:105B70000000000000000000000000000000000025 +:105B80000000000000000000000000000000000015 +:105B90000000000000000000000000000000000005 +:105BA00000000000000000000000000000000000F5 +:105BB00000000000000000000000000000000000E5 +:105BC00000000000000000000000000000000000D5 +:105BD000000000000000000000000000780000004D +:105BE000010000000501C0032501C0034901C003F5 +:105BF0005D01C003FE000000000000000000000086 +:105C00000000000000000000000000000000000094 +:105C10000000000000000000000000000000000084 +:105C20000000000000000000000000000000000074 +:105C30000000000000000000000000000000000064 +:105C40000000000000000000000000000000000054 +:105C50000000000000000000000000000000000044 +:105C60000000000000000000000000000000000034 +:105C70000000000000000000000000000000000024 +:105C80000000000000000000000000000000000014 +:105C90000000000000000000000000000000000004 +:105CA00000000000000000000000000000000000F4 +:105CB00000000000000000000000000000000000E4 +:105CC00000000000000000000000000000000000D4 +:105CD00000000000000000000000000000000000C4 +:105CE00000000000000000000000000000000000B4 +:105CF00000000000000000000000000000000000A4 +:105D00000000000000000000000000000000000093 +:105D10000000000000000000000000000000000083 +:105D20000000000078000000010000000501C00331 +:105D30002501C0034901C0035D01C0038801C00300 +:105D4000B801C003ED01C003FF0000000000000027 +:105D50000000000000000000000000000000000043 +:105D60000000000000000000000000000000000033 +:105D70000000000000000000000000000000000023 +:105D80000000000000000000000000000000000013 +:105D90000000000000000000000000000000000003 +:105DA00000000000000000000000000000000000F3 +:105DB00000000000000000000000000000000000E3 +:105DC00000000000000000000000000000000000D3 +:105DD00000000000000000000000000000000000C3 +:105DE00000000000000000000000000000000000B3 +:105DF00000000000000000000000000000000000A3 +:105E00000000000000000000000000000000000092 +:105E10000000000000000000000000000000000082 +:105E20000000000000000000000000000000000072 +:105E30000000000000000000000000000000000062 +:105E40000000000000000000000000000000000052 +:105E50000000000000000000000000000000000042 +:105E600000000000000000000000000078000000BA +:105E7000010000002501E001B801E0012501E00179 +:105E8000FF00000000000000000000000000000013 +:105E90000000000000000000000000000000000002 +:105EA00000000000000000000000000000000000F2 +:105EB00000000000000000000000000000000000E2 +:105EC00000000000000000000000000000000000D2 +:105ED00000000000000000000000000000000000C2 +:105EE00000000000000000000000000000000000B2 +:105EF00000000000000000000000000000000000A2 +:105F00000000000000000000000000000000000091 +:105F10000000000000000000000000000000000081 +:105F20000000000000000000000000000000000071 +:105F30000000000000000000000000000000000061 +:105F40000000000000000000000000000000000051 +:105F50000000000000000000000000000000000041 +:105F60000000000000000000000000000000000031 +:105F70000000000000000000000000000000000021 +:105F80000000000000000000000000000000000011 +:105F90000000000000000000000000000000000001 +:105FA00000000000000000000000000000000000F1 +:105FB00000000000536F756E6454696D6572006E69 +:105FC0006566666563740066726571007261746906 +:105FD0006F0073746F705F736F756E640000000004 +:105FE000780000000100000005017800250178001C +:105FF000490178005D01780088017800B8017800D7 +:10600000ED017800FF00000000000000000000002B +:106010000000000000000000000000000000000080 +:106020000000000000000000000000000000000070 +:106030000000000000000000000000000000000060 +:106040000000000000000000000000000000000050 +:106050000000000000000000000000000000000040 +:106060000000000000000000000000000000000030 +:106070000000000000000000000000000000000020 +:106080000000000000000000000000000000000010 +:106090000000000000000000000000000000000000 +:1060A00000000000000000000000000000000000F0 +:1060B00000000000000000000000000000000000E0 +:1060C00000000000000000000000000000000000D0 +:1060D00000000000000000000000000000000000C0 +:1060E00000000000000000000000000000000000B0 +:1060F00000000000000000000000000000000000A0 +:10610000000000000000000000000000000000008F +:10611000000000000000000000000000000000007F +:1061200000000000000000007800000001000000F6 +:106130002501F000B801F000FE00000000000000A2 +:10614000000000000000000000000000000000004F +:10615000000000000000000000000000000000003F +:10616000000000000000000000000000000000002F +:10617000000000000000000000000000000000001F +:10618000000000000000000000000000000000000F +:1061900000000000000000000000000000000000FF +:1061A00000000000000000000000000000000000EF +:1061B00000000000000000000000000000000000DF +:1061C00000000000000000000000000000000000CF +:1061D00000000000000000000000000000000000BF +:1061E00000000000000000000000000000000000AF +:1061F000000000000000000000000000000000009F +:10620000000000000000000000000000000000008E +:10621000000000000000000000000000000000007E +:10622000000000000000000000000000000000006E +:10623000000000000000000000000000000000005E +:10624000000000000000000000000000000000004E +:10625000000000000000000000000000000000003E +:10626000000000000000000000000000000000002E +:1062700078000000010000000501C0032501C003F3 +:106280004901C0035D01C003FE00000000000000E2 +:1062900000000000000000000000000000000000FE +:1062A00000000000000000000000000000000000EE +:1062B00000000000000000000000000000000000DE +:1062C00000000000000000000000000000000000CE +:1062D00000000000000000000000000000000000BE +:1062E00000000000000000000000000000000000AE +:1062F000000000000000000000000000000000009E +:10630000000000000000000000000000000000008D +:10631000000000000000000000000000000000007D +:10632000000000000000000000000000000000006D +:10633000000000000000000000000000000000005D +:10634000000000000000000000000000000000004D +:10635000000000000000000000000000000000003D +:10636000000000000000000000000000000000002D +:10637000000000000000000000000000000000001D +:10638000000000000000000000000000000000000D +:1063900000000000000000000000000000000000FD +:1063A00000000000000000000000000000000000ED +:1063B00000000000000000004445434B5F434F5283 +:1063C000453A202564206465636B20656E756D65B4 +:1063D00072617465640A004445434B5F434F524504 +:1063E0003A204465636B2025692074657374205BD3 +:1063F0004F4B5D2E0A004445434B5F434F52453A95 +:10640000204465636B2025692074657374205B46A6 +:1064100041494C5D2E0A004445434B5F494E464F6F +:106420003A205761726E696E6721204E6F20647248 +:106430006976657220666F756E6420666F7220647F +:1064400065636B2E0A00696573004445434B5F49E1 +:106450004E464F3A20466F756E6420256420646571 +:10646000636B206D656D6F7225732E0A0044454382 +:106470004B5F494E464F3A204572726F72207363EC +:10648000616E6E696E6720666F72206465636B2053 +:106490006D656D6F726965732C206E6F2064656326 +:1064A0006B20647269766572732077696C6C206208 +:1064B0006520696E697469616C697365640A00447A +:1064C00045434B5F494E464F3A204D656D6F72799B +:1064D000206572726F723A2077726F6E67206865FE +:1064E000616465722049440A004445434B5F494E4C +:1064F000464F3A204D656D6F7279206572726F72EA +:106500003A20696E636F72726563742068656164B6 +:106510006572204352430A004445434B5F494E464F +:106520004F3A204D656D6F7279206572726F723AC5 +:1065300020696E636F727265637420544C562076C6 +:10654000657273696F6E0A004445434B5F494E465E +:106550004F3A204D656D6F7279206572726F723A95 +:1065600020696E636F727265637420544C562043C9 +:106570005243202578213D25780A004445434B5F4E +:10658000494E464F3A204552524F523A2044726982 +:1065900076657220506572697068207573616765F1 +:1065A00020636F6E666C696374732077697468200A +:1065B000612070726576696F75736C7920656E7590 +:1065C0006D657261746564206465636B20647269D3 +:1065D0007665722E204E6F206465636B7320776939 +:1065E0006C6C20626520696E697469616C697A659A +:1065F00064210A004445434B5F494E464F3A2045CB +:1066000052524F523A20447269766572204770693F +:106610006F20757361676520636F6E666C69637464 +:1066200073207769746820612070726576696F7570 +:10663000736C7920656E756D657261746564206434 +:1066400065636B206472697665722E204E6F2064DC +:1066500065636B732077696C6C20626520696E6975 +:106660007469616C697A6564210A004445434B5F33 +:10667000494E464F3A2052656164696E67206465F1 +:10668000636B206E723A2564205B4641494C454459 +:106690005D2E204E6F206472697665722077696C7A +:1066A0006C20626520696E697469616C697A6564E1 +:1066B000210A004445434B5F494E464F3A2044650A +:1066C000636B2025692068617320636F7272757037 +:1066D000746564204F57206D656D6F72792E204E62 +:1066E0006F206472697665722077696C6C206265D0 +:1066F00020696E697469616C697A6564210A004475 +:1067000045434B5F445249564552533A20466F75B4 +:106710006E6420256420647269766572730A0000D5 +:1067200000000000386701080000000000030000BE +:10673000FD0D010800000000626342757A7A6572FF +:1067400000424947515541443A2053776974636880 +:10675000696E6720746F2062727573686C657373FD +:106760002E0A00626342696751756164000000008F +:10677000BC0300006367010808000000000000007F +:106780003D0E01082D0E010845543A2050696E3A1D +:10679000257320213D202564205B4641494C5D0A3C +:1067A000006263457870546573740000BCFF00009C +:1067B000A1670108000000000000000000000000C8 +:1067C000A90E01084040FF202040080810000000EA +:1067D00000000000000000000000000000000000B9 +:1067E0000000000000000000000020000010000079 +:1067F0000800000410101008080804040420000019 +:10680000100000080000040000020000BC010000AD +:106810002E6801080800000060000000A11A0108AD +:106820000000000072696E6754696D6572006263F2 +:106830004C656452696E6700736F6C69645265647D +:1068400000736F6C6964477265656E00736F6C6985 +:1068500064426C756500686561646C69676874455D +:106860006E61626C6500676C6F777374657000654C +:106870006D7074794368617267650066756C6C430E +:1068800068617267650073746F705F72696E67002C +:1068900014000000140000001440FF4020402008B5 +:1068A00010080000000000000000000000000000D0 +:1068B0000000000000000000000000000043464708 +:1068C000424C4B3A207625642C20766572696669C5 +:1068D000636174696F6E205B4F4B5D0A00434647EE +:1068E000424C4B3A20566572696669636174696F00 +:1068F0006E205B4641494C5D0A0000006937AC31AF +:1069000068212233B40F14336821A2333863ED3E7B +:10691000DA0F493F5E987B3FDA0FC93F6173696EBA +:1069200066000000706F7766000000000000000045 +:1069300000C0153F00000000DCCFD1350000803FD3 +:106940000000C03F000FC93F000F494000CB9640F8 +:10695000000FC9400053FB4000CB164100ED2F4112 +:10696000000F49410031624100537B41003A8A41A6 +:1069700000CB9641005CA34100EDAF41007EBC41DD +:10698000000FC94100A0D5410031E24100C2EE41F3 +:106990000053FB4100F20342003A0A4200831042D6 +:1069A00000CB164200141D42005C234200A5294280 +:1069B00000ED2F4200363642007E3C4200C7424284 +:1069C000000F4942A2000000F9000000830000000F +:1069D0006E0000004E0000004400000015000000A2 +:1069E00029000000FC000000270000005700000004 +:1069F000D1000000F500000034000000DD000000C0 +:106A0000C0000000DB0000006200000095000000F4 +:106A1000990000003C0000004300000090000000CE +:106A200041000000FE000000510000006300000073 +:106A3000AB000000DE000000BB000000C50000004D +:106A400061000000B7000000240000006E0000009C +:106A50003A000000420000004D000000D20000009B +:106A6000E000000006000000490000002E000000C9 +:106A7000EA00000009000000D100000092000000C0 +:106A80001C000000FE0000001D000000EB000000E4 +:106A90001C000000B100000029000000A700000059 +:106AA0003E000000E8000000820000003500000009 +:106AB000F50000002E000000BB00000044000000B4 +:106AC00084000000E90000009C000000700000004D +:106AD00026000000B40000005F0000007E000000FF +:106AE000410000003900000091000000D6000000C5 +:106AF000390000008300000053000000390000004E +:106B0000F40000009C000000840000005F00000012 +:106B10008B000000BD000000F9000000280000000C +:106B20003B0000001F000000F8000000970000007C +:106B3000FF000000DE0000000500000098000000DB +:106B40000F000000EF0000002F0000001100000007 +:106B50008B0000005A0000000A0000006D000000D9 +:106B60001F0000006D000000360000007E000000E5 +:106B7000CF00000027000000CB000000090000004B +:106B8000B70000004F000000460000003F0000007A +:106B9000660000009E0000005F000000EA000000A8 +:106BA0002D0000007500000027000000BA00000062 +:106BB000C7000000EB000000E5000000F10000004D +:106BC0007B0000003D0000000700000039000000CD +:106BD000F70000008A000000520000009200000050 +:106BE000EA0000006B000000FB0000005F000000F6 +:106BF000B10000001F0000008D0000005D000000DB +:106C000008000000560000000300000030000000F3 +:106C100046000000FC0000007B0000006B0000004C +:106C2000AB000000F0000000CF000000BC0000003E +:106C3000200000009A000000F40000003600000070 +:106C40001D000000A9000000E3000000910000000A +:106C5000610000005E000000E60000001B00000074 +:106C60000800000065000000990000008500000099 +:106C70005F00000014000000A00000006800000099 +:106C8000400000008D000000FF000000D800000060 +:106C9000800000004D00000073000000270000008D +:106CA0003100000006000000060000001500000092 +:106CB00056000000CA00000073000000A800000099 +:106CC000C900000060000000E20000007B0000003E +:106CD000C00000008C0000006B00000004000000F9 +:106CE00007000000090000000000C93F0000F03963 +:106CF0000000DA370000A2330000842E0000502B81 +:106D00000000C2270000D0220000C41F0000C61BE4 +:106D100000004417000000000000000000003043A5 +:106D200000000000000030C3002020202020202090 +:106D3000202028282828282020202020202020202B +:106D4000202020202020202020881010101010103B +:106D50001010101010101010100404040404040487 +:106D60000404041010101010101041414141414121 +:106D70000101010101010101010101010101010103 +:106D80000101010110101010101042424242424213 +:106D900002020202020202020202020202020202D3 +:106DA000020202021010101020000000000000007B +:106DB00000000000000000000000000000000000D3 +:106DC00000000000000000000000000000000000C3 +:106DD00000000000000000000000000000000000B3 +:106DE00000000000000000000000000000000000A3 +:106DF0000000000000000000000000000000000093 +:106E00000000000000000000000000000000000082 +:106E10000000000000000000000000000000000072 +:106E2000000000000000000000430000810000009E +:106E3000054B01080000000049000000EE4A01086F +:106E4000227AFF1F4A000000F44A0108107AFF1F4F +:106E50004A000000F84A0108147AFF1F4A000000A7 +:106E6000FC4A0108187AFF1F80000000004B01084F +:106E70000000000081000000CD4A01080000000071 +:106E800000000000D44A0108905E0020800000004D +:106E9000E34A01080000000081000000764B010871 +:106EA0000000000008000000334B0108E65E0020EF +:106EB000080000003B4B01088C0100200800000086 +:106EC000434B0108145F0020080000004A4B0108F2 +:106ED0008D01002008000000574B01088E010020A2 +:106EE00008000000654B01080A5F002080000000D8 +:106EF000714B01080000000081000000CE4B01082A +:106F00000000000006000000814B0108546D0020C5 +:106F100006000000894B0108586D002006000000A3 +:106F2000914B01085C6D002006000000994B0108A0 +:106F3000E46C002006000000A24B0108E86C002071 +:106F400006000000AB4B0108EC6C002006000000BE +:106F5000B44B0108A86C002006000000BB4B0108E0 +:106F6000AC6C002006000000C24B0108B06C002091 +:106F700080000000C94B01080000000081000000F3 +:106F8000DC4B01080000000006000000814B0108F6 +:106F90006C6C002006000000894B0108706C00201A +:106FA00006000000914B0108746C002006000000F0 +:106FB000994B01081C6D002006000000A24B01083F +:106FC000206D002006000000AB4B0108246D00205E +:106FD00006000000B44B01088C6D00200600000084 +:106FE000BB4B0108906D002006000000C24B010859 +:106FF000946D002080000000D74B010800000000C5 +:1070000081000000EE4B01080000000006000000B7 +:107010009F4B01089801002006000000A84B0108C2 +:107020009401002080000000E94B010800000000EE +:1070300081000000D74C010800000000060000009D +:10704000074C0108A801002006000000104C0108B0 +:10705000D8010020060000001D4C01087C5F0020C4 +:1070600006000000244C0108E45F00200600000038 +:10707000304C0108A401002006000000424C010829 +:10708000AC01002006000000B14B01086C5F00203D +:1070900006000000A84B0108BC010020060000000B +:1070A0009F4B0108C001002006000000504C010861 +:1070B0009C01002006000000594C0108B801002086 +:1070C00006000000634C0108D40100200600000007 +:1070D000704C0108B0010020060000007B4C010844 +:1070E000C801002006000000884C0108C4010020EF +:1070F000060000009A4C0108385F002006000000DE +:10710000A74C0108CC01002009000000B34C010885 +:10711000A001002009000000BE4C0108B4010020BD +:1071200009000000C84C01087A5F002080000000C0 +:10713000D24C01080000000081000000684E0108E8 +:10714000000000004A000000464E0108AC4E010855 +:1071500049000000504E0108B04E010848000000F0 +:107160005A4E0108454E010880000000634E010898 +:1071700000000000810000005356010800000000DC +:10718000480000002F5601081A6700204800000040 +:107190003856010830670020800000004E56010874 +:1071A00000000000810000004456010800000000BB +:1071B00048000000275601089A03002048000000FC +:1071C0002F56010899030020480000003856010896 +:1071D0009B030020800000003F56010800000000D3 +:1071E000810000006B56010800000000080000004C +:1071F0005F560108226700208000000066560108E3 +:107200000000000081000000D75F010800000000BE +:1072100008000000C05F0108206800204A0000004C +:10722000BF5F01081868002009000000C75F01085F +:10723000B403002008000000CC5F01084C68002067 +:1072400080000000D25F0108000000008100000003 +:107250008B6801080000000008000000C05F010802 +:10726000500500204A000000BF5F01081C6B002091 +:107270000800000038680108080500200800000028 +:1072800041680108FC040020080000004C68010867 +:10729000090500200800000056680108686B0020FE +:1072A00006000000666801080C05002006000000CA +:1072B0006F68010800050020060000007B680108D7 +:1072C000140500208000000086680108000000000E +:1072D00081000000C94A010800000000040000000D +:1072E000BD4A0108925E002080000000C44A0108E7 +:1072F00000000000810000007A4D0108000000003D +:10730000070000004E4C0108405F0020070000000D +:107310001C410108445F002007000000584D01088F +:10732000485F0020070000006D4D0108D05F00207D +:1073300007000000704D0108D45F002080000000AD +:10734000754D01080000000081000000324D010869 +:1073500000000000070000000C4D0108D85F00206D +:1073600007000000104D0108B85F00200700000072 +:10737000174D0108F85F0020070000001F4D0108AD +:10738000605F002007000000244D0108705F0020AE +:10739000800000002D4D0108000000008100000069 +:1073A000524D01080000000006000000414D010898 +:1073B000BC6D002006000000444D0108C46D002093 +:1073C00006000000474D0108B86D002006000000CF +:1073D0004A4D0108B06D0020800000004D4D0108AD +:1073E0000000000081000000994D0108000000002D +:1073F000070000007E4D0108345F002007000000F8 +:10740000834D0108DC5F002007000000894D010862 +:10741000585F0020020000008D4D0108B66D00206D +:1074200080000000944D0108000000008100000071 +:10743000D74C01080000000007000000DF4C0108E5 +:10744000745F002007000000E34C0108D001002019 +:1074500007000000EA4C0108C05F002007000000A0 +:10746000F14C0108C05F002007000000F84C010843 +:107470003C5F002007000000024D0108645F00200F +:1074800080000000D24C01080000000081000000D4 +:10749000684D010800000000070000004E4C010884 +:1074A000C45F0020070000001C410108C85F0020E5 +:1074B00007000000584D0108CC5F0020800000004C +:1074C000634D010800000000810000003C4D0108F0 +:1074D00000000000070000003D4D0108805F002013 +:1074E000070000006D680108A05F00200700000091 +:1074F000A94B0108A45F0020070000006B6701088A +:10750000A85F002080000000374D01080000000047 +:10751000810000005F4D010800000000070000002E +:107520004E4C01084C5F0020070000001C41010880 +:10753000505F002007000000584D0108545F0020F4 +:10754000800000005A4D010800000000810000008A +:107550001554010800000000020000000554010855 +:10756000486F002080000000105401080000000057 +:10757000810000007C5601080000000005000000AA +:107580004E4C01081C670020050000001C4101084A +:107590001E67002005000000584D010820670020EC +:1075A0008000000077560108000000008100000004 +:1075B000D25601080000000007000000B456010880 +:1075C0004C67002007000000B95601083D67002005 +:1075D00004000000C7560108516700208000000029 +:1075E000CD5601080000000081000000535701083B +:1075F00000000000010000004957010898670020C2 +:10760000800000004E5701080000000020670108BC +:0C76100070670108AC6701080C680108F5 +:08761C004CD5FE7F01000000C7 +:10762400AAAAAAAA0000000001020304010203049A +:10763400060708099C470108184801085C48010826 +:10764400C846010858470108E4480108A048010851 +:107654000C4701088D7E00088D7E00088D7E000891 +:1076640000000000000000003400002001000000C1 +:1076740032000000000000003200000001000000A1 +:107684003200000000000000320000000100000091 +:107694003200000000000000320000000100000081 +:1076A4003200000000000000320000000100000071 +:1076B4003200000000000000320000000100000061 +:1076C4003200000000000000320000000100000051 +:1076D4003200000000000000320000000000000042 +:1076E400FFFFFFFF01000000320000000000000067 +:1076F4009E07000000000000FEFFFFFF01000000E5 +:10770400C80000000000000020030000000000008A +:10771400FEFFFFFF01000000E8030000000000007E +:10772400FEFFFFFF01000000010000000000000058 +:107734000000000000000000FFFFFFFF0100000048 +:107744003200000000000000C20100000000000040 +:10775400FEFFFFFF01000000E8030000000000003E +:10776400FEFFFFFF010000003200000000000000E7 +:10777400FA00000000000000FEFFFFFF010000000F +:10778400F401000000000000F4010000000000000B +:10779400FEFFFFFF01000000640000000000000085 +:1077A4009001000000000000FEFFFFFF0201010045 +:1077B4000000803F6F12033BCDCC4C3FCDCC4C3FFF +:1077C400F8A70000000048431F856B3F0000803F7E +:1077D40048E17A3F60EA000000204B46EC51383E15 +:1077E4000000003F0AD7A33B000040C2CDCC4C3D73 +:1077F400000080BFCDCC4C3D7B146E3F964E0108FB +:10780400884E0108A14E0108000300020000000098 +:107814000000000000000000000000000000000064 +:10782400FFFFFFFF00000000010300020000000052 +:107834000000000000000000000000000000000044 +:10784400FFFFFFFF000000000004024000040240AC +:1078540000000240E801002008020020400200204D +:10786400020300020000000000000000000000000D +:107874000000000000000000FFFFFFFF0000000008 +:107884000054004000580040005C0040A0600240EA +:10789400B8600240706002400004024000040240EC +:1078A40000080240006002400060024000600240A4 +:1078B400106002405860024040600240A002002074 +:1078C40065D40008ADD3000863D3000809D30008C9 +:1078D40035D30008EDD20008D7D2000819D3000828 +:1078E40027D300080000000000000000A5F20008F3 +:1078F40011F30008E5F20008000000000000000099 +:10790400B5F30008C1F30008CDF300083DF4000806 +:10791400E9F3000861F400087DF400080403090495 +:1079240012010002000000408304405700020102DB +:1079340003010000ADF40008AFF40008B1F400083E +:10794400F9F40008B3F40008B5F4000807F50008DA +:107954002DF5000815F50008CDF50008000000001D +:107964000000000095F50008B9F400085DF5000872 +:107974000000000000000000A1F40008FF00000067 +:107984000902200001010080320904000002FFFF07 +:1079940000000705810240000607050102400006B9 +:1079A40000000000000000000000000000000000D3 +:1079B4000000000000000000000101010000C040C0 +:1079C400B5010108B90101080D0201080000000019 +:1079D40000000000A00F2800E108010800000000DA +:1079E400000000006D08010800000000945A01081E +:1079F4006D080108000000004C5901086D080108D9 +:107A040000000000286101086D0801080000000062 +:107A14006C5E01086D080108000000007062010836 +:107A24006D08010800000000DC5B01086D08010816 +:107A340000000000E05F01086D080108000000007C +:107A4400245D01086D0801080000000004580108C5 +:107A54006108010800000000000000001908010886 +:107A6400000000000000000095070108000000006D +:107A740000000000D0070000110E0108170E0108D5 +:107A8400000402408000534441000000000402400E +:107A9400400053434C0000000008024000045458C6 +:107AA4003100000000080240000852583100000074 +:107AB400000002400400545832000000000002405C +:107AC40008005258320000000000024020005343D6 +:107AD4004B0000000000024040004D4F534900009D +:107AE4000000024080004D49534F00000004024052 +:107AF4000001494F31000000000402402000494FBA +:107B040032000000000402401000494F330000001E +:107B1400000802400010494F340000001400000027 +:107B240066664640FFFFFFFF14140000CDCC4C3DB9 +:107B3400FFFFFFFF66668640511B010859100108CC +:107B440029120108CD1501088D14010881120108BC +:107B5400E1120108B1100108691B0108AD13010805 +:107B6400BD110108511301084D19010855110108EF +:107B7400060000003078424301500000000000007D +:107B8400000000E7E7E7E7E700010000286D0108CF +:107B940000000000000000000000000000000000E1 +:107BA40000000000000000000000000000000000D1 +:107BB400296E010800000000000000000000000021 +:107BC40000000000000000000000000000000000B1 +:107BD40000000000000000000000000000000000A1 +:107BE4000000000000000000000000000000000091 +:047BF40070050020F8 +:0CEE980000000000D44901080000000048 :040000050800418826 :00000001FF diff --git a/cf2.map b/cf2.map index a7dec24aca..9b617a9a43 100644 --- a/cf2.map +++ b/cf2.map @@ -1,7 +1,7 @@ Archive member included because of file (symbol) /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libm.a(lib_a-sf_atan.o) - bin/neopixelring.o (atanf) + bin/ledring12.o (atanf) /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libm.a(lib_a-sf_cos.o) bin/stabilizer.o (cosf) /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libm.a(lib_a-sf_fabs.o) @@ -55,7 +55,7 @@ Archive member included because of file (symbol) /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libm.a(lib_a-sf_copysign.o) /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libm.a(lib_a-sf_scalbn.o) (copysignf) /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/armv7e-m/fpu/libgcc.a(_arm_addsubdf3.o) - /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libm.a(lib_a-s_rint.o) (__aeabi_dsub) + bin/stabilizer.o (__aeabi_dsub) /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/armv7e-m/fpu/libgcc.a(_arm_muldivdf3.o) bin/motors.o (__aeabi_dmul) /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/armv7e-m/fpu/libgcc.a(_arm_cmpdf2.o) @@ -93,7 +93,7 @@ Archive member included because of file (symbol) /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libc_nano.a(lib_a-strlen.o) bin/param.o (strlen) /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libc_nano.a(lib_a-strncpy.o) - bin/tasks.o (strncpy) + bin/platformservice.o (strncpy) Allocating common symbols Common symbol size file @@ -135,6 +135,7 @@ canStartMutex 0x4 bin/system.o motorPowerM1 0x4 bin/stabilizer.o actuatorPitch 0x2 bin/stabilizer.o rxTransfer 0x10 bin/i2cdev_f405.o +ledringmem 0x12 bin/ledring12.o pulse_time 0x2 bin/sonar.o sinPitch 0x4 bin/imu_cf2.o gyroBias 0x30c bin/imu_cf2.o @@ -198,6 +199,10 @@ Discarded input sections .group 0x0000000000000000 0x8 bin/list.o .group 0x0000000000000000 0x8 bin/list.o .group 0x0000000000000000 0x8 bin/list.o + .group 0x0000000000000000 0x8 bin/list.o + .group 0x0000000000000000 0x8 bin/list.o + .group 0x0000000000000000 0x8 bin/list.o + .group 0x0000000000000000 0x8 bin/list.o .text 0x0000000000000000 0x0 bin/list.o .data 0x0000000000000000 0x0 bin/list.o .bss 0x0000000000000000 0x0 bin/list.o @@ -239,52 +244,86 @@ Discarded input sections .group 0x0000000000000000 0x8 bin/tasks.o .group 0x0000000000000000 0x8 bin/tasks.o .group 0x0000000000000000 0x8 bin/tasks.o - .group 0x0000000000000000 0x8 bin/tasks.o - .group 0x0000000000000000 0x8 bin/tasks.o - .group 0x0000000000000000 0x8 bin/tasks.o - .group 0x0000000000000000 0x8 bin/tasks.o - .group 0x0000000000000000 0x8 bin/tasks.o .text 0x0000000000000000 0x0 bin/tasks.o .data 0x0000000000000000 0x0 bin/tasks.o .bss 0x0000000000000000 0x0 bin/tasks.o + .text.prvListTaskWithinSingleList.part.0 + 0x0000000000000000 0x82 bin/tasks.o .text.vTaskEndScheduler - 0x0000000000000000 0x18 bin/tasks.o + 0x0000000000000000 0x20 bin/tasks.o .text.xTaskGetTickCountFromISR - 0x0000000000000000 0x18 bin/tasks.o + 0x0000000000000000 0x10 bin/tasks.o .text.uxTaskGetNumberOfTasks 0x0000000000000000 0xc bin/tasks.o + .text.uxTaskGetSystemState + 0x0000000000000000 0x84 bin/tasks.o .text.xTaskGetApplicationTaskTag 0x0000000000000000 0x1c bin/tasks.o .text.xTaskCallApplicationTaskHook 0x0000000000000000 0x18 bin/tasks.o + .text.vTaskPlaceOnUnorderedEventList + 0x0000000000000000 0x84 bin/tasks.o + .text.xTaskRemoveFromUnorderedEventList + 0x0000000000000000 0x90 bin/tasks.o + .text.uxTaskGetTaskNumber + 0x0000000000000000 0x6 bin/tasks.o + .text.vTaskSetTaskNumber + 0x0000000000000000 0x6 bin/tasks.o .text.uxTaskGetStackHighWaterMark 0x0000000000000000 0x20 bin/tasks.o + .text.xTaskGetCurrentTaskHandle + 0x0000000000000000 0xc bin/tasks.o + .text.uxTaskResetEventItemValue + 0x0000000000000000 0x18 bin/tasks.o + .text.ulTaskNotifyTake + 0x0000000000000000 0x94 bin/tasks.o + .text.xTaskNotifyWait + 0x0000000000000000 0xb8 bin/tasks.o + .text.xTaskGenericNotify + 0x0000000000000000 0xcc bin/tasks.o + .text.xTaskGenericNotifyFromISR + 0x0000000000000000 0xfc bin/tasks.o + .text.vTaskNotifyGiveFromISR + 0x0000000000000000 0xbc bin/tasks.o + .text.xTaskNotifyStateClear + 0x0000000000000000 0x2c bin/tasks.o .debug_macro 0x0000000000000000 0x89e bin/tasks.o .debug_macro 0x0000000000000000 0x58 bin/tasks.o .debug_macro 0x0000000000000000 0x22 bin/tasks.o .debug_macro 0x0000000000000000 0x35 bin/tasks.o .debug_macro 0x0000000000000000 0x9c bin/tasks.o + .debug_macro 0x0000000000000000 0x16 bin/tasks.o + .debug_macro 0x0000000000000000 0x10e bin/tasks.o + .debug_macro 0x0000000000000000 0x7f bin/tasks.o .debug_macro 0x0000000000000000 0x4a bin/tasks.o - .debug_macro 0x0000000000000000 0x29d bin/tasks.o .debug_macro 0x0000000000000000 0x52 bin/tasks.o .debug_macro 0x0000000000000000 0x16 bin/tasks.o .debug_macro 0x0000000000000000 0x43 bin/tasks.o .debug_macro 0x0000000000000000 0x180 bin/tasks.o - .debug_macro 0x0000000000000000 0x16 bin/tasks.o + .debug_macro 0x0000000000000000 0x29d bin/tasks.o .debug_macro 0x0000000000000000 0x16 bin/tasks.o .debug_macro 0x0000000000000000 0x29 bin/tasks.o + .debug_macro 0x0000000000000000 0x58 bin/tasks.o + .debug_macro 0x0000000000000000 0x22 bin/tasks.o + .debug_macro 0x0000000000000000 0x1df bin/tasks.o .debug_macro 0x0000000000000000 0x22 bin/tasks.o .debug_macro 0x0000000000000000 0xca bin/tasks.o .debug_macro 0x0000000000000000 0x16 bin/tasks.o - .debug_macro 0x0000000000000000 0x168 bin/tasks.o - .debug_macro 0x0000000000000000 0x46 bin/tasks.o + .debug_macro 0x0000000000000000 0x52 bin/tasks.o + .debug_macro 0x0000000000000000 0x18a bin/tasks.o + .debug_macro 0x0000000000000000 0x58 bin/tasks.o + .debug_macro 0x0000000000000000 0x16 bin/tasks.o + .debug_macro 0x0000000000000000 0x110 bin/tasks.o + .debug_macro 0x0000000000000000 0x15d bin/tasks.o + .debug_macro 0x0000000000000000 0xe4 bin/tasks.o .debug_macro 0x0000000000000000 0x10 bin/tasks.o - .debug_macro 0x0000000000000000 0x115 bin/tasks.o - .debug_macro 0x0000000000000000 0xa5 bin/tasks.o - .debug_macro 0x0000000000000000 0x12 bin/tasks.o .debug_macro 0x0000000000000000 0x1f bin/tasks.o - .debug_macro 0x0000000000000000 0x1fc bin/tasks.o - .debug_macro 0x0000000000000000 0x5e bin/tasks.o + .debug_macro 0x0000000000000000 0x3a7 bin/tasks.o + .debug_macro 0x0000000000000000 0xc0 bin/tasks.o + .group 0x0000000000000000 0x8 bin/queue.o + .group 0x0000000000000000 0x8 bin/queue.o + .group 0x0000000000000000 0x8 bin/queue.o + .group 0x0000000000000000 0x8 bin/queue.o .group 0x0000000000000000 0x8 bin/queue.o .group 0x0000000000000000 0x8 bin/queue.o .group 0x0000000000000000 0x8 bin/queue.o @@ -321,16 +360,26 @@ Discarded input sections .text 0x0000000000000000 0x0 bin/queue.o .data 0x0000000000000000 0x0 bin/queue.o .bss 0x0000000000000000 0x0 bin/queue.o + .text.xQueuePeekFromISR + 0x0000000000000000 0x7c bin/queue.o + .text.uxQueueSpacesAvailable + 0x0000000000000000 0x2c bin/queue.o .text.uxQueueMessagesWaitingFromISR 0x0000000000000000 0x20 bin/queue.o - .text.vQueueDelete - 0x0000000000000000 0x4c bin/queue.o + .text.uxQueueGetQueueNumber + 0x0000000000000000 0x4 bin/queue.o + .text.vQueueSetQueueNumber + 0x0000000000000000 0x4 bin/queue.o + .text.ucQueueGetQueueType + 0x0000000000000000 0x6 bin/queue.o .text.xQueueIsQueueEmptyFromISR 0x0000000000000000 0x24 bin/queue.o .text.xQueueIsQueueFullFromISR 0x0000000000000000 0x28 bin/queue.o - .text.vQueueAddToRegistry + .text.vQueueUnregisterQueue 0x0000000000000000 0x24 bin/queue.o + .text.vQueueDelete + 0x0000000000000000 0x2c bin/queue.o .debug_macro 0x0000000000000000 0x89e bin/queue.o .debug_macro 0x0000000000000000 0x58 bin/queue.o .debug_macro 0x0000000000000000 0x22 bin/queue.o @@ -349,21 +398,42 @@ Discarded input sections .debug_macro 0x0000000000000000 0x29 bin/queue.o .debug_macro 0x0000000000000000 0x16 bin/queue.o .debug_macro 0x0000000000000000 0x35 bin/queue.o - .debug_macro 0x0000000000000000 0x46 bin/queue.o + .debug_macro 0x0000000000000000 0x58 bin/queue.o + .debug_macro 0x0000000000000000 0x22 bin/queue.o + .debug_macro 0x0000000000000000 0x1df bin/queue.o .debug_macro 0x0000000000000000 0x22 bin/queue.o .debug_macro 0x0000000000000000 0xca bin/queue.o .debug_macro 0x0000000000000000 0x16 bin/queue.o - .debug_macro 0x0000000000000000 0x168 bin/queue.o + .debug_macro 0x0000000000000000 0x52 bin/queue.o + .debug_macro 0x0000000000000000 0x18a bin/queue.o .debug_macro 0x0000000000000000 0x58 bin/queue.o + .debug_macro 0x0000000000000000 0x16 bin/queue.o + .debug_macro 0x0000000000000000 0x110 bin/queue.o + .debug_macro 0x0000000000000000 0x15d bin/queue.o + .debug_macro 0x0000000000000000 0xe4 bin/queue.o .debug_macro 0x0000000000000000 0x10 bin/queue.o - .debug_macro 0x0000000000000000 0x115 bin/queue.o - .debug_macro 0x0000000000000000 0xa5 bin/queue.o - .debug_macro 0x0000000000000000 0x12 bin/queue.o .debug_macro 0x0000000000000000 0x1f bin/queue.o - .debug_macro 0x0000000000000000 0x1fc bin/queue.o - .debug_macro 0x0000000000000000 0x5e bin/queue.o - .debug_macro 0x0000000000000000 0x57 bin/queue.o - COMMON 0x0000000000000000 0x50 bin/queue.o + .debug_macro 0x0000000000000000 0x3a7 bin/queue.o + .debug_macro 0x0000000000000000 0xc0 bin/queue.o + .debug_macro 0x0000000000000000 0x9a bin/queue.o + .group 0x0000000000000000 0x8 bin/timers.o + .group 0x0000000000000000 0x8 bin/timers.o + .group 0x0000000000000000 0x8 bin/timers.o + .group 0x0000000000000000 0x8 bin/timers.o + .group 0x0000000000000000 0x8 bin/timers.o + .group 0x0000000000000000 0x8 bin/timers.o + .group 0x0000000000000000 0x8 bin/timers.o + .group 0x0000000000000000 0x8 bin/timers.o + .group 0x0000000000000000 0x8 bin/timers.o + .group 0x0000000000000000 0x8 bin/timers.o + .group 0x0000000000000000 0x8 bin/timers.o + .group 0x0000000000000000 0x8 bin/timers.o + .group 0x0000000000000000 0x8 bin/timers.o + .group 0x0000000000000000 0x8 bin/timers.o + .group 0x0000000000000000 0x8 bin/timers.o + .group 0x0000000000000000 0x8 bin/timers.o + .group 0x0000000000000000 0x8 bin/timers.o + .group 0x0000000000000000 0x8 bin/timers.o .group 0x0000000000000000 0x8 bin/timers.o .group 0x0000000000000000 0x8 bin/timers.o .group 0x0000000000000000 0x8 bin/timers.o @@ -385,25 +455,52 @@ Discarded input sections .text 0x0000000000000000 0x0 bin/timers.o .data 0x0000000000000000 0x0 bin/timers.o .bss 0x0000000000000000 0x0 bin/timers.o + .text.pcTimerGetTimerName + 0x0000000000000000 0x20 bin/timers.o .text.xTimerIsTimerActive - 0x0000000000000000 0x18 bin/timers.o + 0x0000000000000000 0x30 bin/timers.o + .text.vTimerSetTimerID + 0x0000000000000000 0x2c bin/timers.o .debug_macro 0x0000000000000000 0x89e bin/timers.o - .debug_macro 0x0000000000000000 0x46 bin/timers.o + .debug_macro 0x0000000000000000 0x58 bin/timers.o + .debug_macro 0x0000000000000000 0x22 bin/timers.o + .debug_macro 0x0000000000000000 0x35 bin/timers.o + .debug_macro 0x0000000000000000 0x9c bin/timers.o + .debug_macro 0x0000000000000000 0x16 bin/timers.o + .debug_macro 0x0000000000000000 0x10e bin/timers.o + .debug_macro 0x0000000000000000 0x7f bin/timers.o + .debug_macro 0x0000000000000000 0x4a bin/timers.o + .debug_macro 0x0000000000000000 0x52 bin/timers.o + .debug_macro 0x0000000000000000 0x16 bin/timers.o + .debug_macro 0x0000000000000000 0x43 bin/timers.o + .debug_macro 0x0000000000000000 0x180 bin/timers.o + .debug_macro 0x0000000000000000 0x29d bin/timers.o + .debug_macro 0x0000000000000000 0x16 bin/timers.o + .debug_macro 0x0000000000000000 0x29 bin/timers.o + .debug_macro 0x0000000000000000 0x58 bin/timers.o + .debug_macro 0x0000000000000000 0x22 bin/timers.o + .debug_macro 0x0000000000000000 0x1df bin/timers.o .debug_macro 0x0000000000000000 0x22 bin/timers.o .debug_macro 0x0000000000000000 0xca bin/timers.o .debug_macro 0x0000000000000000 0x16 bin/timers.o - .debug_macro 0x0000000000000000 0x168 bin/timers.o + .debug_macro 0x0000000000000000 0x52 bin/timers.o + .debug_macro 0x0000000000000000 0x18a bin/timers.o .debug_macro 0x0000000000000000 0x58 bin/timers.o + .debug_macro 0x0000000000000000 0x16 bin/timers.o + .debug_macro 0x0000000000000000 0x110 bin/timers.o + .debug_macro 0x0000000000000000 0x15d bin/timers.o + .debug_macro 0x0000000000000000 0xe4 bin/timers.o .debug_macro 0x0000000000000000 0x10 bin/timers.o - .debug_macro 0x0000000000000000 0x115 bin/timers.o - .debug_macro 0x0000000000000000 0xa5 bin/timers.o - .debug_macro 0x0000000000000000 0x12 bin/timers.o .debug_macro 0x0000000000000000 0x1f bin/timers.o - .debug_macro 0x0000000000000000 0x1fc bin/timers.o - .debug_macro 0x0000000000000000 0x5e bin/timers.o - .debug_macro 0x0000000000000000 0x57 bin/timers.o - .debug_macro 0x0000000000000000 0x9c bin/timers.o - .debug_macro 0x0000000000000000 0x5b bin/timers.o + .debug_macro 0x0000000000000000 0x3a7 bin/timers.o + .debug_macro 0x0000000000000000 0xc0 bin/timers.o + .debug_macro 0x0000000000000000 0x9a bin/timers.o + .debug_macro 0x0000000000000000 0xb0 bin/timers.o + .debug_macro 0x0000000000000000 0x91 bin/timers.o + .group 0x0000000000000000 0x8 bin/heap_4.o + .group 0x0000000000000000 0x8 bin/heap_4.o + .group 0x0000000000000000 0x8 bin/heap_4.o + .group 0x0000000000000000 0x8 bin/heap_4.o .group 0x0000000000000000 0x8 bin/heap_4.o .group 0x0000000000000000 0x8 bin/heap_4.o .group 0x0000000000000000 0x8 bin/heap_4.o @@ -437,6 +534,8 @@ Discarded input sections .text 0x0000000000000000 0x0 bin/heap_4.o .data 0x0000000000000000 0x0 bin/heap_4.o .bss 0x0000000000000000 0x0 bin/heap_4.o + .text.xPortGetMinimumEverFreeHeapSize + 0x0000000000000000 0xc bin/heap_4.o .text.vPortInitialiseBlocks 0x0000000000000000 0x2 bin/heap_4.o .debug_macro 0x0000000000000000 0x89e bin/heap_4.o @@ -455,20 +554,30 @@ Discarded input sections .debug_macro 0x0000000000000000 0x29d bin/heap_4.o .debug_macro 0x0000000000000000 0x16 bin/heap_4.o .debug_macro 0x0000000000000000 0x29 bin/heap_4.o - .debug_macro 0x0000000000000000 0x46 bin/heap_4.o + .debug_macro 0x0000000000000000 0x58 bin/heap_4.o + .debug_macro 0x0000000000000000 0x22 bin/heap_4.o + .debug_macro 0x0000000000000000 0x1df bin/heap_4.o .debug_macro 0x0000000000000000 0x22 bin/heap_4.o .debug_macro 0x0000000000000000 0xca bin/heap_4.o .debug_macro 0x0000000000000000 0x16 bin/heap_4.o - .debug_macro 0x0000000000000000 0x168 bin/heap_4.o + .debug_macro 0x0000000000000000 0x52 bin/heap_4.o + .debug_macro 0x0000000000000000 0x18a bin/heap_4.o .debug_macro 0x0000000000000000 0x58 bin/heap_4.o + .debug_macro 0x0000000000000000 0x16 bin/heap_4.o + .debug_macro 0x0000000000000000 0x110 bin/heap_4.o + .debug_macro 0x0000000000000000 0x15d bin/heap_4.o + .debug_macro 0x0000000000000000 0xe4 bin/heap_4.o .debug_macro 0x0000000000000000 0x10 bin/heap_4.o - .debug_macro 0x0000000000000000 0x115 bin/heap_4.o - .debug_macro 0x0000000000000000 0xa5 bin/heap_4.o - .debug_macro 0x0000000000000000 0x12 bin/heap_4.o .debug_macro 0x0000000000000000 0x1f bin/heap_4.o - .debug_macro 0x0000000000000000 0x1fc bin/heap_4.o - .debug_macro 0x0000000000000000 0x5e bin/heap_4.o - .debug_macro 0x0000000000000000 0x57 bin/heap_4.o + .debug_macro 0x0000000000000000 0x3a7 bin/heap_4.o + .debug_macro 0x0000000000000000 0xc0 bin/heap_4.o + .debug_macro 0x0000000000000000 0x9a bin/heap_4.o + .group 0x0000000000000000 0x8 bin/port.o + .group 0x0000000000000000 0x8 bin/port.o + .group 0x0000000000000000 0x8 bin/port.o + .group 0x0000000000000000 0x8 bin/port.o + .group 0x0000000000000000 0x8 bin/port.o + .group 0x0000000000000000 0x8 bin/port.o .group 0x0000000000000000 0x8 bin/port.o .group 0x0000000000000000 0x8 bin/port.o .group 0x0000000000000000 0x8 bin/port.o @@ -489,25 +598,27 @@ Discarded input sections .data 0x0000000000000000 0x0 bin/port.o .bss 0x0000000000000000 0x0 bin/port.o .text.vPortEndScheduler - 0x0000000000000000 0x2 bin/port.o - .rodata.ulKernelPriority - 0x0000000000000000 0x4 bin/port.o + 0x0000000000000000 0x24 bin/port.o .debug_macro 0x0000000000000000 0x89e bin/port.o - .debug_macro 0x0000000000000000 0x166 bin/port.o - .debug_macro 0x0000000000000000 0x46 bin/port.o + .debug_macro 0x0000000000000000 0x22 bin/port.o + .debug_macro 0x0000000000000000 0x58 bin/port.o + .debug_macro 0x0000000000000000 0x22 bin/port.o + .debug_macro 0x0000000000000000 0x1df bin/port.o .debug_macro 0x0000000000000000 0x22 bin/port.o .debug_macro 0x0000000000000000 0xca bin/port.o .debug_macro 0x0000000000000000 0x16 bin/port.o - .debug_macro 0x0000000000000000 0x168 bin/port.o + .debug_macro 0x0000000000000000 0x52 bin/port.o + .debug_macro 0x0000000000000000 0x18a bin/port.o .debug_macro 0x0000000000000000 0x58 bin/port.o + .debug_macro 0x0000000000000000 0x16 bin/port.o + .debug_macro 0x0000000000000000 0x110 bin/port.o + .debug_macro 0x0000000000000000 0x15d bin/port.o + .debug_macro 0x0000000000000000 0xe4 bin/port.o .debug_macro 0x0000000000000000 0x10 bin/port.o - .debug_macro 0x0000000000000000 0x115 bin/port.o - .debug_macro 0x0000000000000000 0xa5 bin/port.o - .debug_macro 0x0000000000000000 0x12 bin/port.o .debug_macro 0x0000000000000000 0x1f bin/port.o - .debug_macro 0x0000000000000000 0x1fc bin/port.o - .debug_macro 0x0000000000000000 0x5e bin/port.o - .debug_macro 0x0000000000000000 0x57 bin/port.o + .debug_macro 0x0000000000000000 0x3a7 bin/port.o + .debug_macro 0x0000000000000000 0xc0 bin/port.o + .debug_macro 0x0000000000000000 0x9a bin/port.o .group 0x0000000000000000 0x8 bin/stm32f4xx_adc.o .group 0x0000000000000000 0x8 bin/stm32f4xx_adc.o .group 0x0000000000000000 0x8 bin/stm32f4xx_adc.o @@ -615,7 +726,10 @@ Discarded input sections 0x0000000000000000 0x8 bin/stm32f4xx_adc.o .debug_macro 0x0000000000000000 0x89e bin/stm32f4xx_adc.o .debug_macro 0x0000000000000000 0x22 bin/stm32f4xx_adc.o + .debug_macro 0x0000000000000000 0x44 bin/stm32f4xx_adc.o + .debug_macro 0x0000000000000000 0x58 bin/stm32f4xx_adc.o .debug_macro 0x0000000000000000 0x22 bin/stm32f4xx_adc.o + .debug_macro 0x0000000000000000 0x1df bin/stm32f4xx_adc.o .group 0x0000000000000000 0x8 bin/stm32f4xx_dbgmcu.o .group 0x0000000000000000 0x8 bin/stm32f4xx_dbgmcu.o .group 0x0000000000000000 0x8 bin/stm32f4xx_dbgmcu.o @@ -1338,25 +1452,8 @@ Discarded input sections .text 0x0000000000000000 0x0 bin/stm32f4xx_iwdg.o .data 0x0000000000000000 0x0 bin/stm32f4xx_iwdg.o .bss 0x0000000000000000 0x0 bin/stm32f4xx_iwdg.o - .text.IWDG_WriteAccessCmd - 0x0000000000000000 0xc bin/stm32f4xx_iwdg.o - .text.IWDG_SetPrescaler - 0x0000000000000000 0xc bin/stm32f4xx_iwdg.o - .text.IWDG_SetReload - 0x0000000000000000 0xc bin/stm32f4xx_iwdg.o - .text.IWDG_ReloadCounter - 0x0000000000000000 0x10 bin/stm32f4xx_iwdg.o - .text.IWDG_Enable - 0x0000000000000000 0x10 bin/stm32f4xx_iwdg.o .text.IWDG_GetFlagStatus 0x0000000000000000 0x14 bin/stm32f4xx_iwdg.o - .debug_info 0x0000000000000000 0x211 bin/stm32f4xx_iwdg.o - .debug_abbrev 0x0000000000000000 0x115 bin/stm32f4xx_iwdg.o - .debug_loc 0x0000000000000000 0x62 bin/stm32f4xx_iwdg.o - .debug_aranges - 0x0000000000000000 0x48 bin/stm32f4xx_iwdg.o - .debug_ranges 0x0000000000000000 0x38 bin/stm32f4xx_iwdg.o - .debug_macro 0x0000000000000000 0x1bd bin/stm32f4xx_iwdg.o .debug_macro 0x0000000000000000 0x89e bin/stm32f4xx_iwdg.o .debug_macro 0x0000000000000000 0x5e bin/stm32f4xx_iwdg.o .debug_macro 0x0000000000000000 0x3b bin/stm32f4xx_iwdg.o @@ -1394,13 +1491,6 @@ Discarded input sections .debug_macro 0x0000000000000000 0x149 bin/stm32f4xx_iwdg.o .debug_macro 0x0000000000000000 0x279 bin/stm32f4xx_iwdg.o .debug_macro 0x0000000000000000 0x35 bin/stm32f4xx_iwdg.o - .debug_macro 0x0000000000000000 0x5e bin/stm32f4xx_iwdg.o - .debug_line 0x0000000000000000 0x526 bin/stm32f4xx_iwdg.o - .debug_str 0x0000000000000000 0x5d2eb bin/stm32f4xx_iwdg.o - .comment 0x0000000000000000 0x71 bin/stm32f4xx_iwdg.o - .debug_frame 0x0000000000000000 0x70 bin/stm32f4xx_iwdg.o - .ARM.attributes - 0x0000000000000000 0x39 bin/stm32f4xx_iwdg.o .group 0x0000000000000000 0x8 bin/stm32f4xx_rcc.o .group 0x0000000000000000 0x8 bin/stm32f4xx_rcc.o .group 0x0000000000000000 0x8 bin/stm32f4xx_rcc.o @@ -1522,12 +1612,8 @@ Discarded input sections 0x0000000000000000 0x18 bin/stm32f4xx_rcc.o .text.RCC_ITConfig 0x0000000000000000 0x18 bin/stm32f4xx_rcc.o - .text.RCC_GetFlagStatus - 0x0000000000000000 0x28 bin/stm32f4xx_rcc.o .text.RCC_WaitForHSEStartUp 0x0000000000000000 0x30 bin/stm32f4xx_rcc.o - .text.RCC_ClearFlag - 0x0000000000000000 0x10 bin/stm32f4xx_rcc.o .text.RCC_GetITStatus 0x0000000000000000 0x14 bin/stm32f4xx_rcc.o .text.RCC_ClearITPendingBit @@ -1754,8 +1840,6 @@ Discarded input sections 0x0000000000000000 0x32 bin/stm32f4xx_tim.o .text.TI2_Config 0x0000000000000000 0x3a bin/stm32f4xx_tim.o - .text.TIM_PrescalerConfig - 0x0000000000000000 0x6 bin/stm32f4xx_tim.o .text.TIM_CounterModeConfig 0x0000000000000000 0x10 bin/stm32f4xx_tim.o .text.TIM_SetCounter @@ -2269,30 +2353,32 @@ Discarded input sections .group 0x0000000000000000 0x8 bin/main.o .group 0x0000000000000000 0x8 bin/main.o .group 0x0000000000000000 0x8 bin/main.o + .group 0x0000000000000000 0x8 bin/main.o .text 0x0000000000000000 0x0 bin/main.o .data 0x0000000000000000 0x0 bin/main.o .bss 0x0000000000000000 0x0 bin/main.o .debug_macro 0x0000000000000000 0x89e bin/main.o .debug_macro 0x0000000000000000 0x22 bin/main.o + .debug_macro 0x0000000000000000 0x44 bin/main.o + .debug_macro 0x0000000000000000 0x58 bin/main.o + .debug_macro 0x0000000000000000 0x22 bin/main.o + .debug_macro 0x0000000000000000 0x1df bin/main.o + .debug_macro 0x0000000000000000 0x22 bin/main.o .debug_macro 0x0000000000000000 0xca bin/main.o .debug_macro 0x0000000000000000 0x16 bin/main.o - .debug_macro 0x0000000000000000 0x168 bin/main.o + .debug_macro 0x0000000000000000 0x52 bin/main.o + .debug_macro 0x0000000000000000 0x18a bin/main.o .debug_macro 0x0000000000000000 0x58 bin/main.o - .debug_macro 0x0000000000000000 0x10 bin/main.o - .debug_macro 0x0000000000000000 0x115 bin/main.o + .debug_macro 0x0000000000000000 0x16 bin/main.o + .debug_macro 0x0000000000000000 0x110 bin/main.o .debug_macro 0x0000000000000000 0x166 bin/main.o - .debug_macro 0x0000000000000000 0x46 bin/main.o - .debug_macro 0x0000000000000000 0xa5 bin/main.o - .debug_macro 0x0000000000000000 0x12 bin/main.o + .debug_macro 0x0000000000000000 0x15d bin/main.o + .debug_macro 0x0000000000000000 0xe4 bin/main.o + .debug_macro 0x0000000000000000 0x10 bin/main.o .debug_macro 0x0000000000000000 0x1f bin/main.o - .debug_macro 0x0000000000000000 0x1fc bin/main.o - .debug_macro 0x0000000000000000 0x5e bin/main.o - .debug_macro 0x0000000000000000 0x57 bin/main.o - .debug_macro 0x0000000000000000 0x22 bin/main.o - .debug_macro 0x0000000000000000 0x44 bin/main.o - .debug_macro 0x0000000000000000 0x58 bin/main.o - .debug_macro 0x0000000000000000 0x22 bin/main.o - .debug_macro 0x0000000000000000 0x1df bin/main.o + .debug_macro 0x0000000000000000 0x3a7 bin/main.o + .debug_macro 0x0000000000000000 0xc0 bin/main.o + .debug_macro 0x0000000000000000 0x9a bin/main.o .debug_macro 0x0000000000000000 0x5e bin/main.o .debug_macro 0x0000000000000000 0x3b bin/main.o .debug_macro 0x0000000000000000 0x18 bin/main.o @@ -2368,6 +2454,7 @@ Discarded input sections .group 0x0000000000000000 0x8 bin/exti.o .group 0x0000000000000000 0x8 bin/exti.o .group 0x0000000000000000 0x8 bin/exti.o + .group 0x0000000000000000 0x8 bin/exti.o .text 0x0000000000000000 0x0 bin/exti.o .data 0x0000000000000000 0x0 bin/exti.o .bss 0x0000000000000000 0x0 bin/exti.o @@ -2417,6 +2504,10 @@ Discarded input sections .debug_macro 0x0000000000000000 0x35 bin/exti.o .debug_macro 0x0000000000000000 0xca bin/exti.o .debug_macro 0x0000000000000000 0x16 bin/exti.o + .debug_macro 0x0000000000000000 0x52 bin/exti.o + .debug_macro 0x0000000000000000 0x18a bin/exti.o + .group 0x0000000000000000 0x8 bin/nvic.o + .group 0x0000000000000000 0x8 bin/nvic.o .group 0x0000000000000000 0x8 bin/nvic.o .group 0x0000000000000000 0x8 bin/nvic.o .group 0x0000000000000000 0x8 bin/nvic.o @@ -2474,6 +2565,7 @@ Discarded input sections .debug_macro 0x0000000000000000 0x58 bin/nvic.o .debug_macro 0x0000000000000000 0x22 bin/nvic.o .debug_macro 0x0000000000000000 0x1df bin/nvic.o + .debug_macro 0x0000000000000000 0x3a bin/nvic.o .debug_macro 0x0000000000000000 0x5e bin/nvic.o .debug_macro 0x0000000000000000 0x3b bin/nvic.o .debug_macro 0x0000000000000000 0x18 bin/nvic.o @@ -2566,6 +2658,7 @@ Discarded input sections .group 0x0000000000000000 0x8 bin/motors.o .group 0x0000000000000000 0x8 bin/motors.o .group 0x0000000000000000 0x8 bin/motors.o + .group 0x0000000000000000 0x8 bin/motors.o .text 0x0000000000000000 0x0 bin/motors.o .data 0x0000000000000000 0x0 bin/motors.o .bss 0x0000000000000000 0x0 bin/motors.o @@ -2626,19 +2719,22 @@ Discarded input sections .debug_macro 0x0000000000000000 0x35 bin/motors.o .debug_macro 0x0000000000000000 0xca bin/motors.o .debug_macro 0x0000000000000000 0x16 bin/motors.o - .debug_macro 0x0000000000000000 0x168 bin/motors.o + .debug_macro 0x0000000000000000 0x52 bin/motors.o + .debug_macro 0x0000000000000000 0x18a bin/motors.o .debug_macro 0x0000000000000000 0x166 bin/motors.o - .debug_macro 0x0000000000000000 0x46 bin/motors.o .debug_macro 0x0000000000000000 0x58 bin/motors.o + .debug_macro 0x0000000000000000 0x16 bin/motors.o + .debug_macro 0x0000000000000000 0x110 bin/motors.o + .debug_macro 0x0000000000000000 0x15d bin/motors.o + .debug_macro 0x0000000000000000 0xe4 bin/motors.o .debug_macro 0x0000000000000000 0x10 bin/motors.o - .debug_macro 0x0000000000000000 0x115 bin/motors.o - .debug_macro 0x0000000000000000 0xa5 bin/motors.o - .debug_macro 0x0000000000000000 0x12 bin/motors.o .debug_macro 0x0000000000000000 0x1f bin/motors.o - .debug_macro 0x0000000000000000 0x1fc bin/motors.o - .debug_macro 0x0000000000000000 0x9c bin/motors.o - .debug_macro 0x0000000000000000 0x5e bin/motors.o - .debug_macro 0x0000000000000000 0x57 bin/motors.o + .debug_macro 0x0000000000000000 0x3a7 bin/motors.o + .debug_macro 0x0000000000000000 0xb0 bin/motors.o + .debug_macro 0x0000000000000000 0xc0 bin/motors.o + .debug_macro 0x0000000000000000 0x9a bin/motors.o + .group 0x0000000000000000 0x8 bin/crtp.o + .group 0x0000000000000000 0x8 bin/crtp.o .group 0x0000000000000000 0x8 bin/crtp.o .group 0x0000000000000000 0x8 bin/crtp.o .group 0x0000000000000000 0x8 bin/crtp.o @@ -2681,8 +2777,6 @@ Discarded input sections 0x0000000000000000 0x4c bin/crtp.o .text.crtpSendPacketBlock 0x0000000000000000 0x44 bin/crtp.o - .text.crtpPacketReveived - 0x0000000000000000 0x20 bin/crtp.o .debug_macro 0x0000000000000000 0x89e bin/crtp.o .debug_macro 0x0000000000000000 0x22 bin/crtp.o .debug_macro 0x0000000000000000 0x58 bin/crtp.o @@ -2695,24 +2789,27 @@ Discarded input sections .debug_macro 0x0000000000000000 0x16 bin/crtp.o .debug_macro 0x0000000000000000 0x43 bin/crtp.o .debug_macro 0x0000000000000000 0x180 bin/crtp.o - .debug_macro 0x0000000000000000 0x46 bin/crtp.o + .debug_macro 0x0000000000000000 0x58 bin/crtp.o + .debug_macro 0x0000000000000000 0x22 bin/crtp.o + .debug_macro 0x0000000000000000 0x1df bin/crtp.o .debug_macro 0x0000000000000000 0xca bin/crtp.o .debug_macro 0x0000000000000000 0x16 bin/crtp.o - .debug_macro 0x0000000000000000 0x168 bin/crtp.o + .debug_macro 0x0000000000000000 0x52 bin/crtp.o + .debug_macro 0x0000000000000000 0x18a bin/crtp.o .debug_macro 0x0000000000000000 0x58 bin/crtp.o + .debug_macro 0x0000000000000000 0x16 bin/crtp.o + .debug_macro 0x0000000000000000 0x110 bin/crtp.o + .debug_macro 0x0000000000000000 0x15d bin/crtp.o + .debug_macro 0x0000000000000000 0xe4 bin/crtp.o .debug_macro 0x0000000000000000 0x10 bin/crtp.o - .debug_macro 0x0000000000000000 0x115 bin/crtp.o - .debug_macro 0x0000000000000000 0xa5 bin/crtp.o - .debug_macro 0x0000000000000000 0x12 bin/crtp.o .debug_macro 0x0000000000000000 0x1f bin/crtp.o - .debug_macro 0x0000000000000000 0x1fc bin/crtp.o - .debug_macro 0x0000000000000000 0x5e bin/crtp.o - .debug_macro 0x0000000000000000 0x57 bin/crtp.o - .debug_macro 0x0000000000000000 0x9c bin/crtp.o - .debug_macro 0x0000000000000000 0x78 bin/crtp.o - .debug_macro 0x0000000000000000 0x58 bin/crtp.o - .debug_macro 0x0000000000000000 0x22 bin/crtp.o - .debug_macro 0x0000000000000000 0x1df bin/crtp.o + .debug_macro 0x0000000000000000 0x3a7 bin/crtp.o + .debug_macro 0x0000000000000000 0xc0 bin/crtp.o + .debug_macro 0x0000000000000000 0x9a bin/crtp.o + .debug_macro 0x0000000000000000 0xb0 bin/crtp.o + .debug_macro 0x0000000000000000 0x7f bin/crtp.o + .debug_macro 0x0000000000000000 0x1c bin/crtp.o + .group 0x0000000000000000 0x8 bin/ledseq.o .group 0x0000000000000000 0x8 bin/ledseq.o .group 0x0000000000000000 0x8 bin/ledseq.o .group 0x0000000000000000 0x8 bin/ledseq.o @@ -2755,21 +2852,24 @@ Discarded input sections .debug_macro 0x0000000000000000 0x1df bin/ledseq.o .debug_macro 0x0000000000000000 0xa0 bin/ledseq.o .debug_macro 0x0000000000000000 0x166 bin/ledseq.o - .debug_macro 0x0000000000000000 0x46 bin/ledseq.o .debug_macro 0x0000000000000000 0xca bin/ledseq.o .debug_macro 0x0000000000000000 0x16 bin/ledseq.o - .debug_macro 0x0000000000000000 0x168 bin/ledseq.o + .debug_macro 0x0000000000000000 0x52 bin/ledseq.o + .debug_macro 0x0000000000000000 0x18a bin/ledseq.o .debug_macro 0x0000000000000000 0x58 bin/ledseq.o + .debug_macro 0x0000000000000000 0x16 bin/ledseq.o + .debug_macro 0x0000000000000000 0x110 bin/ledseq.o + .debug_macro 0x0000000000000000 0x15d bin/ledseq.o + .debug_macro 0x0000000000000000 0xe4 bin/ledseq.o .debug_macro 0x0000000000000000 0x10 bin/ledseq.o - .debug_macro 0x0000000000000000 0x115 bin/ledseq.o - .debug_macro 0x0000000000000000 0xa5 bin/ledseq.o - .debug_macro 0x0000000000000000 0x12 bin/ledseq.o .debug_macro 0x0000000000000000 0x1f bin/ledseq.o - .debug_macro 0x0000000000000000 0x1fc bin/ledseq.o - .debug_macro 0x0000000000000000 0x5e bin/ledseq.o - .debug_macro 0x0000000000000000 0x5b bin/ledseq.o - .debug_macro 0x0000000000000000 0x9c bin/ledseq.o - .debug_macro 0x0000000000000000 0x78 bin/ledseq.o + .debug_macro 0x0000000000000000 0x3a7 bin/ledseq.o + .debug_macro 0x0000000000000000 0xc0 bin/ledseq.o + .debug_macro 0x0000000000000000 0x9a bin/ledseq.o + .debug_macro 0x0000000000000000 0x91 bin/ledseq.o + .debug_macro 0x0000000000000000 0xb0 bin/ledseq.o + .debug_macro 0x0000000000000000 0x7f bin/ledseq.o + .group 0x0000000000000000 0x8 bin/freeRTOSdebug.o .group 0x0000000000000000 0x8 bin/freeRTOSdebug.o .group 0x0000000000000000 0x8 bin/freeRTOSdebug.o .group 0x0000000000000000 0x8 bin/freeRTOSdebug.o @@ -2808,22 +2908,77 @@ Discarded input sections .debug_macro 0x0000000000000000 0x22 bin/freeRTOSdebug.o .debug_macro 0x0000000000000000 0xca bin/freeRTOSdebug.o .debug_macro 0x0000000000000000 0x16 bin/freeRTOSdebug.o - .debug_macro 0x0000000000000000 0x168 bin/freeRTOSdebug.o + .debug_macro 0x0000000000000000 0x52 bin/freeRTOSdebug.o + .debug_macro 0x0000000000000000 0x18a bin/freeRTOSdebug.o .debug_macro 0x0000000000000000 0x58 bin/freeRTOSdebug.o - .debug_macro 0x0000000000000000 0x10 bin/freeRTOSdebug.o - .debug_macro 0x0000000000000000 0x115 bin/freeRTOSdebug.o + .debug_macro 0x0000000000000000 0x16 bin/freeRTOSdebug.o + .debug_macro 0x0000000000000000 0x110 bin/freeRTOSdebug.o .debug_macro 0x0000000000000000 0x166 bin/freeRTOSdebug.o - .debug_macro 0x0000000000000000 0x46 bin/freeRTOSdebug.o - .debug_macro 0x0000000000000000 0xa5 bin/freeRTOSdebug.o - .debug_macro 0x0000000000000000 0x12 bin/freeRTOSdebug.o + .debug_macro 0x0000000000000000 0x15d bin/freeRTOSdebug.o + .debug_macro 0x0000000000000000 0xe4 bin/freeRTOSdebug.o + .debug_macro 0x0000000000000000 0x10 bin/freeRTOSdebug.o .debug_macro 0x0000000000000000 0x1f bin/freeRTOSdebug.o - .debug_macro 0x0000000000000000 0x1fc bin/freeRTOSdebug.o - .debug_macro 0x0000000000000000 0x5e bin/freeRTOSdebug.o - .debug_macro 0x0000000000000000 0x57 bin/freeRTOSdebug.o - .debug_macro 0x0000000000000000 0x2e bin/freeRTOSdebug.o - .debug_macro 0x0000000000000000 0x28 bin/freeRTOSdebug.o + .debug_macro 0x0000000000000000 0x3a7 bin/freeRTOSdebug.o + .debug_macro 0x0000000000000000 0xc0 bin/freeRTOSdebug.o + .debug_macro 0x0000000000000000 0x9a bin/freeRTOSdebug.o + .debug_macro 0x0000000000000000 0x3a bin/freeRTOSdebug.o .debug_macro 0x0000000000000000 0xa0 bin/freeRTOSdebug.o COMMON 0x0000000000000000 0x4 bin/freeRTOSdebug.o + .group 0x0000000000000000 0x8 bin/buzzer.o + .group 0x0000000000000000 0x8 bin/buzzer.o + .group 0x0000000000000000 0x8 bin/buzzer.o + .group 0x0000000000000000 0x8 bin/buzzer.o + .group 0x0000000000000000 0x8 bin/buzzer.o + .group 0x0000000000000000 0x8 bin/buzzer.o + .group 0x0000000000000000 0x8 bin/buzzer.o + .text 0x0000000000000000 0x0 bin/buzzer.o + .data 0x0000000000000000 0x0 bin/buzzer.o + .bss 0x0000000000000000 0x0 bin/buzzer.o + .debug_macro 0x0000000000000000 0x89e bin/buzzer.o + .debug_macro 0x0000000000000000 0x22 bin/buzzer.o + .debug_macro 0x0000000000000000 0x44 bin/buzzer.o + .debug_macro 0x0000000000000000 0x58 bin/buzzer.o + .debug_macro 0x0000000000000000 0x22 bin/buzzer.o + .debug_macro 0x0000000000000000 0x1df bin/buzzer.o + .debug_macro 0x0000000000000000 0x22 bin/buzzer.o + .group 0x0000000000000000 0x8 bin/system.o + .group 0x0000000000000000 0x8 bin/system.o + .group 0x0000000000000000 0x8 bin/system.o + .group 0x0000000000000000 0x8 bin/system.o + .group 0x0000000000000000 0x8 bin/system.o + .group 0x0000000000000000 0x8 bin/system.o + .group 0x0000000000000000 0x8 bin/system.o + .group 0x0000000000000000 0x8 bin/system.o + .group 0x0000000000000000 0x8 bin/system.o + .group 0x0000000000000000 0x8 bin/system.o + .group 0x0000000000000000 0x8 bin/system.o + .group 0x0000000000000000 0x8 bin/system.o + .group 0x0000000000000000 0x8 bin/system.o + .group 0x0000000000000000 0x8 bin/system.o + .group 0x0000000000000000 0x8 bin/system.o + .group 0x0000000000000000 0x8 bin/system.o + .group 0x0000000000000000 0x8 bin/system.o + .group 0x0000000000000000 0x8 bin/system.o + .group 0x0000000000000000 0x8 bin/system.o + .group 0x0000000000000000 0x8 bin/system.o + .group 0x0000000000000000 0x8 bin/system.o + .group 0x0000000000000000 0x8 bin/system.o + .group 0x0000000000000000 0x8 bin/system.o + .group 0x0000000000000000 0x8 bin/system.o + .group 0x0000000000000000 0x8 bin/system.o + .group 0x0000000000000000 0x8 bin/system.o + .group 0x0000000000000000 0x8 bin/system.o + .group 0x0000000000000000 0x8 bin/system.o + .group 0x0000000000000000 0x8 bin/system.o + .group 0x0000000000000000 0x8 bin/system.o + .group 0x0000000000000000 0x8 bin/system.o + .group 0x0000000000000000 0x8 bin/system.o + .group 0x0000000000000000 0x8 bin/system.o + .group 0x0000000000000000 0x8 bin/system.o + .group 0x0000000000000000 0x8 bin/system.o + .group 0x0000000000000000 0x8 bin/system.o + .group 0x0000000000000000 0x8 bin/system.o + .group 0x0000000000000000 0x8 bin/system.o .group 0x0000000000000000 0x8 bin/system.o .group 0x0000000000000000 0x8 bin/system.o .group 0x0000000000000000 0x8 bin/system.o @@ -2873,26 +3028,27 @@ Discarded input sections .debug_macro 0x0000000000000000 0x89e bin/system.o .debug_macro 0x0000000000000000 0x22 bin/system.o .debug_macro 0x0000000000000000 0x166 bin/system.o - .debug_macro 0x0000000000000000 0x46 bin/system.o - .debug_macro 0x0000000000000000 0xca bin/system.o - .debug_macro 0x0000000000000000 0x16 bin/system.o - .debug_macro 0x0000000000000000 0x168 bin/system.o - .debug_macro 0x0000000000000000 0x58 bin/system.o - .debug_macro 0x0000000000000000 0x10 bin/system.o - .debug_macro 0x0000000000000000 0x115 bin/system.o - .debug_macro 0x0000000000000000 0xa5 bin/system.o - .debug_macro 0x0000000000000000 0x12 bin/system.o - .debug_macro 0x0000000000000000 0x1f bin/system.o - .debug_macro 0x0000000000000000 0x1fc bin/system.o - .debug_macro 0x0000000000000000 0x5e bin/system.o - .debug_macro 0x0000000000000000 0x57 bin/system.o - .debug_macro 0x0000000000000000 0x9c bin/system.o - .debug_macro 0x0000000000000000 0x78 bin/system.o .debug_macro 0x0000000000000000 0x22 bin/system.o .debug_macro 0x0000000000000000 0x44 bin/system.o .debug_macro 0x0000000000000000 0x58 bin/system.o .debug_macro 0x0000000000000000 0x22 bin/system.o .debug_macro 0x0000000000000000 0x1df bin/system.o + .debug_macro 0x0000000000000000 0xca bin/system.o + .debug_macro 0x0000000000000000 0x16 bin/system.o + .debug_macro 0x0000000000000000 0x52 bin/system.o + .debug_macro 0x0000000000000000 0x18a bin/system.o + .debug_macro 0x0000000000000000 0x58 bin/system.o + .debug_macro 0x0000000000000000 0x16 bin/system.o + .debug_macro 0x0000000000000000 0x110 bin/system.o + .debug_macro 0x0000000000000000 0x15d bin/system.o + .debug_macro 0x0000000000000000 0xe4 bin/system.o + .debug_macro 0x0000000000000000 0x10 bin/system.o + .debug_macro 0x0000000000000000 0x1f bin/system.o + .debug_macro 0x0000000000000000 0x3a7 bin/system.o + .debug_macro 0x0000000000000000 0xc0 bin/system.o + .debug_macro 0x0000000000000000 0x9a bin/system.o + .debug_macro 0x0000000000000000 0xb0 bin/system.o + .debug_macro 0x0000000000000000 0x7f bin/system.o .debug_macro 0x0000000000000000 0xa0 bin/system.o .debug_macro 0x0000000000000000 0x22 bin/system.o .debug_macro 0x0000000000000000 0x94 bin/system.o @@ -2900,6 +3056,40 @@ Discarded input sections .debug_macro 0x0000000000000000 0x1c bin/system.o .debug_macro 0x0000000000000000 0x8f bin/system.o .debug_macro 0x0000000000000000 0x29d bin/system.o + .debug_macro 0x0000000000000000 0x5e bin/system.o + .debug_macro 0x0000000000000000 0x3b bin/system.o + .debug_macro 0x0000000000000000 0x18 bin/system.o + .debug_macro 0x0000000000000000 0x42 bin/system.o + .debug_macro 0x0000000000000000 0xc91 bin/system.o + .debug_macro 0x0000000000000000 0x8bb0 bin/system.o + .debug_macro 0x0000000000000000 0x44f bin/system.o + .debug_macro 0x0000000000000000 0xb2 bin/system.o + .debug_macro 0x0000000000000000 0x477 bin/system.o + .debug_macro 0x0000000000000000 0xae bin/system.o + .debug_macro 0x0000000000000000 0x41c bin/system.o + .debug_macro 0x0000000000000000 0x2bc bin/system.o + .debug_macro 0x0000000000000000 0x2bb bin/system.o + .debug_macro 0x0000000000000000 0x64 bin/system.o + .debug_macro 0x0000000000000000 0xe7 bin/system.o + .debug_macro 0x0000000000000000 0x62f bin/system.o + .debug_macro 0x0000000000000000 0x57b bin/system.o + .debug_macro 0x0000000000000000 0x342 bin/system.o + .debug_macro 0x0000000000000000 0x36c bin/system.o + .debug_macro 0x0000000000000000 0xf7 bin/system.o + .debug_macro 0x0000000000000000 0x73b bin/system.o + .debug_macro 0x0000000000000000 0x223 bin/system.o + .debug_macro 0x0000000000000000 0x34 bin/system.o + .debug_macro 0x0000000000000000 0x82 bin/system.o + .debug_macro 0x0000000000000000 0x144 bin/system.o + .debug_macro 0x0000000000000000 0xc3 bin/system.o + .debug_macro 0x0000000000000000 0x40 bin/system.o + .debug_macro 0x0000000000000000 0x3cf bin/system.o + .debug_macro 0x0000000000000000 0x188 bin/system.o + .debug_macro 0x0000000000000000 0x149 bin/system.o + .debug_macro 0x0000000000000000 0x279 bin/system.o + .debug_macro 0x0000000000000000 0x35 bin/system.o + .debug_macro 0x0000000000000000 0x10 bin/system.o + .group 0x0000000000000000 0x8 bin/comm.o .group 0x0000000000000000 0x8 bin/comm.o .group 0x0000000000000000 0x8 bin/comm.o .group 0x0000000000000000 0x8 bin/comm.o @@ -2923,14 +3113,15 @@ Discarded input sections .debug_macro 0x0000000000000000 0x22 bin/comm.o .debug_macro 0x0000000000000000 0xca bin/comm.o .debug_macro 0x0000000000000000 0x16 bin/comm.o - .debug_macro 0x0000000000000000 0x168 bin/comm.o + .debug_macro 0x0000000000000000 0x52 bin/comm.o + .debug_macro 0x0000000000000000 0x18a bin/comm.o .debug_macro 0x0000000000000000 0x22 bin/comm.o .debug_macro 0x0000000000000000 0x44 bin/comm.o .debug_macro 0x0000000000000000 0x58 bin/comm.o .debug_macro 0x0000000000000000 0x22 bin/comm.o .debug_macro 0x0000000000000000 0x1df bin/comm.o - .debug_macro 0x0000000000000000 0x16 bin/comm.o .debug_macro 0x0000000000000000 0x58 bin/comm.o + .debug_macro 0x0000000000000000 0xa6 bin/comm.o .debug_macro 0x0000000000000000 0x64 bin/comm.o .debug_macro 0x0000000000000000 0x94 bin/comm.o .group 0x0000000000000000 0x8 bin/console.o @@ -2956,7 +3147,6 @@ Discarded input sections .group 0x0000000000000000 0x8 bin/console.o .group 0x0000000000000000 0x8 bin/console.o .group 0x0000000000000000 0x8 bin/console.o - .group 0x0000000000000000 0x8 bin/console.o .text 0x0000000000000000 0x0 bin/console.o .data 0x0000000000000000 0x0 bin/console.o .bss 0x0000000000000000 0x0 bin/console.o @@ -2967,88 +3157,26 @@ Discarded input sections .debug_macro 0x0000000000000000 0x89e bin/console.o .debug_macro 0x0000000000000000 0x22 bin/console.o .debug_macro 0x0000000000000000 0x166 bin/console.o - .debug_macro 0x0000000000000000 0x46 bin/console.o - .debug_macro 0x0000000000000000 0xca bin/console.o - .debug_macro 0x0000000000000000 0x16 bin/console.o - .debug_macro 0x0000000000000000 0x168 bin/console.o - .debug_macro 0x0000000000000000 0x58 bin/console.o - .debug_macro 0x0000000000000000 0x10 bin/console.o - .debug_macro 0x0000000000000000 0x115 bin/console.o - .debug_macro 0x0000000000000000 0xa5 bin/console.o - .debug_macro 0x0000000000000000 0x12 bin/console.o - .debug_macro 0x0000000000000000 0x1f bin/console.o - .debug_macro 0x0000000000000000 0x1fc bin/console.o - .debug_macro 0x0000000000000000 0x5e bin/console.o - .debug_macro 0x0000000000000000 0x57 bin/console.o - .debug_macro 0x0000000000000000 0x9c bin/console.o - .debug_macro 0x0000000000000000 0x78 bin/console.o .debug_macro 0x0000000000000000 0x22 bin/console.o .debug_macro 0x0000000000000000 0x44 bin/console.o .debug_macro 0x0000000000000000 0x58 bin/console.o .debug_macro 0x0000000000000000 0x22 bin/console.o .debug_macro 0x0000000000000000 0x1df bin/console.o + .debug_macro 0x0000000000000000 0xca bin/console.o .debug_macro 0x0000000000000000 0x16 bin/console.o - .group 0x0000000000000000 0x8 bin/pid.o - .group 0x0000000000000000 0x8 bin/pid.o - .group 0x0000000000000000 0x8 bin/pid.o - .group 0x0000000000000000 0x8 bin/pid.o - .group 0x0000000000000000 0x8 bin/pid.o - .group 0x0000000000000000 0x8 bin/pid.o - .group 0x0000000000000000 0x8 bin/pid.o - .group 0x0000000000000000 0x8 bin/pid.o - .group 0x0000000000000000 0x8 bin/pid.o - .group 0x0000000000000000 0x8 bin/pid.o - .group 0x0000000000000000 0x8 bin/pid.o - .group 0x0000000000000000 0x8 bin/pid.o - .group 0x0000000000000000 0x8 bin/pid.o - .group 0x0000000000000000 0x8 bin/pid.o - .group 0x0000000000000000 0x8 bin/pid.o - .group 0x0000000000000000 0x8 bin/pid.o - .group 0x0000000000000000 0x8 bin/pid.o - .group 0x0000000000000000 0x8 bin/pid.o - .group 0x0000000000000000 0x8 bin/pid.o - .group 0x0000000000000000 0x8 bin/pid.o - .group 0x0000000000000000 0x8 bin/pid.o - .group 0x0000000000000000 0x8 bin/pid.o - .group 0x0000000000000000 0x8 bin/pid.o - .group 0x0000000000000000 0x8 bin/pid.o - .group 0x0000000000000000 0x8 bin/pid.o - .group 0x0000000000000000 0x8 bin/pid.o - .group 0x0000000000000000 0x8 bin/pid.o - .group 0x0000000000000000 0x8 bin/pid.o - .group 0x0000000000000000 0x8 bin/pid.o - .group 0x0000000000000000 0x8 bin/pid.o - .group 0x0000000000000000 0x8 bin/pid.o - .group 0x0000000000000000 0x8 bin/pid.o - .group 0x0000000000000000 0x8 bin/pid.o - .group 0x0000000000000000 0x8 bin/pid.o - .group 0x0000000000000000 0x8 bin/pid.o - .group 0x0000000000000000 0x8 bin/pid.o - .group 0x0000000000000000 0x8 bin/pid.o - .group 0x0000000000000000 0x8 bin/pid.o - .group 0x0000000000000000 0x8 bin/pid.o - .group 0x0000000000000000 0x8 bin/pid.o - .group 0x0000000000000000 0x8 bin/pid.o - .group 0x0000000000000000 0x8 bin/pid.o - .group 0x0000000000000000 0x8 bin/pid.o - .group 0x0000000000000000 0x8 bin/pid.o - .group 0x0000000000000000 0x8 bin/pid.o - .group 0x0000000000000000 0x8 bin/pid.o - .group 0x0000000000000000 0x8 bin/pid.o - .group 0x0000000000000000 0x8 bin/pid.o - .group 0x0000000000000000 0x8 bin/pid.o - .group 0x0000000000000000 0x8 bin/pid.o - .group 0x0000000000000000 0x8 bin/pid.o - .group 0x0000000000000000 0x8 bin/pid.o - .group 0x0000000000000000 0x8 bin/pid.o - .group 0x0000000000000000 0x8 bin/pid.o - .group 0x0000000000000000 0x8 bin/pid.o - .group 0x0000000000000000 0x8 bin/pid.o - .group 0x0000000000000000 0x8 bin/pid.o - .group 0x0000000000000000 0x8 bin/pid.o - .group 0x0000000000000000 0x8 bin/pid.o - .group 0x0000000000000000 0x8 bin/pid.o - .group 0x0000000000000000 0x8 bin/pid.o + .debug_macro 0x0000000000000000 0x52 bin/console.o + .debug_macro 0x0000000000000000 0x18a bin/console.o + .debug_macro 0x0000000000000000 0x58 bin/console.o + .debug_macro 0x0000000000000000 0x16 bin/console.o + .debug_macro 0x0000000000000000 0x110 bin/console.o + .debug_macro 0x0000000000000000 0x15d bin/console.o + .debug_macro 0x0000000000000000 0xe4 bin/console.o + .debug_macro 0x0000000000000000 0x10 bin/console.o + .debug_macro 0x0000000000000000 0x1f bin/console.o + .debug_macro 0x0000000000000000 0x3a7 bin/console.o + .debug_macro 0x0000000000000000 0xb0 bin/console.o + .debug_macro 0x0000000000000000 0x7f bin/console.o + .debug_macro 0x0000000000000000 0x1c bin/console.o .group 0x0000000000000000 0x8 bin/pid.o .group 0x0000000000000000 0x8 bin/pid.o .group 0x0000000000000000 0x8 bin/pid.o @@ -3070,68 +3198,7 @@ Discarded input sections .text.pidSetDt 0x0000000000000000 0x6 bin/pid.o .debug_macro 0x0000000000000000 0x89e bin/pid.o - .debug_macro 0x0000000000000000 0x58 bin/pid.o - .debug_macro 0x0000000000000000 0x22 bin/pid.o - .debug_macro 0x0000000000000000 0x35 bin/pid.o - .debug_macro 0x0000000000000000 0x9c bin/pid.o - .debug_macro 0x0000000000000000 0x166 bin/pid.o - .debug_macro 0x0000000000000000 0x4a bin/pid.o - .debug_macro 0x0000000000000000 0x52 bin/pid.o - .debug_macro 0x0000000000000000 0x16 bin/pid.o - .debug_macro 0x0000000000000000 0x43 bin/pid.o - .debug_macro 0x0000000000000000 0x180 bin/pid.o - .debug_macro 0x0000000000000000 0x46 bin/pid.o .debug_macro 0x0000000000000000 0x22 bin/pid.o - .debug_macro 0x0000000000000000 0xca bin/pid.o - .debug_macro 0x0000000000000000 0x16 bin/pid.o - .debug_macro 0x0000000000000000 0x168 bin/pid.o - .debug_macro 0x0000000000000000 0x58 bin/pid.o - .debug_macro 0x0000000000000000 0x10 bin/pid.o - .debug_macro 0x0000000000000000 0x115 bin/pid.o - .debug_macro 0x0000000000000000 0xa5 bin/pid.o - .debug_macro 0x0000000000000000 0x12 bin/pid.o - .debug_macro 0x0000000000000000 0x1f bin/pid.o - .debug_macro 0x0000000000000000 0x1fc bin/pid.o - .debug_macro 0x0000000000000000 0x5e bin/pid.o - .debug_macro 0x0000000000000000 0x57 bin/pid.o - .debug_macro 0x0000000000000000 0xa0 bin/pid.o - .debug_macro 0x0000000000000000 0x58 bin/pid.o - .debug_macro 0x0000000000000000 0x22 bin/pid.o - .debug_macro 0x0000000000000000 0x1df bin/pid.o - .debug_macro 0x0000000000000000 0x5e bin/pid.o - .debug_macro 0x0000000000000000 0x3b bin/pid.o - .debug_macro 0x0000000000000000 0x18 bin/pid.o - .debug_macro 0x0000000000000000 0x42 bin/pid.o - .debug_macro 0x0000000000000000 0xc91 bin/pid.o - .debug_macro 0x0000000000000000 0x8bb0 bin/pid.o - .debug_macro 0x0000000000000000 0x44f bin/pid.o - .debug_macro 0x0000000000000000 0xb2 bin/pid.o - .debug_macro 0x0000000000000000 0x477 bin/pid.o - .debug_macro 0x0000000000000000 0xae bin/pid.o - .debug_macro 0x0000000000000000 0x41c bin/pid.o - .debug_macro 0x0000000000000000 0x2bc bin/pid.o - .debug_macro 0x0000000000000000 0x2bb bin/pid.o - .debug_macro 0x0000000000000000 0x64 bin/pid.o - .debug_macro 0x0000000000000000 0xe7 bin/pid.o - .debug_macro 0x0000000000000000 0x62f bin/pid.o - .debug_macro 0x0000000000000000 0x57b bin/pid.o - .debug_macro 0x0000000000000000 0x342 bin/pid.o - .debug_macro 0x0000000000000000 0x36c bin/pid.o - .debug_macro 0x0000000000000000 0xf7 bin/pid.o - .debug_macro 0x0000000000000000 0x73b bin/pid.o - .debug_macro 0x0000000000000000 0x223 bin/pid.o - .debug_macro 0x0000000000000000 0x34 bin/pid.o - .debug_macro 0x0000000000000000 0x82 bin/pid.o - .debug_macro 0x0000000000000000 0x144 bin/pid.o - .debug_macro 0x0000000000000000 0xc3 bin/pid.o - .debug_macro 0x0000000000000000 0x40 bin/pid.o - .debug_macro 0x0000000000000000 0x3cf bin/pid.o - .debug_macro 0x0000000000000000 0x188 bin/pid.o - .debug_macro 0x0000000000000000 0x149 bin/pid.o - .debug_macro 0x0000000000000000 0x279 bin/pid.o - .debug_macro 0x0000000000000000 0x35 bin/pid.o - .debug_macro 0x0000000000000000 0x207 bin/pid.o - .group 0x0000000000000000 0x8 bin/crtpservice.o .group 0x0000000000000000 0x8 bin/crtpservice.o .group 0x0000000000000000 0x8 bin/crtpservice.o .group 0x0000000000000000 0x8 bin/crtpservice.o @@ -3180,23 +3247,23 @@ Discarded input sections .debug_macro 0x0000000000000000 0x180 bin/crtpservice.o .debug_macro 0x0000000000000000 0x29d bin/crtpservice.o .debug_macro 0x0000000000000000 0x35 bin/crtpservice.o - .debug_macro 0x0000000000000000 0x46 bin/crtpservice.o + .debug_macro 0x0000000000000000 0x58 bin/crtpservice.o + .debug_macro 0x0000000000000000 0x22 bin/crtpservice.o + .debug_macro 0x0000000000000000 0x1df bin/crtpservice.o .debug_macro 0x0000000000000000 0xca bin/crtpservice.o .debug_macro 0x0000000000000000 0x16 bin/crtpservice.o - .debug_macro 0x0000000000000000 0x168 bin/crtpservice.o + .debug_macro 0x0000000000000000 0x52 bin/crtpservice.o + .debug_macro 0x0000000000000000 0x18a bin/crtpservice.o .debug_macro 0x0000000000000000 0x58 bin/crtpservice.o + .debug_macro 0x0000000000000000 0x16 bin/crtpservice.o + .debug_macro 0x0000000000000000 0x110 bin/crtpservice.o + .debug_macro 0x0000000000000000 0x15d bin/crtpservice.o + .debug_macro 0x0000000000000000 0xe4 bin/crtpservice.o .debug_macro 0x0000000000000000 0x10 bin/crtpservice.o - .debug_macro 0x0000000000000000 0x115 bin/crtpservice.o - .debug_macro 0x0000000000000000 0xa5 bin/crtpservice.o - .debug_macro 0x0000000000000000 0x12 bin/crtpservice.o .debug_macro 0x0000000000000000 0x1f bin/crtpservice.o - .debug_macro 0x0000000000000000 0x1fc bin/crtpservice.o - .debug_macro 0x0000000000000000 0x5e bin/crtpservice.o - .debug_macro 0x0000000000000000 0x57 bin/crtpservice.o - .debug_macro 0x0000000000000000 0x58 bin/crtpservice.o - .debug_macro 0x0000000000000000 0x22 bin/crtpservice.o - .debug_macro 0x0000000000000000 0x1df bin/crtpservice.o - .debug_macro 0x0000000000000000 0x16 bin/crtpservice.o + .debug_macro 0x0000000000000000 0x3a7 bin/crtpservice.o + .debug_macro 0x0000000000000000 0x1c bin/crtpservice.o + .group 0x0000000000000000 0x8 bin/param.o .group 0x0000000000000000 0x8 bin/param.o .group 0x0000000000000000 0x8 bin/param.o .group 0x0000000000000000 0x8 bin/param.o @@ -3251,24 +3318,25 @@ Discarded input sections .debug_macro 0x0000000000000000 0x10 bin/param.o .debug_macro 0x0000000000000000 0x35 bin/param.o .debug_macro 0x0000000000000000 0x10 bin/param.o - .debug_macro 0x0000000000000000 0x46 bin/param.o + .debug_macro 0x0000000000000000 0x58 bin/param.o + .debug_macro 0x0000000000000000 0x22 bin/param.o + .debug_macro 0x0000000000000000 0x1df bin/param.o .debug_macro 0x0000000000000000 0x22 bin/param.o .debug_macro 0x0000000000000000 0xca bin/param.o .debug_macro 0x0000000000000000 0x16 bin/param.o - .debug_macro 0x0000000000000000 0x168 bin/param.o + .debug_macro 0x0000000000000000 0x52 bin/param.o + .debug_macro 0x0000000000000000 0x18a bin/param.o .debug_macro 0x0000000000000000 0x58 bin/param.o + .debug_macro 0x0000000000000000 0x16 bin/param.o + .debug_macro 0x0000000000000000 0x110 bin/param.o + .debug_macro 0x0000000000000000 0x15d bin/param.o + .debug_macro 0x0000000000000000 0xe4 bin/param.o .debug_macro 0x0000000000000000 0x10 bin/param.o - .debug_macro 0x0000000000000000 0x115 bin/param.o - .debug_macro 0x0000000000000000 0xa5 bin/param.o - .debug_macro 0x0000000000000000 0x12 bin/param.o .debug_macro 0x0000000000000000 0x1f bin/param.o - .debug_macro 0x0000000000000000 0x1fc bin/param.o - .debug_macro 0x0000000000000000 0x5e bin/param.o - .debug_macro 0x0000000000000000 0x57 bin/param.o - .debug_macro 0x0000000000000000 0x58 bin/param.o - .debug_macro 0x0000000000000000 0x22 bin/param.o - .debug_macro 0x0000000000000000 0x1df bin/param.o - .debug_macro 0x0000000000000000 0x16 bin/param.o + .debug_macro 0x0000000000000000 0x3a7 bin/param.o + .debug_macro 0x0000000000000000 0xc0 bin/param.o + .debug_macro 0x0000000000000000 0x9a bin/param.o + .debug_macro 0x0000000000000000 0x1c bin/param.o .debug_macro 0x0000000000000000 0xa6 bin/param.o .group 0x0000000000000000 0x8 bin/mem.o .group 0x0000000000000000 0x8 bin/mem.o @@ -3345,6 +3413,11 @@ Discarded input sections .group 0x0000000000000000 0x8 bin/mem.o .group 0x0000000000000000 0x8 bin/mem.o .group 0x0000000000000000 0x8 bin/mem.o + .group 0x0000000000000000 0x8 bin/mem.o + .group 0x0000000000000000 0x8 bin/mem.o + .group 0x0000000000000000 0x8 bin/mem.o + .group 0x0000000000000000 0x8 bin/mem.o + .group 0x0000000000000000 0x8 bin/mem.o .text 0x0000000000000000 0x0 bin/mem.o .data 0x0000000000000000 0x0 bin/mem.o .bss 0x0000000000000000 0x0 bin/mem.o @@ -3368,25 +3441,28 @@ Discarded input sections .debug_macro 0x0000000000000000 0x22 bin/mem.o .debug_macro 0x0000000000000000 0x1df bin/mem.o .debug_macro 0x0000000000000000 0x22 bin/mem.o - .debug_macro 0x0000000000000000 0x46 bin/mem.o .debug_macro 0x0000000000000000 0xca bin/mem.o .debug_macro 0x0000000000000000 0x16 bin/mem.o - .debug_macro 0x0000000000000000 0x168 bin/mem.o + .debug_macro 0x0000000000000000 0x52 bin/mem.o + .debug_macro 0x0000000000000000 0x18a bin/mem.o .debug_macro 0x0000000000000000 0x58 bin/mem.o + .debug_macro 0x0000000000000000 0x16 bin/mem.o + .debug_macro 0x0000000000000000 0x110 bin/mem.o + .debug_macro 0x0000000000000000 0x15d bin/mem.o + .debug_macro 0x0000000000000000 0xe4 bin/mem.o .debug_macro 0x0000000000000000 0x10 bin/mem.o - .debug_macro 0x0000000000000000 0x115 bin/mem.o - .debug_macro 0x0000000000000000 0xa5 bin/mem.o - .debug_macro 0x0000000000000000 0x12 bin/mem.o .debug_macro 0x0000000000000000 0x1f bin/mem.o - .debug_macro 0x0000000000000000 0x1fc bin/mem.o - .debug_macro 0x0000000000000000 0x5e bin/mem.o - .debug_macro 0x0000000000000000 0x57 bin/mem.o - .debug_macro 0x0000000000000000 0x5b bin/mem.o - .debug_macro 0x0000000000000000 0x9c bin/mem.o - .debug_macro 0x0000000000000000 0x78 bin/mem.o + .debug_macro 0x0000000000000000 0x3a7 bin/mem.o + .debug_macro 0x0000000000000000 0xc0 bin/mem.o + .debug_macro 0x0000000000000000 0x9a bin/mem.o + .debug_macro 0x0000000000000000 0x91 bin/mem.o + .debug_macro 0x0000000000000000 0xb0 bin/mem.o + .debug_macro 0x0000000000000000 0x7f bin/mem.o .debug_macro 0x0000000000000000 0x1c bin/mem.o .debug_macro 0x0000000000000000 0x94 bin/mem.o - .debug_macro 0x0000000000000000 0x168 bin/mem.o + .debug_macro 0x0000000000000000 0x137 bin/mem.o + .debug_macro 0x0000000000000000 0x3a bin/mem.o + .debug_macro 0x0000000000000000 0x35 bin/mem.o .debug_macro 0x0000000000000000 0x5e bin/mem.o .debug_macro 0x0000000000000000 0x3b bin/mem.o .debug_macro 0x0000000000000000 0x18 bin/mem.o @@ -3421,6 +3497,8 @@ Discarded input sections .debug_macro 0x0000000000000000 0x35 bin/mem.o .debug_macro 0x0000000000000000 0x74 bin/mem.o .debug_macro 0x0000000000000000 0x34 bin/mem.o + .debug_macro 0x0000000000000000 0x2e bin/mem.o + .group 0x0000000000000000 0x8 bin/commander.o .group 0x0000000000000000 0x8 bin/commander.o .group 0x0000000000000000 0x8 bin/commander.o .group 0x0000000000000000 0x8 bin/commander.o @@ -3454,25 +3532,26 @@ Discarded input sections 0x0000000000000000 0x2c bin/commander.o .debug_macro 0x0000000000000000 0x89e bin/commander.o .debug_macro 0x0000000000000000 0x166 bin/commander.o - .debug_macro 0x0000000000000000 0x46 bin/commander.o + .debug_macro 0x0000000000000000 0x22 bin/commander.o + .debug_macro 0x0000000000000000 0x44 bin/commander.o + .debug_macro 0x0000000000000000 0x58 bin/commander.o + .debug_macro 0x0000000000000000 0x22 bin/commander.o + .debug_macro 0x0000000000000000 0x1df bin/commander.o .debug_macro 0x0000000000000000 0x22 bin/commander.o .debug_macro 0x0000000000000000 0xca bin/commander.o .debug_macro 0x0000000000000000 0x16 bin/commander.o - .debug_macro 0x0000000000000000 0x168 bin/commander.o + .debug_macro 0x0000000000000000 0x52 bin/commander.o + .debug_macro 0x0000000000000000 0x18a bin/commander.o .debug_macro 0x0000000000000000 0x58 bin/commander.o + .debug_macro 0x0000000000000000 0x16 bin/commander.o + .debug_macro 0x0000000000000000 0x110 bin/commander.o + .debug_macro 0x0000000000000000 0x15d bin/commander.o + .debug_macro 0x0000000000000000 0xe4 bin/commander.o .debug_macro 0x0000000000000000 0x10 bin/commander.o - .debug_macro 0x0000000000000000 0x115 bin/commander.o - .debug_macro 0x0000000000000000 0xa5 bin/commander.o - .debug_macro 0x0000000000000000 0x12 bin/commander.o .debug_macro 0x0000000000000000 0x1f bin/commander.o - .debug_macro 0x0000000000000000 0x1fc bin/commander.o - .debug_macro 0x0000000000000000 0x5e bin/commander.o - .debug_macro 0x0000000000000000 0x57 bin/commander.o - .debug_macro 0x0000000000000000 0x22 bin/commander.o - .debug_macro 0x0000000000000000 0x44 bin/commander.o - .debug_macro 0x0000000000000000 0x58 bin/commander.o - .debug_macro 0x0000000000000000 0x22 bin/commander.o - .debug_macro 0x0000000000000000 0x1df bin/commander.o + .debug_macro 0x0000000000000000 0x3a7 bin/commander.o + .debug_macro 0x0000000000000000 0xc0 bin/commander.o + .debug_macro 0x0000000000000000 0x9a bin/commander.o .debug_macro 0x0000000000000000 0x1c bin/commander.o .debug_macro 0x0000000000000000 0xa6 bin/commander.o .group 0x0000000000000000 0x8 bin/controller.o @@ -3500,33 +3579,30 @@ Discarded input sections .group 0x0000000000000000 0x8 bin/controller.o .group 0x0000000000000000 0x8 bin/controller.o .group 0x0000000000000000 0x8 bin/controller.o - .group 0x0000000000000000 0x8 bin/controller.o .text 0x0000000000000000 0x0 bin/controller.o .data 0x0000000000000000 0x0 bin/controller.o .bss 0x0000000000000000 0x0 bin/controller.o .debug_macro 0x0000000000000000 0x89e bin/controller.o .debug_macro 0x0000000000000000 0x22 bin/controller.o .debug_macro 0x0000000000000000 0x166 bin/controller.o - .debug_macro 0x0000000000000000 0x46 bin/controller.o - .debug_macro 0x0000000000000000 0xca bin/controller.o - .debug_macro 0x0000000000000000 0x16 bin/controller.o - .debug_macro 0x0000000000000000 0x168 bin/controller.o - .debug_macro 0x0000000000000000 0x58 bin/controller.o - .debug_macro 0x0000000000000000 0x10 bin/controller.o - .debug_macro 0x0000000000000000 0x115 bin/controller.o - .debug_macro 0x0000000000000000 0xa5 bin/controller.o - .debug_macro 0x0000000000000000 0x12 bin/controller.o - .debug_macro 0x0000000000000000 0x1f bin/controller.o - .debug_macro 0x0000000000000000 0x1fc bin/controller.o - .debug_macro 0x0000000000000000 0x5e bin/controller.o - .debug_macro 0x0000000000000000 0x57 bin/controller.o .debug_macro 0x0000000000000000 0x22 bin/controller.o .debug_macro 0x0000000000000000 0x44 bin/controller.o .debug_macro 0x0000000000000000 0x58 bin/controller.o .debug_macro 0x0000000000000000 0x22 bin/controller.o .debug_macro 0x0000000000000000 0x1df bin/controller.o + .debug_macro 0x0000000000000000 0xca bin/controller.o + .debug_macro 0x0000000000000000 0x16 bin/controller.o + .debug_macro 0x0000000000000000 0x52 bin/controller.o + .debug_macro 0x0000000000000000 0x18a bin/controller.o + .debug_macro 0x0000000000000000 0x58 bin/controller.o + .debug_macro 0x0000000000000000 0x16 bin/controller.o + .debug_macro 0x0000000000000000 0x110 bin/controller.o + .debug_macro 0x0000000000000000 0x15d bin/controller.o + .debug_macro 0x0000000000000000 0xe4 bin/controller.o + .debug_macro 0x0000000000000000 0x10 bin/controller.o + .debug_macro 0x0000000000000000 0x1f bin/controller.o + .debug_macro 0x0000000000000000 0x3a7 bin/controller.o .debug_macro 0x0000000000000000 0x16 bin/controller.o - .debug_macro 0x0000000000000000 0xa0 bin/controller.o .debug_macro 0x0000000000000000 0xa6 bin/controller.o .group 0x0000000000000000 0x8 bin/sensfusion6.o .group 0x0000000000000000 0x8 bin/sensfusion6.o @@ -3545,7 +3621,6 @@ Discarded input sections .group 0x0000000000000000 0x8 bin/sensfusion6.o .group 0x0000000000000000 0x8 bin/sensfusion6.o .group 0x0000000000000000 0x8 bin/sensfusion6.o - .group 0x0000000000000000 0x8 bin/sensfusion6.o .text 0x0000000000000000 0x0 bin/sensfusion6.o .data 0x0000000000000000 0x0 bin/sensfusion6.o .bss 0x0000000000000000 0x0 bin/sensfusion6.o @@ -3560,13 +3635,12 @@ Discarded input sections .debug_macro 0x0000000000000000 0x16 bin/sensfusion6.o .debug_macro 0x0000000000000000 0x43 bin/sensfusion6.o .debug_macro 0x0000000000000000 0x180 bin/sensfusion6.o - .debug_macro 0x0000000000000000 0x1e1 bin/sensfusion6.o .debug_macro 0x0000000000000000 0x22 bin/sensfusion6.o .debug_macro 0x0000000000000000 0x58 bin/sensfusion6.o .debug_macro 0x0000000000000000 0x22 bin/sensfusion6.o .debug_macro 0x0000000000000000 0x1df bin/sensfusion6.o - .debug_macro 0x0000000000000000 0x22 bin/sensfusion6.o - .debug_macro 0x0000000000000000 0xa6 bin/sensfusion6.o + .group 0x0000000000000000 0x8 bin/stabilizer.o + .group 0x0000000000000000 0x8 bin/stabilizer.o .group 0x0000000000000000 0x8 bin/stabilizer.o .group 0x0000000000000000 0x8 bin/stabilizer.o .group 0x0000000000000000 0x8 bin/stabilizer.o @@ -3662,25 +3736,26 @@ Discarded input sections .debug_macro 0x0000000000000000 0x43 bin/stabilizer.o .debug_macro 0x0000000000000000 0x180 bin/stabilizer.o .debug_macro 0x0000000000000000 0x1e1 bin/stabilizer.o - .debug_macro 0x0000000000000000 0x46 bin/stabilizer.o + .debug_macro 0x0000000000000000 0x58 bin/stabilizer.o + .debug_macro 0x0000000000000000 0x22 bin/stabilizer.o + .debug_macro 0x0000000000000000 0x1df bin/stabilizer.o .debug_macro 0x0000000000000000 0x22 bin/stabilizer.o .debug_macro 0x0000000000000000 0xca bin/stabilizer.o .debug_macro 0x0000000000000000 0x16 bin/stabilizer.o - .debug_macro 0x0000000000000000 0x168 bin/stabilizer.o + .debug_macro 0x0000000000000000 0x52 bin/stabilizer.o + .debug_macro 0x0000000000000000 0x18a bin/stabilizer.o .debug_macro 0x0000000000000000 0x58 bin/stabilizer.o + .debug_macro 0x0000000000000000 0x16 bin/stabilizer.o + .debug_macro 0x0000000000000000 0x110 bin/stabilizer.o + .debug_macro 0x0000000000000000 0x15d bin/stabilizer.o + .debug_macro 0x0000000000000000 0xe4 bin/stabilizer.o .debug_macro 0x0000000000000000 0x10 bin/stabilizer.o - .debug_macro 0x0000000000000000 0x115 bin/stabilizer.o - .debug_macro 0x0000000000000000 0xa5 bin/stabilizer.o - .debug_macro 0x0000000000000000 0x12 bin/stabilizer.o .debug_macro 0x0000000000000000 0x1f bin/stabilizer.o - .debug_macro 0x0000000000000000 0x1fc bin/stabilizer.o - .debug_macro 0x0000000000000000 0x5e bin/stabilizer.o - .debug_macro 0x0000000000000000 0x57 bin/stabilizer.o - .debug_macro 0x0000000000000000 0x58 bin/stabilizer.o - .debug_macro 0x0000000000000000 0x22 bin/stabilizer.o - .debug_macro 0x0000000000000000 0x1df bin/stabilizer.o - .debug_macro 0x0000000000000000 0x9c bin/stabilizer.o - .debug_macro 0x0000000000000000 0x78 bin/stabilizer.o + .debug_macro 0x0000000000000000 0x3a7 bin/stabilizer.o + .debug_macro 0x0000000000000000 0xc0 bin/stabilizer.o + .debug_macro 0x0000000000000000 0x9a bin/stabilizer.o + .debug_macro 0x0000000000000000 0xb0 bin/stabilizer.o + .debug_macro 0x0000000000000000 0x7f bin/stabilizer.o .debug_macro 0x0000000000000000 0x40 bin/stabilizer.o .debug_macro 0x0000000000000000 0x94 bin/stabilizer.o .debug_macro 0x0000000000000000 0x4c bin/stabilizer.o @@ -3722,13 +3797,14 @@ Discarded input sections .debug_macro 0x0000000000000000 0x207 bin/stabilizer.o .debug_macro 0x0000000000000000 0x64 bin/stabilizer.o .debug_macro 0x0000000000000000 0xa0 bin/stabilizer.o - .debug_macro 0x0000000000000000 0xa0 bin/stabilizer.o - .debug_macro 0x0000000000000000 0x22 bin/stabilizer.o .debug_macro 0x0000000000000000 0xa6 bin/stabilizer.o - .debug_macro 0x0000000000000000 0x2e bin/stabilizer.o - .debug_macro 0x0000000000000000 0x168 bin/stabilizer.o + .debug_macro 0x0000000000000000 0x137 bin/stabilizer.o + .debug_macro 0x0000000000000000 0x3a bin/stabilizer.o + .debug_macro 0x0000000000000000 0x35 bin/stabilizer.o .debug_macro 0x0000000000000000 0x74 bin/stabilizer.o .debug_macro 0x0000000000000000 0x34 bin/stabilizer.o + .debug_macro 0x0000000000000000 0xa0 bin/stabilizer.o + .group 0x0000000000000000 0x8 bin/log.o .group 0x0000000000000000 0x8 bin/log.o .group 0x0000000000000000 0x8 bin/log.o .group 0x0000000000000000 0x8 bin/log.o @@ -3794,22 +3870,23 @@ Discarded input sections .debug_macro 0x0000000000000000 0x22 bin/log.o .debug_macro 0x0000000000000000 0x1df bin/log.o .debug_macro 0x0000000000000000 0x22 bin/log.o - .debug_macro 0x0000000000000000 0x46 bin/log.o .debug_macro 0x0000000000000000 0xca bin/log.o .debug_macro 0x0000000000000000 0x16 bin/log.o - .debug_macro 0x0000000000000000 0x168 bin/log.o + .debug_macro 0x0000000000000000 0x52 bin/log.o + .debug_macro 0x0000000000000000 0x18a bin/log.o .debug_macro 0x0000000000000000 0x58 bin/log.o + .debug_macro 0x0000000000000000 0x16 bin/log.o + .debug_macro 0x0000000000000000 0x110 bin/log.o + .debug_macro 0x0000000000000000 0x15d bin/log.o + .debug_macro 0x0000000000000000 0xe4 bin/log.o .debug_macro 0x0000000000000000 0x10 bin/log.o - .debug_macro 0x0000000000000000 0x115 bin/log.o - .debug_macro 0x0000000000000000 0xa5 bin/log.o - .debug_macro 0x0000000000000000 0x12 bin/log.o .debug_macro 0x0000000000000000 0x1f bin/log.o - .debug_macro 0x0000000000000000 0x1fc bin/log.o - .debug_macro 0x0000000000000000 0x5e bin/log.o - .debug_macro 0x0000000000000000 0x57 bin/log.o - .debug_macro 0x0000000000000000 0x5b bin/log.o - .debug_macro 0x0000000000000000 0x9c bin/log.o - .debug_macro 0x0000000000000000 0x78 bin/log.o + .debug_macro 0x0000000000000000 0x3a7 bin/log.o + .debug_macro 0x0000000000000000 0xc0 bin/log.o + .debug_macro 0x0000000000000000 0x9a bin/log.o + .debug_macro 0x0000000000000000 0x91 bin/log.o + .debug_macro 0x0000000000000000 0xb0 bin/log.o + .debug_macro 0x0000000000000000 0x7f bin/log.o .debug_macro 0x0000000000000000 0x1c bin/log.o .debug_macro 0x0000000000000000 0x64 bin/log.o .debug_macro 0x0000000000000000 0x46 bin/log.o @@ -3841,6 +3918,11 @@ Discarded input sections .group 0x0000000000000000 0x8 bin/worker.o .group 0x0000000000000000 0x8 bin/worker.o .group 0x0000000000000000 0x8 bin/worker.o + .group 0x0000000000000000 0x8 bin/worker.o + .group 0x0000000000000000 0x8 bin/worker.o + .group 0x0000000000000000 0x8 bin/worker.o + .group 0x0000000000000000 0x8 bin/worker.o + .group 0x0000000000000000 0x8 bin/worker.o .text 0x0000000000000000 0x0 bin/worker.o .data 0x0000000000000000 0x0 bin/worker.o .bss 0x0000000000000000 0x0 bin/worker.o @@ -3858,20 +3940,25 @@ Discarded input sections .debug_macro 0x0000000000000000 0x43 bin/worker.o .debug_macro 0x0000000000000000 0x180 bin/worker.o .debug_macro 0x0000000000000000 0x23b bin/worker.o - .debug_macro 0x0000000000000000 0x46 bin/worker.o + .debug_macro 0x0000000000000000 0x58 bin/worker.o + .debug_macro 0x0000000000000000 0x22 bin/worker.o + .debug_macro 0x0000000000000000 0x1df bin/worker.o .debug_macro 0x0000000000000000 0xca bin/worker.o .debug_macro 0x0000000000000000 0x16 bin/worker.o - .debug_macro 0x0000000000000000 0x168 bin/worker.o + .debug_macro 0x0000000000000000 0x52 bin/worker.o + .debug_macro 0x0000000000000000 0x18a bin/worker.o .debug_macro 0x0000000000000000 0x58 bin/worker.o + .debug_macro 0x0000000000000000 0x16 bin/worker.o + .debug_macro 0x0000000000000000 0x110 bin/worker.o + .debug_macro 0x0000000000000000 0x15d bin/worker.o + .debug_macro 0x0000000000000000 0xe4 bin/worker.o .debug_macro 0x0000000000000000 0x10 bin/worker.o - .debug_macro 0x0000000000000000 0x115 bin/worker.o - .debug_macro 0x0000000000000000 0xa5 bin/worker.o - .debug_macro 0x0000000000000000 0x12 bin/worker.o .debug_macro 0x0000000000000000 0x1f bin/worker.o - .debug_macro 0x0000000000000000 0x1fc bin/worker.o - .debug_macro 0x0000000000000000 0x5e bin/worker.o - .debug_macro 0x0000000000000000 0x57 bin/worker.o - .debug_macro 0x0000000000000000 0x9c bin/worker.o + .debug_macro 0x0000000000000000 0x3a7 bin/worker.o + .debug_macro 0x0000000000000000 0xc0 bin/worker.o + .debug_macro 0x0000000000000000 0x9a bin/worker.o + .debug_macro 0x0000000000000000 0xb0 bin/worker.o + .debug_macro 0x0000000000000000 0x10 bin/worker.o .group 0x0000000000000000 0x8 bin/trigger.o .group 0x0000000000000000 0x8 bin/trigger.o .group 0x0000000000000000 0x8 bin/trigger.o @@ -4094,6 +4181,59 @@ Discarded input sections .debug_frame 0x0000000000000000 0x130 bin/sitaw.o .ARM.attributes 0x0000000000000000 0x39 bin/sitaw.o + .group 0x0000000000000000 0x8 bin/queuemonitor.o + .group 0x0000000000000000 0x8 bin/queuemonitor.o + .group 0x0000000000000000 0x8 bin/queuemonitor.o + .group 0x0000000000000000 0x8 bin/queuemonitor.o + .group 0x0000000000000000 0x8 bin/queuemonitor.o + .group 0x0000000000000000 0x8 bin/queuemonitor.o + .group 0x0000000000000000 0x8 bin/queuemonitor.o + .group 0x0000000000000000 0x8 bin/queuemonitor.o + .group 0x0000000000000000 0x8 bin/queuemonitor.o + .group 0x0000000000000000 0x8 bin/queuemonitor.o + .group 0x0000000000000000 0x8 bin/queuemonitor.o + .group 0x0000000000000000 0x8 bin/queuemonitor.o + .group 0x0000000000000000 0x8 bin/queuemonitor.o + .group 0x0000000000000000 0x8 bin/queuemonitor.o + .group 0x0000000000000000 0x8 bin/queuemonitor.o + .group 0x0000000000000000 0x8 bin/queuemonitor.o + .group 0x0000000000000000 0x8 bin/queuemonitor.o + .group 0x0000000000000000 0x8 bin/queuemonitor.o + .group 0x0000000000000000 0x8 bin/queuemonitor.o + .group 0x0000000000000000 0x8 bin/queuemonitor.o + .text 0x0000000000000000 0x0 bin/queuemonitor.o + .data 0x0000000000000000 0x0 bin/queuemonitor.o + .bss 0x0000000000000000 0x0 bin/queuemonitor.o + .debug_info 0x0000000000000000 0x68 bin/queuemonitor.o + .debug_abbrev 0x0000000000000000 0x29 bin/queuemonitor.o + .debug_aranges + 0x0000000000000000 0x18 bin/queuemonitor.o + .debug_macro 0x0000000000000000 0x12b bin/queuemonitor.o + .debug_macro 0x0000000000000000 0x89e bin/queuemonitor.o + .debug_macro 0x0000000000000000 0x166 bin/queuemonitor.o + .debug_macro 0x0000000000000000 0x22 bin/queuemonitor.o + .debug_macro 0x0000000000000000 0x44 bin/queuemonitor.o + .debug_macro 0x0000000000000000 0x58 bin/queuemonitor.o + .debug_macro 0x0000000000000000 0x22 bin/queuemonitor.o + .debug_macro 0x0000000000000000 0x1df bin/queuemonitor.o + .debug_macro 0x0000000000000000 0x22 bin/queuemonitor.o + .debug_macro 0x0000000000000000 0xca bin/queuemonitor.o + .debug_macro 0x0000000000000000 0x16 bin/queuemonitor.o + .debug_macro 0x0000000000000000 0x52 bin/queuemonitor.o + .debug_macro 0x0000000000000000 0x18a bin/queuemonitor.o + .debug_macro 0x0000000000000000 0x58 bin/queuemonitor.o + .debug_macro 0x0000000000000000 0x16 bin/queuemonitor.o + .debug_macro 0x0000000000000000 0x110 bin/queuemonitor.o + .debug_macro 0x0000000000000000 0x15d bin/queuemonitor.o + .debug_macro 0x0000000000000000 0xe4 bin/queuemonitor.o + .debug_macro 0x0000000000000000 0x10 bin/queuemonitor.o + .debug_macro 0x0000000000000000 0x1f bin/queuemonitor.o + .debug_macro 0x0000000000000000 0x3a7 bin/queuemonitor.o + .debug_line 0x0000000000000000 0x350 bin/queuemonitor.o + .debug_str 0x0000000000000000 0x6acf bin/queuemonitor.o + .comment 0x0000000000000000 0x71 bin/queuemonitor.o + .ARM.attributes + 0x0000000000000000 0x39 bin/queuemonitor.o .group 0x0000000000000000 0x8 bin/filter.o .group 0x0000000000000000 0x8 bin/filter.o .group 0x0000000000000000 0x8 bin/filter.o @@ -4135,14 +4275,36 @@ Discarded input sections .group 0x0000000000000000 0x8 bin/cfassert.o .group 0x0000000000000000 0x8 bin/cfassert.o .group 0x0000000000000000 0x8 bin/cfassert.o + .group 0x0000000000000000 0x8 bin/cfassert.o + .group 0x0000000000000000 0x8 bin/cfassert.o + .group 0x0000000000000000 0x8 bin/cfassert.o + .group 0x0000000000000000 0x8 bin/cfassert.o + .group 0x0000000000000000 0x8 bin/cfassert.o + .group 0x0000000000000000 0x8 bin/cfassert.o + .group 0x0000000000000000 0x8 bin/cfassert.o + .group 0x0000000000000000 0x8 bin/cfassert.o + .group 0x0000000000000000 0x8 bin/cfassert.o + .group 0x0000000000000000 0x8 bin/cfassert.o .text 0x0000000000000000 0x0 bin/cfassert.o .data 0x0000000000000000 0x0 bin/cfassert.o .bss 0x0000000000000000 0x0 bin/cfassert.o + .text.storeAssertSnapshotData + 0x0000000000000000 0x14 bin/cfassert.o .debug_macro 0x0000000000000000 0x89e bin/cfassert.o .debug_macro 0x0000000000000000 0x22 bin/cfassert.o + .debug_macro 0x0000000000000000 0x44 bin/cfassert.o + .debug_macro 0x0000000000000000 0x58 bin/cfassert.o + .debug_macro 0x0000000000000000 0x22 bin/cfassert.o + .debug_macro 0x0000000000000000 0x1df bin/cfassert.o + .debug_macro 0x0000000000000000 0x22 bin/cfassert.o .debug_macro 0x0000000000000000 0x58 bin/cfassert.o - .debug_macro 0x0000000000000000 0x10 bin/cfassert.o + .debug_macro 0x0000000000000000 0x16 bin/cfassert.o .debug_macro 0x0000000000000000 0xa0 bin/cfassert.o + .debug_macro 0x0000000000000000 0xca bin/cfassert.o + .debug_macro 0x0000000000000000 0x16 bin/cfassert.o + .debug_macro 0x0000000000000000 0x52 bin/cfassert.o + .debug_macro 0x0000000000000000 0x18a bin/cfassert.o + .debug_macro 0x0000000000000000 0x2e bin/cfassert.o .group 0x0000000000000000 0x8 bin/eprintf.o .group 0x0000000000000000 0x8 bin/eprintf.o .group 0x0000000000000000 0x8 bin/eprintf.o @@ -4219,6 +4381,7 @@ Discarded input sections .group 0x0000000000000000 0x8 bin/version.o .group 0x0000000000000000 0x8 bin/version.o .group 0x0000000000000000 0x8 bin/version.o + .group 0x0000000000000000 0x8 bin/version.o .text 0x0000000000000000 0x0 bin/version.o .data 0x0000000000000000 0x0 bin/version.o .bss 0x0000000000000000 0x0 bin/version.o @@ -4235,8 +4398,52 @@ Discarded input sections .debug_macro 0x0000000000000000 0x22 bin/version.o .debug_macro 0x0000000000000000 0xca bin/version.o .debug_macro 0x0000000000000000 0x16 bin/version.o - .debug_macro 0x0000000000000000 0x168 bin/version.o + .debug_macro 0x0000000000000000 0x52 bin/version.o + .debug_macro 0x0000000000000000 0x18a bin/version.o .debug_macro 0x0000000000000000 0xa6 bin/version.o + .group 0x0000000000000000 0x8 bin/FreeRTOS-openocd.o + .group 0x0000000000000000 0x8 bin/FreeRTOS-openocd.o + .group 0x0000000000000000 0x8 bin/FreeRTOS-openocd.o + .group 0x0000000000000000 0x8 bin/FreeRTOS-openocd.o + .group 0x0000000000000000 0x8 bin/FreeRTOS-openocd.o + .group 0x0000000000000000 0x8 bin/FreeRTOS-openocd.o + .group 0x0000000000000000 0x8 bin/FreeRTOS-openocd.o + .group 0x0000000000000000 0x8 bin/FreeRTOS-openocd.o + .group 0x0000000000000000 0x8 bin/FreeRTOS-openocd.o + .group 0x0000000000000000 0x8 bin/FreeRTOS-openocd.o + .group 0x0000000000000000 0x8 bin/FreeRTOS-openocd.o + .group 0x0000000000000000 0x8 bin/FreeRTOS-openocd.o + .group 0x0000000000000000 0x8 bin/FreeRTOS-openocd.o + .group 0x0000000000000000 0x8 bin/FreeRTOS-openocd.o + .group 0x0000000000000000 0x8 bin/FreeRTOS-openocd.o + .group 0x0000000000000000 0x8 bin/FreeRTOS-openocd.o + .group 0x0000000000000000 0x8 bin/FreeRTOS-openocd.o + .group 0x0000000000000000 0x8 bin/FreeRTOS-openocd.o + .group 0x0000000000000000 0x8 bin/FreeRTOS-openocd.o + .group 0x0000000000000000 0x8 bin/FreeRTOS-openocd.o + .text 0x0000000000000000 0x0 bin/FreeRTOS-openocd.o + .data 0x0000000000000000 0x0 bin/FreeRTOS-openocd.o + .bss 0x0000000000000000 0x0 bin/FreeRTOS-openocd.o + .debug_macro 0x0000000000000000 0x89e bin/FreeRTOS-openocd.o + .debug_macro 0x0000000000000000 0x166 bin/FreeRTOS-openocd.o + .debug_macro 0x0000000000000000 0x22 bin/FreeRTOS-openocd.o + .debug_macro 0x0000000000000000 0x44 bin/FreeRTOS-openocd.o + .debug_macro 0x0000000000000000 0x58 bin/FreeRTOS-openocd.o + .debug_macro 0x0000000000000000 0x22 bin/FreeRTOS-openocd.o + .debug_macro 0x0000000000000000 0x1df bin/FreeRTOS-openocd.o + .debug_macro 0x0000000000000000 0x22 bin/FreeRTOS-openocd.o + .debug_macro 0x0000000000000000 0xca bin/FreeRTOS-openocd.o + .debug_macro 0x0000000000000000 0x16 bin/FreeRTOS-openocd.o + .debug_macro 0x0000000000000000 0x52 bin/FreeRTOS-openocd.o + .debug_macro 0x0000000000000000 0x18a bin/FreeRTOS-openocd.o + .debug_macro 0x0000000000000000 0x58 bin/FreeRTOS-openocd.o + .debug_macro 0x0000000000000000 0x16 bin/FreeRTOS-openocd.o + .debug_macro 0x0000000000000000 0x110 bin/FreeRTOS-openocd.o + .debug_macro 0x0000000000000000 0x15d bin/FreeRTOS-openocd.o + .debug_macro 0x0000000000000000 0xe4 bin/FreeRTOS-openocd.o + .debug_macro 0x0000000000000000 0x10 bin/FreeRTOS-openocd.o + .debug_macro 0x0000000000000000 0x1f bin/FreeRTOS-openocd.o + .debug_macro 0x0000000000000000 0x3a7 bin/FreeRTOS-openocd.o .text 0x0000000000000000 0x14 bin/startup_stm32f40xx.o .data 0x0000000000000000 0x0 bin/startup_stm32f40xx.o .bss 0x0000000000000000 0x0 bin/startup_stm32f40xx.o @@ -4365,6 +4572,8 @@ Discarded input sections .group 0x0000000000000000 0x8 bin/cpal_hal.o .group 0x0000000000000000 0x8 bin/cpal_hal.o .group 0x0000000000000000 0x8 bin/cpal_hal.o + .group 0x0000000000000000 0x8 bin/cpal_hal.o + .group 0x0000000000000000 0x8 bin/cpal_hal.o .text 0x0000000000000000 0x0 bin/cpal_hal.o .data 0x0000000000000000 0x0 bin/cpal_hal.o .bss 0x0000000000000000 0x0 bin/cpal_hal.o @@ -4406,7 +4615,9 @@ Discarded input sections .debug_macro 0x0000000000000000 0x149 bin/cpal_hal.o .debug_macro 0x0000000000000000 0x279 bin/cpal_hal.o .debug_macro 0x0000000000000000 0x35 bin/cpal_hal.o - .debug_macro 0x0000000000000000 0x168 bin/cpal_hal.o + .debug_macro 0x0000000000000000 0x137 bin/cpal_hal.o + .debug_macro 0x0000000000000000 0x3a bin/cpal_hal.o + .debug_macro 0x0000000000000000 0x35 bin/cpal_hal.o .debug_macro 0x0000000000000000 0x74 bin/cpal_hal.o .group 0x0000000000000000 0x8 bin/cpal_i2c.o .group 0x0000000000000000 0x8 bin/cpal_i2c.o @@ -4449,6 +4660,8 @@ Discarded input sections .group 0x0000000000000000 0x8 bin/cpal_i2c.o .group 0x0000000000000000 0x8 bin/cpal_i2c.o .group 0x0000000000000000 0x8 bin/cpal_i2c.o + .group 0x0000000000000000 0x8 bin/cpal_i2c.o + .group 0x0000000000000000 0x8 bin/cpal_i2c.o .text 0x0000000000000000 0x0 bin/cpal_i2c.o .data 0x0000000000000000 0x0 bin/cpal_i2c.o .bss 0x0000000000000000 0x0 bin/cpal_i2c.o @@ -4494,7 +4707,9 @@ Discarded input sections .debug_macro 0x0000000000000000 0x149 bin/cpal_i2c.o .debug_macro 0x0000000000000000 0x279 bin/cpal_i2c.o .debug_macro 0x0000000000000000 0x35 bin/cpal_i2c.o - .debug_macro 0x0000000000000000 0x168 bin/cpal_i2c.o + .debug_macro 0x0000000000000000 0x137 bin/cpal_i2c.o + .debug_macro 0x0000000000000000 0x3a bin/cpal_i2c.o + .debug_macro 0x0000000000000000 0x35 bin/cpal_i2c.o .debug_macro 0x0000000000000000 0x74 bin/cpal_i2c.o .group 0x0000000000000000 0x8 bin/cpal_usercallback_template.o .group 0x0000000000000000 0x8 bin/cpal_usercallback_template.o @@ -4537,9 +4752,16 @@ Discarded input sections .group 0x0000000000000000 0x8 bin/cpal_usercallback_template.o .group 0x0000000000000000 0x8 bin/cpal_usercallback_template.o .group 0x0000000000000000 0x8 bin/cpal_usercallback_template.o + .group 0x0000000000000000 0x8 bin/cpal_usercallback_template.o + .group 0x0000000000000000 0x8 bin/cpal_usercallback_template.o .text 0x0000000000000000 0x0 bin/cpal_usercallback_template.o .data 0x0000000000000000 0x0 bin/cpal_usercallback_template.o .bss 0x0000000000000000 0x0 bin/cpal_usercallback_template.o + .debug_info 0x0000000000000000 0x96 bin/cpal_usercallback_template.o + .debug_abbrev 0x0000000000000000 0x4e bin/cpal_usercallback_template.o + .debug_aranges + 0x0000000000000000 0x18 bin/cpal_usercallback_template.o + .debug_macro 0x0000000000000000 0x1e7 bin/cpal_usercallback_template.o .debug_macro 0x0000000000000000 0x89e bin/cpal_usercallback_template.o .debug_macro 0x0000000000000000 0x5e bin/cpal_usercallback_template.o .debug_macro 0x0000000000000000 0x3b bin/cpal_usercallback_template.o @@ -4578,9 +4800,18 @@ Discarded input sections .debug_macro 0x0000000000000000 0x149 bin/cpal_usercallback_template.o .debug_macro 0x0000000000000000 0x279 bin/cpal_usercallback_template.o .debug_macro 0x0000000000000000 0x35 bin/cpal_usercallback_template.o - .debug_macro 0x0000000000000000 0x168 bin/cpal_usercallback_template.o + .debug_macro 0x0000000000000000 0x137 bin/cpal_usercallback_template.o + .debug_macro 0x0000000000000000 0x3a bin/cpal_usercallback_template.o + .debug_macro 0x0000000000000000 0x35 bin/cpal_usercallback_template.o .debug_macro 0x0000000000000000 0x74 bin/cpal_usercallback_template.o .debug_macro 0x0000000000000000 0x57b bin/cpal_usercallback_template.o + .debug_line 0x0000000000000000 0x561 bin/cpal_usercallback_template.o + .debug_str 0x0000000000000000 0x60e83 bin/cpal_usercallback_template.o + .comment 0x0000000000000000 0x71 bin/cpal_usercallback_template.o + .ARM.attributes + 0x0000000000000000 0x39 bin/cpal_usercallback_template.o + .group 0x0000000000000000 0x8 bin/cpal_i2c_hal_stm32f4xx.o + .group 0x0000000000000000 0x8 bin/cpal_i2c_hal_stm32f4xx.o .group 0x0000000000000000 0x8 bin/cpal_i2c_hal_stm32f4xx.o .group 0x0000000000000000 0x8 bin/cpal_i2c_hal_stm32f4xx.o .group 0x0000000000000000 0x8 bin/cpal_i2c_hal_stm32f4xx.o @@ -4667,7 +4898,9 @@ Discarded input sections .debug_macro 0x0000000000000000 0x149 bin/cpal_i2c_hal_stm32f4xx.o .debug_macro 0x0000000000000000 0x279 bin/cpal_i2c_hal_stm32f4xx.o .debug_macro 0x0000000000000000 0x35 bin/cpal_i2c_hal_stm32f4xx.o - .debug_macro 0x0000000000000000 0x168 bin/cpal_i2c_hal_stm32f4xx.o + .debug_macro 0x0000000000000000 0x137 bin/cpal_i2c_hal_stm32f4xx.o + .debug_macro 0x0000000000000000 0x3a bin/cpal_i2c_hal_stm32f4xx.o + .debug_macro 0x0000000000000000 0x35 bin/cpal_i2c_hal_stm32f4xx.o .debug_macro 0x0000000000000000 0x74 bin/cpal_i2c_hal_stm32f4xx.o .debug_macro 0x0000000000000000 0x57b bin/cpal_i2c_hal_stm32f4xx.o .debug_macro 0x0000000000000000 0x22 bin/cpal_i2c_hal_stm32f4xx.o @@ -5271,114 +5504,11 @@ Discarded input sections .debug_macro 0x0000000000000000 0x3a bin/usbd_core.o .debug_macro 0x0000000000000000 0x10 bin/usbd_core.o .group 0x0000000000000000 0x8 bin/platform_cf2.o - .group 0x0000000000000000 0x8 bin/platform_cf2.o - .group 0x0000000000000000 0x8 bin/platform_cf2.o - .group 0x0000000000000000 0x8 bin/platform_cf2.o - .group 0x0000000000000000 0x8 bin/platform_cf2.o - .group 0x0000000000000000 0x8 bin/platform_cf2.o - .group 0x0000000000000000 0x8 bin/platform_cf2.o - .group 0x0000000000000000 0x8 bin/platform_cf2.o - .group 0x0000000000000000 0x8 bin/platform_cf2.o - .group 0x0000000000000000 0x8 bin/platform_cf2.o - .group 0x0000000000000000 0x8 bin/platform_cf2.o - .group 0x0000000000000000 0x8 bin/platform_cf2.o - .group 0x0000000000000000 0x8 bin/platform_cf2.o - .group 0x0000000000000000 0x8 bin/platform_cf2.o - .group 0x0000000000000000 0x8 bin/platform_cf2.o - .group 0x0000000000000000 0x8 bin/platform_cf2.o - .group 0x0000000000000000 0x8 bin/platform_cf2.o - .group 0x0000000000000000 0x8 bin/platform_cf2.o - .group 0x0000000000000000 0x8 bin/platform_cf2.o - .group 0x0000000000000000 0x8 bin/platform_cf2.o - .group 0x0000000000000000 0x8 bin/platform_cf2.o - .group 0x0000000000000000 0x8 bin/platform_cf2.o - .group 0x0000000000000000 0x8 bin/platform_cf2.o - .group 0x0000000000000000 0x8 bin/platform_cf2.o - .group 0x0000000000000000 0x8 bin/platform_cf2.o - .group 0x0000000000000000 0x8 bin/platform_cf2.o - .group 0x0000000000000000 0x8 bin/platform_cf2.o - .group 0x0000000000000000 0x8 bin/platform_cf2.o - .group 0x0000000000000000 0x8 bin/platform_cf2.o - .group 0x0000000000000000 0x8 bin/platform_cf2.o - .group 0x0000000000000000 0x8 bin/platform_cf2.o - .group 0x0000000000000000 0x8 bin/platform_cf2.o - .group 0x0000000000000000 0x8 bin/platform_cf2.o - .group 0x0000000000000000 0x8 bin/platform_cf2.o - .group 0x0000000000000000 0x8 bin/platform_cf2.o - .group 0x0000000000000000 0x8 bin/platform_cf2.o - .group 0x0000000000000000 0x8 bin/platform_cf2.o - .group 0x0000000000000000 0x8 bin/platform_cf2.o - .group 0x0000000000000000 0x8 bin/platform_cf2.o - .group 0x0000000000000000 0x8 bin/platform_cf2.o - .group 0x0000000000000000 0x8 bin/platform_cf2.o - .group 0x0000000000000000 0x8 bin/platform_cf2.o - .group 0x0000000000000000 0x8 bin/platform_cf2.o - .group 0x0000000000000000 0x8 bin/platform_cf2.o - .group 0x0000000000000000 0x8 bin/platform_cf2.o - .group 0x0000000000000000 0x8 bin/platform_cf2.o - .group 0x0000000000000000 0x8 bin/platform_cf2.o - .group 0x0000000000000000 0x8 bin/platform_cf2.o - .group 0x0000000000000000 0x8 bin/platform_cf2.o - .group 0x0000000000000000 0x8 bin/platform_cf2.o - .group 0x0000000000000000 0x8 bin/platform_cf2.o - .group 0x0000000000000000 0x8 bin/platform_cf2.o - .group 0x0000000000000000 0x8 bin/platform_cf2.o .text 0x0000000000000000 0x0 bin/platform_cf2.o .data 0x0000000000000000 0x0 bin/platform_cf2.o .bss 0x0000000000000000 0x0 bin/platform_cf2.o .debug_macro 0x0000000000000000 0x89e bin/platform_cf2.o - .debug_macro 0x0000000000000000 0x22 bin/platform_cf2.o - .debug_macro 0x0000000000000000 0xca bin/platform_cf2.o - .debug_macro 0x0000000000000000 0x16 bin/platform_cf2.o - .debug_macro 0x0000000000000000 0x168 bin/platform_cf2.o - .debug_macro 0x0000000000000000 0x58 bin/platform_cf2.o - .debug_macro 0x0000000000000000 0x10 bin/platform_cf2.o - .debug_macro 0x0000000000000000 0x115 bin/platform_cf2.o - .debug_macro 0x0000000000000000 0x166 bin/platform_cf2.o - .debug_macro 0x0000000000000000 0x46 bin/platform_cf2.o - .debug_macro 0x0000000000000000 0xa5 bin/platform_cf2.o - .debug_macro 0x0000000000000000 0x12 bin/platform_cf2.o - .debug_macro 0x0000000000000000 0x1f bin/platform_cf2.o - .debug_macro 0x0000000000000000 0x1fc bin/platform_cf2.o - .debug_macro 0x0000000000000000 0x5e bin/platform_cf2.o - .debug_macro 0x0000000000000000 0x57 bin/platform_cf2.o - .debug_macro 0x0000000000000000 0x5e bin/platform_cf2.o - .debug_macro 0x0000000000000000 0x3b bin/platform_cf2.o - .debug_macro 0x0000000000000000 0x22 bin/platform_cf2.o - .debug_macro 0x0000000000000000 0x44 bin/platform_cf2.o - .debug_macro 0x0000000000000000 0x58 bin/platform_cf2.o - .debug_macro 0x0000000000000000 0x22 bin/platform_cf2.o - .debug_macro 0x0000000000000000 0x1df bin/platform_cf2.o - .debug_macro 0x0000000000000000 0x18 bin/platform_cf2.o - .debug_macro 0x0000000000000000 0x42 bin/platform_cf2.o - .debug_macro 0x0000000000000000 0xc91 bin/platform_cf2.o - .debug_macro 0x0000000000000000 0x8bb0 bin/platform_cf2.o - .debug_macro 0x0000000000000000 0x44f bin/platform_cf2.o - .debug_macro 0x0000000000000000 0xb2 bin/platform_cf2.o - .debug_macro 0x0000000000000000 0x477 bin/platform_cf2.o - .debug_macro 0x0000000000000000 0xae bin/platform_cf2.o - .debug_macro 0x0000000000000000 0x41c bin/platform_cf2.o - .debug_macro 0x0000000000000000 0x2bc bin/platform_cf2.o - .debug_macro 0x0000000000000000 0x2bb bin/platform_cf2.o - .debug_macro 0x0000000000000000 0x64 bin/platform_cf2.o - .debug_macro 0x0000000000000000 0xe7 bin/platform_cf2.o - .debug_macro 0x0000000000000000 0x62f bin/platform_cf2.o - .debug_macro 0x0000000000000000 0x57b bin/platform_cf2.o - .debug_macro 0x0000000000000000 0x342 bin/platform_cf2.o - .debug_macro 0x0000000000000000 0x36c bin/platform_cf2.o - .debug_macro 0x0000000000000000 0xf7 bin/platform_cf2.o - .debug_macro 0x0000000000000000 0x73b bin/platform_cf2.o - .debug_macro 0x0000000000000000 0x223 bin/platform_cf2.o - .debug_macro 0x0000000000000000 0x34 bin/platform_cf2.o - .debug_macro 0x0000000000000000 0x82 bin/platform_cf2.o - .debug_macro 0x0000000000000000 0x144 bin/platform_cf2.o - .debug_macro 0x0000000000000000 0xc3 bin/platform_cf2.o - .debug_macro 0x0000000000000000 0x40 bin/platform_cf2.o - .debug_macro 0x0000000000000000 0x3cf bin/platform_cf2.o - .debug_macro 0x0000000000000000 0x188 bin/platform_cf2.o - .debug_macro 0x0000000000000000 0x149 bin/platform_cf2.o - .debug_macro 0x0000000000000000 0x279 bin/platform_cf2.o - .debug_macro 0x0000000000000000 0x35 bin/platform_cf2.o + .group 0x0000000000000000 0x8 bin/led_f405.o .group 0x0000000000000000 0x8 bin/led_f405.o .group 0x0000000000000000 0x8 bin/led_f405.o .group 0x0000000000000000 0x8 bin/led_f405.o @@ -5478,19 +5608,20 @@ Discarded input sections .debug_macro 0x0000000000000000 0x279 bin/led_f405.o .debug_macro 0x0000000000000000 0x35 bin/led_f405.o .debug_macro 0x0000000000000000 0x166 bin/led_f405.o - .debug_macro 0x0000000000000000 0x46 bin/led_f405.o .debug_macro 0x0000000000000000 0xca bin/led_f405.o .debug_macro 0x0000000000000000 0x16 bin/led_f405.o - .debug_macro 0x0000000000000000 0x168 bin/led_f405.o + .debug_macro 0x0000000000000000 0x52 bin/led_f405.o + .debug_macro 0x0000000000000000 0x18a bin/led_f405.o .debug_macro 0x0000000000000000 0x58 bin/led_f405.o + .debug_macro 0x0000000000000000 0x16 bin/led_f405.o + .debug_macro 0x0000000000000000 0x110 bin/led_f405.o + .debug_macro 0x0000000000000000 0x15d bin/led_f405.o + .debug_macro 0x0000000000000000 0xe4 bin/led_f405.o .debug_macro 0x0000000000000000 0x10 bin/led_f405.o - .debug_macro 0x0000000000000000 0x115 bin/led_f405.o - .debug_macro 0x0000000000000000 0xa5 bin/led_f405.o - .debug_macro 0x0000000000000000 0x12 bin/led_f405.o .debug_macro 0x0000000000000000 0x1f bin/led_f405.o - .debug_macro 0x0000000000000000 0x1fc bin/led_f405.o - .debug_macro 0x0000000000000000 0x5e bin/led_f405.o - .debug_macro 0x0000000000000000 0x57 bin/led_f405.o + .debug_macro 0x0000000000000000 0x3a7 bin/led_f405.o + .debug_macro 0x0000000000000000 0xc0 bin/led_f405.o + .debug_macro 0x0000000000000000 0x9a bin/led_f405.o .debug_macro 0x0000000000000000 0xa0 bin/led_f405.o .group 0x0000000000000000 0x8 bin/mpu6500.o .group 0x0000000000000000 0x8 bin/mpu6500.o @@ -5558,6 +5689,9 @@ Discarded input sections .group 0x0000000000000000 0x8 bin/mpu6500.o .group 0x0000000000000000 0x8 bin/mpu6500.o .group 0x0000000000000000 0x8 bin/mpu6500.o + .group 0x0000000000000000 0x8 bin/mpu6500.o + .group 0x0000000000000000 0x8 bin/mpu6500.o + .group 0x0000000000000000 0x8 bin/mpu6500.o .text 0x0000000000000000 0x0 bin/mpu6500.o .data 0x0000000000000000 0x0 bin/mpu6500.o .bss 0x0000000000000000 0x0 bin/mpu6500.o @@ -5983,9 +6117,9 @@ Discarded input sections 0x0000000000000000 0x24 bin/mpu6500.o .text.mpu6500SetDMPConfig2 0x0000000000000000 0x18 bin/mpu6500.o - .rodata.CSWTCH.466 + .bss.verifyBuffer.9811 0x0000000000000000 0x10 bin/mpu6500.o - .bss.verifyBuffer.9730 + .rodata.CSWTCH.466 0x0000000000000000 0x10 bin/mpu6500.o .rodata.CSWTCH.453 0x0000000000000000 0x10 bin/mpu6500.o @@ -6036,22 +6170,25 @@ Discarded input sections .debug_macro 0x0000000000000000 0x149 bin/mpu6500.o .debug_macro 0x0000000000000000 0x279 bin/mpu6500.o .debug_macro 0x0000000000000000 0x35 bin/mpu6500.o - .debug_macro 0x0000000000000000 0x46 bin/mpu6500.o .debug_macro 0x0000000000000000 0x22 bin/mpu6500.o .debug_macro 0x0000000000000000 0xca bin/mpu6500.o .debug_macro 0x0000000000000000 0x16 bin/mpu6500.o - .debug_macro 0x0000000000000000 0x168 bin/mpu6500.o + .debug_macro 0x0000000000000000 0x52 bin/mpu6500.o + .debug_macro 0x0000000000000000 0x18a bin/mpu6500.o .debug_macro 0x0000000000000000 0x58 bin/mpu6500.o + .debug_macro 0x0000000000000000 0x16 bin/mpu6500.o + .debug_macro 0x0000000000000000 0x110 bin/mpu6500.o + .debug_macro 0x0000000000000000 0x15d bin/mpu6500.o + .debug_macro 0x0000000000000000 0xe4 bin/mpu6500.o .debug_macro 0x0000000000000000 0x10 bin/mpu6500.o - .debug_macro 0x0000000000000000 0x115 bin/mpu6500.o - .debug_macro 0x0000000000000000 0xa5 bin/mpu6500.o - .debug_macro 0x0000000000000000 0x12 bin/mpu6500.o .debug_macro 0x0000000000000000 0x1f bin/mpu6500.o - .debug_macro 0x0000000000000000 0x1fc bin/mpu6500.o - .debug_macro 0x0000000000000000 0x5e bin/mpu6500.o - .debug_macro 0x0000000000000000 0x57 bin/mpu6500.o + .debug_macro 0x0000000000000000 0x3a7 bin/mpu6500.o + .debug_macro 0x0000000000000000 0xc0 bin/mpu6500.o + .debug_macro 0x0000000000000000 0x9a bin/mpu6500.o .debug_macro 0x0000000000000000 0x2e bin/mpu6500.o - .debug_macro 0x0000000000000000 0x168 bin/mpu6500.o + .debug_macro 0x0000000000000000 0x137 bin/mpu6500.o + .debug_macro 0x0000000000000000 0x3a bin/mpu6500.o + .debug_macro 0x0000000000000000 0x35 bin/mpu6500.o .debug_macro 0x0000000000000000 0x74 bin/mpu6500.o .debug_macro 0x0000000000000000 0x34 bin/mpu6500.o .group 0x0000000000000000 0x8 bin/i2cdev_f405.o @@ -6127,7 +6264,9 @@ Discarded input sections .debug_macro 0x0000000000000000 0x22 bin/i2cdev_f405.o .debug_macro 0x0000000000000000 0x1df bin/i2cdev_f405.o .debug_macro 0x0000000000000000 0x22 bin/i2cdev_f405.o - .debug_macro 0x0000000000000000 0x168 bin/i2cdev_f405.o + .debug_macro 0x0000000000000000 0x137 bin/i2cdev_f405.o + .debug_macro 0x0000000000000000 0x3a bin/i2cdev_f405.o + .debug_macro 0x0000000000000000 0x35 bin/i2cdev_f405.o .debug_macro 0x0000000000000000 0x5e bin/i2cdev_f405.o .debug_macro 0x0000000000000000 0x3b bin/i2cdev_f405.o .debug_macro 0x0000000000000000 0x18 bin/i2cdev_f405.o @@ -6162,158 +6301,160 @@ Discarded input sections .debug_macro 0x0000000000000000 0x35 bin/i2cdev_f405.o .debug_macro 0x0000000000000000 0x74 bin/i2cdev_f405.o .debug_macro 0x0000000000000000 0x34 bin/i2cdev_f405.o - .debug_macro 0x0000000000000000 0x28 bin/i2cdev_f405.o .debug_macro 0x0000000000000000 0x166 bin/i2cdev_f405.o - .debug_macro 0x0000000000000000 0x46 bin/i2cdev_f405.o .debug_macro 0x0000000000000000 0xca bin/i2cdev_f405.o .debug_macro 0x0000000000000000 0x16 bin/i2cdev_f405.o - .debug_macro 0x0000000000000000 0x168 bin/i2cdev_f405.o + .debug_macro 0x0000000000000000 0x52 bin/i2cdev_f405.o + .debug_macro 0x0000000000000000 0x18a bin/i2cdev_f405.o .debug_macro 0x0000000000000000 0x58 bin/i2cdev_f405.o + .debug_macro 0x0000000000000000 0x16 bin/i2cdev_f405.o + .debug_macro 0x0000000000000000 0x110 bin/i2cdev_f405.o + .debug_macro 0x0000000000000000 0x15d bin/i2cdev_f405.o + .debug_macro 0x0000000000000000 0xe4 bin/i2cdev_f405.o .debug_macro 0x0000000000000000 0x10 bin/i2cdev_f405.o - .debug_macro 0x0000000000000000 0x115 bin/i2cdev_f405.o - .debug_macro 0x0000000000000000 0xa5 bin/i2cdev_f405.o - .debug_macro 0x0000000000000000 0x12 bin/i2cdev_f405.o .debug_macro 0x0000000000000000 0x1f bin/i2cdev_f405.o - .debug_macro 0x0000000000000000 0x1fc bin/i2cdev_f405.o - .debug_macro 0x0000000000000000 0x9c bin/i2cdev_f405.o - .debug_macro 0x0000000000000000 0x78 bin/i2cdev_f405.o - .debug_macro 0x0000000000000000 0x5e bin/i2cdev_f405.o - .debug_macro 0x0000000000000000 0x57 bin/i2cdev_f405.o - .debug_macro 0x0000000000000000 0xa0 bin/i2cdev_f405.o + .debug_macro 0x0000000000000000 0x3a7 bin/i2cdev_f405.o + .debug_macro 0x0000000000000000 0xb0 bin/i2cdev_f405.o + .debug_macro 0x0000000000000000 0x7f bin/i2cdev_f405.o + .debug_macro 0x0000000000000000 0xc0 bin/i2cdev_f405.o + .debug_macro 0x0000000000000000 0x9a bin/i2cdev_f405.o .debug_macro 0x0000000000000000 0x2e bin/i2cdev_f405.o - .group 0x0000000000000000 0x8 bin/ws2812.o - .group 0x0000000000000000 0x8 bin/ws2812.o - .group 0x0000000000000000 0x8 bin/ws2812.o - .group 0x0000000000000000 0x8 bin/ws2812.o - .group 0x0000000000000000 0x8 bin/ws2812.o - .group 0x0000000000000000 0x8 bin/ws2812.o - .group 0x0000000000000000 0x8 bin/ws2812.o - .group 0x0000000000000000 0x8 bin/ws2812.o - .group 0x0000000000000000 0x8 bin/ws2812.o - .group 0x0000000000000000 0x8 bin/ws2812.o - .group 0x0000000000000000 0x8 bin/ws2812.o - .group 0x0000000000000000 0x8 bin/ws2812.o - .group 0x0000000000000000 0x8 bin/ws2812.o - .group 0x0000000000000000 0x8 bin/ws2812.o - .group 0x0000000000000000 0x8 bin/ws2812.o - .group 0x0000000000000000 0x8 bin/ws2812.o - .group 0x0000000000000000 0x8 bin/ws2812.o - .group 0x0000000000000000 0x8 bin/ws2812.o - .group 0x0000000000000000 0x8 bin/ws2812.o - .group 0x0000000000000000 0x8 bin/ws2812.o - .group 0x0000000000000000 0x8 bin/ws2812.o - .group 0x0000000000000000 0x8 bin/ws2812.o - .group 0x0000000000000000 0x8 bin/ws2812.o - .group 0x0000000000000000 0x8 bin/ws2812.o - .group 0x0000000000000000 0x8 bin/ws2812.o - .group 0x0000000000000000 0x8 bin/ws2812.o - .group 0x0000000000000000 0x8 bin/ws2812.o - .group 0x0000000000000000 0x8 bin/ws2812.o - .group 0x0000000000000000 0x8 bin/ws2812.o - .group 0x0000000000000000 0x8 bin/ws2812.o - .group 0x0000000000000000 0x8 bin/ws2812.o - .group 0x0000000000000000 0x8 bin/ws2812.o - .group 0x0000000000000000 0x8 bin/ws2812.o - .group 0x0000000000000000 0x8 bin/ws2812.o - .group 0x0000000000000000 0x8 bin/ws2812.o - .group 0x0000000000000000 0x8 bin/ws2812.o - .group 0x0000000000000000 0x8 bin/ws2812.o - .group 0x0000000000000000 0x8 bin/ws2812.o - .group 0x0000000000000000 0x8 bin/ws2812.o - .group 0x0000000000000000 0x8 bin/ws2812.o - .group 0x0000000000000000 0x8 bin/ws2812.o - .group 0x0000000000000000 0x8 bin/ws2812.o - .group 0x0000000000000000 0x8 bin/ws2812.o - .group 0x0000000000000000 0x8 bin/ws2812.o - .group 0x0000000000000000 0x8 bin/ws2812.o - .group 0x0000000000000000 0x8 bin/ws2812.o - .group 0x0000000000000000 0x8 bin/ws2812.o - .group 0x0000000000000000 0x8 bin/ws2812.o - .group 0x0000000000000000 0x8 bin/ws2812.o - .group 0x0000000000000000 0x8 bin/ws2812.o - .group 0x0000000000000000 0x8 bin/ws2812.o - .group 0x0000000000000000 0x8 bin/ws2812.o - .group 0x0000000000000000 0x8 bin/ws2812.o - .group 0x0000000000000000 0x8 bin/ws2812.o - .group 0x0000000000000000 0x8 bin/ws2812.o - .group 0x0000000000000000 0x8 bin/ws2812.o - .group 0x0000000000000000 0x8 bin/ws2812.o - .group 0x0000000000000000 0x8 bin/ws2812.o - .group 0x0000000000000000 0x8 bin/ws2812.o - .group 0x0000000000000000 0x8 bin/ws2812.o - .group 0x0000000000000000 0x8 bin/ws2812.o - .group 0x0000000000000000 0x8 bin/ws2812.o - .group 0x0000000000000000 0x8 bin/ws2812.o - .group 0x0000000000000000 0x8 bin/ws2812.o - .group 0x0000000000000000 0x8 bin/ws2812.o - .text 0x0000000000000000 0x0 bin/ws2812.o - .data 0x0000000000000000 0x0 bin/ws2812.o - .bss 0x0000000000000000 0x0 bin/ws2812.o - .debug_macro 0x0000000000000000 0x89e bin/ws2812.o - .debug_macro 0x0000000000000000 0x58 bin/ws2812.o - .debug_macro 0x0000000000000000 0x22 bin/ws2812.o - .debug_macro 0x0000000000000000 0x35 bin/ws2812.o - .debug_macro 0x0000000000000000 0x9c bin/ws2812.o - .debug_macro 0x0000000000000000 0x166 bin/ws2812.o - .debug_macro 0x0000000000000000 0x4a bin/ws2812.o - .debug_macro 0x0000000000000000 0x52 bin/ws2812.o - .debug_macro 0x0000000000000000 0x16 bin/ws2812.o - .debug_macro 0x0000000000000000 0x43 bin/ws2812.o - .debug_macro 0x0000000000000000 0x180 bin/ws2812.o - .debug_macro 0x0000000000000000 0x29d bin/ws2812.o - .debug_macro 0x0000000000000000 0x10 bin/ws2812.o - .debug_macro 0x0000000000000000 0x35 bin/ws2812.o - .debug_macro 0x0000000000000000 0x5e bin/ws2812.o - .debug_macro 0x0000000000000000 0x3b bin/ws2812.o - .debug_macro 0x0000000000000000 0x58 bin/ws2812.o - .debug_macro 0x0000000000000000 0x22 bin/ws2812.o - .debug_macro 0x0000000000000000 0x1df bin/ws2812.o - .debug_macro 0x0000000000000000 0x18 bin/ws2812.o - .debug_macro 0x0000000000000000 0x42 bin/ws2812.o - .debug_macro 0x0000000000000000 0xc91 bin/ws2812.o - .debug_macro 0x0000000000000000 0x8bb0 bin/ws2812.o - .debug_macro 0x0000000000000000 0x44f bin/ws2812.o - .debug_macro 0x0000000000000000 0xb2 bin/ws2812.o - .debug_macro 0x0000000000000000 0x477 bin/ws2812.o - .debug_macro 0x0000000000000000 0xae bin/ws2812.o - .debug_macro 0x0000000000000000 0x41c bin/ws2812.o - .debug_macro 0x0000000000000000 0x2bc bin/ws2812.o - .debug_macro 0x0000000000000000 0x2bb bin/ws2812.o - .debug_macro 0x0000000000000000 0x64 bin/ws2812.o - .debug_macro 0x0000000000000000 0xe7 bin/ws2812.o - .debug_macro 0x0000000000000000 0x62f bin/ws2812.o - .debug_macro 0x0000000000000000 0x57b bin/ws2812.o - .debug_macro 0x0000000000000000 0x342 bin/ws2812.o - .debug_macro 0x0000000000000000 0x36c bin/ws2812.o - .debug_macro 0x0000000000000000 0xf7 bin/ws2812.o - .debug_macro 0x0000000000000000 0x73b bin/ws2812.o - .debug_macro 0x0000000000000000 0x223 bin/ws2812.o - .debug_macro 0x0000000000000000 0x34 bin/ws2812.o - .debug_macro 0x0000000000000000 0x82 bin/ws2812.o - .debug_macro 0x0000000000000000 0x144 bin/ws2812.o - .debug_macro 0x0000000000000000 0xc3 bin/ws2812.o - .debug_macro 0x0000000000000000 0x40 bin/ws2812.o - .debug_macro 0x0000000000000000 0x3cf bin/ws2812.o - .debug_macro 0x0000000000000000 0x188 bin/ws2812.o - .debug_macro 0x0000000000000000 0x149 bin/ws2812.o - .debug_macro 0x0000000000000000 0x279 bin/ws2812.o - .debug_macro 0x0000000000000000 0x35 bin/ws2812.o - .debug_macro 0x0000000000000000 0x46 bin/ws2812.o - .debug_macro 0x0000000000000000 0x22 bin/ws2812.o - .debug_macro 0x0000000000000000 0xca bin/ws2812.o - .debug_macro 0x0000000000000000 0x16 bin/ws2812.o - .debug_macro 0x0000000000000000 0x168 bin/ws2812.o - .debug_macro 0x0000000000000000 0x58 bin/ws2812.o - .debug_macro 0x0000000000000000 0x10 bin/ws2812.o - .debug_macro 0x0000000000000000 0x115 bin/ws2812.o - .debug_macro 0x0000000000000000 0xa5 bin/ws2812.o - .debug_macro 0x0000000000000000 0x12 bin/ws2812.o - .debug_macro 0x0000000000000000 0x1f bin/ws2812.o - .debug_macro 0x0000000000000000 0x1fc bin/ws2812.o - .debug_macro 0x0000000000000000 0x9c bin/ws2812.o - .debug_macro 0x0000000000000000 0x78 bin/ws2812.o - .debug_macro 0x0000000000000000 0xa0 bin/ws2812.o - .debug_macro 0x0000000000000000 0x28 bin/ws2812.o + .group 0x0000000000000000 0x8 bin/ws2812_cf2.o + .group 0x0000000000000000 0x8 bin/ws2812_cf2.o + .group 0x0000000000000000 0x8 bin/ws2812_cf2.o + .group 0x0000000000000000 0x8 bin/ws2812_cf2.o + .group 0x0000000000000000 0x8 bin/ws2812_cf2.o + .group 0x0000000000000000 0x8 bin/ws2812_cf2.o + .group 0x0000000000000000 0x8 bin/ws2812_cf2.o + .group 0x0000000000000000 0x8 bin/ws2812_cf2.o + .group 0x0000000000000000 0x8 bin/ws2812_cf2.o + .group 0x0000000000000000 0x8 bin/ws2812_cf2.o + .group 0x0000000000000000 0x8 bin/ws2812_cf2.o + .group 0x0000000000000000 0x8 bin/ws2812_cf2.o + .group 0x0000000000000000 0x8 bin/ws2812_cf2.o + .group 0x0000000000000000 0x8 bin/ws2812_cf2.o + .group 0x0000000000000000 0x8 bin/ws2812_cf2.o + .group 0x0000000000000000 0x8 bin/ws2812_cf2.o + .group 0x0000000000000000 0x8 bin/ws2812_cf2.o + .group 0x0000000000000000 0x8 bin/ws2812_cf2.o + .group 0x0000000000000000 0x8 bin/ws2812_cf2.o + .group 0x0000000000000000 0x8 bin/ws2812_cf2.o + .group 0x0000000000000000 0x8 bin/ws2812_cf2.o + .group 0x0000000000000000 0x8 bin/ws2812_cf2.o + .group 0x0000000000000000 0x8 bin/ws2812_cf2.o + .group 0x0000000000000000 0x8 bin/ws2812_cf2.o + .group 0x0000000000000000 0x8 bin/ws2812_cf2.o + .group 0x0000000000000000 0x8 bin/ws2812_cf2.o + .group 0x0000000000000000 0x8 bin/ws2812_cf2.o + .group 0x0000000000000000 0x8 bin/ws2812_cf2.o + .group 0x0000000000000000 0x8 bin/ws2812_cf2.o + .group 0x0000000000000000 0x8 bin/ws2812_cf2.o + .group 0x0000000000000000 0x8 bin/ws2812_cf2.o + .group 0x0000000000000000 0x8 bin/ws2812_cf2.o + .group 0x0000000000000000 0x8 bin/ws2812_cf2.o + .group 0x0000000000000000 0x8 bin/ws2812_cf2.o + .group 0x0000000000000000 0x8 bin/ws2812_cf2.o + .group 0x0000000000000000 0x8 bin/ws2812_cf2.o + .group 0x0000000000000000 0x8 bin/ws2812_cf2.o + .group 0x0000000000000000 0x8 bin/ws2812_cf2.o + .group 0x0000000000000000 0x8 bin/ws2812_cf2.o + .group 0x0000000000000000 0x8 bin/ws2812_cf2.o + .group 0x0000000000000000 0x8 bin/ws2812_cf2.o + .group 0x0000000000000000 0x8 bin/ws2812_cf2.o + .group 0x0000000000000000 0x8 bin/ws2812_cf2.o + .group 0x0000000000000000 0x8 bin/ws2812_cf2.o + .group 0x0000000000000000 0x8 bin/ws2812_cf2.o + .group 0x0000000000000000 0x8 bin/ws2812_cf2.o + .group 0x0000000000000000 0x8 bin/ws2812_cf2.o + .group 0x0000000000000000 0x8 bin/ws2812_cf2.o + .group 0x0000000000000000 0x8 bin/ws2812_cf2.o + .group 0x0000000000000000 0x8 bin/ws2812_cf2.o + .group 0x0000000000000000 0x8 bin/ws2812_cf2.o + .group 0x0000000000000000 0x8 bin/ws2812_cf2.o + .group 0x0000000000000000 0x8 bin/ws2812_cf2.o + .group 0x0000000000000000 0x8 bin/ws2812_cf2.o + .group 0x0000000000000000 0x8 bin/ws2812_cf2.o + .group 0x0000000000000000 0x8 bin/ws2812_cf2.o + .group 0x0000000000000000 0x8 bin/ws2812_cf2.o + .group 0x0000000000000000 0x8 bin/ws2812_cf2.o + .group 0x0000000000000000 0x8 bin/ws2812_cf2.o + .group 0x0000000000000000 0x8 bin/ws2812_cf2.o + .group 0x0000000000000000 0x8 bin/ws2812_cf2.o + .group 0x0000000000000000 0x8 bin/ws2812_cf2.o + .group 0x0000000000000000 0x8 bin/ws2812_cf2.o + .group 0x0000000000000000 0x8 bin/ws2812_cf2.o + .group 0x0000000000000000 0x8 bin/ws2812_cf2.o + .text 0x0000000000000000 0x0 bin/ws2812_cf2.o + .data 0x0000000000000000 0x0 bin/ws2812_cf2.o + .bss 0x0000000000000000 0x0 bin/ws2812_cf2.o + .debug_macro 0x0000000000000000 0x89e bin/ws2812_cf2.o + .debug_macro 0x0000000000000000 0x58 bin/ws2812_cf2.o + .debug_macro 0x0000000000000000 0x22 bin/ws2812_cf2.o + .debug_macro 0x0000000000000000 0x35 bin/ws2812_cf2.o + .debug_macro 0x0000000000000000 0x9c bin/ws2812_cf2.o + .debug_macro 0x0000000000000000 0x166 bin/ws2812_cf2.o + .debug_macro 0x0000000000000000 0x4a bin/ws2812_cf2.o + .debug_macro 0x0000000000000000 0x52 bin/ws2812_cf2.o + .debug_macro 0x0000000000000000 0x16 bin/ws2812_cf2.o + .debug_macro 0x0000000000000000 0x43 bin/ws2812_cf2.o + .debug_macro 0x0000000000000000 0x180 bin/ws2812_cf2.o + .debug_macro 0x0000000000000000 0x29d bin/ws2812_cf2.o + .debug_macro 0x0000000000000000 0x10 bin/ws2812_cf2.o + .debug_macro 0x0000000000000000 0x35 bin/ws2812_cf2.o + .debug_macro 0x0000000000000000 0x5e bin/ws2812_cf2.o + .debug_macro 0x0000000000000000 0x3b bin/ws2812_cf2.o + .debug_macro 0x0000000000000000 0x58 bin/ws2812_cf2.o + .debug_macro 0x0000000000000000 0x22 bin/ws2812_cf2.o + .debug_macro 0x0000000000000000 0x1df bin/ws2812_cf2.o + .debug_macro 0x0000000000000000 0x18 bin/ws2812_cf2.o + .debug_macro 0x0000000000000000 0x42 bin/ws2812_cf2.o + .debug_macro 0x0000000000000000 0xc91 bin/ws2812_cf2.o + .debug_macro 0x0000000000000000 0x8bb0 bin/ws2812_cf2.o + .debug_macro 0x0000000000000000 0x44f bin/ws2812_cf2.o + .debug_macro 0x0000000000000000 0xb2 bin/ws2812_cf2.o + .debug_macro 0x0000000000000000 0x477 bin/ws2812_cf2.o + .debug_macro 0x0000000000000000 0xae bin/ws2812_cf2.o + .debug_macro 0x0000000000000000 0x41c bin/ws2812_cf2.o + .debug_macro 0x0000000000000000 0x2bc bin/ws2812_cf2.o + .debug_macro 0x0000000000000000 0x2bb bin/ws2812_cf2.o + .debug_macro 0x0000000000000000 0x64 bin/ws2812_cf2.o + .debug_macro 0x0000000000000000 0xe7 bin/ws2812_cf2.o + .debug_macro 0x0000000000000000 0x62f bin/ws2812_cf2.o + .debug_macro 0x0000000000000000 0x57b bin/ws2812_cf2.o + .debug_macro 0x0000000000000000 0x342 bin/ws2812_cf2.o + .debug_macro 0x0000000000000000 0x36c bin/ws2812_cf2.o + .debug_macro 0x0000000000000000 0xf7 bin/ws2812_cf2.o + .debug_macro 0x0000000000000000 0x73b bin/ws2812_cf2.o + .debug_macro 0x0000000000000000 0x223 bin/ws2812_cf2.o + .debug_macro 0x0000000000000000 0x34 bin/ws2812_cf2.o + .debug_macro 0x0000000000000000 0x82 bin/ws2812_cf2.o + .debug_macro 0x0000000000000000 0x144 bin/ws2812_cf2.o + .debug_macro 0x0000000000000000 0xc3 bin/ws2812_cf2.o + .debug_macro 0x0000000000000000 0x40 bin/ws2812_cf2.o + .debug_macro 0x0000000000000000 0x3cf bin/ws2812_cf2.o + .debug_macro 0x0000000000000000 0x188 bin/ws2812_cf2.o + .debug_macro 0x0000000000000000 0x149 bin/ws2812_cf2.o + .debug_macro 0x0000000000000000 0x279 bin/ws2812_cf2.o + .debug_macro 0x0000000000000000 0x35 bin/ws2812_cf2.o + .debug_macro 0x0000000000000000 0x3a bin/ws2812_cf2.o + .debug_macro 0x0000000000000000 0x22 bin/ws2812_cf2.o + .debug_macro 0x0000000000000000 0xca bin/ws2812_cf2.o + .debug_macro 0x0000000000000000 0x16 bin/ws2812_cf2.o + .debug_macro 0x0000000000000000 0x52 bin/ws2812_cf2.o + .debug_macro 0x0000000000000000 0x18a bin/ws2812_cf2.o + .debug_macro 0x0000000000000000 0x58 bin/ws2812_cf2.o + .debug_macro 0x0000000000000000 0x16 bin/ws2812_cf2.o + .debug_macro 0x0000000000000000 0x110 bin/ws2812_cf2.o + .debug_macro 0x0000000000000000 0x15d bin/ws2812_cf2.o + .debug_macro 0x0000000000000000 0xe4 bin/ws2812_cf2.o + .debug_macro 0x0000000000000000 0x10 bin/ws2812_cf2.o + .debug_macro 0x0000000000000000 0x1f bin/ws2812_cf2.o + .debug_macro 0x0000000000000000 0x3a7 bin/ws2812_cf2.o + .debug_macro 0x0000000000000000 0xb0 bin/ws2812_cf2.o + .debug_macro 0x0000000000000000 0x7f bin/ws2812_cf2.o + .group 0x0000000000000000 0x8 bin/lps25h.o + .group 0x0000000000000000 0x8 bin/lps25h.o + .group 0x0000000000000000 0x8 bin/lps25h.o .group 0x0000000000000000 0x8 bin/lps25h.o .group 0x0000000000000000 0x8 bin/lps25h.o .group 0x0000000000000000 0x8 bin/lps25h.o @@ -6384,26 +6525,29 @@ Discarded input sections .bss 0x0000000000000000 0x0 bin/lps25h.o .debug_macro 0x0000000000000000 0x89e bin/lps25h.o .debug_macro 0x0000000000000000 0x166 bin/lps25h.o - .debug_macro 0x0000000000000000 0x46 bin/lps25h.o + .debug_macro 0x0000000000000000 0x22 bin/lps25h.o + .debug_macro 0x0000000000000000 0x44 bin/lps25h.o + .debug_macro 0x0000000000000000 0x58 bin/lps25h.o + .debug_macro 0x0000000000000000 0x22 bin/lps25h.o + .debug_macro 0x0000000000000000 0x1df bin/lps25h.o .debug_macro 0x0000000000000000 0x22 bin/lps25h.o .debug_macro 0x0000000000000000 0xca bin/lps25h.o .debug_macro 0x0000000000000000 0x16 bin/lps25h.o - .debug_macro 0x0000000000000000 0x168 bin/lps25h.o + .debug_macro 0x0000000000000000 0x52 bin/lps25h.o + .debug_macro 0x0000000000000000 0x18a bin/lps25h.o .debug_macro 0x0000000000000000 0x58 bin/lps25h.o + .debug_macro 0x0000000000000000 0x16 bin/lps25h.o + .debug_macro 0x0000000000000000 0x110 bin/lps25h.o + .debug_macro 0x0000000000000000 0x15d bin/lps25h.o + .debug_macro 0x0000000000000000 0xe4 bin/lps25h.o .debug_macro 0x0000000000000000 0x10 bin/lps25h.o - .debug_macro 0x0000000000000000 0x115 bin/lps25h.o - .debug_macro 0x0000000000000000 0xa5 bin/lps25h.o - .debug_macro 0x0000000000000000 0x12 bin/lps25h.o .debug_macro 0x0000000000000000 0x1f bin/lps25h.o - .debug_macro 0x0000000000000000 0x1fc bin/lps25h.o - .debug_macro 0x0000000000000000 0x5e bin/lps25h.o - .debug_macro 0x0000000000000000 0x57 bin/lps25h.o - .debug_macro 0x0000000000000000 0x22 bin/lps25h.o - .debug_macro 0x0000000000000000 0x44 bin/lps25h.o - .debug_macro 0x0000000000000000 0x58 bin/lps25h.o - .debug_macro 0x0000000000000000 0x22 bin/lps25h.o - .debug_macro 0x0000000000000000 0x1df bin/lps25h.o - .debug_macro 0x0000000000000000 0x168 bin/lps25h.o + .debug_macro 0x0000000000000000 0x3a7 bin/lps25h.o + .debug_macro 0x0000000000000000 0xc0 bin/lps25h.o + .debug_macro 0x0000000000000000 0x9a bin/lps25h.o + .debug_macro 0x0000000000000000 0x137 bin/lps25h.o + .debug_macro 0x0000000000000000 0x3a bin/lps25h.o + .debug_macro 0x0000000000000000 0x35 bin/lps25h.o .debug_macro 0x0000000000000000 0x5e bin/lps25h.o .debug_macro 0x0000000000000000 0x3b bin/lps25h.o .debug_macro 0x0000000000000000 0x18 bin/lps25h.o @@ -6505,6 +6649,9 @@ Discarded input sections .group 0x0000000000000000 0x8 bin/ak8963.o .group 0x0000000000000000 0x8 bin/ak8963.o .group 0x0000000000000000 0x8 bin/ak8963.o + .group 0x0000000000000000 0x8 bin/ak8963.o + .group 0x0000000000000000 0x8 bin/ak8963.o + .group 0x0000000000000000 0x8 bin/ak8963.o .text 0x0000000000000000 0x0 bin/ak8963.o .data 0x0000000000000000 0x0 bin/ak8963.o .bss 0x0000000000000000 0x0 bin/ak8963.o @@ -6544,26 +6691,29 @@ Discarded input sections 0x0000000000000000 0x18 bin/ak8963.o .debug_macro 0x0000000000000000 0x89e bin/ak8963.o .debug_macro 0x0000000000000000 0x166 bin/ak8963.o - .debug_macro 0x0000000000000000 0x46 bin/ak8963.o + .debug_macro 0x0000000000000000 0x22 bin/ak8963.o + .debug_macro 0x0000000000000000 0x44 bin/ak8963.o + .debug_macro 0x0000000000000000 0x58 bin/ak8963.o + .debug_macro 0x0000000000000000 0x22 bin/ak8963.o + .debug_macro 0x0000000000000000 0x1df bin/ak8963.o .debug_macro 0x0000000000000000 0x22 bin/ak8963.o .debug_macro 0x0000000000000000 0xca bin/ak8963.o .debug_macro 0x0000000000000000 0x16 bin/ak8963.o - .debug_macro 0x0000000000000000 0x168 bin/ak8963.o + .debug_macro 0x0000000000000000 0x52 bin/ak8963.o + .debug_macro 0x0000000000000000 0x18a bin/ak8963.o .debug_macro 0x0000000000000000 0x58 bin/ak8963.o + .debug_macro 0x0000000000000000 0x16 bin/ak8963.o + .debug_macro 0x0000000000000000 0x110 bin/ak8963.o + .debug_macro 0x0000000000000000 0x15d bin/ak8963.o + .debug_macro 0x0000000000000000 0xe4 bin/ak8963.o .debug_macro 0x0000000000000000 0x10 bin/ak8963.o - .debug_macro 0x0000000000000000 0x115 bin/ak8963.o - .debug_macro 0x0000000000000000 0xa5 bin/ak8963.o - .debug_macro 0x0000000000000000 0x12 bin/ak8963.o .debug_macro 0x0000000000000000 0x1f bin/ak8963.o - .debug_macro 0x0000000000000000 0x1fc bin/ak8963.o - .debug_macro 0x0000000000000000 0x5e bin/ak8963.o - .debug_macro 0x0000000000000000 0x57 bin/ak8963.o - .debug_macro 0x0000000000000000 0x22 bin/ak8963.o - .debug_macro 0x0000000000000000 0x44 bin/ak8963.o - .debug_macro 0x0000000000000000 0x58 bin/ak8963.o - .debug_macro 0x0000000000000000 0x22 bin/ak8963.o - .debug_macro 0x0000000000000000 0x1df bin/ak8963.o - .debug_macro 0x0000000000000000 0x168 bin/ak8963.o + .debug_macro 0x0000000000000000 0x3a7 bin/ak8963.o + .debug_macro 0x0000000000000000 0xc0 bin/ak8963.o + .debug_macro 0x0000000000000000 0x9a bin/ak8963.o + .debug_macro 0x0000000000000000 0x137 bin/ak8963.o + .debug_macro 0x0000000000000000 0x3a bin/ak8963.o + .debug_macro 0x0000000000000000 0x35 bin/ak8963.o .debug_macro 0x0000000000000000 0x5e bin/ak8963.o .debug_macro 0x0000000000000000 0x3b bin/ak8963.o .debug_macro 0x0000000000000000 0x18 bin/ak8963.o @@ -6657,6 +6807,9 @@ Discarded input sections .group 0x0000000000000000 0x8 bin/eeprom.o .group 0x0000000000000000 0x8 bin/eeprom.o .group 0x0000000000000000 0x8 bin/eeprom.o + .group 0x0000000000000000 0x8 bin/eeprom.o + .group 0x0000000000000000 0x8 bin/eeprom.o + .group 0x0000000000000000 0x8 bin/eeprom.o .text 0x0000000000000000 0x0 bin/eeprom.o .data 0x0000000000000000 0x0 bin/eeprom.o .bss 0x0000000000000000 0x0 bin/eeprom.o @@ -6664,26 +6817,29 @@ Discarded input sections 0x0000000000000000 0x4 bin/eeprom.o .debug_macro 0x0000000000000000 0x89e bin/eeprom.o .debug_macro 0x0000000000000000 0x166 bin/eeprom.o - .debug_macro 0x0000000000000000 0x46 bin/eeprom.o + .debug_macro 0x0000000000000000 0x22 bin/eeprom.o + .debug_macro 0x0000000000000000 0x44 bin/eeprom.o + .debug_macro 0x0000000000000000 0x58 bin/eeprom.o + .debug_macro 0x0000000000000000 0x22 bin/eeprom.o + .debug_macro 0x0000000000000000 0x1df bin/eeprom.o .debug_macro 0x0000000000000000 0x22 bin/eeprom.o .debug_macro 0x0000000000000000 0xca bin/eeprom.o .debug_macro 0x0000000000000000 0x16 bin/eeprom.o - .debug_macro 0x0000000000000000 0x168 bin/eeprom.o + .debug_macro 0x0000000000000000 0x52 bin/eeprom.o + .debug_macro 0x0000000000000000 0x18a bin/eeprom.o .debug_macro 0x0000000000000000 0x58 bin/eeprom.o + .debug_macro 0x0000000000000000 0x16 bin/eeprom.o + .debug_macro 0x0000000000000000 0x110 bin/eeprom.o + .debug_macro 0x0000000000000000 0x15d bin/eeprom.o + .debug_macro 0x0000000000000000 0xe4 bin/eeprom.o .debug_macro 0x0000000000000000 0x10 bin/eeprom.o - .debug_macro 0x0000000000000000 0x115 bin/eeprom.o - .debug_macro 0x0000000000000000 0xa5 bin/eeprom.o - .debug_macro 0x0000000000000000 0x12 bin/eeprom.o .debug_macro 0x0000000000000000 0x1f bin/eeprom.o - .debug_macro 0x0000000000000000 0x1fc bin/eeprom.o - .debug_macro 0x0000000000000000 0x5e bin/eeprom.o - .debug_macro 0x0000000000000000 0x57 bin/eeprom.o - .debug_macro 0x0000000000000000 0x22 bin/eeprom.o - .debug_macro 0x0000000000000000 0x44 bin/eeprom.o - .debug_macro 0x0000000000000000 0x58 bin/eeprom.o - .debug_macro 0x0000000000000000 0x22 bin/eeprom.o - .debug_macro 0x0000000000000000 0x1df bin/eeprom.o - .debug_macro 0x0000000000000000 0x168 bin/eeprom.o + .debug_macro 0x0000000000000000 0x3a7 bin/eeprom.o + .debug_macro 0x0000000000000000 0xc0 bin/eeprom.o + .debug_macro 0x0000000000000000 0x9a bin/eeprom.o + .debug_macro 0x0000000000000000 0x137 bin/eeprom.o + .debug_macro 0x0000000000000000 0x3a bin/eeprom.o + .debug_macro 0x0000000000000000 0x35 bin/eeprom.o .debug_macro 0x0000000000000000 0x5e bin/eeprom.o .debug_macro 0x0000000000000000 0x3b bin/eeprom.o .debug_macro 0x0000000000000000 0x18 bin/eeprom.o @@ -6767,6 +6923,8 @@ Discarded input sections .group 0x0000000000000000 0x8 bin/maxsonar.o .group 0x0000000000000000 0x8 bin/maxsonar.o .group 0x0000000000000000 0x8 bin/maxsonar.o + .group 0x0000000000000000 0x8 bin/maxsonar.o + .group 0x0000000000000000 0x8 bin/maxsonar.o .text 0x0000000000000000 0x0 bin/maxsonar.o .data 0x0000000000000000 0x0 bin/maxsonar.o .bss 0x0000000000000000 0x0 bin/maxsonar.o @@ -6776,19 +6934,20 @@ Discarded input sections 0x0000000000000000 0x4 bin/maxsonar.o .bss.maxSonarAccuracy 0x0000000000000000 0x4 bin/maxsonar.o - .debug_info 0x0000000000000000 0x203 bin/maxsonar.o + .debug_info 0x0000000000000000 0x20a bin/maxsonar.o .debug_abbrev 0x0000000000000000 0x132 bin/maxsonar.o .debug_loc 0x0000000000000000 0xc1 bin/maxsonar.o .debug_aranges 0x0000000000000000 0x20 bin/maxsonar.o .debug_ranges 0x0000000000000000 0x10 bin/maxsonar.o - .debug_macro 0x0000000000000000 0x233 bin/maxsonar.o + .debug_macro 0x0000000000000000 0x245 bin/maxsonar.o .debug_macro 0x0000000000000000 0x89e bin/maxsonar.o .debug_macro 0x0000000000000000 0x166 bin/maxsonar.o .debug_macro 0x0000000000000000 0x22 bin/maxsonar.o .debug_macro 0x0000000000000000 0xca bin/maxsonar.o .debug_macro 0x0000000000000000 0x16 bin/maxsonar.o - .debug_macro 0x0000000000000000 0x168 bin/maxsonar.o + .debug_macro 0x0000000000000000 0x52 bin/maxsonar.o + .debug_macro 0x0000000000000000 0x18a bin/maxsonar.o .debug_macro 0x0000000000000000 0x22 bin/maxsonar.o .debug_macro 0x0000000000000000 0x44 bin/maxsonar.o .debug_macro 0x0000000000000000 0x58 bin/maxsonar.o @@ -6796,6 +6955,7 @@ Discarded input sections .debug_macro 0x0000000000000000 0x1df bin/maxsonar.o .debug_macro 0x0000000000000000 0x5e bin/maxsonar.o .debug_macro 0x0000000000000000 0x10 bin/maxsonar.o + .debug_macro 0x0000000000000000 0x103 bin/maxsonar.o .debug_macro 0x0000000000000000 0x5e bin/maxsonar.o .debug_macro 0x0000000000000000 0x3b bin/maxsonar.o .debug_macro 0x0000000000000000 0x18 bin/maxsonar.o @@ -6830,12 +6990,125 @@ Discarded input sections .debug_macro 0x0000000000000000 0x35 bin/maxsonar.o .debug_macro 0x0000000000000000 0x70 bin/maxsonar.o .debug_macro 0x0000000000000000 0x10 bin/maxsonar.o - .debug_line 0x0000000000000000 0x5ab bin/maxsonar.o - .debug_str 0x0000000000000000 0x5e336 bin/maxsonar.o + .debug_line 0x0000000000000000 0x5c5 bin/maxsonar.o + .debug_str 0x0000000000000000 0x5eaf8 bin/maxsonar.o .comment 0x0000000000000000 0x71 bin/maxsonar.o .debug_frame 0x0000000000000000 0x2c bin/maxsonar.o .ARM.attributes 0x0000000000000000 0x39 bin/maxsonar.o + .group 0x0000000000000000 0x8 bin/piezo.o + .group 0x0000000000000000 0x8 bin/piezo.o + .group 0x0000000000000000 0x8 bin/piezo.o + .group 0x0000000000000000 0x8 bin/piezo.o + .group 0x0000000000000000 0x8 bin/piezo.o + .group 0x0000000000000000 0x8 bin/piezo.o + .group 0x0000000000000000 0x8 bin/piezo.o + .group 0x0000000000000000 0x8 bin/piezo.o + .group 0x0000000000000000 0x8 bin/piezo.o + .group 0x0000000000000000 0x8 bin/piezo.o + .group 0x0000000000000000 0x8 bin/piezo.o + .group 0x0000000000000000 0x8 bin/piezo.o + .group 0x0000000000000000 0x8 bin/piezo.o + .group 0x0000000000000000 0x8 bin/piezo.o + .group 0x0000000000000000 0x8 bin/piezo.o + .group 0x0000000000000000 0x8 bin/piezo.o + .group 0x0000000000000000 0x8 bin/piezo.o + .group 0x0000000000000000 0x8 bin/piezo.o + .group 0x0000000000000000 0x8 bin/piezo.o + .group 0x0000000000000000 0x8 bin/piezo.o + .group 0x0000000000000000 0x8 bin/piezo.o + .group 0x0000000000000000 0x8 bin/piezo.o + .group 0x0000000000000000 0x8 bin/piezo.o + .group 0x0000000000000000 0x8 bin/piezo.o + .group 0x0000000000000000 0x8 bin/piezo.o + .group 0x0000000000000000 0x8 bin/piezo.o + .group 0x0000000000000000 0x8 bin/piezo.o + .group 0x0000000000000000 0x8 bin/piezo.o + .group 0x0000000000000000 0x8 bin/piezo.o + .group 0x0000000000000000 0x8 bin/piezo.o + .group 0x0000000000000000 0x8 bin/piezo.o + .group 0x0000000000000000 0x8 bin/piezo.o + .group 0x0000000000000000 0x8 bin/piezo.o + .group 0x0000000000000000 0x8 bin/piezo.o + .group 0x0000000000000000 0x8 bin/piezo.o + .group 0x0000000000000000 0x8 bin/piezo.o + .group 0x0000000000000000 0x8 bin/piezo.o + .group 0x0000000000000000 0x8 bin/piezo.o + .group 0x0000000000000000 0x8 bin/piezo.o + .group 0x0000000000000000 0x8 bin/piezo.o + .group 0x0000000000000000 0x8 bin/piezo.o + .group 0x0000000000000000 0x8 bin/piezo.o + .group 0x0000000000000000 0x8 bin/piezo.o + .group 0x0000000000000000 0x8 bin/piezo.o + .group 0x0000000000000000 0x8 bin/piezo.o + .group 0x0000000000000000 0x8 bin/piezo.o + .group 0x0000000000000000 0x8 bin/piezo.o + .group 0x0000000000000000 0x8 bin/piezo.o + .group 0x0000000000000000 0x8 bin/piezo.o + .group 0x0000000000000000 0x8 bin/piezo.o + .group 0x0000000000000000 0x8 bin/piezo.o + .group 0x0000000000000000 0x8 bin/piezo.o + .group 0x0000000000000000 0x8 bin/piezo.o + .group 0x0000000000000000 0x8 bin/piezo.o + .text 0x0000000000000000 0x0 bin/piezo.o + .data 0x0000000000000000 0x0 bin/piezo.o + .bss 0x0000000000000000 0x0 bin/piezo.o + .text.piezoTest + 0x0000000000000000 0xc bin/piezo.o + .debug_macro 0x0000000000000000 0x89e bin/piezo.o + .debug_macro 0x0000000000000000 0x22 bin/piezo.o + .debug_macro 0x0000000000000000 0x5e bin/piezo.o + .debug_macro 0x0000000000000000 0x3b bin/piezo.o + .debug_macro 0x0000000000000000 0x22 bin/piezo.o + .debug_macro 0x0000000000000000 0x44 bin/piezo.o + .debug_macro 0x0000000000000000 0x58 bin/piezo.o + .debug_macro 0x0000000000000000 0x22 bin/piezo.o + .debug_macro 0x0000000000000000 0x1df bin/piezo.o + .debug_macro 0x0000000000000000 0x18 bin/piezo.o + .debug_macro 0x0000000000000000 0x42 bin/piezo.o + .debug_macro 0x0000000000000000 0xc91 bin/piezo.o + .debug_macro 0x0000000000000000 0x8bb0 bin/piezo.o + .debug_macro 0x0000000000000000 0x44f bin/piezo.o + .debug_macro 0x0000000000000000 0xb2 bin/piezo.o + .debug_macro 0x0000000000000000 0x477 bin/piezo.o + .debug_macro 0x0000000000000000 0xae bin/piezo.o + .debug_macro 0x0000000000000000 0x41c bin/piezo.o + .debug_macro 0x0000000000000000 0x2bc bin/piezo.o + .debug_macro 0x0000000000000000 0x2bb bin/piezo.o + .debug_macro 0x0000000000000000 0x64 bin/piezo.o + .debug_macro 0x0000000000000000 0xe7 bin/piezo.o + .debug_macro 0x0000000000000000 0x62f bin/piezo.o + .debug_macro 0x0000000000000000 0x57b bin/piezo.o + .debug_macro 0x0000000000000000 0x342 bin/piezo.o + .debug_macro 0x0000000000000000 0x36c bin/piezo.o + .debug_macro 0x0000000000000000 0xf7 bin/piezo.o + .debug_macro 0x0000000000000000 0x73b bin/piezo.o + .debug_macro 0x0000000000000000 0x223 bin/piezo.o + .debug_macro 0x0000000000000000 0x34 bin/piezo.o + .debug_macro 0x0000000000000000 0x82 bin/piezo.o + .debug_macro 0x0000000000000000 0x144 bin/piezo.o + .debug_macro 0x0000000000000000 0xc3 bin/piezo.o + .debug_macro 0x0000000000000000 0x40 bin/piezo.o + .debug_macro 0x0000000000000000 0x3cf bin/piezo.o + .debug_macro 0x0000000000000000 0x188 bin/piezo.o + .debug_macro 0x0000000000000000 0x149 bin/piezo.o + .debug_macro 0x0000000000000000 0x279 bin/piezo.o + .debug_macro 0x0000000000000000 0x35 bin/piezo.o + .debug_macro 0x0000000000000000 0xca bin/piezo.o + .debug_macro 0x0000000000000000 0x16 bin/piezo.o + .debug_macro 0x0000000000000000 0x52 bin/piezo.o + .debug_macro 0x0000000000000000 0x18a bin/piezo.o + .debug_macro 0x0000000000000000 0x166 bin/piezo.o + .debug_macro 0x0000000000000000 0x58 bin/piezo.o + .debug_macro 0x0000000000000000 0x16 bin/piezo.o + .debug_macro 0x0000000000000000 0x110 bin/piezo.o + .debug_macro 0x0000000000000000 0x15d bin/piezo.o + .debug_macro 0x0000000000000000 0xe4 bin/piezo.o + .debug_macro 0x0000000000000000 0x10 bin/piezo.o + .debug_macro 0x0000000000000000 0x1f bin/piezo.o + .debug_macro 0x0000000000000000 0x3a7 bin/piezo.o + .debug_macro 0x0000000000000000 0xc0 bin/piezo.o + .debug_macro 0x0000000000000000 0x9a bin/piezo.o .group 0x0000000000000000 0x8 bin/uart_syslink.o .group 0x0000000000000000 0x8 bin/uart_syslink.o .group 0x0000000000000000 0x8 bin/uart_syslink.o @@ -6962,27 +7235,28 @@ Discarded input sections .debug_macro 0x0000000000000000 0x149 bin/uart_syslink.o .debug_macro 0x0000000000000000 0x279 bin/uart_syslink.o .debug_macro 0x0000000000000000 0x35 bin/uart_syslink.o - .debug_macro 0x0000000000000000 0x46 bin/uart_syslink.o .debug_macro 0x0000000000000000 0x22 bin/uart_syslink.o .debug_macro 0x0000000000000000 0xca bin/uart_syslink.o .debug_macro 0x0000000000000000 0x16 bin/uart_syslink.o - .debug_macro 0x0000000000000000 0x168 bin/uart_syslink.o + .debug_macro 0x0000000000000000 0x52 bin/uart_syslink.o + .debug_macro 0x0000000000000000 0x18a bin/uart_syslink.o .debug_macro 0x0000000000000000 0x58 bin/uart_syslink.o + .debug_macro 0x0000000000000000 0x16 bin/uart_syslink.o + .debug_macro 0x0000000000000000 0x110 bin/uart_syslink.o + .debug_macro 0x0000000000000000 0x15d bin/uart_syslink.o + .debug_macro 0x0000000000000000 0xe4 bin/uart_syslink.o .debug_macro 0x0000000000000000 0x10 bin/uart_syslink.o - .debug_macro 0x0000000000000000 0x115 bin/uart_syslink.o - .debug_macro 0x0000000000000000 0xa5 bin/uart_syslink.o - .debug_macro 0x0000000000000000 0x12 bin/uart_syslink.o .debug_macro 0x0000000000000000 0x1f bin/uart_syslink.o - .debug_macro 0x0000000000000000 0x1fc bin/uart_syslink.o - .debug_macro 0x0000000000000000 0x5e bin/uart_syslink.o - .debug_macro 0x0000000000000000 0x57 bin/uart_syslink.o - .debug_macro 0x0000000000000000 0x9c bin/uart_syslink.o - .debug_macro 0x0000000000000000 0x78 bin/uart_syslink.o + .debug_macro 0x0000000000000000 0x3a7 bin/uart_syslink.o + .debug_macro 0x0000000000000000 0xc0 bin/uart_syslink.o + .debug_macro 0x0000000000000000 0x9a bin/uart_syslink.o + .debug_macro 0x0000000000000000 0xb0 bin/uart_syslink.o + .debug_macro 0x0000000000000000 0x7f bin/uart_syslink.o .debug_macro 0x0000000000000000 0x1c bin/uart_syslink.o .debug_macro 0x0000000000000000 0x8f bin/uart_syslink.o - .debug_macro 0x0000000000000000 0x28 bin/uart_syslink.o - .debug_macro 0x0000000000000000 0xa0 bin/uart_syslink.o - .debug_macro 0x0000000000000000 0x22 bin/uart_syslink.o + .debug_macro 0x0000000000000000 0x3a bin/uart_syslink.o + .debug_macro 0x0000000000000000 0x10 bin/uart_syslink.o + .group 0x0000000000000000 0x8 bin/swd.o .group 0x0000000000000000 0x8 bin/swd.o .group 0x0000000000000000 0x8 bin/swd.o .group 0x0000000000000000 0x8 bin/swd.o @@ -7049,12 +7323,12 @@ Discarded input sections .bss.isInit 0x0000000000000000 0x1 bin/swd.o .data.header 0x0000000000000000 0x1 bin/swd.o .bss.counter 0x0000000000000000 0x4 bin/swd.o - .debug_info 0x0000000000000000 0x83e bin/swd.o + .debug_info 0x0000000000000000 0x845 bin/swd.o .debug_abbrev 0x0000000000000000 0x208 bin/swd.o .debug_aranges 0x0000000000000000 0x28 bin/swd.o .debug_ranges 0x0000000000000000 0x18 bin/swd.o - .debug_macro 0x0000000000000000 0x2d6 bin/swd.o + .debug_macro 0x0000000000000000 0x2e2 bin/swd.o .debug_macro 0x0000000000000000 0x89e bin/swd.o .debug_macro 0x0000000000000000 0x22 bin/swd.o .debug_macro 0x0000000000000000 0x5e bin/swd.o @@ -7095,21 +7369,22 @@ Discarded input sections .debug_macro 0x0000000000000000 0x279 bin/swd.o .debug_macro 0x0000000000000000 0x35 bin/swd.o .debug_macro 0x0000000000000000 0x166 bin/swd.o - .debug_macro 0x0000000000000000 0x46 bin/swd.o .debug_macro 0x0000000000000000 0xca bin/swd.o .debug_macro 0x0000000000000000 0x16 bin/swd.o - .debug_macro 0x0000000000000000 0x168 bin/swd.o + .debug_macro 0x0000000000000000 0x52 bin/swd.o + .debug_macro 0x0000000000000000 0x18a bin/swd.o .debug_macro 0x0000000000000000 0x58 bin/swd.o + .debug_macro 0x0000000000000000 0x16 bin/swd.o + .debug_macro 0x0000000000000000 0x110 bin/swd.o + .debug_macro 0x0000000000000000 0x15d bin/swd.o + .debug_macro 0x0000000000000000 0xe4 bin/swd.o .debug_macro 0x0000000000000000 0x10 bin/swd.o - .debug_macro 0x0000000000000000 0x115 bin/swd.o - .debug_macro 0x0000000000000000 0xa5 bin/swd.o - .debug_macro 0x0000000000000000 0x12 bin/swd.o .debug_macro 0x0000000000000000 0x1f bin/swd.o - .debug_macro 0x0000000000000000 0x1fc bin/swd.o - .debug_macro 0x0000000000000000 0x5e bin/swd.o - .debug_macro 0x0000000000000000 0x57 bin/swd.o - .debug_line 0x0000000000000000 0x696 bin/swd.o - .debug_str 0x0000000000000000 0x60415 bin/swd.o + .debug_macro 0x0000000000000000 0x3a7 bin/swd.o + .debug_macro 0x0000000000000000 0xc0 bin/swd.o + .debug_macro 0x0000000000000000 0x9a bin/swd.o + .debug_line 0x0000000000000000 0x6bd bin/swd.o + .debug_str 0x0000000000000000 0x6202b bin/swd.o .comment 0x0000000000000000 0x71 bin/swd.o .debug_frame 0x0000000000000000 0x54 bin/swd.o .ARM.attributes @@ -7171,6 +7446,7 @@ Discarded input sections .group 0x0000000000000000 0x8 bin/uart1.o .group 0x0000000000000000 0x8 bin/uart1.o .group 0x0000000000000000 0x8 bin/uart1.o + .group 0x0000000000000000 0x8 bin/uart1.o .text 0x0000000000000000 0x0 bin/uart1.o .data 0x0000000000000000 0x0 bin/uart1.o .bss 0x0000000000000000 0x0 bin/uart1.o @@ -7191,7 +7467,7 @@ Discarded input sections .debug_aranges 0x0000000000000000 0x38 bin/uart1.o .debug_ranges 0x0000000000000000 0x28 bin/uart1.o - .debug_macro 0x0000000000000000 0x2c2 bin/uart1.o + .debug_macro 0x0000000000000000 0x2cb bin/uart1.o .debug_macro 0x0000000000000000 0x89e bin/uart1.o .debug_macro 0x0000000000000000 0x58 bin/uart1.o .debug_macro 0x0000000000000000 0x22 bin/uart1.o @@ -7244,12 +7520,13 @@ Discarded input sections .debug_macro 0x0000000000000000 0x22 bin/uart1.o .debug_macro 0x0000000000000000 0xca bin/uart1.o .debug_macro 0x0000000000000000 0x16 bin/uart1.o - .debug_macro 0x0000000000000000 0x168 bin/uart1.o + .debug_macro 0x0000000000000000 0x52 bin/uart1.o + .debug_macro 0x0000000000000000 0x18a bin/uart1.o .debug_macro 0x0000000000000000 0x58 bin/uart1.o .debug_macro 0x0000000000000000 0x6a bin/uart1.o - .debug_macro 0x0000000000000000 0x10 bin/uart1.o - .debug_line 0x0000000000000000 0x65a bin/uart1.o - .debug_str 0x0000000000000000 0x607b8 bin/uart1.o + .debug_macro 0x0000000000000000 0x16 bin/uart1.o + .debug_line 0x0000000000000000 0x665 bin/uart1.o + .debug_str 0x0000000000000000 0x60b8b bin/uart1.o .comment 0x0000000000000000 0x71 bin/uart1.o .debug_frame 0x0000000000000000 0x74 bin/uart1.o .ARM.attributes @@ -7310,6 +7587,7 @@ Discarded input sections .group 0x0000000000000000 0x8 bin/uart2.o .group 0x0000000000000000 0x8 bin/uart2.o .group 0x0000000000000000 0x8 bin/uart2.o + .group 0x0000000000000000 0x8 bin/uart2.o .text 0x0000000000000000 0x0 bin/uart2.o .data 0x0000000000000000 0x0 bin/uart2.o .bss 0x0000000000000000 0x0 bin/uart2.o @@ -7330,7 +7608,7 @@ Discarded input sections .debug_aranges 0x0000000000000000 0x38 bin/uart2.o .debug_ranges 0x0000000000000000 0x28 bin/uart2.o - .debug_macro 0x0000000000000000 0x2c2 bin/uart2.o + .debug_macro 0x0000000000000000 0x2cb bin/uart2.o .debug_macro 0x0000000000000000 0x89e bin/uart2.o .debug_macro 0x0000000000000000 0x58 bin/uart2.o .debug_macro 0x0000000000000000 0x22 bin/uart2.o @@ -7383,16 +7661,117 @@ Discarded input sections .debug_macro 0x0000000000000000 0x22 bin/uart2.o .debug_macro 0x0000000000000000 0xca bin/uart2.o .debug_macro 0x0000000000000000 0x16 bin/uart2.o - .debug_macro 0x0000000000000000 0x168 bin/uart2.o + .debug_macro 0x0000000000000000 0x52 bin/uart2.o + .debug_macro 0x0000000000000000 0x18a bin/uart2.o .debug_macro 0x0000000000000000 0x58 bin/uart2.o .debug_macro 0x0000000000000000 0x6a bin/uart2.o - .debug_macro 0x0000000000000000 0x10 bin/uart2.o - .debug_line 0x0000000000000000 0x65a bin/uart2.o - .debug_str 0x0000000000000000 0x607b9 bin/uart2.o + .debug_macro 0x0000000000000000 0x16 bin/uart2.o + .debug_line 0x0000000000000000 0x665 bin/uart2.o + .debug_str 0x0000000000000000 0x60b8c bin/uart2.o .comment 0x0000000000000000 0x71 bin/uart2.o .debug_frame 0x0000000000000000 0x74 bin/uart2.o .ARM.attributes 0x0000000000000000 0x39 bin/uart2.o + .group 0x0000000000000000 0x8 bin/watchdog.o + .group 0x0000000000000000 0x8 bin/watchdog.o + .group 0x0000000000000000 0x8 bin/watchdog.o + .group 0x0000000000000000 0x8 bin/watchdog.o + .group 0x0000000000000000 0x8 bin/watchdog.o + .group 0x0000000000000000 0x8 bin/watchdog.o + .group 0x0000000000000000 0x8 bin/watchdog.o + .group 0x0000000000000000 0x8 bin/watchdog.o + .group 0x0000000000000000 0x8 bin/watchdog.o + .group 0x0000000000000000 0x8 bin/watchdog.o + .group 0x0000000000000000 0x8 bin/watchdog.o + .group 0x0000000000000000 0x8 bin/watchdog.o + .group 0x0000000000000000 0x8 bin/watchdog.o + .group 0x0000000000000000 0x8 bin/watchdog.o + .group 0x0000000000000000 0x8 bin/watchdog.o + .group 0x0000000000000000 0x8 bin/watchdog.o + .group 0x0000000000000000 0x8 bin/watchdog.o + .group 0x0000000000000000 0x8 bin/watchdog.o + .group 0x0000000000000000 0x8 bin/watchdog.o + .group 0x0000000000000000 0x8 bin/watchdog.o + .group 0x0000000000000000 0x8 bin/watchdog.o + .group 0x0000000000000000 0x8 bin/watchdog.o + .group 0x0000000000000000 0x8 bin/watchdog.o + .group 0x0000000000000000 0x8 bin/watchdog.o + .group 0x0000000000000000 0x8 bin/watchdog.o + .group 0x0000000000000000 0x8 bin/watchdog.o + .group 0x0000000000000000 0x8 bin/watchdog.o + .group 0x0000000000000000 0x8 bin/watchdog.o + .group 0x0000000000000000 0x8 bin/watchdog.o + .group 0x0000000000000000 0x8 bin/watchdog.o + .group 0x0000000000000000 0x8 bin/watchdog.o + .group 0x0000000000000000 0x8 bin/watchdog.o + .group 0x0000000000000000 0x8 bin/watchdog.o + .group 0x0000000000000000 0x8 bin/watchdog.o + .group 0x0000000000000000 0x8 bin/watchdog.o + .group 0x0000000000000000 0x8 bin/watchdog.o + .group 0x0000000000000000 0x8 bin/watchdog.o + .group 0x0000000000000000 0x8 bin/watchdog.o + .group 0x0000000000000000 0x8 bin/watchdog.o + .group 0x0000000000000000 0x8 bin/watchdog.o + .group 0x0000000000000000 0x8 bin/watchdog.o + .group 0x0000000000000000 0x8 bin/watchdog.o + .group 0x0000000000000000 0x8 bin/watchdog.o + .group 0x0000000000000000 0x8 bin/watchdog.o + .group 0x0000000000000000 0x8 bin/watchdog.o + .group 0x0000000000000000 0x8 bin/watchdog.o + .group 0x0000000000000000 0x8 bin/watchdog.o + .text 0x0000000000000000 0x0 bin/watchdog.o + .data 0x0000000000000000 0x0 bin/watchdog.o + .bss 0x0000000000000000 0x0 bin/watchdog.o + .debug_macro 0x0000000000000000 0x89e bin/watchdog.o + .debug_macro 0x0000000000000000 0x22 bin/watchdog.o + .debug_macro 0x0000000000000000 0xca bin/watchdog.o + .debug_macro 0x0000000000000000 0x16 bin/watchdog.o + .debug_macro 0x0000000000000000 0x52 bin/watchdog.o + .debug_macro 0x0000000000000000 0x18a bin/watchdog.o + .debug_macro 0x0000000000000000 0x58 bin/watchdog.o + .debug_macro 0x0000000000000000 0x2e bin/watchdog.o + .debug_macro 0x0000000000000000 0x5e bin/watchdog.o + .debug_macro 0x0000000000000000 0x3b bin/watchdog.o + .debug_macro 0x0000000000000000 0x22 bin/watchdog.o + .debug_macro 0x0000000000000000 0x44 bin/watchdog.o + .debug_macro 0x0000000000000000 0x58 bin/watchdog.o + .debug_macro 0x0000000000000000 0x22 bin/watchdog.o + .debug_macro 0x0000000000000000 0x1df bin/watchdog.o + .debug_macro 0x0000000000000000 0x18 bin/watchdog.o + .debug_macro 0x0000000000000000 0x42 bin/watchdog.o + .debug_macro 0x0000000000000000 0xc91 bin/watchdog.o + .debug_macro 0x0000000000000000 0x8bb0 bin/watchdog.o + .debug_macro 0x0000000000000000 0x44f bin/watchdog.o + .debug_macro 0x0000000000000000 0xb2 bin/watchdog.o + .debug_macro 0x0000000000000000 0x477 bin/watchdog.o + .debug_macro 0x0000000000000000 0xae bin/watchdog.o + .debug_macro 0x0000000000000000 0x41c bin/watchdog.o + .debug_macro 0x0000000000000000 0x2bc bin/watchdog.o + .debug_macro 0x0000000000000000 0x2bb bin/watchdog.o + .debug_macro 0x0000000000000000 0x64 bin/watchdog.o + .debug_macro 0x0000000000000000 0xe7 bin/watchdog.o + .debug_macro 0x0000000000000000 0x62f bin/watchdog.o + .debug_macro 0x0000000000000000 0x57b bin/watchdog.o + .debug_macro 0x0000000000000000 0x342 bin/watchdog.o + .debug_macro 0x0000000000000000 0x36c bin/watchdog.o + .debug_macro 0x0000000000000000 0xf7 bin/watchdog.o + .debug_macro 0x0000000000000000 0x73b bin/watchdog.o + .debug_macro 0x0000000000000000 0x223 bin/watchdog.o + .debug_macro 0x0000000000000000 0x34 bin/watchdog.o + .debug_macro 0x0000000000000000 0x82 bin/watchdog.o + .debug_macro 0x0000000000000000 0x144 bin/watchdog.o + .debug_macro 0x0000000000000000 0xc3 bin/watchdog.o + .debug_macro 0x0000000000000000 0x40 bin/watchdog.o + .debug_macro 0x0000000000000000 0x3cf bin/watchdog.o + .debug_macro 0x0000000000000000 0x188 bin/watchdog.o + .debug_macro 0x0000000000000000 0x149 bin/watchdog.o + .debug_macro 0x0000000000000000 0x279 bin/watchdog.o + .debug_macro 0x0000000000000000 0x35 bin/watchdog.o + .debug_macro 0x0000000000000000 0x22 bin/watchdog.o + .debug_macro 0x0000000000000000 0x16 bin/watchdog.o + .group 0x0000000000000000 0x8 bin/sonar.o + .group 0x0000000000000000 0x8 bin/sonar.o + .group 0x0000000000000000 0x8 bin/sonar.o .group 0x0000000000000000 0x8 bin/sonar.o .group 0x0000000000000000 0x8 bin/sonar.o .group 0x0000000000000000 0x8 bin/sonar.o @@ -7489,32 +7868,35 @@ Discarded input sections .debug_macro 0x0000000000000000 0x29d bin/sonar.o .debug_macro 0x0000000000000000 0x10 bin/sonar.o .debug_macro 0x0000000000000000 0x35 bin/sonar.o - .debug_macro 0x0000000000000000 0x46 bin/sonar.o + .debug_macro 0x0000000000000000 0x58 bin/sonar.o + .debug_macro 0x0000000000000000 0x22 bin/sonar.o + .debug_macro 0x0000000000000000 0x1df bin/sonar.o .debug_macro 0x0000000000000000 0x22 bin/sonar.o .debug_macro 0x0000000000000000 0xca bin/sonar.o .debug_macro 0x0000000000000000 0x16 bin/sonar.o - .debug_macro 0x0000000000000000 0x168 bin/sonar.o + .debug_macro 0x0000000000000000 0x52 bin/sonar.o + .debug_macro 0x0000000000000000 0x18a bin/sonar.o .debug_macro 0x0000000000000000 0x58 bin/sonar.o + .debug_macro 0x0000000000000000 0x16 bin/sonar.o + .debug_macro 0x0000000000000000 0x110 bin/sonar.o + .debug_macro 0x0000000000000000 0x15d bin/sonar.o + .debug_macro 0x0000000000000000 0xe4 bin/sonar.o .debug_macro 0x0000000000000000 0x10 bin/sonar.o - .debug_macro 0x0000000000000000 0x115 bin/sonar.o - .debug_macro 0x0000000000000000 0xa5 bin/sonar.o - .debug_macro 0x0000000000000000 0x12 bin/sonar.o .debug_macro 0x0000000000000000 0x1f bin/sonar.o - .debug_macro 0x0000000000000000 0x1fc bin/sonar.o - .debug_macro 0x0000000000000000 0x5e bin/sonar.o - .debug_macro 0x0000000000000000 0x57 bin/sonar.o - .debug_macro 0x0000000000000000 0x58 bin/sonar.o - .debug_macro 0x0000000000000000 0x22 bin/sonar.o - .debug_macro 0x0000000000000000 0x1df bin/sonar.o - .debug_macro 0x0000000000000000 0x9c bin/sonar.o - .debug_macro 0x0000000000000000 0x78 bin/sonar.o + .debug_macro 0x0000000000000000 0x3a7 bin/sonar.o + .debug_macro 0x0000000000000000 0xc0 bin/sonar.o + .debug_macro 0x0000000000000000 0x9a bin/sonar.o + .debug_macro 0x0000000000000000 0xb0 bin/sonar.o + .debug_macro 0x0000000000000000 0x7f bin/sonar.o .debug_macro 0x0000000000000000 0x40 bin/sonar.o .debug_macro 0x0000000000000000 0x94 bin/sonar.o .debug_macro 0x0000000000000000 0x4c bin/sonar.o .debug_macro 0x0000000000000000 0x1c bin/sonar.o .debug_macro 0x0000000000000000 0x64 bin/sonar.o .debug_macro 0x0000000000000000 0xa6 bin/sonar.o - .debug_macro 0x0000000000000000 0x168 bin/sonar.o + .debug_macro 0x0000000000000000 0x137 bin/sonar.o + .debug_macro 0x0000000000000000 0x3a bin/sonar.o + .debug_macro 0x0000000000000000 0x35 bin/sonar.o .debug_macro 0x0000000000000000 0x5e bin/sonar.o .debug_macro 0x0000000000000000 0x3b bin/sonar.o .debug_macro 0x0000000000000000 0x18 bin/sonar.o @@ -7600,6 +7982,7 @@ Discarded input sections .group 0x0000000000000000 0x8 bin/usb_bsp.o .group 0x0000000000000000 0x8 bin/usb_bsp.o .group 0x0000000000000000 0x8 bin/usb_bsp.o + .group 0x0000000000000000 0x8 bin/usb_bsp.o .text 0x0000000000000000 0x0 bin/usb_bsp.o .data 0x0000000000000000 0x0 bin/usb_bsp.o .bss 0x0000000000000000 0x0 bin/usb_bsp.o @@ -7651,8 +8034,11 @@ Discarded input sections .debug_macro 0x0000000000000000 0x22 bin/usb_bsp.o .debug_macro 0x0000000000000000 0xca bin/usb_bsp.o .debug_macro 0x0000000000000000 0x16 bin/usb_bsp.o - .debug_macro 0x0000000000000000 0x168 bin/usb_bsp.o - .debug_macro 0x0000000000000000 0x28 bin/usb_bsp.o + .debug_macro 0x0000000000000000 0x52 bin/usb_bsp.o + .debug_macro 0x0000000000000000 0x18a bin/usb_bsp.o + .debug_macro 0x0000000000000000 0x3a bin/usb_bsp.o + .group 0x0000000000000000 0x8 bin/usblink.o + .group 0x0000000000000000 0x8 bin/usblink.o .group 0x0000000000000000 0x8 bin/usblink.o .group 0x0000000000000000 0x8 bin/usblink.o .group 0x0000000000000000 0x8 bin/usblink.o @@ -7717,28 +8103,30 @@ Discarded input sections .debug_macro 0x0000000000000000 0x35 bin/usblink.o .debug_macro 0x0000000000000000 0xca bin/usblink.o .debug_macro 0x0000000000000000 0x16 bin/usblink.o - .debug_macro 0x0000000000000000 0x168 bin/usblink.o + .debug_macro 0x0000000000000000 0x52 bin/usblink.o + .debug_macro 0x0000000000000000 0x18a bin/usblink.o .debug_macro 0x0000000000000000 0x58 bin/usblink.o .debug_macro 0x0000000000000000 0x22 bin/usblink.o .debug_macro 0x0000000000000000 0x1df bin/usblink.o .debug_macro 0x0000000000000000 0x16 bin/usblink.o .debug_macro 0x0000000000000000 0xa0 bin/usblink.o .debug_macro 0x0000000000000000 0x22 bin/usblink.o - .debug_macro 0x0000000000000000 0x46 bin/usblink.o .debug_macro 0x0000000000000000 0x58 bin/usblink.o + .debug_macro 0x0000000000000000 0x16 bin/usblink.o + .debug_macro 0x0000000000000000 0x110 bin/usblink.o + .debug_macro 0x0000000000000000 0x15d bin/usblink.o + .debug_macro 0x0000000000000000 0xe4 bin/usblink.o .debug_macro 0x0000000000000000 0x10 bin/usblink.o - .debug_macro 0x0000000000000000 0x115 bin/usblink.o - .debug_macro 0x0000000000000000 0xa5 bin/usblink.o - .debug_macro 0x0000000000000000 0x12 bin/usblink.o .debug_macro 0x0000000000000000 0x1f bin/usblink.o - .debug_macro 0x0000000000000000 0x1fc bin/usblink.o - .debug_macro 0x0000000000000000 0x9c bin/usblink.o - .debug_macro 0x0000000000000000 0x78 bin/usblink.o + .debug_macro 0x0000000000000000 0x3a7 bin/usblink.o + .debug_macro 0x0000000000000000 0xb0 bin/usblink.o + .debug_macro 0x0000000000000000 0x7f bin/usblink.o .debug_macro 0x0000000000000000 0x40 bin/usblink.o .debug_macro 0x0000000000000000 0x94 bin/usblink.o .debug_macro 0x0000000000000000 0x4c bin/usblink.o - .debug_macro 0x0000000000000000 0x5e bin/usblink.o - .debug_macro 0x0000000000000000 0x57 bin/usblink.o + .debug_macro 0x0000000000000000 0xc0 bin/usblink.o + .debug_macro 0x0000000000000000 0x9a bin/usblink.o + .debug_macro 0x0000000000000000 0x10 bin/usblink.o .debug_macro 0x0000000000000000 0x4c bin/usblink.o .group 0x0000000000000000 0x8 bin/usbd_desc.o .group 0x0000000000000000 0x8 bin/usbd_desc.o @@ -7791,6 +8179,7 @@ Discarded input sections .group 0x0000000000000000 0x8 bin/usbd_desc.o .group 0x0000000000000000 0x8 bin/usbd_desc.o .group 0x0000000000000000 0x8 bin/usbd_desc.o + .group 0x0000000000000000 0x8 bin/usbd_desc.o .text 0x0000000000000000 0x0 bin/usbd_desc.o .data 0x0000000000000000 0x0 bin/usbd_desc.o .bss 0x0000000000000000 0x0 bin/usbd_desc.o @@ -7846,7 +8235,8 @@ Discarded input sections .debug_macro 0x0000000000000000 0x22 bin/usbd_desc.o .debug_macro 0x0000000000000000 0xca bin/usbd_desc.o .debug_macro 0x0000000000000000 0x16 bin/usbd_desc.o - .debug_macro 0x0000000000000000 0x168 bin/usbd_desc.o + .debug_macro 0x0000000000000000 0x52 bin/usbd_desc.o + .debug_macro 0x0000000000000000 0x18a bin/usbd_desc.o .group 0x0000000000000000 0x8 bin/usb.o .group 0x0000000000000000 0x8 bin/usb.o .group 0x0000000000000000 0x8 bin/usb.o @@ -7978,22 +8368,24 @@ Discarded input sections .debug_macro 0x0000000000000000 0x149 bin/usb.o .debug_macro 0x0000000000000000 0x279 bin/usb.o .debug_macro 0x0000000000000000 0x35 bin/usb.o - .debug_macro 0x0000000000000000 0x46 bin/usb.o .debug_macro 0x0000000000000000 0x22 bin/usb.o .debug_macro 0x0000000000000000 0xca bin/usb.o .debug_macro 0x0000000000000000 0x16 bin/usb.o - .debug_macro 0x0000000000000000 0x168 bin/usb.o + .debug_macro 0x0000000000000000 0x52 bin/usb.o + .debug_macro 0x0000000000000000 0x18a bin/usb.o .debug_macro 0x0000000000000000 0x58 bin/usb.o + .debug_macro 0x0000000000000000 0x16 bin/usb.o + .debug_macro 0x0000000000000000 0x110 bin/usb.o + .debug_macro 0x0000000000000000 0x15d bin/usb.o + .debug_macro 0x0000000000000000 0xe4 bin/usb.o .debug_macro 0x0000000000000000 0x10 bin/usb.o - .debug_macro 0x0000000000000000 0x115 bin/usb.o - .debug_macro 0x0000000000000000 0xa5 bin/usb.o - .debug_macro 0x0000000000000000 0x12 bin/usb.o .debug_macro 0x0000000000000000 0x1f bin/usb.o - .debug_macro 0x0000000000000000 0x1fc bin/usb.o - .debug_macro 0x0000000000000000 0x5e bin/usb.o - .debug_macro 0x0000000000000000 0x57 bin/usb.o - .debug_macro 0x0000000000000000 0x9c bin/usb.o - .debug_macro 0x0000000000000000 0x78 bin/usb.o + .debug_macro 0x0000000000000000 0x3a7 bin/usb.o + .debug_macro 0x0000000000000000 0xc0 bin/usb.o + .debug_macro 0x0000000000000000 0x9a bin/usb.o + .debug_macro 0x0000000000000000 0xb0 bin/usb.o + .debug_macro 0x0000000000000000 0x7f bin/usb.o + .debug_macro 0x0000000000000000 0x10 bin/usb.o .debug_macro 0x0000000000000000 0x1c bin/usb.o .debug_macro 0x0000000000000000 0x16 bin/usb.o .debug_macro 0x0000000000000000 0x94 bin/usb.o @@ -8005,8 +8397,10 @@ Discarded input sections .debug_macro 0x0000000000000000 0x118 bin/usb.o .debug_macro 0x0000000000000000 0x2e bin/usb.o .debug_macro 0x0000000000000000 0x3a bin/usb.o - .debug_macro 0x0000000000000000 0xa0 bin/usb.o - .debug_macro 0x0000000000000000 0x22 bin/usb.o + .group 0x0000000000000000 0x8 bin/imu_cf2.o + .group 0x0000000000000000 0x8 bin/imu_cf2.o + .group 0x0000000000000000 0x8 bin/imu_cf2.o + .group 0x0000000000000000 0x8 bin/imu_cf2.o .group 0x0000000000000000 0x8 bin/imu_cf2.o .group 0x0000000000000000 0x8 bin/imu_cf2.o .group 0x0000000000000000 0x8 bin/imu_cf2.o @@ -8136,24 +8530,27 @@ Discarded input sections .debug_macro 0x0000000000000000 0x149 bin/imu_cf2.o .debug_macro 0x0000000000000000 0x279 bin/imu_cf2.o .debug_macro 0x0000000000000000 0x35 bin/imu_cf2.o - .debug_macro 0x0000000000000000 0x46 bin/imu_cf2.o .debug_macro 0x0000000000000000 0x22 bin/imu_cf2.o .debug_macro 0x0000000000000000 0xca bin/imu_cf2.o .debug_macro 0x0000000000000000 0x16 bin/imu_cf2.o - .debug_macro 0x0000000000000000 0x168 bin/imu_cf2.o + .debug_macro 0x0000000000000000 0x52 bin/imu_cf2.o + .debug_macro 0x0000000000000000 0x18a bin/imu_cf2.o .debug_macro 0x0000000000000000 0x58 bin/imu_cf2.o + .debug_macro 0x0000000000000000 0x16 bin/imu_cf2.o + .debug_macro 0x0000000000000000 0x110 bin/imu_cf2.o + .debug_macro 0x0000000000000000 0x15d bin/imu_cf2.o + .debug_macro 0x0000000000000000 0xe4 bin/imu_cf2.o .debug_macro 0x0000000000000000 0x10 bin/imu_cf2.o - .debug_macro 0x0000000000000000 0x115 bin/imu_cf2.o - .debug_macro 0x0000000000000000 0xa5 bin/imu_cf2.o - .debug_macro 0x0000000000000000 0x12 bin/imu_cf2.o .debug_macro 0x0000000000000000 0x1f bin/imu_cf2.o - .debug_macro 0x0000000000000000 0x1fc bin/imu_cf2.o - .debug_macro 0x0000000000000000 0x5e bin/imu_cf2.o - .debug_macro 0x0000000000000000 0x57 bin/imu_cf2.o + .debug_macro 0x0000000000000000 0x3a7 bin/imu_cf2.o + .debug_macro 0x0000000000000000 0xc0 bin/imu_cf2.o + .debug_macro 0x0000000000000000 0x9a bin/imu_cf2.o .debug_macro 0x0000000000000000 0x2e bin/imu_cf2.o .debug_macro 0x0000000000000000 0x10 bin/imu_cf2.o .debug_macro 0x0000000000000000 0x22 bin/imu_cf2.o - .debug_macro 0x0000000000000000 0x168 bin/imu_cf2.o + .debug_macro 0x0000000000000000 0x137 bin/imu_cf2.o + .debug_macro 0x0000000000000000 0x3a bin/imu_cf2.o + .debug_macro 0x0000000000000000 0x35 bin/imu_cf2.o .debug_macro 0x0000000000000000 0x74 bin/imu_cf2.o .debug_macro 0x0000000000000000 0x34 bin/imu_cf2.o .debug_macro 0x0000000000000000 0x8e4 bin/imu_cf2.o @@ -8161,6 +8558,9 @@ Discarded input sections .debug_macro 0x0000000000000000 0x22 bin/imu_cf2.o .debug_macro 0x0000000000000000 0xa6 bin/imu_cf2.o .debug_macro 0x0000000000000000 0x64 bin/imu_cf2.o + .debug_macro 0x0000000000000000 0x34 bin/imu_cf2.o + .group 0x0000000000000000 0x8 bin/pm_f405.o + .group 0x0000000000000000 0x8 bin/pm_f405.o .group 0x0000000000000000 0x8 bin/pm_f405.o .group 0x0000000000000000 0x8 bin/pm_f405.o .group 0x0000000000000000 0x8 bin/pm_f405.o @@ -8292,21 +8692,22 @@ Discarded input sections .debug_macro 0x0000000000000000 0x10 bin/pm_f405.o .debug_macro 0x0000000000000000 0x35 bin/pm_f405.o .debug_macro 0x0000000000000000 0x22 bin/pm_f405.o - .debug_macro 0x0000000000000000 0x46 bin/pm_f405.o .debug_macro 0x0000000000000000 0xca bin/pm_f405.o .debug_macro 0x0000000000000000 0x16 bin/pm_f405.o - .debug_macro 0x0000000000000000 0x168 bin/pm_f405.o + .debug_macro 0x0000000000000000 0x52 bin/pm_f405.o + .debug_macro 0x0000000000000000 0x18a bin/pm_f405.o .debug_macro 0x0000000000000000 0x58 bin/pm_f405.o + .debug_macro 0x0000000000000000 0x16 bin/pm_f405.o + .debug_macro 0x0000000000000000 0x110 bin/pm_f405.o + .debug_macro 0x0000000000000000 0x15d bin/pm_f405.o + .debug_macro 0x0000000000000000 0xe4 bin/pm_f405.o .debug_macro 0x0000000000000000 0x10 bin/pm_f405.o - .debug_macro 0x0000000000000000 0x115 bin/pm_f405.o - .debug_macro 0x0000000000000000 0xa5 bin/pm_f405.o - .debug_macro 0x0000000000000000 0x12 bin/pm_f405.o .debug_macro 0x0000000000000000 0x1f bin/pm_f405.o - .debug_macro 0x0000000000000000 0x1fc bin/pm_f405.o - .debug_macro 0x0000000000000000 0x5e bin/pm_f405.o - .debug_macro 0x0000000000000000 0x57 bin/pm_f405.o - .debug_macro 0x0000000000000000 0x9c bin/pm_f405.o - .debug_macro 0x0000000000000000 0x78 bin/pm_f405.o + .debug_macro 0x0000000000000000 0x3a7 bin/pm_f405.o + .debug_macro 0x0000000000000000 0xc0 bin/pm_f405.o + .debug_macro 0x0000000000000000 0x9a bin/pm_f405.o + .debug_macro 0x0000000000000000 0xb0 bin/pm_f405.o + .debug_macro 0x0000000000000000 0x7f bin/pm_f405.o .debug_macro 0x0000000000000000 0x46 bin/pm_f405.o .debug_macro 0x0000000000000000 0x94 bin/pm_f405.o .debug_macro 0x0000000000000000 0x4c bin/pm_f405.o @@ -8314,6 +8715,8 @@ Discarded input sections .debug_macro 0x0000000000000000 0x64 bin/pm_f405.o .debug_macro 0x0000000000000000 0x28 bin/pm_f405.o .debug_macro 0x0000000000000000 0x1c bin/pm_f405.o + .debug_macro 0x0000000000000000 0x34 bin/pm_f405.o + .group 0x0000000000000000 0x8 bin/syslink.o .group 0x0000000000000000 0x8 bin/syslink.o .group 0x0000000000000000 0x8 bin/syslink.o .group 0x0000000000000000 0x8 bin/syslink.o @@ -8375,21 +8778,22 @@ Discarded input sections .debug_macro 0x0000000000000000 0x58 bin/syslink.o .debug_macro 0x0000000000000000 0x22 bin/syslink.o .debug_macro 0x0000000000000000 0x1df bin/syslink.o - .debug_macro 0x0000000000000000 0x46 bin/syslink.o .debug_macro 0x0000000000000000 0xca bin/syslink.o .debug_macro 0x0000000000000000 0x16 bin/syslink.o - .debug_macro 0x0000000000000000 0x168 bin/syslink.o + .debug_macro 0x0000000000000000 0x52 bin/syslink.o + .debug_macro 0x0000000000000000 0x18a bin/syslink.o .debug_macro 0x0000000000000000 0x58 bin/syslink.o + .debug_macro 0x0000000000000000 0x16 bin/syslink.o + .debug_macro 0x0000000000000000 0x110 bin/syslink.o + .debug_macro 0x0000000000000000 0x15d bin/syslink.o + .debug_macro 0x0000000000000000 0xe4 bin/syslink.o .debug_macro 0x0000000000000000 0x10 bin/syslink.o - .debug_macro 0x0000000000000000 0x115 bin/syslink.o - .debug_macro 0x0000000000000000 0xa5 bin/syslink.o - .debug_macro 0x0000000000000000 0x12 bin/syslink.o .debug_macro 0x0000000000000000 0x1f bin/syslink.o - .debug_macro 0x0000000000000000 0x1fc bin/syslink.o - .debug_macro 0x0000000000000000 0x5e bin/syslink.o - .debug_macro 0x0000000000000000 0x57 bin/syslink.o - .debug_macro 0x0000000000000000 0x9c bin/syslink.o - .debug_macro 0x0000000000000000 0x78 bin/syslink.o + .debug_macro 0x0000000000000000 0x3a7 bin/syslink.o + .debug_macro 0x0000000000000000 0xc0 bin/syslink.o + .debug_macro 0x0000000000000000 0x9a bin/syslink.o + .debug_macro 0x0000000000000000 0xb0 bin/syslink.o + .debug_macro 0x0000000000000000 0x7f bin/syslink.o .debug_macro 0x0000000000000000 0x2e bin/syslink.o .debug_macro 0x0000000000000000 0x94 bin/syslink.o .debug_macro 0x0000000000000000 0x1c bin/syslink.o @@ -8434,6 +8838,8 @@ Discarded input sections .group 0x0000000000000000 0x8 bin/radiolink.o .group 0x0000000000000000 0x8 bin/radiolink.o .group 0x0000000000000000 0x8 bin/radiolink.o + .group 0x0000000000000000 0x8 bin/radiolink.o + .group 0x0000000000000000 0x8 bin/radiolink.o .text 0x0000000000000000 0x0 bin/radiolink.o .data 0x0000000000000000 0x0 bin/radiolink.o .bss 0x0000000000000000 0x0 bin/radiolink.o @@ -8454,27 +8860,30 @@ Discarded input sections .debug_macro 0x0000000000000000 0x58 bin/radiolink.o .debug_macro 0x0000000000000000 0x22 bin/radiolink.o .debug_macro 0x0000000000000000 0x1df bin/radiolink.o - .debug_macro 0x0000000000000000 0x46 bin/radiolink.o .debug_macro 0x0000000000000000 0x22 bin/radiolink.o .debug_macro 0x0000000000000000 0xca bin/radiolink.o .debug_macro 0x0000000000000000 0x16 bin/radiolink.o - .debug_macro 0x0000000000000000 0x168 bin/radiolink.o + .debug_macro 0x0000000000000000 0x52 bin/radiolink.o + .debug_macro 0x0000000000000000 0x18a bin/radiolink.o .debug_macro 0x0000000000000000 0x58 bin/radiolink.o + .debug_macro 0x0000000000000000 0x16 bin/radiolink.o + .debug_macro 0x0000000000000000 0x110 bin/radiolink.o + .debug_macro 0x0000000000000000 0x15d bin/radiolink.o + .debug_macro 0x0000000000000000 0xe4 bin/radiolink.o .debug_macro 0x0000000000000000 0x10 bin/radiolink.o - .debug_macro 0x0000000000000000 0x115 bin/radiolink.o - .debug_macro 0x0000000000000000 0xa5 bin/radiolink.o - .debug_macro 0x0000000000000000 0x12 bin/radiolink.o .debug_macro 0x0000000000000000 0x1f bin/radiolink.o - .debug_macro 0x0000000000000000 0x1fc bin/radiolink.o - .debug_macro 0x0000000000000000 0x5e bin/radiolink.o - .debug_macro 0x0000000000000000 0x57 bin/radiolink.o - .debug_macro 0x0000000000000000 0x9c bin/radiolink.o - .debug_macro 0x0000000000000000 0x78 bin/radiolink.o + .debug_macro 0x0000000000000000 0x3a7 bin/radiolink.o + .debug_macro 0x0000000000000000 0xc0 bin/radiolink.o + .debug_macro 0x0000000000000000 0x9a bin/radiolink.o + .debug_macro 0x0000000000000000 0xb0 bin/radiolink.o + .debug_macro 0x0000000000000000 0x7f bin/radiolink.o .debug_macro 0x0000000000000000 0x94 bin/radiolink.o .debug_macro 0x0000000000000000 0x1c bin/radiolink.o .debug_macro 0x0000000000000000 0x64 bin/radiolink.o .debug_macro 0x0000000000000000 0xa0 bin/radiolink.o .debug_macro 0x0000000000000000 0x28 bin/radiolink.o + .debug_macro 0x0000000000000000 0x10 bin/radiolink.o + .group 0x0000000000000000 0x8 bin/ow_syslink.o .group 0x0000000000000000 0x8 bin/ow_syslink.o .group 0x0000000000000000 0x8 bin/ow_syslink.o .group 0x0000000000000000 0x8 bin/ow_syslink.o @@ -8513,6 +8922,7 @@ Discarded input sections .text 0x0000000000000000 0x0 bin/ow_syslink.o .data 0x0000000000000000 0x0 bin/ow_syslink.o .bss 0x0000000000000000 0x0 bin/ow_syslink.o + .text.owTest 0x0000000000000000 0x9c bin/ow_syslink.o .debug_macro 0x0000000000000000 0x89e bin/ow_syslink.o .debug_macro 0x0000000000000000 0x58 bin/ow_syslink.o .debug_macro 0x0000000000000000 0x22 bin/ow_syslink.o @@ -8527,23 +8937,24 @@ Discarded input sections .debug_macro 0x0000000000000000 0x29d bin/ow_syslink.o .debug_macro 0x0000000000000000 0x10 bin/ow_syslink.o .debug_macro 0x0000000000000000 0x35 bin/ow_syslink.o - .debug_macro 0x0000000000000000 0x46 bin/ow_syslink.o + .debug_macro 0x0000000000000000 0x58 bin/ow_syslink.o + .debug_macro 0x0000000000000000 0x22 bin/ow_syslink.o + .debug_macro 0x0000000000000000 0x1df bin/ow_syslink.o .debug_macro 0x0000000000000000 0x22 bin/ow_syslink.o .debug_macro 0x0000000000000000 0xca bin/ow_syslink.o .debug_macro 0x0000000000000000 0x16 bin/ow_syslink.o - .debug_macro 0x0000000000000000 0x168 bin/ow_syslink.o + .debug_macro 0x0000000000000000 0x52 bin/ow_syslink.o + .debug_macro 0x0000000000000000 0x18a bin/ow_syslink.o .debug_macro 0x0000000000000000 0x58 bin/ow_syslink.o + .debug_macro 0x0000000000000000 0x16 bin/ow_syslink.o + .debug_macro 0x0000000000000000 0x110 bin/ow_syslink.o + .debug_macro 0x0000000000000000 0x15d bin/ow_syslink.o + .debug_macro 0x0000000000000000 0xe4 bin/ow_syslink.o .debug_macro 0x0000000000000000 0x10 bin/ow_syslink.o - .debug_macro 0x0000000000000000 0x115 bin/ow_syslink.o - .debug_macro 0x0000000000000000 0xa5 bin/ow_syslink.o - .debug_macro 0x0000000000000000 0x12 bin/ow_syslink.o .debug_macro 0x0000000000000000 0x1f bin/ow_syslink.o - .debug_macro 0x0000000000000000 0x1fc bin/ow_syslink.o - .debug_macro 0x0000000000000000 0x9c bin/ow_syslink.o - .debug_macro 0x0000000000000000 0x78 bin/ow_syslink.o - .debug_macro 0x0000000000000000 0x58 bin/ow_syslink.o - .debug_macro 0x0000000000000000 0x22 bin/ow_syslink.o - .debug_macro 0x0000000000000000 0x1df bin/ow_syslink.o + .debug_macro 0x0000000000000000 0x3a7 bin/ow_syslink.o + .debug_macro 0x0000000000000000 0xb0 bin/ow_syslink.o + .debug_macro 0x0000000000000000 0x7f bin/ow_syslink.o .debug_macro 0x0000000000000000 0x94 bin/ow_syslink.o .debug_macro 0x0000000000000000 0x16 bin/ow_syslink.o .debug_macro 0x0000000000000000 0x2e bin/ow_syslink.o @@ -8616,6 +9027,8 @@ Discarded input sections .group 0x0000000000000000 0x8 bin/proximity.o .group 0x0000000000000000 0x8 bin/proximity.o .group 0x0000000000000000 0x8 bin/proximity.o + .group 0x0000000000000000 0x8 bin/proximity.o + .group 0x0000000000000000 0x8 bin/proximity.o .text 0x0000000000000000 0x0 bin/proximity.o .data 0x0000000000000000 0x0 bin/proximity.o .bss 0x0000000000000000 0x0 bin/proximity.o @@ -8637,7 +9050,7 @@ Discarded input sections .debug_aranges 0x0000000000000000 0x40 bin/proximity.o .debug_ranges 0x0000000000000000 0x30 bin/proximity.o - .debug_macro 0x0000000000000000 0x379 bin/proximity.o + .debug_macro 0x0000000000000000 0x38d bin/proximity.o .debug_macro 0x0000000000000000 0x89e bin/proximity.o .debug_macro 0x0000000000000000 0x58 bin/proximity.o .debug_macro 0x0000000000000000 0x22 bin/proximity.o @@ -8652,25 +9065,27 @@ Discarded input sections .debug_macro 0x0000000000000000 0x29d bin/proximity.o .debug_macro 0x0000000000000000 0x10 bin/proximity.o .debug_macro 0x0000000000000000 0x35 bin/proximity.o - .debug_macro 0x0000000000000000 0x46 bin/proximity.o + .debug_macro 0x0000000000000000 0x58 bin/proximity.o + .debug_macro 0x0000000000000000 0x22 bin/proximity.o + .debug_macro 0x0000000000000000 0x1df bin/proximity.o .debug_macro 0x0000000000000000 0x22 bin/proximity.o .debug_macro 0x0000000000000000 0xca bin/proximity.o .debug_macro 0x0000000000000000 0x16 bin/proximity.o - .debug_macro 0x0000000000000000 0x168 bin/proximity.o + .debug_macro 0x0000000000000000 0x52 bin/proximity.o + .debug_macro 0x0000000000000000 0x18a bin/proximity.o .debug_macro 0x0000000000000000 0x58 bin/proximity.o + .debug_macro 0x0000000000000000 0x16 bin/proximity.o + .debug_macro 0x0000000000000000 0x110 bin/proximity.o + .debug_macro 0x0000000000000000 0x15d bin/proximity.o + .debug_macro 0x0000000000000000 0xe4 bin/proximity.o .debug_macro 0x0000000000000000 0x10 bin/proximity.o - .debug_macro 0x0000000000000000 0x115 bin/proximity.o - .debug_macro 0x0000000000000000 0xa5 bin/proximity.o - .debug_macro 0x0000000000000000 0x12 bin/proximity.o .debug_macro 0x0000000000000000 0x1f bin/proximity.o - .debug_macro 0x0000000000000000 0x1fc bin/proximity.o - .debug_macro 0x0000000000000000 0x5e bin/proximity.o - .debug_macro 0x0000000000000000 0x57 bin/proximity.o + .debug_macro 0x0000000000000000 0x3a7 bin/proximity.o + .debug_macro 0x0000000000000000 0xc0 bin/proximity.o + .debug_macro 0x0000000000000000 0x9a bin/proximity.o + .debug_macro 0x0000000000000000 0x103 bin/proximity.o .debug_macro 0x0000000000000000 0x5e bin/proximity.o .debug_macro 0x0000000000000000 0x3b bin/proximity.o - .debug_macro 0x0000000000000000 0x58 bin/proximity.o - .debug_macro 0x0000000000000000 0x22 bin/proximity.o - .debug_macro 0x0000000000000000 0x1df bin/proximity.o .debug_macro 0x0000000000000000 0x18 bin/proximity.o .debug_macro 0x0000000000000000 0x42 bin/proximity.o .debug_macro 0x0000000000000000 0xc91 bin/proximity.o @@ -8707,214 +9122,12 @@ Discarded input sections .debug_macro 0x0000000000000000 0x10 bin/proximity.o .debug_macro 0x0000000000000000 0xa6 bin/proximity.o .debug_macro 0x0000000000000000 0x64 bin/proximity.o - .debug_line 0x0000000000000000 0x773 bin/proximity.o - .debug_str 0x0000000000000000 0x629bb bin/proximity.o + .debug_line 0x0000000000000000 0x7a9 bin/proximity.o + .debug_str 0x0000000000000000 0x649ea bin/proximity.o .comment 0x0000000000000000 0x71 bin/proximity.o .debug_frame 0x0000000000000000 0x68 bin/proximity.o .ARM.attributes 0x0000000000000000 0x39 bin/proximity.o - .group 0x0000000000000000 0x8 bin/neopixelring.o - .group 0x0000000000000000 0x8 bin/neopixelring.o - .group 0x0000000000000000 0x8 bin/neopixelring.o - .group 0x0000000000000000 0x8 bin/neopixelring.o - .group 0x0000000000000000 0x8 bin/neopixelring.o - .group 0x0000000000000000 0x8 bin/neopixelring.o - .group 0x0000000000000000 0x8 bin/neopixelring.o - .group 0x0000000000000000 0x8 bin/neopixelring.o - .group 0x0000000000000000 0x8 bin/neopixelring.o - .group 0x0000000000000000 0x8 bin/neopixelring.o - .group 0x0000000000000000 0x8 bin/neopixelring.o - .group 0x0000000000000000 0x8 bin/neopixelring.o - .group 0x0000000000000000 0x8 bin/neopixelring.o - .group 0x0000000000000000 0x8 bin/neopixelring.o - .group 0x0000000000000000 0x8 bin/neopixelring.o - .group 0x0000000000000000 0x8 bin/neopixelring.o - .group 0x0000000000000000 0x8 bin/neopixelring.o - .group 0x0000000000000000 0x8 bin/neopixelring.o - .group 0x0000000000000000 0x8 bin/neopixelring.o - .group 0x0000000000000000 0x8 bin/neopixelring.o - .group 0x0000000000000000 0x8 bin/neopixelring.o - .group 0x0000000000000000 0x8 bin/neopixelring.o - .group 0x0000000000000000 0x8 bin/neopixelring.o - .group 0x0000000000000000 0x8 bin/neopixelring.o - .group 0x0000000000000000 0x8 bin/neopixelring.o - .group 0x0000000000000000 0x8 bin/neopixelring.o - .group 0x0000000000000000 0x8 bin/neopixelring.o - .group 0x0000000000000000 0x8 bin/neopixelring.o - .group 0x0000000000000000 0x8 bin/neopixelring.o - .group 0x0000000000000000 0x8 bin/neopixelring.o - .group 0x0000000000000000 0x8 bin/neopixelring.o - .group 0x0000000000000000 0x8 bin/neopixelring.o - .group 0x0000000000000000 0x8 bin/neopixelring.o - .group 0x0000000000000000 0x8 bin/neopixelring.o - .group 0x0000000000000000 0x8 bin/neopixelring.o - .group 0x0000000000000000 0x8 bin/neopixelring.o - .group 0x0000000000000000 0x8 bin/neopixelring.o - .group 0x0000000000000000 0x8 bin/neopixelring.o - .group 0x0000000000000000 0x8 bin/neopixelring.o - .group 0x0000000000000000 0x8 bin/neopixelring.o - .group 0x0000000000000000 0x8 bin/neopixelring.o - .group 0x0000000000000000 0x8 bin/neopixelring.o - .group 0x0000000000000000 0x8 bin/neopixelring.o - .group 0x0000000000000000 0x8 bin/neopixelring.o - .group 0x0000000000000000 0x8 bin/neopixelring.o - .group 0x0000000000000000 0x8 bin/neopixelring.o - .group 0x0000000000000000 0x8 bin/neopixelring.o - .group 0x0000000000000000 0x8 bin/neopixelring.o - .group 0x0000000000000000 0x8 bin/neopixelring.o - .group 0x0000000000000000 0x8 bin/neopixelring.o - .group 0x0000000000000000 0x8 bin/neopixelring.o - .group 0x0000000000000000 0x8 bin/neopixelring.o - .group 0x0000000000000000 0x8 bin/neopixelring.o - .group 0x0000000000000000 0x8 bin/neopixelring.o - .group 0x0000000000000000 0x8 bin/neopixelring.o - .group 0x0000000000000000 0x8 bin/neopixelring.o - .group 0x0000000000000000 0x8 bin/neopixelring.o - .group 0x0000000000000000 0x8 bin/neopixelring.o - .group 0x0000000000000000 0x8 bin/neopixelring.o - .group 0x0000000000000000 0x8 bin/neopixelring.o - .group 0x0000000000000000 0x8 bin/neopixelring.o - .group 0x0000000000000000 0x8 bin/neopixelring.o - .group 0x0000000000000000 0x8 bin/neopixelring.o - .group 0x0000000000000000 0x8 bin/neopixelring.o - .group 0x0000000000000000 0x8 bin/neopixelring.o - .group 0x0000000000000000 0x8 bin/neopixelring.o - .group 0x0000000000000000 0x8 bin/neopixelring.o - .group 0x0000000000000000 0x8 bin/neopixelring.o - .group 0x0000000000000000 0x8 bin/neopixelring.o - .text 0x0000000000000000 0x0 bin/neopixelring.o - .data 0x0000000000000000 0x0 bin/neopixelring.o - .bss 0x0000000000000000 0x0 bin/neopixelring.o - .debug_macro 0x0000000000000000 0x89e bin/neopixelring.o - .debug_macro 0x0000000000000000 0x22 bin/neopixelring.o - .debug_macro 0x0000000000000000 0x44 bin/neopixelring.o - .debug_macro 0x0000000000000000 0x58 bin/neopixelring.o - .debug_macro 0x0000000000000000 0x22 bin/neopixelring.o - .debug_macro 0x0000000000000000 0x1df bin/neopixelring.o - .debug_macro 0x0000000000000000 0x22 bin/neopixelring.o - .debug_macro 0x0000000000000000 0x58 bin/neopixelring.o - .debug_macro 0x0000000000000000 0x35 bin/neopixelring.o - .debug_macro 0x0000000000000000 0x9c bin/neopixelring.o - .debug_macro 0x0000000000000000 0x166 bin/neopixelring.o - .debug_macro 0x0000000000000000 0x52 bin/neopixelring.o - .debug_macro 0x0000000000000000 0x16 bin/neopixelring.o - .debug_macro 0x0000000000000000 0x43 bin/neopixelring.o - .debug_macro 0x0000000000000000 0x180 bin/neopixelring.o - .debug_macro 0x0000000000000000 0x1e1 bin/neopixelring.o - .debug_macro 0x0000000000000000 0x5e bin/neopixelring.o - .debug_macro 0x0000000000000000 0x3b bin/neopixelring.o - .debug_macro 0x0000000000000000 0x18 bin/neopixelring.o - .debug_macro 0x0000000000000000 0x42 bin/neopixelring.o - .debug_macro 0x0000000000000000 0xc91 bin/neopixelring.o - .debug_macro 0x0000000000000000 0x8bb0 bin/neopixelring.o - .debug_macro 0x0000000000000000 0x44f bin/neopixelring.o - .debug_macro 0x0000000000000000 0xb2 bin/neopixelring.o - .debug_macro 0x0000000000000000 0x477 bin/neopixelring.o - .debug_macro 0x0000000000000000 0xae bin/neopixelring.o - .debug_macro 0x0000000000000000 0x41c bin/neopixelring.o - .debug_macro 0x0000000000000000 0x2bc bin/neopixelring.o - .debug_macro 0x0000000000000000 0x2bb bin/neopixelring.o - .debug_macro 0x0000000000000000 0x64 bin/neopixelring.o - .debug_macro 0x0000000000000000 0xe7 bin/neopixelring.o - .debug_macro 0x0000000000000000 0x62f bin/neopixelring.o - .debug_macro 0x0000000000000000 0x57b bin/neopixelring.o - .debug_macro 0x0000000000000000 0x342 bin/neopixelring.o - .debug_macro 0x0000000000000000 0x36c bin/neopixelring.o - .debug_macro 0x0000000000000000 0xf7 bin/neopixelring.o - .debug_macro 0x0000000000000000 0x73b bin/neopixelring.o - .debug_macro 0x0000000000000000 0x223 bin/neopixelring.o - .debug_macro 0x0000000000000000 0x34 bin/neopixelring.o - .debug_macro 0x0000000000000000 0x82 bin/neopixelring.o - .debug_macro 0x0000000000000000 0x144 bin/neopixelring.o - .debug_macro 0x0000000000000000 0xc3 bin/neopixelring.o - .debug_macro 0x0000000000000000 0x40 bin/neopixelring.o - .debug_macro 0x0000000000000000 0x3cf bin/neopixelring.o - .debug_macro 0x0000000000000000 0x188 bin/neopixelring.o - .debug_macro 0x0000000000000000 0x149 bin/neopixelring.o - .debug_macro 0x0000000000000000 0x279 bin/neopixelring.o - .debug_macro 0x0000000000000000 0x35 bin/neopixelring.o - .debug_macro 0x0000000000000000 0x46 bin/neopixelring.o - .debug_macro 0x0000000000000000 0xca bin/neopixelring.o - .debug_macro 0x0000000000000000 0x16 bin/neopixelring.o - .debug_macro 0x0000000000000000 0x168 bin/neopixelring.o - .debug_macro 0x0000000000000000 0x58 bin/neopixelring.o - .debug_macro 0x0000000000000000 0x10 bin/neopixelring.o - .debug_macro 0x0000000000000000 0x115 bin/neopixelring.o - .debug_macro 0x0000000000000000 0xa5 bin/neopixelring.o - .debug_macro 0x0000000000000000 0x12 bin/neopixelring.o - .debug_macro 0x0000000000000000 0x1f bin/neopixelring.o - .debug_macro 0x0000000000000000 0x1fc bin/neopixelring.o - .debug_macro 0x0000000000000000 0x5e bin/neopixelring.o - .debug_macro 0x0000000000000000 0x5d bin/neopixelring.o - .debug_macro 0x0000000000000000 0x5b bin/neopixelring.o - .debug_macro 0x0000000000000000 0xa6 bin/neopixelring.o - .debug_macro 0x0000000000000000 0x9c bin/neopixelring.o - .debug_macro 0x0000000000000000 0x78 bin/neopixelring.o - .debug_macro 0x0000000000000000 0x40 bin/neopixelring.o - .debug_macro 0x0000000000000000 0x94 bin/neopixelring.o - .debug_macro 0x0000000000000000 0x4c bin/neopixelring.o - .debug_macro 0x0000000000000000 0x64 bin/neopixelring.o - .group 0x0000000000000000 0x8 bin/expbrd.o - .group 0x0000000000000000 0x8 bin/expbrd.o - .group 0x0000000000000000 0x8 bin/expbrd.o - .group 0x0000000000000000 0x8 bin/expbrd.o - .group 0x0000000000000000 0x8 bin/expbrd.o - .group 0x0000000000000000 0x8 bin/expbrd.o - .group 0x0000000000000000 0x8 bin/expbrd.o - .group 0x0000000000000000 0x8 bin/expbrd.o - .group 0x0000000000000000 0x8 bin/expbrd.o - .group 0x0000000000000000 0x8 bin/expbrd.o - .group 0x0000000000000000 0x8 bin/expbrd.o - .group 0x0000000000000000 0x8 bin/expbrd.o - .group 0x0000000000000000 0x8 bin/expbrd.o - .group 0x0000000000000000 0x8 bin/expbrd.o - .group 0x0000000000000000 0x8 bin/expbrd.o - .group 0x0000000000000000 0x8 bin/expbrd.o - .group 0x0000000000000000 0x8 bin/expbrd.o - .group 0x0000000000000000 0x8 bin/expbrd.o - .group 0x0000000000000000 0x8 bin/expbrd.o - .group 0x0000000000000000 0x8 bin/expbrd.o - .group 0x0000000000000000 0x8 bin/expbrd.o - .group 0x0000000000000000 0x8 bin/expbrd.o - .group 0x0000000000000000 0x8 bin/expbrd.o - .group 0x0000000000000000 0x8 bin/expbrd.o - .group 0x0000000000000000 0x8 bin/expbrd.o - .group 0x0000000000000000 0x8 bin/expbrd.o - .group 0x0000000000000000 0x8 bin/expbrd.o - .group 0x0000000000000000 0x8 bin/expbrd.o - .group 0x0000000000000000 0x8 bin/expbrd.o - .text 0x0000000000000000 0x0 bin/expbrd.o - .data 0x0000000000000000 0x0 bin/expbrd.o - .bss 0x0000000000000000 0x0 bin/expbrd.o - .debug_macro 0x0000000000000000 0x89e bin/expbrd.o - .debug_macro 0x0000000000000000 0x166 bin/expbrd.o - .debug_macro 0x0000000000000000 0x46 bin/expbrd.o - .debug_macro 0x0000000000000000 0x22 bin/expbrd.o - .debug_macro 0x0000000000000000 0xca bin/expbrd.o - .debug_macro 0x0000000000000000 0x16 bin/expbrd.o - .debug_macro 0x0000000000000000 0x168 bin/expbrd.o - .debug_macro 0x0000000000000000 0x58 bin/expbrd.o - .debug_macro 0x0000000000000000 0x10 bin/expbrd.o - .debug_macro 0x0000000000000000 0x115 bin/expbrd.o - .debug_macro 0x0000000000000000 0xa5 bin/expbrd.o - .debug_macro 0x0000000000000000 0x12 bin/expbrd.o - .debug_macro 0x0000000000000000 0x1f bin/expbrd.o - .debug_macro 0x0000000000000000 0x1fc bin/expbrd.o - .debug_macro 0x0000000000000000 0x5e bin/expbrd.o - .debug_macro 0x0000000000000000 0x57 bin/expbrd.o - .debug_macro 0x0000000000000000 0x9c bin/expbrd.o - .debug_macro 0x0000000000000000 0x22 bin/expbrd.o - .debug_macro 0x0000000000000000 0x44 bin/expbrd.o - .debug_macro 0x0000000000000000 0x58 bin/expbrd.o - .debug_macro 0x0000000000000000 0x22 bin/expbrd.o - .debug_macro 0x0000000000000000 0x1df bin/expbrd.o - .debug_macro 0x0000000000000000 0x2e bin/expbrd.o - .debug_macro 0x0000000000000000 0x94 bin/expbrd.o - .debug_macro 0x0000000000000000 0x16 bin/expbrd.o - .debug_macro 0x0000000000000000 0x46 bin/expbrd.o - .debug_macro 0x0000000000000000 0x10 bin/expbrd.o - .debug_macro 0x0000000000000000 0x22 bin/expbrd.o - .group 0x0000000000000000 0x8 bin/platformservice.o .group 0x0000000000000000 0x8 bin/platformservice.o .group 0x0000000000000000 0x8 bin/platformservice.o .group 0x0000000000000000 0x8 bin/platformservice.o @@ -8953,24 +9166,23 @@ Discarded input sections .debug_macro 0x0000000000000000 0x89e bin/platformservice.o .debug_macro 0x0000000000000000 0x22 bin/platformservice.o .debug_macro 0x0000000000000000 0x166 bin/platformservice.o - .debug_macro 0x0000000000000000 0x46 bin/platformservice.o - .debug_macro 0x0000000000000000 0xca bin/platformservice.o - .debug_macro 0x0000000000000000 0x16 bin/platformservice.o - .debug_macro 0x0000000000000000 0x168 bin/platformservice.o - .debug_macro 0x0000000000000000 0x58 bin/platformservice.o - .debug_macro 0x0000000000000000 0x10 bin/platformservice.o - .debug_macro 0x0000000000000000 0x115 bin/platformservice.o - .debug_macro 0x0000000000000000 0xa5 bin/platformservice.o - .debug_macro 0x0000000000000000 0x12 bin/platformservice.o - .debug_macro 0x0000000000000000 0x1f bin/platformservice.o - .debug_macro 0x0000000000000000 0x1fc bin/platformservice.o - .debug_macro 0x0000000000000000 0x5e bin/platformservice.o - .debug_macro 0x0000000000000000 0x57 bin/platformservice.o .debug_macro 0x0000000000000000 0x22 bin/platformservice.o .debug_macro 0x0000000000000000 0x44 bin/platformservice.o .debug_macro 0x0000000000000000 0x58 bin/platformservice.o .debug_macro 0x0000000000000000 0x22 bin/platformservice.o .debug_macro 0x0000000000000000 0x1df bin/platformservice.o + .debug_macro 0x0000000000000000 0xca bin/platformservice.o + .debug_macro 0x0000000000000000 0x16 bin/platformservice.o + .debug_macro 0x0000000000000000 0x52 bin/platformservice.o + .debug_macro 0x0000000000000000 0x18a bin/platformservice.o + .debug_macro 0x0000000000000000 0x58 bin/platformservice.o + .debug_macro 0x0000000000000000 0x16 bin/platformservice.o + .debug_macro 0x0000000000000000 0x110 bin/platformservice.o + .debug_macro 0x0000000000000000 0x15d bin/platformservice.o + .debug_macro 0x0000000000000000 0xe4 bin/platformservice.o + .debug_macro 0x0000000000000000 0x10 bin/platformservice.o + .debug_macro 0x0000000000000000 0x1f bin/platformservice.o + .debug_macro 0x0000000000000000 0x3a7 bin/platformservice.o .debug_macro 0x0000000000000000 0x58 bin/platformservice.o .debug_macro 0x0000000000000000 0x35 bin/platformservice.o .debug_macro 0x0000000000000000 0x9c bin/platformservice.o @@ -8983,235 +9195,480 @@ Discarded input sections .debug_macro 0x0000000000000000 0x35 bin/platformservice.o .debug_macro 0x0000000000000000 0x1c bin/platformservice.o .debug_macro 0x0000000000000000 0x94 bin/platformservice.o - .group 0x0000000000000000 0x8 bin/bigquad.o - .group 0x0000000000000000 0x8 bin/bigquad.o - .group 0x0000000000000000 0x8 bin/bigquad.o - .group 0x0000000000000000 0x8 bin/bigquad.o - .group 0x0000000000000000 0x8 bin/bigquad.o - .group 0x0000000000000000 0x8 bin/bigquad.o - .group 0x0000000000000000 0x8 bin/bigquad.o - .group 0x0000000000000000 0x8 bin/bigquad.o - .group 0x0000000000000000 0x8 bin/bigquad.o - .group 0x0000000000000000 0x8 bin/bigquad.o - .group 0x0000000000000000 0x8 bin/bigquad.o - .group 0x0000000000000000 0x8 bin/bigquad.o - .group 0x0000000000000000 0x8 bin/bigquad.o - .group 0x0000000000000000 0x8 bin/bigquad.o - .group 0x0000000000000000 0x8 bin/bigquad.o - .group 0x0000000000000000 0x8 bin/bigquad.o - .group 0x0000000000000000 0x8 bin/bigquad.o - .group 0x0000000000000000 0x8 bin/bigquad.o - .group 0x0000000000000000 0x8 bin/bigquad.o - .group 0x0000000000000000 0x8 bin/bigquad.o - .group 0x0000000000000000 0x8 bin/bigquad.o - .group 0x0000000000000000 0x8 bin/bigquad.o - .group 0x0000000000000000 0x8 bin/bigquad.o - .group 0x0000000000000000 0x8 bin/bigquad.o - .group 0x0000000000000000 0x8 bin/bigquad.o - .group 0x0000000000000000 0x8 bin/bigquad.o - .group 0x0000000000000000 0x8 bin/bigquad.o - .group 0x0000000000000000 0x8 bin/bigquad.o - .group 0x0000000000000000 0x8 bin/bigquad.o - .group 0x0000000000000000 0x8 bin/bigquad.o - .group 0x0000000000000000 0x8 bin/bigquad.o - .group 0x0000000000000000 0x8 bin/bigquad.o - .group 0x0000000000000000 0x8 bin/bigquad.o - .group 0x0000000000000000 0x8 bin/bigquad.o - .group 0x0000000000000000 0x8 bin/bigquad.o - .group 0x0000000000000000 0x8 bin/bigquad.o - .group 0x0000000000000000 0x8 bin/bigquad.o - .group 0x0000000000000000 0x8 bin/bigquad.o - .group 0x0000000000000000 0x8 bin/bigquad.o - .group 0x0000000000000000 0x8 bin/bigquad.o - .group 0x0000000000000000 0x8 bin/bigquad.o - .group 0x0000000000000000 0x8 bin/bigquad.o - .group 0x0000000000000000 0x8 bin/bigquad.o - .group 0x0000000000000000 0x8 bin/bigquad.o - .group 0x0000000000000000 0x8 bin/bigquad.o - .group 0x0000000000000000 0x8 bin/bigquad.o - .group 0x0000000000000000 0x8 bin/bigquad.o - .group 0x0000000000000000 0x8 bin/bigquad.o - .group 0x0000000000000000 0x8 bin/bigquad.o - .group 0x0000000000000000 0x8 bin/bigquad.o - .group 0x0000000000000000 0x8 bin/bigquad.o - .group 0x0000000000000000 0x8 bin/bigquad.o - .group 0x0000000000000000 0x8 bin/bigquad.o - .group 0x0000000000000000 0x8 bin/bigquad.o - .group 0x0000000000000000 0x8 bin/bigquad.o - .group 0x0000000000000000 0x8 bin/bigquad.o - .text 0x0000000000000000 0x0 bin/bigquad.o - .data 0x0000000000000000 0x0 bin/bigquad.o - .bss 0x0000000000000000 0x0 bin/bigquad.o - .text.bigquadTest - 0x0000000000000000 0x10 bin/bigquad.o - .debug_macro 0x0000000000000000 0x89e bin/bigquad.o - .debug_macro 0x0000000000000000 0x22 bin/bigquad.o - .debug_macro 0x0000000000000000 0x44 bin/bigquad.o - .debug_macro 0x0000000000000000 0x58 bin/bigquad.o - .debug_macro 0x0000000000000000 0x22 bin/bigquad.o - .debug_macro 0x0000000000000000 0x1df bin/bigquad.o - .debug_macro 0x0000000000000000 0x58 bin/bigquad.o - .debug_macro 0x0000000000000000 0x35 bin/bigquad.o - .debug_macro 0x0000000000000000 0x9c bin/bigquad.o - .debug_macro 0x0000000000000000 0x166 bin/bigquad.o - .debug_macro 0x0000000000000000 0x52 bin/bigquad.o - .debug_macro 0x0000000000000000 0x16 bin/bigquad.o - .debug_macro 0x0000000000000000 0x43 bin/bigquad.o - .debug_macro 0x0000000000000000 0x180 bin/bigquad.o - .debug_macro 0x0000000000000000 0x29d bin/bigquad.o - .debug_macro 0x0000000000000000 0x10 bin/bigquad.o - .debug_macro 0x0000000000000000 0x35 bin/bigquad.o - .debug_macro 0x0000000000000000 0x5e bin/bigquad.o - .debug_macro 0x0000000000000000 0x3b bin/bigquad.o - .debug_macro 0x0000000000000000 0x18 bin/bigquad.o - .debug_macro 0x0000000000000000 0x42 bin/bigquad.o - .debug_macro 0x0000000000000000 0xc91 bin/bigquad.o - .debug_macro 0x0000000000000000 0x8bb0 bin/bigquad.o - .debug_macro 0x0000000000000000 0x44f bin/bigquad.o - .debug_macro 0x0000000000000000 0xb2 bin/bigquad.o - .debug_macro 0x0000000000000000 0x477 bin/bigquad.o - .debug_macro 0x0000000000000000 0xae bin/bigquad.o - .debug_macro 0x0000000000000000 0x41c bin/bigquad.o - .debug_macro 0x0000000000000000 0x2bc bin/bigquad.o - .debug_macro 0x0000000000000000 0x2bb bin/bigquad.o - .debug_macro 0x0000000000000000 0x64 bin/bigquad.o - .debug_macro 0x0000000000000000 0xe7 bin/bigquad.o - .debug_macro 0x0000000000000000 0x62f bin/bigquad.o - .debug_macro 0x0000000000000000 0x57b bin/bigquad.o - .debug_macro 0x0000000000000000 0x342 bin/bigquad.o - .debug_macro 0x0000000000000000 0x36c bin/bigquad.o - .debug_macro 0x0000000000000000 0xf7 bin/bigquad.o - .debug_macro 0x0000000000000000 0x73b bin/bigquad.o - .debug_macro 0x0000000000000000 0x223 bin/bigquad.o - .debug_macro 0x0000000000000000 0x34 bin/bigquad.o - .debug_macro 0x0000000000000000 0x82 bin/bigquad.o - .debug_macro 0x0000000000000000 0x144 bin/bigquad.o - .debug_macro 0x0000000000000000 0xc3 bin/bigquad.o - .debug_macro 0x0000000000000000 0x40 bin/bigquad.o - .debug_macro 0x0000000000000000 0x3cf bin/bigquad.o - .debug_macro 0x0000000000000000 0x188 bin/bigquad.o - .debug_macro 0x0000000000000000 0x149 bin/bigquad.o - .debug_macro 0x0000000000000000 0x279 bin/bigquad.o - .debug_macro 0x0000000000000000 0x35 bin/bigquad.o - .debug_macro 0x0000000000000000 0x22 bin/bigquad.o - .debug_macro 0x0000000000000000 0xca bin/bigquad.o - .debug_macro 0x0000000000000000 0x16 bin/bigquad.o - .debug_macro 0x0000000000000000 0x168 bin/bigquad.o - .debug_macro 0x0000000000000000 0x58 bin/bigquad.o - .debug_macro 0x0000000000000000 0x2e bin/bigquad.o - .group 0x0000000000000000 0x8 bin/exptest.o - .group 0x0000000000000000 0x8 bin/exptest.o - .group 0x0000000000000000 0x8 bin/exptest.o - .group 0x0000000000000000 0x8 bin/exptest.o - .group 0x0000000000000000 0x8 bin/exptest.o - .group 0x0000000000000000 0x8 bin/exptest.o - .group 0x0000000000000000 0x8 bin/exptest.o - .group 0x0000000000000000 0x8 bin/exptest.o - .group 0x0000000000000000 0x8 bin/exptest.o - .group 0x0000000000000000 0x8 bin/exptest.o - .group 0x0000000000000000 0x8 bin/exptest.o - .group 0x0000000000000000 0x8 bin/exptest.o - .group 0x0000000000000000 0x8 bin/exptest.o - .group 0x0000000000000000 0x8 bin/exptest.o - .group 0x0000000000000000 0x8 bin/exptest.o - .group 0x0000000000000000 0x8 bin/exptest.o - .group 0x0000000000000000 0x8 bin/exptest.o - .group 0x0000000000000000 0x8 bin/exptest.o - .group 0x0000000000000000 0x8 bin/exptest.o - .group 0x0000000000000000 0x8 bin/exptest.o - .group 0x0000000000000000 0x8 bin/exptest.o - .group 0x0000000000000000 0x8 bin/exptest.o - .group 0x0000000000000000 0x8 bin/exptest.o - .group 0x0000000000000000 0x8 bin/exptest.o - .group 0x0000000000000000 0x8 bin/exptest.o - .group 0x0000000000000000 0x8 bin/exptest.o - .group 0x0000000000000000 0x8 bin/exptest.o - .group 0x0000000000000000 0x8 bin/exptest.o - .group 0x0000000000000000 0x8 bin/exptest.o - .group 0x0000000000000000 0x8 bin/exptest.o - .group 0x0000000000000000 0x8 bin/exptest.o - .group 0x0000000000000000 0x8 bin/exptest.o - .group 0x0000000000000000 0x8 bin/exptest.o - .group 0x0000000000000000 0x8 bin/exptest.o - .group 0x0000000000000000 0x8 bin/exptest.o - .group 0x0000000000000000 0x8 bin/exptest.o - .group 0x0000000000000000 0x8 bin/exptest.o - .group 0x0000000000000000 0x8 bin/exptest.o - .group 0x0000000000000000 0x8 bin/exptest.o - .group 0x0000000000000000 0x8 bin/exptest.o - .group 0x0000000000000000 0x8 bin/exptest.o - .group 0x0000000000000000 0x8 bin/exptest.o - .group 0x0000000000000000 0x8 bin/exptest.o - .group 0x0000000000000000 0x8 bin/exptest.o - .group 0x0000000000000000 0x8 bin/exptest.o - .group 0x0000000000000000 0x8 bin/exptest.o - .group 0x0000000000000000 0x8 bin/exptest.o - .group 0x0000000000000000 0x8 bin/exptest.o - .group 0x0000000000000000 0x8 bin/exptest.o - .group 0x0000000000000000 0x8 bin/exptest.o - .group 0x0000000000000000 0x8 bin/exptest.o - .group 0x0000000000000000 0x8 bin/exptest.o - .group 0x0000000000000000 0x8 bin/exptest.o - .group 0x0000000000000000 0x8 bin/exptest.o - .group 0x0000000000000000 0x8 bin/exptest.o - .text 0x0000000000000000 0x0 bin/exptest.o - .data 0x0000000000000000 0x0 bin/exptest.o - .bss 0x0000000000000000 0x0 bin/exptest.o - .debug_macro 0x0000000000000000 0x89e bin/exptest.o - .debug_macro 0x0000000000000000 0x22 bin/exptest.o - .debug_macro 0x0000000000000000 0x44 bin/exptest.o - .debug_macro 0x0000000000000000 0x58 bin/exptest.o - .debug_macro 0x0000000000000000 0x22 bin/exptest.o - .debug_macro 0x0000000000000000 0x1df bin/exptest.o - .debug_macro 0x0000000000000000 0x58 bin/exptest.o - .debug_macro 0x0000000000000000 0x35 bin/exptest.o - .debug_macro 0x0000000000000000 0x9c bin/exptest.o - .debug_macro 0x0000000000000000 0x166 bin/exptest.o - .debug_macro 0x0000000000000000 0x52 bin/exptest.o - .debug_macro 0x0000000000000000 0x16 bin/exptest.o - .debug_macro 0x0000000000000000 0x43 bin/exptest.o - .debug_macro 0x0000000000000000 0x180 bin/exptest.o - .debug_macro 0x0000000000000000 0x29d bin/exptest.o - .debug_macro 0x0000000000000000 0x10 bin/exptest.o - .debug_macro 0x0000000000000000 0x35 bin/exptest.o - .debug_macro 0x0000000000000000 0x5e bin/exptest.o - .debug_macro 0x0000000000000000 0x3b bin/exptest.o - .debug_macro 0x0000000000000000 0x18 bin/exptest.o - .debug_macro 0x0000000000000000 0x42 bin/exptest.o - .debug_macro 0x0000000000000000 0xc91 bin/exptest.o - .debug_macro 0x0000000000000000 0x8bb0 bin/exptest.o - .debug_macro 0x0000000000000000 0x44f bin/exptest.o - .debug_macro 0x0000000000000000 0xb2 bin/exptest.o - .debug_macro 0x0000000000000000 0x477 bin/exptest.o - .debug_macro 0x0000000000000000 0xae bin/exptest.o - .debug_macro 0x0000000000000000 0x41c bin/exptest.o - .debug_macro 0x0000000000000000 0x2bc bin/exptest.o - .debug_macro 0x0000000000000000 0x2bb bin/exptest.o - .debug_macro 0x0000000000000000 0x64 bin/exptest.o - .debug_macro 0x0000000000000000 0xe7 bin/exptest.o - .debug_macro 0x0000000000000000 0x62f bin/exptest.o - .debug_macro 0x0000000000000000 0x57b bin/exptest.o - .debug_macro 0x0000000000000000 0x342 bin/exptest.o - .debug_macro 0x0000000000000000 0x36c bin/exptest.o - .debug_macro 0x0000000000000000 0xf7 bin/exptest.o - .debug_macro 0x0000000000000000 0x73b bin/exptest.o - .debug_macro 0x0000000000000000 0x223 bin/exptest.o - .debug_macro 0x0000000000000000 0x34 bin/exptest.o - .debug_macro 0x0000000000000000 0x82 bin/exptest.o - .debug_macro 0x0000000000000000 0x144 bin/exptest.o - .debug_macro 0x0000000000000000 0xc3 bin/exptest.o - .debug_macro 0x0000000000000000 0x40 bin/exptest.o - .debug_macro 0x0000000000000000 0x3cf bin/exptest.o - .debug_macro 0x0000000000000000 0x188 bin/exptest.o - .debug_macro 0x0000000000000000 0x149 bin/exptest.o - .debug_macro 0x0000000000000000 0x279 bin/exptest.o - .debug_macro 0x0000000000000000 0x35 bin/exptest.o - .debug_macro 0x0000000000000000 0x22 bin/exptest.o - .debug_macro 0x0000000000000000 0xca bin/exptest.o - .debug_macro 0x0000000000000000 0x16 bin/exptest.o - .debug_macro 0x0000000000000000 0x168 bin/exptest.o - .debug_macro 0x0000000000000000 0x58 bin/exptest.o - .debug_macro 0x0000000000000000 0x2e bin/exptest.o + .group 0x0000000000000000 0x8 bin/sound_cf2.o + .group 0x0000000000000000 0x8 bin/sound_cf2.o + .group 0x0000000000000000 0x8 bin/sound_cf2.o + .group 0x0000000000000000 0x8 bin/sound_cf2.o + .group 0x0000000000000000 0x8 bin/sound_cf2.o + .group 0x0000000000000000 0x8 bin/sound_cf2.o + .group 0x0000000000000000 0x8 bin/sound_cf2.o + .group 0x0000000000000000 0x8 bin/sound_cf2.o + .group 0x0000000000000000 0x8 bin/sound_cf2.o + .group 0x0000000000000000 0x8 bin/sound_cf2.o + .group 0x0000000000000000 0x8 bin/sound_cf2.o + .group 0x0000000000000000 0x8 bin/sound_cf2.o + .group 0x0000000000000000 0x8 bin/sound_cf2.o + .group 0x0000000000000000 0x8 bin/sound_cf2.o + .group 0x0000000000000000 0x8 bin/sound_cf2.o + .group 0x0000000000000000 0x8 bin/sound_cf2.o + .group 0x0000000000000000 0x8 bin/sound_cf2.o + .group 0x0000000000000000 0x8 bin/sound_cf2.o + .group 0x0000000000000000 0x8 bin/sound_cf2.o + .group 0x0000000000000000 0x8 bin/sound_cf2.o + .group 0x0000000000000000 0x8 bin/sound_cf2.o + .group 0x0000000000000000 0x8 bin/sound_cf2.o + .group 0x0000000000000000 0x8 bin/sound_cf2.o + .group 0x0000000000000000 0x8 bin/sound_cf2.o + .group 0x0000000000000000 0x8 bin/sound_cf2.o + .group 0x0000000000000000 0x8 bin/sound_cf2.o + .group 0x0000000000000000 0x8 bin/sound_cf2.o + .group 0x0000000000000000 0x8 bin/sound_cf2.o + .group 0x0000000000000000 0x8 bin/sound_cf2.o + .group 0x0000000000000000 0x8 bin/sound_cf2.o + .group 0x0000000000000000 0x8 bin/sound_cf2.o + .group 0x0000000000000000 0x8 bin/sound_cf2.o + .group 0x0000000000000000 0x8 bin/sound_cf2.o + .group 0x0000000000000000 0x8 bin/sound_cf2.o + .group 0x0000000000000000 0x8 bin/sound_cf2.o + .group 0x0000000000000000 0x8 bin/sound_cf2.o + .group 0x0000000000000000 0x8 bin/sound_cf2.o + .group 0x0000000000000000 0x8 bin/sound_cf2.o + .group 0x0000000000000000 0x8 bin/sound_cf2.o + .text 0x0000000000000000 0x0 bin/sound_cf2.o + .data 0x0000000000000000 0x0 bin/sound_cf2.o + .bss 0x0000000000000000 0x0 bin/sound_cf2.o + .text.soundSetFreq + 0x0000000000000000 0x2 bin/sound_cf2.o + .debug_macro 0x0000000000000000 0x89e bin/sound_cf2.o + .debug_macro 0x0000000000000000 0x22 bin/sound_cf2.o + .debug_macro 0x0000000000000000 0x22 bin/sound_cf2.o + .debug_macro 0x0000000000000000 0x44 bin/sound_cf2.o + .debug_macro 0x0000000000000000 0x58 bin/sound_cf2.o + .debug_macro 0x0000000000000000 0x22 bin/sound_cf2.o + .debug_macro 0x0000000000000000 0x1df bin/sound_cf2.o + .debug_macro 0x0000000000000000 0x58 bin/sound_cf2.o + .debug_macro 0x0000000000000000 0x35 bin/sound_cf2.o + .debug_macro 0x0000000000000000 0x9c bin/sound_cf2.o + .debug_macro 0x0000000000000000 0x166 bin/sound_cf2.o + .debug_macro 0x0000000000000000 0x52 bin/sound_cf2.o + .debug_macro 0x0000000000000000 0x16 bin/sound_cf2.o + .debug_macro 0x0000000000000000 0x43 bin/sound_cf2.o + .debug_macro 0x0000000000000000 0x180 bin/sound_cf2.o + .debug_macro 0x0000000000000000 0x29d bin/sound_cf2.o + .debug_macro 0x0000000000000000 0x10 bin/sound_cf2.o + .debug_macro 0x0000000000000000 0x35 bin/sound_cf2.o + .debug_macro 0x0000000000000000 0x16 bin/sound_cf2.o + .debug_macro 0x0000000000000000 0x16 bin/sound_cf2.o + .debug_macro 0x0000000000000000 0x29 bin/sound_cf2.o + .debug_macro 0x0000000000000000 0xca bin/sound_cf2.o + .debug_macro 0x0000000000000000 0x16 bin/sound_cf2.o + .debug_macro 0x0000000000000000 0x52 bin/sound_cf2.o + .debug_macro 0x0000000000000000 0x18a bin/sound_cf2.o + .debug_macro 0x0000000000000000 0x58 bin/sound_cf2.o + .debug_macro 0x0000000000000000 0x16 bin/sound_cf2.o + .debug_macro 0x0000000000000000 0x110 bin/sound_cf2.o + .debug_macro 0x0000000000000000 0x15d bin/sound_cf2.o + .debug_macro 0x0000000000000000 0xe4 bin/sound_cf2.o + .debug_macro 0x0000000000000000 0x10 bin/sound_cf2.o + .debug_macro 0x0000000000000000 0x1f bin/sound_cf2.o + .debug_macro 0x0000000000000000 0x3a7 bin/sound_cf2.o + .debug_macro 0x0000000000000000 0xc0 bin/sound_cf2.o + .debug_macro 0x0000000000000000 0x9a bin/sound_cf2.o + .debug_macro 0x0000000000000000 0x91 bin/sound_cf2.o + .debug_macro 0x0000000000000000 0xa6 bin/sound_cf2.o + .debug_macro 0x0000000000000000 0x64 bin/sound_cf2.o + .debug_macro 0x0000000000000000 0x34 bin/sound_cf2.o + .group 0x0000000000000000 0x8 bin/deck.o + .group 0x0000000000000000 0x8 bin/deck.o + .group 0x0000000000000000 0x8 bin/deck.o + .group 0x0000000000000000 0x8 bin/deck.o + .group 0x0000000000000000 0x8 bin/deck.o + .group 0x0000000000000000 0x8 bin/deck.o + .group 0x0000000000000000 0x8 bin/deck.o + .group 0x0000000000000000 0x8 bin/deck.o + .group 0x0000000000000000 0x8 bin/deck.o + .group 0x0000000000000000 0x8 bin/deck.o + .group 0x0000000000000000 0x8 bin/deck.o + .group 0x0000000000000000 0x8 bin/deck.o + .group 0x0000000000000000 0x8 bin/deck.o + .group 0x0000000000000000 0x8 bin/deck.o + .group 0x0000000000000000 0x8 bin/deck.o + .group 0x0000000000000000 0x8 bin/deck.o + .group 0x0000000000000000 0x8 bin/deck.o + .group 0x0000000000000000 0x8 bin/deck.o + .group 0x0000000000000000 0x8 bin/deck.o + .group 0x0000000000000000 0x8 bin/deck.o + .group 0x0000000000000000 0x8 bin/deck.o + .group 0x0000000000000000 0x8 bin/deck.o + .group 0x0000000000000000 0x8 bin/deck.o + .group 0x0000000000000000 0x8 bin/deck.o + .group 0x0000000000000000 0x8 bin/deck.o + .group 0x0000000000000000 0x8 bin/deck.o + .group 0x0000000000000000 0x8 bin/deck.o + .group 0x0000000000000000 0x8 bin/deck.o + .group 0x0000000000000000 0x8 bin/deck.o + .group 0x0000000000000000 0x8 bin/deck.o + .group 0x0000000000000000 0x8 bin/deck.o + .group 0x0000000000000000 0x8 bin/deck.o + .group 0x0000000000000000 0x8 bin/deck.o + .group 0x0000000000000000 0x8 bin/deck.o + .group 0x0000000000000000 0x8 bin/deck.o + .group 0x0000000000000000 0x8 bin/deck.o + .group 0x0000000000000000 0x8 bin/deck.o + .group 0x0000000000000000 0x8 bin/deck.o + .group 0x0000000000000000 0x8 bin/deck.o + .group 0x0000000000000000 0x8 bin/deck.o + .group 0x0000000000000000 0x8 bin/deck.o + .group 0x0000000000000000 0x8 bin/deck.o + .group 0x0000000000000000 0x8 bin/deck.o + .group 0x0000000000000000 0x8 bin/deck.o + .group 0x0000000000000000 0x8 bin/deck.o + .group 0x0000000000000000 0x8 bin/deck.o + .group 0x0000000000000000 0x8 bin/deck.o + .group 0x0000000000000000 0x8 bin/deck.o + .group 0x0000000000000000 0x8 bin/deck.o + .group 0x0000000000000000 0x8 bin/deck.o + .group 0x0000000000000000 0x8 bin/deck.o + .group 0x0000000000000000 0x8 bin/deck.o + .group 0x0000000000000000 0x8 bin/deck.o + .group 0x0000000000000000 0x8 bin/deck.o + .group 0x0000000000000000 0x8 bin/deck.o + .group 0x0000000000000000 0x8 bin/deck.o + .group 0x0000000000000000 0x8 bin/deck.o + .group 0x0000000000000000 0x8 bin/deck.o + .group 0x0000000000000000 0x8 bin/deck.o + .text 0x0000000000000000 0x0 bin/deck.o + .data 0x0000000000000000 0x0 bin/deck.o + .bss 0x0000000000000000 0x0 bin/deck.o + .debug_macro 0x0000000000000000 0x89e bin/deck.o + .debug_macro 0x0000000000000000 0x58 bin/deck.o + .debug_macro 0x0000000000000000 0x22 bin/deck.o + .debug_macro 0x0000000000000000 0x35 bin/deck.o + .debug_macro 0x0000000000000000 0x9c bin/deck.o + .debug_macro 0x0000000000000000 0x166 bin/deck.o + .debug_macro 0x0000000000000000 0x4a bin/deck.o + .debug_macro 0x0000000000000000 0x52 bin/deck.o + .debug_macro 0x0000000000000000 0x16 bin/deck.o + .debug_macro 0x0000000000000000 0x43 bin/deck.o + .debug_macro 0x0000000000000000 0x180 bin/deck.o + .debug_macro 0x0000000000000000 0x29d bin/deck.o + .debug_macro 0x0000000000000000 0x10 bin/deck.o + .debug_macro 0x0000000000000000 0x35 bin/deck.o + .debug_macro 0x0000000000000000 0x58 bin/deck.o + .debug_macro 0x0000000000000000 0x22 bin/deck.o + .debug_macro 0x0000000000000000 0x1df bin/deck.o + .debug_macro 0x0000000000000000 0x22 bin/deck.o + .debug_macro 0x0000000000000000 0x5e bin/deck.o + .debug_macro 0x0000000000000000 0x3b bin/deck.o + .debug_macro 0x0000000000000000 0x18 bin/deck.o + .debug_macro 0x0000000000000000 0x42 bin/deck.o + .debug_macro 0x0000000000000000 0xc91 bin/deck.o + .debug_macro 0x0000000000000000 0x8bb0 bin/deck.o + .debug_macro 0x0000000000000000 0x44f bin/deck.o + .debug_macro 0x0000000000000000 0xb2 bin/deck.o + .debug_macro 0x0000000000000000 0x477 bin/deck.o + .debug_macro 0x0000000000000000 0xae bin/deck.o + .debug_macro 0x0000000000000000 0x41c bin/deck.o + .debug_macro 0x0000000000000000 0x2bc bin/deck.o + .debug_macro 0x0000000000000000 0x2bb bin/deck.o + .debug_macro 0x0000000000000000 0x64 bin/deck.o + .debug_macro 0x0000000000000000 0xe7 bin/deck.o + .debug_macro 0x0000000000000000 0x62f bin/deck.o + .debug_macro 0x0000000000000000 0x57b bin/deck.o + .debug_macro 0x0000000000000000 0x342 bin/deck.o + .debug_macro 0x0000000000000000 0x36c bin/deck.o + .debug_macro 0x0000000000000000 0xf7 bin/deck.o + .debug_macro 0x0000000000000000 0x73b bin/deck.o + .debug_macro 0x0000000000000000 0x223 bin/deck.o + .debug_macro 0x0000000000000000 0x34 bin/deck.o + .debug_macro 0x0000000000000000 0x82 bin/deck.o + .debug_macro 0x0000000000000000 0x144 bin/deck.o + .debug_macro 0x0000000000000000 0xc3 bin/deck.o + .debug_macro 0x0000000000000000 0x40 bin/deck.o + .debug_macro 0x0000000000000000 0x3cf bin/deck.o + .debug_macro 0x0000000000000000 0x188 bin/deck.o + .debug_macro 0x0000000000000000 0x149 bin/deck.o + .debug_macro 0x0000000000000000 0x279 bin/deck.o + .debug_macro 0x0000000000000000 0x35 bin/deck.o + .debug_macro 0x0000000000000000 0x70 bin/deck.o + .debug_macro 0x0000000000000000 0x10 bin/deck.o + .debug_macro 0x0000000000000000 0xca bin/deck.o + .debug_macro 0x0000000000000000 0x16 bin/deck.o + .debug_macro 0x0000000000000000 0x52 bin/deck.o + .debug_macro 0x0000000000000000 0x18a bin/deck.o + .debug_macro 0x0000000000000000 0x58 bin/deck.o + .debug_macro 0x0000000000000000 0x2e bin/deck.o + .group 0x0000000000000000 0x8 bin/deck_info.o + .group 0x0000000000000000 0x8 bin/deck_info.o + .group 0x0000000000000000 0x8 bin/deck_info.o + .group 0x0000000000000000 0x8 bin/deck_info.o + .group 0x0000000000000000 0x8 bin/deck_info.o + .group 0x0000000000000000 0x8 bin/deck_info.o + .group 0x0000000000000000 0x8 bin/deck_info.o + .group 0x0000000000000000 0x8 bin/deck_info.o + .group 0x0000000000000000 0x8 bin/deck_info.o + .group 0x0000000000000000 0x8 bin/deck_info.o + .group 0x0000000000000000 0x8 bin/deck_info.o + .group 0x0000000000000000 0x8 bin/deck_info.o + .group 0x0000000000000000 0x8 bin/deck_info.o + .group 0x0000000000000000 0x8 bin/deck_info.o + .group 0x0000000000000000 0x8 bin/deck_info.o + .group 0x0000000000000000 0x8 bin/deck_info.o + .group 0x0000000000000000 0x8 bin/deck_info.o + .group 0x0000000000000000 0x8 bin/deck_info.o + .group 0x0000000000000000 0x8 bin/deck_info.o + .group 0x0000000000000000 0x8 bin/deck_info.o + .group 0x0000000000000000 0x8 bin/deck_info.o + .group 0x0000000000000000 0x8 bin/deck_info.o + .group 0x0000000000000000 0x8 bin/deck_info.o + .group 0x0000000000000000 0x8 bin/deck_info.o + .group 0x0000000000000000 0x8 bin/deck_info.o + .group 0x0000000000000000 0x8 bin/deck_info.o + .group 0x0000000000000000 0x8 bin/deck_info.o + .group 0x0000000000000000 0x8 bin/deck_info.o + .group 0x0000000000000000 0x8 bin/deck_info.o + .group 0x0000000000000000 0x8 bin/deck_info.o + .group 0x0000000000000000 0x8 bin/deck_info.o + .group 0x0000000000000000 0x8 bin/deck_info.o + .group 0x0000000000000000 0x8 bin/deck_info.o + .group 0x0000000000000000 0x8 bin/deck_info.o + .group 0x0000000000000000 0x8 bin/deck_info.o + .group 0x0000000000000000 0x8 bin/deck_info.o + .group 0x0000000000000000 0x8 bin/deck_info.o + .group 0x0000000000000000 0x8 bin/deck_info.o + .group 0x0000000000000000 0x8 bin/deck_info.o + .group 0x0000000000000000 0x8 bin/deck_info.o + .group 0x0000000000000000 0x8 bin/deck_info.o + .group 0x0000000000000000 0x8 bin/deck_info.o + .group 0x0000000000000000 0x8 bin/deck_info.o + .group 0x0000000000000000 0x8 bin/deck_info.o + .group 0x0000000000000000 0x8 bin/deck_info.o + .group 0x0000000000000000 0x8 bin/deck_info.o + .group 0x0000000000000000 0x8 bin/deck_info.o + .group 0x0000000000000000 0x8 bin/deck_info.o + .group 0x0000000000000000 0x8 bin/deck_info.o + .group 0x0000000000000000 0x8 bin/deck_info.o + .group 0x0000000000000000 0x8 bin/deck_info.o + .group 0x0000000000000000 0x8 bin/deck_info.o + .group 0x0000000000000000 0x8 bin/deck_info.o + .group 0x0000000000000000 0x8 bin/deck_info.o + .group 0x0000000000000000 0x8 bin/deck_info.o + .group 0x0000000000000000 0x8 bin/deck_info.o + .group 0x0000000000000000 0x8 bin/deck_info.o + .group 0x0000000000000000 0x8 bin/deck_info.o + .group 0x0000000000000000 0x8 bin/deck_info.o + .group 0x0000000000000000 0x8 bin/deck_info.o + .group 0x0000000000000000 0x8 bin/deck_info.o + .group 0x0000000000000000 0x8 bin/deck_info.o + .group 0x0000000000000000 0x8 bin/deck_info.o + .group 0x0000000000000000 0x8 bin/deck_info.o + .group 0x0000000000000000 0x8 bin/deck_info.o + .group 0x0000000000000000 0x8 bin/deck_info.o + .text 0x0000000000000000 0x0 bin/deck_info.o + .data 0x0000000000000000 0x0 bin/deck_info.o + .bss 0x0000000000000000 0x0 bin/deck_info.o + .text.deckTlvGetBuffer + 0x0000000000000000 0x22 bin/deck_info.o + .text.deckTlvGetTlv + 0x0000000000000000 0x12 bin/deck_info.o + .debug_macro 0x0000000000000000 0x89e bin/deck_info.o + .debug_macro 0x0000000000000000 0x58 bin/deck_info.o + .debug_macro 0x0000000000000000 0x22 bin/deck_info.o + .debug_macro 0x0000000000000000 0x35 bin/deck_info.o + .debug_macro 0x0000000000000000 0x9c bin/deck_info.o + .debug_macro 0x0000000000000000 0x16 bin/deck_info.o + .debug_macro 0x0000000000000000 0x10e bin/deck_info.o + .debug_macro 0x0000000000000000 0x7f bin/deck_info.o + .debug_macro 0x0000000000000000 0x4a bin/deck_info.o + .debug_macro 0x0000000000000000 0x52 bin/deck_info.o + .debug_macro 0x0000000000000000 0x16 bin/deck_info.o + .debug_macro 0x0000000000000000 0x43 bin/deck_info.o + .debug_macro 0x0000000000000000 0x180 bin/deck_info.o + .debug_macro 0x0000000000000000 0x29d bin/deck_info.o + .debug_macro 0x0000000000000000 0x16 bin/deck_info.o + .debug_macro 0x0000000000000000 0x29 bin/deck_info.o + .debug_macro 0x0000000000000000 0x22 bin/deck_info.o + .debug_macro 0x0000000000000000 0x16 bin/deck_info.o + .debug_macro 0x0000000000000000 0x35 bin/deck_info.o + .debug_macro 0x0000000000000000 0x58 bin/deck_info.o + .debug_macro 0x0000000000000000 0x22 bin/deck_info.o + .debug_macro 0x0000000000000000 0x1df bin/deck_info.o + .debug_macro 0x0000000000000000 0xfd bin/deck_info.o + .debug_macro 0x0000000000000000 0x5e bin/deck_info.o + .debug_macro 0x0000000000000000 0x3b bin/deck_info.o + .debug_macro 0x0000000000000000 0x18 bin/deck_info.o + .debug_macro 0x0000000000000000 0x42 bin/deck_info.o + .debug_macro 0x0000000000000000 0xc91 bin/deck_info.o + .debug_macro 0x0000000000000000 0x8bb0 bin/deck_info.o + .debug_macro 0x0000000000000000 0x44f bin/deck_info.o + .debug_macro 0x0000000000000000 0xb2 bin/deck_info.o + .debug_macro 0x0000000000000000 0x477 bin/deck_info.o + .debug_macro 0x0000000000000000 0xae bin/deck_info.o + .debug_macro 0x0000000000000000 0x41c bin/deck_info.o + .debug_macro 0x0000000000000000 0x2bc bin/deck_info.o + .debug_macro 0x0000000000000000 0x2bb bin/deck_info.o + .debug_macro 0x0000000000000000 0x64 bin/deck_info.o + .debug_macro 0x0000000000000000 0xe7 bin/deck_info.o + .debug_macro 0x0000000000000000 0x62f bin/deck_info.o + .debug_macro 0x0000000000000000 0x57b bin/deck_info.o + .debug_macro 0x0000000000000000 0x342 bin/deck_info.o + .debug_macro 0x0000000000000000 0x36c bin/deck_info.o + .debug_macro 0x0000000000000000 0xf7 bin/deck_info.o + .debug_macro 0x0000000000000000 0x73b bin/deck_info.o + .debug_macro 0x0000000000000000 0x223 bin/deck_info.o + .debug_macro 0x0000000000000000 0x34 bin/deck_info.o + .debug_macro 0x0000000000000000 0x82 bin/deck_info.o + .debug_macro 0x0000000000000000 0x144 bin/deck_info.o + .debug_macro 0x0000000000000000 0xc3 bin/deck_info.o + .debug_macro 0x0000000000000000 0x40 bin/deck_info.o + .debug_macro 0x0000000000000000 0x3cf bin/deck_info.o + .debug_macro 0x0000000000000000 0x188 bin/deck_info.o + .debug_macro 0x0000000000000000 0x149 bin/deck_info.o + .debug_macro 0x0000000000000000 0x279 bin/deck_info.o + .debug_macro 0x0000000000000000 0x35 bin/deck_info.o + .debug_macro 0x0000000000000000 0x70 bin/deck_info.o + .debug_macro 0x0000000000000000 0x10 bin/deck_info.o + .debug_macro 0x0000000000000000 0x94 bin/deck_info.o + .debug_macro 0x0000000000000000 0x16 bin/deck_info.o + .debug_macro 0x0000000000000000 0x46 bin/deck_info.o + .debug_macro 0x0000000000000000 0xca bin/deck_info.o + .debug_macro 0x0000000000000000 0x16 bin/deck_info.o + .debug_macro 0x0000000000000000 0x52 bin/deck_info.o + .debug_macro 0x0000000000000000 0x18a bin/deck_info.o + .debug_macro 0x0000000000000000 0x58 bin/deck_info.o + .debug_macro 0x0000000000000000 0x2e bin/deck_info.o + .group 0x0000000000000000 0x8 bin/deck_drivers.o + .group 0x0000000000000000 0x8 bin/deck_drivers.o + .group 0x0000000000000000 0x8 bin/deck_drivers.o + .group 0x0000000000000000 0x8 bin/deck_drivers.o + .group 0x0000000000000000 0x8 bin/deck_drivers.o + .group 0x0000000000000000 0x8 bin/deck_drivers.o + .group 0x0000000000000000 0x8 bin/deck_drivers.o + .group 0x0000000000000000 0x8 bin/deck_drivers.o + .group 0x0000000000000000 0x8 bin/deck_drivers.o + .group 0x0000000000000000 0x8 bin/deck_drivers.o + .group 0x0000000000000000 0x8 bin/deck_drivers.o + .group 0x0000000000000000 0x8 bin/deck_drivers.o + .group 0x0000000000000000 0x8 bin/deck_drivers.o + .group 0x0000000000000000 0x8 bin/deck_drivers.o + .group 0x0000000000000000 0x8 bin/deck_drivers.o + .group 0x0000000000000000 0x8 bin/deck_drivers.o + .group 0x0000000000000000 0x8 bin/deck_drivers.o + .group 0x0000000000000000 0x8 bin/deck_drivers.o + .group 0x0000000000000000 0x8 bin/deck_drivers.o + .group 0x0000000000000000 0x8 bin/deck_drivers.o + .group 0x0000000000000000 0x8 bin/deck_drivers.o + .group 0x0000000000000000 0x8 bin/deck_drivers.o + .group 0x0000000000000000 0x8 bin/deck_drivers.o + .group 0x0000000000000000 0x8 bin/deck_drivers.o + .group 0x0000000000000000 0x8 bin/deck_drivers.o + .group 0x0000000000000000 0x8 bin/deck_drivers.o + .group 0x0000000000000000 0x8 bin/deck_drivers.o + .group 0x0000000000000000 0x8 bin/deck_drivers.o + .group 0x0000000000000000 0x8 bin/deck_drivers.o + .group 0x0000000000000000 0x8 bin/deck_drivers.o + .group 0x0000000000000000 0x8 bin/deck_drivers.o + .group 0x0000000000000000 0x8 bin/deck_drivers.o + .group 0x0000000000000000 0x8 bin/deck_drivers.o + .group 0x0000000000000000 0x8 bin/deck_drivers.o + .group 0x0000000000000000 0x8 bin/deck_drivers.o + .group 0x0000000000000000 0x8 bin/deck_drivers.o + .group 0x0000000000000000 0x8 bin/deck_drivers.o + .group 0x0000000000000000 0x8 bin/deck_drivers.o + .group 0x0000000000000000 0x8 bin/deck_drivers.o + .group 0x0000000000000000 0x8 bin/deck_drivers.o + .group 0x0000000000000000 0x8 bin/deck_drivers.o + .group 0x0000000000000000 0x8 bin/deck_drivers.o + .group 0x0000000000000000 0x8 bin/deck_drivers.o + .group 0x0000000000000000 0x8 bin/deck_drivers.o + .group 0x0000000000000000 0x8 bin/deck_drivers.o + .group 0x0000000000000000 0x8 bin/deck_drivers.o + .group 0x0000000000000000 0x8 bin/deck_drivers.o + .group 0x0000000000000000 0x8 bin/deck_drivers.o + .group 0x0000000000000000 0x8 bin/deck_drivers.o + .group 0x0000000000000000 0x8 bin/deck_drivers.o + .group 0x0000000000000000 0x8 bin/deck_drivers.o + .group 0x0000000000000000 0x8 bin/deck_drivers.o + .group 0x0000000000000000 0x8 bin/deck_drivers.o + .group 0x0000000000000000 0x8 bin/deck_drivers.o + .group 0x0000000000000000 0x8 bin/deck_drivers.o + .group 0x0000000000000000 0x8 bin/deck_drivers.o + .group 0x0000000000000000 0x8 bin/deck_drivers.o + .group 0x0000000000000000 0x8 bin/deck_drivers.o + .group 0x0000000000000000 0x8 bin/deck_drivers.o + .group 0x0000000000000000 0x8 bin/deck_drivers.o + .group 0x0000000000000000 0x8 bin/deck_drivers.o + .group 0x0000000000000000 0x8 bin/deck_drivers.o + .group 0x0000000000000000 0x8 bin/deck_drivers.o + .text 0x0000000000000000 0x0 bin/deck_drivers.o + .data 0x0000000000000000 0x0 bin/deck_drivers.o + .bss 0x0000000000000000 0x0 bin/deck_drivers.o + .text.deckGetDriver + 0x0000000000000000 0x24 bin/deck_drivers.o + .debug_macro 0x0000000000000000 0x89e bin/deck_drivers.o + .debug_macro 0x0000000000000000 0x58 bin/deck_drivers.o + .debug_macro 0x0000000000000000 0x22 bin/deck_drivers.o + .debug_macro 0x0000000000000000 0x35 bin/deck_drivers.o + .debug_macro 0x0000000000000000 0x9c bin/deck_drivers.o + .debug_macro 0x0000000000000000 0x16 bin/deck_drivers.o + .debug_macro 0x0000000000000000 0x10e bin/deck_drivers.o + .debug_macro 0x0000000000000000 0x7f bin/deck_drivers.o + .debug_macro 0x0000000000000000 0x4a bin/deck_drivers.o + .debug_macro 0x0000000000000000 0x52 bin/deck_drivers.o + .debug_macro 0x0000000000000000 0x16 bin/deck_drivers.o + .debug_macro 0x0000000000000000 0x43 bin/deck_drivers.o + .debug_macro 0x0000000000000000 0x180 bin/deck_drivers.o + .debug_macro 0x0000000000000000 0x29d bin/deck_drivers.o + .debug_macro 0x0000000000000000 0x16 bin/deck_drivers.o + .debug_macro 0x0000000000000000 0x29 bin/deck_drivers.o + .debug_macro 0x0000000000000000 0x16 bin/deck_drivers.o + .debug_macro 0x0000000000000000 0x35 bin/deck_drivers.o + .debug_macro 0x0000000000000000 0x58 bin/deck_drivers.o + .debug_macro 0x0000000000000000 0x22 bin/deck_drivers.o + .debug_macro 0x0000000000000000 0x1df bin/deck_drivers.o + .debug_macro 0x0000000000000000 0x22 bin/deck_drivers.o + .debug_macro 0x0000000000000000 0xfd bin/deck_drivers.o + .debug_macro 0x0000000000000000 0x5e bin/deck_drivers.o + .debug_macro 0x0000000000000000 0x3b bin/deck_drivers.o + .debug_macro 0x0000000000000000 0x18 bin/deck_drivers.o + .debug_macro 0x0000000000000000 0x42 bin/deck_drivers.o + .debug_macro 0x0000000000000000 0xc91 bin/deck_drivers.o + .debug_macro 0x0000000000000000 0x8bb0 bin/deck_drivers.o + .debug_macro 0x0000000000000000 0x44f bin/deck_drivers.o + .debug_macro 0x0000000000000000 0xb2 bin/deck_drivers.o + .debug_macro 0x0000000000000000 0x477 bin/deck_drivers.o + .debug_macro 0x0000000000000000 0xae bin/deck_drivers.o + .debug_macro 0x0000000000000000 0x41c bin/deck_drivers.o + .debug_macro 0x0000000000000000 0x2bc bin/deck_drivers.o + .debug_macro 0x0000000000000000 0x2bb bin/deck_drivers.o + .debug_macro 0x0000000000000000 0x64 bin/deck_drivers.o + .debug_macro 0x0000000000000000 0xe7 bin/deck_drivers.o + .debug_macro 0x0000000000000000 0x62f bin/deck_drivers.o + .debug_macro 0x0000000000000000 0x57b bin/deck_drivers.o + .debug_macro 0x0000000000000000 0x342 bin/deck_drivers.o + .debug_macro 0x0000000000000000 0x36c bin/deck_drivers.o + .debug_macro 0x0000000000000000 0xf7 bin/deck_drivers.o + .debug_macro 0x0000000000000000 0x73b bin/deck_drivers.o + .debug_macro 0x0000000000000000 0x223 bin/deck_drivers.o + .debug_macro 0x0000000000000000 0x34 bin/deck_drivers.o + .debug_macro 0x0000000000000000 0x82 bin/deck_drivers.o + .debug_macro 0x0000000000000000 0x144 bin/deck_drivers.o + .debug_macro 0x0000000000000000 0xc3 bin/deck_drivers.o + .debug_macro 0x0000000000000000 0x40 bin/deck_drivers.o + .debug_macro 0x0000000000000000 0x3cf bin/deck_drivers.o + .debug_macro 0x0000000000000000 0x188 bin/deck_drivers.o + .debug_macro 0x0000000000000000 0x149 bin/deck_drivers.o + .debug_macro 0x0000000000000000 0x279 bin/deck_drivers.o + .debug_macro 0x0000000000000000 0x35 bin/deck_drivers.o + .debug_macro 0x0000000000000000 0x70 bin/deck_drivers.o + .debug_macro 0x0000000000000000 0x10 bin/deck_drivers.o + .debug_macro 0x0000000000000000 0xca bin/deck_drivers.o + .debug_macro 0x0000000000000000 0x16 bin/deck_drivers.o + .debug_macro 0x0000000000000000 0x52 bin/deck_drivers.o + .debug_macro 0x0000000000000000 0x18a bin/deck_drivers.o + .debug_macro 0x0000000000000000 0x58 bin/deck_drivers.o + .debug_macro 0x0000000000000000 0x2e bin/deck_drivers.o + .group 0x0000000000000000 0x8 bin/deck_constants.o .group 0x0000000000000000 0x8 bin/deck_constants.o .group 0x0000000000000000 0x8 bin/deck_constants.o .group 0x0000000000000000 0x8 bin/deck_constants.o @@ -9258,20 +9715,21 @@ Discarded input sections .bss 0x0000000000000000 0x0 bin/deck_constants.o .rodata.deckGPIOMapping 0x0000000000000000 0x9c bin/deck_constants.o - .debug_info 0x0000000000000000 0x21a bin/deck_constants.o + .debug_info 0x0000000000000000 0x228 bin/deck_constants.o .debug_abbrev 0x0000000000000000 0xe4 bin/deck_constants.o .debug_aranges 0x0000000000000000 0x18 bin/deck_constants.o - .debug_macro 0x0000000000000000 0x1e6 bin/deck_constants.o + .debug_macro 0x0000000000000000 0x1f4 bin/deck_constants.o .debug_macro 0x0000000000000000 0x89e bin/deck_constants.o .debug_macro 0x0000000000000000 0x22 bin/deck_constants.o - .debug_macro 0x0000000000000000 0x5e bin/deck_constants.o - .debug_macro 0x0000000000000000 0x3b bin/deck_constants.o - .debug_macro 0x0000000000000000 0x22 bin/deck_constants.o .debug_macro 0x0000000000000000 0x44 bin/deck_constants.o .debug_macro 0x0000000000000000 0x58 bin/deck_constants.o .debug_macro 0x0000000000000000 0x22 bin/deck_constants.o .debug_macro 0x0000000000000000 0x1df bin/deck_constants.o + .debug_macro 0x0000000000000000 0x22 bin/deck_constants.o + .debug_macro 0x0000000000000000 0xfd bin/deck_constants.o + .debug_macro 0x0000000000000000 0x5e bin/deck_constants.o + .debug_macro 0x0000000000000000 0x3b bin/deck_constants.o .debug_macro 0x0000000000000000 0x18 bin/deck_constants.o .debug_macro 0x0000000000000000 0x42 bin/deck_constants.o .debug_macro 0x0000000000000000 0xc91 bin/deck_constants.o @@ -9304,8 +9762,8 @@ Discarded input sections .debug_macro 0x0000000000000000 0x35 bin/deck_constants.o .debug_macro 0x0000000000000000 0x70 bin/deck_constants.o .debug_macro 0x0000000000000000 0x10 bin/deck_constants.o - .debug_line 0x0000000000000000 0x50e bin/deck_constants.o - .debug_str 0x0000000000000000 0x5d400 bin/deck_constants.o + .debug_line 0x0000000000000000 0x51d bin/deck_constants.o + .debug_str 0x0000000000000000 0x5d829 bin/deck_constants.o .comment 0x0000000000000000 0x71 bin/deck_constants.o .ARM.attributes 0x0000000000000000 0x39 bin/deck_constants.o @@ -9350,6 +9808,7 @@ Discarded input sections .group 0x0000000000000000 0x8 bin/deck_digital.o .group 0x0000000000000000 0x8 bin/deck_digital.o .group 0x0000000000000000 0x8 bin/deck_digital.o + .group 0x0000000000000000 0x8 bin/deck_digital.o .text 0x0000000000000000 0x0 bin/deck_digital.o .data 0x0000000000000000 0x0 bin/deck_digital.o .bss 0x0000000000000000 0x0 bin/deck_digital.o @@ -9358,22 +9817,23 @@ Discarded input sections 0x0000000000000000 0x24 bin/deck_digital.o .text.digitalRead 0x0000000000000000 0x28 bin/deck_digital.o - .debug_info 0x0000000000000000 0x4b2 bin/deck_digital.o + .debug_info 0x0000000000000000 0x4c0 bin/deck_digital.o .debug_abbrev 0x0000000000000000 0x1ec bin/deck_digital.o .debug_loc 0x0000000000000000 0x147 bin/deck_digital.o .debug_aranges 0x0000000000000000 0x30 bin/deck_digital.o .debug_ranges 0x0000000000000000 0x20 bin/deck_digital.o - .debug_macro 0x0000000000000000 0x1e6 bin/deck_digital.o + .debug_macro 0x0000000000000000 0x1f4 bin/deck_digital.o .debug_macro 0x0000000000000000 0x89e bin/deck_digital.o .debug_macro 0x0000000000000000 0x22 bin/deck_digital.o - .debug_macro 0x0000000000000000 0x5e bin/deck_digital.o - .debug_macro 0x0000000000000000 0x3b bin/deck_digital.o - .debug_macro 0x0000000000000000 0x22 bin/deck_digital.o .debug_macro 0x0000000000000000 0x44 bin/deck_digital.o .debug_macro 0x0000000000000000 0x58 bin/deck_digital.o .debug_macro 0x0000000000000000 0x22 bin/deck_digital.o .debug_macro 0x0000000000000000 0x1df bin/deck_digital.o + .debug_macro 0x0000000000000000 0x22 bin/deck_digital.o + .debug_macro 0x0000000000000000 0xfd bin/deck_digital.o + .debug_macro 0x0000000000000000 0x5e bin/deck_digital.o + .debug_macro 0x0000000000000000 0x3b bin/deck_digital.o .debug_macro 0x0000000000000000 0x18 bin/deck_digital.o .debug_macro 0x0000000000000000 0x42 bin/deck_digital.o .debug_macro 0x0000000000000000 0xc91 bin/deck_digital.o @@ -9406,8 +9866,8 @@ Discarded input sections .debug_macro 0x0000000000000000 0x35 bin/deck_digital.o .debug_macro 0x0000000000000000 0x70 bin/deck_digital.o .debug_macro 0x0000000000000000 0x10 bin/deck_digital.o - .debug_line 0x0000000000000000 0x557 bin/deck_digital.o - .debug_str 0x0000000000000000 0x5d600 bin/deck_digital.o + .debug_line 0x0000000000000000 0x566 bin/deck_digital.o + .debug_str 0x0000000000000000 0x5da29 bin/deck_digital.o .comment 0x0000000000000000 0x71 bin/deck_digital.o .debug_frame 0x0000000000000000 0x58 bin/deck_digital.o .ARM.attributes @@ -9453,6 +9913,7 @@ Discarded input sections .group 0x0000000000000000 0x8 bin/deck_analog.o .group 0x0000000000000000 0x8 bin/deck_analog.o .group 0x0000000000000000 0x8 bin/deck_analog.o + .group 0x0000000000000000 0x8 bin/deck_analog.o .text 0x0000000000000000 0x0 bin/deck_analog.o .data 0x0000000000000000 0x0 bin/deck_analog.o .bss 0x0000000000000000 0x0 bin/deck_analog.o @@ -9462,13 +9923,14 @@ Discarded input sections 0x0000000000000000 0x2 bin/deck_analog.o .debug_macro 0x0000000000000000 0x89e bin/deck_analog.o .debug_macro 0x0000000000000000 0x22 bin/deck_analog.o - .debug_macro 0x0000000000000000 0x5e bin/deck_analog.o - .debug_macro 0x0000000000000000 0x3b bin/deck_analog.o - .debug_macro 0x0000000000000000 0x22 bin/deck_analog.o .debug_macro 0x0000000000000000 0x44 bin/deck_analog.o .debug_macro 0x0000000000000000 0x58 bin/deck_analog.o .debug_macro 0x0000000000000000 0x22 bin/deck_analog.o .debug_macro 0x0000000000000000 0x1df bin/deck_analog.o + .debug_macro 0x0000000000000000 0x22 bin/deck_analog.o + .debug_macro 0x0000000000000000 0xfd bin/deck_analog.o + .debug_macro 0x0000000000000000 0x5e bin/deck_analog.o + .debug_macro 0x0000000000000000 0x3b bin/deck_analog.o .debug_macro 0x0000000000000000 0x18 bin/deck_analog.o .debug_macro 0x0000000000000000 0x42 bin/deck_analog.o .debug_macro 0x0000000000000000 0xc91 bin/deck_analog.o @@ -9501,6 +9963,532 @@ Discarded input sections .debug_macro 0x0000000000000000 0x35 bin/deck_analog.o .debug_macro 0x0000000000000000 0x70 bin/deck_analog.o .debug_macro 0x0000000000000000 0x10 bin/deck_analog.o + .group 0x0000000000000000 0x8 bin/buzzdeck.o + .group 0x0000000000000000 0x8 bin/buzzdeck.o + .group 0x0000000000000000 0x8 bin/buzzdeck.o + .group 0x0000000000000000 0x8 bin/buzzdeck.o + .group 0x0000000000000000 0x8 bin/buzzdeck.o + .group 0x0000000000000000 0x8 bin/buzzdeck.o + .group 0x0000000000000000 0x8 bin/buzzdeck.o + .group 0x0000000000000000 0x8 bin/buzzdeck.o + .group 0x0000000000000000 0x8 bin/buzzdeck.o + .group 0x0000000000000000 0x8 bin/buzzdeck.o + .group 0x0000000000000000 0x8 bin/buzzdeck.o + .group 0x0000000000000000 0x8 bin/buzzdeck.o + .group 0x0000000000000000 0x8 bin/buzzdeck.o + .group 0x0000000000000000 0x8 bin/buzzdeck.o + .group 0x0000000000000000 0x8 bin/buzzdeck.o + .group 0x0000000000000000 0x8 bin/buzzdeck.o + .group 0x0000000000000000 0x8 bin/buzzdeck.o + .group 0x0000000000000000 0x8 bin/buzzdeck.o + .group 0x0000000000000000 0x8 bin/buzzdeck.o + .group 0x0000000000000000 0x8 bin/buzzdeck.o + .group 0x0000000000000000 0x8 bin/buzzdeck.o + .group 0x0000000000000000 0x8 bin/buzzdeck.o + .group 0x0000000000000000 0x8 bin/buzzdeck.o + .group 0x0000000000000000 0x8 bin/buzzdeck.o + .group 0x0000000000000000 0x8 bin/buzzdeck.o + .group 0x0000000000000000 0x8 bin/buzzdeck.o + .group 0x0000000000000000 0x8 bin/buzzdeck.o + .group 0x0000000000000000 0x8 bin/buzzdeck.o + .group 0x0000000000000000 0x8 bin/buzzdeck.o + .group 0x0000000000000000 0x8 bin/buzzdeck.o + .group 0x0000000000000000 0x8 bin/buzzdeck.o + .group 0x0000000000000000 0x8 bin/buzzdeck.o + .group 0x0000000000000000 0x8 bin/buzzdeck.o + .group 0x0000000000000000 0x8 bin/buzzdeck.o + .group 0x0000000000000000 0x8 bin/buzzdeck.o + .group 0x0000000000000000 0x8 bin/buzzdeck.o + .group 0x0000000000000000 0x8 bin/buzzdeck.o + .group 0x0000000000000000 0x8 bin/buzzdeck.o + .group 0x0000000000000000 0x8 bin/buzzdeck.o + .group 0x0000000000000000 0x8 bin/buzzdeck.o + .group 0x0000000000000000 0x8 bin/buzzdeck.o + .group 0x0000000000000000 0x8 bin/buzzdeck.o + .group 0x0000000000000000 0x8 bin/buzzdeck.o + .group 0x0000000000000000 0x8 bin/buzzdeck.o + .group 0x0000000000000000 0x8 bin/buzzdeck.o + .group 0x0000000000000000 0x8 bin/buzzdeck.o + .group 0x0000000000000000 0x8 bin/buzzdeck.o + .group 0x0000000000000000 0x8 bin/buzzdeck.o + .group 0x0000000000000000 0x8 bin/buzzdeck.o + .group 0x0000000000000000 0x8 bin/buzzdeck.o + .group 0x0000000000000000 0x8 bin/buzzdeck.o + .group 0x0000000000000000 0x8 bin/buzzdeck.o + .group 0x0000000000000000 0x8 bin/buzzdeck.o + .group 0x0000000000000000 0x8 bin/buzzdeck.o + .group 0x0000000000000000 0x8 bin/buzzdeck.o + .group 0x0000000000000000 0x8 bin/buzzdeck.o + .group 0x0000000000000000 0x8 bin/buzzdeck.o + .group 0x0000000000000000 0x8 bin/buzzdeck.o + .group 0x0000000000000000 0x8 bin/buzzdeck.o + .text 0x0000000000000000 0x0 bin/buzzdeck.o + .data 0x0000000000000000 0x0 bin/buzzdeck.o + .bss 0x0000000000000000 0x0 bin/buzzdeck.o + .debug_macro 0x0000000000000000 0x89e bin/buzzdeck.o + .debug_macro 0x0000000000000000 0x22 bin/buzzdeck.o + .debug_macro 0x0000000000000000 0x44 bin/buzzdeck.o + .debug_macro 0x0000000000000000 0x58 bin/buzzdeck.o + .debug_macro 0x0000000000000000 0x22 bin/buzzdeck.o + .debug_macro 0x0000000000000000 0x1df bin/buzzdeck.o + .debug_macro 0x0000000000000000 0x58 bin/buzzdeck.o + .debug_macro 0x0000000000000000 0x35 bin/buzzdeck.o + .debug_macro 0x0000000000000000 0x9c bin/buzzdeck.o + .debug_macro 0x0000000000000000 0x16 bin/buzzdeck.o + .debug_macro 0x0000000000000000 0x10e bin/buzzdeck.o + .debug_macro 0x0000000000000000 0x7f bin/buzzdeck.o + .debug_macro 0x0000000000000000 0x52 bin/buzzdeck.o + .debug_macro 0x0000000000000000 0x16 bin/buzzdeck.o + .debug_macro 0x0000000000000000 0x43 bin/buzzdeck.o + .debug_macro 0x0000000000000000 0x180 bin/buzzdeck.o + .debug_macro 0x0000000000000000 0x29d bin/buzzdeck.o + .debug_macro 0x0000000000000000 0x16 bin/buzzdeck.o + .debug_macro 0x0000000000000000 0x29 bin/buzzdeck.o + .debug_macro 0x0000000000000000 0x5e bin/buzzdeck.o + .debug_macro 0x0000000000000000 0x3b bin/buzzdeck.o + .debug_macro 0x0000000000000000 0x18 bin/buzzdeck.o + .debug_macro 0x0000000000000000 0x42 bin/buzzdeck.o + .debug_macro 0x0000000000000000 0xc91 bin/buzzdeck.o + .debug_macro 0x0000000000000000 0x8bb0 bin/buzzdeck.o + .debug_macro 0x0000000000000000 0x44f bin/buzzdeck.o + .debug_macro 0x0000000000000000 0xb2 bin/buzzdeck.o + .debug_macro 0x0000000000000000 0x477 bin/buzzdeck.o + .debug_macro 0x0000000000000000 0xae bin/buzzdeck.o + .debug_macro 0x0000000000000000 0x41c bin/buzzdeck.o + .debug_macro 0x0000000000000000 0x2bc bin/buzzdeck.o + .debug_macro 0x0000000000000000 0x2bb bin/buzzdeck.o + .debug_macro 0x0000000000000000 0x64 bin/buzzdeck.o + .debug_macro 0x0000000000000000 0xe7 bin/buzzdeck.o + .debug_macro 0x0000000000000000 0x62f bin/buzzdeck.o + .debug_macro 0x0000000000000000 0x57b bin/buzzdeck.o + .debug_macro 0x0000000000000000 0x342 bin/buzzdeck.o + .debug_macro 0x0000000000000000 0x36c bin/buzzdeck.o + .debug_macro 0x0000000000000000 0xf7 bin/buzzdeck.o + .debug_macro 0x0000000000000000 0x73b bin/buzzdeck.o + .debug_macro 0x0000000000000000 0x223 bin/buzzdeck.o + .debug_macro 0x0000000000000000 0x34 bin/buzzdeck.o + .debug_macro 0x0000000000000000 0x82 bin/buzzdeck.o + .debug_macro 0x0000000000000000 0x144 bin/buzzdeck.o + .debug_macro 0x0000000000000000 0xc3 bin/buzzdeck.o + .debug_macro 0x0000000000000000 0x40 bin/buzzdeck.o + .debug_macro 0x0000000000000000 0x3cf bin/buzzdeck.o + .debug_macro 0x0000000000000000 0x188 bin/buzzdeck.o + .debug_macro 0x0000000000000000 0x149 bin/buzzdeck.o + .debug_macro 0x0000000000000000 0x279 bin/buzzdeck.o + .debug_macro 0x0000000000000000 0x35 bin/buzzdeck.o + .debug_macro 0x0000000000000000 0x22 bin/buzzdeck.o + .debug_macro 0x0000000000000000 0xfd bin/buzzdeck.o + .debug_macro 0x0000000000000000 0x76 bin/buzzdeck.o + .debug_macro 0x0000000000000000 0x10 bin/buzzdeck.o + .debug_macro 0x0000000000000000 0xca bin/buzzdeck.o + .debug_macro 0x0000000000000000 0x16 bin/buzzdeck.o + .debug_macro 0x0000000000000000 0x52 bin/buzzdeck.o + .debug_macro 0x0000000000000000 0x18a bin/buzzdeck.o + .group 0x0000000000000000 0x8 bin/bigquad.o + .group 0x0000000000000000 0x8 bin/bigquad.o + .group 0x0000000000000000 0x8 bin/bigquad.o + .group 0x0000000000000000 0x8 bin/bigquad.o + .group 0x0000000000000000 0x8 bin/bigquad.o + .group 0x0000000000000000 0x8 bin/bigquad.o + .group 0x0000000000000000 0x8 bin/bigquad.o + .group 0x0000000000000000 0x8 bin/bigquad.o + .group 0x0000000000000000 0x8 bin/bigquad.o + .group 0x0000000000000000 0x8 bin/bigquad.o + .group 0x0000000000000000 0x8 bin/bigquad.o + .group 0x0000000000000000 0x8 bin/bigquad.o + .group 0x0000000000000000 0x8 bin/bigquad.o + .group 0x0000000000000000 0x8 bin/bigquad.o + .group 0x0000000000000000 0x8 bin/bigquad.o + .group 0x0000000000000000 0x8 bin/bigquad.o + .group 0x0000000000000000 0x8 bin/bigquad.o + .group 0x0000000000000000 0x8 bin/bigquad.o + .group 0x0000000000000000 0x8 bin/bigquad.o + .group 0x0000000000000000 0x8 bin/bigquad.o + .group 0x0000000000000000 0x8 bin/bigquad.o + .group 0x0000000000000000 0x8 bin/bigquad.o + .group 0x0000000000000000 0x8 bin/bigquad.o + .group 0x0000000000000000 0x8 bin/bigquad.o + .group 0x0000000000000000 0x8 bin/bigquad.o + .group 0x0000000000000000 0x8 bin/bigquad.o + .group 0x0000000000000000 0x8 bin/bigquad.o + .group 0x0000000000000000 0x8 bin/bigquad.o + .group 0x0000000000000000 0x8 bin/bigquad.o + .group 0x0000000000000000 0x8 bin/bigquad.o + .group 0x0000000000000000 0x8 bin/bigquad.o + .group 0x0000000000000000 0x8 bin/bigquad.o + .group 0x0000000000000000 0x8 bin/bigquad.o + .group 0x0000000000000000 0x8 bin/bigquad.o + .group 0x0000000000000000 0x8 bin/bigquad.o + .group 0x0000000000000000 0x8 bin/bigquad.o + .group 0x0000000000000000 0x8 bin/bigquad.o + .group 0x0000000000000000 0x8 bin/bigquad.o + .group 0x0000000000000000 0x8 bin/bigquad.o + .group 0x0000000000000000 0x8 bin/bigquad.o + .group 0x0000000000000000 0x8 bin/bigquad.o + .group 0x0000000000000000 0x8 bin/bigquad.o + .group 0x0000000000000000 0x8 bin/bigquad.o + .group 0x0000000000000000 0x8 bin/bigquad.o + .group 0x0000000000000000 0x8 bin/bigquad.o + .group 0x0000000000000000 0x8 bin/bigquad.o + .group 0x0000000000000000 0x8 bin/bigquad.o + .group 0x0000000000000000 0x8 bin/bigquad.o + .group 0x0000000000000000 0x8 bin/bigquad.o + .group 0x0000000000000000 0x8 bin/bigquad.o + .group 0x0000000000000000 0x8 bin/bigquad.o + .group 0x0000000000000000 0x8 bin/bigquad.o + .group 0x0000000000000000 0x8 bin/bigquad.o + .group 0x0000000000000000 0x8 bin/bigquad.o + .group 0x0000000000000000 0x8 bin/bigquad.o + .group 0x0000000000000000 0x8 bin/bigquad.o + .group 0x0000000000000000 0x8 bin/bigquad.o + .group 0x0000000000000000 0x8 bin/bigquad.o + .group 0x0000000000000000 0x8 bin/bigquad.o + .group 0x0000000000000000 0x8 bin/bigquad.o + .text 0x0000000000000000 0x0 bin/bigquad.o + .data 0x0000000000000000 0x0 bin/bigquad.o + .bss 0x0000000000000000 0x0 bin/bigquad.o + .debug_macro 0x0000000000000000 0x89e bin/bigquad.o + .debug_macro 0x0000000000000000 0x22 bin/bigquad.o + .debug_macro 0x0000000000000000 0x44 bin/bigquad.o + .debug_macro 0x0000000000000000 0x58 bin/bigquad.o + .debug_macro 0x0000000000000000 0x22 bin/bigquad.o + .debug_macro 0x0000000000000000 0x1df bin/bigquad.o + .debug_macro 0x0000000000000000 0x58 bin/bigquad.o + .debug_macro 0x0000000000000000 0x35 bin/bigquad.o + .debug_macro 0x0000000000000000 0x9c bin/bigquad.o + .debug_macro 0x0000000000000000 0x166 bin/bigquad.o + .debug_macro 0x0000000000000000 0x52 bin/bigquad.o + .debug_macro 0x0000000000000000 0x16 bin/bigquad.o + .debug_macro 0x0000000000000000 0x43 bin/bigquad.o + .debug_macro 0x0000000000000000 0x180 bin/bigquad.o + .debug_macro 0x0000000000000000 0x29d bin/bigquad.o + .debug_macro 0x0000000000000000 0x10 bin/bigquad.o + .debug_macro 0x0000000000000000 0x35 bin/bigquad.o + .debug_macro 0x0000000000000000 0x5e bin/bigquad.o + .debug_macro 0x0000000000000000 0x3b bin/bigquad.o + .debug_macro 0x0000000000000000 0x18 bin/bigquad.o + .debug_macro 0x0000000000000000 0x42 bin/bigquad.o + .debug_macro 0x0000000000000000 0xc91 bin/bigquad.o + .debug_macro 0x0000000000000000 0x8bb0 bin/bigquad.o + .debug_macro 0x0000000000000000 0x44f bin/bigquad.o + .debug_macro 0x0000000000000000 0xb2 bin/bigquad.o + .debug_macro 0x0000000000000000 0x477 bin/bigquad.o + .debug_macro 0x0000000000000000 0xae bin/bigquad.o + .debug_macro 0x0000000000000000 0x41c bin/bigquad.o + .debug_macro 0x0000000000000000 0x2bc bin/bigquad.o + .debug_macro 0x0000000000000000 0x2bb bin/bigquad.o + .debug_macro 0x0000000000000000 0x64 bin/bigquad.o + .debug_macro 0x0000000000000000 0xe7 bin/bigquad.o + .debug_macro 0x0000000000000000 0x62f bin/bigquad.o + .debug_macro 0x0000000000000000 0x57b bin/bigquad.o + .debug_macro 0x0000000000000000 0x342 bin/bigquad.o + .debug_macro 0x0000000000000000 0x36c bin/bigquad.o + .debug_macro 0x0000000000000000 0xf7 bin/bigquad.o + .debug_macro 0x0000000000000000 0x73b bin/bigquad.o + .debug_macro 0x0000000000000000 0x223 bin/bigquad.o + .debug_macro 0x0000000000000000 0x34 bin/bigquad.o + .debug_macro 0x0000000000000000 0x82 bin/bigquad.o + .debug_macro 0x0000000000000000 0x144 bin/bigquad.o + .debug_macro 0x0000000000000000 0xc3 bin/bigquad.o + .debug_macro 0x0000000000000000 0x40 bin/bigquad.o + .debug_macro 0x0000000000000000 0x3cf bin/bigquad.o + .debug_macro 0x0000000000000000 0x188 bin/bigquad.o + .debug_macro 0x0000000000000000 0x149 bin/bigquad.o + .debug_macro 0x0000000000000000 0x279 bin/bigquad.o + .debug_macro 0x0000000000000000 0x35 bin/bigquad.o + .debug_macro 0x0000000000000000 0x22 bin/bigquad.o + .debug_macro 0x0000000000000000 0xca bin/bigquad.o + .debug_macro 0x0000000000000000 0x16 bin/bigquad.o + .debug_macro 0x0000000000000000 0x52 bin/bigquad.o + .debug_macro 0x0000000000000000 0x18a bin/bigquad.o + .debug_macro 0x0000000000000000 0x58 bin/bigquad.o + .debug_macro 0x0000000000000000 0x2e bin/bigquad.o + .debug_macro 0x0000000000000000 0x103 bin/bigquad.o + .debug_macro 0x0000000000000000 0x76 bin/bigquad.o + .debug_macro 0x0000000000000000 0x10 bin/bigquad.o + .group 0x0000000000000000 0x8 bin/exptest.o + .group 0x0000000000000000 0x8 bin/exptest.o + .group 0x0000000000000000 0x8 bin/exptest.o + .group 0x0000000000000000 0x8 bin/exptest.o + .group 0x0000000000000000 0x8 bin/exptest.o + .group 0x0000000000000000 0x8 bin/exptest.o + .group 0x0000000000000000 0x8 bin/exptest.o + .group 0x0000000000000000 0x8 bin/exptest.o + .group 0x0000000000000000 0x8 bin/exptest.o + .group 0x0000000000000000 0x8 bin/exptest.o + .group 0x0000000000000000 0x8 bin/exptest.o + .group 0x0000000000000000 0x8 bin/exptest.o + .group 0x0000000000000000 0x8 bin/exptest.o + .group 0x0000000000000000 0x8 bin/exptest.o + .group 0x0000000000000000 0x8 bin/exptest.o + .group 0x0000000000000000 0x8 bin/exptest.o + .group 0x0000000000000000 0x8 bin/exptest.o + .group 0x0000000000000000 0x8 bin/exptest.o + .group 0x0000000000000000 0x8 bin/exptest.o + .group 0x0000000000000000 0x8 bin/exptest.o + .group 0x0000000000000000 0x8 bin/exptest.o + .group 0x0000000000000000 0x8 bin/exptest.o + .group 0x0000000000000000 0x8 bin/exptest.o + .group 0x0000000000000000 0x8 bin/exptest.o + .group 0x0000000000000000 0x8 bin/exptest.o + .group 0x0000000000000000 0x8 bin/exptest.o + .group 0x0000000000000000 0x8 bin/exptest.o + .group 0x0000000000000000 0x8 bin/exptest.o + .group 0x0000000000000000 0x8 bin/exptest.o + .group 0x0000000000000000 0x8 bin/exptest.o + .group 0x0000000000000000 0x8 bin/exptest.o + .group 0x0000000000000000 0x8 bin/exptest.o + .group 0x0000000000000000 0x8 bin/exptest.o + .group 0x0000000000000000 0x8 bin/exptest.o + .group 0x0000000000000000 0x8 bin/exptest.o + .group 0x0000000000000000 0x8 bin/exptest.o + .group 0x0000000000000000 0x8 bin/exptest.o + .group 0x0000000000000000 0x8 bin/exptest.o + .group 0x0000000000000000 0x8 bin/exptest.o + .group 0x0000000000000000 0x8 bin/exptest.o + .group 0x0000000000000000 0x8 bin/exptest.o + .group 0x0000000000000000 0x8 bin/exptest.o + .group 0x0000000000000000 0x8 bin/exptest.o + .group 0x0000000000000000 0x8 bin/exptest.o + .group 0x0000000000000000 0x8 bin/exptest.o + .group 0x0000000000000000 0x8 bin/exptest.o + .group 0x0000000000000000 0x8 bin/exptest.o + .group 0x0000000000000000 0x8 bin/exptest.o + .group 0x0000000000000000 0x8 bin/exptest.o + .group 0x0000000000000000 0x8 bin/exptest.o + .group 0x0000000000000000 0x8 bin/exptest.o + .group 0x0000000000000000 0x8 bin/exptest.o + .group 0x0000000000000000 0x8 bin/exptest.o + .group 0x0000000000000000 0x8 bin/exptest.o + .group 0x0000000000000000 0x8 bin/exptest.o + .group 0x0000000000000000 0x8 bin/exptest.o + .group 0x0000000000000000 0x8 bin/exptest.o + .group 0x0000000000000000 0x8 bin/exptest.o + .group 0x0000000000000000 0x8 bin/exptest.o + .group 0x0000000000000000 0x8 bin/exptest.o + .group 0x0000000000000000 0x8 bin/exptest.o + .text 0x0000000000000000 0x0 bin/exptest.o + .data 0x0000000000000000 0x0 bin/exptest.o + .bss 0x0000000000000000 0x0 bin/exptest.o + .debug_macro 0x0000000000000000 0x89e bin/exptest.o + .debug_macro 0x0000000000000000 0x22 bin/exptest.o + .debug_macro 0x0000000000000000 0x44 bin/exptest.o + .debug_macro 0x0000000000000000 0x58 bin/exptest.o + .debug_macro 0x0000000000000000 0x22 bin/exptest.o + .debug_macro 0x0000000000000000 0x1df bin/exptest.o + .debug_macro 0x0000000000000000 0x58 bin/exptest.o + .debug_macro 0x0000000000000000 0x35 bin/exptest.o + .debug_macro 0x0000000000000000 0x9c bin/exptest.o + .debug_macro 0x0000000000000000 0x166 bin/exptest.o + .debug_macro 0x0000000000000000 0x52 bin/exptest.o + .debug_macro 0x0000000000000000 0x16 bin/exptest.o + .debug_macro 0x0000000000000000 0x43 bin/exptest.o + .debug_macro 0x0000000000000000 0x180 bin/exptest.o + .debug_macro 0x0000000000000000 0x29d bin/exptest.o + .debug_macro 0x0000000000000000 0x10 bin/exptest.o + .debug_macro 0x0000000000000000 0x35 bin/exptest.o + .debug_macro 0x0000000000000000 0x5e bin/exptest.o + .debug_macro 0x0000000000000000 0x3b bin/exptest.o + .debug_macro 0x0000000000000000 0x18 bin/exptest.o + .debug_macro 0x0000000000000000 0x42 bin/exptest.o + .debug_macro 0x0000000000000000 0xc91 bin/exptest.o + .debug_macro 0x0000000000000000 0x8bb0 bin/exptest.o + .debug_macro 0x0000000000000000 0x44f bin/exptest.o + .debug_macro 0x0000000000000000 0xb2 bin/exptest.o + .debug_macro 0x0000000000000000 0x477 bin/exptest.o + .debug_macro 0x0000000000000000 0xae bin/exptest.o + .debug_macro 0x0000000000000000 0x41c bin/exptest.o + .debug_macro 0x0000000000000000 0x2bc bin/exptest.o + .debug_macro 0x0000000000000000 0x2bb bin/exptest.o + .debug_macro 0x0000000000000000 0x64 bin/exptest.o + .debug_macro 0x0000000000000000 0xe7 bin/exptest.o + .debug_macro 0x0000000000000000 0x62f bin/exptest.o + .debug_macro 0x0000000000000000 0x57b bin/exptest.o + .debug_macro 0x0000000000000000 0x342 bin/exptest.o + .debug_macro 0x0000000000000000 0x36c bin/exptest.o + .debug_macro 0x0000000000000000 0xf7 bin/exptest.o + .debug_macro 0x0000000000000000 0x73b bin/exptest.o + .debug_macro 0x0000000000000000 0x223 bin/exptest.o + .debug_macro 0x0000000000000000 0x34 bin/exptest.o + .debug_macro 0x0000000000000000 0x82 bin/exptest.o + .debug_macro 0x0000000000000000 0x144 bin/exptest.o + .debug_macro 0x0000000000000000 0xc3 bin/exptest.o + .debug_macro 0x0000000000000000 0x40 bin/exptest.o + .debug_macro 0x0000000000000000 0x3cf bin/exptest.o + .debug_macro 0x0000000000000000 0x188 bin/exptest.o + .debug_macro 0x0000000000000000 0x149 bin/exptest.o + .debug_macro 0x0000000000000000 0x279 bin/exptest.o + .debug_macro 0x0000000000000000 0x35 bin/exptest.o + .debug_macro 0x0000000000000000 0x22 bin/exptest.o + .debug_macro 0x0000000000000000 0xca bin/exptest.o + .debug_macro 0x0000000000000000 0x16 bin/exptest.o + .debug_macro 0x0000000000000000 0x52 bin/exptest.o + .debug_macro 0x0000000000000000 0x18a bin/exptest.o + .debug_macro 0x0000000000000000 0x58 bin/exptest.o + .debug_macro 0x0000000000000000 0x2e bin/exptest.o + .debug_macro 0x0000000000000000 0x103 bin/exptest.o + .debug_macro 0x0000000000000000 0x76 bin/exptest.o + .debug_macro 0x0000000000000000 0x10 bin/exptest.o + .debug_macro 0x0000000000000000 0x10 bin/exptest.o + .debug_macro 0x0000000000000000 0x22 bin/exptest.o + .group 0x0000000000000000 0x8 bin/ledring12.o + .group 0x0000000000000000 0x8 bin/ledring12.o + .group 0x0000000000000000 0x8 bin/ledring12.o + .group 0x0000000000000000 0x8 bin/ledring12.o + .group 0x0000000000000000 0x8 bin/ledring12.o + .group 0x0000000000000000 0x8 bin/ledring12.o + .group 0x0000000000000000 0x8 bin/ledring12.o + .group 0x0000000000000000 0x8 bin/ledring12.o + .group 0x0000000000000000 0x8 bin/ledring12.o + .group 0x0000000000000000 0x8 bin/ledring12.o + .group 0x0000000000000000 0x8 bin/ledring12.o + .group 0x0000000000000000 0x8 bin/ledring12.o + .group 0x0000000000000000 0x8 bin/ledring12.o + .group 0x0000000000000000 0x8 bin/ledring12.o + .group 0x0000000000000000 0x8 bin/ledring12.o + .group 0x0000000000000000 0x8 bin/ledring12.o + .group 0x0000000000000000 0x8 bin/ledring12.o + .group 0x0000000000000000 0x8 bin/ledring12.o + .group 0x0000000000000000 0x8 bin/ledring12.o + .group 0x0000000000000000 0x8 bin/ledring12.o + .group 0x0000000000000000 0x8 bin/ledring12.o + .group 0x0000000000000000 0x8 bin/ledring12.o + .group 0x0000000000000000 0x8 bin/ledring12.o + .group 0x0000000000000000 0x8 bin/ledring12.o + .group 0x0000000000000000 0x8 bin/ledring12.o + .group 0x0000000000000000 0x8 bin/ledring12.o + .group 0x0000000000000000 0x8 bin/ledring12.o + .group 0x0000000000000000 0x8 bin/ledring12.o + .group 0x0000000000000000 0x8 bin/ledring12.o + .group 0x0000000000000000 0x8 bin/ledring12.o + .group 0x0000000000000000 0x8 bin/ledring12.o + .group 0x0000000000000000 0x8 bin/ledring12.o + .group 0x0000000000000000 0x8 bin/ledring12.o + .group 0x0000000000000000 0x8 bin/ledring12.o + .group 0x0000000000000000 0x8 bin/ledring12.o + .group 0x0000000000000000 0x8 bin/ledring12.o + .group 0x0000000000000000 0x8 bin/ledring12.o + .group 0x0000000000000000 0x8 bin/ledring12.o + .group 0x0000000000000000 0x8 bin/ledring12.o + .group 0x0000000000000000 0x8 bin/ledring12.o + .group 0x0000000000000000 0x8 bin/ledring12.o + .group 0x0000000000000000 0x8 bin/ledring12.o + .group 0x0000000000000000 0x8 bin/ledring12.o + .group 0x0000000000000000 0x8 bin/ledring12.o + .group 0x0000000000000000 0x8 bin/ledring12.o + .group 0x0000000000000000 0x8 bin/ledring12.o + .group 0x0000000000000000 0x8 bin/ledring12.o + .group 0x0000000000000000 0x8 bin/ledring12.o + .group 0x0000000000000000 0x8 bin/ledring12.o + .group 0x0000000000000000 0x8 bin/ledring12.o + .group 0x0000000000000000 0x8 bin/ledring12.o + .group 0x0000000000000000 0x8 bin/ledring12.o + .group 0x0000000000000000 0x8 bin/ledring12.o + .group 0x0000000000000000 0x8 bin/ledring12.o + .group 0x0000000000000000 0x8 bin/ledring12.o + .group 0x0000000000000000 0x8 bin/ledring12.o + .group 0x0000000000000000 0x8 bin/ledring12.o + .group 0x0000000000000000 0x8 bin/ledring12.o + .group 0x0000000000000000 0x8 bin/ledring12.o + .group 0x0000000000000000 0x8 bin/ledring12.o + .group 0x0000000000000000 0x8 bin/ledring12.o + .group 0x0000000000000000 0x8 bin/ledring12.o + .group 0x0000000000000000 0x8 bin/ledring12.o + .group 0x0000000000000000 0x8 bin/ledring12.o + .group 0x0000000000000000 0x8 bin/ledring12.o + .group 0x0000000000000000 0x8 bin/ledring12.o + .group 0x0000000000000000 0x8 bin/ledring12.o + .group 0x0000000000000000 0x8 bin/ledring12.o + .group 0x0000000000000000 0x8 bin/ledring12.o + .group 0x0000000000000000 0x8 bin/ledring12.o + .group 0x0000000000000000 0x8 bin/ledring12.o + .group 0x0000000000000000 0x8 bin/ledring12.o + .group 0x0000000000000000 0x8 bin/ledring12.o + .group 0x0000000000000000 0x8 bin/ledring12.o + .group 0x0000000000000000 0x8 bin/ledring12.o + .group 0x0000000000000000 0x8 bin/ledring12.o + .text 0x0000000000000000 0x0 bin/ledring12.o + .data 0x0000000000000000 0x0 bin/ledring12.o + .bss 0x0000000000000000 0x0 bin/ledring12.o + .debug_macro 0x0000000000000000 0x89e bin/ledring12.o + .debug_macro 0x0000000000000000 0x22 bin/ledring12.o + .debug_macro 0x0000000000000000 0x44 bin/ledring12.o + .debug_macro 0x0000000000000000 0x58 bin/ledring12.o + .debug_macro 0x0000000000000000 0x22 bin/ledring12.o + .debug_macro 0x0000000000000000 0x1df bin/ledring12.o + .debug_macro 0x0000000000000000 0x22 bin/ledring12.o + .debug_macro 0x0000000000000000 0x58 bin/ledring12.o + .debug_macro 0x0000000000000000 0x35 bin/ledring12.o + .debug_macro 0x0000000000000000 0x9c bin/ledring12.o + .debug_macro 0x0000000000000000 0x166 bin/ledring12.o + .debug_macro 0x0000000000000000 0x52 bin/ledring12.o + .debug_macro 0x0000000000000000 0x16 bin/ledring12.o + .debug_macro 0x0000000000000000 0x43 bin/ledring12.o + .debug_macro 0x0000000000000000 0x180 bin/ledring12.o + .debug_macro 0x0000000000000000 0x1e1 bin/ledring12.o + .debug_macro 0x0000000000000000 0x29d bin/ledring12.o + .debug_macro 0x0000000000000000 0x10 bin/ledring12.o + .debug_macro 0x0000000000000000 0x35 bin/ledring12.o + .debug_macro 0x0000000000000000 0x5e bin/ledring12.o + .debug_macro 0x0000000000000000 0x3b bin/ledring12.o + .debug_macro 0x0000000000000000 0x18 bin/ledring12.o + .debug_macro 0x0000000000000000 0x42 bin/ledring12.o + .debug_macro 0x0000000000000000 0xc91 bin/ledring12.o + .debug_macro 0x0000000000000000 0x8bb0 bin/ledring12.o + .debug_macro 0x0000000000000000 0x44f bin/ledring12.o + .debug_macro 0x0000000000000000 0xb2 bin/ledring12.o + .debug_macro 0x0000000000000000 0x477 bin/ledring12.o + .debug_macro 0x0000000000000000 0xae bin/ledring12.o + .debug_macro 0x0000000000000000 0x41c bin/ledring12.o + .debug_macro 0x0000000000000000 0x2bc bin/ledring12.o + .debug_macro 0x0000000000000000 0x2bb bin/ledring12.o + .debug_macro 0x0000000000000000 0x64 bin/ledring12.o + .debug_macro 0x0000000000000000 0xe7 bin/ledring12.o + .debug_macro 0x0000000000000000 0x62f bin/ledring12.o + .debug_macro 0x0000000000000000 0x57b bin/ledring12.o + .debug_macro 0x0000000000000000 0x342 bin/ledring12.o + .debug_macro 0x0000000000000000 0x36c bin/ledring12.o + .debug_macro 0x0000000000000000 0xf7 bin/ledring12.o + .debug_macro 0x0000000000000000 0x73b bin/ledring12.o + .debug_macro 0x0000000000000000 0x223 bin/ledring12.o + .debug_macro 0x0000000000000000 0x34 bin/ledring12.o + .debug_macro 0x0000000000000000 0x82 bin/ledring12.o + .debug_macro 0x0000000000000000 0x144 bin/ledring12.o + .debug_macro 0x0000000000000000 0xc3 bin/ledring12.o + .debug_macro 0x0000000000000000 0x40 bin/ledring12.o + .debug_macro 0x0000000000000000 0x3cf bin/ledring12.o + .debug_macro 0x0000000000000000 0x188 bin/ledring12.o + .debug_macro 0x0000000000000000 0x149 bin/ledring12.o + .debug_macro 0x0000000000000000 0x279 bin/ledring12.o + .debug_macro 0x0000000000000000 0x35 bin/ledring12.o + .debug_macro 0x0000000000000000 0x103 bin/ledring12.o + .debug_macro 0x0000000000000000 0x76 bin/ledring12.o + .debug_macro 0x0000000000000000 0x10 bin/ledring12.o + .debug_macro 0x0000000000000000 0xca bin/ledring12.o + .debug_macro 0x0000000000000000 0x16 bin/ledring12.o + .debug_macro 0x0000000000000000 0x52 bin/ledring12.o + .debug_macro 0x0000000000000000 0x18a bin/ledring12.o + .debug_macro 0x0000000000000000 0x58 bin/ledring12.o + .debug_macro 0x0000000000000000 0x16 bin/ledring12.o + .debug_macro 0x0000000000000000 0x110 bin/ledring12.o + .debug_macro 0x0000000000000000 0x15d bin/ledring12.o + .debug_macro 0x0000000000000000 0xe4 bin/ledring12.o + .debug_macro 0x0000000000000000 0x10 bin/ledring12.o + .debug_macro 0x0000000000000000 0x1f bin/ledring12.o + .debug_macro 0x0000000000000000 0x3a7 bin/ledring12.o + .debug_macro 0x0000000000000000 0xc0 bin/ledring12.o + .debug_macro 0x0000000000000000 0x9a bin/ledring12.o + .debug_macro 0x0000000000000000 0x91 bin/ledring12.o + .debug_macro 0x0000000000000000 0xa6 bin/ledring12.o + .debug_macro 0x0000000000000000 0xb0 bin/ledring12.o + .debug_macro 0x0000000000000000 0x7f bin/ledring12.o + .debug_macro 0x0000000000000000 0x40 bin/ledring12.o + .debug_macro 0x0000000000000000 0x94 bin/ledring12.o + .debug_macro 0x0000000000000000 0x4c bin/ledring12.o + .debug_macro 0x0000000000000000 0x64 bin/ledring12.o + .group 0x0000000000000000 0x8 bin/configblockeeprom.o + .group 0x0000000000000000 0x8 bin/configblockeeprom.o + .group 0x0000000000000000 0x8 bin/configblockeeprom.o .group 0x0000000000000000 0x8 bin/configblockeeprom.o .group 0x0000000000000000 0x8 bin/configblockeeprom.o .group 0x0000000000000000 0x8 bin/configblockeeprom.o @@ -9581,17 +10569,18 @@ Discarded input sections .debug_macro 0x0000000000000000 0x29d bin/configblockeeprom.o .debug_macro 0x0000000000000000 0x52 bin/configblockeeprom.o .debug_macro 0x0000000000000000 0x16 bin/configblockeeprom.o - .debug_macro 0x0000000000000000 0x22 bin/configblockeeprom.o - .debug_macro 0x0000000000000000 0xbe bin/configblockeeprom.o .debug_macro 0x0000000000000000 0x180 bin/configblockeeprom.o .debug_macro 0x0000000000000000 0x10 bin/configblockeeprom.o .debug_macro 0x0000000000000000 0x35 bin/configblockeeprom.o .debug_macro 0x0000000000000000 0xca bin/configblockeeprom.o .debug_macro 0x0000000000000000 0x16 bin/configblockeeprom.o - .debug_macro 0x0000000000000000 0x168 bin/configblockeeprom.o + .debug_macro 0x0000000000000000 0x52 bin/configblockeeprom.o + .debug_macro 0x0000000000000000 0x18a bin/configblockeeprom.o .debug_macro 0x0000000000000000 0x58 bin/configblockeeprom.o .debug_macro 0x0000000000000000 0x2e bin/configblockeeprom.o - .debug_macro 0x0000000000000000 0x168 bin/configblockeeprom.o + .debug_macro 0x0000000000000000 0x137 bin/configblockeeprom.o + .debug_macro 0x0000000000000000 0x3a bin/configblockeeprom.o + .debug_macro 0x0000000000000000 0x35 bin/configblockeeprom.o .debug_macro 0x0000000000000000 0x5e bin/configblockeeprom.o .debug_macro 0x0000000000000000 0x3b bin/configblockeeprom.o .debug_macro 0x0000000000000000 0x18 bin/configblockeeprom.o @@ -9833,6 +10822,7 @@ LOAD bin/motors.o LOAD bin/crtp.o LOAD bin/ledseq.o LOAD bin/freeRTOSdebug.o +LOAD bin/buzzer.o LOAD bin/system.o LOAD bin/comm.o LOAD bin/console.o @@ -9848,6 +10838,7 @@ LOAD bin/log.o LOAD bin/worker.o LOAD bin/trigger.o LOAD bin/sitaw.o +LOAD bin/queuemonitor.o LOAD bin/filter.o LOAD bin/cpuid.o LOAD bin/cfassert.o @@ -9856,6 +10847,7 @@ LOAD bin/crc.o LOAD bin/fp16.o LOAD bin/debug.o LOAD bin/version.o +LOAD bin/FreeRTOS-openocd.o LOAD bin/startup_stm32f40xx.o LOAD bin/system_stm32f4xx.o LOAD bin/cpal_hal.o @@ -9872,15 +10864,17 @@ LOAD bin/platform_cf2.o LOAD bin/led_f405.o LOAD bin/mpu6500.o LOAD bin/i2cdev_f405.o -LOAD bin/ws2812.o +LOAD bin/ws2812_cf2.o LOAD bin/lps25h.o LOAD bin/ak8963.o LOAD bin/eeprom.o LOAD bin/maxsonar.o +LOAD bin/piezo.o LOAD bin/uart_syslink.o LOAD bin/swd.o LOAD bin/uart1.o LOAD bin/uart2.o +LOAD bin/watchdog.o LOAD bin/sonar.o LOAD bin/usb_bsp.o LOAD bin/usblink.o @@ -9892,14 +10886,18 @@ LOAD bin/syslink.o LOAD bin/radiolink.o LOAD bin/ow_syslink.o LOAD bin/proximity.o -LOAD bin/neopixelring.o -LOAD bin/expbrd.o LOAD bin/platformservice.o -LOAD bin/bigquad.o -LOAD bin/exptest.o +LOAD bin/sound_cf2.o +LOAD bin/deck.o +LOAD bin/deck_info.o +LOAD bin/deck_drivers.o LOAD bin/deck_constants.o LOAD bin/deck_digital.o LOAD bin/deck_analog.o +LOAD bin/buzzdeck.o +LOAD bin/bigquad.o +LOAD bin/exptest.o +LOAD bin/ledring12.o LOAD bin/configblockeeprom.o LOAD /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libm.a START GROUP @@ -10075,7 +11073,7 @@ LOAD /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none- *(.flashtext) 0x0000000008004188 . = ALIGN (0x4) -.text 0x0000000008004188 0x11210 +.text 0x0000000008004188 0x13494 0x0000000008004188 . = ALIGN (0x4) *(.text) .text 0x0000000008004188 0x370 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/armv7e-m/fpu/libgcc.a(_arm_addsubdf3.o) @@ -10140,1949 +11138,2110 @@ LOAD /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none- 0x000000000800509a 0x6 bin/list.o 0x000000000800509a vListInitialiseItem .text.vListInsertEnd - 0x00000000080050a0 0x1c bin/list.o + 0x00000000080050a0 0x18 bin/list.o 0x00000000080050a0 vListInsertEnd .text.vListInsert - 0x00000000080050bc 0x30 bin/list.o - 0x00000000080050bc vListInsert + 0x00000000080050b8 0x30 bin/list.o + 0x00000000080050b8 vListInsert .text.uxListRemove - 0x00000000080050ec 0x26 bin/list.o - 0x00000000080050ec uxListRemove + 0x00000000080050e8 0x24 bin/list.o + 0x00000000080050e8 uxListRemove .text.prvIdleTask - 0x0000000008005112 0x8 bin/tasks.o - *fill* 0x000000000800511a 0x2 + 0x000000000800510c 0x8 bin/tasks.o .text.prvAddCurrentTaskToDelayedList - 0x000000000800511c 0x50 bin/tasks.o - .text.debugPrintTCBInfo - 0x000000000800516c 0x44 bin/tasks.o - 0x000000000800516c debugPrintTCBInfo + 0x0000000008005114 0x50 bin/tasks.o .text.xTaskGenericCreate - 0x00000000080051b0 0x204 bin/tasks.o - 0x00000000080051b0 xTaskGenericCreate + 0x0000000008005164 0x1e0 bin/tasks.o + 0x0000000008005164 xTaskGenericCreate .text.vTaskStartScheduler - 0x00000000080053b4 0x70 bin/tasks.o - 0x00000000080053b4 vTaskStartScheduler + 0x0000000008005344 0x84 bin/tasks.o + 0x0000000008005344 vTaskStartScheduler .text.vTaskSuspendAll - 0x0000000008005424 0x10 bin/tasks.o - 0x0000000008005424 vTaskSuspendAll + 0x00000000080053c8 0x10 bin/tasks.o + 0x00000000080053c8 vTaskSuspendAll .text.xTaskGetTickCount - 0x0000000008005434 0x18 bin/tasks.o - 0x0000000008005434 xTaskGetTickCount - .text.vTaskIncrementTick - 0x000000000800544c 0xe8 bin/tasks.o - 0x000000000800544c vTaskIncrementTick + 0x00000000080053d8 0xc bin/tasks.o + 0x00000000080053d8 xTaskGetTickCount + .text.xTaskIncrementTick + 0x00000000080053e4 0x138 bin/tasks.o + 0x00000000080053e4 xTaskIncrementTick .text.xTaskResumeAll - 0x0000000008005534 0xd8 bin/tasks.o - 0x0000000008005534 xTaskResumeAll + 0x000000000800551c 0xe8 bin/tasks.o + 0x000000000800551c xTaskResumeAll .text.vTaskDelayUntil - 0x000000000800560c 0x88 bin/tasks.o - 0x000000000800560c vTaskDelayUntil + 0x0000000008005604 0xc4 bin/tasks.o + 0x0000000008005604 vTaskDelayUntil .text.vTaskDelay - 0x0000000008005694 0x3c bin/tasks.o - 0x0000000008005694 vTaskDelay + 0x00000000080056c8 0x80 bin/tasks.o + 0x00000000080056c8 vTaskDelay .text.vTaskSetApplicationTaskTag - 0x00000000080056d0 0x20 bin/tasks.o - 0x00000000080056d0 vTaskSetApplicationTaskTag + 0x0000000008005748 0x20 bin/tasks.o + 0x0000000008005748 vTaskSetApplicationTaskTag .text.vTaskSwitchContext - 0x00000000080056f0 0x94 bin/tasks.o - 0x00000000080056f0 vTaskSwitchContext + 0x0000000008005768 0x9c bin/tasks.o + 0x0000000008005768 vTaskSwitchContext .text.vTaskPlaceOnEventList - 0x0000000008005784 0x48 bin/tasks.o - 0x0000000008005784 vTaskPlaceOnEventList + 0x0000000008005804 0x60 bin/tasks.o + 0x0000000008005804 vTaskPlaceOnEventList .text.vTaskPlaceOnEventListRestricted - 0x00000000080057cc 0x48 bin/tasks.o - 0x00000000080057cc vTaskPlaceOnEventListRestricted + 0x0000000008005864 0x60 bin/tasks.o + 0x0000000008005864 vTaskPlaceOnEventListRestricted .text.xTaskRemoveFromEventList - 0x0000000008005814 0x78 bin/tasks.o - 0x0000000008005814 xTaskRemoveFromEventList + 0x00000000080058c4 0x84 bin/tasks.o + 0x00000000080058c4 xTaskRemoveFromEventList .text.vTaskSetTimeOutState - 0x000000000800588c 0x30 bin/tasks.o - 0x000000000800588c vTaskSetTimeOutState + 0x0000000008005948 0x30 bin/tasks.o + 0x0000000008005948 vTaskSetTimeOutState .text.xTaskCheckForTimeOut - 0x00000000080058bc 0x78 bin/tasks.o - 0x00000000080058bc xTaskCheckForTimeOut + 0x0000000008005978 0x70 bin/tasks.o + 0x0000000008005978 xTaskCheckForTimeOut .text.vTaskMissedYield - 0x0000000008005934 0xc bin/tasks.o - 0x0000000008005934 vTaskMissedYield - .text.xTaskGetCurrentTaskHandle - 0x0000000008005940 0xc bin/tasks.o - 0x0000000008005940 xTaskGetCurrentTaskHandle + 0x00000000080059e8 0xc bin/tasks.o + 0x00000000080059e8 vTaskMissedYield .text.xTaskGetSchedulerState - 0x000000000800594c 0x1c bin/tasks.o - 0x000000000800594c xTaskGetSchedulerState + 0x00000000080059f4 0x20 bin/tasks.o + 0x00000000080059f4 xTaskGetSchedulerState .text.vTaskPriorityInherit - 0x0000000008005968 0x68 bin/tasks.o - 0x0000000008005968 vTaskPriorityInherit - .text.vTaskPriorityDisinherit - 0x00000000080059d0 0x48 bin/tasks.o - 0x00000000080059d0 vTaskPriorityDisinherit + 0x0000000008005a14 0x8c bin/tasks.o + 0x0000000008005a14 vTaskPriorityInherit + .text.xTaskPriorityDisinherit + 0x0000000008005aa0 0xa4 bin/tasks.o + 0x0000000008005aa0 xTaskPriorityDisinherit + .text.pvTaskIncrementMutexHeldCount + 0x0000000008005b44 0x18 bin/tasks.o + 0x0000000008005b44 pvTaskIncrementMutexHeldCount .text.prvCopyDataToQueue - 0x0000000008005a18 0x58 bin/queue.o + 0x0000000008005b5c 0x6a bin/queue.o .text.prvCopyDataFromQueue - 0x0000000008005a70 0x26 bin/queue.o + 0x0000000008005bc6 0x26 bin/queue.o .text.prvUnlockQueue - 0x0000000008005a96 0x64 bin/queue.o - *fill* 0x0000000008005afa 0x2 + 0x0000000008005bec 0x64 bin/queue.o .text.xQueueGenericReset - 0x0000000008005afc 0x70 bin/queue.o - 0x0000000008005afc xQueueGenericReset + 0x0000000008005c50 0x80 bin/queue.o + 0x0000000008005c50 xQueueGenericReset .text.xQueueGenericCreate - 0x0000000008005b6c 0x50 bin/queue.o - 0x0000000008005b6c xQueueGenericCreate + 0x0000000008005cd0 0x68 bin/queue.o + 0x0000000008005cd0 xQueueGenericCreate .text.xQueueGenericSend - 0x0000000008005bbc 0x100 bin/queue.o - 0x0000000008005bbc xQueueGenericSend + 0x0000000008005d38 0x190 bin/queue.o + 0x0000000008005d38 xQueueGenericSend .text.xQueueCreateMutex - 0x0000000008005cbc 0x5c bin/queue.o - 0x0000000008005cbc xQueueCreateMutex + 0x0000000008005ec8 0x4a bin/queue.o + 0x0000000008005ec8 xQueueCreateMutex + *fill* 0x0000000008005f12 0x2 .text.xQueueGenericSendFromISR - 0x0000000008005d18 0x88 bin/queue.o - 0x0000000008005d18 xQueueGenericSendFromISR + 0x0000000008005f14 0xbc bin/queue.o + 0x0000000008005f14 xQueueGenericSendFromISR + .text.xQueueGiveFromISR + 0x0000000008005fd0 0xa0 bin/queue.o + 0x0000000008005fd0 xQueueGiveFromISR .text.xQueueGenericReceive - 0x0000000008005da0 0x134 bin/queue.o - 0x0000000008005da0 xQueueGenericReceive + 0x0000000008006070 0x180 bin/queue.o + 0x0000000008006070 xQueueGenericReceive .text.xQueueReceiveFromISR - 0x0000000008005ed4 0x84 bin/queue.o - 0x0000000008005ed4 xQueueReceiveFromISR + 0x00000000080061f0 0x8c bin/queue.o + 0x00000000080061f0 xQueueReceiveFromISR .text.uxQueueMessagesWaiting - 0x0000000008005f58 0x28 bin/queue.o - 0x0000000008005f58 uxQueueMessagesWaiting + 0x000000000800627c 0x28 bin/queue.o + 0x000000000800627c uxQueueMessagesWaiting + .text.vQueueAddToRegistry + 0x00000000080062a4 0x24 bin/queue.o + 0x00000000080062a4 vQueueAddToRegistry .text.vQueueWaitForMessageRestricted - 0x0000000008005f80 0x3a bin/queue.o - 0x0000000008005f80 vQueueWaitForMessageRestricted - *fill* 0x0000000008005fba 0x2 + 0x00000000080062c8 0x3e bin/queue.o + 0x00000000080062c8 vQueueWaitForMessageRestricted + *fill* 0x0000000008006306 0x2 .text.prvCheckForValidListAndQueue - 0x0000000008005fbc 0x4c bin/timers.o + 0x0000000008006308 0x70 bin/timers.o .text.prvInsertTimerInActiveList - 0x0000000008006008 0x3c bin/timers.o + 0x0000000008006378 0x3c bin/timers.o .text.xTimerCreateTimerTask - 0x0000000008006044 0x50 bin/timers.o - 0x0000000008006044 xTimerCreateTimerTask + 0x00000000080063b4 0x50 bin/timers.o + 0x00000000080063b4 xTimerCreateTimerTask .text.xTimerCreate - 0x0000000008006094 0x4c bin/timers.o - 0x0000000008006094 xTimerCreate + 0x0000000008006404 0x50 bin/timers.o + 0x0000000008006404 xTimerCreate .text.xTimerGenericCommand - 0x00000000080060e0 0x44 bin/timers.o - 0x00000000080060e0 xTimerGenericCommand - .text.prvSwitchTimerLists.isra.1 - 0x0000000008006124 0x78 bin/timers.o + 0x0000000008006454 0x68 bin/timers.o + 0x0000000008006454 xTimerGenericCommand + .text.prvSwitchTimerLists + 0x00000000080064bc 0x78 bin/timers.o .text.prvTimerTask - 0x000000000800619c 0x17c bin/timers.o + 0x0000000008006534 0x1b8 bin/timers.o .text.pvTimerGetTimerID - 0x0000000008006318 0x4 bin/timers.o - 0x0000000008006318 pvTimerGetTimerID + 0x00000000080066ec 0x28 bin/timers.o + 0x00000000080066ec pvTimerGetTimerID .text.prvInsertBlockIntoFreeList - 0x000000000800631c 0x4c bin/heap_4.o + 0x0000000008006714 0x4c bin/heap_4.o .text.pvPortMalloc - 0x0000000008006368 0xb4 bin/heap_4.o - 0x0000000008006368 pvPortMalloc + 0x0000000008006760 0x13c bin/heap_4.o + 0x0000000008006760 pvPortMalloc .text.vPortFree - 0x000000000800641c 0x2c bin/heap_4.o - 0x000000000800641c vPortFree + 0x000000000800689c 0x80 bin/heap_4.o + 0x000000000800689c vPortFree .text.xPortGetFreeHeapSize - 0x0000000008006448 0xc bin/heap_4.o - 0x0000000008006448 xPortGetFreeHeapSize + 0x000000000800691c 0xc bin/heap_4.o + 0x000000000800691c xPortGetFreeHeapSize .text.prvPortStartFirstTask - 0x0000000008006454 0x14 bin/port.o + 0x0000000008006928 0x20 bin/port.o .text.vPortEnableVFP - 0x0000000008006468 0x14 bin/port.o + 0x0000000008006948 0x14 bin/port.o + .text.prvTaskExitError + 0x000000000800695c 0x34 bin/port.o .text.pxPortInitialiseStack - 0x000000000800647c 0x1e bin/port.o - 0x000000000800647c pxPortInitialiseStack - *fill* 0x000000000800649a 0x2 + 0x0000000008006990 0x24 bin/port.o + 0x0000000008006990 pxPortInitialiseStack .text.SVC_Handler - 0x000000000800649c 0x1c bin/port.o - 0x000000000800649c SVC_Handler - .text.vPortYieldFromISR - 0x00000000080064b8 0x10 bin/port.o - 0x00000000080064b8 vPortYieldFromISR - .text.ulPortSetInterruptMask - 0x00000000080064c8 0x10 bin/port.o - 0x00000000080064c8 ulPortSetInterruptMask + 0x00000000080069b4 0x20 bin/port.o + 0x00000000080069b4 SVC_Handler .text.vPortEnterCritical - 0x00000000080064d8 0x14 bin/port.o - 0x00000000080064d8 vPortEnterCritical - .text.vPortClearInterruptMask - 0x00000000080064ec 0x6 bin/port.o - 0x00000000080064ec vPortClearInterruptMask - *fill* 0x00000000080064f2 0x2 + 0x00000000080069d4 0x44 bin/port.o + 0x00000000080069d4 vPortEnterCritical .text.vPortExitCritical - 0x00000000080064f4 0x14 bin/port.o - 0x00000000080064f4 vPortExitCritical + 0x0000000008006a18 0x30 bin/port.o + 0x0000000008006a18 vPortExitCritical .text.PendSV_Handler - 0x0000000008006508 0x50 bin/port.o - 0x0000000008006508 PendSV_Handler + 0x0000000008006a48 0x60 bin/port.o + 0x0000000008006a48 PendSV_Handler .text.tickFreeRTOS - 0x0000000008006558 0x20 bin/port.o - 0x0000000008006558 tickFreeRTOS + 0x0000000008006aa8 0x30 bin/port.o + 0x0000000008006aa8 tickFreeRTOS .text.vPortSetupTimerInterrupt - 0x0000000008006578 0x18 bin/port.o - 0x0000000008006578 vPortSetupTimerInterrupt + 0x0000000008006ad8 0x18 bin/port.o + 0x0000000008006ad8 vPortSetupTimerInterrupt .text.xPortStartScheduler - 0x0000000008006590 0x40 bin/port.o - 0x0000000008006590 xPortStartScheduler + 0x0000000008006af0 0xe4 bin/port.o + 0x0000000008006af0 xPortStartScheduler + .text.vPortValidateInterruptPriority + 0x0000000008006bd4 0x60 bin/port.o + 0x0000000008006bd4 vPortValidateInterruptPriority .text.ADC_DeInit - 0x00000000080065d0 0x1a bin/stm32f4xx_adc.o - 0x00000000080065d0 ADC_DeInit - *fill* 0x00000000080065ea 0x2 + 0x0000000008006c34 0x1a bin/stm32f4xx_adc.o + 0x0000000008006c34 ADC_DeInit + *fill* 0x0000000008006c4e 0x2 .text.ADC_Init - 0x00000000080065ec 0x4c bin/stm32f4xx_adc.o - 0x00000000080065ec ADC_Init + 0x0000000008006c50 0x4c bin/stm32f4xx_adc.o + 0x0000000008006c50 ADC_Init .text.ADC_StructInit - 0x0000000008006638 0x14 bin/stm32f4xx_adc.o - 0x0000000008006638 ADC_StructInit + 0x0000000008006c9c 0x14 bin/stm32f4xx_adc.o + 0x0000000008006c9c ADC_StructInit .text.ADC_CommonInit - 0x000000000800664c 0x28 bin/stm32f4xx_adc.o - 0x000000000800664c ADC_CommonInit + 0x0000000008006cb0 0x28 bin/stm32f4xx_adc.o + 0x0000000008006cb0 ADC_CommonInit .text.ADC_CommonStructInit - 0x0000000008006674 0xc bin/stm32f4xx_adc.o - 0x0000000008006674 ADC_CommonStructInit - .text.ADC_Cmd 0x0000000008006680 0x12 bin/stm32f4xx_adc.o - 0x0000000008006680 ADC_Cmd - *fill* 0x0000000008006692 0x2 + 0x0000000008006cd8 0xc bin/stm32f4xx_adc.o + 0x0000000008006cd8 ADC_CommonStructInit + .text.ADC_Cmd 0x0000000008006ce4 0x12 bin/stm32f4xx_adc.o + 0x0000000008006ce4 ADC_Cmd + *fill* 0x0000000008006cf6 0x2 .text.DBGMCU_APB2PeriphConfig - 0x0000000008006694 0x18 bin/stm32f4xx_dbgmcu.o - 0x0000000008006694 DBGMCU_APB2PeriphConfig + 0x0000000008006cf8 0x18 bin/stm32f4xx_dbgmcu.o + 0x0000000008006cf8 DBGMCU_APB2PeriphConfig .text.DMA_DeInit - 0x00000000080066ac 0x10c bin/stm32f4xx_dma.o - 0x00000000080066ac DMA_DeInit + 0x0000000008006d10 0x10c bin/stm32f4xx_dma.o + 0x0000000008006d10 DMA_DeInit .text.DMA_Init - 0x00000000080067b8 0x54 bin/stm32f4xx_dma.o - 0x00000000080067b8 DMA_Init - .text.DMA_Cmd 0x000000000800680c 0x12 bin/stm32f4xx_dma.o - 0x000000000800680c DMA_Cmd + 0x0000000008006e1c 0x54 bin/stm32f4xx_dma.o + 0x0000000008006e1c DMA_Init + .text.DMA_Cmd 0x0000000008006e70 0x12 bin/stm32f4xx_dma.o + 0x0000000008006e70 DMA_Cmd .text.DMA_SetCurrDataCounter - 0x000000000800681e 0x4 bin/stm32f4xx_dma.o - 0x000000000800681e DMA_SetCurrDataCounter + 0x0000000008006e82 0x4 bin/stm32f4xx_dma.o + 0x0000000008006e82 DMA_SetCurrDataCounter .text.DMA_GetCurrDataCounter - 0x0000000008006822 0x6 bin/stm32f4xx_dma.o - 0x0000000008006822 DMA_GetCurrDataCounter + 0x0000000008006e86 0x6 bin/stm32f4xx_dma.o + 0x0000000008006e86 DMA_GetCurrDataCounter .text.DMA_GetCmdStatus - 0x0000000008006828 0x8 bin/stm32f4xx_dma.o - 0x0000000008006828 DMA_GetCmdStatus + 0x0000000008006e8c 0x8 bin/stm32f4xx_dma.o + 0x0000000008006e8c DMA_GetCmdStatus .text.DMA_ITConfig - 0x0000000008006830 0x3e bin/stm32f4xx_dma.o - 0x0000000008006830 DMA_ITConfig - *fill* 0x000000000800686e 0x2 + 0x0000000008006e94 0x3e bin/stm32f4xx_dma.o + 0x0000000008006e94 DMA_ITConfig + *fill* 0x0000000008006ed2 0x2 .text.DMA_GetITStatus - 0x0000000008006870 0x50 bin/stm32f4xx_dma.o - 0x0000000008006870 DMA_GetITStatus + 0x0000000008006ed4 0x50 bin/stm32f4xx_dma.o + 0x0000000008006ed4 DMA_GetITStatus .text.DMA_ClearITPendingBit - 0x00000000080068c0 0x30 bin/stm32f4xx_dma.o - 0x00000000080068c0 DMA_ClearITPendingBit + 0x0000000008006f24 0x30 bin/stm32f4xx_dma.o + 0x0000000008006f24 DMA_ClearITPendingBit .text.EXTI_Init - 0x00000000080068f0 0x88 bin/stm32f4xx_exti.o - 0x00000000080068f0 EXTI_Init + 0x0000000008006f54 0x88 bin/stm32f4xx_exti.o + 0x0000000008006f54 EXTI_Init .text.EXTI_ClearFlag - 0x0000000008006978 0xc bin/stm32f4xx_exti.o - 0x0000000008006978 EXTI_ClearFlag + 0x0000000008006fdc 0xc bin/stm32f4xx_exti.o + 0x0000000008006fdc EXTI_ClearFlag .text.EXTI_GetITStatus - 0x0000000008006984 0x14 bin/stm32f4xx_exti.o - 0x0000000008006984 EXTI_GetITStatus + 0x0000000008006fe8 0x14 bin/stm32f4xx_exti.o + 0x0000000008006fe8 EXTI_GetITStatus .text.EXTI_ClearITPendingBit - 0x0000000008006998 0xc bin/stm32f4xx_exti.o - 0x0000000008006998 EXTI_ClearITPendingBit + 0x0000000008006ffc 0xc bin/stm32f4xx_exti.o + 0x0000000008006ffc EXTI_ClearITPendingBit .text.GPIO_Init - 0x00000000080069a4 0x6c bin/stm32f4xx_gpio.o - 0x00000000080069a4 GPIO_Init + 0x0000000008007008 0x6c bin/stm32f4xx_gpio.o + 0x0000000008007008 GPIO_Init .text.GPIO_StructInit - 0x0000000008006a10 0x12 bin/stm32f4xx_gpio.o - 0x0000000008006a10 GPIO_StructInit + 0x0000000008007074 0x12 bin/stm32f4xx_gpio.o + 0x0000000008007074 GPIO_StructInit .text.GPIO_ReadInputDataBit - 0x0000000008006a22 0xc bin/stm32f4xx_gpio.o - 0x0000000008006a22 GPIO_ReadInputDataBit + 0x0000000008007086 0xc bin/stm32f4xx_gpio.o + 0x0000000008007086 GPIO_ReadInputDataBit .text.GPIO_SetBits - 0x0000000008006a2e 0x4 bin/stm32f4xx_gpio.o - 0x0000000008006a2e GPIO_SetBits + 0x0000000008007092 0x4 bin/stm32f4xx_gpio.o + 0x0000000008007092 GPIO_SetBits .text.GPIO_ResetBits - 0x0000000008006a32 0x4 bin/stm32f4xx_gpio.o - 0x0000000008006a32 GPIO_ResetBits + 0x0000000008007096 0x4 bin/stm32f4xx_gpio.o + 0x0000000008007096 GPIO_ResetBits .text.GPIO_PinAFConfig - 0x0000000008006a36 0x24 bin/stm32f4xx_gpio.o - 0x0000000008006a36 GPIO_PinAFConfig - *fill* 0x0000000008006a5a 0x2 + 0x000000000800709a 0x24 bin/stm32f4xx_gpio.o + 0x000000000800709a GPIO_PinAFConfig + *fill* 0x00000000080070be 0x2 .text.I2C_Init - 0x0000000008006a5c 0xd4 bin/stm32f4xx_i2c.o - 0x0000000008006a5c I2C_Init + 0x00000000080070c0 0xd4 bin/stm32f4xx_i2c.o + 0x00000000080070c0 I2C_Init + .text.IWDG_WriteAccessCmd + 0x0000000008007194 0xc bin/stm32f4xx_iwdg.o + 0x0000000008007194 IWDG_WriteAccessCmd + .text.IWDG_SetPrescaler + 0x00000000080071a0 0xc bin/stm32f4xx_iwdg.o + 0x00000000080071a0 IWDG_SetPrescaler + .text.IWDG_SetReload + 0x00000000080071ac 0xc bin/stm32f4xx_iwdg.o + 0x00000000080071ac IWDG_SetReload + .text.IWDG_ReloadCounter + 0x00000000080071b8 0x10 bin/stm32f4xx_iwdg.o + 0x00000000080071b8 IWDG_ReloadCounter + .text.IWDG_Enable + 0x00000000080071c8 0x10 bin/stm32f4xx_iwdg.o + 0x00000000080071c8 IWDG_Enable .text.RCC_GetClocksFreq - 0x0000000008006b30 0x88 bin/stm32f4xx_rcc.o - 0x0000000008006b30 RCC_GetClocksFreq + 0x00000000080071d8 0x88 bin/stm32f4xx_rcc.o + 0x00000000080071d8 RCC_GetClocksFreq .text.RCC_AHB1PeriphClockCmd - 0x0000000008006bb8 0x18 bin/stm32f4xx_rcc.o - 0x0000000008006bb8 RCC_AHB1PeriphClockCmd + 0x0000000008007260 0x18 bin/stm32f4xx_rcc.o + 0x0000000008007260 RCC_AHB1PeriphClockCmd .text.RCC_AHB2PeriphClockCmd - 0x0000000008006bd0 0x18 bin/stm32f4xx_rcc.o - 0x0000000008006bd0 RCC_AHB2PeriphClockCmd + 0x0000000008007278 0x18 bin/stm32f4xx_rcc.o + 0x0000000008007278 RCC_AHB2PeriphClockCmd .text.RCC_APB1PeriphClockCmd - 0x0000000008006be8 0x18 bin/stm32f4xx_rcc.o - 0x0000000008006be8 RCC_APB1PeriphClockCmd + 0x0000000008007290 0x18 bin/stm32f4xx_rcc.o + 0x0000000008007290 RCC_APB1PeriphClockCmd .text.RCC_APB2PeriphClockCmd - 0x0000000008006c00 0x18 bin/stm32f4xx_rcc.o - 0x0000000008006c00 RCC_APB2PeriphClockCmd + 0x00000000080072a8 0x18 bin/stm32f4xx_rcc.o + 0x00000000080072a8 RCC_APB2PeriphClockCmd .text.RCC_APB1PeriphResetCmd - 0x0000000008006c18 0x18 bin/stm32f4xx_rcc.o - 0x0000000008006c18 RCC_APB1PeriphResetCmd + 0x00000000080072c0 0x18 bin/stm32f4xx_rcc.o + 0x00000000080072c0 RCC_APB1PeriphResetCmd .text.RCC_APB2PeriphResetCmd - 0x0000000008006c30 0x18 bin/stm32f4xx_rcc.o - 0x0000000008006c30 RCC_APB2PeriphResetCmd + 0x00000000080072d8 0x18 bin/stm32f4xx_rcc.o + 0x00000000080072d8 RCC_APB2PeriphResetCmd + .text.RCC_GetFlagStatus + 0x00000000080072f0 0x28 bin/stm32f4xx_rcc.o + 0x00000000080072f0 RCC_GetFlagStatus + .text.RCC_ClearFlag + 0x0000000008007318 0x10 bin/stm32f4xx_rcc.o + 0x0000000008007318 RCC_ClearFlag .text.TIM_DeInit - 0x0000000008006c48 0x154 bin/stm32f4xx_tim.o - 0x0000000008006c48 TIM_DeInit + 0x0000000008007328 0x154 bin/stm32f4xx_tim.o + 0x0000000008007328 TIM_DeInit .text.TIM_TimeBaseInit - 0x0000000008006d9c 0x7c bin/stm32f4xx_tim.o - 0x0000000008006d9c TIM_TimeBaseInit + 0x000000000800747c 0x7c bin/stm32f4xx_tim.o + 0x000000000800747c TIM_TimeBaseInit .text.TIM_TimeBaseStructInit - 0x0000000008006e18 0x12 bin/stm32f4xx_tim.o - 0x0000000008006e18 TIM_TimeBaseStructInit - .text.TIM_Cmd 0x0000000008006e2a 0x18 bin/stm32f4xx_tim.o - 0x0000000008006e2a TIM_Cmd - *fill* 0x0000000008006e42 0x2 + 0x00000000080074f8 0x12 bin/stm32f4xx_tim.o + 0x00000000080074f8 TIM_TimeBaseStructInit + .text.TIM_PrescalerConfig + 0x000000000800750a 0x6 bin/stm32f4xx_tim.o + 0x000000000800750a TIM_PrescalerConfig + .text.TIM_Cmd 0x0000000008007510 0x18 bin/stm32f4xx_tim.o + 0x0000000008007510 TIM_Cmd .text.TIM_OC1Init - 0x0000000008006e44 0x70 bin/stm32f4xx_tim.o - 0x0000000008006e44 TIM_OC1Init + 0x0000000008007528 0x70 bin/stm32f4xx_tim.o + 0x0000000008007528 TIM_OC1Init .text.TIM_OC2Init - 0x0000000008006eb4 0x88 bin/stm32f4xx_tim.o - 0x0000000008006eb4 TIM_OC2Init + 0x0000000008007598 0x88 bin/stm32f4xx_tim.o + 0x0000000008007598 TIM_OC2Init .text.TIM_OC3Init - 0x0000000008006f3c 0x84 bin/stm32f4xx_tim.o - 0x0000000008006f3c TIM_OC3Init + 0x0000000008007620 0x84 bin/stm32f4xx_tim.o + 0x0000000008007620 TIM_OC3Init .text.TIM_OC4Init - 0x0000000008006fc0 0x68 bin/stm32f4xx_tim.o - 0x0000000008006fc0 TIM_OC4Init + 0x00000000080076a4 0x68 bin/stm32f4xx_tim.o + 0x00000000080076a4 TIM_OC4Init .text.TIM_SetCompare1 - 0x0000000008007028 0x4 bin/stm32f4xx_tim.o - 0x0000000008007028 TIM_SetCompare1 + 0x000000000800770c 0x4 bin/stm32f4xx_tim.o + 0x000000000800770c TIM_SetCompare1 .text.TIM_SetCompare2 - 0x000000000800702c 0x4 bin/stm32f4xx_tim.o - 0x000000000800702c TIM_SetCompare2 + 0x0000000008007710 0x4 bin/stm32f4xx_tim.o + 0x0000000008007710 TIM_SetCompare2 .text.TIM_SetCompare3 - 0x0000000008007030 0x4 bin/stm32f4xx_tim.o - 0x0000000008007030 TIM_SetCompare3 + 0x0000000008007714 0x4 bin/stm32f4xx_tim.o + 0x0000000008007714 TIM_SetCompare3 .text.TIM_SetCompare4 - 0x0000000008007034 0x4 bin/stm32f4xx_tim.o - 0x0000000008007034 TIM_SetCompare4 + 0x0000000008007718 0x4 bin/stm32f4xx_tim.o + 0x0000000008007718 TIM_SetCompare4 .text.TIM_OC1PreloadConfig - 0x0000000008007038 0x10 bin/stm32f4xx_tim.o - 0x0000000008007038 TIM_OC1PreloadConfig + 0x000000000800771c 0x10 bin/stm32f4xx_tim.o + 0x000000000800771c TIM_OC1PreloadConfig .text.TIM_OC2PreloadConfig - 0x0000000008007048 0x14 bin/stm32f4xx_tim.o - 0x0000000008007048 TIM_OC2PreloadConfig + 0x000000000800772c 0x14 bin/stm32f4xx_tim.o + 0x000000000800772c TIM_OC2PreloadConfig .text.TIM_OC3PreloadConfig - 0x000000000800705c 0x10 bin/stm32f4xx_tim.o - 0x000000000800705c TIM_OC3PreloadConfig + 0x0000000008007740 0x10 bin/stm32f4xx_tim.o + 0x0000000008007740 TIM_OC3PreloadConfig .text.TIM_OC4PreloadConfig - 0x000000000800706c 0x14 bin/stm32f4xx_tim.o - 0x000000000800706c TIM_OC4PreloadConfig + 0x0000000008007750 0x14 bin/stm32f4xx_tim.o + 0x0000000008007750 TIM_OC4PreloadConfig .text.TIM_GetCapture1 - 0x0000000008007080 0x4 bin/stm32f4xx_tim.o - 0x0000000008007080 TIM_GetCapture1 + 0x0000000008007764 0x4 bin/stm32f4xx_tim.o + 0x0000000008007764 TIM_GetCapture1 .text.TIM_GetCapture2 - 0x0000000008007084 0x4 bin/stm32f4xx_tim.o - 0x0000000008007084 TIM_GetCapture2 + 0x0000000008007768 0x4 bin/stm32f4xx_tim.o + 0x0000000008007768 TIM_GetCapture2 .text.TIM_GetCapture3 - 0x0000000008007088 0x4 bin/stm32f4xx_tim.o - 0x0000000008007088 TIM_GetCapture3 + 0x000000000800776c 0x4 bin/stm32f4xx_tim.o + 0x000000000800776c TIM_GetCapture3 .text.TIM_GetCapture4 - 0x000000000800708c 0x4 bin/stm32f4xx_tim.o - 0x000000000800708c TIM_GetCapture4 + 0x0000000008007770 0x4 bin/stm32f4xx_tim.o + 0x0000000008007770 TIM_GetCapture4 .text.TIM_CtrlPWMOutputs - 0x0000000008007090 0x1c bin/stm32f4xx_tim.o - 0x0000000008007090 TIM_CtrlPWMOutputs + 0x0000000008007774 0x1c bin/stm32f4xx_tim.o + 0x0000000008007774 TIM_CtrlPWMOutputs .text.TIM_DMACmd - 0x00000000080070ac 0x12 bin/stm32f4xx_tim.o - 0x00000000080070ac TIM_DMACmd - *fill* 0x00000000080070be 0x2 + 0x0000000008007790 0x12 bin/stm32f4xx_tim.o + 0x0000000008007790 TIM_DMACmd + *fill* 0x00000000080077a2 0x2 .text.USART_Init - 0x00000000080070c0 0xb4 bin/stm32f4xx_usart.o - 0x00000000080070c0 USART_Init + 0x00000000080077a4 0xb4 bin/stm32f4xx_usart.o + 0x00000000080077a4 USART_Init .text.USART_Cmd - 0x0000000008007174 0x18 bin/stm32f4xx_usart.o - 0x0000000008007174 USART_Cmd + 0x0000000008007858 0x18 bin/stm32f4xx_usart.o + 0x0000000008007858 USART_Cmd .text.USART_SendData - 0x000000000800718c 0x8 bin/stm32f4xx_usart.o - 0x000000000800718c USART_SendData + 0x0000000008007870 0x8 bin/stm32f4xx_usart.o + 0x0000000008007870 USART_SendData .text.USART_ReceiveData - 0x0000000008007194 0x8 bin/stm32f4xx_usart.o - 0x0000000008007194 USART_ReceiveData + 0x0000000008007878 0x8 bin/stm32f4xx_usart.o + 0x0000000008007878 USART_ReceiveData .text.USART_DMACmd - 0x000000000800719c 0x12 bin/stm32f4xx_usart.o - 0x000000000800719c USART_DMACmd + 0x0000000008007880 0x12 bin/stm32f4xx_usart.o + 0x0000000008007880 USART_DMACmd .text.USART_ITConfig - 0x00000000080071ae 0x32 bin/stm32f4xx_usart.o - 0x00000000080071ae USART_ITConfig + 0x0000000008007892 0x32 bin/stm32f4xx_usart.o + 0x0000000008007892 USART_ITConfig .text.USART_ClearFlag - 0x00000000080071e0 0x8 bin/stm32f4xx_usart.o - 0x00000000080071e0 USART_ClearFlag + 0x00000000080078c4 0x8 bin/stm32f4xx_usart.o + 0x00000000080078c4 USART_ClearFlag .text.USART_GetITStatus - 0x00000000080071e8 0x3e bin/stm32f4xx_usart.o - 0x00000000080071e8 USART_GetITStatus + 0x00000000080078cc 0x3e bin/stm32f4xx_usart.o + 0x00000000080078cc USART_GetITStatus .text.USART_ClearITPendingBit - 0x0000000008007226 0xe bin/stm32f4xx_usart.o - 0x0000000008007226 USART_ClearITPendingBit + 0x000000000800790a 0xe bin/stm32f4xx_usart.o + 0x000000000800790a USART_ClearITPendingBit .text.NVIC_PriorityGroupConfig - 0x0000000008007234 0x14 bin/stm32f4xx_misc.o - 0x0000000008007234 NVIC_PriorityGroupConfig + 0x0000000008007918 0x14 bin/stm32f4xx_misc.o + 0x0000000008007918 NVIC_PriorityGroupConfig .text.NVIC_Init - 0x0000000008007248 0x6c bin/stm32f4xx_misc.o - 0x0000000008007248 NVIC_Init + 0x000000000800792c 0x6c bin/stm32f4xx_misc.o + 0x000000000800792c NVIC_Init .text.SYSCFG_EXTILineConfig - 0x00000000080072b4 0x2a bin/stm32f4xx_syscfg.o - 0x00000000080072b4 SYSCFG_EXTILineConfig + 0x0000000008007998 0x2a bin/stm32f4xx_syscfg.o + 0x0000000008007998 SYSCFG_EXTILineConfig .text.startup.main - 0x00000000080072de 0x24 bin/main.o - 0x00000000080072de main + 0x00000000080079c2 0x24 bin/main.o + 0x00000000080079c2 main .text.EXTI15_10_IRQHandler - 0x0000000008007302 0x1e bin/exti.o - 0x0000000008007302 EXTI15_10_IRQHandler + 0x00000000080079e6 0x1e bin/exti.o + 0x00000000080079e6 EXTI15_10_IRQHandler .text.nvicInit - 0x0000000008007320 0x8 bin/nvic.o - 0x0000000008007320 nvicInit + 0x0000000008007a04 0x8 bin/nvic.o + 0x0000000008007a04 nvicInit .text.SysTick_Handler - 0x0000000008007328 0xe bin/nvic.o - 0x0000000008007328 SysTick_Handler + 0x0000000008007a0c 0xe bin/nvic.o + 0x0000000008007a0c SysTick_Handler .text.NMI_Handler - 0x0000000008007336 0x2 bin/nvic.o - 0x0000000008007336 NMI_Handler + 0x0000000008007a1a 0x2 bin/nvic.o + 0x0000000008007a1a NMI_Handler .text.HardFault_Handler - 0x0000000008007338 0x14 bin/nvic.o - 0x0000000008007338 HardFault_Handler + 0x0000000008007a1c 0x14 bin/nvic.o + 0x0000000008007a1c HardFault_Handler .text.printHardFault - 0x000000000800734c 0x104 bin/nvic.o - 0x000000000800734c printHardFault + 0x0000000008007a30 0x104 bin/nvic.o + 0x0000000008007a30 printHardFault .text.MemManage_Handler - 0x0000000008007450 0x2 bin/nvic.o - 0x0000000008007450 MemManage_Handler + 0x0000000008007b34 0x2 bin/nvic.o + 0x0000000008007b34 MemManage_Handler .text.BusFault_Handler - 0x0000000008007452 0x2 bin/nvic.o - 0x0000000008007452 BusFault_Handler + 0x0000000008007b36 0x2 bin/nvic.o + 0x0000000008007b36 BusFault_Handler .text.UsageFault_Handler - 0x0000000008007454 0x2 bin/nvic.o - 0x0000000008007454 UsageFault_Handler + 0x0000000008007b38 0x2 bin/nvic.o + 0x0000000008007b38 UsageFault_Handler .text.DebugMon_Handler - 0x0000000008007456 0x2 bin/nvic.o - 0x0000000008007456 DebugMon_Handler + 0x0000000008007b3a 0x2 bin/nvic.o + 0x0000000008007b3a DebugMon_Handler .text.DMA1_Stream5_IRQHandler - 0x0000000008007458 0x4 bin/nvic.o - 0x0000000008007458 DMA1_Stream5_IRQHandler + 0x0000000008007b3c 0x4 bin/nvic.o + 0x0000000008007b3c DMA1_Stream5_IRQHandler .text.motorsDeInit - 0x000000000800745c 0x44 bin/motors.o - 0x000000000800745c motorsDeInit + 0x0000000008007b40 0x44 bin/motors.o + 0x0000000008007b40 motorsDeInit .text.motorsInit - 0x00000000080074a0 0x10c bin/motors.o - 0x00000000080074a0 motorsInit - *fill* 0x00000000080075ac 0x4 + 0x0000000008007b84 0x10c bin/motors.o + 0x0000000008007b84 motorsInit .text.motorsSetRatio - 0x00000000080075b0 0x11c bin/motors.o - 0x00000000080075b0 motorsSetRatio + 0x0000000008007c90 0x11c bin/motors.o + 0x0000000008007c90 motorsSetRatio .text.motorsBeep - 0x00000000080076cc 0x84 bin/motors.o - 0x00000000080076cc motorsBeep + 0x0000000008007dac 0x84 bin/motors.o + 0x0000000008007dac motorsBeep .text.motorsTest - 0x0000000008007750 0x5c bin/motors.o - 0x0000000008007750 motorsTest - .text.nopFunc 0x00000000080077ac 0x4 bin/crtp.o + 0x0000000008007e30 0x5c bin/motors.o + 0x0000000008007e30 motorsTest + .text.nopFunc 0x0000000008007e8c 0x4 bin/crtp.o .text.crtpRxTask - 0x00000000080077b0 0x60 bin/crtp.o + 0x0000000008007e90 0x60 bin/crtp.o .text.crtpTxTask - 0x0000000008007810 0x48 bin/crtp.o + 0x0000000008007ef0 0x48 bin/crtp.o .text.crtpInit - 0x0000000008007858 0x74 bin/crtp.o - 0x0000000008007858 crtpInit + 0x0000000008007f38 0x60 bin/crtp.o + 0x0000000008007f38 crtpInit .text.crtpTest - 0x00000000080078cc 0xc bin/crtp.o - 0x00000000080078cc crtpTest + 0x0000000008007f98 0xc bin/crtp.o + 0x0000000008007f98 crtpTest .text.crtpInitTaskQueue - 0x00000000080078d8 0x34 bin/crtp.o - 0x00000000080078d8 crtpInitTaskQueue + 0x0000000008007fa4 0x34 bin/crtp.o + 0x0000000008007fa4 crtpInitTaskQueue .text.crtpReceivePacketBlock - 0x000000000800790c 0x4c bin/crtp.o - 0x000000000800790c crtpReceivePacketBlock + 0x0000000008007fd8 0x4c bin/crtp.o + 0x0000000008007fd8 crtpReceivePacketBlock .text.crtpGetFreeTxQueuePackets - 0x0000000008007958 0x14 bin/crtp.o - 0x0000000008007958 crtpGetFreeTxQueuePackets + 0x0000000008008024 0x14 bin/crtp.o + 0x0000000008008024 crtpGetFreeTxQueuePackets .text.crtpRegisterPortCB - 0x000000000800796c 0x10 bin/crtp.o - 0x000000000800796c crtpRegisterPortCB + 0x0000000008008038 0x10 bin/crtp.o + 0x0000000008008038 crtpRegisterPortCB .text.crtpSendPacket - 0x000000000800797c 0x44 bin/crtp.o - 0x000000000800797c crtpSendPacket + 0x0000000008008048 0x44 bin/crtp.o + 0x0000000008008048 crtpSendPacket .text.crtpReset - 0x00000000080079c0 0x24 bin/crtp.o - 0x00000000080079c0 crtpReset + 0x000000000800808c 0x24 bin/crtp.o + 0x000000000800808c crtpReset .text.crtpIsConnected - 0x00000000080079e4 0x14 bin/crtp.o - 0x00000000080079e4 crtpIsConnected + 0x00000000080080b0 0x14 bin/crtp.o + 0x00000000080080b0 crtpIsConnected .text.crtpSetLink - 0x00000000080079f8 0x30 bin/crtp.o - 0x00000000080079f8 crtpSetLink + 0x00000000080080c4 0x30 bin/crtp.o + 0x00000000080080c4 crtpSetLink .text.updateActive - 0x0000000008007a28 0x3c bin/ledseq.o + 0x00000000080080f4 0x3c bin/ledseq.o .text.runLedseq - 0x0000000008007a64 0xd0 bin/ledseq.o + 0x0000000008008130 0xd0 bin/ledseq.o .text.ledseqInit - 0x0000000008007b34 0x98 bin/ledseq.o - 0x0000000008007b34 ledseqInit + 0x0000000008008200 0x98 bin/ledseq.o + 0x0000000008008200 ledseqInit .text.ledseqTest - 0x0000000008007bcc 0x1c bin/ledseq.o - 0x0000000008007bcc ledseqTest + 0x0000000008008298 0x1c bin/ledseq.o + 0x0000000008008298 ledseqTest .text.ledseqRun - 0x0000000008007be8 0x78 bin/ledseq.o - 0x0000000008007be8 ledseqRun + 0x00000000080082b4 0x78 bin/ledseq.o + 0x00000000080082b4 ledseqRun .text.ledseqSetTimes - 0x0000000008007c60 0x6 bin/ledseq.o - 0x0000000008007c60 ledseqSetTimes - *fill* 0x0000000008007c66 0x2 + 0x000000000800832c 0x6 bin/ledseq.o + 0x000000000800832c ledseqSetTimes + *fill* 0x0000000008008332 0x2 .text.ledseqStop - 0x0000000008007c68 0x68 bin/ledseq.o - 0x0000000008007c68 ledseqStop + 0x0000000008008334 0x68 bin/ledseq.o + 0x0000000008008334 ledseqStop .text.vApplicationMallocFailedHook - 0x0000000008007cd0 0x28 bin/freeRTOSdebug.o - 0x0000000008007cd0 vApplicationMallocFailedHook + 0x000000000800839c 0x34 bin/freeRTOSdebug.o + 0x000000000800839c vApplicationMallocFailedHook .text.vApplicationStackOverflowHook - 0x0000000008007cf8 0x28 bin/freeRTOSdebug.o - 0x0000000008007cf8 vApplicationStackOverflowHook + 0x00000000080083d0 0x34 bin/freeRTOSdebug.o + 0x00000000080083d0 vApplicationStackOverflowHook + .text.buzzerInit + 0x0000000008008404 0x2 bin/buzzer.o + 0x0000000008008404 buzzerInit + .text.buzzerTest + 0x0000000008008406 0x4 bin/buzzer.o + 0x0000000008008406 buzzerTest + *fill* 0x000000000800840a 0x2 + .text.buzzerOff + 0x000000000800840c 0x10 bin/buzzer.o + 0x000000000800840c buzzerOff + .text.buzzerOn + 0x000000000800841c 0x10 bin/buzzer.o + 0x000000000800841c buzzerOn + .text.buzzerSetControl + 0x000000000800842c 0xc bin/buzzer.o + 0x000000000800842c buzzerSetControl .text.systemLaunch - 0x0000000008007d20 0x28 bin/system.o - 0x0000000008007d20 systemLaunch + 0x0000000008008438 0x28 bin/system.o + 0x0000000008008438 systemLaunch .text.systemInit - 0x0000000008007d48 0xd8 bin/system.o - 0x0000000008007d48 systemInit + 0x0000000008008460 0xdc bin/system.o + 0x0000000008008460 systemInit .text.systemTest - 0x0000000008007e20 0x20 bin/system.o - 0x0000000008007e20 systemTest + 0x000000000800853c 0x28 bin/system.o + 0x000000000800853c systemTest .text.systemStart - 0x0000000008007e40 0x14 bin/system.o - 0x0000000008007e40 systemStart + 0x0000000008008564 0x1c bin/system.o + 0x0000000008008564 systemStart .text.systemTask - 0x0000000008007e54 0xf0 bin/system.o + 0x0000000008008580 0x104 bin/system.o .text.systemWaitStart - 0x0000000008007f44 0x38 bin/system.o - 0x0000000008007f44 systemWaitStart + 0x0000000008008684 0x38 bin/system.o + 0x0000000008008684 systemWaitStart .text.systemSetCanFly - 0x0000000008007f7c 0xc bin/system.o - 0x0000000008007f7c systemSetCanFly + 0x00000000080086bc 0xc bin/system.o + 0x00000000080086bc systemSetCanFly .text.vApplicationIdleHook - 0x0000000008007f88 0x28 bin/system.o - 0x0000000008007f88 vApplicationIdleHook + 0x00000000080086c8 0x20 bin/system.o + 0x00000000080086c8 vApplicationIdleHook .text.commInit - 0x0000000008007fb0 0x34 bin/comm.o - 0x0000000008007fb0 commInit + 0x00000000080086e8 0x34 bin/comm.o + 0x00000000080086e8 commInit .text.commTest - 0x0000000008007fe4 0x34 bin/comm.o - 0x0000000008007fe4 commTest + 0x000000000800871c 0x34 bin/comm.o + 0x000000000800871c commTest .text.consoleSendMessage - 0x0000000008008018 0x1c bin/console.o + 0x0000000008008750 0x1c bin/console.o .text.consoleInit - 0x0000000008008034 0x3c bin/console.o - 0x0000000008008034 consoleInit + 0x000000000800876c 0x3c bin/console.o + 0x000000000800876c consoleInit .text.consoleTest - 0x0000000008008070 0xc bin/console.o - 0x0000000008008070 consoleTest + 0x00000000080087a8 0xc bin/console.o + 0x00000000080087a8 consoleTest .text.consolePutchar - 0x000000000800807c 0x84 bin/console.o - 0x000000000800807c consolePutchar - .text.pidInit 0x0000000008008100 0x30 bin/pid.o - 0x0000000008008100 pidInit + 0x00000000080087b4 0x84 bin/console.o + 0x00000000080087b4 consolePutchar + .text.pidInit 0x0000000008008838 0x30 bin/pid.o + 0x0000000008008838 pidInit .text.pidUpdate - 0x0000000008008130 0x88 bin/pid.o - 0x0000000008008130 pidUpdate + 0x0000000008008868 0x88 bin/pid.o + 0x0000000008008868 pidUpdate .text.pidSetIntegralLimit - 0x00000000080081b8 0x6 bin/pid.o - 0x00000000080081b8 pidSetIntegralLimit + 0x00000000080088f0 0x6 bin/pid.o + 0x00000000080088f0 pidSetIntegralLimit .text.pidReset - 0x00000000080081be 0xc bin/pid.o - 0x00000000080081be pidReset + 0x00000000080088f6 0xc bin/pid.o + 0x00000000080088f6 pidReset .text.pidSetError - 0x00000000080081ca 0x6 bin/pid.o - 0x00000000080081ca pidSetError + 0x0000000008008902 0x6 bin/pid.o + 0x0000000008008902 pidSetError .text.pidSetDesired - 0x00000000080081d0 0x6 bin/pid.o - 0x00000000080081d0 pidSetDesired - *fill* 0x00000000080081d6 0x2 + 0x0000000008008908 0x6 bin/pid.o + 0x0000000008008908 pidSetDesired + *fill* 0x000000000800890e 0x2 .text.crtpserviceHandler - 0x00000000080081d8 0x38 bin/crtpservice.o - 0x00000000080081d8 crtpserviceHandler + 0x0000000008008910 0x38 bin/crtpservice.o + 0x0000000008008910 crtpserviceHandler .text.crtpserviceInit - 0x0000000008008210 0x20 bin/crtpservice.o - 0x0000000008008210 crtpserviceInit + 0x0000000008008948 0x20 bin/crtpservice.o + 0x0000000008008948 crtpserviceInit .text.crtpserviceTest - 0x0000000008008230 0xc bin/crtpservice.o - 0x0000000008008230 crtpserviceTest + 0x0000000008008968 0xc bin/crtpservice.o + 0x0000000008008968 crtpserviceTest .text.variableGetIndex - 0x000000000800823c 0x38 bin/param.o + 0x0000000008008974 0x38 bin/param.o .text.paramInit - 0x0000000008008274 0x8c bin/param.o - 0x0000000008008274 paramInit + 0x00000000080089ac 0x8c bin/param.o + 0x00000000080089ac paramInit .text.paramTest - 0x0000000008008300 0xc bin/param.o - 0x0000000008008300 paramTest + 0x0000000008008a38 0xc bin/param.o + 0x0000000008008a38 paramTest .text.paramTOCProcess - 0x000000000800830c 0xf0 bin/param.o - 0x000000000800830c paramTOCProcess + 0x0000000008008a44 0xf0 bin/param.o + 0x0000000008008a44 paramTOCProcess .text.paramTask - 0x00000000080083fc 0x224 bin/param.o - .text.memTask 0x0000000008008620 0x160 bin/mem.o - .text.memInit 0x0000000008008780 0x44 bin/mem.o - 0x0000000008008780 memInit - .text.memTest 0x00000000080087c4 0xc bin/mem.o - 0x00000000080087c4 memTest + 0x0000000008008b34 0x224 bin/param.o + .text.memTask 0x0000000008008d58 0x1a4 bin/mem.o + .text.memInit 0x0000000008008efc 0x44 bin/mem.o + 0x0000000008008efc memInit + .text.memTest 0x0000000008008f40 0xc bin/mem.o + 0x0000000008008f40 memTest .text.commanderCrtpCB - 0x00000000080087d0 0x54 bin/commander.o + 0x0000000008008f4c 0x54 bin/commander.o .text.commanderInit - 0x0000000008008824 0x40 bin/commander.o - 0x0000000008008824 commanderInit + 0x0000000008008fa0 0x40 bin/commander.o + 0x0000000008008fa0 commanderInit .text.commanderTest - 0x0000000008008864 0x10 bin/commander.o - 0x0000000008008864 commanderTest + 0x0000000008008fe0 0x10 bin/commander.o + 0x0000000008008fe0 commanderTest .text.commanderWatchdog - 0x0000000008008874 0x60 bin/commander.o - 0x0000000008008874 commanderWatchdog + 0x0000000008008ff0 0x60 bin/commander.o + 0x0000000008008ff0 commanderWatchdog .text.commanderGetInactivityTime - 0x00000000080088d4 0x14 bin/commander.o - 0x00000000080088d4 commanderGetInactivityTime + 0x0000000008009050 0x14 bin/commander.o + 0x0000000008009050 commanderGetInactivityTime .text.commanderGetRPY - 0x00000000080088e8 0x24 bin/commander.o - 0x00000000080088e8 commanderGetRPY + 0x0000000008009064 0x24 bin/commander.o + 0x0000000008009064 commanderGetRPY .text.commanderGetAltHold - 0x000000000800890c 0x6c bin/commander.o - 0x000000000800890c commanderGetAltHold + 0x0000000008009088 0x6c bin/commander.o + 0x0000000008009088 commanderGetAltHold .text.commanderGetRPYType - 0x0000000008008978 0x20 bin/commander.o - 0x0000000008008978 commanderGetRPYType + 0x00000000080090f4 0x20 bin/commander.o + 0x00000000080090f4 commanderGetRPYType .text.commanderGetThrust - 0x0000000008008998 0x3c bin/commander.o - 0x0000000008008998 commanderGetThrust + 0x0000000008009114 0x3c bin/commander.o + 0x0000000008009114 commanderGetThrust .text.commanderGetYawMode - 0x00000000080089d4 0xc bin/commander.o - 0x00000000080089d4 commanderGetYawMode + 0x0000000008009150 0xc bin/commander.o + 0x0000000008009150 commanderGetYawMode .text.commanderGetYawModeCarefreeResetFront - 0x00000000080089e0 0xc bin/commander.o - 0x00000000080089e0 commanderGetYawModeCarefreeResetFront + 0x000000000800915c 0xc bin/commander.o + 0x000000000800915c commanderGetYawModeCarefreeResetFront .text.controllerInit - 0x00000000080089ec 0x120 bin/controller.o - 0x00000000080089ec controllerInit + 0x0000000008009168 0x124 bin/controller.o + 0x0000000008009168 controllerInit .text.controllerTest - 0x0000000008008b0c 0xc bin/controller.o - 0x0000000008008b0c controllerTest + 0x000000000800928c 0xc bin/controller.o + 0x000000000800928c controllerTest .text.controllerCorrectRatePID - 0x0000000008008b18 0x128 bin/controller.o - 0x0000000008008b18 controllerCorrectRatePID + 0x0000000008009298 0x128 bin/controller.o + 0x0000000008009298 controllerCorrectRatePID .text.controllerCorrectAttitudePID - 0x0000000008008c40 0xbc bin/controller.o - 0x0000000008008c40 controllerCorrectAttitudePID + 0x00000000080093c0 0xbc bin/controller.o + 0x00000000080093c0 controllerCorrectAttitudePID .text.controllerResetAllPID - 0x0000000008008cfc 0x44 bin/controller.o - 0x0000000008008cfc controllerResetAllPID + 0x000000000800947c 0x44 bin/controller.o + 0x000000000800947c controllerResetAllPID .text.controllerGetActuatorOutput - 0x0000000008008d40 0x20 bin/controller.o - 0x0000000008008d40 controllerGetActuatorOutput + 0x00000000080094c0 0x20 bin/controller.o + 0x00000000080094c0 controllerGetActuatorOutput .text.sensfusion6Init - 0x0000000008008d60 0x10 bin/sensfusion6.o - 0x0000000008008d60 sensfusion6Init + 0x00000000080094e0 0x10 bin/sensfusion6.o + 0x00000000080094e0 sensfusion6Init .text.sensfusion6Test - 0x0000000008008d70 0xc bin/sensfusion6.o - 0x0000000008008d70 sensfusion6Test + 0x00000000080094f0 0xc bin/sensfusion6.o + 0x00000000080094f0 sensfusion6Test .text.sensfusion6UpdateQ - 0x0000000008008d7c 0x234 bin/sensfusion6.o - 0x0000000008008d7c sensfusion6UpdateQ + 0x00000000080094fc 0x234 bin/sensfusion6.o + 0x00000000080094fc sensfusion6UpdateQ .text.sensfusion6GetEulerRPY - 0x0000000008008fb0 0xf8 bin/sensfusion6.o - 0x0000000008008fb0 sensfusion6GetEulerRPY + 0x0000000008009730 0xf8 bin/sensfusion6.o + 0x0000000008009730 sensfusion6GetEulerRPY .text.sensfusion6GetAccZWithoutGravity - 0x00000000080090a8 0x6c bin/sensfusion6.o - 0x00000000080090a8 sensfusion6GetAccZWithoutGravity + 0x0000000008009828 0x6c bin/sensfusion6.o + 0x0000000008009828 sensfusion6GetAccZWithoutGravity .text.deadband - 0x0000000008009114 0x30 bin/stabilizer.o + 0x0000000008009894 0x30 bin/stabilizer.o .text.distributePower - 0x0000000008009144 0x98 bin/stabilizer.o + 0x00000000080098c4 0x98 bin/stabilizer.o .text.stabilizerTask - 0x00000000080091dc 0x5b8 bin/stabilizer.o + 0x000000000800995c 0x640 bin/stabilizer.o .text.stabilizerInit - 0x0000000008009794 0x68 bin/stabilizer.o - 0x0000000008009794 stabilizerInit + 0x0000000008009f9c 0x68 bin/stabilizer.o + 0x0000000008009f9c stabilizerInit .text.stabilizerTest - 0x00000000080097fc 0x1e bin/stabilizer.o - 0x00000000080097fc stabilizerTest - *fill* 0x000000000800981a 0x2 + 0x000000000800a004 0x1e bin/stabilizer.o + 0x000000000800a004 stabilizerTest + *fill* 0x000000000800a022 0x2 .text.logDeleteBlock - 0x000000000800981c 0x70 bin/log.o + 0x000000000800a024 0x70 bin/log.o .text.logStopBlock - 0x000000000800988c 0x3c bin/log.o + 0x000000000800a094 0x3c bin/log.o .text.logReset - 0x00000000080098c8 0x58 bin/log.o + 0x000000000800a0d0 0x58 bin/log.o .text.logBlockTimed - 0x0000000008009920 0x18 bin/log.o - 0x0000000008009920 logBlockTimed + 0x000000000800a128 0x18 bin/log.o + 0x000000000800a128 logBlockTimed .text.logAppendBlock.constprop.5 - 0x0000000008009938 0x128 bin/log.o - .text.logTask 0x0000000008009a60 0x268 bin/log.o + 0x000000000800a140 0x128 bin/log.o + .text.logTask 0x000000000800a268 0x268 bin/log.o .text.logRunBlock - 0x0000000008009cc8 0x14c bin/log.o - 0x0000000008009cc8 logRunBlock - .text.logInit 0x0000000008009e14 0xb4 bin/log.o - 0x0000000008009e14 logInit + 0x000000000800a4d0 0x14c bin/log.o + 0x000000000800a4d0 logRunBlock + .text.logInit 0x000000000800a61c 0xb4 bin/log.o + 0x000000000800a61c logInit .text.logGetVarId - 0x0000000008009ec8 0x58 bin/log.o - 0x0000000008009ec8 logGetVarId + 0x000000000800a6d0 0x58 bin/log.o + 0x000000000800a6d0 logGetVarId .text.logGetInt - 0x0000000008009f20 0x74 bin/log.o - 0x0000000008009f20 logGetInt + 0x000000000800a728 0x74 bin/log.o + 0x000000000800a728 logGetInt .text.logGetFloat - 0x0000000008009f94 0x48 bin/log.o - 0x0000000008009f94 logGetFloat + 0x000000000800a79c 0x48 bin/log.o + 0x000000000800a79c logGetFloat .text.workerInit - 0x0000000008009fdc 0x18 bin/worker.o - 0x0000000008009fdc workerInit + 0x000000000800a7e4 0x18 bin/worker.o + 0x000000000800a7e4 workerInit .text.workerTest - 0x0000000008009ff4 0x10 bin/worker.o - 0x0000000008009ff4 workerTest + 0x000000000800a7fc 0x10 bin/worker.o + 0x000000000800a7fc workerTest .text.workerLoop - 0x000000000800a004 0x2c bin/worker.o - 0x000000000800a004 workerLoop + 0x000000000800a80c 0x2c bin/worker.o + 0x000000000800a80c workerLoop .text.workerSchedule - 0x000000000800a030 0x2c bin/worker.o - 0x000000000800a030 workerSchedule + 0x000000000800a838 0x2c bin/worker.o + 0x000000000800a838 workerSchedule .text.iirLPFilterSingle - 0x000000000800a05c 0x2c bin/filter.o - 0x000000000800a05c iirLPFilterSingle + 0x000000000800a864 0x2c bin/filter.o + 0x000000000800a864 iirLPFilterSingle .text.assertFail - 0x000000000800a088 0x18 bin/cfassert.o - 0x000000000800a088 assertFail + 0x000000000800a890 0x40 bin/cfassert.o + 0x000000000800a890 assertFail + .text.printAssertSnapshotData + 0x000000000800a8d0 0x30 bin/cfassert.o + 0x000000000800a8d0 printAssertSnapshotData .text.get_int_len - 0x000000000800a0a0 0x14 bin/eprintf.o - 0x000000000800a0a0 get_int_len - .text.itoa 0x000000000800a0b4 0xb8 bin/eprintf.o + 0x000000000800a900 0x14 bin/eprintf.o + 0x000000000800a900 get_int_len + .text.itoa 0x000000000800a914 0xb8 bin/eprintf.o .text.evprintf - 0x000000000800a16c 0x140 bin/eprintf.o - 0x000000000800a16c evprintf - .text.eprintf 0x000000000800a2ac 0x1a bin/eprintf.o - 0x000000000800a2ac eprintf - *fill* 0x000000000800a2c6 0x2 - .text.crcSlow 0x000000000800a2c8 0x6c bin/crc.o - 0x000000000800a2c8 crcSlow + 0x000000000800a9cc 0x140 bin/eprintf.o + 0x000000000800a9cc evprintf + .text.eprintf 0x000000000800ab0c 0x1a bin/eprintf.o + 0x000000000800ab0c eprintf + *fill* 0x000000000800ab26 0x2 + .text.crcSlow 0x000000000800ab28 0x6c bin/crc.o + 0x000000000800ab28 crcSlow .text.single2half - 0x000000000800a334 0x54 bin/fp16.o - 0x000000000800a334 single2half + 0x000000000800ab94 0x54 bin/fp16.o + 0x000000000800ab94 single2half .text.Reset_Handler - 0x000000000800a388 0x44 bin/startup_stm32f40xx.o - 0x000000000800a388 Reset_Handler + 0x000000000800abe8 0x44 bin/startup_stm32f40xx.o + 0x000000000800abe8 Reset_Handler .text.Default_Handler - 0x000000000800a3cc 0x2 bin/startup_stm32f40xx.o - 0x000000000800a3cc DMA2_Stream6_IRQHandler - 0x000000000800a3cc HASH_RNG_IRQHandler - 0x000000000800a3cc EXTI2_IRQHandler - 0x000000000800a3cc TIM8_CC_IRQHandler - 0x000000000800a3cc TIM1_CC_IRQHandler - 0x000000000800a3cc DMA2_Stream5_IRQHandler - 0x000000000800a3cc PVD_IRQHandler - 0x000000000800a3cc SDIO_IRQHandler - 0x000000000800a3cc TAMP_STAMP_IRQHandler - 0x000000000800a3cc CAN2_RX1_IRQHandler - 0x000000000800a3cc EXTI3_IRQHandler - 0x000000000800a3cc TIM8_TRG_COM_TIM14_IRQHandler - 0x000000000800a3cc TIM1_UP_TIM10_IRQHandler - 0x000000000800a3cc TIM8_UP_TIM13_IRQHandler - 0x000000000800a3cc EXTI0_IRQHandler - 0x000000000800a3cc CAN1_RX0_IRQHandler - 0x000000000800a3cc FPU_IRQHandler - 0x000000000800a3cc OTG_HS_WKUP_IRQHandler - 0x000000000800a3cc CAN2_SCE_IRQHandler - 0x000000000800a3cc DMA2_Stream2_IRQHandler - 0x000000000800a3cc SPI1_IRQHandler - 0x000000000800a3cc TIM6_DAC_IRQHandler - 0x000000000800a3cc TIM1_BRK_TIM9_IRQHandler - 0x000000000800a3cc DCMI_IRQHandler - 0x000000000800a3cc CAN2_RX0_IRQHandler - 0x000000000800a3cc DMA2_Stream3_IRQHandler - 0x000000000800a3cc USART3_IRQHandler - 0x000000000800a3cc CRYP_IRQHandler - 0x000000000800a3cc CAN1_RX1_IRQHandler - 0x000000000800a3cc UART5_IRQHandler - 0x000000000800a3cc DMA2_Stream0_IRQHandler - 0x000000000800a3cc TIM4_IRQHandler - 0x000000000800a3cc DMA1_Stream1_IRQHandler - 0x000000000800a3cc TIM3_IRQHandler - 0x000000000800a3cc RCC_IRQHandler - 0x000000000800a3cc TIM8_BRK_TIM12_IRQHandler - 0x000000000800a3cc Default_Handler - 0x000000000800a3cc ADC_IRQHandler - 0x000000000800a3cc TIM7_IRQHandler - 0x000000000800a3cc CAN2_TX_IRQHandler - 0x000000000800a3cc TIM5_IRQHandler - 0x000000000800a3cc EXTI9_5_IRQHandler - 0x000000000800a3cc RTC_WKUP_IRQHandler - 0x000000000800a3cc ETH_WKUP_IRQHandler - 0x000000000800a3cc SPI2_IRQHandler - 0x000000000800a3cc OTG_HS_EP1_IN_IRQHandler - 0x000000000800a3cc CAN1_TX_IRQHandler - 0x000000000800a3cc FSMC_IRQHandler - 0x000000000800a3cc ETH_IRQHandler - 0x000000000800a3cc OTG_HS_EP1_OUT_IRQHandler - 0x000000000800a3cc WWDG_IRQHandler - 0x000000000800a3cc TIM2_IRQHandler - 0x000000000800a3cc OTG_FS_WKUP_IRQHandler - 0x000000000800a3cc TIM1_TRG_COM_TIM11_IRQHandler - 0x000000000800a3cc OTG_HS_IRQHandler - 0x000000000800a3cc EXTI1_IRQHandler - 0x000000000800a3cc DMA2_Stream1_IRQHandler - 0x000000000800a3cc CAN1_SCE_IRQHandler - 0x000000000800a3cc FLASH_IRQHandler - 0x000000000800a3cc DMA2_Stream4_IRQHandler - 0x000000000800a3cc USART1_IRQHandler - 0x000000000800a3cc SPI3_IRQHandler - 0x000000000800a3cc RTC_Alarm_IRQHandler - *fill* 0x000000000800a3ce 0x2 + 0x000000000800ac2c 0x2 bin/startup_stm32f40xx.o + 0x000000000800ac2c DMA2_Stream6_IRQHandler + 0x000000000800ac2c HASH_RNG_IRQHandler + 0x000000000800ac2c EXTI2_IRQHandler + 0x000000000800ac2c TIM8_CC_IRQHandler + 0x000000000800ac2c TIM1_CC_IRQHandler + 0x000000000800ac2c DMA2_Stream5_IRQHandler + 0x000000000800ac2c PVD_IRQHandler + 0x000000000800ac2c SDIO_IRQHandler + 0x000000000800ac2c TAMP_STAMP_IRQHandler + 0x000000000800ac2c CAN2_RX1_IRQHandler + 0x000000000800ac2c EXTI3_IRQHandler + 0x000000000800ac2c TIM8_TRG_COM_TIM14_IRQHandler + 0x000000000800ac2c TIM1_UP_TIM10_IRQHandler + 0x000000000800ac2c TIM8_UP_TIM13_IRQHandler + 0x000000000800ac2c EXTI0_IRQHandler + 0x000000000800ac2c CAN1_RX0_IRQHandler + 0x000000000800ac2c FPU_IRQHandler + 0x000000000800ac2c OTG_HS_WKUP_IRQHandler + 0x000000000800ac2c CAN2_SCE_IRQHandler + 0x000000000800ac2c DMA2_Stream2_IRQHandler + 0x000000000800ac2c SPI1_IRQHandler + 0x000000000800ac2c TIM6_DAC_IRQHandler + 0x000000000800ac2c TIM1_BRK_TIM9_IRQHandler + 0x000000000800ac2c DCMI_IRQHandler + 0x000000000800ac2c CAN2_RX0_IRQHandler + 0x000000000800ac2c DMA2_Stream3_IRQHandler + 0x000000000800ac2c USART3_IRQHandler + 0x000000000800ac2c CRYP_IRQHandler + 0x000000000800ac2c CAN1_RX1_IRQHandler + 0x000000000800ac2c UART5_IRQHandler + 0x000000000800ac2c DMA2_Stream0_IRQHandler + 0x000000000800ac2c TIM4_IRQHandler + 0x000000000800ac2c DMA1_Stream1_IRQHandler + 0x000000000800ac2c TIM3_IRQHandler + 0x000000000800ac2c RCC_IRQHandler + 0x000000000800ac2c TIM8_BRK_TIM12_IRQHandler + 0x000000000800ac2c Default_Handler + 0x000000000800ac2c ADC_IRQHandler + 0x000000000800ac2c TIM7_IRQHandler + 0x000000000800ac2c CAN2_TX_IRQHandler + 0x000000000800ac2c TIM5_IRQHandler + 0x000000000800ac2c EXTI9_5_IRQHandler + 0x000000000800ac2c RTC_WKUP_IRQHandler + 0x000000000800ac2c ETH_WKUP_IRQHandler + 0x000000000800ac2c SPI2_IRQHandler + 0x000000000800ac2c OTG_HS_EP1_IN_IRQHandler + 0x000000000800ac2c CAN1_TX_IRQHandler + 0x000000000800ac2c FSMC_IRQHandler + 0x000000000800ac2c ETH_IRQHandler + 0x000000000800ac2c OTG_HS_EP1_OUT_IRQHandler + 0x000000000800ac2c WWDG_IRQHandler + 0x000000000800ac2c TIM2_IRQHandler + 0x000000000800ac2c OTG_FS_WKUP_IRQHandler + 0x000000000800ac2c TIM1_TRG_COM_TIM11_IRQHandler + 0x000000000800ac2c OTG_HS_IRQHandler + 0x000000000800ac2c EXTI1_IRQHandler + 0x000000000800ac2c DMA2_Stream1_IRQHandler + 0x000000000800ac2c CAN1_SCE_IRQHandler + 0x000000000800ac2c FLASH_IRQHandler + 0x000000000800ac2c DMA2_Stream4_IRQHandler + 0x000000000800ac2c USART1_IRQHandler + 0x000000000800ac2c SPI3_IRQHandler + 0x000000000800ac2c RTC_Alarm_IRQHandler + *fill* 0x000000000800ac2e 0x2 .text.SystemInit - 0x000000000800a3d0 0xf0 bin/system_stm32f4xx.o - 0x000000000800a3d0 SystemInit + 0x000000000800ac30 0xf0 bin/system_stm32f4xx.o + 0x000000000800ac30 SystemInit .text.CPAL_HAL_NVICInit - 0x000000000800a4c0 0x8 bin/cpal_hal.o - 0x000000000800a4c0 CPAL_HAL_NVICInit + 0x000000000800ad20 0x8 bin/cpal_hal.o + 0x000000000800ad20 CPAL_HAL_NVICInit .text.CPAL_I2C_Timeout - 0x000000000800a4c8 0x12 bin/cpal_i2c.o - *fill* 0x000000000800a4da 0x2 + 0x000000000800ad28 0x12 bin/cpal_i2c.o + *fill* 0x000000000800ad3a 0x2 .text.CPAL_I2C_Init - 0x000000000800a4dc 0x104 bin/cpal_i2c.o - 0x000000000800a4dc CPAL_I2C_Init + 0x000000000800ad3c 0x104 bin/cpal_i2c.o + 0x000000000800ad3c CPAL_I2C_Init .text.CPAL_I2C_StructInit - 0x000000000800a5e0 0x48 bin/cpal_i2c.o - 0x000000000800a5e0 CPAL_I2C_StructInit + 0x000000000800ae40 0x48 bin/cpal_i2c.o + 0x000000000800ae40 CPAL_I2C_StructInit .text.CPAL_I2C_ER_IRQHandler - 0x000000000800a628 0x110 bin/cpal_i2c.o - 0x000000000800a628 CPAL_I2C_ER_IRQHandler + 0x000000000800ae88 0x110 bin/cpal_i2c.o + 0x000000000800ae88 CPAL_I2C_ER_IRQHandler .text.CPAL_I2C_DMA_TX_IRQHandler - 0x000000000800a738 0x180 bin/cpal_i2c.o - 0x000000000800a738 CPAL_I2C_DMA_TX_IRQHandler + 0x000000000800af98 0x180 bin/cpal_i2c.o + 0x000000000800af98 CPAL_I2C_DMA_TX_IRQHandler .text.CPAL_I2C_DMA_RX_IRQHandler - 0x000000000800a8b8 0x168 bin/cpal_i2c.o - 0x000000000800a8b8 CPAL_I2C_DMA_RX_IRQHandler - .text.tickI2C 0x000000000800aa20 0x48 bin/cpal_i2c.o - 0x000000000800aa20 tickI2C + 0x000000000800b118 0x168 bin/cpal_i2c.o + 0x000000000800b118 CPAL_I2C_DMA_RX_IRQHandler + .text.tickI2C 0x000000000800b280 0x48 bin/cpal_i2c.o + 0x000000000800b280 tickI2C .text.CPAL_I2C_Enable_DMA_IT - 0x000000000800aa68 0xc8 bin/cpal_i2c.o - 0x000000000800aa68 CPAL_I2C_Enable_DMA_IT + 0x000000000800b2c8 0xc8 bin/cpal_i2c.o + 0x000000000800b2c8 CPAL_I2C_Enable_DMA_IT .text.CPAL_I2C_Write - 0x000000000800ab30 0xac bin/cpal_i2c.o - 0x000000000800ab30 CPAL_I2C_Write + 0x000000000800b390 0xac bin/cpal_i2c.o + 0x000000000800b390 CPAL_I2C_Write .text.CPAL_I2C_Read - 0x000000000800abdc 0x244 bin/cpal_i2c.o - 0x000000000800abdc CPAL_I2C_Read + 0x000000000800b43c 0x244 bin/cpal_i2c.o + 0x000000000800b43c CPAL_I2C_Read .text.CPAL_I2C_EV_IRQHandler - 0x000000000800ae20 0x4fc bin/cpal_i2c.o - 0x000000000800ae20 CPAL_I2C_EV_IRQHandler - .text.CPAL_TIMEOUT_UserCallback - 0x000000000800b31c 0x4 bin/cpal_usercallback_template.o - 0x000000000800b31c CPAL_TIMEOUT_UserCallback + 0x000000000800b680 0x4fc bin/cpal_i2c.o + 0x000000000800b680 CPAL_I2C_EV_IRQHandler .text.CPAL_I2C_HAL_CLKInit - 0x000000000800b320 0x28 bin/cpal_i2c_hal_stm32f4xx.o - 0x000000000800b320 CPAL_I2C_HAL_CLKInit + 0x000000000800bb7c 0x28 bin/cpal_i2c_hal_stm32f4xx.o + 0x000000000800bb7c CPAL_I2C_HAL_CLKInit .text.CPAL_I2C_HAL_CLKDeInit - 0x000000000800b348 0x28 bin/cpal_i2c_hal_stm32f4xx.o - 0x000000000800b348 CPAL_I2C_HAL_CLKDeInit + 0x000000000800bba4 0x28 bin/cpal_i2c_hal_stm32f4xx.o + 0x000000000800bba4 CPAL_I2C_HAL_CLKDeInit .text.CPAL_I2C_HAL_GPIOInit - 0x000000000800b370 0xc0 bin/cpal_i2c_hal_stm32f4xx.o - 0x000000000800b370 CPAL_I2C_HAL_GPIOInit + 0x000000000800bbcc 0xc0 bin/cpal_i2c_hal_stm32f4xx.o + 0x000000000800bbcc CPAL_I2C_HAL_GPIOInit .text.CPAL_I2C_HAL_GPIODeInit - 0x000000000800b430 0x50 bin/cpal_i2c_hal_stm32f4xx.o - 0x000000000800b430 CPAL_I2C_HAL_GPIODeInit + 0x000000000800bc8c 0x50 bin/cpal_i2c_hal_stm32f4xx.o + 0x000000000800bc8c CPAL_I2C_HAL_GPIODeInit .text.CPAL_I2C_HAL_DMAInit - 0x000000000800b480 0x90 bin/cpal_i2c_hal_stm32f4xx.o - 0x000000000800b480 CPAL_I2C_HAL_DMAInit + 0x000000000800bcdc 0x90 bin/cpal_i2c_hal_stm32f4xx.o + 0x000000000800bcdc CPAL_I2C_HAL_DMAInit .text.CPAL_I2C_HAL_DMATXConfig - 0x000000000800b510 0x4c bin/cpal_i2c_hal_stm32f4xx.o - 0x000000000800b510 CPAL_I2C_HAL_DMATXConfig + 0x000000000800bd6c 0x4c bin/cpal_i2c_hal_stm32f4xx.o + 0x000000000800bd6c CPAL_I2C_HAL_DMATXConfig .text.CPAL_I2C_HAL_DMARXConfig - 0x000000000800b55c 0x4c bin/cpal_i2c_hal_stm32f4xx.o - 0x000000000800b55c CPAL_I2C_HAL_DMARXConfig + 0x000000000800bdb8 0x4c bin/cpal_i2c_hal_stm32f4xx.o + 0x000000000800bdb8 CPAL_I2C_HAL_DMARXConfig .text.CPAL_I2C_HAL_DMADeInit - 0x000000000800b5a8 0x30 bin/cpal_i2c_hal_stm32f4xx.o - 0x000000000800b5a8 CPAL_I2C_HAL_DMADeInit + 0x000000000800be04 0x30 bin/cpal_i2c_hal_stm32f4xx.o + 0x000000000800be04 CPAL_I2C_HAL_DMADeInit .text.CPAL_I2C_HAL_ITInit - 0x000000000800b5d8 0x140 bin/cpal_i2c_hal_stm32f4xx.o - 0x000000000800b5d8 CPAL_I2C_HAL_ITInit + 0x000000000800be34 0x140 bin/cpal_i2c_hal_stm32f4xx.o + 0x000000000800be34 CPAL_I2C_HAL_ITInit .text.I2C1_EV_IRQHandler - 0x000000000800b718 0xc bin/cpal_i2c_hal_stm32f4xx.o - 0x000000000800b718 I2C1_EV_IRQHandler + 0x000000000800bf74 0xc bin/cpal_i2c_hal_stm32f4xx.o + 0x000000000800bf74 I2C1_EV_IRQHandler .text.I2C1_ER_IRQHandler - 0x000000000800b724 0x10 bin/cpal_i2c_hal_stm32f4xx.o - 0x000000000800b724 I2C1_ER_IRQHandler + 0x000000000800bf80 0x10 bin/cpal_i2c_hal_stm32f4xx.o + 0x000000000800bf80 I2C1_ER_IRQHandler .text.DMA1_Stream6_IRQHandler - 0x000000000800b734 0xc bin/cpal_i2c_hal_stm32f4xx.o - 0x000000000800b734 DMA1_Stream6_IRQHandler + 0x000000000800bf90 0xc bin/cpal_i2c_hal_stm32f4xx.o + 0x000000000800bf90 DMA1_Stream6_IRQHandler .text.DMA1_Stream0_IRQHandler - 0x000000000800b740 0xc bin/cpal_i2c_hal_stm32f4xx.o - 0x000000000800b740 DMA1_Stream0_IRQHandler + 0x000000000800bf9c 0xc bin/cpal_i2c_hal_stm32f4xx.o + 0x000000000800bf9c DMA1_Stream0_IRQHandler .text.I2C2_EV_IRQHandler - 0x000000000800b74c 0xc bin/cpal_i2c_hal_stm32f4xx.o - 0x000000000800b74c I2C2_EV_IRQHandler + 0x000000000800bfa8 0xc bin/cpal_i2c_hal_stm32f4xx.o + 0x000000000800bfa8 I2C2_EV_IRQHandler .text.I2C2_ER_IRQHandler - 0x000000000800b758 0x10 bin/cpal_i2c_hal_stm32f4xx.o - 0x000000000800b758 I2C2_ER_IRQHandler + 0x000000000800bfb4 0x10 bin/cpal_i2c_hal_stm32f4xx.o + 0x000000000800bfb4 I2C2_ER_IRQHandler .text.DMA1_Stream7_IRQHandler - 0x000000000800b768 0xc bin/cpal_i2c_hal_stm32f4xx.o - 0x000000000800b768 DMA1_Stream7_IRQHandler + 0x000000000800bfc4 0xc bin/cpal_i2c_hal_stm32f4xx.o + 0x000000000800bfc4 DMA1_Stream7_IRQHandler .text.DMA1_Stream3_IRQHandler - 0x000000000800b774 0xc bin/cpal_i2c_hal_stm32f4xx.o - 0x000000000800b774 DMA1_Stream3_IRQHandler + 0x000000000800bfd0 0xc bin/cpal_i2c_hal_stm32f4xx.o + 0x000000000800bfd0 DMA1_Stream3_IRQHandler .text.I2C3_EV_IRQHandler - 0x000000000800b780 0xc bin/cpal_i2c_hal_stm32f4xx.o - 0x000000000800b780 I2C3_EV_IRQHandler + 0x000000000800bfdc 0xc bin/cpal_i2c_hal_stm32f4xx.o + 0x000000000800bfdc I2C3_EV_IRQHandler .text.I2C3_ER_IRQHandler - 0x000000000800b78c 0x10 bin/cpal_i2c_hal_stm32f4xx.o - 0x000000000800b78c I2C3_ER_IRQHandler + 0x000000000800bfe8 0x10 bin/cpal_i2c_hal_stm32f4xx.o + 0x000000000800bfe8 I2C3_ER_IRQHandler .text.DMA1_Stream4_IRQHandler - 0x000000000800b79c 0xc bin/cpal_i2c_hal_stm32f4xx.o - 0x000000000800b79c DMA1_Stream4_IRQHandler + 0x000000000800bff8 0xc bin/cpal_i2c_hal_stm32f4xx.o + 0x000000000800bff8 DMA1_Stream4_IRQHandler .text.DMA1_Stream2_IRQHandler - 0x000000000800b7a8 0xc bin/cpal_i2c_hal_stm32f4xx.o - 0x000000000800b7a8 DMA1_Stream2_IRQHandler + 0x000000000800c004 0xc bin/cpal_i2c_hal_stm32f4xx.o + 0x000000000800c004 DMA1_Stream2_IRQHandler .text.USB_OTG_CoreReset.isra.1 - 0x000000000800b7b4 0x50 bin/usb_core.o + 0x000000000800c010 0x50 bin/usb_core.o .text.USB_OTG_WritePacket - 0x000000000800b804 0x26 bin/usb_core.o - 0x000000000800b804 USB_OTG_WritePacket + 0x000000000800c060 0x26 bin/usb_core.o + 0x000000000800c060 USB_OTG_WritePacket .text.USB_OTG_ReadPacket - 0x000000000800b82a 0x20 bin/usb_core.o - 0x000000000800b82a USB_OTG_ReadPacket - *fill* 0x000000000800b84a 0x2 + 0x000000000800c086 0x20 bin/usb_core.o + 0x000000000800c086 USB_OTG_ReadPacket + *fill* 0x000000000800c0a6 0x2 .text.USB_OTG_SelectCore - 0x000000000800b84c 0xcc bin/usb_core.o - 0x000000000800b84c USB_OTG_SelectCore + 0x000000000800c0a8 0xcc bin/usb_core.o + 0x000000000800c0a8 USB_OTG_SelectCore .text.USB_OTG_CoreInit - 0x000000000800b918 0x92 bin/usb_core.o - 0x000000000800b918 USB_OTG_CoreInit + 0x000000000800c174 0x92 bin/usb_core.o + 0x000000000800c174 USB_OTG_CoreInit .text.USB_OTG_EnableGlobalInt - 0x000000000800b9aa 0xe bin/usb_core.o - 0x000000000800b9aa USB_OTG_EnableGlobalInt + 0x000000000800c206 0xe bin/usb_core.o + 0x000000000800c206 USB_OTG_EnableGlobalInt .text.USB_OTG_DisableGlobalInt - 0x000000000800b9b8 0xe bin/usb_core.o - 0x000000000800b9b8 USB_OTG_DisableGlobalInt - *fill* 0x000000000800b9c6 0x2 + 0x000000000800c214 0xe bin/usb_core.o + 0x000000000800c214 USB_OTG_DisableGlobalInt + *fill* 0x000000000800c222 0x2 .text.USB_OTG_FlushTxFifo - 0x000000000800b9c8 0x48 bin/usb_core.o - 0x000000000800b9c8 USB_OTG_FlushTxFifo + 0x000000000800c224 0x48 bin/usb_core.o + 0x000000000800c224 USB_OTG_FlushTxFifo .text.USB_OTG_FlushRxFifo - 0x000000000800ba10 0x38 bin/usb_core.o - 0x000000000800ba10 USB_OTG_FlushRxFifo + 0x000000000800c26c 0x38 bin/usb_core.o + 0x000000000800c26c USB_OTG_FlushRxFifo .text.USB_OTG_SetCurrentMode - 0x000000000800ba48 0x2a bin/usb_core.o - 0x000000000800ba48 USB_OTG_SetCurrentMode + 0x000000000800c2a4 0x2a bin/usb_core.o + 0x000000000800c2a4 USB_OTG_SetCurrentMode .text.USB_OTG_IsDeviceMode - 0x000000000800ba72 0xe bin/usb_core.o - 0x000000000800ba72 USB_OTG_IsDeviceMode + 0x000000000800c2ce 0xe bin/usb_core.o + 0x000000000800c2ce USB_OTG_IsDeviceMode .text.USB_OTG_ReadCoreItr - 0x000000000800ba80 0xa bin/usb_core.o - 0x000000000800ba80 USB_OTG_ReadCoreItr + 0x000000000800c2dc 0xa bin/usb_core.o + 0x000000000800c2dc USB_OTG_ReadCoreItr .text.USB_OTG_InitDevSpeed - 0x000000000800ba8a 0xc bin/usb_core.o - 0x000000000800ba8a USB_OTG_InitDevSpeed - *fill* 0x000000000800ba96 0x2 + 0x000000000800c2e6 0xc bin/usb_core.o + 0x000000000800c2e6 USB_OTG_InitDevSpeed + *fill* 0x000000000800c2f2 0x2 .text.USB_OTG_EnableDevInt - 0x000000000800ba98 0x48 bin/usb_core.o - 0x000000000800ba98 USB_OTG_EnableDevInt + 0x000000000800c2f4 0x48 bin/usb_core.o + 0x000000000800c2f4 USB_OTG_EnableDevInt .text.USB_OTG_CoreInitDev - 0x000000000800bae0 0x114 bin/usb_core.o - 0x000000000800bae0 USB_OTG_CoreInitDev + 0x000000000800c33c 0x114 bin/usb_core.o + 0x000000000800c33c USB_OTG_CoreInitDev .text.USB_OTG_GetDeviceSpeed - 0x000000000800bbf4 0x20 bin/usb_core.o - 0x000000000800bbf4 USB_OTG_GetDeviceSpeed + 0x000000000800c450 0x20 bin/usb_core.o + 0x000000000800c450 USB_OTG_GetDeviceSpeed .text.USB_OTG_EP0Activate - 0x000000000800bc14 0x2a bin/usb_core.o - 0x000000000800bc14 USB_OTG_EP0Activate + 0x000000000800c470 0x2a bin/usb_core.o + 0x000000000800c470 USB_OTG_EP0Activate .text.USB_OTG_EPActivate - 0x000000000800bc3e 0x5e bin/usb_core.o - 0x000000000800bc3e USB_OTG_EPActivate + 0x000000000800c49a 0x5e bin/usb_core.o + 0x000000000800c49a USB_OTG_EPActivate .text.USB_OTG_EPDeactivate - 0x000000000800bc9c 0x46 bin/usb_core.o - 0x000000000800bc9c USB_OTG_EPDeactivate + 0x000000000800c4f8 0x46 bin/usb_core.o + 0x000000000800c4f8 USB_OTG_EPDeactivate .text.USB_OTG_EPStartXfer - 0x000000000800bce2 0x108 bin/usb_core.o - 0x000000000800bce2 USB_OTG_EPStartXfer + 0x000000000800c53e 0x108 bin/usb_core.o + 0x000000000800c53e USB_OTG_EPStartXfer .text.USB_OTG_EP0StartXfer - 0x000000000800bdea 0xde bin/usb_core.o - 0x000000000800bdea USB_OTG_EP0StartXfer + 0x000000000800c646 0xde bin/usb_core.o + 0x000000000800c646 USB_OTG_EP0StartXfer .text.USB_OTG_EPSetStall - 0x000000000800bec8 0x28 bin/usb_core.o - 0x000000000800bec8 USB_OTG_EPSetStall + 0x000000000800c724 0x28 bin/usb_core.o + 0x000000000800c724 USB_OTG_EPSetStall .text.USB_OTG_EPClearStall - 0x000000000800bef0 0x2a bin/usb_core.o - 0x000000000800bef0 USB_OTG_EPClearStall + 0x000000000800c74c 0x2a bin/usb_core.o + 0x000000000800c74c USB_OTG_EPClearStall .text.USB_OTG_ReadDevAllOutEp_itr - 0x000000000800bf1a 0xc bin/usb_core.o - 0x000000000800bf1a USB_OTG_ReadDevAllOutEp_itr + 0x000000000800c776 0xc bin/usb_core.o + 0x000000000800c776 USB_OTG_ReadDevAllOutEp_itr .text.USB_OTG_ReadDevOutEP_itr - 0x000000000800bf26 0x10 bin/usb_core.o - 0x000000000800bf26 USB_OTG_ReadDevOutEP_itr + 0x000000000800c782 0x10 bin/usb_core.o + 0x000000000800c782 USB_OTG_ReadDevOutEP_itr .text.USB_OTG_ReadDevAllInEPItr - 0x000000000800bf36 0xc bin/usb_core.o - 0x000000000800bf36 USB_OTG_ReadDevAllInEPItr + 0x000000000800c792 0xc bin/usb_core.o + 0x000000000800c792 USB_OTG_ReadDevAllInEPItr .text.USB_OTG_EP0_OutStart - 0x000000000800bf42 0x42 bin/usb_core.o - 0x000000000800bf42 USB_OTG_EP0_OutStart + 0x000000000800c79e 0x42 bin/usb_core.o + 0x000000000800c79e USB_OTG_EP0_OutStart .text.USBD_OTG_ISR_Handler - 0x000000000800bf84 0x46c bin/usb_dcd_int.o - 0x000000000800bf84 USBD_OTG_ISR_Handler + 0x000000000800c7e0 0x46c bin/usb_dcd_int.o + 0x000000000800c7e0 USBD_OTG_ISR_Handler .text.OTG_FS_IRQHandler - 0x000000000800c3f0 0xc bin/usb_dcd_int.o - 0x000000000800c3f0 OTG_FS_IRQHandler + 0x000000000800cc4c 0xc bin/usb_dcd_int.o + 0x000000000800cc4c OTG_FS_IRQHandler .text.DCD_Init - 0x000000000800c3fc 0x9e bin/usb_dcd.o - 0x000000000800c3fc DCD_Init + 0x000000000800cc58 0x9e bin/usb_dcd.o + 0x000000000800cc58 DCD_Init .text.DCD_EP_Open - 0x000000000800c49a 0x42 bin/usb_dcd.o - 0x000000000800c49a DCD_EP_Open + 0x000000000800ccf6 0x42 bin/usb_dcd.o + 0x000000000800ccf6 DCD_EP_Open .text.DCD_EP_Close - 0x000000000800c4dc 0x30 bin/usb_dcd.o - 0x000000000800c4dc DCD_EP_Close + 0x000000000800cd38 0x30 bin/usb_dcd.o + 0x000000000800cd38 DCD_EP_Close .text.DCD_EP_PrepareRx - 0x000000000800c50c 0x4e bin/usb_dcd.o - 0x000000000800c50c DCD_EP_PrepareRx + 0x000000000800cd68 0x4e bin/usb_dcd.o + 0x000000000800cd68 DCD_EP_PrepareRx .text.DCD_EP_Tx - 0x000000000800c55a 0x40 bin/usb_dcd.o - 0x000000000800c55a DCD_EP_Tx + 0x000000000800cdb6 0x40 bin/usb_dcd.o + 0x000000000800cdb6 DCD_EP_Tx .text.DCD_EP_Stall - 0x000000000800c59a 0x34 bin/usb_dcd.o - 0x000000000800c59a DCD_EP_Stall + 0x000000000800cdf6 0x34 bin/usb_dcd.o + 0x000000000800cdf6 DCD_EP_Stall .text.DCD_EP_ClrStall - 0x000000000800c5ce 0x34 bin/usb_dcd.o - 0x000000000800c5ce DCD_EP_ClrStall + 0x000000000800ce2a 0x34 bin/usb_dcd.o + 0x000000000800ce2a DCD_EP_ClrStall .text.DCD_EP_SetAddress - 0x000000000800c602 0x12 bin/usb_dcd.o - 0x000000000800c602 DCD_EP_SetAddress + 0x000000000800ce5e 0x12 bin/usb_dcd.o + 0x000000000800ce5e DCD_EP_SetAddress .text.USBD_CtlSendData - 0x000000000800c614 0x22 bin/usbd_ioreq.o - 0x000000000800c614 USBD_CtlSendData + 0x000000000800ce70 0x22 bin/usbd_ioreq.o + 0x000000000800ce70 USBD_CtlSendData .text.USBD_CtlContinueSendData - 0x000000000800c636 0x12 bin/usbd_ioreq.o - 0x000000000800c636 USBD_CtlContinueSendData + 0x000000000800ce92 0x12 bin/usbd_ioreq.o + 0x000000000800ce92 USBD_CtlContinueSendData .text.USBD_CtlContinueRx - 0x000000000800c648 0x12 bin/usbd_ioreq.o - 0x000000000800c648 USBD_CtlContinueRx + 0x000000000800cea4 0x12 bin/usbd_ioreq.o + 0x000000000800cea4 USBD_CtlContinueRx .text.USBD_CtlSendStatus - 0x000000000800c65a 0x1e bin/usbd_ioreq.o - 0x000000000800c65a USBD_CtlSendStatus + 0x000000000800ceb6 0x1e bin/usbd_ioreq.o + 0x000000000800ceb6 USBD_CtlSendStatus .text.USBD_CtlReceiveStatus - 0x000000000800c678 0x1e bin/usbd_ioreq.o - 0x000000000800c678 USBD_CtlReceiveStatus + 0x000000000800ced4 0x1e bin/usbd_ioreq.o + 0x000000000800ced4 USBD_CtlReceiveStatus .text.USBD_ParseSetupRequest - 0x000000000800c696 0x44 bin/usbd_req.o - 0x000000000800c696 USBD_ParseSetupRequest + 0x000000000800cef2 0x44 bin/usbd_req.o + 0x000000000800cef2 USBD_ParseSetupRequest .text.USBD_CtlError - 0x000000000800c6da 0x1c bin/usbd_req.o - 0x000000000800c6da USBD_CtlError - *fill* 0x000000000800c6f6 0x2 + 0x000000000800cf36 0x1c bin/usbd_req.o + 0x000000000800cf36 USBD_CtlError + *fill* 0x000000000800cf52 0x2 .text.USBD_StdDevReq - 0x000000000800c6f8 0x258 bin/usbd_req.o - 0x000000000800c6f8 USBD_StdDevReq + 0x000000000800cf54 0x258 bin/usbd_req.o + 0x000000000800cf54 USBD_StdDevReq .text.USBD_StdItfReq - 0x000000000800c950 0x30 bin/usbd_req.o - 0x000000000800c950 USBD_StdItfReq + 0x000000000800d1ac 0x30 bin/usbd_req.o + 0x000000000800d1ac USBD_StdItfReq .text.USBD_StdEPReq - 0x000000000800c980 0xc0 bin/usbd_req.o - 0x000000000800c980 USBD_StdEPReq + 0x000000000800d1dc 0xc0 bin/usbd_req.o + 0x000000000800d1dc USBD_StdEPReq .text.USBD_GetString - 0x000000000800ca40 0x3a bin/usbd_req.o - 0x000000000800ca40 USBD_GetString + 0x000000000800d29c 0x3a bin/usbd_req.o + 0x000000000800d29c USBD_GetString .text.USBD_Resume - 0x000000000800ca7a 0x16 bin/usbd_core.o + 0x000000000800d2d6 0x16 bin/usbd_core.o .text.USBD_Suspend - 0x000000000800ca90 0x1c bin/usbd_core.o + 0x000000000800d2ec 0x1c bin/usbd_core.o .text.USBD_SOF - 0x000000000800caac 0x10 bin/usbd_core.o + 0x000000000800d308 0x10 bin/usbd_core.o .text.USBD_IsoINIncomplete - 0x000000000800cabc 0xe bin/usbd_core.o + 0x000000000800d318 0xe bin/usbd_core.o .text.USBD_IsoOUTIncomplete - 0x000000000800caca 0xe bin/usbd_core.o + 0x000000000800d326 0xe bin/usbd_core.o .text.USBD_Reset - 0x000000000800cad8 0x2e bin/usbd_core.o + 0x000000000800d334 0x2e bin/usbd_core.o .text.USBD_SetupStage - 0x000000000800cb06 0x4a bin/usbd_core.o + 0x000000000800d362 0x4a bin/usbd_core.o .text.USBD_DataInStage - 0x000000000800cb50 0xb8 bin/usbd_core.o + 0x000000000800d3ac 0xb8 bin/usbd_core.o .text.USBD_DataOutStage - 0x000000000800cc08 0x76 bin/usbd_core.o + 0x000000000800d464 0x76 bin/usbd_core.o .text.USBD_Init - 0x000000000800cc7e 0x38 bin/usbd_core.o - 0x000000000800cc7e USBD_Init + 0x000000000800d4da 0x38 bin/usbd_core.o + 0x000000000800d4da USBD_Init .text.USBD_SetCfg - 0x000000000800ccb6 0x18 bin/usbd_core.o - 0x000000000800ccb6 USBD_SetCfg + 0x000000000800d512 0x18 bin/usbd_core.o + 0x000000000800d512 USBD_SetCfg .text.USBD_ClrCfg - 0x000000000800ccce 0xe bin/usbd_core.o - 0x000000000800ccce USBD_ClrCfg + 0x000000000800d52a 0xe bin/usbd_core.o + 0x000000000800d52a USBD_ClrCfg .text.platformInit - 0x000000000800ccdc 0xa bin/platform_cf2.o - 0x000000000800ccdc platformInit - *fill* 0x000000000800cce6 0x2 + 0x000000000800d538 0xa bin/platform_cf2.o + 0x000000000800d538 platformInit + *fill* 0x000000000800d542 0x2 .text.ledSet.part.0 - 0x000000000800cce8 0x38 bin/led_f405.o - .text.ledSet 0x000000000800cd20 0xa bin/led_f405.o - 0x000000000800cd20 ledSet - *fill* 0x000000000800cd2a 0x2 - .text.ledInit 0x000000000800cd2c 0x58 bin/led_f405.o - 0x000000000800cd2c ledInit + 0x000000000800d544 0x38 bin/led_f405.o + .text.ledSet 0x000000000800d57c 0xa bin/led_f405.o + 0x000000000800d57c ledSet + *fill* 0x000000000800d586 0x2 + .text.ledInit 0x000000000800d588 0x58 bin/led_f405.o + 0x000000000800d588 ledInit .text.ledClearAll - 0x000000000800cd84 0x14 bin/led_f405.o - 0x000000000800cd84 ledClearAll - .text.ledTest 0x000000000800cd98 0x64 bin/led_f405.o - 0x000000000800cd98 ledTest + 0x000000000800d5e0 0x14 bin/led_f405.o + 0x000000000800d5e0 ledClearAll + .text.ledTest 0x000000000800d5f4 0x64 bin/led_f405.o + 0x000000000800d5f4 ledTest .text.mpu6500Init - 0x000000000800cdfc 0x24 bin/mpu6500.o - 0x000000000800cdfc mpu6500Init + 0x000000000800d658 0x24 bin/mpu6500.o + 0x000000000800d658 mpu6500Init .text.mpu6500EvaluateSelfTest - 0x000000000800ce20 0x6c bin/mpu6500.o - 0x000000000800ce20 mpu6500EvaluateSelfTest + 0x000000000800d67c 0x6c bin/mpu6500.o + 0x000000000800d67c mpu6500EvaluateSelfTest .text.mpu6500SelfTest - 0x000000000800ce8c 0x464 bin/mpu6500.o - 0x000000000800ce8c mpu6500SelfTest + 0x000000000800d6e8 0x464 bin/mpu6500.o + 0x000000000800d6e8 mpu6500SelfTest .text.mpu6500SetRate - 0x000000000800d2f0 0x18 bin/mpu6500.o - 0x000000000800d2f0 mpu6500SetRate + 0x000000000800db4c 0x18 bin/mpu6500.o + 0x000000000800db4c mpu6500SetRate .text.mpu6500SetDLPFMode - 0x000000000800d308 0x28 bin/mpu6500.o - 0x000000000800d308 mpu6500SetDLPFMode + 0x000000000800db64 0x28 bin/mpu6500.o + 0x000000000800db64 mpu6500SetDLPFMode .text.mpu6500SetFullScaleGyroRange - 0x000000000800d330 0x28 bin/mpu6500.o - 0x000000000800d330 mpu6500SetFullScaleGyroRange + 0x000000000800db8c 0x28 bin/mpu6500.o + 0x000000000800db8c mpu6500SetFullScaleGyroRange .text.mpu6500SetFullScaleAccelRange - 0x000000000800d358 0x28 bin/mpu6500.o - 0x000000000800d358 mpu6500SetFullScaleAccelRange + 0x000000000800dbb4 0x28 bin/mpu6500.o + 0x000000000800dbb4 mpu6500SetFullScaleAccelRange .text.mpu6500SetI2CBypassEnabled - 0x000000000800d380 0x24 bin/mpu6500.o - 0x000000000800d380 mpu6500SetI2CBypassEnabled + 0x000000000800dbdc 0x24 bin/mpu6500.o + 0x000000000800dbdc mpu6500SetI2CBypassEnabled .text.mpu6500SetIntEnabled - 0x000000000800d3a4 0x18 bin/mpu6500.o - 0x000000000800d3a4 mpu6500SetIntEnabled + 0x000000000800dc00 0x18 bin/mpu6500.o + 0x000000000800dc00 mpu6500SetIntEnabled .text.mpu6500GetMotion6 - 0x000000000800d3bc 0x74 bin/mpu6500.o - 0x000000000800d3bc mpu6500GetMotion6 + 0x000000000800dc18 0x74 bin/mpu6500.o + 0x000000000800dc18 mpu6500GetMotion6 .text.mpu6500Reset - 0x000000000800d430 0x24 bin/mpu6500.o - 0x000000000800d430 mpu6500Reset + 0x000000000800dc8c 0x24 bin/mpu6500.o + 0x000000000800dc8c mpu6500Reset .text.mpu6500SetSleepEnabled - 0x000000000800d454 0x24 bin/mpu6500.o - 0x000000000800d454 mpu6500SetSleepEnabled + 0x000000000800dcb0 0x24 bin/mpu6500.o + 0x000000000800dcb0 mpu6500SetSleepEnabled .text.mpu6500SetTempSensorEnabled - 0x000000000800d478 0x28 bin/mpu6500.o - 0x000000000800d478 mpu6500SetTempSensorEnabled + 0x000000000800dcd4 0x28 bin/mpu6500.o + 0x000000000800dcd4 mpu6500SetTempSensorEnabled .text.mpu6500SetClockSource - 0x000000000800d4a0 0x28 bin/mpu6500.o - 0x000000000800d4a0 mpu6500SetClockSource + 0x000000000800dcfc 0x28 bin/mpu6500.o + 0x000000000800dcfc mpu6500SetClockSource .text.mpu6500GetDeviceID - 0x000000000800d4c8 0x2c bin/mpu6500.o - 0x000000000800d4c8 mpu6500GetDeviceID + 0x000000000800dd24 0x2c bin/mpu6500.o + 0x000000000800dd24 mpu6500GetDeviceID .text.mpu6500TestConnection - 0x000000000800d4f4 0x10 bin/mpu6500.o - 0x000000000800d4f4 mpu6500TestConnection - .text.i2cdevReleaseSemaphoreI2C1 - 0x000000000800d504 0x28 bin/i2cdev_f405.o - .text.i2cdevReleaseSemaphoreI2C2 - 0x000000000800d52c 0x28 bin/i2cdev_f405.o - .text.i2cdevReleaseSemaphoreI2C3 - 0x000000000800d554 0x28 bin/i2cdev_f405.o - .text.i2cdevReadTransfer.part.0 - 0x000000000800d57c 0x68 bin/i2cdev_f405.o - .text.i2cdevWriteTransfer.part.1 - 0x000000000800d5e4 0x68 bin/i2cdev_f405.o - .text.i2cdevRuffLoopDelay.constprop.2 - 0x000000000800d64c 0x14 bin/i2cdev_f405.o + 0x000000000800dd50 0x10 bin/mpu6500.o + 0x000000000800dd50 mpu6500TestConnection + .text.getSemaphore + 0x000000000800dd60 0x58 bin/i2cdev_f405.o + .text.i2cDevTakeSemaphore + 0x000000000800ddb8 0x14 bin/i2cdev_f405.o + .text.i2cDevGiveSemaphore + 0x000000000800ddcc 0x48 bin/i2cdev_f405.o + .text.i2cdevReadTransfer.part.1 + 0x000000000800de14 0x2c bin/i2cdev_f405.o + .text.i2cdevWriteTransfer.part.2 + 0x000000000800de40 0x2c bin/i2cdev_f405.o + .text.i2cdevRuffLoopDelay.constprop.3 + 0x000000000800de6c 0x14 bin/i2cdev_f405.o .text.i2cdevInit - 0x000000000800d660 0x98 bin/i2cdev_f405.o - 0x000000000800d660 i2cdevInit + 0x000000000800de80 0x98 bin/i2cdev_f405.o + 0x000000000800de80 i2cdevInit .text.i2cdevRead - 0x000000000800d6f8 0x48 bin/i2cdev_f405.o - 0x000000000800d6f8 i2cdevRead + 0x000000000800df18 0x48 bin/i2cdev_f405.o + 0x000000000800df18 i2cdevRead .text.i2cdevReadByte - 0x000000000800d740 0x10 bin/i2cdev_f405.o - 0x000000000800d740 i2cdevReadByte + 0x000000000800df60 0x10 bin/i2cdev_f405.o + 0x000000000800df60 i2cdevReadByte .text.i2cdevReadBits - 0x000000000800d750 0x2e bin/i2cdev_f405.o - 0x000000000800d750 i2cdevReadBits + 0x000000000800df70 0x2e bin/i2cdev_f405.o + 0x000000000800df70 i2cdevReadBits .text.i2cdevReadBit - 0x000000000800d77e 0x22 bin/i2cdev_f405.o - 0x000000000800d77e i2cdevReadBit + 0x000000000800df9e 0x22 bin/i2cdev_f405.o + 0x000000000800df9e i2cdevReadBit .text.i2cdevRead16 - 0x000000000800d7a0 0x3a bin/i2cdev_f405.o - 0x000000000800d7a0 i2cdevRead16 + 0x000000000800dfc0 0x3a bin/i2cdev_f405.o + 0x000000000800dfc0 i2cdevRead16 .text.i2cdevWrite - 0x000000000800d7da 0x4c bin/i2cdev_f405.o - 0x000000000800d7da i2cdevWrite + 0x000000000800dffa 0x4c bin/i2cdev_f405.o + 0x000000000800dffa i2cdevWrite .text.i2cdevWriteByte - 0x000000000800d826 0x14 bin/i2cdev_f405.o - 0x000000000800d826 i2cdevWriteByte + 0x000000000800e046 0x14 bin/i2cdev_f405.o + 0x000000000800e046 i2cdevWriteByte .text.i2cdevWriteBit - 0x000000000800d83a 0x3c bin/i2cdev_f405.o - 0x000000000800d83a i2cdevWriteBit + 0x000000000800e05a 0x3c bin/i2cdev_f405.o + 0x000000000800e05a i2cdevWriteBit .text.i2cdevWriteBits - 0x000000000800d876 0x54 bin/i2cdev_f405.o - 0x000000000800d876 i2cdevWriteBits + 0x000000000800e096 0x54 bin/i2cdev_f405.o + 0x000000000800e096 i2cdevWriteBits .text.i2cdevWrite16 - 0x000000000800d8ca 0x3a bin/i2cdev_f405.o - 0x000000000800d8ca i2cdevWrite16 + 0x000000000800e0ea 0x3a bin/i2cdev_f405.o + 0x000000000800e0ea i2cdevWrite16 .text.i2cdevUnlockBus - 0x000000000800d904 0xb6 bin/i2cdev_f405.o - 0x000000000800d904 i2cdevUnlockBus - *fill* 0x000000000800d9ba 0x2 + 0x000000000800e124 0xb6 bin/i2cdev_f405.o + 0x000000000800e124 i2cdevUnlockBus + *fill* 0x000000000800e1da 0x2 .text.CPAL_I2C_ERR_UserCallback - 0x000000000800d9bc 0x14 bin/i2cdev_f405.o - 0x000000000800d9bc CPAL_I2C_ERR_UserCallback + 0x000000000800e1dc 0x24 bin/i2cdev_f405.o + 0x000000000800e1dc CPAL_I2C_ERR_UserCallback + .text.CPAL_TIMEOUT_UserCallback + 0x000000000800e200 0x20 bin/i2cdev_f405.o + 0x000000000800e200 CPAL_TIMEOUT_UserCallback .text.CPAL_I2C_TXTC_UserCallback - 0x000000000800d9d0 0x2c bin/i2cdev_f405.o - 0x000000000800d9d0 CPAL_I2C_TXTC_UserCallback + 0x000000000800e220 0x6 bin/i2cdev_f405.o + 0x000000000800e220 CPAL_I2C_TXTC_UserCallback .text.CPAL_I2C_RXTC_UserCallback - 0x000000000800d9fc 0x2c bin/i2cdev_f405.o - 0x000000000800d9fc CPAL_I2C_RXTC_UserCallback - .text.fillLed 0x000000000800da28 0x5c bin/ws2812.o + 0x000000000800e226 0x6 bin/i2cdev_f405.o + 0x000000000800e226 CPAL_I2C_RXTC_UserCallback + .text.fillLed 0x000000000800e22c 0x5c bin/ws2812_cf2.o .text.ws2812Init - 0x000000000800da84 0x158 bin/ws2812.o - 0x000000000800da84 ws2812Init + 0x000000000800e288 0x158 bin/ws2812_cf2.o + 0x000000000800e288 ws2812Init .text.ws2812Send - 0x000000000800dbdc 0x84 bin/ws2812.o - 0x000000000800dbdc ws2812Send + 0x000000000800e3e0 0x84 bin/ws2812_cf2.o + 0x000000000800e3e0 ws2812Send .text.ws2812DmaIsr - 0x000000000800dc60 0xc4 bin/ws2812.o - 0x000000000800dc60 ws2812DmaIsr + 0x000000000800e464 0xc0 bin/ws2812_cf2.o + 0x000000000800e464 ws2812DmaIsr .text.lps25hInit - 0x000000000800dd24 0x2c bin/lps25h.o - 0x000000000800dd24 lps25hInit + 0x000000000800e524 0x2c bin/lps25h.o + 0x000000000800e524 lps25hInit .text.lps25hTestConnection - 0x000000000800dd50 0x40 bin/lps25h.o - 0x000000000800dd50 lps25hTestConnection + 0x000000000800e550 0x40 bin/lps25h.o + 0x000000000800e550 lps25hTestConnection .text.lps25hEvaluateSelfTest - 0x000000000800dd90 0x6c bin/lps25h.o - 0x000000000800dd90 lps25hEvaluateSelfTest + 0x000000000800e590 0x6c bin/lps25h.o + 0x000000000800e590 lps25hEvaluateSelfTest .text.lps25hSetEnabled - 0x000000000800ddfc 0x5c bin/lps25h.o - 0x000000000800ddfc lps25hSetEnabled + 0x000000000800e5fc 0x5c bin/lps25h.o + 0x000000000800e5fc lps25hSetEnabled .text.lps25hPressureToAltitude - 0x000000000800de58 0x54 bin/lps25h.o - 0x000000000800de58 lps25hPressureToAltitude + 0x000000000800e658 0x54 bin/lps25h.o + 0x000000000800e658 lps25hPressureToAltitude .text.lps25hGetData - 0x000000000800deac 0x8c bin/lps25h.o - 0x000000000800deac lps25hGetData + 0x000000000800e6ac 0x8c bin/lps25h.o + 0x000000000800e6ac lps25hGetData .text.lps25hSelfTest - 0x000000000800df38 0x74 bin/lps25h.o - 0x000000000800df38 lps25hSelfTest + 0x000000000800e738 0x74 bin/lps25h.o + 0x000000000800e738 lps25hSelfTest .text.ak8963EvaluateSelfTest - 0x000000000800dfac 0x30 bin/ak8963.o + 0x000000000800e7ac 0x30 bin/ak8963.o .text.ak8963Init - 0x000000000800dfdc 0x14 bin/ak8963.o - 0x000000000800dfdc ak8963Init + 0x000000000800e7dc 0x14 bin/ak8963.o + 0x000000000800e7dc ak8963Init .text.ak8963TestConnection - 0x000000000800dff0 0x30 bin/ak8963.o - 0x000000000800dff0 ak8963TestConnection + 0x000000000800e7f0 0x30 bin/ak8963.o + 0x000000000800e7f0 ak8963TestConnection .text.ak8963GetDataReady - 0x000000000800e020 0x30 bin/ak8963.o - 0x000000000800e020 ak8963GetDataReady + 0x000000000800e820 0x30 bin/ak8963.o + 0x000000000800e820 ak8963GetDataReady .text.ak8963GetHeading - 0x000000000800e050 0x4c bin/ak8963.o - 0x000000000800e050 ak8963GetHeading + 0x000000000800e850 0x4c bin/ak8963.o + 0x000000000800e850 ak8963GetHeading .text.ak8963GetOverflowStatus - 0x000000000800e09c 0x30 bin/ak8963.o - 0x000000000800e09c ak8963GetOverflowStatus + 0x000000000800e89c 0x30 bin/ak8963.o + 0x000000000800e89c ak8963GetOverflowStatus .text.ak8963SetMode - 0x000000000800e0cc 0x18 bin/ak8963.o - 0x000000000800e0cc ak8963SetMode + 0x000000000800e8cc 0x18 bin/ak8963.o + 0x000000000800e8cc ak8963SetMode .text.ak8963SetSelfTest - 0x000000000800e0e4 0x24 bin/ak8963.o - 0x000000000800e0e4 ak8963SetSelfTest + 0x000000000800e8e4 0x24 bin/ak8963.o + 0x000000000800e8e4 ak8963SetSelfTest .text.ak8963SelfTest - 0x000000000800e108 0xd4 bin/ak8963.o - 0x000000000800e108 ak8963SelfTest + 0x000000000800e908 0xd4 bin/ak8963.o + 0x000000000800e908 ak8963SelfTest .text.eepromInit - 0x000000000800e1dc 0x24 bin/eeprom.o - 0x000000000800e1dc eepromInit + 0x000000000800e9dc 0x24 bin/eeprom.o + 0x000000000800e9dc eepromInit .text.eepromTestConnection - 0x000000000800e200 0x30 bin/eeprom.o - 0x000000000800e200 eepromTestConnection + 0x000000000800ea00 0x30 bin/eeprom.o + 0x000000000800ea00 eepromTestConnection .text.eepromTest - 0x000000000800e230 0x28 bin/eeprom.o - 0x000000000800e230 eepromTest + 0x000000000800ea30 0x28 bin/eeprom.o + 0x000000000800ea30 eepromTest .text.eepromReadBuffer - 0x000000000800e258 0x30 bin/eeprom.o - 0x000000000800e258 eepromReadBuffer + 0x000000000800ea58 0x30 bin/eeprom.o + 0x000000000800ea58 eepromReadBuffer .text.eepromWriteBuffer - 0x000000000800e288 0x54 bin/eeprom.o - 0x000000000800e288 eepromWriteBuffer + 0x000000000800ea88 0x54 bin/eeprom.o + 0x000000000800ea88 eepromWriteBuffer + .text.piezoInit + 0x000000000800eadc 0xf8 bin/piezo.o + 0x000000000800eadc piezoInit + .text.piezoSetRatio + 0x000000000800ebd4 0x20 bin/piezo.o + 0x000000000800ebd4 piezoSetRatio + .text.piezoSetFreq + 0x000000000800ebf4 0x18 bin/piezo.o + 0x000000000800ebf4 piezoSetFreq .text.uartDmaInit - 0x000000000800e2dc 0x74 bin/uart_syslink.o - 0x000000000800e2dc uartDmaInit + 0x000000000800ec0c 0x74 bin/uart_syslink.o + 0x000000000800ec0c uartDmaInit .text.uartInit - 0x000000000800e350 0x144 bin/uart_syslink.o - 0x000000000800e350 uartInit + 0x000000000800ec80 0x144 bin/uart_syslink.o + 0x000000000800ec80 uartInit .text.uartGetDataWithTimout - 0x000000000800e494 0x20 bin/uart_syslink.o - 0x000000000800e494 uartGetDataWithTimout + 0x000000000800edc4 0x20 bin/uart_syslink.o + 0x000000000800edc4 uartGetDataWithTimout .text.uartSendData - 0x000000000800e4b4 0x28 bin/uart_syslink.o - 0x000000000800e4b4 uartSendData + 0x000000000800ede4 0x28 bin/uart_syslink.o + 0x000000000800ede4 uartSendData .text.uartPutchar - 0x000000000800e4dc 0x18 bin/uart_syslink.o - 0x000000000800e4dc uartPutchar + 0x000000000800ee0c 0x18 bin/uart_syslink.o + 0x000000000800ee0c uartPutchar .text.uartSendDataDmaBlocking - 0x000000000800e4f4 0x84 bin/uart_syslink.o - 0x000000000800e4f4 uartSendDataDmaBlocking + 0x000000000800ee24 0x84 bin/uart_syslink.o + 0x000000000800ee24 uartSendDataDmaBlocking .text.uartDmaIsr - 0x000000000800e578 0x58 bin/uart_syslink.o - 0x000000000800e578 uartDmaIsr - .text.uartIsr 0x000000000800e5d0 0x9c bin/uart_syslink.o - 0x000000000800e5d0 uartIsr + 0x000000000800eea8 0x54 bin/uart_syslink.o + 0x000000000800eea8 uartDmaIsr + .text.uartIsr 0x000000000800eefc 0x98 bin/uart_syslink.o + 0x000000000800eefc uartIsr .text.uartTxenFlowctrlIsr - 0x000000000800e66c 0xb4 bin/uart_syslink.o - 0x000000000800e66c uartTxenFlowctrlIsr + 0x000000000800ef94 0xb4 bin/uart_syslink.o + 0x000000000800ef94 uartTxenFlowctrlIsr .text.EXTI4_IRQHandler - 0x000000000800e720 0x4 bin/uart_syslink.o - 0x000000000800e720 EXTI4_IRQHandler + 0x000000000800f048 0x4 bin/uart_syslink.o + 0x000000000800f048 EXTI4_IRQHandler .text.USART2_IRQHandler - 0x000000000800e724 0x4 bin/uart_syslink.o - 0x000000000800e724 USART2_IRQHandler + 0x000000000800f04c 0x4 bin/uart_syslink.o + 0x000000000800f04c USART2_IRQHandler .text.UART4_IRQHandler - 0x000000000800e728 0x4 bin/uart_syslink.o - 0x000000000800e728 UART4_IRQHandler + 0x000000000800f050 0x4 bin/uart_syslink.o + 0x000000000800f050 UART4_IRQHandler .text.USART6_IRQHandler - 0x000000000800e72c 0x4 bin/uart_syslink.o - 0x000000000800e72c USART6_IRQHandler + 0x000000000800f054 0x4 bin/uart_syslink.o + 0x000000000800f054 USART6_IRQHandler .text.DMA2_Stream7_IRQHandler - 0x000000000800e730 0x4 bin/uart_syslink.o - 0x000000000800e730 DMA2_Stream7_IRQHandler + 0x000000000800f058 0x4 bin/uart_syslink.o + 0x000000000800f058 DMA2_Stream7_IRQHandler + .text.watchdogNormalStartTest + 0x000000000800f05c 0x2c bin/watchdog.o + 0x000000000800f05c watchdogNormalStartTest + .text.watchdogInit + 0x000000000800f088 0x22 bin/watchdog.o + 0x000000000800f088 watchdogInit + *fill* 0x000000000800f0aa 0x2 .text.sonarInit - 0x000000000800e734 0x9c bin/sonar.o - 0x000000000800e734 sonarInit + 0x000000000800f0ac 0x9c bin/sonar.o + 0x000000000800f0ac sonarInit .text.sonarExtiInterruptHandler - 0x000000000800e7d0 0x80 bin/sonar.o - 0x000000000800e7d0 sonarExtiInterruptHandler + 0x000000000800f148 0x80 bin/sonar.o + 0x000000000800f148 sonarExtiInterruptHandler .text.USB_OTG_BSP_Init - 0x000000000800e850 0x90 bin/usb_bsp.o - 0x000000000800e850 USB_OTG_BSP_Init + 0x000000000800f1c8 0x90 bin/usb_bsp.o + 0x000000000800f1c8 USB_OTG_BSP_Init .text.USB_OTG_BSP_EnableInterrupt - 0x000000000800e8e0 0x2c bin/usb_bsp.o - 0x000000000800e8e0 USB_OTG_BSP_EnableInterrupt + 0x000000000800f258 0x2e bin/usb_bsp.o + 0x000000000800f258 USB_OTG_BSP_EnableInterrupt .text.USB_OTG_BSP_uDelay - 0x000000000800e90c 0x14 bin/usb_bsp.o - 0x000000000800e90c USB_OTG_BSP_uDelay + 0x000000000800f286 0x14 bin/usb_bsp.o + 0x000000000800f286 USB_OTG_BSP_uDelay .text.USB_OTG_BSP_mDelay - 0x000000000800e920 0xa bin/usb_bsp.o - 0x000000000800e920 USB_OTG_BSP_mDelay + 0x000000000800f29a 0xa bin/usb_bsp.o + 0x000000000800f29a USB_OTG_BSP_mDelay .text.usblinkSetEnable - 0x000000000800e92a 0x4 bin/usblink.o - *fill* 0x000000000800e92e 0x2 + 0x000000000800f2a4 0x4 bin/usblink.o .text.usblinkTask - 0x000000000800e930 0x3c bin/usblink.o + 0x000000000800f2a8 0x3c bin/usblink.o .text.usblinkReceiveCRTPPacket - 0x000000000800e96c 0x2c bin/usblink.o + 0x000000000800f2e4 0x2c bin/usblink.o .text.usblinkSendPacket - 0x000000000800e998 0x50 bin/usblink.o + 0x000000000800f310 0x50 bin/usblink.o .text.usblinkInit - 0x000000000800e9e8 0x4c bin/usblink.o - 0x000000000800e9e8 usblinkInit + 0x000000000800f360 0x4c bin/usblink.o + 0x000000000800f360 usblinkInit .text.usblinkGetLink - 0x000000000800ea34 0x8 bin/usblink.o - 0x000000000800ea34 usblinkGetLink + 0x000000000800f3ac 0x8 bin/usblink.o + 0x000000000800f3ac usblinkGetLink .text.USBD_USR_DeviceDescriptor - 0x000000000800ea3c 0xc bin/usbd_desc.o - 0x000000000800ea3c USBD_USR_DeviceDescriptor + 0x000000000800f3b4 0xc bin/usbd_desc.o + 0x000000000800f3b4 USBD_USR_DeviceDescriptor .text.USBD_USR_LangIDStrDescriptor - 0x000000000800ea48 0xc bin/usbd_desc.o - 0x000000000800ea48 USBD_USR_LangIDStrDescriptor + 0x000000000800f3c0 0xc bin/usbd_desc.o + 0x000000000800f3c0 USBD_USR_LangIDStrDescriptor .text.USBD_USR_ManufacturerStrDescriptor - 0x000000000800ea54 0x1c bin/usbd_desc.o - 0x000000000800ea54 USBD_USR_ManufacturerStrDescriptor + 0x000000000800f3cc 0x1c bin/usbd_desc.o + 0x000000000800f3cc USBD_USR_ManufacturerStrDescriptor .text.USBD_USR_SerialStrDescriptor - 0x000000000800ea70 0x54 bin/usbd_desc.o - 0x000000000800ea70 USBD_USR_SerialStrDescriptor + 0x000000000800f3e8 0x54 bin/usbd_desc.o + 0x000000000800f3e8 USBD_USR_SerialStrDescriptor .text.USBD_USR_ProductStrDescriptor - 0x000000000800eac4 0x24 bin/usbd_desc.o - 0x000000000800eac4 USBD_USR_ProductStrDescriptor + 0x000000000800f43c 0x24 bin/usbd_desc.o + 0x000000000800f43c USBD_USR_ProductStrDescriptor .text.USBD_USR_ConfigStrDescriptor - 0x000000000800eae8 0x1c bin/usbd_desc.o - 0x000000000800eae8 USBD_USR_ConfigStrDescriptor + 0x000000000800f460 0x1c bin/usbd_desc.o + 0x000000000800f460 USBD_USR_ConfigStrDescriptor .text.USBD_USR_InterfaceStrDescriptor - 0x000000000800eb04 0x24 bin/usbd_desc.o - 0x000000000800eb04 USBD_USR_InterfaceStrDescriptor + 0x000000000800f47c 0x24 bin/usbd_desc.o + 0x000000000800f47c USBD_USR_InterfaceStrDescriptor .text.usbd_cf_GetCfgDesc - 0x000000000800eb28 0xc bin/usb.o + 0x000000000800f4a0 0xc bin/usb.o .text.USBD_USR_Init - 0x000000000800eb34 0x2 bin/usb.o - 0x000000000800eb34 USBD_USR_Init + 0x000000000800f4ac 0x2 bin/usb.o + 0x000000000800f4ac USBD_USR_Init .text.USBD_USR_DeviceReset - 0x000000000800eb36 0x2 bin/usb.o - 0x000000000800eb36 USBD_USR_DeviceReset + 0x000000000800f4ae 0x2 bin/usb.o + 0x000000000800f4ae USBD_USR_DeviceReset .text.USBD_USR_DeviceConfigured - 0x000000000800eb38 0x2 bin/usb.o - 0x000000000800eb38 USBD_USR_DeviceConfigured + 0x000000000800f4b0 0x2 bin/usb.o + 0x000000000800f4b0 USBD_USR_DeviceConfigured .text.USBD_USR_DeviceResumed - 0x000000000800eb3a 0x2 bin/usb.o - 0x000000000800eb3a USBD_USR_DeviceResumed + 0x000000000800f4b2 0x2 bin/usb.o + 0x000000000800f4b2 USBD_USR_DeviceResumed .text.USBD_USR_DeviceConnected - 0x000000000800eb3c 0x2 bin/usb.o - 0x000000000800eb3c USBD_USR_DeviceConnected - *fill* 0x000000000800eb3e 0x2 + 0x000000000800f4b4 0x2 bin/usb.o + 0x000000000800f4b4 USBD_USR_DeviceConnected + *fill* 0x000000000800f4b6 0x2 .text.usbd_cf_DataOut - 0x000000000800eb40 0x40 bin/usb.o + 0x000000000800f4b8 0x40 bin/usb.o .text.USBD_USR_DeviceSuspended - 0x000000000800eb80 0xe bin/usb.o - 0x000000000800eb80 USBD_USR_DeviceSuspended + 0x000000000800f4f8 0xe bin/usb.o + 0x000000000800f4f8 USBD_USR_DeviceSuspended .text.USBD_USR_DeviceDisconnected - 0x000000000800eb8e 0xe bin/usb.o - 0x000000000800eb8e USBD_USR_DeviceDisconnected + 0x000000000800f506 0xe bin/usb.o + 0x000000000800f506 USBD_USR_DeviceDisconnected .text.usbd_cf_DeInit - 0x000000000800eb9c 0x16 bin/usb.o - *fill* 0x000000000800ebb2 0x2 + 0x000000000800f514 0x16 bin/usb.o + *fill* 0x000000000800f52a 0x2 .text.usbd_cf_Init - 0x000000000800ebb4 0x30 bin/usb.o + 0x000000000800f52c 0x30 bin/usb.o .text.usbd_cf_SOF - 0x000000000800ebe4 0x38 bin/usb.o + 0x000000000800f55c 0x38 bin/usb.o .text.usbd_cf_DataIn - 0x000000000800ec1c 0x38 bin/usb.o + 0x000000000800f594 0x38 bin/usb.o .text.usbd_cf_Setup - 0x000000000800ec54 0x24 bin/usb.o - .text.usbInit 0x000000000800ec78 0x58 bin/usb.o - 0x000000000800ec78 usbInit + 0x000000000800f5cc 0x24 bin/usb.o + .text.usbInit 0x000000000800f5f0 0x58 bin/usb.o + 0x000000000800f5f0 usbInit .text.usbGetDataBlocking - 0x000000000800ecd0 0x20 bin/usb.o - 0x000000000800ecd0 usbGetDataBlocking + 0x000000000800f648 0x20 bin/usb.o + 0x000000000800f648 usbGetDataBlocking .text.usbSendData - 0x000000000800ecf0 0x30 bin/usb.o - 0x000000000800ecf0 usbSendData + 0x000000000800f668 0x30 bin/usb.o + 0x000000000800f668 usbSendData .text.imu6Init - 0x000000000800ed20 0x1a8 bin/imu_cf2.o - 0x000000000800ed20 imu6Init + 0x000000000800f698 0x1a8 bin/imu_cf2.o + 0x000000000800f698 imu6Init .text.imu6Test - 0x000000000800eec8 0x54 bin/imu_cf2.o - 0x000000000800eec8 imu6Test + 0x000000000800f840 0x54 bin/imu_cf2.o + 0x000000000800f840 imu6Test .text.imu6Read - 0x000000000800ef1c 0x320 bin/imu_cf2.o - 0x000000000800ef1c imu6Read + 0x000000000800f894 0x324 bin/imu_cf2.o + 0x000000000800f894 imu6Read .text.imu6ManufacturingTest - 0x000000000800f23c 0x10c bin/imu_cf2.o - 0x000000000800f23c imu6ManufacturingTest + 0x000000000800fbb8 0x10c bin/imu_cf2.o + 0x000000000800fbb8 imu6ManufacturingTest .text.imu6IsCalibrated - 0x000000000800f348 0xc bin/imu_cf2.o - 0x000000000800f348 imu6IsCalibrated + 0x000000000800fcc4 0xc bin/imu_cf2.o + 0x000000000800fcc4 imu6IsCalibrated .text.imu9Read - 0x000000000800f354 0x78 bin/imu_cf2.o - 0x000000000800f354 imu9Read + 0x000000000800fcd0 0x78 bin/imu_cf2.o + 0x000000000800fcd0 imu9Read .text.imuHasBarometer - 0x000000000800f3cc 0xc bin/imu_cf2.o - 0x000000000800f3cc imuHasBarometer + 0x000000000800fd48 0xc bin/imu_cf2.o + 0x000000000800fd48 imuHasBarometer .text.pmSetBatteryVoltage - 0x000000000800f3d8 0x3c bin/pm_f405.o - .text.pmInit 0x000000000800f414 0x4c bin/pm_f405.o - 0x000000000800f414 pmInit - .text.pmTest 0x000000000800f460 0xc bin/pm_f405.o - 0x000000000800f460 pmTest + 0x000000000800fd54 0x3c bin/pm_f405.o + .text.pmInit 0x000000000800fd90 0x4c bin/pm_f405.o + 0x000000000800fd90 pmInit + .text.pmTest 0x000000000800fddc 0xc bin/pm_f405.o + 0x000000000800fddc pmTest .text.pmGetBatteryVoltage - 0x000000000800f46c 0xc bin/pm_f405.o - 0x000000000800f46c pmGetBatteryVoltage + 0x000000000800fde8 0xc bin/pm_f405.o + 0x000000000800fde8 pmGetBatteryVoltage .text.pmSyslinkUpdate - 0x000000000800f478 0x20 bin/pm_f405.o - 0x000000000800f478 pmSyslinkUpdate + 0x000000000800fdf4 0x20 bin/pm_f405.o + 0x000000000800fdf4 pmSyslinkUpdate .text.pmUpdateState - 0x000000000800f498 0x40 bin/pm_f405.o - 0x000000000800f498 pmUpdateState - .text.pmTask 0x000000000800f4d8 0x13c bin/pm_f405.o - 0x000000000800f4d8 pmTask + 0x000000000800fe14 0x40 bin/pm_f405.o + 0x000000000800fe14 pmUpdateState + .text.pmTask 0x000000000800fe54 0x154 bin/pm_f405.o + 0x000000000800fe54 pmTask .text.pmIsDischarging - 0x000000000800f614 0x14 bin/pm_f405.o - 0x000000000800f614 pmIsDischarging + 0x000000000800ffa8 0x14 bin/pm_f405.o + 0x000000000800ffa8 pmIsDischarging .text.syslinkTask - 0x000000000800f628 0x100 bin/syslink.o + 0x000000000800ffbc 0x100 bin/syslink.o .text.syslinkInit - 0x000000000800f728 0x58 bin/syslink.o - 0x000000000800f728 syslinkInit + 0x00000000080100bc 0x58 bin/syslink.o + 0x00000000080100bc syslinkInit .text.syslinkTest - 0x000000000800f780 0xc bin/syslink.o - 0x000000000800f780 syslinkTest + 0x0000000008010114 0xc bin/syslink.o + 0x0000000008010114 syslinkTest .text.syslinkSendPacket - 0x000000000800f78c 0x94 bin/syslink.o - 0x000000000800f78c syslinkSendPacket + 0x0000000008010120 0x94 bin/syslink.o + 0x0000000008010120 syslinkSendPacket .text.radiolinkSetEnable - 0x000000000800f820 0x4 bin/radiolink.o + 0x00000000080101b4 0x4 bin/radiolink.o .text.radiolinkSendCRTPPacket - 0x000000000800f824 0x54 bin/radiolink.o + 0x00000000080101b8 0x54 bin/radiolink.o .text.radiolinkReceiveCRTPPacket - 0x000000000800f878 0x20 bin/radiolink.o + 0x000000000801020c 0x20 bin/radiolink.o .text.radiolinkTest - 0x000000000800f898 0x4 bin/radiolink.o - 0x000000000800f898 radiolinkTest + 0x000000000801022c 0x4 bin/radiolink.o + 0x000000000801022c radiolinkTest .text.radiolinkSetChannel - 0x000000000800f89c 0x1e bin/radiolink.o - 0x000000000800f89c radiolinkSetChannel + 0x0000000008010230 0x1e bin/radiolink.o + 0x0000000008010230 radiolinkSetChannel .text.radiolinkSetDatarate - 0x000000000800f8ba 0x20 bin/radiolink.o - 0x000000000800f8ba radiolinkSetDatarate + 0x000000000801024e 0x20 bin/radiolink.o + 0x000000000801024e radiolinkSetDatarate .text.radiolinkSetAddress - 0x000000000800f8da 0x2e bin/radiolink.o - 0x000000000800f8da radiolinkSetAddress + 0x000000000801026e 0x2e bin/radiolink.o + 0x000000000801026e radiolinkSetAddress .text.radiolinkInit - 0x000000000800f908 0x6c bin/radiolink.o - 0x000000000800f908 radiolinkInit + 0x000000000801029c 0x6c bin/radiolink.o + 0x000000000801029c radiolinkInit .text.radiolinkSyslinkDispatch - 0x000000000800f974 0x68 bin/radiolink.o - 0x000000000800f974 radiolinkSyslinkDispatch + 0x0000000008010308 0x68 bin/radiolink.o + 0x0000000008010308 radiolinkSyslinkDispatch .text.radiolinkGetLink - 0x000000000800f9dc 0x8 bin/radiolink.o - 0x000000000800f9dc radiolinkGetLink + 0x0000000008010370 0x8 bin/radiolink.o + 0x0000000008010370 radiolinkGetLink .text.owSyslinkTransfer - 0x000000000800f9e4 0x80 bin/ow_syslink.o - .text.owInit 0x000000000800fa64 0x48 bin/ow_syslink.o - 0x000000000800fa64 owInit + 0x0000000008010378 0x80 bin/ow_syslink.o + .text.owInit 0x00000000080103f8 0x48 bin/ow_syslink.o + 0x00000000080103f8 owInit .text.owSyslinkRecieve - 0x000000000800faac 0x40 bin/ow_syslink.o - 0x000000000800faac owSyslinkRecieve - .text.owScan 0x000000000800faec 0x44 bin/ow_syslink.o - 0x000000000800faec owScan + 0x0000000008010440 0x40 bin/ow_syslink.o + 0x0000000008010440 owSyslinkRecieve + .text.owScan 0x0000000008010480 0x44 bin/ow_syslink.o + 0x0000000008010480 owScan .text.owGetinfo - 0x000000000800fb30 0x58 bin/ow_syslink.o - 0x000000000800fb30 owGetinfo - .text.owTest 0x000000000800fb88 0x9c bin/ow_syslink.o - 0x000000000800fb88 owTest - .text.owRead 0x000000000800fc24 0xc8 bin/ow_syslink.o - 0x000000000800fc24 owRead - .text.owWrite 0x000000000800fcec 0xd0 bin/ow_syslink.o - 0x000000000800fcec owWrite + 0x00000000080104c4 0x58 bin/ow_syslink.o + 0x00000000080104c4 owGetinfo + .text.owRead 0x000000000801051c 0xc8 bin/ow_syslink.o + 0x000000000801051c owRead + .text.owWrite 0x00000000080105e4 0xd0 bin/ow_syslink.o + 0x00000000080105e4 owWrite + .text.platformserviceHandler + 0x00000000080106b4 0x74 bin/platformservice.o + 0x00000000080106b4 platformserviceHandler + .text.platformserviceInit + 0x0000000008010728 0x20 bin/platformservice.o + 0x0000000008010728 platformserviceInit + .text.platformserviceTest + 0x0000000008010748 0xc bin/platformservice.o + 0x0000000008010748 platformserviceTest + .text.soundTimer + 0x0000000008010754 0x40 bin/sound_cf2.o + .text.tilt 0x0000000008010794 0x84 bin/sound_cf2.o + .text.siren 0x0000000008010818 0x48 bin/sound_cf2.o + .text.bypass 0x0000000008010860 0xc bin/sound_cf2.o + .text.melodyplayer + 0x000000000801086c 0x74 bin/sound_cf2.o + .text.off 0x00000000080108e0 0x4 bin/sound_cf2.o + .text.soundInit + 0x00000000080108e4 0x54 bin/sound_cf2.o + 0x00000000080108e4 soundInit + .text.soundTest + 0x0000000008010938 0xc bin/sound_cf2.o + 0x0000000008010938 soundTest + .text.soundSetEffect + 0x0000000008010944 0xc bin/sound_cf2.o + 0x0000000008010944 soundSetEffect + .text.deckInit + 0x0000000008010950 0x3c bin/deck.o + 0x0000000008010950 deckInit + .text.deckTest + 0x000000000801098c 0x4c bin/deck.o + 0x000000000801098c deckTest + .text.findType + 0x00000000080109d8 0x26 bin/deck_info.o + *fill* 0x00000000080109fe 0x2 + .text.deckCount + 0x0000000008010a00 0xc bin/deck_info.o + 0x0000000008010a00 deckCount + .text.deckInfo + 0x0000000008010a0c 0x1c bin/deck_info.o + 0x0000000008010a0c deckInfo + .text.deckTlvHasElement + 0x0000000008010a28 0xc bin/deck_info.o + 0x0000000008010a28 deckTlvHasElement + .text.deckTlvGetString + 0x0000000008010a34 0x3c bin/deck_info.o + 0x0000000008010a34 deckTlvGetString + .text.printDeckInfo + 0x0000000008010a70 0x90 bin/deck_info.o + 0x0000000008010a70 printDeckInfo + .text.deckInfoInit + 0x0000000008010b00 0x1d4 bin/deck_info.o + 0x0000000008010b00 deckInfoInit + .text.deckdriversInit + 0x0000000008010cd4 0x40 bin/deck_drivers.o + .text.deckDriverCount + 0x0000000008010d14 0x10 bin/deck_drivers.o + 0x0000000008010d14 deckDriverCount + .text.deckFindDriverByVidPid + 0x0000000008010d24 0x38 bin/deck_drivers.o + 0x0000000008010d24 deckFindDriverByVidPid + .text.deckFindDriverByName + 0x0000000008010d5c 0x3c bin/deck_drivers.o + 0x0000000008010d5c deckFindDriverByName + .text.adcInit 0x0000000008010d98 0x64 bin/deck_analog.o + 0x0000000008010d98 adcInit + .text.buzzDeckInit + 0x0000000008010dfc 0x14 bin/buzzdeck.o + .text.buzzDeckOff + 0x0000000008010e10 0x6 bin/buzzdeck.o + .text.buzzDeckOn + 0x0000000008010e16 0x14 bin/buzzdeck.o + *fill* 0x0000000008010e2a 0x2 + .text.bigquadTest + 0x0000000008010e2c 0x10 bin/bigquad.o + .text.bigquadInit + 0x0000000008010e3c 0x2c bin/bigquad.o + .text.exptestTestAllPins + 0x0000000008010e68 0x40 bin/exptest.o + .text.exptestRun + 0x0000000008010ea8 0x1b0 bin/exptest.o .text.whiteSpinEffect - 0x000000000800fdbc 0x58 bin/neopixelring.o + 0x0000000008011058 0x58 bin/ledring12.o .text.solidColorEffect - 0x000000000800fe14 0xa4 bin/neopixelring.o + 0x00000000080110b0 0xa4 bin/ledring12.o + .text.virtualMemEffect + 0x0000000008011154 0x68 bin/ledring12.o .text.boatEffect - 0x000000000800feb8 0x6c bin/neopixelring.o + 0x00000000080111bc 0x6c bin/ledring12.o .text.colorSpinEffect - 0x000000000800ff24 0x58 bin/neopixelring.o + 0x0000000008011228 0x58 bin/ledring12.o .text.spinEffect2 - 0x000000000800ff7c 0x60 bin/neopixelring.o + 0x0000000008011280 0x60 bin/ledring12.o .text.doubleSpinEffect - 0x000000000800ffdc 0x70 bin/neopixelring.o - .text.siren 0x000000000801004c 0x5c bin/neopixelring.o + 0x00000000080112e0 0x70 bin/ledring12.o + .text.siren 0x0000000008011350 0x5c bin/ledring12.o .text.batteryChargeEffect - 0x00000000080100a8 0xe0 bin/neopixelring.o + 0x00000000080113ac 0xe0 bin/ledring12.o .text.brightnessEffect - 0x0000000008010188 0x140 bin/neopixelring.o + 0x000000000801148c 0x140 bin/ledring12.o .text.tiltEffect - 0x00000000080102c8 0x380 bin/neopixelring.o + 0x00000000080115cc 0x380 bin/ledring12.o .text.gravityLight - 0x0000000008010648 0x154 bin/neopixelring.o - .text.neopixelringTimer - 0x000000000801079c 0x44 bin/neopixelring.o + 0x000000000801194c 0x154 bin/ledring12.o + .text.ledring12Init + 0x0000000008011aa0 0x6c bin/ledring12.o + .text.ledring12Timer + 0x0000000008011b0c 0x44 bin/ledring12.o .text.blackEffect - 0x00000000080107e0 0x16 bin/neopixelring.o - *fill* 0x00000000080107f6 0x2 + 0x0000000008011b50 0x16 bin/ledring12.o + *fill* 0x0000000008011b66 0x2 .text.ledTestEffect - 0x00000000080107f8 0xb8 bin/neopixelring.o - .text.neopixelringWorker - 0x00000000080108b0 0x4c bin/neopixelring.o - 0x00000000080108b0 neopixelringWorker - .text.neopixelringInit - 0x00000000080108fc 0x70 bin/neopixelring.o - 0x00000000080108fc neopixelringInit - .text.expbrdIsPresent.constprop.1 - 0x000000000801096c 0x30 bin/expbrd.o - .text.expbrdInit - 0x000000000801099c 0x134 bin/expbrd.o - 0x000000000801099c expbrdInit - .text.expbrdTest - 0x0000000008010ad0 0x6c bin/expbrd.o - 0x0000000008010ad0 expbrdTest - .text.platformserviceHandler - 0x0000000008010b3c 0x74 bin/platformservice.o - 0x0000000008010b3c platformserviceHandler - .text.platformserviceInit - 0x0000000008010bb0 0x20 bin/platformservice.o - 0x0000000008010bb0 platformserviceInit - .text.platformserviceTest - 0x0000000008010bd0 0xc bin/platformservice.o - 0x0000000008010bd0 platformserviceTest - .text.bigquadInit - 0x0000000008010bdc 0x2c bin/bigquad.o - 0x0000000008010bdc bigquadInit - .text.exptestTestAllPins - 0x0000000008010c08 0x40 bin/exptest.o - .text.exptestRun - 0x0000000008010c48 0x1a8 bin/exptest.o - 0x0000000008010c48 exptestRun - .text.adcInit 0x0000000008010df0 0x64 bin/deck_analog.o - 0x0000000008010df0 adcInit + 0x0000000008011b68 0xb8 bin/ledring12.o + .text.ledring12Worker + 0x0000000008011c20 0x4c bin/ledring12.o + 0x0000000008011c20 ledring12Worker .text.configblockWrite - 0x0000000008010e54 0x26 bin/configblockeeprom.o - *fill* 0x0000000008010e7a 0x2 + 0x0000000008011c6c 0x26 bin/configblockeeprom.o + *fill* 0x0000000008011c92 0x2 .text.configblockInit - 0x0000000008010e7c 0x158 bin/configblockeeprom.o - 0x0000000008010e7c configblockInit + 0x0000000008011c94 0x158 bin/configblockeeprom.o + 0x0000000008011c94 configblockInit .text.configblockTest - 0x0000000008010fd4 0x4 bin/configblockeeprom.o - 0x0000000008010fd4 configblockTest + 0x0000000008011dec 0x4 bin/configblockeeprom.o + 0x0000000008011dec configblockTest .text.configblockGetRadioChannel - 0x0000000008010fd8 0x18 bin/configblockeeprom.o - 0x0000000008010fd8 configblockGetRadioChannel + 0x0000000008011df0 0x18 bin/configblockeeprom.o + 0x0000000008011df0 configblockGetRadioChannel .text.configblockGetRadioSpeed - 0x0000000008010ff0 0x14 bin/configblockeeprom.o - 0x0000000008010ff0 configblockGetRadioSpeed + 0x0000000008011e08 0x14 bin/configblockeeprom.o + 0x0000000008011e08 configblockGetRadioSpeed .text.configblockGetRadioAddress - 0x0000000008011004 0x24 bin/configblockeeprom.o - 0x0000000008011004 configblockGetRadioAddress + 0x0000000008011e1c 0x24 bin/configblockeeprom.o + 0x0000000008011e1c configblockGetRadioAddress .text.configblockGetCalibPitch - 0x0000000008011028 0x20 bin/configblockeeprom.o - 0x0000000008011028 configblockGetCalibPitch + 0x0000000008011e40 0x20 bin/configblockeeprom.o + 0x0000000008011e40 configblockGetCalibPitch .text.configblockGetCalibRoll - 0x0000000008011048 0x20 bin/configblockeeprom.o - 0x0000000008011048 configblockGetCalibRoll - .text.atanf 0x0000000008011068 0x1b8 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libm.a(lib_a-sf_atan.o) - 0x0000000008011068 atanf - .text.cosf 0x0000000008011220 0x78 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libm.a(lib_a-sf_cos.o) - 0x0000000008011220 cosf - .text.fabsf 0x0000000008011298 0x10 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libm.a(lib_a-sf_fabs.o) - 0x0000000008011298 fabsf - .text.sinf 0x00000000080112a8 0x7c /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libm.a(lib_a-sf_sin.o) - 0x00000000080112a8 sinf - .text.tanf 0x0000000008011324 0x5c /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libm.a(lib_a-sf_tan.o) - 0x0000000008011324 tanf - .text.asinf 0x0000000008011380 0xbc /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libm.a(lib_a-wf_asin.o) - 0x0000000008011380 asinf - .text.atan2f 0x000000000801143c 0x4 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libm.a(lib_a-wf_atan2.o) - 0x000000000801143c atan2f - .text.powf 0x0000000008011440 0x344 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libm.a(lib_a-wf_pow.o) - 0x0000000008011440 powf + 0x0000000008011e60 0x20 bin/configblockeeprom.o + 0x0000000008011e60 configblockGetCalibRoll + .text.atanf 0x0000000008011e80 0x1b8 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libm.a(lib_a-sf_atan.o) + 0x0000000008011e80 atanf + .text.cosf 0x0000000008012038 0x78 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libm.a(lib_a-sf_cos.o) + 0x0000000008012038 cosf + .text.fabsf 0x00000000080120b0 0x10 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libm.a(lib_a-sf_fabs.o) + 0x00000000080120b0 fabsf + .text.sinf 0x00000000080120c0 0x7c /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libm.a(lib_a-sf_sin.o) + 0x00000000080120c0 sinf + .text.tanf 0x000000000801213c 0x5c /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libm.a(lib_a-sf_tan.o) + 0x000000000801213c tanf + .text.asinf 0x0000000008012198 0xbc /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libm.a(lib_a-wf_asin.o) + 0x0000000008012198 asinf + .text.atan2f 0x0000000008012254 0x4 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libm.a(lib_a-wf_atan2.o) + 0x0000000008012254 atan2f + .text.powf 0x0000000008012258 0x344 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libm.a(lib_a-wf_pow.o) + 0x0000000008012258 powf .text.__ieee754_asinf - 0x0000000008011784 0x1f8 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libm.a(lib_a-ef_asin.o) - 0x0000000008011784 __ieee754_asinf + 0x000000000801259c 0x1f8 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libm.a(lib_a-ef_asin.o) + 0x000000000801259c __ieee754_asinf .text.__ieee754_atan2f - 0x000000000801197c 0x16c /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libm.a(lib_a-ef_atan2.o) - 0x000000000801197c __ieee754_atan2f + 0x0000000008012794 0x16c /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libm.a(lib_a-ef_atan2.o) + 0x0000000008012794 __ieee754_atan2f .text.__ieee754_powf - 0x0000000008011ae8 0x5f0 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libm.a(lib_a-ef_pow.o) - 0x0000000008011ae8 __ieee754_powf + 0x0000000008012900 0x5f0 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libm.a(lib_a-ef_pow.o) + 0x0000000008012900 __ieee754_powf .text.__ieee754_rem_pio2f - 0x00000000080120d8 0x290 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libm.a(lib_a-ef_rem_pio2.o) - 0x00000000080120d8 __ieee754_rem_pio2f + 0x0000000008012ef0 0x290 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libm.a(lib_a-ef_rem_pio2.o) + 0x0000000008012ef0 __ieee754_rem_pio2f .text.__ieee754_sqrtf - 0x0000000008012368 0xa4 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libm.a(lib_a-ef_sqrt.o) - 0x0000000008012368 __ieee754_sqrtf + 0x0000000008013180 0xa4 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libm.a(lib_a-ef_sqrt.o) + 0x0000000008013180 __ieee754_sqrtf .text.__kernel_cosf - 0x000000000801240c 0x104 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libm.a(lib_a-kf_cos.o) - 0x000000000801240c __kernel_cosf + 0x0000000008013224 0x104 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libm.a(lib_a-kf_cos.o) + 0x0000000008013224 __kernel_cosf .text.__kernel_rem_pio2f - 0x0000000008012510 0x5e4 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libm.a(lib_a-kf_rem_pio2.o) - 0x0000000008012510 __kernel_rem_pio2f + 0x0000000008013328 0x5e4 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libm.a(lib_a-kf_rem_pio2.o) + 0x0000000008013328 __kernel_rem_pio2f .text.__kernel_sinf - 0x0000000008012af4 0x90 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libm.a(lib_a-kf_sin.o) - 0x0000000008012af4 __kernel_sinf + 0x000000000801390c 0x90 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libm.a(lib_a-kf_sin.o) + 0x000000000801390c __kernel_sinf .text.__kernel_tanf - 0x0000000008012b84 0x1d0 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libm.a(lib_a-kf_tan.o) - 0x0000000008012b84 __kernel_tanf - .text.matherr 0x0000000008012d54 0x4 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libm.a(lib_a-s_matherr.o) - 0x0000000008012d54 matherr - .text.nan 0x0000000008012d58 0x10 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libm.a(lib_a-s_nan.o) - 0x0000000008012d58 nan - .text.rint 0x0000000008012d68 0x124 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libm.a(lib_a-s_rint.o) - 0x0000000008012d68 rint - .text.finitef 0x0000000008012e8c 0x14 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libm.a(lib_a-sf_finite.o) - 0x0000000008012e8c finitef - .text.floorf 0x0000000008012ea0 0x90 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libm.a(lib_a-sf_floor.o) - 0x0000000008012ea0 floorf + 0x000000000801399c 0x1d0 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libm.a(lib_a-kf_tan.o) + 0x000000000801399c __kernel_tanf + .text.matherr 0x0000000008013b6c 0x4 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libm.a(lib_a-s_matherr.o) + 0x0000000008013b6c matherr + .text.nan 0x0000000008013b70 0x10 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libm.a(lib_a-s_nan.o) + 0x0000000008013b70 nan + .text.rint 0x0000000008013b80 0x124 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libm.a(lib_a-s_rint.o) + 0x0000000008013b80 rint + .text.finitef 0x0000000008013ca4 0x14 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libm.a(lib_a-sf_finite.o) + 0x0000000008013ca4 finitef + .text.floorf 0x0000000008013cb8 0x90 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libm.a(lib_a-sf_floor.o) + 0x0000000008013cb8 floorf .text.__fpclassifyf - 0x0000000008012f30 0x38 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libm.a(lib_a-sf_fpclassify.o) - 0x0000000008012f30 __fpclassifyf - .text.nanf 0x0000000008012f68 0xc /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libm.a(lib_a-sf_nan.o) - 0x0000000008012f68 nanf - .text.scalbnf 0x0000000008012f74 0xd0 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libm.a(lib_a-sf_scalbn.o) - 0x0000000008012f74 scalbnf + 0x0000000008013d48 0x38 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libm.a(lib_a-sf_fpclassify.o) + 0x0000000008013d48 __fpclassifyf + .text.nanf 0x0000000008013d80 0xc /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libm.a(lib_a-sf_nan.o) + 0x0000000008013d80 nanf + .text.scalbnf 0x0000000008013d8c 0xd0 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libm.a(lib_a-sf_scalbn.o) + 0x0000000008013d8c scalbnf .text.copysignf - 0x0000000008013044 0x18 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libm.a(lib_a-sf_copysign.o) - 0x0000000008013044 copysignf - .text.__errno 0x000000000801305c 0xc /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libc_nano.a(lib_a-errno.o) - 0x000000000801305c __errno - .text.memcpy 0x0000000008013068 0x16 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libc_nano.a(lib_a-memcpy.o) - 0x0000000008013068 memcpy - .text.memset 0x000000000801307e 0x10 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libc_nano.a(lib_a-memset.o) - 0x000000000801307e memset - .text.strcpy 0x000000000801308e 0x10 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libc_nano.a(lib_a-strcpy.o) - 0x000000000801308e strcpy - .text.strlen 0x000000000801309e 0x10 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libc_nano.a(lib_a-strlen.o) - 0x000000000801309e strlen - .text.strncpy 0x00000000080130ae 0x24 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libc_nano.a(lib_a-strncpy.o) - 0x00000000080130ae strncpy + 0x0000000008013e5c 0x18 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libm.a(lib_a-sf_copysign.o) + 0x0000000008013e5c copysignf + .text.__errno 0x0000000008013e74 0xc /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libc_nano.a(lib_a-errno.o) + 0x0000000008013e74 __errno + .text.memcpy 0x0000000008013e80 0x16 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libc_nano.a(lib_a-memcpy.o) + 0x0000000008013e80 memcpy + .text.memset 0x0000000008013e96 0x10 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libc_nano.a(lib_a-memset.o) + 0x0000000008013e96 memset + .text.strcpy 0x0000000008013ea6 0x10 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libc_nano.a(lib_a-strcpy.o) + 0x0000000008013ea6 strcpy + .text.strlen 0x0000000008013eb6 0x10 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libc_nano.a(lib_a-strlen.o) + 0x0000000008013eb6 strlen + .text.strncpy 0x0000000008013ec6 0x24 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libc_nano.a(lib_a-strncpy.o) + 0x0000000008013ec6 strncpy *(.rodata) - .rodata 0x00000000080130d2 0xa bin/neopixelring.o + .rodata 0x0000000008013eea 0x28 bin/deck_info.o + .rodata 0x0000000008013f12 0xa bin/ledring12.o *(.rodata*) .rodata.str1.1 - 0x00000000080130dc 0x12a bin/tasks.o + 0x0000000008013f1c 0x240 bin/tasks.o .rodata.str1.1 - 0x0000000008013206 0xd9 bin/queue.o - 0xe8 (size before relaxing) + 0x000000000801415c 0x204 bin/queue.o + 0x213 (size before relaxing) .rodata.str1.1 - 0x00000000080132df 0x67 bin/timers.o - 0x6f (size before relaxing) + 0x0000000008014360 0x7f bin/timers.o + 0x87 (size before relaxing) .rodata.str1.1 - 0x0000000008013346 0x97 bin/nvic.o - *fill* 0x00000000080133dd 0x3 + 0x00000000080143df 0xf6 bin/heap_4.o + .rodata.str1.1 + 0x00000000080144d5 0x159 bin/port.o + .rodata.str1.1 + 0x000000000801462e 0x97 bin/nvic.o + *fill* 0x00000000080146c5 0x3 .rodata.CONN_M4 - 0x00000000080133e0 0x44 bin/motors.o + 0x00000000080146c8 0x44 bin/motors.o .rodata.DECK_RX2_TIM2 - 0x0000000008013424 0x44 bin/motors.o + 0x000000000801470c 0x44 bin/motors.o .rodata.testsound - 0x0000000008013468 0x8 bin/motors.o + 0x0000000008014750 0x8 bin/motors.o .rodata.DECK_TX2_TIM2 - 0x0000000008013470 0x44 bin/motors.o + 0x0000000008014758 0x44 bin/motors.o .rodata.CONN_M1 - 0x00000000080134b4 0x44 bin/motors.o + 0x000000000801479c 0x44 bin/motors.o .rodata.str1.1 - 0x00000000080134f8 0x28 bin/motors.o + 0x00000000080147e0 0x28 bin/motors.o .rodata.MOTORS - 0x0000000008013520 0x10 bin/motors.o - 0x0000000008013520 MOTORS + 0x0000000008014808 0x10 bin/motors.o + 0x0000000008014808 MOTORS .rodata.CONN_M2 - 0x0000000008013530 0x44 bin/motors.o + 0x0000000008014818 0x44 bin/motors.o .rodata.CONN_M3 - 0x0000000008013574 0x44 bin/motors.o + 0x000000000801485c 0x44 bin/motors.o .rodata.DECK_IO2 - 0x00000000080135b8 0x44 bin/motors.o + 0x00000000080148a0 0x44 bin/motors.o .rodata.DECK_IO3 - 0x00000000080135fc 0x44 bin/motors.o + 0x00000000080148e4 0x44 bin/motors.o .rodata.str1.1 - 0x0000000008013640 0x67 bin/crtp.o + 0x0000000008014928 0x67 bin/crtp.o 0x69 (size before relaxing) - *fill* 0x00000000080136a7 0x1 + *fill* 0x000000000801498f 0x1 .rodata.sequences - 0x00000000080136a8 0x28 bin/ledseq.o + 0x0000000008014990 0x28 bin/ledseq.o .rodata.str1.1 - 0x00000000080136d0 0xc bin/ledseq.o + 0x00000000080149b8 0xc bin/ledseq.o .rodata.str1.1 - 0x00000000080136dc 0x23 bin/freeRTOSdebug.o + 0x00000000080149c4 0x23 bin/freeRTOSdebug.o .rodata.str1.1 - 0x00000000080136ff 0x122 bin/system.o + 0x00000000080149e7 0x122 bin/system.o 0x12a (size before relaxing) .rodata.fullMsg - 0x0000000008013821 0x5 bin/console.o + 0x0000000008014b09 0x5 bin/console.o .rodata.str1.1 - 0x0000000008013826 0x13 bin/crtpservice.o + 0x0000000008014b0e 0x13 bin/crtpservice.o .rodata.str1.1 - 0x0000000008013839 0x6 bin/param.o + 0x0000000008014b21 0x6 bin/param.o 0x7 (size before relaxing) .rodata.str1.1 - 0x000000000801383f 0x4 bin/mem.o + 0x0000000008014b27 0x4 bin/mem.o .rodata.eepromSerialNum - 0x0000000008013843 0x8 bin/mem.o + 0x0000000008014b2b 0x8 bin/mem.o .rodata.str1.1 - 0x000000000801384b 0x4e bin/commander.o + 0x0000000008014b33 0x4e bin/commander.o 0x59 (size before relaxing) .rodata.str1.1 - 0x0000000008013899 0x68 bin/controller.o + 0x0000000008014b81 0x68 bin/controller.o 0x7e (size before relaxing) .rodata.str1.1 - 0x0000000008013901 0x13 bin/sensfusion6.o + 0x0000000008014be9 0x13 bin/sensfusion6.o 0x27 (size before relaxing) .rodata.str1.1 - 0x0000000008013914 0x1a1 bin/stabilizer.o - 0x1e8 (size before relaxing) + 0x0000000008014bfc 0x1a8 bin/stabilizer.o + 0x1ef (size before relaxing) .rodata.str1.1 - 0x0000000008013ab5 0x2f bin/log.o + 0x0000000008014da4 0x2f bin/log.o 0x30 (size before relaxing) .rodata.typeLength - 0x0000000008013ae4 0x9 bin/log.o - .rodata.digit 0x0000000008013aed 0x10 bin/eprintf.o + 0x0000000008014dd3 0x9 bin/log.o + .rodata.str1.1 + 0x0000000008014ddc 0x59 bin/cfassert.o + 0x5a (size before relaxing) + .rodata.digit 0x0000000008014e35 0x10 bin/eprintf.o .rodata.V_MODIFIED - 0x0000000008013afd 0x1 bin/version.o - 0x0000000008013afd V_MODIFIED + 0x0000000008014e45 0x1 bin/version.o + 0x0000000008014e45 V_MODIFIED .rodata.str1.1 - 0x0000000008013afe 0x65 bin/version.o + 0x0000000008014e46 0x65 bin/version.o 0x6e (size before relaxing) - *fill* 0x0000000008013b63 0x1 + *fill* 0x0000000008014eab 0x1 .rodata.V_REVISION_0 - 0x0000000008013b64 0x4 bin/version.o - 0x0000000008013b64 V_REVISION_0 + 0x0000000008014eac 0x4 bin/version.o + 0x0000000008014eac V_REVISION_0 .rodata.V_REVISION_1 - 0x0000000008013b68 0x2 bin/version.o - 0x0000000008013b68 V_REVISION_1 + 0x0000000008014eb0 0x2 bin/version.o + 0x0000000008014eb0 V_REVISION_1 + *fill* 0x0000000008014eb2 0x2 + .rodata.uxTopUsedPriority + 0x0000000008014eb4 0x4 bin/FreeRTOS-openocd.o + 0x0000000008014eb4 uxTopUsedPriority .rodata.CPAL_I2C_SCL_GPIO_PINSOURCE - 0x0000000008013b6a 0x6 bin/cpal_i2c_hal_stm32f4xx.o - 0x0000000008013b6a CPAL_I2C_SCL_GPIO_PINSOURCE + 0x0000000008014eb8 0x6 bin/cpal_i2c_hal_stm32f4xx.o + 0x0000000008014eb8 CPAL_I2C_SCL_GPIO_PINSOURCE .rodata.I2C_IT_DMATX_SUBPRIO - 0x0000000008013b70 0x3 bin/cpal_i2c_hal_stm32f4xx.o - 0x0000000008013b70 I2C_IT_DMATX_SUBPRIO + 0x0000000008014ebe 0x3 bin/cpal_i2c_hal_stm32f4xx.o + 0x0000000008014ebe I2C_IT_DMATX_SUBPRIO .rodata.I2C_IT_EVT_SUBPRIO - 0x0000000008013b73 0x3 bin/cpal_i2c_hal_stm32f4xx.o - 0x0000000008013b73 I2C_IT_EVT_SUBPRIO - *fill* 0x0000000008013b76 0x2 + 0x0000000008014ec1 0x3 bin/cpal_i2c_hal_stm32f4xx.o + 0x0000000008014ec1 I2C_IT_EVT_SUBPRIO .rodata.CPAL_I2C_DMA_TX_HT_FLAG - 0x0000000008013b78 0xc bin/cpal_i2c_hal_stm32f4xx.o - 0x0000000008013b78 CPAL_I2C_DMA_TX_HT_FLAG + 0x0000000008014ec4 0xc bin/cpal_i2c_hal_stm32f4xx.o + 0x0000000008014ec4 CPAL_I2C_DMA_TX_HT_FLAG .rodata.CPAL_I2C_IT_ERR_IRQn - 0x0000000008013b84 0x3 bin/cpal_i2c_hal_stm32f4xx.o - 0x0000000008013b84 CPAL_I2C_IT_ERR_IRQn - *fill* 0x0000000008013b87 0x1 + 0x0000000008014ed0 0x3 bin/cpal_i2c_hal_stm32f4xx.o + 0x0000000008014ed0 CPAL_I2C_IT_ERR_IRQn + *fill* 0x0000000008014ed3 0x1 .rodata.CPAL_I2C_SDA_GPIO_PIN - 0x0000000008013b88 0x6 bin/cpal_i2c_hal_stm32f4xx.o - 0x0000000008013b88 CPAL_I2C_SDA_GPIO_PIN - *fill* 0x0000000008013b8e 0x2 + 0x0000000008014ed4 0x6 bin/cpal_i2c_hal_stm32f4xx.o + 0x0000000008014ed4 CPAL_I2C_SDA_GPIO_PIN + *fill* 0x0000000008014eda 0x2 .rodata.CPAL_I2C_DMA_RX_TC_FLAG - 0x0000000008013b90 0xc bin/cpal_i2c_hal_stm32f4xx.o - 0x0000000008013b90 CPAL_I2C_DMA_RX_TC_FLAG + 0x0000000008014edc 0xc bin/cpal_i2c_hal_stm32f4xx.o + 0x0000000008014edc CPAL_I2C_DMA_RX_TC_FLAG .rodata.CPAL_I2C_IT_EVT_IRQn - 0x0000000008013b9c 0x3 bin/cpal_i2c_hal_stm32f4xx.o - 0x0000000008013b9c CPAL_I2C_IT_EVT_IRQn + 0x0000000008014ee8 0x3 bin/cpal_i2c_hal_stm32f4xx.o + 0x0000000008014ee8 CPAL_I2C_IT_EVT_IRQn .rodata.I2C_IT_ERR_PREPRIO - 0x0000000008013b9f 0x3 bin/cpal_i2c_hal_stm32f4xx.o - 0x0000000008013b9f I2C_IT_ERR_PREPRIO + 0x0000000008014eeb 0x3 bin/cpal_i2c_hal_stm32f4xx.o + 0x0000000008014eeb I2C_IT_ERR_PREPRIO .rodata.I2C_IT_DMARX_PREPRIO - 0x0000000008013ba2 0x3 bin/cpal_i2c_hal_stm32f4xx.o - 0x0000000008013ba2 I2C_IT_DMARX_PREPRIO - *fill* 0x0000000008013ba5 0x1 + 0x0000000008014eee 0x3 bin/cpal_i2c_hal_stm32f4xx.o + 0x0000000008014eee I2C_IT_DMARX_PREPRIO + *fill* 0x0000000008014ef1 0x1 .rodata.CPAL_I2C_SCL_GPIO_PIN - 0x0000000008013ba6 0x6 bin/cpal_i2c_hal_stm32f4xx.o - 0x0000000008013ba6 CPAL_I2C_SCL_GPIO_PIN + 0x0000000008014ef2 0x6 bin/cpal_i2c_hal_stm32f4xx.o + 0x0000000008014ef2 CPAL_I2C_SCL_GPIO_PIN .rodata.CPAL_I2C_AF - 0x0000000008013bac 0xc bin/cpal_i2c_hal_stm32f4xx.o - 0x0000000008013bac CPAL_I2C_AF + 0x0000000008014ef8 0xc bin/cpal_i2c_hal_stm32f4xx.o + 0x0000000008014ef8 CPAL_I2C_AF .rodata.CPAL_I2C_DMA_RX_IRQn - 0x0000000008013bb8 0x3 bin/cpal_i2c_hal_stm32f4xx.o - 0x0000000008013bb8 CPAL_I2C_DMA_RX_IRQn - *fill* 0x0000000008013bbb 0x1 + 0x0000000008014f04 0x3 bin/cpal_i2c_hal_stm32f4xx.o + 0x0000000008014f04 CPAL_I2C_DMA_RX_IRQn + *fill* 0x0000000008014f07 0x1 .rodata.CPAL_I2C_DMA_TX_TE_FLAG - 0x0000000008013bbc 0xc bin/cpal_i2c_hal_stm32f4xx.o - 0x0000000008013bbc CPAL_I2C_DMA_TX_TE_FLAG + 0x0000000008014f08 0xc bin/cpal_i2c_hal_stm32f4xx.o + 0x0000000008014f08 CPAL_I2C_DMA_TX_TE_FLAG .rodata.CPAL_I2C_DMA_TX_TC_FLAG - 0x0000000008013bc8 0xc bin/cpal_i2c_hal_stm32f4xx.o - 0x0000000008013bc8 CPAL_I2C_DMA_TX_TC_FLAG + 0x0000000008014f14 0xc bin/cpal_i2c_hal_stm32f4xx.o + 0x0000000008014f14 CPAL_I2C_DMA_TX_TC_FLAG .rodata.CPAL_I2C_DMA_TX_IRQn - 0x0000000008013bd4 0x3 bin/cpal_i2c_hal_stm32f4xx.o - 0x0000000008013bd4 CPAL_I2C_DMA_TX_IRQn + 0x0000000008014f20 0x3 bin/cpal_i2c_hal_stm32f4xx.o + 0x0000000008014f20 CPAL_I2C_DMA_TX_IRQn .rodata.I2C_IT_DMATX_PREPRIO - 0x0000000008013bd7 0x3 bin/cpal_i2c_hal_stm32f4xx.o - 0x0000000008013bd7 I2C_IT_DMATX_PREPRIO - *fill* 0x0000000008013bda 0x2 + 0x0000000008014f23 0x3 bin/cpal_i2c_hal_stm32f4xx.o + 0x0000000008014f23 I2C_IT_DMATX_PREPRIO + *fill* 0x0000000008014f26 0x2 .rodata.CPAL_I2C_DMA_RX_TE_FLAG - 0x0000000008013bdc 0xc bin/cpal_i2c_hal_stm32f4xx.o - 0x0000000008013bdc CPAL_I2C_DMA_RX_TE_FLAG + 0x0000000008014f28 0xc bin/cpal_i2c_hal_stm32f4xx.o + 0x0000000008014f28 CPAL_I2C_DMA_RX_TE_FLAG .rodata.I2C_IT_EVT_PREPRIO - 0x0000000008013be8 0x3 bin/cpal_i2c_hal_stm32f4xx.o - 0x0000000008013be8 I2C_IT_EVT_PREPRIO - *fill* 0x0000000008013beb 0x1 + 0x0000000008014f34 0x3 bin/cpal_i2c_hal_stm32f4xx.o + 0x0000000008014f34 I2C_IT_EVT_PREPRIO + *fill* 0x0000000008014f37 0x1 .rodata.CPAL_I2C_SDA_GPIO_PINSOURCE - 0x0000000008013bec 0x6 bin/cpal_i2c_hal_stm32f4xx.o - 0x0000000008013bec CPAL_I2C_SDA_GPIO_PINSOURCE + 0x0000000008014f38 0x6 bin/cpal_i2c_hal_stm32f4xx.o + 0x0000000008014f38 CPAL_I2C_SDA_GPIO_PINSOURCE .rodata.I2C_IT_ERR_SUBPRIO - 0x0000000008013bf2 0x3 bin/cpal_i2c_hal_stm32f4xx.o - 0x0000000008013bf2 I2C_IT_ERR_SUBPRIO + 0x0000000008014f3e 0x3 bin/cpal_i2c_hal_stm32f4xx.o + 0x0000000008014f3e I2C_IT_ERR_SUBPRIO .rodata.I2C_IT_DMARX_SUBPRIO - 0x0000000008013bf5 0x3 bin/cpal_i2c_hal_stm32f4xx.o - 0x0000000008013bf5 I2C_IT_DMARX_SUBPRIO + 0x0000000008014f41 0x3 bin/cpal_i2c_hal_stm32f4xx.o + 0x0000000008014f41 I2C_IT_DMARX_SUBPRIO .rodata.CPAL_I2C_SDA_GPIO_CLK - 0x0000000008013bf8 0xc bin/cpal_i2c_hal_stm32f4xx.o - 0x0000000008013bf8 CPAL_I2C_SDA_GPIO_CLK + 0x0000000008014f44 0xc bin/cpal_i2c_hal_stm32f4xx.o + 0x0000000008014f44 CPAL_I2C_SDA_GPIO_CLK .rodata.CPAL_I2C_DR - 0x0000000008013c04 0xc bin/cpal_i2c_hal_stm32f4xx.o - 0x0000000008013c04 CPAL_I2C_DR + 0x0000000008014f50 0xc bin/cpal_i2c_hal_stm32f4xx.o + 0x0000000008014f50 CPAL_I2C_DR .rodata.CPAL_I2C_DMA_CLK - 0x0000000008013c10 0xc bin/cpal_i2c_hal_stm32f4xx.o - 0x0000000008013c10 CPAL_I2C_DMA_CLK + 0x0000000008014f5c 0xc bin/cpal_i2c_hal_stm32f4xx.o + 0x0000000008014f5c CPAL_I2C_DMA_CLK .rodata.CPAL_I2C_DMA_RX_HT_FLAG - 0x0000000008013c1c 0xc bin/cpal_i2c_hal_stm32f4xx.o - 0x0000000008013c1c CPAL_I2C_DMA_RX_HT_FLAG + 0x0000000008014f68 0xc bin/cpal_i2c_hal_stm32f4xx.o + 0x0000000008014f68 CPAL_I2C_DMA_RX_HT_FLAG .rodata.CPAL_I2C_DMA_CHANNEL - 0x0000000008013c28 0xc bin/cpal_i2c_hal_stm32f4xx.o - 0x0000000008013c28 CPAL_I2C_DMA_CHANNEL + 0x0000000008014f74 0xc bin/cpal_i2c_hal_stm32f4xx.o + 0x0000000008014f74 CPAL_I2C_DMA_CHANNEL .rodata.CPAL_I2C_SCL_GPIO_CLK - 0x0000000008013c34 0xc bin/cpal_i2c_hal_stm32f4xx.o - 0x0000000008013c34 CPAL_I2C_SCL_GPIO_CLK + 0x0000000008014f80 0xc bin/cpal_i2c_hal_stm32f4xx.o + 0x0000000008014f80 CPAL_I2C_SCL_GPIO_CLK .rodata.CPAL_I2C_CLK - 0x0000000008013c40 0xc bin/cpal_i2c_hal_stm32f4xx.o - 0x0000000008013c40 CPAL_I2C_CLK + 0x0000000008014f8c 0xc bin/cpal_i2c_hal_stm32f4xx.o + 0x0000000008014f8c CPAL_I2C_CLK .rodata.led_polarity - 0x0000000008013c4c 0x14 bin/led_f405.o + 0x0000000008014f98 0x14 bin/led_f405.o .rodata.led_pin - 0x0000000008013c60 0x14 bin/led_f405.o + 0x0000000008014fac 0x14 bin/led_f405.o .rodata.led_port - 0x0000000008013c74 0x14 bin/led_f405.o + 0x0000000008014fc0 0x14 bin/led_f405.o .rodata.mpu6500StTb - 0x0000000008013c88 0x200 bin/mpu6500.o + 0x0000000008014fd4 0x200 bin/mpu6500.o .rodata.str1.1 - 0x0000000008013e88 0x89 bin/mpu6500.o + 0x00000000080151d4 0x89 bin/mpu6500.o .rodata.str1.1 - 0x0000000008013f11 0x1f bin/i2cdev_f405.o + 0x000000000801525d 0x6d bin/i2cdev_f405.o + 0x6e (size before relaxing) .rodata.str1.1 - 0x0000000008013f30 0x6c bin/lps25h.o + 0x00000000080152ca 0x6c bin/lps25h.o 0x75 (size before relaxing) .rodata.str1.1 - 0x0000000008013f9c 0x57 bin/ak8963.o + 0x0000000008015336 0x57 bin/ak8963.o 0x5d (size before relaxing) .rodata.str1.1 - 0x0000000008013ff3 0x3e bin/eeprom.o + 0x000000000801538d 0x3e bin/eeprom.o .rodata.str1.1 - 0x0000000008014031 0x16 bin/sonar.o + 0x00000000080153cb 0x3a bin/watchdog.o + .rodata.str1.1 + 0x0000000008015405 0x16 bin/sonar.o 0x1c (size before relaxing) .rodata.str1.1 - 0x0000000008014047 0x30 bin/usblink.o + 0x000000000801541b 0x30 bin/usblink.o .rodata.str1.1 - 0x0000000008014077 0x59 bin/usbd_desc.o + 0x000000000801544b 0x59 bin/usbd_desc.o 0x67 (size before relaxing) .rodata.bin2hex - 0x00000000080140d0 0x10 bin/usbd_desc.o + 0x00000000080154a4 0x10 bin/usbd_desc.o .rodata.str1.1 - 0x00000000080140e0 0x1d0 bin/imu_cf2.o + 0x00000000080154b4 0x1d0 bin/imu_cf2.o 0x200 (size before relaxing) .rodata.bat671723HS25C - 0x00000000080142b0 0x28 bin/pm_f405.o + 0x0000000008015684 0x28 bin/pm_f405.o .rodata.str1.1 - 0x00000000080142d8 0x29 bin/pm_f405.o + 0x00000000080156ac 0x29 bin/pm_f405.o 0x2c (size before relaxing) .rodata.str1.1 - 0x0000000008014301 0x4d bin/syslink.o + 0x00000000080156d5 0x4d bin/syslink.o 0x4f (size before relaxing) .rodata.str1.1 - 0x000000000801434e 0x37 bin/radiolink.o + 0x0000000008015722 0x37 bin/radiolink.o 0x5b (size before relaxing) .rodata.str1.1 - 0x0000000008014385 0xaa bin/ow_syslink.o + 0x0000000008015759 0xaa bin/ow_syslink.o 0xc0 (size before relaxing) - .rodata.blueRing - 0x000000000801442f 0x24 bin/neopixelring.o - .rodata.colorRing - 0x0000000008014453 0x24 bin/neopixelring.o + *fill* 0x0000000008015803 0x1 + .rodata.starwars + 0x0000000008015804 0x148 bin/sound_cf2.o + .rodata.usb_connect + 0x000000000801594c 0x148 bin/sound_cf2.o + .rodata.usb_disconnect + 0x0000000008015a94 0x148 bin/sound_cf2.o + .rodata.calibrated + 0x0000000008015bdc 0x148 bin/sound_cf2.o + .rodata.range_fast + 0x0000000008015d24 0x148 bin/sound_cf2.o + .rodata.lowbatt + 0x0000000008015e6c 0x148 bin/sound_cf2.o .rodata.str1.1 - 0x0000000008014477 0x6a bin/neopixelring.o - 0xa6 (size before relaxing) - .rodata.greenRing - 0x00000000080144e1 0x24 bin/neopixelring.o - .rodata.test_pat - 0x0000000008014505 0x9 bin/neopixelring.o + 0x0000000008015fb4 0x29 bin/sound_cf2.o + 0x4c (size before relaxing) + *fill* 0x0000000008015fdd 0x3 + .rodata.range_slow + 0x0000000008015fe0 0x148 bin/sound_cf2.o + .rodata.chg_done + 0x0000000008016128 0x148 bin/sound_cf2.o + .rodata.startup + 0x0000000008016270 0x148 bin/sound_cf2.o + .rodata.str1.1 + 0x00000000080163b8 0x5f bin/deck.o + .rodata.str1.1 + 0x0000000008016417 0x2e8 bin/deck_info.o + 0x2ea (size before relaxing) + .rodata.str1.1 + 0x00000000080166ff 0x20 bin/deck_drivers.o + *fill* 0x000000000801671f 0x1 + .rodata.buzzer_deck + 0x0000000008016720 0x18 bin/buzzdeck.o .rodata.str1.1 - 0x000000000801450e 0x158 bin/expbrd.o + 0x0000000008016738 0x9 bin/buzzdeck.o .rodata.str1.1 - 0x0000000008014666 0x22 bin/bigquad.o + 0x0000000008016741 0x2c bin/bigquad.o + *fill* 0x000000000801676d 0x3 + .rodata.bigquad_deck + 0x0000000008016770 0x18 bin/bigquad.o .rodata.str1.1 - 0x0000000008014688 0x19 bin/exptest.o + 0x0000000008016788 0x23 bin/exptest.o + *fill* 0x00000000080167ab 0x1 + .rodata.exptest_deck + 0x00000000080167ac 0x18 bin/exptest.o + .rodata.blueRing + 0x00000000080167c4 0x24 bin/ledring12.o + .rodata.colorRing + 0x00000000080167e8 0x24 bin/ledring12.o + .rodata.ledring12_deck + 0x000000000801680c 0x18 bin/ledring12.o + .rodata.str1.1 + 0x0000000008016824 0x6c bin/ledring12.o + 0xb0 (size before relaxing) + .rodata.test_pat + 0x0000000008016890 0x9 bin/ledring12.o + .rodata.greenRing + 0x0000000008016899 0x24 bin/ledring12.o .rodata.str1.1 - 0x00000000080146a1 0x3d bin/configblockeeprom.o - *fill* 0x00000000080146de 0x2 + 0x00000000080168bd 0x3d bin/configblockeeprom.o + *fill* 0x00000000080168fa 0x2 .rodata.atanlo - 0x00000000080146e0 0x10 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libm.a(lib_a-sf_atan.o) + 0x00000000080168fc 0x10 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libm.a(lib_a-sf_atan.o) .rodata.atanhi - 0x00000000080146f0 0x10 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libm.a(lib_a-sf_atan.o) + 0x000000000801690c 0x10 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libm.a(lib_a-sf_atan.o) .rodata.str1.4 - 0x0000000008014700 0x6 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libm.a(lib_a-wf_asin.o) + 0x000000000801691c 0x6 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libm.a(lib_a-wf_asin.o) 0x9 (size before relaxing) - *fill* 0x0000000008014706 0x2 + *fill* 0x0000000008016922 0x2 .rodata.str1.4 - 0x0000000008014708 0x8 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libm.a(lib_a-wf_pow.o) + 0x0000000008016924 0x8 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libm.a(lib_a-wf_pow.o) 0x5 (size before relaxing) - .rodata.dp_h 0x0000000008014710 0x8 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libm.a(lib_a-ef_pow.o) - .rodata.dp_l 0x0000000008014718 0x8 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libm.a(lib_a-ef_pow.o) - .rodata.bp 0x0000000008014720 0x8 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libm.a(lib_a-ef_pow.o) + .rodata.dp_h 0x000000000801692c 0x8 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libm.a(lib_a-ef_pow.o) + .rodata.dp_l 0x0000000008016934 0x8 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libm.a(lib_a-ef_pow.o) + .rodata.bp 0x000000000801693c 0x8 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libm.a(lib_a-ef_pow.o) .rodata.str1.4 0x0000000000000000 0x1 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libm.a(lib_a-ef_pow.o) .rodata.npio2_hw - 0x0000000008014728 0x80 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libm.a(lib_a-ef_rem_pio2.o) + 0x0000000008016944 0x80 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libm.a(lib_a-ef_rem_pio2.o) .rodata.two_over_pi - 0x00000000080147a8 0x318 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libm.a(lib_a-ef_rem_pio2.o) + 0x00000000080169c4 0x318 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libm.a(lib_a-ef_rem_pio2.o) .rodata.init_jk - 0x0000000008014ac0 0xc /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libm.a(lib_a-kf_rem_pio2.o) - .rodata.PIo2 0x0000000008014acc 0x2c /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libm.a(lib_a-kf_rem_pio2.o) - .rodata.TWO52 0x0000000008014af8 0x10 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libm.a(lib_a-s_rint.o) + 0x0000000008016cdc 0xc /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libm.a(lib_a-kf_rem_pio2.o) + .rodata.PIo2 0x0000000008016ce8 0x2c /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libm.a(lib_a-kf_rem_pio2.o) + *fill* 0x0000000008016d14 0x4 + .rodata.TWO52 0x0000000008016d18 0x10 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libm.a(lib_a-s_rint.o) .rodata._ctype_ - 0x0000000008014b08 0x101 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libc_nano.a(lib_a-ctype_.o) - 0x0000000008014b08 _ctype_ + 0x0000000008016d28 0x101 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libc_nano.a(lib_a-ctype_.o) + 0x0000000008016d28 _ctype_ .rodata.str1.1 - 0x0000000008014c09 0x2 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libc_nano.a(lib_a-impure.o) + 0x0000000008016e29 0x2 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libc_nano.a(lib_a-impure.o) *(.glue_7) .glue_7 0x0000000000000000 0x0 linker stubs *(.glue_7t) @@ -12090,75 +13249,92 @@ LOAD /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none- *(.init) *(.fini) *(.eh_frame) - 0x0000000008014c0c . = ALIGN (0x4) - *fill* 0x0000000008014c0b 0x1 - 0x0000000008014c0c _param_start = . + 0x0000000008016e2c . = ALIGN (0x4) + *fill* 0x0000000008016e2b 0x1 + 0x0000000008016e2c _param_start = . *(.param) *(.param.*) - .param.cpu 0x0000000008014c0c 0x48 bin/system.o - .param.system 0x0000000008014c54 0x24 bin/system.o + .param.cpu 0x0000000008016e2c 0x48 bin/system.o + .param.system 0x0000000008016e74 0x24 bin/system.o .param.flightmode - 0x0000000008014c78 0x60 bin/commander.o + 0x0000000008016e98 0x60 bin/commander.o .param.pid_rate - 0x0000000008014cd8 0x84 bin/controller.o + 0x0000000008016ef8 0x84 bin/controller.o .param.pid_attitude - 0x0000000008014d5c 0x84 bin/controller.o + 0x0000000008016f7c 0x84 bin/controller.o .param.sensorfusion6 - 0x0000000008014de0 0x30 bin/sensfusion6.o + 0x0000000008017000 0x30 bin/sensfusion6.o .param.altHold - 0x0000000008014e10 0xfc bin/stabilizer.o + 0x0000000008017030 0x108 bin/stabilizer.o .param.firmware - 0x0000000008014f0c 0x3c bin/version.o + 0x0000000008017138 0x3c bin/version.o .param.imu_sensors - 0x0000000008014f48 0x30 bin/imu_cf2.o + 0x0000000008017174 0x30 bin/imu_cf2.o .param.imu_tests - 0x0000000008014f78 0x3c bin/imu_cf2.o + 0x00000000080171a4 0x3c bin/imu_cf2.o .param.imu_acc_lpf - 0x0000000008014fb4 0x24 bin/imu_cf2.o - .param.ring 0x0000000008014fd8 0x84 bin/neopixelring.o - 0x000000000801505c _param_stop = . - 0x000000000801505c . = ALIGN (0x4) - 0x000000000801505c _log_start = . + 0x00000000080171e0 0x24 bin/imu_cf2.o + .param.sound 0x0000000008017204 0x48 bin/sound_cf2.o + .param.ring 0x000000000801724c 0x84 bin/ledring12.o + 0x00000000080172d0 _param_stop = . + 0x00000000080172d0 . = ALIGN (0x4) + 0x00000000080172d0 _log_start = . *(.log) *(.log.*) - .log.sys 0x000000000801505c 0x24 bin/system.o - .log.acc 0x0000000008015080 0x54 bin/stabilizer.o - .log.baro 0x00000000080150d4 0x54 bin/stabilizer.o - .log.motor 0x0000000008015128 0x48 bin/stabilizer.o + .log.sys 0x00000000080172d0 0x24 bin/system.o + .log.acc 0x00000000080172f4 0x54 bin/stabilizer.o + .log.baro 0x0000000008017348 0x54 bin/stabilizer.o + .log.motor 0x000000000801739c 0x48 bin/stabilizer.o .log.stabilizer - 0x0000000008015170 0x48 bin/stabilizer.o - .log.altHold 0x00000000080151b8 0x60 bin/stabilizer.o - .log.gyro 0x0000000008015218 0x3c bin/stabilizer.o - .log.vpid 0x0000000008015254 0x48 bin/stabilizer.o - .log.mag 0x000000000801529c 0x3c bin/stabilizer.o - .log.sonar 0x00000000080152d8 0x24 bin/sonar.o - .log.mag_raw 0x00000000080152fc 0x3c bin/imu_cf2.o - .log.pm 0x0000000008015338 0x3c bin/pm_f405.o - .log.radio 0x0000000008015374 0x24 bin/radiolink.o - 0x0000000008015398 _log_stop = . - 0x0000000008015398 . = ALIGN (0x4) - 0x0000000008015398 _etext = . + 0x00000000080173e4 0x48 bin/stabilizer.o + .log.altHold 0x000000000801742c 0x60 bin/stabilizer.o + .log.gyro 0x000000000801748c 0x3c bin/stabilizer.o + .log.vpid 0x00000000080174c8 0x48 bin/stabilizer.o + .log.mag 0x0000000008017510 0x3c bin/stabilizer.o + .log.sonar 0x000000000801754c 0x24 bin/sonar.o + .log.mag_raw 0x0000000008017570 0x3c bin/imu_cf2.o + .log.pm 0x00000000080175ac 0x3c bin/pm_f405.o + .log.radio 0x00000000080175e8 0x24 bin/radiolink.o + 0x000000000801760c _log_stop = . + 0x000000000801760c _deckDriver_start = . + *(.deckDriver) + *(.deckDriver.*) + .deckDriver.buzzer_deck + 0x000000000801760c 0x4 bin/buzzdeck.o + 0x000000000801760c driver_buzzer_deck + .deckDriver.bigquad_deck + 0x0000000008017610 0x4 bin/bigquad.o + 0x0000000008017610 driver_bigquad_deck + .deckDriver.exptest_deck + 0x0000000008017614 0x4 bin/exptest.o + 0x0000000008017614 driver_exptest_deck + .deckDriver.ledring12_deck + 0x0000000008017618 0x4 bin/ledring12.o + 0x0000000008017618 driver_ledring12_deck + 0x000000000801761c _deckDriver_stop = . + 0x000000000801761c . = ALIGN (0x4) + 0x000000000801761c _etext = . -.vfp11_veneer 0x0000000008015398 0x0 +.vfp11_veneer 0x000000000801761c 0x0 .vfp11_veneer 0x0000000000000000 0x0 linker stubs -.v4_bx 0x0000000008015398 0x0 +.v4_bx 0x000000000801761c 0x0 .v4_bx 0x0000000000000000 0x0 linker stubs -.iplt 0x0000000008015398 0x0 +.iplt 0x000000000801761c 0x0 .iplt 0x0000000000000000 0x0 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/armv7e-m/fpu/crtbegin.o -.libc 0x0000000008015398 0x8 - 0x0000000008015398 . = ALIGN (0x4) +.libc 0x000000000801761c 0x8 + 0x000000000801761c . = ALIGN (0x4) *(.ARM.exidx*) - .ARM.exidx 0x0000000008015398 0x8 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/armv7e-m/fpu/libgcc.a(_divdi3.o) - .ARM.exidx 0x00000000080153a0 0x0 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/armv7e-m/fpu/libgcc.a(_udivdi3.o) + .ARM.exidx 0x000000000801761c 0x8 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/armv7e-m/fpu/libgcc.a(_divdi3.o) + .ARM.exidx 0x0000000008017624 0x0 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/armv7e-m/fpu/libgcc.a(_udivdi3.o) 0x8 (size before relaxing) - 0x00000000080153a0 . = ALIGN (0x4) - 0x00000000080153a0 _elibc = . - 0x00000000080153a0 _sidata = _elibc + 0x0000000008017624 . = ALIGN (0x4) + 0x0000000008017624 _elibc = . + 0x0000000008017624 _sidata = _elibc -.rel.dyn 0x00000000080153a0 0x0 +.rel.dyn 0x0000000008017624 0x0 .rel.iplt 0x0000000000000000 0x0 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/armv7e-m/fpu/crtbegin.o .flashpatch 0x0000000000000000 0x0 @@ -12171,751 +13347,812 @@ LOAD /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none- *(.endflash) 0x0000000000000000 . = ALIGN (0x4) -.data 0x0000000020000000 0x534 load address 0x00000000080153a0 +.data 0x0000000020000000 0x5d4 load address 0x0000000008017624 0x0000000020000000 . = ALIGN (0x4) 0x0000000020000000 _sdata = . *(.data) *(.data.*) - .data.xNextTaskUnblockTime - 0x0000000020000000 0x4 bin/tasks.o - .data.xFreeBytesRemaining - 0x0000000020000004 0x4 bin/heap_4.o .data.uxCriticalNesting - 0x0000000020000008 0x4 bin/port.o + 0x0000000020000000 0x4 bin/port.o .data.APBAHBPrescTable - 0x000000002000000c 0x10 bin/stm32f4xx_rcc.o + 0x0000000020000004 0x10 bin/stm32f4xx_rcc.o .data.motorMapDefaultBrushed - 0x000000002000001c 0x10 bin/motors.o - 0x000000002000001c motorMapDefaultBrushed + 0x0000000020000014 0x10 bin/motors.o + 0x0000000020000014 motorMapDefaultBrushed .data.motorMapBigQuadDeck - 0x000000002000002c 0x10 bin/motors.o - 0x000000002000002c motorMapBigQuadDeck - .data.nopLink 0x000000002000003c 0x14 bin/crtp.o - .data.link 0x0000000020000050 0x4 bin/crtp.o + 0x0000000020000024 0x10 bin/motors.o + 0x0000000020000024 motorMapBigQuadDeck + .data.nopLink 0x0000000020000034 0x14 bin/crtp.o + .data.link 0x0000000020000048 0x4 bin/crtp.o .data.seq_testPassed - 0x0000000020000054 0x78 bin/ledseq.o - 0x0000000020000054 seq_testPassed + 0x000000002000004c 0x78 bin/ledseq.o + 0x000000002000004c seq_testPassed .data.seq_alive - 0x00000000200000cc 0x18 bin/ledseq.o - 0x00000000200000cc seq_alive + 0x00000000200000c4 0x18 bin/ledseq.o + 0x00000000200000c4 seq_alive .data.seq_charging - 0x00000000200000e4 0x18 bin/ledseq.o - 0x00000000200000e4 seq_charging + 0x00000000200000dc 0x18 bin/ledseq.o + 0x00000000200000dc seq_charging .data.seq_lowbat - 0x00000000200000fc 0x10 bin/ledseq.o - 0x00000000200000fc seq_lowbat + 0x00000000200000f4 0x10 bin/ledseq.o + 0x00000000200000f4 seq_lowbat .data.seq_linkup - 0x000000002000010c 0x18 bin/ledseq.o - 0x000000002000010c seq_linkup + 0x0000000020000104 0x18 bin/ledseq.o + 0x0000000020000104 seq_linkup .data.seq_calibrated - 0x0000000020000124 0x18 bin/ledseq.o - 0x0000000020000124 seq_calibrated + 0x000000002000011c 0x18 bin/ledseq.o + 0x000000002000011c seq_calibrated .data.seq_charged - 0x000000002000013c 0x10 bin/ledseq.o - 0x000000002000013c seq_charged + 0x0000000020000134 0x10 bin/ledseq.o + 0x0000000020000134 seq_charged .data.seq_armed - 0x000000002000014c 0x18 bin/ledseq.o - 0x000000002000014c seq_armed + 0x0000000020000144 0x18 bin/ledseq.o + 0x0000000020000144 seq_armed .data.seq_bootloader - 0x0000000020000164 0x18 bin/ledseq.o - 0x0000000020000164 seq_bootloader + 0x000000002000015c 0x18 bin/ledseq.o + 0x000000002000015c seq_bootloader .data.seq_chargingMax - 0x000000002000017c 0x18 bin/ledseq.o - 0x000000002000017c seq_chargingMax - .data.timeToPrint.4939 - 0x0000000020000194 0x4 bin/system.o - .data.yawMode 0x0000000020000198 0x1 bin/commander.o + 0x0000000020000174 0x18 bin/ledseq.o + 0x0000000020000174 seq_chargingMax + .data.yawMode 0x000000002000018c 0x1 bin/commander.o .data.stabilizationModeRoll - 0x0000000020000199 0x1 bin/commander.o + 0x000000002000018d 0x1 bin/commander.o .data.stabilizationModePitch - 0x000000002000019a 0x1 bin/commander.o - *fill* 0x000000002000019b 0x1 - .data.q0 0x000000002000019c 0x4 bin/sensfusion6.o - 0x000000002000019c q0 - .data.twoKi 0x00000000200001a0 0x4 bin/sensfusion6.o - 0x00000000200001a0 twoKi - .data.twoKp 0x00000000200001a4 0x4 bin/sensfusion6.o - 0x00000000200001a4 twoKp + 0x000000002000018e 0x1 bin/commander.o + *fill* 0x000000002000018f 0x1 + .data.q0 0x0000000020000190 0x4 bin/sensfusion6.o + 0x0000000020000190 q0 + .data.twoKi 0x0000000020000194 0x4 bin/sensfusion6.o + 0x0000000020000194 twoKi + .data.twoKp 0x0000000020000198 0x4 bin/sensfusion6.o + 0x0000000020000198 twoKp .data.pidAlpha - 0x00000000200001a8 0x4 bin/stabilizer.o + 0x000000002000019c 0x4 bin/stabilizer.o .data.altHoldBaseThrust - 0x00000000200001ac 0x2 bin/stabilizer.o - *fill* 0x00000000200001ae 0x2 + 0x00000000200001a0 0x2 bin/stabilizer.o + *fill* 0x00000000200001a2 0x2 .data.altHoldChange_SENS - 0x00000000200001b0 0x4 bin/stabilizer.o + 0x00000000200001a4 0x4 bin/stabilizer.o .data.aslAlpha - 0x00000000200001b4 0x4 bin/stabilizer.o + 0x00000000200001a8 0x4 bin/stabilizer.o .data.altHoldErrMax - 0x00000000200001b8 0x4 bin/stabilizer.o + 0x00000000200001ac 0x4 bin/stabilizer.o .data.vBiasAlpha - 0x00000000200001bc 0x4 bin/stabilizer.o + 0x00000000200001b0 0x4 bin/stabilizer.o .data.altHoldMaxThrust - 0x00000000200001c0 0x2 bin/stabilizer.o - *fill* 0x00000000200001c2 0x2 + 0x00000000200001b4 0x2 bin/stabilizer.o + *fill* 0x00000000200001b6 0x2 .data.pidAslFac - 0x00000000200001c4 0x4 bin/stabilizer.o + 0x00000000200001b8 0x4 bin/stabilizer.o .data.altHoldKi - 0x00000000200001c8 0x4 bin/stabilizer.o + 0x00000000200001bc 0x4 bin/stabilizer.o .data.altHoldKp - 0x00000000200001cc 0x4 bin/stabilizer.o + 0x00000000200001c0 0x4 bin/stabilizer.o .data.vSpeedASLDeadband - 0x00000000200001d0 0x4 bin/stabilizer.o + 0x00000000200001c4 0x4 bin/stabilizer.o .data.vSpeedAccFac - 0x00000000200001d4 0x4 bin/stabilizer.o + 0x00000000200001c8 0x4 bin/stabilizer.o .data.vSpeedLimit - 0x00000000200001d8 0x4 bin/stabilizer.o + 0x00000000200001cc 0x4 bin/stabilizer.o .data.altHoldTarget - 0x00000000200001dc 0x4 bin/stabilizer.o + 0x00000000200001d0 0x4 bin/stabilizer.o .data.vAccDeadband - 0x00000000200001e0 0x4 bin/stabilizer.o + 0x00000000200001d4 0x4 bin/stabilizer.o .data.aslAlphaLong - 0x00000000200001e4 0x4 bin/stabilizer.o + 0x00000000200001d8 0x4 bin/stabilizer.o .data.V_SREVISION - 0x00000000200001e8 0x4 bin/version.o - 0x00000000200001e8 V_SREVISION - .data.V_STAG 0x00000000200001ec 0x4 bin/version.o - 0x00000000200001ec V_STAG + 0x00000000200001dc 0x4 bin/version.o + 0x00000000200001dc V_SREVISION + .data.V_STAG 0x00000000200001e0 0x4 bin/version.o + 0x00000000200001e0 V_STAG .data.V_SLOCAL_REVISION - 0x00000000200001f0 0x4 bin/version.o - 0x00000000200001f0 V_SLOCAL_REVISION + 0x00000000200001e4 0x4 bin/version.o + 0x00000000200001e4 V_SLOCAL_REVISION .data.I2C1_DevStructure - 0x00000000200001f4 0x20 bin/cpal_i2c_hal_stm32f4xx.o - 0x00000000200001f4 I2C1_DevStructure + 0x00000000200001e8 0x20 bin/cpal_i2c_hal_stm32f4xx.o + 0x00000000200001e8 I2C1_DevStructure .data.I2C2_DevStructure - 0x0000000020000214 0x20 bin/cpal_i2c_hal_stm32f4xx.o - 0x0000000020000214 I2C2_DevStructure + 0x0000000020000208 0x20 bin/cpal_i2c_hal_stm32f4xx.o + 0x0000000020000208 I2C2_DevStructure .data.CPAL_I2C_SCL_GPIO_PORT - 0x0000000020000234 0xc bin/cpal_i2c_hal_stm32f4xx.o - 0x0000000020000234 CPAL_I2C_SCL_GPIO_PORT + 0x0000000020000228 0xc bin/cpal_i2c_hal_stm32f4xx.o + 0x0000000020000228 CPAL_I2C_SCL_GPIO_PORT .data.I2C_DevStructures - 0x0000000020000240 0xc bin/cpal_i2c_hal_stm32f4xx.o - 0x0000000020000240 I2C_DevStructures + 0x0000000020000234 0xc bin/cpal_i2c_hal_stm32f4xx.o + 0x0000000020000234 I2C_DevStructures .data.I2C3_DevStructure - 0x000000002000024c 0x20 bin/cpal_i2c_hal_stm32f4xx.o - 0x000000002000024c I2C3_DevStructure + 0x0000000020000240 0x20 bin/cpal_i2c_hal_stm32f4xx.o + 0x0000000020000240 I2C3_DevStructure .data.CPAL_I2C_DEVICE - 0x000000002000026c 0xc bin/cpal_i2c_hal_stm32f4xx.o - 0x000000002000026c CPAL_I2C_DEVICE + 0x0000000020000260 0xc bin/cpal_i2c_hal_stm32f4xx.o + 0x0000000020000260 CPAL_I2C_DEVICE .data.CPAL_I2C_DMA_TX_Stream - 0x0000000020000278 0xc bin/cpal_i2c_hal_stm32f4xx.o - 0x0000000020000278 CPAL_I2C_DMA_TX_Stream + 0x000000002000026c 0xc bin/cpal_i2c_hal_stm32f4xx.o + 0x000000002000026c CPAL_I2C_DMA_TX_Stream .data.CPAL_I2C_SDA_GPIO_PORT - 0x0000000020000284 0xc bin/cpal_i2c_hal_stm32f4xx.o - 0x0000000020000284 CPAL_I2C_SDA_GPIO_PORT + 0x0000000020000278 0xc bin/cpal_i2c_hal_stm32f4xx.o + 0x0000000020000278 CPAL_I2C_SDA_GPIO_PORT .data.CPAL_I2C_DMA - 0x0000000020000290 0xc bin/cpal_i2c_hal_stm32f4xx.o - 0x0000000020000290 CPAL_I2C_DMA + 0x0000000020000284 0xc bin/cpal_i2c_hal_stm32f4xx.o + 0x0000000020000284 CPAL_I2C_DMA .data.CPAL_I2C_DMA_RX_Stream - 0x000000002000029c 0xc bin/cpal_i2c_hal_stm32f4xx.o - 0x000000002000029c CPAL_I2C_DMA_RX_Stream + 0x0000000020000290 0xc bin/cpal_i2c_hal_stm32f4xx.o + 0x0000000020000290 CPAL_I2C_DMA_RX_Stream .data.USBD_DCD_INT_fops - 0x00000000200002a8 0x4 bin/usbd_core.o - 0x00000000200002a8 USBD_DCD_INT_fops + 0x000000002000029c 0x4 bin/usbd_core.o + 0x000000002000029c USBD_DCD_INT_fops .data.USBD_DCD_INT_cb - 0x00000000200002ac 0x2c bin/usbd_core.o - 0x00000000200002ac USBD_DCD_INT_cb + 0x00000000200002a0 0x2c bin/usbd_core.o + 0x00000000200002a0 USBD_DCD_INT_cb .data.usblinkOp - 0x00000000200002d8 0x14 bin/usblink.o + 0x00000000200002cc 0x14 bin/usblink.o .data.USR_desc - 0x00000000200002ec 0x1c bin/usbd_desc.o - 0x00000000200002ec USR_desc + 0x00000000200002e0 0x1c bin/usbd_desc.o + 0x00000000200002e0 USR_desc .data.USBD_LangIDDesc - 0x0000000020000308 0x4 bin/usbd_desc.o - 0x0000000020000308 USBD_LangIDDesc + 0x00000000200002fc 0x4 bin/usbd_desc.o + 0x00000000200002fc USBD_LangIDDesc .data.USBD_DeviceDesc - 0x000000002000030c 0x12 bin/usbd_desc.o - 0x000000002000030c USBD_DeviceDesc - *fill* 0x000000002000031e 0x2 - .data.USR_cb 0x0000000020000320 0x1c bin/usb.o - 0x0000000020000320 USR_cb + 0x0000000020000300 0x12 bin/usbd_desc.o + 0x0000000020000300 USBD_DeviceDesc + *fill* 0x0000000020000312 0x2 + .data.USR_cb 0x0000000020000314 0x1c bin/usb.o + 0x0000000020000314 USR_cb .data.cf_usb_cb - 0x000000002000033c 0x2c bin/usb.o - 0x000000002000033c cf_usb_cb - .data.command 0x0000000020000368 0x4 bin/usb.o - 0x0000000020000368 command + 0x0000000020000330 0x2c bin/usb.o + 0x0000000020000330 cf_usb_cb + .data.command 0x000000002000035c 0x4 bin/usb.o + 0x000000002000035c command .data.usbd_cf_CfgDesc - 0x000000002000036c 0x39 bin/usb.o - 0x000000002000036c usbd_cf_CfgDesc + 0x0000000020000360 0x39 bin/usb.o + 0x0000000020000360 usbd_cf_CfgDesc .data.isAK8963TestPassed - 0x00000000200003a5 0x1 bin/imu_cf2.o + 0x0000000020000399 0x1 bin/imu_cf2.o .data.isMpu6500TestPassed - 0x00000000200003a6 0x1 bin/imu_cf2.o + 0x000000002000039a 0x1 bin/imu_cf2.o .data.isLPS25HTestPassed - 0x00000000200003a7 0x1 bin/imu_cf2.o + 0x000000002000039b 0x1 bin/imu_cf2.o .data.batteryVoltageMin - 0x00000000200003a8 0x4 bin/pm_f405.o + 0x000000002000039c 0x4 bin/pm_f405.o .data.radiolinkOp - 0x00000000200003ac 0x14 bin/radiolink.o + 0x00000000200003a0 0x14 bin/radiolink.o + .data.static_freq + 0x00000000200003b4 0x2 bin/sound_cf2.o + .data.siren_step + 0x00000000200003b6 0x2 bin/sound_cf2.o + .data.effects 0x00000000200003b8 0x9c bin/sound_cf2.o + .data.siren_freq + 0x0000000020000454 0x2 bin/sound_cf2.o + *fill* 0x0000000020000456 0x2 + .data.buzzDeckCtrl + 0x0000000020000458 0x8 bin/buzzdeck.o + .data.etGpioSDA + 0x0000000020000460 0xc bin/exptest.o + 0x0000000020000460 etGpioSDA + .data.etGpioSCL + 0x000000002000046c 0xc bin/exptest.o + 0x000000002000046c etGpioSCL + .data.etGpioIn + 0x0000000020000478 0x84 bin/exptest.o + 0x0000000020000478 etGpioIn .data.solidGreen - 0x00000000200003c0 0x1 bin/neopixelring.o - *fill* 0x00000000200003c1 0x3 - .data.gyroXid.8931 - 0x00000000200003c4 0x4 bin/neopixelring.o + 0x00000000200004fc 0x1 bin/ledring12.o + *fill* 0x00000000200004fd 0x3 .data.emptyCharge - 0x00000000200003c8 0x4 bin/neopixelring.o - .data.effectsFct - 0x00000000200003cc 0x34 bin/neopixelring.o - 0x00000000200003cc effectsFct + 0x0000000020000500 0x4 bin/ledring12.o + .data.thrust.9250 + 0x0000000020000504 0x4 bin/ledring12.o .data.solidRed - 0x0000000020000400 0x1 bin/neopixelring.o - *fill* 0x0000000020000401 0x3 - .data.thrust.8880 - 0x0000000020000404 0x4 bin/neopixelring.o + 0x0000000020000508 0x1 bin/ledring12.o .data.solidBlue - 0x0000000020000408 0x1 bin/neopixelring.o - *fill* 0x0000000020000409 0x3 + 0x0000000020000509 0x1 bin/ledring12.o + *fill* 0x000000002000050a 0x2 .data.glowstep - 0x000000002000040c 0x4 bin/neopixelring.o + 0x000000002000050c 0x4 bin/ledring12.o + .data.gyroXid.9301 + 0x0000000020000510 0x4 bin/ledring12.o .data.fullCharge - 0x0000000020000410 0x4 bin/neopixelring.o - .data.effect 0x0000000020000414 0x4 bin/neopixelring.o - .data.etGpioSDA - 0x0000000020000418 0xc bin/exptest.o - 0x0000000020000418 etGpioSDA - .data.etGpioSCL - 0x0000000020000424 0xc bin/exptest.o - 0x0000000020000424 etGpioSCL - .data.etGpioIn - 0x0000000020000430 0x84 bin/exptest.o - 0x0000000020000430 etGpioIn + 0x0000000020000514 0x4 bin/ledring12.o + .data.effectsFct + 0x0000000020000518 0x38 bin/ledring12.o + 0x0000000020000518 effectsFct + .data.effect 0x0000000020000550 0x4 bin/ledring12.o .data.configblockDefault - 0x00000000200004b4 0x15 bin/configblockeeprom.o + 0x0000000020000554 0x15 bin/configblockeeprom.o .data.__fdlib_version - 0x00000000200004c9 0x1 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libm.a(lib_a-s_lib_ver.o) - 0x00000000200004c9 __fdlib_version - *fill* 0x00000000200004ca 0x2 + 0x0000000020000569 0x1 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libm.a(lib_a-s_lib_ver.o) + 0x0000000020000569 __fdlib_version + *fill* 0x000000002000056a 0x2 .data.__ctype_ptr__ - 0x00000000200004cc 0x4 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libc_nano.a(lib_a-ctype_.o) - 0x00000000200004cc __ctype_ptr__ + 0x000000002000056c 0x4 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libc_nano.a(lib_a-ctype_.o) + 0x000000002000056c __ctype_ptr__ .data.impure_data - 0x00000000200004d0 0x60 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libc_nano.a(lib_a-impure.o) + 0x0000000020000570 0x60 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libc_nano.a(lib_a-impure.o) .data._impure_ptr - 0x0000000020000530 0x4 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libc_nano.a(lib_a-impure.o) - 0x0000000020000530 _impure_ptr + 0x00000000200005d0 0x4 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libc_nano.a(lib_a-impure.o) + 0x00000000200005d0 _impure_ptr *(.RAMtext) - 0x0000000020000534 . = ALIGN (0x4) - 0x0000000020000534 _edata = . + 0x00000000200005d4 . = ALIGN (0x4) + 0x00000000200005d4 _edata = . -.igot.plt 0x0000000020000534 0x0 load address 0x00000000080158d4 +.igot.plt 0x00000000200005d4 0x0 load address 0x0000000008017bf8 .igot.plt 0x0000000000000000 0x0 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/armv7e-m/fpu/crtbegin.o -.bss 0x0000000020000534 0x6854 load address 0x00000000080158d4 - 0x0000000020000534 . = ALIGN (0x4) - 0x0000000020000534 _sbss = . +.bss 0x00000000200005d4 0x72a0 load address 0x0000000008017bf8 + 0x00000000200005d4 . = ALIGN (0x4) + 0x00000000200005d4 _sbss = . *(.bss) *(.bss.*) - .bss.uxMissedTicks - 0x0000000020000534 0x4 bin/tasks.o - .bss.xNumOfOverflows - 0x0000000020000538 0x4 bin/tasks.o .bss.pxDelayedTaskList - 0x000000002000053c 0x4 bin/tasks.o + 0x00000000200005d4 0x4 bin/tasks.o .bss.xSchedulerRunning - 0x0000000020000540 0x4 bin/tasks.o + 0x00000000200005d8 0x4 bin/tasks.o .bss.uxSchedulerSuspended - 0x0000000020000544 0x4 bin/tasks.o - .bss.xDelayedTaskList1 - 0x0000000020000548 0x14 bin/tasks.o - .bss.xDelayedTaskList2 - 0x000000002000055c 0x14 bin/tasks.o - .bss.tot_task_mem - 0x0000000020000570 0x4 bin/tasks.o + 0x00000000200005dc 0x4 bin/tasks.o + .bss.xNumOfOverflows + 0x00000000200005e0 0x4 bin/tasks.o + .bss.uxPendedTicks + 0x00000000200005e4 0x4 bin/tasks.o .bss.pxReadyTasksLists - 0x0000000020000574 0x64 bin/tasks.o - .bss.tcbs 0x00000000200005d8 0x3c bin/tasks.o - .bss.tot_alloc_overhead - 0x0000000020000614 0x4 bin/tasks.o + 0x00000000200005e8 0x78 bin/tasks.o .bss.pxCurrentTCB - 0x0000000020000618 0x4 bin/tasks.o - 0x0000000020000618 pxCurrentTCB - .bss.xPendingReadyList - 0x000000002000061c 0x14 bin/tasks.o + 0x0000000020000660 0x4 bin/tasks.o + 0x0000000020000660 pxCurrentTCB + .bss.xNextTaskUnblockTime + 0x0000000020000664 0x4 bin/tasks.o .bss.xTickCount - 0x0000000020000630 0x4 bin/tasks.o + 0x0000000020000668 0x4 bin/tasks.o .bss.pxOverflowDelayedTaskList - 0x0000000020000634 0x4 bin/tasks.o - .bss.uxTopReadyPriority - 0x0000000020000638 0x4 bin/tasks.o + 0x000000002000066c 0x4 bin/tasks.o + .bss.xPendingReadyList + 0x0000000020000670 0x14 bin/tasks.o .bss.uxTaskNumber - 0x000000002000063c 0x4 bin/tasks.o - .bss.tot_alloc_stack - 0x0000000020000640 0x4 bin/tasks.o - .bss.xMissedYield - 0x0000000020000644 0x4 bin/tasks.o + 0x0000000020000684 0x4 bin/tasks.o + .bss.xDelayedTaskList1 + 0x0000000020000688 0x14 bin/tasks.o + .bss.xDelayedTaskList2 + 0x000000002000069c 0x14 bin/tasks.o .bss.uxCurrentNumberOfTasks - 0x0000000020000648 0x4 bin/tasks.o - .bss.uxTopUsedPriority - 0x000000002000064c 0x4 bin/tasks.o + 0x00000000200006b0 0x4 bin/tasks.o + .bss.uxTopReadyPriority + 0x00000000200006b4 0x4 bin/tasks.o + .bss.xYieldPending + 0x00000000200006b8 0x4 bin/tasks.o .bss.pxCurrentTimerList - 0x0000000020000650 0x4 bin/timers.o + 0x00000000200006bc 0x4 bin/timers.o .bss.xActiveTimerList1 - 0x0000000020000654 0x14 bin/timers.o + 0x00000000200006c0 0x14 bin/timers.o .bss.xActiveTimerList2 - 0x0000000020000668 0x14 bin/timers.o - .bss.xLastTime.4556 - 0x000000002000067c 0x4 bin/timers.o + 0x00000000200006d4 0x14 bin/timers.o + .bss.xLastTime.5304 + 0x00000000200006e8 0x4 bin/timers.o .bss.xTimerQueue - 0x0000000020000680 0x4 bin/timers.o + 0x00000000200006ec 0x4 bin/timers.o .bss.pxOverflowTimerList - 0x0000000020000684 0x4 bin/timers.o - .bss.pxEnd 0x0000000020000688 0x4 bin/heap_4.o - .bss.xStart 0x000000002000068c 0x8 bin/heap_4.o - .bss.ucHeap 0x0000000020000694 0x4e20 bin/heap_4.o - .bss.isInit 0x00000000200054b4 0x1 bin/motors.o - *fill* 0x00000000200054b5 0x3 - .bss.queues 0x00000000200054b8 0x40 bin/crtp.o - .bss.rxQueue 0x00000000200054f8 0x4 bin/crtp.o + 0x00000000200006f0 0x4 bin/timers.o + .bss.xFreeBytesRemaining + 0x00000000200006f4 0x4 bin/heap_4.o + .bss.pxEnd 0x00000000200006f8 0x4 bin/heap_4.o + .bss.xStart 0x00000000200006fc 0x8 bin/heap_4.o + .bss.ucHeap 0x0000000020000704 0x55f0 bin/heap_4.o + .bss.xBlockAllocatedBit + 0x0000000020005cf4 0x4 bin/heap_4.o + .bss.xMinimumEverFreeBytesRemaining + 0x0000000020005cf8 0x4 bin/heap_4.o + .bss.ucMaxSysCallPriority + 0x0000000020005cfc 0x1 bin/port.o + *fill* 0x0000000020005cfd 0x3 + .bss.ulMaxPRIGROUPValue + 0x0000000020005d00 0x4 bin/port.o + .bss.isInit 0x0000000020005d04 0x1 bin/motors.o + *fill* 0x0000000020005d05 0x3 + .bss.queues 0x0000000020005d08 0x40 bin/crtp.o + .bss.droppedPacket.4866 + 0x0000000020005d48 0x4 bin/crtp.o + .bss.isInit 0x0000000020005d4c 0x1 bin/crtp.o + *fill* 0x0000000020005d4d 0x3 + .bss.txQueue 0x0000000020005d50 0x4 bin/crtp.o .bss.callbacks - 0x00000000200054fc 0x40 bin/crtp.o - .bss.isInit 0x000000002000553c 0x1 bin/crtp.o - *fill* 0x000000002000553d 0x3 - .bss.txQueue 0x0000000020005540 0x4 bin/crtp.o - .bss.droppedPacket.4775 - 0x0000000020005544 0x4 bin/crtp.o - .bss.state 0x0000000020005548 0xc8 bin/ledseq.o + 0x0000000020005d54 0x40 bin/crtp.o + .bss.state 0x0000000020005d94 0xc8 bin/ledseq.o .bss.ledseqEnabled - 0x0000000020005610 0x1 bin/ledseq.o - .bss.isInit 0x0000000020005611 0x1 bin/ledseq.o - *fill* 0x0000000020005612 0x2 + 0x0000000020005e5c 0x1 bin/ledseq.o + .bss.isInit 0x0000000020005e5d 0x1 bin/ledseq.o + *fill* 0x0000000020005e5e 0x2 .bss.activeSeq - 0x0000000020005614 0x14 bin/ledseq.o - .bss.timer 0x0000000020005628 0x14 bin/ledseq.o + 0x0000000020005e60 0x14 bin/ledseq.o + .bss.timer 0x0000000020005e74 0x14 bin/ledseq.o .bss.ledseqSem - 0x000000002000563c 0x4 bin/ledseq.o + 0x0000000020005e88 0x4 bin/ledseq.o + .bss.ctrl 0x0000000020005e8c 0x4 bin/buzzer.o .bss.selftestPassed - 0x0000000020005640 0x1 bin/system.o - .bss.isInit 0x0000000020005641 0x1 bin/system.o - .bss.canFly 0x0000000020005642 0x1 bin/system.o - .bss.isInit 0x0000000020005643 0x1 bin/comm.o - .bss.synch 0x0000000020005644 0x4 bin/console.o - 0x0000000020005644 synch - .bss.isInit 0x0000000020005648 0x1 bin/console.o - .bss.isInit 0x0000000020005649 0x1 bin/crtpservice.o - *fill* 0x000000002000564a 0x2 + 0x0000000020005e90 0x1 bin/system.o + .bss.isInit 0x0000000020005e91 0x1 bin/system.o + .bss.canFly 0x0000000020005e92 0x1 bin/system.o + *fill* 0x0000000020005e93 0x1 + .bss.tickOfLatestWatchdogReset.8576 + 0x0000000020005e94 0x4 bin/system.o + .bss.isInit 0x0000000020005e98 0x1 bin/comm.o + *fill* 0x0000000020005e99 0x3 + .bss.synch 0x0000000020005e9c 0x4 bin/console.o + 0x0000000020005e9c synch + .bss.isInit 0x0000000020005ea0 0x1 bin/console.o + .bss.isInit 0x0000000020005ea1 0x1 bin/crtpservice.o + *fill* 0x0000000020005ea2 0x2 .bss.paramsCount - 0x000000002000564c 0x4 bin/param.o + 0x0000000020005ea4 0x4 bin/param.o .bss.paramsCrc - 0x0000000020005650 0x4 bin/param.o - .bss.params 0x0000000020005654 0x4 bin/param.o - .bss.isInit 0x0000000020005658 0x1 bin/param.o - *fill* 0x0000000020005659 0x3 + 0x0000000020005ea8 0x4 bin/param.o + .bss.params 0x0000000020005eac 0x4 bin/param.o + .bss.isInit 0x0000000020005eb0 0x1 bin/param.o + *fill* 0x0000000020005eb1 0x3 .bss.paramsLen - 0x000000002000565c 0x4 bin/param.o + 0x0000000020005eb4 0x4 bin/param.o .bss.serialNbr - 0x0000000020005660 0x8 bin/mem.o - .bss.p 0x0000000020005668 0x20 bin/mem.o - .bss.memSize 0x0000000020005688 0x4 bin/mem.o - .bss.isInit 0x000000002000568c 0x1 bin/mem.o + 0x0000000020005eb8 0x8 bin/mem.o + .bss.p 0x0000000020005ec0 0x20 bin/mem.o + .bss.memSize 0x0000000020005ee0 0x4 bin/mem.o + .bss.isInit 0x0000000020005ee4 0x1 bin/mem.o .bss.nbrOwMems - 0x000000002000568d 0x1 bin/mem.o + 0x0000000020005ee5 0x1 bin/mem.o .bss.altHoldMode - 0x000000002000568e 0x1 bin/commander.o - *fill* 0x000000002000568f 0x1 - .bss.side 0x0000000020005690 0x4 bin/commander.o + 0x0000000020005ee6 0x1 bin/commander.o + *fill* 0x0000000020005ee7 0x1 + .bss.side 0x0000000020005ee8 0x4 bin/commander.o .bss.targetVal - 0x0000000020005694 0x1c bin/commander.o + 0x0000000020005eec 0x1c bin/commander.o .bss.isInactive - 0x00000000200056b0 0x1 bin/commander.o + 0x0000000020005f08 0x1 bin/commander.o .bss.altHoldModeOld - 0x00000000200056b1 0x1 bin/commander.o + 0x0000000020005f09 0x1 bin/commander.o .bss.stabilizationModeYaw - 0x00000000200056b2 0x1 bin/commander.o + 0x0000000020005f0a 0x1 bin/commander.o .bss.thrustLocked - 0x00000000200056b3 0x1 bin/commander.o - .bss.isInit 0x00000000200056b4 0x1 bin/commander.o - *fill* 0x00000000200056b5 0x3 + 0x0000000020005f0b 0x1 bin/commander.o + .bss.isInit 0x0000000020005f0c 0x1 bin/commander.o + *fill* 0x0000000020005f0d 0x3 .bss.lastUpdate - 0x00000000200056b8 0x4 bin/commander.o + 0x0000000020005f10 0x4 bin/commander.o .bss.carefreeResetFront - 0x00000000200056bc 0x1 bin/commander.o - .bss.isInit 0x00000000200056bd 0x1 bin/controller.o - *fill* 0x00000000200056be 0x2 + 0x0000000020005f14 0x1 bin/commander.o + .bss.isInit 0x0000000020005f15 0x1 bin/controller.o + *fill* 0x0000000020005f16 0x2 .bss.integralFBz - 0x00000000200056c0 0x4 bin/sensfusion6.o - 0x00000000200056c0 integralFBz - .bss.isInit 0x00000000200056c4 0x1 bin/sensfusion6.o - *fill* 0x00000000200056c5 0x3 - .bss.q1 0x00000000200056c8 0x4 bin/sensfusion6.o - 0x00000000200056c8 q1 - .bss.q2 0x00000000200056cc 0x4 bin/sensfusion6.o - 0x00000000200056cc q2 - .bss.q3 0x00000000200056d0 0x4 bin/sensfusion6.o - 0x00000000200056d0 q3 + 0x0000000020005f18 0x4 bin/sensfusion6.o + 0x0000000020005f18 integralFBz + .bss.isInit 0x0000000020005f1c 0x1 bin/sensfusion6.o + *fill* 0x0000000020005f1d 0x3 + .bss.q1 0x0000000020005f20 0x4 bin/sensfusion6.o + 0x0000000020005f20 q1 + .bss.q2 0x0000000020005f24 0x4 bin/sensfusion6.o + 0x0000000020005f24 q2 + .bss.q3 0x0000000020005f28 0x4 bin/sensfusion6.o + 0x0000000020005f28 q3 .bss.integralFBx - 0x00000000200056d4 0x4 bin/sensfusion6.o - 0x00000000200056d4 integralFBx + 0x0000000020005f2c 0x4 bin/sensfusion6.o + 0x0000000020005f2c integralFBx .bss.integralFBy - 0x00000000200056d8 0x4 bin/sensfusion6.o - 0x00000000200056d8 integralFBy + 0x0000000020005f30 0x4 bin/sensfusion6.o + 0x0000000020005f30 integralFBy .bss.eulerRollActual - 0x00000000200056dc 0x4 bin/stabilizer.o + 0x0000000020005f34 0x4 bin/stabilizer.o .bss.vSpeedASLFac - 0x00000000200056e0 0x4 bin/stabilizer.o + 0x0000000020005f38 0x4 bin/stabilizer.o .bss.vSpeedASL - 0x00000000200056e4 0x4 bin/stabilizer.o - .bss.acc 0x00000000200056e8 0xc bin/stabilizer.o - .bss.mag 0x00000000200056f4 0xc bin/stabilizer.o + 0x0000000020005f3c 0x4 bin/stabilizer.o + .bss.acc 0x0000000020005f40 0xc bin/stabilizer.o + .bss.mag 0x0000000020005f4c 0xc bin/stabilizer.o .bss.eulerYawActual - 0x0000000020005700 0x4 bin/stabilizer.o + 0x0000000020005f58 0x4 bin/stabilizer.o .bss.eulerPitchDesired - 0x0000000020005704 0x4 bin/stabilizer.o + 0x0000000020005f5c 0x4 bin/stabilizer.o .bss.temperature - 0x0000000020005708 0x4 bin/stabilizer.o + 0x0000000020005f60 0x4 bin/stabilizer.o .bss.vSpeedAcc - 0x000000002000570c 0x4 bin/stabilizer.o + 0x0000000020005f64 0x4 bin/stabilizer.o .bss.pitchRateDesired - 0x0000000020005710 0x4 bin/stabilizer.o + 0x0000000020005f68 0x4 bin/stabilizer.o .bss.altHoldKd - 0x0000000020005714 0x4 bin/stabilizer.o - .bss.pressure 0x0000000020005718 0x4 bin/stabilizer.o + 0x0000000020005f6c 0x4 bin/stabilizer.o + .bss.pressure 0x0000000020005f70 0x4 bin/stabilizer.o .bss.altHoldErr - 0x000000002000571c 0x4 bin/stabilizer.o - .bss.isInit 0x0000000020005720 0x1 bin/stabilizer.o - *fill* 0x0000000020005721 0x1 + 0x0000000020005f74 0x4 bin/stabilizer.o + .bss.isInit 0x0000000020005f78 0x1 bin/stabilizer.o + *fill* 0x0000000020005f79 0x1 .bss.altHoldMinThrust - 0x0000000020005722 0x2 bin/stabilizer.o - .bss.eulerPitchActual - 0x0000000020005724 0x4 bin/stabilizer.o + 0x0000000020005f7a 0x2 bin/stabilizer.o + .bss.aslRef 0x0000000020005f7c 0x4 bin/stabilizer.o .bss.altHoldPID - 0x0000000020005728 0x38 bin/stabilizer.o - .bss.aslRaw 0x0000000020005760 0x4 bin/stabilizer.o + 0x0000000020005f80 0x38 bin/stabilizer.o + .bss.aslRaw 0x0000000020005fb8 0x4 bin/stabilizer.o .bss.carefreeFrontAngle - 0x0000000020005764 0x4 bin/stabilizer.o - .bss.vSpeed 0x0000000020005768 0x4 bin/stabilizer.o - .bss.gyro 0x000000002000576c 0xc bin/stabilizer.o - .bss.accWZ 0x0000000020005778 0x4 bin/stabilizer.o - .bss.accMAG 0x000000002000577c 0x4 bin/stabilizer.o - .bss.asl 0x0000000020005780 0x4 bin/stabilizer.o + 0x0000000020005fbc 0x4 bin/stabilizer.o + .bss.vSpeed 0x0000000020005fc0 0x4 bin/stabilizer.o + .bss.gyro 0x0000000020005fc4 0xc bin/stabilizer.o + .bss.accWZ 0x0000000020005fd0 0x4 bin/stabilizer.o + .bss.accMAG 0x0000000020005fd4 0x4 bin/stabilizer.o + .bss.asl 0x0000000020005fd8 0x4 bin/stabilizer.o + .bss.eulerPitchActual + 0x0000000020005fdc 0x4 bin/stabilizer.o .bss.altHoldPIDVal - 0x0000000020005784 0x4 bin/stabilizer.o + 0x0000000020005fe0 0x4 bin/stabilizer.o .bss.errDeadband - 0x0000000020005788 0x4 bin/stabilizer.o + 0x0000000020005fe4 0x4 bin/stabilizer.o .bss.altHoldChange - 0x000000002000578c 0x4 bin/stabilizer.o + 0x0000000020005fe8 0x4 bin/stabilizer.o .bss.yawRateDesired - 0x0000000020005790 0x4 bin/stabilizer.o - .bss.altHold 0x0000000020005794 0x1 bin/stabilizer.o - 0x0000000020005794 altHold - *fill* 0x0000000020005795 0x3 + 0x0000000020005fec 0x4 bin/stabilizer.o + .bss.altHold 0x0000000020005ff0 0x1 bin/stabilizer.o + 0x0000000020005ff0 altHold + *fill* 0x0000000020005ff1 0x3 .bss.rollRateDesired - 0x0000000020005798 0x4 bin/stabilizer.o - .bss.aslLong 0x000000002000579c 0x4 bin/stabilizer.o + 0x0000000020005ff4 0x4 bin/stabilizer.o + .bss.aslLong 0x0000000020005ff8 0x4 bin/stabilizer.o .bss.eulerYawDesired - 0x00000000200057a0 0x4 bin/stabilizer.o + 0x0000000020005ffc 0x4 bin/stabilizer.o .bss.setAltHold - 0x00000000200057a4 0x1 bin/stabilizer.o - 0x00000000200057a4 setAltHold - *fill* 0x00000000200057a5 0x3 + 0x0000000020006000 0x1 bin/stabilizer.o + 0x0000000020006000 setAltHold + *fill* 0x0000000020006001 0x3 .bss.eulerRollDesired - 0x00000000200057a8 0x4 bin/stabilizer.o - .bss.logOps 0x00000000200057ac 0x300 bin/log.o - .bss.p 0x0000000020005aac 0x20 bin/log.o - .bss.pk.5112 0x0000000020005acc 0x20 bin/log.o + 0x0000000020006004 0x4 bin/stabilizer.o + .bss.logOps 0x0000000020006008 0x300 bin/log.o + .bss.p 0x0000000020006308 0x20 bin/log.o + .bss.pk.5222 0x0000000020006328 0x20 bin/log.o .bss.logBlocks - 0x0000000020005aec 0x60 bin/log.o + 0x0000000020006348 0x60 bin/log.o .bss.logsCount - 0x0000000020005b4c 0x4 bin/log.o - .bss.logsLen 0x0000000020005b50 0x4 bin/log.o - .bss.isInit 0x0000000020005b54 0x1 bin/log.o - *fill* 0x0000000020005b55 0x3 - .bss.logs 0x0000000020005b58 0x4 bin/log.o - .bss.logsCrc 0x0000000020005b5c 0x4 bin/log.o - .bss.logLock 0x0000000020005b60 0x4 bin/log.o + 0x00000000200063a8 0x4 bin/log.o + .bss.logsLen 0x00000000200063ac 0x4 bin/log.o + .bss.isInit 0x00000000200063b0 0x1 bin/log.o + *fill* 0x00000000200063b1 0x3 + .bss.logs 0x00000000200063b4 0x4 bin/log.o + .bss.logsCrc 0x00000000200063b8 0x4 bin/log.o + .bss.logLock 0x00000000200063bc 0x4 bin/log.o .bss.workerQueue - 0x0000000020005b64 0x4 bin/worker.o + 0x00000000200063c0 0x4 bin/worker.o .bss.USBD_cfg_status - 0x0000000020005b68 0x4 bin/usbd_req.o - 0x0000000020005b68 USBD_cfg_status + 0x00000000200063c4 0x4 bin/usbd_req.o + 0x00000000200063c4 USBD_cfg_status .bss.cfgidx.8748 - 0x0000000020005b6c 0x1 bin/usbd_req.o - *fill* 0x0000000020005b6d 0x3 + 0x00000000200063c8 0x1 bin/usbd_req.o + *fill* 0x00000000200063c9 0x3 .bss.USBD_ep_status - 0x0000000020005b70 0x4 bin/usbd_req.o - 0x0000000020005b70 USBD_ep_status + 0x00000000200063cc 0x4 bin/usbd_req.o + 0x00000000200063cc USBD_ep_status .bss.USBD_default_cfg - 0x0000000020005b74 0x4 bin/usbd_req.o - 0x0000000020005b74 USBD_default_cfg - .bss.isInit 0x0000000020005b78 0x1 bin/led_f405.o - .bss.devAddr 0x0000000020005b79 0x1 bin/mpu6500.o - .bss.isInit 0x0000000020005b7a 0x1 bin/mpu6500.o - *fill* 0x0000000020005b7b 0x1 - .bss.I2Cx 0x0000000020005b7c 0x4 bin/mpu6500.o - .bss.buffer 0x0000000020005b80 0xe bin/mpu6500.o - *fill* 0x0000000020005b8e 0x2 + 0x00000000200063d0 0x4 bin/usbd_req.o + 0x00000000200063d0 USBD_default_cfg + .bss.isInit 0x00000000200063d4 0x1 bin/led_f405.o + .bss.devAddr 0x00000000200063d5 0x1 bin/mpu6500.o + .bss.isInit 0x00000000200063d6 0x1 bin/mpu6500.o + *fill* 0x00000000200063d7 0x1 + .bss.I2Cx 0x00000000200063d8 0x4 bin/mpu6500.o + .bss.buffer 0x00000000200063dc 0xe bin/mpu6500.o + *fill* 0x00000000200063ea 0x2 .bss.TIM_TimeBaseStructure - 0x0000000020005b90 0xc bin/ws2812.o + 0x00000000200063ec 0xc bin/ws2812_cf2.o .bss.DMA_InitStructure - 0x0000000020005b9c 0x3c bin/ws2812.o + 0x00000000200063f8 0x3c bin/ws2812_cf2.o .bss.total_led - 0x0000000020005bd8 0x4 bin/ws2812.o + 0x0000000020006434 0x4 bin/ws2812_cf2.o .bss.allLedDone - 0x0000000020005bdc 0x4 bin/ws2812.o + 0x0000000020006438 0x4 bin/ws2812_cf2.o .bss.TIM_OCInitStructure - 0x0000000020005be0 0x14 bin/ws2812.o + 0x000000002000643c 0x14 bin/ws2812_cf2.o .bss.color_led - 0x0000000020005bf4 0x4 bin/ws2812.o + 0x0000000020006450 0x4 bin/ws2812_cf2.o .bss.current_led - 0x0000000020005bf8 0x4 bin/ws2812.o + 0x0000000020006454 0x4 bin/ws2812_cf2.o .bss.NVIC_InitStructure - 0x0000000020005bfc 0x4 bin/ws2812.o + 0x0000000020006458 0x4 bin/ws2812_cf2.o .bss.GPIO_InitStructure - 0x0000000020005c00 0x8 bin/ws2812.o - .bss.led_dma 0x0000000020005c08 0x60 bin/ws2812.o - .bss.devAddr 0x0000000020005c68 0x1 bin/lps25h.o - .bss.isInit 0x0000000020005c69 0x1 bin/lps25h.o - *fill* 0x0000000020005c6a 0x2 - .bss.I2Cx 0x0000000020005c6c 0x4 bin/lps25h.o - .bss.devAddr 0x0000000020005c70 0x1 bin/ak8963.o - *fill* 0x0000000020005c71 0x3 - .bss.I2Cx 0x0000000020005c74 0x4 bin/ak8963.o - .bss.buffer 0x0000000020005c78 0x6 bin/ak8963.o - .bss.devAddr 0x0000000020005c7e 0x1 bin/eeprom.o - .bss.isInit 0x0000000020005c7f 0x1 bin/eeprom.o - .bss.I2Cx 0x0000000020005c80 0x4 bin/eeprom.o + 0x000000002000645c 0x8 bin/ws2812_cf2.o + .bss.led_dma 0x0000000020006464 0x60 bin/ws2812_cf2.o + .bss.devAddr 0x00000000200064c4 0x1 bin/lps25h.o + .bss.isInit 0x00000000200064c5 0x1 bin/lps25h.o + *fill* 0x00000000200064c6 0x2 + .bss.I2Cx 0x00000000200064c8 0x4 bin/lps25h.o + .bss.devAddr 0x00000000200064cc 0x1 bin/ak8963.o + *fill* 0x00000000200064cd 0x3 + .bss.I2Cx 0x00000000200064d0 0x4 bin/ak8963.o + .bss.buffer 0x00000000200064d4 0x6 bin/ak8963.o + .bss.devAddr 0x00000000200064da 0x1 bin/eeprom.o + .bss.isInit 0x00000000200064db 0x1 bin/eeprom.o + .bss.I2Cx 0x00000000200064dc 0x4 bin/eeprom.o + .bss.isInit 0x00000000200064e0 0x1 bin/piezo.o .bss.dmaIsPaused - 0x0000000020005c84 0x1 bin/uart_syslink.o - *fill* 0x0000000020005c85 0x3 + 0x00000000200064e1 0x1 bin/uart_syslink.o + *fill* 0x00000000200064e2 0x2 .bss.waitUntilSendDone - 0x0000000020005c88 0x4 bin/uart_syslink.o - 0x0000000020005c88 waitUntilSendDone + 0x00000000200064e4 0x4 bin/uart_syslink.o + 0x00000000200064e4 waitUntilSendDone .bss.isUartDmaInitialized - 0x0000000020005c8c 0x1 bin/uart_syslink.o + 0x00000000200064e8 0x1 bin/uart_syslink.o .bss.dataIndexIsr - 0x0000000020005c8d 0x1 bin/uart_syslink.o + 0x00000000200064e9 0x1 bin/uart_syslink.o .bss.dmaBuffer - 0x0000000020005c8e 0x40 bin/uart_syslink.o - *fill* 0x0000000020005cce 0x2 + 0x00000000200064ea 0x40 bin/uart_syslink.o + *fill* 0x000000002000652a 0x2 .bss.outDataIsr - 0x0000000020005cd0 0x4 bin/uart_syslink.o + 0x000000002000652c 0x4 bin/uart_syslink.o .bss.initialDMACount - 0x0000000020005cd4 0x4 bin/uart_syslink.o - .bss.isInit 0x0000000020005cd8 0x1 bin/uart_syslink.o + 0x0000000020006530 0x4 bin/uart_syslink.o + .bss.isInit 0x0000000020006534 0x1 bin/uart_syslink.o .bss.dataSizeIsr - 0x0000000020005cd9 0x1 bin/uart_syslink.o - *fill* 0x0000000020005cda 0x2 + 0x0000000020006535 0x1 bin/uart_syslink.o + *fill* 0x0000000020006536 0x2 .bss.remainingDMACount - 0x0000000020005cdc 0x4 bin/uart_syslink.o + 0x0000000020006538 0x4 bin/uart_syslink.o .bss.uartDataDelivery - 0x0000000020005ce0 0x4 bin/uart_syslink.o + 0x000000002000653c 0x4 bin/uart_syslink.o .bss.DMA_InitStructureShare - 0x0000000020005ce4 0x3c bin/uart_syslink.o + 0x0000000020006540 0x3c bin/uart_syslink.o .bss.isr_counter - 0x0000000020005d20 0x2 bin/sonar.o + 0x000000002000657c 0x2 bin/sonar.o .bss.pulse_flag - 0x0000000020005d22 0x2 bin/sonar.o - 0x0000000020005d22 pulse_flag - .bss.isInit 0x0000000020005d24 0x1 bin/sonar.o - .bss.p 0x0000000020005d25 0x20 bin/usblink.o + 0x000000002000657e 0x2 bin/sonar.o + 0x000000002000657e pulse_flag + .bss.isInit 0x0000000020006580 0x1 bin/sonar.o + .bss.p 0x0000000020006581 0x20 bin/usblink.o .bss.sendBuffer - 0x0000000020005d45 0x40 bin/usblink.o - .bss.isInit 0x0000000020005d85 0x1 bin/usblink.o - *fill* 0x0000000020005d86 0x2 + 0x00000000200065a1 0x40 bin/usblink.o + .bss.isInit 0x00000000200065e1 0x1 bin/usblink.o + *fill* 0x00000000200065e2 0x2 .bss.crtpPacketDelivery - 0x0000000020005d88 0x4 bin/usblink.o - .bss.usbIn 0x0000000020005d8c 0x41 bin/usblink.o - .bss.outStage 0x0000000020005dcd 0x41 bin/usb.o + 0x00000000200065e4 0x4 bin/usblink.o + .bss.usbIn 0x00000000200065e8 0x41 bin/usblink.o + .bss.outStage 0x0000000020006629 0x41 bin/usb.o .bss.outPacket - 0x0000000020005e0e 0x41 bin/usb.o - *fill* 0x0000000020005e4f 0x1 + 0x000000002000666a 0x41 bin/usb.o + *fill* 0x00000000200066ab 0x1 .bss.usbDataRx - 0x0000000020005e50 0x4 bin/usb.o - .bss.isInit 0x0000000020005e54 0x1 bin/usb.o - *fill* 0x0000000020005e55 0x3 + 0x00000000200066ac 0x4 bin/usb.o + .bss.isInit 0x00000000200066b0 0x1 bin/usb.o + *fill* 0x00000000200066b1 0x3 .bss.usbDataTx - 0x0000000020005e58 0x4 bin/usb.o - .bss.inPacket 0x0000000020005e5c 0x41 bin/usb.o - *fill* 0x0000000020005e9d 0x3 + 0x00000000200066b4 0x4 bin/usb.o + .bss.inPacket 0x00000000200066b8 0x41 bin/usb.o + *fill* 0x00000000200066f9 0x3 .bss.varianceSampleTime - 0x0000000020005ea0 0x4 bin/imu_cf2.o + 0x00000000200066fc 0x4 bin/imu_cf2.o .bss.accelStoredFilterValues - 0x0000000020005ea4 0xc bin/imu_cf2.o - .bss.accelLPF 0x0000000020005eb0 0x6 bin/imu_cf2.o - .bss.isInit 0x0000000020005eb6 0x1 bin/imu_cf2.o - *fill* 0x0000000020005eb7 0x1 + 0x0000000020006700 0xc bin/imu_cf2.o + .bss.accelLPF 0x000000002000670c 0x6 bin/imu_cf2.o + .bss.isInit 0x0000000020006712 0x1 bin/imu_cf2.o + *fill* 0x0000000020006713 0x1 .bss.accelLPFAligned - 0x0000000020005eb8 0x6 bin/imu_cf2.o + 0x0000000020006714 0x6 bin/imu_cf2.o .bss.isMagPresent - 0x0000000020005ebe 0x1 bin/imu_cf2.o - *fill* 0x0000000020005ebf 0x1 - .bss.mag 0x0000000020005ec0 0x6 bin/imu_cf2.o + 0x000000002000671a 0x1 bin/imu_cf2.o + *fill* 0x000000002000671b 0x1 + .bss.mag 0x000000002000671c 0x6 bin/imu_cf2.o .bss.imuAccLpfAttFactor - 0x0000000020005ec6 0x1 bin/imu_cf2.o - *fill* 0x0000000020005ec7 0x1 - .bss.gyroMpu 0x0000000020005ec8 0x6 bin/imu_cf2.o - .bss.accelMpu 0x0000000020005ece 0x6 bin/imu_cf2.o + 0x0000000020006722 0x1 bin/imu_cf2.o + *fill* 0x0000000020006723 0x1 + .bss.gyroMpu 0x0000000020006724 0x6 bin/imu_cf2.o + .bss.accelMpu 0x000000002000672a 0x6 bin/imu_cf2.o .bss.isBaroPresent - 0x0000000020005ed4 0x1 bin/imu_cf2.o - *fill* 0x0000000020005ed5 0x3 + 0x0000000020006730 0x1 bin/imu_cf2.o + *fill* 0x0000000020006731 0x3 .bss.batteryVoltageMax - 0x0000000020005ed8 0x4 bin/pm_f405.o + 0x0000000020006734 0x4 bin/pm_f405.o .bss.pmSyslinkInfo - 0x0000000020005edc 0x9 bin/pm_f405.o - *fill* 0x0000000020005ee5 0x3 + 0x0000000020006738 0x9 bin/pm_f405.o + *fill* 0x0000000020006741 0x3 .bss.batteryLowTimeStamp - 0x0000000020005ee8 0x4 bin/pm_f405.o + 0x0000000020006744 0x4 bin/pm_f405.o .bss.batteryCriticalLowTimeStamp - 0x0000000020005eec 0x4 bin/pm_f405.o + 0x0000000020006748 0x4 bin/pm_f405.o .bss.batteryVoltage - 0x0000000020005ef0 0x4 bin/pm_f405.o - .bss.isInit 0x0000000020005ef4 0x1 bin/pm_f405.o - .bss.pmState 0x0000000020005ef5 0x1 bin/pm_f405.o + 0x000000002000674c 0x4 bin/pm_f405.o + .bss.isInit 0x0000000020006750 0x1 bin/pm_f405.o + .bss.pmState 0x0000000020006751 0x1 bin/pm_f405.o .bss.sendBuffer - 0x0000000020005ef6 0x40 bin/syslink.o - .bss.isInit 0x0000000020005f36 0x1 bin/syslink.o - *fill* 0x0000000020005f37 0x1 + 0x0000000020006752 0x40 bin/syslink.o + .bss.isInit 0x0000000020006792 0x1 bin/syslink.o + *fill* 0x0000000020006793 0x1 .bss.syslinkAccess - 0x0000000020005f38 0x4 bin/syslink.o - .bss.txPacket.5022 - 0x0000000020005f3c 0x22 bin/radiolink.o - .bss.slp.5029 0x0000000020005f5e 0x22 bin/radiolink.o - .bss.rssi 0x0000000020005f80 0x1 bin/radiolink.o - .bss.isInit 0x0000000020005f81 0x1 bin/radiolink.o - *fill* 0x0000000020005f82 0x2 - .bss.txQueue 0x0000000020005f84 0x4 bin/radiolink.o + 0x0000000020006794 0x4 bin/syslink.o + .bss.rssi 0x0000000020006798 0x1 bin/radiolink.o + .bss.isInit 0x0000000020006799 0x1 bin/radiolink.o + *fill* 0x000000002000679a 0x2 + .bss.txQueue 0x000000002000679c 0x4 bin/radiolink.o .bss.crtpPacketDelivery - 0x0000000020005f88 0x4 bin/radiolink.o + 0x00000000200067a0 0x4 bin/radiolink.o + .bss.slp.5121 0x00000000200067a4 0x22 bin/radiolink.o + .bss.txPacket.5114 + 0x00000000200067c6 0x22 bin/radiolink.o .bss.lockCmdBuf - 0x0000000020005f8c 0x4 bin/ow_syslink.o + 0x00000000200067e8 0x4 bin/ow_syslink.o .bss.owDataIsValid - 0x0000000020005f90 0x1 bin/ow_syslink.o - .bss.owCmdBuf 0x0000000020005f91 0x20 bin/ow_syslink.o - *fill* 0x0000000020005fb1 0x3 + 0x00000000200067ec 0x1 bin/ow_syslink.o + .bss.owCmdBuf 0x00000000200067ed 0x20 bin/ow_syslink.o + *fill* 0x000000002000680d 0x3 .bss.waitForReply - 0x0000000020005fb4 0x4 bin/ow_syslink.o - .bss.step.8870 - 0x0000000020005fb8 0x4 bin/neopixelring.o - .bss.brightness.8932 - 0x0000000020005fbc 0x1 bin/neopixelring.o - .bss.black 0x0000000020005fbd 0x24 bin/neopixelring.o - *fill* 0x0000000020005fe1 0x3 - .bss.gyroZid.8930 - 0x0000000020005fe4 0x4 bin/neopixelring.o - .bss.buffer.8990 - 0x0000000020005fe8 0x1b bin/neopixelring.o - .bss.test_front - 0x0000000020006003 0x1 bin/neopixelring.o - .bss.sub2.8868 - 0x0000000020006004 0x1b bin/neopixelring.o - *fill* 0x000000002000601f 0x1 - .bss.current_effect.8989 - 0x0000000020006020 0x4 bin/neopixelring.o - .bss.brightness.8808 - 0x0000000020006024 0x4 bin/neopixelring.o - .bss.timer 0x0000000020006028 0x4 bin/neopixelring.o - .bss.headlightEnable - 0x000000002000602c 0x1 bin/neopixelring.o - *fill* 0x000000002000602d 0x3 - .bss.pitchid.8878 - 0x0000000020006030 0x4 bin/neopixelring.o - .bss.neffect 0x0000000020006034 0x4 bin/neopixelring.o - .bss.gyroYid.8929 - 0x0000000020006038 0x4 bin/neopixelring.o - .bss.isInitialized.8901 - 0x000000002000603c 0x1 bin/neopixelring.o - *fill* 0x000000002000603d 0x3 - .bss.rollid.8900 - 0x0000000020006040 0x4 bin/neopixelring.o - .bss.brightness.8953 - 0x0000000020006044 0x4 bin/neopixelring.o - .bss.tic.8974 0x0000000020006048 0x4 bin/neopixelring.o - .bss.pitchid.8899 - 0x000000002000604c 0x4 bin/neopixelring.o + 0x0000000020006810 0x4 bin/ow_syslink.o + .bss.isInit 0x0000000020006814 0x1 bin/platformservice.o + *fill* 0x0000000020006815 0x3 + .bss.neffect 0x0000000020006818 0x4 bin/sound_cf2.o + .bss.pitch 0x000000002000681c 0x4 bin/sound_cf2.o + .bss.user_effect + 0x0000000020006820 0x4 bin/sound_cf2.o + .bss.rollid 0x0000000020006824 0x4 bin/sound_cf2.o + .bss.isInit 0x0000000020006828 0x1 bin/sound_cf2.o + *fill* 0x0000000020006829 0x3 + .bss.sys_effect + 0x000000002000682c 0x4 bin/sound_cf2.o + .bss.pitchid 0x0000000020006830 0x4 bin/sound_cf2.o + .bss.counter 0x0000000020006834 0x4 bin/sound_cf2.o + .bss.tilt_freq + 0x0000000020006838 0x4 bin/sound_cf2.o + .bss.timer 0x000000002000683c 0x4 bin/sound_cf2.o + .bss.mcounter 0x0000000020006840 0x4 bin/sound_cf2.o + .bss.tilt_ratio + 0x0000000020006844 0x4 bin/sound_cf2.o + .bss.roll 0x0000000020006848 0x4 bin/sound_cf2.o + .bss.static_ratio + 0x000000002000684c 0x1 bin/sound_cf2.o + *fill* 0x000000002000684d 0x3 + .bss.count 0x0000000020006850 0x4 bin/deck_info.o + .bss.dummyDriver + 0x0000000020006854 0x18 bin/deck_info.o + .bss.deckInfos + 0x000000002000686c 0x1f0 bin/deck_info.o + .bss.isInit.8542 + 0x0000000020006a5c 0x1 bin/deck_info.o + *fill* 0x0000000020006a5d 0x3 + .bss.driversLen + 0x0000000020006a60 0x4 bin/deck_drivers.o + .bss.init.8469 + 0x0000000020006a64 0x1 bin/deck_drivers.o + *fill* 0x0000000020006a65 0x3 + .bss.drivers 0x0000000020006a68 0x4 bin/deck_drivers.o + .bss.isInit 0x0000000020006a6c 0x1 bin/bigquad.o + *fill* 0x0000000020006a6d 0x3 + .bss.savedGPIORegs + 0x0000000020006a70 0x78 bin/exptest.o + .bss.isInit 0x0000000020006ae8 0x1 bin/exptest.o + *fill* 0x0000000020006ae9 0x3 + .bss.brightness.9323 + 0x0000000020006aec 0x4 bin/ledring12.o + .bss.gyroZid.9300 + 0x0000000020006af0 0x4 bin/ledring12.o + .bss.black 0x0000000020006af4 0x24 bin/ledring12.o + .bss.pitchid.9248 + 0x0000000020006b18 0x4 bin/ledring12.o + .bss.neffect 0x0000000020006b1c 0x4 bin/ledring12.o + .bss.buffer.9360 + 0x0000000020006b20 0x1b bin/ledring12.o + *fill* 0x0000000020006b3b 0x1 + .bss.brightness.9168 + 0x0000000020006b3c 0x4 bin/ledring12.o .bss.test_delay_counter - 0x0000000020006050 0x1 bin/neopixelring.o - .bss.sub1.8867 - 0x0000000020006051 0x1b bin/neopixelring.o + 0x0000000020006b40 0x1 bin/ledring12.o + *fill* 0x0000000020006b41 0x3 + .bss.tic.9344 0x0000000020006b44 0x4 bin/ledring12.o + .bss.pitchid.9269 + 0x0000000020006b48 0x4 bin/ledring12.o .bss.headlight_test_counter - 0x000000002000606c 0x1 bin/neopixelring.o - *fill* 0x000000002000606d 0x3 - .bss.vbatid.8964 - 0x0000000020006070 0x4 bin/neopixelring.o - .bss.rollid.8879 - 0x0000000020006074 0x4 bin/neopixelring.o + 0x0000000020006b4c 0x1 bin/ledring12.o + .bss.sub1.9237 + 0x0000000020006b4d 0x1b bin/ledring12.o + .bss.headlightEnable + 0x0000000020006b68 0x1 bin/ledring12.o + .bss.test_front + 0x0000000020006b69 0x1 bin/ledring12.o + *fill* 0x0000000020006b6a 0x2 + .bss.vbatid.9334 + 0x0000000020006b6c 0x4 bin/ledring12.o + .bss.rollid.9249 + 0x0000000020006b70 0x4 bin/ledring12.o + .bss.gyroYid.9299 + 0x0000000020006b74 0x4 bin/ledring12.o + .bss.rollid.9270 + 0x0000000020006b78 0x4 bin/ledring12.o + .bss.timer 0x0000000020006b7c 0x4 bin/ledring12.o + .bss.current_effect.9359 + 0x0000000020006b80 0x4 bin/ledring12.o + .bss.step.9240 + 0x0000000020006b84 0x4 bin/ledring12.o + .bss.brightness.9302 + 0x0000000020006b88 0x1 bin/ledring12.o .bss.test_eff_nbr - 0x0000000020006078 0x1 bin/neopixelring.o - .bss.expbrdData - 0x0000000020006079 0x28 bin/expbrd.o - .bss.isInit 0x00000000200060a1 0x1 bin/expbrd.o - .bss.nBoards 0x00000000200060a2 0x1 bin/expbrd.o - .bss.isInit 0x00000000200060a3 0x1 bin/platformservice.o - .bss.isInit 0x00000000200060a4 0x1 bin/bigquad.o - *fill* 0x00000000200060a5 0x3 - .bss.savedGPIORegs - 0x00000000200060a8 0x78 bin/exptest.o - .bss.isInit 0x0000000020006120 0x1 bin/exptest.o - .bss.cb_ok 0x0000000020006121 0x1 bin/configblockeeprom.o - .bss.isInit 0x0000000020006122 0x1 bin/configblockeeprom.o + 0x0000000020006b89 0x1 bin/ledring12.o + .bss.isInitialized.9271 + 0x0000000020006b8a 0x1 bin/ledring12.o + .bss.sub2.9238 + 0x0000000020006b8b 0x1b bin/ledring12.o + .bss.cb_ok 0x0000000020006ba6 0x1 bin/configblockeeprom.o + .bss.isInit 0x0000000020006ba7 0x1 bin/configblockeeprom.o .bss.configblock - 0x0000000020006123 0x15 bin/configblockeeprom.o + 0x0000000020006ba8 0x15 bin/configblockeeprom.o + *(COMMON) + *fill* 0x0000000020006bbd 0x3 + COMMON 0x0000000020006bc0 0x50 bin/queue.o + 0x0000000020006bc0 xQueueRegistry + COMMON 0x0000000020006c10 0x4 bin/motors.o + 0x0000000020006c10 motorMap + COMMON 0x0000000020006c14 0x4 bin/system.o + 0x0000000020006c14 canStartMutex + COMMON 0x0000000020006c18 0x20 bin/console.o + 0x0000000020006c18 messageToPrint + COMMON 0x0000000020006c38 0x20 bin/param.o + 0x0000000020006c38 p + COMMON 0x0000000020006c58 0x158 bin/controller.o + 0x0000000020006c58 pidRoll + 0x0000000020006c90 yawOutput + 0x0000000020006c92 pitchOutput + 0x0000000020006c94 pidYawRate + 0x0000000020006ccc rollOutput + 0x0000000020006cd0 pidPitchRate + 0x0000000020006d08 pidPitch + 0x0000000020006d40 pidRollRate + 0x0000000020006d78 pidYaw + COMMON 0x0000000020006db0 0x1a bin/stabilizer.o + 0x0000000020006db0 motorPowerM3 + 0x0000000020006db4 actuatorYaw + 0x0000000020006db6 actuatorThrust + 0x0000000020006db8 motorPowerM2 + 0x0000000020006dbc motorPowerM4 + 0x0000000020006dc0 actuatorRoll + 0x0000000020006dc4 motorPowerM1 + 0x0000000020006dc8 actuatorPitch + *fill* 0x0000000020006dca 0x2 + COMMON 0x0000000020006dcc 0x10 bin/cpal_i2c.o + 0x0000000020006dcc I2C_InitStructure + COMMON 0x0000000020006ddc 0x3c bin/cpal_i2c_hal_stm32f4xx.o + 0x0000000020006ddc CPAL_DMA_InitStructure + COMMON 0x0000000020006e18 0xff bin/usbd_req.o + 0x0000000020006e18 USBD_StrDesc + *fill* 0x0000000020006f17 0x1 + COMMON 0x0000000020006f18 0x4 bin/usbd_core.o + 0x0000000020006f18 SET_TEST_MODE + COMMON 0x0000000020006f1c 0x2c bin/i2cdev_f405.o + 0x0000000020006f1c i2cdevDmaEventI2c3 + 0x0000000020006f20 i2cdevDmaEventI2c1 + 0x0000000020006f24 txTransfer + 0x0000000020006f34 i2cdevDmaEventI2c2 + 0x0000000020006f38 rxTransfer + COMMON 0x0000000020006f48 0x8 bin/sonar.o + 0x0000000020006f48 sonarRange + 0x0000000020006f4a pulse_start + 0x0000000020006f4c pulse_end + 0x0000000020006f4e pulse_time + COMMON 0x0000000020006f50 0x5f4 bin/usb.o + 0x0000000020006f50 USB_OTG_dev + COMMON 0x0000000020007544 0x31c bin/imu_cf2.o + 0x0000000020007544 cosPitch + 0x0000000020007548 cosRoll + 0x000000002000754c sinPitch + 0x0000000020007550 gyroBias + 0x000000002000785c sinRoll + COMMON 0x0000000020007860 0x12 bin/ledring12.o + 0x0000000020007860 ledringmem + 0x0000000020007874 . = ALIGN (0x4) + *fill* 0x0000000020007872 0x2 + 0x0000000020007874 _ebss = . + +.nzds 0x0000000020007874 0xc load address 0x000000000801ee98 + 0x0000000020007874 . = ALIGN (0x4) + 0x0000000020007874 _snzds = . + *(.nzds) + .nzds 0x0000000020007874 0xc bin/cfassert.o + 0x0000000020007874 snapshot + *(.nzds.*) *(COMMON) - COMMON 0x0000000020006138 0x4 bin/motors.o - 0x0000000020006138 motorMap - COMMON 0x000000002000613c 0x4 bin/system.o - 0x000000002000613c canStartMutex - COMMON 0x0000000020006140 0x20 bin/console.o - 0x0000000020006140 messageToPrint - COMMON 0x0000000020006160 0x20 bin/param.o - 0x0000000020006160 p - COMMON 0x0000000020006180 0x158 bin/controller.o - 0x0000000020006180 pidRoll - 0x00000000200061b8 yawOutput - 0x00000000200061ba pitchOutput - 0x00000000200061bc pidYawRate - 0x00000000200061f4 rollOutput - 0x00000000200061f8 pidPitchRate - 0x0000000020006230 pidPitch - 0x0000000020006268 pidRollRate - 0x00000000200062a0 pidYaw - COMMON 0x00000000200062d8 0x1a bin/stabilizer.o - 0x00000000200062d8 motorPowerM3 - 0x00000000200062dc actuatorYaw - 0x00000000200062de actuatorThrust - 0x00000000200062e0 motorPowerM2 - 0x00000000200062e4 motorPowerM4 - 0x00000000200062e8 actuatorRoll - 0x00000000200062ec motorPowerM1 - 0x00000000200062f0 actuatorPitch - *fill* 0x00000000200062f2 0x2 - COMMON 0x00000000200062f4 0x10 bin/cpal_i2c.o - 0x00000000200062f4 I2C_InitStructure - COMMON 0x0000000020006304 0x3c bin/cpal_i2c_hal_stm32f4xx.o - 0x0000000020006304 CPAL_DMA_InitStructure - COMMON 0x0000000020006340 0xff bin/usbd_req.o - 0x0000000020006340 USBD_StrDesc - *fill* 0x000000002000643f 0x1 - COMMON 0x0000000020006440 0x4 bin/usbd_core.o - 0x0000000020006440 SET_TEST_MODE - COMMON 0x0000000020006444 0x2c bin/i2cdev_f405.o - 0x0000000020006444 i2cdevDmaEventI2c3 - 0x0000000020006448 i2cdevDmaEventI2c1 - 0x000000002000644c txTransfer - 0x000000002000645c i2cdevDmaEventI2c2 - 0x0000000020006460 rxTransfer - COMMON 0x0000000020006470 0x8 bin/sonar.o - 0x0000000020006470 sonarRange - 0x0000000020006472 pulse_start - 0x0000000020006474 pulse_end - 0x0000000020006476 pulse_time - COMMON 0x0000000020006478 0x5f4 bin/usb.o - 0x0000000020006478 USB_OTG_dev - COMMON 0x0000000020006a6c 0x31c bin/imu_cf2.o - 0x0000000020006a6c cosPitch - 0x0000000020006a70 cosRoll - 0x0000000020006a74 sinPitch - 0x0000000020006a78 gyroBias - 0x0000000020006d84 sinRoll - 0x0000000020006d88 . = ALIGN (0x4) - 0x0000000020006d88 _ebss = . - 0x0000000020006d88 PROVIDE (end, _ebss) - 0x0000000020006d88 PROVIDE (_end, _ebss) + 0x0000000020007880 . = ALIGN (0x4) + 0x0000000020007880 _enzds = . + 0x0000000020007880 PROVIDE (end, _enzds) + 0x0000000020007880 PROVIDE (_end, _enzds) -._usrstack 0x0000000020006d88 0x100 load address 0x000000000801c128 - 0x0000000020006d88 . = ALIGN (0x4) - 0x0000000020006d88 _susrstack = . - 0x0000000020006e88 . = (. + _Minimum_Stack_Size) - *fill* 0x0000000020006d88 0x100 - 0x0000000020006e88 . = ALIGN (0x4) - 0x0000000020006e88 _eusrstack = . +._usrstack 0x0000000020007880 0x100 load address 0x000000000801eea4 + 0x0000000020007880 . = ALIGN (0x4) + 0x0000000020007880 _susrstack = . + 0x0000000020007980 . = (. + _Minimum_Stack_Size) + *fill* 0x0000000020007880 0x100 + 0x0000000020007980 . = ALIGN (0x4) + 0x0000000020007980 _eusrstack = . .b1text *(.b1text) @@ -12941,8 +14178,8 @@ LOAD /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none- *(.eb3text) *(.eb3rodata) *(.eb3rodata*) - 0x0000000020006e88 __exidx_start = . - 0x0000000020006e88 __exidx_end = . + 0x0000000020007980 __exidx_start = . + 0x0000000020007980 __exidx_end = . /DISCARD/ libc.a(*) @@ -12982,6 +14219,7 @@ LOAD /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none- .comment 0x0000000000000000 0x71 bin/stm32f4xx_exti.o .comment 0x0000000000000000 0x71 bin/stm32f4xx_gpio.o .comment 0x0000000000000000 0x71 bin/stm32f4xx_i2c.o + .comment 0x0000000000000000 0x71 bin/stm32f4xx_iwdg.o .comment 0x0000000000000000 0x71 bin/stm32f4xx_rcc.o .comment 0x0000000000000000 0x71 bin/stm32f4xx_tim.o .comment 0x0000000000000000 0x71 bin/stm32f4xx_usart.o @@ -12994,6 +14232,7 @@ LOAD /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none- .comment 0x0000000000000000 0x71 bin/crtp.o .comment 0x0000000000000000 0x71 bin/ledseq.o .comment 0x0000000000000000 0x71 bin/freeRTOSdebug.o + .comment 0x0000000000000000 0x71 bin/buzzer.o .comment 0x0000000000000000 0x71 bin/system.o .comment 0x0000000000000000 0x71 bin/comm.o .comment 0x0000000000000000 0x71 bin/console.o @@ -13013,10 +14252,10 @@ LOAD /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none- .comment 0x0000000000000000 0x71 bin/crc.o .comment 0x0000000000000000 0x71 bin/fp16.o .comment 0x0000000000000000 0x71 bin/version.o + .comment 0x0000000000000000 0x71 bin/FreeRTOS-openocd.o .comment 0x0000000000000000 0x71 bin/system_stm32f4xx.o .comment 0x0000000000000000 0x71 bin/cpal_hal.o .comment 0x0000000000000000 0x71 bin/cpal_i2c.o - .comment 0x0000000000000000 0x71 bin/cpal_usercallback_template.o .comment 0x0000000000000000 0x71 bin/cpal_i2c_hal_stm32f4xx.o .comment 0x0000000000000000 0x71 bin/usb_core.o .comment 0x0000000000000000 0x71 bin/usb_dcd_int.o @@ -13028,11 +14267,13 @@ LOAD /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none- .comment 0x0000000000000000 0x71 bin/led_f405.o .comment 0x0000000000000000 0x71 bin/mpu6500.o .comment 0x0000000000000000 0x71 bin/i2cdev_f405.o - .comment 0x0000000000000000 0x71 bin/ws2812.o + .comment 0x0000000000000000 0x71 bin/ws2812_cf2.o .comment 0x0000000000000000 0x71 bin/lps25h.o .comment 0x0000000000000000 0x71 bin/ak8963.o .comment 0x0000000000000000 0x71 bin/eeprom.o + .comment 0x0000000000000000 0x71 bin/piezo.o .comment 0x0000000000000000 0x71 bin/uart_syslink.o + .comment 0x0000000000000000 0x71 bin/watchdog.o .comment 0x0000000000000000 0x71 bin/sonar.o .comment 0x0000000000000000 0x71 bin/usb_bsp.o .comment 0x0000000000000000 0x71 bin/usblink.o @@ -13043,12 +14284,16 @@ LOAD /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none- .comment 0x0000000000000000 0x71 bin/syslink.o .comment 0x0000000000000000 0x71 bin/radiolink.o .comment 0x0000000000000000 0x71 bin/ow_syslink.o - .comment 0x0000000000000000 0x71 bin/neopixelring.o - .comment 0x0000000000000000 0x71 bin/expbrd.o .comment 0x0000000000000000 0x71 bin/platformservice.o + .comment 0x0000000000000000 0x71 bin/sound_cf2.o + .comment 0x0000000000000000 0x71 bin/deck.o + .comment 0x0000000000000000 0x71 bin/deck_info.o + .comment 0x0000000000000000 0x71 bin/deck_drivers.o + .comment 0x0000000000000000 0x71 bin/deck_analog.o + .comment 0x0000000000000000 0x71 bin/buzzdeck.o .comment 0x0000000000000000 0x71 bin/bigquad.o .comment 0x0000000000000000 0x71 bin/exptest.o - .comment 0x0000000000000000 0x71 bin/deck_analog.o + .comment 0x0000000000000000 0x71 bin/ledring12.o .comment 0x0000000000000000 0x71 bin/configblockeeprom.o .ARM.attributes @@ -13078,233 +14323,249 @@ LOAD /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none- .ARM.attributes 0x0000000000000273 0x39 bin/stm32f4xx_i2c.o .ARM.attributes - 0x00000000000002ac 0x39 bin/stm32f4xx_rcc.o + 0x00000000000002ac 0x39 bin/stm32f4xx_iwdg.o + .ARM.attributes + 0x00000000000002e5 0x39 bin/stm32f4xx_rcc.o + .ARM.attributes + 0x000000000000031e 0x39 bin/stm32f4xx_tim.o + .ARM.attributes + 0x0000000000000357 0x39 bin/stm32f4xx_usart.o + .ARM.attributes + 0x0000000000000390 0x39 bin/stm32f4xx_misc.o + .ARM.attributes + 0x00000000000003c9 0x39 bin/stm32f4xx_syscfg.o .ARM.attributes - 0x00000000000002e5 0x39 bin/stm32f4xx_tim.o + 0x0000000000000402 0x39 bin/main.o .ARM.attributes - 0x000000000000031e 0x39 bin/stm32f4xx_usart.o + 0x000000000000043b 0x39 bin/exti.o .ARM.attributes - 0x0000000000000357 0x39 bin/stm32f4xx_misc.o + 0x0000000000000474 0x39 bin/nvic.o .ARM.attributes - 0x0000000000000390 0x39 bin/stm32f4xx_syscfg.o + 0x00000000000004ad 0x39 bin/motors.o .ARM.attributes - 0x00000000000003c9 0x39 bin/main.o + 0x00000000000004e6 0x39 bin/crtp.o .ARM.attributes - 0x0000000000000402 0x39 bin/exti.o + 0x000000000000051f 0x39 bin/ledseq.o .ARM.attributes - 0x000000000000043b 0x39 bin/nvic.o + 0x0000000000000558 0x39 bin/freeRTOSdebug.o .ARM.attributes - 0x0000000000000474 0x39 bin/motors.o + 0x0000000000000591 0x39 bin/buzzer.o .ARM.attributes - 0x00000000000004ad 0x39 bin/crtp.o + 0x00000000000005ca 0x39 bin/system.o .ARM.attributes - 0x00000000000004e6 0x39 bin/ledseq.o + 0x0000000000000603 0x39 bin/comm.o .ARM.attributes - 0x000000000000051f 0x39 bin/freeRTOSdebug.o + 0x000000000000063c 0x39 bin/console.o .ARM.attributes - 0x0000000000000558 0x39 bin/system.o + 0x0000000000000675 0x39 bin/pid.o .ARM.attributes - 0x0000000000000591 0x39 bin/comm.o + 0x00000000000006ae 0x39 bin/crtpservice.o .ARM.attributes - 0x00000000000005ca 0x39 bin/console.o + 0x00000000000006e7 0x39 bin/param.o .ARM.attributes - 0x0000000000000603 0x39 bin/pid.o + 0x0000000000000720 0x39 bin/mem.o .ARM.attributes - 0x000000000000063c 0x39 bin/crtpservice.o + 0x0000000000000759 0x39 bin/commander.o .ARM.attributes - 0x0000000000000675 0x39 bin/param.o + 0x0000000000000792 0x39 bin/controller.o .ARM.attributes - 0x00000000000006ae 0x39 bin/mem.o + 0x00000000000007cb 0x39 bin/sensfusion6.o .ARM.attributes - 0x00000000000006e7 0x39 bin/commander.o + 0x0000000000000804 0x39 bin/stabilizer.o .ARM.attributes - 0x0000000000000720 0x39 bin/controller.o + 0x000000000000083d 0x39 bin/log.o .ARM.attributes - 0x0000000000000759 0x39 bin/sensfusion6.o + 0x0000000000000876 0x39 bin/worker.o .ARM.attributes - 0x0000000000000792 0x39 bin/stabilizer.o + 0x00000000000008af 0x39 bin/filter.o .ARM.attributes - 0x00000000000007cb 0x39 bin/log.o + 0x00000000000008e8 0x39 bin/cfassert.o .ARM.attributes - 0x0000000000000804 0x39 bin/worker.o + 0x0000000000000921 0x39 bin/eprintf.o .ARM.attributes - 0x000000000000083d 0x39 bin/filter.o + 0x000000000000095a 0x39 bin/crc.o .ARM.attributes - 0x0000000000000876 0x39 bin/cfassert.o + 0x0000000000000993 0x39 bin/fp16.o .ARM.attributes - 0x00000000000008af 0x39 bin/eprintf.o + 0x00000000000009cc 0x39 bin/version.o .ARM.attributes - 0x00000000000008e8 0x39 bin/crc.o + 0x0000000000000a05 0x39 bin/FreeRTOS-openocd.o .ARM.attributes - 0x0000000000000921 0x39 bin/fp16.o + 0x0000000000000a3e 0x21 bin/startup_stm32f40xx.o .ARM.attributes - 0x000000000000095a 0x39 bin/version.o + 0x0000000000000a5f 0x39 bin/system_stm32f4xx.o .ARM.attributes - 0x0000000000000993 0x21 bin/startup_stm32f40xx.o + 0x0000000000000a98 0x39 bin/cpal_hal.o .ARM.attributes - 0x00000000000009b4 0x39 bin/system_stm32f4xx.o + 0x0000000000000ad1 0x39 bin/cpal_i2c.o .ARM.attributes - 0x00000000000009ed 0x39 bin/cpal_hal.o + 0x0000000000000b0a 0x39 bin/cpal_i2c_hal_stm32f4xx.o .ARM.attributes - 0x0000000000000a26 0x39 bin/cpal_i2c.o + 0x0000000000000b43 0x39 bin/usb_core.o .ARM.attributes - 0x0000000000000a5f 0x39 bin/cpal_usercallback_template.o + 0x0000000000000b7c 0x39 bin/usb_dcd_int.o .ARM.attributes - 0x0000000000000a98 0x39 bin/cpal_i2c_hal_stm32f4xx.o + 0x0000000000000bb5 0x39 bin/usb_dcd.o .ARM.attributes - 0x0000000000000ad1 0x39 bin/usb_core.o + 0x0000000000000bee 0x39 bin/usbd_ioreq.o .ARM.attributes - 0x0000000000000b0a 0x39 bin/usb_dcd_int.o + 0x0000000000000c27 0x39 bin/usbd_req.o .ARM.attributes - 0x0000000000000b43 0x39 bin/usb_dcd.o + 0x0000000000000c60 0x39 bin/usbd_core.o .ARM.attributes - 0x0000000000000b7c 0x39 bin/usbd_ioreq.o + 0x0000000000000c99 0x39 bin/platform_cf2.o .ARM.attributes - 0x0000000000000bb5 0x39 bin/usbd_req.o + 0x0000000000000cd2 0x39 bin/led_f405.o .ARM.attributes - 0x0000000000000bee 0x39 bin/usbd_core.o + 0x0000000000000d0b 0x39 bin/mpu6500.o .ARM.attributes - 0x0000000000000c27 0x39 bin/platform_cf2.o + 0x0000000000000d44 0x39 bin/i2cdev_f405.o .ARM.attributes - 0x0000000000000c60 0x39 bin/led_f405.o + 0x0000000000000d7d 0x39 bin/ws2812_cf2.o .ARM.attributes - 0x0000000000000c99 0x39 bin/mpu6500.o + 0x0000000000000db6 0x39 bin/lps25h.o .ARM.attributes - 0x0000000000000cd2 0x39 bin/i2cdev_f405.o + 0x0000000000000def 0x39 bin/ak8963.o .ARM.attributes - 0x0000000000000d0b 0x39 bin/ws2812.o + 0x0000000000000e28 0x39 bin/eeprom.o .ARM.attributes - 0x0000000000000d44 0x39 bin/lps25h.o + 0x0000000000000e61 0x39 bin/piezo.o .ARM.attributes - 0x0000000000000d7d 0x39 bin/ak8963.o + 0x0000000000000e9a 0x39 bin/uart_syslink.o .ARM.attributes - 0x0000000000000db6 0x39 bin/eeprom.o + 0x0000000000000ed3 0x39 bin/watchdog.o .ARM.attributes - 0x0000000000000def 0x39 bin/uart_syslink.o + 0x0000000000000f0c 0x39 bin/sonar.o .ARM.attributes - 0x0000000000000e28 0x39 bin/sonar.o + 0x0000000000000f45 0x39 bin/usb_bsp.o .ARM.attributes - 0x0000000000000e61 0x39 bin/usb_bsp.o + 0x0000000000000f7e 0x39 bin/usblink.o .ARM.attributes - 0x0000000000000e9a 0x39 bin/usblink.o + 0x0000000000000fb7 0x39 bin/usbd_desc.o .ARM.attributes - 0x0000000000000ed3 0x39 bin/usbd_desc.o + 0x0000000000000ff0 0x39 bin/usb.o .ARM.attributes - 0x0000000000000f0c 0x39 bin/usb.o + 0x0000000000001029 0x39 bin/imu_cf2.o .ARM.attributes - 0x0000000000000f45 0x39 bin/imu_cf2.o + 0x0000000000001062 0x39 bin/pm_f405.o .ARM.attributes - 0x0000000000000f7e 0x39 bin/pm_f405.o + 0x000000000000109b 0x39 bin/syslink.o .ARM.attributes - 0x0000000000000fb7 0x39 bin/syslink.o + 0x00000000000010d4 0x39 bin/radiolink.o .ARM.attributes - 0x0000000000000ff0 0x39 bin/radiolink.o + 0x000000000000110d 0x39 bin/ow_syslink.o .ARM.attributes - 0x0000000000001029 0x39 bin/ow_syslink.o + 0x0000000000001146 0x39 bin/platformservice.o .ARM.attributes - 0x0000000000001062 0x39 bin/neopixelring.o + 0x000000000000117f 0x39 bin/sound_cf2.o .ARM.attributes - 0x000000000000109b 0x39 bin/expbrd.o + 0x00000000000011b8 0x39 bin/deck.o .ARM.attributes - 0x00000000000010d4 0x39 bin/platformservice.o + 0x00000000000011f1 0x39 bin/deck_info.o .ARM.attributes - 0x000000000000110d 0x39 bin/bigquad.o + 0x000000000000122a 0x39 bin/deck_drivers.o .ARM.attributes - 0x0000000000001146 0x39 bin/exptest.o + 0x0000000000001263 0x39 bin/deck_analog.o .ARM.attributes - 0x000000000000117f 0x39 bin/deck_analog.o + 0x000000000000129c 0x39 bin/buzzdeck.o .ARM.attributes - 0x00000000000011b8 0x39 bin/configblockeeprom.o + 0x00000000000012d5 0x39 bin/bigquad.o .ARM.attributes - 0x00000000000011f1 0x34 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libm.a(lib_a-sf_atan.o) + 0x000000000000130e 0x39 bin/exptest.o .ARM.attributes - 0x0000000000001225 0x34 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libm.a(lib_a-sf_cos.o) + 0x0000000000001347 0x39 bin/ledring12.o .ARM.attributes - 0x0000000000001259 0x34 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libm.a(lib_a-sf_fabs.o) + 0x0000000000001380 0x39 bin/configblockeeprom.o .ARM.attributes - 0x000000000000128d 0x34 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libm.a(lib_a-sf_sin.o) + 0x00000000000013b9 0x34 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libm.a(lib_a-sf_atan.o) .ARM.attributes - 0x00000000000012c1 0x34 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libm.a(lib_a-sf_tan.o) + 0x00000000000013ed 0x34 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libm.a(lib_a-sf_cos.o) .ARM.attributes - 0x00000000000012f5 0x34 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libm.a(lib_a-wf_asin.o) + 0x0000000000001421 0x34 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libm.a(lib_a-sf_fabs.o) .ARM.attributes - 0x0000000000001329 0x34 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libm.a(lib_a-wf_atan2.o) + 0x0000000000001455 0x34 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libm.a(lib_a-sf_sin.o) .ARM.attributes - 0x000000000000135d 0x34 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libm.a(lib_a-wf_pow.o) + 0x0000000000001489 0x34 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libm.a(lib_a-sf_tan.o) .ARM.attributes - 0x0000000000001391 0x34 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libm.a(lib_a-ef_asin.o) + 0x00000000000014bd 0x34 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libm.a(lib_a-wf_asin.o) .ARM.attributes - 0x00000000000013c5 0x34 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libm.a(lib_a-ef_atan2.o) + 0x00000000000014f1 0x34 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libm.a(lib_a-wf_atan2.o) .ARM.attributes - 0x00000000000013f9 0x34 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libm.a(lib_a-ef_pow.o) + 0x0000000000001525 0x34 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libm.a(lib_a-wf_pow.o) .ARM.attributes - 0x000000000000142d 0x34 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libm.a(lib_a-ef_rem_pio2.o) + 0x0000000000001559 0x34 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libm.a(lib_a-ef_asin.o) .ARM.attributes - 0x0000000000001461 0x34 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libm.a(lib_a-ef_sqrt.o) + 0x000000000000158d 0x34 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libm.a(lib_a-ef_atan2.o) .ARM.attributes - 0x0000000000001495 0x34 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libm.a(lib_a-kf_cos.o) + 0x00000000000015c1 0x34 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libm.a(lib_a-ef_pow.o) .ARM.attributes - 0x00000000000014c9 0x34 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libm.a(lib_a-kf_rem_pio2.o) + 0x00000000000015f5 0x34 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libm.a(lib_a-ef_rem_pio2.o) .ARM.attributes - 0x00000000000014fd 0x34 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libm.a(lib_a-kf_sin.o) + 0x0000000000001629 0x34 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libm.a(lib_a-ef_sqrt.o) .ARM.attributes - 0x0000000000001531 0x34 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libm.a(lib_a-kf_tan.o) + 0x000000000000165d 0x34 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libm.a(lib_a-kf_cos.o) .ARM.attributes - 0x0000000000001565 0x34 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libm.a(lib_a-s_lib_ver.o) + 0x0000000000001691 0x34 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libm.a(lib_a-kf_rem_pio2.o) .ARM.attributes - 0x0000000000001599 0x34 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libm.a(lib_a-s_matherr.o) + 0x00000000000016c5 0x34 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libm.a(lib_a-kf_sin.o) .ARM.attributes - 0x00000000000015cd 0x34 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libm.a(lib_a-s_nan.o) + 0x00000000000016f9 0x34 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libm.a(lib_a-kf_tan.o) .ARM.attributes - 0x0000000000001601 0x34 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libm.a(lib_a-s_rint.o) + 0x000000000000172d 0x34 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libm.a(lib_a-s_lib_ver.o) .ARM.attributes - 0x0000000000001635 0x34 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libm.a(lib_a-sf_finite.o) + 0x0000000000001761 0x34 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libm.a(lib_a-s_matherr.o) .ARM.attributes - 0x0000000000001669 0x34 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libm.a(lib_a-sf_floor.o) + 0x0000000000001795 0x34 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libm.a(lib_a-s_nan.o) .ARM.attributes - 0x000000000000169d 0x34 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libm.a(lib_a-sf_fpclassify.o) + 0x00000000000017c9 0x34 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libm.a(lib_a-s_rint.o) .ARM.attributes - 0x00000000000016d1 0x34 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libm.a(lib_a-sf_nan.o) + 0x00000000000017fd 0x34 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libm.a(lib_a-sf_finite.o) .ARM.attributes - 0x0000000000001705 0x34 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libm.a(lib_a-sf_scalbn.o) + 0x0000000000001831 0x34 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libm.a(lib_a-sf_floor.o) .ARM.attributes - 0x0000000000001739 0x34 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libm.a(lib_a-sf_copysign.o) + 0x0000000000001865 0x34 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libm.a(lib_a-sf_fpclassify.o) .ARM.attributes - 0x000000000000176d 0x22 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/armv7e-m/fpu/libgcc.a(_arm_addsubdf3.o) + 0x0000000000001899 0x34 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libm.a(lib_a-sf_nan.o) .ARM.attributes - 0x000000000000178f 0x22 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/armv7e-m/fpu/libgcc.a(_arm_muldivdf3.o) + 0x00000000000018cd 0x34 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libm.a(lib_a-sf_scalbn.o) .ARM.attributes - 0x00000000000017b1 0x22 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/armv7e-m/fpu/libgcc.a(_arm_cmpdf2.o) + 0x0000000000001901 0x34 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libm.a(lib_a-sf_copysign.o) .ARM.attributes - 0x00000000000017d3 0x22 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/armv7e-m/fpu/libgcc.a(_arm_truncdfsf2.o) + 0x0000000000001935 0x22 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/armv7e-m/fpu/libgcc.a(_arm_addsubdf3.o) .ARM.attributes - 0x00000000000017f5 0x22 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/armv7e-m/fpu/libgcc.a(_aeabi_ldivmod.o) + 0x0000000000001957 0x22 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/armv7e-m/fpu/libgcc.a(_arm_muldivdf3.o) .ARM.attributes - 0x0000000000001817 0x34 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/armv7e-m/fpu/libgcc.a(bpabi.o) + 0x0000000000001979 0x22 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/armv7e-m/fpu/libgcc.a(_arm_cmpdf2.o) .ARM.attributes - 0x000000000000184b 0x22 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/armv7e-m/fpu/libgcc.a(_dvmd_tls.o) + 0x000000000000199b 0x22 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/armv7e-m/fpu/libgcc.a(_arm_truncdfsf2.o) .ARM.attributes - 0x000000000000186d 0x34 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/armv7e-m/fpu/libgcc.a(_divdi3.o) + 0x00000000000019bd 0x22 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/armv7e-m/fpu/libgcc.a(_aeabi_ldivmod.o) .ARM.attributes - 0x00000000000018a1 0x34 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/armv7e-m/fpu/libgcc.a(_udivdi3.o) + 0x00000000000019df 0x34 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/armv7e-m/fpu/libgcc.a(bpabi.o) .ARM.attributes - 0x00000000000018d5 0x34 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libc_nano.a(lib_a-ctype_.o) + 0x0000000000001a13 0x22 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/armv7e-m/fpu/libgcc.a(_dvmd_tls.o) .ARM.attributes - 0x0000000000001909 0x34 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libc_nano.a(lib_a-errno.o) + 0x0000000000001a35 0x34 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/armv7e-m/fpu/libgcc.a(_divdi3.o) .ARM.attributes - 0x000000000000193d 0x34 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libc_nano.a(lib_a-impure.o) + 0x0000000000001a69 0x34 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/armv7e-m/fpu/libgcc.a(_udivdi3.o) .ARM.attributes - 0x0000000000001971 0x34 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libc_nano.a(lib_a-memcpy.o) + 0x0000000000001a9d 0x34 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libc_nano.a(lib_a-ctype_.o) .ARM.attributes - 0x00000000000019a5 0x34 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libc_nano.a(lib_a-memset.o) + 0x0000000000001ad1 0x34 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libc_nano.a(lib_a-errno.o) .ARM.attributes - 0x00000000000019d9 0x20 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libc_nano.a(lib_a-strcmp.o) + 0x0000000000001b05 0x34 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libc_nano.a(lib_a-impure.o) .ARM.attributes - 0x00000000000019f9 0x34 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libc_nano.a(lib_a-strcpy.o) + 0x0000000000001b39 0x34 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libc_nano.a(lib_a-memcpy.o) .ARM.attributes - 0x0000000000001a2d 0x34 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libc_nano.a(lib_a-strlen.o) + 0x0000000000001b6d 0x34 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libc_nano.a(lib_a-memset.o) .ARM.attributes - 0x0000000000001a61 0x34 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libc_nano.a(lib_a-strncpy.o) + 0x0000000000001ba1 0x20 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libc_nano.a(lib_a-strcmp.o) + .ARM.attributes + 0x0000000000001bc1 0x34 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libc_nano.a(lib_a-strcpy.o) + .ARM.attributes + 0x0000000000001bf5 0x34 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libc_nano.a(lib_a-strlen.o) + .ARM.attributes + 0x0000000000001c29 0x34 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libc_nano.a(lib_a-strncpy.o) .debug *(.debug) @@ -13318,778 +14579,849 @@ LOAD /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none- .debug_sfnames *(.debug_sfnames) -.debug_aranges 0x0000000000000000 0x2918 +.debug_aranges 0x0000000000000000 0x2bf0 *(.debug_aranges) .debug_aranges 0x0000000000000000 0x40 bin/list.o .debug_aranges - 0x0000000000000040 0x100 bin/tasks.o + 0x0000000000000040 0x168 bin/tasks.o + .debug_aranges + 0x00000000000001a8 0xd8 bin/queue.o + .debug_aranges + 0x0000000000000280 0x70 bin/timers.o + .debug_aranges + 0x00000000000002f0 0x48 bin/heap_4.o + .debug_aranges + 0x0000000000000338 0x80 bin/port.o + .debug_aranges + 0x00000000000003b8 0x148 bin/stm32f4xx_adc.o .debug_aranges - 0x0000000000000140 0xa0 bin/queue.o + 0x0000000000000500 0x40 bin/stm32f4xx_dbgmcu.o .debug_aranges - 0x00000000000001e0 0x60 bin/timers.o + 0x0000000000000540 0xb0 bin/stm32f4xx_dma.o .debug_aranges - 0x0000000000000240 0x40 bin/heap_4.o + 0x00000000000005f0 0x58 bin/stm32f4xx_exti.o .debug_aranges - 0x0000000000000280 0x88 bin/port.o + 0x0000000000000648 0x88 bin/stm32f4xx_gpio.o .debug_aranges - 0x0000000000000308 0x148 bin/stm32f4xx_adc.o + 0x00000000000006d0 0x130 bin/stm32f4xx_i2c.o .debug_aranges - 0x0000000000000450 0x40 bin/stm32f4xx_dbgmcu.o + 0x0000000000000800 0x48 bin/stm32f4xx_iwdg.o .debug_aranges - 0x0000000000000490 0xb0 bin/stm32f4xx_dma.o + 0x0000000000000848 0x1b8 bin/stm32f4xx_rcc.o .debug_aranges - 0x0000000000000540 0x58 bin/stm32f4xx_exti.o + 0x0000000000000a00 0x2e8 bin/stm32f4xx_tim.o .debug_aranges - 0x0000000000000598 0x88 bin/stm32f4xx_gpio.o + 0x0000000000000ce8 0x100 bin/stm32f4xx_usart.o .debug_aranges - 0x0000000000000620 0x130 bin/stm32f4xx_i2c.o + 0x0000000000000de8 0x40 bin/stm32f4xx_misc.o .debug_aranges - 0x0000000000000750 0x1b8 bin/stm32f4xx_rcc.o + 0x0000000000000e28 0x50 bin/stm32f4xx_syscfg.o .debug_aranges - 0x0000000000000908 0x2e8 bin/stm32f4xx_tim.o + 0x0000000000000e78 0x20 bin/main.o .debug_aranges - 0x0000000000000bf0 0x100 bin/stm32f4xx_usart.o + 0x0000000000000e98 0x30 bin/exti.o .debug_aranges - 0x0000000000000cf0 0x40 bin/stm32f4xx_misc.o + 0x0000000000000ec8 0x68 bin/nvic.o .debug_aranges - 0x0000000000000d30 0x50 bin/stm32f4xx_syscfg.o + 0x0000000000000f30 0x58 bin/motors.o .debug_aranges - 0x0000000000000d80 0x20 bin/main.o + 0x0000000000000f88 0x98 bin/crtp.o .debug_aranges - 0x0000000000000da0 0x30 bin/exti.o + 0x0000000000001020 0x58 bin/ledseq.o .debug_aranges - 0x0000000000000dd0 0x68 bin/nvic.o + 0x0000000000001078 0x30 bin/freeRTOSdebug.o .debug_aranges - 0x0000000000000e38 0x58 bin/motors.o + 0x00000000000010a8 0x40 bin/buzzer.o .debug_aranges - 0x0000000000000e90 0xa0 bin/crtp.o + 0x00000000000010e8 0x60 bin/system.o .debug_aranges - 0x0000000000000f30 0x58 bin/ledseq.o + 0x0000000000001148 0x28 bin/comm.o .debug_aranges - 0x0000000000000f88 0x30 bin/freeRTOSdebug.o + 0x0000000000001170 0x48 bin/console.o .debug_aranges - 0x0000000000000fb8 0x60 bin/system.o + 0x00000000000011b8 0x80 bin/pid.o .debug_aranges - 0x0000000000001018 0x28 bin/comm.o + 0x0000000000001238 0x30 bin/crtpservice.o .debug_aranges - 0x0000000000001040 0x48 bin/console.o + 0x0000000000001268 0x40 bin/param.o .debug_aranges - 0x0000000000001088 0x80 bin/pid.o + 0x00000000000012a8 0x30 bin/mem.o .debug_aranges - 0x0000000000001108 0x30 bin/crtpservice.o + 0x00000000000012d8 0x80 bin/commander.o .debug_aranges - 0x0000000000001138 0x40 bin/param.o + 0x0000000000001358 0x48 bin/controller.o .debug_aranges - 0x0000000000001178 0x30 bin/mem.o + 0x00000000000013a0 0x40 bin/sensfusion6.o .debug_aranges - 0x00000000000011a8 0x80 bin/commander.o + 0x00000000000013e0 0x40 bin/stabilizer.o .debug_aranges - 0x0000000000001228 0x48 bin/controller.o + 0x0000000000001420 0x80 bin/log.o .debug_aranges - 0x0000000000001270 0x40 bin/sensfusion6.o + 0x00000000000014a0 0x38 bin/worker.o .debug_aranges - 0x00000000000012b0 0x40 bin/stabilizer.o + 0x00000000000014d8 0x20 bin/filter.o .debug_aranges - 0x00000000000012f0 0x80 bin/log.o + 0x00000000000014f8 0x30 bin/cfassert.o .debug_aranges - 0x0000000000001370 0x38 bin/worker.o + 0x0000000000001528 0x40 bin/eprintf.o .debug_aranges - 0x00000000000013a8 0x20 bin/filter.o + 0x0000000000001568 0x20 bin/crc.o .debug_aranges - 0x00000000000013c8 0x20 bin/cfassert.o + 0x0000000000001588 0x28 bin/fp16.o .debug_aranges - 0x00000000000013e8 0x40 bin/eprintf.o + 0x00000000000015b0 0x18 bin/version.o .debug_aranges - 0x0000000000001428 0x20 bin/crc.o + 0x00000000000015c8 0x18 bin/FreeRTOS-openocd.o .debug_aranges - 0x0000000000001448 0x28 bin/fp16.o + 0x00000000000015e0 0x28 bin/system_stm32f4xx.o .debug_aranges - 0x0000000000001470 0x18 bin/version.o + 0x0000000000001608 0x20 bin/cpal_hal.o .debug_aranges - 0x0000000000001488 0x28 bin/system_stm32f4xx.o + 0x0000000000001628 0x80 bin/cpal_i2c.o .debug_aranges - 0x00000000000014b0 0x20 bin/cpal_hal.o + 0x00000000000016a8 0xc8 bin/cpal_i2c_hal_stm32f4xx.o .debug_aranges - 0x00000000000014d0 0x80 bin/cpal_i2c.o + 0x0000000000001770 0x130 bin/usb_core.o .debug_aranges - 0x0000000000001550 0x20 bin/cpal_usercallback_template.o + 0x00000000000018a0 0x28 bin/usb_dcd_int.o .debug_aranges - 0x0000000000001570 0xc8 bin/cpal_i2c_hal_stm32f4xx.o + 0x00000000000018c8 0x80 bin/usb_dcd.o .debug_aranges - 0x0000000000001638 0x130 bin/usb_core.o + 0x0000000000001948 0x50 bin/usbd_ioreq.o .debug_aranges - 0x0000000000001768 0x28 bin/usb_dcd_int.o + 0x0000000000001998 0x48 bin/usbd_req.o .debug_aranges - 0x0000000000001790 0x80 bin/usb_dcd.o + 0x00000000000019e0 0x80 bin/usbd_core.o .debug_aranges - 0x0000000000001810 0x50 bin/usbd_ioreq.o + 0x0000000000001a60 0x20 bin/platform_cf2.o .debug_aranges - 0x0000000000001860 0x48 bin/usbd_req.o + 0x0000000000001a80 0x48 bin/led_f405.o .debug_aranges - 0x00000000000018a8 0x80 bin/usbd_core.o + 0x0000000000001ac8 0x730 bin/mpu6500.o .debug_aranges - 0x0000000000001928 0x20 bin/platform_cf2.o + 0x00000000000021f8 0xc8 bin/i2cdev_f405.o .debug_aranges - 0x0000000000001948 0x48 bin/led_f405.o + 0x00000000000022c0 0x38 bin/ws2812_cf2.o .debug_aranges - 0x0000000000001990 0x730 bin/mpu6500.o + 0x00000000000022f8 0x50 bin/lps25h.o .debug_aranges - 0x00000000000020c0 0xc0 bin/i2cdev_f405.o + 0x0000000000002348 0xe8 bin/ak8963.o .debug_aranges - 0x0000000000002180 0x38 bin/ws2812.o + 0x0000000000002430 0x48 bin/eeprom.o .debug_aranges - 0x00000000000021b8 0x50 bin/lps25h.o + 0x0000000000002478 0x38 bin/piezo.o .debug_aranges - 0x0000000000002208 0xe8 bin/ak8963.o + 0x00000000000024b0 0x98 bin/uart_syslink.o .debug_aranges - 0x00000000000022f0 0x48 bin/eeprom.o + 0x0000000000002548 0x28 bin/watchdog.o .debug_aranges - 0x0000000000002338 0x98 bin/uart_syslink.o + 0x0000000000002570 0x30 bin/sonar.o .debug_aranges - 0x00000000000023d0 0x30 bin/sonar.o + 0x00000000000025a0 0x38 bin/usb_bsp.o .debug_aranges - 0x0000000000002400 0x38 bin/usb_bsp.o + 0x00000000000025d8 0x50 bin/usblink.o .debug_aranges - 0x0000000000002438 0x50 bin/usblink.o + 0x0000000000002628 0x50 bin/usbd_desc.o .debug_aranges - 0x0000000000002488 0x50 bin/usbd_desc.o + 0x0000000000002678 0xa8 bin/usb.o .debug_aranges - 0x00000000000024d8 0xa8 bin/usb.o + 0x0000000000002720 0x60 bin/imu_cf2.o .debug_aranges - 0x0000000000002580 0x60 bin/imu_cf2.o + 0x0000000000002780 0x70 bin/pm_f405.o .debug_aranges - 0x00000000000025e0 0x70 bin/pm_f405.o + 0x00000000000027f0 0x38 bin/syslink.o .debug_aranges - 0x0000000000002650 0x38 bin/syslink.o + 0x0000000000002828 0x68 bin/radiolink.o .debug_aranges - 0x0000000000002688 0x68 bin/radiolink.o + 0x0000000000002890 0x58 bin/ow_syslink.o .debug_aranges - 0x00000000000026f0 0x58 bin/ow_syslink.o + 0x00000000000028e8 0x30 bin/platformservice.o .debug_aranges - 0x0000000000002748 0x98 bin/neopixelring.o + 0x0000000000002918 0x68 bin/sound_cf2.o .debug_aranges - 0x00000000000027e0 0x30 bin/expbrd.o + 0x0000000000002980 0x28 bin/deck.o .debug_aranges - 0x0000000000002810 0x30 bin/platformservice.o + 0x00000000000029a8 0x60 bin/deck_info.o .debug_aranges - 0x0000000000002840 0x28 bin/bigquad.o + 0x0000000000002a08 0x40 bin/deck_drivers.o .debug_aranges - 0x0000000000002868 0x28 bin/exptest.o + 0x0000000000002a48 0x30 bin/deck_analog.o .debug_aranges - 0x0000000000002890 0x30 bin/deck_analog.o + 0x0000000000002a78 0x30 bin/buzzdeck.o .debug_aranges - 0x00000000000028c0 0x58 bin/configblockeeprom.o + 0x0000000000002aa8 0x28 bin/bigquad.o + .debug_aranges + 0x0000000000002ad0 0x28 bin/exptest.o + .debug_aranges + 0x0000000000002af8 0xa0 bin/ledring12.o + .debug_aranges + 0x0000000000002b98 0x58 bin/configblockeeprom.o .debug_pubnames *(.debug_pubnames) -.debug_info 0x0000000000000000 0x36a4d +.debug_info 0x0000000000000000 0x3b93d *(.debug_info .gnu.linkonce.wi.*) - .debug_info 0x0000000000000000 0x288 bin/list.o - .debug_info 0x0000000000000288 0x1666 bin/tasks.o - .debug_info 0x00000000000018ee 0x128c bin/queue.o - .debug_info 0x0000000000002b7a 0xefd bin/timers.o - .debug_info 0x0000000000003a77 0x34e bin/heap_4.o - .debug_info 0x0000000000003dc5 0x262 bin/port.o - .debug_info 0x0000000000004027 0xc8e bin/stm32f4xx_adc.o - .debug_info 0x0000000000004cb5 0x1e4 bin/stm32f4xx_dbgmcu.o - .debug_info 0x0000000000004e99 0x741 bin/stm32f4xx_dma.o - .debug_info 0x00000000000055da 0x342 bin/stm32f4xx_exti.o - .debug_info 0x000000000000591c 0x74b bin/stm32f4xx_gpio.o - .debug_info 0x0000000000006067 0xc20 bin/stm32f4xx_i2c.o - .debug_info 0x0000000000006c87 0xe54 bin/stm32f4xx_rcc.o - .debug_info 0x0000000000007adb 0x2083 bin/stm32f4xx_tim.o - .debug_info 0x0000000000009b5e 0xb0d bin/stm32f4xx_usart.o - .debug_info 0x000000000000a66b 0x549 bin/stm32f4xx_misc.o - .debug_info 0x000000000000abb4 0x2e0 bin/stm32f4xx_syscfg.o - .debug_info 0x000000000000ae94 0x17e bin/main.o - .debug_info 0x000000000000b012 0x47b bin/exti.o - .debug_info 0x000000000000b48d 0x3fe bin/nvic.o - .debug_info 0x000000000000b88b 0x1094 bin/motors.o - .debug_info 0x000000000000c91f 0xb54 bin/crtp.o - .debug_info 0x000000000000d473 0x8b6 bin/ledseq.o - .debug_info 0x000000000000dd29 0x25e bin/freeRTOSdebug.o - .debug_info 0x000000000000df87 0xa1a bin/system.o - .debug_info 0x000000000000e9a1 0x35f bin/comm.o - .debug_info 0x000000000000ed00 0x499 bin/console.o - .debug_info 0x000000000000f199 0x442 bin/pid.o - .debug_info 0x000000000000f5db 0x323 bin/crtpservice.o - .debug_info 0x000000000000f8fe 0x938 bin/param.o - .debug_info 0x0000000000010236 0x746 bin/mem.o - .debug_info 0x000000000001097c 0x69a bin/commander.o - .debug_info 0x0000000000011016 0xa1d bin/controller.o - .debug_info 0x0000000000011a33 0x4df bin/sensfusion6.o - .debug_info 0x0000000000011f12 0x18f8 bin/stabilizer.o - .debug_info 0x000000000001380a 0x12b2 bin/log.o - .debug_info 0x0000000000014abc 0x23d bin/worker.o - .debug_info 0x0000000000014cf9 0x11d bin/filter.o - .debug_info 0x0000000000014e16 0x10c bin/cfassert.o - .debug_info 0x0000000000014f22 0x41b bin/eprintf.o - .debug_info 0x000000000001533d 0x1c4 bin/crc.o - .debug_info 0x0000000000015501 0x13f bin/fp16.o - .debug_info 0x0000000000015640 0x1c0 bin/version.o - .debug_info 0x0000000000015800 0x5ea bin/system_stm32f4xx.o - .debug_info 0x0000000000015dea 0xe8 bin/cpal_hal.o - .debug_info 0x0000000000015ed2 0xe2c bin/cpal_i2c.o - .debug_info 0x0000000000016cfe 0x333 bin/cpal_usercallback_template.o - .debug_info 0x0000000000017031 0x166e bin/cpal_i2c_hal_stm32f4xx.o - .debug_info 0x000000000001869f 0x276e bin/usb_core.o - .debug_info 0x000000000001ae0d 0x22d0 bin/usb_dcd_int.o - .debug_info 0x000000000001d0dd 0x1399 bin/usb_dcd.o - .debug_info 0x000000000001e476 0xe0e bin/usbd_ioreq.o - .debug_info 0x000000000001f284 0x1378 bin/usbd_req.o - .debug_info 0x00000000000205fc 0x13ca bin/usbd_core.o - .debug_info 0x00000000000219c6 0xc8 bin/platform_cf2.o - .debug_info 0x0000000000021a8e 0x757 bin/led_f405.o - .debug_info 0x00000000000221e5 0x4320 bin/mpu6500.o - .debug_info 0x0000000000026505 0x12be bin/i2cdev_f405.o - .debug_info 0x00000000000277c3 0x11bb bin/ws2812.o - .debug_info 0x000000000002897e 0x799 bin/lps25h.o - .debug_info 0x0000000000029117 0xca8 bin/ak8963.o - .debug_info 0x0000000000029dbf 0x61b bin/eeprom.o - .debug_info 0x000000000002a3da 0x16fc bin/uart_syslink.o - .debug_info 0x000000000002bad6 0xc63 bin/sonar.o - .debug_info 0x000000000002c739 0x11b4 bin/usb_bsp.o - .debug_info 0x000000000002d8ed 0x757 bin/usblink.o - .debug_info 0x000000000002e044 0x4f5 bin/usbd_desc.o - .debug_info 0x000000000002e539 0x1530 bin/usb.o - .debug_info 0x000000000002fa69 0x124c bin/imu_cf2.o - .debug_info 0x0000000000030cb5 0x89f bin/pm_f405.o - .debug_info 0x0000000000031554 0x6ad bin/syslink.o - .debug_info 0x0000000000031c01 0x835 bin/radiolink.o - .debug_info 0x0000000000032436 0xa77 bin/ow_syslink.o - .debug_info 0x0000000000032ead 0x1307 bin/neopixelring.o - .debug_info 0x00000000000341b4 0x5ea bin/expbrd.o - .debug_info 0x000000000003479e 0x44f bin/platformservice.o - .debug_info 0x0000000000034bed 0x653 bin/bigquad.o - .debug_info 0x0000000000035240 0x60c bin/exptest.o - .debug_info 0x000000000003584c 0x84e bin/deck_analog.o - .debug_info 0x000000000003609a 0x9b3 bin/configblockeeprom.o + .debug_info 0x0000000000000000 0x29e bin/list.o + .debug_info 0x000000000000029e 0x231c bin/tasks.o + .debug_info 0x00000000000025ba 0x17ed bin/queue.o + .debug_info 0x0000000000003da7 0x1175 bin/timers.o + .debug_info 0x0000000000004f1c 0x47b bin/heap_4.o + .debug_info 0x0000000000005397 0x57f bin/port.o + .debug_info 0x0000000000005916 0xc8e bin/stm32f4xx_adc.o + .debug_info 0x00000000000065a4 0x1e4 bin/stm32f4xx_dbgmcu.o + .debug_info 0x0000000000006788 0x741 bin/stm32f4xx_dma.o + .debug_info 0x0000000000006ec9 0x342 bin/stm32f4xx_exti.o + .debug_info 0x000000000000720b 0x74b bin/stm32f4xx_gpio.o + .debug_info 0x0000000000007956 0xc20 bin/stm32f4xx_i2c.o + .debug_info 0x0000000000008576 0x211 bin/stm32f4xx_iwdg.o + .debug_info 0x0000000000008787 0xe54 bin/stm32f4xx_rcc.o + .debug_info 0x00000000000095db 0x2083 bin/stm32f4xx_tim.o + .debug_info 0x000000000000b65e 0xb0d bin/stm32f4xx_usart.o + .debug_info 0x000000000000c16b 0x549 bin/stm32f4xx_misc.o + .debug_info 0x000000000000c6b4 0x2e0 bin/stm32f4xx_syscfg.o + .debug_info 0x000000000000c994 0x185 bin/main.o + .debug_info 0x000000000000cb19 0x47b bin/exti.o + .debug_info 0x000000000000cf94 0x3fe bin/nvic.o + .debug_info 0x000000000000d392 0x109d bin/motors.o + .debug_info 0x000000000000e42f 0xb18 bin/crtp.o + .debug_info 0x000000000000ef47 0x923 bin/ledseq.o + .debug_info 0x000000000000f86a 0x29f bin/freeRTOSdebug.o + .debug_info 0x000000000000fb09 0x171 bin/buzzer.o + .debug_info 0x000000000000fc7a 0xb18 bin/system.o + .debug_info 0x0000000000010792 0x35f bin/comm.o + .debug_info 0x0000000000010af1 0x4d4 bin/console.o + .debug_info 0x0000000000010fc5 0x3b5 bin/pid.o + .debug_info 0x000000000001137a 0x323 bin/crtpservice.o + .debug_info 0x000000000001169d 0x962 bin/param.o + .debug_info 0x0000000000011fff 0x7ed bin/mem.o + .debug_info 0x00000000000127ec 0x69a bin/commander.o + .debug_info 0x0000000000012e86 0xa1d bin/controller.o + .debug_info 0x00000000000138a3 0x4df bin/sensfusion6.o + .debug_info 0x0000000000013d82 0x195e bin/stabilizer.o + .debug_info 0x00000000000156e0 0x12f6 bin/log.o + .debug_info 0x00000000000169d6 0x28e bin/worker.o + .debug_info 0x0000000000016c64 0x11d bin/filter.o + .debug_info 0x0000000000016d81 0x2b8 bin/cfassert.o + .debug_info 0x0000000000017039 0x41b bin/eprintf.o + .debug_info 0x0000000000017454 0x1c4 bin/crc.o + .debug_info 0x0000000000017618 0x13f bin/fp16.o + .debug_info 0x0000000000017757 0x1c0 bin/version.o + .debug_info 0x0000000000017917 0x7e bin/FreeRTOS-openocd.o + .debug_info 0x0000000000017995 0x5ea bin/system_stm32f4xx.o + .debug_info 0x0000000000017f7f 0xe8 bin/cpal_hal.o + .debug_info 0x0000000000018067 0xe2c bin/cpal_i2c.o + .debug_info 0x0000000000018e93 0x166e bin/cpal_i2c_hal_stm32f4xx.o + .debug_info 0x000000000001a501 0x276e bin/usb_core.o + .debug_info 0x000000000001cc6f 0x22d0 bin/usb_dcd_int.o + .debug_info 0x000000000001ef3f 0x1399 bin/usb_dcd.o + .debug_info 0x00000000000202d8 0xe0e bin/usbd_ioreq.o + .debug_info 0x00000000000210e6 0x1378 bin/usbd_req.o + .debug_info 0x000000000002245e 0x13ca bin/usbd_core.o + .debug_info 0x0000000000023828 0x5b bin/platform_cf2.o + .debug_info 0x0000000000023883 0x767 bin/led_f405.o + .debug_info 0x0000000000023fea 0x4325 bin/mpu6500.o + .debug_info 0x000000000002830f 0x1546 bin/i2cdev_f405.o + .debug_info 0x0000000000029855 0x11ca bin/ws2812_cf2.o + .debug_info 0x000000000002aa1f 0x79e bin/lps25h.o + .debug_info 0x000000000002b1bd 0xcad bin/ak8963.o + .debug_info 0x000000000002be6a 0x624 bin/eeprom.o + .debug_info 0x000000000002c48e 0x972 bin/piezo.o + .debug_info 0x000000000002ce00 0x172b bin/uart_syslink.o + .debug_info 0x000000000002e52b 0x271 bin/watchdog.o + .debug_info 0x000000000002e79c 0xc63 bin/sonar.o + .debug_info 0x000000000002f3ff 0x11b4 bin/usb_bsp.o + .debug_info 0x00000000000305b3 0x7ac bin/usblink.o + .debug_info 0x0000000000030d5f 0x4f5 bin/usbd_desc.o + .debug_info 0x0000000000031254 0x155a bin/usb.o + .debug_info 0x00000000000327ae 0x1275 bin/imu_cf2.o + .debug_info 0x0000000000033a23 0x94c bin/pm_f405.o + .debug_info 0x000000000003436f 0x702 bin/syslink.o + .debug_info 0x0000000000034a71 0x870 bin/radiolink.o + .debug_info 0x00000000000352e1 0xab2 bin/ow_syslink.o + .debug_info 0x0000000000035d93 0x44f bin/platformservice.o + .debug_info 0x00000000000361e2 0x832 bin/sound_cf2.o + .debug_info 0x0000000000036a14 0x44c bin/deck.o + .debug_info 0x0000000000036e60 0xa78 bin/deck_info.o + .debug_info 0x00000000000378d8 0x46c bin/deck_drivers.o + .debug_info 0x0000000000037d44 0x85c bin/deck_analog.o + .debug_info 0x00000000000385a0 0x3f7 bin/buzzdeck.o + .debug_info 0x0000000000038997 0x859 bin/bigquad.o + .debug_info 0x00000000000391f0 0x7d5 bin/exptest.o + .debug_info 0x00000000000399c5 0x15c5 bin/ledring12.o + .debug_info 0x000000000003af8a 0x9b3 bin/configblockeeprom.o -.debug_abbrev 0x0000000000000000 0xb468 +.debug_abbrev 0x0000000000000000 0xc756 *(.debug_abbrev) .debug_abbrev 0x0000000000000000 0xdf bin/list.o - .debug_abbrev 0x00000000000000df 0x37e bin/tasks.o - .debug_abbrev 0x000000000000045d 0x2e1 bin/queue.o - .debug_abbrev 0x000000000000073e 0x2ce bin/timers.o - .debug_abbrev 0x0000000000000a0c 0x24a bin/heap_4.o - .debug_abbrev 0x0000000000000c56 0x19e bin/port.o - .debug_abbrev 0x0000000000000df4 0x1d1 bin/stm32f4xx_adc.o - .debug_abbrev 0x0000000000000fc5 0xf2 bin/stm32f4xx_dbgmcu.o - .debug_abbrev 0x00000000000010b7 0x178 bin/stm32f4xx_dma.o - .debug_abbrev 0x000000000000122f 0x1c8 bin/stm32f4xx_exti.o - .debug_abbrev 0x00000000000013f7 0x1eb bin/stm32f4xx_gpio.o - .debug_abbrev 0x00000000000015e2 0x1e2 bin/stm32f4xx_i2c.o - .debug_abbrev 0x00000000000017c4 0x1e5 bin/stm32f4xx_rcc.o - .debug_abbrev 0x00000000000019a9 0x2b2 bin/stm32f4xx_tim.o - .debug_abbrev 0x0000000000001c5b 0x1f0 bin/stm32f4xx_usart.o - .debug_abbrev 0x0000000000001e4b 0x159 bin/stm32f4xx_misc.o - .debug_abbrev 0x0000000000001fa4 0x16c bin/stm32f4xx_syscfg.o - .debug_abbrev 0x0000000000002110 0x116 bin/main.o - .debug_abbrev 0x0000000000002226 0x17f bin/exti.o - .debug_abbrev 0x00000000000023a5 0x146 bin/nvic.o - .debug_abbrev 0x00000000000024eb 0x34f bin/motors.o - .debug_abbrev 0x000000000000283a 0x2c5 bin/crtp.o - .debug_abbrev 0x0000000000002aff 0x311 bin/ledseq.o - .debug_abbrev 0x0000000000002e10 0x12a bin/freeRTOSdebug.o - .debug_abbrev 0x0000000000002f3a 0x2c6 bin/system.o - .debug_abbrev 0x0000000000003200 0x1a6 bin/comm.o - .debug_abbrev 0x00000000000033a6 0x281 bin/console.o - .debug_abbrev 0x0000000000003627 0x137 bin/pid.o - .debug_abbrev 0x000000000000375e 0x1f0 bin/crtpservice.o - .debug_abbrev 0x000000000000394e 0x397 bin/param.o - .debug_abbrev 0x0000000000003ce5 0x26c bin/mem.o - .debug_abbrev 0x0000000000003f51 0x25c bin/commander.o - .debug_abbrev 0x00000000000041ad 0x1ea bin/controller.o - .debug_abbrev 0x0000000000004397 0x277 bin/sensfusion6.o - .debug_abbrev 0x000000000000460e 0x3ab bin/stabilizer.o - .debug_abbrev 0x00000000000049b9 0x495 bin/log.o - .debug_abbrev 0x0000000000004e4e 0x150 bin/worker.o - .debug_abbrev 0x0000000000004f9e 0xaa bin/filter.o - .debug_abbrev 0x0000000000005048 0xeb bin/cfassert.o - .debug_abbrev 0x0000000000005133 0x21e bin/eprintf.o - .debug_abbrev 0x0000000000005351 0x125 bin/crc.o - .debug_abbrev 0x0000000000005476 0xbb bin/fp16.o - .debug_abbrev 0x0000000000005531 0x9d bin/version.o - .debug_abbrev 0x00000000000055ce 0x14a bin/system_stm32f4xx.o - .debug_abbrev 0x0000000000005718 0x9e bin/cpal_hal.o - .debug_abbrev 0x00000000000057b6 0x2f1 bin/cpal_i2c.o - .debug_abbrev 0x0000000000005aa7 0xb8 bin/cpal_usercallback_template.o - .debug_abbrev 0x0000000000005b5f 0x248 bin/cpal_i2c_hal_stm32f4xx.o - .debug_abbrev 0x0000000000005da7 0x479 bin/usb_core.o - .debug_abbrev 0x0000000000006220 0x34f bin/usb_dcd_int.o - .debug_abbrev 0x000000000000656f 0x2ec bin/usb_dcd.o - .debug_abbrev 0x000000000000685b 0x1e2 bin/usbd_ioreq.o - .debug_abbrev 0x0000000000006a3d 0x3ae bin/usbd_req.o - .debug_abbrev 0x0000000000006deb 0x3a9 bin/usbd_core.o - .debug_abbrev 0x0000000000007194 0x8a bin/platform_cf2.o - .debug_abbrev 0x000000000000721e 0x232 bin/led_f405.o - .debug_abbrev 0x0000000000007450 0x2ea bin/mpu6500.o - .debug_abbrev 0x000000000000773a 0x353 bin/i2cdev_f405.o - .debug_abbrev 0x0000000000007a8d 0x26c bin/ws2812.o - .debug_abbrev 0x0000000000007cf9 0x1b4 bin/lps25h.o - .debug_abbrev 0x0000000000007ead 0x245 bin/ak8963.o - .debug_abbrev 0x00000000000080f2 0x1ba bin/eeprom.o - .debug_abbrev 0x00000000000082ac 0x383 bin/uart_syslink.o - .debug_abbrev 0x000000000000862f 0x26f bin/sonar.o - .debug_abbrev 0x000000000000889e 0x263 bin/usb_bsp.o - .debug_abbrev 0x0000000000008b01 0x26c bin/usblink.o - .debug_abbrev 0x0000000000008d6d 0x214 bin/usbd_desc.o - .debug_abbrev 0x0000000000008f81 0x406 bin/usb.o - .debug_abbrev 0x0000000000009387 0x40d bin/imu_cf2.o - .debug_abbrev 0x0000000000009794 0x392 bin/pm_f405.o - .debug_abbrev 0x0000000000009b26 0x256 bin/syslink.o - .debug_abbrev 0x0000000000009d7c 0x2a1 bin/radiolink.o - .debug_abbrev 0x000000000000a01d 0x2ed bin/ow_syslink.o - .debug_abbrev 0x000000000000a30a 0x401 bin/neopixelring.o - .debug_abbrev 0x000000000000a70b 0x24e bin/expbrd.o - .debug_abbrev 0x000000000000a959 0x234 bin/platformservice.o - .debug_abbrev 0x000000000000ab8d 0x1db bin/bigquad.o - .debug_abbrev 0x000000000000ad68 0x258 bin/exptest.o - .debug_abbrev 0x000000000000afc0 0x234 bin/deck_analog.o - .debug_abbrev 0x000000000000b1f4 0x274 bin/configblockeeprom.o + .debug_abbrev 0x00000000000000df 0x3f0 bin/tasks.o + .debug_abbrev 0x00000000000004cf 0x313 bin/queue.o + .debug_abbrev 0x00000000000007e2 0x310 bin/timers.o + .debug_abbrev 0x0000000000000af2 0x240 bin/heap_4.o + .debug_abbrev 0x0000000000000d32 0x248 bin/port.o + .debug_abbrev 0x0000000000000f7a 0x1d1 bin/stm32f4xx_adc.o + .debug_abbrev 0x000000000000114b 0xf2 bin/stm32f4xx_dbgmcu.o + .debug_abbrev 0x000000000000123d 0x178 bin/stm32f4xx_dma.o + .debug_abbrev 0x00000000000013b5 0x1c8 bin/stm32f4xx_exti.o + .debug_abbrev 0x000000000000157d 0x1eb bin/stm32f4xx_gpio.o + .debug_abbrev 0x0000000000001768 0x1e2 bin/stm32f4xx_i2c.o + .debug_abbrev 0x000000000000194a 0x115 bin/stm32f4xx_iwdg.o + .debug_abbrev 0x0000000000001a5f 0x1e5 bin/stm32f4xx_rcc.o + .debug_abbrev 0x0000000000001c44 0x2b2 bin/stm32f4xx_tim.o + .debug_abbrev 0x0000000000001ef6 0x1f0 bin/stm32f4xx_usart.o + .debug_abbrev 0x00000000000020e6 0x159 bin/stm32f4xx_misc.o + .debug_abbrev 0x000000000000223f 0x16c bin/stm32f4xx_syscfg.o + .debug_abbrev 0x00000000000023ab 0x116 bin/main.o + .debug_abbrev 0x00000000000024c1 0x17f bin/exti.o + .debug_abbrev 0x0000000000002640 0x146 bin/nvic.o + .debug_abbrev 0x0000000000002786 0x33e bin/motors.o + .debug_abbrev 0x0000000000002ac4 0x2d8 bin/crtp.o + .debug_abbrev 0x0000000000002d9c 0x302 bin/ledseq.o + .debug_abbrev 0x000000000000309e 0x14b bin/freeRTOSdebug.o + .debug_abbrev 0x00000000000031e9 0x11d bin/buzzer.o + .debug_abbrev 0x0000000000003306 0x315 bin/system.o + .debug_abbrev 0x000000000000361b 0x1a6 bin/comm.o + .debug_abbrev 0x00000000000037c1 0x281 bin/console.o + .debug_abbrev 0x0000000000003a42 0x12c bin/pid.o + .debug_abbrev 0x0000000000003b6e 0x1f0 bin/crtpservice.o + .debug_abbrev 0x0000000000003d5e 0x397 bin/param.o + .debug_abbrev 0x00000000000040f5 0x2b3 bin/mem.o + .debug_abbrev 0x00000000000043a8 0x25c bin/commander.o + .debug_abbrev 0x0000000000004604 0x1ea bin/controller.o + .debug_abbrev 0x00000000000047ee 0x277 bin/sensfusion6.o + .debug_abbrev 0x0000000000004a65 0x3ab bin/stabilizer.o + .debug_abbrev 0x0000000000004e10 0x495 bin/log.o + .debug_abbrev 0x00000000000052a5 0x150 bin/worker.o + .debug_abbrev 0x00000000000053f5 0xaa bin/filter.o + .debug_abbrev 0x000000000000549f 0x1ca bin/cfassert.o + .debug_abbrev 0x0000000000005669 0x21e bin/eprintf.o + .debug_abbrev 0x0000000000005887 0x125 bin/crc.o + .debug_abbrev 0x00000000000059ac 0xbb bin/fp16.o + .debug_abbrev 0x0000000000005a67 0x9d bin/version.o + .debug_abbrev 0x0000000000005b04 0x41 bin/FreeRTOS-openocd.o + .debug_abbrev 0x0000000000005b45 0x14a bin/system_stm32f4xx.o + .debug_abbrev 0x0000000000005c8f 0x9e bin/cpal_hal.o + .debug_abbrev 0x0000000000005d2d 0x2f1 bin/cpal_i2c.o + .debug_abbrev 0x000000000000601e 0x248 bin/cpal_i2c_hal_stm32f4xx.o + .debug_abbrev 0x0000000000006266 0x479 bin/usb_core.o + .debug_abbrev 0x00000000000066df 0x34f bin/usb_dcd_int.o + .debug_abbrev 0x0000000000006a2e 0x2ec bin/usb_dcd.o + .debug_abbrev 0x0000000000006d1a 0x1e2 bin/usbd_ioreq.o + .debug_abbrev 0x0000000000006efc 0x3ae bin/usbd_req.o + .debug_abbrev 0x00000000000072aa 0x3a9 bin/usbd_core.o + .debug_abbrev 0x0000000000007653 0x5a bin/platform_cf2.o + .debug_abbrev 0x00000000000076ad 0x221 bin/led_f405.o + .debug_abbrev 0x00000000000078ce 0x2ea bin/mpu6500.o + .debug_abbrev 0x0000000000007bb8 0x3ac bin/i2cdev_f405.o + .debug_abbrev 0x0000000000007f64 0x26c bin/ws2812_cf2.o + .debug_abbrev 0x00000000000081d0 0x1bb bin/lps25h.o + .debug_abbrev 0x000000000000838b 0x245 bin/ak8963.o + .debug_abbrev 0x00000000000085d0 0x1c3 bin/eeprom.o + .debug_abbrev 0x0000000000008793 0x1ab bin/piezo.o + .debug_abbrev 0x000000000000893e 0x383 bin/uart_syslink.o + .debug_abbrev 0x0000000000008cc1 0x185 bin/watchdog.o + .debug_abbrev 0x0000000000008e46 0x26f bin/sonar.o + .debug_abbrev 0x00000000000090b5 0x263 bin/usb_bsp.o + .debug_abbrev 0x0000000000009318 0x26c bin/usblink.o + .debug_abbrev 0x0000000000009584 0x214 bin/usbd_desc.o + .debug_abbrev 0x0000000000009798 0x406 bin/usb.o + .debug_abbrev 0x0000000000009b9e 0x40d bin/imu_cf2.o + .debug_abbrev 0x0000000000009fab 0x392 bin/pm_f405.o + .debug_abbrev 0x000000000000a33d 0x256 bin/syslink.o + .debug_abbrev 0x000000000000a593 0x2a1 bin/radiolink.o + .debug_abbrev 0x000000000000a834 0x2ed bin/ow_syslink.o + .debug_abbrev 0x000000000000ab21 0x234 bin/platformservice.o + .debug_abbrev 0x000000000000ad55 0x2ad bin/sound_cf2.o + .debug_abbrev 0x000000000000b002 0x1f1 bin/deck.o + .debug_abbrev 0x000000000000b1f3 0x387 bin/deck_info.o + .debug_abbrev 0x000000000000b57a 0x235 bin/deck_drivers.o + .debug_abbrev 0x000000000000b7af 0x234 bin/deck_analog.o + .debug_abbrev 0x000000000000b9e3 0x1c1 bin/buzzdeck.o + .debug_abbrev 0x000000000000bba4 0x256 bin/bigquad.o + .debug_abbrev 0x000000000000bdfa 0x292 bin/exptest.o + .debug_abbrev 0x000000000000c08c 0x456 bin/ledring12.o + .debug_abbrev 0x000000000000c4e2 0x274 bin/configblockeeprom.o -.debug_line 0x0000000000000000 0x1fcb9 +.debug_line 0x0000000000000000 0x236a2 *(.debug_line) - .debug_line 0x0000000000000000 0x3fb bin/list.o - .debug_line 0x00000000000003fb 0x822 bin/tasks.o - .debug_line 0x0000000000000c1d 0x67d bin/queue.o - .debug_line 0x000000000000129a 0x367 bin/timers.o - .debug_line 0x0000000000001601 0x43b bin/heap_4.o - .debug_line 0x0000000000001a3c 0x2f7 bin/port.o - .debug_line 0x0000000000001d33 0x818 bin/stm32f4xx_adc.o - .debug_line 0x000000000000254b 0x51e bin/stm32f4xx_dbgmcu.o - .debug_line 0x0000000000002a69 0x6a4 bin/stm32f4xx_dma.o - .debug_line 0x000000000000310d 0x57a bin/stm32f4xx_exti.o - .debug_line 0x0000000000003687 0x603 bin/stm32f4xx_gpio.o - .debug_line 0x0000000000003c8a 0x7f5 bin/stm32f4xx_i2c.o - .debug_line 0x000000000000447f 0x8ee bin/stm32f4xx_rcc.o - .debug_line 0x0000000000004d6d 0xd92 bin/stm32f4xx_tim.o - .debug_line 0x0000000000005aff 0x784 bin/stm32f4xx_usart.o - .debug_line 0x0000000000006283 0x52e bin/stm32f4xx_misc.o - .debug_line 0x00000000000067b1 0x540 bin/stm32f4xx_syscfg.o - .debug_line 0x0000000000006cf1 0x65e bin/main.o - .debug_line 0x000000000000734f 0x54c bin/exti.o - .debug_line 0x000000000000789b 0x64e bin/nvic.o - .debug_line 0x0000000000007ee9 0x841 bin/motors.o - .debug_line 0x000000000000872a 0x577 bin/crtp.o - .debug_line 0x0000000000008ca1 0x471 bin/ledseq.o - .debug_line 0x0000000000009112 0x38a bin/freeRTOSdebug.o - .debug_line 0x000000000000949c 0x598 bin/system.o - .debug_line 0x0000000000009a34 0x32e bin/comm.o - .debug_line 0x0000000000009d62 0x3d4 bin/console.o - .debug_line 0x000000000000a136 0x799 bin/pid.o - .debug_line 0x000000000000a8cf 0x400 bin/crtpservice.o - .debug_line 0x000000000000accf 0x524 bin/param.o - .debug_line 0x000000000000b1f3 0x7d2 bin/mem.o - .debug_line 0x000000000000b9c5 0x499 bin/commander.o - .debug_line 0x000000000000be5e 0x450 bin/controller.o - .debug_line 0x000000000000c2ae 0x3b6 bin/sensfusion6.o - .debug_line 0x000000000000c664 0x92d bin/stabilizer.o - .debug_line 0x000000000000cf91 0x6fc bin/log.o - .debug_line 0x000000000000d68d 0x3cb bin/worker.o - .debug_line 0x000000000000da58 0x1fb bin/filter.o - .debug_line 0x000000000000dc53 0x121 bin/cfassert.o - .debug_line 0x000000000000dd74 0x2ae bin/eprintf.o - .debug_line 0x000000000000e022 0x224 bin/crc.o - .debug_line 0x000000000000e246 0x220 bin/fp16.o - .debug_line 0x000000000000e466 0x234 bin/version.o - .debug_line 0x000000000000e69a 0x51d bin/system_stm32f4xx.o - .debug_line 0x000000000000ebb7 0x500 bin/cpal_hal.o - .debug_line 0x000000000000f0b7 0xa1e bin/cpal_i2c.o - .debug_line 0x000000000000fad5 0x563 bin/cpal_usercallback_template.o - .debug_line 0x0000000000010038 0x7b4 bin/cpal_i2c_hal_stm32f4xx.o - .debug_line 0x00000000000107ec 0xa39 bin/usb_core.o - .debug_line 0x0000000000011225 0x68d bin/usb_dcd_int.o - .debug_line 0x00000000000118b2 0x719 bin/usb_dcd.o - .debug_line 0x0000000000011fcb 0x63e bin/usbd_ioreq.o - .debug_line 0x0000000000012609 0x6e8 bin/usbd_req.o - .debug_line 0x0000000000012cf1 0x721 bin/usbd_core.o - .debug_line 0x0000000000013412 0x626 bin/platform_cf2.o - .debug_line 0x0000000000013a38 0x6fc bin/led_f405.o - .debug_line 0x0000000000014134 0x1961 bin/mpu6500.o - .debug_line 0x0000000000015a95 0x981 bin/i2cdev_f405.o - .debug_line 0x0000000000016416 0x78e bin/ws2812.o - .debug_line 0x0000000000016ba4 0x794 bin/lps25h.o - .debug_line 0x0000000000017338 0x881 bin/ak8963.o - .debug_line 0x0000000000017bb9 0x6f0 bin/eeprom.o - .debug_line 0x00000000000182a9 0x8f0 bin/uart_syslink.o - .debug_line 0x0000000000018b99 0x7bd bin/sonar.o - .debug_line 0x0000000000019356 0x613 bin/usb_bsp.o - .debug_line 0x0000000000019969 0x4f7 bin/usblink.o - .debug_line 0x0000000000019e60 0x66e bin/usbd_desc.o - .debug_line 0x000000000001a4ce 0x92a bin/usb.o - .debug_line 0x000000000001adf8 0x95c bin/imu_cf2.o - .debug_line 0x000000000001b754 0x836 bin/pm_f405.o - .debug_line 0x000000000001bf8a 0x4f0 bin/syslink.o - .debug_line 0x000000000001c47a 0x508 bin/radiolink.o - .debug_line 0x000000000001c982 0x50f bin/ow_syslink.o - .debug_line 0x000000000001ce91 0xc12 bin/neopixelring.o - .debug_line 0x000000000001daa3 0x44d bin/expbrd.o - .debug_line 0x000000000001def0 0x43f bin/platformservice.o - .debug_line 0x000000000001e32f 0x614 bin/bigquad.o - .debug_line 0x000000000001e943 0x6a2 bin/exptest.o - .debug_line 0x000000000001efe5 0x570 bin/deck_analog.o - .debug_line 0x000000000001f555 0x764 bin/configblockeeprom.o + .debug_line 0x0000000000000000 0x453 bin/list.o + .debug_line 0x0000000000000453 0xb4f bin/tasks.o + .debug_line 0x0000000000000fa2 0x86a bin/queue.o + .debug_line 0x000000000000180c 0x5bc bin/timers.o + .debug_line 0x0000000000001dc8 0x500 bin/heap_4.o + .debug_line 0x00000000000022c8 0x4ca bin/port.o + .debug_line 0x0000000000002792 0x818 bin/stm32f4xx_adc.o + .debug_line 0x0000000000002faa 0x51e bin/stm32f4xx_dbgmcu.o + .debug_line 0x00000000000034c8 0x6a4 bin/stm32f4xx_dma.o + .debug_line 0x0000000000003b6c 0x57a bin/stm32f4xx_exti.o + .debug_line 0x00000000000040e6 0x603 bin/stm32f4xx_gpio.o + .debug_line 0x00000000000046e9 0x7f5 bin/stm32f4xx_i2c.o + .debug_line 0x0000000000004ede 0x526 bin/stm32f4xx_iwdg.o + .debug_line 0x0000000000005404 0x8ee bin/stm32f4xx_rcc.o + .debug_line 0x0000000000005cf2 0xd92 bin/stm32f4xx_tim.o + .debug_line 0x0000000000006a84 0x784 bin/stm32f4xx_usart.o + .debug_line 0x0000000000007208 0x52e bin/stm32f4xx_misc.o + .debug_line 0x0000000000007736 0x540 bin/stm32f4xx_syscfg.o + .debug_line 0x0000000000007c76 0x685 bin/main.o + .debug_line 0x00000000000082fb 0x557 bin/exti.o + .debug_line 0x0000000000008852 0x65c bin/nvic.o + .debug_line 0x0000000000008eae 0x868 bin/motors.o + .debug_line 0x0000000000009716 0x598 bin/crtp.o + .debug_line 0x0000000000009cae 0x498 bin/ledseq.o + .debug_line 0x000000000000a146 0x3c5 bin/freeRTOSdebug.o + .debug_line 0x000000000000a50b 0x23b bin/buzzer.o + .debug_line 0x000000000000a746 0x91d bin/system.o + .debug_line 0x000000000000b063 0x339 bin/comm.o + .debug_line 0x000000000000b39c 0x3e7 bin/console.o + .debug_line 0x000000000000b783 0x1c5 bin/pid.o + .debug_line 0x000000000000b948 0x413 bin/crtpservice.o + .debug_line 0x000000000000bd5b 0x54b bin/param.o + .debug_line 0x000000000000c2a6 0x846 bin/mem.o + .debug_line 0x000000000000caec 0x4c0 bin/commander.o + .debug_line 0x000000000000cfac 0x463 bin/controller.o + .debug_line 0x000000000000d40f 0x374 bin/sensfusion6.o + .debug_line 0x000000000000d783 0x97c bin/stabilizer.o + .debug_line 0x000000000000e0ff 0x723 bin/log.o + .debug_line 0x000000000000e822 0x436 bin/worker.o + .debug_line 0x000000000000ec58 0x1fb bin/filter.o + .debug_line 0x000000000000ee53 0x2da bin/cfassert.o + .debug_line 0x000000000000f12d 0x2ae bin/eprintf.o + .debug_line 0x000000000000f3db 0x224 bin/crc.o + .debug_line 0x000000000000f5ff 0x220 bin/fp16.o + .debug_line 0x000000000000f81f 0x23f bin/version.o + .debug_line 0x000000000000fa5e 0x340 bin/FreeRTOS-openocd.o + .debug_line 0x000000000000fd9e 0x51d bin/system_stm32f4xx.o + .debug_line 0x00000000000102bb 0x50e bin/cpal_hal.o + .debug_line 0x00000000000107c9 0xa2c bin/cpal_i2c.o + .debug_line 0x00000000000111f5 0x7c2 bin/cpal_i2c_hal_stm32f4xx.o + .debug_line 0x00000000000119b7 0xa39 bin/usb_core.o + .debug_line 0x00000000000123f0 0x68d bin/usb_dcd_int.o + .debug_line 0x0000000000012a7d 0x719 bin/usb_dcd.o + .debug_line 0x0000000000013196 0x63e bin/usbd_ioreq.o + .debug_line 0x00000000000137d4 0x6e8 bin/usbd_req.o + .debug_line 0x0000000000013ebc 0x721 bin/usbd_core.o + .debug_line 0x00000000000145dd 0x69 bin/platform_cf2.o + .debug_line 0x0000000000014646 0x723 bin/led_f405.o + .debug_line 0x0000000000014d69 0x1996 bin/mpu6500.o + .debug_line 0x00000000000166ff 0x97c bin/i2cdev_f405.o + .debug_line 0x000000000001707b 0x7a4 bin/ws2812_cf2.o + .debug_line 0x000000000001781f 0x7c9 bin/lps25h.o + .debug_line 0x0000000000017fe8 0x8b6 bin/ak8963.o + .debug_line 0x000000000001889e 0x725 bin/eeprom.o + .debug_line 0x0000000000018fc3 0x6b6 bin/piezo.o + .debug_line 0x0000000000019679 0x903 bin/uart_syslink.o + .debug_line 0x0000000000019f7c 0x5a0 bin/watchdog.o + .debug_line 0x000000000001a51c 0x7f2 bin/sonar.o + .debug_line 0x000000000001ad0e 0x61c bin/usb_bsp.o + .debug_line 0x000000000001b32a 0x530 bin/usblink.o + .debug_line 0x000000000001b85a 0x679 bin/usbd_desc.o + .debug_line 0x000000000001bed3 0x94e bin/usb.o + .debug_line 0x000000000001c821 0x99d bin/imu_cf2.o + .debug_line 0x000000000001d1be 0x86c bin/pm_f405.o + .debug_line 0x000000000001da2a 0x517 bin/syslink.o + .debug_line 0x000000000001df41 0x541 bin/radiolink.o + .debug_line 0x000000000001e482 0x536 bin/ow_syslink.o + .debug_line 0x000000000001e9b8 0x452 bin/platformservice.o + .debug_line 0x000000000001ee0a 0x519 bin/sound_cf2.o + .debug_line 0x000000000001f323 0x68f bin/deck.o + .debug_line 0x000000000001f9b2 0x7b0 bin/deck_info.o + .debug_line 0x0000000000020162 0x6f3 bin/deck_drivers.o + .debug_line 0x0000000000020855 0x57f bin/deck_analog.o + .debug_line 0x0000000000020dd4 0x65a bin/buzzdeck.o + .debug_line 0x000000000002142e 0x675 bin/bigquad.o + .debug_line 0x0000000000021aa3 0x736 bin/exptest.o + .debug_line 0x00000000000221d9 0xd4c bin/ledring12.o + .debug_line 0x0000000000022f25 0x77d bin/configblockeeprom.o -.debug_frame 0x0000000000000000 0x6f24 +.debug_frame 0x0000000000000000 0x7600 *(.debug_frame) - .debug_frame 0x0000000000000000 0x68 bin/list.o - .debug_frame 0x0000000000000068 0x340 bin/tasks.o - .debug_frame 0x00000000000003a8 0x204 bin/queue.o - .debug_frame 0x00000000000005ac 0x118 bin/timers.o - .debug_frame 0x00000000000006c4 0x84 bin/heap_4.o - .debug_frame 0x0000000000000748 0x10c bin/port.o - .debug_frame 0x0000000000000854 0x2b4 bin/stm32f4xx_adc.o - .debug_frame 0x0000000000000b08 0x60 bin/stm32f4xx_dbgmcu.o - .debug_frame 0x0000000000000b68 0x168 bin/stm32f4xx_dma.o - .debug_frame 0x0000000000000cd0 0x98 bin/stm32f4xx_exti.o - .debug_frame 0x0000000000000d68 0x120 bin/stm32f4xx_gpio.o - .debug_frame 0x0000000000000e88 0x278 bin/stm32f4xx_i2c.o - .debug_frame 0x0000000000001100 0x368 bin/stm32f4xx_rcc.o - .debug_frame 0x0000000000001468 0x6c0 bin/stm32f4xx_tim.o - .debug_frame 0x0000000000001b28 0x220 bin/stm32f4xx_usart.o - .debug_frame 0x0000000000001d48 0x68 bin/stm32f4xx_misc.o - .debug_frame 0x0000000000001db0 0x94 bin/stm32f4xx_syscfg.o - .debug_frame 0x0000000000001e44 0x28 bin/main.o - .debug_frame 0x0000000000001e6c 0x58 bin/exti.o - .debug_frame 0x0000000000001ec4 0xd4 bin/nvic.o - .debug_frame 0x0000000000001f98 0x134 bin/motors.o - .debug_frame 0x00000000000020cc 0x1d4 bin/crtp.o - .debug_frame 0x00000000000022a0 0x100 bin/ledseq.o - .debug_frame 0x00000000000023a0 0x50 bin/freeRTOSdebug.o - .debug_frame 0x00000000000023f0 0xe4 bin/system.o - .debug_frame 0x00000000000024d4 0x44 bin/comm.o - .debug_frame 0x0000000000002518 0xac bin/console.o - .debug_frame 0x00000000000025c4 0xe8 bin/pid.o - .debug_frame 0x00000000000026ac 0x5c bin/crtpservice.o - .debug_frame 0x0000000000002708 0xb8 bin/param.o - .debug_frame 0x00000000000027c0 0x58 bin/mem.o - .debug_frame 0x0000000000002818 0x128 bin/commander.o - .debug_frame 0x0000000000002940 0xe4 bin/controller.o - .debug_frame 0x0000000000002a24 0xa0 bin/sensfusion6.o - .debug_frame 0x0000000000002ac4 0xb8 bin/stabilizer.o - .debug_frame 0x0000000000002b7c 0x1a4 bin/log.o - .debug_frame 0x0000000000002d20 0x6c bin/worker.o - .debug_frame 0x0000000000002d8c 0x20 bin/filter.o - .debug_frame 0x0000000000002dac 0x28 bin/cfassert.o - .debug_frame 0x0000000000002dd4 0xb8 bin/eprintf.o - .debug_frame 0x0000000000002e8c 0x30 bin/crc.o - .debug_frame 0x0000000000002ebc 0x38 bin/fp16.o - .debug_frame 0x0000000000002ef4 0x38 bin/system_stm32f4xx.o - .debug_frame 0x0000000000002f2c 0x20 bin/cpal_hal.o - .debug_frame 0x0000000000002f4c 0x18c bin/cpal_i2c.o - .debug_frame 0x00000000000030d8 0x20 bin/cpal_usercallback_template.o - .debug_frame 0x00000000000030f8 0x234 bin/cpal_i2c_hal_stm32f4xx.o - .debug_frame 0x000000000000332c 0x318 bin/usb_core.o - .debug_frame 0x0000000000003644 0x50 bin/usb_dcd_int.o - .debug_frame 0x0000000000003694 0x158 bin/usb_dcd.o - .debug_frame 0x00000000000037ec 0xb8 bin/usbd_ioreq.o - .debug_frame 0x00000000000038a4 0xb0 bin/usbd_req.o - .debug_frame 0x0000000000003954 0x158 bin/usbd_core.o - .debug_frame 0x0000000000003aac 0x28 bin/platform_cf2.o - .debug_frame 0x0000000000003ad4 0x98 bin/led_f405.o - .debug_frame 0x0000000000003b6c 0x16f0 bin/mpu6500.o - .debug_frame 0x000000000000525c 0x25c bin/i2cdev_f405.o - .debug_frame 0x00000000000054b8 0xa0 bin/ws2812.o - .debug_frame 0x0000000000005558 0xe8 bin/lps25h.o - .debug_frame 0x0000000000005640 0x288 bin/ak8963.o - .debug_frame 0x00000000000058c8 0xa0 bin/eeprom.o - .debug_frame 0x0000000000005968 0x18c bin/uart_syslink.o - .debug_frame 0x0000000000005af4 0x64 bin/sonar.o - .debug_frame 0x0000000000005b58 0x68 bin/usb_bsp.o - .debug_frame 0x0000000000005bc0 0xa8 bin/usblink.o - .debug_frame 0x0000000000005c68 0xb4 bin/usbd_desc.o - .debug_frame 0x0000000000005d1c 0x1a0 bin/usb.o - .debug_frame 0x0000000000005ebc 0x134 bin/imu_cf2.o - .debug_frame 0x0000000000005ff0 0x104 bin/pm_f405.o - .debug_frame 0x00000000000060f4 0x80 bin/syslink.o - .debug_frame 0x0000000000006174 0x104 bin/radiolink.o - .debug_frame 0x0000000000006278 0x100 bin/ow_syslink.o - .debug_frame 0x0000000000006378 0x1f8 bin/neopixelring.o - .debug_frame 0x0000000000006570 0x5c bin/expbrd.o - .debug_frame 0x00000000000065cc 0x58 bin/platformservice.o - .debug_frame 0x0000000000006624 0x38 bin/bigquad.o - .debug_frame 0x000000000000665c 0x54 bin/exptest.o - .debug_frame 0x00000000000066b0 0x60 bin/deck_analog.o - .debug_frame 0x0000000000006710 0xb0 bin/configblockeeprom.o - .debug_frame 0x00000000000067c0 0x2c /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libm.a(lib_a-sf_atan.o) - .debug_frame 0x00000000000067ec 0x34 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libm.a(lib_a-sf_cos.o) - .debug_frame 0x0000000000006820 0x20 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libm.a(lib_a-sf_fabs.o) - .debug_frame 0x0000000000006840 0x34 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libm.a(lib_a-sf_sin.o) - .debug_frame 0x0000000000006874 0x38 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libm.a(lib_a-sf_tan.o) - .debug_frame 0x00000000000068ac 0x50 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libm.a(lib_a-wf_asin.o) - .debug_frame 0x00000000000068fc 0x20 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libm.a(lib_a-wf_atan2.o) - .debug_frame 0x000000000000691c 0x64 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libm.a(lib_a-wf_pow.o) - .debug_frame 0x0000000000006980 0x70 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libm.a(lib_a-ef_asin.o) - .debug_frame 0x00000000000069f0 0x48 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libm.a(lib_a-ef_atan2.o) - .debug_frame 0x0000000000006a38 0x7c /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libm.a(lib_a-ef_pow.o) - .debug_frame 0x0000000000006ab4 0x3c /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libm.a(lib_a-ef_rem_pio2.o) - .debug_frame 0x0000000000006af0 0x3c /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libm.a(lib_a-ef_sqrt.o) - .debug_frame 0x0000000000006b2c 0x20 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libm.a(lib_a-kf_cos.o) - .debug_frame 0x0000000000006b4c 0x5c /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libm.a(lib_a-kf_rem_pio2.o) - .debug_frame 0x0000000000006ba8 0x20 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libm.a(lib_a-kf_sin.o) - .debug_frame 0x0000000000006bc8 0x50 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libm.a(lib_a-kf_tan.o) - .debug_frame 0x0000000000006c18 0x20 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libm.a(lib_a-s_matherr.o) - .debug_frame 0x0000000000006c38 0x20 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libm.a(lib_a-s_nan.o) - .debug_frame 0x0000000000006c58 0x3c /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libm.a(lib_a-s_rint.o) - .debug_frame 0x0000000000006c94 0x20 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libm.a(lib_a-sf_finite.o) - .debug_frame 0x0000000000006cb4 0x20 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libm.a(lib_a-sf_floor.o) - .debug_frame 0x0000000000006cd4 0x20 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libm.a(lib_a-sf_fpclassify.o) - .debug_frame 0x0000000000006cf4 0x20 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libm.a(lib_a-sf_nan.o) - .debug_frame 0x0000000000006d14 0x44 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libm.a(lib_a-sf_scalbn.o) - .debug_frame 0x0000000000006d58 0x20 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libm.a(lib_a-sf_copysign.o) - .debug_frame 0x0000000000006d78 0x28 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/armv7e-m/fpu/libgcc.a(_aeabi_ldivmod.o) - .debug_frame 0x0000000000006da0 0x50 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/armv7e-m/fpu/libgcc.a(bpabi.o) - .debug_frame 0x0000000000006df0 0x34 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/armv7e-m/fpu/libgcc.a(_divdi3.o) - .debug_frame 0x0000000000006e24 0x30 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/armv7e-m/fpu/libgcc.a(_udivdi3.o) - .debug_frame 0x0000000000006e54 0x20 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libc_nano.a(lib_a-errno.o) - .debug_frame 0x0000000000006e74 0x28 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libc_nano.a(lib_a-memcpy.o) - .debug_frame 0x0000000000006e9c 0x20 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libc_nano.a(lib_a-memset.o) - .debug_frame 0x0000000000006ebc 0x20 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libc_nano.a(lib_a-strcpy.o) - .debug_frame 0x0000000000006edc 0x20 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libc_nano.a(lib_a-strlen.o) - .debug_frame 0x0000000000006efc 0x28 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libc_nano.a(lib_a-strncpy.o) + .debug_frame 0x0000000000000000 0x6c bin/list.o + .debug_frame 0x000000000000006c 0x47c bin/tasks.o + .debug_frame 0x00000000000004e8 0x29c bin/queue.o + .debug_frame 0x0000000000000784 0x160 bin/timers.o + .debug_frame 0x00000000000008e4 0xa4 bin/heap_4.o + .debug_frame 0x0000000000000988 0x110 bin/port.o + .debug_frame 0x0000000000000a98 0x2b4 bin/stm32f4xx_adc.o + .debug_frame 0x0000000000000d4c 0x60 bin/stm32f4xx_dbgmcu.o + .debug_frame 0x0000000000000dac 0x168 bin/stm32f4xx_dma.o + .debug_frame 0x0000000000000f14 0x98 bin/stm32f4xx_exti.o + .debug_frame 0x0000000000000fac 0x120 bin/stm32f4xx_gpio.o + .debug_frame 0x00000000000010cc 0x278 bin/stm32f4xx_i2c.o + .debug_frame 0x0000000000001344 0x70 bin/stm32f4xx_iwdg.o + .debug_frame 0x00000000000013b4 0x368 bin/stm32f4xx_rcc.o + .debug_frame 0x000000000000171c 0x6c0 bin/stm32f4xx_tim.o + .debug_frame 0x0000000000001ddc 0x220 bin/stm32f4xx_usart.o + .debug_frame 0x0000000000001ffc 0x68 bin/stm32f4xx_misc.o + .debug_frame 0x0000000000002064 0x94 bin/stm32f4xx_syscfg.o + .debug_frame 0x00000000000020f8 0x28 bin/main.o + .debug_frame 0x0000000000002120 0x58 bin/exti.o + .debug_frame 0x0000000000002178 0xd4 bin/nvic.o + .debug_frame 0x000000000000224c 0x134 bin/motors.o + .debug_frame 0x0000000000002380 0x1bc bin/crtp.o + .debug_frame 0x000000000000253c 0x100 bin/ledseq.o + .debug_frame 0x000000000000263c 0x50 bin/freeRTOSdebug.o + .debug_frame 0x000000000000268c 0x60 bin/buzzer.o + .debug_frame 0x00000000000026ec 0xf0 bin/system.o + .debug_frame 0x00000000000027dc 0x44 bin/comm.o + .debug_frame 0x0000000000002820 0xac bin/console.o + .debug_frame 0x00000000000028cc 0xe8 bin/pid.o + .debug_frame 0x00000000000029b4 0x5c bin/crtpservice.o + .debug_frame 0x0000000000002a10 0xb8 bin/param.o + .debug_frame 0x0000000000002ac8 0x58 bin/mem.o + .debug_frame 0x0000000000002b20 0x128 bin/commander.o + .debug_frame 0x0000000000002c48 0xe4 bin/controller.o + .debug_frame 0x0000000000002d2c 0xa0 bin/sensfusion6.o + .debug_frame 0x0000000000002dcc 0xc0 bin/stabilizer.o + .debug_frame 0x0000000000002e8c 0x1a4 bin/log.o + .debug_frame 0x0000000000003030 0x6c bin/worker.o + .debug_frame 0x000000000000309c 0x20 bin/filter.o + .debug_frame 0x00000000000030bc 0x48 bin/cfassert.o + .debug_frame 0x0000000000003104 0xb8 bin/eprintf.o + .debug_frame 0x00000000000031bc 0x30 bin/crc.o + .debug_frame 0x00000000000031ec 0x38 bin/fp16.o + .debug_frame 0x0000000000003224 0x38 bin/system_stm32f4xx.o + .debug_frame 0x000000000000325c 0x20 bin/cpal_hal.o + .debug_frame 0x000000000000327c 0x18c bin/cpal_i2c.o + .debug_frame 0x0000000000003408 0x234 bin/cpal_i2c_hal_stm32f4xx.o + .debug_frame 0x000000000000363c 0x318 bin/usb_core.o + .debug_frame 0x0000000000003954 0x50 bin/usb_dcd_int.o + .debug_frame 0x00000000000039a4 0x158 bin/usb_dcd.o + .debug_frame 0x0000000000003afc 0xb8 bin/usbd_ioreq.o + .debug_frame 0x0000000000003bb4 0xb0 bin/usbd_req.o + .debug_frame 0x0000000000003c64 0x158 bin/usbd_core.o + .debug_frame 0x0000000000003dbc 0x28 bin/platform_cf2.o + .debug_frame 0x0000000000003de4 0x98 bin/led_f405.o + .debug_frame 0x0000000000003e7c 0x16f0 bin/mpu6500.o + .debug_frame 0x000000000000556c 0x284 bin/i2cdev_f405.o + .debug_frame 0x00000000000057f0 0xa0 bin/ws2812_cf2.o + .debug_frame 0x0000000000005890 0xe8 bin/lps25h.o + .debug_frame 0x0000000000005978 0x288 bin/ak8963.o + .debug_frame 0x0000000000005c00 0xa0 bin/eeprom.o + .debug_frame 0x0000000000005ca0 0x7c bin/piezo.o + .debug_frame 0x0000000000005d1c 0x18c bin/uart_syslink.o + .debug_frame 0x0000000000005ea8 0x44 bin/watchdog.o + .debug_frame 0x0000000000005eec 0x64 bin/sonar.o + .debug_frame 0x0000000000005f50 0x68 bin/usb_bsp.o + .debug_frame 0x0000000000005fb8 0xa8 bin/usblink.o + .debug_frame 0x0000000000006060 0xb4 bin/usbd_desc.o + .debug_frame 0x0000000000006114 0x1a0 bin/usb.o + .debug_frame 0x00000000000062b4 0x134 bin/imu_cf2.o + .debug_frame 0x00000000000063e8 0x104 bin/pm_f405.o + .debug_frame 0x00000000000064ec 0x80 bin/syslink.o + .debug_frame 0x000000000000656c 0x104 bin/radiolink.o + .debug_frame 0x0000000000006670 0x100 bin/ow_syslink.o + .debug_frame 0x0000000000006770 0x58 bin/platformservice.o + .debug_frame 0x00000000000067c8 0xf0 bin/sound_cf2.o + .debug_frame 0x00000000000068b8 0x4c bin/deck.o + .debug_frame 0x0000000000006904 0x100 bin/deck_info.o + .debug_frame 0x0000000000006a04 0x90 bin/deck_drivers.o + .debug_frame 0x0000000000006a94 0x60 bin/deck_analog.o + .debug_frame 0x0000000000006af4 0x58 bin/buzzdeck.o + .debug_frame 0x0000000000006b4c 0x38 bin/bigquad.o + .debug_frame 0x0000000000006b84 0x54 bin/exptest.o + .debug_frame 0x0000000000006bd8 0x214 bin/ledring12.o + .debug_frame 0x0000000000006dec 0xb0 bin/configblockeeprom.o + .debug_frame 0x0000000000006e9c 0x2c /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libm.a(lib_a-sf_atan.o) + .debug_frame 0x0000000000006ec8 0x34 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libm.a(lib_a-sf_cos.o) + .debug_frame 0x0000000000006efc 0x20 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libm.a(lib_a-sf_fabs.o) + .debug_frame 0x0000000000006f1c 0x34 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libm.a(lib_a-sf_sin.o) + .debug_frame 0x0000000000006f50 0x38 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libm.a(lib_a-sf_tan.o) + .debug_frame 0x0000000000006f88 0x50 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libm.a(lib_a-wf_asin.o) + .debug_frame 0x0000000000006fd8 0x20 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libm.a(lib_a-wf_atan2.o) + .debug_frame 0x0000000000006ff8 0x64 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libm.a(lib_a-wf_pow.o) + .debug_frame 0x000000000000705c 0x70 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libm.a(lib_a-ef_asin.o) + .debug_frame 0x00000000000070cc 0x48 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libm.a(lib_a-ef_atan2.o) + .debug_frame 0x0000000000007114 0x7c /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libm.a(lib_a-ef_pow.o) + .debug_frame 0x0000000000007190 0x3c /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libm.a(lib_a-ef_rem_pio2.o) + .debug_frame 0x00000000000071cc 0x3c /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libm.a(lib_a-ef_sqrt.o) + .debug_frame 0x0000000000007208 0x20 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libm.a(lib_a-kf_cos.o) + .debug_frame 0x0000000000007228 0x5c /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libm.a(lib_a-kf_rem_pio2.o) + .debug_frame 0x0000000000007284 0x20 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libm.a(lib_a-kf_sin.o) + .debug_frame 0x00000000000072a4 0x50 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libm.a(lib_a-kf_tan.o) + .debug_frame 0x00000000000072f4 0x20 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libm.a(lib_a-s_matherr.o) + .debug_frame 0x0000000000007314 0x20 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libm.a(lib_a-s_nan.o) + .debug_frame 0x0000000000007334 0x3c /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libm.a(lib_a-s_rint.o) + .debug_frame 0x0000000000007370 0x20 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libm.a(lib_a-sf_finite.o) + .debug_frame 0x0000000000007390 0x20 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libm.a(lib_a-sf_floor.o) + .debug_frame 0x00000000000073b0 0x20 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libm.a(lib_a-sf_fpclassify.o) + .debug_frame 0x00000000000073d0 0x20 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libm.a(lib_a-sf_nan.o) + .debug_frame 0x00000000000073f0 0x44 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libm.a(lib_a-sf_scalbn.o) + .debug_frame 0x0000000000007434 0x20 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libm.a(lib_a-sf_copysign.o) + .debug_frame 0x0000000000007454 0x28 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/armv7e-m/fpu/libgcc.a(_aeabi_ldivmod.o) + .debug_frame 0x000000000000747c 0x50 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/armv7e-m/fpu/libgcc.a(bpabi.o) + .debug_frame 0x00000000000074cc 0x34 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/armv7e-m/fpu/libgcc.a(_divdi3.o) + .debug_frame 0x0000000000007500 0x30 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/armv7e-m/fpu/libgcc.a(_udivdi3.o) + .debug_frame 0x0000000000007530 0x20 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libc_nano.a(lib_a-errno.o) + .debug_frame 0x0000000000007550 0x28 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libc_nano.a(lib_a-memcpy.o) + .debug_frame 0x0000000000007578 0x20 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libc_nano.a(lib_a-memset.o) + .debug_frame 0x0000000000007598 0x20 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libc_nano.a(lib_a-strcpy.o) + .debug_frame 0x00000000000075b8 0x20 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libc_nano.a(lib_a-strlen.o) + .debug_frame 0x00000000000075d8 0x28 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libc_nano.a(lib_a-strncpy.o) -.debug_str 0x0000000000000000 0x807a1 +.debug_str 0x0000000000000000 0x835cb *(.debug_str) - .debug_str 0x0000000000000000 0x7357 bin/list.o - 0x74a2 (size before relaxing) - .debug_str 0x0000000000007357 0x25da bin/tasks.o - 0x9a9c (size before relaxing) - .debug_str 0x0000000000009931 0xe46 bin/queue.o - 0x87f7 (size before relaxing) - .debug_str 0x000000000000a777 0x350 bin/timers.o - 0x6673 (size before relaxing) - .debug_str 0x000000000000aac7 0x214 bin/heap_4.o - 0x792a (size before relaxing) - .debug_str 0x000000000000acdb 0x4c7 bin/port.o - 0x57cb (size before relaxing) - .debug_str 0x000000000000b1a2 0x5b2a2 bin/stm32f4xx_adc.o + .debug_str 0x0000000000000000 0x93e6 bin/list.o + 0x9616 (size before relaxing) + .debug_str 0x00000000000093e6 0x2217 bin/tasks.o + 0xb8bd (size before relaxing) + .debug_str 0x000000000000b5fd 0x1048 bin/queue.o + 0xb045 (size before relaxing) + .debug_str 0x000000000000c645 0x3aa bin/timers.o + 0xb54c (size before relaxing) + .debug_str 0x000000000000c9ef 0x239 bin/heap_4.o + 0x9f1c (size before relaxing) + .debug_str 0x000000000000cc28 0x726 bin/port.o + 0x8241 (size before relaxing) + .debug_str 0x000000000000d34e 0x5a9e8 bin/stm32f4xx_adc.o 0x5db3b (size before relaxing) - .debug_str 0x0000000000066444 0xd7 bin/stm32f4xx_dbgmcu.o + .debug_str 0x0000000000067d36 0xd7 bin/stm32f4xx_dbgmcu.o 0x5d2a6 (size before relaxing) - .debug_str 0x000000000006651b 0x683 bin/stm32f4xx_dma.o + .debug_str 0x0000000000067e0d 0x683 bin/stm32f4xx_dma.o 0x5d89b (size before relaxing) - .debug_str 0x0000000000066b9e 0x1d9 bin/stm32f4xx_exti.o + .debug_str 0x0000000000068490 0x1d9 bin/stm32f4xx_exti.o 0x5d3ab (size before relaxing) - .debug_str 0x0000000000066d77 0x2c5 bin/stm32f4xx_gpio.o + .debug_str 0x0000000000068669 0x2c5 bin/stm32f4xx_gpio.o 0x5d504 (size before relaxing) - .debug_str 0x000000000006703c 0x52a bin/stm32f4xx_i2c.o + .debug_str 0x000000000006892e 0x52a bin/stm32f4xx_i2c.o 0x5d77c (size before relaxing) - .debug_str 0x0000000000067566 0xc23 bin/stm32f4xx_rcc.o + .debug_str 0x0000000000068e58 0x114 bin/stm32f4xx_iwdg.o + 0x5d2eb (size before relaxing) + .debug_str 0x0000000000068f6c 0xc23 bin/stm32f4xx_rcc.o 0x5df99 (size before relaxing) - .debug_str 0x0000000000068189 0xc1c bin/stm32f4xx_tim.o + .debug_str 0x0000000000069b8f 0xbfc bin/stm32f4xx_tim.o 0x5df02 (size before relaxing) - .debug_str 0x0000000000068da5 0x53e bin/stm32f4xx_usart.o + .debug_str 0x000000000006a78b 0x53e bin/stm32f4xx_usart.o 0x5d830 (size before relaxing) - .debug_str 0x00000000000692e3 0x23d bin/stm32f4xx_misc.o + .debug_str 0x000000000006acc9 0x23d bin/stm32f4xx_misc.o 0x5d43f (size before relaxing) - .debug_str 0x0000000000069520 0x354 bin/stm32f4xx_syscfg.o + .debug_str 0x000000000006af06 0x354 bin/stm32f4xx_syscfg.o 0x5d54f (size before relaxing) - .debug_str 0x0000000000069874 0x30d bin/main.o - 0x60162 (size before relaxing) - .debug_str 0x0000000000069b81 0x51c bin/exti.o - 0x5e27e (size before relaxing) - .debug_str 0x000000000006a09d 0xe64 bin/nvic.o - 0x5e43a (size before relaxing) - .debug_str 0x000000000006af01 0x1699 bin/motors.o - 0x621ea (size before relaxing) - .debug_str 0x000000000006c59a 0x728 bin/crtp.o - 0x88e9 (size before relaxing) - .debug_str 0x000000000006ccc2 0x23e bin/ledseq.o - 0x7877 (size before relaxing) - .debug_str 0x000000000006cf00 0x49 bin/freeRTOSdebug.o - 0x6254 (size before relaxing) - .debug_str 0x000000000006cf49 0x111e bin/system.o - 0x9cc1 (size before relaxing) - .debug_str 0x000000000006e067 0x123 bin/comm.o - 0x47dc (size before relaxing) - .debug_str 0x000000000006e18a 0x6e bin/console.o - 0x6f74 (size before relaxing) - .debug_str 0x000000000006e1f8 0xd81 bin/pid.o - 0x626c9 (size before relaxing) - .debug_str 0x000000000006ef79 0x51 bin/crtpservice.o - 0x8143 (size before relaxing) - .debug_str 0x000000000006efca 0x247 bin/param.o - 0x8d09 (size before relaxing) - .debug_str 0x000000000006f211 0x1f8 bin/mem.o - 0x649df (size before relaxing) - .debug_str 0x000000000006f409 0x2e5 bin/commander.o - 0x679c (size before relaxing) - .debug_str 0x000000000006f6ee 0x319 bin/controller.o - 0x68ff (size before relaxing) - .debug_str 0x000000000006fa07 0x177 bin/sensfusion6.o - 0x5866 (size before relaxing) - .debug_str 0x000000000006fb7e 0x66a bin/stabilizer.o - 0x65d92 (size before relaxing) - .debug_str 0x00000000000701e8 0x32a bin/log.o - 0xa2d3 (size before relaxing) - .debug_str 0x0000000000070512 0x4c bin/worker.o - 0x745b (size before relaxing) - .debug_str 0x000000000007055e 0x47 bin/filter.o + .debug_str 0x000000000006b25a 0x30d bin/main.o + 0x61d78 (size before relaxing) + .debug_str 0x000000000006b567 0x554 bin/exti.o + 0x5e654 (size before relaxing) + .debug_str 0x000000000006babb 0xe88 bin/nvic.o + 0x5e4fa (size before relaxing) + .debug_str 0x000000000006c943 0x16ee bin/motors.o + 0x63ffa (size before relaxing) + .debug_str 0x000000000006e031 0x5cf bin/crtp.o + 0xa737 (size before relaxing) + .debug_str 0x000000000006e600 0x22d bin/ledseq.o + 0x990c (size before relaxing) + .debug_str 0x000000000006e82d 0x13d bin/freeRTOSdebug.o + 0x7ea6 (size before relaxing) + .debug_str 0x000000000006e96a 0x82 bin/buzzer.o + 0x3197 (size before relaxing) + .debug_str 0x000000000006e9ec 0x176a bin/system.o + 0x6628f (size before relaxing) + .debug_str 0x0000000000070156 0x123 bin/comm.o + 0x4b7a (size before relaxing) + .debug_str 0x0000000000070279 0x6e bin/console.o + 0x7ec3 (size before relaxing) + .debug_str 0x00000000000702e7 0x37c bin/pid.o + 0x28e4 (size before relaxing) + .debug_str 0x0000000000070663 0x51 bin/crtpservice.o + 0x8e66 (size before relaxing) + .debug_str 0x00000000000706b4 0x247 bin/param.o + 0xa942 (size before relaxing) + .debug_str 0x00000000000708fb 0x281 bin/mem.o + 0x66c97 (size before relaxing) + .debug_str 0x0000000000070b7c 0x2e5 bin/commander.o + 0x83ab (size before relaxing) + .debug_str 0x0000000000070e61 0x319 bin/controller.o + 0x7624 (size before relaxing) + .debug_str 0x000000000007117a 0xb7e bin/sensfusion6.o + 0x5728 (size before relaxing) + .debug_str 0x0000000000071cf8 0x67e bin/stabilizer.o + 0x67bae (size before relaxing) + .debug_str 0x0000000000072376 0x321 bin/log.o + 0xc34e (size before relaxing) + .debug_str 0x0000000000072697 0x4c bin/worker.o + 0x9bff (size before relaxing) + .debug_str 0x00000000000726e3 0x47 bin/filter.o 0x3132 (size before relaxing) - .debug_str 0x00000000000705a5 0x26 bin/cfassert.o - 0x2a3f (size before relaxing) - .debug_str 0x00000000000705cb 0x4c8 bin/eprintf.o + .debug_str 0x000000000007272a 0xa4 bin/cfassert.o + 0x4500 (size before relaxing) + .debug_str 0x00000000000727ce 0x4d7 bin/eprintf.o 0x307f (size before relaxing) - .debug_str 0x0000000000070a93 0xfa bin/crc.o + .debug_str 0x0000000000072ca5 0xfa bin/crc.o 0x3295 (size before relaxing) - .debug_str 0x0000000000070b8d 0x29 bin/fp16.o + .debug_str 0x0000000000072d9f 0x29 bin/fp16.o 0x311d (size before relaxing) - .debug_str 0x0000000000070bb6 0x53 bin/version.o - 0x4019 (size before relaxing) - .debug_str 0x0000000000070c09 0xea bin/system_stm32f4xx.o + .debug_str 0x0000000000072dc8 0x53 bin/version.o + 0x43b7 (size before relaxing) + .debug_str 0x0000000000072e1b 0x4a bin/FreeRTOS-openocd.o + 0x6ab2 (size before relaxing) + .debug_str 0x0000000000072e65 0xea bin/system_stm32f4xx.o 0x5d436 (size before relaxing) - .debug_str 0x0000000000070cf3 0x37 bin/cpal_hal.o - 0x5da84 (size before relaxing) - .debug_str 0x0000000000070d2a 0x3ca0 bin/cpal_i2c.o - 0x61852 (size before relaxing) - .debug_str 0x00000000000749ca 0x37 bin/cpal_usercallback_template.o - 0x61102 (size before relaxing) - .debug_str 0x0000000000074a01 0x2fb bin/cpal_i2c_hal_stm32f4xx.o - 0x621fe (size before relaxing) - .debug_str 0x0000000000074cfc 0x1d66 bin/usb_core.o + .debug_str 0x0000000000072f4f 0x37 bin/cpal_hal.o + 0x5db44 (size before relaxing) + .debug_str 0x0000000000072f86 0x3ca0 bin/cpal_i2c.o + 0x61912 (size before relaxing) + .debug_str 0x0000000000076c26 0x2fb bin/cpal_i2c_hal_stm32f4xx.o + 0x622be (size before relaxing) + .debug_str 0x0000000000076f21 0x1d5b bin/usb_core.o 0x60494 (size before relaxing) - .debug_str 0x0000000000076a62 0x4ce bin/usb_dcd_int.o + .debug_str 0x0000000000078c7c 0x4ce bin/usb_dcd_int.o 0x603e1 (size before relaxing) - .debug_str 0x0000000000076f30 0x105 bin/usb_dcd.o + .debug_str 0x000000000007914a 0x105 bin/usb_dcd.o 0x5fb6c (size before relaxing) - .debug_str 0x0000000000077035 0x635 bin/usbd_ioreq.o + .debug_str 0x000000000007924f 0x635 bin/usbd_ioreq.o 0x5fef8 (size before relaxing) - .debug_str 0x000000000007766a 0x283 bin/usbd_req.o + .debug_str 0x0000000000079884 0x283 bin/usbd_req.o 0x60193 (size before relaxing) - .debug_str 0x00000000000778ed 0x121 bin/usbd_core.o + .debug_str 0x0000000000079b07 0x121 bin/usbd_core.o 0x602b8 (size before relaxing) - .debug_str 0x0000000000077a0e 0x25 bin/platform_cf2.o - 0x5fe59 (size before relaxing) - .debug_str 0x0000000000077a33 0x3f bin/led_f405.o - 0x6038b (size before relaxing) - .debug_str 0x0000000000077a72 0x408f bin/mpu6500.o - 0x669e4 (size before relaxing) - .debug_str 0x000000000007bb01 0x2e3 bin/i2cdev_f405.o - 0x657fe (size before relaxing) - .debug_str 0x000000000007bde4 0xad bin/ws2812.o - 0x637c5 (size before relaxing) - .debug_str 0x000000000007be91 0x645 bin/lps25h.o - 0x62fcb (size before relaxing) - .debug_str 0x000000000007c4d6 0x64b bin/ak8963.o - 0x6132a (size before relaxing) - .debug_str 0x000000000007cb21 0x79 bin/eeprom.o - 0x60d23 (size before relaxing) - .debug_str 0x000000000007cb9a 0x28f bin/uart_syslink.o - 0x645be (size before relaxing) - .debug_str 0x000000000007ce29 0x7f bin/sonar.o - 0x65ccd (size before relaxing) - .debug_str 0x000000000007cea8 0x1d bin/usb_bsp.o - 0x60a65 (size before relaxing) - .debug_str 0x000000000007cec5 0xd4 bin/usblink.o - 0x9d9e (size before relaxing) - .debug_str 0x000000000007cf99 0x304 bin/usbd_desc.o - 0x60459 (size before relaxing) - .debug_str 0x000000000007d29d 0x214 bin/usb.o - 0x655bc (size before relaxing) - .debug_str 0x000000000007d4b1 0xfbd bin/imu_cf2.o - 0x672d3 (size before relaxing) - .debug_str 0x000000000007e46e 0x227 bin/pm_f405.o - 0x6402d (size before relaxing) - .debug_str 0x000000000007e695 0x141 bin/syslink.o - 0x9cac (size before relaxing) - .debug_str 0x000000000007e7d6 0x132 bin/radiolink.o - 0x9aa5 (size before relaxing) - .debug_str 0x000000000007e908 0x161 bin/ow_syslink.o - 0x8d42 (size before relaxing) - .debug_str 0x000000000007ea69 0x60d bin/neopixelring.o - 0x64674 (size before relaxing) - .debug_str 0x000000000007f076 0xbe bin/expbrd.o - 0x6db3 (size before relaxing) - .debug_str 0x000000000007f134 0xb8 bin/platformservice.o - 0x846d (size before relaxing) - .debug_str 0x000000000007f1ec 0x39 bin/bigquad.o - 0x60ba5 (size before relaxing) - .debug_str 0x000000000007f225 0x39f bin/exptest.o - 0x608dd (size before relaxing) - .debug_str 0x000000000007f5c4 0x1fd bin/deck_analog.o - 0x5d827 (size before relaxing) - .debug_str 0x000000000007f7c1 0xfe0 bin/configblockeeprom.o - 0x624c4 (size before relaxing) + .debug_str 0x0000000000079c28 0x25 bin/platform_cf2.o + 0x254a (size before relaxing) + .debug_str 0x0000000000079c4d 0x3f bin/led_f405.o + 0x61f9f (size before relaxing) + .debug_str 0x0000000000079c8c 0x4088 bin/mpu6500.o + 0x686b3 (size before relaxing) + .debug_str 0x000000000007dd14 0x30e bin/i2cdev_f405.o + 0x6740f (size before relaxing) + .debug_str 0x000000000007e022 0xb1 bin/ws2812_cf2.o + 0x64c80 (size before relaxing) + .debug_str 0x000000000007e0d3 0x645 bin/lps25h.o + 0x64c9a (size before relaxing) + .debug_str 0x000000000007e718 0x64b bin/ak8963.o + 0x62ff9 (size before relaxing) + .debug_str 0x000000000007ed63 0x79 bin/eeprom.o + 0x629f2 (size before relaxing) + .debug_str 0x000000000007eddc 0x2a8 bin/piezo.o + 0x621c8 (size before relaxing) + .debug_str 0x000000000007f084 0x28f bin/uart_syslink.o + 0x6615b (size before relaxing) + .debug_str 0x000000000007f313 0x26 bin/watchdog.o + 0x5e41d (size before relaxing) + .debug_str 0x000000000007f339 0x7f bin/sonar.o + 0x67b9f (size before relaxing) + .debug_str 0x000000000007f3b8 0x1d bin/usb_bsp.o + 0x60e3b (size before relaxing) + .debug_str 0x000000000007f3d5 0xd4 bin/usblink.o + 0xbc25 (size before relaxing) + .debug_str 0x000000000007f4a9 0x304 bin/usbd_desc.o + 0x607f7 (size before relaxing) + .debug_str 0x000000000007f7ad 0x214 bin/usb.o + 0x6710e (size before relaxing) + .debug_str 0x000000000007f9c1 0xfbd bin/imu_cf2.o + 0x6901d (size before relaxing) + .debug_str 0x000000000008097e 0x21d bin/pm_f405.o + 0x65ef6 (size before relaxing) + .debug_str 0x0000000000080b9b 0x141 bin/syslink.o + 0xbafa (size before relaxing) + .debug_str 0x0000000000080cdc 0x132 bin/radiolink.o + 0xb91b (size before relaxing) + .debug_str 0x0000000000080e0e 0x15b bin/ow_syslink.o + 0xa48e (size before relaxing) + .debug_str 0x0000000000080f69 0xc0 bin/platformservice.o + 0x9190 (size before relaxing) + .debug_str 0x0000000000081029 0x400 bin/sound_cf2.o + 0xb150 (size before relaxing) + .debug_str 0x0000000000081429 0x103 bin/deck.o + 0x60d51 (size before relaxing) + .debug_str 0x000000000008152c 0x12c bin/deck_info.o + 0x61279 (size before relaxing) + .debug_str 0x0000000000081658 0xa2 bin/deck_drivers.o + 0x60e48 (size before relaxing) + .debug_str 0x00000000000816fa 0x9d bin/deck_analog.o + 0x5dc50 (size before relaxing) + .debug_str 0x0000000000081797 0x60 bin/buzzdeck.o + 0x60ba6 (size before relaxing) + .debug_str 0x00000000000817f7 0x5e bin/bigquad.o + 0x6156f (size before relaxing) + .debug_str 0x0000000000081855 0x3be bin/exptest.o + 0x613da (size before relaxing) + .debug_str 0x0000000000081c13 0x602 bin/ledring12.o + 0x67c1d (size before relaxing) + .debug_str 0x0000000000082215 0x13b6 bin/configblockeeprom.o + 0x62922 (size before relaxing) -.debug_loc 0x0000000000000000 0x12825 +.debug_loc 0x0000000000000000 0x13e11 *(.debug_loc) - .debug_loc 0x0000000000000000 0x71 bin/list.o - .debug_loc 0x0000000000000071 0xbfc bin/tasks.o - .debug_loc 0x0000000000000c6d 0xa9a bin/queue.o - .debug_loc 0x0000000000001707 0x689 bin/timers.o - .debug_loc 0x0000000000001d90 0x2c4 bin/heap_4.o - .debug_loc 0x0000000000002054 0x81 bin/port.o - .debug_loc 0x00000000000020d5 0xb1b bin/stm32f4xx_adc.o - .debug_loc 0x0000000000002bf0 0xae bin/stm32f4xx_dbgmcu.o - .debug_loc 0x0000000000002c9e 0x458 bin/stm32f4xx_dma.o - .debug_loc 0x00000000000030f6 0x151 bin/stm32f4xx_exti.o - .debug_loc 0x0000000000003247 0x357 bin/stm32f4xx_gpio.o - .debug_loc 0x000000000000359e 0x711 bin/stm32f4xx_i2c.o - .debug_loc 0x0000000000003caf 0xbb1 bin/stm32f4xx_rcc.o - .debug_loc 0x0000000000004860 0x1aa4 bin/stm32f4xx_tim.o - .debug_loc 0x0000000000006304 0x78b bin/stm32f4xx_usart.o - .debug_loc 0x0000000000006a8f 0x147 bin/stm32f4xx_misc.o - .debug_loc 0x0000000000006bd6 0xa6 bin/stm32f4xx_syscfg.o - .debug_loc 0x0000000000006c7c 0x21 bin/nvic.o - .debug_loc 0x0000000000006c9d 0x2ed bin/motors.o - .debug_loc 0x0000000000006f8a 0x268 bin/crtp.o - .debug_loc 0x00000000000071f2 0x271 bin/ledseq.o - .debug_loc 0x0000000000007463 0x42 bin/freeRTOSdebug.o - .debug_loc 0x00000000000074a5 0x9e bin/system.o - .debug_loc 0x0000000000007543 0x3e bin/comm.o - .debug_loc 0x0000000000007581 0xe0 bin/console.o - .debug_loc 0x0000000000007661 0x88 bin/pid.o - .debug_loc 0x00000000000076e9 0x55 bin/crtpservice.o - .debug_loc 0x000000000000773e 0x427 bin/param.o - .debug_loc 0x0000000000007b65 0x15b bin/mem.o - .debug_loc 0x0000000000007cc0 0x111 bin/commander.o - .debug_loc 0x0000000000007dd1 0x2ec bin/controller.o - .debug_loc 0x00000000000080bd 0x417 bin/sensfusion6.o - .debug_loc 0x00000000000084d4 0x3d7 bin/stabilizer.o - .debug_loc 0x00000000000088ab 0x998 bin/log.o - .debug_loc 0x0000000000009243 0x8c bin/worker.o - .debug_loc 0x00000000000092cf 0x92 bin/filter.o - .debug_loc 0x0000000000009361 0x63 bin/cfassert.o - .debug_loc 0x00000000000093c4 0x4a3 bin/eprintf.o - .debug_loc 0x0000000000009867 0x183 bin/crc.o - .debug_loc 0x00000000000099ea 0x10f bin/fp16.o - .debug_loc 0x0000000000009af9 0xc8 bin/system_stm32f4xx.o - .debug_loc 0x0000000000009bc1 0x43a bin/cpal_i2c.o - .debug_loc 0x0000000000009ffb 0x21 bin/cpal_usercallback_template.o - .debug_loc 0x000000000000a01c 0x30d bin/cpal_i2c_hal_stm32f4xx.o - .debug_loc 0x000000000000a329 0x10f0 bin/usb_core.o - .debug_loc 0x000000000000b419 0x682 bin/usb_dcd_int.o - .debug_loc 0x000000000000ba9b 0x605 bin/usb_dcd.o - .debug_loc 0x000000000000c0a0 0x1f8 bin/usbd_ioreq.o - .debug_loc 0x000000000000c298 0x72b bin/usbd_req.o - .debug_loc 0x000000000000c9c3 0x506 bin/usbd_core.o - .debug_loc 0x000000000000cec9 0x13b bin/led_f405.o - .debug_loc 0x000000000000d004 0x18cf bin/mpu6500.o - .debug_loc 0x000000000000e8d3 0xbac bin/i2cdev_f405.o - .debug_loc 0x000000000000f47f 0x161 bin/ws2812.o - .debug_loc 0x000000000000f5e0 0x27b bin/lps25h.o - .debug_loc 0x000000000000f85b 0x38a bin/ak8963.o - .debug_loc 0x000000000000fbe5 0x215 bin/eeprom.o - .debug_loc 0x000000000000fdfa 0x185 bin/uart_syslink.o - .debug_loc 0x000000000000ff7f 0x15 bin/sonar.o - .debug_loc 0x000000000000ff94 0xa3 bin/usb_bsp.o - .debug_loc 0x0000000000010037 0xad bin/usblink.o - .debug_loc 0x00000000000100e4 0x2b6 bin/usbd_desc.o - .debug_loc 0x000000000001039a 0x2de bin/usb.o - .debug_loc 0x0000000000010678 0x409 bin/imu_cf2.o - .debug_loc 0x0000000000010a81 0x168 bin/pm_f405.o - .debug_loc 0x0000000000010be9 0x35a bin/syslink.o - .debug_loc 0x0000000000010f43 0x14a bin/radiolink.o - .debug_loc 0x000000000001108d 0x42f bin/ow_syslink.o - .debug_loc 0x00000000000114bc 0xc7a bin/neopixelring.o - .debug_loc 0x0000000000012136 0x1a3 bin/expbrd.o - .debug_loc 0x00000000000122d9 0xf7 bin/platformservice.o - .debug_loc 0x00000000000123d0 0x9a bin/exptest.o - .debug_loc 0x000000000001246a 0x2e bin/deck_analog.o - .debug_loc 0x0000000000012498 0x38d bin/configblockeeprom.o + .debug_loc 0x0000000000000000 0x7c bin/list.o + .debug_loc 0x000000000000007c 0x15f1 bin/tasks.o + .debug_loc 0x000000000000166d 0xbc2 bin/queue.o + .debug_loc 0x000000000000222f 0x6e7 bin/timers.o + .debug_loc 0x0000000000002916 0x27f bin/heap_4.o + .debug_loc 0x0000000000002b95 0x9a bin/port.o + .debug_loc 0x0000000000002c2f 0xb1b bin/stm32f4xx_adc.o + .debug_loc 0x000000000000374a 0xae bin/stm32f4xx_dbgmcu.o + .debug_loc 0x00000000000037f8 0x458 bin/stm32f4xx_dma.o + .debug_loc 0x0000000000003c50 0x151 bin/stm32f4xx_exti.o + .debug_loc 0x0000000000003da1 0x357 bin/stm32f4xx_gpio.o + .debug_loc 0x00000000000040f8 0x711 bin/stm32f4xx_i2c.o + .debug_loc 0x0000000000004809 0x62 bin/stm32f4xx_iwdg.o + .debug_loc 0x000000000000486b 0xbb1 bin/stm32f4xx_rcc.o + .debug_loc 0x000000000000541c 0x1aa4 bin/stm32f4xx_tim.o + .debug_loc 0x0000000000006ec0 0x78b bin/stm32f4xx_usart.o + .debug_loc 0x000000000000764b 0x147 bin/stm32f4xx_misc.o + .debug_loc 0x0000000000007792 0xa6 bin/stm32f4xx_syscfg.o + .debug_loc 0x0000000000007838 0x21 bin/nvic.o + .debug_loc 0x0000000000007859 0x2ed bin/motors.o + .debug_loc 0x0000000000007b46 0x23c bin/crtp.o + .debug_loc 0x0000000000007d82 0x271 bin/ledseq.o + .debug_loc 0x0000000000007ff3 0x42 bin/freeRTOSdebug.o + .debug_loc 0x0000000000008035 0x2c bin/buzzer.o + .debug_loc 0x0000000000008061 0xb1 bin/system.o + .debug_loc 0x0000000000008112 0x3e bin/comm.o + .debug_loc 0x0000000000008150 0xe0 bin/console.o + .debug_loc 0x0000000000008230 0x88 bin/pid.o + .debug_loc 0x00000000000082b8 0x55 bin/crtpservice.o + .debug_loc 0x000000000000830d 0x427 bin/param.o + .debug_loc 0x0000000000008734 0x1ac bin/mem.o + .debug_loc 0x00000000000088e0 0x111 bin/commander.o + .debug_loc 0x00000000000089f1 0x2ec bin/controller.o + .debug_loc 0x0000000000008cdd 0x417 bin/sensfusion6.o + .debug_loc 0x00000000000090f4 0x40f bin/stabilizer.o + .debug_loc 0x0000000000009503 0x998 bin/log.o + .debug_loc 0x0000000000009e9b 0x8c bin/worker.o + .debug_loc 0x0000000000009f27 0x92 bin/filter.o + .debug_loc 0x0000000000009fb9 0xb5 bin/cfassert.o + .debug_loc 0x000000000000a06e 0x4a3 bin/eprintf.o + .debug_loc 0x000000000000a511 0x183 bin/crc.o + .debug_loc 0x000000000000a694 0x10f bin/fp16.o + .debug_loc 0x000000000000a7a3 0xc8 bin/system_stm32f4xx.o + .debug_loc 0x000000000000a86b 0x43a bin/cpal_i2c.o + .debug_loc 0x000000000000aca5 0x30d bin/cpal_i2c_hal_stm32f4xx.o + .debug_loc 0x000000000000afb2 0x10f0 bin/usb_core.o + .debug_loc 0x000000000000c0a2 0x682 bin/usb_dcd_int.o + .debug_loc 0x000000000000c724 0x605 bin/usb_dcd.o + .debug_loc 0x000000000000cd29 0x1f8 bin/usbd_ioreq.o + .debug_loc 0x000000000000cf21 0x72b bin/usbd_req.o + .debug_loc 0x000000000000d64c 0x506 bin/usbd_core.o + .debug_loc 0x000000000000db52 0x13b bin/led_f405.o + .debug_loc 0x000000000000dc8d 0x18cf bin/mpu6500.o + .debug_loc 0x000000000000f55c 0xc53 bin/i2cdev_f405.o + .debug_loc 0x00000000000101af 0x161 bin/ws2812_cf2.o + .debug_loc 0x0000000000010310 0x27b bin/lps25h.o + .debug_loc 0x000000000001058b 0x38a bin/ak8963.o + .debug_loc 0x0000000000010915 0x215 bin/eeprom.o + .debug_loc 0x0000000000010b2a 0x42 bin/piezo.o + .debug_loc 0x0000000000010b6c 0x185 bin/uart_syslink.o + .debug_loc 0x0000000000010cf1 0x37 bin/watchdog.o + .debug_loc 0x0000000000010d28 0x15 bin/sonar.o + .debug_loc 0x0000000000010d3d 0xa3 bin/usb_bsp.o + .debug_loc 0x0000000000010de0 0xad bin/usblink.o + .debug_loc 0x0000000000010e8d 0x2b6 bin/usbd_desc.o + .debug_loc 0x0000000000011143 0x2de bin/usb.o + .debug_loc 0x0000000000011421 0x409 bin/imu_cf2.o + .debug_loc 0x000000000001182a 0x168 bin/pm_f405.o + .debug_loc 0x0000000000011992 0x35a bin/syslink.o + .debug_loc 0x0000000000011cec 0x14a bin/radiolink.o + .debug_loc 0x0000000000011e36 0x42f bin/ow_syslink.o + .debug_loc 0x0000000000012265 0xf7 bin/platformservice.o + .debug_loc 0x000000000001235c 0x297 bin/sound_cf2.o + .debug_loc 0x00000000000125f3 0xcb bin/deck.o + .debug_loc 0x00000000000126be 0x44c bin/deck_info.o + .debug_loc 0x0000000000012b0a 0xd8 bin/deck_drivers.o + .debug_loc 0x0000000000012be2 0x2e bin/deck_analog.o + .debug_loc 0x0000000000012c10 0x4d bin/buzzdeck.o + .debug_loc 0x0000000000012c5d 0x42 bin/bigquad.o + .debug_loc 0x0000000000012c9f 0x8f bin/exptest.o + .debug_loc 0x0000000000012d2e 0xd56 bin/ledring12.o + .debug_loc 0x0000000000013a84 0x38d bin/configblockeeprom.o .debug_macinfo *(.debug_macinfo) @@ -14107,332 +15439,347 @@ LOAD /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none- *(.debug_varnames) OUTPUT(cf2.elf elf32-littlearm) -.debug_ranges 0x0000000000000000 0x29a8 +.debug_ranges 0x0000000000000000 0x2c78 .debug_ranges 0x0000000000000000 0x30 bin/list.o - .debug_ranges 0x0000000000000030 0x120 bin/tasks.o - .debug_ranges 0x0000000000000150 0x90 bin/queue.o - .debug_ranges 0x00000000000001e0 0x80 bin/timers.o - .debug_ranges 0x0000000000000260 0x30 bin/heap_4.o - .debug_ranges 0x0000000000000290 0x78 bin/port.o - .debug_ranges 0x0000000000000308 0x138 bin/stm32f4xx_adc.o - .debug_ranges 0x0000000000000440 0x30 bin/stm32f4xx_dbgmcu.o - .debug_ranges 0x0000000000000470 0xa0 bin/stm32f4xx_dma.o - .debug_ranges 0x0000000000000510 0x48 bin/stm32f4xx_exti.o - .debug_ranges 0x0000000000000558 0x78 bin/stm32f4xx_gpio.o - .debug_ranges 0x00000000000005d0 0x120 bin/stm32f4xx_i2c.o - .debug_ranges 0x00000000000006f0 0x1a8 bin/stm32f4xx_rcc.o - .debug_ranges 0x0000000000000898 0x2f0 bin/stm32f4xx_tim.o - .debug_ranges 0x0000000000000b88 0xf0 bin/stm32f4xx_usart.o - .debug_ranges 0x0000000000000c78 0x30 bin/stm32f4xx_misc.o - .debug_ranges 0x0000000000000ca8 0x40 bin/stm32f4xx_syscfg.o - .debug_ranges 0x0000000000000ce8 0x10 bin/main.o - .debug_ranges 0x0000000000000cf8 0x20 bin/exti.o - .debug_ranges 0x0000000000000d18 0x58 bin/nvic.o - .debug_ranges 0x0000000000000d70 0x48 bin/motors.o - .debug_ranges 0x0000000000000db8 0x90 bin/crtp.o - .debug_ranges 0x0000000000000e48 0x78 bin/ledseq.o - .debug_ranges 0x0000000000000ec0 0x20 bin/freeRTOSdebug.o - .debug_ranges 0x0000000000000ee0 0x50 bin/system.o - .debug_ranges 0x0000000000000f30 0x18 bin/comm.o - .debug_ranges 0x0000000000000f48 0x38 bin/console.o - .debug_ranges 0x0000000000000f80 0x70 bin/pid.o - .debug_ranges 0x0000000000000ff0 0x38 bin/crtpservice.o - .debug_ranges 0x0000000000001028 0x88 bin/param.o - .debug_ranges 0x00000000000010b0 0x20 bin/mem.o - .debug_ranges 0x00000000000010d0 0x70 bin/commander.o - .debug_ranges 0x0000000000001140 0x50 bin/controller.o - .debug_ranges 0x0000000000001190 0x48 bin/sensfusion6.o - .debug_ranges 0x00000000000011d8 0x48 bin/stabilizer.o - .debug_ranges 0x0000000000001220 0x178 bin/log.o - .debug_ranges 0x0000000000001398 0x28 bin/worker.o - .debug_ranges 0x00000000000013c0 0x10 bin/filter.o - .debug_ranges 0x00000000000013d0 0x10 bin/cfassert.o - .debug_ranges 0x00000000000013e0 0x30 bin/eprintf.o - .debug_ranges 0x0000000000001410 0x10 bin/crc.o - .debug_ranges 0x0000000000001420 0x18 bin/fp16.o - .debug_ranges 0x0000000000001438 0x18 bin/system_stm32f4xx.o - .debug_ranges 0x0000000000001450 0x10 bin/cpal_hal.o - .debug_ranges 0x0000000000001460 0x118 bin/cpal_i2c.o - .debug_ranges 0x0000000000001578 0x10 bin/cpal_usercallback_template.o - .debug_ranges 0x0000000000001588 0xb8 bin/cpal_i2c_hal_stm32f4xx.o - .debug_ranges 0x0000000000001640 0x138 bin/usb_core.o - .debug_ranges 0x0000000000001778 0x30 bin/usb_dcd_int.o - .debug_ranges 0x00000000000017a8 0x70 bin/usb_dcd.o - .debug_ranges 0x0000000000001818 0x40 bin/usbd_ioreq.o - .debug_ranges 0x0000000000001858 0x38 bin/usbd_req.o - .debug_ranges 0x0000000000001890 0x70 bin/usbd_core.o - .debug_ranges 0x0000000000001900 0x10 bin/platform_cf2.o - .debug_ranges 0x0000000000001910 0x50 bin/led_f405.o - .debug_ranges 0x0000000000001960 0x738 bin/mpu6500.o - .debug_ranges 0x0000000000002098 0x128 bin/i2cdev_f405.o - .debug_ranges 0x00000000000021c0 0x28 bin/ws2812.o - .debug_ranges 0x00000000000021e8 0x40 bin/lps25h.o - .debug_ranges 0x0000000000002228 0xd8 bin/ak8963.o - .debug_ranges 0x0000000000002300 0x38 bin/eeprom.o - .debug_ranges 0x0000000000002338 0xa0 bin/uart_syslink.o - .debug_ranges 0x00000000000023d8 0x20 bin/sonar.o - .debug_ranges 0x00000000000023f8 0x28 bin/usb_bsp.o - .debug_ranges 0x0000000000002420 0x40 bin/usblink.o - .debug_ranges 0x0000000000002460 0x58 bin/usbd_desc.o - .debug_ranges 0x00000000000024b8 0x98 bin/usb.o - .debug_ranges 0x0000000000002550 0xd8 bin/imu_cf2.o - .debug_ranges 0x0000000000002628 0x78 bin/pm_f405.o - .debug_ranges 0x00000000000026a0 0x28 bin/syslink.o - .debug_ranges 0x00000000000026c8 0x58 bin/radiolink.o - .debug_ranges 0x0000000000002720 0x48 bin/ow_syslink.o - .debug_ranges 0x0000000000002768 0x108 bin/neopixelring.o - .debug_ranges 0x0000000000002870 0x80 bin/expbrd.o - .debug_ranges 0x00000000000028f0 0x20 bin/platformservice.o - .debug_ranges 0x0000000000002910 0x18 bin/bigquad.o - .debug_ranges 0x0000000000002928 0x18 bin/exptest.o - .debug_ranges 0x0000000000002940 0x20 bin/deck_analog.o - .debug_ranges 0x0000000000002960 0x48 bin/configblockeeprom.o + .debug_ranges 0x0000000000000030 0x1f0 bin/tasks.o + .debug_ranges 0x0000000000000220 0xc8 bin/queue.o + .debug_ranges 0x00000000000002e8 0x78 bin/timers.o + .debug_ranges 0x0000000000000360 0x38 bin/heap_4.o + .debug_ranges 0x0000000000000398 0x70 bin/port.o + .debug_ranges 0x0000000000000408 0x138 bin/stm32f4xx_adc.o + .debug_ranges 0x0000000000000540 0x30 bin/stm32f4xx_dbgmcu.o + .debug_ranges 0x0000000000000570 0xa0 bin/stm32f4xx_dma.o + .debug_ranges 0x0000000000000610 0x48 bin/stm32f4xx_exti.o + .debug_ranges 0x0000000000000658 0x78 bin/stm32f4xx_gpio.o + .debug_ranges 0x00000000000006d0 0x120 bin/stm32f4xx_i2c.o + .debug_ranges 0x00000000000007f0 0x38 bin/stm32f4xx_iwdg.o + .debug_ranges 0x0000000000000828 0x1a8 bin/stm32f4xx_rcc.o + .debug_ranges 0x00000000000009d0 0x2f0 bin/stm32f4xx_tim.o + .debug_ranges 0x0000000000000cc0 0xf0 bin/stm32f4xx_usart.o + .debug_ranges 0x0000000000000db0 0x30 bin/stm32f4xx_misc.o + .debug_ranges 0x0000000000000de0 0x40 bin/stm32f4xx_syscfg.o + .debug_ranges 0x0000000000000e20 0x10 bin/main.o + .debug_ranges 0x0000000000000e30 0x20 bin/exti.o + .debug_ranges 0x0000000000000e50 0x58 bin/nvic.o + .debug_ranges 0x0000000000000ea8 0x48 bin/motors.o + .debug_ranges 0x0000000000000ef0 0x88 bin/crtp.o + .debug_ranges 0x0000000000000f78 0x78 bin/ledseq.o + .debug_ranges 0x0000000000000ff0 0x20 bin/freeRTOSdebug.o + .debug_ranges 0x0000000000001010 0x30 bin/buzzer.o + .debug_ranges 0x0000000000001040 0x50 bin/system.o + .debug_ranges 0x0000000000001090 0x18 bin/comm.o + .debug_ranges 0x00000000000010a8 0x38 bin/console.o + .debug_ranges 0x00000000000010e0 0x70 bin/pid.o + .debug_ranges 0x0000000000001150 0x38 bin/crtpservice.o + .debug_ranges 0x0000000000001188 0x88 bin/param.o + .debug_ranges 0x0000000000001210 0x20 bin/mem.o + .debug_ranges 0x0000000000001230 0x70 bin/commander.o + .debug_ranges 0x00000000000012a0 0x50 bin/controller.o + .debug_ranges 0x00000000000012f0 0x48 bin/sensfusion6.o + .debug_ranges 0x0000000000001338 0x60 bin/stabilizer.o + .debug_ranges 0x0000000000001398 0x178 bin/log.o + .debug_ranges 0x0000000000001510 0x28 bin/worker.o + .debug_ranges 0x0000000000001538 0x10 bin/filter.o + .debug_ranges 0x0000000000001548 0x38 bin/cfassert.o + .debug_ranges 0x0000000000001580 0x30 bin/eprintf.o + .debug_ranges 0x00000000000015b0 0x10 bin/crc.o + .debug_ranges 0x00000000000015c0 0x18 bin/fp16.o + .debug_ranges 0x00000000000015d8 0x18 bin/system_stm32f4xx.o + .debug_ranges 0x00000000000015f0 0x10 bin/cpal_hal.o + .debug_ranges 0x0000000000001600 0x118 bin/cpal_i2c.o + .debug_ranges 0x0000000000001718 0xb8 bin/cpal_i2c_hal_stm32f4xx.o + .debug_ranges 0x00000000000017d0 0x138 bin/usb_core.o + .debug_ranges 0x0000000000001908 0x30 bin/usb_dcd_int.o + .debug_ranges 0x0000000000001938 0x70 bin/usb_dcd.o + .debug_ranges 0x00000000000019a8 0x40 bin/usbd_ioreq.o + .debug_ranges 0x00000000000019e8 0x38 bin/usbd_req.o + .debug_ranges 0x0000000000001a20 0x70 bin/usbd_core.o + .debug_ranges 0x0000000000001a90 0x10 bin/platform_cf2.o + .debug_ranges 0x0000000000001aa0 0x50 bin/led_f405.o + .debug_ranges 0x0000000000001af0 0x738 bin/mpu6500.o + .debug_ranges 0x0000000000002228 0x130 bin/i2cdev_f405.o + .debug_ranges 0x0000000000002358 0x28 bin/ws2812_cf2.o + .debug_ranges 0x0000000000002380 0x40 bin/lps25h.o + .debug_ranges 0x00000000000023c0 0xd8 bin/ak8963.o + .debug_ranges 0x0000000000002498 0x38 bin/eeprom.o + .debug_ranges 0x00000000000024d0 0x28 bin/piezo.o + .debug_ranges 0x00000000000024f8 0xa0 bin/uart_syslink.o + .debug_ranges 0x0000000000002598 0x18 bin/watchdog.o + .debug_ranges 0x00000000000025b0 0x20 bin/sonar.o + .debug_ranges 0x00000000000025d0 0x28 bin/usb_bsp.o + .debug_ranges 0x00000000000025f8 0x40 bin/usblink.o + .debug_ranges 0x0000000000002638 0x58 bin/usbd_desc.o + .debug_ranges 0x0000000000002690 0x98 bin/usb.o + .debug_ranges 0x0000000000002728 0xd8 bin/imu_cf2.o + .debug_ranges 0x0000000000002800 0x78 bin/pm_f405.o + .debug_ranges 0x0000000000002878 0x28 bin/syslink.o + .debug_ranges 0x00000000000028a0 0x58 bin/radiolink.o + .debug_ranges 0x00000000000028f8 0x48 bin/ow_syslink.o + .debug_ranges 0x0000000000002940 0x20 bin/platformservice.o + .debug_ranges 0x0000000000002960 0x58 bin/sound_cf2.o + .debug_ranges 0x00000000000029b8 0x18 bin/deck.o + .debug_ranges 0x00000000000029d0 0x98 bin/deck_info.o + .debug_ranges 0x0000000000002a68 0x30 bin/deck_drivers.o + .debug_ranges 0x0000000000002a98 0x20 bin/deck_analog.o + .debug_ranges 0x0000000000002ab8 0x20 bin/buzzdeck.o + .debug_ranges 0x0000000000002ad8 0x18 bin/bigquad.o + .debug_ranges 0x0000000000002af0 0x18 bin/exptest.o + .debug_ranges 0x0000000000002b08 0x128 bin/ledring12.o + .debug_ranges 0x0000000000002c30 0x48 bin/configblockeeprom.o -.debug_macro 0x0000000000000000 0x20397 - .debug_macro 0x0000000000000000 0x19b bin/list.o - .debug_macro 0x000000000000019b 0x89e bin/list.o - .debug_macro 0x0000000000000a39 0x58 bin/list.o - .debug_macro 0x0000000000000a91 0x22 bin/list.o - .debug_macro 0x0000000000000ab3 0x35 bin/list.o - .debug_macro 0x0000000000000ae8 0x9c bin/list.o - .debug_macro 0x0000000000000b84 0x16 bin/list.o - .debug_macro 0x0000000000000b9a 0x10e bin/list.o - .debug_macro 0x0000000000000ca8 0x7f bin/list.o - .debug_macro 0x0000000000000d27 0x4a bin/list.o - .debug_macro 0x0000000000000d71 0x52 bin/list.o - .debug_macro 0x0000000000000dc3 0x16 bin/list.o - .debug_macro 0x0000000000000dd9 0x43 bin/list.o - .debug_macro 0x0000000000000e1c 0x180 bin/list.o - .debug_macro 0x0000000000000f9c 0x29d bin/list.o - .debug_macro 0x0000000000001239 0x16 bin/list.o - .debug_macro 0x000000000000124f 0x29 bin/list.o - .debug_macro 0x0000000000001278 0x46 bin/list.o - .debug_macro 0x00000000000012be 0x22 bin/list.o - .debug_macro 0x00000000000012e0 0xca bin/list.o - .debug_macro 0x00000000000013aa 0x16 bin/list.o - .debug_macro 0x00000000000013c0 0x168 bin/list.o - .debug_macro 0x0000000000001528 0x58 bin/list.o - .debug_macro 0x0000000000001580 0x10 bin/list.o - .debug_macro 0x0000000000001590 0x115 bin/list.o - .debug_macro 0x00000000000016a5 0xa5 bin/list.o - .debug_macro 0x000000000000174a 0x12 bin/list.o - .debug_macro 0x000000000000175c 0x1f bin/list.o - .debug_macro 0x000000000000177b 0x1fc bin/list.o - .debug_macro 0x0000000000001977 0x5e bin/list.o - .debug_macro 0x00000000000019d5 0x2af bin/tasks.o - .debug_macro 0x0000000000001c84 0x16 bin/tasks.o - .debug_macro 0x0000000000001c9a 0x97 bin/tasks.o - .debug_macro 0x0000000000001d31 0xef bin/tasks.o - .debug_macro 0x0000000000001e20 0x10 bin/tasks.o - .debug_macro 0x0000000000001e30 0x10 bin/tasks.o - .debug_macro 0x0000000000001e40 0x22 bin/tasks.o - .debug_macro 0x0000000000001e62 0x22 bin/tasks.o - .debug_macro 0x0000000000001e84 0xbe bin/tasks.o - .debug_macro 0x0000000000001f42 0x16 bin/tasks.o - .debug_macro 0x0000000000001f58 0x197 bin/tasks.o - .debug_macro 0x00000000000020ef 0x35 bin/tasks.o - .debug_macro 0x0000000000002124 0x16 bin/tasks.o - .debug_macro 0x000000000000213a 0x52 bin/tasks.o - .debug_macro 0x000000000000218c 0x2e bin/tasks.o - .debug_macro 0x00000000000021ba 0x57 bin/tasks.o - .debug_macro 0x0000000000002211 0x5b bin/tasks.o - .debug_macro 0x000000000000226c 0x16 bin/tasks.o - .debug_macro 0x0000000000002282 0x219 bin/queue.o - .debug_macro 0x000000000000249b 0x9c bin/queue.o - .debug_macro 0x0000000000002537 0x10c bin/timers.o - .debug_macro 0x0000000000002643 0x166 bin/timers.o - .debug_macro 0x00000000000027a9 0x1c2 bin/heap_4.o - .debug_macro 0x000000000000296b 0x150 bin/port.o - .debug_macro 0x0000000000002abb 0x235 bin/stm32f4xx_adc.o - .debug_macro 0x0000000000002cf0 0x5e bin/stm32f4xx_adc.o - .debug_macro 0x0000000000002d4e 0x3b bin/stm32f4xx_adc.o - .debug_macro 0x0000000000002d89 0x44 bin/stm32f4xx_adc.o - .debug_macro 0x0000000000002dcd 0x58 bin/stm32f4xx_adc.o - .debug_macro 0x0000000000002e25 0x1df bin/stm32f4xx_adc.o - .debug_macro 0x0000000000003004 0x18 bin/stm32f4xx_adc.o - .debug_macro 0x000000000000301c 0x42 bin/stm32f4xx_adc.o - .debug_macro 0x000000000000305e 0xc91 bin/stm32f4xx_adc.o - .debug_macro 0x0000000000003cef 0x8bb0 bin/stm32f4xx_adc.o - .debug_macro 0x000000000000c89f 0xb2 bin/stm32f4xx_adc.o - .debug_macro 0x000000000000c951 0x477 bin/stm32f4xx_adc.o - .debug_macro 0x000000000000cdc8 0xae bin/stm32f4xx_adc.o - .debug_macro 0x000000000000ce76 0x41c bin/stm32f4xx_adc.o - .debug_macro 0x000000000000d292 0x2bc bin/stm32f4xx_adc.o - .debug_macro 0x000000000000d54e 0x2bb bin/stm32f4xx_adc.o - .debug_macro 0x000000000000d809 0x64 bin/stm32f4xx_adc.o - .debug_macro 0x000000000000d86d 0xe7 bin/stm32f4xx_adc.o - .debug_macro 0x000000000000d954 0x62f bin/stm32f4xx_adc.o - .debug_macro 0x000000000000df83 0x57b bin/stm32f4xx_adc.o - .debug_macro 0x000000000000e4fe 0x342 bin/stm32f4xx_adc.o - .debug_macro 0x000000000000e840 0x36c bin/stm32f4xx_adc.o - .debug_macro 0x000000000000ebac 0xf7 bin/stm32f4xx_adc.o - .debug_macro 0x000000000000eca3 0x73b bin/stm32f4xx_adc.o - .debug_macro 0x000000000000f3de 0x223 bin/stm32f4xx_adc.o - .debug_macro 0x000000000000f601 0x34 bin/stm32f4xx_adc.o - .debug_macro 0x000000000000f635 0x82 bin/stm32f4xx_adc.o - .debug_macro 0x000000000000f6b7 0x144 bin/stm32f4xx_adc.o - .debug_macro 0x000000000000f7fb 0xc3 bin/stm32f4xx_adc.o - .debug_macro 0x000000000000f8be 0x40 bin/stm32f4xx_adc.o - .debug_macro 0x000000000000f8fe 0x3cf bin/stm32f4xx_adc.o - .debug_macro 0x000000000000fccd 0x188 bin/stm32f4xx_adc.o - .debug_macro 0x000000000000fe55 0x149 bin/stm32f4xx_adc.o - .debug_macro 0x000000000000ff9e 0x279 bin/stm32f4xx_adc.o - .debug_macro 0x0000000000010217 0x35 bin/stm32f4xx_adc.o - .debug_macro 0x000000000001024c 0x44f bin/stm32f4xx_adc.o - .debug_macro 0x000000000001069b 0x1b7 bin/stm32f4xx_dbgmcu.o - .debug_macro 0x0000000000010852 0xac bin/stm32f4xx_dbgmcu.o - .debug_macro 0x00000000000108fe 0x205 bin/stm32f4xx_dma.o - .debug_macro 0x0000000000010b03 0x471 bin/stm32f4xx_dma.o - .debug_macro 0x0000000000010f74 0x1b7 bin/stm32f4xx_exti.o - .debug_macro 0x000000000001112b 0xa8 bin/stm32f4xx_exti.o - .debug_macro 0x00000000000111d3 0x1b1 bin/stm32f4xx_gpio.o - .debug_macro 0x0000000000011384 0x2b6 bin/stm32f4xx_gpio.o - .debug_macro 0x000000000001163a 0x1c3 bin/stm32f4xx_i2c.o - .debug_macro 0x00000000000117fd 0x2b5 bin/stm32f4xx_i2c.o - .debug_macro 0x0000000000011ab2 0x27b bin/stm32f4xx_rcc.o - .debug_macro 0x0000000000011d2d 0x629 bin/stm32f4xx_rcc.o - .debug_macro 0x0000000000012356 0x1db bin/stm32f4xx_tim.o - .debug_macro 0x0000000000012531 0x735 bin/stm32f4xx_tim.o - .debug_macro 0x0000000000012c66 0x1c9 bin/stm32f4xx_usart.o - .debug_macro 0x0000000000012e2f 0x21d bin/stm32f4xx_usart.o - .debug_macro 0x000000000001304c 0x1b7 bin/stm32f4xx_misc.o - .debug_macro 0x0000000000013203 0x7c bin/stm32f4xx_misc.o - .debug_macro 0x000000000001327f 0x1ed bin/stm32f4xx_syscfg.o - .debug_macro 0x000000000001346c 0xf1 bin/stm32f4xx_syscfg.o - .debug_macro 0x000000000001355d 0x2a8 bin/main.o - .debug_macro 0x0000000000013805 0xa0 bin/main.o - .debug_macro 0x00000000000138a5 0x1fa bin/exti.o - .debug_macro 0x0000000000013a9f 0x28 bin/exti.o - .debug_macro 0x0000000000013ac7 0x16e bin/exti.o - .debug_macro 0x0000000000013c35 0x224 bin/nvic.o - .debug_macro 0x0000000000013e59 0x168 bin/nvic.o - .debug_macro 0x0000000000013fc1 0x74 bin/nvic.o - .debug_macro 0x0000000000014035 0x34 bin/nvic.o - .debug_macro 0x0000000000014069 0x1c bin/nvic.o - .debug_macro 0x0000000000014085 0x8f bin/nvic.o - .debug_macro 0x0000000000014114 0x2d4 bin/motors.o - .debug_macro 0x00000000000143e8 0x207 bin/motors.o - .debug_macro 0x00000000000145ef 0x78 bin/motors.o - .debug_macro 0x0000000000014667 0x40 bin/motors.o - .debug_macro 0x00000000000146a7 0x94 bin/motors.o - .debug_macro 0x000000000001473b 0x4c bin/motors.o - .debug_macro 0x0000000000014787 0x1fb bin/crtp.o - .debug_macro 0x0000000000014982 0x10 bin/crtp.o - .debug_macro 0x0000000000014992 0x23b bin/crtp.o - .debug_macro 0x0000000000014bcd 0x16 bin/crtp.o - .debug_macro 0x0000000000014be3 0x161 bin/ledseq.o - .debug_macro 0x0000000000014d44 0x22 bin/ledseq.o - .debug_macro 0x0000000000014d66 0x5d bin/ledseq.o - .debug_macro 0x0000000000014dc3 0x140 bin/freeRTOSdebug.o - .debug_macro 0x0000000000014f03 0x29f bin/system.o - .debug_macro 0x00000000000151a2 0x2e bin/system.o - .debug_macro 0x00000000000151d0 0xa0 bin/system.o - .debug_macro 0x0000000000015270 0x64 bin/system.o - .debug_macro 0x00000000000152d4 0x46 bin/system.o - .debug_macro 0x000000000001531a 0x6a bin/system.o - .debug_macro 0x0000000000015384 0x6a bin/system.o - .debug_macro 0x00000000000153ee 0x1c bin/system.o - .debug_macro 0x000000000001540a 0x48 bin/system.o - .debug_macro 0x0000000000015452 0x4c bin/system.o - .debug_macro 0x000000000001549e 0x3a bin/system.o - .debug_macro 0x00000000000154d8 0x16 bin/system.o - .debug_macro 0x00000000000154ee 0x110 bin/comm.o - .debug_macro 0x00000000000155fe 0xa6 bin/comm.o - .debug_macro 0x00000000000156a4 0x1c bin/comm.o - .debug_macro 0x00000000000156c0 0x148 bin/console.o - .debug_macro 0x0000000000015808 0x322 bin/pid.o - .debug_macro 0x0000000000015b2a 0x1e1 bin/pid.o - .debug_macro 0x0000000000015d0b 0xa0 bin/pid.o - .debug_macro 0x0000000000015dab 0x1d7 bin/crtpservice.o - .debug_macro 0x0000000000015f82 0x10 bin/crtpservice.o - .debug_macro 0x0000000000015f92 0x231 bin/param.o - .debug_macro 0x00000000000161c3 0x241 bin/param.o - .debug_macro 0x0000000000016404 0x46 bin/param.o - .debug_macro 0x000000000001644a 0x3fe bin/mem.o - .debug_macro 0x0000000000016848 0x16 bin/mem.o - .debug_macro 0x000000000001685e 0x10 bin/mem.o - .debug_macro 0x000000000001686e 0x15c bin/commander.o - .debug_macro 0x00000000000169ca 0x16 bin/commander.o - .debug_macro 0x00000000000169e0 0x172 bin/controller.o - .debug_macro 0x0000000000016b52 0x10 bin/controller.o - .debug_macro 0x0000000000016b62 0x22 bin/controller.o - .debug_macro 0x0000000000016b84 0x130 bin/sensfusion6.o - .debug_macro 0x0000000000016cb4 0x44c bin/stabilizer.o - .debug_macro 0x0000000000017100 0x3a bin/stabilizer.o - .debug_macro 0x000000000001713a 0x298 bin/log.o - .debug_macro 0x00000000000173d2 0x190 bin/worker.o - .debug_macro 0x0000000000017562 0x64 bin/filter.o - .debug_macro 0x00000000000175c6 0x4f bin/cfassert.o - .debug_macro 0x0000000000017615 0x6d bin/eprintf.o - .debug_macro 0x0000000000017682 0xa6 bin/eprintf.o - .debug_macro 0x0000000000017728 0x87 bin/crc.o - .debug_macro 0x00000000000177af 0x40 bin/crc.o - .debug_macro 0x00000000000177ef 0x5e bin/fp16.o - .debug_macro 0x000000000001784d 0x8d bin/version.o - .debug_macro 0x00000000000178da 0x1cb bin/system_stm32f4xx.o - .debug_macro 0x0000000000017aa5 0x1bf bin/cpal_hal.o - .debug_macro 0x0000000000017c64 0x1ea bin/cpal_i2c.o - .debug_macro 0x0000000000017e4e 0x57b bin/cpal_i2c.o - .debug_macro 0x00000000000183c9 0x1d8 bin/cpal_usercallback_template.o - .debug_macro 0x00000000000185a1 0x1f4 bin/cpal_i2c_hal_stm32f4xx.o - .debug_macro 0x0000000000018795 0x207 bin/usb_core.o - .debug_macro 0x000000000001899c 0x70 bin/usb_core.o - .debug_macro 0x0000000000018a0c 0x20f bin/usb_core.o - .debug_macro 0x0000000000018c1b 0x64 bin/usb_core.o - .debug_macro 0x0000000000018c7f 0x217 bin/usb_dcd_int.o - .debug_macro 0x0000000000018e96 0x3a bin/usb_dcd_int.o - .debug_macro 0x0000000000018ed0 0x10 bin/usb_dcd_int.o - .debug_macro 0x0000000000018ee0 0x212 bin/usb_dcd.o - .debug_macro 0x00000000000190f2 0x242 bin/usbd_ioreq.o - .debug_macro 0x0000000000019334 0x118 bin/usbd_ioreq.o - .debug_macro 0x000000000001944c 0x259 bin/usbd_req.o - .debug_macro 0x00000000000196a5 0x11e bin/usbd_req.o - .debug_macro 0x00000000000197c3 0x2e bin/usbd_req.o - .debug_macro 0x00000000000197f1 0x269 bin/usbd_core.o - .debug_macro 0x0000000000019a5a 0x28c bin/platform_cf2.o - .debug_macro 0x0000000000019ce6 0x287 bin/led_f405.o - .debug_macro 0x0000000000019f6d 0x356 bin/mpu6500.o - .debug_macro 0x000000000001a2c3 0x8e4 bin/mpu6500.o - .debug_macro 0x000000000001aba7 0x311 bin/i2cdev_f405.o - .debug_macro 0x000000000001aeb8 0x28 bin/i2cdev_f405.o - .debug_macro 0x000000000001aee0 0x581 bin/i2cdev_f405.o - .debug_macro 0x000000000001b461 0x33f bin/ws2812.o - .debug_macro 0x000000000001b7a0 0x4a6 bin/lps25h.o - .debug_macro 0x000000000001bc46 0x2c0 bin/ak8963.o - .debug_macro 0x000000000001bf06 0x118 bin/ak8963.o - .debug_macro 0x000000000001c01e 0x2c0 bin/eeprom.o - .debug_macro 0x000000000001c2de 0x38e bin/uart_syslink.o - .debug_macro 0x000000000001c66c 0x3cb bin/sonar.o - .debug_macro 0x000000000001ca37 0x259 bin/usb_bsp.o - .debug_macro 0x000000000001cc90 0x26d bin/usblink.o - .debug_macro 0x000000000001cefd 0x16 bin/usblink.o - .debug_macro 0x000000000001cf13 0x4e bin/usblink.o - .debug_macro 0x000000000001cf61 0x2c2 bin/usbd_desc.o - .debug_macro 0x000000000001d223 0x44c bin/usb.o - .debug_macro 0x000000000001d66f 0x44e bin/imu_cf2.o - .debug_macro 0x000000000001dabd 0x190 bin/imu_cf2.o - .debug_macro 0x000000000001dc4d 0x8e bin/imu_cf2.o - .debug_macro 0x000000000001dcdb 0x11e bin/imu_cf2.o - .debug_macro 0x000000000001ddf9 0x38c bin/pm_f405.o - .debug_macro 0x000000000001e185 0x24b bin/syslink.o - .debug_macro 0x000000000001e3d0 0x1c bin/syslink.o - .debug_macro 0x000000000001e3ec 0x229 bin/radiolink.o - .debug_macro 0x000000000001e615 0x1f2 bin/ow_syslink.o - .debug_macro 0x000000000001e807 0x16 bin/ow_syslink.o - .debug_macro 0x000000000001e81d 0x3ee bin/neopixelring.o - .debug_macro 0x000000000001ec0b 0x1ad bin/expbrd.o - .debug_macro 0x000000000001edb8 0x34 bin/expbrd.o - .debug_macro 0x000000000001edec 0x1ee bin/platformservice.o - .debug_macro 0x000000000001efda 0x2cd bin/bigquad.o - .debug_macro 0x000000000001f2a7 0x20d bin/bigquad.o - .debug_macro 0x000000000001f4b4 0x372 bin/exptest.o - .debug_macro 0x000000000001f826 0x1e6 bin/deck_analog.o - .debug_macro 0x000000000001fa0c 0x355 bin/configblockeeprom.o - .debug_macro 0x000000000001fd61 0x10 bin/configblockeeprom.o - .debug_macro 0x000000000001fd71 0xc8 bin/configblockeeprom.o - .debug_macro 0x000000000001fe39 0x19 bin/configblockeeprom.o - .debug_macro 0x000000000001fe52 0xb7 bin/configblockeeprom.o - .debug_macro 0x000000000001ff09 0x48e bin/configblockeeprom.o +.debug_macro 0x0000000000000000 0x21e65 + .debug_macro 0x0000000000000000 0x1d2 bin/list.o + .debug_macro 0x00000000000001d2 0x89e bin/list.o + .debug_macro 0x0000000000000a70 0x58 bin/list.o + .debug_macro 0x0000000000000ac8 0x22 bin/list.o + .debug_macro 0x0000000000000aea 0x35 bin/list.o + .debug_macro 0x0000000000000b1f 0x9c bin/list.o + .debug_macro 0x0000000000000bbb 0x16 bin/list.o + .debug_macro 0x0000000000000bd1 0x10e bin/list.o + .debug_macro 0x0000000000000cdf 0x7f bin/list.o + .debug_macro 0x0000000000000d5e 0x4a bin/list.o + .debug_macro 0x0000000000000da8 0x52 bin/list.o + .debug_macro 0x0000000000000dfa 0x16 bin/list.o + .debug_macro 0x0000000000000e10 0x43 bin/list.o + .debug_macro 0x0000000000000e53 0x180 bin/list.o + .debug_macro 0x0000000000000fd3 0x29d bin/list.o + .debug_macro 0x0000000000001270 0x16 bin/list.o + .debug_macro 0x0000000000001286 0x29 bin/list.o + .debug_macro 0x00000000000012af 0x58 bin/list.o + .debug_macro 0x0000000000001307 0x22 bin/list.o + .debug_macro 0x0000000000001329 0x1df bin/list.o + .debug_macro 0x0000000000001508 0x22 bin/list.o + .debug_macro 0x000000000000152a 0xca bin/list.o + .debug_macro 0x00000000000015f4 0x16 bin/list.o + .debug_macro 0x000000000000160a 0x52 bin/list.o + .debug_macro 0x000000000000165c 0x18a bin/list.o + .debug_macro 0x00000000000017e6 0x58 bin/list.o + .debug_macro 0x000000000000183e 0x16 bin/list.o + .debug_macro 0x0000000000001854 0x110 bin/list.o + .debug_macro 0x0000000000001964 0x15d bin/list.o + .debug_macro 0x0000000000001ac1 0xe4 bin/list.o + .debug_macro 0x0000000000001ba5 0x10 bin/list.o + .debug_macro 0x0000000000001bb5 0x1f bin/list.o + .debug_macro 0x0000000000001bd4 0x3a7 bin/list.o + .debug_macro 0x0000000000001f7b 0xc0 bin/list.o + .debug_macro 0x000000000000203b 0x280 bin/tasks.o + .debug_macro 0x00000000000022bb 0x16 bin/tasks.o + .debug_macro 0x00000000000022d1 0x35 bin/tasks.o + .debug_macro 0x0000000000002306 0x9a bin/tasks.o + .debug_macro 0x00000000000023a0 0x91 bin/tasks.o + .debug_macro 0x0000000000002431 0x10 bin/tasks.o + .debug_macro 0x0000000000002441 0x244 bin/queue.o + .debug_macro 0x0000000000002685 0xb0 bin/queue.o + .debug_macro 0x0000000000002735 0x20f bin/timers.o + .debug_macro 0x0000000000002944 0x1f9 bin/heap_4.o + .debug_macro 0x0000000000002b3d 0x1f3 bin/port.o + .debug_macro 0x0000000000002d30 0x166 bin/port.o + .debug_macro 0x0000000000002e96 0x44 bin/port.o + .debug_macro 0x0000000000002eda 0x235 bin/stm32f4xx_adc.o + .debug_macro 0x000000000000310f 0x5e bin/stm32f4xx_adc.o + .debug_macro 0x000000000000316d 0x3b bin/stm32f4xx_adc.o + .debug_macro 0x00000000000031a8 0x18 bin/stm32f4xx_adc.o + .debug_macro 0x00000000000031c0 0x42 bin/stm32f4xx_adc.o + .debug_macro 0x0000000000003202 0xc91 bin/stm32f4xx_adc.o + .debug_macro 0x0000000000003e93 0x8bb0 bin/stm32f4xx_adc.o + .debug_macro 0x000000000000ca43 0xb2 bin/stm32f4xx_adc.o + .debug_macro 0x000000000000caf5 0x477 bin/stm32f4xx_adc.o + .debug_macro 0x000000000000cf6c 0xae bin/stm32f4xx_adc.o + .debug_macro 0x000000000000d01a 0x41c bin/stm32f4xx_adc.o + .debug_macro 0x000000000000d436 0x2bc bin/stm32f4xx_adc.o + .debug_macro 0x000000000000d6f2 0x2bb bin/stm32f4xx_adc.o + .debug_macro 0x000000000000d9ad 0x64 bin/stm32f4xx_adc.o + .debug_macro 0x000000000000da11 0xe7 bin/stm32f4xx_adc.o + .debug_macro 0x000000000000daf8 0x62f bin/stm32f4xx_adc.o + .debug_macro 0x000000000000e127 0x57b bin/stm32f4xx_adc.o + .debug_macro 0x000000000000e6a2 0x342 bin/stm32f4xx_adc.o + .debug_macro 0x000000000000e9e4 0x36c bin/stm32f4xx_adc.o + .debug_macro 0x000000000000ed50 0xf7 bin/stm32f4xx_adc.o + .debug_macro 0x000000000000ee47 0x73b bin/stm32f4xx_adc.o + .debug_macro 0x000000000000f582 0x223 bin/stm32f4xx_adc.o + .debug_macro 0x000000000000f7a5 0x34 bin/stm32f4xx_adc.o + .debug_macro 0x000000000000f7d9 0x82 bin/stm32f4xx_adc.o + .debug_macro 0x000000000000f85b 0x144 bin/stm32f4xx_adc.o + .debug_macro 0x000000000000f99f 0xc3 bin/stm32f4xx_adc.o + .debug_macro 0x000000000000fa62 0x40 bin/stm32f4xx_adc.o + .debug_macro 0x000000000000faa2 0x3cf bin/stm32f4xx_adc.o + .debug_macro 0x000000000000fe71 0x188 bin/stm32f4xx_adc.o + .debug_macro 0x000000000000fff9 0x149 bin/stm32f4xx_adc.o + .debug_macro 0x0000000000010142 0x279 bin/stm32f4xx_adc.o + .debug_macro 0x00000000000103bb 0x35 bin/stm32f4xx_adc.o + .debug_macro 0x00000000000103f0 0x44f bin/stm32f4xx_adc.o + .debug_macro 0x000000000001083f 0x1b7 bin/stm32f4xx_dbgmcu.o + .debug_macro 0x00000000000109f6 0xac bin/stm32f4xx_dbgmcu.o + .debug_macro 0x0000000000010aa2 0x205 bin/stm32f4xx_dma.o + .debug_macro 0x0000000000010ca7 0x471 bin/stm32f4xx_dma.o + .debug_macro 0x0000000000011118 0x1b7 bin/stm32f4xx_exti.o + .debug_macro 0x00000000000112cf 0xa8 bin/stm32f4xx_exti.o + .debug_macro 0x0000000000011377 0x1b1 bin/stm32f4xx_gpio.o + .debug_macro 0x0000000000011528 0x2b6 bin/stm32f4xx_gpio.o + .debug_macro 0x00000000000117de 0x1c3 bin/stm32f4xx_i2c.o + .debug_macro 0x00000000000119a1 0x2b5 bin/stm32f4xx_i2c.o + .debug_macro 0x0000000000011c56 0x1bd bin/stm32f4xx_iwdg.o + .debug_macro 0x0000000000011e13 0x5e bin/stm32f4xx_iwdg.o + .debug_macro 0x0000000000011e71 0x27b bin/stm32f4xx_rcc.o + .debug_macro 0x00000000000120ec 0x629 bin/stm32f4xx_rcc.o + .debug_macro 0x0000000000012715 0x1db bin/stm32f4xx_tim.o + .debug_macro 0x00000000000128f0 0x735 bin/stm32f4xx_tim.o + .debug_macro 0x0000000000013025 0x1c9 bin/stm32f4xx_usart.o + .debug_macro 0x00000000000131ee 0x21d bin/stm32f4xx_usart.o + .debug_macro 0x000000000001340b 0x1b7 bin/stm32f4xx_misc.o + .debug_macro 0x00000000000135c2 0x7c bin/stm32f4xx_misc.o + .debug_macro 0x000000000001363e 0x1ed bin/stm32f4xx_syscfg.o + .debug_macro 0x000000000001382b 0xf1 bin/stm32f4xx_syscfg.o + .debug_macro 0x000000000001391c 0x2b4 bin/main.o + .debug_macro 0x0000000000013bd0 0xa0 bin/main.o + .debug_macro 0x0000000000013c70 0x209 bin/exti.o + .debug_macro 0x0000000000013e79 0x3a bin/exti.o + .debug_macro 0x0000000000013eb3 0x233 bin/nvic.o + .debug_macro 0x00000000000140e6 0x137 bin/nvic.o + .debug_macro 0x000000000001421d 0x35 bin/nvic.o + .debug_macro 0x0000000000014252 0x74 bin/nvic.o + .debug_macro 0x00000000000142c6 0x34 bin/nvic.o + .debug_macro 0x00000000000142fa 0x1c bin/nvic.o + .debug_macro 0x0000000000014316 0x8f bin/nvic.o + .debug_macro 0x00000000000143a5 0x2e0 bin/motors.o + .debug_macro 0x0000000000014685 0x207 bin/motors.o + .debug_macro 0x000000000001488c 0x7f bin/motors.o + .debug_macro 0x000000000001490b 0x40 bin/motors.o + .debug_macro 0x000000000001494b 0x94 bin/motors.o + .debug_macro 0x00000000000149df 0x4c bin/motors.o + .debug_macro 0x0000000000014a2b 0x20a bin/crtp.o + .debug_macro 0x0000000000014c35 0x10 bin/crtp.o + .debug_macro 0x0000000000014c45 0x23b bin/crtp.o + .debug_macro 0x0000000000014e80 0x10 bin/crtp.o + .debug_macro 0x0000000000014e90 0x173 bin/ledseq.o + .debug_macro 0x0000000000015003 0x22 bin/ledseq.o + .debug_macro 0x0000000000015025 0x14c bin/freeRTOSdebug.o + .debug_macro 0x0000000000015171 0x2e bin/freeRTOSdebug.o + .debug_macro 0x000000000001519f 0x6d bin/buzzer.o + .debug_macro 0x000000000001520c 0x448 bin/system.o + .debug_macro 0x0000000000015654 0x2e bin/system.o + .debug_macro 0x0000000000015682 0xa6 bin/system.o + .debug_macro 0x0000000000015728 0x64 bin/system.o + .debug_macro 0x000000000001578c 0x46 bin/system.o + .debug_macro 0x00000000000157d2 0x6a bin/system.o + .debug_macro 0x000000000001583c 0x6a bin/system.o + .debug_macro 0x00000000000158a6 0x1c bin/system.o + .debug_macro 0x00000000000158c2 0x48 bin/system.o + .debug_macro 0x000000000001590a 0x4c bin/system.o + .debug_macro 0x0000000000015956 0x16 bin/system.o + .debug_macro 0x000000000001596c 0x22 bin/system.o + .debug_macro 0x000000000001598e 0x34 bin/system.o + .debug_macro 0x00000000000159c2 0x103 bin/system.o + .debug_macro 0x0000000000015ac5 0x76 bin/system.o + .debug_macro 0x0000000000015b3b 0x10 bin/system.o + .debug_macro 0x0000000000015b4b 0x119 bin/comm.o + .debug_macro 0x0000000000015c64 0x16 bin/comm.o + .debug_macro 0x0000000000015c7a 0x1c bin/comm.o + .debug_macro 0x0000000000015c96 0x136 bin/console.o + .debug_macro 0x0000000000015dcc 0x29 bin/pid.o + .debug_macro 0x0000000000015df5 0x9a bin/pid.o + .debug_macro 0x0000000000015e8f 0x1c5 bin/crtpservice.o + .debug_macro 0x0000000000016054 0x10 bin/crtpservice.o + .debug_macro 0x0000000000016064 0x237 bin/param.o + .debug_macro 0x000000000001629b 0x241 bin/param.o + .debug_macro 0x00000000000164dc 0x46 bin/param.o + .debug_macro 0x0000000000016522 0x443 bin/mem.o + .debug_macro 0x0000000000016965 0x16 bin/mem.o + .debug_macro 0x000000000001697b 0x10 bin/mem.o + .debug_macro 0x000000000001698b 0x10 bin/mem.o + .debug_macro 0x000000000001699b 0x168 bin/commander.o + .debug_macro 0x0000000000016b03 0x16 bin/commander.o + .debug_macro 0x0000000000016b19 0x166 bin/controller.o + .debug_macro 0x0000000000016c7f 0xa0 bin/controller.o + .debug_macro 0x0000000000016d1f 0x10 bin/controller.o + .debug_macro 0x0000000000016d2f 0x22 bin/controller.o + .debug_macro 0x0000000000016d51 0x10d bin/sensfusion6.o + .debug_macro 0x0000000000016e5e 0x1e1 bin/sensfusion6.o + .debug_macro 0x000000000001703f 0xa0 bin/sensfusion6.o + .debug_macro 0x00000000000170df 0x458 bin/stabilizer.o + .debug_macro 0x0000000000017537 0x3a bin/stabilizer.o + .debug_macro 0x0000000000017571 0x28 bin/stabilizer.o + .debug_macro 0x0000000000017599 0x2a4 bin/log.o + .debug_macro 0x000000000001783d 0x1d0 bin/worker.o + .debug_macro 0x0000000000017a0d 0x64 bin/filter.o + .debug_macro 0x0000000000017a71 0xd7 bin/cfassert.o + .debug_macro 0x0000000000017b48 0x6d bin/eprintf.o + .debug_macro 0x0000000000017bb5 0xa6 bin/eprintf.o + .debug_macro 0x0000000000017c5b 0x87 bin/crc.o + .debug_macro 0x0000000000017ce2 0x40 bin/crc.o + .debug_macro 0x0000000000017d22 0x5e bin/fp16.o + .debug_macro 0x0000000000017d80 0x96 bin/version.o + .debug_macro 0x0000000000017e16 0x11b bin/FreeRTOS-openocd.o + .debug_macro 0x0000000000017f31 0x1cb bin/system_stm32f4xx.o + .debug_macro 0x00000000000180fc 0x1ce bin/cpal_hal.o + .debug_macro 0x00000000000182ca 0x1f9 bin/cpal_i2c.o + .debug_macro 0x00000000000184c3 0x57b bin/cpal_i2c.o + .debug_macro 0x0000000000018a3e 0x203 bin/cpal_i2c_hal_stm32f4xx.o + .debug_macro 0x0000000000018c41 0x207 bin/usb_core.o + .debug_macro 0x0000000000018e48 0x70 bin/usb_core.o + .debug_macro 0x0000000000018eb8 0x20f bin/usb_core.o + .debug_macro 0x00000000000190c7 0x64 bin/usb_core.o + .debug_macro 0x000000000001912b 0x217 bin/usb_dcd_int.o + .debug_macro 0x0000000000019342 0x3a bin/usb_dcd_int.o + .debug_macro 0x000000000001937c 0x10 bin/usb_dcd_int.o + .debug_macro 0x000000000001938c 0x212 bin/usb_dcd.o + .debug_macro 0x000000000001959e 0x242 bin/usbd_ioreq.o + .debug_macro 0x00000000000197e0 0x118 bin/usbd_ioreq.o + .debug_macro 0x00000000000198f8 0x259 bin/usbd_req.o + .debug_macro 0x0000000000019b51 0x11e bin/usbd_req.o + .debug_macro 0x0000000000019c6f 0x2e bin/usbd_req.o + .debug_macro 0x0000000000019c9d 0x269 bin/usbd_core.o + .debug_macro 0x0000000000019f06 0x1b bin/platform_cf2.o + .debug_macro 0x0000000000019f21 0x293 bin/led_f405.o + .debug_macro 0x000000000001a1b4 0x371 bin/mpu6500.o + .debug_macro 0x000000000001a525 0x8e4 bin/mpu6500.o + .debug_macro 0x000000000001ae09 0x31b bin/i2cdev_f405.o + .debug_macro 0x000000000001b124 0x581 bin/i2cdev_f405.o + .debug_macro 0x000000000001b6a5 0x342 bin/ws2812_cf2.o + .debug_macro 0x000000000001b9e7 0x4c1 bin/lps25h.o + .debug_macro 0x000000000001bea8 0x2db bin/ak8963.o + .debug_macro 0x000000000001c183 0x118 bin/ak8963.o + .debug_macro 0x000000000001c29b 0x2db bin/eeprom.o + .debug_macro 0x000000000001c576 0x30a bin/piezo.o + .debug_macro 0x000000000001c880 0x38b bin/uart_syslink.o + .debug_macro 0x000000000001cc0b 0x234 bin/watchdog.o + .debug_macro 0x000000000001ce3f 0x3e6 bin/sonar.o + .debug_macro 0x000000000001d225 0x262 bin/usb_bsp.o + .debug_macro 0x000000000001d487 0x282 bin/usblink.o + .debug_macro 0x000000000001d709 0x16 bin/usblink.o + .debug_macro 0x000000000001d71f 0x4e bin/usblink.o + .debug_macro 0x000000000001d76d 0x2cb bin/usbd_desc.o + .debug_macro 0x000000000001da38 0x449 bin/usb.o + .debug_macro 0x000000000001de81 0x472 bin/imu_cf2.o + .debug_macro 0x000000000001e2f3 0x190 bin/imu_cf2.o + .debug_macro 0x000000000001e483 0x8e bin/imu_cf2.o + .debug_macro 0x000000000001e511 0x11e bin/imu_cf2.o + .debug_macro 0x000000000001e62f 0x3a1 bin/pm_f405.o + .debug_macro 0x000000000001e9d0 0x257 bin/syslink.o + .debug_macro 0x000000000001ec27 0x1c bin/syslink.o + .debug_macro 0x000000000001ec43 0x23e bin/radiolink.o + .debug_macro 0x000000000001ee81 0x1fe bin/ow_syslink.o + .debug_macro 0x000000000001f07f 0x16 bin/ow_syslink.o + .debug_macro 0x000000000001f095 0x1e2 bin/platformservice.o + .debug_macro 0x000000000001f277 0x4d7 bin/sound_cf2.o + .debug_macro 0x000000000001f74e 0x310 bin/deck.o + .debug_macro 0x000000000001fa5e 0xfd bin/deck.o + .debug_macro 0x000000000001fb5b 0x34d bin/deck_info.o + .debug_macro 0x000000000001fea8 0x32c bin/deck_drivers.o + .debug_macro 0x00000000000201d4 0x1f4 bin/deck_analog.o + .debug_macro 0x00000000000203c8 0x2f1 bin/buzzdeck.o + .debug_macro 0x00000000000206b9 0x2fb bin/bigquad.o + .debug_macro 0x00000000000209b4 0x20d bin/bigquad.o + .debug_macro 0x0000000000020bc1 0x3c2 bin/exptest.o + .debug_macro 0x0000000000020f83 0x45f bin/ledring12.o + .debug_macro 0x00000000000213e2 0x36d bin/configblockeeprom.o + .debug_macro 0x000000000002174f 0x10 bin/configblockeeprom.o + .debug_macro 0x000000000002175f 0xc8 bin/configblockeeprom.o + .debug_macro 0x0000000000021827 0x19 bin/configblockeeprom.o + .debug_macro 0x0000000000021840 0xb7 bin/configblockeeprom.o + .debug_macro 0x00000000000218f7 0x22 bin/configblockeeprom.o + .debug_macro 0x0000000000021919 0xbe bin/configblockeeprom.o + .debug_macro 0x00000000000219d7 0x48e bin/configblockeeprom.o Cross Reference Table @@ -14581,7 +15928,7 @@ CPAL_I2C_TXTC_UserCallback bin/i2cdev_f405.o bin/cpal_i2c.o CPAL_I2C_Write bin/cpal_i2c.o bin/i2cdev_f405.o -CPAL_TIMEOUT_UserCallback bin/cpal_usercallback_template.o +CPAL_TIMEOUT_UserCallback bin/i2cdev_f405.o bin/cpal_i2c.o CRYP_IRQHandler bin/startup_stm32f40xx.o DBGMCU_APB1PeriphConfig bin/stm32f4xx_dbgmcu.o @@ -14642,12 +15989,12 @@ DMA2_Stream7_IRQHandler bin/uart_syslink.o DMA_ClearFlag bin/stm32f4xx_dma.o DMA_ClearITPendingBit bin/stm32f4xx_dma.o bin/uart_syslink.o - bin/ws2812.o + bin/ws2812_cf2.o DMA_Cmd bin/stm32f4xx_dma.o bin/uart_syslink.o - bin/ws2812.o + bin/ws2812_cf2.o DMA_DeInit bin/stm32f4xx_dma.o - bin/ws2812.o + bin/ws2812_cf2.o bin/cpal_i2c_hal_stm32f4xx.o DMA_DoubleBufferModeCmd bin/stm32f4xx_dma.o DMA_DoubleBufferModeConfig bin/stm32f4xx_dma.o @@ -14660,13 +16007,13 @@ DMA_GetCurrentMemoryTarget bin/stm32f4xx_dma.o DMA_GetFIFOStatus bin/stm32f4xx_dma.o DMA_GetFlagStatus bin/stm32f4xx_dma.o DMA_GetITStatus bin/stm32f4xx_dma.o - bin/ws2812.o + bin/ws2812_cf2.o DMA_ITConfig bin/stm32f4xx_dma.o bin/uart_syslink.o - bin/ws2812.o + bin/ws2812_cf2.o DMA_Init bin/stm32f4xx_dma.o bin/uart_syslink.o - bin/ws2812.o + bin/ws2812_cf2.o bin/cpal_i2c_hal_stm32f4xx.o DMA_MemoryTargetConfig bin/stm32f4xx_dma.o DMA_PeriphIncOffsetSizeConfig bin/stm32f4xx_dma.o @@ -14745,17 +16092,18 @@ FPU_IRQHandler bin/startup_stm32f40xx.o FSMC_IRQHandler bin/startup_stm32f40xx.o GPIO_DeInit bin/stm32f4xx_gpio.o GPIO_Init bin/stm32f4xx_gpio.o + bin/ledring12.o + bin/exptest.o bin/deck_analog.o bin/deck_digital.o - bin/exptest.o - bin/neopixelring.o bin/usb_bsp.o bin/sonar.o bin/uart2.o bin/uart1.o bin/swd.o bin/uart_syslink.o - bin/ws2812.o + bin/piezo.o + bin/ws2812_cf2.o bin/led_f405.o bin/cpal_i2c_hal_stm32f4xx.o bin/motors.o @@ -14765,26 +16113,27 @@ GPIO_PinAFConfig bin/stm32f4xx_gpio.o bin/uart1.o bin/swd.o bin/uart_syslink.o - bin/ws2812.o + bin/piezo.o + bin/ws2812_cf2.o bin/cpal_i2c_hal_stm32f4xx.o bin/motors.o GPIO_PinLockConfig bin/stm32f4xx_gpio.o GPIO_ReadInputData bin/stm32f4xx_gpio.o GPIO_ReadInputDataBit bin/stm32f4xx_gpio.o - bin/deck_digital.o bin/exptest.o + bin/deck_digital.o bin/uart_syslink.o bin/i2cdev_f405.o GPIO_ReadOutputData bin/stm32f4xx_gpio.o GPIO_ReadOutputDataBit bin/stm32f4xx_gpio.o GPIO_ResetBits bin/stm32f4xx_gpio.o + bin/ledring12.o bin/exptest.o - bin/neopixelring.o bin/i2cdev_f405.o bin/led_f405.o GPIO_SetBits bin/stm32f4xx_gpio.o + bin/ledring12.o bin/exptest.o - bin/neopixelring.o bin/i2cdev_f405.o bin/led_f405.o GPIO_StructInit bin/stm32f4xx_gpio.o @@ -14868,18 +16217,24 @@ I2S_FullDuplexConfig bin/stm32f4xx_spi.o I2S_Init bin/stm32f4xx_spi.o I2S_StructInit bin/stm32f4xx_spi.o IWDG_Enable bin/stm32f4xx_iwdg.o + bin/watchdog.o IWDG_GetFlagStatus bin/stm32f4xx_iwdg.o IWDG_ReloadCounter bin/stm32f4xx_iwdg.o + bin/watchdog.o + bin/system.o IWDG_SetPrescaler bin/stm32f4xx_iwdg.o + bin/watchdog.o IWDG_SetReload bin/stm32f4xx_iwdg.o + bin/watchdog.o IWDG_WriteAccessCmd bin/stm32f4xx_iwdg.o + bin/watchdog.o MOTORS bin/motors.o MemManage_Handler bin/nvic.o NMI_Handler bin/nvic.o NVIC_Init bin/stm32f4xx_misc.o bin/usb_bsp.o bin/uart_syslink.o - bin/ws2812.o + bin/ws2812_cf2.o bin/cpal_i2c_hal_stm32f4xx.o bin/exti.o NVIC_PriorityGroupConfig bin/stm32f4xx_misc.o @@ -14898,16 +16253,17 @@ OTG_HS_WKUP_IRQHandler bin/startup_stm32f40xx.o PVD_IRQHandler bin/startup_stm32f40xx.o PendSV_Handler bin/port.o RCC_AHB1PeriphClockCmd bin/stm32f4xx_rcc.o + bin/exptest.o bin/deck_analog.o bin/deck_digital.o - bin/exptest.o bin/usb_bsp.o bin/sonar.o bin/uart2.o bin/uart1.o bin/swd.o bin/uart_syslink.o - bin/ws2812.o + bin/piezo.o + bin/ws2812_cf2.o bin/led_f405.o bin/cpal_i2c_hal_stm32f4xx.o bin/motors.o @@ -14926,7 +16282,8 @@ RCC_APB1PeriphClockCmd bin/stm32f4xx_rcc.o bin/uart2.o bin/uart1.o bin/swd.o - bin/ws2812.o + bin/piezo.o + bin/ws2812_cf2.o bin/cpal_i2c_hal_stm32f4xx.o bin/motors.o RCC_APB1PeriphClockLPModeCmd bin/stm32f4xx_rcc.o @@ -14950,6 +16307,7 @@ RCC_APB2PeriphResetCmd bin/stm32f4xx_rcc.o RCC_AdjustHSICalibrationValue bin/stm32f4xx_rcc.o RCC_BackupResetCmd bin/stm32f4xx_rcc.o RCC_ClearFlag bin/stm32f4xx_rcc.o + bin/watchdog.o RCC_ClearITPendingBit bin/stm32f4xx_rcc.o RCC_ClockSecuritySystemCmd bin/stm32f4xx_rcc.o RCC_DeInit bin/stm32f4xx_rcc.o @@ -14957,6 +16315,7 @@ RCC_GetClocksFreq bin/stm32f4xx_rcc.o bin/stm32f4xx_usart.o bin/stm32f4xx_i2c.o RCC_GetFlagStatus bin/stm32f4xx_rcc.o + bin/watchdog.o RCC_GetITStatus bin/stm32f4xx_rcc.o RCC_GetSYSCLKSource bin/stm32f4xx_rcc.o RCC_HCLKConfig bin/stm32f4xx_rcc.o @@ -15067,14 +16426,16 @@ TIM_ClearOC3Ref bin/stm32f4xx_tim.o TIM_ClearOC4Ref bin/stm32f4xx_tim.o TIM_Cmd bin/stm32f4xx_tim.o bin/sonar.o - bin/ws2812.o + bin/piezo.o + bin/ws2812_cf2.o bin/motors.o TIM_CounterModeConfig bin/stm32f4xx_tim.o TIM_CtrlPWMOutputs bin/stm32f4xx_tim.o - bin/ws2812.o + bin/piezo.o + bin/ws2812_cf2.o bin/motors.o TIM_DMACmd bin/stm32f4xx_tim.o - bin/ws2812.o + bin/ws2812_cf2.o TIM_DMAConfig bin/stm32f4xx_tim.o TIM_DeInit bin/stm32f4xx_tim.o bin/motors.o @@ -15113,29 +16474,34 @@ TIM_OC1PreloadConfig bin/stm32f4xx_tim.o bin/motors.o TIM_OC2FastConfig bin/stm32f4xx_tim.o TIM_OC2Init bin/stm32f4xx_tim.o - bin/ws2812.o + bin/ws2812_cf2.o bin/motors.o TIM_OC2NPolarityConfig bin/stm32f4xx_tim.o TIM_OC2PolarityConfig bin/stm32f4xx_tim.o TIM_OC2PreloadConfig bin/stm32f4xx_tim.o - bin/ws2812.o + bin/ws2812_cf2.o bin/motors.o TIM_OC3FastConfig bin/stm32f4xx_tim.o TIM_OC3Init bin/stm32f4xx_tim.o + bin/piezo.o bin/motors.o TIM_OC3NPolarityConfig bin/stm32f4xx_tim.o TIM_OC3PolarityConfig bin/stm32f4xx_tim.o TIM_OC3PreloadConfig bin/stm32f4xx_tim.o + bin/piezo.o bin/motors.o TIM_OC4FastConfig bin/stm32f4xx_tim.o TIM_OC4Init bin/stm32f4xx_tim.o + bin/piezo.o bin/motors.o TIM_OC4PolarityConfig bin/stm32f4xx_tim.o TIM_OC4PreloadConfig bin/stm32f4xx_tim.o + bin/piezo.o bin/motors.o TIM_OCStructInit bin/stm32f4xx_tim.o TIM_PWMIConfig bin/stm32f4xx_tim.o TIM_PrescalerConfig bin/stm32f4xx_tim.o + bin/piezo.o TIM_RemapConfig bin/stm32f4xx_tim.o TIM_SelectCCDMA bin/stm32f4xx_tim.o TIM_SelectCOM bin/stm32f4xx_tim.o @@ -15153,8 +16519,10 @@ TIM_SetCompare1 bin/stm32f4xx_tim.o TIM_SetCompare2 bin/stm32f4xx_tim.o bin/motors.o TIM_SetCompare3 bin/stm32f4xx_tim.o + bin/piezo.o bin/motors.o TIM_SetCompare4 bin/stm32f4xx_tim.o + bin/piezo.o bin/motors.o TIM_SetCounter bin/stm32f4xx_tim.o TIM_SetIC1Prescaler bin/stm32f4xx_tim.o @@ -15164,7 +16532,8 @@ TIM_SetIC4Prescaler bin/stm32f4xx_tim.o TIM_TIxExternalClockConfig bin/stm32f4xx_tim.o TIM_TimeBaseInit bin/stm32f4xx_tim.o bin/sonar.o - bin/ws2812.o + bin/piezo.o + bin/ws2812_cf2.o bin/motors.o TIM_TimeBaseStructInit bin/stm32f4xx_tim.o bin/motors.o @@ -15379,6 +16748,7 @@ __aeabi_d2f /Users/imac/Downloads/gcc-arm- /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libm.a(lib_a-wf_pow.o) /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libm.a(lib_a-wf_asin.o) bin/eprintf.o + bin/stabilizer.o bin/motors.o __aeabi_dadd /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/armv7e-m/fpu/libgcc.a(_arm_addsubdf3.o) /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libm.a(lib_a-s_rint.o) @@ -15393,11 +16763,13 @@ __aeabi_dcmplt /Users/imac/Downloads/gcc-arm- bin/pid.o __aeabi_ddiv /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/armv7e-m/fpu/libgcc.a(_arm_muldivdf3.o) /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libm.a(lib_a-wf_pow.o) + bin/stabilizer.o __aeabi_dmul /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/armv7e-m/fpu/libgcc.a(_arm_muldivdf3.o) bin/motors.o __aeabi_drsub /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/armv7e-m/fpu/libgcc.a(_arm_addsubdf3.o) __aeabi_dsub /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/armv7e-m/fpu/libgcc.a(_arm_addsubdf3.o) /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libm.a(lib_a-s_rint.o) + bin/stabilizer.o __aeabi_f2d /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/armv7e-m/fpu/libgcc.a(_arm_addsubdf3.o) /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libm.a(lib_a-wf_pow.o) /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libm.a(lib_a-wf_asin.o) @@ -15405,6 +16777,7 @@ __aeabi_f2d /Users/imac/Downloads/gcc-arm- bin/lps25h.o bin/mpu6500.o bin/sitaw.o + bin/stabilizer.o bin/pid.o bin/motors.o __aeabi_i2d /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/armv7e-m/fpu/libgcc.a(_arm_addsubdf3.o) @@ -15491,6 +16864,8 @@ __truncdfsf2 /Users/imac/Downloads/gcc-arm- __udivdi3 /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/armv7e-m/fpu/libgcc.a(_udivdi3.o) /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/armv7e-m/fpu/libgcc.a(bpabi.o) _ctype_ /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libc_nano.a(lib_a-ctype_.o) +_deckDriver_start bin/deck_drivers.o +_deckDriver_stop bin/deck_drivers.o _ebss bin/startup_stm32f40xx.o _edata bin/startup_stm32f40xx.o _estack bin/startup_stm32f40xx.o @@ -15559,9 +16934,12 @@ assertFail bin/cfassert.o bin/radiolink.o bin/syslink.o bin/usblink.o + bin/i2cdev_f405.o bin/log.o bin/crtp.o bin/motors.o + bin/port.o + bin/heap_4.o bin/timers.o bin/queue.o bin/tasks.o @@ -15569,11 +16947,18 @@ atan2f /Users/imac/Downloads/gcc-arm- bin/sensfusion6.o atanf /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libm.a(lib_a-sf_atan.o) /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libm.a(lib_a-ef_atan2.o) - bin/neopixelring.o + bin/ledring12.o atexit /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/crt0.o -bigquadInit bin/bigquad.o - bin/expbrd.o -bigquadTest bin/bigquad.o +buzzerInit bin/buzzer.o + bin/system.o +buzzerOff bin/buzzer.o + bin/sound_cf2.o +buzzerOn bin/buzzer.o + bin/sound_cf2.o +buzzerSetControl bin/buzzer.o + bin/buzzdeck.o +buzzerTest bin/buzzer.o + bin/system.o canStartMutex bin/system.o cf_usb_cb bin/usb.o commInit bin/comm.o @@ -15624,15 +17009,19 @@ consolePutchar bin/console.o bin/configblockeeprom.o bin/exptest.o bin/bigquad.o - bin/expbrd.o + bin/deck_drivers.o + bin/deck_info.o + bin/deck.o bin/ow_syslink.o bin/syslink.o bin/imu_cf2.o + bin/watchdog.o bin/eeprom.o bin/ak8963.o bin/lps25h.o bin/i2cdev_f405.o bin/mpu6500.o + bin/cfassert.o bin/system.o bin/freeRTOSdebug.o consolePuts bin/console.o @@ -15661,7 +17050,7 @@ counter bin/swd.o cpuIdGetFlashSize bin/cpuid.o cpuidGetId bin/cpuid.o crcSlow bin/crc.o - bin/expbrd.o + bin/deck_info.o bin/log.o bin/param.o crtpGetFreeTxQueuePackets bin/crtp.o @@ -15675,7 +17064,6 @@ crtpInitTaskQueue bin/crtp.o bin/param.o crtpIsConnected bin/crtp.o bin/log.o -crtpPacketReveived bin/crtp.o crtpReceivePacket bin/crtp.o crtpReceivePacketBlock bin/crtp.o bin/log.o @@ -15707,14 +17095,37 @@ crtpserviceInit bin/crtpservice.o bin/comm.o crtpserviceTest bin/crtpservice.o bin/comm.o -debugPrintTCBInfo bin/tasks.o - bin/system.o debugSendTraceInfo bin/freeRTOSdebug.o +deckCount bin/deck_info.o + bin/deck.o +deckDriverCount bin/deck_drivers.o + bin/deck.o +deckFindDriverByName bin/deck_drivers.o + bin/deck_info.o +deckFindDriverByVidPid bin/deck_drivers.o + bin/deck_info.o deckGPIOMapping bin/deck_constants.o bin/deck_analog.o bin/deck_digital.o +deckGetDriver bin/deck_drivers.o +deckInfo bin/deck_info.o + bin/deck.o +deckInfoInit bin/deck_info.o + bin/deck.o +deckInit bin/deck.o + bin/system.o +deckTest bin/deck.o + bin/system.o +deckTlvGetBuffer bin/deck_info.o +deckTlvGetString bin/deck_info.o +deckTlvGetTlv bin/deck_info.o +deckTlvHasElement bin/deck_info.o digitalRead bin/deck_digital.o digitalWrite bin/deck_digital.o +driver_bigquad_deck bin/bigquad.o +driver_buzzer_deck bin/buzzdeck.o +driver_exptest_deck bin/exptest.o +driver_ledring12_deck bin/ledring12.o eepromInit bin/eeprom.o bin/configblockeeprom.o eepromReadBuffer bin/eeprom.o @@ -15728,15 +17139,18 @@ eepromWriteBuffer bin/eeprom.o bin/configblockeeprom.o bin/mem.o eepromWritePage bin/eeprom.o -effectsFct bin/neopixelring.o +effectsFct bin/ledring12.o eprintf bin/eprintf.o bin/configblockeeprom.o bin/exptest.o bin/bigquad.o - bin/expbrd.o + bin/deck_drivers.o + bin/deck_info.o + bin/deck.o bin/ow_syslink.o bin/syslink.o bin/imu_cf2.o + bin/watchdog.o bin/uart2.o bin/uart1.o bin/eeprom.o @@ -15744,6 +17158,7 @@ eprintf bin/eprintf.o bin/lps25h.o bin/i2cdev_f405.o bin/mpu6500.o + bin/cfassert.o bin/system.o bin/freeRTOSdebug.o bin/nvic.o @@ -15753,12 +17168,6 @@ etGpioSDA bin/exptest.o evprintf bin/eprintf.o exit /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libc_nano.a(lib_a-exit.o) /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/crt0.o -expbrdInit bin/expbrd.o - bin/system.o -expbrdTest bin/expbrd.o - bin/system.o -exptestRun bin/exptest.o - bin/expbrd.o extiInit bin/exti.o extiTest bin/exti.o fabsf /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libm.a(lib_a-sf_fabs.o) @@ -15822,10 +17231,10 @@ iirLPFilterSingle bin/filter.o imu6Init bin/imu_cf2.o bin/stabilizer.o imu6IsCalibrated bin/imu_cf2.o - bin/neopixelring.o + bin/ledring12.o bin/stabilizer.o imu6ManufacturingTest bin/imu_cf2.o - bin/expbrd.o + bin/exptest.o imu6Read bin/imu_cf2.o imu6Test bin/imu_cf2.o bin/stabilizer.o @@ -15852,6 +17261,9 @@ ledSet bin/led_f405.o ledSetAll bin/led_f405.o ledTest bin/led_f405.o bin/ledseq.o +ledring12Worker bin/ledring12.o +ledringmem bin/ledring12.o + bin/mem.o ledseqEnable bin/ledseq.o ledseqInit bin/ledseq.o bin/system.o @@ -15871,11 +17283,13 @@ ledseqTest bin/ledseq.o bin/system.o logBlockTimed bin/log.o logGetFloat bin/log.o - bin/neopixelring.o + bin/ledring12.o logGetInt bin/log.o + bin/sound_cf2.o logGetUint bin/log.o logGetVarId bin/log.o - bin/neopixelring.o + bin/ledring12.o + bin/sound_cf2.o logInit bin/log.o bin/comm.o logRunBlock bin/log.o @@ -15904,6 +17318,7 @@ memInit bin/mem.o memTest bin/mem.o bin/system.o memcpy /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libc_nano.a(lib_a-memcpy.o) + bin/deck_info.o bin/ow_syslink.o bin/radiolink.o bin/syslink.o @@ -15911,11 +17326,13 @@ memcpy /Users/imac/Downloads/gcc-arm- bin/usblink.o bin/uart_syslink.o bin/log.o + bin/mem.o bin/param.o bin/queue.o memset /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libc_nano.a(lib_a-memset.o) + bin/deck_info.o bin/proximity.o - bin/ws2812.o + bin/ws2812_cf2.o bin/mpu6500.o bin/crtpservice.o bin/tasks.o @@ -16189,26 +17606,22 @@ nan /Users/imac/Downloads/gcc-arm- /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libm.a(lib_a-wf_asin.o) nanf /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libm.a(lib_a-sf_nan.o) /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libm.a(lib_a-ef_pow.o) -neopixelringInit bin/neopixelring.o - bin/expbrd.o -neopixelringWorker bin/neopixelring.o number_of_txd_bytes bin/swd.o nvicInit bin/nvic.o bin/platform_cf2.o owGetinfo bin/ow_syslink.o bin/mem.o owInit bin/ow_syslink.o - bin/expbrd.o + bin/deck_info.o owRead bin/ow_syslink.o - bin/expbrd.o + bin/deck_info.o bin/mem.o owScan bin/ow_syslink.o - bin/expbrd.o + bin/deck_info.o bin/mem.o owSyslinkRecieve bin/ow_syslink.o bin/syslink.o owTest bin/ow_syslink.o - bin/expbrd.o owWrite bin/ow_syslink.o bin/mem.o p bin/param.o @@ -16217,6 +17630,7 @@ paramInit bin/param.o paramTOCProcess bin/param.o paramTest bin/param.o bin/comm.o +pcTimerGetTimerName bin/timers.o pidGetDesired bin/pid.o pidInit bin/pid.o bin/stabilizer.o @@ -16246,6 +17660,13 @@ pidUpdate bin/pid.o bin/controller.o pidYaw bin/controller.o pidYawRate bin/controller.o +piezoInit bin/piezo.o + bin/buzzdeck.o +piezoSetFreq bin/piezo.o + bin/buzzdeck.o +piezoSetRatio bin/piezo.o + bin/buzzdeck.o +piezoTest bin/piezo.o pinMode bin/deck_digital.o pitchOutput bin/controller.o platformInit bin/platform_cf2.o @@ -16273,6 +17694,9 @@ pmUpdateState bin/pm_f405.o power bin/eprintf.o powf /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libm.a(lib_a-wf_pow.o) bin/lps25h.o +printAssertSnapshotData bin/cfassert.o + bin/watchdog.o +printDeckInfo bin/deck_info.o printHardFault bin/nvic.o proximityGetAccuracy bin/proximity.o proximityGetDistance bin/proximity.o @@ -16287,6 +17711,8 @@ pvPortMalloc bin/heap_4.o bin/timers.o bin/queue.o bin/tasks.o +pvTaskIncrementMutexHeldCount bin/tasks.o + bin/queue.o pvTimerGetTimerID bin/timers.o bin/log.o bin/ledseq.o @@ -16367,6 +17793,7 @@ sitAwInit bin/sitaw.o sitAwTuDetected bin/sitaw.o sitAwTuInit bin/sitaw.o sitAwTuTest bin/sitaw.o +snapshot bin/cfassert.o software_init_hook /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/crt0.o sonarExtiInterruptHandler bin/sonar.o bin/exti.o @@ -16374,11 +17801,22 @@ sonarInit bin/sonar.o bin/system.o sonarRange bin/sonar.o sonarTest bin/sonar.o +soundInit bin/sound_cf2.o + bin/system.o +soundSetEffect bin/sound_cf2.o + bin/pm_f405.o + bin/imu_cf2.o + bin/system.o +soundSetFreq bin/sound_cf2.o +soundTest bin/sound_cf2.o + bin/system.o stabilizerInit bin/stabilizer.o bin/system.o stabilizerTest bin/stabilizer.o bin/system.o +storeAssertSnapshotData bin/cfassert.o strcmp /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libc_nano.a(lib_a-strcmp.o) + bin/deck_drivers.o bin/log.o bin/param.o strcpy /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libc_nano.a(lib_a-strcpy.o) @@ -16389,7 +17827,6 @@ strlen /Users/imac/Downloads/gcc-arm- bin/param.o strncpy /Users/imac/Downloads/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libc_nano.a(lib_a-strncpy.o) bin/platformservice.o - bin/tasks.o swdInit bin/swd.o swdTest bin/swd.o synch bin/console.o @@ -16457,11 +17894,8 @@ uartSendDataDmaBlocking bin/uart_syslink.o uartSendDataIsrBlocking bin/uart_syslink.o uartTest bin/uart_syslink.o uartTxenFlowctrlIsr bin/uart_syslink.o -ulKernelPriority bin/port.o -ulPortSetInterruptMask bin/port.o - bin/freeRTOSdebug.o - bin/queue.o - bin/tasks.o +ucQueueGetQueueType bin/queue.o +ulTaskNotifyTake bin/tasks.o usbGetDataBlocking bin/usb.o bin/usblink.o usbInit bin/usb.o @@ -16478,11 +17912,17 @@ usblinkTest bin/usblink.o uxListRemove bin/list.o bin/timers.o bin/tasks.o +uxQueueGetQueueNumber bin/queue.o uxQueueMessagesWaiting bin/queue.o bin/crtp.o uxQueueMessagesWaitingFromISR bin/queue.o +uxQueueSpacesAvailable bin/queue.o uxTaskGetNumberOfTasks bin/tasks.o uxTaskGetStackHighWaterMark bin/tasks.o +uxTaskGetSystemState bin/tasks.o +uxTaskGetTaskNumber bin/tasks.o +uxTaskResetEventItemValue bin/tasks.o +uxTopUsedPriority bin/FreeRTOS-openocd.o vApplicationIdleHook bin/system.o bin/tasks.o vApplicationMallocFailedHook bin/freeRTOSdebug.o @@ -16501,9 +17941,6 @@ vListInsert bin/list.o bin/tasks.o vListInsertEnd bin/list.o bin/tasks.o -vPortClearInterruptMask bin/port.o - bin/queue.o - bin/tasks.o vPortEndScheduler bin/port.o bin/tasks.o vPortEnterCritical bin/port.o @@ -16520,13 +17957,14 @@ vPortFree bin/heap_4.o bin/tasks.o vPortInitialiseBlocks bin/heap_4.o vPortSetupTimerInterrupt bin/port.o -vPortYieldFromISR bin/port.o - bin/i2cdev_f405.o - bin/timers.o +vPortValidateInterruptPriority bin/port.o bin/queue.o bin/tasks.o vQueueAddToRegistry bin/queue.o + bin/timers.o vQueueDelete bin/queue.o +vQueueSetQueueNumber bin/queue.o +vQueueUnregisterQueue bin/queue.o vQueueWaitForMessageRestricted bin/queue.o bin/timers.o vTaskDelay bin/tasks.o @@ -16543,21 +17981,20 @@ vTaskDelay bin/tasks.o vTaskDelayUntil bin/tasks.o bin/stabilizer.o vTaskEndScheduler bin/tasks.o -vTaskIncrementTick bin/tasks.o - bin/port.o vTaskMissedYield bin/tasks.o bin/queue.o +vTaskNotifyGiveFromISR bin/tasks.o vTaskPlaceOnEventList bin/tasks.o bin/queue.o vTaskPlaceOnEventListRestricted bin/tasks.o bin/queue.o -vTaskPriorityDisinherit bin/tasks.o - bin/queue.o +vTaskPlaceOnUnorderedEventList bin/tasks.o vTaskPriorityInherit bin/tasks.o bin/queue.o vTaskSetApplicationTaskTag bin/tasks.o bin/pm_f405.o bin/stabilizer.o +vTaskSetTaskNumber bin/tasks.o vTaskSetTimeOutState bin/tasks.o bin/queue.o vTaskStartScheduler bin/tasks.o @@ -16568,24 +18005,30 @@ vTaskSuspendAll bin/tasks.o bin/queue.o vTaskSwitchContext bin/tasks.o bin/port.o +vTimerSetTimerID bin/timers.o waitUntilSendDone bin/uart_syslink.o +watchdogInit bin/watchdog.o + bin/system.o +watchdogNormalStartTest bin/watchdog.o + bin/system.o workerInit bin/worker.o bin/system.o workerLoop bin/worker.o bin/system.o workerSchedule bin/worker.o - bin/neopixelring.o + bin/ledring12.o bin/log.o workerTest bin/worker.o bin/system.o -ws2812DmaIsr bin/ws2812.o +ws2812DmaIsr bin/ws2812_cf2.o bin/nvic.o -ws2812Init bin/ws2812.o - bin/neopixelring.o -ws2812Send bin/ws2812.o - bin/neopixelring.o +ws2812Init bin/ws2812_cf2.o + bin/ledring12.o +ws2812Send bin/ws2812_cf2.o + bin/ledring12.o xPortGetFreeHeapSize bin/heap_4.o bin/system.o +xPortGetMinimumEverFreeHeapSize bin/heap_4.o xPortStartScheduler bin/port.o bin/tasks.o xQueueCreateMutex bin/queue.o @@ -16599,7 +18042,7 @@ xQueueGenericCreate bin/queue.o bin/usb.o bin/usblink.o bin/uart_syslink.o - bin/ws2812.o + bin/ws2812_cf2.o bin/i2cdev_f405.o bin/worker.o bin/console.o @@ -16613,7 +18056,7 @@ xQueueGenericReceive bin/queue.o bin/usb.o bin/usblink.o bin/uart_syslink.o - bin/ws2812.o + bin/ws2812_cf2.o bin/i2cdev_f405.o bin/worker.o bin/log.o @@ -16631,7 +18074,7 @@ xQueueGenericSend bin/queue.o bin/usb.o bin/usblink.o bin/uart_syslink.o - bin/ws2812.o + bin/ws2812_cf2.o bin/i2cdev_f405.o bin/worker.o bin/log.o @@ -16643,12 +18086,14 @@ xQueueGenericSend bin/queue.o xQueueGenericSendFromISR bin/queue.o bin/usb.o bin/uart_syslink.o - bin/ws2812.o - bin/i2cdev_f405.o - bin/crtp.o bin/timers.o +xQueueGiveFromISR bin/queue.o + bin/uart_syslink.o + bin/ws2812_cf2.o + bin/i2cdev_f405.o xQueueIsQueueEmptyFromISR bin/queue.o xQueueIsQueueFullFromISR bin/queue.o +xQueuePeekFromISR bin/queue.o xQueueReceiveFromISR bin/queue.o bin/usb.o xQueueRegistry bin/queue.o @@ -16666,13 +18111,16 @@ xTaskGenericCreate bin/tasks.o bin/system.o bin/crtp.o bin/timers.o +xTaskGenericNotify bin/tasks.o +xTaskGenericNotifyFromISR bin/tasks.o xTaskGetApplicationTaskTag bin/tasks.o xTaskGetCurrentTaskHandle bin/tasks.o - bin/queue.o xTaskGetSchedulerState bin/tasks.o bin/timers.o + bin/queue.o xTaskGetTickCount bin/tasks.o - bin/neopixelring.o + bin/ledring12.o + bin/sound_cf2.o bin/pm_f405.o bin/imu_cf2.o bin/log.o @@ -16682,20 +18130,29 @@ xTaskGetTickCount bin/tasks.o bin/ledseq.o bin/timers.o xTaskGetTickCountFromISR bin/tasks.o +xTaskIncrementTick bin/tasks.o + bin/port.o +xTaskNotifyStateClear bin/tasks.o +xTaskNotifyWait bin/tasks.o +xTaskPriorityDisinherit bin/tasks.o + bin/queue.o xTaskRemoveFromEventList bin/tasks.o bin/queue.o +xTaskRemoveFromUnorderedEventList bin/tasks.o xTaskResumeAll bin/tasks.o bin/heap_4.o bin/timers.o bin/queue.o xTimerCreate bin/timers.o - bin/neopixelring.o + bin/ledring12.o + bin/sound_cf2.o bin/log.o bin/ledseq.o xTimerCreateTimerTask bin/timers.o bin/tasks.o xTimerGenericCommand bin/timers.o - bin/neopixelring.o + bin/ledring12.o + bin/sound_cf2.o bin/log.o bin/ledseq.o xTimerIsTimerActive bin/timers.o diff --git a/config/FreeRTOSConfig.h b/config/FreeRTOSConfig.h index 985fb8a960..fae712f863 100644 --- a/config/FreeRTOSConfig.h +++ b/config/FreeRTOSConfig.h @@ -54,6 +54,8 @@ #ifndef FREERTOS_CONFIG_H #define FREERTOS_CONFIG_H +#include + #include "config.h" #include "cfassert.h" /*----------------------------------------------------------- @@ -76,7 +78,6 @@ #define configMINIMAL_STACK_SIZE ( ( unsigned short ) FREERTOS_MIN_STACK_SIZE ) #define configTOTAL_HEAP_SIZE ( ( size_t ) ( FREERTOS_HEAP_SIZE ) ) #define configMAX_TASK_NAME_LEN ( 10 ) -#define configUSE_TRACE_FACILITY 0 #define configUSE_16_BIT_TICKS 0 #define configIDLE_SHOULD_YIELD 0 #define configUSE_CO_ROUTINES 0 @@ -87,7 +88,7 @@ #define configUSE_MALLOC_FAILED_HOOK 1 #define configTIMER_TASK_STACK_DEPTH configMINIMAL_STACK_SIZE -#define configMAX_PRIORITIES ( ( unsigned portBASE_TYPE ) 5 ) +#define configMAX_PRIORITIES ( 6 ) #define configMAX_CO_ROUTINE_PRIORITIES ( 2 ) /* Set the following definitions to 1 to include the API function, or zero @@ -129,6 +130,7 @@ to exclude the API function. */ #define TASK_PROXIMITY_ID_NBR 6 #define configASSERT( x ) if( ( x ) == 0 ) assertFail(#x, __FILE__, __LINE__ ) + /* #define traceTASK_SWITCHED_IN() \ { \ @@ -136,4 +138,15 @@ to exclude the API function. */ debugSendTraceInfo((int)pxCurrentTCB->pxTaskTag); \ } */ + +// Queue monitoring +#ifdef DEBUG_QUEUE_MONITOR + #undef traceQUEUE_SEND + #undef traceQUEUE_SEND_FAILED + #define traceQUEUE_SEND(xQueue) qm_traceQUEUE_SEND(xQueue) + void qm_traceQUEUE_SEND(void* xQueue); + #define traceQUEUE_SEND_FAILED(xQueue) qm_traceQUEUE_SEND_FAILED(xQueue) + void qm_traceQUEUE_SEND_FAILED(void* xQueue); +#endif // DEBUG_QUEUE_MONITOR + #endif /* FREERTOS_CONFIG_H */ diff --git a/config/config.h b/config/config.h index 3356d47633..f07e387288 100644 --- a/config/config.h +++ b/config/config.h @@ -43,6 +43,8 @@ #define CONFIG_H_ #include "nrf24l01.h" +#include "trace.h" + #define PROTOCOL_VERSION 2 #ifdef STM32F4XX @@ -52,7 +54,7 @@ #define CONFIG_BLOCK_ADDRESS (2048 * (64-1)) #define MCU_ID_ADDRESS 0x1FFF7A10 #define MCU_FLASH_SIZE_ADDRESS 0x1FFF7A22 - #define FREERTOS_HEAP_SIZE 20000 + #define FREERTOS_HEAP_SIZE 22000 #define FREERTOS_MIN_STACK_SIZE 150 // M4-FPU register setup is bigger so stack needs to be bigger #define FREERTOS_MCU_CLOCK_HZ 168000000 @@ -67,25 +69,37 @@ #endif -//Task priorities. Higher number higher priority +// Task priorities. Higher number higher priority +#define STABILIZER_TASK_PRI 4 +#define ADC_TASK_PRI 3 #define SYSTEM_TASK_PRI 2 -#define CRTP_RXTX_TASK_PRI 2 +#define CRTP_TX_TASK_PRI 2 +#define CRTP_RX_TASK_PRI 2 #define LOG_TASK_PRI 1 #define MEM_TASK_PRI 1 #define PARAM_TASK_PRI 1 -#define STABILIZER_TASK_PRI 4 -#define SYSLINK_TASK_PRI 3 -#define USBLINK_TASK_PRI 3 #define PROXIMITY_TASK_PRI 0 -//CF1 -#define ADC_TASK_PRI 0 #define PM_TASK_PRI 0 -#define NRF24LINK_TASK_PRI 2 -#define ESKYLINK_TASK_PRI 1 -#define CRTP_TX_TASK_PRI 2 -#define CRTP_RX_TASK_PRI 2 -//Task names +#ifdef PLATFORM_CF2 + #define SYSLINK_TASK_PRI 5 + #define USBLINK_TASK_PRI 3 +#endif + +#ifdef PLATFORM_CF1 + #define NRF24LINK_TASK_PRI 2 + #define ESKYLINK_TASK_PRI 1 + #define UART_RX_TASK_PRI 2 +#endif + +// Not compiled +#if 0 + #define INFO_TASK_PRI 2 + #define PID_CTRL_TASK_PRI 2 +#endif + + +// Task names #define SYSTEM_TASK_NAME "SYSTEM" #define ADC_TASK_NAME "ADC" #define PM_TASK_NAME "PWRMGNT" @@ -101,7 +115,11 @@ #define SYSLINK_TASK_NAME "SYSLINK" #define USBLINK_TASK_NAME "USBLINK" #define PROXIMITY_TASK_NAME "PROXIMITY" -//Task stack sizes +#define UART_RX_TASK_NAME "UART-RX" +#define INFO_TASK_NAME "INFO" +#define PID_CTRL_TASK_NAME "PID-CTRL" + +// Task stack sizes #define SYSTEM_TASK_STACKSIZE (2* configMINIMAL_STACK_SIZE) #define ADC_TASK_STACKSIZE configMINIMAL_STACK_SIZE #define PM_TASK_STACKSIZE configMINIMAL_STACK_SIZE @@ -117,6 +135,9 @@ #define SYSLINK_TASK_STACKSIZE configMINIMAL_STACK_SIZE #define USBLINK_TASK_STACKSIZE configMINIMAL_STACK_SIZE #define PROXIMITY_TASK_STACKSIZE configMINIMAL_STACK_SIZE +#define UART_RX_TASK_STACKSIZE configMINIMAL_STACK_SIZE +#define INFO_TASK_STACKSIZE configMINIMAL_STACK_SIZE +#define PID_CTRL_TASK_STACKSIZE configMINIMAL_STACK_SIZE //The radio channel. From 0 to 125 #define RADIO_CHANNEL 80 diff --git a/config/nvicconf.h b/config/nvicconf.h index 2000e6fc48..3cf28a1af6 100644 --- a/config/nvicconf.h +++ b/config/nvicconf.h @@ -1,6 +1,6 @@ /** - * || ____ _ __ - * +------+ / __ )(_) /_______________ _____ ___ + * || ____ _ __ + * +------+ / __ )(_) /_______________ _____ ___ * | 0xBC | / __ / / __/ ___/ ___/ __ `/_ / / _ \ * +------+ / /_/ / / /_/ /__/ / / /_/ / / /_/ __/ * || || /_____/_/\__/\___/_/ \__,_/ /___/\___/ @@ -33,12 +33,53 @@ #ifndef NVIC_CONF_H_ #define NVIC_CONF_H_ +/* + Interrupt priority organisation in Crazyflie: + + In Cortex-M low priority number is higher priority. Hence priority 0 is the + highest priority interrupt and priority 15 the lowest (STM32 implements + 4 priority bits) + + Interrupts bellow MAX_SYSCALL_INTERRUPT_PRIORITY cannot call any RTOS + functions! They should be handled like some kind of softdevice, running above + the OS. + + 3 Interrupt level are defined + - NVIC_LOW_PRI + - NVIC_MID_PRI + - NVIC_HIGH_PRI + The aim is to simplify interrupt handling and to document why any special case + is required. + + 15 - + 14 - + 13 - NVIC_LOW_PRI + 12 - NVIC_ADC_PRI + 11 - NVIC_RADIO_PRI + 10 - NVIC_MID_PRI + 9 - + 8 - + 7 - NVIC_HIGH_PRI + 6 - + 5 - <-- MAX_SYSCALL_INTERRUPT_PRIORITY + 4 ! NVIC_I2C_PRI_LOW NVIC_TRACE_TIM_PRI --- Does not call any RTOS function + 3 ! NVIC_I2C_PRI_HIGH + 2 ! + 1 ! + 0 ! +*/ + +// Standard interrupt levels +#define NVIC_LOW_PRI 13 +#define NVIC_MID_PRI 10 +#define NVIC_HIGH_PRI 7 + // Priorities used for Crazyflie -#define NVIC_I2C_PRI 3 +#define NVIC_I2C_HIGH_PRI 3 +#define NVIC_I2C_LOW_PRI 4 #define NVIC_TRACE_TIM_PRI 4 // Priorities for Crazyflie 2.0 -#define NVIC_UART_PRI 6 #define NVIC_RADIO_PRI 11 #define NVIC_ADC_PRI 12 diff --git a/config/stm32f40x_i2c_cpal_conf.h b/config/stm32f40x_i2c_cpal_conf.h index bef99414ce..8336637863 100644 --- a/config/stm32f40x_i2c_cpal_conf.h +++ b/config/stm32f40x_i2c_cpal_conf.h @@ -1,6 +1,6 @@ /** ****************************************************************************** - * @file cpal_conf_template.h + * @file cpal_conf_template.h * @author MCD Application Team * @version V1.2.0 * @date 21-December-2012 @@ -16,8 +16,8 @@ * * http://www.st.com/software_license_agreement_liberty_v2 * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. @@ -31,7 +31,7 @@ #ifdef __cplusplus extern "C" { -#endif +#endif /* Includes ------------------------------------------------------------------*/ /* Exported types ------------------------------------------------------------*/ @@ -40,24 +40,24 @@ /*======================================================================================================================================= User NOTES ========================================================================================================================================= - + ------------------------------- 1. How To use the CPAL Library: ------------------------------- -------- Refer to the user manual of the library and (eventually) the example to check if +------- Refer to the user manual of the library and (eventually) the example to check if this firmware is appropriate for your hardware (device and (eventually) evaluation board). - + - Section 1 : Select the Device instances to be used and the total number of devices. - + - Section 2 : Configure Transfer Options. - + - Section 3 : Select and configure transfer and error user Callbacks. - Section 4 : Configure Timeout mechanism and TimeoutCallback. - + - Section 5 : NVIC Priority Group Selection and Interrupt Priority Offset. - + - Section 6 : Configure CPAL_LOG Macro. ------ After configuring CPAL firmware functionality , You should proceed by configuring hardware used with CPAL @@ -65,22 +65,22 @@ ------ After configuring CPAL Firmware Library, you should follow these steps to use the Firmware correctly : - -1- STRUCTURE INITIALIZATION - Start by initializing the Device. To perform this action, the global variable PPPx_DevStructure declared + -1- STRUCTURE INITIALIZATION + Start by initializing the Device. To perform this action, the global variable PPPx_DevStructure declared in CPAL Firmware as CPAL_InitTypeDef (I2C1_DevStructure for I2C1, I2C2_DevStructure for I2C2 ...) must be used . There are two ways to proceed : - + ** Call the function CPAL_PPP_StructInit() using as parameter PPPx_DevStructure (where PPP = device type (ie. I2C...) - and where x could be 1 for PPP1, 2 for PPP2 ...). This function sets the default values for all fields of this structure. - + and where x could be 1 for PPP1, 2 for PPP2 ...). This function sets the default values for all fields of this structure. + Default values for I2C devices are : - I2Cx_DevStructure.CPAL_Direction = CPAL_DIRECTION_TXRX - I2Cx_DevStructure.CPAL_Mode = CPAL_MODE_MASTER - I2Cx_DevStructure.CPAL_ProgModel = CPAL_PROGMODEL_DMA + I2Cx_DevStructure.CPAL_Direction = CPAL_DIRECTION_TXRX + I2Cx_DevStructure.CPAL_Mode = CPAL_MODE_MASTER + I2Cx_DevStructure.CPAL_ProgModel = CPAL_PROGMODEL_DMA I2Cx_DevStructure.pCPAL_TransferTx = pNULL I2Cx_DevStructure.pCPAL_TransferRx = pNULL - I2Cx_DevStructure.CPAL_State = CPAL_STATE_DISABLED - I2Cx_DevStructure.wCPAL_DevError = CPAL_I2C_ERR_NONE + I2Cx_DevStructure.CPAL_State = CPAL_STATE_DISABLED + I2Cx_DevStructure.wCPAL_DevError = CPAL_I2C_ERR_NONE I2Cx_DevStructure.wCPAL_Options = 0 (all options disabled) I2Cx_DevStructure.wCPAL_Timeout = CPAL_TIMEOUT_DEFAULT I2Cx_DevStructure.pCPAL_I2C_Struct->I2C_ClockSpeed = 100000 @@ -88,26 +88,26 @@ I2Cx_DevStructure.pCPAL_I2C_Struct->I2C_DutyCycle = I2C_DutyCycle_2 I2Cx_DevStructure.pCPAL_I2C_Struct->I2C_OwnAddress1 = 0 I2Cx_DevStructure.pCPAL_I2C_Struct->I2C_Ack = I2C_Ack_Enable - I2Cx_DevStructure.pCPAL_I2C_Struct->I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit - - - pCPAL_TransferTx and pCPAL_TransferRx fields have to be updated in order to point to valid structures + I2Cx_DevStructure.pCPAL_I2C_Struct->I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit + + + pCPAL_TransferTx and pCPAL_TransferRx fields have to be updated in order to point to valid structures (these structures should be local/global variables in the user application). - - ** Another way of configuration is without calling CPAL_PPP_StructInit() function. + + ** Another way of configuration is without calling CPAL_PPP_StructInit() function. Declare the following structures: - A PPP_InitTypeDef structure for the device configuration (ie. I2C_InitTypeDef structure) - One or two CPAL_TransferTypeDef variables (one for Tx and one for Rx). - - Use the extern structure provided by the CPAL library: PPPx_InitStructure (ie. I2C1_DevStructure). + - Use the extern structure provided by the CPAL library: PPPx_InitStructure (ie. I2C1_DevStructure). Fill in all the fields for these structures (one by one). - Use the pointers to these structures to fill in the fields pCPAL_PPP_Struct and pCPAL_TransferTx and/or - pCPAL_TransferRx of the PPPx_DevStructure. - After that CPAL_State must be set to CPAL_STATE_DISABLED. + Use the pointers to these structures to fill in the fields pCPAL_PPP_Struct and pCPAL_TransferTx and/or + pCPAL_TransferRx of the PPPx_DevStructure. + After that CPAL_State must be set to CPAL_STATE_DISABLED. Finally, call the CPAL_PPP_Init() with pointer to the PPPx_DevStructure as argument. - + Example: - // Declare local structures - I2C_InitTypeDef I2C1_InitStructure; + // Declare local structures + I2C_InitTypeDef I2C1_InitStructure; CPAL_TransferTypeDef TX_Transfer , RX_Transfer ; // Fill in all the fields of to these structures I2C1_InitStructure.I2C_ClockSpeed = 5000; @@ -122,54 +122,54 @@ ..... // Use these structures and fill all fields of I2C1_DevStructure. I2C1_DevStructure.CPAL_Dev = CPAL_I2C1; - I2C1_DevStructure.CPAL_Direction = CPAL_DIRECTION_TXRX; - I2C1_DevStructure.CPAL_Mode = CPAL_MODE_SLAVE; + I2C1_DevStructure.CPAL_Direction = CPAL_DIRECTION_TXRX; + I2C1_DevStructure.CPAL_Mode = CPAL_MODE_SLAVE; I2C1_DevStructure.wCPAL_Options = CPAL_OPT_DMATX_HTIT ; ..... I2C1_DevStructure.pCPAL_TransferTx = &TX_Transfer ; I2C1_DevStructure.pCPAL_TransferRx = &RX_Transfer ; - I2C1_DevStructure.pCPAL_I2C_Struct = &I2C1_InitStructure; + I2C1_DevStructure.pCPAL_I2C_Struct = &I2C1_InitStructure; ... I2C1_DevStructure.wCPAL_State = CPAL_STATE_DISABLED; .... CPAL_I2C_Init(&I2C1_DevStructure); - - -2- DEVICE CONFIGURATION - Call the function CPAL_PPP_Init() to configure the selected device with the selected configuration by calling + + -2- DEVICE CONFIGURATION + Call the function CPAL_PPP_Init() to configure the selected device with the selected configuration by calling CPAL_PPP_Init(). This function also enables device clock and initialize all related peripherals ( GPIO, DMA , IT and NVIC ). - This function tests on CPAL_State, if it is equal to CPAL_STATE_BUSY it exit, otherwise device initialization is + This function tests on CPAL_State, if it is equal to CPAL_STATE_BUSY it exit, otherwise device initialization is performed and CPAL_State is set to CPAL_STATE_READY. This function returns CPAL_PASS state when the operation is correctly performed, or CPAL_FAIL when the current state of the device doesn't allow configuration (ie. state different from READY, DISABLED or ERROR). - After calling this function, you may check on the new state of device, when it is equal to CPAL_STATE_READY, Transfer operations + After calling this function, you may check on the new state of device, when it is equal to CPAL_STATE_READY, Transfer operations can be started, otherwise you can call CPAL_PPP_DeInit() to deinitialize device and call CPAL_PPP_Init() once again. - - -3- 1- READ / WRITE OPERATIONS - Call the function CPAL_PPP_Write() or CPAL_PPP_Read() to perform transfer operations. - These functions handle communication events using device event interrupts (independently of programming model used: DMA, - Interrupt). These functions start preparing communication (send start condition, send salve address in case of - master mode ...) if connection is established between devices CPAL_State is set CPAL_STATE_BUSY_XX and data transfer starts. - By default, Error interrupts are enabled to manage device errors (Error interrupts can be disabled by affecting - CPAL_OPT_I2C_ERRIT_DISABLE to wCPAL_Options). When transfer is completed successfully, CPAL_State is set to CPAL_STATE_READY + + -3- 1- READ / WRITE OPERATIONS + Call the function CPAL_PPP_Write() or CPAL_PPP_Read() to perform transfer operations. + These functions handle communication events using device event interrupts (independently of programming model used: DMA, + Interrupt). These functions start preparing communication (send start condition, send salve address in case of + master mode ...) if connection is established between devices CPAL_State is set CPAL_STATE_BUSY_XX and data transfer starts. + By default, Error interrupts are enabled to manage device errors (Error interrupts can be disabled by affecting + CPAL_OPT_I2C_ERRIT_DISABLE to wCPAL_Options). When transfer is completed successfully, CPAL_State is set to CPAL_STATE_READY and another operation can be started. These functions return CPAL_PASS if the current state of the device allows starting a new operation and the operation is correctly - started (but not finished). It returns CPAL_FAIL when the state of the device doesn't allow starting a new communication (ie. + started (but not finished). It returns CPAL_FAIL when the state of the device doesn't allow starting a new communication (ie. BUSY, DISABLED, ERROR) or when an error occurs during operation start. Once operation is started, user application may perform other tasks while CPAL is sending/receiving data on device through interrupt - or DMA. + or DMA. -3- 2- Listen Mode for Slave This mode allows slave device to start a communication without knowing in advance the nature of the operation (read or write). - Slave enter in idle state and wait until it receive its own address, CPAL_State is set CPAL_STATE_BUSY. In accordance to the type - of received request from master device, the slave device state is changed to CPAL_STATE_BUSY_RX and CPAL_I2C_SLAVE_READ_UserCallback + Slave enter in idle state and wait until it receive its own address, CPAL_State is set CPAL_STATE_BUSY. In accordance to the type + of received request from master device, the slave device state is changed to CPAL_STATE_BUSY_RX and CPAL_I2C_SLAVE_READ_UserCallback is called for a read request or state is changed to CPAL_STATE_BUSY_TX and CPAL_I2C_SLAVE_WRITE_UserCallback for a write request. In these callbacks user must configure DMA, interrupts (Prepare DMA channel, DMA request and I2C interrupts) and transfer parameters. - To configure DMA and Interrupts user can call "CPAL_I2C_Enable_DMA_IT" function which is implemented in Communication layer of CPAL Library. - Listen mode is enabled by uncommenting "CPAL_I2C_LISTEN_MODE" define in "cpal_conf.h" file. When this mode is enabled "CPAL_I2C_Read" and + To configure DMA and Interrupts user can call "CPAL_I2C_Enable_DMA_IT" function which is implemented in Communication layer of CPAL Library. + Listen mode is enabled by uncommenting "CPAL_I2C_LISTEN_MODE" define in "cpal_conf.h" file. When this mode is enabled "CPAL_I2C_Read" and "CPAL_I2C_Write" functions are replaced by one function "CPAL_I2C_Listen". - - -4- DEVICE DEINITIALIZATION - When transfer operations are finished, you may call CPAL_PPP_DeInit() to disable PPPx device and related resources + + -4- DEVICE DEINITIALIZATION + When transfer operations are finished, you may call CPAL_PPP_DeInit() to disable PPPx device and related resources ( GPIO, DMA , IT and NVIC). CPAL_State is then set to CPAL_STATE_DISABLED by this function. @@ -177,83 +177,83 @@ ------ Callbacks are routines that let you insert your own code in different stages of communication and for handling device errors. Their prototypes are declared by the CPAL library (if the relative define in this cpal_conf.h is enabled) but their body is not implemented by CPAL library. It may be done by user when needed. - There are three types of Callbacks: Transfer User Callbacks, Error User Callbacks and Timeout User Callbacks: - - -a- Transfer User Callbacks : + There are three types of Callbacks: Transfer User Callbacks, Error User Callbacks and Timeout User Callbacks: + + -a- Transfer User Callbacks : - ** CPAL_I2C_TX_UserCallback(CPAL_InitTypeDef* pDevInitStruct) + ** CPAL_I2C_TX_UserCallback(CPAL_InitTypeDef* pDevInitStruct) This function is called before sending data when Interrupt Programming Model is selected. - ** CPAL_I2C_RX_UserCallback(CPAL_InitTypeDef* pDevInitStruct) + ** CPAL_I2C_RX_UserCallback(CPAL_InitTypeDef* pDevInitStruct) This function is called after receiving data when Interrupt Programming Model is selected. - ** CPAL_I2C_TXTC_UserCallback(CPAL_InitTypeDef* pDevInitStruct) + ** CPAL_I2C_TXTC_UserCallback(CPAL_InitTypeDef* pDevInitStruct) ** CPAL_I2C_RXTC_UserCallback(CPAL_InitTypeDef* pDevInitStruct) - These functions are called when a transfer is complete when using Interrupt programming model or DMA + These functions are called when a transfer is complete when using Interrupt programming model or DMA programming model. - - ** CPAL_I2C_DMATXTC_UserCallback(CPAL_InitTypeDef* pDevInitStruct) - ** CPAL_I2C_DMATXTC_UserCallback(CPAL_InitTypeDef* pDevInitStruct) - These functions are called when Transfer complete Interrupt occurred in transmission/reception operation + + ** CPAL_I2C_DMATXTC_UserCallback(CPAL_InitTypeDef* pDevInitStruct) + ** CPAL_I2C_DMATXTC_UserCallback(CPAL_InitTypeDef* pDevInitStruct) + These functions are called when Transfer complete Interrupt occurred in transmission/reception operation if DMA Programming Model is selected - ** CPAL_I2C_DMATXHT_UserCallback(CPAL_InitTypeDef* pDevInitStruct) + ** CPAL_I2C_DMATXHT_UserCallback(CPAL_InitTypeDef* pDevInitStruct) ** CPAL_I2C_DMARXHT_UserCallback(CPAL_InitTypeDef* pDevInitStruct) - These functions are called when Half transfer Interrupt occurred in transmission/reception operation + These functions are called when Half transfer Interrupt occurred in transmission/reception operation if DMA Programming Model is selected. - ** CPAL_I2C_DMATXTE_UserCallback(CPAL_InitTypeDef* pDevInitStruct) + ** CPAL_I2C_DMATXTE_UserCallback(CPAL_InitTypeDef* pDevInitStruct) ** CPAL_I2C_DMARXTE_UserCallback(CPAL_InitTypeDef* pDevInitStruct) - These functions are called when a transfer error Interrupt occurred in transmission/reception operation + These functions are called when a transfer error Interrupt occurred in transmission/reception operation if DMA Programming Model is selected. - ** CPAL_I2C_GENCALL_UserCallback(CPAL_InitTypeDef* pDevInitStruct) - This function is called when an Address Event interrupt occurred and General Call Address Flag is set + ** CPAL_I2C_GENCALL_UserCallback(CPAL_InitTypeDef* pDevInitStruct) + This function is called when an Address Event interrupt occurred and General Call Address Flag is set (available in Slave mode only and when the option CPAL_OPT_I2C_GENCALL is enabled). - ** CPAL_I2C_DUALF_UserCallback(CPAL_InitTypeDef* pDevInitStruct) - This function is called when an Address Event interrupt occurred and Dual Address Flag is set + ** CPAL_I2C_DUALF_UserCallback(CPAL_InitTypeDef* pDevInitStruct) + This function is called when an Address Event interrupt occurred and Dual Address Flag is set (available in Slave mode only and when the option CPAL_OPT_I2C_DUALADDR is enabled). ** CPAL_I2C_SLAVE_WRITE_UserCallback(CPAL_InitTypeDef* pDevInitStruct) This function is called when a write operation is requested in Listen mode only. - + ** CPAL_I2C_SLAVE_READ_UserCallback(CPAL_InitTypeDef* pDevInitStruct) This function is called when a read operation is requested in Listen mode only. - - - -b- Error User Callbacks : - ** CPAL_I2C_ERR_UserCallback(CPAL_DevTypeDef pDevInstance, uint32_t Device_Error) + + -b- Error User Callbacks : + + ** CPAL_I2C_ERR_UserCallback(CPAL_DevTypeDef pDevInstance, uint32_t Device_Error) This function is called either when an Error Interrupt occurred (If Error Interrupts enabled) or after - a read or write operations to handle device errors (If Error Interrupts disabled). This callback + a read or write operations to handle device errors (If Error Interrupts disabled). This callback can be used to handle all device errors. It is available only when the define USE_SINGLE_ERROR_CALLBACK is enabled (Section 5). - ** CPAL_I2C_BERR_UserCallback(CPAL_DevTypeDef pDevInstance) - This function is called either when a Bus Error Interrupt occurred (If Error Interrupts enabled) or + ** CPAL_I2C_BERR_UserCallback(CPAL_DevTypeDef pDevInstance) + This function is called either when a Bus Error Interrupt occurred (If Error Interrupts enabled) or after a read or write operations to handle this error (If Error Interrupts disabled). This callback is available only when USE_MULTIPLE_ERROR_CALLBACK is enabled (Section 5). - ** CPAL_I2C_ARLO_UserCallback(CPAL_DevTypeDef pDevInstance) - This function is called either when an Arbitration Lost Interrupt occurred (If Error Interrupts + ** CPAL_I2C_ARLO_UserCallback(CPAL_DevTypeDef pDevInstance) + This function is called either when an Arbitration Lost Interrupt occurred (If Error Interrupts enabled) or after a read or write operations to handle this error (If Error Interrupts disabled). - ** CPAL_I2C_OVR_UserCallback(CPAL_DevTypeDef pDevInstance) - This function is called either when an Overrun Interrupt occurred (If Error Interrupts enabled) or + ** CPAL_I2C_OVR_UserCallback(CPAL_DevTypeDef pDevInstance) + This function is called either when an Overrun Interrupt occurred (If Error Interrupts enabled) or after a read or write operations to handle this error (If Error Interrupts disabled). This callback is available only when USE_MULTIPLE_ERROR_CALLBACK is enabled (Section 5). - ** CPAL_I2C_AF_UserCallback(CPAL_DevTypeDef pDevInstance) - This function is called either when an Acknowledge Failure Interrupt occurred (If Error Interrupts + ** CPAL_I2C_AF_UserCallback(CPAL_DevTypeDef pDevInstance) + This function is called either when an Acknowledge Failure Interrupt occurred (If Error Interrupts enabled) or after a read or write operations to handle this error (If Error Interrupts disabled). This callback is available only when USE_MULTIPLE_ERROR_CALLBACK is enabled (Section 5). - -c- Timeout User Callbacks : + -c- Timeout User Callbacks : ** CPAL_TIMEOUT_UserCallback(void) This function is called when a Timeout occurred in communication. - + ** CPAL_TIMEOUT_INIT() This function allows to configure and enable the counting peripheral/function (ie. SysTick Timer) It is called into all CPAL_PPP_Init() functions. @@ -265,25 +265,25 @@ ** CPAL_PPP_TIMEOUT_Manager() WARNING: DO NOT IMPLEMENT THIS FUNCTION (already implemented in CPAL drivers) This function is already implemented in the CPAL drivers (cpal_i2c.c file). It should be called periodically - (using the count mechanism interrupt for example). This function checks all PPP devices and - manages timeout conditions. In case of timeout occurring, this function calls the + (using the count mechanism interrupt for example). This function checks all PPP devices and + manages timeout conditions. In case of timeout occurring, this function calls the CPAL_TIMEOUT_UserCallback() function that may be implemented by user to manage the cases of timeout errors (ie. reset the device/microcontroller...). In order to facilitate implementation, this function (instead to be called periodically by user - application), may be mapped directly to a periodic event/interrupt: - Example: + application), may be mapped directly to a periodic event/interrupt: + Example: #define CPAL_I2C_TIMEOUT_Manager SysTick_Handler To implement Transfer and Error Callbacks, you should comment relative defines in Section 4 and implement Callback function (body) into - your application (their prototypes are declared in cpal_i2c.h file). - + your application (their prototypes are declared in cpal_i2c.h file). + Example: How to implement CPAL_I2C_TX_UserCallback() callback: - + -1- Comment the relative define in this file : - //#define CPAL_I2C_TX_UserCallback (void) - + //#define CPAL_I2C_TX_UserCallback (void) + -2- Add CPAL_I2C_TX_UserCallback code source in application file ( example : main.c ) void CPAL_I2C_TX_UserCallback (CPAL_InitTypeDef* pDevInitStruct) { @@ -291,20 +291,20 @@ // user code //.......... } - + There are two types of Error Callbacks : -1- Single Error Callback : Only one Callback is used to manage all device errors. - -2- Multiple Error Callback : Each device error is managed by its own separate Callback. - + -2- Multiple Error Callback : Each device error is managed by its own separate Callback. + Example of using CPAL_I2C_BERR_UserCallback : - + -1- Select Multiple Error Callback type : - //#define USE_SINGLE_ERROR_CALLBACK + //#define USE_SINGLE_ERROR_CALLBACK #define USE_MULTIPLE_ERROR_CALLBACK - + -2- Comment define relative to CPAL_I2C_BERR_UserCallback in cpal_conf.h file: - //#define CPAL_I2C_BERR_UserCallback (void) - + //#define CPAL_I2C_BERR_UserCallback (void) + -3- Add CPAL_I2C_BERR_UserCallback code source in application file ( example: main.c ) void CPAL_I2C_BERR_UserCallback (CPAL_DevTypeDef pDevInstance) { @@ -329,7 +329,7 @@ /* -- Section 1 : **** I2Cx Device Selection **** - Description: This section provide an easy way to select I2Cx devices in user application. + Description: This section provide an easy way to select I2Cx devices in user application. Choosing device allows to save memory resources. If you need I2C1 device, uncomment relative define: #define CPAL_USE_I2C1. All available I2Cx device can be used at the same time. @@ -343,8 +343,8 @@ /* -- Section 2 : **** Transfer Options Configuration **** - Description: This section allows user to enable/disable some Transfer Options. The benefits of these - defines is to minimize the size of the source code */ + Description: This section allows user to enable/disable some Transfer Options. The benefits of these + defines is to minimize the size of the source code */ /* Enable the use of Master Mode */ #define CPAL_I2C_MASTER_MODE @@ -375,7 +375,7 @@ //#define CPAL_I2C_10BIT_ADDR_MODE -/* Enable the use of 16Bit Address memory register option +/* Enable the use of 16Bit Address memory register option !! This define is available only when CPAL_I2C_MASTER_MODE is enabled !! */ #define CPAL_16BIT_REG_OPTION @@ -387,7 +387,7 @@ the I2C interrupts have the highest priority in the application */ //#define CPAL_I2C_CLOSECOM_METHOD1 -/* Method2 used for closing communication with master receiver: This method is for the case when +/* Method2 used for closing communication with master receiver: This method is for the case when the I2C interrupts do not have the highest priority in the application */ #define CPAL_I2C_CLOSECOM_METHOD2 @@ -402,14 +402,14 @@ Description: This section provides an easy way to enable UserCallbacks and select type of Error UserCallbacks. By default, All UserCallbacks are disabled (UserCallbacks are defined as void functions). - To implement a UserCallbacks in your application, comment the relative define and + To implement a UserCallbacks in your application, comment the relative define and implement the callback body in your application file.*/ - + /* Error UserCallbacks Type : Uncomment to select UserCallbacks type. One type must be selected */ -/* Note : if Error UserCallbacks are not used the two following defines must be commented - - WARNING: These two defines are EXCLUSIVE, only one define should be uncommented ! +/* Note : if Error UserCallbacks are not used the two following defines must be commented + + WARNING: These two defines are EXCLUSIVE, only one define should be uncommented ! */ #define USE_SINGLE_ERROR_CALLBACK /*CTRL = 0 /*CTRL = 0 /*Libraries->Small printf - // set to 'Yes') calls __io_putchar() + // set to 'Yes') calls __io_putchar() #define PUTCHAR_PROTOTYPE int __io_putchar(int ch) #else #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f) - #endif - + #endif + WARNING Be aware that enabling this feature may slow down the communication process, increase the code size significantly, and may in some cases cause communication errors (when print/display mechanism is too slow)*/ - + /* To Enable CPAL_DEBUG Option Uncomment the define below */ //#define CPAL_DEBUG @@ -580,7 +582,7 @@ #include /* This header file must be included when using CPAL_DEBUG option */ #else #define CPAL_LOG(Str) ((void)0) -#endif /* CPAL_DEBUG */ +#endif /* CPAL_DEBUG */ /*-----------------------------------------------------------------------------------------------------------------------*/ diff --git a/config/trace.h b/config/trace.h new file mode 100644 index 0000000000..65fa9ffb24 --- /dev/null +++ b/config/trace.h @@ -0,0 +1,57 @@ +/** + * || ____ _ __ + * +------+ / __ )(_) /_______________ _____ ___ + * | 0xBC | / __ / / __/ ___/ ___/ __ `/_ / / _ \ + * +------+ / /_/ / / /_/ /__/ / / /_/ / / /_/ __/ + * || || /_____/_/\__/\___/_/ \__,_/ /___/\___/ + * + * Crazyflie control firmware + * + * Copyright (C) 2011-2012 Bitcraze AB + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, in version 3. + * + * This program 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 + * along with this program. If not, see . + * + * trace.h - ITM trace implementation/definition + */ + +#ifndef __TRACE_H__ +#define __TRACE_H__ + +#define configUSE_TRACE_FACILITY 1 + +// ITM useful macros +#ifndef ITM_NO_OVERFLOW +#define ITM_SEND(CH, DATA) ((uint32_t*)0xE0000000)[CH] = DATA +#else +#define ITM_SEND(CH, DATA) while(((uint32_t*)0xE0000000)[CH] == 0);\ + ((uint32_t*)0xE0000000)[CH] = DATA +#endif + +// Send 4 first chatacters of task name to ITM port 1 +#define traceTASK_SWITCHED_IN() ITM_SEND(1, *((uint32_t*)pxCurrentTCB->pcTaskName)) + +// Systick value on port 2 +#define traceTASK_INCREMENT_TICK(xTickCount) ITM_SEND(2, xTickCount) + +// Queue trace on port 3 +#define ITM_QUEUE_SEND 0x0100 +#define ITM_QUEUE_FAILED 0x0200 +#define ITM_BLOCKING_ON_QUEUE_RECEIVE 0x0300 +#define ITM_BLOCKING_ON_QUEUE_SEND 0x0400 + +#define traceQUEUE_SEND(xQueue) ITM_SEND(3, ITM_QUEUE_SEND | ((xQUEUE *) xQueue)->uxQueueNumber) +#define traceQUEUE_SEND_FAILED(xQueue) ITM_SEND(3, ITM_QUEUE_FAILED | ((xQUEUE *) xQueue)->uxQueueNumber) +#define traceBLOCKING_ON_QUEUE_RECEIVE(xQueue) ITM_SEND(3, ITM_BLOCKING_ON_QUEUE_RECEIVE | ((xQUEUE *) xQueue)->uxQueueNumber) +#define traceBLOCKING_ON_QUEUE_SEND(xQueue) ITM_SEND(3, ITM_BLOCKING_ON_QUEUE_SEND | ((xQUEUE *) xQueue)->uxQueueNumber) + +#endif diff --git a/deck/core/deck.c b/deck/core/deck.c new file mode 100644 index 0000000000..23dab2ff95 --- /dev/null +++ b/deck/core/deck.c @@ -0,0 +1,124 @@ +/** + * || ____ _ __ + * +------+ / __ )(_) /_______________ _____ ___ + * | 0xBC | / __ / / __/ ___/ ___/ __ `/_ / / _ \ + * +------+ / /_/ / / /_/ /__/ / / /_/ / / /_/ __/ + * || || /_____/_/\__/\___/_/ \__,_/ /___/\___/ + * + * Crazyflie control firmware + * + * Copyright (C) 2015 Bitcraze AB + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, in version 3. + * + * This program 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 + * along with this program. If not, see . + * + * deck.c - Deck subsystem main entry points + */ + +#define DEBUG_MODULE "DECK_CORE" + +#include + +#include "deck.h" +#include "debug.h" + +#ifdef DEBUG + #define DECK_CORE_DBG_PRINT(fmt, ...) DEBUG_PRINT(fmt, ## __VA_ARGS__) +#else + #define DECK_CORE_DBG_PRINT(...) +#endif + +#ifndef DECK_FORCE +#define DECK_FORCE +#endif + +#define xstr(s) str(s) +#define str(s) #s + +static char* deck_force = xstr(DECK_FORCE); + +extern void deckInfoInit(); + +void deckInit() +{ + int nDecks; + int i; + + deckDriverCount(); + deckInfoInit(); + + nDecks = deckCount(); + + DEBUG_PRINT("%d deck enumerated\n", nDecks); + + for (i=0; idriver->init) { + if (deck->driver->name) { + DECK_CORE_DBG_PRINT("Calling INIT from driver %s for deck %i\n", deck->driver->name, i); + } else { + DECK_CORE_DBG_PRINT("Calling INIT for deck %i\n", i); + } + + deck->driver->init(deck); + } + } + + // Init build-forced driver + if (strlen(deck_force)>0) { + const DeckDriver *driver = deckFindDriverByName(deck_force); + if (!driver) { + DEBUG_PRINT("WARNING: compile-time forced driver '%s' not found\n", deck_force); + } else if (driver->init) { + DEBUG_PRINT("Initializing compile-time forced driver '%s'\n", deck_force); + driver->init(NULL); // Passing NULL as deck info + } + } +} + +bool deckTest() +{ + int nDecks; + int i; + bool pass = true; + + nDecks = deckCount(); + + for (i=0; idriver->test) { + if (deck->driver->test()) { + DEBUG_PRINT("Deck %i test [OK].\n", i); + } else { + DEBUG_PRINT("Deck %i test [FAIL].\n", i); + pass = false; + } + } + } + + // Test build-forced driver + if (strlen(deck_force)>0) { + const DeckDriver *driver = deckFindDriverByName(deck_force); + if (driver && driver->test) { + if (driver->test()) { + DEBUG_PRINT("Compile-time forced driver '%s' test [OK]\n", deck_force); + } else { + DEBUG_PRINT("Compile-time forced driver '%s' test [FAIL]\n", deck_force); + pass = false; + } + } + } + + return pass; +} diff --git a/deck/core/deck_drivers.c b/deck/core/deck_drivers.c new file mode 100644 index 0000000000..8ec756baa9 --- /dev/null +++ b/deck/core/deck_drivers.c @@ -0,0 +1,110 @@ +/** + * || ____ _ __ + * +------+ / __ )(_) /_______________ _____ ___ + * | 0xBC | / __ / / __/ ___/ ___/ __ `/_ / / _ \ + * +------+ / /_/ / / /_/ /__/ / / /_/ / / /_/ __/ + * || || /_____/_/\__/\___/_/ \__,_/ /___/\___/ + * + * Crazyflie control firmware + * + * Copyright (C) 2011-2012 Bitcraze AB + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, in version 3. + * + * This program 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 + * along with this program. If not, see . + * + * deck_drivers.c - Deck drivers loading and handling + */ + +#define DEBUG_MODULE "DECK_DRIVERS" + +#include +#include + +#include "deck.h" +#include "debug.h" + +#ifdef DEBUG + #define DECK_DRV_DBG_PRINT(fmt, ...) DEBUG_PRINT(fmt, ## __VA_ARGS__) +#else + #define DECK_DRV_DBG_PRINT(...) +#endif + +/* Symbols set by the linker script */ +extern const struct deck_driver * _deckDriver_start; +extern const struct deck_driver * _deckDriver_stop; + +static const struct deck_driver ** drivers; +static int driversLen; + +// Init the toc access variables. Lazy initialisation: it is going to be done +// the first time any api function is called. +static void deckdriversInit() { + static bool init = false; + if (!init) { + int i; + + drivers = &_deckDriver_start; + driversLen = &_deckDriver_stop - &_deckDriver_start; + init = true; + + DEBUG_PRINT("Found %d drivers\n", driversLen); + for (i=0; iname) { + DECK_DRV_DBG_PRINT("VID:PID %02x:%02x (%s)\n", drivers[i]->vid, drivers[i]->pid, drivers[i]->name); + } else { + DECK_DRV_DBG_PRINT("VID:PID %02x:%02x\n", drivers[i]->vid, drivers[i]->pid); + } + + } + } +} + +int deckDriverCount() { + deckdriversInit(); + + return driversLen; +} + +const struct deck_driver* deckGetDriver(int i) { + deckdriversInit(); + + if (ivid) && (pid == drivers[i]->pid)) { + return drivers[i]; + } + } + return NULL; +} + +const DeckDriver* deckFindDriverByName(char* name) { + int i; + + deckdriversInit(); + + for (i=0; iname)) { + return drivers[i]; + } + } + return NULL; +} diff --git a/deck/core/deck_info.c b/deck/core/deck_info.c new file mode 100644 index 0000000000..b2ae94dbc9 --- /dev/null +++ b/deck/core/deck_info.c @@ -0,0 +1,276 @@ +/** + * || ____ _ __ + * +------+ / __ )(_) /_______________ _____ ___ + * | 0xBC | / __ / / __/ ___/ ___/ __ `/_ / / _ \ + * +------+ / /_/ / / /_/ /__/ / / /_/ / / /_/ __/ + * || || /_____/_/\__/\___/_/ \__,_/ /___/\___/ + * + * Crazyflie control firmware + * + * Copyright (C) 2015 Bitcraze AB + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, in version 3. + * + * This program 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 + * along with this program. If not, see . + * + * deck_ow.c - Functions to decode the decks oneWire memory content + */ + +#include +#include +#include + +#define DEBUG_MODULE "DECK_INFO" + +#include "deck.h" + +#include "ow.h" +#include "crc.h" +#include "debug.h" + +#ifdef DEBUG + #define DECK_INFO_DBG_PRINT(fmt, ...) DEBUG_PRINT(fmt, ## __VA_ARGS__) +#else + #define DECK_INFO_DBG_PRINT(...) +#endif + +static int count = 0; +static DeckInfo deckInfos[DECK_MAX_COUNT]; + +static void enumerateDecks(void); + +void deckInfoInit() +{ + static bool isInit = false; + + if (isInit) return; + + enumerateDecks(); + + isInit = true; +} + +int deckCount(void) +{ + return count; +} + +DeckInfo * deckInfo(int i) +{ + if (itlv, DECK_INFO_NAME, name, 30); + + if (deck->vid) { + driver = deckFindDriverByVidPid(deck->vid, deck->pid); + } else if (strlen(name)>0) { + driver = deckFindDriverByName(name); + } + + if (driver == NULL) + driver = &dummyDriver; + + return driver; +} + +void printDeckInfo(DeckInfo *info) +{ + char name[30] = "NoName"; + char rev[10] = "NoRev"; + + if (deckTlvHasElement(&info->tlv, DECK_INFO_NAME)) { + deckTlvGetString(&info->tlv, DECK_INFO_NAME, name, 30); + } + + if (deckTlvHasElement(&info->tlv, DECK_INFO_REVISION)) { + deckTlvGetString(&info->tlv, DECK_INFO_REVISION, rev, 10); + } + + DECK_INFO_DBG_PRINT("Deck %02x:%02x %s (Rev. %s)\n", info->vid, info->pid, name, rev); + DECK_INFO_DBG_PRINT("Used pin: %08x\n", (unsigned int)info->usedPins); + + if (info->driver == &dummyDriver) { + DEBUG_PRINT("Warning! No driver found for deck.\n"); + } else { + DECK_INFO_DBG_PRINT("Driver implements: [ %s%s]\n", + info->driver->init?"init ":"", info->driver->test?"test ":""); + } +} + +static bool infoDecode(DeckInfo * info) +{ + uint8_t crcHeader; + uint8_t crcTlv; + + if (info->header != DECK_INFO_HEADER_ID) { + DEBUG_PRINT("Memory error: wrong header ID\n"); + return false; + } + + crcHeader = crcSlow(info->raw, DECK_INFO_HEADER_SIZE); + if(info->crc != crcHeader) { + DEBUG_PRINT("Memory error: incorrect header CRC\n"); + return false; + } + + if(info->raw[DECK_INFO_TLV_VERSION_POS] != DECK_INFO_TLV_VERSION) { + DEBUG_PRINT("Memory error: incorrect TLV version\n"); + return false; + } + + crcTlv = crcSlow(&info->raw[DECK_INFO_TLV_VERSION_POS], info->raw[DECK_INFO_TLV_LENGTH_POS]+2); + if(crcTlv != info->raw[DECK_INFO_TLV_DATA_POS + info->raw[DECK_INFO_TLV_LENGTH_POS]]) { + DEBUG_PRINT("Memory error: incorrect TLV CRC %x!=%x\n", (unsigned int)crcTlv, + info->raw[DECK_INFO_TLV_DATA_POS + info->raw[DECK_INFO_TLV_LENGTH_POS]]); + return false; + } + + info->tlv.data = &info->raw[DECK_INFO_TLV_DATA_POS]; + info->tlv.length = info->raw[DECK_INFO_TLV_LENGTH_POS]; + + return true; +} + +static void enumerateDecks(void) +{ + uint8_t nDecks = 0; + int i; + bool noError = true; + uint32_t usedPeriph = 0; + uint32_t usedGpio = 0; + + owInit(); + + if (owScan(&nDecks)) + { + DEBUG_PRINT("Found %d deck memor%s.\n", nDecks, nDecks>1?"ies":"y"); + } else { + DEBUG_PRINT("Error scanning for deck memories, " + "no deck drivers will be initialised\n"); + nDecks = 0; + } + + for (i = 0; i < nDecks; i++) + { + DECK_INFO_DBG_PRINT("Enumerating deck %i\n", i); + if (owRead(i, 0, sizeof(deckInfos[0].raw), (uint8_t *)&deckInfos[i])) + { + if (infoDecode(&deckInfos[i])) + { + deckInfos[i].driver = findDriver(&deckInfos[i]); + + printDeckInfo(&deckInfos[i]); + + // Check for Periph and Gpio conflict + if (usedPeriph & deckInfos[i].driver->usedPeriph) { + DEBUG_PRINT("ERROR: Driver Periph usage conflicts with a " + "previously enumerated deck driver. No decks will be " + "initialized!\n"); + noError = false; + } + + if (usedGpio & deckInfos[i].driver->usedGpio) { + DEBUG_PRINT("ERROR: Driver Gpio usage conflicts with a " + "previously enumerated deck driver. No decks will be " + "initialized!\n"); + noError = false; + } + + usedPeriph |= deckInfos[i].driver->usedPeriph; + usedGpio |= deckInfos[i].driver->usedGpio; + } else { + DEBUG_PRINT("Deck %i has corrupted OW memory. " + "No driver will be initialized!\n", i); + noError = false; + } + } + else + { + DEBUG_PRINT("Reading deck nr:%d [FAILED]. " + "No driver will be initialized!\n", i); + noError = false; + } + } + + if (noError) { + count = nDecks; + } + + return; +} + +/****** Key/value area handling ********/ +static int findType(TlvArea *tlv, int type) { + int pos = 0; + + while (pos < tlv->length) { + if (tlv->data[pos] == type) { + return pos; + } else { + pos += tlv->data[pos+1]+2; + } + } + return -1; +} + +bool deckTlvHasElement(TlvArea *tlv, int type) { + return findType(tlv, type) >= 0; +} + +int deckTlvGetString(TlvArea *tlv, int type, char *string, int length) { + int pos = findType(tlv, type); + int strlength = 0; + + if (pos >= 0) { + strlength = tlv->data[pos+1]; + + if (strlength > (length-1)) { + strlength = length-1; + } + + memcpy(string, &tlv->data[pos+2], strlength); + string[strlength] = '\0'; + + return strlength; + } else { + string[0] = '\0'; + + return -1; + } +} + +char* deckTlvGetBuffer(TlvArea *tlv, int type, int *length) { + int pos = findType(tlv, type); + if (pos >= 0) { + *length = tlv->data[pos+1]; + return (char*) &tlv->data[pos+2]; + } + + return NULL; +} + +void deckTlvGetTlv(TlvArea *tlv, int type, TlvArea *output) { + output->length = 0; + output->data = (uint8_t *)deckTlvGetBuffer(tlv, type, &output->length); +} diff --git a/deck/drivers/interface/ledring12.h b/deck/drivers/interface/ledring12.h new file mode 100644 index 0000000000..c236715c40 --- /dev/null +++ b/deck/drivers/interface/ledring12.h @@ -0,0 +1,13 @@ +#ifndef __LEDRING12_H__ +#define __LEDRING12_H__ + +#include +#include + +// For SkyRoverNano2 +#define NBR_LEDS 9 +//#define NBR_LEDS 12 + +extern uint8_t ledringmem[NBR_LEDS * 2]; + +#endif //__LEDRING12_H__ diff --git a/modules/src/bigquad.c b/deck/drivers/src/bigquad.c similarity index 74% rename from modules/src/bigquad.c rename to deck/drivers/src/bigquad.c index 82bb817b35..27126a3f8c 100644 --- a/modules/src/bigquad.c +++ b/deck/drivers/src/bigquad.c @@ -1,6 +1,6 @@ /* - * || ____ _ __ - * +------+ / __ )(_) /_______________ _____ ___ + * || ____ _ __ + * +------+ / __ )(_) /_______________ _____ ___ * | 0xBC | / __ / / __/ ___/ ___/ __ `/_ / / _ \ * +------+ / /_/ / / /_/ /__/ / / /_/ / / /_/ __/ * || || /_____/_/\__/\___/_/ \__,_/ /___/\___/ @@ -30,14 +30,14 @@ #include "stm32fxxx.h" #include "config.h" -#include "bigquad.h" #include "motors.h" #include "debug.h" +#include "deck.h" //Hardware configuration static bool isInit; -void bigquadInit() +static void bigquadInit(DeckInfo *info) { if(isInit) return; @@ -48,7 +48,7 @@ void bigquadInit() isInit = true; } -bool bigquadTest() +static bool bigquadTest() { bool status = true; @@ -59,3 +59,17 @@ bool bigquadTest() return status; } + +static const DeckDriver bigquad_deck = { + .vid = 0xBC, + .pid = 0x03, + .name = "bcBigQuad", + + .usedPeriph = DECK_USING_TIMER3, + .usedGpio = 0, // FIXME: Edit the used GPIOs + + .init = bigquadInit, + .test = bigquadTest, +}; + +DECK_DRIVER(bigquad_deck); diff --git a/deck/drivers/src/buzzdeck.c b/deck/drivers/src/buzzdeck.c new file mode 100644 index 0000000000..ae6cf973bd --- /dev/null +++ b/deck/drivers/src/buzzdeck.c @@ -0,0 +1,68 @@ +/** + * || ____ _ __ + * +------+ / __ )(_) /_______________ _____ ___ + * | 0xBC | / __ / / __/ ___/ ___/ __ `/_ / / _ \ + * +------+ / /_/ / / /_/ /__/ / / /_/ / / /_/ __/ + * || || /_____/_/\__/\___/_/ \__,_/ /___/\___/ + * + * Crazyflie control firmware + * + * Copyright (C) 2015 BitCraze AB + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, in version 3. + * + * This program 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 + * along with this program. If not, see . + * + * buzzdeck.c - Deck driver for the Crazyflie 2.0 buzzer deck + */ + +#include +#include +#include "stm32fxxx.h" + +#include "deck.h" + +#include "buzzer.h" +#include "piezo.h" + +static void buzzDeckOn(uint32_t freq) +{ + piezoSetRatio(128); + piezoSetFreq(freq); +} + +static void buzzDeckOff() +{ + piezoSetRatio(0); +} + +static struct buzzerControl buzzDeckCtrl = { + .on = buzzDeckOn, + .off = buzzDeckOff +}; + +static void buzzDeckInit(DeckInfo *info) +{ + piezoInit(); + buzzerSetControl(&buzzDeckCtrl); +} + +static const DeckDriver buzzer_deck = { + .vid = 0, + .pid = 0, + .name = "bcBuzzer", + + .usedGpio = DECK_USING_PA2 | DECK_USING_PA3, + + .init = buzzDeckInit, +}; + +DECK_DRIVER(buzzer_deck); diff --git a/deck/drivers/src/buzzer.c b/deck/drivers/src/buzzer.c new file mode 100644 index 0000000000..867783e675 --- /dev/null +++ b/deck/drivers/src/buzzer.c @@ -0,0 +1,317 @@ +/** + * || ____ _ __ + * +------+ / __ )(_) /_______________ _____ ___ + * | 0xBC | / __ / / __/ ___/ ___/ __ `/_ / / _ \ + * +------+ / /_/ / / /_/ /__/ / / /_/ / / /_/ __/ + * || || /_____/_/\__/\___/_/ \__,_/ /___/\___/ + * + * Crazyflie control firmware + * + * Copyright (C) 2012 BitCraze AB + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, in version 3. + * + * This program 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 + * along with this program. If not, see . + * + * buzzer.c: Play tones or melodies + */ + +#include +#include +#include "stm32fxxx.h" + +#include "FreeRTOS.h" +#include "timers.h" + +#include "deck.h" + +#include "param.h" +#include "pm.h" +#include "log.h" +#include "piezo.h" + +typedef void (*BuzzerEffect)(uint32_t timer); + +/** + * Credit to http://tny.cz/e525c1b2 for supplying the tones + */ +#define C0 16 +#define Db0 17 +#define D0 18 +#define Eb0 19 +#define E0 20 +#define F0 21 +#define Gb0 23 +#define G0 24 +#define Ab0 25 +#define A0 27 +#define Bb0 29 +#define B0 30 +#define C1 32 +#define Db1 34 +#define D1 36 +#define Eb1 38 +#define E1 41 +#define F1 43 +#define Gb1 46 +#define G1 49 +#define Ab1 51 +#define A1 55 +#define Bb1 58 +#define B1 61 +#define C2 65 +#define Db2 69 +#define D2 73 +#define Eb2 77 +#define E2 82 +#define F2 87 +#define Gb2 92 +#define G2 98 +#define Ab2 103 +#define A2 110 +#define Bb2 116 +#define B2 123 +#define C3 130 +#define Db3 138 +#define D3 146 +#define Eb3 155 +#define E3 164 +#define F3 174 +#define Gb3 185 +#define G3 196 +#define Ab3 207 +#define A3 220 +#define Bb3 233 +#define B3 246 +#define C4 261 +#define Db4 277 +#define D4 293 +#define Eb4 311 +#define E4 329 +#define F4 349 +#define Gb4 369 +#define G4 392 +#define Ab4 415 +#define A4 440 +#define Bb4 466 +#define B4 493 +#define C5 523 +#define Db5 554 +#define D5 587 +#define Eb5 622 +#define E5 659 +#define F5 698 +#define Gb5 739 +#define G5 783 +#define Ab5 830 +#define A5 880 +#define Bb5 932 +#define B5 987 +#define C6 1046 +#define Db6 1108 +#define D6 1174 +#define Eb6 1244 +#define E6 1318 +#define F6 1396 +#define Gb6 1479 +#define G6 1567 +#define Ab6 1661 +#define A6 1760 +#define Bb6 1864 +#define B6 1975 +#define C7 2093 +#define Db7 2217 +#define D7 2349 +#define Eb7 2489 +#define E7 2637 +#define F7 2793 +#define Gb7 2959 +#define G7 3135 +#define Ab7 3322 +#define A7 3520 +#define Bb7 3729 +#define B7 3951 +#define C8 4186 +#define Db8 4434 +#define D8 4698 +#define Eb8 4978 +/* Duration of notes */ +#define W (60) +#define H (W * 2) +#define Q (W * 4) +#define E (W * 8) +#define S (W * 16) +#define ES (W*6) + + +typedef struct { + uint16_t tone; + uint16_t duration; +} Note; + +typedef struct { + uint32_t bpm; + uint32_t ni; + uint32_t delay; + Note notes[80]; +} Melody; + +Melody melodies[] = { + {.bpm = 120, .ni = 0, .delay = 1, .notes = {{C4, H}, {D4, H}, {E4, H}, {F4, H}, {G4, H}, {A4, H}, {B4, H}, {0xFF, 0}}}, + {.bpm = 120, .ni = 0, .delay = 1, .notes = {{C4, S}, {D4, S}, {E4, S}, {F4, S}, {G4, S}, {A4, S}, {B4, S}, {0xFF, 0}}}, + /* Imperial march from http://tny.cz/e525c1b2A */ + {.bpm = 120, .ni = 0, .delay = 1, .notes = {{A3, Q}, {A3, Q}, {A3, Q},{F3, ES}, {C4, S}, + {A3, Q}, {F3, ES}, {C4, S}, {A3, H}, + {E4, Q}, {E4, Q}, {E4, Q}, {F4, ES}, {C4, S}, + {Ab3, Q}, {F3, ES}, {C4, S}, {A3, H}, + {A4, Q}, {A3, ES}, {A3, S}, {A4, Q}, {Ab4, ES}, {G4, S}, + {Gb4, S}, {E4, S}, {F4, E}, {0, E}, {Bb3, E}, {Eb4, Q}, {D4, ES}, {Db4, S}, + {C4, S}, {B3, S}, {C4, E}, {0, E}, {F3, E}, {Ab3, Q}, {F3, ES}, {A3, S}, + {C4, Q}, {A3, ES}, {C4, S}, {E4, H}, + {A4, Q}, {A3, ES}, {A3, S}, {A4, Q}, {Ab4, ES}, {G4, S}, + {Gb4, S}, {E4, S}, {F4, E}, {0, E}, {Bb3, E}, {Eb4, Q}, {D4, ES}, {Db4, S}, + {Gb4, S}, {E4, S}, {F4, E}, {0, E}, {Bb3, E}, {Eb4, Q}, {D4, ES}, {Db4, S}, + {C4,S}, {B3, S}, {C4, E}, {0, E}, {F3, E}, {Ab3, Q}, {F3, ES}, {C4, S}, + {A3, Q}, {F3, ES}, {C4, S}, {A3, H}, {0, H}, + {0xFF, 0}}} + +}; + +uint8_t melody = 2; +uint8_t nmelody = 3; +unsigned int mcounter = 0; +static bool playing_sound = false; +static void melodyplayer(uint32_t counter) { + // Sync one melody for the loop + Melody* m = &melodies[melody]; + if (mcounter == 0) { + if (m->notes[m->ni].tone == 0xFF) + { + // Loop the melody + m->ni = 0; + } + // Play current note + piezoSetFreq(m->notes[m->ni].tone); + piezoSetRatio(127); + mcounter = (m->bpm * 100) / m->notes[m->ni].duration; + playing_sound = true; + m->ni++; + } + else if (mcounter == 1) + { + piezoSetRatio(0); + } + mcounter--; +} + +uint8_t static_ratio = 0; +uint16_t static_freq = 4000; +static void bypass(uint32_t counter) +{ + /* Just set the params from the host */ + piezoSetRatio(static_ratio); + piezoSetFreq(static_freq); +} + +uint16_t siren_start = 2000; +uint16_t siren_freq = 2000; +uint16_t siren_stop = 4000; +int16_t siren_step = 40; +static void siren(uint32_t counter) +{ + siren_freq += siren_step; + if (siren_freq > siren_stop) + { + siren_step *= -1; + siren_freq = siren_stop; + } + if (siren_freq < siren_start) + { + siren_step *= -1; + siren_freq = siren_start; + } + piezoSetRatio(127); + piezoSetFreq(siren_freq); +} + + +static int pitchid; +static int rollid; +static int pitch; +static int roll; +static int tilt_freq; +static int tilt_ratio; +static void tilt(uint32_t counter) +{ + pitchid = logGetVarId("stabilizer", "pitch"); + rollid = logGetVarId("stabilizer", "roll"); + + pitch = logGetInt(pitchid); + roll = logGetInt(rollid); + tilt_freq = 0; + tilt_ratio = 127; + + if (abs(pitch) > 5) { + tilt_freq = 3000 - 50 * pitch; + } + + piezoSetRatio(tilt_ratio); + piezoSetFreq(tilt_freq); +} + + +unsigned int neffect = 0; +unsigned int effect = 3; +BuzzerEffect effects[] = {bypass, siren, melodyplayer, tilt}; + +static xTimerHandle timer; +static uint32_t counter = 0; + +static void buzzTimer(xTimerHandle timer) +{ + counter++; + + if (effects[effect] != 0) + effects[effect](counter*10); +} + +static void buzzerInit(DeckInfo *info) +{ + piezoInit(); + + neffect = sizeof(effects)/sizeof(effects[0])-1; + nmelody = sizeof(melodies)/sizeof(melodies[0])-1; + + timer = xTimerCreate( "buzztimer", M2T(10), + pdTRUE, NULL, buzzTimer ); + xTimerStart(timer, 100); +} + +PARAM_GROUP_START(buzzer) +PARAM_ADD(PARAM_UINT8, effect, &effect) +PARAM_ADD(PARAM_UINT32 | PARAM_RONLY, neffect, &neffect) +PARAM_ADD(PARAM_UINT8, melody, &melody) +PARAM_ADD(PARAM_UINT32 | PARAM_RONLY, nmelody, &melody) +PARAM_ADD(PARAM_UINT16, freq, &static_freq) +PARAM_ADD(PARAM_UINT8, ratio, &static_ratio) +PARAM_GROUP_STOP(buzzer) + +static const DeckDriver buzzer_deck = { + .vid = 0, + .pid = 0, + .name = "bcBuzzer", + + .usedGpio = DECK_USING_PA2 | DECK_USING_PA3, + + .init = buzzerInit, +}; + +DECK_DRIVER(buzzer_deck); diff --git a/modules/src/exptest.c b/deck/drivers/src/exptest.c similarity index 93% rename from modules/src/exptest.c rename to deck/drivers/src/exptest.c index d5e887b56b..ba1dad40f0 100644 --- a/modules/src/exptest.c +++ b/deck/drivers/src/exptest.c @@ -1,6 +1,6 @@ /* - * || ____ _ __ - * +------+ / __ )(_) /_______________ _____ ___ + * || ____ _ __ + * +------+ / __ )(_) /_______________ _____ ___ * | 0xBC | / __ / / __/ ___/ ___/ __ `/_ / / _ \ * +------+ / /_/ / / /_/ /__/ / / /_/ / / /_/ __/ * || || /_____/_/\__/\___/_/ \__,_/ /___/\___/ @@ -30,8 +30,10 @@ #include "stm32fxxx.h" #include "config.h" -#include "exptest.h" #include "debug.h" +#include "deck.h" + +#include "imu.h" //Hardware configuration #define ET_GPIO_PERIF (RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_GPIOC) @@ -101,13 +103,15 @@ static bool isInit; static bool exptestTestAllPins(bool test); static bool exptestTestPin(EtGpio *etPin, bool test); -bool exptestRun(void) +static bool exptestRun(void) { int i; volatile int delay; bool status = true; isInit = true; + status &= imu6ManufacturingTest(); + GPIO_InitTypeDef GPIO_InitStructure; // Enable GPIOs @@ -211,3 +215,15 @@ static bool exptestTestPin(EtGpio *etPin, bool test) return false; } } + +static const DeckDriver exptest_deck = { + .vid = 0xBC, + .pid = 0xFF, + .name = "bcExpTest", + + .usedGpio = 0, // FIXME: Edit the used GPIOs + + .test = exptestRun, +}; + +DECK_DRIVER(exptest_deck); diff --git a/modules/src/neopixelring.c b/deck/drivers/src/ledring12.c similarity index 89% rename from modules/src/neopixelring.c rename to deck/drivers/src/ledring12.c index 56f2c53478..9fb4ee001f 100644 --- a/modules/src/neopixelring.c +++ b/deck/drivers/src/ledring12.c @@ -21,19 +21,23 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . * - * neopixelring.c: NeoPixel Ring 12 Leds effects/driver + * ledring12.c: RGB Ring 12 Leds effects/driver */ -#include "neopixelring.h" +#include "ledring12.h" #include #include +#include #include "stm32fxxx.h" +#include "deck.h" + #include "FreeRTOS.h" #include "timers.h" +#include "ledring12.h" #include "ws2812.h" #include "worker.h" #include "param.h" @@ -56,12 +60,10 @@ * system. See tiltEffect for an example. */ +typedef void (*Ledring12Effect)(uint8_t buffer[][3], bool reset); /**************** Some useful macros ***************/ -// For SkyRoverNano2 -//#define NBR_LEDS 12 -#define NBR_LEDS 9 #define RED {0x10, 0x00, 0x00} #define GREEN {0x00, 0x10, 0x00} #define BLUE {0x00, 0x00, 0x10} @@ -78,7 +80,7 @@ #define LINSCALE(domain_low, domain_high, codomain_low, codomain_high, value) ((codomain_high - codomain_low) / (domain_high - domain_low)) * (value - domain_low) + codomain_low #define SET_WHITE(dest, intensity) dest[0] = intensity; dest[1] = intensity; dest[2] = intensity; -static uint32_t effect = 9; +static uint32_t effect = 6; static uint32_t neffect; static uint8_t headlightEnable = 0; static uint8_t black[][3] = {BLACK, BLACK, BLACK, @@ -87,6 +89,14 @@ static uint8_t black[][3] = {BLACK, BLACK, BLACK, BLACK, BLACK, BLACK, }; +static const uint8_t green[] = {0x00, 0xFF, 0x00}; +static const uint8_t red[] = {0xFF, 0x00, 0x00}; +static const uint8_t blue[] = {0x00, 0x00, 0xFF}; +static const uint8_t white[] = WHITE; +static const uint8_t part_black[] = BLACK; + +uint8_t ledringmem[NBR_LEDS * 2]; + /**************** Black (LEDs OFF) ***************/ static void blackEffect(uint8_t buffer[][3], bool reset) @@ -167,11 +177,30 @@ static void solidColorEffect(uint8_t buffer[][3], bool reset) } } -static const uint8_t green[] = {0x00, 0xFF, 0x00}; -static const uint8_t red[] = {0xFF, 0x00, 0x00}; -static const uint8_t blue[] = {0x00, 0x00, 0xFF}; -static const uint8_t white[] = WHITE; -static const uint8_t part_black[] = BLACK; +static void virtualMemEffect(uint8_t buffer[][3], bool reset) +{ + int i; + + if (reset) + { + for (i=0; i> 3; + G6 = ((led[i][0] & 0x07) << 3) | (led[i][1] >> 5); + B5 = led[i][1] & 0x1F; + buffer[i][0] = ((uint16_t)R5 * 527 + 23 ) >> 6; + buffer[i][1] = ((uint16_t)G6 * 259 + 33 ) >> 6; + buffer[i][2] = ((uint16_t)B5 * 527 + 23 ) >> 6; + } +} static void boatEffect(uint8_t buffer[][3], bool reset) { @@ -536,34 +565,30 @@ static void siren(uint8_t buffer[][3], bool reset) /**************** Effect list ***************/ -NeopixelRingEffect effectsFct[] = {blackEffect, - whiteSpinEffect, - colorSpinEffect, - tiltEffect, - brightnessEffect, - spinEffect2, - doubleSpinEffect, - solidColorEffect, - ledTestEffect, - batteryChargeEffect, - boatEffect, - siren, - gravityLight - }; //TODO Add more +Ledring12Effect effectsFct[] = +{ + blackEffect, + whiteSpinEffect, + colorSpinEffect, + tiltEffect, + brightnessEffect, + spinEffect2, + doubleSpinEffect, + solidColorEffect, + ledTestEffect, + batteryChargeEffect, + boatEffect, + siren, + gravityLight, + virtualMemEffect, +}; //TODO Add more -/* -NeopixelRingEffect effectsFct[] = {blackEffect, - doubleSpinEffect, - solidColorEffect, - }; -*/ /********** Ring init and switching **********/ - static xTimerHandle timer; -void neopixelringWorker(void * data) +void ledring12Worker(void * data) { static int current_effect = 0; static uint8_t buffer[NBR_LEDS][3]; @@ -587,26 +612,27 @@ void neopixelringWorker(void * data) extern bool imu6IsCalibrated(void); -static void neopixelringTimer(xTimerHandle timer) +static void ledring12Timer(xTimerHandle timer) { + #if 1 // for SkyRoverNano2 if( imu6IsCalibrated() ) { - workerSchedule(neopixelringWorker, NULL); + workerSchedule(ledring12Worker, NULL); } else { ws2812Send(black, NBR_LEDS); } #else - workerSchedule(neopixelringWorker, NULL); + workerSchedule(ledring12Worker, NULL); #endif setHeadlightsOn(headlightEnable); } -void neopixelringInit(void) +static void ledring12Init(DeckInfo *info) { GPIO_InitTypeDef GPIO_InitStructure; @@ -620,8 +646,8 @@ void neopixelringInit(void) GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4; GPIO_Init(GPIOB, &GPIO_InitStructure); - timer = xTimerCreate( (const signed char *)"ringTimer", M2T(55), - pdTRUE, NULL, neopixelringTimer ); + timer = xTimerCreate( "ringTimer", M2T(50), + pdTRUE, NULL, ledring12Timer ); xTimerStart(timer, 100); } @@ -636,3 +662,16 @@ PARAM_ADD(PARAM_FLOAT, glowstep, &glowstep) PARAM_ADD(PARAM_FLOAT, emptyCharge, &emptyCharge) PARAM_ADD(PARAM_FLOAT, fullCharge, &fullCharge) PARAM_GROUP_STOP(ring) + +static const DeckDriver ledring12_deck = { + .vid = 0xBC, + .pid = 0x01, + .name = "bcLedRing", + + .usedPeriph = DECK_USING_TIMER3, + .usedGpio = DECK_USING_IO_2 | DECK_USING_IO_3, + + .init = ledring12Init, +}; + +DECK_DRIVER(ledring12_deck); diff --git a/deck/interface/deck.h b/deck/interface/deck.h index a7d3176581..5a53af82c5 100644 --- a/deck/interface/deck.h +++ b/deck/interface/deck.h @@ -3,6 +3,10 @@ #ifndef __DECK_H__ #define __DECK_H__ +/* Core: handles initialisation, discovery and drivers */ +#include "deck_core.h" + +/* Deck APIs */ #include "deck_contants.h" #include "deck_digital.h" #include "deck_analog.h" diff --git a/deck/interface/deck_core.h b/deck/interface/deck_core.h new file mode 100644 index 0000000000..5037d451ef --- /dev/null +++ b/deck/interface/deck_core.h @@ -0,0 +1,164 @@ +/** + * || ____ _ __ + * +------+ / __ )(_) /_______________ _____ ___ + * | 0xBC | / __ / / __/ ___/ ___/ __ `/_ / / _ \ + * +------+ / /_/ / / /_/ /__/ / / /_/ / / /_/ __/ + * || || /_____/_/\__/\___/_/ \__,_/ /___/\___/ + * + * Crazyflie control firmware + * + * Copyright (C) 2011-2012 Bitcraze AB + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, in version 3. + * + * This program 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 + * along with this program. If not, see . + * + * deck_core.h - Definitions and interface to handle deck init and drivers + * Implementation is in deck.c, deck_info.c and deck_drivers.c + */ + +#ifndef __DECK_CODE_H__ +#define __DECK_CODE_H__ + + +#include +#include + +/* Maximum number of decks that can be enumerated */ +#define DECK_MAX_COUNT 4 + +/* Main functions to init and test the decks, called during system initialisation */ +void deckInit(void); +bool deckTest(void); + +/***** Driver TOC definitions ******/ + +/* Used peripherals */ +#define DECK_USING_UART1 (1<<0) +#define DECK_USING_UART2 (1<<1) +#define DECK_USING_SPI (1<<2) +#define DECK_USING_TIMER3 (1<<3) + +/* Used GPIO */ +#define DECK_USING_PC11 (1<<0) +#define DECK_USING_RX1 (1<<0) +#define DECK_USING_PC10 (1<<1) +#define DECK_USING_TX1 (1<<1) +#define DECK_USING_PB7 (1<<2) +#define DECK_USING_SDA (1<<2) +#define DECK_USING_PB6 (1<<3) +#define DECK_USING_SCL (1<<3) +#define DECK_USING_PB8 (1<<4) +#define DECK_USING_IO_1 (1<<4) +#define DECK_USING_PB5 (1<<5) +#define DECK_USING_IO_2 (1<<5) +#define DECK_USING_PB4 (1<<6) +#define DECK_USING_IO_3 (1<<6) +#define DECK_USING_PC12 (1<<7) +#define DECK_USING_IO_4 (1<<7) +#define DECK_USING_PA2 (1<<8) +#define DECK_USING_TX2 (1<<8) +#define DECK_USING_PA3 (1<<9) +#define DECK_USING_RX2 (1<<9) +#define DECK_USING_PA5 (1<<10) +#define DECK_USING_SCK (1<<10) +#define DECK_USING_PA6 (1<<11) +#define DECK_USING_MISO (1<<11) +#define DECK_USING_PA7 (1<<12) +#define DECK_USING_MOSI (1<<12) + +struct deckInfo_s; + +/* Structure definition and registering macro */ +typedef struct deck_driver { + /* Identification of the deck (written in the board) */ + uint8_t vid; + uint8_t pid; + char *name; + + /* Periphreal and Gpio used _dirrectly_ by the driver */ + uint32_t usedPeriph; + uint32_t usedGpio; + + /* Init and test functions */ + void (*init)(struct deckInfo_s *); + bool (*test)(void); +} DeckDriver; + +#define DECK_DRIVER(NAME) const struct deck_driver * driver_##NAME __attribute__((section(".deckDriver." #NAME), used)) = &(NAME) + +/****** Deck_info *******/ + +#define DECK_INFO_HEADER_ID 0xeb +#define DECK_INFO_HEADER_SIZE 7 +#define DECK_INFO_TLV_VERSION 0 +#define DECK_INFO_TLV_VERSION_POS 8 +#define DECK_INFO_TLV_LENGTH_POS 9 +#define DECK_INFO_TLV_DATA_POS 10 + +typedef struct { + uint8_t *data; + int length; +} TlvArea; + +typedef struct deckInfo_s { + + union { + struct { + uint8_t header; + uint32_t usedPins; + uint8_t vid; + uint8_t pid; + uint8_t crc; + + uint8_t rawTlv[104]; + } __attribute__((packed)); + + uint8_t raw[112]; + }; + + TlvArea tlv; + const DeckDriver *driver; +} DeckInfo; + +int deckCount(void); + +DeckInfo * deckInfo(int i); + +/* Key/value area handling */ +bool deckTlvHasElement(TlvArea *tlv, int type); + +int deckTlvGetString(TlvArea *tlv, int type, char *string, int maxLength); + +char* deckTlvGetBuffer(TlvArea *tlv, int type, int *length); + +void deckTlvGetTlv(TlvArea *tlv, int type, TlvArea *output); + +/* Defined Types */ +#define DECK_INFO_NAME 1 +#define DECK_INFO_REVISION 2 +#define DECK_INFO_CUSTOMDATA 3 + +/***** Drivers introspection API ******/ + +/* Returns the number of driver registered */ +int deckDriverCount(); + +/* Returns one driver definition */ +const struct deck_driver* deckGetDriver(int i); + +/* Find driver by pid/vid */ +const struct deck_driver* deckFindDriverByVidPid(uint8_t vid, uint8_t pid); + +/*find driver by name */ +const struct deck_driver* deckFindDriverByName(char* name); + +#endif //__DECK_CODE_H__ diff --git a/drivers/interface/i2cdev.h b/drivers/interface/i2cdev.h index e74bff51c5..afe35086b9 100644 --- a/drivers/interface/i2cdev.h +++ b/drivers/interface/i2cdev.h @@ -31,12 +31,7 @@ #include #include -//#if defined (STM32F40_41xxx) #include "cpal.h" -//#else -//#include "stm32f10x_i2c.h" -//#endif - // Delay is approx 0.2us per loop @64Mhz #define I2CDEV_LOOPS_PER_US 5 diff --git a/drivers/interface/piezo.h b/drivers/interface/piezo.h new file mode 100644 index 0000000000..fa89cfd4c9 --- /dev/null +++ b/drivers/interface/piezo.h @@ -0,0 +1,66 @@ +/** + * || ____ _ __ + * +------+ / __ )(_) /_______________ _____ ___ + * | 0xBC | / __ / / __/ ___/ ___/ __ `/_ / / _ \ + * +------+ / /_/ / / /_/ /__/ / / /_/ / / /_/ __/ + * || || /_____/_/\__/\___/_/ \__,_/ /___/\___/ + * + * Crazyflie control firmware + * + * Copyright (C) 2011-2012 Bitcraze AB + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, in version 3. + * + * This program 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 + * along with this program. If not, see . + * + * Motors.h - Motor driver header file + * + * The motors PWM ratio is a value on 16 bits (from 0 to 0xFFFF) + * the functions of the driver will make the conversions to the actual PWM + * precision (ie. if the precision is 8bits 0xFFFF and 0xFF00 are equivalents). + * + * The precision is set in number of bits by the define MOTORS_PWM_BITS + * The timer prescaler is set by MOTORS_PWM_PRESCALE + */ +#ifndef __PIEZO_H__ +#define __PIEZO_H__ + +#include +#include +#include "config.h" + +/******** Defines ********/ + +/*** Public interface ***/ + +/** + * Piezo Initialization. Configures two output compare channels in PWM mode + * with one of them inverted to increase power output. + */ +void piezoInit(); + +/** + * Test of the motor modules. The test will spin each motor very short in + * the sequence M1 to M4. + */ +bool piezoTest(void); + +/** + * Set piezo ratio/power. + */ +void piezoSetRatio(uint8_t ratio); + +/** + * Set piezo frequency in hertz. + */ +void piezoSetFreq(uint16_t freq); + +#endif /* __MOTORS_H__ */ diff --git a/drivers/interface/watchdog.h b/drivers/interface/watchdog.h new file mode 100644 index 0000000000..1afd5f218c --- /dev/null +++ b/drivers/interface/watchdog.h @@ -0,0 +1,44 @@ +/** + * || ____ _ __ + * +------+ / __ )(_) /_______________ _____ ___ + * | 0xBC | / __ / / __/ ___/ ___/ __ `/_ / / _ \ + * +------+ / /_/ / / /_/ /__/ / / /_/ / / /_/ __/ + * || || /_____/_/\__/\___/_/ \__,_/ /___/\___/ + * + * Crazyflie Firmware + * + * Copyright (C) Bitcraze AB + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, in version 3. + * + * This program 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 + * along with this program. If not, see . + * + * @file watchdog.h - Hardware watchdog + * + */ +#ifndef WATCHDOG_H_ +#define WATCHDOG_H_ + +#include +#include "stm32fxxx.h" + +#define WATCHDOG_CLOCK_FRQ 1024 +#define WATCHDOG_TIMEOUT_MS 100 +#define WATCHDOG_RESET_PERIOD_MS 80 +#define WATCHDOG_TIMEOUT_CYCLES ((WATCHDOG_CLOCK_FRQ * WATCHDOG_TIMEOUT_MS) / 1000) + + +void watchdogInit(void); +bool watchdogNormalStartTest(void); +#define watchdogReset() (IWDG_ReloadCounter()) + +#endif // WATCHDOG_H_ + diff --git a/drivers/src/adc_f103.c b/drivers/src/adc_f103.c index 1ea6eb0b33..ed29759bf5 100644 --- a/drivers/src/adc_f103.c +++ b/drivers/src/adc_f103.c @@ -1,6 +1,6 @@ /** - * || ____ _ __ - * +------+ / __ )(_) /_______________ _____ ___ + * || ____ _ __ + * +------+ / __ )(_) /_______________ _____ ___ * | 0xBC | / __ / / __/ ___/ ___/ __ `/_ / / _ \ * +------+ / /_/ / / /_/ /__/ / / /_/ / / /_/ __/ * || || /_____/_/\__/\___/_/ \__,_/ /___/\___/ @@ -209,8 +209,8 @@ void adcInit(void) adcQueue = xQueueCreate(1, sizeof(AdcGroup*)); - xTaskCreate(adcTask, (const signed char * const)"ADC", - configMINIMAL_STACK_SIZE, NULL, /*priority*/3, NULL); + xTaskCreate(adcTask, ADC_TASK_NAME, + ADC_TASK_STACKSIZE, NULL, ADC_TASK_PRI, NULL); isInit = true; } diff --git a/drivers/src/i2cdev_f103.c b/drivers/src/i2cdev_f103.c index 6158239e43..2401eeca5f 100644 --- a/drivers/src/i2cdev_f103.c +++ b/drivers/src/i2cdev_f103.c @@ -34,10 +34,6 @@ #include "FreeRTOS.h" #include "semphr.h" -#include "task.h" - -#include "led.h" -#include "ledseq.h" #include "stm32f10x.h" diff --git a/drivers/src/i2cdev_f405.c b/drivers/src/i2cdev_f405.c index 03e8926dee..8e418597f5 100644 --- a/drivers/src/i2cdev_f405.c +++ b/drivers/src/i2cdev_f405.c @@ -37,9 +37,6 @@ #include "semphr.h" #include "task.h" -#include "led.h" -#include "ledseq.h" - #include "debug.h" #include "cpal.h" #include "cpal_i2c.h" @@ -71,10 +68,12 @@ xSemaphoreHandle i2cdevDmaEventI2c3; static bool i2cdevWriteTransfer(I2C_Dev *dev); static bool i2cdevReadTransfer(I2C_Dev *dev); static inline void i2cdevRuffLoopDelay(uint32_t us); -static void i2cdevReleaseSemaphoreI2C1(void); -static void i2cdevReleaseSemaphoreI2C2(void); -static void i2cdevReleaseSemaphoreI2C3(void); +#define SEMAPHORE_TIMEOUT M2T(30) +static void semaphoreGiveFromISR(xSemaphoreHandle semaphore); +static void i2cDevTakeSemaphore(CPAL_DevTypeDef CPAL_Dev); +static void i2cDevGiveSemaphore(CPAL_DevTypeDef CPAL_Dev); +static xSemaphoreHandle getSemaphore(CPAL_DevTypeDef CPAL_Dev); int i2cdevInit(I2C_Dev *dev) { @@ -172,18 +171,7 @@ static bool i2cdevReadTransfer(I2C_Dev *dev) if (status == CPAL_PASS) { - if (dev == I2C1_DEV) - { - xSemaphoreTake(i2cdevDmaEventI2c1, M2T(30)); - } - else if (dev == I2C2_DEV) - { - xSemaphoreTake(i2cdevDmaEventI2c2, M2T(30)); - } - else if (dev == I2C3_DEV) - { - xSemaphoreTake(i2cdevDmaEventI2c3, M2T(30)); - } + i2cDevTakeSemaphore(dev->CPAL_Dev); //TODO: Remove spin loop below. It does not work without it at the moment while(dev->CPAL_State != CPAL_STATE_READY && dev->CPAL_State != CPAL_STATE_ERROR); @@ -271,18 +259,7 @@ static bool i2cdevWriteTransfer(I2C_Dev *dev) if (status == CPAL_PASS) { - if (dev == I2C1_DEV) - { - xSemaphoreTake(i2cdevDmaEventI2c1, M2T(30)); - } - else if (dev == I2C2_DEV) - { - xSemaphoreTake(i2cdevDmaEventI2c2, M2T(30)); - } - else if (dev == I2C3_DEV) - { - xSemaphoreTake(i2cdevDmaEventI2c3, M2T(30)); - } + i2cDevTakeSemaphore(dev->CPAL_Dev); //TODO: Remove spin loop below. It does not work without it at the moment while(dev->CPAL_State != CPAL_STATE_READY && dev->CPAL_State != CPAL_STATE_ERROR); @@ -334,39 +311,51 @@ void i2cdevUnlockBus(GPIO_TypeDef* portSCL, GPIO_TypeDef* portSDA, uint16_t pinS GPIO_WAIT_FOR_HIGH(portSDA, pinSDA, 10 * I2CDEV_LOOPS_PER_MS); } -static void i2cdevReleaseSemaphoreI2C1(void) + +static void semaphoreGiveFromISR(xSemaphoreHandle semaphore) { portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE; - xSemaphoreGiveFromISR(i2cdevDmaEventI2c1, &xHigherPriorityTaskWoken); + xSemaphoreGiveFromISR(semaphore, &xHigherPriorityTaskWoken); if(xHigherPriorityTaskWoken) { - vPortYieldFromISR(); + portYIELD(); } } -static void i2cdevReleaseSemaphoreI2C2(void) -{ - portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE; - xSemaphoreGiveFromISR(i2cdevDmaEventI2c2, &xHigherPriorityTaskWoken); +static xSemaphoreHandle getSemaphore(CPAL_DevTypeDef CPAL_Dev) { + xSemaphoreHandle result = NULL; - if(xHigherPriorityTaskWoken) - { - vPortYieldFromISR(); + if (CPAL_Dev == (I2C1_DEV)->CPAL_Dev) { + result = i2cdevDmaEventI2c1; + } else if (CPAL_Dev == (I2C2_DEV)->CPAL_Dev) { + result = i2cdevDmaEventI2c2; + } else if (CPAL_Dev == (I2C3_DEV)->CPAL_Dev) { + result = i2cdevDmaEventI2c3; + } else { + ASSERT_FAILED(); } + + return result; } -static void i2cdevReleaseSemaphoreI2C3(void) -{ - portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE; - xSemaphoreGiveFromISR(i2cdevDmaEventI2c3, &xHigherPriorityTaskWoken); +static void i2cDevTakeSemaphore(CPAL_DevTypeDef CPAL_Dev) { + xSemaphoreHandle semaphore = getSemaphore(CPAL_Dev); + xSemaphoreTake(semaphore, SEMAPHORE_TIMEOUT); +} - if(xHigherPriorityTaskWoken) - { - vPortYieldFromISR(); +static void i2cDevGiveSemaphore(CPAL_DevTypeDef CPAL_Dev) +{ + xSemaphoreHandle semaphore = getSemaphore(CPAL_Dev); + bool isInInterrupt = (SCB->ICSR & SCB_ICSR_VECTACTIVE_Msk) != 0; + + if (isInInterrupt) { + semaphoreGiveFromISR(semaphore); + } else { + xSemaphoreGive(semaphore); } } @@ -380,7 +369,20 @@ static void i2cdevReleaseSemaphoreI2C3(void) */ void CPAL_I2C_ERR_UserCallback(CPAL_DevTypeDef pDevInstance, uint32_t DeviceError) { - DEBUG_PRINT("Error callback nr: %i\n", (int)DeviceError); + DEBUG_PRINT("I2C error callback dev: %i, err: %i\n", (int)pDevInstance , (int)DeviceError); + i2cDevGiveSemaphore(pDevInstance); +} + +/** + * @brief User callback that manages the Timeout error. + * NOTE: This method is called from both interrupts and tasks! + * @param pDevInitStruct . + * @retval None. + */ +uint32_t CPAL_TIMEOUT_UserCallback(CPAL_InitTypeDef* pDevInitStruct) { + DEBUG_PRINT("I2C timeout callback dev: %i\n", (int)pDevInitStruct->CPAL_Dev); + i2cDevGiveSemaphore(pDevInitStruct->CPAL_Dev); + return CPAL_PASS; } /** @@ -390,18 +392,7 @@ void CPAL_I2C_ERR_UserCallback(CPAL_DevTypeDef pDevInstance, uint32_t DeviceErro */ void CPAL_I2C_TXTC_UserCallback(CPAL_InitTypeDef* pDevInitStruct) { - if (pDevInitStruct == I2C1_DEV) - { - i2cdevReleaseSemaphoreI2C1(); - } - else if (pDevInitStruct == I2C2_DEV) - { - i2cdevReleaseSemaphoreI2C2(); - } - else if (pDevInitStruct == I2C3_DEV) - { - i2cdevReleaseSemaphoreI2C3(); - } + i2cDevGiveSemaphore(pDevInitStruct->CPAL_Dev); } /** @@ -411,16 +402,7 @@ void CPAL_I2C_TXTC_UserCallback(CPAL_InitTypeDef* pDevInitStruct) */ void CPAL_I2C_RXTC_UserCallback(CPAL_InitTypeDef* pDevInitStruct) { - if (pDevInitStruct == I2C1_DEV) - { - i2cdevReleaseSemaphoreI2C1(); - } - else if (pDevInitStruct == I2C2_DEV) - { - i2cdevReleaseSemaphoreI2C2(); - } - else if (pDevInitStruct == I2C3_DEV) - { - i2cdevReleaseSemaphoreI2C3(); - } + i2cDevGiveSemaphore(pDevInitStruct->CPAL_Dev); } + + diff --git a/drivers/src/i2croutines.c b/drivers/src/i2croutines.c index 4b37a172f2..5034ce28ec 100644 --- a/drivers/src/i2croutines.c +++ b/drivers/src/i2croutines.c @@ -362,12 +362,12 @@ void I2C_LowLevel_Init(I2C_TypeDef* I2Cx) RCC_APB1PeriphResetCmd(RCC_APB1Periph_I2C1, DISABLE); NVIC_InitStructure.NVIC_IRQChannel = I2C1_EV_IRQn; - NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = NVIC_I2C_PRI; + NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = NVIC_I2C_HIGH_PRI; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); NVIC_InitStructure.NVIC_IRQChannel = I2C1_ER_IRQn; - NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = NVIC_I2C_PRI + 1; + NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = NVIC_I2C_LOW_PRI; NVIC_Init(&NVIC_InitStructure); } else /* I2Cx = I2C2 */ @@ -390,12 +390,12 @@ void I2C_LowLevel_Init(I2C_TypeDef* I2Cx) RCC_APB1PeriphResetCmd(RCC_APB1Periph_I2C2, DISABLE); NVIC_InitStructure.NVIC_IRQChannel = I2C2_EV_IRQn; - NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = NVIC_I2C_PRI; + NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = NVIC_I2C_HIGH_PRI; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); NVIC_InitStructure.NVIC_IRQChannel = I2C2_ER_IRQn; - NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = NVIC_I2C_PRI + 1; + NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = NVIC_I2C_LOW_PRI; NVIC_Init(&NVIC_InitStructure); } diff --git a/drivers/src/led_f103.c b/drivers/src/led_f103.c index d0f95c4456..915b11f090 100644 --- a/drivers/src/led_f103.c +++ b/drivers/src/led_f103.c @@ -32,7 +32,6 @@ /*FreeRtos includes*/ #include "FreeRTOS.h" -#include "task.h" static bool isInit=false; diff --git a/drivers/src/motors.c b/drivers/src/motors.c index 52ff33785f..cf7254531a 100644 --- a/drivers/src/motors.c +++ b/drivers/src/motors.c @@ -35,7 +35,6 @@ #include "pm.h" //FreeRTOS includes -#include "FreeRTOS.h" #include "task.h" static uint16_t motorsBLConvBitsTo16(uint16_t bits); diff --git a/drivers/src/piezo.c b/drivers/src/piezo.c new file mode 100644 index 0000000000..6193e4fc68 --- /dev/null +++ b/drivers/src/piezo.c @@ -0,0 +1,147 @@ +/** + * || ____ _ __ + * +------+ / __ )(_) /_______________ _____ ___ + * | 0xBC | / __ / / __/ ___/ ___/ __ `/_ / / _ \ + * +------+ / /_/ / / /_/ /__/ / / /_/ / / /_/ __/ + * || || /_____/_/\__/\___/_/ \__,_/ /___/\___/ + * + * Crazyflie control firmware + * + * Copyright (C) 2011-2012 Bitcraze AB + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, in version 3. + * + * This program 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 + * along with this program. If not, see . + * + * piezo.c - Piezo/Buzzer driver + * + * This code mainly interfacing the PWM peripheral lib of ST. + */ + +#include + +/* ST includes */ +#include "stm32fxxx.h" + +#include "piezo.h" + +//FreeRTOS includes +#include "FreeRTOS.h" +#include "task.h" + +// HW defines +#define PIEZO_TIM_PERIF RCC_APB1Periph_TIM5 +#define PIEZO_TIM TIM5 +#define PIEZO_TIM_DBG DBGMCU_TIM2_STOP +#define PIEZO_TIM_SETCOMPARE TIM_SetCompare2 +#define PIEZO_TIM_GETCAPTURE TIM_GetCapture2 + +#define PIEZO_GPIO_POS_PERIF RCC_AHB1Periph_GPIOA +#define PIEZO_GPIO_POS_PORT GPIOA +#define PIEZO_GPIO_POS_PIN GPIO_Pin_2 // TIM5_CH3 +#define PIEZO_GPIO_AF_POS_PIN GPIO_PinSource2 +#define PIEZO_GPIO_AF_POS GPIO_AF_TIM5 + +#define PIEZO_GPIO_NEG_PERIF RCC_AHB1Periph_GPIOA +#define PIEZO_GPIO_NEG_PORT GPIOA +#define PIEZO_GPIO_NEG_PIN GPIO_Pin_3 // TIM5_CH4 +#define PIEZO_GPIO_AF_NEG_PIN GPIO_PinSource3 +#define PIEZO_GPIO_AF_NEG GPIO_AF_TIM5 + +#define PIEZO_PWM_BITS (8) +#define PIEZO_PWM_PERIOD ((1<. + * + * @file watchdog.c - Implementaion of hardware watchdog + * + */ +#define DEBUG_MODULE "SYS" + +#include "debug.h" + +#include "watchdog.h" +#include "cfassert.h" + + +bool watchdogNormalStartTest(void) +{ + bool wasNormalStart = true; + + if (RCC_GetFlagStatus(RCC_FLAG_IWDGRST)) { + RCC_ClearFlag(); + wasNormalStart = false; + DEBUG_PRINT("The system resumed after watchdog timeout [WARNING]\n"); + printAssertSnapshotData(); + } + + return wasNormalStart; +} + + +void watchdogInit(void) +{ + IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable); + + // IWDG counter clock: LSI/32 = 1024Hz + IWDG_SetPrescaler(IWDG_Prescaler_32); + IWDG_SetReload(WATCHDOG_TIMEOUT_CYCLES); + + watchdogReset(); + IWDG_Enable(); +} diff --git a/drivers/src/ws2812.c b/drivers/src/ws2812_cf2.c similarity index 95% rename from drivers/src/ws2812.c rename to drivers/src/ws2812_cf2.c index 74525c08d3..6d5d521292 100644 --- a/drivers/src/ws2812.c +++ b/drivers/src/ws2812_cf2.c @@ -1,6 +1,6 @@ /** - * || ____ _ __ - * +------+ / __ )(_) /_______________ _____ ___ + * || ____ _ __ + * +------+ / __ )(_) /_______________ _____ ___ * | 0xBC | / __ / / __/ ___/ ___/ __ `/_ / / _ \ * +------+ / /_/ / / /_/ /__/ / / /_/ / / /_/ __/ * || || /_____/_/\__/\___/_/ \__,_/ /___/\___/ @@ -30,10 +30,10 @@ // ST lib includes #include "stm32fxxx.h" +#include "nvicconf.h" + #include "FreeRTOS.h" #include "semphr.h" -#include "led.h" -#include "ledseq.h" //#define TIM1_CCR1_Address 0x40012C34 // physical memory address of Timer 3 CCR1 register @@ -47,7 +47,7 @@ static xSemaphoreHandle allLedDone = NULL; // The minimum is to have 2 leds (1 per half buffer) in the buffer, this // consume 42Bytes and will trigger the DMA interrupt at ~2KHz. -// Putting 2 there will divide by 2 the interrupt frequency but will also +// Putting 2 there will divide by 2 the interrupt frequency but will also // double the memory consumption (no free lunch ;-) #define LED_PER_HALF 1 @@ -65,7 +65,7 @@ static union { void ws2812Init(void) { uint16_t PrescalerValue; - + RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE); RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); /* GPIOB Configuration: TIM3 Channel 1 as alternate function push-pull */ @@ -84,9 +84,9 @@ void ws2812Init(void) //Map timer to alternate functions GPIO_PinAFConfig(GPIOB, GPIO_PinSource5, GPIO_AF_TIM3); - + /* Compute the prescaler value */ - PrescalerValue = 0; //(uint16_t) (72000000 / 24000000) - 1; + PrescalerValue = 0; /* Time base configuration */ TIM_TimeBaseStructure.TIM_Period = (105 - 1); // 800kHz TIM_TimeBaseStructure.TIM_Prescaler = PrescalerValue; @@ -132,7 +132,7 @@ void ws2812Init(void) DMA_Init(DMA1_Stream5, &DMA_InitStructure); NVIC_InitStructure.NVIC_IRQChannel = DMA1_Stream5_IRQn; - NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 11; + NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = NVIC_LOW_PRI; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); @@ -142,15 +142,15 @@ void ws2812Init(void) /* TIM3 CC2 DMA Request enable */ TIM_DMACmd(TIM3, TIM_DMA_CC2, ENABLE); - + vSemaphoreCreateBinary(allLedDone); - + } static void fillLed(uint16_t *buffer, uint8_t *color) { int i; - + for(i=0; i<8; i++) // GREEN data { buffer[i] = ((color[1]<NDTR = sizeof(led_dma.buffer) / sizeof(led_dma.buffer[0]); // load number of bytes to be transferred DMA_Cmd(DMA1_Stream5, ENABLE); // enable DMA channel 2 TIM_Cmd(TIM3, ENABLE); // Go!!! @@ -206,19 +206,19 @@ void ws2812DmaIsr(void) portBASE_TYPE xHigherPriorityTaskWoken; uint16_t * buffer; int i; - + if (total_led == 0) { TIM_Cmd(TIM3, DISABLE); DMA_Cmd(DMA1_Stream5, DISABLE); } - + if (DMA_GetITStatus(DMA1_Stream5, DMA_IT_HTIF5)) { DMA_ClearITPendingBit(DMA1_Stream5, DMA_IT_HTIF5); buffer = led_dma.begin; } - + if (DMA_GetITStatus(DMA1_Stream5, DMA_IT_TCIF5)) { DMA_ClearITPendingBit(DMA1_Stream5, DMA_IT_TCIF5); @@ -231,14 +231,13 @@ void ws2812DmaIsr(void) else bzero(buffer+(24*i), sizeof(led_dma.end)); } - + if (current_led >= total_led+2) { xSemaphoreGiveFromISR(allLedDone, &xHigherPriorityTaskWoken); - + TIM_Cmd(TIM3, DISABLE); // disable Timer 3 DMA_Cmd(DMA1_Stream5, DISABLE); // disable DMA stream4 - + total_led = 0; } } - diff --git a/modules/interface/expbrd.h b/hal/interface/buzzer.h similarity index 54% rename from modules/interface/expbrd.h rename to hal/interface/buzzer.h index 74c04e9a02..07331ad18f 100644 --- a/modules/interface/expbrd.h +++ b/hal/interface/buzzer.h @@ -1,58 +1,65 @@ -/** - * || ____ _ __ - * +------+ / __ )(_) /_______________ _____ ___ - * | 0xBC | / __ / / __/ ___/ ___/ __ `/_ / / _ \ - * +------+ / /_/ / / /_/ /__/ / / /_/ / / /_/ __/ - * || || /_____/_/\__/\___/_/ \__,_/ /___/\___/ - * - * Crazyflie control firmware - * - * Copyright (C) 2011-2012 Bitcraze AB - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, in version 3. - * - * This program 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 - * along with this program. If not, see . - * - * expbrd.h - Expansion board handling functions - */ -#ifndef __EXPBRD_H__ -#define __EXPBRD_H__ - -#include - -#define EXPBRD_MAX 5 -#define EXPBRD_ID 0xEB -#define EXPBRD_OW_ADDR 0x00 - -// Definition of Vendor ID -#define EXPBRD_VID_BITCRAZE 0xBC - -// Definition of expansion board Product ID -#define EXPBRD_PID_LEDRING 0x01 -#define EXPBRD_PID_QI 0x02 -#define EXPBRD_PID_BIGQUAD 0x03 -#define EXPBRD_PID_ET 0xFF - - -typedef struct _ExpbrdData -{ - uint8_t header; - uint8_t usedPins[4]; - uint8_t vid; - uint8_t pid; - uint8_t crc; -} __attribute__((packed)) ExpbrdData ; - -void expbrdInit(); -bool expbrdTest(); - -#endif //__EXPBRD_H__ - +/** + * || ____ _ __ + * +------+ / __ )(_) /_______________ _____ ___ + * | 0xBC | / __ / / __/ ___/ ___/ __ `/_ / / _ \ + * +------+ / /_/ / / /_/ /__/ / / /_/ / / /_/ __/ + * || || /_____/_/\__/\___/_/ \__,_/ /___/\___/ + * + * Crazyflie control firmware + * + * Copyright (C) 2015 Bitcraze AB + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, in version 3. + * + * This program 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 + * along with this program. If not, see . + * + * buzzdeck.h - Functions for interfacing with decks with buzzers + */ +#ifndef __BUZZER_H__ +#define __BUZZER_H__ + +#include +#include + +/** Functionpointers used to control the buzzer */ +struct buzzerControl +{ + void (*off)(); + void (*on)(uint32_t freq); +}; + +/** + * Initilize the buzzer sub-system. + */ +void buzzerInit(); + +/** + * Test the buzzer sub-system. + */ +bool buzzerTest(); + +/** + * Turn the buzzer off. + */ +void buzzerOff(); + +/** + * Turn the buzzer on and set it to a specific frequency (if supported). + */ +void buzzerOn(uint32_t freq); + +/** + * Set function pointers for controlling the buzzer hardware. + */ +void buzzerSetControl(struct buzzerControl * bc); + +#endif //__BUZZER_H__ + diff --git a/hal/interface/usb_conf.h b/hal/interface/usb_conf.h index e752a30dea..573237f1af 100644 --- a/hal/interface/usb_conf.h +++ b/hal/interface/usb_conf.h @@ -256,6 +256,9 @@ #define __packed __packed #elif defined ( __GNUC__ ) /* GNU Compiler */ // #define __packed __attribute__ ((__packed__)) +#ifndef __packed + #define __packed __attribute__ ((__packed__)) +#endif #elif defined (__TASKING__) /* TASKING Compiler */ #define __packed __unaligned #endif /* __CC_ARM */ diff --git a/modules/interface/bigquad.h b/hal/src/buzzer.c similarity index 70% rename from modules/interface/bigquad.h rename to hal/src/buzzer.c index 164e450628..63daeca586 100644 --- a/modules/interface/bigquad.h +++ b/hal/src/buzzer.c @@ -21,15 +21,36 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . * - * bigquad.h - Big-Quad-Deck + * buzzer.c - Functions for interfacing with decks with buzzers */ -#ifndef __BIGQUAD_H__ -#define __BIGQUAD_H__ +#define DEBUG_MODULE "BUZZER" -#include +#include "buzzer.h" -void bigquadInit(); -bool bigquadTest(); +static struct buzzerControl * ctrl; -#endif //__BIGQUAD_H__ +void buzzerInit() +{ +} +bool buzzerTest() +{ + return true; +} + +void buzzerOff() +{ + if (ctrl) + ctrl->off(); +} + +void buzzerOn(uint32_t freq) +{ + if (ctrl) + ctrl->on(freq); +} + +void buzzerSetControl(struct buzzerControl * bc) +{ + ctrl = bc; +} diff --git a/hal/src/eskylink.c b/hal/src/eskylink.c index f6c2da9962..c36194090e 100644 --- a/hal/src/eskylink.c +++ b/hal/src/eskylink.c @@ -1,6 +1,6 @@ /* - * || ____ _ __ - * +------+ / __ )(_) /_______________ _____ ___ + * || ____ _ __ + * +------+ / __ )(_) /_______________ _____ ___ * | 0xBC | / __ / / __/ ___/ ___/ __ `/_ / / _ \ * +------+ / /_/ / / /_/ /__/ / / /_/ / / /_/ __/ * || || /_____/_/\__/\___/_/ \__,_/ /___/\___/ @@ -66,7 +66,7 @@ xQueueHandle rxQueue; static struct { bool enabled; - + bool paired; uint8_t band; } state; @@ -79,7 +79,7 @@ static void interruptCallback() xSemaphoreGiveFromISR(dataRdy, &xHigherPriorityTaskWoken); if(xHigherPriorityTaskWoken) - vPortYieldFromISR(); + portYIELD(); } // 'Class' functions, called from callbacks @@ -95,9 +95,9 @@ static int sendPacket(CRTPPacket * pk) { if (!state.enabled) return ENETDOWN; - + // NOP! - + return 0; } @@ -127,20 +127,20 @@ static int eskylinkFetchData(char * packet, int dataLen) //clear the interruptions flags nrfWrite1Reg(REG_STATUS, 0x70); - + nrfSetEnable(true); - + return dataLen; } static void eskylinkInitPairing(void) { int i; - + //Power the radio, Enable the DR interruption, set the radio in PRX mode with 2bytes CRC nrfWrite1Reg(REG_CONFIG, 0x3F); vTaskDelay(M2T(2)); //Wait for the chip to be ready - + //Set the radio channel, pairing channel is 50 nrfSetChannel(50); //Set the radio data rate @@ -183,33 +183,33 @@ static void eskylinkDecode(char* packet) static CRTPPacket crtpPacket; float pitch, roll, yaw; uint16_t thrust; - + pitch = ((packet[2]<<8) | packet[3])-PPM_ZERO; if (roll<(-PPM_RANGE)) roll = -PPM_RANGE; if (roll>PPM_RANGE) roll = PPM_RANGE; pitch *= 20.0/PPM_RANGE; - + roll = ((packet[0]<<8) | packet[1])-PPM_ZERO; if (roll<(-PPM_RANGE)) roll = -PPM_RANGE; if (roll>PPM_RANGE) roll = PPM_RANGE; roll *= 20.0/PPM_RANGE; - + yaw = ((packet[6]<<8) | packet[7])-PPM_ZERO; if (yaw<(-PPM_RANGE)) yaw = -PPM_RANGE; if (yaw>PPM_RANGE) yaw = PPM_RANGE; yaw *= 200.0/PPM_RANGE; - + thrust = ((packet[4]<<8) | packet[5])-PPM_MIN; if (thrust<0) thrust = 0; if (thrust>(2*PPM_RANGE)) thrust = 2*PPM_RANGE; thrust *= 55000/(2*PPM_RANGE); - + crtpPacket.port = CRTP_PORT_COMMANDER; memcpy(&crtpPacket.data[0], (char*)&roll, 4); memcpy(&crtpPacket.data[4], (char*)&pitch, 4); memcpy(&crtpPacket.data[8], (char*)&yaw, 4); memcpy(&crtpPacket.data[12], (char*)&thrust, 2); - + xQueueSend(rxQueue, &crtpPacket, 0); } @@ -224,7 +224,7 @@ static void eskylinkTask(void * arg) { xSemaphoreTake(dataRdy, portMAX_DELAY); ledseqRun(LED_GREEN, seq_linkup); - + eskylinkFetchData(packet, 13); if (packet[4]==0x18 && packet[5]==0x29) @@ -249,10 +249,10 @@ static void eskylinkTask(void * arg) if (xSemaphoreTake(dataRdy, M2T(10))==pdTRUE) { ledseqRun(LED_GREEN, seq_linkup); - + eskylinkFetchData(packet, 13); eskylinkDecode(packet); - + if (channel1<0) //Channels found! { channel1 = channel; @@ -261,7 +261,7 @@ static void eskylinkTask(void * arg) } } else - { + { if (channel1<0) { channel++; @@ -276,12 +276,12 @@ static void eskylinkTask(void * arg) channel = channel2; else channel = channel1; - + nrfSetEnable(false); nrfSetChannel(channel); nrfSetEnable(true); } - + } } } @@ -310,7 +310,7 @@ void eskylinkInit() eskylinkInitPairing(); /* Launch the Radio link task */ - xTaskCreate(eskylinkTask, (const signed char * const)ESKYLINK_TASK_NAME, + xTaskCreate(eskylinkTask, ESKYLINK_TASK_NAME, ESKYLINK_TASK_STACKSIZE, NULL, ESKYLINK_TASK_PRI, NULL); isInit = true; diff --git a/hal/src/freeRTOSdebug.c b/hal/src/freeRTOSdebug.c index efe1f310f2..4ea013593f 100644 --- a/hal/src/freeRTOSdebug.c +++ b/hal/src/freeRTOSdebug.c @@ -34,7 +34,9 @@ #include "nvicconf.h" #include "led.h" -//#include "stm32f10x.h" +#ifdef UART_OUTPUT_TRACE_DATA + #include "uart.h" +#endif uint32_t traceTickCount; diff --git a/hal/src/imu_cf1.c b/hal/src/imu_cf1.c index 4e7dd8f846..b3da956db1 100644 --- a/hal/src/imu_cf1.c +++ b/hal/src/imu_cf1.c @@ -43,7 +43,6 @@ #include "ledseq.h" #include "uart.h" #include "param.h" -#include "log.h" #define IMU_ENABLE_MAG_HMC5883 #define IMU_ENABLE_PRESSURE_MS5611 diff --git a/hal/src/imu_cf2.c b/hal/src/imu_cf2.c index c55d0fac1b..fc426ef8a0 100644 --- a/hal/src/imu_cf2.c +++ b/hal/src/imu_cf2.c @@ -45,6 +45,7 @@ #include "ledseq.h" #include "param.h" #include "log.h" +#include "sound.h" #define IMU_ENABLE_PRESSURE_LPS25H #define IMU_ENABLE_MAG_AK8963 @@ -330,6 +331,7 @@ void imu6Read(Axis3f* gyroOut, Axis3f* accOut) { // For SkyRoverNano2 //ledseqRun(SYS_LED, seq_calibrated); + soundSetEffect(SND_CALIB); ledseqStop(SYS_LED, seq_alive); ledseqRun(LED_GREEN_R, seq_calibrated); } diff --git a/hal/src/ledseq.c b/hal/src/ledseq.c index 9b513c08e9..ce030950e6 100644 --- a/hal/src/ledseq.c +++ b/hal/src/ledseq.c @@ -34,9 +34,16 @@ #include "timers.h" #include "semphr.h" -#include #include "led.h" +#ifdef CALIBRATED_LED_MORSE + #define DOT 100 + #define DASH (3 * DOT) + #define GAP DOT + #define LETTER_GAP (3 * DOT) + #define WORD_GAP (7 * DOT) +#endif // #ifdef CALIBRATED_LED_MORSE + /* Led sequence priority */ static ledseq_t * sequences[] = { seq_testPassed, @@ -64,9 +71,29 @@ ledseq_t seq_armed[] = { }; ledseq_t seq_calibrated[] = { +#ifndef CALIBRATED_LED_MORSE { true, LEDSEQ_WAITMS(50)}, {false, LEDSEQ_WAITMS(450)}, { 0, LEDSEQ_LOOP}, +#else + { true, LEDSEQ_WAITMS(DASH)}, + {false, LEDSEQ_WAITMS(GAP)}, + { true, LEDSEQ_WAITMS(DOT)}, + {false, LEDSEQ_WAITMS(GAP)}, + { true, LEDSEQ_WAITMS(DASH)}, + {false, LEDSEQ_WAITMS(GAP)}, + { true, LEDSEQ_WAITMS(DOT)}, + {false, LEDSEQ_WAITMS(LETTER_GAP)}, + { true, LEDSEQ_WAITMS(DOT)}, + {false, LEDSEQ_WAITMS(GAP)}, + { true, LEDSEQ_WAITMS(DOT)}, + {false, LEDSEQ_WAITMS(GAP)}, + { true, LEDSEQ_WAITMS(DASH)}, + {false, LEDSEQ_WAITMS(GAP)}, + { true, LEDSEQ_WAITMS(DOT)}, + {false, LEDSEQ_WAITMS(WORD_GAP)}, + { 0, LEDSEQ_LOOP}, +#endif // ifndef CALIBRATED_LED_MORSE }; ledseq_t seq_alive[] = { @@ -169,7 +196,7 @@ void ledseqInit() //Init the soft timers that runs the led sequences for each leds for(i=0; i>> See http://www.FreeRTOS.org/Documentation for details. <<< * - * * - * Thank you for using FreeRTOS, and thank you for your support! * - * * - *************************************************************************** + FreeRTOS V8.2.3 - Copyright (C) 2015 Real Time Engineers Ltd. + All rights reserved + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. This file is part of the FreeRTOS distribution. FreeRTOS is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License (version 2) as published by the - Free Software Foundation AND MODIFIED BY the FreeRTOS exception. + 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. + *************************************************************************** + >>! 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 itcan be - viewed here: http://www.freertos.org/a00114.html and also obtained by - writing to Real Time Engineers Ltd., contact details for whom are available - on the FreeRTOS WEB site. - - 1 tab == 4 spaces! + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html *************************************************************************** * * - * Having a problem? Start by reading the FAQ "My application does * - * not run, what could be wrong?" * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * * * - * http://www.FreeRTOS.org/FAQHelp.html * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * * * *************************************************************************** + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? - http://www.FreeRTOS.org - Documentation, books, training, latest versions, - license and Real Time Engineers Ltd. contact details. + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, - including FreeRTOS+Trace - an indispensable productivity tool, and our new - fully thread aware and reentrant UDP/IP stack. + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. - http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High - Integrity Systems, who sell the code with commercial support, - indemnification and middleware, under the OpenRTOS brand. + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. http://www.SafeRTOS.com - High Integrity Systems also provide a safety engineered and independently SIL3 certified version for use in safety and mission critical applications that require provable dependability. + + 1 tab == 4 spaces! */ #include "FreeRTOS.h" #include "task.h" #include "croutine.h" +/* Remove the whole file is co-routines are not being used. */ +#if( configUSE_CO_ROUTINES != 0 ) + /* * Some kernel aware debuggers require data to be viewed to be global, rather * than file scope. @@ -86,17 +84,17 @@ /* 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. */ +static List_t pxReadyCoRoutineLists[ configMAX_CO_ROUTINE_PRIORITIES ]; /*< Prioritised ready co-routines. */ +static List_t xDelayedCoRoutineList1; /*< Delayed co-routines. */ +static List_t xDelayedCoRoutineList2; /*< Delayed co-routines (two lists are used - one for delays that have overflowed the current tick count. */ +static List_t * pxDelayedCoRoutineList; /*< Points to the delayed co-routine list currently being used. */ +static List_t * pxOverflowDelayedCoRoutineList; /*< Points to the delayed co-routine list currently being used to hold co-routines that have overflowed the current tick count. */ +static List_t 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; +CRCB_t * pxCurrentCoRoutine = NULL; +static UBaseType_t uxTopCoRoutineReadyPriority = 0; +static TickType_t xCoRoutineTickCount = 0, xLastTickCount = 0, xPassedTicks = 0; /* The initial state of the co-routine when it is created. */ #define corINITIAL_STATE ( 0 ) @@ -114,7 +112,7 @@ static portTickType xCoRoutineTickCount = 0, xLastTickCount = 0, xPassedTicks = { \ uxTopCoRoutineReadyPriority = pxCRCB->uxPriority; \ } \ - vListInsertEnd( ( xList * ) &( pxReadyCoRoutineLists[ pxCRCB->uxPriority ] ), &( pxCRCB->xGenericListItem ) ); \ + vListInsertEnd( ( List_t * ) &( pxReadyCoRoutineLists[ pxCRCB->uxPriority ] ), &( pxCRCB->xGenericListItem ) ); \ } /* @@ -143,13 +141,13 @@ static void prvCheckDelayedList( void ); /*-----------------------------------------------------------*/ -signed portBASE_TYPE xCoRoutineCreate( crCOROUTINE_CODE pxCoRoutineCode, unsigned portBASE_TYPE uxPriority, unsigned portBASE_TYPE uxIndex ) +BaseType_t xCoRoutineCreate( crCOROUTINE_CODE pxCoRoutineCode, UBaseType_t uxPriority, UBaseType_t uxIndex ) { -signed portBASE_TYPE xReturn; -corCRCB *pxCoRoutine; +BaseType_t xReturn; +CRCB_t *pxCoRoutine; /* Allocate the memory that will store the co-routine control block. */ - pxCoRoutine = ( corCRCB * ) pvPortMalloc( sizeof( corCRCB ) ); + pxCoRoutine = ( CRCB_t * ) pvPortMalloc( sizeof( CRCB_t ) ); if( pxCoRoutine ) { /* If pxCurrentCoRoutine is NULL then this is the first co-routine to @@ -176,14 +174,14 @@ corCRCB *pxCoRoutine; vListInitialiseItem( &( pxCoRoutine->xGenericListItem ) ); vListInitialiseItem( &( pxCoRoutine->xEventListItem ) ); - /* Set the co-routine control block as a link back from the xListItem. + /* Set the co-routine control block as a link back from the ListItem_t. 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 ); + listSET_LIST_ITEM_VALUE( &( pxCoRoutine->xEventListItem ), ( ( TickType_t ) configMAX_CO_ROUTINE_PRIORITIES - ( TickType_t ) uxPriority ) ); /* Now the co-routine has been initialised it can be added to the ready list at the correct priority. */ @@ -200,9 +198,9 @@ corCRCB *pxCoRoutine; } /*-----------------------------------------------------------*/ -void vCoRoutineAddToDelayedList( portTickType xTicksToDelay, xList *pxEventList ) +void vCoRoutineAddToDelayedList( TickType_t xTicksToDelay, List_t *pxEventList ) { -portTickType xTimeToWake; +TickType_t xTimeToWake; /* Calculate the time to wake - this may overflow but this is not a problem. */ @@ -211,7 +209,7 @@ portTickType xTimeToWake; /* 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. */ - uxListRemove( ( xListItem * ) &( pxCurrentCoRoutine->xGenericListItem ) ); + ( void ) uxListRemove( ( ListItem_t * ) &( pxCurrentCoRoutine->xGenericListItem ) ); /* The list item will be inserted in wake time order. */ listSET_LIST_ITEM_VALUE( &( pxCurrentCoRoutine->xGenericListItem ), xTimeToWake ); @@ -220,13 +218,13 @@ portTickType xTimeToWake; { /* Wake time has overflowed. Place this item in the overflow list. */ - vListInsert( ( xList * ) pxOverflowDelayedCoRoutineList, ( xListItem * ) &( pxCurrentCoRoutine->xGenericListItem ) ); + vListInsert( ( List_t * ) pxOverflowDelayedCoRoutineList, ( ListItem_t * ) &( pxCurrentCoRoutine->xGenericListItem ) ); } else { /* The wake time has not overflowed, so we can use the current block list. */ - vListInsert( ( xList * ) pxDelayedCoRoutineList, ( xListItem * ) &( pxCurrentCoRoutine->xGenericListItem ) ); + vListInsert( ( List_t * ) pxDelayedCoRoutineList, ( ListItem_t * ) &( pxCurrentCoRoutine->xGenericListItem ) ); } if( pxEventList ) @@ -245,17 +243,17 @@ static void prvCheckPendingReadyList( void ) the ready lists itself. */ while( listLIST_IS_EMPTY( &xPendingReadyCoRoutineList ) == pdFALSE ) { - corCRCB *pxUnblockedCRCB; + CRCB_t *pxUnblockedCRCB; /* The pending ready list can be accessed by an ISR. */ portDISABLE_INTERRUPTS(); { - pxUnblockedCRCB = ( corCRCB * ) listGET_OWNER_OF_HEAD_ENTRY( (&xPendingReadyCoRoutineList) ); - uxListRemove( &( pxUnblockedCRCB->xEventListItem ) ); + pxUnblockedCRCB = ( CRCB_t * ) listGET_OWNER_OF_HEAD_ENTRY( (&xPendingReadyCoRoutineList) ); + ( void ) uxListRemove( &( pxUnblockedCRCB->xEventListItem ) ); } portENABLE_INTERRUPTS(); - uxListRemove( &( pxUnblockedCRCB->xGenericListItem ) ); + ( void ) uxListRemove( &( pxUnblockedCRCB->xGenericListItem ) ); prvAddCoRoutineToReadyQueue( pxUnblockedCRCB ); } } @@ -263,7 +261,7 @@ static void prvCheckPendingReadyList( void ) static void prvCheckDelayedList( void ) { -corCRCB *pxCRCB; +CRCB_t *pxCRCB; xPassedTicks = xTaskGetTickCount() - xLastTickCount; while( xPassedTicks ) @@ -274,7 +272,7 @@ corCRCB *pxCRCB; /* If the tick count has overflowed we need to swap the ready lists. */ if( xCoRoutineTickCount == 0 ) { - xList * pxTemp; + List_t * 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! */ @@ -286,7 +284,7 @@ corCRCB *pxCRCB; /* See if this tick has made a timeout expire. */ while( listLIST_IS_EMPTY( pxDelayedCoRoutineList ) == pdFALSE ) { - pxCRCB = ( corCRCB * ) listGET_OWNER_OF_HEAD_ENTRY( pxDelayedCoRoutineList ); + pxCRCB = ( CRCB_t * ) listGET_OWNER_OF_HEAD_ENTRY( pxDelayedCoRoutineList ); if( xCoRoutineTickCount < listGET_LIST_ITEM_VALUE( &( pxCRCB->xGenericListItem ) ) ) { @@ -301,12 +299,12 @@ corCRCB *pxCRCB; 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. */ - uxListRemove( &( pxCRCB->xGenericListItem ) ); + ( void ) uxListRemove( &( pxCRCB->xGenericListItem ) ); /* Is the co-routine waiting on an event also? */ if( pxCRCB->xEventListItem.pvContainer ) { - uxListRemove( &( pxCRCB->xEventListItem ) ); + ( void ) uxListRemove( &( pxCRCB->xEventListItem ) ); } } portENABLE_INTERRUPTS(); @@ -351,16 +349,16 @@ void vCoRoutineSchedule( void ) static void prvInitialiseCoRoutineLists( void ) { -unsigned portBASE_TYPE uxPriority; +UBaseType_t uxPriority; for( uxPriority = 0; uxPriority < configMAX_CO_ROUTINE_PRIORITIES; uxPriority++ ) { - vListInitialise( ( xList * ) &( pxReadyCoRoutineLists[ uxPriority ] ) ); + vListInitialise( ( List_t * ) &( pxReadyCoRoutineLists[ uxPriority ] ) ); } - vListInitialise( ( xList * ) &xDelayedCoRoutineList1 ); - vListInitialise( ( xList * ) &xDelayedCoRoutineList2 ); - vListInitialise( ( xList * ) &xPendingReadyCoRoutineList ); + vListInitialise( ( List_t * ) &xDelayedCoRoutineList1 ); + vListInitialise( ( List_t * ) &xDelayedCoRoutineList2 ); + vListInitialise( ( List_t * ) &xPendingReadyCoRoutineList ); /* Start with pxDelayedCoRoutineList using list1 and the pxOverflowDelayedCoRoutineList using list2. */ @@ -369,17 +367,17 @@ unsigned portBASE_TYPE uxPriority; } /*-----------------------------------------------------------*/ -signed portBASE_TYPE xCoRoutineRemoveFromEventList( const xList *pxEventList ) +BaseType_t xCoRoutineRemoveFromEventList( const List_t *pxEventList ) { -corCRCB *pxUnblockedCRCB; -signed portBASE_TYPE xReturn; +CRCB_t *pxUnblockedCRCB; +BaseType_t 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 ); - uxListRemove( &( pxUnblockedCRCB->xEventListItem ) ); - vListInsertEnd( ( xList * ) &( xPendingReadyCoRoutineList ), &( pxUnblockedCRCB->xEventListItem ) ); + pxUnblockedCRCB = ( CRCB_t * ) listGET_OWNER_OF_HEAD_ENTRY( pxEventList ); + ( void ) uxListRemove( &( pxUnblockedCRCB->xEventListItem ) ); + vListInsertEnd( ( List_t * ) &( xPendingReadyCoRoutineList ), &( pxUnblockedCRCB->xEventListItem ) ); if( pxUnblockedCRCB->uxPriority >= pxCurrentCoRoutine->uxPriority ) { @@ -393,3 +391,5 @@ signed portBASE_TYPE xReturn; return xReturn; } +#endif /* configUSE_CO_ROUTINES == 0 */ + diff --git a/lib/FreeRTOS/event_groups.c b/lib/FreeRTOS/event_groups.c new file mode 100644 index 0000000000..625548c56c --- /dev/null +++ b/lib/FreeRTOS/event_groups.c @@ -0,0 +1,683 @@ +/* + FreeRTOS V8.2.3 - Copyright (C) 2015 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +/* Standard includes. */ +#include + +/* 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 + +/* FreeRTOS includes. */ +#include "FreeRTOS.h" +#include "task.h" +#include "timers.h" +#include "event_groups.h" + +/* Lint e961 and e750 are suppressed as a MISRA exception justified because the +MPU ports require MPU_WRAPPERS_INCLUDED_FROM_API_FILE to be defined for the +header files above, but not in this file, in order to generate the correct +privileged Vs unprivileged linkage and placement. */ +#undef MPU_WRAPPERS_INCLUDED_FROM_API_FILE /*lint !e961 !e750. */ + +#if ( INCLUDE_xEventGroupSetBitFromISR == 1 ) && ( configUSE_TIMERS == 0 ) + #error configUSE_TIMERS must be set to 1 to make the xEventGroupSetBitFromISR() function available. +#endif + +#if ( INCLUDE_xEventGroupSetBitFromISR == 1 ) && ( INCLUDE_xTimerPendFunctionCall == 0 ) + #error INCLUDE_xTimerPendFunctionCall must also be set to one to make the xEventGroupSetBitFromISR() function available. +#endif + +/* The following bit fields convey control information in a task's event list +item value. It is important they don't clash with the +taskEVENT_LIST_ITEM_VALUE_IN_USE definition. */ +#if configUSE_16_BIT_TICKS == 1 + #define eventCLEAR_EVENTS_ON_EXIT_BIT 0x0100U + #define eventUNBLOCKED_DUE_TO_BIT_SET 0x0200U + #define eventWAIT_FOR_ALL_BITS 0x0400U + #define eventEVENT_BITS_CONTROL_BYTES 0xff00U +#else + #define eventCLEAR_EVENTS_ON_EXIT_BIT 0x01000000UL + #define eventUNBLOCKED_DUE_TO_BIT_SET 0x02000000UL + #define eventWAIT_FOR_ALL_BITS 0x04000000UL + #define eventEVENT_BITS_CONTROL_BYTES 0xff000000UL +#endif + +typedef struct xEventGroupDefinition +{ + EventBits_t uxEventBits; + List_t xTasksWaitingForBits; /*< List of tasks waiting for a bit to be set. */ + + #if( configUSE_TRACE_FACILITY == 1 ) + UBaseType_t uxEventGroupNumber; + #endif + +} EventGroup_t; + +/*-----------------------------------------------------------*/ + +/* + * Test the bits set in uxCurrentEventBits to see if the wait condition is met. + * The wait condition is defined by xWaitForAllBits. If xWaitForAllBits is + * pdTRUE then the wait condition is met if all the bits set in uxBitsToWaitFor + * are also set in uxCurrentEventBits. If xWaitForAllBits is pdFALSE then the + * wait condition is met if any of the bits set in uxBitsToWait for are also set + * in uxCurrentEventBits. + */ +static BaseType_t prvTestWaitCondition( const EventBits_t uxCurrentEventBits, const EventBits_t uxBitsToWaitFor, const BaseType_t xWaitForAllBits ); + +/*-----------------------------------------------------------*/ + +EventGroupHandle_t xEventGroupCreate( void ) +{ +EventGroup_t *pxEventBits; + + pxEventBits = ( EventGroup_t * ) pvPortMalloc( sizeof( EventGroup_t ) ); + if( pxEventBits != NULL ) + { + pxEventBits->uxEventBits = 0; + vListInitialise( &( pxEventBits->xTasksWaitingForBits ) ); + traceEVENT_GROUP_CREATE( pxEventBits ); + } + else + { + traceEVENT_GROUP_CREATE_FAILED(); + } + + return ( EventGroupHandle_t ) pxEventBits; +} +/*-----------------------------------------------------------*/ + +EventBits_t xEventGroupSync( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToSet, const EventBits_t uxBitsToWaitFor, TickType_t xTicksToWait ) +{ +EventBits_t uxOriginalBitValue, uxReturn; +EventGroup_t *pxEventBits = ( EventGroup_t * ) xEventGroup; +BaseType_t xAlreadyYielded; +BaseType_t xTimeoutOccurred = pdFALSE; + + configASSERT( ( uxBitsToWaitFor & eventEVENT_BITS_CONTROL_BYTES ) == 0 ); + configASSERT( uxBitsToWaitFor != 0 ); + #if ( ( INCLUDE_xTaskGetSchedulerState == 1 ) || ( configUSE_TIMERS == 1 ) ) + { + configASSERT( !( ( xTaskGetSchedulerState() == taskSCHEDULER_SUSPENDED ) && ( xTicksToWait != 0 ) ) ); + } + #endif + + vTaskSuspendAll(); + { + uxOriginalBitValue = pxEventBits->uxEventBits; + + ( void ) xEventGroupSetBits( xEventGroup, uxBitsToSet ); + + if( ( ( uxOriginalBitValue | uxBitsToSet ) & uxBitsToWaitFor ) == uxBitsToWaitFor ) + { + /* All the rendezvous bits are now set - no need to block. */ + uxReturn = ( uxOriginalBitValue | uxBitsToSet ); + + /* Rendezvous always clear the bits. They will have been cleared + already unless this is the only task in the rendezvous. */ + pxEventBits->uxEventBits &= ~uxBitsToWaitFor; + + xTicksToWait = 0; + } + else + { + if( xTicksToWait != ( TickType_t ) 0 ) + { + traceEVENT_GROUP_SYNC_BLOCK( xEventGroup, uxBitsToSet, uxBitsToWaitFor ); + + /* Store the bits that the calling task is waiting for in the + task's event list item so the kernel knows when a match is + found. Then enter the blocked state. */ + vTaskPlaceOnUnorderedEventList( &( pxEventBits->xTasksWaitingForBits ), ( uxBitsToWaitFor | eventCLEAR_EVENTS_ON_EXIT_BIT | eventWAIT_FOR_ALL_BITS ), xTicksToWait ); + + /* This assignment is obsolete as uxReturn will get set after + the task unblocks, but some compilers mistakenly generate a + warning about uxReturn being returned without being set if the + assignment is omitted. */ + uxReturn = 0; + } + else + { + /* The rendezvous bits were not set, but no block time was + specified - just return the current event bit value. */ + uxReturn = pxEventBits->uxEventBits; + } + } + } + xAlreadyYielded = xTaskResumeAll(); + + if( xTicksToWait != ( TickType_t ) 0 ) + { + if( xAlreadyYielded == pdFALSE ) + { + portYIELD_WITHIN_API(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + /* The task blocked to wait for its required bits to be set - at this + point either the required bits were set or the block time expired. If + the required bits were set they will have been stored in the task's + event list item, and they should now be retrieved then cleared. */ + uxReturn = uxTaskResetEventItemValue(); + + if( ( uxReturn & eventUNBLOCKED_DUE_TO_BIT_SET ) == ( EventBits_t ) 0 ) + { + /* The task timed out, just return the current event bit value. */ + taskENTER_CRITICAL(); + { + uxReturn = pxEventBits->uxEventBits; + + /* Although the task got here because it timed out before the + bits it was waiting for were set, it is possible that since it + unblocked another task has set the bits. If this is the case + then it needs to clear the bits before exiting. */ + if( ( uxReturn & uxBitsToWaitFor ) == uxBitsToWaitFor ) + { + pxEventBits->uxEventBits &= ~uxBitsToWaitFor; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + taskEXIT_CRITICAL(); + + xTimeoutOccurred = pdTRUE; + } + else + { + /* The task unblocked because the bits were set. */ + } + + /* Control bits might be set as the task had blocked should not be + returned. */ + uxReturn &= ~eventEVENT_BITS_CONTROL_BYTES; + } + + traceEVENT_GROUP_SYNC_END( xEventGroup, uxBitsToSet, uxBitsToWaitFor, xTimeoutOccurred ); + + return uxReturn; +} +/*-----------------------------------------------------------*/ + +EventBits_t xEventGroupWaitBits( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToWaitFor, const BaseType_t xClearOnExit, const BaseType_t xWaitForAllBits, TickType_t xTicksToWait ) +{ +EventGroup_t *pxEventBits = ( EventGroup_t * ) xEventGroup; +EventBits_t uxReturn, uxControlBits = 0; +BaseType_t xWaitConditionMet, xAlreadyYielded; +BaseType_t xTimeoutOccurred = pdFALSE; + + /* Check the user is not attempting to wait on the bits used by the kernel + itself, and that at least one bit is being requested. */ + configASSERT( xEventGroup ); + configASSERT( ( uxBitsToWaitFor & eventEVENT_BITS_CONTROL_BYTES ) == 0 ); + configASSERT( uxBitsToWaitFor != 0 ); + #if ( ( INCLUDE_xTaskGetSchedulerState == 1 ) || ( configUSE_TIMERS == 1 ) ) + { + configASSERT( !( ( xTaskGetSchedulerState() == taskSCHEDULER_SUSPENDED ) && ( xTicksToWait != 0 ) ) ); + } + #endif + + vTaskSuspendAll(); + { + const EventBits_t uxCurrentEventBits = pxEventBits->uxEventBits; + + /* Check to see if the wait condition is already met or not. */ + xWaitConditionMet = prvTestWaitCondition( uxCurrentEventBits, uxBitsToWaitFor, xWaitForAllBits ); + + if( xWaitConditionMet != pdFALSE ) + { + /* The wait condition has already been met so there is no need to + block. */ + uxReturn = uxCurrentEventBits; + xTicksToWait = ( TickType_t ) 0; + + /* Clear the wait bits if requested to do so. */ + if( xClearOnExit != pdFALSE ) + { + pxEventBits->uxEventBits &= ~uxBitsToWaitFor; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else if( xTicksToWait == ( TickType_t ) 0 ) + { + /* The wait condition has not been met, but no block time was + specified, so just return the current value. */ + uxReturn = uxCurrentEventBits; + } + else + { + /* The task is going to block to wait for its required bits to be + set. uxControlBits are used to remember the specified behaviour of + this call to xEventGroupWaitBits() - for use when the event bits + unblock the task. */ + if( xClearOnExit != pdFALSE ) + { + uxControlBits |= eventCLEAR_EVENTS_ON_EXIT_BIT; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + if( xWaitForAllBits != pdFALSE ) + { + uxControlBits |= eventWAIT_FOR_ALL_BITS; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + /* Store the bits that the calling task is waiting for in the + task's event list item so the kernel knows when a match is + found. Then enter the blocked state. */ + vTaskPlaceOnUnorderedEventList( &( pxEventBits->xTasksWaitingForBits ), ( uxBitsToWaitFor | uxControlBits ), xTicksToWait ); + + /* This is obsolete as it will get set after the task unblocks, but + some compilers mistakenly generate a warning about the variable + being returned without being set if it is not done. */ + uxReturn = 0; + + traceEVENT_GROUP_WAIT_BITS_BLOCK( xEventGroup, uxBitsToWaitFor ); + } + } + xAlreadyYielded = xTaskResumeAll(); + + if( xTicksToWait != ( TickType_t ) 0 ) + { + if( xAlreadyYielded == pdFALSE ) + { + portYIELD_WITHIN_API(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + /* The task blocked to wait for its required bits to be set - at this + point either the required bits were set or the block time expired. If + the required bits were set they will have been stored in the task's + event list item, and they should now be retrieved then cleared. */ + uxReturn = uxTaskResetEventItemValue(); + + if( ( uxReturn & eventUNBLOCKED_DUE_TO_BIT_SET ) == ( EventBits_t ) 0 ) + { + taskENTER_CRITICAL(); + { + /* The task timed out, just return the current event bit value. */ + uxReturn = pxEventBits->uxEventBits; + + /* It is possible that the event bits were updated between this + task leaving the Blocked state and running again. */ + if( prvTestWaitCondition( uxReturn, uxBitsToWaitFor, xWaitForAllBits ) != pdFALSE ) + { + if( xClearOnExit != pdFALSE ) + { + pxEventBits->uxEventBits &= ~uxBitsToWaitFor; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + taskEXIT_CRITICAL(); + + /* Prevent compiler warnings when trace macros are not used. */ + xTimeoutOccurred = pdFALSE; + } + else + { + /* The task unblocked because the bits were set. */ + } + + /* The task blocked so control bits may have been set. */ + uxReturn &= ~eventEVENT_BITS_CONTROL_BYTES; + } + traceEVENT_GROUP_WAIT_BITS_END( xEventGroup, uxBitsToWaitFor, xTimeoutOccurred ); + + return uxReturn; +} +/*-----------------------------------------------------------*/ + +EventBits_t xEventGroupClearBits( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToClear ) +{ +EventGroup_t *pxEventBits = ( EventGroup_t * ) xEventGroup; +EventBits_t uxReturn; + + /* Check the user is not attempting to clear the bits used by the kernel + itself. */ + configASSERT( xEventGroup ); + configASSERT( ( uxBitsToClear & eventEVENT_BITS_CONTROL_BYTES ) == 0 ); + + taskENTER_CRITICAL(); + { + traceEVENT_GROUP_CLEAR_BITS( xEventGroup, uxBitsToClear ); + + /* The value returned is the event group value prior to the bits being + cleared. */ + uxReturn = pxEventBits->uxEventBits; + + /* Clear the bits. */ + pxEventBits->uxEventBits &= ~uxBitsToClear; + } + taskEXIT_CRITICAL(); + + return uxReturn; +} +/*-----------------------------------------------------------*/ + +#if ( ( configUSE_TRACE_FACILITY == 1 ) && ( INCLUDE_xTimerPendFunctionCall == 1 ) && ( configUSE_TIMERS == 1 ) ) + + BaseType_t xEventGroupClearBitsFromISR( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToClear ) + { + BaseType_t xReturn; + + traceEVENT_GROUP_CLEAR_BITS_FROM_ISR( xEventGroup, uxBitsToClear ); + xReturn = xTimerPendFunctionCallFromISR( vEventGroupClearBitsCallback, ( void * ) xEventGroup, ( uint32_t ) uxBitsToClear, NULL ); + + return xReturn; + } + +#endif +/*-----------------------------------------------------------*/ + +EventBits_t xEventGroupGetBitsFromISR( EventGroupHandle_t xEventGroup ) +{ +UBaseType_t uxSavedInterruptStatus; +EventGroup_t *pxEventBits = ( EventGroup_t * ) xEventGroup; +EventBits_t uxReturn; + + uxSavedInterruptStatus = portSET_INTERRUPT_MASK_FROM_ISR(); + { + uxReturn = pxEventBits->uxEventBits; + } + portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedInterruptStatus ); + + return uxReturn; +} +/*-----------------------------------------------------------*/ + +EventBits_t xEventGroupSetBits( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToSet ) +{ +ListItem_t *pxListItem, *pxNext; +ListItem_t const *pxListEnd; +List_t *pxList; +EventBits_t uxBitsToClear = 0, uxBitsWaitedFor, uxControlBits; +EventGroup_t *pxEventBits = ( EventGroup_t * ) xEventGroup; +BaseType_t xMatchFound = pdFALSE; + + /* Check the user is not attempting to set the bits used by the kernel + itself. */ + configASSERT( xEventGroup ); + configASSERT( ( uxBitsToSet & eventEVENT_BITS_CONTROL_BYTES ) == 0 ); + + pxList = &( pxEventBits->xTasksWaitingForBits ); + pxListEnd = listGET_END_MARKER( pxList ); /*lint !e826 !e740 The mini list structure is used as the list end to save RAM. This is checked and valid. */ + vTaskSuspendAll(); + { + traceEVENT_GROUP_SET_BITS( xEventGroup, uxBitsToSet ); + + pxListItem = listGET_HEAD_ENTRY( pxList ); + + /* Set the bits. */ + pxEventBits->uxEventBits |= uxBitsToSet; + + /* See if the new bit value should unblock any tasks. */ + while( pxListItem != pxListEnd ) + { + pxNext = listGET_NEXT( pxListItem ); + uxBitsWaitedFor = listGET_LIST_ITEM_VALUE( pxListItem ); + xMatchFound = pdFALSE; + + /* Split the bits waited for from the control bits. */ + uxControlBits = uxBitsWaitedFor & eventEVENT_BITS_CONTROL_BYTES; + uxBitsWaitedFor &= ~eventEVENT_BITS_CONTROL_BYTES; + + if( ( uxControlBits & eventWAIT_FOR_ALL_BITS ) == ( EventBits_t ) 0 ) + { + /* Just looking for single bit being set. */ + if( ( uxBitsWaitedFor & pxEventBits->uxEventBits ) != ( EventBits_t ) 0 ) + { + xMatchFound = pdTRUE; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else if( ( uxBitsWaitedFor & pxEventBits->uxEventBits ) == uxBitsWaitedFor ) + { + /* All bits are set. */ + xMatchFound = pdTRUE; + } + else + { + /* Need all bits to be set, but not all the bits were set. */ + } + + if( xMatchFound != pdFALSE ) + { + /* The bits match. Should the bits be cleared on exit? */ + if( ( uxControlBits & eventCLEAR_EVENTS_ON_EXIT_BIT ) != ( EventBits_t ) 0 ) + { + uxBitsToClear |= uxBitsWaitedFor; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + /* Store the actual event flag value in the task's event list + item before removing the task from the event list. The + eventUNBLOCKED_DUE_TO_BIT_SET bit is set so the task knows + that is was unblocked due to its required bits matching, rather + than because it timed out. */ + ( void ) xTaskRemoveFromUnorderedEventList( pxListItem, pxEventBits->uxEventBits | eventUNBLOCKED_DUE_TO_BIT_SET ); + } + + /* Move onto the next list item. Note pxListItem->pxNext is not + used here as the list item may have been removed from the event list + and inserted into the ready/pending reading list. */ + pxListItem = pxNext; + } + + /* Clear any bits that matched when the eventCLEAR_EVENTS_ON_EXIT_BIT + bit was set in the control word. */ + pxEventBits->uxEventBits &= ~uxBitsToClear; + } + ( void ) xTaskResumeAll(); + + return pxEventBits->uxEventBits; +} +/*-----------------------------------------------------------*/ + +void vEventGroupDelete( EventGroupHandle_t xEventGroup ) +{ +EventGroup_t *pxEventBits = ( EventGroup_t * ) xEventGroup; +const List_t *pxTasksWaitingForBits = &( pxEventBits->xTasksWaitingForBits ); + + vTaskSuspendAll(); + { + traceEVENT_GROUP_DELETE( xEventGroup ); + + while( listCURRENT_LIST_LENGTH( pxTasksWaitingForBits ) > ( UBaseType_t ) 0 ) + { + /* Unblock the task, returning 0 as the event list is being deleted + and cannot therefore have any bits set. */ + configASSERT( pxTasksWaitingForBits->xListEnd.pxNext != ( ListItem_t * ) &( pxTasksWaitingForBits->xListEnd ) ); + ( void ) xTaskRemoveFromUnorderedEventList( pxTasksWaitingForBits->xListEnd.pxNext, eventUNBLOCKED_DUE_TO_BIT_SET ); + } + + vPortFree( pxEventBits ); + } + ( void ) xTaskResumeAll(); +} +/*-----------------------------------------------------------*/ + +/* For internal use only - execute a 'set bits' command that was pended from +an interrupt. */ +void vEventGroupSetBitsCallback( void *pvEventGroup, const uint32_t ulBitsToSet ) +{ + ( void ) xEventGroupSetBits( pvEventGroup, ( EventBits_t ) ulBitsToSet ); +} +/*-----------------------------------------------------------*/ + +/* For internal use only - execute a 'clear bits' command that was pended from +an interrupt. */ +void vEventGroupClearBitsCallback( void *pvEventGroup, const uint32_t ulBitsToClear ) +{ + ( void ) xEventGroupClearBits( pvEventGroup, ( EventBits_t ) ulBitsToClear ); +} +/*-----------------------------------------------------------*/ + +static BaseType_t prvTestWaitCondition( const EventBits_t uxCurrentEventBits, const EventBits_t uxBitsToWaitFor, const BaseType_t xWaitForAllBits ) +{ +BaseType_t xWaitConditionMet = pdFALSE; + + if( xWaitForAllBits == pdFALSE ) + { + /* Task only has to wait for one bit within uxBitsToWaitFor to be + set. Is one already set? */ + if( ( uxCurrentEventBits & uxBitsToWaitFor ) != ( EventBits_t ) 0 ) + { + xWaitConditionMet = pdTRUE; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + /* Task has to wait for all the bits in uxBitsToWaitFor to be set. + Are they set already? */ + if( ( uxCurrentEventBits & uxBitsToWaitFor ) == uxBitsToWaitFor ) + { + xWaitConditionMet = pdTRUE; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + + return xWaitConditionMet; +} +/*-----------------------------------------------------------*/ + +#if ( ( configUSE_TRACE_FACILITY == 1 ) && ( INCLUDE_xTimerPendFunctionCall == 1 ) && ( configUSE_TIMERS == 1 ) ) + + BaseType_t xEventGroupSetBitsFromISR( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToSet, BaseType_t *pxHigherPriorityTaskWoken ) + { + BaseType_t xReturn; + + traceEVENT_GROUP_SET_BITS_FROM_ISR( xEventGroup, uxBitsToSet ); + xReturn = xTimerPendFunctionCallFromISR( vEventGroupSetBitsCallback, ( void * ) xEventGroup, ( uint32_t ) uxBitsToSet, pxHigherPriorityTaskWoken ); + + return xReturn; + } + +#endif +/*-----------------------------------------------------------*/ + +#if (configUSE_TRACE_FACILITY == 1) + + UBaseType_t uxEventGroupGetNumber( void* xEventGroup ) + { + UBaseType_t xReturn; + EventGroup_t *pxEventBits = ( EventGroup_t * ) xEventGroup; + + if( xEventGroup == NULL ) + { + xReturn = 0; + } + else + { + xReturn = pxEventBits->uxEventGroupNumber; + } + + return xReturn; + } + +#endif + diff --git a/lib/FreeRTOS/include/FreeRTOS.h b/lib/FreeRTOS/include/FreeRTOS.h index 5024639deb..7d34ec63bb 100644 --- a/lib/FreeRTOS/include/FreeRTOS.h +++ b/lib/FreeRTOS/include/FreeRTOS.h @@ -1,158 +1,174 @@ /* - FreeRTOS V7.4.0 - Copyright (C) 2013 Real Time Engineers Ltd. - - FEATURES AND PORTS ARE ADDED TO FREERTOS ALL THE TIME. PLEASE VISIT - http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. - - *************************************************************************** - * * - * 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! * - * * - *************************************************************************** + FreeRTOS V8.2.3 - Copyright (C) 2015 Real Time Engineers Ltd. + All rights reserved + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. This file is part of the FreeRTOS distribution. FreeRTOS is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License (version 2) as published by the - Free Software Foundation AND MODIFIED BY the FreeRTOS exception. + 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. + *************************************************************************** + >>! 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 itcan be - viewed here: http://www.freertos.org/a00114.html and also obtained by - writing to Real Time Engineers Ltd., contact details for whom are available - on the FreeRTOS WEB site. - - 1 tab == 4 spaces! + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html *************************************************************************** * * - * Having a problem? Start by reading the FAQ "My application does * - * not run, what could be wrong?" * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * * * - * http://www.FreeRTOS.org/FAQHelp.html * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * * * *************************************************************************** + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. - http://www.FreeRTOS.org - Documentation, books, training, latest versions, - license and Real Time Engineers Ltd. contact details. + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, - including FreeRTOS+Trace - an indispensable productivity tool, and our new - fully thread aware and reentrant UDP/IP stack. - - http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High - Integrity Systems, who sell the code with commercial support, - indemnification and middleware, under the OpenRTOS brand. - - http://www.SafeRTOS.com - High Integrity Systems also provide a safety - engineered and independently SIL3 certified version for use in safety and + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and mission critical applications that require provable dependability. + + 1 tab == 4 spaces! */ #ifndef INC_FREERTOS_H #define INC_FREERTOS_H - /* * Include the generic headers required for the FreeRTOS port being used. */ #include -/* Basic FreeRTOS definitions. */ -#include "projdefs.h" +/* + * If stdint.h cannot be located then: + * + If using GCC ensure the -nostdint options is *not* being used. + * + Ensure the project's include path includes the directory in which your + * compiler stores stdint.h. + * + Set any compiler options necessary for it to support C99, as technically + * stdint.h is only mandatory with C99 (FreeRTOS does not require C99 in any + * other way). + * + The FreeRTOS download includes a simple stdint.h definition that can be + * used in cases where none is provided by the compiler. The files only + * contains the typedefs required to build FreeRTOS. Read the instructions + * in FreeRTOS/source/stdint.readme for more information. + */ +#include /* READ COMMENT ABOVE. */ + +#ifdef __cplusplus +extern "C" { +#endif /* Application specific configuration options. */ #include "FreeRTOSConfig.h" -/* configUSE_PORT_OPTIMISED_TASK_SELECTION must be defined before portable.h -is included as it is used by the port layer. */ -#ifndef configUSE_PORT_OPTIMISED_TASK_SELECTION - #define configUSE_PORT_OPTIMISED_TASK_SELECTION 0 -#endif +/* Basic FreeRTOS definitions. */ +#include "projdefs.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 configMINIMAL_STACK_SIZE + #error Missing definition: configMINIMAL_STACK_SIZE must be defined in FreeRTOSConfig.h. configMINIMAL_STACK_SIZE defines the size (in words) of the stack allocated to the idle task. Refer to the demo project provided for your port for a suitable value. +#endif + +#ifndef configMAX_PRIORITIES + #error Missing definition: configMAX_PRIORITIES must be defined in FreeRTOSConfig.h. See the Configuration section of the FreeRTOS API documentation for details. +#endif + #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. + #error Missing definition: configUSE_PREEMPTION must 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. + #error Missing definition: configUSE_IDLE_HOOK must 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. + #error Missing definition: configUSE_TICK_HOOK must 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. + #error Missing definition: INCLUDE_vTaskPrioritySet must 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. + #error Missing definition: INCLUDE_uxTaskPriorityGet must 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. + #error Missing definition: INCLUDE_vTaskDelete must 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. + #error Missing definition: INCLUDE_vTaskSuspend must 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. + #error Missing definition: INCLUDE_vTaskDelayUntil must 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. + #error Missing definition: INCLUDE_vTaskDelay must 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. + #error Missing definition: configUSE_16_BIT_TICKS must be defined in FreeRTOSConfig.h as either 1 or 0. See the Configuration section of the FreeRTOS API documentation for details. +#endif + +#ifndef configMAX_PRIORITIES + #error configMAX_PRIORITIES must be defined to be greater than or equal to 1. +#endif + +#ifndef configUSE_CO_ROUTINES + #define configUSE_CO_ROUTINES 0 +#endif + +#if configUSE_CO_ROUTINES != 0 + #ifndef configMAX_CO_ROUTINE_PRIORITIES + #error configMAX_CO_ROUTINE_PRIORITIES must be greater than or equal to 1. + #endif #endif #ifndef INCLUDE_xTaskGetIdleTaskHandle @@ -179,6 +195,10 @@ typedef portBASE_TYPE (*pdTASK_HOOK_CODE)( void * ); #define configUSE_APPLICATION_TASK_TAG 0 #endif +#ifndef configNUM_THREAD_LOCAL_STORAGE_POINTERS + #define configNUM_THREAD_LOCAL_STORAGE_POINTERS 0 +#endif + #ifndef INCLUDE_uxTaskGetStackHighWaterMark #define INCLUDE_uxTaskGetStackHighWaterMark 0 #endif @@ -227,12 +247,19 @@ typedef portBASE_TYPE (*pdTASK_HOOK_CODE)( void * ); #define INCLUDE_xTaskResumeFromISR 1 #endif -#ifndef configASSERT - #define configASSERT( x ) +#ifndef INCLUDE_xEventGroupSetBitFromISR + #define INCLUDE_xEventGroupSetBitFromISR 0 +#endif + +#ifndef INCLUDE_xTimerPendFunctionCall + #define INCLUDE_xTimerPendFunctionCall 0 #endif -#ifndef portALIGNMENT_ASSERT_pxCurrentTCB - #define portALIGNMENT_ASSERT_pxCurrentTCB configASSERT +#ifndef configASSERT + #define configASSERT( x ) + #define configASSERT_DEFINED 0 +#else + #define configASSERT_DEFINED 1 #endif /* The timers module relies on xTaskGetSchedulerState(). */ @@ -273,6 +300,10 @@ typedef portBASE_TYPE (*pdTASK_HOOK_CODE)( void * ); #define portCLEAN_UP_TCB( pxTCB ) ( void ) pxTCB #endif +#ifndef portPRE_TASK_DELETE_HOOK + #define portPRE_TASK_DELETE_HOOK( pvTaskToDelete, pxYieldPending ) +#endif + #ifndef portSETUP_TCB #define portSETUP_TCB( pxTCB ) ( void ) pxTCB #endif @@ -287,7 +318,7 @@ typedef portBASE_TYPE (*pdTASK_HOOK_CODE)( void * ); #endif #ifndef portPOINTER_SIZE_TYPE - #define portPOINTER_SIZE_TYPE unsigned long + #define portPOINTER_SIZE_TYPE uint32_t #endif /* Remove any unused trace macros. */ @@ -309,6 +340,22 @@ typedef portBASE_TYPE (*pdTASK_HOOK_CODE)( void * ); #define traceTASK_SWITCHED_IN() #endif +#ifndef traceINCREASE_TICK_COUNT + /* Called before stepping the tick count after waking from tickless idle + sleep. */ + #define traceINCREASE_TICK_COUNT( x ) +#endif + +#ifndef traceLOW_POWER_IDLE_BEGIN + /* Called immediately before entering tickless idle. */ + #define traceLOW_POWER_IDLE_BEGIN() +#endif + +#ifndef traceLOW_POWER_IDLE_END + /* Called when returning to the Idle task after a tickless idle. */ + #define traceLOW_POWER_IDLE_END() +#endif + #ifndef traceTASK_SWITCHED_OUT /* Called before a task has been selected to run. pxCurrentTCB holds a pointer to the task control block of the task being switched out. */ @@ -414,6 +461,10 @@ typedef portBASE_TYPE (*pdTASK_HOOK_CODE)( void * ); #define traceQUEUE_PEEK( pxQueue ) #endif +#ifndef traceQUEUE_PEEK_FROM_ISR + #define traceQUEUE_PEEK_FROM_ISR( pxQueue ) +#endif + #ifndef traceQUEUE_RECEIVE_FAILED #define traceQUEUE_RECEIVE_FAILED( pxQueue ) #endif @@ -434,6 +485,10 @@ typedef portBASE_TYPE (*pdTASK_HOOK_CODE)( void * ); #define traceQUEUE_RECEIVE_FROM_ISR_FAILED( pxQueue ) #endif +#ifndef traceQUEUE_PEEK_FROM_ISR_FAILED + #define traceQUEUE_PEEK_FROM_ISR_FAILED( pxQueue ) +#endif + #ifndef traceQUEUE_DELETE #define traceQUEUE_DELETE( pxQueue ) #endif @@ -498,6 +553,98 @@ typedef portBASE_TYPE (*pdTASK_HOOK_CODE)( void * ); #define traceTIMER_COMMAND_RECEIVED( pxTimer, xMessageID, xMessageValue ) #endif +#ifndef traceMALLOC + #define traceMALLOC( pvAddress, uiSize ) +#endif + +#ifndef traceFREE + #define traceFREE( pvAddress, uiSize ) +#endif + +#ifndef traceEVENT_GROUP_CREATE + #define traceEVENT_GROUP_CREATE( xEventGroup ) +#endif + +#ifndef traceEVENT_GROUP_CREATE_FAILED + #define traceEVENT_GROUP_CREATE_FAILED() +#endif + +#ifndef traceEVENT_GROUP_SYNC_BLOCK + #define traceEVENT_GROUP_SYNC_BLOCK( xEventGroup, uxBitsToSet, uxBitsToWaitFor ) +#endif + +#ifndef traceEVENT_GROUP_SYNC_END + #define traceEVENT_GROUP_SYNC_END( xEventGroup, uxBitsToSet, uxBitsToWaitFor, xTimeoutOccurred ) ( void ) xTimeoutOccurred +#endif + +#ifndef traceEVENT_GROUP_WAIT_BITS_BLOCK + #define traceEVENT_GROUP_WAIT_BITS_BLOCK( xEventGroup, uxBitsToWaitFor ) +#endif + +#ifndef traceEVENT_GROUP_WAIT_BITS_END + #define traceEVENT_GROUP_WAIT_BITS_END( xEventGroup, uxBitsToWaitFor, xTimeoutOccurred ) ( void ) xTimeoutOccurred +#endif + +#ifndef traceEVENT_GROUP_CLEAR_BITS + #define traceEVENT_GROUP_CLEAR_BITS( xEventGroup, uxBitsToClear ) +#endif + +#ifndef traceEVENT_GROUP_CLEAR_BITS_FROM_ISR + #define traceEVENT_GROUP_CLEAR_BITS_FROM_ISR( xEventGroup, uxBitsToClear ) +#endif + +#ifndef traceEVENT_GROUP_SET_BITS + #define traceEVENT_GROUP_SET_BITS( xEventGroup, uxBitsToSet ) +#endif + +#ifndef traceEVENT_GROUP_SET_BITS_FROM_ISR + #define traceEVENT_GROUP_SET_BITS_FROM_ISR( xEventGroup, uxBitsToSet ) +#endif + +#ifndef traceEVENT_GROUP_DELETE + #define traceEVENT_GROUP_DELETE( xEventGroup ) +#endif + +#ifndef tracePEND_FUNC_CALL + #define tracePEND_FUNC_CALL(xFunctionToPend, pvParameter1, ulParameter2, ret) +#endif + +#ifndef tracePEND_FUNC_CALL_FROM_ISR + #define tracePEND_FUNC_CALL_FROM_ISR(xFunctionToPend, pvParameter1, ulParameter2, ret) +#endif + +#ifndef traceQUEUE_REGISTRY_ADD + #define traceQUEUE_REGISTRY_ADD(xQueue, pcQueueName) +#endif + +#ifndef traceTASK_NOTIFY_TAKE_BLOCK + #define traceTASK_NOTIFY_TAKE_BLOCK() +#endif + +#ifndef traceTASK_NOTIFY_TAKE + #define traceTASK_NOTIFY_TAKE() +#endif + +#ifndef traceTASK_NOTIFY_WAIT_BLOCK + #define traceTASK_NOTIFY_WAIT_BLOCK() +#endif + +#ifndef traceTASK_NOTIFY_WAIT + #define traceTASK_NOTIFY_WAIT() +#endif + +#ifndef traceTASK_NOTIFY + #define traceTASK_NOTIFY() +#endif + +#ifndef traceTASK_NOTIFY_FROM_ISR + #define traceTASK_NOTIFY_FROM_ISR() +#endif + +#ifndef traceTASK_NOTIFY_GIVE_FROM_ISR + #define traceTASK_NOTIFY_GIVE_FROM_ISR() +#endif + #ifndef configGENERATE_RUN_TIME_STATS #define configGENERATE_RUN_TIME_STATS 0 #endif @@ -525,7 +672,7 @@ typedef portBASE_TYPE (*pdTASK_HOOK_CODE)( void * ); #endif #ifndef portPRIVILEGE_BIT - #define portPRIVILEGE_BIT ( ( unsigned portBASE_TYPE ) 0x00 ) + #define portPRIVILEGE_BIT ( ( UBaseType_t ) 0x00 ) #endif #ifndef portYIELD_WITHIN_API @@ -568,8 +715,121 @@ typedef portBASE_TYPE (*pdTASK_HOOK_CODE)( void * ); #define configUSE_QUEUE_SETS 0 #endif -/* For backward compatability. */ -#define eTaskStateGet eTaskGetState +#ifndef portTASK_USES_FLOATING_POINT + #define portTASK_USES_FLOATING_POINT() +#endif + +#ifndef configUSE_TIME_SLICING + #define configUSE_TIME_SLICING 1 +#endif + +#ifndef configINCLUDE_APPLICATION_DEFINED_PRIVILEGED_FUNCTIONS + #define configINCLUDE_APPLICATION_DEFINED_PRIVILEGED_FUNCTIONS 0 +#endif + +#ifndef configUSE_NEWLIB_REENTRANT + #define configUSE_NEWLIB_REENTRANT 0 +#endif + +#ifndef configUSE_STATS_FORMATTING_FUNCTIONS + #define configUSE_STATS_FORMATTING_FUNCTIONS 0 +#endif + +#ifndef portASSERT_IF_INTERRUPT_PRIORITY_INVALID + #define portASSERT_IF_INTERRUPT_PRIORITY_INVALID() +#endif + +#ifndef configUSE_TRACE_FACILITY + #define configUSE_TRACE_FACILITY 0 +#endif + +#ifndef mtCOVERAGE_TEST_MARKER + #define mtCOVERAGE_TEST_MARKER() +#endif + +#ifndef mtCOVERAGE_TEST_DELAY + #define mtCOVERAGE_TEST_DELAY() +#endif + +#ifndef portASSERT_IF_IN_ISR + #define portASSERT_IF_IN_ISR() +#endif + +#ifndef configUSE_PORT_OPTIMISED_TASK_SELECTION + #define configUSE_PORT_OPTIMISED_TASK_SELECTION 0 +#endif + +#ifndef configAPPLICATION_ALLOCATED_HEAP + #define configAPPLICATION_ALLOCATED_HEAP 0 +#endif + +#ifndef configUSE_TASK_NOTIFICATIONS + #define configUSE_TASK_NOTIFICATIONS 1 +#endif + +#ifndef portTICK_TYPE_IS_ATOMIC + #define portTICK_TYPE_IS_ATOMIC 0 +#endif + +#if( portTICK_TYPE_IS_ATOMIC == 0 ) + /* Either variables of tick type cannot be read atomically, or + portTICK_TYPE_IS_ATOMIC was not set - map the critical sections used when + the tick count is returned to the standard critical section macros. */ + #define portTICK_TYPE_ENTER_CRITICAL() portENTER_CRITICAL() + #define portTICK_TYPE_EXIT_CRITICAL() portEXIT_CRITICAL() + #define portTICK_TYPE_SET_INTERRUPT_MASK_FROM_ISR() portSET_INTERRUPT_MASK_FROM_ISR() + #define portTICK_TYPE_CLEAR_INTERRUPT_MASK_FROM_ISR( x ) portCLEAR_INTERRUPT_MASK_FROM_ISR( ( x ) ) +#else + /* The tick type can be read atomically, so critical sections used when the + tick count is returned can be defined away. */ + #define portTICK_TYPE_ENTER_CRITICAL() + #define portTICK_TYPE_EXIT_CRITICAL() + #define portTICK_TYPE_SET_INTERRUPT_MASK_FROM_ISR() 0 + #define portTICK_TYPE_CLEAR_INTERRUPT_MASK_FROM_ISR( x ) ( void ) x +#endif + +/* Definitions to allow backward compatibility with FreeRTOS versions prior to +V8 if desired. */ +#ifndef configENABLE_BACKWARD_COMPATIBILITY + #define configENABLE_BACKWARD_COMPATIBILITY 1 +#endif + +#if configENABLE_BACKWARD_COMPATIBILITY == 1 + #define eTaskStateGet eTaskGetState + #define portTickType TickType_t + #define xTaskHandle TaskHandle_t + #define xQueueHandle QueueHandle_t + #define xSemaphoreHandle SemaphoreHandle_t + #define xQueueSetHandle QueueSetHandle_t + #define xQueueSetMemberHandle QueueSetMemberHandle_t + #define xTimeOutType TimeOut_t + #define xMemoryRegion MemoryRegion_t + #define xTaskParameters TaskParameters_t + #define xTaskStatusType TaskStatus_t + #define xTimerHandle TimerHandle_t + #define xCoRoutineHandle CoRoutineHandle_t + #define pdTASK_HOOK_CODE TaskHookFunction_t + #define portTICK_RATE_MS portTICK_PERIOD_MS + + /* Backward compatibility within the scheduler code only - these definitions + are not really required but are included for completeness. */ + #define tmrTIMER_CALLBACK TimerCallbackFunction_t + #define pdTASK_CODE TaskFunction_t + #define xListItem ListItem_t + #define xList List_t +#endif /* configENABLE_BACKWARD_COMPATIBILITY */ + +/* Set configUSE_TASK_FPU_SUPPORT to 0 to omit floating point support even +if floating point hardware is otherwise supported by the FreeRTOS port in use. +This constant is not supported by all FreeRTOS ports that include floating +point support. */ +#ifndef configUSE_TASK_FPU_SUPPORT + #define configUSE_TASK_FPU_SUPPORT 1 +#endif + +#ifdef __cplusplus +} +#endif #endif /* INC_FREERTOS_H */ diff --git a/lib/FreeRTOS/include/StackMacros.h b/lib/FreeRTOS/include/StackMacros.h index d8080096b6..1359090c32 100644 --- a/lib/FreeRTOS/include/StackMacros.h +++ b/lib/FreeRTOS/include/StackMacros.h @@ -1,75 +1,70 @@ /* - FreeRTOS V7.4.0 - Copyright (C) 2013 Real Time Engineers Ltd. - - FEATURES AND PORTS ARE ADDED TO FREERTOS ALL THE TIME. PLEASE VISIT - http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. - - *************************************************************************** - * * - * 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! * - * * - *************************************************************************** + FreeRTOS V8.2.3 - Copyright (C) 2015 Real Time Engineers Ltd. + All rights reserved + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. This file is part of the FreeRTOS distribution. FreeRTOS is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License (version 2) as published by the - Free Software Foundation AND MODIFIED BY the FreeRTOS exception. + 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. + *************************************************************************** + >>! 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 itcan be - viewed here: http://www.freertos.org/a00114.html and also obtained by - writing to Real Time Engineers Ltd., contact details for whom are available - on the FreeRTOS WEB site. - - 1 tab == 4 spaces! + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html *************************************************************************** * * - * Having a problem? Start by reading the FAQ "My application does * - * not run, what could be wrong?" * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * * * - * http://www.FreeRTOS.org/FAQHelp.html * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * * * *************************************************************************** + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? - http://www.FreeRTOS.org - Documentation, books, training, latest versions, - license and Real Time Engineers Ltd. contact details. + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, - including FreeRTOS+Trace - an indispensable productivity tool, and our new - fully thread aware and reentrant UDP/IP stack. - - http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High - Integrity Systems, who sell the code with commercial support, - indemnification and middleware, under the OpenRTOS brand. - - http://www.SafeRTOS.com - High Integrity Systems also provide a safety - engineered and independently SIL3 certified version for use in safety and + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and mission critical applications that require provable dependability. + + 1 tab == 4 spaces! */ #ifndef STACK_MACROS_H @@ -91,49 +86,31 @@ /*-----------------------------------------------------------*/ -#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 ) ) +#if( ( configCHECK_FOR_STACK_OVERFLOW == 1 ) && ( portSTACK_GROWTH < 0 ) ) /* Only the current stack state is to be checked. */ - #define taskFIRST_CHECK_FOR_STACK_OVERFLOW() \ + #define taskCHECK_FOR_STACK_OVERFLOW() \ { \ /* Is the currently saved stack pointer within the stack limit? */ \ if( pxCurrentTCB->pxTopOfStack <= pxCurrentTCB->pxStack ) \ { \ - vApplicationStackOverflowHook( ( xTaskHandle ) pxCurrentTCB, pxCurrentTCB->pcTaskName ); \ + vApplicationStackOverflowHook( ( TaskHandle_t ) pxCurrentTCB, pxCurrentTCB->pcTaskName ); \ } \ } -#endif /* configCHECK_FOR_STACK_OVERFLOW > 0 */ +#endif /* configCHECK_FOR_STACK_OVERFLOW == 1 */ /*-----------------------------------------------------------*/ -#if( ( configCHECK_FOR_STACK_OVERFLOW > 0 ) && ( portSTACK_GROWTH > 0 ) ) +#if( ( configCHECK_FOR_STACK_OVERFLOW == 1 ) && ( portSTACK_GROWTH > 0 ) ) /* Only the current stack state is to be checked. */ - #define taskFIRST_CHECK_FOR_STACK_OVERFLOW() \ + #define taskCHECK_FOR_STACK_OVERFLOW() \ { \ \ /* Is the currently saved stack pointer within the stack limit? */ \ if( pxCurrentTCB->pxTopOfStack >= pxCurrentTCB->pxEndOfStack ) \ { \ - vApplicationStackOverflowHook( ( xTaskHandle ) pxCurrentTCB, pxCurrentTCB->pcTaskName ); \ + vApplicationStackOverflowHook( ( TaskHandle_t ) pxCurrentTCB, pxCurrentTCB->pcTaskName ); \ } \ } @@ -142,20 +119,18 @@ #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 ); \ - } \ + #define taskCHECK_FOR_STACK_OVERFLOW() \ + { \ + const uint32_t * const pulStack = ( uint32_t * ) pxCurrentTCB->pxStack; \ + const uint32_t ulCheckValue = ( uint32_t ) 0xa5a5a5a5; \ + \ + if( ( pulStack[ 0 ] != ulCheckValue ) || \ + ( pulStack[ 1 ] != ulCheckValue ) || \ + ( pulStack[ 2 ] != ulCheckValue ) || \ + ( pulStack[ 3 ] != ulCheckValue ) ) \ + { \ + vApplicationStackOverflowHook( ( TaskHandle_t ) pxCurrentTCB, pxCurrentTCB->pcTaskName ); \ + } \ } #endif /* #if( configCHECK_FOR_STACK_OVERFLOW > 1 ) */ @@ -163,27 +138,34 @@ #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 ); \ - } \ + #define taskCHECK_FOR_STACK_OVERFLOW() \ + { \ + int8_t *pcEndOfStack = ( int8_t * ) pxCurrentTCB->pxEndOfStack; \ + static const uint8_t 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( ( TaskHandle_t ) pxCurrentTCB, pxCurrentTCB->pcTaskName ); \ + } \ } #endif /* #if( configCHECK_FOR_STACK_OVERFLOW > 1 ) */ /*-----------------------------------------------------------*/ +/* Remove stack overflow macro if not being used. */ +#ifndef taskCHECK_FOR_STACK_OVERFLOW + #define taskCHECK_FOR_STACK_OVERFLOW() +#endif + + + #endif /* STACK_MACROS_H */ diff --git a/lib/FreeRTOS/include/croutine.h b/lib/FreeRTOS/include/croutine.h index 361bd1ea1a..dc655ae20c 100644 --- a/lib/FreeRTOS/include/croutine.h +++ b/lib/FreeRTOS/include/croutine.h @@ -1,75 +1,70 @@ /* - FreeRTOS V7.4.0 - Copyright (C) 2013 Real Time Engineers Ltd. - - FEATURES AND PORTS ARE ADDED TO FREERTOS ALL THE TIME. PLEASE VISIT - http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. - - *************************************************************************** - * * - * 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! * - * * - *************************************************************************** + FreeRTOS V8.2.3 - Copyright (C) 2015 Real Time Engineers Ltd. + All rights reserved + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. This file is part of the FreeRTOS distribution. FreeRTOS is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License (version 2) as published by the - Free Software Foundation AND MODIFIED BY the FreeRTOS exception. + 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. + *************************************************************************** + >>! 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 itcan be - viewed here: http://www.freertos.org/a00114.html and also obtained by - writing to Real Time Engineers Ltd., contact details for whom are available - on the FreeRTOS WEB site. - - 1 tab == 4 spaces! + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html *************************************************************************** * * - * Having a problem? Start by reading the FAQ "My application does * - * not run, what could be wrong?" * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * * * - * http://www.FreeRTOS.org/FAQHelp.html * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * * * *************************************************************************** + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? - http://www.FreeRTOS.org - Documentation, books, training, latest versions, - license and Real Time Engineers Ltd. contact details. + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, - including FreeRTOS+Trace - an indispensable productivity tool, and our new - fully thread aware and reentrant UDP/IP stack. - - http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High - Integrity Systems, who sell the code with commercial support, - indemnification and middleware, under the OpenRTOS brand. - - http://www.SafeRTOS.com - High Integrity Systems also provide a safety - engineered and independently SIL3 certified version for use in safety and + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and mission critical applications that require provable dependability. + + 1 tab == 4 spaces! */ #ifndef CO_ROUTINE_H @@ -88,28 +83,28 @@ extern "C" { /* 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; +typedef void * CoRoutineHandle_t; /* Defines the prototype to which co-routine functions must conform. */ -typedef void (*crCOROUTINE_CODE)( xCoRoutineHandle, unsigned portBASE_TYPE ); +typedef void (*crCOROUTINE_CODE)( CoRoutineHandle_t, UBaseType_t ); 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. */ + crCOROUTINE_CODE pxCoRoutineFunction; + ListItem_t xGenericListItem; /*< List item used to place the CRCB in ready and blocked queues. */ + ListItem_t xEventListItem; /*< List item used to place the CRCB in event lists. */ + UBaseType_t uxPriority; /*< The priority of the co-routine in relation to other co-routines. */ + UBaseType_t uxIndex; /*< Used to distinguish between co-routines when multiple co-routines use the same co-routine function. */ + uint16_t uxState; /*< Used internally by the co-routine implementation. */ +} CRCB_t; /* Co-routine control block. Note must be identical in size down to uxPriority with TCB_t. */ /** * croutine. h *
- portBASE_TYPE xCoRoutineCreate(
+ BaseType_t xCoRoutineCreate(
                                  crCOROUTINE_CODE pxCoRoutineCode,
-                                 unsigned portBASE_TYPE uxPriority,
-                                 unsigned portBASE_TYPE uxIndex
+                                 UBaseType_t uxPriority,
+                                 UBaseType_t uxIndex
                                );
* * Create a new co-routine and add it to the list of co-routines that are @@ -132,12 +127,12 @@ typedef struct corCoRoutineControlBlock * Example usage:
  // Co-routine to be created.
- void vFlashCoRoutine( xCoRoutineHandle xHandle, unsigned portBASE_TYPE uxIndex )
+ void vFlashCoRoutine( CoRoutineHandle_t xHandle, UBaseType_t 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 };
+ static const TickType_t uxFlashRates[ 2 ] = { 200, 400 };
 
      // Must start every co-routine with a call to crSTART();
      crSTART( xHandle );
@@ -147,7 +142,7 @@ typedef struct corCoRoutineControlBlock
          // 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
+         // LED to flash and how int32_t to delay.  This assumes xQueue has
          // already been created.
          vParTestToggleLED( cLedToFlash[ uxIndex ] );
          crDELAY( xHandle, uxFlashRates[ uxIndex ] );
@@ -160,9 +155,9 @@ typedef struct corCoRoutineControlBlock
  // Function that creates two co-routines.
  void vOtherFunction( void )
  {
- unsigned char ucParameterToPass;
- xTaskHandle xHandle;
-		
+ uint8_t ucParameterToPass;
+ TaskHandle_t 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.
@@ -175,7 +170,7 @@ typedef struct corCoRoutineControlBlock
  * \defgroup xCoRoutineCreate xCoRoutineCreate
  * \ingroup Tasks
  */
-signed portBASE_TYPE xCoRoutineCreate( crCOROUTINE_CODE pxCoRoutineCode, unsigned portBASE_TYPE uxPriority, unsigned portBASE_TYPE uxIndex );
+BaseType_t xCoRoutineCreate( crCOROUTINE_CODE pxCoRoutineCode, UBaseType_t uxPriority, UBaseType_t uxIndex );
 
 
 /**
@@ -222,17 +217,17 @@ void vCoRoutineSchedule( void );
 /**
  * croutine. h
  * 
- crSTART( xCoRoutineHandle xHandle );
+ crSTART( CoRoutineHandle_t xHandle );
* * This macro MUST always be called at the start of a co-routine function. * * Example usage:
  // Co-routine to be created.
- void vACoRoutine( xCoRoutineHandle xHandle, unsigned portBASE_TYPE uxIndex )
+ void vACoRoutine( CoRoutineHandle_t xHandle, UBaseType_t uxIndex )
  {
  // Variables in co-routines must be declared static if they must maintain value across a blocking call.
- static long ulAVariable;
+ static int32_t ulAVariable;
 
      // Must start every co-routine with a call to crSTART();
      crSTART( xHandle );
@@ -248,7 +243,7 @@ void vCoRoutineSchedule( void );
  * \defgroup crSTART crSTART
  * \ingroup Tasks
  */
-#define crSTART( pxCRCB ) switch( ( ( corCRCB * )( pxCRCB ) )->uxState ) { case 0:
+#define crSTART( pxCRCB ) switch( ( ( CRCB_t * )( pxCRCB ) )->uxState ) { case 0:
 
 /**
  * croutine. h
@@ -260,10 +255,10 @@ void vCoRoutineSchedule( void );
  * Example usage:
    
  // Co-routine to be created.
- void vACoRoutine( xCoRoutineHandle xHandle, unsigned portBASE_TYPE uxIndex )
+ void vACoRoutine( CoRoutineHandle_t xHandle, UBaseType_t uxIndex )
  {
  // Variables in co-routines must be declared static if they must maintain value across a blocking call.
- static long ulAVariable;
+ static int32_t ulAVariable;
 
      // Must start every co-routine with a call to crSTART();
      crSTART( xHandle );
@@ -285,13 +280,13 @@ void vCoRoutineSchedule( void );
  * 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):
+#define crSET_STATE0( xHandle ) ( ( CRCB_t * )( xHandle ) )->uxState = (__LINE__ * 2); return; case (__LINE__ * 2):
+#define crSET_STATE1( xHandle ) ( ( CRCB_t * )( xHandle ) )->uxState = ((__LINE__ * 2)+1); return; case ((__LINE__ * 2)+1):
 
 /**
  * croutine. h
  *
- crDELAY( xCoRoutineHandle xHandle, portTickType xTicksToDelay );
+ crDELAY( CoRoutineHandle_t xHandle, TickType_t xTicksToDelay );
* * Delay a co-routine for a fixed period of time. * @@ -304,18 +299,18 @@ void vCoRoutineSchedule( void ); * * @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 + * configTICK_RATE_HZ (set in FreeRTOSConfig.h). The constant portTICK_PERIOD_MS * can be used to convert ticks to milliseconds. * * Example usage:
  // Co-routine to be created.
- void vACoRoutine( xCoRoutineHandle xHandle, unsigned portBASE_TYPE uxIndex )
+ void vACoRoutine( CoRoutineHandle_t xHandle, UBaseType_t 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;
+ static const xTickType xDelayTime = 200 / portTICK_PERIOD_MS;
 
      // Must start every co-routine with a call to crSTART();
      crSTART( xHandle );
@@ -344,11 +339,11 @@ void vCoRoutineSchedule( void );
 /**
  * 
  crQUEUE_SEND(
-                  xCoRoutineHandle xHandle,
-                  xQueueHandle pxQueue,
+                  CoRoutineHandle_t xHandle,
+                  QueueHandle_t pxQueue,
                   void *pvItemToQueue,
-                  portTickType xTicksToWait,
-                  portBASE_TYPE *pxResult
+                  TickType_t xTicksToWait,
+                  BaseType_t *pxResult
              )
* * The macro's crQUEUE_SEND() and crQUEUE_RECEIVE() are the co-routine @@ -381,7 +376,7 @@ void vCoRoutineSchedule( void ); * 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 + * portTICK_PERIOD_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 @@ -392,11 +387,11 @@ void vCoRoutineSchedule( void );
  // 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 )
+ static void prvCoRoutineFlashTask( CoRoutineHandle_t xHandle, UBaseType_t 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;
+ static BaseType_t xNumberToPost = 0;
+ static BaseType_t xResult;
 
     // Co-routines must begin with a call to crSTART().
     crSTART( xHandle );
@@ -443,11 +438,11 @@ void vCoRoutineSchedule( void );
  * croutine. h
  * 
   crQUEUE_RECEIVE(
-                     xCoRoutineHandle xHandle,
-                     xQueueHandle pxQueue,
+                     CoRoutineHandle_t xHandle,
+                     QueueHandle_t pxQueue,
                      void *pvBuffer,
-                     portTickType xTicksToWait,
-                     portBASE_TYPE *pxResult
+                     TickType_t xTicksToWait,
+                     BaseType_t *pxResult
                  )
* * The macro's crQUEUE_SEND() and crQUEUE_RECEIVE() are the co-routine @@ -479,7 +474,7 @@ void vCoRoutineSchedule( void ); * 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 + * portTICK_PERIOD_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 @@ -490,11 +485,11 @@ void vCoRoutineSchedule( void );
  // 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 )
+ static void prvCoRoutineFlashWorkTask( CoRoutineHandle_t xHandle, UBaseType_t 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;
+ static BaseType_t xResult;
+ static UBaseType_t uxLEDToFlash;
 
     // All co-routines must start with a call to crSTART().
     crSTART( xHandle );
@@ -535,9 +530,9 @@ void vCoRoutineSchedule( void );
  * croutine. h
  * 
   crQUEUE_SEND_FROM_ISR(
-                            xQueueHandle pxQueue,
+                            QueueHandle_t pxQueue,
                             void *pvItemToQueue,
-                            portBASE_TYPE xCoRoutinePreviouslyWoken
+                            BaseType_t xCoRoutinePreviouslyWoken
                        )
* * The macro's crQUEUE_SEND_FROM_ISR() and crQUEUE_RECEIVE_FROM_ISR() are the @@ -575,10 +570,10 @@ void vCoRoutineSchedule( void ); * Example usage:
  // A co-routine that blocks on a queue waiting for characters to be received.
- static void vReceivingCoRoutine( xCoRoutineHandle xHandle, unsigned portBASE_TYPE uxIndex )
+ static void vReceivingCoRoutine( CoRoutineHandle_t xHandle, UBaseType_t uxIndex )
  {
  char cRxedChar;
- portBASE_TYPE xResult;
+ BaseType_t xResult;
 
      // All co-routines must start with a call to crSTART().
      crSTART( xHandle );
@@ -605,7 +600,7 @@ void vCoRoutineSchedule( void );
  void vUART_ISR( void )
  {
  char cRxedChar;
- portBASE_TYPE xCRWokenByPost = pdFALSE;
+ BaseType_t xCRWokenByPost = pdFALSE;
 
      // We loop around reading characters until there are none left in the UART.
      while( UART_RX_REG_NOT_EMPTY() )
@@ -632,9 +627,9 @@ void vCoRoutineSchedule( void );
  * croutine. h
  * 
   crQUEUE_SEND_FROM_ISR(
-                            xQueueHandle pxQueue,
+                            QueueHandle_t pxQueue,
                             void *pvBuffer,
-                            portBASE_TYPE * pxCoRoutineWoken
+                            BaseType_t * pxCoRoutineWoken
                        )
* * The macro's crQUEUE_SEND_FROM_ISR() and crQUEUE_RECEIVE_FROM_ISR() are the @@ -673,12 +668,12 @@ void vCoRoutineSchedule( void );
  // 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 )
+ static void vSendingCoRoutine( CoRoutineHandle_t xHandle, UBaseType_t uxIndex )
  {
  // cChar holds its value while this co-routine is blocked and must therefore
  // be declared static.
  static char cCharToTx = 'a';
- portBASE_TYPE xResult;
+ BaseType_t xResult;
 
      // All co-routines must start with a call to crSTART().
      crSTART( xHandle );
@@ -721,7 +716,7 @@ void vCoRoutineSchedule( void );
  void vUART_ISR( void )
  {
  char cCharToTx;
- portBASE_TYPE xCRWokenByPost = pdFALSE;
+ BaseType_t xCRWokenByPost = pdFALSE;
 
      while( UART_TX_REG_EMPTY() )
      {
@@ -749,7 +744,7 @@ void vCoRoutineSchedule( void );
  * Removes the current co-routine from its ready list and places it in the
  * appropriate delayed list.
  */
-void vCoRoutineAddToDelayedList( portTickType xTicksToDelay, xList *pxEventList );
+void vCoRoutineAddToDelayedList( TickType_t xTicksToDelay, List_t *pxEventList );
 
 /*
  * This function is intended for internal use by the queue implementation only.
@@ -758,7 +753,7 @@ void vCoRoutineAddToDelayedList( portTickType xTicksToDelay, xList *pxEventList
  * 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 );
+BaseType_t xCoRoutineRemoveFromEventList( const List_t *pxEventList );
 
 #ifdef __cplusplus
 }
diff --git a/lib/FreeRTOS/include/deprecated_definitions.h b/lib/FreeRTOS/include/deprecated_definitions.h
new file mode 100644
index 0000000000..0fad862693
--- /dev/null
+++ b/lib/FreeRTOS/include/deprecated_definitions.h
@@ -0,0 +1,321 @@
+/*
+    FreeRTOS V8.2.3 - Copyright (C) 2015 Real Time Engineers Ltd.
+    All rights reserved
+
+    VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION.
+
+    This file is part of the FreeRTOS distribution.
+
+    FreeRTOS is free software; you can redistribute it and/or modify it under
+    the terms of the GNU General Public License (version 2) as published by the
+    Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception.
+
+    ***************************************************************************
+    >>!   NOTE: The modification to the GPL is included to allow you to     !<<
+    >>!   distribute a combined work that includes FreeRTOS without being   !<<
+    >>!   obliged to provide the source code for proprietary components     !<<
+    >>!   outside of the FreeRTOS kernel.                                   !<<
+    ***************************************************************************
+
+    FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY
+    WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+    FOR A PARTICULAR PURPOSE.  Full license text is available on the following
+    link: http://www.freertos.org/a00114.html
+
+    ***************************************************************************
+     *                                                                       *
+     *    FreeRTOS provides completely free yet professionally developed,    *
+     *    robust, strictly quality controlled, supported, and cross          *
+     *    platform software that is more than just the market leader, it     *
+     *    is the industry's de facto standard.                               *
+     *                                                                       *
+     *    Help yourself get started quickly while simultaneously helping     *
+     *    to support the FreeRTOS project by purchasing a FreeRTOS           *
+     *    tutorial book, reference manual, or both:                          *
+     *    http://www.FreeRTOS.org/Documentation                              *
+     *                                                                       *
+    ***************************************************************************
+
+    http://www.FreeRTOS.org/FAQHelp.html - Having a problem?  Start by reading
+    the FAQ page "My application does not run, what could be wrong?".  Have you
+    defined configASSERT()?
+
+    http://www.FreeRTOS.org/support - In return for receiving this top quality
+    embedded software for free we request you assist our global community by
+    participating in the support forum.
+
+    http://www.FreeRTOS.org/training - Investing in training allows your team to
+    be as productive as possible as early as possible.  Now you can receive
+    FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers
+    Ltd, and the world's leading authority on the world's leading RTOS.
+
+    http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products,
+    including FreeRTOS+Trace - an indispensable productivity tool, a DOS
+    compatible FAT file system, and our tiny thread aware UDP/IP stack.
+
+    http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate.
+    Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS.
+
+    http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High
+    Integrity Systems ltd. to sell under the OpenRTOS brand.  Low cost OpenRTOS
+    licenses offer ticketed support, indemnification and commercial middleware.
+
+    http://www.SafeRTOS.com - High Integrity Systems also provide a safety
+    engineered and independently SIL3 certified version for use in safety and
+    mission critical applications that require provable dependability.
+
+    1 tab == 4 spaces!
+*/
+
+#ifndef DEPRECATED_DEFINITIONS_H
+#define DEPRECATED_DEFINITIONS_H
+
+
+/* Each FreeRTOS port has a unique portmacro.h header file.  Originally a
+pre-processor definition was used to ensure the pre-processor found the correct
+portmacro.h file for the port being used.  That scheme was deprecated in favour
+of setting the compiler's include path such that it found the correct
+portmacro.h file - removing the need for the constant and allowing the
+portmacro.h file to be located anywhere in relation to the port being used.  The
+definitions below remain in the code for backward compatibility only.  New
+projects should not use them. */
+
+#ifdef OPEN_WATCOM_INDUSTRIAL_PC_PORT
+	#include "..\..\Source\portable\owatcom\16bitdos\pc\portmacro.h"
+	typedef void ( __interrupt __far *pxISR )();
+#endif
+
+#ifdef OPEN_WATCOM_FLASH_LITE_186_PORT
+	#include "..\..\Source\portable\owatcom\16bitdos\flsh186\portmacro.h"
+	typedef void ( __interrupt __far *pxISR )();
+#endif
+
+#ifdef GCC_MEGA_AVR
+	#include "../portable/GCC/ATMega323/portmacro.h"
+#endif
+
+#ifdef IAR_MEGA_AVR
+	#include "../portable/IAR/ATMega323/portmacro.h"
+#endif
+
+#ifdef MPLAB_PIC24_PORT
+	#include "../../Source/portable/MPLAB/PIC24_dsPIC/portmacro.h"
+#endif
+
+#ifdef MPLAB_DSPIC_PORT
+	#include "../../Source/portable/MPLAB/PIC24_dsPIC/portmacro.h"
+#endif
+
+#ifdef MPLAB_PIC18F_PORT
+	#include "../../Source/portable/MPLAB/PIC18F/portmacro.h"
+#endif
+
+#ifdef MPLAB_PIC32MX_PORT
+	#include "../../Source/portable/MPLAB/PIC32MX/portmacro.h"
+#endif
+
+#ifdef _FEDPICC
+	#include "libFreeRTOS/Include/portmacro.h"
+#endif
+
+#ifdef SDCC_CYGNAL
+	#include "../../Source/portable/SDCC/Cygnal/portmacro.h"
+#endif
+
+#ifdef GCC_ARM7
+	#include "../../Source/portable/GCC/ARM7_LPC2000/portmacro.h"
+#endif
+
+#ifdef GCC_ARM7_ECLIPSE
+	#include "portmacro.h"
+#endif
+
+#ifdef ROWLEY_LPC23xx
+	#include "../../Source/portable/GCC/ARM7_LPC23xx/portmacro.h"
+#endif
+
+#ifdef IAR_MSP430
+	#include "..\..\Source\portable\IAR\MSP430\portmacro.h"
+#endif
+
+#ifdef GCC_MSP430
+	#include "../../Source/portable/GCC/MSP430F449/portmacro.h"
+#endif
+
+#ifdef ROWLEY_MSP430
+	#include "../../Source/portable/Rowley/MSP430F449/portmacro.h"
+#endif
+
+#ifdef ARM7_LPC21xx_KEIL_RVDS
+	#include "..\..\Source\portable\RVDS\ARM7_LPC21xx\portmacro.h"
+#endif
+
+#ifdef SAM7_GCC
+	#include "../../Source/portable/GCC/ARM7_AT91SAM7S/portmacro.h"
+#endif
+
+#ifdef SAM7_IAR
+	#include "..\..\Source\portable\IAR\AtmelSAM7S64\portmacro.h"
+#endif
+
+#ifdef SAM9XE_IAR
+	#include "..\..\Source\portable\IAR\AtmelSAM9XE\portmacro.h"
+#endif
+
+#ifdef LPC2000_IAR
+	#include "..\..\Source\portable\IAR\LPC2000\portmacro.h"
+#endif
+
+#ifdef STR71X_IAR
+	#include "..\..\Source\portable\IAR\STR71x\portmacro.h"
+#endif
+
+#ifdef STR75X_IAR
+	#include "..\..\Source\portable\IAR\STR75x\portmacro.h"
+#endif
+
+#ifdef STR75X_GCC
+	#include "..\..\Source\portable\GCC\STR75x\portmacro.h"
+#endif
+
+#ifdef STR91X_IAR
+	#include "..\..\Source\portable\IAR\STR91x\portmacro.h"
+#endif
+
+#ifdef GCC_H8S
+	#include "../../Source/portable/GCC/H8S2329/portmacro.h"
+#endif
+
+#ifdef GCC_AT91FR40008
+	#include "../../Source/portable/GCC/ARM7_AT91FR40008/portmacro.h"
+#endif
+
+#ifdef RVDS_ARMCM3_LM3S102
+	#include "../../Source/portable/RVDS/ARM_CM3/portmacro.h"
+#endif
+
+#ifdef GCC_ARMCM3_LM3S102
+	#include "../../Source/portable/GCC/ARM_CM3/portmacro.h"
+#endif
+
+#ifdef GCC_ARMCM3
+	#include "../../Source/portable/GCC/ARM_CM3/portmacro.h"
+#endif
+
+#ifdef IAR_ARM_CM3
+	#include "../../Source/portable/IAR/ARM_CM3/portmacro.h"
+#endif
+
+#ifdef IAR_ARMCM3_LM
+	#include "../../Source/portable/IAR/ARM_CM3/portmacro.h"
+#endif
+
+#ifdef HCS12_CODE_WARRIOR
+	#include "../../Source/portable/CodeWarrior/HCS12/portmacro.h"
+#endif
+
+#ifdef MICROBLAZE_GCC
+	#include "../../Source/portable/GCC/MicroBlaze/portmacro.h"
+#endif
+
+#ifdef TERN_EE
+	#include "..\..\Source\portable\Paradigm\Tern_EE\small\portmacro.h"
+#endif
+
+#ifdef GCC_HCS12
+	#include "../../Source/portable/GCC/HCS12/portmacro.h"
+#endif
+
+#ifdef GCC_MCF5235
+    #include "../../Source/portable/GCC/MCF5235/portmacro.h"
+#endif
+
+#ifdef COLDFIRE_V2_GCC
+	#include "../../../Source/portable/GCC/ColdFire_V2/portmacro.h"
+#endif
+
+#ifdef COLDFIRE_V2_CODEWARRIOR
+	#include "../../Source/portable/CodeWarrior/ColdFire_V2/portmacro.h"
+#endif
+
+#ifdef GCC_PPC405
+	#include "../../Source/portable/GCC/PPC405_Xilinx/portmacro.h"
+#endif
+
+#ifdef GCC_PPC440
+	#include "../../Source/portable/GCC/PPC440_Xilinx/portmacro.h"
+#endif
+
+#ifdef _16FX_SOFTUNE
+	#include "..\..\Source\portable\Softune\MB96340\portmacro.h"
+#endif
+
+#ifdef BCC_INDUSTRIAL_PC_PORT
+	/* A short file name has to be used in place of the normal
+	FreeRTOSConfig.h when using the Borland compiler. */
+	#include "frconfig.h"
+	#include "..\portable\BCC\16BitDOS\PC\prtmacro.h"
+    typedef void ( __interrupt __far *pxISR )();
+#endif
+
+#ifdef BCC_FLASH_LITE_186_PORT
+	/* A short file name has to be used in place of the normal
+	FreeRTOSConfig.h when using the Borland compiler. */
+	#include "frconfig.h"
+	#include "..\portable\BCC\16BitDOS\flsh186\prtmacro.h"
+    typedef void ( __interrupt __far *pxISR )();
+#endif
+
+#ifdef __GNUC__
+   #ifdef __AVR32_AVR32A__
+	   #include "portmacro.h"
+   #endif
+#endif
+
+#ifdef __ICCAVR32__
+   #ifdef __CORE__
+      #if __CORE__ == __AVR32A__
+	      #include "portmacro.h"
+      #endif
+   #endif
+#endif
+
+#ifdef __91467D
+	#include "portmacro.h"
+#endif
+
+#ifdef __96340
+	#include "portmacro.h"
+#endif
+
+
+#ifdef __IAR_V850ES_Fx3__
+	#include "../../Source/portable/IAR/V850ES/portmacro.h"
+#endif
+
+#ifdef __IAR_V850ES_Jx3__
+	#include "../../Source/portable/IAR/V850ES/portmacro.h"
+#endif
+
+#ifdef __IAR_V850ES_Jx3_L__
+	#include "../../Source/portable/IAR/V850ES/portmacro.h"
+#endif
+
+#ifdef __IAR_V850ES_Jx2__
+	#include "../../Source/portable/IAR/V850ES/portmacro.h"
+#endif
+
+#ifdef __IAR_V850ES_Hx2__
+	#include "../../Source/portable/IAR/V850ES/portmacro.h"
+#endif
+
+#ifdef __IAR_78K0R_Kx3__
+	#include "../../Source/portable/IAR/78K0R/portmacro.h"
+#endif
+
+#ifdef __IAR_78K0R_Kx3L__
+	#include "../../Source/portable/IAR/78K0R/portmacro.h"
+#endif
+
+#endif /* DEPRECATED_DEFINITIONS_H */
+
diff --git a/lib/FreeRTOS/include/event_groups.h b/lib/FreeRTOS/include/event_groups.h
new file mode 100644
index 0000000000..a381ed0726
--- /dev/null
+++ b/lib/FreeRTOS/include/event_groups.h
@@ -0,0 +1,730 @@
+/*
+    FreeRTOS V8.2.3 - Copyright (C) 2015 Real Time Engineers Ltd.
+    All rights reserved
+
+    VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION.
+
+    This file is part of the FreeRTOS distribution.
+
+    FreeRTOS is free software; you can redistribute it and/or modify it under
+    the terms of the GNU General Public License (version 2) as published by the
+    Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception.
+
+    ***************************************************************************
+    >>!   NOTE: The modification to the GPL is included to allow you to     !<<
+    >>!   distribute a combined work that includes FreeRTOS without being   !<<
+    >>!   obliged to provide the source code for proprietary components     !<<
+    >>!   outside of the FreeRTOS kernel.                                   !<<
+    ***************************************************************************
+
+    FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY
+    WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+    FOR A PARTICULAR PURPOSE.  Full license text is available on the following
+    link: http://www.freertos.org/a00114.html
+
+    ***************************************************************************
+     *                                                                       *
+     *    FreeRTOS provides completely free yet professionally developed,    *
+     *    robust, strictly quality controlled, supported, and cross          *
+     *    platform software that is more than just the market leader, it     *
+     *    is the industry's de facto standard.                               *
+     *                                                                       *
+     *    Help yourself get started quickly while simultaneously helping     *
+     *    to support the FreeRTOS project by purchasing a FreeRTOS           *
+     *    tutorial book, reference manual, or both:                          *
+     *    http://www.FreeRTOS.org/Documentation                              *
+     *                                                                       *
+    ***************************************************************************
+
+    http://www.FreeRTOS.org/FAQHelp.html - Having a problem?  Start by reading
+    the FAQ page "My application does not run, what could be wrong?".  Have you
+    defined configASSERT()?
+
+    http://www.FreeRTOS.org/support - In return for receiving this top quality
+    embedded software for free we request you assist our global community by
+    participating in the support forum.
+
+    http://www.FreeRTOS.org/training - Investing in training allows your team to
+    be as productive as possible as early as possible.  Now you can receive
+    FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers
+    Ltd, and the world's leading authority on the world's leading RTOS.
+
+    http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products,
+    including FreeRTOS+Trace - an indispensable productivity tool, a DOS
+    compatible FAT file system, and our tiny thread aware UDP/IP stack.
+
+    http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate.
+    Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS.
+
+    http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High
+    Integrity Systems ltd. to sell under the OpenRTOS brand.  Low cost OpenRTOS
+    licenses offer ticketed support, indemnification and commercial middleware.
+
+    http://www.SafeRTOS.com - High Integrity Systems also provide a safety
+    engineered and independently SIL3 certified version for use in safety and
+    mission critical applications that require provable dependability.
+
+    1 tab == 4 spaces!
+*/
+
+#ifndef EVENT_GROUPS_H
+#define EVENT_GROUPS_H
+
+#ifndef INC_FREERTOS_H
+	#error "include FreeRTOS.h" must appear in source files before "include event_groups.h"
+#endif
+
+#include "timers.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * An event group is a collection of bits to which an application can assign a
+ * meaning.  For example, an application may create an event group to convey
+ * the status of various CAN bus related events in which bit 0 might mean "A CAN
+ * message has been received and is ready for processing", bit 1 might mean "The
+ * application has queued a message that is ready for sending onto the CAN
+ * network", and bit 2 might mean "It is time to send a SYNC message onto the
+ * CAN network" etc.  A task can then test the bit values to see which events
+ * are active, and optionally enter the Blocked state to wait for a specified
+ * bit or a group of specified bits to be active.  To continue the CAN bus
+ * example, a CAN controlling task can enter the Blocked state (and therefore
+ * not consume any processing time) until either bit 0, bit 1 or bit 2 are
+ * active, at which time the bit that was actually active would inform the task
+ * which action it had to take (process a received message, send a message, or
+ * send a SYNC).
+ *
+ * The event groups implementation contains intelligence to avoid race
+ * conditions that would otherwise occur were an application to use a simple
+ * variable for the same purpose.  This is particularly important with respect
+ * to when a bit within an event group is to be cleared, and when bits have to
+ * be set and then tested atomically - as is the case where event groups are
+ * used to create a synchronisation point between multiple tasks (a
+ * 'rendezvous').
+ *
+ * \defgroup EventGroup
+ */
+
+
+
+/**
+ * event_groups.h
+ *
+ * Type by which event groups are referenced.  For example, a call to
+ * xEventGroupCreate() returns an EventGroupHandle_t variable that can then
+ * be used as a parameter to other event group functions.
+ *
+ * \defgroup EventGroupHandle_t EventGroupHandle_t
+ * \ingroup EventGroup
+ */
+typedef void * EventGroupHandle_t;
+
+/* 
+ * The type that holds event bits always matches TickType_t - therefore the
+ * number of bits it holds is set by configUSE_16_BIT_TICKS (16 bits if set to 1,
+ * 32 bits if set to 0. 
+ *
+ * \defgroup EventBits_t EventBits_t
+ * \ingroup EventGroup
+ */
+typedef TickType_t EventBits_t;
+
+/**
+ * event_groups.h
+ *
+ EventGroupHandle_t xEventGroupCreate( void );
+ 
+ * + * Create a new event group. This function cannot be called from an interrupt. + * + * Although event groups are not related to ticks, for internal implementation + * reasons the number of bits available for use in an event group is dependent + * on the configUSE_16_BIT_TICKS setting in FreeRTOSConfig.h. If + * configUSE_16_BIT_TICKS is 1 then each event group contains 8 usable bits (bit + * 0 to bit 7). If configUSE_16_BIT_TICKS is set to 0 then each event group has + * 24 usable bits (bit 0 to bit 23). The EventBits_t type is used to store + * event bits within an event group. + * + * @return If the event group was created then a handle to the event group is + * returned. If there was insufficient FreeRTOS heap available to create the + * event group then NULL is returned. See http://www.freertos.org/a00111.html + * + * Example usage: +
+	// Declare a variable to hold the created event group.
+	EventGroupHandle_t xCreatedEventGroup;
+
+	// Attempt to create the event group.
+	xCreatedEventGroup = xEventGroupCreate();
+
+	// Was the event group created successfully?
+	if( xCreatedEventGroup == NULL )
+	{
+		// The event group was not created because there was insufficient
+		// FreeRTOS heap available.
+	}
+	else
+	{
+		// The event group was created.
+	}
+   
+ * \defgroup xEventGroupCreate xEventGroupCreate + * \ingroup EventGroup + */ +EventGroupHandle_t xEventGroupCreate( void ) PRIVILEGED_FUNCTION; + +/** + * event_groups.h + *
+	EventBits_t xEventGroupWaitBits( 	EventGroupHandle_t xEventGroup,
+										const EventBits_t uxBitsToWaitFor,
+										const BaseType_t xClearOnExit,
+										const BaseType_t xWaitForAllBits,
+										const TickType_t xTicksToWait );
+ 
+ * + * [Potentially] block to wait for one or more bits to be set within a + * previously created event group. + * + * This function cannot be called from an interrupt. + * + * @param xEventGroup The event group in which the bits are being tested. The + * event group must have previously been created using a call to + * xEventGroupCreate(). + * + * @param uxBitsToWaitFor A bitwise value that indicates the bit or bits to test + * inside the event group. For example, to wait for bit 0 and/or bit 2 set + * uxBitsToWaitFor to 0x05. To wait for bits 0 and/or bit 1 and/or bit 2 set + * uxBitsToWaitFor to 0x07. Etc. + * + * @param xClearOnExit If xClearOnExit is set to pdTRUE then any bits within + * uxBitsToWaitFor that are set within the event group will be cleared before + * xEventGroupWaitBits() returns if the wait condition was met (if the function + * returns for a reason other than a timeout). If xClearOnExit is set to + * pdFALSE then the bits set in the event group are not altered when the call to + * xEventGroupWaitBits() returns. + * + * @param xWaitForAllBits If xWaitForAllBits is set to pdTRUE then + * xEventGroupWaitBits() will return when either all the bits in uxBitsToWaitFor + * are set or the specified block time expires. If xWaitForAllBits is set to + * pdFALSE then xEventGroupWaitBits() will return when any one of the bits set + * in uxBitsToWaitFor is set or the specified block time expires. The block + * time is specified by the xTicksToWait parameter. + * + * @param xTicksToWait The maximum amount of time (specified in 'ticks') to wait + * for one/all (depending on the xWaitForAllBits value) of the bits specified by + * uxBitsToWaitFor to become set. + * + * @return The value of the event group at the time either the bits being waited + * for became set, or the block time expired. Test the return value to know + * which bits were set. If xEventGroupWaitBits() returned because its timeout + * expired then not all the bits being waited for will be set. If + * xEventGroupWaitBits() returned because the bits it was waiting for were set + * then the returned value is the event group value before any bits were + * automatically cleared in the case that xClearOnExit parameter was set to + * pdTRUE. + * + * Example usage: +
+   #define BIT_0	( 1 << 0 )
+   #define BIT_4	( 1 << 4 )
+
+   void aFunction( EventGroupHandle_t xEventGroup )
+   {
+   EventBits_t uxBits;
+   const TickType_t xTicksToWait = 100 / portTICK_PERIOD_MS;
+
+		// Wait a maximum of 100ms for either bit 0 or bit 4 to be set within
+		// the event group.  Clear the bits before exiting.
+		uxBits = xEventGroupWaitBits(
+					xEventGroup,	// The event group being tested.
+					BIT_0 | BIT_4,	// The bits within the event group to wait for.
+					pdTRUE,			// BIT_0 and BIT_4 should be cleared before returning.
+					pdFALSE,		// Don't wait for both bits, either bit will do.
+					xTicksToWait );	// Wait a maximum of 100ms for either bit to be set.
+
+		if( ( uxBits & ( BIT_0 | BIT_4 ) ) == ( BIT_0 | BIT_4 ) )
+		{
+			// xEventGroupWaitBits() returned because both bits were set.
+		}
+		else if( ( uxBits & BIT_0 ) != 0 )
+		{
+			// xEventGroupWaitBits() returned because just BIT_0 was set.
+		}
+		else if( ( uxBits & BIT_4 ) != 0 )
+		{
+			// xEventGroupWaitBits() returned because just BIT_4 was set.
+		}
+		else
+		{
+			// xEventGroupWaitBits() returned because xTicksToWait ticks passed
+			// without either BIT_0 or BIT_4 becoming set.
+		}
+   }
+   
+ * \defgroup xEventGroupWaitBits xEventGroupWaitBits + * \ingroup EventGroup + */ +EventBits_t xEventGroupWaitBits( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToWaitFor, const BaseType_t xClearOnExit, const BaseType_t xWaitForAllBits, TickType_t xTicksToWait ) PRIVILEGED_FUNCTION; + +/** + * event_groups.h + *
+	EventBits_t xEventGroupClearBits( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToClear );
+ 
+ * + * Clear bits within an event group. This function cannot be called from an + * interrupt. + * + * @param xEventGroup The event group in which the bits are to be cleared. + * + * @param uxBitsToClear A bitwise value that indicates the bit or bits to clear + * in the event group. For example, to clear bit 3 only, set uxBitsToClear to + * 0x08. To clear bit 3 and bit 0 set uxBitsToClear to 0x09. + * + * @return The value of the event group before the specified bits were cleared. + * + * Example usage: +
+   #define BIT_0	( 1 << 0 )
+   #define BIT_4	( 1 << 4 )
+
+   void aFunction( EventGroupHandle_t xEventGroup )
+   {
+   EventBits_t uxBits;
+
+		// Clear bit 0 and bit 4 in xEventGroup.
+		uxBits = xEventGroupClearBits(
+								xEventGroup,	// The event group being updated.
+								BIT_0 | BIT_4 );// The bits being cleared.
+
+		if( ( uxBits & ( BIT_0 | BIT_4 ) ) == ( BIT_0 | BIT_4 ) )
+		{
+			// Both bit 0 and bit 4 were set before xEventGroupClearBits() was
+			// called.  Both will now be clear (not set).
+		}
+		else if( ( uxBits & BIT_0 ) != 0 )
+		{
+			// Bit 0 was set before xEventGroupClearBits() was called.  It will
+			// now be clear.
+		}
+		else if( ( uxBits & BIT_4 ) != 0 )
+		{
+			// Bit 4 was set before xEventGroupClearBits() was called.  It will
+			// now be clear.
+		}
+		else
+		{
+			// Neither bit 0 nor bit 4 were set in the first place.
+		}
+   }
+   
+ * \defgroup xEventGroupClearBits xEventGroupClearBits + * \ingroup EventGroup + */ +EventBits_t xEventGroupClearBits( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToClear ) PRIVILEGED_FUNCTION; + +/** + * event_groups.h + *
+	BaseType_t xEventGroupClearBitsFromISR( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToSet );
+ 
+ * + * A version of xEventGroupClearBits() that can be called from an interrupt. + * + * Setting bits in an event group is not a deterministic operation because there + * are an unknown number of tasks that may be waiting for the bit or bits being + * set. FreeRTOS does not allow nondeterministic operations to be performed + * while interrupts are disabled, so protects event groups that are accessed + * from tasks by suspending the scheduler rather than disabling interrupts. As + * a result event groups cannot be accessed directly from an interrupt service + * routine. Therefore xEventGroupClearBitsFromISR() sends a message to the + * timer task to have the clear operation performed in the context of the timer + * task. + * + * @param xEventGroup The event group in which the bits are to be cleared. + * + * @param uxBitsToClear A bitwise value that indicates the bit or bits to clear. + * For example, to clear bit 3 only, set uxBitsToClear to 0x08. To clear bit 3 + * and bit 0 set uxBitsToClear to 0x09. + * + * @return If the request to execute the function was posted successfully then + * pdPASS is returned, otherwise pdFALSE is returned. pdFALSE will be returned + * if the timer service queue was full. + * + * Example usage: +
+   #define BIT_0	( 1 << 0 )
+   #define BIT_4	( 1 << 4 )
+
+   // An event group which it is assumed has already been created by a call to
+   // xEventGroupCreate().
+   EventGroupHandle_t xEventGroup;
+
+   void anInterruptHandler( void )
+   {
+		// Clear bit 0 and bit 4 in xEventGroup.
+		xResult = xEventGroupClearBitsFromISR(
+							xEventGroup,	 // The event group being updated.
+							BIT_0 | BIT_4 ); // The bits being set.
+
+		if( xResult == pdPASS )
+		{
+			// The message was posted successfully.
+		}
+  }
+   
+ * \defgroup xEventGroupSetBitsFromISR xEventGroupSetBitsFromISR + * \ingroup EventGroup + */ +#if( configUSE_TRACE_FACILITY == 1 ) + BaseType_t xEventGroupClearBitsFromISR( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToSet ) PRIVILEGED_FUNCTION; +#else + #define xEventGroupClearBitsFromISR( xEventGroup, uxBitsToClear ) xTimerPendFunctionCallFromISR( vEventGroupClearBitsCallback, ( void * ) xEventGroup, ( uint32_t ) uxBitsToClear, NULL ) +#endif + +/** + * event_groups.h + *
+	EventBits_t xEventGroupSetBits( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToSet );
+ 
+ * + * Set bits within an event group. + * This function cannot be called from an interrupt. xEventGroupSetBitsFromISR() + * is a version that can be called from an interrupt. + * + * Setting bits in an event group will automatically unblock tasks that are + * blocked waiting for the bits. + * + * @param xEventGroup The event group in which the bits are to be set. + * + * @param uxBitsToSet A bitwise value that indicates the bit or bits to set. + * For example, to set bit 3 only, set uxBitsToSet to 0x08. To set bit 3 + * and bit 0 set uxBitsToSet to 0x09. + * + * @return The value of the event group at the time the call to + * xEventGroupSetBits() returns. There are two reasons why the returned value + * might have the bits specified by the uxBitsToSet parameter cleared. First, + * if setting a bit results in a task that was waiting for the bit leaving the + * blocked state then it is possible the bit will be cleared automatically + * (see the xClearBitOnExit parameter of xEventGroupWaitBits()). Second, any + * unblocked (or otherwise Ready state) task that has a priority above that of + * the task that called xEventGroupSetBits() will execute and may change the + * event group value before the call to xEventGroupSetBits() returns. + * + * Example usage: +
+   #define BIT_0	( 1 << 0 )
+   #define BIT_4	( 1 << 4 )
+
+   void aFunction( EventGroupHandle_t xEventGroup )
+   {
+   EventBits_t uxBits;
+
+		// Set bit 0 and bit 4 in xEventGroup.
+		uxBits = xEventGroupSetBits(
+							xEventGroup,	// The event group being updated.
+							BIT_0 | BIT_4 );// The bits being set.
+
+		if( ( uxBits & ( BIT_0 | BIT_4 ) ) == ( BIT_0 | BIT_4 ) )
+		{
+			// Both bit 0 and bit 4 remained set when the function returned.
+		}
+		else if( ( uxBits & BIT_0 ) != 0 )
+		{
+			// Bit 0 remained set when the function returned, but bit 4 was
+			// cleared.  It might be that bit 4 was cleared automatically as a
+			// task that was waiting for bit 4 was removed from the Blocked
+			// state.
+		}
+		else if( ( uxBits & BIT_4 ) != 0 )
+		{
+			// Bit 4 remained set when the function returned, but bit 0 was
+			// cleared.  It might be that bit 0 was cleared automatically as a
+			// task that was waiting for bit 0 was removed from the Blocked
+			// state.
+		}
+		else
+		{
+			// Neither bit 0 nor bit 4 remained set.  It might be that a task
+			// was waiting for both of the bits to be set, and the bits were
+			// cleared as the task left the Blocked state.
+		}
+   }
+   
+ * \defgroup xEventGroupSetBits xEventGroupSetBits + * \ingroup EventGroup + */ +EventBits_t xEventGroupSetBits( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToSet ) PRIVILEGED_FUNCTION; + +/** + * event_groups.h + *
+	BaseType_t xEventGroupSetBitsFromISR( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToSet, BaseType_t *pxHigherPriorityTaskWoken );
+ 
+ * + * A version of xEventGroupSetBits() that can be called from an interrupt. + * + * Setting bits in an event group is not a deterministic operation because there + * are an unknown number of tasks that may be waiting for the bit or bits being + * set. FreeRTOS does not allow nondeterministic operations to be performed in + * interrupts or from critical sections. Therefore xEventGroupSetBitFromISR() + * sends a message to the timer task to have the set operation performed in the + * context of the timer task - where a scheduler lock is used in place of a + * critical section. + * + * @param xEventGroup The event group in which the bits are to be set. + * + * @param uxBitsToSet A bitwise value that indicates the bit or bits to set. + * For example, to set bit 3 only, set uxBitsToSet to 0x08. To set bit 3 + * and bit 0 set uxBitsToSet to 0x09. + * + * @param pxHigherPriorityTaskWoken As mentioned above, calling this function + * will result in a message being sent to the timer daemon task. If the + * priority of the timer daemon task is higher than the priority of the + * currently running task (the task the interrupt interrupted) then + * *pxHigherPriorityTaskWoken will be set to pdTRUE by + * xEventGroupSetBitsFromISR(), indicating that a context switch should be + * requested before the interrupt exits. For that reason + * *pxHigherPriorityTaskWoken must be initialised to pdFALSE. See the + * example code below. + * + * @return If the request to execute the function was posted successfully then + * pdPASS is returned, otherwise pdFALSE is returned. pdFALSE will be returned + * if the timer service queue was full. + * + * Example usage: +
+   #define BIT_0	( 1 << 0 )
+   #define BIT_4	( 1 << 4 )
+
+   // An event group which it is assumed has already been created by a call to
+   // xEventGroupCreate().
+   EventGroupHandle_t xEventGroup;
+
+   void anInterruptHandler( void )
+   {
+   BaseType_t xHigherPriorityTaskWoken, xResult;
+
+		// xHigherPriorityTaskWoken must be initialised to pdFALSE.
+		xHigherPriorityTaskWoken = pdFALSE;
+
+		// Set bit 0 and bit 4 in xEventGroup.
+		xResult = xEventGroupSetBitsFromISR(
+							xEventGroup,	// The event group being updated.
+							BIT_0 | BIT_4   // The bits being set.
+							&xHigherPriorityTaskWoken );
+
+		// Was the message posted successfully?
+		if( xResult == pdPASS )
+		{
+			// If xHigherPriorityTaskWoken is now set to pdTRUE then a context
+			// switch should be requested.  The macro used is port specific and 
+			// will be either portYIELD_FROM_ISR() or portEND_SWITCHING_ISR() - 
+			// refer to the documentation page for the port being used.
+			portYIELD_FROM_ISR( xHigherPriorityTaskWoken );
+		}
+  }
+   
+ * \defgroup xEventGroupSetBitsFromISR xEventGroupSetBitsFromISR + * \ingroup EventGroup + */ +#if( configUSE_TRACE_FACILITY == 1 ) + BaseType_t xEventGroupSetBitsFromISR( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToSet, BaseType_t *pxHigherPriorityTaskWoken ) PRIVILEGED_FUNCTION; +#else + #define xEventGroupSetBitsFromISR( xEventGroup, uxBitsToSet, pxHigherPriorityTaskWoken ) xTimerPendFunctionCallFromISR( vEventGroupSetBitsCallback, ( void * ) xEventGroup, ( uint32_t ) uxBitsToSet, pxHigherPriorityTaskWoken ) +#endif + +/** + * event_groups.h + *
+	EventBits_t xEventGroupSync(	EventGroupHandle_t xEventGroup,
+									const EventBits_t uxBitsToSet,
+									const EventBits_t uxBitsToWaitFor,
+									TickType_t xTicksToWait );
+ 
+ * + * Atomically set bits within an event group, then wait for a combination of + * bits to be set within the same event group. This functionality is typically + * used to synchronise multiple tasks, where each task has to wait for the other + * tasks to reach a synchronisation point before proceeding. + * + * This function cannot be used from an interrupt. + * + * The function will return before its block time expires if the bits specified + * by the uxBitsToWait parameter are set, or become set within that time. In + * this case all the bits specified by uxBitsToWait will be automatically + * cleared before the function returns. + * + * @param xEventGroup The event group in which the bits are being tested. The + * event group must have previously been created using a call to + * xEventGroupCreate(). + * + * @param uxBitsToSet The bits to set in the event group before determining + * if, and possibly waiting for, all the bits specified by the uxBitsToWait + * parameter are set. + * + * @param uxBitsToWaitFor A bitwise value that indicates the bit or bits to test + * inside the event group. For example, to wait for bit 0 and bit 2 set + * uxBitsToWaitFor to 0x05. To wait for bits 0 and bit 1 and bit 2 set + * uxBitsToWaitFor to 0x07. Etc. + * + * @param xTicksToWait The maximum amount of time (specified in 'ticks') to wait + * for all of the bits specified by uxBitsToWaitFor to become set. + * + * @return The value of the event group at the time either the bits being waited + * for became set, or the block time expired. Test the return value to know + * which bits were set. If xEventGroupSync() returned because its timeout + * expired then not all the bits being waited for will be set. If + * xEventGroupSync() returned because all the bits it was waiting for were + * set then the returned value is the event group value before any bits were + * automatically cleared. + * + * Example usage: +
+ // Bits used by the three tasks.
+ #define TASK_0_BIT		( 1 << 0 )
+ #define TASK_1_BIT		( 1 << 1 )
+ #define TASK_2_BIT		( 1 << 2 )
+
+ #define ALL_SYNC_BITS ( TASK_0_BIT | TASK_1_BIT | TASK_2_BIT )
+
+ // Use an event group to synchronise three tasks.  It is assumed this event
+ // group has already been created elsewhere.
+ EventGroupHandle_t xEventBits;
+
+ void vTask0( void *pvParameters )
+ {
+ EventBits_t uxReturn;
+ TickType_t xTicksToWait = 100 / portTICK_PERIOD_MS;
+
+	 for( ;; )
+	 {
+		// Perform task functionality here.
+
+		// Set bit 0 in the event flag to note this task has reached the
+		// sync point.  The other two tasks will set the other two bits defined
+		// by ALL_SYNC_BITS.  All three tasks have reached the synchronisation
+		// point when all the ALL_SYNC_BITS are set.  Wait a maximum of 100ms
+		// for this to happen.
+		uxReturn = xEventGroupSync( xEventBits, TASK_0_BIT, ALL_SYNC_BITS, xTicksToWait );
+
+		if( ( uxReturn & ALL_SYNC_BITS ) == ALL_SYNC_BITS )
+		{
+			// All three tasks reached the synchronisation point before the call
+			// to xEventGroupSync() timed out.
+		}
+	}
+ }
+
+ void vTask1( void *pvParameters )
+ {
+	 for( ;; )
+	 {
+		// Perform task functionality here.
+
+		// Set bit 1 in the event flag to note this task has reached the
+		// synchronisation point.  The other two tasks will set the other two
+		// bits defined by ALL_SYNC_BITS.  All three tasks have reached the
+		// synchronisation point when all the ALL_SYNC_BITS are set.  Wait
+		// indefinitely for this to happen.
+		xEventGroupSync( xEventBits, TASK_1_BIT, ALL_SYNC_BITS, portMAX_DELAY );
+
+		// xEventGroupSync() was called with an indefinite block time, so
+		// this task will only reach here if the syncrhonisation was made by all
+		// three tasks, so there is no need to test the return value.
+	 }
+ }
+
+ void vTask2( void *pvParameters )
+ {
+	 for( ;; )
+	 {
+		// Perform task functionality here.
+
+		// Set bit 2 in the event flag to note this task has reached the
+		// synchronisation point.  The other two tasks will set the other two
+		// bits defined by ALL_SYNC_BITS.  All three tasks have reached the
+		// synchronisation point when all the ALL_SYNC_BITS are set.  Wait
+		// indefinitely for this to happen.
+		xEventGroupSync( xEventBits, TASK_2_BIT, ALL_SYNC_BITS, portMAX_DELAY );
+
+		// xEventGroupSync() was called with an indefinite block time, so
+		// this task will only reach here if the syncrhonisation was made by all
+		// three tasks, so there is no need to test the return value.
+	}
+ }
+
+ 
+ * \defgroup xEventGroupSync xEventGroupSync + * \ingroup EventGroup + */ +EventBits_t xEventGroupSync( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToSet, const EventBits_t uxBitsToWaitFor, TickType_t xTicksToWait ) PRIVILEGED_FUNCTION; + + +/** + * event_groups.h + *
+	EventBits_t xEventGroupGetBits( EventGroupHandle_t xEventGroup );
+ 
+ * + * Returns the current value of the bits in an event group. This function + * cannot be used from an interrupt. + * + * @param xEventGroup The event group being queried. + * + * @return The event group bits at the time xEventGroupGetBits() was called. + * + * \defgroup xEventGroupGetBits xEventGroupGetBits + * \ingroup EventGroup + */ +#define xEventGroupGetBits( xEventGroup ) xEventGroupClearBits( xEventGroup, 0 ) + +/** + * event_groups.h + *
+	EventBits_t xEventGroupGetBitsFromISR( EventGroupHandle_t xEventGroup );
+ 
+ * + * A version of xEventGroupGetBits() that can be called from an ISR. + * + * @param xEventGroup The event group being queried. + * + * @return The event group bits at the time xEventGroupGetBitsFromISR() was called. + * + * \defgroup xEventGroupGetBitsFromISR xEventGroupGetBitsFromISR + * \ingroup EventGroup + */ +EventBits_t xEventGroupGetBitsFromISR( EventGroupHandle_t xEventGroup ) PRIVILEGED_FUNCTION; + +/** + * event_groups.h + *
+	void xEventGroupDelete( EventGroupHandle_t xEventGroup );
+ 
+ * + * Delete an event group that was previously created by a call to + * xEventGroupCreate(). Tasks that are blocked on the event group will be + * unblocked and obtain 0 as the event group's value. + * + * @param xEventGroup The event group being deleted. + */ +void vEventGroupDelete( EventGroupHandle_t xEventGroup ) PRIVILEGED_FUNCTION; + +/* For internal use only. */ +void vEventGroupSetBitsCallback( void *pvEventGroup, const uint32_t ulBitsToSet ) PRIVILEGED_FUNCTION; +void vEventGroupClearBitsCallback( void *pvEventGroup, const uint32_t ulBitsToClear ) PRIVILEGED_FUNCTION; + +#if (configUSE_TRACE_FACILITY == 1) + UBaseType_t uxEventGroupGetNumber( void* xEventGroup ) PRIVILEGED_FUNCTION; +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* EVENT_GROUPS_H */ + + diff --git a/lib/FreeRTOS/include/list.h b/lib/FreeRTOS/include/list.h index a08a7710cd..75d391d4ce 100644 --- a/lib/FreeRTOS/include/list.h +++ b/lib/FreeRTOS/include/list.h @@ -1,75 +1,70 @@ /* - FreeRTOS V7.4.0 - Copyright (C) 2013 Real Time Engineers Ltd. - - FEATURES AND PORTS ARE ADDED TO FREERTOS ALL THE TIME. PLEASE VISIT - http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. - - *************************************************************************** - * * - * 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! * - * * - *************************************************************************** + FreeRTOS V8.2.3 - Copyright (C) 2015 Real Time Engineers Ltd. + All rights reserved + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. This file is part of the FreeRTOS distribution. FreeRTOS is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License (version 2) as published by the - Free Software Foundation AND MODIFIED BY the FreeRTOS exception. + 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. + *************************************************************************** + >>! 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 itcan be - viewed here: http://www.freertos.org/a00114.html and also obtained by - writing to Real Time Engineers Ltd., contact details for whom are available - on the FreeRTOS WEB site. - - 1 tab == 4 spaces! + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html *************************************************************************** * * - * Having a problem? Start by reading the FAQ "My application does * - * not run, what could be wrong?" * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * * * - * http://www.FreeRTOS.org/FAQHelp.html * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * * * *************************************************************************** + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. - http://www.FreeRTOS.org - Documentation, books, training, latest versions, - license and Real Time Engineers Ltd. contact details. + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, - including FreeRTOS+Trace - an indispensable productivity tool, and our new - fully thread aware and reentrant UDP/IP stack. - - http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High - Integrity Systems, who sell the code with commercial support, - indemnification and middleware, under the OpenRTOS brand. - - http://www.SafeRTOS.com - High Integrity Systems also provide a safety - engineered and independently SIL3 certified version for use in safety and + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and mission critical applications that require provable dependability. + + 1 tab == 4 spaces! */ /* @@ -77,7 +72,7 @@ * 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 + * list_ts can only store pointers to list_item_ts. Each ListItem_t contains a * numeric value (xItemValue). Most of the time the lists are sorted in * descending item value order. * @@ -100,43 +95,121 @@ * \ingroup FreeRTOSIntro */ +#ifndef INC_FREERTOS_H + #error FreeRTOS.h must be included before list.h +#endif #ifndef LIST_H #define LIST_H +/* + * The list structure members are modified from within interrupts, and therefore + * by rights should be declared volatile. However, they are only modified in a + * functionally atomic way (within critical sections of with the scheduler + * suspended) and are either passed by reference into a function or indexed via + * a volatile variable. Therefore, in all use cases tested so far, the volatile + * qualifier can be omitted in order to provide a moderate performance + * improvement without adversely affecting functional behaviour. The assembly + * instructions generated by the IAR, ARM and GCC compilers when the respective + * compiler's options were set for maximum optimisation has been inspected and + * deemed to be as intended. That said, as compiler technology advances, and + * especially if aggressive cross module optimisation is used (a use case that + * has not been exercised to any great extend) then it is feasible that the + * volatile qualifier will be needed for correct optimisation. It is expected + * that a compiler removing essential code because, without the volatile + * qualifier on the list structure members and with aggressive cross module + * optimisation, the compiler deemed the code unnecessary will result in + * complete and obvious failure of the scheduler. If this is ever experienced + * then the volatile qualifier can be inserted in the relevant places within the + * list structures by simply defining configLIST_VOLATILE to volatile in + * FreeRTOSConfig.h (as per the example at the bottom of this comment block). + * If configLIST_VOLATILE is not defined then the preprocessor directives below + * will simply #define configLIST_VOLATILE away completely. + * + * To use volatile list structure members then add the following line to + * FreeRTOSConfig.h (without the quotes): + * "#define configLIST_VOLATILE volatile" + */ +#ifndef configLIST_VOLATILE + #define configLIST_VOLATILE +#endif /* configSUPPORT_CROSS_MODULE_OPTIMISATION */ + #ifdef __cplusplus extern "C" { #endif + +/* Macros that can be used to place known values within the list structures, +then check that the known values do not get corrupted during the execution of +the application. These may catch the list data structures being overwritten in +memory. They will not catch data errors caused by incorrect configuration or +use of FreeRTOS.*/ +#if( configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES == 0 ) + /* Define the macros to do nothing. */ + #define listFIRST_LIST_ITEM_INTEGRITY_CHECK_VALUE + #define listSECOND_LIST_ITEM_INTEGRITY_CHECK_VALUE + #define listFIRST_LIST_INTEGRITY_CHECK_VALUE + #define listSECOND_LIST_INTEGRITY_CHECK_VALUE + #define listSET_FIRST_LIST_ITEM_INTEGRITY_CHECK_VALUE( pxItem ) + #define listSET_SECOND_LIST_ITEM_INTEGRITY_CHECK_VALUE( pxItem ) + #define listSET_LIST_INTEGRITY_CHECK_1_VALUE( pxList ) + #define listSET_LIST_INTEGRITY_CHECK_2_VALUE( pxList ) + #define listTEST_LIST_ITEM_INTEGRITY( pxItem ) + #define listTEST_LIST_INTEGRITY( pxList ) +#else + /* Define macros that add new members into the list structures. */ + #define listFIRST_LIST_ITEM_INTEGRITY_CHECK_VALUE TickType_t xListItemIntegrityValue1; + #define listSECOND_LIST_ITEM_INTEGRITY_CHECK_VALUE TickType_t xListItemIntegrityValue2; + #define listFIRST_LIST_INTEGRITY_CHECK_VALUE TickType_t xListIntegrityValue1; + #define listSECOND_LIST_INTEGRITY_CHECK_VALUE TickType_t xListIntegrityValue2; + + /* Define macros that set the new structure members to known values. */ + #define listSET_FIRST_LIST_ITEM_INTEGRITY_CHECK_VALUE( pxItem ) ( pxItem )->xListItemIntegrityValue1 = pdINTEGRITY_CHECK_VALUE + #define listSET_SECOND_LIST_ITEM_INTEGRITY_CHECK_VALUE( pxItem ) ( pxItem )->xListItemIntegrityValue2 = pdINTEGRITY_CHECK_VALUE + #define listSET_LIST_INTEGRITY_CHECK_1_VALUE( pxList ) ( pxList )->xListIntegrityValue1 = pdINTEGRITY_CHECK_VALUE + #define listSET_LIST_INTEGRITY_CHECK_2_VALUE( pxList ) ( pxList )->xListIntegrityValue2 = pdINTEGRITY_CHECK_VALUE + + /* Define macros that will assert if one of the structure members does not + contain its expected value. */ + #define listTEST_LIST_ITEM_INTEGRITY( pxItem ) configASSERT( ( ( pxItem )->xListItemIntegrityValue1 == pdINTEGRITY_CHECK_VALUE ) && ( ( pxItem )->xListItemIntegrityValue2 == pdINTEGRITY_CHECK_VALUE ) ) + #define listTEST_LIST_INTEGRITY( pxList ) configASSERT( ( ( pxList )->xListIntegrityValue1 == pdINTEGRITY_CHECK_VALUE ) && ( ( pxList )->xListIntegrityValue2 == pdINTEGRITY_CHECK_VALUE ) ) +#endif /* configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES */ + + /* * 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). */ + listFIRST_LIST_ITEM_INTEGRITY_CHECK_VALUE /*< Set to a known value if configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES is set to 1. */ + configLIST_VOLATILE TickType_t xItemValue; /*< The value being listed. In most cases this is used to sort the list in descending order. */ + struct xLIST_ITEM * configLIST_VOLATILE pxNext; /*< Pointer to the next ListItem_t in the list. */ + struct xLIST_ITEM * configLIST_VOLATILE pxPrevious; /*< Pointer to the previous ListItem_t in the list. */ + void * pvOwner; /*< Pointer to the object (normally a TCB) that contains the list item. There is therefore a two way link between the object containing the list item and the list item itself. */ + void * configLIST_VOLATILE pvContainer; /*< Pointer to the list in which this list item is placed (if any). */ + listSECOND_LIST_ITEM_INTEGRITY_CHECK_VALUE /*< Set to a known value if configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES is set to 1. */ }; -typedef struct xLIST_ITEM xListItem; /* For some reason lint wants this as two separate definitions. */ +typedef struct xLIST_ITEM ListItem_t; /* 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; + listFIRST_LIST_ITEM_INTEGRITY_CHECK_VALUE /*< Set to a known value if configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES is set to 1. */ + configLIST_VOLATILE TickType_t xItemValue; + struct xLIST_ITEM * configLIST_VOLATILE pxNext; + struct xLIST_ITEM * configLIST_VOLATILE pxPrevious; }; -typedef struct xMINI_LIST_ITEM xMiniListItem; +typedef struct xMINI_LIST_ITEM MiniListItem_t; /* * 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; + listFIRST_LIST_INTEGRITY_CHECK_VALUE /*< Set to a known value if configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES is set to 1. */ + configLIST_VOLATILE UBaseType_t uxNumberOfItems; + ListItem_t * configLIST_VOLATILE pxIndex; /*< Used to walk through the list. Points to the last item returned by a call to listGET_OWNER_OF_NEXT_ENTRY (). */ + MiniListItem_t 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. */ + listSECOND_LIST_INTEGRITY_CHECK_VALUE /*< Set to a known value if configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES is set to 1. */ +} List_t; /* * Access macro to set the owner of a list item. The owner of a list item @@ -145,7 +218,7 @@ typedef struct xLIST * \page listSET_LIST_ITEM_OWNER listSET_LIST_ITEM_OWNER * \ingroup LinkedList */ -#define listSET_LIST_ITEM_OWNER( pxListItem, pxOwner ) ( pxListItem )->pvOwner = ( void * ) ( pxOwner ) +#define listSET_LIST_ITEM_OWNER( pxListItem, pxOwner ) ( ( pxListItem )->pvOwner = ( void * ) ( pxOwner ) ) /* * Access macro to get the owner of a list item. The owner of a list item @@ -154,7 +227,7 @@ typedef struct xLIST * \page listSET_LIST_ITEM_OWNER listSET_LIST_ITEM_OWNER * \ingroup LinkedList */ -#define listGET_LIST_ITEM_OWNER( pxListItem ) ( pxListItem )->pvOwner +#define listGET_LIST_ITEM_OWNER( pxListItem ) ( ( pxListItem )->pvOwner ) /* * Access macro to set the value of the list item. In most cases the value is @@ -163,26 +236,50 @@ typedef struct xLIST * \page listSET_LIST_ITEM_VALUE listSET_LIST_ITEM_VALUE * \ingroup LinkedList */ -#define listSET_LIST_ITEM_VALUE( pxListItem, xValue ) ( pxListItem )->xItemValue = ( xValue ) +#define listSET_LIST_ITEM_VALUE( pxListItem, xValue ) ( ( pxListItem )->xItemValue = ( xValue ) ) /* * Access macro to retrieve the value of the list item. The value can - * represent anything - for example a the priority of a task, or the time at + * represent anything - for example 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 ) +#define listGET_LIST_ITEM_VALUE( pxListItem ) ( ( pxListItem )->xItemValue ) /* - * Access macro the retrieve the value of the list item at the head of a given + * Access macro to 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 ) +#define listGET_ITEM_VALUE_OF_HEAD_ENTRY( pxList ) ( ( ( pxList )->xListEnd ).pxNext->xItemValue ) + +/* + * Return the list item at the head of the list. + * + * \page listGET_HEAD_ENTRY listGET_HEAD_ENTRY + * \ingroup LinkedList + */ +#define listGET_HEAD_ENTRY( pxList ) ( ( ( pxList )->xListEnd ).pxNext ) + +/* + * Return the list item at the head of the list. + * + * \page listGET_NEXT listGET_NEXT + * \ingroup LinkedList + */ +#define listGET_NEXT( pxListItem ) ( ( pxListItem )->pxNext ) + +/* + * Return the list item that marks the end of the list + * + * \page listGET_END_MARKER listGET_END_MARKER + * \ingroup LinkedList + */ +#define listGET_END_MARKER( pxList ) ( ( ListItem_t const * ) ( &( ( pxList )->xListEnd ) ) ) /* * Access macro to determine if a list contains any items. The macro will @@ -191,19 +288,19 @@ typedef struct xLIST * \page listLIST_IS_EMPTY listLIST_IS_EMPTY * \ingroup LinkedList */ -#define listLIST_IS_EMPTY( pxList ) ( ( pxList )->uxNumberOfItems == ( unsigned portBASE_TYPE ) 0 ) +#define listLIST_IS_EMPTY( pxList ) ( ( BaseType_t ) ( ( pxList )->uxNumberOfItems == ( UBaseType_t ) 0 ) ) /* * Access macro to return the number of items in the list. */ -#define listCURRENT_LIST_LENGTH( pxList ) ( ( pxList )->uxNumberOfItems ) +#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 + * and returns that entry's pxOwner parameter. Using multiple calls to this * function it is therefore possible to move through every item contained in * a list. * @@ -212,22 +309,23 @@ typedef struct xLIST * The pxOwner parameter effectively creates a two way link between the list * item and its owner. * + * @param pxTCB pxTCB is set to the address of the owner of the next list item. * @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; \ +#define listGET_OWNER_OF_NEXT_ENTRY( pxTCB, pxList ) \ +{ \ +List_t * const pxConstList = ( pxList ); \ + /* Increment the index to the next item and return the item, ensuring */ \ + /* we don't return the marker used at the end of the list. */ \ + ( pxConstList )->pxIndex = ( pxConstList )->pxIndex->pxNext; \ + if( ( void * ) ( pxConstList )->pxIndex == ( void * ) &( ( pxConstList )->xListEnd ) ) \ + { \ + ( pxConstList )->pxIndex = ( pxConstList )->pxIndex->pxNext; \ + } \ + ( pxTCB ) = ( pxConstList )->pxIndex->pvOwner; \ } @@ -256,16 +354,15 @@ xList * const pxConstList = ( pxList ); \ * * @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 + * @return pdTRUE if the list item is in the list, otherwise pdFALSE. */ -#define listIS_CONTAINED_WITHIN( pxList, pxListItem ) ( ( pxListItem )->pvContainer == ( void * ) ( pxList ) ) +#define listIS_CONTAINED_WITHIN( pxList, pxListItem ) ( ( BaseType_t ) ( ( pxListItem )->pvContainer == ( void * ) ( pxList ) ) ) /* * Return the list a list item is contained within (referenced from). * * @param pxListItem The list item being queried. - * @return A pointer to the xList object that references the pxListItem + * @return A pointer to the List_t object that references the pxListItem */ #define listLIST_ITEM_CONTAINER( pxListItem ) ( ( pxListItem )->pvContainer ) @@ -286,7 +383,7 @@ xList * const pxConstList = ( pxList ); \ * \page vListInitialise vListInitialise * \ingroup LinkedList */ -void vListInitialise( xList *pxList ); +void vListInitialise( List_t * const pxList ) PRIVILEGED_FUNCTION; /* * Must be called before a list item is used. This sets the list container to @@ -297,7 +394,7 @@ void vListInitialise( xList *pxList ); * \page vListInitialiseItem vListInitialiseItem * \ingroup LinkedList */ -void vListInitialiseItem( xListItem *pxItem ); +void vListInitialiseItem( ListItem_t * const pxItem ) PRIVILEGED_FUNCTION; /* * Insert a list item into a list. The item will be inserted into the list in @@ -305,12 +402,12 @@ void vListInitialiseItem( xListItem *pxItem ); * * @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. + * @param pxNewListItem The item that is to be placed in the list. * * \page vListInsert vListInsert * \ingroup LinkedList */ -void vListInsert( xList *pxList, xListItem *pxNewListItem ); +void vListInsert( List_t * const pxList, ListItem_t * const pxNewListItem ) PRIVILEGED_FUNCTION; /* * Insert a list item into a list. The item will be inserted in a position @@ -331,7 +428,7 @@ void vListInsert( xList *pxList, xListItem *pxNewListItem ); * \page vListInsertEnd vListInsertEnd * \ingroup LinkedList */ -void vListInsertEnd( xList *pxList, xListItem *pxNewListItem ); +void vListInsertEnd( List_t * const pxList, ListItem_t * const pxNewListItem ) PRIVILEGED_FUNCTION; /* * Remove an item from a list. The list item has a pointer to the list that @@ -339,14 +436,14 @@ void vListInsertEnd( xList *pxList, xListItem *pxNewListItem ); * * @param uxListRemove The item to be removed. The item will remove itself from * the list pointed to by it's pxContainer parameter. - * + * * @return The number of items that remain in the list after the list item has * been removed. * * \page uxListRemove uxListRemove * \ingroup LinkedList */ -unsigned portBASE_TYPE uxListRemove( xListItem *pxItemToRemove ); +UBaseType_t uxListRemove( ListItem_t * const pxItemToRemove ) PRIVILEGED_FUNCTION; #ifdef __cplusplus } diff --git a/lib/FreeRTOS/include/mpu_wrappers.h b/lib/FreeRTOS/include/mpu_wrappers.h index b5bc82d806..5b2ad474d8 100644 --- a/lib/FreeRTOS/include/mpu_wrappers.h +++ b/lib/FreeRTOS/include/mpu_wrappers.h @@ -1,75 +1,70 @@ /* - FreeRTOS V7.4.0 - Copyright (C) 2013 Real Time Engineers Ltd. - - FEATURES AND PORTS ARE ADDED TO FREERTOS ALL THE TIME. PLEASE VISIT - http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. - - *************************************************************************** - * * - * 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! * - * * - *************************************************************************** + FreeRTOS V8.2.3 - Copyright (C) 2015 Real Time Engineers Ltd. + All rights reserved + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. This file is part of the FreeRTOS distribution. FreeRTOS is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License (version 2) as published by the - Free Software Foundation AND MODIFIED BY the FreeRTOS exception. + 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. + *************************************************************************** + >>! 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 itcan be - viewed here: http://www.freertos.org/a00114.html and also obtained by - writing to Real Time Engineers Ltd., contact details for whom are available - on the FreeRTOS WEB site. - - 1 tab == 4 spaces! + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html *************************************************************************** * * - * Having a problem? Start by reading the FAQ "My application does * - * not run, what could be wrong?" * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * * * - * http://www.FreeRTOS.org/FAQHelp.html * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * * * *************************************************************************** + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? - http://www.FreeRTOS.org - Documentation, books, training, latest versions, - license and Real Time Engineers Ltd. contact details. + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, - including FreeRTOS+Trace - an indispensable productivity tool, and our new - fully thread aware and reentrant UDP/IP stack. - - http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High - Integrity Systems, who sell the code with commercial support, - indemnification and middleware, under the OpenRTOS brand. - - http://www.SafeRTOS.com - High Integrity Systems also provide a safety - engineered and independently SIL3 certified version for use in safety and + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and mission critical applications that require provable dependability. + + 1 tab == 4 spaces! */ #ifndef MPU_WRAPPERS_H @@ -93,7 +88,6 @@ only for ports that are using the MPU. */ #define vTaskPrioritySet MPU_vTaskPrioritySet #define eTaskGetState MPU_eTaskGetState #define vTaskSuspend MPU_vTaskSuspend - #define xTaskIsTaskSuspended MPU_xTaskIsTaskSuspended #define vTaskResume MPU_vTaskResume #define vTaskSuspendAll MPU_vTaskSuspendAll #define xTaskResumeAll MPU_xTaskResumeAll @@ -108,6 +102,10 @@ only for ports that are using the MPU. */ #define xTaskGetCurrentTaskHandle MPU_xTaskGetCurrentTaskHandle #define xTaskGetSchedulerState MPU_xTaskGetSchedulerState #define xTaskGetIdleTaskHandle MPU_xTaskGetIdleTaskHandle + #define uxTaskGetSystemState MPU_uxTaskGetSystemState + #define xTaskGenericNotify MPU_xTaskGenericNotify + #define xTaskNotifyWait MPU_xTaskNotifyWait + #define ulTaskNotifyTake MPU_ulTaskNotifyTake #define xQueueGenericCreate MPU_xQueueGenericCreate #define xQueueCreateMutex MPU_xQueueCreateMutex @@ -125,17 +123,36 @@ only for ports that are using the MPU. */ #define xQueueSelectFromSet MPU_xQueueSelectFromSet #define xQueueAddToSet MPU_xQueueAddToSet #define xQueueRemoveFromSet MPU_xQueueRemoveFromSet + #define xQueueGetMutexHolder MPU_xQueueGetMutexHolder + #define xQueueGetMutexHolder MPU_xQueueGetMutexHolder #define pvPortMalloc MPU_pvPortMalloc #define vPortFree MPU_vPortFree #define xPortGetFreeHeapSize MPU_xPortGetFreeHeapSize #define vPortInitialiseBlocks MPU_vPortInitialiseBlocks + #define xPortGetMinimumEverFreeHeapSize MPU_xPortGetMinimumEverFreeHeapSize #if configQUEUE_REGISTRY_SIZE > 0 #define vQueueAddToRegistry MPU_vQueueAddToRegistry #define vQueueUnregisterQueue MPU_vQueueUnregisterQueue #endif + #define xTimerCreate MPU_xTimerCreate + #define pvTimerGetTimerID MPU_pvTimerGetTimerID + #define vTimerSetTimerID MPU_vTimerSetTimerID + #define xTimerIsTimerActive MPU_xTimerIsTimerActive + #define xTimerGetTimerDaemonTaskHandle MPU_xTimerGetTimerDaemonTaskHandle + #define xTimerPendFunctionCall MPU_xTimerPendFunctionCall + #define pcTimerGetTimerName MPU_pcTimerGetTimerName + #define xTimerGenericCommand MPU_xTimerGenericCommand + + #define xEventGroupCreate MPU_xEventGroupCreate + #define xEventGroupWaitBits MPU_xEventGroupWaitBits + #define xEventGroupClearBits MPU_xEventGroupClearBits + #define xEventGroupSetBits MPU_xEventGroupSetBits + #define xEventGroupSync MPU_xEventGroupSync + #define vEventGroupDelete MPU_vEventGroupDelete + /* Remove the privileged function macro. */ #define PRIVILEGED_FUNCTION @@ -144,7 +161,6 @@ only for ports that are using the MPU. */ /* 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 */ diff --git a/lib/FreeRTOS/include/portable.h b/lib/FreeRTOS/include/portable.h index cb353891cf..cd6a9344c4 100644 --- a/lib/FreeRTOS/include/portable.h +++ b/lib/FreeRTOS/include/portable.h @@ -1,75 +1,70 @@ /* - FreeRTOS V7.4.0 - Copyright (C) 2013 Real Time Engineers Ltd. - - FEATURES AND PORTS ARE ADDED TO FREERTOS ALL THE TIME. PLEASE VISIT - http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. - - *************************************************************************** - * * - * 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! * - * * - *************************************************************************** + FreeRTOS V8.2.3 - Copyright (C) 2015 Real Time Engineers Ltd. + All rights reserved + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. This file is part of the FreeRTOS distribution. FreeRTOS is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License (version 2) as published by the - Free Software Foundation AND MODIFIED BY the FreeRTOS exception. + 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. + *************************************************************************** + >>! 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 itcan be - viewed here: http://www.freertos.org/a00114.html and also obtained by - writing to Real Time Engineers Ltd., contact details for whom are available - on the FreeRTOS WEB site. - - 1 tab == 4 spaces! + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html *************************************************************************** * * - * Having a problem? Start by reading the FAQ "My application does * - * not run, what could be wrong?" * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * * * - * http://www.FreeRTOS.org/FAQHelp.html * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * * * *************************************************************************** + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? - http://www.FreeRTOS.org - Documentation, books, training, latest versions, - license and Real Time Engineers Ltd. contact details. + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, - including FreeRTOS+Trace - an indispensable productivity tool, and our new - fully thread aware and reentrant UDP/IP stack. - - http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High - Integrity Systems, who sell the code with commercial support, - indemnification and middleware, under the OpenRTOS brand. - - http://www.SafeRTOS.com - High Integrity Systems also provide a safety - engineered and independently SIL3 certified version for use in safety and + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and mission critical applications that require provable dependability. + + 1 tab == 4 spaces! */ /*----------------------------------------------------------- @@ -79,255 +74,34 @@ #ifndef PORTABLE_H #define PORTABLE_H -/* Include the macro file relevant to the port being used. */ - -#ifdef OPEN_WATCOM_INDUSTRIAL_PC_PORT - #include "..\..\Source\portable\owatcom\16bitdos\pc\portmacro.h" - typedef void ( __interrupt __far *pxISR )(); -#endif - -#ifdef OPEN_WATCOM_FLASH_LITE_186_PORT - #include "..\..\Source\portable\owatcom\16bitdos\flsh186\portmacro.h" - typedef void ( __interrupt __far *pxISR )(); -#endif - -#ifdef GCC_MEGA_AVR - #include "../portable/GCC/ATMega323/portmacro.h" -#endif - -#ifdef IAR_MEGA_AVR - #include "../portable/IAR/ATMega323/portmacro.h" -#endif - -#ifdef MPLAB_PIC24_PORT - #include "..\..\Source\portable\MPLAB\PIC24_dsPIC\portmacro.h" -#endif - -#ifdef MPLAB_DSPIC_PORT - #include "..\..\Source\portable\MPLAB\PIC24_dsPIC\portmacro.h" -#endif - -#ifdef MPLAB_PIC18F_PORT - #include "..\..\Source\portable\MPLAB\PIC18F\portmacro.h" -#endif - -#ifdef MPLAB_PIC32MX_PORT - #include "..\..\Source\portable\MPLAB\PIC32MX\portmacro.h" -#endif - -#ifdef _FEDPICC - #include "libFreeRTOS/Include/portmacro.h" -#endif - -#ifdef SDCC_CYGNAL - #include "../../Source/portable/SDCC/Cygnal/portmacro.h" -#endif - -#ifdef GCC_ARM7 - #include "../../Source/portable/GCC/ARM7_LPC2000/portmacro.h" -#endif - -#ifdef GCC_ARM7_ECLIPSE - #include "portmacro.h" -#endif - -#ifdef ROWLEY_LPC23xx - #include "../../Source/portable/GCC/ARM7_LPC23xx/portmacro.h" -#endif - -#ifdef IAR_MSP430 - #include "..\..\Source\portable\IAR\MSP430\portmacro.h" -#endif - -#ifdef GCC_MSP430 - #include "../../Source/portable/GCC/MSP430F449/portmacro.h" -#endif - -#ifdef ROWLEY_MSP430 - #include "../../Source/portable/Rowley/MSP430F449/portmacro.h" -#endif - -#ifdef ARM7_LPC21xx_KEIL_RVDS - #include "..\..\Source\portable\RVDS\ARM7_LPC21xx\portmacro.h" -#endif - -#ifdef SAM7_GCC - #include "../../Source/portable/GCC/ARM7_AT91SAM7S/portmacro.h" -#endif - -#ifdef SAM7_IAR - #include "..\..\Source\portable\IAR\AtmelSAM7S64\portmacro.h" -#endif - -#ifdef SAM9XE_IAR - #include "..\..\Source\portable\IAR\AtmelSAM9XE\portmacro.h" -#endif - -#ifdef LPC2000_IAR - #include "..\..\Source\portable\IAR\LPC2000\portmacro.h" -#endif - -#ifdef STR71X_IAR - #include "..\..\Source\portable\IAR\STR71x\portmacro.h" -#endif - -#ifdef STR75X_IAR - #include "..\..\Source\portable\IAR\STR75x\portmacro.h" -#endif - -#ifdef STR75X_GCC - #include "..\..\Source\portable\GCC\STR75x\portmacro.h" -#endif - -#ifdef STR91X_IAR - #include "..\..\Source\portable\IAR\STR91x\portmacro.h" -#endif - -#ifdef GCC_H8S - #include "../../Source/portable/GCC/H8S2329/portmacro.h" -#endif - -#ifdef GCC_AT91FR40008 - #include "../../Source/portable/GCC/ARM7_AT91FR40008/portmacro.h" -#endif - -#ifdef RVDS_ARMCM3_LM3S102 - #include "../../Source/portable/RVDS/ARM_CM3/portmacro.h" -#endif - -#ifdef GCC_ARMCM3_LM3S102 - #include "../../Source/portable/GCC/ARM_CM3/portmacro.h" -#endif - -#ifdef GCC_ARMCM3 - #include "../../Source/portable/GCC/ARM_CM3/portmacro.h" -#endif - -#ifdef IAR_ARM_CM3 - #include "../../Source/portable/IAR/ARM_CM3/portmacro.h" -#endif - -#ifdef IAR_ARMCM3_LM - #include "../../Source/portable/IAR/ARM_CM3/portmacro.h" -#endif - -#ifdef HCS12_CODE_WARRIOR - #include "../../Source/portable/CodeWarrior/HCS12/portmacro.h" -#endif - -#ifdef MICROBLAZE_GCC - #include "../../Source/portable/GCC/MicroBlaze/portmacro.h" -#endif - -#ifdef TERN_EE - #include "..\..\Source\portable\Paradigm\Tern_EE\small\portmacro.h" -#endif - -#ifdef GCC_HCS12 - #include "../../Source/portable/GCC/HCS12/portmacro.h" -#endif - -#ifdef GCC_MCF5235 - #include "../../Source/portable/GCC/MCF5235/portmacro.h" -#endif - -#ifdef COLDFIRE_V2_GCC - #include "../../../Source/portable/GCC/ColdFire_V2/portmacro.h" -#endif - -#ifdef COLDFIRE_V2_CODEWARRIOR - #include "../../Source/portable/CodeWarrior/ColdFire_V2/portmacro.h" -#endif - -#ifdef GCC_PPC405 - #include "../../Source/portable/GCC/PPC405_Xilinx/portmacro.h" -#endif - -#ifdef GCC_PPC440 - #include "../../Source/portable/GCC/PPC440_Xilinx/portmacro.h" -#endif - -#ifdef _16FX_SOFTUNE - #include "..\..\Source\portable\Softune\MB96340\portmacro.h" -#endif - -#ifdef BCC_INDUSTRIAL_PC_PORT - /* A short file name has to be used in place of the normal - FreeRTOSConfig.h when using the Borland compiler. */ - #include "frconfig.h" - #include "..\portable\BCC\16BitDOS\PC\prtmacro.h" - typedef void ( __interrupt __far *pxISR )(); -#endif - -#ifdef BCC_FLASH_LITE_186_PORT - /* A short file name has to be used in place of the normal - FreeRTOSConfig.h when using the Borland compiler. */ - #include "frconfig.h" - #include "..\portable\BCC\16BitDOS\flsh186\prtmacro.h" - typedef void ( __interrupt __far *pxISR )(); -#endif - -#ifdef __GNUC__ - #ifdef __AVR32_AVR32A__ - #include "portmacro.h" - #endif -#endif - -#ifdef __ICCAVR32__ - #ifdef __CORE__ - #if __CORE__ == __AVR32A__ - #include "portmacro.h" - #endif - #endif -#endif - -#ifdef __91467D - #include "portmacro.h" -#endif - -#ifdef __96340 +/* Each FreeRTOS port has a unique portmacro.h header file. Originally a +pre-processor definition was used to ensure the pre-processor found the correct +portmacro.h file for the port being used. That scheme was deprecated in favour +of setting the compiler's include path such that it found the correct +portmacro.h file - removing the need for the constant and allowing the +portmacro.h file to be located anywhere in relation to the port being used. +Purely for reasons of backward compatibility the old method is still valid, but +to make it clear that new projects should not use it, support for the port +specific constants has been moved into the deprecated_definitions.h header +file. */ +#include "deprecated_definitions.h" + +/* If portENTER_CRITICAL is not defined then including deprecated_definitions.h +did not result in a portmacro.h header file being included - and it should be +included here. In this case the path to the correct portmacro.h header file +must be set in the compiler's include path. */ +#ifndef portENTER_CRITICAL #include "portmacro.h" #endif - -#ifdef __IAR_V850ES_Fx3__ - #include "../../Source/portable/IAR/V850ES/portmacro.h" -#endif - -#ifdef __IAR_V850ES_Jx3__ - #include "../../Source/portable/IAR/V850ES/portmacro.h" -#endif - -#ifdef __IAR_V850ES_Jx3_L__ - #include "../../Source/portable/IAR/V850ES/portmacro.h" -#endif - -#ifdef __IAR_V850ES_Jx2__ - #include "../../Source/portable/IAR/V850ES/portmacro.h" +#if portBYTE_ALIGNMENT == 32 + #define portBYTE_ALIGNMENT_MASK ( 0x001f ) #endif -#ifdef __IAR_V850ES_Hx2__ - #include "../../Source/portable/IAR/V850ES/portmacro.h" +#if portBYTE_ALIGNMENT == 16 + #define portBYTE_ALIGNMENT_MASK ( 0x000f ) #endif -#ifdef __IAR_78K0R_Kx3__ - #include "../../Source/portable/IAR/78K0R/portmacro.h" -#endif - -#ifdef __IAR_78K0R_Kx3L__ - #include "../../Source/portable/IAR/78K0R/portmacro.h" -#endif - -/* Catch all to ensure portmacro.h is included in the build. Newer demos -have the path as part of the project options, rather than as relative from -the project location. If portENTER_CRITICAL() has not been defined then -portmacro.h has not yet been included - as every portmacro.h provides a -portENTER_CRITICAL() definition. Check the demo application for your demo -to find the path to the correct portmacro.h file. */ -#ifndef portENTER_CRITICAL - #include "portmacro.h" -#endif - #if portBYTE_ALIGNMENT == 8 #define portBYTE_ALIGNMENT_MASK ( 0x0007 ) #endif @@ -365,11 +139,32 @@ extern "C" { * */ #if( portUSING_MPU_WRAPPERS == 1 ) - portSTACK_TYPE *pxPortInitialiseStack( portSTACK_TYPE *pxTopOfStack, pdTASK_CODE pxCode, void *pvParameters, portBASE_TYPE xRunPrivileged ) PRIVILEGED_FUNCTION; + StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters, BaseType_t xRunPrivileged ) PRIVILEGED_FUNCTION; #else - portSTACK_TYPE *pxPortInitialiseStack( portSTACK_TYPE *pxTopOfStack, pdTASK_CODE pxCode, void *pvParameters ); + StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters ) PRIVILEGED_FUNCTION; #endif +/* Used by heap_5.c. */ +typedef struct HeapRegion +{ + uint8_t *pucStartAddress; + size_t xSizeInBytes; +} HeapRegion_t; + +/* + * Used to define multiple heap regions for use by heap_5.c. This function + * must be called before any calls to pvPortMalloc() - not creating a task, + * queue, semaphore, mutex, software timer, event group, etc. will result in + * pvPortMalloc being called. + * + * pxHeapRegions passes in an array of HeapRegion_t structures - each of which + * defines a region of memory that can be used as the heap. The array is + * terminated by a HeapRegions_t structure that has a size of 0. The region + * with the lowest start address must appear first in the array. + */ +void vPortDefineHeapRegions( const HeapRegion_t * const pxHeapRegions ) PRIVILEGED_FUNCTION; + + /* * Map to the memory management routines required for the port. */ @@ -377,12 +172,13 @@ void *pvPortMalloc( size_t xSize ) PRIVILEGED_FUNCTION; void vPortFree( void *pv ) PRIVILEGED_FUNCTION; void vPortInitialiseBlocks( void ) PRIVILEGED_FUNCTION; size_t xPortGetFreeHeapSize( void ) PRIVILEGED_FUNCTION; +size_t xPortGetMinimumEverFreeHeapSize( 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; +BaseType_t xPortStartScheduler( void ) PRIVILEGED_FUNCTION; /* * Undo any hardware/ISR setup that was performed by xPortStartScheduler() so @@ -398,9 +194,9 @@ void vPortEndScheduler( void ) PRIVILEGED_FUNCTION; * Fills the xMPUSettings structure with the memory region information * contained in xRegions. */ -#if( portUSING_MPU_WRAPPERS == 1 ) +#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; + void vPortStoreTaskMPUSettings( xMPU_SETTINGS *xMPUSettings, const struct xMEMORY_REGION * const xRegions, StackType_t *pxBottomOfStack, uint16_t usStackDepth ) PRIVILEGED_FUNCTION; #endif #ifdef __cplusplus diff --git a/lib/FreeRTOS/include/projdefs.h b/lib/FreeRTOS/include/projdefs.h index 2d5ae42aa7..956264b953 100644 --- a/lib/FreeRTOS/include/projdefs.h +++ b/lib/FreeRTOS/include/projdefs.h @@ -1,97 +1,155 @@ /* - FreeRTOS V7.4.0 - Copyright (C) 2013 Real Time Engineers Ltd. - - FEATURES AND PORTS ARE ADDED TO FREERTOS ALL THE TIME. PLEASE VISIT - http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. - - *************************************************************************** - * * - * 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! * - * * - *************************************************************************** + FreeRTOS V8.2.3 - Copyright (C) 2015 Real Time Engineers Ltd. + All rights reserved + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. This file is part of the FreeRTOS distribution. FreeRTOS is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License (version 2) as published by the - Free Software Foundation AND MODIFIED BY the FreeRTOS exception. + 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. + *************************************************************************** + >>! 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 itcan be - viewed here: http://www.freertos.org/a00114.html and also obtained by - writing to Real Time Engineers Ltd., contact details for whom are available - on the FreeRTOS WEB site. - - 1 tab == 4 spaces! + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html *************************************************************************** * * - * Having a problem? Start by reading the FAQ "My application does * - * not run, what could be wrong?" * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * * * - * http://www.FreeRTOS.org/FAQHelp.html * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * * * *************************************************************************** + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. - http://www.FreeRTOS.org - Documentation, books, training, latest versions, - license and Real Time Engineers Ltd. contact details. + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, - including FreeRTOS+Trace - an indispensable productivity tool, and our new - fully thread aware and reentrant UDP/IP stack. - - http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High - Integrity Systems, who sell the code with commercial support, - indemnification and middleware, under the OpenRTOS brand. - - http://www.SafeRTOS.com - High Integrity Systems also provide a safety - engineered and independently SIL3 certified version for use in safety and + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and mission critical applications that require provable dependability. + + 1 tab == 4 spaces! */ #ifndef PROJDEFS_H #define PROJDEFS_H -/* Defines the prototype to which task functions must conform. */ -typedef void (*pdTASK_CODE)( void * ); +/* + * Defines the prototype to which task functions must conform. Defined in this + * file to ensure the type is known before portable.h is included. + */ +typedef void (*TaskFunction_t)( void * ); -#define pdTRUE ( 1 ) -#define pdFALSE ( 0 ) +/* Converts a time in milliseconds to a time in ticks. */ +#define pdMS_TO_TICKS( xTimeInMs ) ( ( TickType_t ) ( ( ( TickType_t ) ( xTimeInMs ) * ( TickType_t ) configTICK_RATE_HZ ) / ( TickType_t ) 1000 ) ) -#define pdPASS ( 1 ) -#define pdFAIL ( 0 ) -#define errQUEUE_EMPTY ( 0 ) -#define errQUEUE_FULL ( 0 ) +#define pdFALSE ( ( BaseType_t ) 0 ) +#define pdTRUE ( ( BaseType_t ) 1 ) -/* Error definitions. */ +#define pdPASS ( pdTRUE ) +#define pdFAIL ( pdFALSE ) +#define errQUEUE_EMPTY ( ( BaseType_t ) 0 ) +#define errQUEUE_FULL ( ( BaseType_t ) 0 ) + +/* FreeRTOS error definitions. */ #define errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY ( -1 ) -#define errNO_TASK_TO_RUN ( -2 ) #define errQUEUE_BLOCKED ( -4 ) #define errQUEUE_YIELD ( -5 ) +/* Macros used for basic data corruption checks. */ +#ifndef configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES + #define configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES 0 +#endif + +#if( configUSE_16_BIT_TICKS == 1 ) + #define pdINTEGRITY_CHECK_VALUE 0x5a5a +#else + #define pdINTEGRITY_CHECK_VALUE 0x5a5a5a5aUL +#endif + +/* The following errno values are used by FreeRTOS+ components, not FreeRTOS +itself. */ +#define pdFREERTOS_ERRNO_NONE 0 /* No errors */ +#define pdFREERTOS_ERRNO_ENOENT 2 /* No such file or directory */ +#define pdFREERTOS_ERRNO_EIO 5 /* I/O error */ +#define pdFREERTOS_ERRNO_ENXIO 6 /* No such device or address */ +#define pdFREERTOS_ERRNO_EBADF 9 /* Bad file number */ +#define pdFREERTOS_ERRNO_EAGAIN 11 /* No more processes */ +#define pdFREERTOS_ERRNO_EWOULDBLOCK 11 /* Operation would block */ +#define pdFREERTOS_ERRNO_ENOMEM 12 /* Not enough memory */ +#define pdFREERTOS_ERRNO_EACCES 13 /* Permission denied */ +#define pdFREERTOS_ERRNO_EFAULT 14 /* Bad address */ +#define pdFREERTOS_ERRNO_EBUSY 16 /* Mount device busy */ +#define pdFREERTOS_ERRNO_EEXIST 17 /* File exists */ +#define pdFREERTOS_ERRNO_EXDEV 18 /* Cross-device link */ +#define pdFREERTOS_ERRNO_ENODEV 19 /* No such device */ +#define pdFREERTOS_ERRNO_ENOTDIR 20 /* Not a directory */ +#define pdFREERTOS_ERRNO_EISDIR 21 /* Is a directory */ +#define pdFREERTOS_ERRNO_EINVAL 22 /* Invalid argument */ +#define pdFREERTOS_ERRNO_ENOSPC 28 /* No space left on device */ +#define pdFREERTOS_ERRNO_ESPIPE 29 /* Illegal seek */ +#define pdFREERTOS_ERRNO_EROFS 30 /* Read only file system */ +#define pdFREERTOS_ERRNO_EUNATCH 42 /* Protocol driver not attached */ +#define pdFREERTOS_ERRNO_EBADE 50 /* Invalid exchange */ +#define pdFREERTOS_ERRNO_EFTYPE 79 /* Inappropriate file type or format */ +#define pdFREERTOS_ERRNO_ENMFILE 89 /* No more files */ +#define pdFREERTOS_ERRNO_ENOTEMPTY 90 /* Directory not empty */ +#define pdFREERTOS_ERRNO_ENAMETOOLONG 91 /* File or path name too long */ +#define pdFREERTOS_ERRNO_EOPNOTSUPP 95 /* Operation not supported on transport endpoint */ +#define pdFREERTOS_ERRNO_ENOBUFS 105 /* No buffer space available */ +#define pdFREERTOS_ERRNO_ENOPROTOOPT 109 /* Protocol not available */ +#define pdFREERTOS_ERRNO_EADDRINUSE 112 /* Address already in use */ +#define pdFREERTOS_ERRNO_ETIMEDOUT 116 /* Connection timed out */ +#define pdFREERTOS_ERRNO_EINPROGRESS 119 /* Connection already in progress */ +#define pdFREERTOS_ERRNO_EALREADY 120 /* Socket already connected */ +#define pdFREERTOS_ERRNO_EADDRNOTAVAIL 125 /* Address not available */ +#define pdFREERTOS_ERRNO_EISCONN 127 /* Socket is already connected */ +#define pdFREERTOS_ERRNO_ENOTCONN 128 /* Socket is not connected */ +#define pdFREERTOS_ERRNO_ENOMEDIUM 135 /* No medium inserted */ +#define pdFREERTOS_ERRNO_EILSEQ 138 /* An invalid UTF-16 sequence was encountered. */ +#define pdFREERTOS_ERRNO_ECANCELED 140 /* Operation canceled. */ + +/* The following endian values are used by FreeRTOS+ components, not FreeRTOS +itself. */ +#define pdFREERTOS_LITTLE_ENDIAN 0 +#define pdFREERTOS_BIG_ENDIAN 1 + #endif /* PROJDEFS_H */ diff --git a/lib/FreeRTOS/include/queue.h b/lib/FreeRTOS/include/queue.h index bb4a0ff772..2d7b5e90a7 100644 --- a/lib/FreeRTOS/include/queue.h +++ b/lib/FreeRTOS/include/queue.h @@ -1,75 +1,70 @@ /* - FreeRTOS V7.4.0 - Copyright (C) 2013 Real Time Engineers Ltd. - - FEATURES AND PORTS ARE ADDED TO FREERTOS ALL THE TIME. PLEASE VISIT - http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. - - *************************************************************************** - * * - * 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! * - * * - *************************************************************************** + FreeRTOS V8.2.3 - Copyright (C) 2015 Real Time Engineers Ltd. + All rights reserved + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. This file is part of the FreeRTOS distribution. FreeRTOS is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License (version 2) as published by the - Free Software Foundation AND MODIFIED BY the FreeRTOS exception. + 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. + *************************************************************************** + >>! 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 itcan be - viewed here: http://www.freertos.org/a00114.html and also obtained by - writing to Real Time Engineers Ltd., contact details for whom are available - on the FreeRTOS WEB site. - - 1 tab == 4 spaces! + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html *************************************************************************** * * - * Having a problem? Start by reading the FAQ "My application does * - * not run, what could be wrong?" * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * * * - * http://www.FreeRTOS.org/FAQHelp.html * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * * * *************************************************************************** + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. - http://www.FreeRTOS.org - Documentation, books, training, latest versions, - license and Real Time Engineers Ltd. contact details. + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, - including FreeRTOS+Trace - an indispensable productivity tool, and our new - fully thread aware and reentrant UDP/IP stack. - - http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High - Integrity Systems, who sell the code with commercial support, - indemnification and middleware, under the OpenRTOS brand. - - http://www.SafeRTOS.com - High Integrity Systems also provide a safety - engineered and independently SIL3 certified version for use in safety and + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and mission critical applications that require provable dependability. + + 1 tab == 4 spaces! */ @@ -85,47 +80,46 @@ extern "C" { #endif -#include "mpu_wrappers.h" - /** * Type by which queues are referenced. For example, a call to xQueueCreate() - * returns an xQueueHandle variable that can then be used as a parameter to + * returns an QueueHandle_t variable that can then be used as a parameter to * xQueueSend(), xQueueReceive(), etc. */ -typedef void * xQueueHandle; +typedef void * QueueHandle_t; /** * Type by which queue sets are referenced. For example, a call to * xQueueCreateSet() returns an xQueueSet variable that can then be used as a * parameter to xQueueSelectFromSet(), xQueueAddToSet(), etc. */ -typedef void * xQueueSetHandle; +typedef void * QueueSetHandle_t; /** * Queue sets can contain both queues and semaphores, so the - * xQueueSetMemberHandle is defined as a type to be used where a parameter or - * return value can be either an xQueueHandle or an xSemaphoreHandle. + * QueueSetMemberHandle_t is defined as a type to be used where a parameter or + * return value can be either an QueueHandle_t or an SemaphoreHandle_t. */ -typedef void * xQueueSetMemberHandle; +typedef void * QueueSetMemberHandle_t; /* For internal use only. */ -#define queueSEND_TO_BACK ( 0 ) -#define queueSEND_TO_FRONT ( 1 ) +#define queueSEND_TO_BACK ( ( BaseType_t ) 0 ) +#define queueSEND_TO_FRONT ( ( BaseType_t ) 1 ) +#define queueOVERWRITE ( ( BaseType_t ) 2 ) /* For internal use only. These definitions *must* match those in queue.c. */ -#define queueQUEUE_TYPE_BASE ( 0U ) -#define queueQUEUE_TYPE_SET ( 0U ) -#define queueQUEUE_TYPE_MUTEX ( 1U ) -#define queueQUEUE_TYPE_COUNTING_SEMAPHORE ( 2U ) -#define queueQUEUE_TYPE_BINARY_SEMAPHORE ( 3U ) -#define queueQUEUE_TYPE_RECURSIVE_MUTEX ( 4U ) +#define queueQUEUE_TYPE_BASE ( ( uint8_t ) 0U ) +#define queueQUEUE_TYPE_SET ( ( uint8_t ) 0U ) +#define queueQUEUE_TYPE_MUTEX ( ( uint8_t ) 1U ) +#define queueQUEUE_TYPE_COUNTING_SEMAPHORE ( ( uint8_t ) 2U ) +#define queueQUEUE_TYPE_BINARY_SEMAPHORE ( ( uint8_t ) 3U ) +#define queueQUEUE_TYPE_RECURSIVE_MUTEX ( ( uint8_t ) 4U ) /** * queue. h *
- xQueueHandle xQueueCreate(
-							  unsigned portBASE_TYPE uxQueueLength,
-							  unsigned portBASE_TYPE uxItemSize
+ QueueHandle_t xQueueCreate(
+							  UBaseType_t uxQueueLength,
+							  UBaseType_t uxItemSize
 						  );
  * 
* @@ -153,10 +147,10 @@ typedef void * xQueueSetMemberHandle; void vATask( void *pvParameters ) { - xQueueHandle xQueue1, xQueue2; + QueueHandle_t xQueue1, xQueue2; - // Create a queue capable of containing 10 unsigned long values. - xQueue1 = xQueueCreate( 10, sizeof( unsigned long ) ); + // Create a queue capable of containing 10 uint32_t values. + xQueue1 = xQueueCreate( 10, sizeof( uint32_t ) ); if( xQueue1 == 0 ) { // Queue was not created and must not be used. @@ -181,10 +175,10 @@ typedef void * xQueueSetMemberHandle; /** * queue. h *
- portBASE_TYPE xQueueSendToToFront(
-								   xQueueHandle	xQueue,
-								   const void	*	pvItemToQueue,
-								   portTickType	xTicksToWait
+ BaseType_t xQueueSendToToFront(
+								   QueueHandle_t	xQueue,
+								   const void		*pvItemToQueue,
+								   TickType_t		xTicksToWait
 							   );
  * 
* @@ -206,7 +200,7 @@ typedef void * xQueueSetMemberHandle; * 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. + * portTICK_PERIOD_MS should be used to convert to real time if this is required. * * @return pdTRUE if the item was successfully posted, otherwise errQUEUE_FULL. * @@ -218,15 +212,15 @@ typedef void * xQueueSetMemberHandle; char ucData[ 20 ]; } xMessage; - unsigned long ulVar = 10UL; + uint32_t ulVar = 10UL; void vATask( void *pvParameters ) { - xQueueHandle xQueue1, xQueue2; + QueueHandle_t 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 uint32_t values. + xQueue1 = xQueueCreate( 10, sizeof( uint32_t ) ); // Create a queue capable of containing 10 pointers to AMessage structures. // These should be passed by pointer as they contain a lot of data. @@ -236,9 +230,9 @@ typedef void * xQueueSetMemberHandle; if( xQueue1 != 0 ) { - // Send an unsigned long. Wait for 10 ticks for space to become + // Send an uint32_t. Wait for 10 ticks for space to become // available if necessary. - if( xQueueSendToFront( xQueue1, ( void * ) &ulVar, ( portTickType ) 10 ) != pdPASS ) + if( xQueueSendToFront( xQueue1, ( void * ) &ulVar, ( TickType_t ) 10 ) != pdPASS ) { // Failed to post the message, even after 10 ticks. } @@ -249,7 +243,7 @@ typedef void * xQueueSetMemberHandle; // 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 ); + xQueueSendToFront( xQueue2, ( void * ) &pxMessage, ( TickType_t ) 0 ); } // ... Rest of task code. @@ -263,10 +257,10 @@ typedef void * xQueueSetMemberHandle; /** * queue. h *
- portBASE_TYPE xQueueSendToBack(
-								   xQueueHandle	xQueue,
-								   const	void	*	pvItemToQueue,
-								   portTickType	xTicksToWait
+ BaseType_t xQueueSendToBack(
+								   QueueHandle_t	xQueue,
+								   const void		*pvItemToQueue,
+								   TickType_t		xTicksToWait
 							   );
  * 
* @@ -288,7 +282,7 @@ typedef void * xQueueSetMemberHandle; * 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. + * portTICK_PERIOD_MS should be used to convert to real time if this is required. * * @return pdTRUE if the item was successfully posted, otherwise errQUEUE_FULL. * @@ -300,15 +294,15 @@ typedef void * xQueueSetMemberHandle; char ucData[ 20 ]; } xMessage; - unsigned long ulVar = 10UL; + uint32_t ulVar = 10UL; void vATask( void *pvParameters ) { - xQueueHandle xQueue1, xQueue2; + QueueHandle_t 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 uint32_t values. + xQueue1 = xQueueCreate( 10, sizeof( uint32_t ) ); // Create a queue capable of containing 10 pointers to AMessage structures. // These should be passed by pointer as they contain a lot of data. @@ -318,9 +312,9 @@ typedef void * xQueueSetMemberHandle; if( xQueue1 != 0 ) { - // Send an unsigned long. Wait for 10 ticks for space to become + // Send an uint32_t. Wait for 10 ticks for space to become // available if necessary. - if( xQueueSendToBack( xQueue1, ( void * ) &ulVar, ( portTickType ) 10 ) != pdPASS ) + if( xQueueSendToBack( xQueue1, ( void * ) &ulVar, ( TickType_t ) 10 ) != pdPASS ) { // Failed to post the message, even after 10 ticks. } @@ -331,7 +325,7 @@ typedef void * xQueueSetMemberHandle; // 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 ); + xQueueSendToBack( xQueue2, ( void * ) &pxMessage, ( TickType_t ) 0 ); } // ... Rest of task code. @@ -345,10 +339,10 @@ typedef void * xQueueSetMemberHandle; /** * queue. h *
- portBASE_TYPE xQueueSend(
-							  xQueueHandle xQueue,
+ BaseType_t xQueueSend(
+							  QueueHandle_t xQueue,
 							  const void * pvItemToQueue,
-							  portTickType xTicksToWait
+							  TickType_t xTicksToWait
 						 );
  * 
* @@ -372,7 +366,7 @@ typedef void * xQueueSetMemberHandle; * 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. + * portTICK_PERIOD_MS should be used to convert to real time if this is required. * * @return pdTRUE if the item was successfully posted, otherwise errQUEUE_FULL. * @@ -384,15 +378,15 @@ typedef void * xQueueSetMemberHandle; char ucData[ 20 ]; } xMessage; - unsigned long ulVar = 10UL; + uint32_t ulVar = 10UL; void vATask( void *pvParameters ) { - xQueueHandle xQueue1, xQueue2; + QueueHandle_t 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 uint32_t values. + xQueue1 = xQueueCreate( 10, sizeof( uint32_t ) ); // Create a queue capable of containing 10 pointers to AMessage structures. // These should be passed by pointer as they contain a lot of data. @@ -402,9 +396,9 @@ typedef void * xQueueSetMemberHandle; if( xQueue1 != 0 ) { - // Send an unsigned long. Wait for 10 ticks for space to become + // Send an uint32_t. Wait for 10 ticks for space to become // available if necessary. - if( xQueueSend( xQueue1, ( void * ) &ulVar, ( portTickType ) 10 ) != pdPASS ) + if( xQueueSend( xQueue1, ( void * ) &ulVar, ( TickType_t ) 10 ) != pdPASS ) { // Failed to post the message, even after 10 ticks. } @@ -415,7 +409,7 @@ typedef void * xQueueSetMemberHandle; // 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 ); + xQueueSend( xQueue2, ( void * ) &pxMessage, ( TickType_t ) 0 ); } // ... Rest of task code. @@ -426,15 +420,98 @@ typedef void * xQueueSetMemberHandle; */ #define xQueueSend( xQueue, pvItemToQueue, xTicksToWait ) xQueueGenericSend( ( xQueue ), ( pvItemToQueue ), ( xTicksToWait ), queueSEND_TO_BACK ) +/** + * queue. h + *
+ BaseType_t xQueueOverwrite(
+							  QueueHandle_t xQueue,
+							  const void * pvItemToQueue
+						 );
+ * 
+ * + * Only for use with queues that have a length of one - so the queue is either + * empty or full. + * + * Post an item on a queue. If the queue is already full then overwrite the + * value held in the queue. The item is queued by copy, not by reference. + * + * This function must not be called from an interrupt service routine. + * See xQueueOverwriteFromISR () for an alternative which may be used in an ISR. + * + * @param xQueue The handle of the queue to which the data is being sent. + * + * @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. + * + * @return xQueueOverwrite() is a macro that calls xQueueGenericSend(), and + * therefore has the same return values as xQueueSendToFront(). However, pdPASS + * is the only value that can be returned because xQueueOverwrite() will write + * to the queue even when the queue is already full. + * + * Example usage: +
+
+ void vFunction( void *pvParameters )
+ {
+ QueueHandle_t xQueue;
+ uint32_t ulVarToSend, ulValReceived;
+
+	// Create a queue to hold one uint32_t value.  It is strongly
+	// recommended *not* to use xQueueOverwrite() on queues that can
+	// contain more than one value, and doing so will trigger an assertion
+	// if configASSERT() is defined.
+	xQueue = xQueueCreate( 1, sizeof( uint32_t ) );
+
+	// Write the value 10 to the queue using xQueueOverwrite().
+	ulVarToSend = 10;
+	xQueueOverwrite( xQueue, &ulVarToSend );
+
+	// Peeking the queue should now return 10, but leave the value 10 in
+	// the queue.  A block time of zero is used as it is known that the
+	// queue holds a value.
+	ulValReceived = 0;
+	xQueuePeek( xQueue, &ulValReceived, 0 );
+
+	if( ulValReceived != 10 )
+	{
+		// Error unless the item was removed by a different task.
+	}
+
+	// The queue is still full.  Use xQueueOverwrite() to overwrite the
+	// value held in the queue with 100.
+	ulVarToSend = 100;
+	xQueueOverwrite( xQueue, &ulVarToSend );
+
+	// This time read from the queue, leaving the queue empty once more.
+	// A block time of 0 is used again.
+	xQueueReceive( xQueue, &ulValReceived, 0 );
+
+	// The value read should be the last value written, even though the
+	// queue was already full when the value was written.
+	if( ulValReceived != 100 )
+	{
+		// Error!
+	}
+
+	// ...
+}
+ 
+ * \defgroup xQueueOverwrite xQueueOverwrite + * \ingroup QueueManagement + */ +#define xQueueOverwrite( xQueue, pvItemToQueue ) xQueueGenericSend( ( xQueue ), ( pvItemToQueue ), 0, queueOVERWRITE ) + /** * queue. h *
- portBASE_TYPE xQueueGenericSend(
-									xQueueHandle xQueue,
+ BaseType_t xQueueGenericSend(
+									QueueHandle_t xQueue,
 									const void * pvItemToQueue,
-									portTickType xTicksToWait
-									portBASE_TYPE xCopyPosition
+									TickType_t xTicksToWait
+									BaseType_t xCopyPosition
 								);
  * 
* @@ -456,7 +533,7 @@ typedef void * xQueueSetMemberHandle; * 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. + * portTICK_PERIOD_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 @@ -472,15 +549,15 @@ typedef void * xQueueSetMemberHandle; char ucData[ 20 ]; } xMessage; - unsigned long ulVar = 10UL; + uint32_t ulVar = 10UL; void vATask( void *pvParameters ) { - xQueueHandle xQueue1, xQueue2; + QueueHandle_t 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 uint32_t values. + xQueue1 = xQueueCreate( 10, sizeof( uint32_t ) ); // Create a queue capable of containing 10 pointers to AMessage structures. // These should be passed by pointer as they contain a lot of data. @@ -490,9 +567,9 @@ typedef void * xQueueSetMemberHandle; if( xQueue1 != 0 ) { - // Send an unsigned long. Wait for 10 ticks for space to become + // Send an uint32_t. Wait for 10 ticks for space to become // available if necessary. - if( xQueueGenericSend( xQueue1, ( void * ) &ulVar, ( portTickType ) 10, queueSEND_TO_BACK ) != pdPASS ) + if( xQueueGenericSend( xQueue1, ( void * ) &ulVar, ( TickType_t ) 10, queueSEND_TO_BACK ) != pdPASS ) { // Failed to post the message, even after 10 ticks. } @@ -503,7 +580,7 @@ typedef void * xQueueSetMemberHandle; // 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 ); + xQueueGenericSend( xQueue2, ( void * ) &pxMessage, ( TickType_t ) 0, queueSEND_TO_BACK ); } // ... Rest of task code. @@ -512,15 +589,15 @@ typedef void * xQueueSetMemberHandle; * \defgroup xQueueSend xQueueSend * \ingroup QueueManagement */ -signed portBASE_TYPE xQueueGenericSend( xQueueHandle xQueue, const void * const pvItemToQueue, portTickType xTicksToWait, portBASE_TYPE xCopyPosition ); +BaseType_t xQueueGenericSend( QueueHandle_t xQueue, const void * const pvItemToQueue, TickType_t xTicksToWait, const BaseType_t xCopyPosition ) PRIVILEGED_FUNCTION; /** * queue. h *
- portBASE_TYPE xQueuePeek(
-							 xQueueHandle xQueue,
+ BaseType_t xQueuePeek(
+							 QueueHandle_t xQueue,
 							 void *pvBuffer,
-							 portTickType xTicksToWait
+							 TickType_t xTicksToWait
 						 );
* * This is a macro that calls the xQueueGenericReceive() function. @@ -533,7 +610,9 @@ signed portBASE_TYPE xQueueGenericSend( xQueueHandle xQueue, const void * const * 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. + * This macro must not be used in an interrupt service routine. See + * xQueuePeekFromISR() for an alternative that can be called from an interrupt + * service routine. * * @param xQueue The handle to the queue from which the item is to be * received. @@ -544,7 +623,7 @@ signed portBASE_TYPE xQueueGenericSend( xQueueHandle xQueue, const void * const * @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. + * portTICK_PERIOD_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. * @@ -559,7 +638,7 @@ signed portBASE_TYPE xQueueGenericSend( xQueueHandle xQueue, const void * const char ucData[ 20 ]; } xMessage; - xQueueHandle xQueue; + QueueHandle_t xQueue; // Task to create a queue and post a value. void vATask( void *pvParameters ) @@ -579,7 +658,7 @@ signed portBASE_TYPE xQueueGenericSend( xQueueHandle xQueue, const void * const // 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 ); + xQueueSend( xQueue, ( void * ) &pxMessage, ( TickType_t ) 0 ); // ... Rest of task code. } @@ -593,7 +672,7 @@ signed portBASE_TYPE xQueueGenericSend( xQueueHandle xQueue, const void * const { // Peek a message on the created queue. Block for 10 ticks if a // message is not immediately available. - if( xQueuePeek( xQueue, &( pxRxedMessage ), ( portTickType ) 10 ) ) + if( xQueuePeek( xQueue, &( pxRxedMessage ), ( TickType_t ) 10 ) ) { // pcRxedMessage now points to the struct AMessage variable posted // by vATask, but the item still remains on the queue. @@ -611,10 +690,43 @@ signed portBASE_TYPE xQueueGenericSend( xQueueHandle xQueue, const void * const /** * queue. h *
- portBASE_TYPE xQueueReceive(
-								 xQueueHandle xQueue,
+ BaseType_t xQueuePeekFromISR(
+									QueueHandle_t xQueue,
+									void *pvBuffer,
+								);
+ * + * A version of xQueuePeek() that can be called from an interrupt service + * routine (ISR). + * + * 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(). + * + * @param xQueue 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. + * + * @return pdTRUE if an item was successfully received from the queue, + * otherwise pdFALSE. + * + * \defgroup xQueuePeekFromISR xQueuePeekFromISR + * \ingroup QueueManagement + */ +BaseType_t xQueuePeekFromISR( QueueHandle_t xQueue, void * const pvBuffer ) PRIVILEGED_FUNCTION; + +/** + * queue. h + *
+ BaseType_t xQueueReceive(
+								 QueueHandle_t xQueue,
 								 void *pvBuffer,
-								 portTickType xTicksToWait
+								 TickType_t xTicksToWait
 							);
* * This is a macro that calls the xQueueGenericReceive() function. @@ -638,7 +750,7 @@ signed portBASE_TYPE xQueueGenericSend( xQueueHandle xQueue, const void * const * 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 + * constant portTICK_PERIOD_MS should be used to convert to real time if this is * required. * * @return pdTRUE if an item was successfully received from the queue, @@ -652,7 +764,7 @@ signed portBASE_TYPE xQueueGenericSend( xQueueHandle xQueue, const void * const char ucData[ 20 ]; } xMessage; - xQueueHandle xQueue; + QueueHandle_t xQueue; // Task to create a queue and post a value. void vATask( void *pvParameters ) @@ -672,7 +784,7 @@ signed portBASE_TYPE xQueueGenericSend( xQueueHandle xQueue, const void * const // 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 ); + xQueueSend( xQueue, ( void * ) &pxMessage, ( TickType_t ) 0 ); // ... Rest of task code. } @@ -686,7 +798,7 @@ signed portBASE_TYPE xQueueGenericSend( xQueueHandle xQueue, const void * const { // Receive a message on the created queue. Block for 10 ticks if a // message is not immediately available. - if( xQueueReceive( xQueue, &( pxRxedMessage ), ( portTickType ) 10 ) ) + if( xQueueReceive( xQueue, &( pxRxedMessage ), ( TickType_t ) 10 ) ) { // pcRxedMessage now points to the struct AMessage variable posted // by vATask. @@ -705,11 +817,11 @@ signed portBASE_TYPE xQueueGenericSend( xQueueHandle xQueue, const void * const /** * queue. h *
- portBASE_TYPE xQueueGenericReceive(
-									   xQueueHandle	xQueue,
+ BaseType_t xQueueGenericReceive(
+									   QueueHandle_t	xQueue,
 									   void	*pvBuffer,
-									   portTickType	xTicksToWait
-									   portBASE_TYPE	xJustPeek
+									   TickType_t	xTicksToWait
+									   BaseType_t	xJustPeek
 									);
* * It is preferred that the macro xQueueReceive() be used rather than calling @@ -731,7 +843,7 @@ signed portBASE_TYPE xQueueGenericSend( xQueueHandle xQueue, const void * const * @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. + * portTICK_PERIOD_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. * @@ -751,7 +863,7 @@ signed portBASE_TYPE xQueueGenericSend( xQueueHandle xQueue, const void * const char ucData[ 20 ]; } xMessage; - xQueueHandle xQueue; + QueueHandle_t xQueue; // Task to create a queue and post a value. void vATask( void *pvParameters ) @@ -771,7 +883,7 @@ signed portBASE_TYPE xQueueGenericSend( xQueueHandle xQueue, const void * const // 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 ); + xQueueSend( xQueue, ( void * ) &pxMessage, ( TickType_t ) 0 ); // ... Rest of task code. } @@ -785,7 +897,7 @@ signed portBASE_TYPE xQueueGenericSend( xQueueHandle xQueue, const void * const { // Receive a message on the created queue. Block for 10 ticks if a // message is not immediately available. - if( xQueueGenericReceive( xQueue, &( pxRxedMessage ), ( portTickType ) 10 ) ) + if( xQueueGenericReceive( xQueue, &( pxRxedMessage ), ( TickType_t ) 10 ) ) { // pcRxedMessage now points to the struct AMessage variable posted // by vATask. @@ -798,11 +910,11 @@ signed portBASE_TYPE xQueueGenericSend( xQueueHandle xQueue, const void * const * \defgroup xQueueReceive xQueueReceive * \ingroup QueueManagement */ -signed portBASE_TYPE xQueueGenericReceive( xQueueHandle xQueue, void * const pvBuffer, portTickType xTicksToWait, portBASE_TYPE xJustPeek ); +BaseType_t xQueueGenericReceive( QueueHandle_t xQueue, void * const pvBuffer, TickType_t xTicksToWait, const BaseType_t xJustPeek ) PRIVILEGED_FUNCTION; /** * queue. h - *
unsigned portBASE_TYPE uxQueueMessagesWaiting( const xQueueHandle xQueue );
+ *
UBaseType_t uxQueueMessagesWaiting( const QueueHandle_t xQueue );
* * Return the number of messages stored in a queue. * @@ -810,32 +922,49 @@ signed portBASE_TYPE xQueueGenericReceive( xQueueHandle xQueue, void * const pvB * * @return The number of messages available in the queue. * - * \page uxQueueMessagesWaiting uxQueueMessagesWaiting + * \defgroup uxQueueMessagesWaiting uxQueueMessagesWaiting * \ingroup QueueManagement */ -unsigned portBASE_TYPE uxQueueMessagesWaiting( const xQueueHandle xQueue ); +UBaseType_t uxQueueMessagesWaiting( const QueueHandle_t xQueue ) PRIVILEGED_FUNCTION; /** * queue. h - *
void vQueueDelete( xQueueHandle xQueue );
+ *
UBaseType_t uxQueueSpacesAvailable( const QueueHandle_t xQueue );
+ * + * Return the number of free spaces available in a queue. This is equal to the + * number of items that can be sent to the queue before the queue becomes full + * if no items are removed. + * + * @param xQueue A handle to the queue being queried. + * + * @return The number of spaces available in the queue. + * + * \defgroup uxQueueMessagesWaiting uxQueueMessagesWaiting + * \ingroup QueueManagement + */ +UBaseType_t uxQueueSpacesAvailable( const QueueHandle_t xQueue ) PRIVILEGED_FUNCTION; + +/** + * queue. h + *
void vQueueDelete( QueueHandle_t xQueue );
* * 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 + * \defgroup vQueueDelete vQueueDelete * \ingroup QueueManagement */ -void vQueueDelete( xQueueHandle xQueue ); +void vQueueDelete( QueueHandle_t xQueue ) PRIVILEGED_FUNCTION; /** * queue. h *
- portBASE_TYPE xQueueSendToFrontFromISR(
-										 xQueueHandle xQueue,
+ BaseType_t xQueueSendToFrontFromISR(
+										 QueueHandle_t xQueue,
 										 const void *pvItemToQueue,
-										 portBASE_TYPE *pxHigherPriorityTaskWoken
+										 BaseType_t *pxHigherPriorityTaskWoken
 									  );
  
* @@ -870,7 +999,7 @@ void vQueueDelete( xQueueHandle xQueue ); void vBufferISR( void ) { char cIn; - portBASE_TYPE xHigherPrioritTaskWoken; + BaseType_t xHigherPrioritTaskWoken; // We have not woken a task at the start of the ISR. xHigherPriorityTaskWoken = pdFALSE; @@ -903,10 +1032,10 @@ void vQueueDelete( xQueueHandle xQueue ); /** * queue. h *
- portBASE_TYPE xQueueSendToBackFromISR(
-										 xQueueHandle xQueue,
+ BaseType_t xQueueSendToBackFromISR(
+										 QueueHandle_t xQueue,
 										 const void *pvItemToQueue,
-										 portBASE_TYPE *pxHigherPriorityTaskWoken
+										 BaseType_t *pxHigherPriorityTaskWoken
 									  );
  
* @@ -941,7 +1070,7 @@ void vQueueDelete( xQueueHandle xQueue ); void vBufferISR( void ) { char cIn; - portBASE_TYPE xHigherPriorityTaskWoken; + BaseType_t xHigherPriorityTaskWoken; // We have not woken a task at the start of the ISR. xHigherPriorityTaskWoken = pdFALSE; @@ -973,10 +1102,97 @@ void vQueueDelete( xQueueHandle xQueue ); /** * queue. h *
- portBASE_TYPE xQueueSendFromISR(
-									 xQueueHandle xQueue,
+ BaseType_t xQueueOverwriteFromISR(
+							  QueueHandle_t xQueue,
+							  const void * pvItemToQueue,
+							  BaseType_t *pxHigherPriorityTaskWoken
+						 );
+ * 
+ * + * A version of xQueueOverwrite() that can be used in an interrupt service + * routine (ISR). + * + * Only for use with queues that can hold a single item - so the queue is either + * empty or full. + * + * Post an item on a queue. If the queue is already full then overwrite the + * value held in the queue. The item is queued by copy, not by reference. + * + * @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 xQueueOverwriteFromISR() 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 xQueueOverwriteFromISR() sets this value to pdTRUE then + * a context switch should be requested before the interrupt is exited. + * + * @return xQueueOverwriteFromISR() is a macro that calls + * xQueueGenericSendFromISR(), and therefore has the same return values as + * xQueueSendToFrontFromISR(). However, pdPASS is the only value that can be + * returned because xQueueOverwriteFromISR() will write to the queue even when + * the queue is already full. + * + * Example usage: +
+
+ QueueHandle_t xQueue;
+
+ void vFunction( void *pvParameters )
+ {
+ 	// Create a queue to hold one uint32_t value.  It is strongly
+	// recommended *not* to use xQueueOverwriteFromISR() on queues that can
+	// contain more than one value, and doing so will trigger an assertion
+	// if configASSERT() is defined.
+	xQueue = xQueueCreate( 1, sizeof( uint32_t ) );
+}
+
+void vAnInterruptHandler( void )
+{
+// xHigherPriorityTaskWoken must be set to pdFALSE before it is used.
+BaseType_t xHigherPriorityTaskWoken = pdFALSE;
+uint32_t ulVarToSend, ulValReceived;
+
+	// Write the value 10 to the queue using xQueueOverwriteFromISR().
+	ulVarToSend = 10;
+	xQueueOverwriteFromISR( xQueue, &ulVarToSend, &xHigherPriorityTaskWoken );
+
+	// The queue is full, but calling xQueueOverwriteFromISR() again will still
+	// pass because the value held in the queue will be overwritten with the
+	// new value.
+	ulVarToSend = 100;
+	xQueueOverwriteFromISR( xQueue, &ulVarToSend, &xHigherPriorityTaskWoken );
+
+	// Reading from the queue will now return 100.
+
+	// ...
+
+	if( xHigherPrioritytaskWoken == pdTRUE )
+	{
+		// Writing to the queue caused a task to unblock and the unblocked task
+		// has a priority higher than or equal to the priority of the currently
+		// executing task (the task this interrupt interrupted).  Perform a context
+		// switch so this interrupt returns directly to the unblocked task.
+		portYIELD_FROM_ISR(); // or portEND_SWITCHING_ISR() depending on the port.
+	}
+}
+ 
+ * \defgroup xQueueOverwriteFromISR xQueueOverwriteFromISR + * \ingroup QueueManagement + */ +#define xQueueOverwriteFromISR( xQueue, pvItemToQueue, pxHigherPriorityTaskWoken ) xQueueGenericSendFromISR( ( xQueue ), ( pvItemToQueue ), ( pxHigherPriorityTaskWoken ), queueOVERWRITE ) + +/** + * queue. h + *
+ BaseType_t xQueueSendFromISR(
+									 QueueHandle_t xQueue,
 									 const void *pvItemToQueue,
-									 portBASE_TYPE *pxHigherPriorityTaskWoken
+									 BaseType_t *pxHigherPriorityTaskWoken
 								);
  
* @@ -1014,7 +1230,7 @@ void vQueueDelete( xQueueHandle xQueue ); void vBufferISR( void ) { char cIn; - portBASE_TYPE xHigherPriorityTaskWoken; + BaseType_t xHigherPriorityTaskWoken; // We have not woken a task at the start of the ISR. xHigherPriorityTaskWoken = pdFALSE; @@ -1034,7 +1250,7 @@ void vQueueDelete( xQueueHandle xQueue ); if( xHigherPriorityTaskWoken ) { // Actual macro used here is port specific. - taskYIELD_FROM_ISR (); + portYIELD_FROM_ISR (); } }
@@ -1047,17 +1263,18 @@ void vQueueDelete( xQueueHandle xQueue ); /** * queue. h *
- portBASE_TYPE xQueueGenericSendFromISR(
-										   xQueueHandle		xQueue,
+ BaseType_t xQueueGenericSendFromISR(
+										   QueueHandle_t		xQueue,
 										   const	void	*pvItemToQueue,
-										   portBASE_TYPE	*pxHigherPriorityTaskWoken,
-										   portBASE_TYPE	xCopyPosition
+										   BaseType_t	*pxHigherPriorityTaskWoken,
+										   BaseType_t	xCopyPosition
 									   );
  
* * It is preferred that the macros xQueueSendFromISR(), * xQueueSendToFrontFromISR() and xQueueSendToBackFromISR() be used in place - * of calling this function directly. + * of calling this function directly. xQueueGiveFromISR() is an + * equivalent for use by semaphores that don't actually copy any data. * * Post an item on a queue. It is safe to use this function from within an * interrupt service routine. @@ -1092,7 +1309,7 @@ void vQueueDelete( xQueueHandle xQueue ); void vBufferISR( void ) { char cIn; - portBASE_TYPE xHigherPriorityTaskWokenByPost; + BaseType_t xHigherPriorityTaskWokenByPost; // We have not woken a task at the start of the ISR. xHigherPriorityTaskWokenByPost = pdFALSE; @@ -1120,15 +1337,16 @@ void vQueueDelete( xQueueHandle xQueue ); * \defgroup xQueueSendFromISR xQueueSendFromISR * \ingroup QueueManagement */ -signed portBASE_TYPE xQueueGenericSendFromISR( xQueueHandle xQueue, const void * const pvItemToQueue, signed portBASE_TYPE *pxHigherPriorityTaskWoken, portBASE_TYPE xCopyPosition ); +BaseType_t xQueueGenericSendFromISR( QueueHandle_t xQueue, const void * const pvItemToQueue, BaseType_t * const pxHigherPriorityTaskWoken, const BaseType_t xCopyPosition ) PRIVILEGED_FUNCTION; +BaseType_t xQueueGiveFromISR( QueueHandle_t xQueue, BaseType_t * const pxHigherPriorityTaskWoken ) PRIVILEGED_FUNCTION; /** * queue. h *
- portBASE_TYPE xQueueReceiveFromISR(
-									   xQueueHandle	xQueue,
+ BaseType_t xQueueReceiveFromISR(
+									   QueueHandle_t	xQueue,
 									   void	*pvBuffer,
-									   portBASE_TYPE *pxTaskWoken
+									   BaseType_t *pxTaskWoken
 								   );
  * 
* @@ -1152,13 +1370,13 @@ signed portBASE_TYPE xQueueGenericSendFromISR( xQueueHandle xQueue, const void * * Example usage:
 
- xQueueHandle xQueue;
+ QueueHandle_t xQueue;
 
  // Function to create a queue and post some values.
  void vAFunction( void *pvParameters )
  {
  char cValueToPost;
- const portTickType xBlockTime = ( portTickType )0xff;
+ const TickType_t xTicksToWait = ( TickType_t )0xff;
 
 	// Create a queue capable of containing 10 characters.
 	xQueue = xQueueCreate( 10, sizeof( char ) );
@@ -1170,23 +1388,23 @@ signed portBASE_TYPE xQueueGenericSendFromISR( xQueueHandle xQueue, const void *
 	// ...
 
 	// Post some characters that will be used within an ISR.  If the queue
-	// is full then this task will block for xBlockTime ticks.
+	// is full then this task will block for xTicksToWait ticks.
 	cValueToPost = 'a';
-	xQueueSend( xQueue, ( void * ) &cValueToPost, xBlockTime );
+	xQueueSend( xQueue, ( void * ) &cValueToPost, xTicksToWait );
 	cValueToPost = 'b';
-	xQueueSend( xQueue, ( void * ) &cValueToPost, xBlockTime );
+	xQueueSend( xQueue, ( void * ) &cValueToPost, xTicksToWait );
 
 	// ... keep posting characters ... this task may block when the queue
 	// becomes full.
 
 	cValueToPost = 'c';
-	xQueueSend( xQueue, ( void * ) &cValueToPost, xBlockTime );
+	xQueueSend( xQueue, ( void * ) &cValueToPost, xTicksToWait );
  }
 
  // ISR that outputs all the characters received on the queue.
  void vISR_Routine( void )
  {
- portBASE_TYPE xTaskWokenByReceive = pdFALSE;
+ BaseType_t xTaskWokenByReceive = pdFALSE;
  char cRxedChar;
 
 	while( xQueueReceiveFromISR( xQueue, ( void * ) &cRxedChar, &xTaskWokenByReceive) )
@@ -1209,15 +1427,15 @@ signed portBASE_TYPE xQueueGenericSendFromISR( xQueueHandle xQueue, const void *
  * \defgroup xQueueReceiveFromISR xQueueReceiveFromISR
  * \ingroup QueueManagement
  */
-signed portBASE_TYPE xQueueReceiveFromISR( xQueueHandle xQueue, void * const pvBuffer, signed portBASE_TYPE *pxHigherPriorityTaskWoken );
+BaseType_t xQueueReceiveFromISR( QueueHandle_t xQueue, void * const pvBuffer, BaseType_t * const pxHigherPriorityTaskWoken ) PRIVILEGED_FUNCTION;
 
 /*
  * Utilities to query queues 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 xQueue );
-signed portBASE_TYPE xQueueIsQueueFullFromISR( const xQueueHandle xQueue );
-unsigned portBASE_TYPE uxQueueMessagesWaitingFromISR( const xQueueHandle xQueue );
+BaseType_t xQueueIsQueueEmptyFromISR( const QueueHandle_t xQueue ) PRIVILEGED_FUNCTION;
+BaseType_t xQueueIsQueueFullFromISR( const QueueHandle_t xQueue ) PRIVILEGED_FUNCTION;
+UBaseType_t uxQueueMessagesWaitingFromISR( const QueueHandle_t xQueue ) PRIVILEGED_FUNCTION;
 
 
 /*
@@ -1234,8 +1452,8 @@ unsigned portBASE_TYPE uxQueueMessagesWaitingFromISR( const xQueueHandle xQueue
  * responsiveness to gain execution speed, whereas the fully featured API
  * sacrifices execution speed to ensure better interrupt responsiveness.
  */
-signed portBASE_TYPE xQueueAltGenericSend( xQueueHandle xQueue, const void * const pvItemToQueue, portTickType xTicksToWait, portBASE_TYPE xCopyPosition );
-signed portBASE_TYPE xQueueAltGenericReceive( xQueueHandle xQueue, void * const pvBuffer, portTickType xTicksToWait, portBASE_TYPE xJustPeeking );
+BaseType_t xQueueAltGenericSend( QueueHandle_t xQueue, const void * const pvItemToQueue, TickType_t xTicksToWait, BaseType_t xCopyPosition ) PRIVILEGED_FUNCTION;
+BaseType_t xQueueAltGenericReceive( QueueHandle_t xQueue, void * const pvBuffer, TickType_t xTicksToWait, BaseType_t xJustPeeking ) PRIVILEGED_FUNCTION;
 #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 )
@@ -1250,32 +1468,30 @@ signed portBASE_TYPE xQueueAltGenericReceive( xQueueHandle xQueue, void * const
  * should not be called directly from application code.  Instead use the macro
  * wrappers defined within croutine.h.
  */
-signed portBASE_TYPE xQueueCRSendFromISR( xQueueHandle xQueue, const void *pvItemToQueue, signed portBASE_TYPE xCoRoutinePreviouslyWoken );
-signed portBASE_TYPE xQueueCRReceiveFromISR( xQueueHandle xQueue, void *pvBuffer, signed portBASE_TYPE *pxTaskWoken );
-signed portBASE_TYPE xQueueCRSend( xQueueHandle xQueue, const void *pvItemToQueue, portTickType xTicksToWait );
-signed portBASE_TYPE xQueueCRReceive( xQueueHandle xQueue, void *pvBuffer, portTickType xTicksToWait );
+BaseType_t xQueueCRSendFromISR( QueueHandle_t xQueue, const void *pvItemToQueue, BaseType_t xCoRoutinePreviouslyWoken );
+BaseType_t xQueueCRReceiveFromISR( QueueHandle_t xQueue, void *pvBuffer, BaseType_t *pxTaskWoken );
+BaseType_t xQueueCRSend( QueueHandle_t xQueue, const void *pvItemToQueue, TickType_t xTicksToWait );
+BaseType_t xQueueCRReceive( QueueHandle_t xQueue, void *pvBuffer, TickType_t xTicksToWait );
 
 /*
  * For internal use only.  Use xSemaphoreCreateMutex(),
  * xSemaphoreCreateCounting() or xSemaphoreGetMutexHolder() instead of calling
  * these functions directly.
  */
-xQueueHandle xQueueCreateMutex( unsigned char ucQueueType );
-xQueueHandle xQueueCreateCountingSemaphore( unsigned portBASE_TYPE uxCountValue, unsigned portBASE_TYPE uxInitialCount );
-void* xQueueGetMutexHolder( xQueueHandle xSemaphore );
+QueueHandle_t xQueueCreateMutex( const uint8_t ucQueueType ) PRIVILEGED_FUNCTION;
+QueueHandle_t xQueueCreateCountingSemaphore( const UBaseType_t uxMaxCount, const UBaseType_t uxInitialCount ) PRIVILEGED_FUNCTION;
+void* xQueueGetMutexHolder( QueueHandle_t xSemaphore ) PRIVILEGED_FUNCTION;
 
 /*
  * For internal use only.  Use xSemaphoreTakeMutexRecursive() or
  * xSemaphoreGiveMutexRecursive() instead of calling these functions directly.
  */
-portBASE_TYPE xQueueTakeMutexRecursive( xQueueHandle xMutex, portTickType xBlockTime );
-portBASE_TYPE xQueueGiveMutexRecursive( xQueueHandle pxMutex );
+BaseType_t xQueueTakeMutexRecursive( QueueHandle_t xMutex, TickType_t xTicksToWait ) PRIVILEGED_FUNCTION;
+BaseType_t xQueueGiveMutexRecursive( QueueHandle_t pxMutex ) PRIVILEGED_FUNCTION;
 
 /*
- * Reset a queue back to its original empty state.  pdPASS is returned if the
- * queue is successfully reset.  pdFAIL is returned if the queue could not be
- * reset because there are tasks blocked on the queue waiting to either
- * receive from the queue or send to the queue.
+ * Reset a queue back to its original empty state.  The return value is now
+ * obsolete and is always set to pdPASS.
  */
 #define xQueueReset( xQueue ) xQueueGenericReset( xQueue, pdFALSE )
 
@@ -1297,17 +1513,33 @@ portBASE_TYPE xQueueGiveMutexRecursive( xQueueHandle pxMutex );
  * 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.
+ * name that the kernel aware debugger will display.  The queue registry only
+ * stores a pointer to the string - so the string must be persistent (global or
+ * preferably in ROM/Flash), not on the stack.
+ */
+#if configQUEUE_REGISTRY_SIZE > 0
+	void vQueueAddToRegistry( QueueHandle_t xQueue, const char *pcName ) PRIVILEGED_FUNCTION; /*lint !e971 Unqualified char types are allowed for strings and single characters only. */
+#endif
+
+/*
+ * 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, and vQueueUnregisterQueue() to
+ * remove the queue, semaphore or mutex from the register.  If you are not using
+ * a kernel aware debugger then this function can be ignored.
+ *
+ * @param xQueue The handle of the queue being removed from the registry.
  */
-#if configQUEUE_REGISTRY_SIZE > 0U
-	void vQueueAddToRegistry( xQueueHandle xQueue, signed char *pcName );
+#if configQUEUE_REGISTRY_SIZE > 0
+	void vQueueUnregisterQueue( QueueHandle_t xQueue ) PRIVILEGED_FUNCTION;
 #endif
 
 /*
  * Generic version of the queue creation function, which is in turn called by
  * any queue, semaphore or mutex creation function or macro.
  */
-xQueueHandle xQueueGenericCreate( unsigned portBASE_TYPE uxQueueLength, unsigned portBASE_TYPE uxItemSize, unsigned char ucQueueType );
+QueueHandle_t xQueueGenericCreate( const UBaseType_t uxQueueLength, const UBaseType_t uxItemSize, const uint8_t ucQueueType ) PRIVILEGED_FUNCTION;
 
 /*
  * Queue sets provide a mechanism to allow a task to block (pend) on a read
@@ -1324,7 +1556,7 @@ xQueueHandle xQueueGenericCreate( unsigned portBASE_TYPE uxQueueLength, unsigned
  * semaphore take operation would be successful.
  *
  * Note 1:  See the documentation on http://wwwFreeRTOS.org/RTOS-queue-sets.html
- * for reasons why queue sets are very rarely needed in practice as there are 
+ * for reasons why queue sets are very rarely needed in practice as there are
  * simpler methods of blocking on multiple objects.
  *
  * Note 2:  Blocking on a queue set that contains a mutex will not cause the
@@ -1357,7 +1589,7 @@ xQueueHandle xQueueGenericCreate( unsigned portBASE_TYPE uxQueueLength, unsigned
  * @return If the queue set is created successfully then a handle to the created
  * queue set is returned.  Otherwise NULL is returned.
  */
-xQueueSetHandle xQueueCreateSet( unsigned portBASE_TYPE uxEventQueueLength );
+QueueSetHandle_t xQueueCreateSet( const UBaseType_t uxEventQueueLength ) PRIVILEGED_FUNCTION;
 
 /*
  * Adds a queue or semaphore to a queue set that was previously created by a
@@ -1371,7 +1603,7 @@ xQueueSetHandle xQueueCreateSet( unsigned portBASE_TYPE uxEventQueueLength );
  * a call to xQueueSelectFromSet() has first returned a handle to that set member.
  *
  * @param xQueueOrSemaphore The handle of the queue or semaphore being added to
- * the queue set (cast to an xQueueSetMemberHandle type).
+ * the queue set (cast to an QueueSetMemberHandle_t type).
  *
  * @param xQueueSet The handle of the queue set to which the queue or semaphore
  * is being added.
@@ -1381,17 +1613,17 @@ xQueueSetHandle xQueueCreateSet( unsigned portBASE_TYPE uxEventQueueLength );
  * queue set because it is already a member of a different queue set then pdFAIL
  * is returned.
  */
-portBASE_TYPE xQueueAddToSet( xQueueSetMemberHandle xQueueOrSemaphore, xQueueSetHandle xQueueSet );
+BaseType_t xQueueAddToSet( QueueSetMemberHandle_t xQueueOrSemaphore, QueueSetHandle_t xQueueSet ) PRIVILEGED_FUNCTION;
 
 /*
- * Removes a queue or semaphore from a queue set.  A queue or semaphore can only 
+ * Removes a queue or semaphore from a queue set.  A queue or semaphore can only
  * be removed from a set if the queue or semaphore is empty.
  *
  * See FreeRTOS/Source/Demo/Common/Minimal/QueueSet.c for an example using this
  * function.
  *
  * @param xQueueOrSemaphore The handle of the queue or semaphore being removed
- * from the queue set (cast to an xQueueSetMemberHandle type).
+ * from the queue set (cast to an QueueSetMemberHandle_t type).
  *
  * @param xQueueSet The handle of the queue set in which the queue or semaphore
  * is included.
@@ -1400,7 +1632,7 @@ portBASE_TYPE xQueueAddToSet( xQueueSetMemberHandle xQueueOrSemaphore, xQueueSet
  * then pdPASS is returned.  If the queue was not in the queue set, or the
  * queue (or semaphore) was not empty, then pdFAIL is returned.
  */
-portBASE_TYPE xQueueRemoveFromSet( xQueueSetMemberHandle xQueueOrSemaphore, xQueueSetHandle xQueueSet );
+BaseType_t xQueueRemoveFromSet( QueueSetMemberHandle_t xQueueOrSemaphore, QueueSetHandle_t xQueueSet ) PRIVILEGED_FUNCTION;
 
 /*
  * xQueueSelectFromSet() selects from the members of a queue set a queue or
@@ -1413,7 +1645,7 @@ portBASE_TYPE xQueueRemoveFromSet( xQueueSetMemberHandle xQueueOrSemaphore, xQue
  * function.
  *
  * Note 1:  See the documentation on http://wwwFreeRTOS.org/RTOS-queue-sets.html
- * for reasons why queue sets are very rarely needed in practice as there are 
+ * for reasons why queue sets are very rarely needed in practice as there are
  * simpler methods of blocking on multiple objects.
  *
  * Note 2:  Blocking on a queue set that contains a mutex will not cause the
@@ -1425,29 +1657,30 @@ portBASE_TYPE xQueueRemoveFromSet( xQueueSetMemberHandle xQueueOrSemaphore, xQue
  *
  * @param xQueueSet The queue set on which the task will (potentially) block.
  *
- * @param xBlockTimeTicks The maximum time, in ticks, that the calling task will
+ * @param xTicksToWait The maximum time, in ticks, that the calling task will
  * remain in the Blocked state (with other tasks executing) to wait for a member
  * of the queue set to be ready for a successful queue read or semaphore take
  * operation.
  *
  * @return xQueueSelectFromSet() will return the handle of a queue (cast to
- * a xQueueSetMemberHandle type) contained in the queue set that contains data,
- * or the handle of a semaphore (cast to a xQueueSetMemberHandle type) contained
+ * a QueueSetMemberHandle_t type) contained in the queue set that contains data,
+ * or the handle of a semaphore (cast to a QueueSetMemberHandle_t type) contained
  * in the queue set that is available, or NULL if no such queue or semaphore
  * exists before before the specified block time expires.
  */
-xQueueSetMemberHandle xQueueSelectFromSet( xQueueSetHandle xQueueSet, portTickType xBlockTimeTicks );
+QueueSetMemberHandle_t xQueueSelectFromSet( QueueSetHandle_t xQueueSet, const TickType_t xTicksToWait ) PRIVILEGED_FUNCTION;
 
 /*
  * A version of xQueueSelectFromSet() that can be used from an ISR.
  */
-xQueueSetMemberHandle xQueueSelectFromSetFromISR( xQueueSetHandle xQueueSet );
+QueueSetMemberHandle_t xQueueSelectFromSetFromISR( QueueSetHandle_t xQueueSet ) PRIVILEGED_FUNCTION;
 
 /* Not public API functions. */
-void vQueueWaitForMessageRestricted( xQueueHandle xQueue, portTickType xTicksToWait );
-portBASE_TYPE xQueueGenericReset( xQueueHandle xQueue, portBASE_TYPE xNewQueue );
-void vQueueSetQueueNumber( xQueueHandle xQueue, unsigned char ucQueueNumber ) PRIVILEGED_FUNCTION;
-unsigned char ucQueueGetQueueType( xQueueHandle xQueue ) PRIVILEGED_FUNCTION;
+void vQueueWaitForMessageRestricted( QueueHandle_t xQueue, TickType_t xTicksToWait, const BaseType_t xWaitIndefinitely ) PRIVILEGED_FUNCTION;
+BaseType_t xQueueGenericReset( QueueHandle_t xQueue, BaseType_t xNewQueue ) PRIVILEGED_FUNCTION;
+void vQueueSetQueueNumber( QueueHandle_t xQueue, UBaseType_t uxQueueNumber ) PRIVILEGED_FUNCTION;
+UBaseType_t uxQueueGetQueueNumber( QueueHandle_t xQueue ) PRIVILEGED_FUNCTION;
+uint8_t ucQueueGetQueueType( QueueHandle_t xQueue ) PRIVILEGED_FUNCTION;
 
 
 #ifdef __cplusplus
diff --git a/lib/FreeRTOS/include/semphr.h b/lib/FreeRTOS/include/semphr.h
index 7ac1ab012c..ab00d09d76 100644
--- a/lib/FreeRTOS/include/semphr.h
+++ b/lib/FreeRTOS/include/semphr.h
@@ -1,75 +1,70 @@
 /*
-    FreeRTOS V7.4.0 - Copyright (C) 2013 Real Time Engineers Ltd.
-
-    FEATURES AND PORTS ARE ADDED TO FREERTOS ALL THE TIME.  PLEASE VISIT
-    http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION.
-
-    ***************************************************************************
-     *                                                                       *
-     *    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!      *
-     *                                                                       *
-    ***************************************************************************
+    FreeRTOS V8.2.3 - Copyright (C) 2015 Real Time Engineers Ltd.
+    All rights reserved
 
+    VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION.
 
     This file is part of the FreeRTOS distribution.
 
     FreeRTOS is free software; you can redistribute it and/or modify it under
     the terms of the GNU General Public License (version 2) as published by the
-    Free Software Foundation AND MODIFIED BY the FreeRTOS exception.
+    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.
+    ***************************************************************************
+    >>!   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 itcan be
-    viewed here: http://www.freertos.org/a00114.html and also obtained by
-    writing to Real Time Engineers Ltd., contact details for whom are available
-    on the FreeRTOS WEB site.
-
-    1 tab == 4 spaces!
+    FOR A PARTICULAR PURPOSE.  Full license text is available on the following
+    link: http://www.freertos.org/a00114.html
 
     ***************************************************************************
      *                                                                       *
-     *    Having a problem?  Start by reading the FAQ "My application does   *
-     *    not run, what could be wrong?"                                     *
+     *    FreeRTOS provides completely free yet professionally developed,    *
+     *    robust, strictly quality controlled, supported, and cross          *
+     *    platform software that is more than just the market leader, it     *
+     *    is the industry's de facto standard.                               *
      *                                                                       *
-     *    http://www.FreeRTOS.org/FAQHelp.html                               *
+     *    Help yourself get started quickly while simultaneously helping     *
+     *    to support the FreeRTOS project by purchasing a FreeRTOS           *
+     *    tutorial book, reference manual, or both:                          *
+     *    http://www.FreeRTOS.org/Documentation                              *
      *                                                                       *
     ***************************************************************************
 
+    http://www.FreeRTOS.org/FAQHelp.html - Having a problem?  Start by reading
+    the FAQ page "My application does not run, what could be wrong?".  Have you
+    defined configASSERT()?
+
+    http://www.FreeRTOS.org/support - In return for receiving this top quality
+    embedded software for free we request you assist our global community by
+    participating in the support forum.
 
-    http://www.FreeRTOS.org - Documentation, books, training, latest versions, 
-    license and Real Time Engineers Ltd. contact details.
+    http://www.FreeRTOS.org/training - Investing in training allows your team to
+    be as productive as possible as early as possible.  Now you can receive
+    FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers
+    Ltd, and the world's leading authority on the world's leading RTOS.
 
     http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products,
-    including FreeRTOS+Trace - an indispensable productivity tool, and our new
-    fully thread aware and reentrant UDP/IP stack.
-
-    http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High 
-    Integrity Systems, who sell the code with commercial support, 
-    indemnification and middleware, under the OpenRTOS brand.
-    
-    http://www.SafeRTOS.com - High Integrity Systems also provide a safety 
-    engineered and independently SIL3 certified version for use in safety and 
+    including FreeRTOS+Trace - an indispensable productivity tool, a DOS
+    compatible FAT file system, and our tiny thread aware UDP/IP stack.
+
+    http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate.
+    Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS.
+
+    http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High
+    Integrity Systems ltd. to sell under the OpenRTOS brand.  Low cost OpenRTOS
+    licenses offer ticketed support, indemnification and commercial middleware.
+
+    http://www.SafeRTOS.com - High Integrity Systems also provide a safety
+    engineered and independently SIL3 certified version for use in safety and
     mission critical applications that require provable dependability.
+
+    1 tab == 4 spaces!
 */
 
 #ifndef SEMAPHORE_H
@@ -81,16 +76,23 @@
 
 #include "queue.h"
 
-typedef xQueueHandle xSemaphoreHandle;
+typedef QueueHandle_t SemaphoreHandle_t;
 
-#define semBINARY_SEMAPHORE_QUEUE_LENGTH	( ( unsigned char ) 1U )
-#define semSEMAPHORE_QUEUE_ITEM_LENGTH		( ( unsigned char ) 0U )
-#define semGIVE_BLOCK_TIME					( ( portTickType ) 0U )
+#define semBINARY_SEMAPHORE_QUEUE_LENGTH	( ( uint8_t ) 1U )
+#define semSEMAPHORE_QUEUE_ITEM_LENGTH		( ( uint8_t ) 0U )
+#define semGIVE_BLOCK_TIME					( ( TickType_t ) 0U )
 
 
 /**
  * semphr. h
- * 
vSemaphoreCreateBinary( xSemaphoreHandle xSemaphore )
+ *
vSemaphoreCreateBinary( SemaphoreHandle_t xSemaphore )
+ * + * This old vSemaphoreCreateBinary() macro is now deprecated in favour of the + * xSemaphoreCreateBinary() function. Note that binary semaphores created using + * the vSemaphoreCreateBinary() macro are created in a state such that the + * first call to 'take' the semaphore would pass, whereas binary semaphores + * created using xSemaphoreCreateBinary() are created in a state such that the + * the semaphore must first be 'given' before it can be 'taken'. * * Macro 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 @@ -104,11 +106,11 @@ typedef xQueueHandle xSemaphoreHandle; * 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. + * @param xSemaphore Handle to the created semaphore. Should be of type SemaphoreHandle_t. * * Example usage:
- xSemaphoreHandle xSemaphore;
+ SemaphoreHandle_t xSemaphore = NULL;
 
  void vATask( void * pvParameters )
  {
@@ -119,27 +121,74 @@ typedef xQueueHandle xSemaphoreHandle;
     if( xSemaphore != NULL )
     {
         // The semaphore was created successfully.
-        // The semaphore can now be used.  
+        // The semaphore can now be used.
     }
  }
  
* \defgroup vSemaphoreCreateBinary vSemaphoreCreateBinary * \ingroup Semaphores */ -#define vSemaphoreCreateBinary( xSemaphore ) \ - { \ - ( xSemaphore ) = xQueueGenericCreate( ( unsigned portBASE_TYPE ) 1, semSEMAPHORE_QUEUE_ITEM_LENGTH, queueQUEUE_TYPE_BINARY_SEMAPHORE ); \ - if( ( xSemaphore ) != NULL ) \ - { \ - xSemaphoreGive( ( xSemaphore ) ); \ - } \ +#define vSemaphoreCreateBinary( xSemaphore ) \ + { \ + ( xSemaphore ) = xQueueGenericCreate( ( UBaseType_t ) 1, semSEMAPHORE_QUEUE_ITEM_LENGTH, queueQUEUE_TYPE_BINARY_SEMAPHORE ); \ + if( ( xSemaphore ) != NULL ) \ + { \ + ( void ) xSemaphoreGive( ( xSemaphore ) ); \ + } \ } /** * semphr. h - *
xSemaphoreTake( 
- *                   xSemaphoreHandle xSemaphore, 
- *                   portTickType xBlockTime 
+ * 
SemaphoreHandle_t xSemaphoreCreateBinary( void )
+ * + * The old vSemaphoreCreateBinary() macro is now deprecated in favour of this + * xSemaphoreCreateBinary() function. Note that binary semaphores created using + * the vSemaphoreCreateBinary() macro are created in a state such that the + * first call to 'take' the semaphore would pass, whereas binary semaphores + * created using xSemaphoreCreateBinary() are created in a state such that the + * the semaphore must first be 'given' before it can be 'taken'. + * + * Function that creates 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 nothing is actually stored - all that is important is whether the queue is + * empty or full (the binary semaphore is available or not). + * + * 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(). + * + * @return Handle to the created semaphore. + * + * Example usage: +
+ SemaphoreHandle_t xSemaphore = NULL;
+
+ void vATask( void * pvParameters )
+ {
+    // Semaphore cannot be used before a call to vSemaphoreCreateBinary ().
+    // This is a macro so pass the variable in directly.
+    xSemaphore = xSemaphoreCreateBinary();
+
+    if( xSemaphore != NULL )
+    {
+        // The semaphore was created successfully.
+        // The semaphore can now be used.
+    }
+ }
+ 
+ * \defgroup vSemaphoreCreateBinary vSemaphoreCreateBinary + * \ingroup Semaphores + */ +#define xSemaphoreCreateBinary() xQueueGenericCreate( ( UBaseType_t ) 1, semSEMAPHORE_QUEUE_ITEM_LENGTH, queueQUEUE_TYPE_BINARY_SEMAPHORE ) + +/** + * semphr. h + *
xSemaphoreTake(
+ *                   SemaphoreHandle_t xSemaphore,
+ *                   TickType_t xBlockTime
  *               )
* * Macro to obtain a semaphore. The semaphore must have previously been @@ -150,7 +199,7 @@ typedef xQueueHandle xSemaphoreHandle; * 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 + * available. The macro portTICK_PERIOD_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). @@ -160,7 +209,7 @@ typedef xQueueHandle xSemaphoreHandle; * * Example usage:
- xSemaphoreHandle xSemaphore = NULL;
+ SemaphoreHandle_t xSemaphore = NULL;
 
  // A task that creates a semaphore.
  void vATask( void * pvParameters )
@@ -177,15 +226,15 @@ typedef xQueueHandle xSemaphoreHandle;
     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 )
+        // wait 10 ticks to see if it becomes free.
+        if( xSemaphoreTake( xSemaphore, ( TickType_t ) 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 
+            // We have finished accessing the shared resource.  Release the
             // semaphore.
             xSemaphoreGive( xSemaphore );
         }
@@ -200,28 +249,28 @@ typedef xQueueHandle xSemaphoreHandle;
  * \defgroup xSemaphoreTake xSemaphoreTake
  * \ingroup Semaphores
  */
-#define xSemaphoreTake( xSemaphore, xBlockTime )		xQueueGenericReceive( ( xQueueHandle ) ( xSemaphore ), NULL, ( xBlockTime ), pdFALSE )
+#define xSemaphoreTake( xSemaphore, xBlockTime )		xQueueGenericReceive( ( QueueHandle_t ) ( xSemaphore ), NULL, ( xBlockTime ), pdFALSE )
 
 /**
  * semphr. h
- * xSemaphoreTakeRecursive( 
- *                          xSemaphoreHandle xMutex, 
- *                          portTickType xBlockTime 
+ * xSemaphoreTakeRecursive(
+ *                          SemaphoreHandle_t xMutex,
+ *                          TickType_t xBlockTime
  *                        )
  *
- * Macro to recursively obtain, or 'take', a mutex type semaphore.  
- * The mutex must have previously been created using a call to 
+ * Macro 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 
+ * 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.
  *
@@ -229,17 +278,17 @@ typedef xQueueHandle xSemaphoreHandle;
  * 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
+ * available.  The macro portTICK_PERIOD_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 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:
  
- xSemaphoreHandle xMutex = NULL;
+ SemaphoreHandle_t xMutex = NULL;
 
  // A task that creates a mutex.
  void vATask( void * pvParameters )
@@ -256,22 +305,22 @@ typedef xQueueHandle xSemaphoreHandle;
     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 )
+        // wait 10 ticks to see if it becomes free.
+        if( xSemaphoreTakeRecursive( xSemaphore, ( TickType_t ) 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 
+            // 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 );
+            xSemaphoreTakeRecursive( xMutex, ( TickType_t ) 10 );
+            xSemaphoreTakeRecursive( xMutex, ( TickType_t ) 10 );
 
-            // The mutex has now been 'taken' three times, so will not be 
+            // 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
@@ -296,23 +345,23 @@ typedef xQueueHandle xSemaphoreHandle;
 #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 
+ * 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 )
+#define xSemaphoreAltTake( xSemaphore, xBlockTime )		xQueueAltGenericReceive( ( QueueHandle_t ) ( xSemaphore ), NULL, ( xBlockTime ), pdFALSE )
 
 /**
  * semphr. h
- * 
xSemaphoreGive( xSemaphoreHandle xSemaphore )
+ *
xSemaphoreGive( SemaphoreHandle_t xSemaphore )
* * Macro to release a semaphore. The semaphore must have previously been * created with a call to vSemaphoreCreateBinary(), xSemaphoreCreateMutex() or @@ -321,7 +370,7 @@ typedef xQueueHandle xSemaphoreHandle; * 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 + * This macro must also not be used on semaphores created using * xSemaphoreCreateRecursiveMutex(). * * @param xSemaphore A handle to the semaphore being released. This is the @@ -329,12 +378,12 @@ typedef xQueueHandle xSemaphoreHandle; * * @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 + * no space on the queue to post a message - indicating that the * semaphore was not first obtained correctly. * * Example usage:
- xSemaphoreHandle xSemaphore = NULL;
+ SemaphoreHandle_t xSemaphore = NULL;
 
  void vATask( void * pvParameters )
  {
@@ -351,7 +400,7 @@ typedef xQueueHandle xSemaphoreHandle;
 
         // Obtain the semaphore - don't block if the semaphore is not
         // immediately available.
-        if( xSemaphoreTake( xSemaphore, ( portTickType ) 0 ) )
+        if( xSemaphoreTake( xSemaphore, ( TickType_t ) 0 ) )
         {
             // We now have the semaphore and can access the shared resource.
 
@@ -371,25 +420,25 @@ typedef xQueueHandle xSemaphoreHandle;
  * \defgroup xSemaphoreGive xSemaphoreGive
  * \ingroup Semaphores
  */
-#define xSemaphoreGive( xSemaphore )		xQueueGenericSend( ( xQueueHandle ) ( xSemaphore ), NULL, semGIVE_BLOCK_TIME, queueSEND_TO_BACK )
+#define xSemaphoreGive( xSemaphore )		xQueueGenericSend( ( QueueHandle_t ) ( xSemaphore ), NULL, semGIVE_BLOCK_TIME, queueSEND_TO_BACK )
 
 /**
  * semphr. h
- * 
xSemaphoreGiveRecursive( xSemaphoreHandle xMutex )
+ *
xSemaphoreGiveRecursive( SemaphoreHandle_t xMutex )
* * Macro to recursively release, or 'give', a mutex type semaphore. - * The mutex must have previously been created using a call to + * 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 + * + * 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. * @@ -400,7 +449,7 @@ typedef xQueueHandle xSemaphoreHandle; * * Example usage:
- xSemaphoreHandle xMutex = NULL;
+ SemaphoreHandle_t xMutex = NULL;
 
  // A task that creates a mutex.
  void vATask( void * pvParameters )
@@ -417,22 +466,22 @@ typedef xQueueHandle xSemaphoreHandle;
     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 )
+        // wait 10 ticks to see if it becomes free.
+        if( xSemaphoreTakeRecursive( xMutex, ( TickType_t ) 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 
+            // 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 );
+            xSemaphoreTakeRecursive( xMutex, ( TickType_t ) 10 );
+            xSemaphoreTakeRecursive( xMutex, ( TickType_t ) 10 );
 
-            // The mutex has now been 'taken' three times, so will not be 
+            // 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
@@ -457,26 +506,26 @@ typedef xQueueHandle xSemaphoreHandle;
  */
 #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 
+ * 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 )
+#define xSemaphoreAltGive( xSemaphore )		xQueueAltGenericSend( ( QueueHandle_t ) ( xSemaphore ), NULL, semGIVE_BLOCK_TIME, queueSEND_TO_BACK )
 
 /**
  * semphr. h
  * 
- xSemaphoreGiveFromISR( 
-                          xSemaphoreHandle xSemaphore, 
-                          signed portBASE_TYPE *pxHigherPriorityTaskWoken
+ xSemaphoreGiveFromISR(
+                          SemaphoreHandle_t xSemaphore,
+                          BaseType_t *pxHigherPriorityTaskWoken
                       )
* * Macro to release a semaphore. The semaphore must have previously been @@ -502,14 +551,14 @@ typedef xQueueHandle xSemaphoreHandle;
  \#define LONG_TIME 0xffff
  \#define TICKS_TO_WAIT	10
- xSemaphoreHandle xSemaphore = NULL;
+ SemaphoreHandle_t xSemaphore = NULL;
 
  // Repetitive task.
  void vATask( void * pvParameters )
  {
     for( ;; )
     {
-        // We want this task to run every 10 ticks of a timer.  The semaphore 
+        // 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.
@@ -520,7 +569,7 @@ typedef xQueueHandle xSemaphoreHandle;
             // ...
 
             // 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 
+            // 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.
         }
@@ -530,8 +579,8 @@ typedef xQueueHandle xSemaphoreHandle;
  // Timer ISR
  void vTimerISR( void * pvParameters )
  {
- static unsigned char ucLocalTickCount = 0;
- static signed portBASE_TYPE xHigherPriorityTaskWoken;
+ static uint8_t ucLocalTickCount = 0;
+ static BaseType_t xHigherPriorityTaskWoken;
 
     // A timer tick has occurred.
 
@@ -560,18 +609,18 @@ typedef xQueueHandle xSemaphoreHandle;
  * \defgroup xSemaphoreGiveFromISR xSemaphoreGiveFromISR
  * \ingroup Semaphores
  */
-#define xSemaphoreGiveFromISR( xSemaphore, pxHigherPriorityTaskWoken )			xQueueGenericSendFromISR( ( xQueueHandle ) ( xSemaphore ), NULL, ( pxHigherPriorityTaskWoken ), queueSEND_TO_BACK )
+#define xSemaphoreGiveFromISR( xSemaphore, pxHigherPriorityTaskWoken )	xQueueGiveFromISR( ( QueueHandle_t ) ( xSemaphore ), ( pxHigherPriorityTaskWoken ) )
 
 /**
  * semphr. h
  * 
- xSemaphoreTakeFromISR( 
-                          xSemaphoreHandle xSemaphore, 
-                          signed portBASE_TYPE *pxHigherPriorityTaskWoken
+ xSemaphoreTakeFromISR(
+                          SemaphoreHandle_t xSemaphore,
+                          BaseType_t *pxHigherPriorityTaskWoken
                       )
* - * Macro to take a semaphore from an ISR. The semaphore must have - * previously been created with a call to vSemaphoreCreateBinary() or + * Macro to take a semaphore from an ISR. The semaphore must have + * previously been created with a call to vSemaphoreCreateBinary() or * xSemaphoreCreateCounting(). * * Mutex type semaphores (those created using a call to xSemaphoreCreateMutex()) @@ -591,39 +640,39 @@ typedef xQueueHandle xSemaphoreHandle; * running task. If xSemaphoreTakeFromISR() sets this value to pdTRUE then * a context switch should be requested before the interrupt is exited. * - * @return pdTRUE if the semaphore was successfully taken, otherwise + * @return pdTRUE if the semaphore was successfully taken, otherwise * pdFALSE */ -#define xSemaphoreTakeFromISR( xSemaphore, pxHigherPriorityTaskWoken ) xQueueReceiveFromISR( ( xQueueHandle ) ( xSemaphore ), NULL, ( pxHigherPriorityTaskWoken ) ) +#define xSemaphoreTakeFromISR( xSemaphore, pxHigherPriorityTaskWoken ) xQueueReceiveFromISR( ( QueueHandle_t ) ( xSemaphore ), NULL, ( pxHigherPriorityTaskWoken ) ) /** * semphr. h - *
xSemaphoreHandle xSemaphoreCreateMutex( void )
+ *
SemaphoreHandle_t xSemaphoreCreateMutex( void )
* - * Macro that implements a mutex semaphore by using the existing queue + * Macro 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 + * 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. + * 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. * - * 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 + * 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. + * @return xSemaphore Handle to the created mutex semaphore. Should be of type + * SemaphoreHandle_t. * * Example usage:
- xSemaphoreHandle xSemaphore;
+ SemaphoreHandle_t xSemaphore;
 
  void vATask( void * pvParameters )
  {
@@ -634,7 +683,7 @@ typedef xQueueHandle xSemaphoreHandle;
     if( xSemaphore != NULL )
     {
         // The semaphore was created successfully.
-        // The semaphore can now be used.  
+        // The semaphore can now be used.
     }
  }
  
@@ -646,39 +695,39 @@ typedef xQueueHandle xSemaphoreHandle; /** * semphr. h - *
xSemaphoreHandle xSemaphoreCreateRecursiveMutex( void )
+ *
SemaphoreHandle_t xSemaphoreCreateRecursiveMutex( void )
* - * Macro that implements a recursive mutex by using the existing queue + * Macro 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 + * 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 + * 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. + * 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 + * 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. + * @return xSemaphore Handle to the created mutex semaphore. Should be of type + * SemaphoreHandle_t. * * Example usage:
- xSemaphoreHandle xSemaphore;
+ SemaphoreHandle_t xSemaphore;
 
  void vATask( void * pvParameters )
  {
@@ -689,7 +738,7 @@ typedef xQueueHandle xSemaphoreHandle;
     if( xSemaphore != NULL )
     {
         // The semaphore was created successfully.
-        // The semaphore can now be used.  
+        // The semaphore can now be used.
     }
  }
  
@@ -700,34 +749,34 @@ typedef xQueueHandle xSemaphoreHandle; /** * semphr. h - *
xSemaphoreHandle xSemaphoreCreateCounting( unsigned portBASE_TYPE uxMaxCount, unsigned portBASE_TYPE uxInitialCount )
+ *
SemaphoreHandle_t xSemaphoreCreateCounting( UBaseType_t uxMaxCount, UBaseType_t uxInitialCount )
* - * Macro that creates a counting semaphore by using the existing - * queue mechanism. + * Macro that creates a counting semaphore by using the existing + * queue mechanism. * * Counting semaphores are typically used for two things: * - * 1) Counting events. + * 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 + * 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 + * 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 + * @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 @@ -735,14 +784,14 @@ typedef xQueueHandle xSemaphoreHandle; * * @return Handle to the created semaphore. Null if the semaphore could not be * created. - * + * * Example usage:
- xSemaphoreHandle xSemaphore;
+ SemaphoreHandle_t xSemaphore;
 
  void vATask( void * pvParameters )
  {
- xSemaphoreHandle xSemaphore = NULL;
+ SemaphoreHandle_t 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
@@ -752,7 +801,7 @@ typedef xQueueHandle xSemaphoreHandle;
     if( xSemaphore != NULL )
     {
         // The semaphore was created successfully.
-        // The semaphore can now be used.  
+        // The semaphore can now be used.
     }
  }
  
@@ -763,27 +812,27 @@ typedef xQueueHandle xSemaphoreHandle; /** * semphr. h - *
void vSemaphoreDelete( xSemaphoreHandle xSemaphore );
+ *
void vSemaphoreDelete( SemaphoreHandle_t xSemaphore );
* * Delete a semaphore. This function must be used with care. For example, * do not delete a mutex type semaphore if the mutex is held by a task. * * @param xSemaphore A handle to the semaphore to be deleted. * - * \page vSemaphoreDelete vSemaphoreDelete + * \defgroup vSemaphoreDelete vSemaphoreDelete * \ingroup Semaphores */ -#define vSemaphoreDelete( xSemaphore ) vQueueDelete( ( xQueueHandle ) ( xSemaphore ) ) +#define vSemaphoreDelete( xSemaphore ) vQueueDelete( ( QueueHandle_t ) ( xSemaphore ) ) /** * semphr.h - *
xTaskHandle xSemaphoreGetMutexHolder( xSemaphoreHandle xMutex );
+ *
TaskHandle_t xSemaphoreGetMutexHolder( SemaphoreHandle_t xMutex );
* * If xMutex is indeed a mutex type semaphore, return the current mutex holder. * If xMutex is not a mutex type semaphore, or the mutex is available (not held * by a task), return NULL. * - * Note: This Is is a good way of determining if the calling task is the mutex + * Note: This is a good way of determining if the calling task is the mutex * holder, but not a good way of determining the identity of the mutex holder as * the holder may change between the function exiting and the returned value * being tested. diff --git a/lib/FreeRTOS/include/task.h b/lib/FreeRTOS/include/task.h index 42a57e44ba..b8d6dd8909 100644 --- a/lib/FreeRTOS/include/task.h +++ b/lib/FreeRTOS/include/task.h @@ -1,86 +1,80 @@ /* - FreeRTOS V7.4.0 - Copyright (C) 2013 Real Time Engineers Ltd. - - FEATURES AND PORTS ARE ADDED TO FREERTOS ALL THE TIME. PLEASE VISIT - http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. - - *************************************************************************** - * * - * 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! * - * * - *************************************************************************** + FreeRTOS V8.2.3 - Copyright (C) 2015 Real Time Engineers Ltd. + All rights reserved + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. This file is part of the FreeRTOS distribution. FreeRTOS is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License (version 2) as published by the - Free Software Foundation AND MODIFIED BY the FreeRTOS exception. + 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. + *************************************************************************** + >>! 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 itcan be - viewed here: http://www.freertos.org/a00114.html and also obtained by - writing to Real Time Engineers Ltd., contact details for whom are available - on the FreeRTOS WEB site. - - 1 tab == 4 spaces! + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html *************************************************************************** * * - * Having a problem? Start by reading the FAQ "My application does * - * not run, what could be wrong?" * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * * * - * http://www.FreeRTOS.org/FAQHelp.html * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * * * *************************************************************************** + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. - http://www.FreeRTOS.org - Documentation, books, training, latest versions, - license and Real Time Engineers Ltd. contact details. + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, - including FreeRTOS+Trace - an indispensable productivity tool, and our new - fully thread aware and reentrant UDP/IP stack. + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. - http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High - Integrity Systems, who sell the code with commercial support, - indemnification and middleware, under the OpenRTOS brand. + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. - http://www.SafeRTOS.com - High Integrity Systems also provide a safety - engineered and independently SIL3 certified version for use in safety and + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and mission critical applications that require provable dependability. + + 1 tab == 4 spaces! */ -#ifndef TASK_H -#define TASK_H +#ifndef INC_TASK_H +#define INC_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 @@ -91,28 +85,57 @@ extern "C" { * MACROS AND DEFINITIONS *----------------------------------------------------------*/ -#define tskKERNEL_VERSION_NUMBER "V7.4.0" +#define tskKERNEL_VERSION_NUMBER "V8.2.3" +#define tskKERNEL_VERSION_MAJOR 8 +#define tskKERNEL_VERSION_MINOR 2 +#define tskKERNEL_VERSION_BUILD 3 /** * 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 + * returns (via a pointer parameter) an TaskHandle_t variable that can then * be used as a parameter to vTaskDelete to delete the task. * - * \page xTaskHandle xTaskHandle + * \defgroup TaskHandle_t TaskHandle_t * \ingroup Tasks */ -typedef void * xTaskHandle; +typedef void * TaskHandle_t; + +/* + * Defines the prototype to which the application task hook function must + * conform. + */ +typedef BaseType_t (*TaskHookFunction_t)( void * ); + +/* Task states returned by eTaskGetState. */ +typedef enum +{ + eRunning = 0, /* A task is querying the state of itself, so must be running. */ + eReady, /* The task being queried is in a read or pending ready list. */ + eBlocked, /* The task being queried is in the Blocked state. */ + eSuspended, /* The task being queried is in the Suspended state, or is in the Blocked state with an infinite time out. */ + eDeleted /* The task being queried has been deleted, but its TCB has not yet been freed. */ +} eTaskState; + +/* Actions that can be performed when vTaskNotify() is called. */ +typedef enum +{ + eNoAction = 0, /* Notify the task without updating its notify value. */ + eSetBits, /* Set bits in the task's notification value. */ + eIncrement, /* Increment the task's notification value. */ + eSetValueWithOverwrite, /* Set the task's notification value to a specific value even if the previous value has not yet been read by the task. */ + eSetValueWithoutOverwrite /* Set the task's notification value if the previous value has been read by the task. */ +} eNotifyAction; /* * Used internally only. */ typedef struct xTIME_OUT { - portBASE_TYPE xOverflowCount; - portTickType xTimeOnEntering; -} xTimeOutType; + BaseType_t xOverflowCount; + TickType_t xTimeOnEntering; +} TimeOut_t; /* * Defines the memory ranges allocated to the task when an MPU is used. @@ -120,33 +143,37 @@ typedef struct xTIME_OUT typedef struct xMEMORY_REGION { void *pvBaseAddress; - unsigned long ulLengthInBytes; - unsigned long ulParameters; -} xMemoryRegion; + uint32_t ulLengthInBytes; + uint32_t ulParameters; +} MemoryRegion_t; /* * Parameters required to create an MPU protected task. */ -typedef struct xTASK_PARAMTERS +typedef struct xTASK_PARAMETERS { - pdTASK_CODE pvTaskCode; - const signed char * const pcName; - unsigned short usStackDepth; + TaskFunction_t pvTaskCode; + const char * const pcName; /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ + uint16_t usStackDepth; void *pvParameters; - unsigned portBASE_TYPE uxPriority; - portSTACK_TYPE *puxStackBuffer; - xMemoryRegion xRegions[ portNUM_CONFIGURABLE_REGIONS ]; -} xTaskParameters; - -/* Task states returned by eTaskGetState. */ -typedef enum + UBaseType_t uxPriority; + StackType_t *puxStackBuffer; + MemoryRegion_t xRegions[ portNUM_CONFIGURABLE_REGIONS ]; +} TaskParameters_t; + +/* Used with the uxTaskGetSystemState() function to return the state of each task +in the system. */ +typedef struct xTASK_STATUS { - eRunning = 0, /* A task is querying the state of itself, so must be running. */ - eReady, /* The task being queried is in a read or pending ready list. */ - eBlocked, /* The task being queried is in the Blocked state. */ - eSuspended, /* The task being queried is in the Suspended state, or is in the Blocked state with an infinite time out. */ - eDeleted /* The task being queried has been deleted, but its TCB has not yet been freed. */ -} eTaskState; + TaskHandle_t xHandle; /* The handle of the task to which the rest of the information in the structure relates. */ + const char *pcTaskName; /* A pointer to the task's name. This value will be invalid if the task was deleted since the structure was populated! */ /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ + UBaseType_t xTaskNumber; /* A number unique to the task. */ + eTaskState eCurrentState; /* The state in which the task existed when the structure was populated. */ + UBaseType_t uxCurrentPriority; /* The priority at which the task was running (may be inherited) when the structure was populated. */ + UBaseType_t uxBasePriority; /* The priority to which the task will return if the task's current priority has been inherited to avoid unbounded priority inversion when obtaining a mutex. Only valid if configUSE_MUTEXES is defined as 1 in FreeRTOSConfig.h. */ + uint32_t ulRunTimeCounter; /* The total run time allocated to the task so far, as defined by the run time stats clock. See http://www.freertos.org/rtos-run-time-stats.html. Only valid when configGENERATE_RUN_TIME_STATS is defined as 1 in FreeRTOSConfig.h. */ + uint16_t usStackHighWaterMark; /* The minimum amount of stack space that has remained for the task since the task was created. The closer this value is to zero the closer the task has come to overflowing its stack. */ +} TaskStatus_t; /* Possible return values for eTaskConfirmSleepModeStatus(). */ typedef enum @@ -157,19 +184,19 @@ typedef enum } eSleepModeStatus; -/* +/** * Defines the priority used by the idle task. This must not be modified. * * \ingroup TaskUtils */ -#define tskIDLE_PRIORITY ( ( unsigned portBASE_TYPE ) 0U ) +#define tskIDLE_PRIORITY ( ( UBaseType_t ) 0U ) /** * task. h * * Macro for forcing a context switch. * - * \page taskYIELD taskYIELD + * \defgroup taskYIELD taskYIELD * \ingroup SchedulerControl */ #define taskYIELD() portYIELD() @@ -183,10 +210,11 @@ typedef enum * NOTE: This may alter the stack (depending on the portable implementation) * so must be used with care! * - * \page taskENTER_CRITICAL taskENTER_CRITICAL + * \defgroup taskENTER_CRITICAL taskENTER_CRITICAL * \ingroup SchedulerControl */ #define taskENTER_CRITICAL() portENTER_CRITICAL() +#define taskENTER_CRITICAL_FROM_ISR() portSET_INTERRUPT_MASK_FROM_ISR() /** * task. h @@ -197,17 +225,17 @@ typedef enum * NOTE: This may alter the stack (depending on the portable implementation) * so must be used with care! * - * \page taskEXIT_CRITICAL taskEXIT_CRITICAL + * \defgroup taskEXIT_CRITICAL taskEXIT_CRITICAL * \ingroup SchedulerControl */ #define taskEXIT_CRITICAL() portEXIT_CRITICAL() - +#define taskEXIT_CRITICAL_FROM_ISR( x ) portCLEAR_INTERRUPT_MASK_FROM_ISR( x ) /** * task. h * * Macro to disable all maskable interrupts. * - * \page taskDISABLE_INTERRUPTS taskDISABLE_INTERRUPTS + * \defgroup taskDISABLE_INTERRUPTS taskDISABLE_INTERRUPTS * \ingroup SchedulerControl */ #define taskDISABLE_INTERRUPTS() portDISABLE_INTERRUPTS() @@ -217,15 +245,18 @@ typedef enum * * Macro to enable microcontroller interrupts. * - * \page taskENABLE_INTERRUPTS taskENABLE_INTERRUPTS + * \defgroup 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 +/* Definitions returned by xTaskGetSchedulerState(). taskSCHEDULER_SUSPENDED is +0 to generate more optimal code when configASSERT() is defined as the constant +is used in assert() statements. */ +#define taskSCHEDULER_SUSPENDED ( ( BaseType_t ) 0 ) +#define taskSCHEDULER_NOT_STARTED ( ( BaseType_t ) 1 ) +#define taskSCHEDULER_RUNNING ( ( BaseType_t ) 2 ) + /*----------------------------------------------------------- * TASK CREATION API @@ -234,13 +265,13 @@ typedef enum /** * task. h *
- portBASE_TYPE xTaskCreate(
-							  pdTASK_CODE pvTaskCode,
+ BaseType_t xTaskCreate(
+							  TaskFunction_t pvTaskCode,
 							  const char * const pcName,
-							  unsigned short usStackDepth,
+							  uint16_t usStackDepth,
 							  void *pvParameters,
-							  unsigned portBASE_TYPE uxPriority,
-							  xTaskHandle *pvCreatedTask
+							  UBaseType_t uxPriority,
+							  TaskHandle_t *pvCreatedTask
 						  );
* * Create a new task and add it to the list of tasks that are ready to run. @@ -254,7 +285,7 @@ typedef enum * 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 + * facilitate debugging. Max length defined by configMAX_TASK_NAME_LEN - default * is 16. * * @param usStackDepth The size of the task stack specified as the number of @@ -275,7 +306,7 @@ typedef enum * 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 + * list, otherwise an error code defined in the file projdefs.h * * Example usage:
@@ -291,17 +322,21 @@ typedef enum
  // Function that creates a task.
  void vOtherFunction( void )
  {
- static unsigned char ucParameterToPass;
- xTaskHandle xHandle;
+ static uint8_t ucParameterToPass;
+ TaskHandle_t xHandle = NULL;
 
 	 // 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 );
+     configASSERT( xHandle );
 
 	 // Use the handle to delete the task.
-	 vTaskDelete( xHandle );
+     if( xHandle != NULL )
+     {
+	     vTaskDelete( xHandle );
+     }
  }
    
* \defgroup xTaskCreate xTaskCreate @@ -312,7 +347,7 @@ typedef enum /** * task. h *
- portBASE_TYPE xTaskCreateRestricted( xTaskParameters *pxTaskDefinition, xTaskHandle *pxCreatedTask );
+ BaseType_t xTaskCreateRestricted( TaskParameters_t *pxTaskDefinition, TaskHandle_t *pxCreatedTask );
* * xTaskCreateRestricted() should only be used in systems that include an MPU * implementation. @@ -330,12 +365,12 @@ typedef enum * 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 + * list, otherwise an error code defined in the file projdefs.h * * Example usage:
-// Create an xTaskParameters structure that defines the task to be created.
-static const xTaskParameters xCheckTaskParameters =
+// Create an TaskParameters_t structure that defines the task to be created.
+static const TaskParameters_t xCheckTaskParameters =
 {
 	vATask,		// pvTaskCode - the function that implements the task.
 	"ATask",	// pcName - just a text name for the task to assist debugging.
@@ -358,7 +393,7 @@ static const xTaskParameters xCheckTaskParameters =
 
 int main( void )
 {
-xTaskHandle xHandle;
+TaskHandle_t 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
@@ -369,7 +404,7 @@ xTaskHandle xHandle;
 	vTaskStartScheduler();
 
 	// Will only get here if there was insufficient memory to create the idle
-	// task.
+	// and/or timer task.
 	for( ;; );
 }
    
@@ -381,7 +416,7 @@ xTaskHandle xHandle; /** * task. h *
- void vTaskAllocateMPURegions( xTaskHandle xTask, const xMemoryRegion * const pxRegions );
+ void vTaskAllocateMPURegions( TaskHandle_t xTask, const MemoryRegion_t * const pxRegions );
* * Memory regions are assigned to a restricted task when the task is created by * a call to xTaskCreateRestricted(). These regions can be redefined using @@ -389,16 +424,16 @@ xTaskHandle xHandle; * * @param xTask The handle of the task being updated. * - * @param xRegions A pointer to an xMemoryRegion structure that contains the + * @param xRegions A pointer to an MemoryRegion_t structure that contains the * new memory region definitions. * * Example usage:
-// Define an array of xMemoryRegion structures that configures an MPU region
+// Define an array of MemoryRegion_t 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 ] =
+static const MemoryRegion_t xAltRegions[ portNUM_CONFIGURABLE_REGIONS ] =
 {
 	// Base address		Length		Parameters
 	{ ucOneKByte,		1024,		portMPU_REGION_READ_WRITE },
@@ -424,16 +459,16 @@ void vATask( void *pvParameters )
  * \defgroup xTaskCreateRestricted xTaskCreateRestricted
  * \ingroup Tasks
  */
-void vTaskAllocateMPURegions( xTaskHandle xTask, const xMemoryRegion * const pxRegions ) PRIVILEGED_FUNCTION;
+void vTaskAllocateMPURegions( TaskHandle_t xTask, const MemoryRegion_t * const pxRegions ) PRIVILEGED_FUNCTION;
 
 /**
  * task. h
- * 
void vTaskDelete( xTaskHandle xTask );
+ *
void vTaskDelete( TaskHandle_t xTask );
* * 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 + * Remove a task from the RTOS real time kernel's 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 @@ -453,7 +488,7 @@ void vTaskAllocateMPURegions( xTaskHandle xTask, const xMemoryRegion * const pxR
  void vOtherFunction( void )
  {
- xTaskHandle xHandle;
+ TaskHandle_t xHandle;
 
 	 // Create the task, storing the handle.
 	 xTaskCreate( vTaskCode, "NAME", STACK_SIZE, NULL, tskIDLE_PRIORITY, &xHandle );
@@ -465,7 +500,7 @@ void vTaskAllocateMPURegions( xTaskHandle xTask, const xMemoryRegion * const pxR
  * \defgroup vTaskDelete vTaskDelete
  * \ingroup Tasks
  */
-void vTaskDelete( xTaskHandle xTaskToDelete ) PRIVILEGED_FUNCTION;
+void vTaskDelete( TaskHandle_t xTaskToDelete ) PRIVILEGED_FUNCTION;
 
 /*-----------------------------------------------------------
  * TASK CONTROL API
@@ -473,11 +508,11 @@ void vTaskDelete( xTaskHandle xTaskToDelete ) PRIVILEGED_FUNCTION;
 
 /**
  * task. h
- * 
void vTaskDelay( portTickType xTicksToDelay );
+ *
void vTaskDelay( const TickType_t xTicksToDelay );
* * 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 + * portTICK_PERIOD_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. @@ -488,7 +523,7 @@ void vTaskDelete( xTaskHandle xTaskToDelete ) PRIVILEGED_FUNCTION; * 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 + * of controlling the frequency of a periodic 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 @@ -501,12 +536,10 @@ void vTaskDelete( xTaskHandle xTaskToDelete ) PRIVILEGED_FUNCTION; * * Example usage: - void vTaskFunction( void * pvParameters ) - { void vTaskFunction( void * pvParameters ) { // Block for 500ms. - const portTickType xDelay = 500 / portTICK_RATE_MS; + const TickType_t xDelay = 500 / portTICK_PERIOD_MS; for( ;; ) { @@ -519,16 +552,16 @@ void vTaskDelete( xTaskHandle xTaskToDelete ) PRIVILEGED_FUNCTION; * \defgroup vTaskDelay vTaskDelay * \ingroup TaskCtrl */ -void vTaskDelay( portTickType xTicksToDelay ) PRIVILEGED_FUNCTION; +void vTaskDelay( const TickType_t xTicksToDelay ) PRIVILEGED_FUNCTION; /** * task. h - *
void vTaskDelayUntil( portTickType *pxPreviousWakeTime, portTickType xTimeIncrement );
+ *
void vTaskDelayUntil( TickType_t *pxPreviousWakeTime, const TickType_t xTimeIncrement );
* * 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 + * Delay a task until a specified time. This function can be used by periodic * tasks to ensure a constant execution frequency. * * This function differs from vTaskDelay () in one important aspect: vTaskDelay () will @@ -543,7 +576,7 @@ void vTaskDelay( portTickType xTicksToDelay ) PRIVILEGED_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 + * The constant portTICK_PERIOD_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 @@ -561,8 +594,8 @@ void vTaskDelay( portTickType xTicksToDelay ) PRIVILEGED_FUNCTION; // Perform an action every 10 ticks. void vTaskFunction( void * pvParameters ) { - portTickType xLastWakeTime; - const portTickType xFrequency = 10; + TickType_t xLastWakeTime; + const TickType_t xFrequency = 10; // Initialise the xLastWakeTime variable with the current time. xLastWakeTime = xTaskGetTickCount (); @@ -578,13 +611,13 @@ void vTaskDelay( portTickType xTicksToDelay ) PRIVILEGED_FUNCTION; * \defgroup vTaskDelayUntil vTaskDelayUntil * \ingroup TaskCtrl */ -void vTaskDelayUntil( portTickType * const pxPreviousWakeTime, portTickType xTimeIncrement ) PRIVILEGED_FUNCTION; +void vTaskDelayUntil( TickType_t * const pxPreviousWakeTime, const TickType_t xTimeIncrement ) PRIVILEGED_FUNCTION; /** * task. h - *
unsigned portBASE_TYPE uxTaskPriorityGet( xTaskHandle xTask );
+ *
UBaseType_t uxTaskPriorityGet( TaskHandle_t xTask );
* - * INCLUDE_xTaskPriorityGet must be defined as 1 for this function to be available. + * INCLUDE_uxTaskPriorityGet must be defined as 1 for this function to be available. * See the configuration section for more information. * * Obtain the priority of any task. @@ -598,7 +631,7 @@ void vTaskDelayUntil( portTickType * const pxPreviousWakeTime, portTickType xTim
  void vAFunction( void )
  {
- xTaskHandle xHandle;
+ TaskHandle_t xHandle;
 
 	 // Create a task, storing the handle.
 	 xTaskCreate( vTaskCode, "NAME", STACK_SIZE, NULL, tskIDLE_PRIORITY, &xHandle );
@@ -625,11 +658,19 @@ void vTaskDelayUntil( portTickType * const pxPreviousWakeTime, portTickType xTim
  * \defgroup uxTaskPriorityGet uxTaskPriorityGet
  * \ingroup TaskCtrl
  */
-unsigned portBASE_TYPE uxTaskPriorityGet( xTaskHandle xTask ) PRIVILEGED_FUNCTION;
+UBaseType_t uxTaskPriorityGet( TaskHandle_t xTask ) PRIVILEGED_FUNCTION;
 
 /**
  * task. h
- * 
eTaskState eTaskGetState( xTaskHandle xTask );
+ *
UBaseType_t uxTaskPriorityGetFromISR( TaskHandle_t xTask );
+ * + * A version of uxTaskPriorityGet() that can be used from an ISR. + */ +UBaseType_t uxTaskPriorityGetFromISR( TaskHandle_t xTask ) PRIVILEGED_FUNCTION; + +/** + * task. h + *
eTaskState eTaskGetState( TaskHandle_t xTask );
* * INCLUDE_eTaskGetState must be defined as 1 for this function to be available. * See the configuration section for more information. @@ -643,11 +684,11 @@ unsigned portBASE_TYPE uxTaskPriorityGet( xTaskHandle xTask ) PRIVILEGED_FUNCTIO * state of the task might change between the function being called, and the * functions return value being tested by the calling task. */ -eTaskState eTaskGetState( xTaskHandle xTask ) PRIVILEGED_FUNCTION; +eTaskState eTaskGetState( TaskHandle_t xTask ) PRIVILEGED_FUNCTION; /** * task. h - *
void vTaskPrioritySet( xTaskHandle xTask, unsigned portBASE_TYPE uxNewPriority );
+ *
void vTaskPrioritySet( TaskHandle_t xTask, UBaseType_t uxNewPriority );
* * INCLUDE_vTaskPrioritySet must be defined as 1 for this function to be available. * See the configuration section for more information. @@ -666,7 +707,7 @@ eTaskState eTaskGetState( xTaskHandle xTask ) PRIVILEGED_FUNCTION;
  void vAFunction( void )
  {
- xTaskHandle xHandle;
+ TaskHandle_t xHandle;
 
 	 // Create a task, storing the handle.
 	 xTaskCreate( vTaskCode, "NAME", STACK_SIZE, NULL, tskIDLE_PRIORITY, &xHandle );
@@ -685,11 +726,11 @@ eTaskState eTaskGetState( xTaskHandle xTask ) PRIVILEGED_FUNCTION;
  * \defgroup vTaskPrioritySet vTaskPrioritySet
  * \ingroup TaskCtrl
  */
-void vTaskPrioritySet( xTaskHandle xTask, unsigned portBASE_TYPE uxNewPriority ) PRIVILEGED_FUNCTION;
+void vTaskPrioritySet( TaskHandle_t xTask, UBaseType_t uxNewPriority ) PRIVILEGED_FUNCTION;
 
 /**
  * task. h
- * 
void vTaskSuspend( xTaskHandle xTaskToSuspend );
+ *
void vTaskSuspend( TaskHandle_t xTaskToSuspend );
* * INCLUDE_vTaskSuspend must be defined as 1 for this function to be available. * See the configuration section for more information. @@ -708,7 +749,7 @@ void vTaskPrioritySet( xTaskHandle xTask, unsigned portBASE_TYPE uxNewPriority )
  void vAFunction( void )
  {
- xTaskHandle xHandle;
+ TaskHandle_t xHandle;
 
 	 // Create a task, storing the handle.
 	 xTaskCreate( vTaskCode, "NAME", STACK_SIZE, NULL, tskIDLE_PRIORITY, &xHandle );
@@ -736,18 +777,18 @@ void vTaskPrioritySet( xTaskHandle xTask, unsigned portBASE_TYPE uxNewPriority )
  * \defgroup vTaskSuspend vTaskSuspend
  * \ingroup TaskCtrl
  */
-void vTaskSuspend( xTaskHandle xTaskToSuspend ) PRIVILEGED_FUNCTION;
+void vTaskSuspend( TaskHandle_t xTaskToSuspend ) PRIVILEGED_FUNCTION;
 
 /**
  * task. h
- * 
void vTaskResume( xTaskHandle xTaskToResume );
+ *
void vTaskResume( TaskHandle_t xTaskToResume );
* * 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 () + * A task that has been suspended by one or more calls to vTaskSuspend () * will be made available for running again by a single call to * vTaskResume (). * @@ -757,7 +798,7 @@ void vTaskSuspend( xTaskHandle xTaskToSuspend ) PRIVILEGED_FUNCTION;
  void vAFunction( void )
  {
- xTaskHandle xHandle;
+ TaskHandle_t xHandle;
 
 	 // Create a task, storing the handle.
 	 xTaskCreate( vTaskCode, "NAME", STACK_SIZE, NULL, tskIDLE_PRIORITY, &xHandle );
@@ -779,33 +820,42 @@ void vTaskSuspend( xTaskHandle xTaskToSuspend ) PRIVILEGED_FUNCTION;
 	 vTaskResume( xHandle );
 
 	 // The created task will once again get microcontroller processing
-	 // time in accordance with it priority within the system.
+	 // time in accordance with its priority within the system.
  }
    
* \defgroup vTaskResume vTaskResume * \ingroup TaskCtrl */ -void vTaskResume( xTaskHandle xTaskToResume ) PRIVILEGED_FUNCTION; +void vTaskResume( TaskHandle_t xTaskToResume ) PRIVILEGED_FUNCTION; /** * task. h - *
void xTaskResumeFromISR( xTaskHandle xTaskToResume );
+ *
void xTaskResumeFromISR( TaskHandle_t xTaskToResume );
* * 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 () + * A task that has been suspended by one or more calls to vTaskSuspend () * will be made available for running again by a single call to * xTaskResumeFromISR (). * + * xTaskResumeFromISR() should not be used to synchronise a task with an + * interrupt if there is a chance that the interrupt could arrive prior to the + * task being suspended - as this can lead to interrupts being missed. Use of a + * semaphore as a synchronisation mechanism would avoid this eventuality. + * * @param xTaskToResume Handle to the task being readied. * + * @return pdTRUE if resuming the task should result in a context switch, + * otherwise pdFALSE. This is used by the ISR to determine if a context switch + * may be required following the ISR. + * * \defgroup vTaskResumeFromISR vTaskResumeFromISR * \ingroup TaskCtrl */ -portBASE_TYPE xTaskResumeFromISR( xTaskHandle xTaskToResume ) PRIVILEGED_FUNCTION; +BaseType_t xTaskResumeFromISR( TaskHandle_t xTaskToResume ) PRIVILEGED_FUNCTION; /*----------------------------------------------------------- * SCHEDULER CONTROL @@ -816,12 +866,7 @@ portBASE_TYPE xTaskResumeFromISR( xTaskHandle xTaskToResume ) PRIVILEGED_FUNCTIO *
void vTaskStartScheduler( void );
* * 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. + * has control over which tasks are executed and when. * * See the demo application file main.c for an example of creating * tasks and starting the kernel. @@ -849,6 +894,9 @@ void vTaskStartScheduler( void ) PRIVILEGED_FUNCTION; * task. h *
void vTaskEndScheduler( void );
* + * NOTE: At the time of writing only the x86 real mode port, which runs on a PC + * in place of DOS, implements this function. + * * 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 () @@ -902,8 +950,8 @@ void vTaskEndScheduler( void ) PRIVILEGED_FUNCTION; * task. h *
void vTaskSuspendAll( void );
* - * Suspends all real time kernel activity while keeping interrupts (including the - * kernel tick) enabled. + * Suspends the scheduler without disabling interrupts. Context switches will + * not occur while the scheduler is suspended. * * After calling vTaskSuspendAll () the calling task will continue to execute * without risk of being swapped out until a call to xTaskResumeAll () has been @@ -951,11 +999,13 @@ void vTaskSuspendAll( void ) PRIVILEGED_FUNCTION; /** * task. h - *
char xTaskResumeAll( void );
+ *
BaseType_t xTaskResumeAll( void );
+ * + * Resumes scheduler activity after it was suspended by a call to + * vTaskSuspendAll(). * - * 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. + * xTaskResumeAll() only resumes the scheduler. It does not unsuspend tasks + * that were previously suspended by a call to vTaskSuspend(). * * @return If resuming the scheduler caused a context switch then pdTRUE is * returned, otherwise pdFALSE is returned. @@ -999,18 +1049,7 @@ void vTaskSuspendAll( void ) PRIVILEGED_FUNCTION; * \defgroup xTaskResumeAll xTaskResumeAll * \ingroup SchedulerControl */ -signed portBASE_TYPE xTaskResumeAll( void ) PRIVILEGED_FUNCTION; - -/** - * task. h - *
signed portBASE_TYPE xTaskIsTaskSuspended( xTaskHandle xTask );
- * - * 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; +BaseType_t xTaskResumeAll( void ) PRIVILEGED_FUNCTION; /*----------------------------------------------------------- * TASK UTILITIES @@ -1018,67 +1057,250 @@ signed portBASE_TYPE xTaskIsTaskSuspended( xTaskHandle xTask ) PRIVILEGED_FUNCTI /** * task. h - *
portTickType xTaskGetTickCount( void );
+ *
TickType_t xTaskGetTickCount( void );
* * @return The count of ticks since vTaskStartScheduler was called. * - * \page xTaskGetTickCount xTaskGetTickCount + * \defgroup xTaskGetTickCount xTaskGetTickCount * \ingroup TaskUtils */ -portTickType xTaskGetTickCount( void ) PRIVILEGED_FUNCTION; +TickType_t xTaskGetTickCount( void ) PRIVILEGED_FUNCTION; /** * task. h - *
portTickType xTaskGetTickCountFromISR( void );
+ *
TickType_t xTaskGetTickCountFromISR( void );
* * @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 + * ISR - provided that TickType_t is the natural word size of the * microcontroller being used or interrupt nesting is either not supported or * not being used. * - * \page xTaskGetTickCount xTaskGetTickCount + * \defgroup xTaskGetTickCountFromISR xTaskGetTickCountFromISR * \ingroup TaskUtils */ -portTickType xTaskGetTickCountFromISR( void ) PRIVILEGED_FUNCTION; +TickType_t xTaskGetTickCountFromISR( void ) PRIVILEGED_FUNCTION; /** * task. h - *
unsigned short uxTaskGetNumberOfTasks( void );
+ *
uint16_t uxTaskGetNumberOfTasks( void );
* * @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 + * \defgroup uxTaskGetNumberOfTasks uxTaskGetNumberOfTasks * \ingroup TaskUtils */ -unsigned portBASE_TYPE uxTaskGetNumberOfTasks( void ) PRIVILEGED_FUNCTION; +UBaseType_t uxTaskGetNumberOfTasks( void ) PRIVILEGED_FUNCTION; /** * task. h - *
signed char *pcTaskGetTaskName( xTaskHandle xTaskToQuery );
+ *
char *pcTaskGetTaskName( TaskHandle_t xTaskToQuery );
* * @return The text (human readable) name of the task referenced by the handle - * xTaskToQueury. A task can query its own name by either passing in its own + * xTaskToQuery. A task can query its own name by either passing in its own * handle, or by setting xTaskToQuery to NULL. INCLUDE_pcTaskGetTaskName must be * set to 1 in FreeRTOSConfig.h for pcTaskGetTaskName() to be available. * - * \page pcTaskGetTaskName pcTaskGetTaskName + * \defgroup pcTaskGetTaskName pcTaskGetTaskName * \ingroup TaskUtils */ -signed char *pcTaskGetTaskName( xTaskHandle xTaskToQuery ); +char *pcTaskGetTaskName( TaskHandle_t xTaskToQuery ) PRIVILEGED_FUNCTION; /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ + +/** + * task.h + *
UBaseType_t uxTaskGetStackHighWaterMark( TaskHandle_t xTask );
+ * + * 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 words, so + * actual spaces on the stack rather than bytes) since the task referenced by + * xTask was created. + */ +UBaseType_t uxTaskGetStackHighWaterMark( TaskHandle_t xTask ) PRIVILEGED_FUNCTION; + +/* When using trace macros it is sometimes necessary to include task.h before +FreeRTOS.h. When this is done TaskHookFunction_t 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 + *
void vTaskSetApplicationTaskTag( TaskHandle_t xTask, TaskHookFunction_t pxHookFunction );
+ * + * 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( TaskHandle_t xTask, TaskHookFunction_t pxHookFunction ) PRIVILEGED_FUNCTION; + + /** + * task.h + *
void xTaskGetApplicationTaskTag( TaskHandle_t xTask );
+ * + * Returns the pxHookFunction value assigned to the task xTask. + */ + TaskHookFunction_t xTaskGetApplicationTaskTag( TaskHandle_t xTask ) PRIVILEGED_FUNCTION; + #endif /* configUSE_APPLICATION_TASK_TAG ==1 */ +#endif /* ifdef configUSE_APPLICATION_TASK_TAG */ + +#if( configNUM_THREAD_LOCAL_STORAGE_POINTERS > 0 ) + + /* Each task contains an array of pointers that is dimensioned by the + configNUM_THREAD_LOCAL_STORAGE_POINTERS setting in FreeRTOSConfig.h. The + kernel does not use the pointers itself, so the application writer can use + the pointers for any purpose they wish. The following two functions are + used to set and query a pointer respectively. */ + void vTaskSetThreadLocalStoragePointer( TaskHandle_t xTaskToSet, BaseType_t xIndex, void *pvValue ) PRIVILEGED_FUNCTION; + void *pvTaskGetThreadLocalStoragePointer( TaskHandle_t xTaskToQuery, BaseType_t xIndex ) PRIVILEGED_FUNCTION; + +#endif + +/** + * task.h + *
BaseType_t xTaskCallApplicationTaskHook( TaskHandle_t xTask, void *pvParameter );
+ * + * 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. The return value is the value returned by the task hook function + * registered by the user. + */ +BaseType_t xTaskCallApplicationTaskHook( TaskHandle_t xTask, void *pvParameter ) PRIVILEGED_FUNCTION; + +/** + * xTaskGetIdleTaskHandle() is only available if + * INCLUDE_xTaskGetIdleTaskHandle is set to 1 in FreeRTOSConfig.h. + * + * Simply returns the handle of the idle task. It is not valid to call + * xTaskGetIdleTaskHandle() before the scheduler has been started. + */ +TaskHandle_t xTaskGetIdleTaskHandle( void ) PRIVILEGED_FUNCTION; + +/** + * configUSE_TRACE_FACILITY must be defined as 1 in FreeRTOSConfig.h for + * uxTaskGetSystemState() to be available. + * + * uxTaskGetSystemState() populates an TaskStatus_t structure for each task in + * the system. TaskStatus_t structures contain, among other things, members + * for the task handle, task name, task priority, task state, and total amount + * of run time consumed by the task. See the TaskStatus_t structure + * definition in this file for the full member list. + * + * NOTE: This function is intended for debugging use only as its use results in + * the scheduler remaining suspended for an extended period. + * + * @param pxTaskStatusArray A pointer to an array of TaskStatus_t structures. + * The array must contain at least one TaskStatus_t structure for each task + * that is under the control of the RTOS. The number of tasks under the control + * of the RTOS can be determined using the uxTaskGetNumberOfTasks() API function. + * + * @param uxArraySize The size of the array pointed to by the pxTaskStatusArray + * parameter. The size is specified as the number of indexes in the array, or + * the number of TaskStatus_t structures contained in the array, not by the + * number of bytes in the array. + * + * @param pulTotalRunTime If configGENERATE_RUN_TIME_STATS is set to 1 in + * FreeRTOSConfig.h then *pulTotalRunTime is set by uxTaskGetSystemState() to the + * total run time (as defined by the run time stats clock, see + * http://www.freertos.org/rtos-run-time-stats.html) since the target booted. + * pulTotalRunTime can be set to NULL to omit the total run time information. + * + * @return The number of TaskStatus_t structures that were populated by + * uxTaskGetSystemState(). This should equal the number returned by the + * uxTaskGetNumberOfTasks() API function, but will be zero if the value passed + * in the uxArraySize parameter was too small. + * + * Example usage: +
+    // This example demonstrates how a human readable table of run time stats
+	// information is generated from raw data provided by uxTaskGetSystemState().
+	// The human readable table is written to pcWriteBuffer
+	void vTaskGetRunTimeStats( char *pcWriteBuffer )
+	{
+	TaskStatus_t *pxTaskStatusArray;
+	volatile UBaseType_t uxArraySize, x;
+	uint32_t ulTotalRunTime, ulStatsAsPercentage;
+
+		// Make sure the write buffer does not contain a string.
+		*pcWriteBuffer = 0x00;
+
+		// Take a snapshot of the number of tasks in case it changes while this
+		// function is executing.
+		uxArraySize = uxTaskGetNumberOfTasks();
+
+		// Allocate a TaskStatus_t structure for each task.  An array could be
+		// allocated statically at compile time.
+		pxTaskStatusArray = pvPortMalloc( uxArraySize * sizeof( TaskStatus_t ) );
+
+		if( pxTaskStatusArray != NULL )
+		{
+			// Generate raw status information about each task.
+			uxArraySize = uxTaskGetSystemState( pxTaskStatusArray, uxArraySize, &ulTotalRunTime );
+
+			// For percentage calculations.
+			ulTotalRunTime /= 100UL;
+
+			// Avoid divide by zero errors.
+			if( ulTotalRunTime > 0 )
+			{
+				// For each populated position in the pxTaskStatusArray array,
+				// format the raw data as human readable ASCII data
+				for( x = 0; x < uxArraySize; x++ )
+				{
+					// What percentage of the total run time has the task used?
+					// This will always be rounded down to the nearest integer.
+					// ulTotalRunTimeDiv100 has already been divided by 100.
+					ulStatsAsPercentage = pxTaskStatusArray[ x ].ulRunTimeCounter / ulTotalRunTime;
+
+					if( ulStatsAsPercentage > 0UL )
+					{
+						sprintf( pcWriteBuffer, "%s\t\t%lu\t\t%lu%%\r\n", pxTaskStatusArray[ x ].pcTaskName, pxTaskStatusArray[ x ].ulRunTimeCounter, ulStatsAsPercentage );
+					}
+					else
+					{
+						// If the percentage is zero here then the task has
+						// consumed less than 1% of the total run time.
+						sprintf( pcWriteBuffer, "%s\t\t%lu\t\t<1%%\r\n", pxTaskStatusArray[ x ].pcTaskName, pxTaskStatusArray[ x ].ulRunTimeCounter );
+					}
+
+					pcWriteBuffer += strlen( ( char * ) pcWriteBuffer );
+				}
+			}
+
+			// The array is no longer needed, free the memory it consumes.
+			vPortFree( pxTaskStatusArray );
+		}
+	}
+	
+ */ +UBaseType_t uxTaskGetSystemState( TaskStatus_t * const pxTaskStatusArray, const UBaseType_t uxArraySize, uint32_t * const pulTotalRunTime ) PRIVILEGED_FUNCTION; /** * task. h *
void vTaskList( char *pcWriteBuffer );
* - * configUSE_TRACE_FACILITY must be defined as 1 for this function to be - * available. See the configuration section for more information. + * configUSE_TRACE_FACILITY and configUSE_STATS_FORMATTING_FUNCTIONS must + * both be defined as 1 for this function to be available. See the + * configuration section of the FreeRTOS.org website for more information. * - * NOTE: This function will disable interrupts for its duration. It is + * NOTE 1: 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 @@ -1087,28 +1309,49 @@ signed char *pcTaskGetTaskName( xTaskHandle xTaskToQuery ); * Tasks are reported as blocked ('B'), ready ('R'), deleted ('D') or * suspended ('S'). * + * PLEASE NOTE: + * + * This function is provided for convenience only, and is used by many of the + * demo applications. Do not consider it to be part of the scheduler. + * + * vTaskList() calls uxTaskGetSystemState(), then formats part of the + * uxTaskGetSystemState() output into a human readable table that displays task + * names, states and stack usage. + * + * vTaskList() has a dependency on the sprintf() C library function that might + * bloat the code size, use a lot of stack, and provide different results on + * different platforms. An alternative, tiny, third party, and limited + * functionality implementation of sprintf() is provided in many of the + * FreeRTOS/Demo sub-directories in a file called printf-stdarg.c (note + * printf-stdarg.c does not provide a full snprintf() implementation!). + * + * It is recommended that production systems call uxTaskGetSystemState() + * directly to get access to raw stats data, rather than indirectly through a + * call to vTaskList(). + * * @param pcWriteBuffer A buffer into which the above mentioned details - * will be written, in ascii form. This buffer is assumed to be large + * 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 + * \defgroup vTaskList vTaskList * \ingroup TaskUtils */ -void vTaskList( signed char *pcWriteBuffer ) PRIVILEGED_FUNCTION; +void vTaskList( char * pcWriteBuffer ) PRIVILEGED_FUNCTION; /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ /** * task. h *
void vTaskGetRunTimeStats( char *pcWriteBuffer );
* - * 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. + * configGENERATE_RUN_TIME_STATS and configUSE_STATS_FORMATTING_FUNCTIONS + * must both 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 + * NOTE 1: 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 @@ -1119,84 +1362,471 @@ void vTaskList( signed char *pcWriteBuffer ) PRIVILEGED_FUNCTION; * task into a buffer, both as an absolute count value and as a percentage * of the total system execution time. * + * NOTE 2: + * + * This function is provided for convenience only, and is used by many of the + * demo applications. Do not consider it to be part of the scheduler. + * + * vTaskGetRunTimeStats() calls uxTaskGetSystemState(), then formats part of the + * uxTaskGetSystemState() output into a human readable table that displays the + * amount of time each task has spent in the Running state in both absolute and + * percentage terms. + * + * vTaskGetRunTimeStats() has a dependency on the sprintf() C library function + * that might bloat the code size, use a lot of stack, and provide different + * results on different platforms. An alternative, tiny, third party, and + * limited functionality implementation of sprintf() is provided in many of the + * FreeRTOS/Demo sub-directories in a file called printf-stdarg.c (note + * printf-stdarg.c does not provide a full snprintf() implementation!). + * + * It is recommended that production systems call uxTaskGetSystemState() directly + * to get access to raw stats data, rather than indirectly through a call to + * vTaskGetRunTimeStats(). + * * @param pcWriteBuffer A buffer into which the execution times will be - * written, in ascii form. This buffer is assumed to be large enough to + * 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 + * \defgroup vTaskGetRunTimeStats vTaskGetRunTimeStats * \ingroup TaskUtils */ -void vTaskGetRunTimeStats( signed char *pcWriteBuffer ) PRIVILEGED_FUNCTION; +void vTaskGetRunTimeStats( char *pcWriteBuffer ) PRIVILEGED_FUNCTION; /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ /** - * task.h - *
unsigned portBASE_TYPE uxTaskGetStackHighWaterMark( xTaskHandle xTask );
+ * task. h + *
BaseType_t xTaskNotify( TaskHandle_t xTaskToNotify, uint32_t ulValue, eNotifyAction eAction );
+ * + * configUSE_TASK_NOTIFICATIONS must be undefined or defined as 1 for this + * function to be available. + * + * When configUSE_TASK_NOTIFICATIONS is set to one each task has its own private + * "notification value", which is a 32-bit unsigned integer (uint32_t). + * + * Events can be sent to a task using an intermediary object. Examples of such + * objects are queues, semaphores, mutexes and event groups. Task notifications + * are a method of sending an event directly to a task without the need for such + * an intermediary object. + * + * A notification sent to a task can optionally perform an action, such as + * update, overwrite or increment the task's notification value. In that way + * task notifications can be used to send data to a task, or be used as light + * weight and fast binary or counting semaphores. + * + * A notification sent to a task will remain pending until it is cleared by the + * task calling xTaskNotifyWait() or ulTaskNotifyTake(). If the task was + * already in the Blocked state to wait for a notification when the notification + * arrives then the task will automatically be removed from the Blocked state + * (unblocked) and the notification cleared. + * + * A task can use xTaskNotifyWait() to [optionally] block to wait for a + * notification to be pending, or ulTaskNotifyTake() to [optionally] block + * to wait for its notification value to have a non-zero value. The task does + * not consume any CPU time while it is in the Blocked state. + * + * See http://www.FreeRTOS.org/RTOS-task-notifications.html for details. + * + * @param xTaskToNotify The handle of the task being notified. The handle to a + * task can be returned from the xTaskCreate() API function used to create the + * task, and the handle of the currently running task can be obtained by calling + * xTaskGetCurrentTaskHandle(). + * + * @param ulValue Data that can be sent with the notification. How the data is + * used depends on the value of the eAction parameter. + * + * @param eAction Specifies how the notification updates the task's notification + * value, if at all. Valid values for eAction are as follows: + * + * eSetBits - + * The task's notification value is bitwise ORed with ulValue. xTaskNofify() + * always returns pdPASS in this case. + * + * eIncrement - + * The task's notification value is incremented. ulValue is not used and + * xTaskNotify() always returns pdPASS in this case. + * + * eSetValueWithOverwrite - + * The task's notification value is set to the value of ulValue, even if the + * task being notified had not yet processed the previous notification (the + * task already had a notification pending). xTaskNotify() always returns + * pdPASS in this case. + * + * eSetValueWithoutOverwrite - + * If the task being notified did not already have a notification pending then + * the task's notification value is set to ulValue and xTaskNotify() will + * return pdPASS. If the task being notified already had a notification + * pending then no action is performed and pdFAIL is returned. + * + * eNoAction - + * The task receives a notification without its notification value being + * updated. ulValue is not used and xTaskNotify() always returns pdPASS in + * this case. + * + * pulPreviousNotificationValue - + * Can be used to pass out the subject task's notification value before any + * bits are modified by the notify function. + * + * @return Dependent on the value of eAction. See the description of the + * eAction parameter. + * + * \defgroup xTaskNotify xTaskNotify + * \ingroup TaskNotifications + */ +BaseType_t xTaskGenericNotify( TaskHandle_t xTaskToNotify, uint32_t ulValue, eNotifyAction eAction, uint32_t *pulPreviousNotificationValue ) PRIVILEGED_FUNCTION; +#define xTaskNotify( xTaskToNotify, ulValue, eAction ) xTaskGenericNotify( ( xTaskToNotify ), ( ulValue ), ( eAction ), NULL ) +#define xTaskNotifyAndQuery( xTaskToNotify, ulValue, eAction, pulPreviousNotifyValue ) xTaskGenericNotify( ( xTaskToNotify ), ( ulValue ), ( eAction ), ( pulPreviousNotifyValue ) ) + +/** + * task. h + *
BaseType_t xTaskNotifyFromISR( TaskHandle_t xTaskToNotify, uint32_t ulValue, eNotifyAction eAction, BaseType_t *pxHigherPriorityTaskWoken );
+ * + * configUSE_TASK_NOTIFICATIONS must be undefined or defined as 1 for this + * function to be available. + * + * When configUSE_TASK_NOTIFICATIONS is set to one each task has its own private + * "notification value", which is a 32-bit unsigned integer (uint32_t). + * + * A version of xTaskNotify() that can be used from an interrupt service routine + * (ISR). + * + * Events can be sent to a task using an intermediary object. Examples of such + * objects are queues, semaphores, mutexes and event groups. Task notifications + * are a method of sending an event directly to a task without the need for such + * an intermediary object. + * + * A notification sent to a task can optionally perform an action, such as + * update, overwrite or increment the task's notification value. In that way + * task notifications can be used to send data to a task, or be used as light + * weight and fast binary or counting semaphores. + * + * A notification sent to a task will remain pending until it is cleared by the + * task calling xTaskNotifyWait() or ulTaskNotifyTake(). If the task was + * already in the Blocked state to wait for a notification when the notification + * arrives then the task will automatically be removed from the Blocked state + * (unblocked) and the notification cleared. + * + * A task can use xTaskNotifyWait() to [optionally] block to wait for a + * notification to be pending, or ulTaskNotifyTake() to [optionally] block + * to wait for its notification value to have a non-zero value. The task does + * not consume any CPU time while it is in the Blocked state. + * + * See http://www.FreeRTOS.org/RTOS-task-notifications.html for details. + * + * @param xTaskToNotify The handle of the task being notified. The handle to a + * task can be returned from the xTaskCreate() API function used to create the + * task, and the handle of the currently running task can be obtained by calling + * xTaskGetCurrentTaskHandle(). + * + * @param ulValue Data that can be sent with the notification. How the data is + * used depends on the value of the eAction parameter. + * + * @param eAction Specifies how the notification updates the task's notification + * value, if at all. Valid values for eAction are as follows: + * + * eSetBits - + * The task's notification value is bitwise ORed with ulValue. xTaskNofify() + * always returns pdPASS in this case. + * + * eIncrement - + * The task's notification value is incremented. ulValue is not used and + * xTaskNotify() always returns pdPASS in this case. + * + * eSetValueWithOverwrite - + * The task's notification value is set to the value of ulValue, even if the + * task being notified had not yet processed the previous notification (the + * task already had a notification pending). xTaskNotify() always returns + * pdPASS in this case. + * + * eSetValueWithoutOverwrite - + * If the task being notified did not already have a notification pending then + * the task's notification value is set to ulValue and xTaskNotify() will + * return pdPASS. If the task being notified already had a notification + * pending then no action is performed and pdFAIL is returned. + * + * eNoAction - + * The task receives a notification without its notification value being + * updated. ulValue is not used and xTaskNotify() always returns pdPASS in + * this case. + * + * @param pxHigherPriorityTaskWoken xTaskNotifyFromISR() will set + * *pxHigherPriorityTaskWoken to pdTRUE if sending the notification caused the + * task to which the notification was sent to leave the Blocked state, and the + * unblocked task has a priority higher than the currently running task. If + * xTaskNotifyFromISR() sets this value to pdTRUE then a context switch should + * be requested before the interrupt is exited. How a context switch is + * requested from an ISR is dependent on the port - see the documentation page + * for the port in use. + * + * @return Dependent on the value of eAction. See the description of the + * eAction parameter. + * + * \defgroup xTaskNotify xTaskNotify + * \ingroup TaskNotifications + */ +BaseType_t xTaskGenericNotifyFromISR( TaskHandle_t xTaskToNotify, uint32_t ulValue, eNotifyAction eAction, uint32_t *pulPreviousNotificationValue, BaseType_t *pxHigherPriorityTaskWoken ) PRIVILEGED_FUNCTION; +#define xTaskNotifyFromISR( xTaskToNotify, ulValue, eAction, pxHigherPriorityTaskWoken ) xTaskGenericNotifyFromISR( ( xTaskToNotify ), ( ulValue ), ( eAction ), NULL, ( pxHigherPriorityTaskWoken ) ) +#define xTaskNotifyAndQueryFromISR( xTaskToNotify, ulValue, eAction, pulPreviousNotificationValue, pxHigherPriorityTaskWoken ) xTaskGenericNotifyFromISR( ( xTaskToNotify ), ( ulValue ), ( eAction ), ( pulPreviousNotificationValue ), ( pxHigherPriorityTaskWoken ) ) + +/** + * task. h + *
BaseType_t xTaskNotifyWait( uint32_t ulBitsToClearOnEntry, uint32_t ulBitsToClearOnExit, uint32_t *pulNotificationValue, TickType_t xTicksToWait );
+ * + * configUSE_TASK_NOTIFICATIONS must be undefined or defined as 1 for this + * function to be available. + * + * When configUSE_TASK_NOTIFICATIONS is set to one each task has its own private + * "notification value", which is a 32-bit unsigned integer (uint32_t). + * + * Events can be sent to a task using an intermediary object. Examples of such + * objects are queues, semaphores, mutexes and event groups. Task notifications + * are a method of sending an event directly to a task without the need for such + * an intermediary object. + * + * A notification sent to a task can optionally perform an action, such as + * update, overwrite or increment the task's notification value. In that way + * task notifications can be used to send data to a task, or be used as light + * weight and fast binary or counting semaphores. + * + * A notification sent to a task will remain pending until it is cleared by the + * task calling xTaskNotifyWait() or ulTaskNotifyTake(). If the task was + * already in the Blocked state to wait for a notification when the notification + * arrives then the task will automatically be removed from the Blocked state + * (unblocked) and the notification cleared. + * + * A task can use xTaskNotifyWait() to [optionally] block to wait for a + * notification to be pending, or ulTaskNotifyTake() to [optionally] block + * to wait for its notification value to have a non-zero value. The task does + * not consume any CPU time while it is in the Blocked state. + * + * See http://www.FreeRTOS.org/RTOS-task-notifications.html for details. + * + * @param ulBitsToClearOnEntry Bits that are set in ulBitsToClearOnEntry value + * will be cleared in the calling task's notification value before the task + * checks to see if any notifications are pending, and optionally blocks if no + * notifications are pending. Setting ulBitsToClearOnEntry to ULONG_MAX (if + * limits.h is included) or 0xffffffffUL (if limits.h is not included) will have + * the effect of resetting the task's notification value to 0. Setting + * ulBitsToClearOnEntry to 0 will leave the task's notification value unchanged. + * + * @param ulBitsToClearOnExit If a notification is pending or received before + * the calling task exits the xTaskNotifyWait() function then the task's + * notification value (see the xTaskNotify() API function) is passed out using + * the pulNotificationValue parameter. Then any bits that are set in + * ulBitsToClearOnExit will be cleared in the task's notification value (note + * *pulNotificationValue is set before any bits are cleared). Setting + * ulBitsToClearOnExit to ULONG_MAX (if limits.h is included) or 0xffffffffUL + * (if limits.h is not included) will have the effect of resetting the task's + * notification value to 0 before the function exits. Setting + * ulBitsToClearOnExit to 0 will leave the task's notification value unchanged + * when the function exits (in which case the value passed out in + * pulNotificationValue will match the task's notification value). + * + * @param pulNotificationValue Used to pass the task's notification value out + * of the function. Note the value passed out will not be effected by the + * clearing of any bits caused by ulBitsToClearOnExit being non-zero. + * + * @param xTicksToWait The maximum amount of time that the task should wait in + * the Blocked state for a notification to be received, should a notification + * not already be pending when xTaskNotifyWait() was called. The task + * will not consume any processing time while it is in the Blocked state. This + * is specified in kernel ticks, the macro pdMS_TO_TICSK( value_in_ms ) can be + * used to convert a time specified in milliseconds to a time specified in + * ticks. + * + * @return If a notification was received (including notifications that were + * already pending when xTaskNotifyWait was called) then pdPASS is + * returned. Otherwise pdFAIL is returned. + * + * \defgroup xTaskNotifyWait xTaskNotifyWait + * \ingroup TaskNotifications + */ +BaseType_t xTaskNotifyWait( uint32_t ulBitsToClearOnEntry, uint32_t ulBitsToClearOnExit, uint32_t *pulNotificationValue, TickType_t xTicksToWait ) PRIVILEGED_FUNCTION; + +/** + * task. h + *
BaseType_t xTaskNotifyGive( TaskHandle_t xTaskToNotify );
* - * INCLUDE_uxTaskGetStackHighWaterMark must be set to 1 in FreeRTOSConfig.h for - * this function to be available. + * configUSE_TASK_NOTIFICATIONS must be undefined or defined as 1 for this macro + * 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. + * When configUSE_TASK_NOTIFICATIONS is set to one each task has its own private + * "notification value", which is a 32-bit unsigned integer (uint32_t). * - * @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. + * Events can be sent to a task using an intermediary object. Examples of such + * objects are queues, semaphores, mutexes and event groups. Task notifications + * are a method of sending an event directly to a task without the need for such + * an intermediary object. * - * @return The smallest amount of free stack space there has been (in bytes) - * since the task referenced by xTask was created. + * A notification sent to a task can optionally perform an action, such as + * update, overwrite or increment the task's notification value. In that way + * task notifications can be used to send data to a task, or be used as light + * weight and fast binary or counting semaphores. + * + * xTaskNotifyGive() is a helper macro intended for use when task notifications + * are used as light weight and faster binary or counting semaphore equivalents. + * Actual FreeRTOS semaphores are given using the xSemaphoreGive() API function, + * the equivalent action that instead uses a task notification is + * xTaskNotifyGive(). + * + * When task notifications are being used as a binary or counting semaphore + * equivalent then the task being notified should wait for the notification + * using the ulTaskNotificationTake() API function rather than the + * xTaskNotifyWait() API function. + * + * See http://www.FreeRTOS.org/RTOS-task-notifications.html for more details. + * + * @param xTaskToNotify The handle of the task being notified. The handle to a + * task can be returned from the xTaskCreate() API function used to create the + * task, and the handle of the currently running task can be obtained by calling + * xTaskGetCurrentTaskHandle(). + * + * @return xTaskNotifyGive() is a macro that calls xTaskNotify() with the + * eAction parameter set to eIncrement - so pdPASS is always returned. + * + * \defgroup xTaskNotifyGive xTaskNotifyGive + * \ingroup TaskNotifications */ -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 - *
void vTaskSetApplicationTaskTag( xTaskHandle xTask, pdTASK_HOOK_CODE pxHookFunction );
- * - * 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; +#define xTaskNotifyGive( xTaskToNotify ) xTaskGenericNotify( ( xTaskToNotify ), ( 0 ), eIncrement, NULL ) - /** - * task.h - *
void xTaskGetApplicationTaskTag( xTaskHandle xTask );
- * - * 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 + *
void vTaskNotifyGiveFromISR( TaskHandle_t xTaskHandle, BaseType_t *pxHigherPriorityTaskWoken );
+ *
+ * configUSE_TASK_NOTIFICATIONS must be undefined or defined as 1 for this macro
+ * to be available.
+ *
+ * When configUSE_TASK_NOTIFICATIONS is set to one each task has its own private
+ * "notification value", which is a 32-bit unsigned integer (uint32_t).
+ *
+ * A version of xTaskNotifyGive() that can be called from an interrupt service
+ * routine (ISR).
+ *
+ * Events can be sent to a task using an intermediary object.  Examples of such
+ * objects are queues, semaphores, mutexes and event groups.  Task notifications
+ * are a method of sending an event directly to a task without the need for such
+ * an intermediary object.
+ *
+ * A notification sent to a task can optionally perform an action, such as
+ * update, overwrite or increment the task's notification value.  In that way
+ * task notifications can be used to send data to a task, or be used as light
+ * weight and fast binary or counting semaphores.
+ *
+ * vTaskNotifyGiveFromISR() is intended for use when task notifications are
+ * used as light weight and faster binary or counting semaphore equivalents.
+ * Actual FreeRTOS semaphores are given from an ISR using the
+ * xSemaphoreGiveFromISR() API function, the equivalent action that instead uses
+ * a task notification is vTaskNotifyGiveFromISR().
+ *
+ * When task notifications are being used as a binary or counting semaphore
+ * equivalent then the task being notified should wait for the notification
+ * using the ulTaskNotificationTake() API function rather than the
+ * xTaskNotifyWait() API function.
+ *
+ * See http://www.FreeRTOS.org/RTOS-task-notifications.html for more details.
+ *
+ * @param xTaskToNotify The handle of the task being notified.  The handle to a
+ * task can be returned from the xTaskCreate() API function used to create the
+ * task, and the handle of the currently running task can be obtained by calling
+ * xTaskGetCurrentTaskHandle().
+ *
+ * @param pxHigherPriorityTaskWoken  vTaskNotifyGiveFromISR() will set
+ * *pxHigherPriorityTaskWoken to pdTRUE if sending the notification caused the
+ * task to which the notification was sent to leave the Blocked state, and the
+ * unblocked task has a priority higher than the currently running task.  If
+ * vTaskNotifyGiveFromISR() sets this value to pdTRUE then a context switch
+ * should be requested before the interrupt is exited.  How a context switch is
+ * requested from an ISR is dependent on the port - see the documentation page
+ * for the port in use.
+ *
+ * \defgroup xTaskNotifyWait xTaskNotifyWait
+ * \ingroup TaskNotifications
+ */
+void vTaskNotifyGiveFromISR( TaskHandle_t xTaskToNotify, BaseType_t *pxHigherPriorityTaskWoken ) PRIVILEGED_FUNCTION;
 
 /**
- * task.h
- * 
portBASE_TYPE xTaskCallApplicationTaskHook( xTaskHandle xTask, pdTASK_HOOK_CODE pxHookFunction );
- * - * 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. + * task. h + *
uint32_t ulTaskNotifyTake( BaseType_t xClearCountOnExit, TickType_t xTicksToWait );
+ * + * configUSE_TASK_NOTIFICATIONS must be undefined or defined as 1 for this + * function to be available. + * + * When configUSE_TASK_NOTIFICATIONS is set to one each task has its own private + * "notification value", which is a 32-bit unsigned integer (uint32_t). + * + * Events can be sent to a task using an intermediary object. Examples of such + * objects are queues, semaphores, mutexes and event groups. Task notifications + * are a method of sending an event directly to a task without the need for such + * an intermediary object. + * + * A notification sent to a task can optionally perform an action, such as + * update, overwrite or increment the task's notification value. In that way + * task notifications can be used to send data to a task, or be used as light + * weight and fast binary or counting semaphores. + * + * ulTaskNotifyTake() is intended for use when a task notification is used as a + * faster and lighter weight binary or counting semaphore alternative. Actual + * FreeRTOS semaphores are taken using the xSemaphoreTake() API function, the + * equivalent action that instead uses a task notification is + * ulTaskNotifyTake(). + * + * When a task is using its notification value as a binary or counting semaphore + * other tasks should send notifications to it using the xTaskNotifyGive() + * macro, or xTaskNotify() function with the eAction parameter set to + * eIncrement. + * + * ulTaskNotifyTake() can either clear the task's notification value to + * zero on exit, in which case the notification value acts like a binary + * semaphore, or decrement the task's notification value on exit, in which case + * the notification value acts like a counting semaphore. + * + * A task can use ulTaskNotifyTake() to [optionally] block to wait for a + * the task's notification value to be non-zero. The task does not consume any + * CPU time while it is in the Blocked state. + * + * Where as xTaskNotifyWait() will return when a notification is pending, + * ulTaskNotifyTake() will return when the task's notification value is + * not zero. + * + * See http://www.FreeRTOS.org/RTOS-task-notifications.html for details. + * + * @param xClearCountOnExit if xClearCountOnExit is pdFALSE then the task's + * notification value is decremented when the function exits. In this way the + * notification value acts like a counting semaphore. If xClearCountOnExit is + * not pdFALSE then the task's notification value is cleared to zero when the + * function exits. In this way the notification value acts like a binary + * semaphore. + * + * @param xTicksToWait The maximum amount of time that the task should wait in + * the Blocked state for the task's notification value to be greater than zero, + * should the count not already be greater than zero when + * ulTaskNotifyTake() was called. The task will not consume any processing + * time while it is in the Blocked state. This is specified in kernel ticks, + * the macro pdMS_TO_TICSK( value_in_ms ) can be used to convert a time + * specified in milliseconds to a time specified in ticks. + * + * @return The task's notification count before it is either cleared to zero or + * decremented (see the xClearCountOnExit parameter). + * + * \defgroup ulTaskNotifyTake ulTaskNotifyTake + * \ingroup TaskNotifications */ -portBASE_TYPE xTaskCallApplicationTaskHook( xTaskHandle xTask, void *pvParameter ) PRIVILEGED_FUNCTION; +uint32_t ulTaskNotifyTake( BaseType_t xClearCountOnExit, TickType_t xTicksToWait ) PRIVILEGED_FUNCTION; /** - * xTaskGetIdleTaskHandle() is only available if - * INCLUDE_xTaskGetIdleTaskHandle is set to 1 in FreeRTOSConfig.h. + * task. h + *
BaseType_t xTaskNotifyStateClear( TaskHandle_t xTask );
* - * Simply returns the handle of the idle task. It is not valid to call - * xTaskGetIdleTaskHandle() before the scheduler has been started. + * If the notification state of the task referenced by the handle xTask is + * eNotified, then set the task's notification state to eNotWaitingNotification. + * The task's notification value is not altered. Set xTask to NULL to clear the + * notification state of the calling task. + * + * @return pdTRUE if the task's notification state was set to + * eNotWaitingNotification, otherwise pdFALSE. + * \defgroup xTaskNotifyStateClear xTaskNotifyStateClear + * \ingroup TaskNotifications */ -xTaskHandle xTaskGetIdleTaskHandle( void ); +BaseType_t xTaskNotifyStateClear( TaskHandle_t xTask ); /*----------------------------------------------------------- * SCHEDULER INTERNALS AVAILABLE FOR PORTING PURPOSES @@ -1210,9 +1840,14 @@ xTaskHandle xTaskGetIdleTaskHandle( void ); * 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. + * a ready list. If a non-zero value is returned then a context switch is + * required because either: + * + A task was removed from a blocked list because its timeout had expired, + * or + * + Time slicing is in use and there is a task of equal priority to the + * currently running task. */ -void vTaskIncrementTick( void ) PRIVILEGED_FUNCTION; +BaseType_t xTaskIncrementTick( void ) PRIVILEGED_FUNCTION; /* * THIS FUNCTION MUST NOT BE USED FROM APPLICATION CODE. IT IS AN @@ -1227,15 +1862,26 @@ void vTaskIncrementTick( void ) PRIVILEGED_FUNCTION; * there be no higher priority tasks waiting on the same event) or * the delay period expires. * + * The 'unordered' version replaces the event list item value with the + * xItemValue value, and inserts the list item at the end of the list. + * + * The 'ordered' version uses the existing event list item value (which is the + * owning tasks priority) to insert the list item into the event list is task + * priority order. + * * @param pxEventList The list containing tasks that are blocked waiting * for the event to occur. * + * @param xItemValue The item value to use for the event list item when the + * event list is not ordered by task priority. + * * @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 + * portTICK_PERIOD_MS can be used to convert kernel ticks into a real time * period. */ -void vTaskPlaceOnEventList( const xList * const pxEventList, portTickType xTicksToWait ) PRIVILEGED_FUNCTION; +void vTaskPlaceOnEventList( List_t * const pxEventList, const TickType_t xTicksToWait ) PRIVILEGED_FUNCTION; +void vTaskPlaceOnUnorderedEventList( List_t * pxEventList, const TickType_t xItemValue, const TickType_t xTicksToWait ) PRIVILEGED_FUNCTION; /* * THIS FUNCTION MUST NOT BE USED FROM APPLICATION CODE. IT IS AN @@ -1247,10 +1893,8 @@ void vTaskPlaceOnEventList( const xList * const pxEventList, portTickType xTicks * 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; +void vTaskPlaceOnEventListRestricted( List_t * const pxEventList, const TickType_t xTicksToWait, const BaseType_t xWaitIndefinitely ) PRIVILEGED_FUNCTION; /* * THIS FUNCTION MUST NOT BE USED FROM APPLICATION CODE. IT IS AN @@ -1261,13 +1905,23 @@ void vTaskPlaceOnEventListRestricted( const xList * const pxEventList, portTickT * 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. + * xTaskRemoveFromEventList()/xTaskRemoveFromUnorderedEventList() will be called + * if either an event occurs to unblock a task, or the block timeout period + * expires. + * + * xTaskRemoveFromEventList() is used when the event list is in task priority + * order. It removes the list item from the head of the event list as that will + * have the highest priority owning task of all the tasks on the event list. + * xTaskRemoveFromUnorderedEventList() is used when the event list is not + * ordered and the event list items hold something other than the owning tasks + * priority. In this case the event list item value is updated to the value + * passed in the xItemValue parameter. * * @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; +BaseType_t xTaskRemoveFromEventList( const List_t * const pxEventList ) PRIVILEGED_FUNCTION; +BaseType_t xTaskRemoveFromUnorderedEventList( ListItem_t * pxEventListItem, const TickType_t xItemValue ) PRIVILEGED_FUNCTION; /* * THIS FUNCTION MUST NOT BE USED FROM APPLICATION CODE. IT IS ONLY @@ -1279,21 +1933,27 @@ signed portBASE_TYPE xTaskRemoveFromEventList( const xList * const pxEventList ) */ void vTaskSwitchContext( void ) PRIVILEGED_FUNCTION; +/* + * THESE FUNCTIONS MUST NOT BE USED FROM APPLICATION CODE. THEY ARE USED BY + * THE EVENT BITS MODULE. + */ +TickType_t uxTaskResetEventItemValue( void ) PRIVILEGED_FUNCTION; + /* * Return the handle of the calling task. */ -xTaskHandle xTaskGetCurrentTaskHandle( void ) PRIVILEGED_FUNCTION; +TaskHandle_t xTaskGetCurrentTaskHandle( void ) PRIVILEGED_FUNCTION; /* * Capture the current time status for future reference. */ -void vTaskSetTimeOutState( xTimeOutType * const pxTimeOut ) PRIVILEGED_FUNCTION; +void vTaskSetTimeOutState( TimeOut_t * 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; +BaseType_t xTaskCheckForTimeOut( TimeOut_t * const pxTimeOut, TickType_t * const pxTicksToWait ) PRIVILEGED_FUNCTION; /* * Shortcut used by the queue implementation to prevent unnecessary call to @@ -1305,47 +1965,49 @@ void vTaskMissedYield( void ) PRIVILEGED_FUNCTION; * Returns the scheduler state as taskSCHEDULER_RUNNING, * taskSCHEDULER_NOT_STARTED or taskSCHEDULER_SUSPENDED. */ -portBASE_TYPE xTaskGetSchedulerState( void ) PRIVILEGED_FUNCTION; +BaseType_t 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; +void vTaskPriorityInherit( TaskHandle_t 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; +BaseType_t xTaskPriorityDisinherit( TaskHandle_t 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; +BaseType_t xTaskGenericCreate( TaskFunction_t pxTaskCode, const char * const pcName, const uint16_t usStackDepth, void * const pvParameters, UBaseType_t uxPriority, TaskHandle_t * const pxCreatedTask, StackType_t * const puxStackBuffer, const MemoryRegion_t * const xRegions ) PRIVILEGED_FUNCTION; /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ /* * Get the uxTCBNumber assigned to the task referenced by the xTask parameter. */ -unsigned portBASE_TYPE uxTaskGetTaskNumber( xTaskHandle xTask ); +UBaseType_t uxTaskGetTaskNumber( TaskHandle_t xTask ) PRIVILEGED_FUNCTION; /* - * Set the uxTCBNumber of the task referenced by the xTask parameter to - * ucHandle. + * Set the uxTaskNumber of the task referenced by the xTask parameter to + * uxHandle. */ -void vTaskSetTaskNumber( xTaskHandle xTask, unsigned portBASE_TYPE uxHandle ); +void vTaskSetTaskNumber( TaskHandle_t xTask, const UBaseType_t uxHandle ) PRIVILEGED_FUNCTION; /* + * Only available when configUSE_TICKLESS_IDLE is set to 1. * If tickless mode is being used, or a low power mode is implemented, then * the tick interrupt will not execute during idle periods. When this is the * case, the tick count value maintained by the scheduler needs to be kept up - * to date with the actual execution time by being skipped forward by the by - * a time equal to the idle period. + * to date with the actual execution time by being skipped forward by a time + * equal to the idle period. */ -void vTaskStepTick( portTickType xTicksToJump ); +void vTaskStepTick( const TickType_t xTicksToJump ) PRIVILEGED_FUNCTION; /* + * Only avilable when configUSE_TICKLESS_IDLE is set to 1. * Provided for use within portSUPPRESS_TICKS_AND_SLEEP() to allow the port * specific sleep function to determine if it is ok to proceed with the sleep, * and if it is ok to proceed, if it is ok to sleep indefinitely. @@ -1358,12 +2020,18 @@ void vTaskStepTick( portTickType xTicksToJump ); * critical section between the timer being stopped and the sleep mode being * entered to ensure it is ok to proceed into the sleep mode. */ -eSleepModeStatus eTaskConfirmSleepModeStatus( void ); +eSleepModeStatus eTaskConfirmSleepModeStatus( void ) PRIVILEGED_FUNCTION; + +/* + * For internal use only. Increment the mutex held count when a mutex is + * taken and return the handle of the task that has taken the mutex. + */ +void *pvTaskIncrementMutexHeldCount( void ) PRIVILEGED_FUNCTION; #ifdef __cplusplus } #endif -#endif /* TASK_H */ +#endif /* INC_TASK_H */ diff --git a/lib/FreeRTOS/include/timers.h b/lib/FreeRTOS/include/timers.h index b8bd73e593..3c6c6bf308 100644 --- a/lib/FreeRTOS/include/timers.h +++ b/lib/FreeRTOS/include/timers.h @@ -1,75 +1,70 @@ /* - FreeRTOS V7.4.0 - Copyright (C) 2013 Real Time Engineers Ltd. - - FEATURES AND PORTS ARE ADDED TO FREERTOS ALL THE TIME. PLEASE VISIT - http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. - - *************************************************************************** - * * - * 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! * - * * - *************************************************************************** + FreeRTOS V8.2.3 - Copyright (C) 2015 Real Time Engineers Ltd. + All rights reserved + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. This file is part of the FreeRTOS distribution. FreeRTOS is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License (version 2) as published by the - Free Software Foundation AND MODIFIED BY the FreeRTOS exception. + 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. + *************************************************************************** + >>! 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 itcan be - viewed here: http://www.freertos.org/a00114.html and also obtained by - writing to Real Time Engineers Ltd., contact details for whom are available - on the FreeRTOS WEB site. - - 1 tab == 4 spaces! + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html *************************************************************************** * * - * Having a problem? Start by reading the FAQ "My application does * - * not run, what could be wrong?" * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * * * - * http://www.FreeRTOS.org/FAQHelp.html * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * * * *************************************************************************** + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? - http://www.FreeRTOS.org - Documentation, books, training, latest versions, - license and Real Time Engineers Ltd. contact details. + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, - including FreeRTOS+Trace - an indispensable productivity tool, and our new - fully thread aware and reentrant UDP/IP stack. - - http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High - Integrity Systems, who sell the code with commercial support, - indemnification and middleware, under the OpenRTOS brand. - - http://www.SafeRTOS.com - High Integrity Systems also provide a safety - engineered and independently SIL3 certified version for use in safety and + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and mission critical applications that require provable dependability. + + 1 tab == 4 spaces! */ @@ -80,43 +75,65 @@ #error "include FreeRTOS.h must appear in source files before include timers.h" #endif -#include "portable.h" -#include "list.h" +/*lint -e537 This headers are only multiply included if the application code +happens to also be including task.h. */ #include "task.h" +/*lint +e537 */ #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 *----------------------------------------------------------*/ - /** +/* 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. The commands that are sent from interrupts must use the +highest numbers as tmrFIRST_FROM_ISR_COMMAND is used to determine if the task +or interrupt version of the queue send function should be used. */ +#define tmrCOMMAND_EXECUTE_CALLBACK_FROM_ISR ( ( BaseType_t ) -2 ) +#define tmrCOMMAND_EXECUTE_CALLBACK ( ( BaseType_t ) -1 ) +#define tmrCOMMAND_START_DONT_TRACE ( ( BaseType_t ) 0 ) +#define tmrCOMMAND_START ( ( BaseType_t ) 1 ) +#define tmrCOMMAND_RESET ( ( BaseType_t ) 2 ) +#define tmrCOMMAND_STOP ( ( BaseType_t ) 3 ) +#define tmrCOMMAND_CHANGE_PERIOD ( ( BaseType_t ) 4 ) +#define tmrCOMMAND_DELETE ( ( BaseType_t ) 5 ) + +#define tmrFIRST_FROM_ISR_COMMAND ( ( BaseType_t ) 6 ) +#define tmrCOMMAND_START_FROM_ISR ( ( BaseType_t ) 6 ) +#define tmrCOMMAND_RESET_FROM_ISR ( ( BaseType_t ) 7 ) +#define tmrCOMMAND_STOP_FROM_ISR ( ( BaseType_t ) 8 ) +#define tmrCOMMAND_CHANGE_PERIOD_FROM_ISR ( ( BaseType_t ) 9 ) + + +/** * Type by which software timers are referenced. For example, a call to - * xTimerCreate() returns an xTimerHandle variable that can then be used to + * xTimerCreate() returns an TimerHandle_t 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; +typedef void * TimerHandle_t; + +/* + * Defines the prototype to which timer callback functions must conform. + */ +typedef void (*TimerCallbackFunction_t)( TimerHandle_t xTimer ); -/* Define the prototype to which timer callback functions must conform. */ -typedef void (*tmrTIMER_CALLBACK)( xTimerHandle xTimer ); +/* + * Defines the prototype to which functions used with the + * xTimerPendFunctionCallFromISR() function must conform. + */ +typedef void (*PendedFunction_t)( void *, uint32_t ); /** - * xTimerHandle xTimerCreate( const signed char *pcTimerName, - * portTickType xTimerPeriodInTicks, - * unsigned portBASE_TYPE uxAutoReload, + * TimerHandle_t xTimerCreate( const char * const pcTimerName, + * TickType_t xTimerPeriodInTicks, + * UBaseType_t uxAutoReload, * void * pvTimerID, - * tmrTIMER_CALLBACK pxCallbackFunction ); + * TimerCallbackFunction_t 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 @@ -124,23 +141,24 @@ typedef void (*tmrTIMER_CALLBACK)( xTimerHandle xTimer ); * * 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. + * 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. + * purely to assist debugging. The kernel itself only ever references a timer + * by its handle, and never by its name. * - * @param xTimerPeriodInTicks The timer period. The time is defined in tick periods so - * the constant portTICK_RATE_MS can be used to convert a time that has been - * specified in milliseconds. For example, if the timer must expire after 100 - * ticks, then xTimerPeriodInTicks should be set to 100. Alternatively, if the timer - * must expire after 500ms, then xPeriod can be set to ( 500 / portTICK_RATE_MS ) - * provided configTICK_RATE_HZ is less than or equal to 1000. + * @param xTimerPeriodInTicks The timer period. The time is defined in tick + * periods so the constant portTICK_PERIOD_MS can be used to convert a time that + * has been specified in milliseconds. For example, if the timer must expire + * after 100 ticks, then xTimerPeriodInTicks should be set to 100. + * Alternatively, if the timer must expire after 500ms, then xPeriod can be set + * to ( 500 / portTICK_PERIOD_MS ) provided configTICK_RATE_HZ is less than or + * equal to 1000. * * @param uxAutoReload If uxAutoReload is set to pdTRUE then the timer will - * expire repeatedly with a frequency set by the xTimerPeriodInTicks parameter. If - * uxAutoReload is set to pdFALSE then the timer will be a one-shot timer and + * expire repeatedly with a frequency set by the xTimerPeriodInTicks parameter. + * If uxAutoReload is set to pdFALSE then the timer will be a one-shot timer and * enter the dormant state after it expires. * * @param pvTimerID An identifier that is assigned to the timer being created. @@ -149,38 +167,38 @@ typedef void (*tmrTIMER_CALLBACK)( xTimerHandle xTimer ); * timer. * * @param pxCallbackFunction The function to call when the timer expires. - * Callback functions must have the prototype defined by tmrTIMER_CALLBACK, - * which is "void vCallbackFunction( xTimerHandle xTimer );". + * Callback functions must have the prototype defined by TimerCallbackFunction_t, + * which is "void vCallbackFunction( TimerHandle_t xTimer );". * - * @return If the timer is successfully create then a handle to the newly + * @return If the timer is successfully created then a handle to the newly * created timer is returned. If the timer cannot be created (because either * there is insufficient FreeRTOS heap remaining to allocate the timer - * structures, or the timer period was set to 0) then 0 is returned. + * structures, or the timer period was set to 0) then NULL is returned. * * Example usage: - * + * @verbatim * #define NUM_TIMERS 5 * * // An array to hold handles to the created timers. - * xTimerHandle xTimers[ NUM_TIMERS ]; + * TimerHandle_t xTimers[ NUM_TIMERS ]; * * // An array to hold a count of the number of times each timer expires. - * long lExpireCounters[ NUM_TIMERS ] = { 0 }; + * int32_t lExpireCounters[ NUM_TIMERS ] = { 0 }; * * // Define a callback function that will be used by multiple timer instances. * // The callback function does nothing but count the number of times the * // associated timer expires, and stop the timer once the timer has expired * // 10 times. - * void vTimerCallback( xTimerHandle pxTimer ) + * void vTimerCallback( TimerHandle_t pxTimer ) * { - * long lArrayIndex; - * const long xMaxExpiryCountBeforeStopping = 10; + * int32_t lArrayIndex; + * const int32_t xMaxExpiryCountBeforeStopping = 10; * * // Optionally do something if the pxTimer parameter is NULL. * configASSERT( pxTimer ); - * + * * // Which timer expired? - * lArrayIndex = ( long ) pvTimerGetTimerID( pxTimer ); + * lArrayIndex = ( int32_t ) pvTimerGetTimerID( pxTimer ); * * // Increment the number of times that pxTimer has expired. * lExpireCounters[ lArrayIndex ] += 1; @@ -196,18 +214,18 @@ typedef void (*tmrTIMER_CALLBACK)( xTimerHandle xTimer ); * * void main( void ) * { - * long x; + * int32_t 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. + * 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 ) @@ -237,20 +255,21 @@ typedef void (*tmrTIMER_CALLBACK)( xTimerHandle xTimer ); * // Should not reach here. * for( ;; ); * } + * @endverbatim */ -xTimerHandle xTimerCreate( const signed char * const pcTimerName, portTickType xTimerPeriodInTicks, unsigned portBASE_TYPE uxAutoReload, void * pvTimerID, tmrTIMER_CALLBACK pxCallbackFunction ) PRIVILEGED_FUNCTION; +TimerHandle_t xTimerCreate( const char * const pcTimerName, const TickType_t xTimerPeriodInTicks, const UBaseType_t uxAutoReload, void * const pvTimerID, TimerCallbackFunction_t pxCallbackFunction ) PRIVILEGED_FUNCTION; /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ /** - * void *pvTimerGetTimerID( xTimerHandle xTimer ); + * void *pvTimerGetTimerID( TimerHandle_t 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. + * xTimerCreated() that was used to create the timer, and by calling the + * vTimerSetTimerID() API function. * * 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. + * ID can be used as time specific (timer local) storage. * * @param xTimer The timer being queried. * @@ -260,16 +279,37 @@ xTimerHandle xTimerCreate( const signed char * const pcTimerName, portTickType x * * See the xTimerCreate() API function example usage scenario. */ -void *pvTimerGetTimerID( xTimerHandle xTimer ) PRIVILEGED_FUNCTION; +void *pvTimerGetTimerID( const TimerHandle_t xTimer ) PRIVILEGED_FUNCTION; /** - * portBASE_TYPE xTimerIsTimerActive( xTimerHandle xTimer ); + * void vTimerSetTimerID( TimerHandle_t xTimer, void *pvNewID ); + * + * Sets 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 as time specific (timer local) storage. + * + * @param xTimer The timer being updated. + * + * @param pvNewID The ID to assign to the timer. + * + * Example usage: + * + * See the xTimerCreate() API function example usage scenario. + */ +void vTimerSetTimerID( TimerHandle_t xTimer, void *pvNewID ) PRIVILEGED_FUNCTION; + +/** + * BaseType_t xTimerIsTimerActive( TimerHandle_t 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. + * 2) It is an expired one-shot timer that has not been restarted. * * Timers are created in the dormant state. The xTimerStart(), xTimerReset(), * xTimerStartFromISR(), xTimerResetFromISR(), xTimerChangePeriod() and @@ -282,9 +322,9 @@ void *pvTimerGetTimerID( xTimerHandle xTimer ) PRIVILEGED_FUNCTION; * pdFALSE will be returned if the timer is active. * * Example usage: - * + * @verbatim * // This function assumes xTimer has already been created. - * void vAFunction( xTimerHandle xTimer ) + * void vAFunction( TimerHandle_t xTimer ) * { * if( xTimerIsTimerActive( xTimer ) != pdFALSE ) // or more simply and equivalently "if( xTimerIsTimerActive( xTimer ) )" * { @@ -295,24 +335,27 @@ void *pvTimerGetTimerID( xTimerHandle xTimer ) PRIVILEGED_FUNCTION; * // xTimer is not active, do something else. * } * } + * @endverbatim */ -portBASE_TYPE xTimerIsTimerActive( xTimerHandle xTimer ) PRIVILEGED_FUNCTION; +BaseType_t xTimerIsTimerActive( TimerHandle_t xTimer ) PRIVILEGED_FUNCTION; /** - * xTimerGetTimerDaemonTaskHandle() is only available if + * TaskHandle_t xTimerGetTimerDaemonTaskHandle( void ); + * + * xTimerGetTimerDaemonTaskHandle() is only available if * INCLUDE_xTimerGetTimerDaemonTaskHandle is set to 1 in FreeRTOSConfig.h. * * Simply returns the handle of the timer service/daemon task. It it not valid * to call xTimerGetTimerDaemonTaskHandle() before the scheduler has been started. */ -xTaskHandle xTimerGetTimerDaemonTaskHandle( void ); +TaskHandle_t xTimerGetTimerDaemonTaskHandle( void ) PRIVILEGED_FUNCTION; /** - * portBASE_TYPE xTimerStart( xTimerHandle xTimer, portTickType xBlockTime ); + * BaseType_t xTimerStart( TimerHandle_t xTimer, TickType_t xTicksToWait ); * * 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 + * through 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. @@ -337,14 +380,14 @@ xTaskHandle xTimerGetTimerDaemonTaskHandle( void ); * * @param xTimer The handle of the timer being started/restarted. * - * @param xBlockTime Specifies the time, in ticks, that the calling task should + * @param xTicksToWait 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 + * xTimerStart() was called. xTicksToWait 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 + * the timer command queue even after xTicksToWait 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 @@ -357,14 +400,14 @@ xTaskHandle xTimerGetTimerDaemonTaskHandle( void ); * See the xTimerCreate() API function example usage scenario. * */ -#define xTimerStart( xTimer, xBlockTime ) xTimerGenericCommand( ( xTimer ), tmrCOMMAND_START, ( xTaskGetTickCount() ), NULL, ( xBlockTime ) ) +#define xTimerStart( xTimer, xTicksToWait ) xTimerGenericCommand( ( xTimer ), tmrCOMMAND_START, ( xTaskGetTickCount() ), NULL, ( xTicksToWait ) ) /** - * portBASE_TYPE xTimerStop( xTimerHandle xTimer, portTickType xBlockTime ); + * BaseType_t xTimerStop( TimerHandle_t xTimer, TickType_t xTicksToWait ); * * 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 + * through 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. @@ -380,14 +423,14 @@ xTaskHandle xTimerGetTimerDaemonTaskHandle( void ); * * @param xTimer The handle of the timer being stopped. * - * @param xBlockTime Specifies the time, in ticks, that the calling task should + * @param xTicksToWait 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 + * xTimerStop() was called. xTicksToWait 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 + * the timer command queue even after xTicksToWait 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 @@ -399,16 +442,16 @@ xTaskHandle xTimerGetTimerDaemonTaskHandle( void ); * See the xTimerCreate() API function example usage scenario. * */ -#define xTimerStop( xTimer, xBlockTime ) xTimerGenericCommand( ( xTimer ), tmrCOMMAND_STOP, 0U, NULL, ( xBlockTime ) ) +#define xTimerStop( xTimer, xTicksToWait ) xTimerGenericCommand( ( xTimer ), tmrCOMMAND_STOP, 0U, NULL, ( xTicksToWait ) ) /** - * portBASE_TYPE xTimerChangePeriod( xTimerHandle xTimer, - * portTickType xNewPeriod, - * portTickType xBlockTime ); + * BaseType_t xTimerChangePeriod( TimerHandle_t xTimer, + * TickType_t xNewPeriod, + * TickType_t xTicksToWait ); * * 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 + * through 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. @@ -425,21 +468,21 @@ xTaskHandle xTimerGetTimerDaemonTaskHandle( void ); * @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 + * tick periods, so the constant portTICK_PERIOD_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 + * ( 500 / portTICK_PERIOD_MS ) provided configTICK_RATE_HZ is less than * or equal to 1000. * - * @param xBlockTime Specifies the time, in ticks, that the calling task should + * @param xTicksToWait 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 + * full when xTimerChangePeriod() was called. xTicksToWait 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. + * sent to the timer command queue even after xTicksToWait 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 @@ -447,13 +490,13 @@ xTaskHandle xTimerGetTimerDaemonTaskHandle( void ); * configTIMER_TASK_PRIORITY configuration constant. * * Example usage: - * + * @verbatim * // This function assumes xTimer has already been created. If the timer * // referenced by xTimer is already active when it is called, then the timer * // is deleted. If the timer referenced by xTimer is not active when it is * // called, then the period of the timer is set to 500ms and the timer is * // started. - * void vAFunction( xTimerHandle xTimer ) + * void vAFunction( TimerHandle_t xTimer ) * { * if( xTimerIsTimerActive( xTimer ) != pdFALSE ) // or more simply and equivalently "if( xTimerIsTimerActive( xTimer ) )" * { @@ -466,7 +509,7 @@ xTaskHandle xTimerGetTimerDaemonTaskHandle( void ); * // 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 ) + * if( xTimerChangePeriod( xTimer, 500 / portTICK_PERIOD_MS, 100 ) == pdPASS ) * { * // The command was successfully sent. * } @@ -477,15 +520,16 @@ xTaskHandle xTimerGetTimerDaemonTaskHandle( void ); * } * } * } + * @endverbatim */ - #define xTimerChangePeriod( xTimer, xNewPeriod, xBlockTime ) xTimerGenericCommand( ( xTimer ), tmrCOMMAND_CHANGE_PERIOD, ( xNewPeriod ), NULL, ( xBlockTime ) ) + #define xTimerChangePeriod( xTimer, xNewPeriod, xTicksToWait ) xTimerGenericCommand( ( xTimer ), tmrCOMMAND_CHANGE_PERIOD, ( xNewPeriod ), NULL, ( xTicksToWait ) ) /** - * portBASE_TYPE xTimerDelete( xTimerHandle xTimer, portTickType xBlockTime ); + * BaseType_t xTimerDelete( TimerHandle_t xTimer, TickType_t xTicksToWait ); * * 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 + * through 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. @@ -498,14 +542,14 @@ xTaskHandle xTimerGetTimerDaemonTaskHandle( void ); * * @param xTimer The handle of the timer being deleted. * - * @param xBlockTime Specifies the time, in ticks, that the calling task should + * @param xTicksToWait 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() + * full when xTimerDelete() was called. xTicksToWait 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 + * the timer command queue even after xTicksToWait 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 @@ -516,14 +560,14 @@ xTaskHandle xTimerGetTimerDaemonTaskHandle( void ); * * See the xTimerChangePeriod() API function example usage scenario. */ -#define xTimerDelete( xTimer, xBlockTime ) xTimerGenericCommand( ( xTimer ), tmrCOMMAND_DELETE, 0U, NULL, ( xBlockTime ) ) +#define xTimerDelete( xTimer, xTicksToWait ) xTimerGenericCommand( ( xTimer ), tmrCOMMAND_DELETE, 0U, NULL, ( xTicksToWait ) ) /** - * portBASE_TYPE xTimerReset( xTimerHandle xTimer, portTickType xBlockTime ); + * BaseType_t xTimerReset( TimerHandle_t xTimer, TickType_t xTicksToWait ); * * 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 + * through 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. @@ -550,14 +594,14 @@ xTaskHandle xTimerGetTimerDaemonTaskHandle( void ); * * @param xTimer The handle of the timer being reset/started/restarted. * - * @param xBlockTime Specifies the time, in ticks, that the calling task should + * @param xTicksToWait 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 + * xTimerReset() was called. xTicksToWait 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 + * the timer command queue even after xTicksToWait 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 @@ -566,16 +610,16 @@ xTaskHandle xTimerGetTimerDaemonTaskHandle( void ); * configuration constant. * * Example usage: - * + * @verbatim * // When a key is pressed, an LCD back-light is switched on. If 5 seconds pass * // without a key being pressed, then the LCD back-light is switched off. In * // this case, the timer is a one-shot timer. * - * xTimerHandle xBacklightTimer = NULL; + * TimerHandle_t xBacklightTimer = NULL; * * // The callback function assigned to the one-shot timer. In this case the * // parameter is not used. - * void vBacklightTimerCallback( xTimerHandle pxTimer ) + * void vBacklightTimerCallback( TimerHandle_t pxTimer ) * { * // The timer expired, therefore 5 seconds must have passed since a key * // was pressed. Switch off the LCD back-light. @@ -601,12 +645,12 @@ xTaskHandle xTimerGetTimerDaemonTaskHandle( void ); * * void main( void ) * { - * long x; + * int32_t 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. + * ( 5000 / portTICK_PERIOD_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. @@ -638,12 +682,13 @@ xTaskHandle xTimerGetTimerDaemonTaskHandle( void ); * // Should not reach here. * for( ;; ); * } + * @endverbatim */ -#define xTimerReset( xTimer, xBlockTime ) xTimerGenericCommand( ( xTimer ), tmrCOMMAND_START, ( xTaskGetTickCount() ), NULL, ( xBlockTime ) ) +#define xTimerReset( xTimer, xTicksToWait ) xTimerGenericCommand( ( xTimer ), tmrCOMMAND_RESET, ( xTaskGetTickCount() ), NULL, ( xTicksToWait ) ) /** - * portBASE_TYPE xTimerStartFromISR( xTimerHandle xTimer, - * portBASE_TYPE *pxHigherPriorityTaskWoken ); + * BaseType_t xTimerStartFromISR( TimerHandle_t xTimer, + * BaseType_t *pxHigherPriorityTaskWoken ); * * A version of xTimerStart() that can be called from an interrupt service * routine. @@ -667,11 +712,12 @@ xTaskHandle xTimerGetTimerDaemonTaskHandle( void ); * 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. + * relative to when xTimerStartFromISR() is actually called. The timer + * service/daemon task priority is set by the configTIMER_TASK_PRIORITY + * configuration constant. * * Example usage: - * + * @verbatim * // This scenario assumes xBacklightTimer has already been created. When a * // key is pressed, an LCD back-light is switched on. If 5 seconds pass * // without a key being pressed, then the LCD back-light is switched off. In @@ -681,7 +727,7 @@ xTaskHandle xTimerGetTimerDaemonTaskHandle( void ); * * // The callback function assigned to the one-shot timer. In this case the * // parameter is not used. - * void vBacklightTimerCallback( xTimerHandle pxTimer ) + * void vBacklightTimerCallback( TimerHandle_t pxTimer ) * { * // The timer expired, therefore 5 seconds must have passed since a key * // was pressed. Switch off the LCD back-light. @@ -691,7 +737,7 @@ xTaskHandle xTimerGetTimerDaemonTaskHandle( void ); * // The key press interrupt service routine. * void vKeyPressEventInterruptHandler( void ) * { - * portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE; + * BaseType_t 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 @@ -719,15 +765,16 @@ xTaskHandle xTimerGetTimerDaemonTaskHandle( void ); * if( xHigherPriorityTaskWoken != pdFALSE ) * { * // Call the interrupt safe yield function here (actual function - * // depends on the FreeRTOS port being used. + * // depends on the FreeRTOS port being used). * } * } + * @endverbatim */ -#define xTimerStartFromISR( xTimer, pxHigherPriorityTaskWoken ) xTimerGenericCommand( ( xTimer ), tmrCOMMAND_START, ( xTaskGetTickCountFromISR() ), ( pxHigherPriorityTaskWoken ), 0U ) +#define xTimerStartFromISR( xTimer, pxHigherPriorityTaskWoken ) xTimerGenericCommand( ( xTimer ), tmrCOMMAND_START_FROM_ISR, ( xTaskGetTickCountFromISR() ), ( pxHigherPriorityTaskWoken ), 0U ) /** - * portBASE_TYPE xTimerStopFromISR( xTimerHandle xTimer, - * portBASE_TYPE *pxHigherPriorityTaskWoken ); + * BaseType_t xTimerStopFromISR( TimerHandle_t xTimer, + * BaseType_t *pxHigherPriorityTaskWoken ); * * A version of xTimerStop() that can be called from an interrupt service * routine. @@ -754,14 +801,14 @@ xTaskHandle xTimerGetTimerDaemonTaskHandle( void ); * priority is set by the configTIMER_TASK_PRIORITY configuration constant. * * Example usage: - * + * @verbatim * // This scenario assumes xTimer has already been created and started. When * // an interrupt occurs, the timer should be simply stopped. * * // The interrupt service routine that stops the timer. * void vAnExampleInterruptServiceRoutine( void ) * { - * portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE; + * BaseType_t xHigherPriorityTaskWoken = pdFALSE; * * // The interrupt has occurred - simply stop the timer. * // xHigherPriorityTaskWoken was set to pdFALSE where it was defined @@ -781,16 +828,17 @@ xTaskHandle xTimerGetTimerDaemonTaskHandle( void ); * if( xHigherPriorityTaskWoken != pdFALSE ) * { * // Call the interrupt safe yield function here (actual function - * // depends on the FreeRTOS port being used. + * // depends on the FreeRTOS port being used). * } * } + * @endverbatim */ -#define xTimerStopFromISR( xTimer, pxHigherPriorityTaskWoken ) xTimerGenericCommand( ( xTimer ), tmrCOMMAND_STOP, 0, ( pxHigherPriorityTaskWoken ), 0U ) +#define xTimerStopFromISR( xTimer, pxHigherPriorityTaskWoken ) xTimerGenericCommand( ( xTimer ), tmrCOMMAND_STOP_FROM_ISR, 0, ( pxHigherPriorityTaskWoken ), 0U ) /** - * portBASE_TYPE xTimerChangePeriodFromISR( xTimerHandle xTimer, - * portTickType xNewPeriod, - * portBASE_TYPE *pxHigherPriorityTaskWoken ); + * BaseType_t xTimerChangePeriodFromISR( TimerHandle_t xTimer, + * TickType_t xNewPeriod, + * BaseType_t *pxHigherPriorityTaskWoken ); * * A version of xTimerChangePeriod() that can be called from an interrupt * service routine. @@ -798,11 +846,11 @@ xTaskHandle xTimerGetTimerDaemonTaskHandle( void ); * @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 + * tick periods, so the constant portTICK_PERIOD_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 + * ( 500 / portTICK_PERIOD_MS ) provided configTICK_RATE_HZ is less than * or equal to 1000. * * @param pxHigherPriorityTaskWoken The timer service/daemon task spends most @@ -826,14 +874,14 @@ xTaskHandle xTimerGetTimerDaemonTaskHandle( void ); * priority is set by the configTIMER_TASK_PRIORITY configuration constant. * * Example usage: - * + * @verbatim * // This scenario assumes xTimer has already been created and started. When * // an interrupt occurs, the period of xTimer should be changed to 500ms. * * // The interrupt service routine that changes the period of xTimer. * void vAnExampleInterruptServiceRoutine( void ) * { - * portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE; + * BaseType_t xHigherPriorityTaskWoken = pdFALSE; * * // The interrupt has occurred - change the period of xTimer to 500ms. * // xHigherPriorityTaskWoken was set to pdFALSE where it was defined @@ -853,15 +901,16 @@ xTaskHandle xTimerGetTimerDaemonTaskHandle( void ); * if( xHigherPriorityTaskWoken != pdFALSE ) * { * // Call the interrupt safe yield function here (actual function - * // depends on the FreeRTOS port being used. + * // depends on the FreeRTOS port being used). * } * } + * @endverbatim */ -#define xTimerChangePeriodFromISR( xTimer, xNewPeriod, pxHigherPriorityTaskWoken ) xTimerGenericCommand( ( xTimer ), tmrCOMMAND_CHANGE_PERIOD, ( xNewPeriod ), ( pxHigherPriorityTaskWoken ), 0U ) +#define xTimerChangePeriodFromISR( xTimer, xNewPeriod, pxHigherPriorityTaskWoken ) xTimerGenericCommand( ( xTimer ), tmrCOMMAND_CHANGE_PERIOD_FROM_ISR, ( xNewPeriod ), ( pxHigherPriorityTaskWoken ), 0U ) /** - * portBASE_TYPE xTimerResetFromISR( xTimerHandle xTimer, - * portBASE_TYPE *pxHigherPriorityTaskWoken ); + * BaseType_t xTimerResetFromISR( TimerHandle_t xTimer, + * BaseType_t *pxHigherPriorityTaskWoken ); * * A version of xTimerReset() that can be called from an interrupt service * routine. @@ -890,7 +939,7 @@ xTaskHandle xTimerGetTimerDaemonTaskHandle( void ); * task priority is set by the configTIMER_TASK_PRIORITY configuration constant. * * Example usage: - * + * @verbatim * // This scenario assumes xBacklightTimer has already been created. When a * // key is pressed, an LCD back-light is switched on. If 5 seconds pass * // without a key being pressed, then the LCD back-light is switched off. In @@ -900,7 +949,7 @@ xTaskHandle xTimerGetTimerDaemonTaskHandle( void ); * * // The callback function assigned to the one-shot timer. In this case the * // parameter is not used. - * void vBacklightTimerCallback( xTimerHandle pxTimer ) + * void vBacklightTimerCallback( TimerHandle_t pxTimer ) * { * // The timer expired, therefore 5 seconds must have passed since a key * // was pressed. Switch off the LCD back-light. @@ -910,7 +959,7 @@ xTaskHandle xTimerGetTimerDaemonTaskHandle( void ); * // The key press interrupt service routine. * void vKeyPressEventInterruptHandler( void ) * { - * portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE; + * BaseType_t 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 @@ -938,18 +987,155 @@ xTaskHandle xTimerGetTimerDaemonTaskHandle( void ); * if( xHigherPriorityTaskWoken != pdFALSE ) * { * // Call the interrupt safe yield function here (actual function - * // depends on the FreeRTOS port being used. + * // depends on the FreeRTOS port being used). * } * } + * @endverbatim + */ +#define xTimerResetFromISR( xTimer, pxHigherPriorityTaskWoken ) xTimerGenericCommand( ( xTimer ), tmrCOMMAND_RESET_FROM_ISR, ( xTaskGetTickCountFromISR() ), ( pxHigherPriorityTaskWoken ), 0U ) + + +/** + * BaseType_t xTimerPendFunctionCallFromISR( PendedFunction_t xFunctionToPend, + * void *pvParameter1, + * uint32_t ulParameter2, + * BaseType_t *pxHigherPriorityTaskWoken ); + * + * + * Used from application interrupt service routines to defer the execution of a + * function to the RTOS daemon task (the timer service task, hence this function + * is implemented in timers.c and is prefixed with 'Timer'). + * + * Ideally an interrupt service routine (ISR) is kept as short as possible, but + * sometimes an ISR either has a lot of processing to do, or needs to perform + * processing that is not deterministic. In these cases + * xTimerPendFunctionCallFromISR() can be used to defer processing of a function + * to the RTOS daemon task. + * + * A mechanism is provided that allows the interrupt to return directly to the + * task that will subsequently execute the pended callback function. This + * allows the callback function to execute contiguously in time with the + * interrupt - just as if the callback had executed in the interrupt itself. + * + * @param xFunctionToPend The function to execute from the timer service/ + * daemon task. The function must conform to the PendedFunction_t + * prototype. + * + * @param pvParameter1 The value of the callback function's first parameter. + * The parameter has a void * type to allow it to be used to pass any type. + * For example, unsigned longs can be cast to a void *, or the void * can be + * used to point to a structure. + * + * @param ulParameter2 The value of the callback function's second parameter. + * + * @param pxHigherPriorityTaskWoken As mentioned above, calling this function + * will result in a message being sent to the timer daemon task. If the + * priority of the timer daemon task (which is set using + * configTIMER_TASK_PRIORITY in FreeRTOSConfig.h) is higher than the priority of + * the currently running task (the task the interrupt interrupted) then + * *pxHigherPriorityTaskWoken will be set to pdTRUE within + * xTimerPendFunctionCallFromISR(), indicating that a context switch should be + * requested before the interrupt exits. For that reason + * *pxHigherPriorityTaskWoken must be initialised to pdFALSE. See the + * example code below. + * + * @return pdPASS is returned if the message was successfully sent to the + * timer daemon task, otherwise pdFALSE is returned. + * + * Example usage: + * @verbatim + * + * // The callback function that will execute in the context of the daemon task. + * // Note callback functions must all use this same prototype. + * void vProcessInterface( void *pvParameter1, uint32_t ulParameter2 ) + * { + * BaseType_t xInterfaceToService; + * + * // The interface that requires servicing is passed in the second + * // parameter. The first parameter is not used in this case. + * xInterfaceToService = ( BaseType_t ) ulParameter2; + * + * // ...Perform the processing here... + * } + * + * // An ISR that receives data packets from multiple interfaces + * void vAnISR( void ) + * { + * BaseType_t xInterfaceToService, xHigherPriorityTaskWoken; + * + * // Query the hardware to determine which interface needs processing. + * xInterfaceToService = prvCheckInterfaces(); + * + * // The actual processing is to be deferred to a task. Request the + * // vProcessInterface() callback function is executed, passing in the + * // number of the interface that needs processing. The interface to + * // service is passed in the second parameter. The first parameter is + * // not used in this case. + * xHigherPriorityTaskWoken = pdFALSE; + * xTimerPendFunctionCallFromISR( vProcessInterface, NULL, ( uint32_t ) xInterfaceToService, &xHigherPriorityTaskWoken ); + * + * // If xHigherPriorityTaskWoken is now set to pdTRUE then a context + * // switch should be requested. The macro used is port specific and will + * // be either portYIELD_FROM_ISR() or portEND_SWITCHING_ISR() - refer to + * // the documentation page for the port being used. + * portYIELD_FROM_ISR( xHigherPriorityTaskWoken ); + * + * } + * @endverbatim + */ +BaseType_t xTimerPendFunctionCallFromISR( PendedFunction_t xFunctionToPend, void *pvParameter1, uint32_t ulParameter2, BaseType_t *pxHigherPriorityTaskWoken ) PRIVILEGED_FUNCTION; + + /** + * BaseType_t xTimerPendFunctionCall( PendedFunction_t xFunctionToPend, + * void *pvParameter1, + * uint32_t ulParameter2, + * TickType_t xTicksToWait ); + * + * + * Used to defer the execution of a function to the RTOS daemon task (the timer + * service task, hence this function is implemented in timers.c and is prefixed + * with 'Timer'). + * + * @param xFunctionToPend The function to execute from the timer service/ + * daemon task. The function must conform to the PendedFunction_t + * prototype. + * + * @param pvParameter1 The value of the callback function's first parameter. + * The parameter has a void * type to allow it to be used to pass any type. + * For example, unsigned longs can be cast to a void *, or the void * can be + * used to point to a structure. + * + * @param ulParameter2 The value of the callback function's second parameter. + * + * @param xTicksToWait Calling this function will result in a message being + * sent to the timer daemon task on a queue. xTicksToWait is the amount of + * time the calling task should remain in the Blocked state (so not using any + * processing time) for space to become available on the timer queue if the + * queue is found to be full. + * + * @return pdPASS is returned if the message was successfully sent to the + * timer daemon task, otherwise pdFALSE is returned. + * + */ +BaseType_t xTimerPendFunctionCall( PendedFunction_t xFunctionToPend, void *pvParameter1, uint32_t ulParameter2, TickType_t xTicksToWait ) PRIVILEGED_FUNCTION; + +/** + * const char * const pcTimerGetTimerName( TimerHandle_t xTimer ); + * + * Returns the name that was assigned to a timer when the timer was created. + * + * @param xTimer The handle of the timer being queried. + * + * @return The name assigned to the timer specified by the xTimer parameter. */ -#define xTimerResetFromISR( xTimer, pxHigherPriorityTaskWoken ) xTimerGenericCommand( ( xTimer ), tmrCOMMAND_START, ( xTaskGetTickCountFromISR() ), ( pxHigherPriorityTaskWoken ), 0U ) +const char * pcTimerGetTimerName( TimerHandle_t xTimer ) PRIVILEGED_FUNCTION; /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ /* * Functions beyond this part are not part of the public API and are intended * for use by the kernel only. */ -portBASE_TYPE xTimerCreateTimerTask( void ) PRIVILEGED_FUNCTION; -portBASE_TYPE xTimerGenericCommand( xTimerHandle xTimer, portBASE_TYPE xCommandID, portTickType xOptionalValue, signed portBASE_TYPE *pxHigherPriorityTaskWoken, portTickType xBlockTime ) PRIVILEGED_FUNCTION; +BaseType_t xTimerCreateTimerTask( void ) PRIVILEGED_FUNCTION; +BaseType_t xTimerGenericCommand( TimerHandle_t xTimer, const BaseType_t xCommandID, const TickType_t xOptionalValue, BaseType_t * const pxHigherPriorityTaskWoken, const TickType_t xTicksToWait ) PRIVILEGED_FUNCTION; #ifdef __cplusplus } diff --git a/lib/FreeRTOS/list.c b/lib/FreeRTOS/list.c index 07baf5f4d2..ebacafddec 100644 --- a/lib/FreeRTOS/list.c +++ b/lib/FreeRTOS/list.c @@ -1,75 +1,70 @@ /* - FreeRTOS V7.4.0 - Copyright (C) 2013 Real Time Engineers Ltd. - - FEATURES AND PORTS ARE ADDED TO FREERTOS ALL THE TIME. PLEASE VISIT - http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. - - *************************************************************************** - * * - * 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! * - * * - *************************************************************************** + FreeRTOS V8.2.3 - Copyright (C) 2015 Real Time Engineers Ltd. + All rights reserved + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. This file is part of the FreeRTOS distribution. FreeRTOS is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License (version 2) as published by the - Free Software Foundation AND MODIFIED BY the FreeRTOS exception. + 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. + *************************************************************************** + >>! 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 itcan be - viewed here: http://www.freertos.org/a00114.html and also obtained by - writing to Real Time Engineers Ltd., contact details for whom are available - on the FreeRTOS WEB site. - - 1 tab == 4 spaces! + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html *************************************************************************** * * - * Having a problem? Start by reading the FAQ "My application does * - * not run, what could be wrong?" * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * * * - * http://www.FreeRTOS.org/FAQHelp.html * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * * * *************************************************************************** + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. - http://www.FreeRTOS.org - Documentation, books, training, latest versions, - license and Real Time Engineers Ltd. contact details. + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, - including FreeRTOS+Trace - an indispensable productivity tool, and our new - fully thread aware and reentrant UDP/IP stack. - - http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High - Integrity Systems, who sell the code with commercial support, - indemnification and middleware, under the OpenRTOS brand. - - http://www.SafeRTOS.com - High Integrity Systems also provide a safety - engineered and independently SIL3 certified version for use in safety and + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and mission critical applications that require provable dependability. + + 1 tab == 4 spaces! */ @@ -81,12 +76,12 @@ * PUBLIC LIST API documented in list.h *----------------------------------------------------------*/ -void vListInitialise( xList *pxList ) +void vListInitialise( List_t * const pxList ) { /* The list structure contains a list item which is used to mark the end of the list. To initialise the list the list end is inserted as the only list entry. */ - pxList->pxIndex = ( xListItem * ) &( pxList->xListEnd ); + pxList->pxIndex = ( ListItem_t * ) &( pxList->xListEnd ); /*lint !e826 !e740 The mini list structure is used as the list end to save RAM. This is checked and valid. */ /* The list end value is the highest possible value in the list to ensure it remains at the end of the list. */ @@ -94,35 +89,51 @@ void vListInitialise( xList *pxList ) /* 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->xListEnd.pxNext = ( ListItem_t * ) &( pxList->xListEnd ); /*lint !e826 !e740 The mini list structure is used as the list end to save RAM. This is checked and valid. */ + pxList->xListEnd.pxPrevious = ( ListItem_t * ) &( pxList->xListEnd );/*lint !e826 !e740 The mini list structure is used as the list end to save RAM. This is checked and valid. */ + + pxList->uxNumberOfItems = ( UBaseType_t ) 0U; - pxList->uxNumberOfItems = ( unsigned portBASE_TYPE ) 0U; + /* Write known values into the list if + configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES is set to 1. */ + listSET_LIST_INTEGRITY_CHECK_1_VALUE( pxList ); + listSET_LIST_INTEGRITY_CHECK_2_VALUE( pxList ); } /*-----------------------------------------------------------*/ -void vListInitialiseItem( xListItem *pxItem ) +void vListInitialiseItem( ListItem_t * const pxItem ) { /* Make sure the list item is not recorded as being on a list. */ pxItem->pvContainer = NULL; + + /* Write known values into the list item if + configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES is set to 1. */ + listSET_FIRST_LIST_ITEM_INTEGRITY_CHECK_VALUE( pxItem ); + listSET_SECOND_LIST_ITEM_INTEGRITY_CHECK_VALUE( pxItem ); } /*-----------------------------------------------------------*/ -void vListInsertEnd( xList *pxList, xListItem *pxNewListItem ) +void vListInsertEnd( List_t * const pxList, ListItem_t * const pxNewListItem ) { -volatile xListItem * pxIndex; +ListItem_t * const pxIndex = pxList->pxIndex; + + /* Only effective when configASSERT() is also defined, these tests may catch + the list data structures being overwritten in memory. They will not catch + data errors caused by incorrect configuration or use of FreeRTOS. */ + listTEST_LIST_INTEGRITY( pxList ); + listTEST_LIST_ITEM_INTEGRITY( pxNewListItem ); /* 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; + listGET_OWNER_OF_NEXT_ENTRY(). */ + pxNewListItem->pxNext = pxIndex; + pxNewListItem->pxPrevious = pxIndex->pxPrevious; + + /* Only used during decision coverage testing. */ + mtCOVERAGE_TEST_DELAY(); - pxNewListItem->pxNext = pxIndex->pxNext; - pxNewListItem->pxPrevious = pxList->pxIndex; - pxIndex->pxNext->pxPrevious = ( volatile xListItem * ) pxNewListItem; - pxIndex->pxNext = ( volatile xListItem * ) pxNewListItem; - pxList->pxIndex = ( volatile xListItem * ) pxNewListItem; + pxIndex->pxPrevious->pxNext = pxNewListItem; + pxIndex->pxPrevious = pxNewListItem; /* Remember which list the item is in. */ pxNewListItem->pvContainer = ( void * ) pxList; @@ -131,21 +142,25 @@ volatile xListItem * pxIndex; } /*-----------------------------------------------------------*/ -void vListInsert( xList *pxList, xListItem *pxNewListItem ) +void vListInsert( List_t * const pxList, ListItem_t * const 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. */ +ListItem_t *pxIterator; +const TickType_t xValueOfInsertion = pxNewListItem->xItemValue; + + /* Only effective when configASSERT() is also defined, these tests may catch + the list data structures being overwritten in memory. They will not catch + data errors caused by incorrect configuration or use of FreeRTOS. */ + listTEST_LIST_INTEGRITY( pxList ); + listTEST_LIST_ITEM_INTEGRITY( pxNewListItem ); + + /* Insert the new list item into the list, sorted in xItemValue order. + + 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 xItemValue value) get a + share of the CPU. However, if the xItemValue is the same as the back marker + the iteration loop below will not end. Therefore the value is checked + first, and the algorithm slightly modified if necessary. */ if( xValueOfInsertion == portMAX_DELAY ) { pxIterator = pxList->xListEnd.pxPrevious; @@ -153,32 +168,38 @@ portTickType xValueOfInsertion; else { /* *** NOTE *********************************************************** - If you find your application is crashing here then likely causes are: + If you find your application is crashing here then likely causes are + listed below. In addition see http://www.freertos.org/FAQHelp.html for + more tips, and ensure configASSERT() is defined! + http://www.freertos.org/a00110.html#configASSERT + 1) Stack overflow - see http://www.freertos.org/Stacks-and-stack-overflow-checking.html - 2) Incorrect interrupt priority assignment, especially on Cortex-M3 + 2) Incorrect interrupt priority assignment, especially on Cortex-M 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 + interrupt priorities, which can seem counter intuitive. See + http://www.freertos.org/RTOS-Cortex-M3-M4.html and the definition + of 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. + the scheduler is suspended, or calling an API function that does + not end in "FromISR" from an interrupt. 4) Using a queue or semaphore before it has been initialised or before the scheduler has been started (are interrupts firing before vTaskStartScheduler() has been called?). - See http://www.freertos.org/FAQHelp.html for more tips. **********************************************************************/ - for( pxIterator = ( xListItem * ) &( pxList->xListEnd ); pxIterator->pxNext->xItemValue <= xValueOfInsertion; pxIterator = pxIterator->pxNext ) + for( pxIterator = ( ListItem_t * ) &( pxList->xListEnd ); pxIterator->pxNext->xItemValue <= xValueOfInsertion; pxIterator = pxIterator->pxNext ) /*lint !e826 !e740 The mini list structure is used as the list end to save RAM. This is checked and valid. */ { - /* There is nothing to do here, we are just iterating to the - wanted insertion position. */ + /* There is nothing to do here, just iterating to the wanted + insertion position. */ } } pxNewListItem->pxNext = pxIterator->pxNext; - pxNewListItem->pxNext->pxPrevious = ( volatile xListItem * ) pxNewListItem; + pxNewListItem->pxNext->pxPrevious = pxNewListItem; pxNewListItem->pxPrevious = pxIterator; - pxIterator->pxNext = ( volatile xListItem * ) pxNewListItem; + pxIterator->pxNext = pxNewListItem; /* Remember which list the item is in. This allows fast removal of the item later. */ @@ -188,22 +209,27 @@ portTickType xValueOfInsertion; } /*-----------------------------------------------------------*/ -unsigned portBASE_TYPE uxListRemove( xListItem *pxItemToRemove ) +UBaseType_t uxListRemove( ListItem_t * const pxItemToRemove ) { -xList * pxList; +/* The list item knows which list it is in. Obtain the list from the list +item. */ +List_t * const pxList = ( List_t * ) pxItemToRemove->pvContainer; 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; + /* Only used during decision coverage testing. */ + mtCOVERAGE_TEST_DELAY(); /* Make sure the index is left pointing to a valid item. */ if( pxList->pxIndex == pxItemToRemove ) { pxList->pxIndex = pxItemToRemove->pxPrevious; } + else + { + mtCOVERAGE_TEST_MARKER(); + } pxItemToRemove->pvContainer = NULL; ( pxList->uxNumberOfItems )--; diff --git a/lib/FreeRTOS/portable/GCC/ARM_CM3/port.c b/lib/FreeRTOS/portable/GCC/ARM_CM3/port.c index 2be8ad9032..263b9ed60b 100644 --- a/lib/FreeRTOS/portable/GCC/ARM_CM3/port.c +++ b/lib/FreeRTOS/portable/GCC/ARM_CM3/port.c @@ -1,75 +1,70 @@ /* - FreeRTOS V7.4.0 - Copyright (C) 2013 Real Time Engineers Ltd. - - FEATURES AND PORTS ARE ADDED TO FREERTOS ALL THE TIME. PLEASE VISIT - http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. - - *************************************************************************** - * * - * 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! * - * * - *************************************************************************** + FreeRTOS V8.2.3 - Copyright (C) 2015 Real Time Engineers Ltd. + All rights reserved + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. This file is part of the FreeRTOS distribution. FreeRTOS is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License (version 2) as published by the - Free Software Foundation AND MODIFIED BY the FreeRTOS exception. + 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. + *************************************************************************** + >>! 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 itcan be - viewed here: http://www.freertos.org/a00114.html and also obtained by - writing to Real Time Engineers Ltd., contact details for whom are available - on the FreeRTOS WEB site. - - 1 tab == 4 spaces! + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html *************************************************************************** * * - * Having a problem? Start by reading the FAQ "My application does * - * not run, what could be wrong?" * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * * * - * http://www.FreeRTOS.org/FAQHelp.html * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * * * *************************************************************************** + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. - http://www.FreeRTOS.org - Documentation, books, training, latest versions, - license and Real Time Engineers Ltd. contact details. + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, - including FreeRTOS+Trace - an indispensable productivity tool, and our new - fully thread aware and reentrant UDP/IP stack. - - http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High - Integrity Systems, who sell the code with commercial support, - indemnification and middleware, under the OpenRTOS brand. - - http://www.SafeRTOS.com - High Integrity Systems also provide a safety - engineered and independently SIL3 certified version for use in safety and + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and mission critical applications that require provable dependability. + + 1 tab == 4 spaces! */ /*----------------------------------------------------------- @@ -89,36 +84,65 @@ FreeRTOS.org versions prior to V4.4.0 did not include this definition. */ #ifndef configSYSTICK_CLOCK_HZ #define configSYSTICK_CLOCK_HZ configCPU_CLOCK_HZ + /* Ensure the SysTick is clocked at the same frequency as the core. */ + #define portNVIC_SYSTICK_CLK_BIT ( 1UL << 2UL ) +#else + /* The way the SysTick is clocked is not modified in case it is not the same + as the core. */ + #define portNVIC_SYSTICK_CLK_BIT ( 0 ) #endif /* Constants required to manipulate the core. Registers first... */ -#define portNVIC_SYSTICK_CTRL_REG ( * ( ( volatile unsigned long * ) 0xe000e010 ) ) -#define portNVIC_SYSTICK_LOAD_REG ( * ( ( volatile unsigned long * ) 0xe000e014 ) ) -#define portNVIC_SYSTICK_CURRENT_VALUE_REG ( * ( ( volatile unsigned long * ) 0xe000e018 ) ) -#define portNVIC_INT_CTRL_REG ( * ( ( volatile unsigned long * ) 0xe000ed04 ) ) -#define portNVIC_SYSPRI2_REG ( * ( ( volatile unsigned long * ) 0xe000ed20 ) ) +#define portNVIC_SYSTICK_CTRL_REG ( * ( ( volatile uint32_t * ) 0xe000e010 ) ) +#define portNVIC_SYSTICK_LOAD_REG ( * ( ( volatile uint32_t * ) 0xe000e014 ) ) +#define portNVIC_SYSTICK_CURRENT_VALUE_REG ( * ( ( volatile uint32_t * ) 0xe000e018 ) ) +#define portNVIC_SYSPRI2_REG ( * ( ( volatile uint32_t * ) 0xe000ed20 ) ) /* ...then bits in the registers. */ -#define portNVIC_SYSTICK_CLK_BIT ( 1UL << 2UL ) #define portNVIC_SYSTICK_INT_BIT ( 1UL << 1UL ) #define portNVIC_SYSTICK_ENABLE_BIT ( 1UL << 0UL ) #define portNVIC_SYSTICK_COUNT_FLAG_BIT ( 1UL << 16UL ) -#define portNVIC_PENDSVSET_BIT ( 1UL << 28UL ) #define portNVIC_PENDSVCLEAR_BIT ( 1UL << 27UL ) #define portNVIC_PEND_SYSTICK_CLEAR_BIT ( 1UL << 25UL ) -#define portNVIC_PENDSV_PRI ( ( ( unsigned long ) configKERNEL_INTERRUPT_PRIORITY ) << 16UL ) -#define portNVIC_SYSTICK_PRI ( ( ( unsigned long ) configKERNEL_INTERRUPT_PRIORITY ) << 24UL ) +#define portNVIC_PENDSV_PRI ( ( ( uint32_t ) configKERNEL_INTERRUPT_PRIORITY ) << 16UL ) +#define portNVIC_SYSTICK_PRI ( ( ( uint32_t ) configKERNEL_INTERRUPT_PRIORITY ) << 24UL ) -/* Constants required to set up the initial stack. */ -#define portINITIAL_XPSR ( 0x01000000 ) +/* Constants required to check the validity of an interrupt priority. */ +#define portFIRST_USER_INTERRUPT_NUMBER ( 16 ) +#define portNVIC_IP_REGISTERS_OFFSET_16 ( 0xE000E3F0 ) +#define portAIRCR_REG ( * ( ( volatile uint32_t * ) 0xE000ED0C ) ) +#define portMAX_8_BIT_VALUE ( ( uint8_t ) 0xff ) +#define portTOP_BIT_OF_BYTE ( ( uint8_t ) 0x80 ) +#define portMAX_PRIGROUP_BITS ( ( uint8_t ) 7 ) +#define portPRIORITY_GROUP_MASK ( 0x07UL << 8UL ) +#define portPRIGROUP_SHIFT ( 8UL ) -/* 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; +/* Masks off all bits but the VECTACTIVE bits in the ICSR register. */ +#define portVECTACTIVE_MASK ( 0xFFUL ) + +/* Constants required to set up the initial stack. */ +#define portINITIAL_XPSR ( 0x01000000UL ) + +/* The systick is a 24-bit counter. */ +#define portMAX_24_BIT_NUMBER ( 0xffffffUL ) + +/* A fiddle factor to estimate the number of SysTick counts that would have +occurred while the SysTick counter is stopped during tickless idle +calculations. */ +#define portMISSED_COUNTS_FACTOR ( 45UL ) + +/* Let the user override the pre-loading of the initial LR with the address of +prvTaskExitError() in case it messes up unwinding of the stack in the +debugger. */ +#ifdef configTASK_RETURN_ADDRESS + #define portTASK_RETURN_ADDRESS configTASK_RETURN_ADDRESS +#else + #define portTASK_RETURN_ADDRESS prvTaskExitError +#endif /* Each task maintains its own interrupt status in the critical nesting variable. */ -static unsigned portBASE_TYPE uxCriticalNesting = 0xaaaaaaaa; +static UBaseType_t uxCriticalNesting = 0xaaaaaaaa; /* * Setup the timer to generate the tick interrupts. The implementation in this @@ -130,30 +154,35 @@ void vPortSetupTimerInterrupt( void ); /* * Exception handlers. */ -void xPortPendSVHandler( void ) __attribute__ (( naked, used )); -void xPortSysTickHandler( void ) __attribute__ ((used)); -void vPortSVCHandler( void ) __attribute__ (( naked, used )); +void xPortPendSVHandler( void ) __attribute__ (( naked )); +void xPortSysTickHandler( void ); +void vPortSVCHandler( void ) __attribute__ (( naked )); /* * Start first task is a separate function so it can be tested in isolation. */ static void prvPortStartFirstTask( void ) __attribute__ (( naked )); +/* + * Used to catch tasks that attempt to return from their implementing function. + */ +static void prvTaskExitError( void ); + /*-----------------------------------------------------------*/ /* * The number of SysTick increments that make up one tick period. */ #if configUSE_TICKLESS_IDLE == 1 - static unsigned long ulTimerReloadValueForOneTick = 0; -#endif + static uint32_t ulTimerCountsForOneTick = 0; +#endif /* configUSE_TICKLESS_IDLE */ /* * The maximum number of tick periods that can be suppressed is limited by the * 24 bit resolution of the SysTick timer. */ #if configUSE_TICKLESS_IDLE == 1 - static unsigned long xMaximumPossibleSuppressedTicks = 0; + static uint32_t xMaximumPossibleSuppressedTicks = 0; #endif /* configUSE_TICKLESS_IDLE */ /* @@ -161,32 +190,57 @@ static void prvPortStartFirstTask( void ) __attribute__ (( naked )); * power functionality only. */ #if configUSE_TICKLESS_IDLE == 1 - static unsigned long ulStoppedTimerCompensation = 0; + static uint32_t ulStoppedTimerCompensation = 0; #endif /* configUSE_TICKLESS_IDLE */ +/* + * Used by the portASSERT_IF_INTERRUPT_PRIORITY_INVALID() macro to ensure + * FreeRTOS API functions are not called from interrupts that have been assigned + * a priority above configMAX_SYSCALL_INTERRUPT_PRIORITY. + */ +#if ( configASSERT_DEFINED == 1 ) + static uint8_t ucMaxSysCallPriority = 0; + static uint32_t ulMaxPRIGROUPValue = 0; + static const volatile uint8_t * const pcInterruptPriorityRegisters = ( const volatile uint8_t * const ) portNVIC_IP_REGISTERS_OFFSET_16; +#endif /* configASSERT_DEFINED */ + /*-----------------------------------------------------------*/ /* * See header file for description. */ -portSTACK_TYPE *pxPortInitialiseStack( portSTACK_TYPE *pxTopOfStack, pdTASK_CODE pxCode, void *pvParameters ) +StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t 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 = ( StackType_t ) pxCode; /* PC */ pxTopOfStack--; - *pxTopOfStack = 0; /* LR */ + *pxTopOfStack = ( StackType_t ) portTASK_RETURN_ADDRESS; /* LR */ pxTopOfStack -= 5; /* R12, R3, R2 and R1. */ - *pxTopOfStack = ( portSTACK_TYPE ) pvParameters; /* R0 */ + *pxTopOfStack = ( StackType_t ) pvParameters; /* R0 */ pxTopOfStack -= 8; /* R11, R10, R9, R8, R7, R6, R5 and R4. */ return pxTopOfStack; } /*-----------------------------------------------------------*/ +static void prvTaskExitError( void ) +{ + /* A function that implements a task must not exit or attempt to return to + its caller as there is nothing to return to. If a task wants to exit it + should instead call vTaskDelete( NULL ). + + Artificially force an assert() to be triggered if configASSERT() is + defined, then stop here so application writers can catch the error. */ + configASSERT( uxCriticalNesting == ~0UL ); + portDISABLE_INTERRUPTS(); + for( ;; ); +} +/*-----------------------------------------------------------*/ + void vPortSVCHandler( void ) { __asm volatile ( @@ -195,6 +249,7 @@ void vPortSVCHandler( void ) " 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. */ + " isb \n" " mov r0, #0 \n" " msr basepri, r0 \n" " orr r14, #0xd \n" @@ -214,6 +269,9 @@ static void prvPortStartFirstTask( void ) " ldr r0, [r0] \n" " msr msp, r0 \n" /* Set the msp back to the start of the stack. */ " cpsie i \n" /* Globally enable interrupts. */ + " cpsie f \n" + " dsb \n" + " isb \n" " svc 0 \n" /* System call to start first task. */ " nop \n" ); @@ -223,13 +281,57 @@ static void prvPortStartFirstTask( void ) /* * See header file for description. */ -portBASE_TYPE xPortStartScheduler( void ) +BaseType_t xPortStartScheduler( void ) { /* configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to 0. See http://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html */ configASSERT( configMAX_SYSCALL_INTERRUPT_PRIORITY ); - /* Make PendSV, CallSV and SysTick the same priroity as the kernel. */ + #if( configASSERT_DEFINED == 1 ) + { + volatile uint32_t ulOriginalPriority; + volatile uint8_t * const pucFirstUserPriorityRegister = ( volatile uint8_t * const ) ( portNVIC_IP_REGISTERS_OFFSET_16 + portFIRST_USER_INTERRUPT_NUMBER ); + volatile uint8_t ucMaxPriorityValue; + + /* Determine the maximum priority from which ISR safe FreeRTOS API + functions can be called. ISR safe functions are those that end in + "FromISR". FreeRTOS maintains separate thread and ISR API functions to + ensure interrupt entry is as fast and simple as possible. + + Save the interrupt priority value that is about to be clobbered. */ + ulOriginalPriority = *pucFirstUserPriorityRegister; + + /* Determine the number of priority bits available. First write to all + possible bits. */ + *pucFirstUserPriorityRegister = portMAX_8_BIT_VALUE; + + /* Read the value back to see how many bits stuck. */ + ucMaxPriorityValue = *pucFirstUserPriorityRegister; + + /* Use the same mask on the maximum system call priority. */ + ucMaxSysCallPriority = configMAX_SYSCALL_INTERRUPT_PRIORITY & ucMaxPriorityValue; + + /* Calculate the maximum acceptable priority group value for the number + of bits read back. */ + ulMaxPRIGROUPValue = portMAX_PRIGROUP_BITS; + while( ( ucMaxPriorityValue & portTOP_BIT_OF_BYTE ) == portTOP_BIT_OF_BYTE ) + { + ulMaxPRIGROUPValue--; + ucMaxPriorityValue <<= ( uint8_t ) 0x01; + } + + /* Shift the priority group value back to its position within the AIRCR + register. */ + ulMaxPRIGROUPValue <<= portPRIGROUP_SHIFT; + ulMaxPRIGROUPValue &= portPRIORITY_GROUP_MASK; + + /* Restore the clobbered interrupt priority register to its original + value. */ + *pucFirstUserPriorityRegister = ulOriginalPriority; + } + #endif /* conifgASSERT_DEFINED */ + + /* Make PendSV and SysTick the lowest priority interrupts. */ portNVIC_SYSPRI2_REG |= portNVIC_PENDSV_PRI; portNVIC_SYSPRI2_REG |= portNVIC_SYSTICK_PRI; @@ -243,6 +345,12 @@ portBASE_TYPE xPortStartScheduler( void ) /* Start the first task. */ prvPortStartFirstTask(); + /* Should never get here as the tasks will now be executing! Call the task + exit error function to prevent compiler warnings about a static function + not being called in the case that the application writer overrides this + functionality by defining configTASK_RETURN_ADDRESS. */ + prvTaskExitError(); + /* Should not get here! */ return 0; } @@ -250,15 +358,21 @@ portBASE_TYPE xPortStartScheduler( void ) void vPortEndScheduler( void ) { - /* It is unlikely that the CM3 port will require this function as there - is nothing to return to. */ + /* Not implemented in ports where there is nothing to return to. + Artificially force an assert. */ + configASSERT( uxCriticalNesting == 1000UL ); } /*-----------------------------------------------------------*/ -void vPortYieldFromISR( void ) +void vPortYield( void ) { /* Set a PendSV to request a context switch. */ portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; + + /* Barriers are normally not required but do ensure the code is completely + within the specified behaviour for the architecture. */ + __asm volatile( "dsb" ); + __asm volatile( "isb" ); } /*-----------------------------------------------------------*/ @@ -266,11 +380,24 @@ void vPortEnterCritical( void ) { portDISABLE_INTERRUPTS(); uxCriticalNesting++; + __asm volatile( "dsb" ); + __asm volatile( "isb" ); + + /* This is not the interrupt safe version of the enter critical function so + assert() if it is being called from an interrupt context. Only API + functions that end in "FromISR" can be used in an interrupt. Only assert if + the critical nesting count is 1 to protect against recursive calls if the + assert function also uses a critical section. */ + if( uxCriticalNesting == 1 ) + { + configASSERT( ( portNVIC_INT_CTRL_REG & portVECTACTIVE_MASK ) == 0 ); + } } /*-----------------------------------------------------------*/ void vPortExitCritical( void ) { + configASSERT( uxCriticalNesting ); uxCriticalNesting--; if( uxCriticalNesting == 0 ) { @@ -279,7 +406,7 @@ void vPortExitCritical( void ) } /*-----------------------------------------------------------*/ -__attribute__(( naked )) unsigned long ulPortSetInterruptMask( void ) +__attribute__(( naked )) uint32_t ulPortSetInterruptMask( void ) { __asm volatile \ ( \ @@ -296,7 +423,7 @@ __attribute__(( naked )) unsigned long ulPortSetInterruptMask( void ) } /*-----------------------------------------------------------*/ -__attribute__(( naked )) void vPortClearInterruptMask( unsigned long ulNewMaskValue ) +__attribute__(( naked )) void vPortClearInterruptMask( uint32_t ulNewMaskValue ) { __asm volatile \ ( \ @@ -317,6 +444,7 @@ void xPortPendSVHandler( void ) __asm volatile ( " mrs r0, psp \n" + " isb \n" " \n" " ldr r3, pxCurrentTCBConst \n" /* Get the location of the current TCB. */ " ldr r2, [r3] \n" @@ -336,6 +464,7 @@ void xPortPendSVHandler( void ) " 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" + " isb \n" " bx r14 \n" " \n" " .align 2 \n" @@ -347,22 +476,19 @@ void xPortPendSVHandler( void ) void xPortSysTickHandler( void ) { - /* If using preemption, also force a context switch. */ - #if configUSE_PREEMPTION == 1 - portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; - #endif - - /* Only reset the systick load register if configUSE_TICKLESS_IDLE is set to - 1. If it is set to 0 tickless idle is not being used. If it is set to a - value other than 0 or 1 then a timer other than the SysTick is being used - to generate the tick interrupt. */ - #if configUSE_TICKLESS_IDLE == 1 - portNVIC_SYSTICK_LOAD_REG = ulTimerReloadValueForOneTick; - #endif - + /* The SysTick runs at the lowest interrupt priority, so when this interrupt + executes all interrupts must be unmasked. There is therefore no need to + save and then restore the interrupt mask value as its value is already + known. */ ( void ) portSET_INTERRUPT_MASK_FROM_ISR(); { - vTaskIncrementTick(); + /* Increment the RTOS tick. */ + if( xTaskIncrementTick() != pdFALSE ) + { + /* A context switch is required. Context switching is performed in + the PendSV interrupt. Pend the PendSV interrupt. */ + portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; + } } portCLEAR_INTERRUPT_MASK_FROM_ISR( 0 ); } @@ -370,10 +496,10 @@ void xPortSysTickHandler( void ) #if configUSE_TICKLESS_IDLE == 1 - __attribute__((weak)) void vPortSuppressTicksAndSleep( portTickType xExpectedIdleTime ) + __attribute__((weak)) void vPortSuppressTicksAndSleep( TickType_t xExpectedIdleTime ) { - unsigned long ulReloadValue, ulCompleteTickPeriods, ulCompletedSysTickIncrements; - portTickType xModifiableIdleTime; + uint32_t ulReloadValue, ulCompleteTickPeriods, ulCompletedSysTickDecrements, ulSysTickCTRL; + TickType_t xModifiableIdleTime; /* Make sure the SysTick reload value does not overflow the counter. */ if( xExpectedIdleTime > xMaximumPossibleSuppressedTicks ) @@ -381,26 +507,21 @@ void xPortSysTickHandler( void ) xExpectedIdleTime = xMaximumPossibleSuppressedTicks; } + /* Stop the SysTick momentarily. The time the SysTick is stopped for + is accounted for as best it can be, but using the tickless mode will + inevitably result in some tiny drift of the time maintained by the + kernel with respect to calendar time. */ + portNVIC_SYSTICK_CTRL_REG &= ~portNVIC_SYSTICK_ENABLE_BIT; + /* Calculate the reload value required to wait xExpectedIdleTime tick periods. -1 is used because this code will execute part way - through one of the tick periods, and the fraction of a tick period is - accounted for later. */ - ulReloadValue = ( ulTimerReloadValueForOneTick * ( xExpectedIdleTime - 1UL ) ); + through one of the tick periods. */ + ulReloadValue = portNVIC_SYSTICK_CURRENT_VALUE_REG + ( ulTimerCountsForOneTick * ( xExpectedIdleTime - 1UL ) ); if( ulReloadValue > ulStoppedTimerCompensation ) { ulReloadValue -= ulStoppedTimerCompensation; } - /* Stop the SysTick momentarily. The time the SysTick is stopped for - is accounted for as best it can be, but using the tickless mode will - inevitably result in some tiny drift of the time maintained by the - kernel with respect to calendar time. */ - portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT; - - /* Adjust the reload value to take into account that the current time - slice is already partially complete. */ - ulReloadValue += ( portNVIC_SYSTICK_LOAD_REG - ( portNVIC_SYSTICK_LOAD_REG - portNVIC_SYSTICK_CURRENT_VALUE_REG ) ); - /* Enter a critical section but don't use the taskENTER_CRITICAL() method as that will mask interrupts that should exit sleep mode. */ __asm volatile( "cpsid i" ); @@ -409,8 +530,16 @@ void xPortSysTickHandler( void ) to be unsuspended then abandon the low power entry. */ if( eTaskConfirmSleepModeStatus() == eAbortSleep ) { + /* Restart from whatever is left in the count register to complete + this tick period. */ + portNVIC_SYSTICK_LOAD_REG = portNVIC_SYSTICK_CURRENT_VALUE_REG; + /* Restart SysTick. */ - portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT; + portNVIC_SYSTICK_CTRL_REG |= portNVIC_SYSTICK_ENABLE_BIT; + + /* Reset the reload register to the value required for normal tick + periods. */ + portNVIC_SYSTICK_LOAD_REG = ulTimerCountsForOneTick - 1UL; /* Re-enable interrupts - see comments above the cpsid instruction() above. */ @@ -426,7 +555,7 @@ void xPortSysTickHandler( void ) portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL; /* Restart SysTick. */ - portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT; + portNVIC_SYSTICK_CTRL_REG |= portNVIC_SYSTICK_ENABLE_BIT; /* Sleep until something happens. configPRE_SLEEP_PROCESSING() can set its parameter to 0 to indicate that its implementation contains @@ -437,7 +566,9 @@ void xPortSysTickHandler( void ) configPRE_SLEEP_PROCESSING( xModifiableIdleTime ); if( xModifiableIdleTime > 0 ) { + __asm volatile( "dsb" ); __asm volatile( "wfi" ); + __asm volatile( "isb" ); } configPOST_SLEEP_PROCESSING( xExpectedIdleTime ); @@ -445,19 +576,32 @@ void xPortSysTickHandler( void ) accounted for as best it can be, but using the tickless mode will inevitably result in some tiny drift of the time maintained by the kernel with respect to calendar time. */ - portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT; + ulSysTickCTRL = portNVIC_SYSTICK_CTRL_REG; + portNVIC_SYSTICK_CTRL_REG = ( ulSysTickCTRL & ~portNVIC_SYSTICK_ENABLE_BIT ); /* Re-enable interrupts - see comments above the cpsid instruction() above. */ __asm volatile( "cpsie i" ); - if( ( portNVIC_SYSTICK_CTRL_REG & portNVIC_SYSTICK_COUNT_FLAG_BIT ) != 0 ) + if( ( ulSysTickCTRL & portNVIC_SYSTICK_COUNT_FLAG_BIT ) != 0 ) { + uint32_t ulCalculatedLoadValue; + /* The tick interrupt has already executed, and the SysTick - count reloaded with the portNVIC_SYSTICK_LOAD_REG value. - Reset the portNVIC_SYSTICK_LOAD_REG with whatever remains of - this tick period. */ - portNVIC_SYSTICK_LOAD_REG = ulTimerReloadValueForOneTick - ( ulReloadValue - portNVIC_SYSTICK_CURRENT_VALUE_REG ); + count reloaded with ulReloadValue. Reset the + portNVIC_SYSTICK_LOAD_REG with whatever remains of this tick + period. */ + ulCalculatedLoadValue = ( ulTimerCountsForOneTick - 1UL ) - ( ulReloadValue - portNVIC_SYSTICK_CURRENT_VALUE_REG ); + + /* Don't allow a tiny value, or values that have somehow + underflowed because the post sleep hook did something + that took too long. */ + if( ( ulCalculatedLoadValue < ulStoppedTimerCompensation ) || ( ulCalculatedLoadValue > ulTimerCountsForOneTick ) ) + { + ulCalculatedLoadValue = ( ulTimerCountsForOneTick - 1UL ); + } + + portNVIC_SYSTICK_LOAD_REG = ulCalculatedLoadValue; /* The tick interrupt handler will already have pended the tick processing in the kernel. As the pending tick will be @@ -469,25 +613,33 @@ void xPortSysTickHandler( void ) else { /* Something other than the tick interrupt ended the sleep. - Work out how long the sleep lasted. */ - ulCompletedSysTickIncrements = ( xExpectedIdleTime * ulTimerReloadValueForOneTick ) - portNVIC_SYSTICK_CURRENT_VALUE_REG; + Work out how long the sleep lasted rounded to complete tick + periods (not the ulReload value which accounted for part + ticks). */ + ulCompletedSysTickDecrements = ( xExpectedIdleTime * ulTimerCountsForOneTick ) - portNVIC_SYSTICK_CURRENT_VALUE_REG; /* How many complete tick periods passed while the processor was waiting? */ - ulCompleteTickPeriods = ulCompletedSysTickIncrements / ulTimerReloadValueForOneTick; + ulCompleteTickPeriods = ulCompletedSysTickDecrements / ulTimerCountsForOneTick; /* The reload value is set to whatever fraction of a single tick period remains. */ - portNVIC_SYSTICK_LOAD_REG = ( ( ulCompleteTickPeriods + 1 ) * ulTimerReloadValueForOneTick ) - ulCompletedSysTickIncrements; + portNVIC_SYSTICK_LOAD_REG = ( ( ulCompleteTickPeriods + 1 ) * ulTimerCountsForOneTick ) - ulCompletedSysTickDecrements; } /* Restart SysTick so it runs from portNVIC_SYSTICK_LOAD_REG again, then set portNVIC_SYSTICK_LOAD_REG back to its standard - value. */ + value. The critical section is used to ensure the tick interrupt + can only execute once in the case that the reload register is near + zero. */ portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL; - portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT; - - vTaskStepTick( ulCompleteTickPeriods ); + portENTER_CRITICAL(); + { + portNVIC_SYSTICK_CTRL_REG |= portNVIC_SYSTICK_ENABLE_BIT; + vTaskStepTick( ulCompleteTickPeriods ); + portNVIC_SYSTICK_LOAD_REG = ulTimerCountsForOneTick - 1UL; + } + portEXIT_CRITICAL(); } } @@ -503,15 +655,95 @@ __attribute__(( weak )) void vPortSetupTimerInterrupt( void ) /* Calculate the constants required to configure the tick interrupt. */ #if configUSE_TICKLESS_IDLE == 1 { - ulTimerReloadValueForOneTick = ( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ ) - 1UL; - xMaximumPossibleSuppressedTicks = 0xffffffUL / ( ( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ ) - 1UL ); - ulStoppedTimerCompensation = 45UL / ( configCPU_CLOCK_HZ / configSYSTICK_CLOCK_HZ ); + ulTimerCountsForOneTick = ( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ ); + xMaximumPossibleSuppressedTicks = portMAX_24_BIT_NUMBER / ulTimerCountsForOneTick; + ulStoppedTimerCompensation = portMISSED_COUNTS_FACTOR / ( configCPU_CLOCK_HZ / configSYSTICK_CLOCK_HZ ); } #endif /* configUSE_TICKLESS_IDLE */ /* Configure SysTick to interrupt at the requested rate. */ - portNVIC_SYSTICK_LOAD_REG = ( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ ) - 1UL;; - portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT; + portNVIC_SYSTICK_LOAD_REG = ( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ ) - 1UL; + portNVIC_SYSTICK_CTRL_REG = ( portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT ); } /*-----------------------------------------------------------*/ + +#if( configASSERT_DEFINED == 1 ) + + void vPortValidateInterruptPriority( void ) + { + uint32_t ulCurrentInterrupt; + uint8_t ucCurrentPriority; + + /* Obtain the number of the currently executing interrupt. */ + __asm volatile( "mrs %0, ipsr" : "=r"( ulCurrentInterrupt ) ); + + /* Is the interrupt number a user defined interrupt? */ + if( ulCurrentInterrupt >= portFIRST_USER_INTERRUPT_NUMBER ) + { + /* Look up the interrupt's priority. */ + ucCurrentPriority = pcInterruptPriorityRegisters[ ulCurrentInterrupt ]; + + /* The following assertion will fail if a service routine (ISR) for + an interrupt that has been assigned a priority above + configMAX_SYSCALL_INTERRUPT_PRIORITY calls an ISR safe FreeRTOS API + function. ISR safe FreeRTOS API functions must *only* be called + from interrupts that have been assigned a priority at or below + configMAX_SYSCALL_INTERRUPT_PRIORITY. + + Numerically low interrupt priority numbers represent logically high + interrupt priorities, therefore the priority of the interrupt must + be set to a value equal to or numerically *higher* than + configMAX_SYSCALL_INTERRUPT_PRIORITY. + + Interrupts that use the FreeRTOS API must not be left at their + default priority of zero as that is the highest possible priority, + which is guaranteed to be above configMAX_SYSCALL_INTERRUPT_PRIORITY, + and therefore also guaranteed to be invalid. + + FreeRTOS maintains separate thread and ISR API functions to ensure + interrupt entry is as fast and simple as possible. + + The following links provide detailed information: + http://www.freertos.org/RTOS-Cortex-M3-M4.html + http://www.freertos.org/FAQHelp.html */ + configASSERT( ucCurrentPriority >= ucMaxSysCallPriority ); + } + + /* Priority grouping: The interrupt controller (NVIC) allows the bits + that define each interrupt's priority to be split between bits that + define the interrupt's pre-emption priority bits and bits that define + the interrupt's sub-priority. For simplicity all bits must be defined + to be pre-emption priority bits. The following assertion will fail if + this is not the case (if some bits represent a sub-priority). + + If the application only uses CMSIS libraries for interrupt + configuration then the correct setting can be achieved on all Cortex-M + devices by calling NVIC_SetPriorityGrouping( 0 ); before starting the + scheduler. Note however that some vendor specific peripheral libraries + assume a non-zero priority group setting, in which cases using a value + of zero will result in unpredicable behaviour. */ + configASSERT( ( portAIRCR_REG & portPRIORITY_GROUP_MASK ) <= ulMaxPRIGROUPValue ); + } + +#endif /* configASSERT_DEFINED */ + + + + + + + + + + + + + + + + + + + + diff --git a/lib/FreeRTOS/portable/GCC/ARM_CM3/portmacro.h b/lib/FreeRTOS/portable/GCC/ARM_CM3/portmacro.h index d436e732ac..a8ebb722cf 100644 --- a/lib/FreeRTOS/portable/GCC/ARM_CM3/portmacro.h +++ b/lib/FreeRTOS/portable/GCC/ARM_CM3/portmacro.h @@ -1,75 +1,70 @@ /* - FreeRTOS V7.4.0 - Copyright (C) 2013 Real Time Engineers Ltd. - - FEATURES AND PORTS ARE ADDED TO FREERTOS ALL THE TIME. PLEASE VISIT - http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. - - *************************************************************************** - * * - * 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! * - * * - *************************************************************************** + FreeRTOS V8.2.3 - Copyright (C) 2015 Real Time Engineers Ltd. + All rights reserved + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. This file is part of the FreeRTOS distribution. FreeRTOS is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License (version 2) as published by the - Free Software Foundation AND MODIFIED BY the FreeRTOS exception. + 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. + *************************************************************************** + >>! 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 itcan be - viewed here: http://www.freertos.org/a00114.html and also obtained by - writing to Real Time Engineers Ltd., contact details for whom are available - on the FreeRTOS WEB site. - - 1 tab == 4 spaces! + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html *************************************************************************** * * - * Having a problem? Start by reading the FAQ "My application does * - * not run, what could be wrong?" * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * * * - * http://www.FreeRTOS.org/FAQHelp.html * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * * * *************************************************************************** + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? - http://www.FreeRTOS.org - Documentation, books, training, latest versions, - license and Real Time Engineers Ltd. contact details. + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, - including FreeRTOS+Trace - an indispensable productivity tool, and our new - fully thread aware and reentrant UDP/IP stack. - - http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High - Integrity Systems, who sell the code with commercial support, - indemnification and middleware, under the OpenRTOS brand. - - http://www.SafeRTOS.com - High Integrity Systems also provide a safety - engineered and independently SIL3 certified version for use in safety and + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and mission critical applications that require provable dependability. + + 1 tab == 4 spaces! */ @@ -96,36 +91,47 @@ extern "C" { #define portDOUBLE double #define portLONG long #define portSHORT short -#define portSTACK_TYPE unsigned portLONG +#define portSTACK_TYPE uint32_t #define portBASE_TYPE long +typedef portSTACK_TYPE StackType_t; +typedef long BaseType_t; +typedef unsigned long UBaseType_t; + #if( configUSE_16_BIT_TICKS == 1 ) - typedef unsigned portSHORT portTickType; - #define portMAX_DELAY ( portTickType ) 0xffff + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff #else - typedef unsigned portLONG portTickType; - #define portMAX_DELAY ( portTickType ) 0xffffffff + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL + + /* 32-bit tick type on a 32-bit architecture, so reads of the tick count do + not need to be guarded with a critical section. */ + #define portTICK_TYPE_IS_ATOMIC 1 #endif /*-----------------------------------------------------------*/ /* Architecture specifics. */ #define portSTACK_GROWTH ( -1 ) -#define portTICK_RATE_MS ( ( portTickType ) 1000 / configTICK_RATE_HZ ) +#define portTICK_PERIOD_MS ( ( TickType_t ) 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() +extern void vPortYield( void ); +#define portNVIC_INT_CTRL_REG ( * ( ( volatile uint32_t * ) 0xe000ed04 ) ) +#define portNVIC_PENDSVSET_BIT ( 1UL << 28UL ) +#define portYIELD() vPortYield() +#define portEND_SWITCHING_ISR( xSwitchRequired ) if( xSwitchRequired ) portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT +#define portYIELD_FROM_ISR( x ) portEND_SWITCHING_ISR( x ) /*-----------------------------------------------------------*/ /* Critical section management. */ extern void vPortEnterCritical( void ); extern void vPortExitCritical( void ); -extern unsigned long ulPortSetInterruptMask( void ); -extern void vPortClearInterruptMask( unsigned long ulNewMaskValue ); +extern uint32_t ulPortSetInterruptMask( void ); +extern void vPortClearInterruptMask( uint32_t ulNewMaskValue ); #define portSET_INTERRUPT_MASK_FROM_ISR() ulPortSetInterruptMask() #define portCLEAR_INTERRUPT_MASK_FROM_ISR(x) vPortClearInterruptMask(x) #define portDISABLE_INTERRUPTS() ulPortSetInterruptMask() @@ -143,18 +149,22 @@ not necessary for to use this port. They are defined so the common demo files /* Tickless idle/low power functionality. */ #ifndef portSUPPRESS_TICKS_AND_SLEEP - extern void vPortSuppressTicksAndSleep( portTickType xExpectedIdleTime ); + extern void vPortSuppressTicksAndSleep( TickType_t xExpectedIdleTime ); #define portSUPPRESS_TICKS_AND_SLEEP( xExpectedIdleTime ) vPortSuppressTicksAndSleep( xExpectedIdleTime ) #endif /*-----------------------------------------------------------*/ /* Architecture specific optimisations. */ +#ifndef configUSE_PORT_OPTIMISED_TASK_SELECTION + #define configUSE_PORT_OPTIMISED_TASK_SELECTION 1 +#endif + #if configUSE_PORT_OPTIMISED_TASK_SELECTION == 1 /* Generic helper function. */ - __attribute__( ( always_inline ) ) static inline unsigned char ucPortCountLeadingZeros( unsigned long ulBitmap ) + __attribute__( ( always_inline ) ) static inline uint8_t ucPortCountLeadingZeros( uint32_t ulBitmap ) { - unsigned char ucReturn; + uint8_t ucReturn; __asm volatile ( "clz %0, %1" : "=r" ( ucReturn ) : "r" ( ulBitmap ) ); return ucReturn; @@ -177,6 +187,11 @@ not necessary for to use this port. They are defined so the common demo files /*-----------------------------------------------------------*/ +#ifdef configASSERT + void vPortValidateInterruptPriority( void ); + #define portASSERT_IF_INTERRUPT_PRIORITY_INVALID() vPortValidateInterruptPriority() +#endif + /* portNOP() is not required by this port. */ #define portNOP() diff --git a/lib/FreeRTOS/portable/GCC/ARM_CM4F/port.c b/lib/FreeRTOS/portable/GCC/ARM_CM4F/port.c index 213b712778..4732d98e0a 100644 --- a/lib/FreeRTOS/portable/GCC/ARM_CM4F/port.c +++ b/lib/FreeRTOS/portable/GCC/ARM_CM4F/port.c @@ -1,75 +1,70 @@ /* - FreeRTOS V7.4.0 - Copyright (C) 2013 Real Time Engineers Ltd. - - FEATURES AND PORTS ARE ADDED TO FREERTOS ALL THE TIME. PLEASE VISIT - http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. - - *************************************************************************** - * * - * 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! * - * * - *************************************************************************** + FreeRTOS V8.2.3 - Copyright (C) 2015 Real Time Engineers Ltd. + All rights reserved + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. This file is part of the FreeRTOS distribution. FreeRTOS is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License (version 2) as published by the - Free Software Foundation AND MODIFIED BY the FreeRTOS exception. + 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. + *************************************************************************** + >>! 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 itcan be - viewed here: http://www.freertos.org/a00114.html and also obtained by - writing to Real Time Engineers Ltd., contact details for whom are available - on the FreeRTOS WEB site. - - 1 tab == 4 spaces! + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html *************************************************************************** * * - * Having a problem? Start by reading the FAQ "My application does * - * not run, what could be wrong?" * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * * * - * http://www.FreeRTOS.org/FAQHelp.html * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * * * *************************************************************************** + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. - http://www.FreeRTOS.org - Documentation, books, training, latest versions, - license and Real Time Engineers Ltd. contact details. + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, - including FreeRTOS+Trace - an indispensable productivity tool, and our new - fully thread aware and reentrant UDP/IP stack. - - http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High - Integrity Systems, who sell the code with commercial support, - indemnification and middleware, under the OpenRTOS brand. - - http://www.SafeRTOS.com - High Integrity Systems also provide a safety - engineered and independently SIL3 certified version for use in safety and + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and mission critical applications that require provable dependability. + + 1 tab == 4 spaces! */ /*----------------------------------------------------------- @@ -86,41 +81,76 @@ #ifndef configSYSTICK_CLOCK_HZ #define configSYSTICK_CLOCK_HZ configCPU_CLOCK_HZ + /* Ensure the SysTick is clocked at the same frequency as the core. */ + #define portNVIC_SYSTICK_CLK_BIT ( 1UL << 2UL ) +#else + /* The way the SysTick is clocked is not modified in case it is not the same + as the core. */ + #define portNVIC_SYSTICK_CLK_BIT ( 0 ) #endif /* Constants required to manipulate the core. Registers first... */ -#define portNVIC_SYSTICK_CTRL_REG ( * ( ( volatile unsigned long * ) 0xe000e010 ) ) -#define portNVIC_SYSTICK_LOAD_REG ( * ( ( volatile unsigned long * ) 0xe000e014 ) ) -#define portNVIC_SYSTICK_CURRENT_VALUE_REG ( * ( ( volatile unsigned long * ) 0xe000e018 ) ) -#define portNVIC_INT_CTRL_REG ( * ( ( volatile unsigned long * ) 0xe000ed04 ) ) -#define portNVIC_SYSPRI2_REG ( * ( ( volatile unsigned long * ) 0xe000ed20 ) ) +#define portNVIC_SYSTICK_CTRL_REG ( * ( ( volatile uint32_t * ) 0xe000e010 ) ) +#define portNVIC_SYSTICK_LOAD_REG ( * ( ( volatile uint32_t * ) 0xe000e014 ) ) +#define portNVIC_SYSTICK_CURRENT_VALUE_REG ( * ( ( volatile uint32_t * ) 0xe000e018 ) ) +#define portNVIC_SYSPRI2_REG ( * ( ( volatile uint32_t * ) 0xe000ed20 ) ) /* ...then bits in the registers. */ -#define portNVIC_SYSTICK_CLK_BIT ( 1UL << 2UL ) #define portNVIC_SYSTICK_INT_BIT ( 1UL << 1UL ) #define portNVIC_SYSTICK_ENABLE_BIT ( 1UL << 0UL ) #define portNVIC_SYSTICK_COUNT_FLAG_BIT ( 1UL << 16UL ) -#define portNVIC_PENDSVSET_BIT ( 1UL << 28UL ) #define portNVIC_PENDSVCLEAR_BIT ( 1UL << 27UL ) #define portNVIC_PEND_SYSTICK_CLEAR_BIT ( 1UL << 25UL ) -#define portNVIC_PENDSV_PRI ( ( ( unsigned long ) configKERNEL_INTERRUPT_PRIORITY ) << 16UL ) -#define portNVIC_SYSTICK_PRI ( ( ( unsigned long ) configKERNEL_INTERRUPT_PRIORITY ) << 24UL ) +/* Constants used to detect a Cortex-M7 r0p1 core, which should use the ARM_CM7 +r0p1 port. */ +#define portCPUID ( * ( ( volatile uint32_t * ) 0xE000ed00 ) ) +#define portCORTEX_M7_r0p1_ID ( 0x410FC271UL ) +#define portCORTEX_M7_r0p0_ID ( 0x410FC270UL ) + +#define portNVIC_PENDSV_PRI ( ( ( uint32_t ) configKERNEL_INTERRUPT_PRIORITY ) << 16UL ) +#define portNVIC_SYSTICK_PRI ( ( ( uint32_t ) configKERNEL_INTERRUPT_PRIORITY ) << 24UL ) + +/* Constants required to check the validity of an interrupt priority. */ +#define portFIRST_USER_INTERRUPT_NUMBER ( 16 ) +#define portNVIC_IP_REGISTERS_OFFSET_16 ( 0xE000E3F0 ) +#define portAIRCR_REG ( * ( ( volatile uint32_t * ) 0xE000ED0C ) ) +#define portMAX_8_BIT_VALUE ( ( uint8_t ) 0xff ) +#define portTOP_BIT_OF_BYTE ( ( uint8_t ) 0x80 ) +#define portMAX_PRIGROUP_BITS ( ( uint8_t ) 7 ) +#define portPRIORITY_GROUP_MASK ( 0x07UL << 8UL ) +#define portPRIGROUP_SHIFT ( 8UL ) + +/* Masks off all bits but the VECTACTIVE bits in the ICSR register. */ +#define portVECTACTIVE_MASK ( 0xFFUL ) /* Constants required to manipulate the VFP. */ -#define portFPCCR ( ( volatile unsigned long * ) 0xe000ef34 ) /* Floating point context control register. */ -#define portASPEN_AND_LSPEN_BITS ( 0x3UL << 30UL ) +#define portFPCCR ( ( volatile uint32_t * ) 0xe000ef34 ) /* Floating point context control register. */ +#define portASPEN_AND_LSPEN_BITS ( 0x3UL << 30UL ) /* Constants required to set up the initial stack. */ -#define portINITIAL_XPSR ( 0x01000000 ) -#define portINITIAL_EXEC_RETURN ( 0xfffffffd ) - -/* 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; +#define portINITIAL_XPSR ( 0x01000000 ) +#define portINITIAL_EXEC_RETURN ( 0xfffffffd ) + +/* The systick is a 24-bit counter. */ +#define portMAX_24_BIT_NUMBER ( 0xffffffUL ) + +/* A fiddle factor to estimate the number of SysTick counts that would have +occurred while the SysTick counter is stopped during tickless idle +calculations. */ +#define portMISSED_COUNTS_FACTOR ( 45UL ) + +/* Let the user override the pre-loading of the initial LR with the address of +prvTaskExitError() in case it messes up unwinding of the stack in the +debugger. */ +#ifdef configTASK_RETURN_ADDRESS + #define portTASK_RETURN_ADDRESS configTASK_RETURN_ADDRESS +#else + #define portTASK_RETURN_ADDRESS prvTaskExitError +#endif /* Each task maintains its own interrupt status in the critical nesting variable. */ -static unsigned portBASE_TYPE uxCriticalNesting = 0xaaaaaaaa; +static UBaseType_t uxCriticalNesting = 0xaaaaaaaa; /* * Setup the timer to generate the tick interrupts. The implementation in this @@ -146,21 +176,26 @@ static void prvPortStartFirstTask( void ) __attribute__ (( naked )); */ static void vPortEnableVFP( void ) __attribute__ (( naked )); +/* + * Used to catch tasks that attempt to return from their implementing function. + */ +static void prvTaskExitError( void ); + /*-----------------------------------------------------------*/ /* * The number of SysTick increments that make up one tick period. */ #if configUSE_TICKLESS_IDLE == 1 - static unsigned long ulTimerReloadValueForOneTick = 0; -#endif + static uint32_t ulTimerCountsForOneTick = 0; +#endif /* configUSE_TICKLESS_IDLE */ /* * The maximum number of tick periods that can be suppressed is limited by the * 24 bit resolution of the SysTick timer. */ #if configUSE_TICKLESS_IDLE == 1 - static unsigned long xMaximumPossibleSuppressedTicks = 0; + static uint32_t xMaximumPossibleSuppressedTicks = 0; #endif /* configUSE_TICKLESS_IDLE */ /* @@ -168,15 +203,26 @@ static void prvPortStartFirstTask( void ) __attribute__ (( naked )); * power functionality only. */ #if configUSE_TICKLESS_IDLE == 1 - static unsigned long ulStoppedTimerCompensation = 0; + static uint32_t ulStoppedTimerCompensation = 0; #endif /* configUSE_TICKLESS_IDLE */ +/* + * Used by the portASSERT_IF_INTERRUPT_PRIORITY_INVALID() macro to ensure + * FreeRTOS API functions are not called from interrupts that have been assigned + * a priority above configMAX_SYSCALL_INTERRUPT_PRIORITY. + */ +#if ( configASSERT_DEFINED == 1 ) + static uint8_t ucMaxSysCallPriority = 0; + static uint32_t ulMaxPRIGROUPValue = 0; + static const volatile uint8_t * const pcInterruptPriorityRegisters = ( const volatile uint8_t * const ) portNVIC_IP_REGISTERS_OFFSET_16; +#endif /* configASSERT_DEFINED */ + /*-----------------------------------------------------------*/ /* * See header file for description. */ -portSTACK_TYPE *pxPortInitialiseStack( portSTACK_TYPE *pxTopOfStack, pdTASK_CODE pxCode, void *pvParameters ) +StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters ) { /* Simulate the stack frame as it would be created by a context switch interrupt. */ @@ -187,13 +233,13 @@ portSTACK_TYPE *pxPortInitialiseStack( portSTACK_TYPE *pxTopOfStack, pdTASK_CODE *pxTopOfStack = portINITIAL_XPSR; /* xPSR */ pxTopOfStack--; - *pxTopOfStack = ( portSTACK_TYPE ) pxCode; /* PC */ + *pxTopOfStack = ( StackType_t ) pxCode; /* PC */ pxTopOfStack--; - *pxTopOfStack = 0; /* LR */ + *pxTopOfStack = ( StackType_t ) portTASK_RETURN_ADDRESS; /* LR */ /* Save code space by skipping register initialisation. */ pxTopOfStack -= 5; /* R12, R3, R2 and R1. */ - *pxTopOfStack = ( portSTACK_TYPE ) pvParameters; /* R0 */ + *pxTopOfStack = ( StackType_t ) pvParameters; /* R0 */ /* A save method is being used that requires each task to maintain its own exec return value. */ @@ -206,6 +252,20 @@ portSTACK_TYPE *pxPortInitialiseStack( portSTACK_TYPE *pxTopOfStack, pdTASK_CODE } /*-----------------------------------------------------------*/ +static void prvTaskExitError( void ) +{ + /* A function that implements a task must not exit or attempt to return to + its caller as there is nothing to return to. If a task wants to exit it + should instead call vTaskDelete( NULL ). + + Artificially force an assert() to be triggered if configASSERT() is + defined, then stop here so application writers can catch the error. */ + configASSERT( uxCriticalNesting == ~0UL ); + portDISABLE_INTERRUPTS(); + for( ;; ); +} +/*-----------------------------------------------------------*/ + void vPortSVCHandler( void ) { __asm volatile ( @@ -214,6 +274,7 @@ void vPortSVCHandler( void ) " ldr r0, [r1] \n" /* The first item in pxCurrentTCB is the task top of stack. */ " ldmia r0!, {r4-r11, r14} \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. */ + " isb \n" " mov r0, #0 \n" " msr basepri, r0 \n" " bx r14 \n" @@ -232,6 +293,9 @@ static void prvPortStartFirstTask( void ) " ldr r0, [r0] \n" " msr msp, r0 \n" /* Set the msp back to the start of the stack. */ " cpsie i \n" /* Globally enable interrupts. */ + " cpsie f \n" + " dsb \n" + " isb \n" " svc 0 \n" /* System call to start first task. */ " nop \n" ); @@ -241,13 +305,63 @@ static void prvPortStartFirstTask( void ) /* * See header file for description. */ -portBASE_TYPE xPortStartScheduler( void ) +BaseType_t xPortStartScheduler( void ) { /* configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to 0. See http://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html */ configASSERT( configMAX_SYSCALL_INTERRUPT_PRIORITY ); - /* Make PendSV, CallSV and SysTick the same priroity as the kernel. */ + /* This port can be used on all revisions of the Cortex-M7 core other than + the r0p1 parts. r0p1 parts should use the port from the + /source/portable/GCC/ARM_CM7/r0p1 directory. */ + configASSERT( portCPUID != portCORTEX_M7_r0p1_ID ); + configASSERT( portCPUID != portCORTEX_M7_r0p0_ID ); + + #if( configASSERT_DEFINED == 1 ) + { + volatile uint32_t ulOriginalPriority; + volatile uint8_t * const pucFirstUserPriorityRegister = ( volatile uint8_t * const ) ( portNVIC_IP_REGISTERS_OFFSET_16 + portFIRST_USER_INTERRUPT_NUMBER ); + volatile uint8_t ucMaxPriorityValue; + + /* Determine the maximum priority from which ISR safe FreeRTOS API + functions can be called. ISR safe functions are those that end in + "FromISR". FreeRTOS maintains separate thread and ISR API functions to + ensure interrupt entry is as fast and simple as possible. + + Save the interrupt priority value that is about to be clobbered. */ + ulOriginalPriority = *pucFirstUserPriorityRegister; + + /* Determine the number of priority bits available. First write to all + possible bits. */ + *pucFirstUserPriorityRegister = portMAX_8_BIT_VALUE; + + /* Read the value back to see how many bits stuck. */ + ucMaxPriorityValue = *pucFirstUserPriorityRegister; + + /* Use the same mask on the maximum system call priority. */ + ucMaxSysCallPriority = configMAX_SYSCALL_INTERRUPT_PRIORITY & ucMaxPriorityValue; + + /* Calculate the maximum acceptable priority group value for the number + of bits read back. */ + ulMaxPRIGROUPValue = portMAX_PRIGROUP_BITS; + while( ( ucMaxPriorityValue & portTOP_BIT_OF_BYTE ) == portTOP_BIT_OF_BYTE ) + { + ulMaxPRIGROUPValue--; + ucMaxPriorityValue <<= ( uint8_t ) 0x01; + } + + /* Shift the priority group value back to its position within the AIRCR + register. */ + ulMaxPRIGROUPValue <<= portPRIGROUP_SHIFT; + ulMaxPRIGROUPValue &= portPRIORITY_GROUP_MASK; + + /* Restore the clobbered interrupt priority register to its original + value. */ + *pucFirstUserPriorityRegister = ulOriginalPriority; + } + #endif /* conifgASSERT_DEFINED */ + + /* Make PendSV and SysTick the lowest priority interrupts. */ portNVIC_SYSPRI2_REG |= portNVIC_PENDSV_PRI; portNVIC_SYSPRI2_REG |= portNVIC_SYSTICK_PRI; @@ -267,6 +381,12 @@ portBASE_TYPE xPortStartScheduler( void ) /* Start the first task. */ prvPortStartFirstTask(); + /* Should never get here as the tasks will now be executing! Call the task + exit error function to prevent compiler warnings about a static function + not being called in the case that the application writer overrides this + functionality by defining configTASK_RETURN_ADDRESS. */ + prvTaskExitError(); + /* Should not get here! */ return 0; } @@ -274,15 +394,9 @@ portBASE_TYPE xPortStartScheduler( void ) void vPortEndScheduler( void ) { - /* It is unlikely that the CM4F 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_REG = portNVIC_PENDSVSET_BIT; + /* Not implemented in ports where there is nothing to return to. + Artificially force an assert. */ + configASSERT( uxCriticalNesting == 1000UL ); } /*-----------------------------------------------------------*/ @@ -290,11 +404,22 @@ void vPortEnterCritical( void ) { portDISABLE_INTERRUPTS(); uxCriticalNesting++; + + /* This is not the interrupt safe version of the enter critical function so + assert() if it is being called from an interrupt context. Only API + functions that end in "FromISR" can be used in an interrupt. Only assert if + the critical nesting count is 1 to protect against recursive calls if the + assert function also uses a critical section. */ + if( uxCriticalNesting == 1 ) + { + configASSERT( ( portNVIC_INT_CTRL_REG & portVECTACTIVE_MASK ) == 0 ); + } } /*-----------------------------------------------------------*/ void vPortExitCritical( void ) { + configASSERT( uxCriticalNesting ); uxCriticalNesting--; if( uxCriticalNesting == 0 ) { @@ -303,37 +428,6 @@ void vPortExitCritical( void ) } /*-----------------------------------------------------------*/ -__attribute__(( naked )) unsigned long ulPortSetInterruptMask( void ) -{ - __asm volatile \ - ( \ - " mrs r0, basepri \n" \ - " mov r1, %0 \n" \ - " msr basepri, r1 \n" \ - " bx lr \n" \ - :: "i" ( configMAX_SYSCALL_INTERRUPT_PRIORITY ) : "r0", "r1" \ - ); - - /* This return will not be reached but is necessary to prevent compiler - warnings. */ - return 0; -} -/*-----------------------------------------------------------*/ - -__attribute__(( naked )) void vPortClearInterruptMask( unsigned long ulNewMaskValue ) -{ - __asm volatile \ - ( \ - " msr basepri, r0 \n" \ - " bx lr \n" \ - :::"r0" \ - ); - - /* Just to avoid compiler warnings. */ - ( void ) ulNewMaskValue; -} -/*-----------------------------------------------------------*/ - void xPortPendSVHandler( void ) { /* This is a naked function. */ @@ -341,8 +435,9 @@ void xPortPendSVHandler( void ) __asm volatile ( " mrs r0, psp \n" + " isb \n" " \n" - " ldr r3, pxCurrentTCBConst \n" /* Get the location of the current TCB. */ + " ldr r3, pxCurrentTCBConst \n" /* Get the location of the current TCB. */ " ldr r2, [r3] \n" " \n" " tst r14, #0x10 \n" /* Is the task using the FPU context? If so, push high vfp registers. */ @@ -353,13 +448,15 @@ void xPortPendSVHandler( void ) " \n" " str r0, [r2] \n" /* Save the new top of stack into the first member of the TCB. */ " \n" - " stmdb sp!, {r3, r14} \n" + " stmdb sp!, {r3} \n" " mov r0, %0 \n" " msr basepri, r0 \n" + " dsb \n" + " isb \n" " bl vTaskSwitchContext \n" " mov r0, #0 \n" " msr basepri, r0 \n" - " ldmia sp!, {r3, r14} \n" + " ldmia sp!, {r3} \n" " \n" " ldr r1, [r3] \n" /* The first item in pxCurrentTCB is the task top of stack. */ " ldr r0, [r1] \n" @@ -371,6 +468,15 @@ void xPortPendSVHandler( void ) " vldmiaeq r0!, {s16-s31} \n" " \n" " msr psp, r0 \n" + " isb \n" + " \n" + #ifdef WORKAROUND_PMU_CM001 /* XMC4000 specific errata workaround. */ + #if WORKAROUND_PMU_CM001 == 1 + " push { r14 } \n" + " pop { pc } \n" + #endif + #endif + " \n" " bx r14 \n" " \n" " .align 2 \n" @@ -382,22 +488,19 @@ void xPortPendSVHandler( void ) void xPortSysTickHandler( void ) { - /* If using preemption, also force a context switch. */ - #if configUSE_PREEMPTION == 1 - portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; - #endif - - /* Only reset the systick load register if configUSE_TICKLESS_IDLE is set to - 1. If it is set to 0 tickless idle is not being used. If it is set to a - value other than 0 or 1 then a timer other than the SysTick is being used - to generate the tick interrupt. */ - #if configUSE_TICKLESS_IDLE == 1 - portNVIC_SYSTICK_LOAD_REG = ulTimerReloadValueForOneTick; - #endif - + /* The SysTick runs at the lowest interrupt priority, so when this interrupt + executes all interrupts must be unmasked. There is therefore no need to + save and then restore the interrupt mask value as its value is already + known. */ ( void ) portSET_INTERRUPT_MASK_FROM_ISR(); { - vTaskIncrementTick(); + /* Increment the RTOS tick. */ + if( xTaskIncrementTick() != pdFALSE ) + { + /* A context switch is required. Context switching is performed in + the PendSV interrupt. Pend the PendSV interrupt. */ + portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; + } } portCLEAR_INTERRUPT_MASK_FROM_ISR( 0 ); } @@ -405,10 +508,10 @@ void xPortSysTickHandler( void ) #if configUSE_TICKLESS_IDLE == 1 - __attribute__((weak)) void vPortSuppressTicksAndSleep( portTickType xExpectedIdleTime ) + __attribute__((weak)) void vPortSuppressTicksAndSleep( TickType_t xExpectedIdleTime ) { - unsigned long ulReloadValue, ulCompleteTickPeriods, ulCompletedSysTickIncrements; - portTickType xModifiableIdleTime; + uint32_t ulReloadValue, ulCompleteTickPeriods, ulCompletedSysTickDecrements, ulSysTickCTRL; + TickType_t xModifiableIdleTime; /* Make sure the SysTick reload value does not overflow the counter. */ if( xExpectedIdleTime > xMaximumPossibleSuppressedTicks ) @@ -416,26 +519,21 @@ void xPortSysTickHandler( void ) xExpectedIdleTime = xMaximumPossibleSuppressedTicks; } + /* Stop the SysTick momentarily. The time the SysTick is stopped for + is accounted for as best it can be, but using the tickless mode will + inevitably result in some tiny drift of the time maintained by the + kernel with respect to calendar time. */ + portNVIC_SYSTICK_CTRL_REG &= ~portNVIC_SYSTICK_ENABLE_BIT; + /* Calculate the reload value required to wait xExpectedIdleTime tick periods. -1 is used because this code will execute part way - through one of the tick periods, and the fraction of a tick period is - accounted for later. */ - ulReloadValue = ( ulTimerReloadValueForOneTick * ( xExpectedIdleTime - 1UL ) ); + through one of the tick periods. */ + ulReloadValue = portNVIC_SYSTICK_CURRENT_VALUE_REG + ( ulTimerCountsForOneTick * ( xExpectedIdleTime - 1UL ) ); if( ulReloadValue > ulStoppedTimerCompensation ) { ulReloadValue -= ulStoppedTimerCompensation; } - /* Stop the SysTick momentarily. The time the SysTick is stopped for - is accounted for as best it can be, but using the tickless mode will - inevitably result in some tiny drift of the time maintained by the - kernel with respect to calendar time. */ - portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT; - - /* Adjust the reload value to take into account that the current time - slice is already partially complete. */ - ulReloadValue += ( portNVIC_SYSTICK_LOAD_REG - ( portNVIC_SYSTICK_LOAD_REG - portNVIC_SYSTICK_CURRENT_VALUE_REG ) ); - /* Enter a critical section but don't use the taskENTER_CRITICAL() method as that will mask interrupts that should exit sleep mode. */ __asm volatile( "cpsid i" ); @@ -444,8 +542,16 @@ void xPortSysTickHandler( void ) to be unsuspended then abandon the low power entry. */ if( eTaskConfirmSleepModeStatus() == eAbortSleep ) { + /* Restart from whatever is left in the count register to complete + this tick period. */ + portNVIC_SYSTICK_LOAD_REG = portNVIC_SYSTICK_CURRENT_VALUE_REG; + /* Restart SysTick. */ - portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT; + portNVIC_SYSTICK_CTRL_REG |= portNVIC_SYSTICK_ENABLE_BIT; + + /* Reset the reload register to the value required for normal tick + periods. */ + portNVIC_SYSTICK_LOAD_REG = ulTimerCountsForOneTick - 1UL; /* Re-enable interrupts - see comments above the cpsid instruction() above. */ @@ -461,7 +567,7 @@ void xPortSysTickHandler( void ) portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL; /* Restart SysTick. */ - portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT; + portNVIC_SYSTICK_CTRL_REG |= portNVIC_SYSTICK_ENABLE_BIT; /* Sleep until something happens. configPRE_SLEEP_PROCESSING() can set its parameter to 0 to indicate that its implementation contains @@ -472,7 +578,9 @@ void xPortSysTickHandler( void ) configPRE_SLEEP_PROCESSING( xModifiableIdleTime ); if( xModifiableIdleTime > 0 ) { + __asm volatile( "dsb" ); __asm volatile( "wfi" ); + __asm volatile( "isb" ); } configPOST_SLEEP_PROCESSING( xExpectedIdleTime ); @@ -480,19 +588,32 @@ void xPortSysTickHandler( void ) accounted for as best it can be, but using the tickless mode will inevitably result in some tiny drift of the time maintained by the kernel with respect to calendar time. */ - portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT; + ulSysTickCTRL = portNVIC_SYSTICK_CTRL_REG; + portNVIC_SYSTICK_CTRL_REG = ( ulSysTickCTRL & ~portNVIC_SYSTICK_ENABLE_BIT ); /* Re-enable interrupts - see comments above the cpsid instruction() above. */ __asm volatile( "cpsie i" ); - if( ( portNVIC_SYSTICK_CTRL_REG & portNVIC_SYSTICK_COUNT_FLAG_BIT ) != 0 ) + if( ( ulSysTickCTRL & portNVIC_SYSTICK_COUNT_FLAG_BIT ) != 0 ) { + uint32_t ulCalculatedLoadValue; + /* The tick interrupt has already executed, and the SysTick - count reloaded with the portNVIC_SYSTICK_LOAD_REG value. - Reset the portNVIC_SYSTICK_LOAD_REG with whatever remains of - this tick period. */ - portNVIC_SYSTICK_LOAD_REG = ulTimerReloadValueForOneTick - ( ulReloadValue - portNVIC_SYSTICK_CURRENT_VALUE_REG ); + count reloaded with ulReloadValue. Reset the + portNVIC_SYSTICK_LOAD_REG with whatever remains of this tick + period. */ + ulCalculatedLoadValue = ( ulTimerCountsForOneTick - 1UL ) - ( ulReloadValue - portNVIC_SYSTICK_CURRENT_VALUE_REG ); + + /* Don't allow a tiny value, or values that have somehow + underflowed because the post sleep hook did something + that took too long. */ + if( ( ulCalculatedLoadValue < ulStoppedTimerCompensation ) || ( ulCalculatedLoadValue > ulTimerCountsForOneTick ) ) + { + ulCalculatedLoadValue = ( ulTimerCountsForOneTick - 1UL ); + } + + portNVIC_SYSTICK_LOAD_REG = ulCalculatedLoadValue; /* The tick interrupt handler will already have pended the tick processing in the kernel. As the pending tick will be @@ -504,25 +625,33 @@ void xPortSysTickHandler( void ) else { /* Something other than the tick interrupt ended the sleep. - Work out how long the sleep lasted. */ - ulCompletedSysTickIncrements = ( xExpectedIdleTime * ulTimerReloadValueForOneTick ) - portNVIC_SYSTICK_CURRENT_VALUE_REG; + Work out how long the sleep lasted rounded to complete tick + periods (not the ulReload value which accounted for part + ticks). */ + ulCompletedSysTickDecrements = ( xExpectedIdleTime * ulTimerCountsForOneTick ) - portNVIC_SYSTICK_CURRENT_VALUE_REG; /* How many complete tick periods passed while the processor was waiting? */ - ulCompleteTickPeriods = ulCompletedSysTickIncrements / ulTimerReloadValueForOneTick; + ulCompleteTickPeriods = ulCompletedSysTickDecrements / ulTimerCountsForOneTick; /* The reload value is set to whatever fraction of a single tick period remains. */ - portNVIC_SYSTICK_LOAD_REG = ( ( ulCompleteTickPeriods + 1 ) * ulTimerReloadValueForOneTick ) - ulCompletedSysTickIncrements; + portNVIC_SYSTICK_LOAD_REG = ( ( ulCompleteTickPeriods + 1 ) * ulTimerCountsForOneTick ) - ulCompletedSysTickDecrements; } /* Restart SysTick so it runs from portNVIC_SYSTICK_LOAD_REG again, then set portNVIC_SYSTICK_LOAD_REG back to its standard - value. */ + value. The critical section is used to ensure the tick interrupt + can only execute once in the case that the reload register is near + zero. */ portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL; - portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT; - - vTaskStepTick( ulCompleteTickPeriods ); + portENTER_CRITICAL(); + { + portNVIC_SYSTICK_CTRL_REG |= portNVIC_SYSTICK_ENABLE_BIT; + vTaskStepTick( ulCompleteTickPeriods ); + portNVIC_SYSTICK_LOAD_REG = ulTimerCountsForOneTick - 1UL; + } + portEXIT_CRITICAL(); } } @@ -538,15 +667,15 @@ __attribute__(( weak )) void vPortSetupTimerInterrupt( void ) /* Calculate the constants required to configure the tick interrupt. */ #if configUSE_TICKLESS_IDLE == 1 { - ulTimerReloadValueForOneTick = ( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ ) - 1UL; - xMaximumPossibleSuppressedTicks = 0xffffffUL / ( ( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ ) - 1UL ); - ulStoppedTimerCompensation = 45UL / ( configCPU_CLOCK_HZ / configSYSTICK_CLOCK_HZ ); + ulTimerCountsForOneTick = ( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ ); + xMaximumPossibleSuppressedTicks = portMAX_24_BIT_NUMBER / ulTimerCountsForOneTick; + ulStoppedTimerCompensation = portMISSED_COUNTS_FACTOR / ( configCPU_CLOCK_HZ / configSYSTICK_CLOCK_HZ ); } #endif /* configUSE_TICKLESS_IDLE */ /* Configure SysTick to interrupt at the requested rate. */ - portNVIC_SYSTICK_LOAD_REG = ( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ ) - 1UL;; - portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT; + portNVIC_SYSTICK_LOAD_REG = ( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ ) - 1UL; + portNVIC_SYSTICK_CTRL_REG = ( portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT ); } /*-----------------------------------------------------------*/ @@ -563,4 +692,66 @@ static void vPortEnableVFP( void ) " bx r14 " ); } +/*-----------------------------------------------------------*/ + +#if( configASSERT_DEFINED == 1 ) + + void vPortValidateInterruptPriority( void ) + { + uint32_t ulCurrentInterrupt; + uint8_t ucCurrentPriority; + + /* Obtain the number of the currently executing interrupt. */ + __asm volatile( "mrs %0, ipsr" : "=r"( ulCurrentInterrupt ) ); + + /* Is the interrupt number a user defined interrupt? */ + if( ulCurrentInterrupt >= portFIRST_USER_INTERRUPT_NUMBER ) + { + /* Look up the interrupt's priority. */ + ucCurrentPriority = pcInterruptPriorityRegisters[ ulCurrentInterrupt ]; + + /* The following assertion will fail if a service routine (ISR) for + an interrupt that has been assigned a priority above + configMAX_SYSCALL_INTERRUPT_PRIORITY calls an ISR safe FreeRTOS API + function. ISR safe FreeRTOS API functions must *only* be called + from interrupts that have been assigned a priority at or below + configMAX_SYSCALL_INTERRUPT_PRIORITY. + + Numerically low interrupt priority numbers represent logically high + interrupt priorities, therefore the priority of the interrupt must + be set to a value equal to or numerically *higher* than + configMAX_SYSCALL_INTERRUPT_PRIORITY. + + Interrupts that use the FreeRTOS API must not be left at their + default priority of zero as that is the highest possible priority, + which is guaranteed to be above configMAX_SYSCALL_INTERRUPT_PRIORITY, + and therefore also guaranteed to be invalid. + + FreeRTOS maintains separate thread and ISR API functions to ensure + interrupt entry is as fast and simple as possible. + + The following links provide detailed information: + http://www.freertos.org/RTOS-Cortex-M3-M4.html + http://www.freertos.org/FAQHelp.html */ + configASSERT( ucCurrentPriority >= ucMaxSysCallPriority ); + } + + /* Priority grouping: The interrupt controller (NVIC) allows the bits + that define each interrupt's priority to be split between bits that + define the interrupt's pre-emption priority bits and bits that define + the interrupt's sub-priority. For simplicity all bits must be defined + to be pre-emption priority bits. The following assertion will fail if + this is not the case (if some bits represent a sub-priority). + + If the application only uses CMSIS libraries for interrupt + configuration then the correct setting can be achieved on all Cortex-M + devices by calling NVIC_SetPriorityGrouping( 0 ); before starting the + scheduler. Note however that some vendor specific peripheral libraries + assume a non-zero priority group setting, in which cases using a value + of zero will result in unpredicable behaviour. */ + configASSERT( ( portAIRCR_REG & portPRIORITY_GROUP_MASK ) <= ulMaxPRIGROUPValue ); + } + +#endif /* configASSERT_DEFINED */ + diff --git a/lib/FreeRTOS/portable/GCC/ARM_CM4F/portmacro.h b/lib/FreeRTOS/portable/GCC/ARM_CM4F/portmacro.h index e99354d6f0..073e408abb 100644 --- a/lib/FreeRTOS/portable/GCC/ARM_CM4F/portmacro.h +++ b/lib/FreeRTOS/portable/GCC/ARM_CM4F/portmacro.h @@ -1,75 +1,70 @@ /* - FreeRTOS V7.4.0 - Copyright (C) 2013 Real Time Engineers Ltd. - - FEATURES AND PORTS ARE ADDED TO FREERTOS ALL THE TIME. PLEASE VISIT - http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. - - *************************************************************************** - * * - * 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! * - * * - *************************************************************************** + FreeRTOS V8.2.3 - Copyright (C) 2015 Real Time Engineers Ltd. + All rights reserved + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. This file is part of the FreeRTOS distribution. FreeRTOS is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License (version 2) as published by the - Free Software Foundation AND MODIFIED BY the FreeRTOS exception. + 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. + *************************************************************************** + >>! 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 itcan be - viewed here: http://www.freertos.org/a00114.html and also obtained by - writing to Real Time Engineers Ltd., contact details for whom are available - on the FreeRTOS WEB site. - - 1 tab == 4 spaces! + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html *************************************************************************** * * - * Having a problem? Start by reading the FAQ "My application does * - * not run, what could be wrong?" * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * * * - * http://www.FreeRTOS.org/FAQHelp.html * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * * * *************************************************************************** + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. - http://www.FreeRTOS.org - Documentation, books, training, latest versions, - license and Real Time Engineers Ltd. contact details. + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, - including FreeRTOS+Trace - an indispensable productivity tool, and our new - fully thread aware and reentrant UDP/IP stack. - - http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High - Integrity Systems, who sell the code with commercial support, - indemnification and middleware, under the OpenRTOS brand. - - http://www.SafeRTOS.com - High Integrity Systems also provide a safety - engineered and independently SIL3 certified version for use in safety and + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and mission critical applications that require provable dependability. + + 1 tab == 4 spaces! */ @@ -81,7 +76,7 @@ extern "C" { #endif /*----------------------------------------------------------- - * Port specific definitions. + * Port specific definitions. * * The settings in this file configure FreeRTOS correctly for the * given hardware and compiler. @@ -96,47 +91,60 @@ extern "C" { #define portDOUBLE double #define portLONG long #define portSHORT short -#define portSTACK_TYPE unsigned portLONG +#define portSTACK_TYPE uint32_t #define portBASE_TYPE long +typedef portSTACK_TYPE StackType_t; +typedef long BaseType_t; +typedef unsigned long UBaseType_t; + #if( configUSE_16_BIT_TICKS == 1 ) - typedef unsigned portSHORT portTickType; - #define portMAX_DELAY ( portTickType ) 0xffff + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff #else - typedef unsigned portLONG portTickType; - #define portMAX_DELAY ( portTickType ) 0xffffffff + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL + + /* 32-bit tick type on a 32-bit architecture, so reads of the tick count do + not need to be guarded with a critical section. */ + #define portTICK_TYPE_IS_ATOMIC 1 #endif -/*-----------------------------------------------------------*/ +/*-----------------------------------------------------------*/ /* Architecture specifics. */ #define portSTACK_GROWTH ( -1 ) -#define portTICK_RATE_MS ( ( portTickType ) 1000 / configTICK_RATE_HZ ) +#define portTICK_PERIOD_MS ( ( TickType_t ) 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() +#define portYIELD() \ +{ \ + /* Set a PendSV to request a context switch. */ \ + portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; \ + \ + /* Barriers are normally not required but do ensure the code is completely \ + within the specified behaviour for the architecture. */ \ + __asm volatile( "dsb" ); \ + __asm volatile( "isb" ); \ +} + +#define portNVIC_INT_CTRL_REG ( * ( ( volatile uint32_t * ) 0xe000ed04 ) ) +#define portNVIC_PENDSVSET_BIT ( 1UL << 28UL ) +#define portEND_SWITCHING_ISR( xSwitchRequired ) if( xSwitchRequired != pdFALSE ) portYIELD() +#define portYIELD_FROM_ISR( x ) portEND_SWITCHING_ISR( x ) /*-----------------------------------------------------------*/ /* Critical section management. */ extern void vPortEnterCritical( void ); extern void vPortExitCritical( void ); -extern unsigned long ulPortSetInterruptMask( void ); -extern void vPortClearInterruptMask( unsigned long ulNewMaskValue ); -#define portSET_INTERRUPT_MASK_FROM_ISR() ulPortSetInterruptMask() -#define portCLEAR_INTERRUPT_MASK_FROM_ISR(x) vPortClearInterruptMask(x) -#define portDISABLE_INTERRUPTS() ulPortSetInterruptMask() -#define portENABLE_INTERRUPTS() vPortClearInterruptMask(0) +#define portSET_INTERRUPT_MASK_FROM_ISR() ulPortRaiseBASEPRI() +#define portCLEAR_INTERRUPT_MASK_FROM_ISR(x) vPortSetBASEPRI(x) +#define portDISABLE_INTERRUPTS() vPortRaiseBASEPRI() +#define portENABLE_INTERRUPTS() vPortSetBASEPRI(0) #define portENTER_CRITICAL() vPortEnterCritical() #define portEXIT_CRITICAL() vPortExitCritical() -/* There are an uneven number of items on the initial stack, so -portALIGNMENT_ASSERT_pxCurrentTCB() will trigger false positive asserts. */ -#define portALIGNMENT_ASSERT_pxCurrentTCB ( void ) - /*-----------------------------------------------------------*/ /* Task function macros as described on the FreeRTOS.org WEB site. These are @@ -148,18 +156,22 @@ not necessary for to use this port. They are defined so the common demo files /* Tickless idle/low power functionality. */ #ifndef portSUPPRESS_TICKS_AND_SLEEP - extern void vPortSuppressTicksAndSleep( portTickType xExpectedIdleTime ); + extern void vPortSuppressTicksAndSleep( TickType_t xExpectedIdleTime ); #define portSUPPRESS_TICKS_AND_SLEEP( xExpectedIdleTime ) vPortSuppressTicksAndSleep( xExpectedIdleTime ) #endif /*-----------------------------------------------------------*/ /* Architecture specific optimisations. */ +#ifndef configUSE_PORT_OPTIMISED_TASK_SELECTION + #define configUSE_PORT_OPTIMISED_TASK_SELECTION 1 +#endif + #if configUSE_PORT_OPTIMISED_TASK_SELECTION == 1 /* Generic helper function. */ - __attribute__( ( always_inline ) ) static inline unsigned char ucPortCountLeadingZeros( unsigned long ulBitmap ) + __attribute__( ( always_inline ) ) static inline uint8_t ucPortCountLeadingZeros( uint32_t ulBitmap ) { - unsigned char ucReturn; + uint8_t ucReturn; __asm volatile ( "clz %0, %1" : "=r" ( ucReturn ) : "r" ( ulBitmap ) ); return ucReturn; @@ -182,9 +194,66 @@ not necessary for to use this port. They are defined so the common demo files /*-----------------------------------------------------------*/ +#ifdef configASSERT + void vPortValidateInterruptPriority( void ); + #define portASSERT_IF_INTERRUPT_PRIORITY_INVALID() vPortValidateInterruptPriority() +#endif + /* portNOP() is not required by this port. */ #define portNOP() +#ifndef portFORCE_INLINE + #define portFORCE_INLINE inline __attribute__(( always_inline)) +#endif + +/*-----------------------------------------------------------*/ + +portFORCE_INLINE static void vPortRaiseBASEPRI( void ) +{ +uint32_t ulNewBASEPRI; + + __asm volatile + ( + " mov %0, %1 \n" \ + " msr basepri, %0 \n" \ + " isb \n" \ + " dsb \n" \ + :"=r" (ulNewBASEPRI) : "i" ( configMAX_SYSCALL_INTERRUPT_PRIORITY ) + ); +} + +/*-----------------------------------------------------------*/ + +portFORCE_INLINE static uint32_t ulPortRaiseBASEPRI( void ) +{ +uint32_t ulOriginalBASEPRI, ulNewBASEPRI; + + __asm volatile + ( + " mrs %0, basepri \n" \ + " mov %1, %2 \n" \ + " msr basepri, %1 \n" \ + " isb \n" \ + " dsb \n" \ + :"=r" (ulOriginalBASEPRI), "=r" (ulNewBASEPRI) : "i" ( configMAX_SYSCALL_INTERRUPT_PRIORITY ) + ); + + /* This return will not be reached but is necessary to prevent compiler + warnings. */ + return ulOriginalBASEPRI; +} +/*-----------------------------------------------------------*/ + +portFORCE_INLINE static void vPortSetBASEPRI( uint32_t ulNewMaskValue ) +{ + __asm volatile + ( + " msr basepri, %0 " :: "r" ( ulNewMaskValue ) + ); +} +/*-----------------------------------------------------------*/ + + #ifdef __cplusplus } #endif diff --git a/lib/FreeRTOS/portable/MemMang/heap_1.c b/lib/FreeRTOS/portable/MemMang/heap_1.c index 5577ef35c1..aeca28735c 100644 --- a/lib/FreeRTOS/portable/MemMang/heap_1.c +++ b/lib/FreeRTOS/portable/MemMang/heap_1.c @@ -1,75 +1,70 @@ /* - FreeRTOS V7.4.0 - Copyright (C) 2013 Real Time Engineers Ltd. - - FEATURES AND PORTS ARE ADDED TO FREERTOS ALL THE TIME. PLEASE VISIT - http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. - - *************************************************************************** - * * - * 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! * - * * - *************************************************************************** + FreeRTOS V8.2.3 - Copyright (C) 2015 Real Time Engineers Ltd. + All rights reserved + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. This file is part of the FreeRTOS distribution. FreeRTOS is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License (version 2) as published by the - Free Software Foundation AND MODIFIED BY the FreeRTOS exception. + 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. + *************************************************************************** + >>! 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 itcan be - viewed here: http://www.freertos.org/a00114.html and also obtained by - writing to Real Time Engineers Ltd., contact details for whom are available - on the FreeRTOS WEB site. - - 1 tab == 4 spaces! + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html *************************************************************************** * * - * Having a problem? Start by reading the FAQ "My application does * - * not run, what could be wrong?" * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * * * - * http://www.FreeRTOS.org/FAQHelp.html * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * * * *************************************************************************** + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? - http://www.FreeRTOS.org - Documentation, books, training, latest versions, - license and Real Time Engineers Ltd. contact details. + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, - including FreeRTOS+Trace - an indispensable productivity tool, and our new - fully thread aware and reentrant UDP/IP stack. - - http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High - Integrity Systems, who sell the code with commercial support, - indemnification and middleware, under the OpenRTOS brand. - - http://www.SafeRTOS.com - High Integrity Systems also provide a safety - engineered and independently SIL3 certified version for use in safety and + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and mission critical applications that require provable dependability. + + 1 tab == 4 spaces! */ @@ -96,7 +91,7 @@ task.h is included from an application file. */ #define configADJUSTED_HEAP_SIZE ( configTOTAL_HEAP_SIZE - portBYTE_ALIGNMENT ) /* Allocate the memory for the heap. */ -static unsigned char ucHeap[ configTOTAL_HEAP_SIZE ]; +static uint8_t ucHeap[ configTOTAL_HEAP_SIZE ]; static size_t xNextFreeByte = ( size_t ) 0; /*-----------------------------------------------------------*/ @@ -104,7 +99,7 @@ static size_t xNextFreeByte = ( size_t ) 0; void *pvPortMalloc( size_t xWantedSize ) { void *pvReturn = NULL; -static unsigned char *pucAlignedHeap = NULL; +static uint8_t *pucAlignedHeap = NULL; /* Ensure that blocks are always aligned to the required number of bytes. */ #if portBYTE_ALIGNMENT != 1 @@ -120,7 +115,7 @@ static unsigned char *pucAlignedHeap = NULL; if( pucAlignedHeap == NULL ) { /* Ensure the heap starts on a correctly aligned boundary. */ - pucAlignedHeap = ( unsigned char * ) ( ( ( portPOINTER_SIZE_TYPE ) &ucHeap[ portBYTE_ALIGNMENT ] ) & ( ( portPOINTER_SIZE_TYPE ) ~portBYTE_ALIGNMENT_MASK ) ); + pucAlignedHeap = ( uint8_t * ) ( ( ( portPOINTER_SIZE_TYPE ) &ucHeap[ portBYTE_ALIGNMENT ] ) & ( ~( ( portPOINTER_SIZE_TYPE ) portBYTE_ALIGNMENT_MASK ) ) ); } /* Check there is enough room left for the allocation. */ @@ -132,8 +127,10 @@ static unsigned char *pucAlignedHeap = NULL; pvReturn = pucAlignedHeap + xNextFreeByte; xNextFreeByte += xWantedSize; } + + traceMALLOC( pvReturn, xWantedSize ); } - xTaskResumeAll(); + ( void ) xTaskResumeAll(); #if( configUSE_MALLOC_FAILED_HOOK == 1 ) { diff --git a/lib/FreeRTOS/portable/MemMang/heap_2.c b/lib/FreeRTOS/portable/MemMang/heap_2.c index 749872e962..2e7aa19c83 100644 --- a/lib/FreeRTOS/portable/MemMang/heap_2.c +++ b/lib/FreeRTOS/portable/MemMang/heap_2.c @@ -1,82 +1,77 @@ /* - FreeRTOS V7.4.0 - Copyright (C) 2013 Real Time Engineers Ltd. - - FEATURES AND PORTS ARE ADDED TO FREERTOS ALL THE TIME. PLEASE VISIT - http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. - - *************************************************************************** - * * - * 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! * - * * - *************************************************************************** + FreeRTOS V8.2.3 - Copyright (C) 2015 Real Time Engineers Ltd. + All rights reserved + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. This file is part of the FreeRTOS distribution. FreeRTOS is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License (version 2) as published by the - Free Software Foundation AND MODIFIED BY the FreeRTOS exception. + 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. + *************************************************************************** + >>! 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 itcan be - viewed here: http://www.freertos.org/a00114.html and also obtained by - writing to Real Time Engineers Ltd., contact details for whom are available - on the FreeRTOS WEB site. - - 1 tab == 4 spaces! + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html *************************************************************************** * * - * Having a problem? Start by reading the FAQ "My application does * - * not run, what could be wrong?" * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * * * - * http://www.FreeRTOS.org/FAQHelp.html * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * * * *************************************************************************** + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. - http://www.FreeRTOS.org - Documentation, books, training, latest versions, - license and Real Time Engineers Ltd. contact details. + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, - including FreeRTOS+Trace - an indispensable productivity tool, and our new - fully thread aware and reentrant UDP/IP stack. - - http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High - Integrity Systems, who sell the code with commercial support, - indemnification and middleware, under the OpenRTOS brand. - - http://www.SafeRTOS.com - High Integrity Systems also provide a safety - engineered and independently SIL3 certified version for use in safety and + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and mission critical applications that require provable dependability. + + 1 tab == 4 spaces! */ /* * 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 (and so will fragment memory). See heap_4.c for - * an aquivalent that does combine adjacent blocks into single larger blocks. + * an equivalent that does combine adjacent blocks into single larger blocks. * * See heap_1.c, heap_3.c and heap_4.c for alternative implementations, and the * memory management pages of http://www.FreeRTOS.org for more information. @@ -96,13 +91,13 @@ task.h is included from an application file. */ /* A few bytes might be lost to byte aligning the heap start address. */ #define configADJUSTED_HEAP_SIZE ( configTOTAL_HEAP_SIZE - portBYTE_ALIGNMENT ) -/* +/* * Initialises the heap structures before their first use. */ static void prvHeapInit( void ); /* Allocate the memory for the heap. */ -static unsigned char ucHeap[ configTOTAL_HEAP_SIZE ]; +static uint8_t ucHeap[ configTOTAL_HEAP_SIZE ]; /* Define the linked list structure. This is used to link free blocks in order of their size. */ @@ -110,14 +105,14 @@ 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; +} BlockLink_t; -static const unsigned short heapSTRUCT_SIZE = ( sizeof( xBlockLink ) + portBYTE_ALIGNMENT - ( sizeof( xBlockLink ) % portBYTE_ALIGNMENT ) ); +static const uint16_t heapSTRUCT_SIZE = ( ( sizeof ( BlockLink_t ) + ( portBYTE_ALIGNMENT - 1 ) ) & ~portBYTE_ALIGNMENT_MASK ); #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; +static BlockLink_t xStart, xEnd; /* Keeps track of the number of free bytes remaining, but says nothing about fragmentation. */ @@ -132,7 +127,7 @@ static size_t xFreeBytesRemaining = configADJUSTED_HEAP_SIZE; */ #define prvInsertBlockIntoFreeList( pxBlockToInsert ) \ { \ -xBlockLink *pxIterator; \ +BlockLink_t *pxIterator; \ size_t xBlockSize; \ \ xBlockSize = pxBlockToInsert->xBlockSize; \ @@ -153,8 +148,8 @@ size_t xBlockSize; \ void *pvPortMalloc( size_t xWantedSize ) { -xBlockLink *pxBlock, *pxPreviousBlock, *pxNewBlockLink; -static portBASE_TYPE xHeapHasBeenInitialised = pdFALSE; +BlockLink_t *pxBlock, *pxPreviousBlock, *pxNewBlockLink; +static BaseType_t xHeapHasBeenInitialised = pdFALSE; void *pvReturn = NULL; vTaskSuspendAll(); @@ -167,14 +162,14 @@ void *pvReturn = NULL; xHeapHasBeenInitialised = pdTRUE; } - /* The wanted size is increased so it can contain a xBlockLink + /* The wanted size is increased so it can contain a BlockLink_t 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 ) + if( ( xWantedSize & portBYTE_ALIGNMENT_MASK ) != 0 ) { /* Byte alignment required. */ xWantedSize += ( portBYTE_ALIGNMENT - ( xWantedSize & portBYTE_ALIGNMENT_MASK ) ); @@ -196,9 +191,9 @@ void *pvReturn = NULL; /* 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 + /* Return the memory space - jumping over the BlockLink_t structure at its start. */ - pvReturn = ( void * ) ( ( ( unsigned char * ) pxPreviousBlock->pxNextFreeBlock ) + heapSTRUCT_SIZE ); + pvReturn = ( void * ) ( ( ( uint8_t * ) pxPreviousBlock->pxNextFreeBlock ) + heapSTRUCT_SIZE ); /* This block is being returned for use so must be taken out of the list of free blocks. */ @@ -210,7 +205,7 @@ void *pvReturn = NULL; /* 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 ); + pxNewBlockLink = ( void * ) ( ( ( uint8_t * ) pxBlock ) + xWantedSize ); /* Calculate the sizes of two blocks split from the single block. */ @@ -224,8 +219,10 @@ void *pvReturn = NULL; xFreeBytesRemaining -= pxBlock->xBlockSize; } } + + traceMALLOC( pvReturn, xWantedSize ); } - xTaskResumeAll(); + ( void ) xTaskResumeAll(); #if( configUSE_MALLOC_FAILED_HOOK == 1 ) { @@ -243,26 +240,27 @@ void *pvReturn = NULL; void vPortFree( void *pv ) { -unsigned char *puc = ( unsigned char * ) pv; -xBlockLink *pxLink; +uint8_t *puc = ( uint8_t * ) pv; +BlockLink_t *pxLink; if( pv != NULL ) { - /* The memory being freed will have an xBlockLink structure immediately + /* The memory being freed will have an BlockLink_t structure immediately before it. */ puc -= heapSTRUCT_SIZE; - /* This unexpected casting is to keep some compilers from issuing + /* This unexpected casting is to keep some compilers from issuing byte alignment warnings. */ pxLink = ( void * ) puc; vTaskSuspendAll(); { /* Add this block to the list of free blocks. */ - prvInsertBlockIntoFreeList( ( ( xBlockLink * ) pxLink ) ); + prvInsertBlockIntoFreeList( ( ( BlockLink_t * ) pxLink ) ); xFreeBytesRemaining += pxLink->xBlockSize; + traceFREE( pv, pxLink->xBlockSize ); } - xTaskResumeAll(); + ( void ) xTaskResumeAll(); } } /*-----------------------------------------------------------*/ @@ -281,11 +279,11 @@ void vPortInitialiseBlocks( void ) static void prvHeapInit( void ) { -xBlockLink *pxFirstFreeBlock; -unsigned char *pucAlignedHeap; +BlockLink_t *pxFirstFreeBlock; +uint8_t *pucAlignedHeap; /* Ensure the heap starts on a correctly aligned boundary. */ - pucAlignedHeap = ( unsigned char * ) ( ( ( portPOINTER_SIZE_TYPE ) &ucHeap[ portBYTE_ALIGNMENT ] ) & ( ( portPOINTER_SIZE_TYPE ) ~portBYTE_ALIGNMENT_MASK ) ); + pucAlignedHeap = ( uint8_t * ) ( ( ( portPOINTER_SIZE_TYPE ) &ucHeap[ portBYTE_ALIGNMENT ] ) & ( ~( ( portPOINTER_SIZE_TYPE ) portBYTE_ALIGNMENT_MASK ) ) ); /* 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. */ diff --git a/lib/FreeRTOS/portable/MemMang/heap_3.c b/lib/FreeRTOS/portable/MemMang/heap_3.c index cc62634476..df3a9460cd 100644 --- a/lib/FreeRTOS/portable/MemMang/heap_3.c +++ b/lib/FreeRTOS/portable/MemMang/heap_3.c @@ -1,75 +1,70 @@ /* - FreeRTOS V7.4.0 - Copyright (C) 2013 Real Time Engineers Ltd. - - FEATURES AND PORTS ARE ADDED TO FREERTOS ALL THE TIME. PLEASE VISIT - http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. - - *************************************************************************** - * * - * 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! * - * * - *************************************************************************** + FreeRTOS V8.2.3 - Copyright (C) 2015 Real Time Engineers Ltd. + All rights reserved + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. This file is part of the FreeRTOS distribution. FreeRTOS is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License (version 2) as published by the - Free Software Foundation AND MODIFIED BY the FreeRTOS exception. + 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. + *************************************************************************** + >>! 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 itcan be - viewed here: http://www.freertos.org/a00114.html and also obtained by - writing to Real Time Engineers Ltd., contact details for whom are available - on the FreeRTOS WEB site. - - 1 tab == 4 spaces! + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html *************************************************************************** * * - * Having a problem? Start by reading the FAQ "My application does * - * not run, what could be wrong?" * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * * * - * http://www.FreeRTOS.org/FAQHelp.html * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * * * *************************************************************************** + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? - http://www.FreeRTOS.org - Documentation, books, training, latest versions, - license and Real Time Engineers Ltd. contact details. + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, - including FreeRTOS+Trace - an indispensable productivity tool, and our new - fully thread aware and reentrant UDP/IP stack. - - http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High - Integrity Systems, who sell the code with commercial support, - indemnification and middleware, under the OpenRTOS brand. - - http://www.SafeRTOS.com - High Integrity Systems also provide a safety - engineered and independently SIL3 certified version for use in safety and + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and mission critical applications that require provable dependability. + + 1 tab == 4 spaces! */ @@ -80,7 +75,7 @@ * This file can only be used if the linker is configured to to generate * a heap memory area. * - * See heap_1.c, heap_2.c and heap_4.c for alternative implementations, and the + * See heap_1.c, heap_2.c and heap_4.c for alternative implementations, and the * memory management pages of http://www.FreeRTOS.org for more information. */ @@ -105,8 +100,9 @@ void *pvReturn; vTaskSuspendAll(); { pvReturn = malloc( xWantedSize ); + traceMALLOC( pvReturn, xWantedSize ); } - xTaskResumeAll(); + ( void ) xTaskResumeAll(); #if( configUSE_MALLOC_FAILED_HOOK == 1 ) { @@ -117,7 +113,7 @@ void *pvReturn; } } #endif - + return pvReturn; } /*-----------------------------------------------------------*/ @@ -129,8 +125,9 @@ void vPortFree( void *pv ) vTaskSuspendAll(); { free( pv ); + traceFREE( pv, 0 ); } - xTaskResumeAll(); + ( void ) xTaskResumeAll(); } } diff --git a/lib/FreeRTOS/portable/MemMang/heap_4.c b/lib/FreeRTOS/portable/MemMang/heap_4.c index b56bd28000..f139ef0512 100644 --- a/lib/FreeRTOS/portable/MemMang/heap_4.c +++ b/lib/FreeRTOS/portable/MemMang/heap_4.c @@ -1,83 +1,78 @@ /* - FreeRTOS V7.4.0 - Copyright (C) 2013 Real Time Engineers Ltd. - - FEATURES AND PORTS ARE ADDED TO FREERTOS ALL THE TIME. PLEASE VISIT - http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. - - *************************************************************************** - * * - * 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! * - * * - *************************************************************************** + FreeRTOS V8.2.3 - Copyright (C) 2015 Real Time Engineers Ltd. + All rights reserved + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. This file is part of the FreeRTOS distribution. FreeRTOS is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License (version 2) as published by the - Free Software Foundation AND MODIFIED BY the FreeRTOS exception. + 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. + *************************************************************************** + >>! 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 itcan be - viewed here: http://www.freertos.org/a00114.html and also obtained by - writing to Real Time Engineers Ltd., contact details for whom are available - on the FreeRTOS WEB site. - - 1 tab == 4 spaces! + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html *************************************************************************** * * - * Having a problem? Start by reading the FAQ "My application does * - * not run, what could be wrong?" * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * * * - * http://www.FreeRTOS.org/FAQHelp.html * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * * * *************************************************************************** + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? - http://www.FreeRTOS.org - Documentation, books, training, latest versions, - license and Real Time Engineers Ltd. contact details. + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, - including FreeRTOS+Trace - an indispensable productivity tool, and our new - fully thread aware and reentrant UDP/IP stack. - - http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High - Integrity Systems, who sell the code with commercial support, - indemnification and middleware, under the OpenRTOS brand. - - http://www.SafeRTOS.com - High Integrity Systems also provide a safety - engineered and independently SIL3 certified version for use in safety and + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and mission critical applications that require provable dependability. + + 1 tab == 4 spaces! */ /* - * A sample implementation of pvPortMalloc() and vPortFree() that combines - * (coalescences) adjacent memory blocks as they are freed, and in so doing + * A sample implementation of pvPortMalloc() and vPortFree() that combines + * (coalescences) adjacent memory blocks as they are freed, and in so doing * limits memory fragmentation. * - * See heap_1.c, heap_2.c and heap_3.c for alternative implementations, and the + * See heap_1.c, heap_2.c and heap_3.c for alternative implementations, and the * memory management pages of http://www.FreeRTOS.org for more information. */ #include @@ -93,13 +88,19 @@ task.h is included from an application file. */ #undef MPU_WRAPPERS_INCLUDED_FROM_API_FILE /* Block sizes must not get too small. */ -#define heapMINIMUM_BLOCK_SIZE ( ( size_t ) ( heapSTRUCT_SIZE * 2 ) ) +#define heapMINIMUM_BLOCK_SIZE ( ( size_t ) ( xHeapStructSize << 1 ) ) -/* A few bytes might be lost to byte aligning the heap start address. */ -#define configADJUSTED_HEAP_SIZE ( configTOTAL_HEAP_SIZE - portBYTE_ALIGNMENT ) +/* Assumes 8bit bytes! */ +#define heapBITS_PER_BYTE ( ( size_t ) 8 ) /* Allocate the memory for the heap. */ -static unsigned char ucHeap[ configTOTAL_HEAP_SIZE ]; +#if( configAPPLICATION_ALLOCATED_HEAP == 1 ) + /* The application writer has already defined the array used for the RTOS + heap - probably so it can be placed in a special segment or address. */ + extern uint8_t ucHeap[ configTOTAL_HEAP_SIZE ]; +#else + static uint8_t ucHeap[ configTOTAL_HEAP_SIZE ]; +#endif /* configAPPLICATION_ALLOCATED_HEAP */ /* Define the linked list structure. This is used to link free blocks in order of their memory address. */ @@ -107,17 +108,17 @@ 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; +} BlockLink_t; /*-----------------------------------------------------------*/ /* - * Inserts a block of memory that is being freed into the correct position in + * Inserts a block of memory that is being freed into the correct position in * the list of free memory blocks. The block being freed will be merged with * the block in front it and/or the block behind it if the memory blocks are * adjacent to each other. */ -static void prvInsertBlockIntoFreeList( xBlockLink *pxBlockToInsert ); +static void prvInsertBlockIntoFreeList( BlockLink_t *pxBlockToInsert ); /* * Called automatically to setup the required heap structures the first time @@ -129,25 +130,27 @@ static void prvHeapInit( void ); /* The size of the structure placed at the beginning of each allocated memory block must by correctly byte aligned. */ -static const unsigned short heapSTRUCT_SIZE = ( sizeof( xBlockLink ) + portBYTE_ALIGNMENT - ( sizeof( xBlockLink ) % portBYTE_ALIGNMENT ) ); - -/* Ensure the pxEnd pointer will end up on the correct byte alignment. */ -static const size_t xTotalHeapSize = ( ( size_t ) configADJUSTED_HEAP_SIZE ) & ( ( size_t ) ~portBYTE_ALIGNMENT_MASK ); +static const size_t xHeapStructSize = ( sizeof( BlockLink_t ) + ( ( size_t ) ( portBYTE_ALIGNMENT - 1 ) ) ) & ~( ( size_t ) portBYTE_ALIGNMENT_MASK ); /* Create a couple of list links to mark the start and end of the list. */ -static xBlockLink xStart, *pxEnd = NULL; +static BlockLink_t xStart, *pxEnd = NULL; /* Keeps track of the number of free bytes remaining, but says nothing about fragmentation. */ -static size_t xFreeBytesRemaining = ( ( size_t ) configADJUSTED_HEAP_SIZE ) & ( ( size_t ) ~portBYTE_ALIGNMENT_MASK ); +static size_t xFreeBytesRemaining = 0U; +static size_t xMinimumEverFreeBytesRemaining = 0U; -/* STATIC FUNCTIONS ARE DEFINED AS MACROS TO MINIMIZE THE FUNCTION CALL DEPTH. */ +/* Gets set to the top bit of an size_t type. When this bit in the xBlockSize +member of an BlockLink_t structure is set then the block belongs to the +application. When the bit is free the block is still part of the free heap +space. */ +static size_t xBlockAllocatedBit = 0; /*-----------------------------------------------------------*/ void *pvPortMalloc( size_t xWantedSize ) { -xBlockLink *pxBlock, *pxPreviousBlock, *pxNewBlockLink; +BlockLink_t *pxBlock, *pxPreviousBlock, *pxNewBlockLink; void *pvReturn = NULL; vTaskSuspendAll(); @@ -158,68 +161,123 @@ void *pvReturn = NULL; { prvHeapInit(); } - - /* The wanted size is increased so it can contain a xBlockLink - structure in addition to the requested amount of bytes. */ - if( xWantedSize > 0 ) + else { - 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 ) ); - } + mtCOVERAGE_TEST_MARKER(); } - if( ( xWantedSize > 0 ) && ( xWantedSize < xTotalHeapSize ) ) + /* Check the requested block size is not so large that the top bit is + set. The top bit of the block size member of the BlockLink_t structure + is used to determine who owns the block - the application or the + kernel, so it must be free. */ + if( ( xWantedSize & xBlockAllocatedBit ) == 0 ) { - /* Traverse the list from the start (lowest address) block until one - of adequate size is found. */ - pxPreviousBlock = &xStart; - pxBlock = xStart.pxNextFreeBlock; - while( ( pxBlock->xBlockSize < xWantedSize ) && ( pxBlock->pxNextFreeBlock != NULL ) ) + /* The wanted size is increased so it can contain a BlockLink_t + structure in addition to the requested amount of bytes. */ + if( xWantedSize > 0 ) { - pxPreviousBlock = pxBlock; - pxBlock = pxBlock->pxNextFreeBlock; - } + xWantedSize += xHeapStructSize; - /* If the end marker was reached then a block of adequate size was - not found. */ - if( pxBlock != pxEnd ) + /* Ensure that blocks are always aligned to the required number + of bytes. */ + if( ( xWantedSize & portBYTE_ALIGNMENT_MASK ) != 0x00 ) + { + /* Byte alignment required. */ + xWantedSize += ( portBYTE_ALIGNMENT - ( xWantedSize & portBYTE_ALIGNMENT_MASK ) ); + configASSERT( ( xWantedSize & portBYTE_ALIGNMENT_MASK ) == 0 ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else { - /* 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 out of - the list of free blocks. */ - pxPreviousBlock->pxNextFreeBlock = pxBlock->pxNextFreeBlock; + mtCOVERAGE_TEST_MARKER(); + } - /* If the block is larger than required it can be split into two. */ - if( ( pxBlock->xBlockSize - xWantedSize ) > heapMINIMUM_BLOCK_SIZE ) + if( ( xWantedSize > 0 ) && ( xWantedSize <= xFreeBytesRemaining ) ) + { + /* Traverse the list from the start (lowest address) block until + one of adequate size is found. */ + pxPreviousBlock = &xStart; + pxBlock = xStart.pxNextFreeBlock; + while( ( pxBlock->xBlockSize < xWantedSize ) && ( pxBlock->pxNextFreeBlock != NULL ) ) { - /* 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 ) ); + pxPreviousBlock = pxBlock; + pxBlock = pxBlock->pxNextFreeBlock; } - xFreeBytesRemaining -= pxBlock->xBlockSize; + /* If the end marker was reached then a block of adequate size + was not found. */ + if( pxBlock != pxEnd ) + { + /* Return the memory space pointed to - jumping over the + BlockLink_t structure at its start. */ + pvReturn = ( void * ) ( ( ( uint8_t * ) pxPreviousBlock->pxNextFreeBlock ) + xHeapStructSize ); + + /* This block is being returned for use so must be taken out + 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 * ) ( ( ( uint8_t * ) pxBlock ) + xWantedSize ); + configASSERT( ( ( ( size_t ) pxNewBlockLink ) & portBYTE_ALIGNMENT_MASK ) == 0 ); + + /* 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 ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + xFreeBytesRemaining -= pxBlock->xBlockSize; + + if( xFreeBytesRemaining < xMinimumEverFreeBytesRemaining ) + { + xMinimumEverFreeBytesRemaining = xFreeBytesRemaining; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + /* The block is being returned - it is allocated and owned + by the application and has no "next" block. */ + pxBlock->xBlockSize |= xBlockAllocatedBit; + pxBlock->pxNextFreeBlock = NULL; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); } } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + traceMALLOC( pvReturn, xWantedSize ); } - xTaskResumeAll(); + ( void ) xTaskResumeAll(); #if( configUSE_MALLOC_FAILED_HOOK == 1 ) { @@ -228,34 +286,62 @@ void *pvReturn = NULL; extern void vApplicationMallocFailedHook( void ); vApplicationMallocFailedHook(); } + else + { + mtCOVERAGE_TEST_MARKER(); + } } #endif + configASSERT( ( ( ( uint32_t ) pvReturn ) & portBYTE_ALIGNMENT_MASK ) == 0 ); return pvReturn; } /*-----------------------------------------------------------*/ void vPortFree( void *pv ) { -unsigned char *puc = ( unsigned char * ) pv; -xBlockLink *pxLink; +uint8_t *puc = ( uint8_t * ) pv; +BlockLink_t *pxLink; if( pv != NULL ) { - /* The memory being freed will have an xBlockLink structure immediately + /* The memory being freed will have an BlockLink_t structure immediately before it. */ - puc -= heapSTRUCT_SIZE; + puc -= xHeapStructSize; /* This casting is to keep the compiler from issuing warnings. */ pxLink = ( void * ) puc; - vTaskSuspendAll(); + /* Check the block is actually allocated. */ + configASSERT( ( pxLink->xBlockSize & xBlockAllocatedBit ) != 0 ); + configASSERT( pxLink->pxNextFreeBlock == NULL ); + + if( ( pxLink->xBlockSize & xBlockAllocatedBit ) != 0 ) { - /* Add this block to the list of free blocks. */ - xFreeBytesRemaining += pxLink->xBlockSize; - prvInsertBlockIntoFreeList( ( ( xBlockLink * ) pxLink ) ); + if( pxLink->pxNextFreeBlock == NULL ) + { + /* The block is being returned to the heap - it is no longer + allocated. */ + pxLink->xBlockSize &= ~xBlockAllocatedBit; + + vTaskSuspendAll(); + { + /* Add this block to the list of free blocks. */ + xFreeBytesRemaining += pxLink->xBlockSize; + traceFREE( pv, pxLink->xBlockSize ); + prvInsertBlockIntoFreeList( ( ( BlockLink_t * ) pxLink ) ); + } + ( void ) xTaskResumeAll(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); } - xTaskResumeAll(); } } /*-----------------------------------------------------------*/ @@ -266,6 +352,12 @@ size_t xPortGetFreeHeapSize( void ) } /*-----------------------------------------------------------*/ +size_t xPortGetMinimumEverFreeHeapSize( void ) +{ + return xMinimumEverFreeBytesRemaining; +} +/*-----------------------------------------------------------*/ + void vPortInitialiseBlocks( void ) { /* This just exists to keep the linker quiet. */ @@ -274,11 +366,22 @@ void vPortInitialiseBlocks( void ) static void prvHeapInit( void ) { -xBlockLink *pxFirstFreeBlock; -unsigned char *pucHeapEnd, *pucAlignedHeap; +BlockLink_t *pxFirstFreeBlock; +uint8_t *pucAlignedHeap; +size_t uxAddress; +size_t xTotalHeapSize = configTOTAL_HEAP_SIZE; /* Ensure the heap starts on a correctly aligned boundary. */ - pucAlignedHeap = ( unsigned char * ) ( ( ( portPOINTER_SIZE_TYPE ) &ucHeap[ portBYTE_ALIGNMENT ] ) & ( ( portPOINTER_SIZE_TYPE ) ~portBYTE_ALIGNMENT_MASK ) ); + uxAddress = ( size_t ) ucHeap; + + if( ( uxAddress & portBYTE_ALIGNMENT_MASK ) != 0 ) + { + uxAddress += ( portBYTE_ALIGNMENT - 1 ); + uxAddress &= ~( ( size_t ) portBYTE_ALIGNMENT_MASK ); + xTotalHeapSize -= uxAddress - ( size_t ) ucHeap; + } + + pucAlignedHeap = ( uint8_t * ) uxAddress; /* 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. */ @@ -287,28 +390,32 @@ unsigned char *pucHeapEnd, *pucAlignedHeap; /* pxEnd is used to mark the end of the list of free blocks and is inserted at the end of the heap space. */ - pucHeapEnd = pucAlignedHeap + xTotalHeapSize; - pucHeapEnd -= heapSTRUCT_SIZE; - pxEnd = ( void * ) pucHeapEnd; - configASSERT( ( ( ( unsigned long ) pxEnd ) & ( ( unsigned long ) portBYTE_ALIGNMENT_MASK ) ) == 0UL ); + uxAddress = ( ( size_t ) pucAlignedHeap ) + xTotalHeapSize; + uxAddress -= xHeapStructSize; + uxAddress &= ~( ( size_t ) portBYTE_ALIGNMENT_MASK ); + pxEnd = ( void * ) uxAddress; pxEnd->xBlockSize = 0; pxEnd->pxNextFreeBlock = NULL; /* To start with there is a single free block that is sized to take up the entire heap space, minus the space taken by pxEnd. */ pxFirstFreeBlock = ( void * ) pucAlignedHeap; - pxFirstFreeBlock->xBlockSize = xTotalHeapSize - heapSTRUCT_SIZE; + pxFirstFreeBlock->xBlockSize = uxAddress - ( size_t ) pxFirstFreeBlock; pxFirstFreeBlock->pxNextFreeBlock = pxEnd; - /* The heap now contains pxEnd. */ - xFreeBytesRemaining -= heapSTRUCT_SIZE; + /* Only one block exists - and it covers the entire usable heap space. */ + xMinimumEverFreeBytesRemaining = pxFirstFreeBlock->xBlockSize; + xFreeBytesRemaining = pxFirstFreeBlock->xBlockSize; + + /* Work out the position of the top bit in a size_t variable. */ + xBlockAllocatedBit = ( ( size_t ) 1 ) << ( ( sizeof( size_t ) * heapBITS_PER_BYTE ) - 1 ); } /*-----------------------------------------------------------*/ -static void prvInsertBlockIntoFreeList( xBlockLink *pxBlockToInsert ) +static void prvInsertBlockIntoFreeList( BlockLink_t *pxBlockToInsert ) { -xBlockLink *pxIterator; -unsigned char *puc; +BlockLink_t *pxIterator; +uint8_t *puc; /* Iterate through the list until a block is found that has a higher address than the block being inserted. */ @@ -318,18 +425,22 @@ unsigned char *puc; } /* Do the block being inserted, and the block it is being inserted after - make a contiguous block of memory? */ - puc = ( unsigned char * ) pxIterator; - if( ( puc + pxIterator->xBlockSize ) == ( unsigned char * ) pxBlockToInsert ) + make a contiguous block of memory? */ + puc = ( uint8_t * ) pxIterator; + if( ( puc + pxIterator->xBlockSize ) == ( uint8_t * ) pxBlockToInsert ) { pxIterator->xBlockSize += pxBlockToInsert->xBlockSize; pxBlockToInsert = pxIterator; } + else + { + mtCOVERAGE_TEST_MARKER(); + } /* Do the block being inserted, and the block it is being inserted before make a contiguous block of memory? */ - puc = ( unsigned char * ) pxBlockToInsert; - if( ( puc + pxBlockToInsert->xBlockSize ) == ( unsigned char * ) pxIterator->pxNextFreeBlock ) + puc = ( uint8_t * ) pxBlockToInsert; + if( ( puc + pxBlockToInsert->xBlockSize ) == ( uint8_t * ) pxIterator->pxNextFreeBlock ) { if( pxIterator->pxNextFreeBlock != pxEnd ) { @@ -344,7 +455,7 @@ unsigned char *puc; } else { - pxBlockToInsert->pxNextFreeBlock = pxIterator->pxNextFreeBlock; + pxBlockToInsert->pxNextFreeBlock = pxIterator->pxNextFreeBlock; } /* If the block being inserted plugged a gab, so was merged with the block @@ -355,5 +466,9 @@ unsigned char *puc; { pxIterator->pxNextFreeBlock = pxBlockToInsert; } + else + { + mtCOVERAGE_TEST_MARKER(); + } } diff --git a/lib/FreeRTOS/portable/MemMang/heap_5.c b/lib/FreeRTOS/portable/MemMang/heap_5.c new file mode 100644 index 0000000000..2f7b50abf0 --- /dev/null +++ b/lib/FreeRTOS/portable/MemMang/heap_5.c @@ -0,0 +1,523 @@ +/* + FreeRTOS V8.2.3 - Copyright (C) 2015 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +/* + * A sample implementation of pvPortMalloc() that allows the heap to be defined + * across multiple non-contigous blocks and combines (coalescences) adjacent + * memory blocks as they are freed. + * + * See heap_1.c, heap_2.c, heap_3.c and heap_4.c for alternative + * implementations, and the memory management pages of http://www.FreeRTOS.org + * for more information. + * + * Usage notes: + * + * vPortDefineHeapRegions() ***must*** be called before pvPortMalloc(). + * pvPortMalloc() will be called if any task objects (tasks, queues, event + * groups, etc.) are created, therefore vPortDefineHeapRegions() ***must*** be + * called before any other objects are defined. + * + * vPortDefineHeapRegions() takes a single parameter. The parameter is an array + * of HeapRegion_t structures. HeapRegion_t is defined in portable.h as + * + * typedef struct HeapRegion + * { + * uint8_t *pucStartAddress; << Start address of a block of memory that will be part of the heap. + * size_t xSizeInBytes; << Size of the block of memory. + * } HeapRegion_t; + * + * The array is terminated using a NULL zero sized region definition, and the + * memory regions defined in the array ***must*** appear in address order from + * low address to high address. So the following is a valid example of how + * to use the function. + * + * HeapRegion_t xHeapRegions[] = + * { + * { ( uint8_t * ) 0x80000000UL, 0x10000 }, << Defines a block of 0x10000 bytes starting at address 0x80000000 + * { ( uint8_t * ) 0x90000000UL, 0xa0000 }, << Defines a block of 0xa0000 bytes starting at address of 0x90000000 + * { NULL, 0 } << Terminates the array. + * }; + * + * vPortDefineHeapRegions( xHeapRegions ); << Pass the array into vPortDefineHeapRegions(). + * + * Note 0x80000000 is the lower address so appears in the array first. + * + */ +#include + +/* 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 + +/* Block sizes must not get too small. */ +#define heapMINIMUM_BLOCK_SIZE ( ( size_t ) ( xHeapStructSize << 1 ) ) + +/* Assumes 8bit bytes! */ +#define heapBITS_PER_BYTE ( ( size_t ) 8 ) + +/* Define the linked list structure. This is used to link free blocks in order +of their memory address. */ +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. */ +} BlockLink_t; + +/*-----------------------------------------------------------*/ + +/* + * Inserts a block of memory that is being freed into the correct position in + * the list of free memory blocks. The block being freed will be merged with + * the block in front it and/or the block behind it if the memory blocks are + * adjacent to each other. + */ +static void prvInsertBlockIntoFreeList( BlockLink_t *pxBlockToInsert ); + +/*-----------------------------------------------------------*/ + +/* The size of the structure placed at the beginning of each allocated memory +block must by correctly byte aligned. */ +static const size_t xHeapStructSize = ( sizeof( BlockLink_t ) + ( ( size_t ) ( portBYTE_ALIGNMENT - 1 ) ) ) & ~( ( size_t ) portBYTE_ALIGNMENT_MASK ); + +/* Create a couple of list links to mark the start and end of the list. */ +static BlockLink_t xStart, *pxEnd = NULL; + +/* Keeps track of the number of free bytes remaining, but says nothing about +fragmentation. */ +static size_t xFreeBytesRemaining = 0U; +static size_t xMinimumEverFreeBytesRemaining = 0U; + +/* Gets set to the top bit of an size_t type. When this bit in the xBlockSize +member of an BlockLink_t structure is set then the block belongs to the +application. When the bit is free the block is still part of the free heap +space. */ +static size_t xBlockAllocatedBit = 0; + +/*-----------------------------------------------------------*/ + +void *pvPortMalloc( size_t xWantedSize ) +{ +BlockLink_t *pxBlock, *pxPreviousBlock, *pxNewBlockLink; +void *pvReturn = NULL; + + /* The heap must be initialised before the first call to + prvPortMalloc(). */ + configASSERT( pxEnd ); + + vTaskSuspendAll(); + { + /* Check the requested block size is not so large that the top bit is + set. The top bit of the block size member of the BlockLink_t structure + is used to determine who owns the block - the application or the + kernel, so it must be free. */ + if( ( xWantedSize & xBlockAllocatedBit ) == 0 ) + { + /* The wanted size is increased so it can contain a BlockLink_t + structure in addition to the requested amount of bytes. */ + if( xWantedSize > 0 ) + { + xWantedSize += xHeapStructSize; + + /* Ensure that blocks are always aligned to the required number + of bytes. */ + if( ( xWantedSize & portBYTE_ALIGNMENT_MASK ) != 0x00 ) + { + /* Byte alignment required. */ + xWantedSize += ( portBYTE_ALIGNMENT - ( xWantedSize & portBYTE_ALIGNMENT_MASK ) ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + if( ( xWantedSize > 0 ) && ( xWantedSize <= xFreeBytesRemaining ) ) + { + /* Traverse the list from the start (lowest address) block until + one of adequate size is found. */ + pxPreviousBlock = &xStart; + pxBlock = xStart.pxNextFreeBlock; + while( ( pxBlock->xBlockSize < xWantedSize ) && ( pxBlock->pxNextFreeBlock != NULL ) ) + { + pxPreviousBlock = pxBlock; + pxBlock = pxBlock->pxNextFreeBlock; + } + + /* If the end marker was reached then a block of adequate size + was not found. */ + if( pxBlock != pxEnd ) + { + /* Return the memory space pointed to - jumping over the + BlockLink_t structure at its start. */ + pvReturn = ( void * ) ( ( ( uint8_t * ) pxPreviousBlock->pxNextFreeBlock ) + xHeapStructSize ); + + /* This block is being returned for use so must be taken out + 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 * ) ( ( ( uint8_t * ) 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 ) ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + xFreeBytesRemaining -= pxBlock->xBlockSize; + + if( xFreeBytesRemaining < xMinimumEverFreeBytesRemaining ) + { + xMinimumEverFreeBytesRemaining = xFreeBytesRemaining; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + /* The block is being returned - it is allocated and owned + by the application and has no "next" block. */ + pxBlock->xBlockSize |= xBlockAllocatedBit; + pxBlock->pxNextFreeBlock = NULL; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + traceMALLOC( pvReturn, xWantedSize ); + } + ( void ) xTaskResumeAll(); + + #if( configUSE_MALLOC_FAILED_HOOK == 1 ) + { + if( pvReturn == NULL ) + { + extern void vApplicationMallocFailedHook( void ); + vApplicationMallocFailedHook(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + #endif + + return pvReturn; +} +/*-----------------------------------------------------------*/ + +void vPortFree( void *pv ) +{ +uint8_t *puc = ( uint8_t * ) pv; +BlockLink_t *pxLink; + + if( pv != NULL ) + { + /* The memory being freed will have an BlockLink_t structure immediately + before it. */ + puc -= xHeapStructSize; + + /* This casting is to keep the compiler from issuing warnings. */ + pxLink = ( void * ) puc; + + /* Check the block is actually allocated. */ + configASSERT( ( pxLink->xBlockSize & xBlockAllocatedBit ) != 0 ); + configASSERT( pxLink->pxNextFreeBlock == NULL ); + + if( ( pxLink->xBlockSize & xBlockAllocatedBit ) != 0 ) + { + if( pxLink->pxNextFreeBlock == NULL ) + { + /* The block is being returned to the heap - it is no longer + allocated. */ + pxLink->xBlockSize &= ~xBlockAllocatedBit; + + vTaskSuspendAll(); + { + /* Add this block to the list of free blocks. */ + xFreeBytesRemaining += pxLink->xBlockSize; + traceFREE( pv, pxLink->xBlockSize ); + prvInsertBlockIntoFreeList( ( ( BlockLink_t * ) pxLink ) ); + } + ( void ) xTaskResumeAll(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } +} +/*-----------------------------------------------------------*/ + +size_t xPortGetFreeHeapSize( void ) +{ + return xFreeBytesRemaining; +} +/*-----------------------------------------------------------*/ + +size_t xPortGetMinimumEverFreeHeapSize( void ) +{ + return xMinimumEverFreeBytesRemaining; +} +/*-----------------------------------------------------------*/ + +static void prvInsertBlockIntoFreeList( BlockLink_t *pxBlockToInsert ) +{ +BlockLink_t *pxIterator; +uint8_t *puc; + + /* Iterate through the list until a block is found that has a higher address + than the block being inserted. */ + for( pxIterator = &xStart; pxIterator->pxNextFreeBlock < pxBlockToInsert; pxIterator = pxIterator->pxNextFreeBlock ) + { + /* Nothing to do here, just iterate to the right position. */ + } + + /* Do the block being inserted, and the block it is being inserted after + make a contiguous block of memory? */ + puc = ( uint8_t * ) pxIterator; + if( ( puc + pxIterator->xBlockSize ) == ( uint8_t * ) pxBlockToInsert ) + { + pxIterator->xBlockSize += pxBlockToInsert->xBlockSize; + pxBlockToInsert = pxIterator; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + /* Do the block being inserted, and the block it is being inserted before + make a contiguous block of memory? */ + puc = ( uint8_t * ) pxBlockToInsert; + if( ( puc + pxBlockToInsert->xBlockSize ) == ( uint8_t * ) pxIterator->pxNextFreeBlock ) + { + if( pxIterator->pxNextFreeBlock != pxEnd ) + { + /* Form one big block from the two blocks. */ + pxBlockToInsert->xBlockSize += pxIterator->pxNextFreeBlock->xBlockSize; + pxBlockToInsert->pxNextFreeBlock = pxIterator->pxNextFreeBlock->pxNextFreeBlock; + } + else + { + pxBlockToInsert->pxNextFreeBlock = pxEnd; + } + } + else + { + pxBlockToInsert->pxNextFreeBlock = pxIterator->pxNextFreeBlock; + } + + /* If the block being inserted plugged a gab, so was merged with the block + before and the block after, then it's pxNextFreeBlock pointer will have + already been set, and should not be set here as that would make it point + to itself. */ + if( pxIterator != pxBlockToInsert ) + { + pxIterator->pxNextFreeBlock = pxBlockToInsert; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } +} +/*-----------------------------------------------------------*/ + +void vPortDefineHeapRegions( const HeapRegion_t * const pxHeapRegions ) +{ +BlockLink_t *pxFirstFreeBlockInRegion = NULL, *pxPreviousFreeBlock; +size_t xAlignedHeap; +size_t xTotalRegionSize, xTotalHeapSize = 0; +BaseType_t xDefinedRegions = 0; +size_t xAddress; +const HeapRegion_t *pxHeapRegion; + + /* Can only call once! */ + configASSERT( pxEnd == NULL ); + + pxHeapRegion = &( pxHeapRegions[ xDefinedRegions ] ); + + while( pxHeapRegion->xSizeInBytes > 0 ) + { + xTotalRegionSize = pxHeapRegion->xSizeInBytes; + + /* Ensure the heap region starts on a correctly aligned boundary. */ + xAddress = ( size_t ) pxHeapRegion->pucStartAddress; + if( ( xAddress & portBYTE_ALIGNMENT_MASK ) != 0 ) + { + xAddress += ( portBYTE_ALIGNMENT - 1 ); + xAddress &= ~portBYTE_ALIGNMENT_MASK; + + /* Adjust the size for the bytes lost to alignment. */ + xTotalRegionSize -= xAddress - ( size_t ) pxHeapRegion->pucStartAddress; + } + + xAlignedHeap = xAddress; + + /* Set xStart if it has not already been set. */ + if( xDefinedRegions == 0 ) + { + /* 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 = ( BlockLink_t * ) xAlignedHeap; + xStart.xBlockSize = ( size_t ) 0; + } + else + { + /* Should only get here if one region has already been added to the + heap. */ + configASSERT( pxEnd != NULL ); + + /* Check blocks are passed in with increasing start addresses. */ + configASSERT( xAddress > ( size_t ) pxEnd ); + } + + /* Remember the location of the end marker in the previous region, if + any. */ + pxPreviousFreeBlock = pxEnd; + + /* pxEnd is used to mark the end of the list of free blocks and is + inserted at the end of the region space. */ + xAddress = xAlignedHeap + xTotalRegionSize; + xAddress -= xHeapStructSize; + xAddress &= ~portBYTE_ALIGNMENT_MASK; + pxEnd = ( BlockLink_t * ) xAddress; + pxEnd->xBlockSize = 0; + pxEnd->pxNextFreeBlock = NULL; + + /* To start with there is a single free block in this region that is + sized to take up the entire heap region minus the space taken by the + free block structure. */ + pxFirstFreeBlockInRegion = ( BlockLink_t * ) xAlignedHeap; + pxFirstFreeBlockInRegion->xBlockSize = xAddress - ( size_t ) pxFirstFreeBlockInRegion; + pxFirstFreeBlockInRegion->pxNextFreeBlock = pxEnd; + + /* If this is not the first region that makes up the entire heap space + then link the previous region to this region. */ + if( pxPreviousFreeBlock != NULL ) + { + pxPreviousFreeBlock->pxNextFreeBlock = pxFirstFreeBlockInRegion; + } + + xTotalHeapSize += pxFirstFreeBlockInRegion->xBlockSize; + + /* Move onto the next HeapRegion_t structure. */ + xDefinedRegions++; + pxHeapRegion = &( pxHeapRegions[ xDefinedRegions ] ); + } + + xMinimumEverFreeBytesRemaining = xTotalHeapSize; + xFreeBytesRemaining = xTotalHeapSize; + + /* Check something was actually defined before it is accessed. */ + configASSERT( xTotalHeapSize ); + + /* Work out the position of the top bit in a size_t variable. */ + xBlockAllocatedBit = ( ( size_t ) 1 ) << ( ( sizeof( size_t ) * heapBITS_PER_BYTE ) - 1 ); +} + diff --git a/lib/FreeRTOS/queue.c b/lib/FreeRTOS/queue.c index 75bebd12d5..c71ef50203 100644 --- a/lib/FreeRTOS/queue.c +++ b/lib/FreeRTOS/queue.c @@ -1,75 +1,70 @@ /* - FreeRTOS V7.4.0 - Copyright (C) 2013 Real Time Engineers Ltd. - - FEATURES AND PORTS ARE ADDED TO FREERTOS ALL THE TIME. PLEASE VISIT - http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. - - *************************************************************************** - * * - * 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! * - * * - *************************************************************************** + FreeRTOS V8.2.3 - Copyright (C) 2015 Real Time Engineers Ltd. + All rights reserved + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. This file is part of the FreeRTOS distribution. FreeRTOS is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License (version 2) as published by the - Free Software Foundation AND MODIFIED BY the FreeRTOS exception. + 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. + *************************************************************************** + >>! 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 itcan be - viewed here: http://www.freertos.org/a00114.html and also obtained by - writing to Real Time Engineers Ltd., contact details for whom are available - on the FreeRTOS WEB site. - - 1 tab == 4 spaces! + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html *************************************************************************** * * - * Having a problem? Start by reading the FAQ "My application does * - * not run, what could be wrong?" * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * * * - * http://www.FreeRTOS.org/FAQHelp.html * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * * * *************************************************************************** + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. - http://www.FreeRTOS.org - Documentation, books, training, latest versions, - license and Real Time Engineers Ltd. contact details. + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, - including FreeRTOS+Trace - an indispensable productivity tool, and our new - fully thread aware and reentrant UDP/IP stack. - - http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High - Integrity Systems, who sell the code with commercial support, - indemnification and middleware, under the OpenRTOS brand. - - http://www.SafeRTOS.com - High Integrity Systems also provide a safety - engineered and independently SIL3 certified version for use in safety and + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and mission critical applications that require provable dependability. + + 1 tab == 4 spaces! */ #include @@ -88,52 +83,75 @@ task.h is included from an application file. */ #include "croutine.h" #endif -#undef MPU_WRAPPERS_INCLUDED_FROM_API_FILE - -/* Constants used with the cRxLock and xTxLock structure members. */ -#define queueUNLOCKED ( ( signed portBASE_TYPE ) -1 ) -#define queueLOCKED_UNMODIFIED ( ( signed portBASE_TYPE ) 0 ) - -#define queueERRONEOUS_UNBLOCK ( -1 ) - -/* Effectively make a union out of the xQUEUE structure. */ +/* Lint e961 and e750 are suppressed as a MISRA exception justified because the +MPU ports require MPU_WRAPPERS_INCLUDED_FROM_API_FILE to be defined for the +header files above, but not in this file, in order to generate the correct +privileged Vs unprivileged linkage and placement. */ +#undef MPU_WRAPPERS_INCLUDED_FROM_API_FILE /*lint !e961 !e750. */ + + +/* Constants used with the xRxLock and xTxLock structure members. */ +#define queueUNLOCKED ( ( BaseType_t ) -1 ) +#define queueLOCKED_UNMODIFIED ( ( BaseType_t ) 0 ) + +/* When the Queue_t structure is used to represent a base queue its pcHead and +pcTail members are used as pointers into the queue storage area. When the +Queue_t structure is used to represent a mutex pcHead and pcTail pointers are +not necessary, and the pcHead pointer is set to NULL to indicate that the +pcTail pointer actually points to the mutex holder (if any). Map alternative +names to the pcHead and pcTail structure members to ensure the readability of +the code is maintained despite this dual use of two structure members. An +alternative implementation would be to use a union, but use of a union is +against the coding standard (although an exception to the standard has been +permitted where the dual use also significantly changes the type of the +structure member). */ #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 +/* Semaphores do not actually store or copy data, so have an item size of zero. */ -#define queueSEMAPHORE_QUEUE_ITEM_LENGTH ( ( unsigned portBASE_TYPE ) 0 ) -#define queueDONT_BLOCK ( ( portTickType ) 0U ) -#define queueMUTEX_GIVE_BLOCK_TIME ( ( portTickType ) 0U ) - +#define queueSEMAPHORE_QUEUE_ITEM_LENGTH ( ( UBaseType_t ) 0 ) +#define queueMUTEX_GIVE_BLOCK_TIME ( ( TickType_t ) 0U ) + +#if( configUSE_PREEMPTION == 0 ) + /* If the cooperative scheduler is being used then a yield should not be + performed just because a higher priority task has been woken. */ + #define queueYIELD_IF_USING_PREEMPTION() +#else + #define queueYIELD_IF_USING_PREEMPTION() portYIELD_WITHIN_API() +#endif /* * Definition of the queue used by the scheduler. - * Items are queued by copy, not reference. + * Items are queued by copy, not reference. See the following link for the + * rationale: http://www.freertos.org/Embedded-RTOS-Queues.html */ 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. */ + int8_t *pcHead; /*< Points to the beginning of the queue storage area. */ + int8_t *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. */ + int8_t *pcWriteTo; /*< Points to the free next place in the storage area. */ - 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. */ + union /* Use of a union is an exception to the coding standard to ensure two mutually exclusive structure members don't appear simultaneously (wasting RAM). */ + { + int8_t *pcReadFrom; /*< Points to the last place that a queued item was read from when the structure is used as a queue. */ + UBaseType_t uxRecursiveCallCount;/*< Maintains a count of the number of times a recursive mutex has been recursively 'taken' when the structure is used as a mutex. */ + } u; - 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. */ + List_t xTasksWaitingToSend; /*< List of tasks that are blocked waiting to post onto this queue. Stored in priority order. */ + List_t 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. */ + volatile UBaseType_t uxMessagesWaiting;/*< The number of items currently in the queue. */ + UBaseType_t uxLength; /*< The length of the queue defined as the number of items it will hold, not the number of bytes. */ + UBaseType_t uxItemSize; /*< The size of each items that the queue will hold. */ - volatile 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. */ - volatile 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. */ + volatile BaseType_t 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. */ + volatile BaseType_t 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. */ #if ( configUSE_TRACE_FACILITY == 1 ) - unsigned char ucQueueNumber; - unsigned char ucQueueType; + UBaseType_t uxQueueNumber; + uint8_t ucQueueType; #endif #if ( configUSE_QUEUE_SETS == 1 ) @@ -141,6 +159,11 @@ typedef struct QueueDefinition #endif } xQUEUE; + +/* The old xQUEUE name is maintained above then typedefed to the new Queue_t +name below to enable the use of older kernel aware debuggers. */ +typedef xQUEUE Queue_t; + /*-----------------------------------------------------------*/ /* @@ -154,18 +177,19 @@ typedef struct QueueDefinition more user friendly. */ typedef struct QUEUE_REGISTRY_ITEM { - signed char *pcQueueName; - xQueueHandle xHandle; + const char *pcQueueName; /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ + QueueHandle_t xHandle; } xQueueRegistryItem; - /* The queue registry is simply an array of xQueueRegistryItem structures. + /* The old xQueueRegistryItem name is maintained above then typedefed to the + new xQueueRegistryItem name below to enable the use of older kernel aware + debuggers. */ + typedef xQueueRegistryItem QueueRegistryItem_t; + + /* The queue registry is simply an array of QueueRegistryItem_t 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 prvQueueUnregisterQueue( xQueueHandle xQueue ) PRIVILEGED_FUNCTION; + PRIVILEGED_DATA QueueRegistryItem_t xQueueRegistry[ configQUEUE_REGISTRY_SIZE ]; #endif /* configQUEUE_REGISTRY_SIZE */ @@ -177,39 +201,39 @@ typedef struct QueueDefinition * 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( xQUEUE *pxQueue ) PRIVILEGED_FUNCTION; +static void prvUnlockQueue( Queue_t * const 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 xQUEUE *pxQueue ) PRIVILEGED_FUNCTION; +static BaseType_t prvIsQueueEmpty( const Queue_t *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 xQUEUE *pxQueue ) PRIVILEGED_FUNCTION; +static BaseType_t prvIsQueueFull( const Queue_t *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; +static BaseType_t prvCopyDataToQueue( Queue_t * const pxQueue, const void *pvItemToQueue, const BaseType_t xPosition ) PRIVILEGED_FUNCTION; /* * Copies an item out of a queue. */ -static void prvCopyDataFromQueue( xQUEUE * const pxQueue, const void *pvBuffer ) PRIVILEGED_FUNCTION; +static void prvCopyDataFromQueue( Queue_t * const pxQueue, void * const pvBuffer ) PRIVILEGED_FUNCTION; #if ( configUSE_QUEUE_SETS == 1 ) /* * Checks to see if a queue is a member of a queue set, and if so, notifies * the queue set that the queue contains data. */ - static portBASE_TYPE prvNotifyQueueSetContainer( xQUEUE *pxQueue, portBASE_TYPE xCopyPosition ); + static BaseType_t prvNotifyQueueSetContainer( const Queue_t * const pxQueue, const BaseType_t xCopyPosition ) PRIVILEGED_FUNCTION; #endif /*-----------------------------------------------------------*/ @@ -233,19 +257,18 @@ static void prvCopyDataFromQueue( xQUEUE * const pxQueue, const void *pvBuffer ) taskEXIT_CRITICAL() /*-----------------------------------------------------------*/ -portBASE_TYPE xQueueGenericReset( xQueueHandle xQueue, portBASE_TYPE xNewQueue ) +BaseType_t xQueueGenericReset( QueueHandle_t xQueue, BaseType_t xNewQueue ) { -xQUEUE *pxQueue; +Queue_t * const pxQueue = ( Queue_t * ) xQueue; - pxQueue = ( xQUEUE * ) xQueue; configASSERT( pxQueue ); taskENTER_CRITICAL(); { pxQueue->pcTail = pxQueue->pcHead + ( pxQueue->uxLength * pxQueue->uxItemSize ); - pxQueue->uxMessagesWaiting = ( unsigned portBASE_TYPE ) 0U; + pxQueue->uxMessagesWaiting = ( UBaseType_t ) 0U; pxQueue->pcWriteTo = pxQueue->pcHead; - pxQueue->pcReadFrom = pxQueue->pcHead + ( ( pxQueue->uxLength - ( unsigned portBASE_TYPE ) 1U ) * pxQueue->uxItemSize ); + pxQueue->u.pcReadFrom = pxQueue->pcHead + ( ( pxQueue->uxLength - ( UBaseType_t ) 1U ) * pxQueue->uxItemSize ); pxQueue->xRxLock = queueUNLOCKED; pxQueue->xTxLock = queueUNLOCKED; @@ -253,16 +276,24 @@ xQUEUE *pxQueue; { /* If there are tasks blocked waiting to read from the queue, then the tasks will remain blocked as after this function exits the queue - will still be empty. If there are tasks blocked waiting to write to + will still be empty. If there are tasks blocked waiting to write to the queue, then one should be unblocked as after this function exits it will be possible to write to it. */ if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToSend ) ) == pdFALSE ) { if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToSend ) ) == pdTRUE ) { - portYIELD_WITHIN_API(); + queueYIELD_IF_USING_PREEMPTION(); + } + else + { + mtCOVERAGE_TEST_MARKER(); } } + else + { + mtCOVERAGE_TEST_MARKER(); + } } else { @@ -279,56 +310,74 @@ xQUEUE *pxQueue; } /*-----------------------------------------------------------*/ -xQueueHandle xQueueGenericCreate( unsigned portBASE_TYPE uxQueueLength, unsigned portBASE_TYPE uxItemSize, unsigned char ucQueueType ) +QueueHandle_t xQueueGenericCreate( const UBaseType_t uxQueueLength, const UBaseType_t uxItemSize, const uint8_t ucQueueType ) { -xQUEUE *pxNewQueue; +Queue_t *pxNewQueue; size_t xQueueSizeInBytes; -xQueueHandle xReturn = NULL; +QueueHandle_t xReturn = NULL; /* Remove compiler warnings about unused parameters should configUSE_TRACE_FACILITY not be set to 1. */ ( void ) ucQueueType; - /* Allocate the new queue structure. */ - if( uxQueueLength > ( unsigned portBASE_TYPE ) 0 ) + configASSERT( uxQueueLength > ( UBaseType_t ) 0 ); + + if( uxItemSize == ( UBaseType_t ) 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; + /* There is not going to be a queue storage area. */ + xQueueSizeInBytes = ( size_t ) 0; + } + else + { + /* The queue is one byte longer than asked for to make wrap checking + easier/faster. */ + xQueueSizeInBytes = ( size_t ) ( uxQueueLength * uxItemSize ) + ( size_t ) 1; /*lint !e961 MISRA exception as the casts are only redundant for some ports. */ + } - pxNewQueue->pcHead = ( signed char * ) pvPortMalloc( xQueueSizeInBytes ); - if( pxNewQueue->pcHead != NULL ) - { - /* Initialise the queue members as described above where the - queue type is defined. */ - pxNewQueue->uxLength = uxQueueLength; - pxNewQueue->uxItemSize = uxItemSize; - xQueueGenericReset( pxNewQueue, pdTRUE ); + /* Allocate the new queue structure and storage area. */ + pxNewQueue = ( Queue_t * ) pvPortMalloc( sizeof( Queue_t ) + xQueueSizeInBytes ); - #if ( configUSE_TRACE_FACILITY == 1 ) - { - pxNewQueue->ucQueueType = ucQueueType; - } - #endif /* configUSE_TRACE_FACILITY */ + if( pxNewQueue != NULL ) + { + if( uxItemSize == ( UBaseType_t ) 0 ) + { + /* No RAM was allocated for the queue storage area, but PC head + cannot be set to NULL because NULL is used as a key to say the queue + is used as a mutex. Therefore just set pcHead to point to the queue + as a benign value that is known to be within the memory map. */ + pxNewQueue->pcHead = ( int8_t * ) pxNewQueue; + } + else + { + /* Jump past the queue structure to find the location of the queue + storage area. */ + pxNewQueue->pcHead = ( ( int8_t * ) pxNewQueue ) + sizeof( Queue_t ); + } - #if( configUSE_QUEUE_SETS == 1 ) - { - pxNewQueue->pxQueueSetContainer = NULL; - } - #endif /* configUSE_QUEUE_SETS */ + /* Initialise the queue members as described above where the queue type + is defined. */ + pxNewQueue->uxLength = uxQueueLength; + pxNewQueue->uxItemSize = uxItemSize; + ( void ) xQueueGenericReset( pxNewQueue, pdTRUE ); - traceQUEUE_CREATE( pxNewQueue ); - xReturn = pxNewQueue; - } - else - { - traceQUEUE_CREATE_FAILED( ucQueueType ); - vPortFree( pxNewQueue ); - } + #if ( configUSE_TRACE_FACILITY == 1 ) + { + pxNewQueue->ucQueueType = ucQueueType; + } + #endif /* configUSE_TRACE_FACILITY */ + + #if( configUSE_QUEUE_SETS == 1 ) + { + pxNewQueue->pxQueueSetContainer = NULL; } + #endif /* configUSE_QUEUE_SETS */ + + traceQUEUE_CREATE( pxNewQueue ); + xReturn = pxNewQueue; + } + else + { + mtCOVERAGE_TEST_MARKER(); } configASSERT( xReturn ); @@ -339,16 +388,16 @@ xQueueHandle xReturn = NULL; #if ( configUSE_MUTEXES == 1 ) - xQueueHandle xQueueCreateMutex( unsigned char ucQueueType ) + QueueHandle_t xQueueCreateMutex( const uint8_t ucQueueType ) { - xQUEUE *pxNewQueue; + Queue_t *pxNewQueue; /* Prevent compiler warnings about unused parameters if configUSE_TRACE_FACILITY does not equal 1. */ ( void ) ucQueueType; /* Allocate the new queue structure. */ - pxNewQueue = ( xQUEUE * ) pvPortMalloc( sizeof( xQUEUE ) ); + pxNewQueue = ( Queue_t * ) pvPortMalloc( sizeof( Queue_t ) ); if( pxNewQueue != NULL ) { /* Information required for priority inheritance. */ @@ -358,14 +407,14 @@ xQueueHandle xReturn = NULL; /* Queues used as a mutex no data is actually copied into or out of the queue. */ pxNewQueue->pcWriteTo = NULL; - pxNewQueue->pcReadFrom = NULL; + pxNewQueue->u.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->uxMessagesWaiting = ( UBaseType_t ) 0U; + pxNewQueue->uxLength = ( UBaseType_t ) 1U; + pxNewQueue->uxItemSize = ( UBaseType_t ) 0U; pxNewQueue->xRxLock = queueUNLOCKED; pxNewQueue->xTxLock = queueUNLOCKED; @@ -388,14 +437,13 @@ xQueueHandle xReturn = NULL; traceCREATE_MUTEX( pxNewQueue ); /* Start with the semaphore in the expected state. */ - xQueueGenericSend( pxNewQueue, NULL, ( portTickType ) 0U, queueSEND_TO_BACK ); + ( void ) xQueueGenericSend( pxNewQueue, NULL, ( TickType_t ) 0U, queueSEND_TO_BACK ); } else { traceCREATE_MUTEX_FAILED(); } - configASSERT( pxNewQueue ); return pxNewQueue; } @@ -404,20 +452,20 @@ xQueueHandle xReturn = NULL; #if ( ( configUSE_MUTEXES == 1 ) && ( INCLUDE_xSemaphoreGetMutexHolder == 1 ) ) - void* xQueueGetMutexHolder( xQueueHandle xSemaphore ) + void* xQueueGetMutexHolder( QueueHandle_t xSemaphore ) { void *pxReturn; /* This function is called by xSemaphoreGetMutexHolder(), and should not - be called directly. Note: This is is a good way of determining if the + be called directly. Note: This is a good way of determining if the calling task is the mutex holder, but not a good way of determining the identity of the mutex holder, as the holder may change between the following critical section exiting and the function returning. */ taskENTER_CRITICAL(); { - if( ( ( xQUEUE * ) xSemaphore )->uxQueueType == queueQUEUE_IS_MUTEX ) + if( ( ( Queue_t * ) xSemaphore )->uxQueueType == queueQUEUE_IS_MUTEX ) { - pxReturn = ( void * ) ( ( xQUEUE * ) xSemaphore )->pxMutexHolder; + pxReturn = ( void * ) ( ( Queue_t * ) xSemaphore )->pxMutexHolder; } else { @@ -427,19 +475,18 @@ xQueueHandle xReturn = NULL; taskEXIT_CRITICAL(); return pxReturn; - } + } /*lint !e818 xSemaphore cannot be a pointer to const because it is a typedef. */ #endif /*-----------------------------------------------------------*/ #if ( configUSE_RECURSIVE_MUTEXES == 1 ) - portBASE_TYPE xQueueGiveMutexRecursive( xQueueHandle xMutex ) + BaseType_t xQueueGiveMutexRecursive( QueueHandle_t xMutex ) { - portBASE_TYPE xReturn; - xQUEUE *pxMutex; + BaseType_t xReturn; + Queue_t * const pxMutex = ( Queue_t * ) xMutex; - pxMutex = ( xQUEUE * ) xMutex; configASSERT( pxMutex ); /* If this is the task that holds the mutex then pxMutexHolder will not @@ -448,7 +495,7 @@ xQueueHandle xReturn = NULL; 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() ) + if( pxMutex->pxMutexHolder == ( void * ) xTaskGetCurrentTaskHandle() ) /*lint !e961 Not a redundant cast as TaskHandle_t is a typedef. */ { traceGIVE_MUTEX_RECURSIVE( pxMutex ); @@ -457,21 +504,26 @@ xQueueHandle xReturn = NULL; 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 )--; + ( pxMutex->u.uxRecursiveCallCount )--; /* Have we unwound the call count? */ - if( pxMutex->uxRecursiveCallCount == 0 ) + if( pxMutex->u.uxRecursiveCallCount == ( UBaseType_t ) 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 ); + ( void ) xQueueGenericSend( pxMutex, NULL, queueMUTEX_GIVE_BLOCK_TIME, queueSEND_TO_BACK ); + } + else + { + mtCOVERAGE_TEST_MARKER(); } xReturn = pdPASS; } else { - /* We cannot give the mutex because we are not the holder. */ + /* The mutex cannot be given because the calling task is not the + holder. */ xReturn = pdFAIL; traceGIVE_MUTEX_RECURSIVE_FAILED( pxMutex ); @@ -485,12 +537,11 @@ xQueueHandle xReturn = NULL; #if ( configUSE_RECURSIVE_MUTEXES == 1 ) - portBASE_TYPE xQueueTakeMutexRecursive( xQueueHandle xMutex, portTickType xBlockTime ) + BaseType_t xQueueTakeMutexRecursive( QueueHandle_t xMutex, TickType_t xTicksToWait ) { - portBASE_TYPE xReturn; - xQUEUE *pxMutex; + BaseType_t xReturn; + Queue_t * const pxMutex = ( Queue_t * ) xMutex; - pxMutex = ( xQUEUE * ) xMutex; configASSERT( pxMutex ); /* Comments regarding mutual exclusion as per those within @@ -498,20 +549,21 @@ xQueueHandle xReturn = NULL; traceTAKE_MUTEX_RECURSIVE( pxMutex ); - if( pxMutex->pxMutexHolder == xTaskGetCurrentTaskHandle() ) + if( pxMutex->pxMutexHolder == ( void * ) xTaskGetCurrentTaskHandle() ) /*lint !e961 Cast is not redundant as TaskHandle_t is a typedef. */ { - ( pxMutex->uxRecursiveCallCount )++; + ( pxMutex->u.uxRecursiveCallCount )++; xReturn = pdPASS; } else { - xReturn = xQueueGenericReceive( pxMutex, NULL, xBlockTime, pdFALSE ); + xReturn = xQueueGenericReceive( pxMutex, NULL, xTicksToWait, pdFALSE ); - /* pdPASS will only be returned if we successfully obtained the mutex, - we may have blocked to reach here. */ + /* pdPASS will only be returned if the mutex was successfully + obtained. The calling task may have entered the Blocked state + before reaching here. */ if( xReturn == pdPASS ) { - ( pxMutex->uxRecursiveCallCount )++; + ( pxMutex->u.uxRecursiveCallCount )++; } else { @@ -527,15 +579,18 @@ xQueueHandle xReturn = NULL; #if ( configUSE_COUNTING_SEMAPHORES == 1 ) - xQueueHandle xQueueCreateCountingSemaphore( unsigned portBASE_TYPE uxCountValue, unsigned portBASE_TYPE uxInitialCount ) + QueueHandle_t xQueueCreateCountingSemaphore( const UBaseType_t uxMaxCount, const UBaseType_t uxInitialCount ) { - xQueueHandle xHandle; + QueueHandle_t xHandle; + + configASSERT( uxMaxCount != 0 ); + configASSERT( uxInitialCount <= uxMaxCount ); - xHandle = xQueueGenericCreate( ( unsigned portBASE_TYPE ) uxCountValue, queueSEMAPHORE_QUEUE_ITEM_LENGTH, queueQUEUE_TYPE_COUNTING_SEMAPHORE ); + xHandle = xQueueGenericCreate( uxMaxCount, queueSEMAPHORE_QUEUE_ITEM_LENGTH, queueQUEUE_TYPE_COUNTING_SEMAPHORE ); if( xHandle != NULL ) { - ( ( xQUEUE * ) xHandle )->uxMessagesWaiting = uxInitialCount; + ( ( Queue_t * ) xHandle )->uxMessagesWaiting = uxInitialCount; traceCREATE_COUNTING_SEMAPHORE(); } @@ -551,15 +606,21 @@ xQueueHandle xReturn = NULL; #endif /* configUSE_COUNTING_SEMAPHORES */ /*-----------------------------------------------------------*/ -signed portBASE_TYPE xQueueGenericSend( xQueueHandle xQueue, const void * const pvItemToQueue, portTickType xTicksToWait, portBASE_TYPE xCopyPosition ) +BaseType_t xQueueGenericSend( QueueHandle_t xQueue, const void * const pvItemToQueue, TickType_t xTicksToWait, const BaseType_t xCopyPosition ) { -signed portBASE_TYPE xEntryTimeSet = pdFALSE; -xTimeOutType xTimeOut; -xQUEUE *pxQueue; +BaseType_t xEntryTimeSet = pdFALSE, xYieldRequired; +TimeOut_t xTimeOut; +Queue_t * const pxQueue = ( Queue_t * ) xQueue; - pxQueue = ( xQUEUE * ) xQueue; configASSERT( pxQueue ); - configASSERT( !( ( pvItemToQueue == NULL ) && ( pxQueue->uxItemSize != ( unsigned portBASE_TYPE ) 0U ) ) ); + configASSERT( !( ( pvItemToQueue == NULL ) && ( pxQueue->uxItemSize != ( UBaseType_t ) 0U ) ) ); + configASSERT( !( ( xCopyPosition == queueOVERWRITE ) && ( pxQueue->uxLength != 1 ) ) ); + #if ( ( INCLUDE_xTaskGetSchedulerState == 1 ) || ( configUSE_TIMERS == 1 ) ) + { + configASSERT( !( ( xTaskGetSchedulerState() == taskSCHEDULER_SUSPENDED ) && ( xTicksToWait != 0 ) ) ); + } + #endif + /* This function relaxes the coding standard somewhat to allow return statements within the function itself. This is done in the interest @@ -568,12 +629,14 @@ xQUEUE *pxQueue; { 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 ) + /* Is there room on the queue now? The running task must be the + highest priority task wanting to access the queue. If the head item + in the queue is to be overwritten then it does not matter if the + queue is full. */ + if( ( pxQueue->uxMessagesWaiting < pxQueue->uxLength ) || ( xCopyPosition == queueOVERWRITE ) ) { traceQUEUE_SEND( pxQueue ); - prvCopyDataToQueue( pxQueue, pvItemToQueue, xCopyPosition ); + xYieldRequired = prvCopyDataToQueue( pxQueue, pvItemToQueue, xCopyPosition ); #if ( configUSE_QUEUE_SETS == 1 ) { @@ -584,7 +647,11 @@ xQUEUE *pxQueue; /* The queue is a member of a queue set, and posting to the queue set caused a higher priority task to unblock. A context switch is required. */ - portYIELD_WITHIN_API(); + queueYIELD_IF_USING_PREEMPTION(); + } + else + { + mtCOVERAGE_TEST_MARKER(); } } else @@ -599,9 +666,25 @@ xQUEUE *pxQueue; 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(); + queueYIELD_IF_USING_PREEMPTION(); + } + else + { + mtCOVERAGE_TEST_MARKER(); } } + else if( xYieldRequired != pdFALSE ) + { + /* This path is a special case that will only get + executed if the task was holding multiple mutexes + and the mutexes were given back in an order that is + different to that in which they were taken. */ + queueYIELD_IF_USING_PREEMPTION(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } } } #else /* configUSE_QUEUE_SETS */ @@ -616,21 +699,34 @@ xQUEUE *pxQueue; 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(); + queueYIELD_IF_USING_PREEMPTION(); + } + else + { + mtCOVERAGE_TEST_MARKER(); } } + else if( xYieldRequired != pdFALSE ) + { + /* This path is a special case that will only get + executed if the task was holding multiple mutexes and + the mutexes were given back in an order that is + different to that in which they were taken. */ + queueYIELD_IF_USING_PREEMPTION(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } } #endif /* configUSE_QUEUE_SETS */ taskEXIT_CRITICAL(); - - /* Return to the original privilege level before exiting the - function. */ return pdPASS; } else { - if( xTicksToWait == ( portTickType ) 0 ) + if( xTicksToWait == ( TickType_t ) 0 ) { /* The queue was full and no block time is specified (or the block time has expired) so leave now. */ @@ -648,6 +744,11 @@ xQUEUE *pxQueue; vTaskSetTimeOutState( &xTimeOut ); xEntryTimeSet = pdTRUE; } + else + { + /* Entry time was already set. */ + mtCOVERAGE_TEST_MARKER(); + } } } taskEXIT_CRITICAL(); @@ -707,15 +808,14 @@ xQUEUE *pxQueue; #if ( configUSE_ALTERNATIVE_API == 1 ) - signed portBASE_TYPE xQueueAltGenericSend( xQueueHandle xQueue, const void * const pvItemToQueue, portTickType xTicksToWait, portBASE_TYPE xCopyPosition ) + BaseType_t xQueueAltGenericSend( QueueHandle_t xQueue, const void * const pvItemToQueue, TickType_t xTicksToWait, BaseType_t xCopyPosition ) { - signed portBASE_TYPE xEntryTimeSet = pdFALSE; - xTimeOutType xTimeOut; - xQUEUE *pxQueue; + BaseType_t xEntryTimeSet = pdFALSE; + TimeOut_t xTimeOut; + Queue_t * const pxQueue = ( Queue_t * ) xQueue; - pxQueue = ( xQUEUE * ) xQueue; configASSERT( pxQueue ); - configASSERT( !( ( pvItemToQueue == NULL ) && ( pxQueue->uxItemSize != ( unsigned portBASE_TYPE ) 0U ) ) ); + configASSERT( !( ( pvItemToQueue == NULL ) && ( pxQueue->uxItemSize != ( UBaseType_t ) 0U ) ) ); for( ;; ) { @@ -738,6 +838,14 @@ xQUEUE *pxQueue; our own so yield immediately. */ portYIELD_WITHIN_API(); } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); } taskEXIT_CRITICAL(); @@ -745,7 +853,7 @@ xQUEUE *pxQueue; } else { - if( xTicksToWait == ( portTickType ) 0 ) + if( xTicksToWait == ( TickType_t ) 0 ) { taskEXIT_CRITICAL(); return errQUEUE_FULL; @@ -769,6 +877,10 @@ xQUEUE *pxQueue; vTaskPlaceOnEventList( &( pxQueue->xTasksWaitingToSend ), xTicksToWait ); portYIELD_WITHIN_API(); } + else + { + mtCOVERAGE_TEST_MARKER(); + } } else { @@ -786,25 +898,24 @@ xQUEUE *pxQueue; #if ( configUSE_ALTERNATIVE_API == 1 ) - signed portBASE_TYPE xQueueAltGenericReceive( xQueueHandle xQueue, void * const pvBuffer, portTickType xTicksToWait, portBASE_TYPE xJustPeeking ) + BaseType_t xQueueAltGenericReceive( QueueHandle_t xQueue, void * const pvBuffer, TickType_t xTicksToWait, BaseType_t xJustPeeking ) { - signed portBASE_TYPE xEntryTimeSet = pdFALSE; - xTimeOutType xTimeOut; - signed char *pcOriginalReadPosition; - xQUEUE *pxQueue; + BaseType_t xEntryTimeSet = pdFALSE; + TimeOut_t xTimeOut; + int8_t *pcOriginalReadPosition; + Queue_t * const pxQueue = ( Queue_t * ) xQueue; - pxQueue = ( xQUEUE * ) xQueue; configASSERT( pxQueue ); - configASSERT( !( ( pvBuffer == NULL ) && ( pxQueue->uxItemSize != ( unsigned portBASE_TYPE ) 0U ) ) ); + configASSERT( !( ( pvBuffer == NULL ) && ( pxQueue->uxItemSize != ( UBaseType_t ) 0U ) ) ); for( ;; ) { taskENTER_CRITICAL(); { - if( pxQueue->uxMessagesWaiting > ( unsigned portBASE_TYPE ) 0 ) + if( pxQueue->uxMessagesWaiting > ( UBaseType_t ) 0 ) { /* Remember our read position in case we are just peeking. */ - pcOriginalReadPosition = pxQueue->pcReadFrom; + pcOriginalReadPosition = pxQueue->u.pcReadFrom; prvCopyDataFromQueue( pxQueue, pvBuffer ); @@ -812,7 +923,7 @@ xQUEUE *pxQueue; { traceQUEUE_RECEIVE( pxQueue ); - /* We are actually removing data. */ + /* Data is actually being removed (not just peeked). */ --( pxQueue->uxMessagesWaiting ); #if ( configUSE_MUTEXES == 1 ) @@ -821,7 +932,11 @@ xQUEUE *pxQueue; { /* Record the information required to implement priority inheritance should it become necessary. */ - pxQueue->pxMutexHolder = xTaskGetCurrentTaskHandle(); + pxQueue->pxMutexHolder = ( int8_t * ) xTaskGetCurrentTaskHandle(); + } + else + { + mtCOVERAGE_TEST_MARKER(); } } #endif @@ -832,15 +947,19 @@ xQUEUE *pxQueue; { portYIELD_WITHIN_API(); } + else + { + mtCOVERAGE_TEST_MARKER(); + } } } else { traceQUEUE_PEEK( pxQueue ); - /* We are not removing the data, so reset our read + /* The data is not being removed, so reset our read pointer. */ - pxQueue->pcReadFrom = pcOriginalReadPosition; + pxQueue->u.pcReadFrom = pcOriginalReadPosition; /* The data is being left in the queue, so see if there are any other tasks waiting for the data. */ @@ -853,8 +972,15 @@ xQUEUE *pxQueue; /* The task waiting has a higher priority than this task. */ portYIELD_WITHIN_API(); } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); } - } taskEXIT_CRITICAL(); @@ -862,7 +988,7 @@ xQUEUE *pxQueue; } else { - if( xTicksToWait == ( portTickType ) 0 ) + if( xTicksToWait == ( TickType_t ) 0 ) { taskEXIT_CRITICAL(); traceQUEUE_RECEIVE_FAILED( pxQueue ); @@ -889,11 +1015,15 @@ xQUEUE *pxQueue; { if( pxQueue->uxQueueType == queueQUEUE_IS_MUTEX ) { - portENTER_CRITICAL(); + taskENTER_CRITICAL(); { vTaskPriorityInherit( ( void * ) pxQueue->pxMutexHolder ); } - portEXIT_CRITICAL(); + taskEXIT_CRITICAL(); + } + else + { + mtCOVERAGE_TEST_MARKER(); } } #endif @@ -901,6 +1031,10 @@ xQUEUE *pxQueue; vTaskPlaceOnEventList( &( pxQueue->xTasksWaitingToReceive ), xTicksToWait ); portYIELD_WITHIN_API(); } + else + { + mtCOVERAGE_TEST_MARKER(); + } } else { @@ -917,30 +1051,51 @@ xQUEUE *pxQueue; #endif /* configUSE_ALTERNATIVE_API */ /*-----------------------------------------------------------*/ -signed portBASE_TYPE xQueueGenericSendFromISR( xQueueHandle xQueue, const void * const pvItemToQueue, signed portBASE_TYPE *pxHigherPriorityTaskWoken, portBASE_TYPE xCopyPosition ) +BaseType_t xQueueGenericSendFromISR( QueueHandle_t xQueue, const void * const pvItemToQueue, BaseType_t * const pxHigherPriorityTaskWoken, const BaseType_t xCopyPosition ) { -signed portBASE_TYPE xReturn; -unsigned portBASE_TYPE uxSavedInterruptStatus; -xQUEUE *pxQueue; +BaseType_t xReturn; +UBaseType_t uxSavedInterruptStatus; +Queue_t * const pxQueue = ( Queue_t * ) xQueue; - pxQueue = ( xQUEUE * ) xQueue; configASSERT( pxQueue ); - 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). */ + configASSERT( !( ( pvItemToQueue == NULL ) && ( pxQueue->uxItemSize != ( UBaseType_t ) 0U ) ) ); + configASSERT( !( ( xCopyPosition == queueOVERWRITE ) && ( pxQueue->uxLength != 1 ) ) ); + + /* RTOS ports that support interrupt nesting have the concept of a maximum + system call (or maximum API call) interrupt priority. Interrupts that are + above the maximum system call priority are kept permanently enabled, even + when the RTOS kernel is in a critical section, but cannot make any calls to + FreeRTOS API functions. If configASSERT() is defined in FreeRTOSConfig.h + then portASSERT_IF_INTERRUPT_PRIORITY_INVALID() will result in an assertion + failure if a FreeRTOS API function is called from an interrupt that has been + assigned a priority above the configured maximum system call priority. + Only FreeRTOS functions that end in FromISR can be called from interrupts + that have been assigned a priority at or (logically) below the maximum + system call interrupt priority. FreeRTOS maintains a separate interrupt + safe API to ensure interrupt entry is as fast and as simple as possible. + More information (albeit Cortex-M specific) is provided on the following + link: http://www.freertos.org/RTOS-Cortex-M3-M4.html */ + portASSERT_IF_INTERRUPT_PRIORITY_INVALID(); + + /* Similar to xQueueGenericSend, except without blocking if there is no room + in the queue. Also don't directly wake a task that was blocked on a queue + read, instead 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 ) + if( ( pxQueue->uxMessagesWaiting < pxQueue->uxLength ) || ( xCopyPosition == queueOVERWRITE ) ) { traceQUEUE_SEND_FROM_ISR( pxQueue ); - prvCopyDataToQueue( pxQueue, pvItemToQueue, xCopyPosition ); + /* Semaphores use xQueueGiveFromISR(), so pxQueue will not be a + semaphore or mutex. That means prvCopyDataToQueue() cannot result + in a task disinheriting a priority and prvCopyDataToQueue() can be + called here even though the disinherit function does not check if + the scheduler is suspended before accessing the ready lists. */ + ( void ) prvCopyDataToQueue( pxQueue, pvItemToQueue, xCopyPosition ); - /* If the queue is locked we do not alter the event list. This will + /* The event list is not altered if the queue is locked. This will be done when the queue is unlocked later. */ if( pxQueue->xTxLock == queueUNLOCKED ) { @@ -957,6 +1112,14 @@ xQUEUE *pxQueue; { *pxHigherPriorityTaskWoken = pdTRUE; } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); } } else @@ -965,13 +1128,25 @@ xQUEUE *pxQueue; { if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToReceive ) ) != pdFALSE ) { - /* The task waiting has a higher priority so record that a - context switch is required. */ + /* The task waiting has a higher priority so + record that a context switch is required. */ if( pxHigherPriorityTaskWoken != NULL ) { *pxHigherPriorityTaskWoken = pdTRUE; } + else + { + mtCOVERAGE_TEST_MARKER(); + } } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); } } } @@ -987,8 +1162,20 @@ xQUEUE *pxQueue; { *pxHigherPriorityTaskWoken = pdTRUE; } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); } } + else + { + mtCOVERAGE_TEST_MARKER(); + } } #endif /* configUSE_QUEUE_SETS */ } @@ -1013,16 +1200,181 @@ xQUEUE *pxQueue; } /*-----------------------------------------------------------*/ -signed portBASE_TYPE xQueueGenericReceive( xQueueHandle xQueue, void * const pvBuffer, portTickType xTicksToWait, portBASE_TYPE xJustPeeking ) +BaseType_t xQueueGiveFromISR( QueueHandle_t xQueue, BaseType_t * const pxHigherPriorityTaskWoken ) { -signed portBASE_TYPE xEntryTimeSet = pdFALSE; -xTimeOutType xTimeOut; -signed char *pcOriginalReadPosition; -xQUEUE *pxQueue; +BaseType_t xReturn; +UBaseType_t uxSavedInterruptStatus; +Queue_t * const pxQueue = ( Queue_t * ) xQueue; + + /* Similar to xQueueGenericSendFromISR() but used with semaphores where the + item size is 0. Don't directly wake a task that was blocked on a queue + read, instead 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). */ - pxQueue = ( xQUEUE * ) xQueue; configASSERT( pxQueue ); - configASSERT( !( ( pvBuffer == NULL ) && ( pxQueue->uxItemSize != ( unsigned portBASE_TYPE ) 0U ) ) ); + + /* xQueueGenericSendFromISR() should be used instead of xQueueGiveFromISR() + if the item size is not 0. */ + configASSERT( pxQueue->uxItemSize == 0 ); + + /* Normally a mutex would not be given from an interrupt, especially if + there is a mutex holder, as priority inheritance makes no sense for an + interrupts, only tasks. */ + configASSERT( !( ( pxQueue->uxQueueType == queueQUEUE_IS_MUTEX ) && ( pxQueue->pxMutexHolder != NULL ) ) ); + + /* RTOS ports that support interrupt nesting have the concept of a maximum + system call (or maximum API call) interrupt priority. Interrupts that are + above the maximum system call priority are kept permanently enabled, even + when the RTOS kernel is in a critical section, but cannot make any calls to + FreeRTOS API functions. If configASSERT() is defined in FreeRTOSConfig.h + then portASSERT_IF_INTERRUPT_PRIORITY_INVALID() will result in an assertion + failure if a FreeRTOS API function is called from an interrupt that has been + assigned a priority above the configured maximum system call priority. + Only FreeRTOS functions that end in FromISR can be called from interrupts + that have been assigned a priority at or (logically) below the maximum + system call interrupt priority. FreeRTOS maintains a separate interrupt + safe API to ensure interrupt entry is as fast and as simple as possible. + More information (albeit Cortex-M specific) is provided on the following + link: http://www.freertos.org/RTOS-Cortex-M3-M4.html */ + portASSERT_IF_INTERRUPT_PRIORITY_INVALID(); + + uxSavedInterruptStatus = portSET_INTERRUPT_MASK_FROM_ISR(); + { + /* When the queue is used to implement a semaphore no data is ever + moved through the queue but it is still valid to see if the queue 'has + space'. */ + if( pxQueue->uxMessagesWaiting < pxQueue->uxLength ) + { + traceQUEUE_SEND_FROM_ISR( pxQueue ); + + /* A task can only have an inherited priority if it is a mutex + holder - and if there is a mutex holder then the mutex cannot be + given from an ISR. As this is the ISR version of the function it + can be assumed there is no mutex holder and no need to determine if + priority disinheritance is needed. Simply increase the count of + messages (semaphores) available. */ + ++( pxQueue->uxMessagesWaiting ); + + /* The event list is not altered if the queue is locked. This will + be done when the queue is unlocked later. */ + if( pxQueue->xTxLock == queueUNLOCKED ) + { + #if ( configUSE_QUEUE_SETS == 1 ) + { + if( pxQueue->pxQueueSetContainer != NULL ) + { + if( prvNotifyQueueSetContainer( pxQueue, queueSEND_TO_BACK ) == pdTRUE ) + { + /* The semaphore is a member of a queue set, and + posting to the queue set caused a higher priority + task to unblock. A context switch is required. */ + if( pxHigherPriorityTaskWoken != NULL ) + { + *pxHigherPriorityTaskWoken = pdTRUE; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + 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. */ + if( pxHigherPriorityTaskWoken != NULL ) + { + *pxHigherPriorityTaskWoken = pdTRUE; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + } + #else /* configUSE_QUEUE_SETS */ + { + 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. */ + if( pxHigherPriorityTaskWoken != NULL ) + { + *pxHigherPriorityTaskWoken = pdTRUE; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + #endif /* configUSE_QUEUE_SETS */ + } + 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; +} +/*-----------------------------------------------------------*/ + +BaseType_t xQueueGenericReceive( QueueHandle_t xQueue, void * const pvBuffer, TickType_t xTicksToWait, const BaseType_t xJustPeeking ) +{ +BaseType_t xEntryTimeSet = pdFALSE; +TimeOut_t xTimeOut; +int8_t *pcOriginalReadPosition; +Queue_t * const pxQueue = ( Queue_t * ) xQueue; + + configASSERT( pxQueue ); + configASSERT( !( ( pvBuffer == NULL ) && ( pxQueue->uxItemSize != ( UBaseType_t ) 0U ) ) ); + #if ( ( INCLUDE_xTaskGetSchedulerState == 1 ) || ( configUSE_TIMERS == 1 ) ) + { + configASSERT( !( ( xTaskGetSchedulerState() == taskSCHEDULER_SUSPENDED ) && ( xTicksToWait != 0 ) ) ); + } + #endif /* This function relaxes the coding standard somewhat to allow return statements within the function itself. This is done in the interest @@ -1032,12 +1384,13 @@ xQUEUE *pxQueue; { 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 ) + /* Is there data in the queue now? To be running the calling task + must be the highest priority task wanting to access the queue. */ + if( pxQueue->uxMessagesWaiting > ( UBaseType_t ) 0 ) { - /* Remember our read position in case we are just peeking. */ - pcOriginalReadPosition = pxQueue->pcReadFrom; + /* Remember the read position in case the queue is only being + peeked. */ + pcOriginalReadPosition = pxQueue->u.pcReadFrom; prvCopyDataFromQueue( pxQueue, pvBuffer ); @@ -1045,7 +1398,7 @@ xQUEUE *pxQueue; { traceQUEUE_RECEIVE( pxQueue ); - /* We are actually removing data. */ + /* Actually removing data, not just peeking. */ --( pxQueue->uxMessagesWaiting ); #if ( configUSE_MUTEXES == 1 ) @@ -1054,17 +1407,29 @@ xQUEUE *pxQueue; { /* Record the information required to implement priority inheritance should it become necessary. */ - pxQueue->pxMutexHolder = xTaskGetCurrentTaskHandle(); + pxQueue->pxMutexHolder = ( int8_t * ) pvTaskIncrementMutexHeldCount(); /*lint !e961 Cast is not redundant as TaskHandle_t is a typedef. */ + } + else + { + mtCOVERAGE_TEST_MARKER(); } } - #endif + #endif /* configUSE_MUTEXES */ if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToSend ) ) == pdFALSE ) { if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToSend ) ) == pdTRUE ) { - portYIELD_WITHIN_API(); + queueYIELD_IF_USING_PREEMPTION(); } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); } } else @@ -1073,20 +1438,26 @@ xQUEUE *pxQueue; /* The data is not being removed, so reset the read pointer. */ - pxQueue->pcReadFrom = pcOriginalReadPosition; + pxQueue->u.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(); + queueYIELD_IF_USING_PREEMPTION(); + } + else + { + mtCOVERAGE_TEST_MARKER(); } } + else + { + mtCOVERAGE_TEST_MARKER(); + } } taskEXIT_CRITICAL(); @@ -1094,7 +1465,7 @@ xQUEUE *pxQueue; } else { - if( xTicksToWait == ( portTickType ) 0 ) + if( xTicksToWait == ( TickType_t ) 0 ) { /* The queue was empty and no block time is specified (or the block time has expired) so leave now. */ @@ -1109,6 +1480,11 @@ xQUEUE *pxQueue; vTaskSetTimeOutState( &xTimeOut ); xEntryTimeSet = pdTRUE; } + else + { + /* Entry time was already set. */ + mtCOVERAGE_TEST_MARKER(); + } } } taskEXIT_CRITICAL(); @@ -1130,11 +1506,15 @@ xQUEUE *pxQueue; { if( pxQueue->uxQueueType == queueQUEUE_IS_MUTEX ) { - portENTER_CRITICAL(); + taskENTER_CRITICAL(); { vTaskPriorityInherit( ( void * ) pxQueue->pxMutexHolder ); } - portEXIT_CRITICAL(); + taskEXIT_CRITICAL(); + } + else + { + mtCOVERAGE_TEST_MARKER(); } } #endif @@ -1145,6 +1525,10 @@ xQUEUE *pxQueue; { portYIELD_WITHIN_API(); } + else + { + mtCOVERAGE_TEST_MARKER(); + } } else { @@ -1164,29 +1548,45 @@ xQUEUE *pxQueue; } /*-----------------------------------------------------------*/ -signed portBASE_TYPE xQueueReceiveFromISR( xQueueHandle xQueue, void * const pvBuffer, signed portBASE_TYPE *pxHigherPriorityTaskWoken ) +BaseType_t xQueueReceiveFromISR( QueueHandle_t xQueue, void * const pvBuffer, BaseType_t * const pxHigherPriorityTaskWoken ) { -signed portBASE_TYPE xReturn; -unsigned portBASE_TYPE uxSavedInterruptStatus; -xQUEUE *pxQueue; +BaseType_t xReturn; +UBaseType_t uxSavedInterruptStatus; +Queue_t * const pxQueue = ( Queue_t * ) xQueue; - pxQueue = ( xQUEUE * ) xQueue; configASSERT( pxQueue ); - configASSERT( !( ( pvBuffer == NULL ) && ( pxQueue->uxItemSize != ( unsigned portBASE_TYPE ) 0U ) ) ); + configASSERT( !( ( pvBuffer == NULL ) && ( pxQueue->uxItemSize != ( UBaseType_t ) 0U ) ) ); + + /* RTOS ports that support interrupt nesting have the concept of a maximum + system call (or maximum API call) interrupt priority. Interrupts that are + above the maximum system call priority are kept permanently enabled, even + when the RTOS kernel is in a critical section, but cannot make any calls to + FreeRTOS API functions. If configASSERT() is defined in FreeRTOSConfig.h + then portASSERT_IF_INTERRUPT_PRIORITY_INVALID() will result in an assertion + failure if a FreeRTOS API function is called from an interrupt that has been + assigned a priority above the configured maximum system call priority. + Only FreeRTOS functions that end in FromISR can be called from interrupts + that have been assigned a priority at or (logically) below the maximum + system call interrupt priority. FreeRTOS maintains a separate interrupt + safe API to ensure interrupt entry is as fast and as simple as possible. + More information (albeit Cortex-M specific) is provided on the following + link: http://www.freertos.org/RTOS-Cortex-M3-M4.html */ + portASSERT_IF_INTERRUPT_PRIORITY_INVALID(); 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 ) + /* Cannot block in an ISR, so check there is data available. */ + if( pxQueue->uxMessagesWaiting > ( UBaseType_t ) 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 the queue is locked the event list will not be modified. + Instead 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 ) @@ -1199,8 +1599,20 @@ xQUEUE *pxQueue; { *pxHigherPriorityTaskWoken = pdTRUE; } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); } } + else + { + mtCOVERAGE_TEST_MARKER(); + } } else { @@ -1223,55 +1635,127 @@ xQUEUE *pxQueue; } /*-----------------------------------------------------------*/ -unsigned portBASE_TYPE uxQueueMessagesWaiting( const xQueueHandle xQueue ) +BaseType_t xQueuePeekFromISR( QueueHandle_t xQueue, void * const pvBuffer ) +{ +BaseType_t xReturn; +UBaseType_t uxSavedInterruptStatus; +int8_t *pcOriginalReadPosition; +Queue_t * const pxQueue = ( Queue_t * ) xQueue; + + configASSERT( pxQueue ); + configASSERT( !( ( pvBuffer == NULL ) && ( pxQueue->uxItemSize != ( UBaseType_t ) 0U ) ) ); + configASSERT( pxQueue->uxItemSize != 0 ); /* Can't peek a semaphore. */ + + /* RTOS ports that support interrupt nesting have the concept of a maximum + system call (or maximum API call) interrupt priority. Interrupts that are + above the maximum system call priority are kept permanently enabled, even + when the RTOS kernel is in a critical section, but cannot make any calls to + FreeRTOS API functions. If configASSERT() is defined in FreeRTOSConfig.h + then portASSERT_IF_INTERRUPT_PRIORITY_INVALID() will result in an assertion + failure if a FreeRTOS API function is called from an interrupt that has been + assigned a priority above the configured maximum system call priority. + Only FreeRTOS functions that end in FromISR can be called from interrupts + that have been assigned a priority at or (logically) below the maximum + system call interrupt priority. FreeRTOS maintains a separate interrupt + safe API to ensure interrupt entry is as fast and as simple as possible. + More information (albeit Cortex-M specific) is provided on the following + link: http://www.freertos.org/RTOS-Cortex-M3-M4.html */ + portASSERT_IF_INTERRUPT_PRIORITY_INVALID(); + + uxSavedInterruptStatus = portSET_INTERRUPT_MASK_FROM_ISR(); + { + /* Cannot block in an ISR, so check there is data available. */ + if( pxQueue->uxMessagesWaiting > ( UBaseType_t ) 0 ) + { + traceQUEUE_PEEK_FROM_ISR( pxQueue ); + + /* Remember the read position so it can be reset as nothing is + actually being removed from the queue. */ + pcOriginalReadPosition = pxQueue->u.pcReadFrom; + prvCopyDataFromQueue( pxQueue, pvBuffer ); + pxQueue->u.pcReadFrom = pcOriginalReadPosition; + + xReturn = pdPASS; + } + else + { + xReturn = pdFAIL; + traceQUEUE_PEEK_FROM_ISR_FAILED( pxQueue ); + } + } + portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedInterruptStatus ); + + return xReturn; +} +/*-----------------------------------------------------------*/ + +UBaseType_t uxQueueMessagesWaiting( const QueueHandle_t xQueue ) { -unsigned portBASE_TYPE uxReturn; +UBaseType_t uxReturn; configASSERT( xQueue ); taskENTER_CRITICAL(); - uxReturn = ( ( xQUEUE * ) xQueue )->uxMessagesWaiting; + { + uxReturn = ( ( Queue_t * ) xQueue )->uxMessagesWaiting; + } taskEXIT_CRITICAL(); return uxReturn; -} +} /*lint !e818 Pointer cannot be declared const as xQueue is a typedef not pointer. */ /*-----------------------------------------------------------*/ -unsigned portBASE_TYPE uxQueueMessagesWaitingFromISR( const xQueueHandle xQueue ) +UBaseType_t uxQueueSpacesAvailable( const QueueHandle_t xQueue ) { -unsigned portBASE_TYPE uxReturn; +UBaseType_t uxReturn; +Queue_t *pxQueue; + + pxQueue = ( Queue_t * ) xQueue; + configASSERT( pxQueue ); + + taskENTER_CRITICAL(); + { + uxReturn = pxQueue->uxLength - pxQueue->uxMessagesWaiting; + } + taskEXIT_CRITICAL(); + + return uxReturn; +} /*lint !e818 Pointer cannot be declared const as xQueue is a typedef not pointer. */ +/*-----------------------------------------------------------*/ + +UBaseType_t uxQueueMessagesWaitingFromISR( const QueueHandle_t xQueue ) +{ +UBaseType_t uxReturn; configASSERT( xQueue ); - uxReturn = ( ( xQUEUE * ) xQueue )->uxMessagesWaiting; + uxReturn = ( ( Queue_t * ) xQueue )->uxMessagesWaiting; return uxReturn; -} +} /*lint !e818 Pointer cannot be declared const as xQueue is a typedef not pointer. */ /*-----------------------------------------------------------*/ -void vQueueDelete( xQueueHandle xQueue ) +void vQueueDelete( QueueHandle_t xQueue ) { -xQUEUE *pxQueue; +Queue_t * const pxQueue = ( Queue_t * ) xQueue; - pxQueue = ( xQUEUE * ) xQueue; configASSERT( pxQueue ); traceQUEUE_DELETE( pxQueue ); #if ( configQUEUE_REGISTRY_SIZE > 0 ) { - prvQueueUnregisterQueue( pxQueue ); + vQueueUnregisterQueue( pxQueue ); } #endif - vPortFree( pxQueue->pcHead ); vPortFree( pxQueue ); } /*-----------------------------------------------------------*/ #if ( configUSE_TRACE_FACILITY == 1 ) - unsigned char ucQueueGetQueueNumber( xQueueHandle xQueue ) + UBaseType_t uxQueueGetQueueNumber( QueueHandle_t xQueue ) { - return ( ( xQUEUE * ) xQueue )->ucQueueNumber; + return ( ( Queue_t * ) xQueue )->uxQueueNumber; } #endif /* configUSE_TRACE_FACILITY */ @@ -1279,9 +1763,9 @@ xQUEUE *pxQueue; #if ( configUSE_TRACE_FACILITY == 1 ) - void vQueueSetQueueNumber( xQueueHandle xQueue, unsigned char ucQueueNumber ) + void vQueueSetQueueNumber( QueueHandle_t xQueue, UBaseType_t uxQueueNumber ) { - ( ( xQUEUE * ) xQueue )->ucQueueNumber = ucQueueNumber; + ( ( Queue_t * ) xQueue )->uxQueueNumber = uxQueueNumber; } #endif /* configUSE_TRACE_FACILITY */ @@ -1289,67 +1773,107 @@ xQUEUE *pxQueue; #if ( configUSE_TRACE_FACILITY == 1 ) - unsigned char ucQueueGetQueueType( xQueueHandle xQueue ) + uint8_t ucQueueGetQueueType( QueueHandle_t xQueue ) { - return ( ( xQUEUE * ) xQueue )->ucQueueType; + return ( ( Queue_t * ) xQueue )->ucQueueType; } #endif /* configUSE_TRACE_FACILITY */ /*-----------------------------------------------------------*/ -static void prvCopyDataToQueue( xQUEUE *pxQueue, const void *pvItemToQueue, portBASE_TYPE xPosition ) +static BaseType_t prvCopyDataToQueue( Queue_t * const pxQueue, const void *pvItemToQueue, const BaseType_t xPosition ) { - if( pxQueue->uxItemSize == ( unsigned portBASE_TYPE ) 0 ) +BaseType_t xReturn = pdFALSE; + + if( pxQueue->uxItemSize == ( UBaseType_t ) 0 ) { #if ( configUSE_MUTEXES == 1 ) { if( pxQueue->uxQueueType == queueQUEUE_IS_MUTEX ) { /* The mutex is no longer being held. */ - vTaskPriorityDisinherit( ( void * ) pxQueue->pxMutexHolder ); + xReturn = xTaskPriorityDisinherit( ( void * ) pxQueue->pxMutexHolder ); pxQueue->pxMutexHolder = NULL; } + else + { + mtCOVERAGE_TEST_MARKER(); + } } - #endif + #endif /* configUSE_MUTEXES */ } else if( xPosition == queueSEND_TO_BACK ) { - memcpy( ( void * ) pxQueue->pcWriteTo, pvItemToQueue, ( unsigned ) pxQueue->uxItemSize ); + ( void ) memcpy( ( void * ) pxQueue->pcWriteTo, pvItemToQueue, ( size_t ) pxQueue->uxItemSize ); /*lint !e961 !e418 MISRA exception as the casts are only redundant for some ports, plus previous logic ensures a null pointer can only be passed to memcpy() if the copy size is 0. */ pxQueue->pcWriteTo += pxQueue->uxItemSize; - if( pxQueue->pcWriteTo >= pxQueue->pcTail ) + if( pxQueue->pcWriteTo >= pxQueue->pcTail ) /*lint !e946 MISRA exception justified as comparison of pointers is the cleanest solution. */ { pxQueue->pcWriteTo = pxQueue->pcHead; } + else + { + mtCOVERAGE_TEST_MARKER(); + } } else { - memcpy( ( void * ) pxQueue->pcReadFrom, pvItemToQueue, ( unsigned ) pxQueue->uxItemSize ); - pxQueue->pcReadFrom -= pxQueue->uxItemSize; - if( pxQueue->pcReadFrom < pxQueue->pcHead ) + ( void ) memcpy( ( void * ) pxQueue->u.pcReadFrom, pvItemToQueue, ( size_t ) pxQueue->uxItemSize ); /*lint !e961 MISRA exception as the casts are only redundant for some ports. */ + pxQueue->u.pcReadFrom -= pxQueue->uxItemSize; + if( pxQueue->u.pcReadFrom < pxQueue->pcHead ) /*lint !e946 MISRA exception justified as comparison of pointers is the cleanest solution. */ + { + pxQueue->u.pcReadFrom = ( pxQueue->pcTail - pxQueue->uxItemSize ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + if( xPosition == queueOVERWRITE ) + { + if( pxQueue->uxMessagesWaiting > ( UBaseType_t ) 0 ) + { + /* An item is not being added but overwritten, so subtract + one from the recorded number of items in the queue so when + one is added again below the number of recorded items remains + correct. */ + --( pxQueue->uxMessagesWaiting ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else { - pxQueue->pcReadFrom = ( pxQueue->pcTail - pxQueue->uxItemSize ); + mtCOVERAGE_TEST_MARKER(); } } ++( pxQueue->uxMessagesWaiting ); + + return xReturn; } /*-----------------------------------------------------------*/ -static void prvCopyDataFromQueue( xQUEUE * const pxQueue, const void *pvBuffer ) +static void prvCopyDataFromQueue( Queue_t * const pxQueue, void * const pvBuffer ) { - if( pxQueue->uxQueueType != queueQUEUE_IS_MUTEX ) + if( pxQueue->uxItemSize != ( UBaseType_t ) 0 ) { - pxQueue->pcReadFrom += pxQueue->uxItemSize; - if( pxQueue->pcReadFrom >= pxQueue->pcTail ) + pxQueue->u.pcReadFrom += pxQueue->uxItemSize; + if( pxQueue->u.pcReadFrom >= pxQueue->pcTail ) /*lint !e946 MISRA exception justified as use of the relational operator is the cleanest solutions. */ + { + pxQueue->u.pcReadFrom = pxQueue->pcHead; + } + else { - pxQueue->pcReadFrom = pxQueue->pcHead; + mtCOVERAGE_TEST_MARKER(); } - memcpy( ( void * ) pvBuffer, ( void * ) pxQueue->pcReadFrom, ( unsigned ) pxQueue->uxItemSize ); + ( void ) memcpy( ( void * ) pvBuffer, ( void * ) pxQueue->u.pcReadFrom, ( size_t ) pxQueue->uxItemSize ); /*lint !e961 !e418 MISRA exception as the casts are only redundant for some ports. Also previous logic ensures a null pointer can only be passed to memcpy() when the count is 0. */ } } /*-----------------------------------------------------------*/ -static void prvUnlockQueue( xQUEUE *pxQueue ) +static void prvUnlockQueue( Queue_t * const pxQueue ) { /* THIS FUNCTION MUST BE CALLED WITH THE SCHEDULER SUSPENDED. */ @@ -1375,6 +1899,10 @@ static void prvUnlockQueue( xQUEUE *pxQueue ) A context switch is required. */ vTaskMissedYield(); } + else + { + mtCOVERAGE_TEST_MARKER(); + } } else { @@ -1388,6 +1916,10 @@ static void prvUnlockQueue( xQUEUE *pxQueue ) context switch is required. */ vTaskMissedYield(); } + else + { + mtCOVERAGE_TEST_MARKER(); + } } else { @@ -1407,6 +1939,10 @@ static void prvUnlockQueue( xQUEUE *pxQueue ) context switch is required. */ vTaskMissedYield(); } + else + { + mtCOVERAGE_TEST_MARKER(); + } } else { @@ -1433,6 +1969,10 @@ static void prvUnlockQueue( xQUEUE *pxQueue ) { vTaskMissedYield(); } + else + { + mtCOVERAGE_TEST_MARKER(); + } --( pxQueue->xRxLock ); } @@ -1448,13 +1988,13 @@ static void prvUnlockQueue( xQUEUE *pxQueue ) } /*-----------------------------------------------------------*/ -static signed portBASE_TYPE prvIsQueueEmpty( const xQUEUE *pxQueue ) +static BaseType_t prvIsQueueEmpty( const Queue_t *pxQueue ) { -signed portBASE_TYPE xReturn; +BaseType_t xReturn; taskENTER_CRITICAL(); { - if( pxQueue->uxMessagesWaiting == 0 ) + if( pxQueue->uxMessagesWaiting == ( UBaseType_t ) 0 ) { xReturn = pdTRUE; } @@ -1469,12 +2009,12 @@ signed portBASE_TYPE xReturn; } /*-----------------------------------------------------------*/ -signed portBASE_TYPE xQueueIsQueueEmptyFromISR( const xQueueHandle xQueue ) +BaseType_t xQueueIsQueueEmptyFromISR( const QueueHandle_t xQueue ) { -signed portBASE_TYPE xReturn; +BaseType_t xReturn; configASSERT( xQueue ); - if( ( ( xQUEUE * ) xQueue )->uxMessagesWaiting == 0 ) + if( ( ( Queue_t * ) xQueue )->uxMessagesWaiting == ( UBaseType_t ) 0 ) { xReturn = pdTRUE; } @@ -1484,12 +2024,12 @@ signed portBASE_TYPE xReturn; } return xReturn; -} +} /*lint !e818 xQueue could not be pointer to const because it is a typedef. */ /*-----------------------------------------------------------*/ -static signed portBASE_TYPE prvIsQueueFull( const xQUEUE *pxQueue ) +static BaseType_t prvIsQueueFull( const Queue_t *pxQueue ) { -signed portBASE_TYPE xReturn; +BaseType_t xReturn; taskENTER_CRITICAL(); { @@ -1508,12 +2048,12 @@ signed portBASE_TYPE xReturn; } /*-----------------------------------------------------------*/ -signed portBASE_TYPE xQueueIsQueueFullFromISR( const xQueueHandle xQueue ) +BaseType_t xQueueIsQueueFullFromISR( const QueueHandle_t xQueue ) { -signed portBASE_TYPE xReturn; +BaseType_t xReturn; configASSERT( xQueue ); - if( ( ( xQUEUE * ) xQueue )->uxMessagesWaiting == ( ( xQUEUE * ) xQueue )->uxLength ) + if( ( ( Queue_t * ) xQueue )->uxMessagesWaiting == ( ( Queue_t * ) xQueue )->uxLength ) { xReturn = pdTRUE; } @@ -1523,17 +2063,15 @@ signed portBASE_TYPE xReturn; } return xReturn; -} +} /*lint !e818 xQueue could not be pointer to const because it is a typedef. */ /*-----------------------------------------------------------*/ #if ( configUSE_CO_ROUTINES == 1 ) - signed portBASE_TYPE xQueueCRSend( xQueueHandle xQueue, const void *pvItemToQueue, portTickType xTicksToWait ) + BaseType_t xQueueCRSend( QueueHandle_t xQueue, const void *pvItemToQueue, TickType_t xTicksToWait ) { - signed portBASE_TYPE xReturn; - xQUEUE *pxQueue; - - pxQueue = ( xQUEUE * ) xQueue; + BaseType_t xReturn; + Queue_t * const pxQueue = ( Queue_t * ) xQueue; /* 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 @@ -1544,7 +2082,7 @@ signed portBASE_TYPE xReturn; { /* The queue is full - do we want to block or just leave without posting? */ - if( xTicksToWait > ( portTickType ) 0 ) + if( xTicksToWait > ( TickType_t ) 0 ) { /* As this is called from a coroutine we cannot block directly, but return indicating that we need to block. */ @@ -1582,6 +2120,14 @@ signed portBASE_TYPE xReturn; that a yield might be appropriate. */ xReturn = errQUEUE_YIELD; } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); } } else @@ -1599,23 +2145,21 @@ signed portBASE_TYPE xReturn; #if ( configUSE_CO_ROUTINES == 1 ) - signed portBASE_TYPE xQueueCRReceive( xQueueHandle xQueue, void *pvBuffer, portTickType xTicksToWait ) + BaseType_t xQueueCRReceive( QueueHandle_t xQueue, void *pvBuffer, TickType_t xTicksToWait ) { - signed portBASE_TYPE xReturn; - xQUEUE *pxQueue; - - pxQueue = ( xQUEUE * ) xQueue; + BaseType_t xReturn; + Queue_t * const pxQueue = ( Queue_t * ) xQueue; /* 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 ) + if( pxQueue->uxMessagesWaiting == ( UBaseType_t ) 0 ) { /* There are no messages in the queue, do we want to block or just leave with nothing? */ - if( xTicksToWait > ( portTickType ) 0 ) + if( xTicksToWait > ( TickType_t ) 0 ) { /* As this is a co-routine we cannot block directly, but return indicating that we need to block. */ @@ -1629,21 +2173,29 @@ signed portBASE_TYPE xReturn; return errQUEUE_FULL; } } + else + { + mtCOVERAGE_TEST_MARKER(); + } } portENABLE_INTERRUPTS(); portDISABLE_INTERRUPTS(); { - if( pxQueue->uxMessagesWaiting > ( unsigned portBASE_TYPE ) 0 ) + if( pxQueue->uxMessagesWaiting > ( UBaseType_t ) 0 ) { /* Data is available from the queue. */ - pxQueue->pcReadFrom += pxQueue->uxItemSize; - if( pxQueue->pcReadFrom >= pxQueue->pcTail ) + pxQueue->u.pcReadFrom += pxQueue->uxItemSize; + if( pxQueue->u.pcReadFrom >= pxQueue->pcTail ) + { + pxQueue->u.pcReadFrom = pxQueue->pcHead; + } + else { - pxQueue->pcReadFrom = pxQueue->pcHead; + mtCOVERAGE_TEST_MARKER(); } --( pxQueue->uxMessagesWaiting ); - memcpy( ( void * ) pvBuffer, ( void * ) pxQueue->pcReadFrom, ( unsigned ) pxQueue->uxItemSize ); + ( void ) memcpy( ( void * ) pvBuffer, ( void * ) pxQueue->u.pcReadFrom, ( unsigned ) pxQueue->uxItemSize ); xReturn = pdPASS; @@ -1658,6 +2210,14 @@ signed portBASE_TYPE xReturn; { xReturn = errQUEUE_YIELD; } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); } } else @@ -1675,11 +2235,9 @@ signed portBASE_TYPE xReturn; #if ( configUSE_CO_ROUTINES == 1 ) - signed portBASE_TYPE xQueueCRSendFromISR( xQueueHandle xQueue, const void *pvItemToQueue, signed portBASE_TYPE xCoRoutinePreviouslyWoken ) + BaseType_t xQueueCRSendFromISR( QueueHandle_t xQueue, const void *pvItemToQueue, BaseType_t xCoRoutinePreviouslyWoken ) { - xQUEUE *pxQueue; - - pxQueue = ( xQUEUE * ) xQueue; + Queue_t * const pxQueue = ( Queue_t * ) xQueue; /* Cannot block within an ISR so if there is no space on the queue then exit without doing anything. */ @@ -1697,9 +2255,25 @@ signed portBASE_TYPE xReturn; { return pdTRUE; } + else + { + mtCOVERAGE_TEST_MARKER(); + } } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); } } + else + { + mtCOVERAGE_TEST_MARKER(); + } return xCoRoutinePreviouslyWoken; } @@ -1709,25 +2283,27 @@ signed portBASE_TYPE xReturn; #if ( configUSE_CO_ROUTINES == 1 ) - signed portBASE_TYPE xQueueCRReceiveFromISR( xQueueHandle xQueue, void *pvBuffer, signed portBASE_TYPE *pxCoRoutineWoken ) + BaseType_t xQueueCRReceiveFromISR( QueueHandle_t xQueue, void *pvBuffer, BaseType_t *pxCoRoutineWoken ) { - signed portBASE_TYPE xReturn; - xQUEUE * pxQueue; - - pxQueue = ( xQUEUE * ) xQueue; + BaseType_t xReturn; + Queue_t * const pxQueue = ( Queue_t * ) xQueue; /* 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 ) + if( pxQueue->uxMessagesWaiting > ( UBaseType_t ) 0 ) { /* Copy the data from the queue. */ - pxQueue->pcReadFrom += pxQueue->uxItemSize; - if( pxQueue->pcReadFrom >= pxQueue->pcTail ) + pxQueue->u.pcReadFrom += pxQueue->uxItemSize; + if( pxQueue->u.pcReadFrom >= pxQueue->pcTail ) + { + pxQueue->u.pcReadFrom = pxQueue->pcHead; + } + else { - pxQueue->pcReadFrom = pxQueue->pcHead; + mtCOVERAGE_TEST_MARKER(); } --( pxQueue->uxMessagesWaiting ); - memcpy( ( void * ) pvBuffer, ( void * ) pxQueue->pcReadFrom, ( unsigned ) pxQueue->uxItemSize ); + ( void ) memcpy( ( void * ) pvBuffer, ( void * ) pxQueue->u.pcReadFrom, ( unsigned ) pxQueue->uxItemSize ); if( ( *pxCoRoutineWoken ) == pdFALSE ) { @@ -1737,8 +2313,20 @@ signed portBASE_TYPE xReturn; { *pxCoRoutineWoken = pdTRUE; } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); } } + else + { + mtCOVERAGE_TEST_MARKER(); + } xReturn = pdPASS; } @@ -1755,21 +2343,27 @@ signed portBASE_TYPE xReturn; #if ( configQUEUE_REGISTRY_SIZE > 0 ) - void vQueueAddToRegistry( xQueueHandle xQueue, signed char *pcQueueName ) + void vQueueAddToRegistry( QueueHandle_t xQueue, const char *pcQueueName ) /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ { - unsigned portBASE_TYPE ux; + UBaseType_t 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 < ( unsigned portBASE_TYPE ) configQUEUE_REGISTRY_SIZE; ux++ ) + for( ux = ( UBaseType_t ) 0U; ux < ( UBaseType_t ) configQUEUE_REGISTRY_SIZE; ux++ ) { if( xQueueRegistry[ ux ].pcQueueName == NULL ) { /* Store the information on this queue. */ xQueueRegistry[ ux ].pcQueueName = pcQueueName; xQueueRegistry[ ux ].xHandle = xQueue; + + traceQUEUE_REGISTRY_ADD( xQueue, pcQueueName ); break; } + else + { + mtCOVERAGE_TEST_MARKER(); + } } } @@ -1778,13 +2372,13 @@ signed portBASE_TYPE xReturn; #if ( configQUEUE_REGISTRY_SIZE > 0 ) - static void prvQueueUnregisterQueue( xQueueHandle xQueue ) + void vQueueUnregisterQueue( QueueHandle_t xQueue ) { - unsigned portBASE_TYPE ux; + UBaseType_t ux; /* See if the handle of the queue being unregistered in actually in the registry. */ - for( ux = ( unsigned portBASE_TYPE ) 0U; ux < ( unsigned portBASE_TYPE ) configQUEUE_REGISTRY_SIZE; ux++ ) + for( ux = ( UBaseType_t ) 0U; ux < ( UBaseType_t ) configQUEUE_REGISTRY_SIZE; ux++ ) { if( xQueueRegistry[ ux ].xHandle == xQueue ) { @@ -1792,20 +2386,22 @@ signed portBASE_TYPE xReturn; xQueueRegistry[ ux ].pcQueueName = NULL; break; } + else + { + mtCOVERAGE_TEST_MARKER(); + } } - } + } /*lint !e818 xQueue could not be pointer to const because it is a typedef. */ #endif /* configQUEUE_REGISTRY_SIZE */ /*-----------------------------------------------------------*/ #if ( configUSE_TIMERS == 1 ) - void vQueueWaitForMessageRestricted( xQueueHandle xQueue, portTickType xTicksToWait ) + void vQueueWaitForMessageRestricted( QueueHandle_t xQueue, TickType_t xTicksToWait, const BaseType_t xWaitIndefinitely ) { - xQUEUE *pxQueue; - - pxQueue = ( xQUEUE * ) xQueue; + Queue_t * const pxQueue = ( Queue_t * ) xQueue; /* 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 @@ -1822,10 +2418,14 @@ signed portBASE_TYPE xReturn; 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 ) + if( pxQueue->uxMessagesWaiting == ( UBaseType_t ) 0U ) { /* There is nothing in the queue, block for the specified period. */ - vTaskPlaceOnEventListRestricted( &( pxQueue->xTasksWaitingToReceive ), xTicksToWait ); + vTaskPlaceOnEventListRestricted( &( pxQueue->xTasksWaitingToReceive ), xTicksToWait, xWaitIndefinitely ); + } + else + { + mtCOVERAGE_TEST_MARKER(); } prvUnlockQueue( pxQueue ); } @@ -1835,11 +2435,11 @@ signed portBASE_TYPE xReturn; #if ( configUSE_QUEUE_SETS == 1 ) - xQueueSetHandle xQueueCreateSet( unsigned portBASE_TYPE uxEventQueueLength ) + QueueSetHandle_t xQueueCreateSet( const UBaseType_t uxEventQueueLength ) { - xQueueSetHandle pxQueue; + QueueSetHandle_t pxQueue; - pxQueue = xQueueGenericCreate( uxEventQueueLength, sizeof( xQUEUE * ), queueQUEUE_TYPE_SET ); + pxQueue = xQueueGenericCreate( uxEventQueueLength, sizeof( Queue_t * ), queueQUEUE_TYPE_SET ); return pxQueue; } @@ -1849,23 +2449,30 @@ signed portBASE_TYPE xReturn; #if ( configUSE_QUEUE_SETS == 1 ) - portBASE_TYPE xQueueAddToSet( xQueueSetMemberHandle xQueueOrSemaphore, xQueueSetHandle xQueueSet ) + BaseType_t xQueueAddToSet( QueueSetMemberHandle_t xQueueOrSemaphore, QueueSetHandle_t xQueueSet ) { - portBASE_TYPE xReturn; + BaseType_t xReturn; - if( ( ( xQUEUE * ) xQueueOrSemaphore )->pxQueueSetContainer != NULL ) - { - xReturn = pdFAIL; - } - else + taskENTER_CRITICAL(); { - taskENTER_CRITICAL(); + if( ( ( Queue_t * ) xQueueOrSemaphore )->pxQueueSetContainer != NULL ) { - ( ( xQUEUE * ) xQueueOrSemaphore )->pxQueueSetContainer = xQueueSet; + /* Cannot add a queue/semaphore to more than one queue set. */ + xReturn = pdFAIL; + } + else if( ( ( Queue_t * ) xQueueOrSemaphore )->uxMessagesWaiting != ( UBaseType_t ) 0 ) + { + /* Cannot add a queue/semaphore to a queue set if there are already + items in the queue/semaphore. */ + xReturn = pdFAIL; + } + else + { + ( ( Queue_t * ) xQueueOrSemaphore )->pxQueueSetContainer = xQueueSet; + xReturn = pdPASS; } - taskEXIT_CRITICAL(); - xReturn = pdPASS; } + taskEXIT_CRITICAL(); return xReturn; } @@ -1875,19 +2482,17 @@ signed portBASE_TYPE xReturn; #if ( configUSE_QUEUE_SETS == 1 ) - portBASE_TYPE xQueueRemoveFromSet( xQueueSetMemberHandle xQueueOrSemaphore, xQueueSetHandle xQueueSet ) + BaseType_t xQueueRemoveFromSet( QueueSetMemberHandle_t xQueueOrSemaphore, QueueSetHandle_t xQueueSet ) { - portBASE_TYPE xReturn; - xQUEUE *pxQueueOrSemaphore; - - pxQueueOrSemaphore = ( xQUEUE * ) xQueueOrSemaphore; + BaseType_t xReturn; + Queue_t * const pxQueueOrSemaphore = ( Queue_t * ) xQueueOrSemaphore; if( pxQueueOrSemaphore->pxQueueSetContainer != xQueueSet ) { /* The queue was not a member of the set. */ xReturn = pdFAIL; } - else if( pxQueueOrSemaphore->uxMessagesWaiting != 0 ) + else if( pxQueueOrSemaphore->uxMessagesWaiting != ( UBaseType_t ) 0 ) { /* It is dangerous to remove a queue from a set when the queue is not empty because the queue set will still hold pending events for @@ -1906,18 +2511,18 @@ signed portBASE_TYPE xReturn; } return xReturn; - } + } /*lint !e818 xQueueSet could not be declared as pointing to const as it is a typedef. */ #endif /* configUSE_QUEUE_SETS */ /*-----------------------------------------------------------*/ #if ( configUSE_QUEUE_SETS == 1 ) - xQueueSetMemberHandle xQueueSelectFromSet( xQueueSetHandle xQueueSet, portTickType xBlockTimeTicks ) + QueueSetMemberHandle_t xQueueSelectFromSet( QueueSetHandle_t xQueueSet, TickType_t const xTicksToWait ) { - xQueueSetMemberHandle xReturn = NULL; + QueueSetMemberHandle_t xReturn = NULL; - xQueueGenericReceive( ( xQueueHandle ) xQueueSet, &xReturn, xBlockTimeTicks, pdFALSE ); + ( void ) xQueueGenericReceive( ( QueueHandle_t ) xQueueSet, &xReturn, xTicksToWait, pdFALSE ); /*lint !e961 Casting from one typedef to another is not redundant. */ return xReturn; } @@ -1926,11 +2531,11 @@ signed portBASE_TYPE xReturn; #if ( configUSE_QUEUE_SETS == 1 ) - xQueueSetMemberHandle xQueueSelectFromSetFromISR( xQueueSetHandle xQueueSet ) + QueueSetMemberHandle_t xQueueSelectFromSetFromISR( QueueSetHandle_t xQueueSet ) { - xQueueSetMemberHandle xReturn = NULL; + QueueSetMemberHandle_t xReturn = NULL; - xQueueReceiveFromISR( ( xQueueHandle ) xQueueSet, &xReturn, NULL ); + ( void ) xQueueReceiveFromISR( ( QueueHandle_t ) xQueueSet, &xReturn, NULL ); /*lint !e961 Casting from one typedef to another is not redundant. */ return xReturn; } @@ -1939,10 +2544,12 @@ signed portBASE_TYPE xReturn; #if ( configUSE_QUEUE_SETS == 1 ) - static portBASE_TYPE prvNotifyQueueSetContainer( xQUEUE *pxQueue, portBASE_TYPE xCopyPosition ) + static BaseType_t prvNotifyQueueSetContainer( const Queue_t * const pxQueue, const BaseType_t xCopyPosition ) { - xQUEUE *pxQueueSetContainer = pxQueue->pxQueueSetContainer; - portBASE_TYPE xReturn = pdFALSE; + Queue_t *pxQueueSetContainer = pxQueue->pxQueueSetContainer; + BaseType_t xReturn = pdFALSE; + + /* This function must be called form a critical section. */ configASSERT( pxQueueSetContainer ); configASSERT( pxQueueSetContainer->uxMessagesWaiting < pxQueueSetContainer->uxLength ); @@ -1950,16 +2557,37 @@ signed portBASE_TYPE xReturn; if( pxQueueSetContainer->uxMessagesWaiting < pxQueueSetContainer->uxLength ) { traceQUEUE_SEND( pxQueueSetContainer ); - /* The data copies is the handle of the queue that contains data. */ - prvCopyDataToQueue( pxQueueSetContainer, &pxQueue, xCopyPosition ); - if( listLIST_IS_EMPTY( &( pxQueueSetContainer->xTasksWaitingToReceive ) ) == pdFALSE ) + + /* The data copied is the handle of the queue that contains data. */ + xReturn = prvCopyDataToQueue( pxQueueSetContainer, &pxQueue, xCopyPosition ); + + if( pxQueueSetContainer->xTxLock == queueUNLOCKED ) { - if( xTaskRemoveFromEventList( &( pxQueueSetContainer->xTasksWaitingToReceive ) ) != pdFALSE ) + if( listLIST_IS_EMPTY( &( pxQueueSetContainer->xTasksWaitingToReceive ) ) == pdFALSE ) + { + if( xTaskRemoveFromEventList( &( pxQueueSetContainer->xTasksWaitingToReceive ) ) != pdFALSE ) + { + /* The task waiting has a higher priority. */ + xReturn = pdTRUE; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else { - /* The task waiting has a higher priority */ - xReturn = pdTRUE; + mtCOVERAGE_TEST_MARKER(); } } + else + { + ( pxQueueSetContainer->xTxLock )++; + } + } + else + { + mtCOVERAGE_TEST_MARKER(); } return xReturn; @@ -1967,3 +2595,14 @@ signed portBASE_TYPE xReturn; #endif /* configUSE_QUEUE_SETS */ + + + + + + + + + + + diff --git a/lib/FreeRTOS/tasks.c b/lib/FreeRTOS/tasks.c index 522380863f..11ca0e976b 100644 --- a/lib/FreeRTOS/tasks.c +++ b/lib/FreeRTOS/tasks.c @@ -1,82 +1,75 @@ /* - FreeRTOS V7.4.0 - Copyright (C) 2013 Real Time Engineers Ltd. - - FEATURES AND PORTS ARE ADDED TO FREERTOS ALL THE TIME. PLEASE VISIT - http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. - - *************************************************************************** - * * - * 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! * - * * - *************************************************************************** + FreeRTOS V8.2.3 - Copyright (C) 2015 Real Time Engineers Ltd. + All rights reserved + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. This file is part of the FreeRTOS distribution. FreeRTOS is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License (version 2) as published by the - Free Software Foundation AND MODIFIED BY the FreeRTOS exception. + 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. + *************************************************************************** + >>! 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 itcan be - viewed here: http://www.freertos.org/a00114.html and also obtained by - writing to Real Time Engineers Ltd., contact details for whom are available - on the FreeRTOS WEB site. - - 1 tab == 4 spaces! + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html *************************************************************************** * * - * Having a problem? Start by reading the FAQ "My application does * - * not run, what could be wrong?" * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * * * - * http://www.FreeRTOS.org/FAQHelp.html * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * * * *************************************************************************** + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. - http://www.FreeRTOS.org - Documentation, books, training, latest versions, - license and Real Time Engineers Ltd. contact details. + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, - including FreeRTOS+Trace - an indispensable productivity tool, and our new - fully thread aware and reentrant UDP/IP stack. - - http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High - Integrity Systems, who sell the code with commercial support, - indemnification and middleware, under the OpenRTOS brand. - - http://www.SafeRTOS.com - High Integrity Systems also provide a safety - engineered and independently SIL3 certified version for use in safety and + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and mission critical applications that require provable dependability. + + 1 tab == 4 spaces! */ /* Standard includes. */ -#include #include #include -#include "debug.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 @@ -89,11 +82,25 @@ task.h is included from an application file. */ #include "timers.h" #include "StackMacros.h" -#undef MPU_WRAPPERS_INCLUDED_FROM_API_FILE +/* Lint e961 and e750 are suppressed as a MISRA exception justified because the +MPU ports require MPU_WRAPPERS_INCLUDED_FROM_API_FILE to be defined for the +header files above, but not in this file, in order to generate the correct +privileged Vs unprivileged linkage and placement. */ +#undef MPU_WRAPPERS_INCLUDED_FROM_API_FILE /*lint !e961 !e750. */ + +/* Set configUSE_STATS_FORMATTING_FUNCTIONS to 2 to include the stats formatting +functions but without including stdio.h here. */ +#if ( configUSE_STATS_FORMATTING_FUNCTIONS == 1 ) + /* At the bottom of this file are two optional functions that can be used + to generate human readable text from the raw data generated by the + uxTaskGetSystemState() function. Note the formatting functions are provided + for convenience only, and are NOT considered part of the kernel. */ + #include +#endif /* configUSE_STATS_FORMATTING_FUNCTIONS == 1 ) */ /* Sanity check the configuration. */ -#if configUSE_TICKLESS_IDLE != 0 - #if INCLUDE_vTaskSuspend != 1 +#if( configUSE_TICKLESS_IDLE != 0 ) + #if( INCLUDE_vTaskSuspend != 1 ) #error INCLUDE_vTaskSuspend must be set to 1 if configUSE_TICKLESS_IDLE is not set to 0 #endif /* INCLUDE_vTaskSuspend */ #endif /* configUSE_TICKLESS_IDLE */ @@ -103,6 +110,22 @@ task.h is included from an application file. */ */ #define tskIDLE_STACK_SIZE configMINIMAL_STACK_SIZE +#if( configUSE_PREEMPTION == 0 ) + /* If the cooperative scheduler is being used then a yield should not be + performed just because a higher priority task has been woken. */ + #define taskYIELD_IF_USING_PREEMPTION() +#else + #define taskYIELD_IF_USING_PREEMPTION() portYIELD_WITHIN_API() +#endif + +/* Value that can be assigned to the eNotifyState member of the TCB. */ +typedef enum +{ + eNotWaitingNotification = 0, + eWaitingNotification, + eNotified +} eNotifyValue; + /* * Task control block. A task control block (TCB) is allocated for each task, * and stores task state information, including a pointer to the task's context @@ -110,45 +133,71 @@ task.h is included from an application file. */ */ 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 TCB STRUCT. */ + volatile StackType_t *pxTopOfStack; /*< Points to the location of the last item placed on the tasks stack. THIS MUST BE THE FIRST MEMBER OF THE TCB 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 TCB STRUCT. */ + xMPU_SETTINGS xMPUSettings; /*< The MPU settings are defined as part of the port layer. THIS MUST BE THE SECOND MEMBER OF THE TCB STRUCT. */ + BaseType_t xUsingStaticallyAllocatedStack; /* Set to pdTRUE if the stack is a statically allocated array, and pdFALSE if the stack is dynamically allocated. */ #endif - xListItem xGenericListItem; /*< The list that the state list item of a task is reference from denotes the state of that task (Ready, Blocked, Suspended ). */ - xListItem xEventListItem; /*< Used to reference a task from an event list. */ - unsigned portBASE_TYPE uxPriority; /*< The priority of the task. 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. */ - size_t stacksize; + ListItem_t xGenericListItem; /*< The list that the state list item of a task is reference from denotes the state of that task (Ready, Blocked, Suspended ). */ + ListItem_t xEventListItem; /*< Used to reference a task from an event list. */ + UBaseType_t uxPriority; /*< The priority of the task. 0 is the lowest priority. */ + StackType_t *pxStack; /*< Points to the start of the stack. */ + char pcTaskName[ configMAX_TASK_NAME_LEN ];/*< Descriptive name given to the task when created. Facilitates debugging only. */ /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ + #if ( portSTACK_GROWTH > 0 ) - portSTACK_TYPE *pxEndOfStack; /*< Points to the end of the stack on architectures where the stack grows up from low memory. */ + StackType_t *pxEndOfStack; /*< Points to the end of the stack on architectures where the stack grows up from low memory. */ #endif #if ( portCRITICAL_NESTING_IN_TCB == 1 ) - unsigned portBASE_TYPE uxCriticalNesting; /*< Holds the critical section nesting depth for ports that do not maintain their own count in the port layer. */ + UBaseType_t uxCriticalNesting; /*< Holds the critical section nesting depth for ports that do not maintain their own count in the port layer. */ #endif #if ( configUSE_TRACE_FACILITY == 1 ) - unsigned portBASE_TYPE uxTCBNumber; /*< Stores a number that increments each time a TCB is created. It allows debuggers to determine when a task has been deleted and then recreated. */ - unsigned portBASE_TYPE uxTaskNumber; /*< Stores a number specifically for use by third party trace code. */ + UBaseType_t uxTCBNumber; /*< Stores a number that increments each time a TCB is created. It allows debuggers to determine when a task has been deleted and then recreated. */ + UBaseType_t uxTaskNumber; /*< Stores a number specifically for use by third party trace code. */ #endif #if ( configUSE_MUTEXES == 1 ) - unsigned portBASE_TYPE uxBasePriority; /*< The priority last assigned to the task - used by the priority inheritance mechanism. */ + UBaseType_t uxBasePriority; /*< The priority last assigned to the task - used by the priority inheritance mechanism. */ + UBaseType_t uxMutexesHeld; #endif #if ( configUSE_APPLICATION_TASK_TAG == 1 ) - pdTASK_HOOK_CODE pxTaskTag; + TaskHookFunction_t pxTaskTag; + #endif + + #if( configNUM_THREAD_LOCAL_STORAGE_POINTERS > 0 ) + void *pvThreadLocalStoragePointers[ configNUM_THREAD_LOCAL_STORAGE_POINTERS ]; #endif #if ( configGENERATE_RUN_TIME_STATS == 1 ) - unsigned long ulRunTimeCounter; /*< Stores the amount of time the task has spent in the Running state. */ + uint32_t ulRunTimeCounter; /*< Stores the amount of time the task has spent in the Running state. */ + #endif + + #if ( configUSE_NEWLIB_REENTRANT == 1 ) + /* Allocate a Newlib reent structure that is specific to this task. + Note Newlib support has been included by popular demand, but is not + used by the FreeRTOS maintainers themselves. FreeRTOS is not + responsible for resulting newlib operation. User must be familiar with + newlib and must provide system-wide implementations of the necessary + stubs. Be warned that (at the time of writing) the current newlib design + implements a system-wide malloc() that must be provided with locks. */ + struct _reent xNewLib_reent; + #endif + + #if ( configUSE_TASK_NOTIFICATIONS == 1 ) + volatile uint32_t ulNotifiedValue; + volatile eNotifyValue eNotifyState; #endif } tskTCB; +/* The old tskTCB name is maintained above then typedefed to the new TCB_t name +below to enable the use of older kernel aware debuggers. */ +typedef tskTCB TCB_t; + /* * Some kernel aware debuggers require the data the debugger needs access to to * be global, rather than file scope. @@ -157,124 +206,83 @@ typedef struct tskTaskControlBlock #define static #endif -/*lint -e956 */ -PRIVILEGED_DATA tskTCB * volatile pxCurrentTCB = NULL; +/*lint -e956 A manual analysis and inspection has been used to determine which +static variables must be declared volatile. */ + +PRIVILEGED_DATA TCB_t * 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. */ -PRIVILEGED_DATA static volatile unsigned portBASE_TYPE uxCurrentNumberOfTasks = ( unsigned portBASE_TYPE ) 0U; +PRIVILEGED_DATA static List_t pxReadyTasksLists[ configMAX_PRIORITIES ];/*< Prioritised ready tasks. */ +PRIVILEGED_DATA static List_t xDelayedTaskList1; /*< Delayed tasks. */ +PRIVILEGED_DATA static List_t xDelayedTaskList2; /*< Delayed tasks (two lists are used - one for delays that have overflowed the current tick count. */ +PRIVILEGED_DATA static List_t * volatile pxDelayedTaskList; /*< Points to the delayed task list currently being used. */ +PRIVILEGED_DATA static List_t * volatile pxOverflowDelayedTaskList; /*< Points to the delayed task list currently being used to hold tasks that have overflowed the current tick count. */ +PRIVILEGED_DATA static List_t xPendingReadyList; /*< Tasks that have been readied while the scheduler was suspended. They will be moved to the ready list when the scheduler is resumed. */ #if ( INCLUDE_vTaskDelete == 1 ) - PRIVILEGED_DATA static 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 ) 0U; + PRIVILEGED_DATA static List_t xTasksWaitingTermination; /*< Tasks that have been deleted - but their memory not yet freed. */ + PRIVILEGED_DATA static volatile UBaseType_t uxTasksDeleted = ( UBaseType_t ) 0U; #endif #if ( INCLUDE_vTaskSuspend == 1 ) - PRIVILEGED_DATA static xList xSuspendedTaskList; /*< Tasks that are currently suspended. */ + PRIVILEGED_DATA static List_t xSuspendedTaskList; /*< Tasks that are currently suspended. */ #endif #if ( INCLUDE_xTaskGetIdleTaskHandle == 1 ) - PRIVILEGED_DATA static xTaskHandle xIdleTaskHandle = NULL; /*< Holds the handle of the idle task. The idle task is created automatically when the scheduler is started. */ + PRIVILEGED_DATA static TaskHandle_t xIdleTaskHandle = NULL; /*< Holds the handle of the idle task. The idle task is created automatically when the scheduler is started. */ #endif -/* File private variables. --------------------------------*/ - -PRIVILEGED_DATA static volatile portTickType xTickCount = ( portTickType ) 0U; -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 ) 0U; -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 ) 0U; -PRIVILEGED_DATA static volatile portTickType xNextTaskUnblockTime = ( portTickType ) portMAX_DELAY; +/* Other file private variables. --------------------------------*/ +PRIVILEGED_DATA static volatile UBaseType_t uxCurrentNumberOfTasks = ( UBaseType_t ) 0U; +PRIVILEGED_DATA static volatile TickType_t xTickCount = ( TickType_t ) 0U; +PRIVILEGED_DATA static volatile UBaseType_t uxTopReadyPriority = tskIDLE_PRIORITY; +PRIVILEGED_DATA static volatile BaseType_t xSchedulerRunning = pdFALSE; +PRIVILEGED_DATA static volatile UBaseType_t uxPendedTicks = ( UBaseType_t ) 0U; +PRIVILEGED_DATA static volatile BaseType_t xYieldPending = pdFALSE; +PRIVILEGED_DATA static volatile BaseType_t xNumOfOverflows = ( BaseType_t ) 0; +PRIVILEGED_DATA static UBaseType_t uxTaskNumber = ( UBaseType_t ) 0U; +PRIVILEGED_DATA static volatile TickType_t xNextTaskUnblockTime = ( TickType_t ) 0U; /* Initialised to portMAX_DELAY before the scheduler starts. */ + +/* Context switches are held pending while the scheduler is suspended. Also, +interrupts must not manipulate the xGenericListItem of a TCB, or any of the +lists the xGenericListItem can be referenced from, if the scheduler is suspended. +If an interrupt needs to unblock a task while the scheduler is suspended then it +moves the task's event list item into the xPendingReadyList, ready for the +kernel to move the task from the pending ready list into the real ready list +when the scheduler is unsuspended. The pending ready list itself can only be +accessed from a critical section. */ +PRIVILEGED_DATA static volatile UBaseType_t uxSchedulerSuspended = ( UBaseType_t ) pdFALSE; #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. */ - PRIVILEGED_DATA static unsigned long ulTotalRunTime; /*< Holds the total amount of execution time as defined by the run time counter clock. */ - static void prvGenerateRunTimeStatsForTasksInList( const signed char *pcWriteBuffer, xList *pxList, unsigned long ulTotalRunTimeDiv100 ) PRIVILEGED_FUNCTION; + PRIVILEGED_DATA static uint32_t ulTaskSwitchedInTime = 0UL; /*< Holds the value of a timer/counter the last time a task was switched in. */ + PRIVILEGED_DATA static uint32_t ulTotalRunTime = 0UL; /*< Holds the total amount of execution time as defined by the run time counter clock. */ #endif +/*lint +e956 */ + /* 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 ( 0xbeU ) - -static tskTCB* tcbs[15]; -static size_t tot_task_mem; -static size_t tot_alloc_stack; -static size_t tot_alloc_overhead; - -size_t debugPrintTCBInfo(void) -{ - tskTCB* tcb = pxCurrentTCB; - int i, lowestFreeSpace, percent, totalfree, totalstack; - char* b; - - DEBUG_PRINT_OS("-Stack info- START\n"); - - totalfree = 0; - totalstack = 0; - - for (i = 0; i < uxCurrentNumberOfTasks; i++) - { - - tcb = tcbs[i]; - - b = (char *)tcb->pxStack; - - while (*b == tskSTACK_FILL_BYTE) - b++; - lowestFreeSpace = b - (char*)tcb->pxStack; - totalfree += lowestFreeSpace; - percent = (lowestFreeSpace*100)/tcb->stacksize; - (void)percent; - totalstack += tcb->stacksize; - -#if 0 - DEBUG_PRINT_OS("-%s-\n", tcb->pcTaskName); - DEBUG_PRINT_OS("Stack start %x\n", tcb->pxStack); - DEBUG_PRINT_OS("Stack start %x\n", tcb->pxStack+tcb->stacksize); - DEBUG_PRINT_OS("Stack pointer %x\n", tcb->pxTopOfStack); - DEBUG_PRINT_OS("Stack size %x\n", tcb->stacksize); - DEBUG_PRINT_OS("Hit high watermark at %x\n", b); -#endif - DEBUG_PRINT_OS("%s: size=%d, lowest free=%d percent (%d bytes)\n", tcb->pcTaskName, tcb->stacksize, percent, lowestFreeSpace); - } - DEBUG_PRINT_OS("Total free bytes: %d\n", totalfree); - DEBUG_PRINT_OS("Total allocated stack: %d\n", totalstack); - DEBUG_PRINT_OS("Total allocated stackmem: %d\n", tot_alloc_stack); - DEBUG_PRINT_OS("Total allocated overhead: %d\n", tot_alloc_overhead); - DEBUG_PRINT_OS("-Stack info- END\n"); - return (tot_alloc_stack+tot_alloc_overhead); -} - +#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' ) +#define tskBLOCKED_CHAR ( 'B' ) +#define tskREADY_CHAR ( 'R' ) +#define tskDELETED_CHAR ( 'D' ) +#define tskSUSPENDED_CHAR ( 'S' ) /*-----------------------------------------------------------*/ @@ -286,28 +294,28 @@ size_t debugPrintTCBInfo(void) /* uxTopReadyPriority holds the priority of the highest priority ready state task. */ - #define taskRECORD_READY_PRIORITY( uxPriority ) \ - { \ - if( ( uxPriority ) > uxTopReadyPriority ) \ - { \ - uxTopReadyPriority = ( uxPriority ); \ - } \ + #define taskRECORD_READY_PRIORITY( uxPriority ) \ + { \ + if( ( uxPriority ) > uxTopReadyPriority ) \ + { \ + uxTopReadyPriority = ( uxPriority ); \ + } \ } /* taskRECORD_READY_PRIORITY */ /*-----------------------------------------------------------*/ - #define taskSELECT_HIGHEST_PRIORITY_TASK() \ - { \ - /* Find the highest priority queue that contains ready tasks. */ \ - while( listLIST_IS_EMPTY( &( pxReadyTasksLists[ uxTopReadyPriority ] ) ) ) \ - { \ - configASSERT( uxTopReadyPriority ); \ - --uxTopReadyPriority; \ - } \ - \ - /* listGET_OWNER_OF_NEXT_ENTRY indexes 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 ] ) ); \ + #define taskSELECT_HIGHEST_PRIORITY_TASK() \ + { \ + /* Find the highest priority queue that contains ready tasks. */ \ + while( listLIST_IS_EMPTY( &( pxReadyTasksLists[ uxTopReadyPriority ] ) ) ) \ + { \ + configASSERT( uxTopReadyPriority ); \ + --uxTopReadyPriority; \ + } \ + \ + /* listGET_OWNER_OF_NEXT_ENTRY indexes 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 ] ) ); \ } /* taskSELECT_HIGHEST_PRIORITY_TASK */ /*-----------------------------------------------------------*/ @@ -331,7 +339,7 @@ size_t debugPrintTCBInfo(void) #define taskSELECT_HIGHEST_PRIORITY_TASK() \ { \ - unsigned portBASE_TYPE uxTopPriority; \ + UBaseType_t uxTopPriority; \ \ /* Find the highest priority queue that contains ready tasks. */ \ portGET_HIGHEST_PRIORITY( uxTopPriority, uxTopReadyPriority ); \ @@ -344,101 +352,76 @@ size_t debugPrintTCBInfo(void) /* A port optimised version is provided, call it only if the TCB being reset is being referenced from a ready list. If it is referenced from a delayed or suspended list then it won't be in a ready list. */ - #define taskRESET_READY_PRIORITY( uxPriority ) \ - { \ - if( listCURRENT_LIST_LENGTH( &( pxReadyTasksLists[ ( uxPriority ) ] ) ) == 0 ) \ - { \ - portRESET_READY_PRIORITY( ( uxPriority ), ( uxTopReadyPriority ) ); \ - } \ + #define taskRESET_READY_PRIORITY( uxPriority ) \ + { \ + if( listCURRENT_LIST_LENGTH( &( pxReadyTasksLists[ ( uxPriority ) ] ) ) == ( UBaseType_t ) 0 ) \ + { \ + portRESET_READY_PRIORITY( ( uxPriority ), ( uxTopReadyPriority ) ); \ + } \ } #endif /* configUSE_PORT_OPTIMISED_TASK_SELECTION */ -/* - * 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 ) \ - traceMOVED_TASK_TO_READY_STATE( pxTCB ) \ - taskRECORD_READY_PRIORITY( ( pxTCB )->uxPriority ); \ - vListInsertEnd( ( xList * ) &( pxReadyTasksLists[ ( pxTCB )->uxPriority ] ), &( ( pxTCB )->xGenericListItem ) ) +/*-----------------------------------------------------------*/ + +/* pxDelayedTaskList and pxOverflowDelayedTaskList are switched when the tick +count overflows. */ +#define taskSWITCH_DELAYED_LISTS() \ +{ \ + List_t *pxTemp; \ + \ + /* The delayed tasks list should be empty when the lists are switched. */ \ + configASSERT( ( listLIST_IS_EMPTY( pxDelayedTaskList ) ) ); \ + \ + pxTemp = pxDelayedTaskList; \ + pxDelayedTaskList = pxOverflowDelayedTaskList; \ + pxOverflowDelayedTaskList = pxTemp; \ + xNumOfOverflows++; \ + prvResetNextTaskUnblockTime(); \ +} + /*-----------------------------------------------------------*/ /* - * 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. + * Place the task represented by pxTCB into the appropriate ready list for + * the task. It is inserted at the end of 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. */ \ - uxListRemove( &( pxTCB->xGenericListItem ) ); \ - \ - /* Is the task waiting on an event also? */ \ - if( pxTCB->xEventListItem.pvContainer != NULL ) \ - { \ - uxListRemove( &( pxTCB->xEventListItem ) ); \ - } \ - prvAddTaskToReadyQueue( pxTCB ); \ - } \ - } \ - } \ -} +#define prvAddTaskToReadyList( pxTCB ) \ + traceMOVED_TASK_TO_READY_STATE( pxTCB ); \ + taskRECORD_READY_PRIORITY( ( pxTCB )->uxPriority ); \ + vListInsertEnd( &( pxReadyTasksLists[ ( pxTCB )->uxPriority ] ), &( ( pxTCB )->xGenericListItem ) ) /*-----------------------------------------------------------*/ /* - * Several functions take an xTaskHandle parameter that can optionally be NULL, + * Several functions take an TaskHandle_t 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 ) ) +#define prvGetTCBFromHandle( pxHandle ) ( ( ( pxHandle ) == NULL ) ? ( TCB_t * ) pxCurrentTCB : ( TCB_t * ) ( pxHandle ) ) + +/* The item value of the event list item is normally used to hold the priority +of the task to which it belongs (coded to allow it to be held in reverse +priority order). However, it is occasionally borrowed for other purposes. It +is important its value is not updated due to a task priority change while it is +being used for another purpose. The following bit definition is used to inform +the scheduler that the value should not be changed - in which case it is the +responsibility of whichever module is using the value to ensure it gets set back +to its original value when it is released. */ +#if configUSE_16_BIT_TICKS == 1 + #define taskEVENT_LIST_ITEM_VALUE_IN_USE 0x8000U +#else + #define taskEVENT_LIST_ITEM_VALUE_IN_USE 0x80000000UL +#endif /* Callback function prototypes. --------------------------*/ -extern void vApplicationStackOverflowHook( xTaskHandle xTask, signed char *pcTaskName ); -extern void vApplicationTickHook( void ); +#if configCHECK_FOR_STACK_OVERFLOW > 0 + extern void vApplicationStackOverflowHook( TaskHandle_t xTask, char *pcTaskName ); +#endif + +#if configUSE_TICK_HOOK > 0 + extern void vApplicationTickHook( void ); +#endif /* File private functions. --------------------------------*/ @@ -446,7 +429,16 @@ extern void vApplicationTickHook( void ); * 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; +static void prvInitialiseTCBVariables( TCB_t * const pxTCB, const char * const pcName, UBaseType_t uxPriority, const MemoryRegion_t * const xRegions, const uint16_t usStackDepth ) PRIVILEGED_FUNCTION; /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ + +/** + * 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. + */ +#if ( INCLUDE_vTaskSuspend == 1 ) + static BaseType_t prvTaskIsTaskSuspended( const TaskHandle_t xTask ) PRIVILEGED_FUNCTION; +#endif /* INCLUDE_vTaskSuspend */ /* * Utility to ready all the lists used by the scheduler. This is called @@ -476,7 +468,7 @@ static portTASK_FUNCTION_PROTO( prvIdleTask, pvParameters ); */ #if ( INCLUDE_vTaskDelete == 1 ) - static void prvDeleteTCB( tskTCB *pxTCB ) PRIVILEGED_FUNCTION; + static void prvDeleteTCB( TCB_t *pxTCB ) PRIVILEGED_FUNCTION; #endif @@ -491,26 +483,25 @@ 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; +static void prvAddCurrentTaskToDelayedList( const TickType_t 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; +static TCB_t *prvAllocateTCBAndStack( const uint16_t usStackDepth, StackType_t * const 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. + * Fills an TaskStatus_t structure with information on each task that is + * referenced from the pxList list (which may be a ready list, a delayed list, + * a suspended list, etc.). * * 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; + static UBaseType_t prvListTaskWithinSingleList( TaskStatus_t *pxTaskStatusArray, List_t *pxList, eTaskState eState ) PRIVILEGED_FUNCTION; #endif @@ -521,7 +512,7 @@ static tskTCB *prvAllocateTCBAndStack( unsigned short usStackDepth, portSTACK_TY */ #if ( ( configUSE_TRACE_FACILITY == 1 ) || ( INCLUDE_uxTaskGetStackHighWaterMark == 1 ) ) - static unsigned short usTaskCheckFreeStackSpace( const unsigned char * pucStackByte ) PRIVILEGED_FUNCTION; + static uint16_t prvTaskCheckFreeStackSpace( const uint8_t * pucStackByte ) PRIVILEGED_FUNCTION; #endif @@ -536,36 +527,45 @@ static tskTCB *prvAllocateTCBAndStack( unsigned short usStackDepth, portSTACK_TY */ #if ( configUSE_TICKLESS_IDLE != 0 ) - static portTickType prvGetExpectedIdleTime( void ) PRIVILEGED_FUNCTION; + static TickType_t prvGetExpectedIdleTime( void ) PRIVILEGED_FUNCTION; #endif -/*lint +e956 */ +/* + * Set xNextTaskUnblockTime to the time at which the next Blocked state task + * will exit the Blocked state. + */ +static void prvResetNextTaskUnblockTime( void ); + +#if ( ( configUSE_TRACE_FACILITY == 1 ) && ( configUSE_STATS_FORMATTING_FUNCTIONS > 0 ) ) + + /* + * Helper function used to pad task names with spaces when printing out + * human readable tables of task information. + */ + static char *prvWriteNameToBuffer( char *pcBuffer, const char *pcTaskName ); +#endif +/*-----------------------------------------------------------*/ -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 ) +BaseType_t xTaskGenericCreate( TaskFunction_t pxTaskCode, const char * const pcName, const uint16_t usStackDepth, void * const pvParameters, UBaseType_t uxPriority, TaskHandle_t * const pxCreatedTask, StackType_t * const puxStackBuffer, const MemoryRegion_t * const xRegions ) /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ { -signed portBASE_TYPE xReturn; -tskTCB * pxNewTCB; +BaseType_t xReturn; +TCB_t * pxNewTCB; +StackType_t *pxTopOfStack; configASSERT( pxTaskCode ); - configASSERT( ( ( uxPriority & ( ~portPRIVILEGE_BIT ) ) < configMAX_PRIORITIES ) ); + configASSERT( ( ( uxPriority & ( UBaseType_t ) ( ~portPRIVILEGE_BIT ) ) < ( UBaseType_t ) 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 ); - tot_task_mem += usStackDepth; - DEBUG_PRINT_OS("Task: %d/%d\n", usStackDepth*4, tot_task_mem*4); - configASSERT(pxNewTCB); - if( pxNewTCB != NULL ) { - portSTACK_TYPE *pxTopOfStack; - #if( portUSING_MPU_WRAPPERS == 1 ) /* Should the task be created in privileged mode? */ - portBASE_TYPE xRunPrivileged; + BaseType_t xRunPrivileged; if( ( uxPriority & portPRIVILEGE_BIT ) != 0U ) { xRunPrivileged = pdTRUE; @@ -575,28 +575,40 @@ tskTCB * pxNewTCB; xRunPrivileged = pdFALSE; } uxPriority &= ~portPRIVILEGE_BIT; + + if( puxStackBuffer != NULL ) + { + /* The application provided its own stack. Note this so no + attempt is made to delete the stack should that task be + deleted. */ + pxNewTCB->xUsingStaticallyAllocatedStack = pdTRUE; + } + else + { + /* The stack was allocated dynamically. Note this so it can be + deleted again if the task is deleted. */ + pxNewTCB->xUsingStaticallyAllocatedStack = pdFALSE; + } #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. + stack grows from high memory to low (as per the 80x86) or vice 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 ); - pxNewTCB->stacksize= (usStackDepth*4) - 1; - tcbs[uxCurrentNumberOfTasks] =pxNewTCB; - pxTopOfStack = ( portSTACK_TYPE * ) ( ( ( portPOINTER_SIZE_TYPE ) pxTopOfStack ) & ( ( portPOINTER_SIZE_TYPE ) ~portBYTE_ALIGNMENT_MASK ) ); + pxTopOfStack = pxNewTCB->pxStack + ( usStackDepth - ( uint16_t ) 1 ); + pxTopOfStack = ( StackType_t * ) ( ( ( portPOINTER_SIZE_TYPE ) pxTopOfStack ) & ( ~( ( portPOINTER_SIZE_TYPE ) portBYTE_ALIGNMENT_MASK ) ) ); /*lint !e923 MISRA exception. Avoiding casts between pointers and integers is not practical. Size differences accounted for using portPOINTER_SIZE_TYPE type. */ /* Check the alignment of the calculated top of stack is correct. */ - configASSERT( ( ( ( unsigned long ) pxTopOfStack & ( unsigned long ) portBYTE_ALIGNMENT_MASK ) == 0UL ) ); + configASSERT( ( ( ( portPOINTER_SIZE_TYPE ) pxTopOfStack & ( portPOINTER_SIZE_TYPE ) portBYTE_ALIGNMENT_MASK ) == 0UL ) ); } #else /* portSTACK_GROWTH */ { pxTopOfStack = pxNewTCB->pxStack; /* Check the alignment of the stack buffer is correct. */ - configASSERT( ( ( ( unsigned long ) pxNewTCB->pxStack & ( unsigned long ) portBYTE_ALIGNMENT_MASK ) == 0UL ) ); + configASSERT( ( ( ( portPOINTER_SIZE_TYPE ) pxNewTCB->pxStack & ( portPOINTER_SIZE_TYPE ) 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 @@ -622,19 +634,20 @@ tskTCB * pxNewTCB; } #endif /* portUSING_MPU_WRAPPERS */ - /* Check the alignment of the initialised stack. */ - portALIGNMENT_ASSERT_pxCurrentTCB( ( ( ( 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; + *pxCreatedTask = ( TaskHandle_t ) pxNewTCB; + } + else + { + mtCOVERAGE_TEST_MARKER(); } - /* We are going to manipulate the task queues to add this task to a - ready list, so must make sure no interrupts occur. */ + /* Ensure interrupts don't access the task lists while they are being + updated. */ taskENTER_CRITICAL(); { uxCurrentNumberOfTasks++; @@ -644,13 +657,17 @@ tskTCB * pxNewTCB; the suspended state - make this the current task. */ pxCurrentTCB = pxNewTCB; - if( uxCurrentNumberOfTasks == ( unsigned portBASE_TYPE ) 1 ) + if( uxCurrentNumberOfTasks == ( UBaseType_t ) 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 + { + mtCOVERAGE_TEST_MARKER(); + } } else { @@ -663,14 +680,15 @@ tskTCB * pxNewTCB; { pxCurrentTCB = pxNewTCB; } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); } - } - - /* 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; } uxTaskNumber++; @@ -683,7 +701,7 @@ tskTCB * pxNewTCB; #endif /* configUSE_TRACE_FACILITY */ traceTASK_CREATE( pxNewTCB ); - prvAddTaskToReadyQueue( pxNewTCB ); + prvAddTaskToReadyList( pxNewTCB ); xReturn = pdPASS; portSETUP_TCB( pxNewTCB ); @@ -704,9 +722,17 @@ tskTCB * pxNewTCB; then it should run now. */ if( pxCurrentTCB->uxPriority < uxPriority ) { - portYIELD_WITHIN_API(); + taskYIELD_IF_USING_PREEMPTION(); + } + else + { + mtCOVERAGE_TEST_MARKER(); } } + else + { + mtCOVERAGE_TEST_MARKER(); + } } return xReturn; @@ -715,38 +741,40 @@ tskTCB * pxNewTCB; #if ( INCLUDE_vTaskDelete == 1 ) - void vTaskDelete( xTaskHandle xTaskToDelete ) + void vTaskDelete( TaskHandle_t xTaskToDelete ) { - tskTCB *pxTCB; + TCB_t *pxTCB; taskENTER_CRITICAL(); { - /* Ensure a yield is performed if the current task is being - deleted. */ - if( xTaskToDelete == pxCurrentTCB ) - { - xTaskToDelete = NULL; - } - - /* If null is passed in here then we are deleting ourselves. */ + /* If null is passed in here then it is the calling task that is + being deleted. */ pxTCB = prvGetTCBFromHandle( xTaskToDelete ); /* 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. */ - if( uxListRemove( ( xListItem * ) &( pxTCB->xGenericListItem ) ) == 0 ) + if( uxListRemove( &( pxTCB->xGenericListItem ) ) == ( UBaseType_t ) 0 ) { taskRESET_READY_PRIORITY( pxTCB->uxPriority ); } + else + { + mtCOVERAGE_TEST_MARKER(); + } /* Is the task waiting on an event also? */ - if( pxTCB->xEventListItem.pvContainer != NULL ) + if( listLIST_ITEM_CONTAINER( &( pxTCB->xEventListItem ) ) != NULL ) + { + ( void ) uxListRemove( &( pxTCB->xEventListItem ) ); + } + else { - uxListRemove( &( pxTCB->xEventListItem ) ); + mtCOVERAGE_TEST_MARKER(); } - vListInsertEnd( ( xList * ) &xTasksWaitingTermination, &( pxTCB->xGenericListItem ) ); + vListInsertEnd( &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 @@ -761,13 +789,32 @@ tskTCB * pxNewTCB; } taskEXIT_CRITICAL(); - /* Force a reschedule if we have just deleted the current task. */ + /* Force a reschedule if it is the currently running task that has just + been deleted. */ if( xSchedulerRunning != pdFALSE ) { - if( ( void * ) xTaskToDelete == NULL ) + if( pxTCB == pxCurrentTCB ) { + configASSERT( uxSchedulerSuspended == 0 ); + + /* The pre-delete hook is primarily for the Windows simulator, + in which Windows specific clean up operations are performed, + after which it is not possible to yield away from this task - + hence xYieldPending is used to latch that a context switch is + required. */ + portPRE_TASK_DELETE_HOOK( pxTCB, &xYieldPending ); portYIELD_WITHIN_API(); } + else + { + /* Reset the next expected unblock time in case it referred to + the task that has just been deleted. */ + taskENTER_CRITICAL(); + { + prvResetNextTaskUnblockTime(); + } + taskEXIT_CRITICAL(); + } } } @@ -776,40 +823,53 @@ tskTCB * pxNewTCB; #if ( INCLUDE_vTaskDelayUntil == 1 ) - void vTaskDelayUntil( portTickType * const pxPreviousWakeTime, portTickType xTimeIncrement ) + void vTaskDelayUntil( TickType_t * const pxPreviousWakeTime, const TickType_t xTimeIncrement ) { - portTickType xTimeToWake; - portBASE_TYPE xAlreadyYielded, xShouldDelay = pdFALSE; + TickType_t xTimeToWake; + BaseType_t xAlreadyYielded, xShouldDelay = pdFALSE; configASSERT( pxPreviousWakeTime ); configASSERT( ( xTimeIncrement > 0U ) ); + configASSERT( uxSchedulerSuspended == 0 ); vTaskSuspendAll(); { + /* Minor optimisation. The tick count cannot change in this + block. */ + const TickType_t xConstTickCount = xTickCount; + /* Generate the tick time at which the task wants to wake. */ xTimeToWake = *pxPreviousWakeTime + xTimeIncrement; - if( xTickCount < *pxPreviousWakeTime ) + if( xConstTickCount < *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 ) ) + if( ( xTimeToWake < *pxPreviousWakeTime ) && ( xTimeToWake > xConstTickCount ) ) { xShouldDelay = pdTRUE; } + else + { + mtCOVERAGE_TEST_MARKER(); + } } 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 ) ) + if( ( xTimeToWake < *pxPreviousWakeTime ) || ( xTimeToWake > xConstTickCount ) ) { xShouldDelay = pdTRUE; } + else + { + mtCOVERAGE_TEST_MARKER(); + } } /* Update the wake time ready for the next call. */ @@ -819,19 +879,26 @@ tskTCB * pxNewTCB; { 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. */ - if( uxListRemove( ( xListItem * ) &( pxCurrentTCB->xGenericListItem ) ) == 0 ) + /* Remove the task from the ready list before adding it to the + blocked list as the same list item is used for both lists. */ + if( uxListRemove( &( pxCurrentTCB->xGenericListItem ) ) == ( UBaseType_t ) 0 ) { /* The current task must be in a ready list, so there is no need to check, and the port reset macro can be called directly. */ portRESET_READY_PRIORITY( pxCurrentTCB->uxPriority, uxTopReadyPriority ); } + else + { + mtCOVERAGE_TEST_MARKER(); + } prvAddCurrentTaskToDelayedList( xTimeToWake ); } + else + { + mtCOVERAGE_TEST_MARKER(); + } } xAlreadyYielded = xTaskResumeAll(); @@ -841,6 +908,10 @@ tskTCB * pxNewTCB; { portYIELD_WITHIN_API(); } + else + { + mtCOVERAGE_TEST_MARKER(); + } } #endif /* INCLUDE_vTaskDelayUntil */ @@ -848,14 +919,16 @@ tskTCB * pxNewTCB; #if ( INCLUDE_vTaskDelay == 1 ) - void vTaskDelay( portTickType xTicksToDelay ) + void vTaskDelay( const TickType_t xTicksToDelay ) { - portTickType xTimeToWake; - signed portBASE_TYPE xAlreadyYielded = pdFALSE; + TickType_t xTimeToWake; + BaseType_t xAlreadyYielded = pdFALSE; + /* A delay time of zero just forces a reschedule. */ - if( xTicksToDelay > ( portTickType ) 0U ) + if( xTicksToDelay > ( TickType_t ) 0U ) { + configASSERT( uxSchedulerSuspended == 0 ); vTaskSuspendAll(); { traceTASK_DELAY(); @@ -875,17 +948,25 @@ tskTCB * pxNewTCB; /* 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. */ - if( uxListRemove( ( xListItem * ) &( pxCurrentTCB->xGenericListItem ) ) == 0 ) + if( uxListRemove( &( pxCurrentTCB->xGenericListItem ) ) == ( UBaseType_t ) 0 ) { /* The current task must be in a ready list, so there is no need to check, and the port reset macro can be called directly. */ portRESET_READY_PRIORITY( pxCurrentTCB->uxPriority, uxTopReadyPriority ); } + else + { + mtCOVERAGE_TEST_MARKER(); + } prvAddCurrentTaskToDelayedList( xTimeToWake ); } xAlreadyYielded = xTaskResumeAll(); } + else + { + mtCOVERAGE_TEST_MARKER(); + } /* Force a reschedule if xTaskResumeAll has not already done so, we may have put ourselves to sleep. */ @@ -893,6 +974,10 @@ tskTCB * pxNewTCB; { portYIELD_WITHIN_API(); } + else + { + mtCOVERAGE_TEST_MARKER(); + } } #endif /* INCLUDE_vTaskDelay */ @@ -900,13 +985,13 @@ tskTCB * pxNewTCB; #if ( INCLUDE_eTaskGetState == 1 ) - eTaskState eTaskGetState( xTaskHandle xTask ) + eTaskState eTaskGetState( TaskHandle_t xTask ) { eTaskState eReturn; - xList *pxStateList; - tskTCB *pxTCB; + List_t *pxStateList; + const TCB_t * const pxTCB = ( TCB_t * ) xTask; - pxTCB = ( tskTCB * ) xTask; + configASSERT( pxTCB ); if( pxTCB == pxCurrentTCB ) { @@ -917,7 +1002,7 @@ tskTCB * pxNewTCB; { taskENTER_CRITICAL(); { - pxStateList = ( xList * ) listLIST_ITEM_CONTAINER( &( pxTCB->xGenericListItem ) ); + pxStateList = ( List_t * ) listLIST_ITEM_CONTAINER( &( pxTCB->xGenericListItem ) ); } taskEXIT_CRITICAL(); @@ -932,8 +1017,16 @@ tskTCB * pxNewTCB; else if( pxStateList == &xSuspendedTaskList ) { /* The task being queried is referenced from the suspended - list. */ - eReturn = eSuspended; + list. Is it genuinely suspended or is it block + indefinitely? */ + if( listLIST_ITEM_CONTAINER( &( pxTCB->xEventListItem ) ) == NULL ) + { + eReturn = eSuspended; + } + else + { + eReturn = eBlocked; + } } #endif @@ -946,7 +1039,7 @@ tskTCB * pxNewTCB; } #endif - else + else /*lint !e525 Negative indentation is intended to make use of pre-processor clearer. */ { /* If the task is not in any other state, it must be in the Ready (including pending ready) state. */ @@ -955,22 +1048,22 @@ tskTCB * pxNewTCB; } return eReturn; - } + } /*lint !e818 xTask cannot be a pointer to const because it is a typedef. */ #endif /* INCLUDE_eTaskGetState */ /*-----------------------------------------------------------*/ #if ( INCLUDE_uxTaskPriorityGet == 1 ) - unsigned portBASE_TYPE uxTaskPriorityGet( xTaskHandle xTask ) + UBaseType_t uxTaskPriorityGet( TaskHandle_t xTask ) { - tskTCB *pxTCB; - unsigned portBASE_TYPE uxReturn; + TCB_t *pxTCB; + UBaseType_t uxReturn; taskENTER_CRITICAL(); { - /* If null is passed in here then we are changing the - priority of the calling function. */ + /* If null is passed in here then it is the priority of the that + called uxTaskPriorityGet() that is being queried. */ pxTCB = prvGetTCBFromHandle( xTask ); uxReturn = pxTCB->uxPriority; } @@ -982,66 +1075,124 @@ tskTCB * pxNewTCB; #endif /* INCLUDE_uxTaskPriorityGet */ /*-----------------------------------------------------------*/ +#if ( INCLUDE_uxTaskPriorityGet == 1 ) + + UBaseType_t uxTaskPriorityGetFromISR( TaskHandle_t xTask ) + { + TCB_t *pxTCB; + UBaseType_t uxReturn, uxSavedInterruptState; + + /* RTOS ports that support interrupt nesting have the concept of a + maximum system call (or maximum API call) interrupt priority. + Interrupts that are above the maximum system call priority are keep + permanently enabled, even when the RTOS kernel is in a critical section, + but cannot make any calls to FreeRTOS API functions. If configASSERT() + is defined in FreeRTOSConfig.h then + portASSERT_IF_INTERRUPT_PRIORITY_INVALID() will result in an assertion + failure if a FreeRTOS API function is called from an interrupt that has + been assigned a priority above the configured maximum system call + priority. Only FreeRTOS functions that end in FromISR can be called + from interrupts that have been assigned a priority at or (logically) + below the maximum system call interrupt priority. FreeRTOS maintains a + separate interrupt safe API to ensure interrupt entry is as fast and as + simple as possible. More information (albeit Cortex-M specific) is + provided on the following link: + http://www.freertos.org/RTOS-Cortex-M3-M4.html */ + portASSERT_IF_INTERRUPT_PRIORITY_INVALID(); + + uxSavedInterruptState = portSET_INTERRUPT_MASK_FROM_ISR(); + { + /* If null is passed in here then it is the priority of the calling + task that is being queried. */ + pxTCB = prvGetTCBFromHandle( xTask ); + uxReturn = pxTCB->uxPriority; + } + portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedInterruptState ); + + return uxReturn; + } + +#endif /* INCLUDE_uxTaskPriorityGet */ +/*-----------------------------------------------------------*/ + #if ( INCLUDE_vTaskPrioritySet == 1 ) - void vTaskPrioritySet( xTaskHandle xTask, unsigned portBASE_TYPE uxNewPriority ) + void vTaskPrioritySet( TaskHandle_t xTask, UBaseType_t uxNewPriority ) { - tskTCB *pxTCB; - unsigned portBASE_TYPE uxCurrentPriority, uxPriorityUsedOnEntry; - portBASE_TYPE xYieldRequired = pdFALSE; + TCB_t *pxTCB; + UBaseType_t uxCurrentBasePriority, uxPriorityUsedOnEntry; + BaseType_t xYieldRequired = pdFALSE; configASSERT( ( uxNewPriority < configMAX_PRIORITIES ) ); /* Ensure the new priority is valid. */ - if( uxNewPriority >= configMAX_PRIORITIES ) + if( uxNewPriority >= ( UBaseType_t ) configMAX_PRIORITIES ) { - uxNewPriority = configMAX_PRIORITIES - ( unsigned portBASE_TYPE ) 1U; + uxNewPriority = ( UBaseType_t ) configMAX_PRIORITIES - ( UBaseType_t ) 1U; + } + else + { + mtCOVERAGE_TEST_MARKER(); } taskENTER_CRITICAL(); { - if( xTask == ( xTaskHandle ) pxCurrentTCB ) - { - xTask = NULL; - } - - /* If null is passed in here then we are changing the - priority of the calling function. */ + /* If null is passed in here then it is the priority of the calling + task that is being changed. */ pxTCB = prvGetTCBFromHandle( xTask ); traceTASK_PRIORITY_SET( pxTCB, uxNewPriority ); #if ( configUSE_MUTEXES == 1 ) { - uxCurrentPriority = pxTCB->uxBasePriority; + uxCurrentBasePriority = pxTCB->uxBasePriority; } #else { - uxCurrentPriority = pxTCB->uxPriority; + uxCurrentBasePriority = pxTCB->uxPriority; } #endif - if( uxCurrentPriority != uxNewPriority ) + if( uxCurrentBasePriority != uxNewPriority ) { /* The priority change may have readied a task of higher priority than the calling task. */ - if( uxNewPriority > uxCurrentPriority ) + if( uxNewPriority > uxCurrentBasePriority ) { - if( xTask != NULL ) + if( pxTCB != pxCurrentTCB ) { - /* 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; + /* The priority of a task other than the currently + running task is being raised. Is the priority being + raised above that of the running task? */ + if( uxNewPriority >= pxCurrentTCB->uxPriority ) + { + xYieldRequired = pdTRUE; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + /* The priority of the running task is being raised, + but the running task must already be the highest + priority task able to run so no yield is required. */ } } - else if( xTask == NULL ) + else if( pxTCB == pxCurrentTCB ) { - /* Setting our own priority down means there may now be another - task of higher priority that is ready to execute. */ + /* Setting the priority of the running task down means + there may now be another task of higher priority that + is ready to execute. */ xYieldRequired = pdTRUE; } + else + { + /* Setting the priority of any other task down does not + require a yield as the running task must be above the + new priority of the task being modified. */ + } /* Remember the ready list the task might be referenced from before its uxPriority member is changed so the @@ -1056,6 +1207,10 @@ tskTCB * pxNewTCB; { pxTCB->uxPriority = uxNewPriority; } + else + { + mtCOVERAGE_TEST_MARKER(); + } /* The base priority gets set whatever. */ pxTCB->uxBasePriority = uxNewPriority; @@ -1066,35 +1221,59 @@ tskTCB * pxNewTCB; } #endif - listSET_LIST_ITEM_VALUE( &( pxTCB->xEventListItem ), ( configMAX_PRIORITIES - ( portTickType ) uxNewPriority ) ); + /* Only reset the event list item value if the value is not + being used for anything else. */ + if( ( listGET_LIST_ITEM_VALUE( &( pxTCB->xEventListItem ) ) & taskEVENT_LIST_ITEM_VALUE_IN_USE ) == 0UL ) + { + listSET_LIST_ITEM_VALUE( &( pxTCB->xEventListItem ), ( ( TickType_t ) configMAX_PRIORITIES - ( TickType_t ) uxNewPriority ) ); /*lint !e961 MISRA exception as the casts are only redundant for some ports. */ + } + else + { + mtCOVERAGE_TEST_MARKER(); + } /* 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 ) ) ) + in the list appropriate to its new priority. */ + if( listIS_CONTAINED_WITHIN( &( pxReadyTasksLists[ uxPriorityUsedOnEntry ] ), &( pxTCB->xGenericListItem ) ) != pdFALSE ) { /* 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. */ - if( uxListRemove( ( xListItem * ) &( pxTCB->xGenericListItem ) ) == 0 ) + if( uxListRemove( &( pxTCB->xGenericListItem ) ) == ( UBaseType_t ) 0 ) + { + /* It is known that the task is in its ready list so + there is no need to check again and the port level + reset macro can be called directly. */ + portRESET_READY_PRIORITY( uxPriorityUsedOnEntry, uxTopReadyPriority ); + } + else { - taskRESET_READY_PRIORITY( uxPriorityUsedOnEntry ); + mtCOVERAGE_TEST_MARKER(); } - prvAddTaskToReadyQueue( pxTCB ); + prvAddTaskToReadyList( pxTCB ); + } + else + { + mtCOVERAGE_TEST_MARKER(); } if( xYieldRequired == pdTRUE ) { - portYIELD_WITHIN_API(); + taskYIELD_IF_USING_PREEMPTION(); } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + /* Remove compiler warning about unused variables when the port + optimised task selection is not being used. */ + ( void ) uxPriorityUsedOnEntry; } } taskEXIT_CRITICAL(); - - /* Remove compiler warning about unused parameter when the port - optimised task selection is not being used. */ - ( void ) uxPriorityUsedOnEntry; } #endif /* INCLUDE_vTaskPrioritySet */ @@ -1102,45 +1281,49 @@ tskTCB * pxNewTCB; #if ( INCLUDE_vTaskSuspend == 1 ) - void vTaskSuspend( xTaskHandle xTaskToSuspend ) + void vTaskSuspend( TaskHandle_t xTaskToSuspend ) { - tskTCB *pxTCB; + TCB_t *pxTCB; taskENTER_CRITICAL(); { - /* Ensure a yield is performed if the current task is being - suspended. */ - if( xTaskToSuspend == ( xTaskHandle ) pxCurrentTCB ) - { - xTaskToSuspend = NULL; - } - - /* If null is passed in here then we are suspending ourselves. */ + /* If null is passed in here then it is the running task that is + being suspended. */ pxTCB = prvGetTCBFromHandle( xTaskToSuspend ); traceTASK_SUSPEND( pxTCB ); - /* Remove task from the ready/delayed list and place in the suspended list. */ - if( uxListRemove( ( xListItem * ) &( pxTCB->xGenericListItem ) ) == 0 ) + /* Remove task from the ready/delayed list and place in the + suspended list. */ + if( uxListRemove( &( pxTCB->xGenericListItem ) ) == ( UBaseType_t ) 0 ) { taskRESET_READY_PRIORITY( pxTCB->uxPriority ); } + else + { + mtCOVERAGE_TEST_MARKER(); + } /* Is the task waiting on an event also? */ - if( pxTCB->xEventListItem.pvContainer != NULL ) + if( listLIST_ITEM_CONTAINER( &( pxTCB->xEventListItem ) ) != NULL ) + { + ( void ) uxListRemove( &( pxTCB->xEventListItem ) ); + } + else { - uxListRemove( &( pxTCB->xEventListItem ) ); + mtCOVERAGE_TEST_MARKER(); } - vListInsertEnd( ( xList * ) &xSuspendedTaskList, &( pxTCB->xGenericListItem ) ); + vListInsertEnd( &xSuspendedTaskList, &( pxTCB->xGenericListItem ) ); } taskEXIT_CRITICAL(); - if( ( void * ) xTaskToSuspend == NULL ) + if( pxTCB == pxCurrentTCB ) { if( xSchedulerRunning != pdFALSE ) { - /* We have just suspended the current task. */ + /* The current task has just been suspended. */ + configASSERT( uxSchedulerSuspended == 0 ); portYIELD_WITHIN_API(); } else @@ -1162,6 +1345,24 @@ tskTCB * pxNewTCB; } } } + else + { + if( xSchedulerRunning != pdFALSE ) + { + /* A task other than the currently running task was suspended, + reset the next expected unblock time in case it referred to the + task that is now in the Suspended state. */ + taskENTER_CRITICAL(); + { + prvResetNextTaskUnblockTime(); + } + taskEXIT_CRITICAL(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } } #endif /* INCLUDE_vTaskSuspend */ @@ -1169,77 +1370,98 @@ tskTCB * pxNewTCB; #if ( INCLUDE_vTaskSuspend == 1 ) - signed portBASE_TYPE xTaskIsTaskSuspended( xTaskHandle xTask ) + static BaseType_t prvTaskIsTaskSuspended( const TaskHandle_t xTask ) { - portBASE_TYPE xReturn = pdFALSE; - const tskTCB * const pxTCB = ( tskTCB * ) xTask; + BaseType_t xReturn = pdFALSE; + const TCB_t * const pxTCB = ( TCB_t * ) xTask; + + /* Accesses xPendingReadyList so must be called from a critical + section. */ /* 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? */ + /* Is the task being resumed 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 ) + if( listIS_CONTAINED_WITHIN( &xPendingReadyList, &( pxTCB->xEventListItem ) ) == pdFALSE ) { - /* 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 ) + /* Is it in the suspended list because it is in the Suspended + state, or because is is blocked with no timeout? */ + if( listIS_CONTAINED_WITHIN( NULL, &( pxTCB->xEventListItem ) ) != pdFALSE ) { xReturn = pdTRUE; } + else + { + mtCOVERAGE_TEST_MARKER(); + } } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); } return xReturn; - } + } /*lint !e818 xTask cannot be a pointer to const because it is a typedef. */ #endif /* INCLUDE_vTaskSuspend */ /*-----------------------------------------------------------*/ #if ( INCLUDE_vTaskSuspend == 1 ) - void vTaskResume( xTaskHandle xTaskToResume ) + void vTaskResume( TaskHandle_t xTaskToResume ) { - tskTCB *pxTCB; + TCB_t * const pxTCB = ( TCB_t * ) xTaskToResume; /* It does not make sense to resume the calling task. */ configASSERT( xTaskToResume ); - /* Remove the task from whichever list it is currently in, and place - it in the ready list. */ - pxTCB = ( tskTCB * ) xTaskToResume; - /* 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 ) + if( prvTaskIsTaskSuspended( pxTCB ) == pdTRUE ) { traceTASK_RESUME( pxTCB ); /* As we are in a critical section we can access the ready lists even if the scheduler is suspended. */ - uxListRemove( &( pxTCB->xGenericListItem ) ); - prvAddTaskToReadyQueue( pxTCB ); + ( void ) uxListRemove( &( pxTCB->xGenericListItem ) ); + prvAddTaskToReadyList( 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(); + /* This yield may not cause the task just resumed to run, + but will leave the lists in the correct state for the + next yield. */ + taskYIELD_IF_USING_PREEMPTION(); } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); } } taskEXIT_CRITICAL(); } + else + { + mtCOVERAGE_TEST_MARKER(); + } } #endif /* INCLUDE_vTaskSuspend */ @@ -1248,35 +1470,66 @@ tskTCB * pxNewTCB; #if ( ( INCLUDE_xTaskResumeFromISR == 1 ) && ( INCLUDE_vTaskSuspend == 1 ) ) - portBASE_TYPE xTaskResumeFromISR( xTaskHandle xTaskToResume ) + BaseType_t xTaskResumeFromISR( TaskHandle_t xTaskToResume ) { - portBASE_TYPE xYieldRequired = pdFALSE; - tskTCB *pxTCB; - unsigned portBASE_TYPE uxSavedInterruptStatus; + BaseType_t xYieldRequired = pdFALSE; + TCB_t * const pxTCB = ( TCB_t * ) xTaskToResume; + UBaseType_t uxSavedInterruptStatus; configASSERT( xTaskToResume ); - pxTCB = ( tskTCB * ) xTaskToResume; + /* RTOS ports that support interrupt nesting have the concept of a + maximum system call (or maximum API call) interrupt priority. + Interrupts that are above the maximum system call priority are keep + permanently enabled, even when the RTOS kernel is in a critical section, + but cannot make any calls to FreeRTOS API functions. If configASSERT() + is defined in FreeRTOSConfig.h then + portASSERT_IF_INTERRUPT_PRIORITY_INVALID() will result in an assertion + failure if a FreeRTOS API function is called from an interrupt that has + been assigned a priority above the configured maximum system call + priority. Only FreeRTOS functions that end in FromISR can be called + from interrupts that have been assigned a priority at or (logically) + below the maximum system call interrupt priority. FreeRTOS maintains a + separate interrupt safe API to ensure interrupt entry is as fast and as + simple as possible. More information (albeit Cortex-M specific) is + provided on the following link: + http://www.freertos.org/RTOS-Cortex-M3-M4.html */ + portASSERT_IF_INTERRUPT_PRIORITY_INVALID(); uxSavedInterruptStatus = portSET_INTERRUPT_MASK_FROM_ISR(); { - if( xTaskIsTaskSuspended( pxTCB ) == pdTRUE ) + if( prvTaskIsTaskSuspended( pxTCB ) == pdTRUE ) { traceTASK_RESUME_FROM_ISR( pxTCB ); - if( uxSchedulerSuspended == ( unsigned portBASE_TYPE ) pdFALSE ) - { - xYieldRequired = ( pxTCB->uxPriority >= pxCurrentTCB->uxPriority ); - uxListRemove( &( pxTCB->xGenericListItem ) ); - prvAddTaskToReadyQueue( pxTCB ); - } - else + /* Check the ready lists can be accessed. */ + if( uxSchedulerSuspended == ( UBaseType_t ) pdFALSE ) { - /* 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 ) ); + /* Ready lists can be accessed so move the task from the + suspended list to the ready list directly. */ + if( pxTCB->uxPriority >= pxCurrentTCB->uxPriority ) + { + xYieldRequired = pdTRUE; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + ( void ) uxListRemove( &( pxTCB->xGenericListItem ) ); + prvAddTaskToReadyList( pxTCB ); } + else + { + /* The delayed or ready lists cannot be accessed so the task + is held in the pending ready list until the scheduler is + unsuspended. */ + vListInsertEnd( &( xPendingReadyList ), &( pxTCB->xEventListItem ) ); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); } } portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedInterruptStatus ); @@ -1289,19 +1542,19 @@ tskTCB * pxNewTCB; void vTaskStartScheduler( void ) { -portBASE_TYPE xReturn; +BaseType_t xReturn; /* Add the idle task at the lowest priority. */ #if ( INCLUDE_xTaskGetIdleTaskHandle == 1 ) { /* Create the idle task, storing its handle in xIdleTaskHandle so it can be returned by the xTaskGetIdleTaskHandle() function. */ - xReturn = xTaskCreate( prvIdleTask, ( signed char * ) "IDLE", tskIDLE_STACK_SIZE, ( void * ) NULL, ( tskIDLE_PRIORITY | portPRIVILEGE_BIT ), &xIdleTaskHandle ); + xReturn = xTaskCreate( prvIdleTask, "IDLE", tskIDLE_STACK_SIZE, ( void * ) NULL, ( tskIDLE_PRIORITY | portPRIVILEGE_BIT ), &xIdleTaskHandle ); /*lint !e961 MISRA exception, justified as it is not a redundant explicit cast to all supported compilers. */ } #else { /* Create the idle task without storing its handle. */ - xReturn = xTaskCreate( prvIdleTask, ( signed char * ) "IDLE", tskIDLE_STACK_SIZE, ( void * ) NULL, ( tskIDLE_PRIORITY | portPRIVILEGE_BIT ), NULL ); + xReturn = xTaskCreate( prvIdleTask, "IDLE", tskIDLE_STACK_SIZE, ( void * ) NULL, ( tskIDLE_PRIORITY | portPRIVILEGE_BIT ), NULL ); /*lint !e961 MISRA exception, justified as it is not a redundant explicit cast to all supported compilers. */ } #endif /* INCLUDE_xTaskGetIdleTaskHandle */ @@ -1311,6 +1564,10 @@ portBASE_TYPE xReturn; { xReturn = xTimerCreateTimerTask(); } + else + { + mtCOVERAGE_TEST_MARKER(); + } } #endif /* configUSE_TIMERS */ @@ -1320,14 +1577,20 @@ portBASE_TYPE xReturn; 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. */ + starts to run. */ portDISABLE_INTERRUPTS(); + #if ( configUSE_NEWLIB_REENTRANT == 1 ) + { + /* Switch Newlib's _impure_ptr variable to point to the _reent + structure specific to the task that will run first. */ + _impure_ptr = &( pxCurrentTCB->xNewLib_reent ); + } + #endif /* configUSE_NEWLIB_REENTRANT */ + + xNextTaskUnblockTime = portMAX_DELAY; xSchedulerRunning = pdTRUE; - xTickCount = ( portTickType ) 0U; + xTickCount = ( TickType_t ) 0U; /* If configGENERATE_RUN_TIME_STATS is defined then the following macro must be defined to configure the timer/counter used to generate @@ -1370,16 +1633,18 @@ void vTaskEndScheduler( void ) void vTaskSuspendAll( void ) { /* A critical section is not required as the variable is of type - portBASE_TYPE. */ + BaseType_t. Please read Richard Barry's reply in the following link to a + post in the FreeRTOS support forum before reporting this as a bug! - + http://goo.gl/wu4acr */ ++uxSchedulerSuspended; } /*----------------------------------------------------------*/ #if ( configUSE_TICKLESS_IDLE != 0 ) - static portTickType prvGetExpectedIdleTime( void ) + static TickType_t prvGetExpectedIdleTime( void ) { - portTickType xReturn; + TickType_t xReturn; if( pxCurrentTCB->uxPriority > tskIDLE_PRIORITY ) { @@ -1403,10 +1668,10 @@ void vTaskSuspendAll( void ) #endif /* configUSE_TICKLESS_IDLE */ /*----------------------------------------------------------*/ -signed portBASE_TYPE xTaskResumeAll( void ) +BaseType_t xTaskResumeAll( void ) { -register tskTCB *pxTCB; -signed portBASE_TYPE xAlreadyYielded = pdFALSE; +TCB_t *pxTCB; +BaseType_t xAlreadyYielded = pdFALSE; /* If uxSchedulerSuspended is zero then this function does not match a previous call to vTaskSuspendAll(). */ @@ -1421,58 +1686,74 @@ signed portBASE_TYPE xAlreadyYielded = pdFALSE; { --uxSchedulerSuspended; - if( uxSchedulerSuspended == ( unsigned portBASE_TYPE ) pdFALSE ) + if( uxSchedulerSuspended == ( UBaseType_t ) pdFALSE ) { - if( uxCurrentNumberOfTasks > ( unsigned portBASE_TYPE ) 0U ) + if( uxCurrentNumberOfTasks > ( UBaseType_t ) 0U ) { - portBASE_TYPE xYieldRequired = pdFALSE; - /* Move any readied tasks from the pending list into the appropriate ready list. */ - while( listLIST_IS_EMPTY( ( xList * ) &xPendingReadyList ) == pdFALSE ) + while( listLIST_IS_EMPTY( &xPendingReadyList ) == pdFALSE ) { - pxTCB = ( tskTCB * ) listGET_OWNER_OF_HEAD_ENTRY( ( ( xList * ) &xPendingReadyList ) ); - uxListRemove( &( pxTCB->xEventListItem ) ); - uxListRemove( &( pxTCB->xGenericListItem ) ); - prvAddTaskToReadyQueue( pxTCB ); + pxTCB = ( TCB_t * ) listGET_OWNER_OF_HEAD_ENTRY( ( &xPendingReadyList ) ); + ( void ) uxListRemove( &( pxTCB->xEventListItem ) ); + ( void ) uxListRemove( &( pxTCB->xGenericListItem ) ); + prvAddTaskToReadyList( pxTCB ); - /* If we have moved a task that has a priority higher than - the current task then we should yield. */ + /* If the moved task has a priority higher than the current + task then a yield must be performed. */ if( pxTCB->uxPriority >= pxCurrentTCB->uxPriority ) { - xYieldRequired = pdTRUE; + xYieldPending = pdTRUE; + } + else + { + mtCOVERAGE_TEST_MARKER(); } } /* 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 ) 0U ) + 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( uxPendedTicks > ( UBaseType_t ) 0U ) { - while( uxMissedTicks > ( unsigned portBASE_TYPE ) 0U ) + while( uxPendedTicks > ( UBaseType_t ) 0U ) { - vTaskIncrementTick(); - --uxMissedTicks; + if( xTaskIncrementTick() != pdFALSE ) + { + xYieldPending = pdTRUE; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + --uxPendedTicks; } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } - /* 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 + if( xYieldPending == pdTRUE ) + { + #if( configUSE_PREEMPTION != 0 ) { - xYieldRequired = pdTRUE; + xAlreadyYielded = pdTRUE; } #endif + taskYIELD_IF_USING_PREEMPTION(); } - - if( ( xYieldRequired == pdTRUE ) || ( xMissedYield == pdTRUE ) ) + else { - xAlreadyYielded = pdTRUE; - xMissedYield = pdFALSE; - portYIELD_WITHIN_API(); + mtCOVERAGE_TEST_MARKER(); } } } + else + { + mtCOVERAGE_TEST_MARKER(); + } } taskEXIT_CRITICAL(); @@ -1480,47 +1761,65 @@ signed portBASE_TYPE xAlreadyYielded = pdFALSE; } /*-----------------------------------------------------------*/ -portTickType xTaskGetTickCount( void ) +TickType_t xTaskGetTickCount( void ) { -portTickType xTicks; +TickType_t xTicks; /* Critical section required if running on a 16 bit processor. */ - taskENTER_CRITICAL(); + portTICK_TYPE_ENTER_CRITICAL(); { xTicks = xTickCount; } - taskEXIT_CRITICAL(); + portTICK_TYPE_EXIT_CRITICAL(); return xTicks; } /*-----------------------------------------------------------*/ -portTickType xTaskGetTickCountFromISR( void ) +TickType_t xTaskGetTickCountFromISR( void ) { -portTickType xReturn; -unsigned portBASE_TYPE uxSavedInterruptStatus; - - uxSavedInterruptStatus = portSET_INTERRUPT_MASK_FROM_ISR(); - xReturn = xTickCount; - portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedInterruptStatus ); +TickType_t xReturn; +UBaseType_t uxSavedInterruptStatus; + + /* RTOS ports that support interrupt nesting have the concept of a maximum + system call (or maximum API call) interrupt priority. Interrupts that are + above the maximum system call priority are kept permanently enabled, even + when the RTOS kernel is in a critical section, but cannot make any calls to + FreeRTOS API functions. If configASSERT() is defined in FreeRTOSConfig.h + then portASSERT_IF_INTERRUPT_PRIORITY_INVALID() will result in an assertion + failure if a FreeRTOS API function is called from an interrupt that has been + assigned a priority above the configured maximum system call priority. + Only FreeRTOS functions that end in FromISR can be called from interrupts + that have been assigned a priority at or (logically) below the maximum + system call interrupt priority. FreeRTOS maintains a separate interrupt + safe API to ensure interrupt entry is as fast and as simple as possible. + More information (albeit Cortex-M specific) is provided on the following + link: http://www.freertos.org/RTOS-Cortex-M3-M4.html */ + portASSERT_IF_INTERRUPT_PRIORITY_INVALID(); + + uxSavedInterruptStatus = portTICK_TYPE_SET_INTERRUPT_MASK_FROM_ISR(); + { + xReturn = xTickCount; + } + portTICK_TYPE_CLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedInterruptStatus ); return xReturn; } /*-----------------------------------------------------------*/ -unsigned portBASE_TYPE uxTaskGetNumberOfTasks( void ) +UBaseType_t uxTaskGetNumberOfTasks( void ) { /* A critical section is not required because the variables are of type - portBASE_TYPE. */ + BaseType_t. */ return uxCurrentNumberOfTasks; } /*-----------------------------------------------------------*/ #if ( INCLUDE_pcTaskGetTaskName == 1 ) - signed char *pcTaskGetTaskName( xTaskHandle xTaskToQuery ) + char *pcTaskGetTaskName( TaskHandle_t xTaskToQuery ) /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ { - tskTCB *pxTCB; + TCB_t *pxTCB; /* If null is passed in here then the name of the calling task is being queried. */ pxTCB = prvGetTCBFromHandle( xTaskToQuery ); @@ -1533,145 +1832,81 @@ unsigned portBASE_TYPE uxTaskGetNumberOfTasks( void ) #if ( configUSE_TRACE_FACILITY == 1 ) - void vTaskList( signed char *pcWriteBuffer ) + UBaseType_t uxTaskGetSystemState( TaskStatus_t * const pxTaskStatusArray, const UBaseType_t uxArraySize, uint32_t * const pulTotalRunTime ) { - 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. */ + UBaseType_t uxTask = 0, uxQueue = configMAX_PRIORITIES; 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 + /* Is there a space in the array for each task in the system? */ + if( uxArraySize >= uxCurrentNumberOfTasks ) { - uxQueue--; - - if( listLIST_IS_EMPTY( &( pxReadyTasksLists[ uxQueue ] ) ) == pdFALSE ) + /* Fill in an TaskStatus_t structure with information on each + task in the Ready state. */ + do { - prvListTaskWithinSingleList( pcWriteBuffer, ( xList * ) &( pxReadyTasksLists[ uxQueue ] ), tskREADY_CHAR ); - } - }while( uxQueue > ( unsigned short ) tskIDLE_PRIORITY ); + uxQueue--; + uxTask += prvListTaskWithinSingleList( &( pxTaskStatusArray[ uxTask ] ), &( pxReadyTasksLists[ uxQueue ] ), eReady ); - if( listLIST_IS_EMPTY( pxDelayedTaskList ) == pdFALSE ) - { - prvListTaskWithinSingleList( pcWriteBuffer, ( xList * ) pxDelayedTaskList, tskBLOCKED_CHAR ); - } + } while( uxQueue > ( UBaseType_t ) tskIDLE_PRIORITY ); /*lint !e961 MISRA exception as the casts are only redundant for some ports. */ - if( listLIST_IS_EMPTY( pxOverflowDelayedTaskList ) == pdFALSE ) - { - prvListTaskWithinSingleList( pcWriteBuffer, ( xList * ) pxOverflowDelayedTaskList, tskBLOCKED_CHAR ); - } + /* Fill in an TaskStatus_t structure with information on each + task in the Blocked state. */ + uxTask += prvListTaskWithinSingleList( &( pxTaskStatusArray[ uxTask ] ), ( List_t * ) pxDelayedTaskList, eBlocked ); + uxTask += prvListTaskWithinSingleList( &( pxTaskStatusArray[ uxTask ] ), ( List_t * ) pxOverflowDelayedTaskList, eBlocked ); - #if( INCLUDE_vTaskDelete == 1 ) - { - if( listLIST_IS_EMPTY( &xTasksWaitingTermination ) == pdFALSE ) + #if( INCLUDE_vTaskDelete == 1 ) { - prvListTaskWithinSingleList( pcWriteBuffer, &xTasksWaitingTermination, tskDELETED_CHAR ); + /* Fill in an TaskStatus_t structure with information on + each task that has been deleted but not yet cleaned up. */ + uxTask += prvListTaskWithinSingleList( &( pxTaskStatusArray[ uxTask ] ), &xTasksWaitingTermination, eDeleted ); } - } - #endif + #endif - #if ( INCLUDE_vTaskSuspend == 1 ) - { - if( listLIST_IS_EMPTY( &xSuspendedTaskList ) == pdFALSE ) + #if ( INCLUDE_vTaskSuspend == 1 ) { - prvListTaskWithinSingleList( pcWriteBuffer, &xSuspendedTaskList, tskSUSPENDED_CHAR ); + /* Fill in an TaskStatus_t structure with information on + each task in the Suspended state. */ + uxTask += prvListTaskWithinSingleList( &( pxTaskStatusArray[ uxTask ] ), &xSuspendedTaskList, eSuspended ); } - } - #endif - } - xTaskResumeAll(); - } - -#endif /* configUSE_TRACE_FACILITY */ -/*----------------------------------------------------------*/ - -#if ( configGENERATE_RUN_TIME_STATS == 1 ) - - void vTaskGetRunTimeStats( signed char *pcWriteBuffer ) - { - unsigned portBASE_TYPE uxQueue; - unsigned long ulTotalRunTimeDiv100; - - /* 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. */ - ulTotalRunTimeDiv100 = 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--; + #endif - if( listLIST_IS_EMPTY( &( pxReadyTasksLists[ uxQueue ] ) ) == pdFALSE ) + #if ( configGENERATE_RUN_TIME_STATS == 1) { - prvGenerateRunTimeStatsForTasksInList( pcWriteBuffer, ( xList * ) &( pxReadyTasksLists[ uxQueue ] ), ulTotalRunTimeDiv100 ); + if( pulTotalRunTime != NULL ) + { + #ifdef portALT_GET_RUN_TIME_COUNTER_VALUE + portALT_GET_RUN_TIME_COUNTER_VALUE( ( *pulTotalRunTime ) ); + #else + *pulTotalRunTime = portGET_RUN_TIME_COUNTER_VALUE(); + #endif + } } - }while( uxQueue > ( unsigned short ) tskIDLE_PRIORITY ); - - if( listLIST_IS_EMPTY( pxDelayedTaskList ) == pdFALSE ) - { - prvGenerateRunTimeStatsForTasksInList( pcWriteBuffer, ( xList * ) pxDelayedTaskList, ulTotalRunTimeDiv100 ); - } - - if( listLIST_IS_EMPTY( pxOverflowDelayedTaskList ) == pdFALSE ) - { - prvGenerateRunTimeStatsForTasksInList( pcWriteBuffer, ( xList * ) pxOverflowDelayedTaskList, ulTotalRunTimeDiv100 ); - } - - #if ( INCLUDE_vTaskDelete == 1 ) - { - if( listLIST_IS_EMPTY( &xTasksWaitingTermination ) == pdFALSE ) + #else { - prvGenerateRunTimeStatsForTasksInList( pcWriteBuffer, &xTasksWaitingTermination, ulTotalRunTimeDiv100 ); + if( pulTotalRunTime != NULL ) + { + *pulTotalRunTime = 0; + } } + #endif } - #endif - - #if ( INCLUDE_vTaskSuspend == 1 ) + else { - if( listLIST_IS_EMPTY( &xSuspendedTaskList ) == pdFALSE ) - { - prvGenerateRunTimeStatsForTasksInList( pcWriteBuffer, &xSuspendedTaskList, ulTotalRunTimeDiv100 ); - } + mtCOVERAGE_TEST_MARKER(); } - #endif } - xTaskResumeAll(); + ( void ) xTaskResumeAll(); + + return uxTask; } -#endif /* configGENERATE_RUN_TIME_STATS */ +#endif /* configUSE_TRACE_FACILITY */ /*----------------------------------------------------------*/ #if ( INCLUDE_xTaskGetIdleTaskHandle == 1 ) - xTaskHandle xTaskGetIdleTaskHandle( void ) + TaskHandle_t xTaskGetIdleTaskHandle( void ) { /* If xTaskGetIdleTaskHandle() is called before the scheduler has been started, then xIdleTaskHandle will be NULL. */ @@ -1688,66 +1923,166 @@ implementations require configUSE_TICKLESS_IDLE to be set to a value other than 1. */ #if ( configUSE_TICKLESS_IDLE != 0 ) - void vTaskStepTick( portTickType xTicksToJump ) + void vTaskStepTick( const TickType_t xTicksToJump ) { + /* Correct the tick count value after a period during which the tick + was suppressed. Note this does *not* call the tick hook function for + each stepped tick. */ configASSERT( ( xTickCount + xTicksToJump ) <= xNextTaskUnblockTime ); xTickCount += xTicksToJump; + traceINCREASE_TICK_COUNT( xTicksToJump ); } #endif /* configUSE_TICKLESS_IDLE */ /*----------------------------------------------------------*/ -void vTaskIncrementTick( void ) +BaseType_t xTaskIncrementTick( void ) { -tskTCB * pxTCB; +TCB_t * pxTCB; +TickType_t xItemValue; +BaseType_t xSwitchRequired = pdFALSE; /* 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. */ traceTASK_INCREMENT_TICK( xTickCount ); - if( uxSchedulerSuspended == ( unsigned portBASE_TYPE ) pdFALSE ) + if( uxSchedulerSuspended == ( UBaseType_t ) pdFALSE ) { + /* Increment the RTOS tick, switching the delayed and overflowed + delayed lists if it wraps to 0. */ ++xTickCount; - if( xTickCount == ( portTickType ) 0U ) + { - xList *pxTemp; + /* Minor optimisation. The tick count cannot change in this + block. */ + const TickType_t xConstTickCount = xTickCount; + + if( xConstTickCount == ( TickType_t ) 0U ) + { + taskSWITCH_DELAYED_LISTS(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + /* See if this tick has made a timeout expire. Tasks are stored in + the queue in the order of their wake time - meaning once one task + has been found whose block time has not expired there is no need to + look any further down the list. */ + if( xConstTickCount >= 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 must + be removed from the Blocked state. */ + pxTCB = ( TCB_t * ) listGET_OWNER_OF_HEAD_ENTRY( pxDelayedTaskList ); + xItemValue = listGET_LIST_ITEM_VALUE( &( pxTCB->xGenericListItem ) ); + + if( xConstTickCount < 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 must be removed from the Blocked + state - so record the item value in + xNextTaskUnblockTime. */ + xNextTaskUnblockTime = xItemValue; + break; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + /* It is time to remove the item from the Blocked state. */ + ( void ) uxListRemove( &( pxTCB->xGenericListItem ) ); + + /* Is the task waiting on an event also? If so remove + it from the event list. */ + if( listLIST_ITEM_CONTAINER( &( pxTCB->xEventListItem ) ) != NULL ) + { + ( void ) uxListRemove( &( pxTCB->xEventListItem ) ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } - /* 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 ) ) ); + /* Place the unblocked task into the appropriate ready + list. */ + prvAddTaskToReadyList( pxTCB ); - pxTemp = pxDelayedTaskList; - pxDelayedTaskList = pxOverflowDelayedTaskList; - pxOverflowDelayedTaskList = pxTemp; - xNumOfOverflows++; + /* A task being unblocked cannot cause an immediate + context switch if preemption is turned off. */ + #if ( configUSE_PREEMPTION == 1 ) + { + /* Preemption is on, but a context switch should + only be performed if the unblocked task has a + priority that is equal to or higher than the + currently executing task. */ + if( pxTCB->uxPriority >= pxCurrentTCB->uxPriority ) + { + xSwitchRequired = pdTRUE; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + #endif /* configUSE_PREEMPTION */ + } + } + } + } - if( listLIST_IS_EMPTY( pxDelayedTaskList ) != pdFALSE ) + /* Tasks of equal priority to the currently running task will share + processing time (time slice) if preemption is on, and the application + writer has not explicitly turned time slicing off. */ + #if ( ( configUSE_PREEMPTION == 1 ) && ( configUSE_TIME_SLICING == 1 ) ) + { + if( listCURRENT_LIST_LENGTH( &( pxReadyTasksLists[ pxCurrentTCB->uxPriority ] ) ) > ( UBaseType_t ) 1 ) { - /* 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; + xSwitchRequired = pdTRUE; } 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 ) ); + mtCOVERAGE_TEST_MARKER(); } } + #endif /* ( ( configUSE_PREEMPTION == 1 ) && ( configUSE_TIME_SLICING == 1 ) ) */ - /* See if this tick has made a timeout expire. */ - prvCheckDelayedTasks(); + #if ( configUSE_TICK_HOOK == 1 ) + { + /* Guard against the tick hook being called when the pended tick + count is being unwound (when the scheduler is being unlocked). */ + if( uxPendedTicks == ( UBaseType_t ) 0U ) + { + vApplicationTickHook(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + #endif /* configUSE_TICK_HOOK */ } else { - ++uxMissedTicks; + ++uxPendedTicks; /* The tick hook gets called at regular intervals, even if the scheduler is locked. */ @@ -1758,33 +2093,38 @@ tskTCB * pxTCB; #endif } - #if ( configUSE_TICK_HOOK == 1 ) + #if ( configUSE_PREEMPTION == 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 ) + if( xYieldPending != pdFALSE ) { - vApplicationTickHook(); + xSwitchRequired = pdTRUE; + } + else + { + mtCOVERAGE_TEST_MARKER(); } } - #endif /* configUSE_TICK_HOOK */ + #endif /* configUSE_PREEMPTION */ + + return xSwitchRequired; } /*-----------------------------------------------------------*/ #if ( configUSE_APPLICATION_TASK_TAG == 1 ) - void vTaskSetApplicationTaskTag( xTaskHandle xTask, pdTASK_HOOK_CODE pxHookFunction ) + void vTaskSetApplicationTaskTag( TaskHandle_t xTask, TaskHookFunction_t pxHookFunction ) { - tskTCB *xTCB; + TCB_t *xTCB; - /* If xTask is NULL then we are setting our own task hook. */ + /* If xTask is NULL then it is the task hook of the calling task that is + getting set. */ if( xTask == NULL ) { - xTCB = ( tskTCB * ) pxCurrentTCB; + xTCB = ( TCB_t * ) pxCurrentTCB; } else { - xTCB = ( tskTCB * ) xTask; + xTCB = ( TCB_t * ) xTask; } /* Save the hook function in the TCB. A critical section is required as @@ -1799,25 +2139,27 @@ tskTCB * pxTCB; #if ( configUSE_APPLICATION_TASK_TAG == 1 ) - pdTASK_HOOK_CODE xTaskGetApplicationTaskTag( xTaskHandle xTask ) + TaskHookFunction_t xTaskGetApplicationTaskTag( TaskHandle_t xTask ) { - tskTCB *xTCB; - pdTASK_HOOK_CODE xReturn; + TCB_t *xTCB; + TaskHookFunction_t xReturn; /* If xTask is NULL then we are setting our own task hook. */ if( xTask == NULL ) { - xTCB = ( tskTCB * ) pxCurrentTCB; + xTCB = ( TCB_t * ) pxCurrentTCB; } else { - xTCB = ( tskTCB * ) xTask; + xTCB = ( TCB_t * ) 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; @@ -1828,19 +2170,19 @@ tskTCB * pxTCB; #if ( configUSE_APPLICATION_TASK_TAG == 1 ) - portBASE_TYPE xTaskCallApplicationTaskHook( xTaskHandle xTask, void *pvParameter ) + BaseType_t xTaskCallApplicationTaskHook( TaskHandle_t xTask, void *pvParameter ) { - tskTCB *xTCB; - portBASE_TYPE xReturn; + TCB_t *xTCB; + BaseType_t xReturn; /* If xTask is NULL then we are calling our own task hook. */ if( xTask == NULL ) { - xTCB = ( tskTCB * ) pxCurrentTCB; + xTCB = ( TCB_t * ) pxCurrentTCB; } else { - xTCB = ( tskTCB * ) xTask; + xTCB = ( TCB_t * ) xTask; } if( xTCB->pxTaskTag != NULL ) @@ -1858,16 +2200,17 @@ tskTCB * pxTCB; #endif /* configUSE_APPLICATION_TASK_TAG */ /*-----------------------------------------------------------*/ -void __attribute__((used)) vTaskSwitchContext( void ) +void vTaskSwitchContext( void ) { - if( uxSchedulerSuspended != ( unsigned portBASE_TYPE ) pdFALSE ) + if( uxSchedulerSuspended != ( UBaseType_t ) pdFALSE ) { /* The scheduler is currently suspended - do not allow a context switch. */ - xMissedYield = pdTRUE; + xYieldPending = pdTRUE; } else { + xYieldPending = pdFALSE; traceTASK_SWITCHED_OUT(); #if ( configGENERATE_RUN_TIME_STATS == 1 ) @@ -1878,63 +2221,153 @@ void __attribute__((used)) vTaskSwitchContext( void ) ulTotalRunTime = 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 += ( ulTotalRunTime - ulTaskSwitchedInTime ); + /* 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. The guard against negative values is to protect + against suspect run time stat counter implementations - which + are provided by the application, not the kernel. */ + if( ulTotalRunTime > ulTaskSwitchedInTime ) + { + pxCurrentTCB->ulRunTimeCounter += ( ulTotalRunTime - ulTaskSwitchedInTime ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } ulTaskSwitchedInTime = ulTotalRunTime; } #endif /* configGENERATE_RUN_TIME_STATS */ - taskFIRST_CHECK_FOR_STACK_OVERFLOW(); - taskSECOND_CHECK_FOR_STACK_OVERFLOW(); + /* Check for stack overflow, if configured. */ + taskCHECK_FOR_STACK_OVERFLOW(); + /* Select a new task to run using either the generic C or port + optimised asm code. */ taskSELECT_HIGHEST_PRIORITY_TASK(); - traceTASK_SWITCHED_IN(); + + #if ( configUSE_NEWLIB_REENTRANT == 1 ) + { + /* Switch Newlib's _impure_ptr variable to point to the _reent + structure specific to this task. */ + _impure_ptr = &( pxCurrentTCB->xNewLib_reent ); + } + #endif /* configUSE_NEWLIB_REENTRANT */ } } /*-----------------------------------------------------------*/ -void vTaskPlaceOnEventList( const xList * const pxEventList, portTickType xTicksToWait ) +void vTaskPlaceOnEventList( List_t * const pxEventList, const TickType_t xTicksToWait ) { -portTickType xTimeToWake; +TickType_t xTimeToWake; configASSERT( pxEventList ); - /* THIS FUNCTION MUST BE CALLED WITH INTERRUPTS DISABLED OR THE - SCHEDULER SUSPENDED. */ + /* THIS FUNCTION MUST BE CALLED WITH EITHER INTERRUPTS DISABLED OR THE + SCHEDULER SUSPENDED AND THE QUEUE BEING ACCESSED LOCKED. */ /* 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 ) ); + is the first to be woken by the event. The queue that contains the event + list is locked, preventing simultaneous access from interrupts. */ + vListInsert( pxEventList, &( pxCurrentTCB->xEventListItem ) ); + + /* The task must be removed from from the ready list before it is added to + the blocked list as the same list item is used for both lists. Exclusive + access to the ready lists guaranteed because the scheduler is locked. */ + if( uxListRemove( &( pxCurrentTCB->xGenericListItem ) ) == ( UBaseType_t ) 0 ) + { + /* The current task must be in a ready list, so there is no need to + check, and the port reset macro can be called directly. */ + portRESET_READY_PRIORITY( pxCurrentTCB->uxPriority, uxTopReadyPriority ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + #if ( INCLUDE_vTaskSuspend == 1 ) + { + if( xTicksToWait == portMAX_DELAY ) + { + /* Add the task to the suspended task list instead of a delayed task + list to ensure the task is not woken by a timing event. It will + block indefinitely. */ + vListInsertEnd( &xSuspendedTaskList, &( 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, the + scheduler will handle it. */ + xTimeToWake = xTickCount + xTicksToWait; + prvAddCurrentTaskToDelayedList( xTimeToWake ); + } + } + #else /* INCLUDE_vTaskSuspend */ + { + /* Calculate the time at which the task should be woken if the event does + not occur. This may overflow but this doesn't matter, the scheduler + will handle it. */ + xTimeToWake = xTickCount + xTicksToWait; + prvAddCurrentTaskToDelayedList( xTimeToWake ); + } + #endif /* INCLUDE_vTaskSuspend */ +} +/*-----------------------------------------------------------*/ - /* 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. */ - if( uxListRemove( ( xListItem * ) &( pxCurrentTCB->xGenericListItem ) ) == 0 ) +void vTaskPlaceOnUnorderedEventList( List_t * pxEventList, const TickType_t xItemValue, const TickType_t xTicksToWait ) +{ +TickType_t xTimeToWake; + + configASSERT( pxEventList ); + + /* THIS FUNCTION MUST BE CALLED WITH THE SCHEDULER SUSPENDED. It is used by + the event groups implementation. */ + configASSERT( uxSchedulerSuspended != 0 ); + + /* Store the item value in the event list item. It is safe to access the + event list item here as interrupts won't access the event list item of a + task that is not in the Blocked state. */ + listSET_LIST_ITEM_VALUE( &( pxCurrentTCB->xEventListItem ), xItemValue | taskEVENT_LIST_ITEM_VALUE_IN_USE ); + + /* Place the event list item of the TCB at the end of the appropriate event + list. It is safe to access the event list here because it is part of an + event group implementation - and interrupts don't access event groups + directly (instead they access them indirectly by pending function calls to + the task level). */ + vListInsertEnd( pxEventList, &( pxCurrentTCB->xEventListItem ) ); + + /* The task must be removed from the ready list before it is added to the + blocked list. Exclusive access can be assured to the ready list as the + scheduler is locked. */ + if( uxListRemove( &( pxCurrentTCB->xGenericListItem ) ) == ( UBaseType_t ) 0 ) { /* The current task must be in a ready list, so there is no need to check, and the port reset macro can be called directly. */ portRESET_READY_PRIORITY( pxCurrentTCB->uxPriority, uxTopReadyPriority ); } + else + { + mtCOVERAGE_TEST_MARKER(); + } #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 + /* Add the task to the suspended task list instead of a delayed task + list to ensure it is not woken by a timing event. It will block indefinitely. */ - vListInsertEnd( ( xList * ) &xSuspendedTaskList, ( xListItem * ) &( pxCurrentTCB->xGenericListItem ) ); + vListInsertEnd( &xSuspendedTaskList, &( 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. */ + /* Calculate the time at which the task should be woken if the event + does not occur. This may overflow but this doesn't matter, the + kernel will manage it correctly. */ xTimeToWake = xTickCount + xTicksToWait; prvAddCurrentTaskToDelayedList( xTimeToWake ); } @@ -1942,7 +2375,8 @@ portTickType xTimeToWake; #else /* INCLUDE_vTaskSuspend */ { /* Calculate the time at which the task should be woken if the event does - not occur. This may overflow but this doesn't matter. */ + not occur. This may overflow but this doesn't matter, the kernel + will manage it correctly. */ xTimeToWake = xTickCount + xTicksToWait; prvAddCurrentTaskToDelayedList( xTimeToWake ); } @@ -1952,86 +2386,185 @@ portTickType xTimeToWake; #if configUSE_TIMERS == 1 - void vTaskPlaceOnEventListRestricted( const xList * const pxEventList, portTickType xTicksToWait ) + void vTaskPlaceOnEventListRestricted( List_t * const pxEventList, const TickType_t xTicksToWait, const BaseType_t xWaitIndefinitely ) { - portTickType xTimeToWake; + TickType_t 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. */ + it should be called with the scheduler suspended. */ /* 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 ) ); + vListInsertEnd( pxEventList, &( 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. */ - if( uxListRemove( ( xListItem * ) &( pxCurrentTCB->xGenericListItem ) ) == 0 ) + function is called with the scheduler locked so interrupts will not + access the lists at the same time. */ + if( uxListRemove( &( pxCurrentTCB->xGenericListItem ) ) == ( UBaseType_t ) 0 ) { /* The current task must be in a ready list, so there is no need to check, and the port reset macro can be called directly. */ portRESET_READY_PRIORITY( pxCurrentTCB->uxPriority, uxTopReadyPriority ); } + else + { + mtCOVERAGE_TEST_MARKER(); + } - /* 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; + /* If vTaskSuspend() is available then the suspended task list is also + available and a task that is blocking indefinitely can enter the + suspended state (it is not really suspended as it will re-enter the + Ready state when the event it is waiting indefinitely for occurs). + Blocking indefinitely is useful when using tickless idle mode as when + all tasks are blocked indefinitely all timers can be turned off. */ + #if( INCLUDE_vTaskSuspend == 1 ) + { + if( xWaitIndefinitely == pdTRUE ) + { + /* Add the task to the suspended task list instead of a delayed + task list to ensure the task is not woken by a timing event. It + will block indefinitely. */ + vListInsertEnd( &xSuspendedTaskList, &( 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; + traceTASK_DELAY_UNTIL(); + 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; + traceTASK_DELAY_UNTIL(); + prvAddCurrentTaskToDelayedList( xTimeToWake ); - traceTASK_DELAY_UNTIL(); - prvAddCurrentTaskToDelayedList( xTimeToWake ); + /* Remove compiler warnings when INCLUDE_vTaskSuspend() is not + defined. */ + ( void ) xWaitIndefinitely; + } + #endif } #endif /* configUSE_TIMERS */ /*-----------------------------------------------------------*/ -signed portBASE_TYPE xTaskRemoveFromEventList( const xList * const pxEventList ) +BaseType_t xTaskRemoveFromEventList( const List_t * const pxEventList ) { -tskTCB *pxUnblockedTCB; -portBASE_TYPE xReturn; +TCB_t *pxUnblockedTCB; +BaseType_t xReturn; - /* THIS FUNCTION MUST BE CALLED WITH INTERRUPTS DISABLED OR THE - SCHEDULER SUSPENDED. It can also be called from within an ISR. */ + /* THIS FUNCTION MUST BE CALLED FROM A CRITICAL SECTION. It can also be + called from a critical section 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. + /* The event list is sorted in priority order, so the first in the list can + be removed as it is known to be the highest priority. 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. + means exclusive access to the event list is guaranteed 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 ); + pxUnblockedTCB = ( TCB_t * ) listGET_OWNER_OF_HEAD_ENTRY( pxEventList ); configASSERT( pxUnblockedTCB ); - uxListRemove( &( pxUnblockedTCB->xEventListItem ) ); + ( void ) uxListRemove( &( pxUnblockedTCB->xEventListItem ) ); + + if( uxSchedulerSuspended == ( UBaseType_t ) pdFALSE ) + { + ( void ) uxListRemove( &( pxUnblockedTCB->xGenericListItem ) ); + prvAddTaskToReadyList( pxUnblockedTCB ); + } + else + { + /* The delayed and ready lists cannot be accessed, so hold this task + pending until the scheduler is resumed. */ + vListInsertEnd( &( xPendingReadyList ), &( pxUnblockedTCB->xEventListItem ) ); + } - if( uxSchedulerSuspended == ( unsigned portBASE_TYPE ) pdFALSE ) + if( pxUnblockedTCB->uxPriority > pxCurrentTCB->uxPriority ) { - uxListRemove( &( pxUnblockedTCB->xGenericListItem ) ); - prvAddTaskToReadyQueue( pxUnblockedTCB ); + /* 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; + + /* Mark that a yield is pending in case the user is not using the + "xHigherPriorityTaskWoken" parameter to an ISR safe FreeRTOS function. */ + xYieldPending = pdTRUE; } 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 ) ); + xReturn = pdFALSE; + } + + #if( configUSE_TICKLESS_IDLE != 0 ) + { + /* If a task is blocked on a kernel object then xNextTaskUnblockTime + might be set to the blocked task's time out time. If the task is + unblocked for a reason other than a timeout xNextTaskUnblockTime is + normally left unchanged, because it is automatically reset to a new + value when the tick count equals xNextTaskUnblockTime. However if + tickless idling is used it might be more important to enter sleep mode + at the earliest possible time - so reset xNextTaskUnblockTime here to + ensure it is updated at the earliest possible time. */ + prvResetNextTaskUnblockTime(); } + #endif + + return xReturn; +} +/*-----------------------------------------------------------*/ + +BaseType_t xTaskRemoveFromUnorderedEventList( ListItem_t * pxEventListItem, const TickType_t xItemValue ) +{ +TCB_t *pxUnblockedTCB; +BaseType_t xReturn; + + /* THIS FUNCTION MUST BE CALLED WITH THE SCHEDULER SUSPENDED. It is used by + the event flags implementation. */ + configASSERT( uxSchedulerSuspended != pdFALSE ); + + /* Store the new item value in the event list. */ + listSET_LIST_ITEM_VALUE( pxEventListItem, xItemValue | taskEVENT_LIST_ITEM_VALUE_IN_USE ); + + /* Remove the event list form the event flag. Interrupts do not access + event flags. */ + pxUnblockedTCB = ( TCB_t * ) listGET_LIST_ITEM_OWNER( pxEventListItem ); + configASSERT( pxUnblockedTCB ); + ( void ) uxListRemove( pxEventListItem ); + + /* Remove the task from the delayed list and add it to the ready list. The + scheduler is suspended so interrupts will not be accessing the ready + lists. */ + ( void ) uxListRemove( &( pxUnblockedTCB->xGenericListItem ) ); + prvAddTaskToReadyList( pxUnblockedTCB ); - if( pxUnblockedTCB->uxPriority >= pxCurrentTCB->uxPriority ) + 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; + + /* Mark that a yield is pending in case the user is not using the + "xHigherPriorityTaskWoken" parameter to an ISR safe FreeRTOS function. */ + xYieldPending = pdTRUE; } else { @@ -2042,7 +2575,7 @@ portBASE_TYPE xReturn; } /*-----------------------------------------------------------*/ -void vTaskSetTimeOutState( xTimeOutType * const pxTimeOut ) +void vTaskSetTimeOutState( TimeOut_t * const pxTimeOut ) { configASSERT( pxTimeOut ); pxTimeOut->xOverflowCount = xNumOfOverflows; @@ -2050,15 +2583,18 @@ void vTaskSetTimeOutState( xTimeOutType * const pxTimeOut ) } /*-----------------------------------------------------------*/ -portBASE_TYPE xTaskCheckForTimeOut( xTimeOutType * const pxTimeOut, portTickType * const pxTicksToWait ) +BaseType_t xTaskCheckForTimeOut( TimeOut_t * const pxTimeOut, TickType_t * const pxTicksToWait ) { -portBASE_TYPE xReturn; +BaseType_t xReturn; configASSERT( pxTimeOut ); configASSERT( pxTicksToWait ); taskENTER_CRITICAL(); { + /* Minor optimisation. The tick count cannot change in this block. */ + const TickType_t xConstTickCount = xTickCount; + #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 @@ -2070,7 +2606,7 @@ portBASE_TYPE xReturn; else /* We are not blocking indefinitely, perform the checks below. */ #endif - if( ( xNumOfOverflows != pxTimeOut->xOverflowCount ) && ( ( portTickType ) xTickCount >= ( portTickType ) pxTimeOut->xTimeOnEntering ) ) + if( ( xNumOfOverflows != pxTimeOut->xOverflowCount ) && ( xConstTickCount >= pxTimeOut->xTimeOnEntering ) ) /*lint !e525 Indentation preferred as is to make code within pre-processor directives clearer. */ { /* The tick count is greater than the time at which vTaskSetTimeout() was called, but has also overflowed since vTaskSetTimeOut() was called. @@ -2078,10 +2614,10 @@ portBASE_TYPE xReturn; passed since vTaskSetTimeout() was called. */ xReturn = pdTRUE; } - else if( ( ( portTickType ) ( ( portTickType ) xTickCount - ( portTickType ) pxTimeOut->xTimeOnEntering ) ) < ( portTickType ) *pxTicksToWait ) + else if( ( xConstTickCount - pxTimeOut->xTimeOnEntering ) < *pxTicksToWait ) { /* Not a genuine timeout. Adjust parameters for time remaining. */ - *pxTicksToWait -= ( ( portTickType ) xTickCount - ( portTickType ) pxTimeOut->xTimeOnEntering ); + *pxTicksToWait -= ( xConstTickCount - pxTimeOut->xTimeOnEntering ); vTaskSetTimeOutState( pxTimeOut ); xReturn = pdFALSE; } @@ -2098,20 +2634,20 @@ portBASE_TYPE xReturn; void vTaskMissedYield( void ) { - xMissedYield = pdTRUE; + xYieldPending = pdTRUE; } /*-----------------------------------------------------------*/ #if ( configUSE_TRACE_FACILITY == 1 ) - unsigned portBASE_TYPE uxTaskGetTaskNumber( xTaskHandle xTask ) + UBaseType_t uxTaskGetTaskNumber( TaskHandle_t xTask ) { - unsigned portBASE_TYPE uxReturn; - tskTCB *pxTCB; + UBaseType_t uxReturn; + TCB_t *pxTCB; if( xTask != NULL ) { - pxTCB = ( tskTCB * ) xTask; + pxTCB = ( TCB_t * ) xTask; uxReturn = pxTCB->uxTaskNumber; } else @@ -2127,13 +2663,13 @@ void vTaskMissedYield( void ) #if ( configUSE_TRACE_FACILITY == 1 ) - void vTaskSetTaskNumber( xTaskHandle xTask, unsigned portBASE_TYPE uxHandle ) + void vTaskSetTaskNumber( TaskHandle_t xTask, const UBaseType_t uxHandle ) { - tskTCB *pxTCB; + TCB_t *pxTCB; if( xTask != NULL ) { - pxTCB = ( tskTCB * ) xTask; + pxTCB = ( TCB_t * ) xTask; pxTCB->uxTaskNumber = uxHandle; } } @@ -2182,10 +2718,14 @@ static portTASK_FUNCTION( prvIdleTask, pvParameters ) 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 ) + if( listCURRENT_LIST_LENGTH( &( pxReadyTasksLists[ tskIDLE_PRIORITY ] ) ) > ( UBaseType_t ) 1 ) { taskYIELD(); } + else + { + mtCOVERAGE_TEST_MARKER(); + } } #endif /* ( ( configUSE_PREEMPTION == 1 ) && ( configIDLE_SHOULD_YIELD == 1 ) ) */ @@ -2208,7 +2748,8 @@ static portTASK_FUNCTION( prvIdleTask, pvParameters ) configUSE_TICKLESS_IDLE to be set to a value other than 1. */ #if ( configUSE_TICKLESS_IDLE != 0 ) { - portTickType xExpectedIdleTime; + TickType_t xExpectedIdleTime; + /* It is not desirable to suspend then resume the scheduler on each iteration of the idle task. Therefore, a preliminary test of the expected idle time is performed without the @@ -2228,21 +2769,33 @@ static portTASK_FUNCTION( prvIdleTask, pvParameters ) if( xExpectedIdleTime >= configEXPECTED_IDLE_TIME_BEFORE_SLEEP ) { + traceLOW_POWER_IDLE_BEGIN(); portSUPPRESS_TICKS_AND_SLEEP( xExpectedIdleTime ); + traceLOW_POWER_IDLE_END(); + } + else + { + mtCOVERAGE_TEST_MARKER(); } } - xTaskResumeAll(); + ( void ) xTaskResumeAll(); + } + else + { + mtCOVERAGE_TEST_MARKER(); } } #endif /* configUSE_TICKLESS_IDLE */ } -} /*lint !e715 pvParameters is not accessed but all task functions require the same prototype. */ +} /*-----------------------------------------------------------*/ -#if configUSE_TICKLESS_IDLE != 0 +#if( configUSE_TICKLESS_IDLE != 0 ) eSleepModeStatus eTaskConfirmSleepModeStatus( void ) { + /* The idle task exists in addition to the application tasks. */ + const UBaseType_t uxNonApplicationTasks = 1; eSleepModeStatus eReturn = eStandardSleep; if( listCURRENT_LIST_LENGTH( &xPendingReadyList ) != 0 ) @@ -2250,74 +2803,92 @@ static portTASK_FUNCTION( prvIdleTask, pvParameters ) /* A task was made ready while the scheduler was suspended. */ eReturn = eAbortSleep; } - else if( xMissedYield != pdFALSE ) + else if( xYieldPending != pdFALSE ) { /* A yield was pended while the scheduler was suspended. */ eReturn = eAbortSleep; } else { - #if configUSE_TIMERS == 0 + /* If all the tasks are in the suspended list (which might mean they + have an infinite block time rather than actually being suspended) + then it is safe to turn all clocks off and just wait for external + interrupts. */ + if( listCURRENT_LIST_LENGTH( &xSuspendedTaskList ) == ( uxCurrentNumberOfTasks - uxNonApplicationTasks ) ) { - /* The idle task exists in addition to the application tasks. */ - const unsigned portBASE_TYPE uxNonApplicationTasks = 1; - - /* If timers are not being used and all the tasks are in the - suspended list (which might mean they have an infinite block - time rather than actually being suspended) then it is safe to - turn all clocks off and just wait for external interrupts. */ - if( listCURRENT_LIST_LENGTH( &xSuspendedTaskList ) == ( uxCurrentNumberOfTasks - uxNonApplicationTasks ) ) - { - eReturn = eNoTasksWaitingTimeout; - } + eReturn = eNoTasksWaitingTimeout; + } + else + { + mtCOVERAGE_TEST_MARKER(); } - #endif /* configUSE_TIMERS */ } return eReturn; } + #endif /* configUSE_TICKLESS_IDLE */ /*-----------------------------------------------------------*/ -static void prvInitialiseTCBVariables( tskTCB *pxTCB, const signed char * const pcName, unsigned portBASE_TYPE uxPriority, const xMemoryRegion * const xRegions, unsigned short usStackDepth ) +static void prvInitialiseTCBVariables( TCB_t * const pxTCB, const char * const pcName, UBaseType_t uxPriority, const MemoryRegion_t * const xRegions, const uint16_t usStackDepth ) /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ { - /* Store the function name in the TCB. */ - #if configMAX_TASK_NAME_LEN > 1 +UBaseType_t x; + + /* Store the task name in the TCB. */ + for( x = ( UBaseType_t ) 0; x < ( UBaseType_t ) configMAX_TASK_NAME_LEN; x++ ) { - /* Don't bring strncpy into the build unnecessarily. */ - strncpy( ( char * ) pxTCB->pcTaskName, ( const char * ) pcName, ( unsigned short ) configMAX_TASK_NAME_LEN ); + pxTCB->pcTaskName[ x ] = pcName[ x ]; + + /* Don't copy all configMAX_TASK_NAME_LEN if the string is shorter than + configMAX_TASK_NAME_LEN characters just in case the memory after the + string is not accessible (extremely unlikely). */ + if( pcName[ x ] == 0x00 ) + { + break; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } } - #endif /* configMAX_TASK_NAME_LEN */ - pxTCB->pcTaskName[ ( unsigned short ) configMAX_TASK_NAME_LEN - ( unsigned short ) 1 ] = ( signed char ) '\0'; + + /* Ensure the name string is terminated in the case that the string length + was greater or equal to configMAX_TASK_NAME_LEN. */ + pxTCB->pcTaskName[ configMAX_TASK_NAME_LEN - 1 ] = '\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 ) + if( uxPriority >= ( UBaseType_t ) configMAX_PRIORITIES ) + { + uxPriority = ( UBaseType_t ) configMAX_PRIORITIES - ( UBaseType_t ) 1U; + } + else { - uxPriority = configMAX_PRIORITIES - ( unsigned portBASE_TYPE ) 1U; + mtCOVERAGE_TEST_MARKER(); } pxTCB->uxPriority = uxPriority; #if ( configUSE_MUTEXES == 1 ) { pxTCB->uxBasePriority = uxPriority; + pxTCB->uxMutexesHeld = 0; } #endif /* configUSE_MUTEXES */ vListInitialiseItem( &( pxTCB->xGenericListItem ) ); vListInitialiseItem( &( pxTCB->xEventListItem ) ); - /* Set the pxTCB as a link back from the xListItem. This is so we can get + /* Set the pxTCB as a link back from the ListItem_t. 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_VALUE( &( pxTCB->xEventListItem ), ( TickType_t ) configMAX_PRIORITIES - ( TickType_t ) uxPriority ); /*lint !e961 MISRA exception as the casts are only redundant for some ports. */ listSET_LIST_ITEM_OWNER( &( pxTCB->xEventListItem ), pxTCB ); #if ( portCRITICAL_NESTING_IN_TCB == 1 ) { - pxTCB->uxCriticalNesting = ( unsigned portBASE_TYPE ) 0U; + pxTCB->uxCriticalNesting = ( UBaseType_t ) 0U; } #endif /* portCRITICAL_NESTING_IN_TCB */ @@ -2343,21 +2914,79 @@ static void prvInitialiseTCBVariables( tskTCB *pxTCB, const signed char * const ( void ) usStackDepth; } #endif /* portUSING_MPU_WRAPPERS */ + + #if( configNUM_THREAD_LOCAL_STORAGE_POINTERS != 0 ) + { + for( x = 0; x < ( UBaseType_t ) configNUM_THREAD_LOCAL_STORAGE_POINTERS; x++ ) + { + pxTCB->pvThreadLocalStoragePointers[ x ] = NULL; + } + } + #endif + + #if ( configUSE_TASK_NOTIFICATIONS == 1 ) + { + pxTCB->ulNotifiedValue = 0; + pxTCB->eNotifyState = eNotWaitingNotification; + } + #endif + + #if ( configUSE_NEWLIB_REENTRANT == 1 ) + { + /* Initialise this task's Newlib reent structure. */ + _REENT_INIT_PTR( ( &( pxTCB->xNewLib_reent ) ) ); + } + #endif /* configUSE_NEWLIB_REENTRANT */ } /*-----------------------------------------------------------*/ -#if ( portUSING_MPU_WRAPPERS == 1 ) +#if ( configNUM_THREAD_LOCAL_STORAGE_POINTERS != 0 ) + + void vTaskSetThreadLocalStoragePointer( TaskHandle_t xTaskToSet, BaseType_t xIndex, void *pvValue ) + { + TCB_t *pxTCB; + + if( xIndex < configNUM_THREAD_LOCAL_STORAGE_POINTERS ) + { + pxTCB = prvGetTCBFromHandle( xTaskToSet ); + pxTCB->pvThreadLocalStoragePointers[ xIndex ] = pvValue; + } + } + +#endif /* configNUM_THREAD_LOCAL_STORAGE_POINTERS */ +/*-----------------------------------------------------------*/ + +#if ( configNUM_THREAD_LOCAL_STORAGE_POINTERS != 0 ) - void vTaskAllocateMPURegions( xTaskHandle xTaskToModify, const xMemoryRegion * const xRegions ) + void *pvTaskGetThreadLocalStoragePointer( TaskHandle_t xTaskToQuery, BaseType_t xIndex ) { - tskTCB *pxTCB; + void *pvReturn = NULL; + TCB_t *pxTCB; - if( xTaskToModify == pxCurrentTCB ) + if( xIndex < configNUM_THREAD_LOCAL_STORAGE_POINTERS ) { - xTaskToModify = NULL; + pxTCB = prvGetTCBFromHandle( xTaskToQuery ); + pvReturn = pxTCB->pvThreadLocalStoragePointers[ xIndex ]; } + else + { + pvReturn = NULL; + } + + return pvReturn; + } + +#endif /* configNUM_THREAD_LOCAL_STORAGE_POINTERS */ +/*-----------------------------------------------------------*/ + +#if ( portUSING_MPU_WRAPPERS == 1 ) + + void vTaskAllocateMPURegions( TaskHandle_t xTaskToModify, const MemoryRegion_t * const xRegions ) + { + TCB_t *pxTCB; - /* If null is passed in here then we are deleting ourselves. */ + /* If null is passed in here then we are modifying the MPU settings of + the calling task. */ pxTCB = prvGetTCBFromHandle( xTaskToModify ); vPortStoreTaskMPUSettings( &( pxTCB->xMPUSettings ), xRegions, NULL, 0 ); @@ -2368,26 +2997,26 @@ static void prvInitialiseTCBVariables( tskTCB *pxTCB, const signed char * const static void prvInitialiseTaskLists( void ) { -unsigned portBASE_TYPE uxPriority; +UBaseType_t uxPriority; - for( uxPriority = ( unsigned portBASE_TYPE ) 0U; uxPriority < configMAX_PRIORITIES; uxPriority++ ) + for( uxPriority = ( UBaseType_t ) 0U; uxPriority < ( UBaseType_t ) configMAX_PRIORITIES; uxPriority++ ) { - vListInitialise( ( xList * ) &( pxReadyTasksLists[ uxPriority ] ) ); + vListInitialise( &( pxReadyTasksLists[ uxPriority ] ) ); } - vListInitialise( ( xList * ) &xDelayedTaskList1 ); - vListInitialise( ( xList * ) &xDelayedTaskList2 ); - vListInitialise( ( xList * ) &xPendingReadyList ); + vListInitialise( &xDelayedTaskList1 ); + vListInitialise( &xDelayedTaskList2 ); + vListInitialise( &xPendingReadyList ); #if ( INCLUDE_vTaskDelete == 1 ) { - vListInitialise( ( xList * ) &xTasksWaitingTermination ); + vListInitialise( &xTasksWaitingTermination ); } #endif /* INCLUDE_vTaskDelete */ #if ( INCLUDE_vTaskSuspend == 1 ) { - vListInitialise( ( xList * ) &xSuspendedTaskList ); + vListInitialise( &xSuspendedTaskList ); } #endif /* INCLUDE_vTaskSuspend */ @@ -2402,24 +3031,26 @@ static void prvCheckTasksWaitingTermination( void ) { #if ( INCLUDE_vTaskDelete == 1 ) { - portBASE_TYPE xListIsEmpty; + BaseType_t xListIsEmpty; /* ucTasksDeleted is used to prevent vTaskSuspendAll() being called too often in the idle task. */ - while( uxTasksDeleted > ( unsigned portBASE_TYPE ) 0U ) + while( uxTasksDeleted > ( UBaseType_t ) 0U ) { vTaskSuspendAll(); + { xListIsEmpty = listLIST_IS_EMPTY( &xTasksWaitingTermination ); - xTaskResumeAll(); + } + ( void ) xTaskResumeAll(); if( xListIsEmpty == pdFALSE ) { - tskTCB *pxTCB; + TCB_t *pxTCB; taskENTER_CRITICAL(); { - pxTCB = ( tskTCB * ) listGET_OWNER_OF_HEAD_ENTRY( ( ( xList * ) &xTasksWaitingTermination ) ); - uxListRemove( &( pxTCB->xGenericListItem ) ); + pxTCB = ( TCB_t * ) listGET_OWNER_OF_HEAD_ENTRY( ( &xTasksWaitingTermination ) ); + ( void ) uxListRemove( &( pxTCB->xGenericListItem ) ); --uxCurrentNumberOfTasks; --uxTasksDeleted; } @@ -2427,13 +3058,17 @@ static void prvCheckTasksWaitingTermination( void ) prvDeleteTCB( pxTCB ); } + else + { + mtCOVERAGE_TEST_MARKER(); + } } } #endif /* vTaskDelete */ } /*-----------------------------------------------------------*/ -static void prvAddCurrentTaskToDelayedList( portTickType xTimeToWake ) +static void prvAddCurrentTaskToDelayedList( const TickType_t xTimeToWake ) { /* The list item will be inserted in wake time order. */ listSET_LIST_ITEM_VALUE( &( pxCurrentTCB->xGenericListItem ), xTimeToWake ); @@ -2441,12 +3076,12 @@ static void prvAddCurrentTaskToDelayedList( portTickType xTimeToWake ) if( xTimeToWake < xTickCount ) { /* Wake time has overflowed. Place this item in the overflow list. */ - vListInsert( ( xList * ) pxOverflowDelayedTaskList, ( xListItem * ) &( pxCurrentTCB->xGenericListItem ) ); + vListInsert( pxOverflowDelayedTaskList, &( pxCurrentTCB->xGenericListItem ) ); } else { - /* The wake time has not overflowed, so we can use the current block list. */ - vListInsert( ( xList * ) pxDelayedTaskList, ( xListItem * ) &( pxCurrentTCB->xGenericListItem ) ); + /* The wake time has not overflowed, so the current block list is used. */ + vListInsert( pxDelayedTaskList, &( 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 @@ -2455,160 +3090,189 @@ static void prvAddCurrentTaskToDelayedList( portTickType xTimeToWake ) { xNextTaskUnblockTime = xTimeToWake; } + else + { + mtCOVERAGE_TEST_MARKER(); + } } } /*-----------------------------------------------------------*/ -static tskTCB *prvAllocateTCBAndStack( unsigned short usStackDepth, portSTACK_TYPE *puxStackBuffer ) +static TCB_t *prvAllocateTCBAndStack( const uint16_t usStackDepth, StackType_t * const puxStackBuffer ) { -tskTCB *pxNewTCB; +TCB_t *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 ) ); - tot_alloc_overhead += sizeof( tskTCB ); - if( pxNewTCB != NULL ) + /* If the stack grows down then allocate the stack then the TCB so the stack + does not grow into the TCB. Likewise if the stack grows up then allocate + the TCB then the stack. */ + #if( portSTACK_GROWTH > 0 ) { - /* 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 ); - tot_alloc_stack += (( size_t )usStackDepth ) * sizeof( portSTACK_TYPE ); - if( pxNewTCB->pxStack == NULL ) - { - /* Could not allocate the stack. Delete the allocated TCB. */ - vPortFree( pxNewTCB ); - pxNewTCB = NULL; - } - else + /* Allocate space for the TCB. Where the memory comes from depends on + the implementation of the port malloc function. */ + pxNewTCB = ( TCB_t * ) pvPortMalloc( sizeof( TCB_t ) ); + + if( pxNewTCB != NULL ) { - /* Just to help debugging. */ - memset( pxNewTCB->pxStack, ( int ) tskSTACK_FILL_BYTE, ( size_t ) usStackDepth * sizeof( portSTACK_TYPE ) ); + /* 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 = ( StackType_t * ) pvPortMallocAligned( ( ( ( size_t ) usStackDepth ) * sizeof( StackType_t ) ), puxStackBuffer ); /*lint !e961 MISRA exception as the casts are only redundant for some ports. */ + + if( pxNewTCB->pxStack == NULL ) + { + /* Could not allocate the stack. Delete the allocated TCB. */ + vPortFree( pxNewTCB ); + pxNewTCB = NULL; + } } } - - return pxNewTCB; -} -/*-----------------------------------------------------------*/ - -#if ( configUSE_TRACE_FACILITY == 1 ) - - static void prvListTaskWithinSingleList( const signed char *pcWriteBuffer, xList *pxList, signed char cStatus ) + #else /* portSTACK_GROWTH */ { - volatile tskTCB *pxNextTCB, *pxFirstTCB; - unsigned short usStackRemaining; - PRIVILEGED_DATA static char pcStatusString[ configMAX_TASK_NAME_LEN + 30 ]; + StackType_t *pxStack; - /* Write the details of all the TCB's in pxList into the buffer. */ - listGET_OWNER_OF_NEXT_ENTRY( pxFirstTCB, pxList ); - do + /* Allocate space for the stack used by the task being created. */ + pxStack = ( StackType_t * ) pvPortMallocAligned( ( ( ( size_t ) usStackDepth ) * sizeof( StackType_t ) ), puxStackBuffer ); /*lint !e961 MISRA exception as the casts are only redundant for some ports. */ + + if( pxStack != NULL ) { - listGET_OWNER_OF_NEXT_ENTRY( pxNextTCB, pxList ); - #if ( portSTACK_GROWTH > 0 ) + /* Allocate space for the TCB. Where the memory comes from depends + on the implementation of the port malloc function. */ + pxNewTCB = ( TCB_t * ) pvPortMalloc( sizeof( TCB_t ) ); + + if( pxNewTCB != NULL ) { - usStackRemaining = usTaskCheckFreeStackSpace( ( unsigned char * ) pxNextTCB->pxEndOfStack ); + /* Store the stack location in the TCB. */ + pxNewTCB->pxStack = pxStack; } - #else + else { - usStackRemaining = usTaskCheckFreeStackSpace( ( unsigned char * ) pxNextTCB->pxStack ); + /* The stack cannot be used as the TCB was not created. Free it + again. */ + vPortFree( pxStack ); } - #endif - - sprintf( pcStatusString, ( char * ) "%s\t\t%c\t%u\t%u\t%u\r\n", pxNextTCB->pcTaskName, cStatus, ( unsigned int ) pxNextTCB->uxPriority, ( unsigned int ) usStackRemaining, ( unsigned int ) pxNextTCB->uxTCBNumber ); - strcat( ( char * ) pcWriteBuffer, ( char * ) pcStatusString ); + } + else + { + pxNewTCB = NULL; + } + } + #endif /* portSTACK_GROWTH */ - } while( pxNextTCB != pxFirstTCB ); + if( pxNewTCB != NULL ) + { + /* Avoid dependency on memset() if it is not required. */ + #if( ( configCHECK_FOR_STACK_OVERFLOW > 1 ) || ( configUSE_TRACE_FACILITY == 1 ) || ( INCLUDE_uxTaskGetStackHighWaterMark == 1 ) ) + { + /* Just to help debugging. */ + ( void ) memset( pxNewTCB->pxStack, ( int ) tskSTACK_FILL_BYTE, ( size_t ) usStackDepth * sizeof( StackType_t ) ); + } + #endif /* ( ( configCHECK_FOR_STACK_OVERFLOW > 1 ) || ( ( configUSE_TRACE_FACILITY == 1 ) || ( INCLUDE_uxTaskGetStackHighWaterMark == 1 ) ) ) */ } -#endif /* configUSE_TRACE_FACILITY */ + return pxNewTCB; +} /*-----------------------------------------------------------*/ -#if ( configGENERATE_RUN_TIME_STATS == 1 ) +#if ( configUSE_TRACE_FACILITY == 1 ) - static void prvGenerateRunTimeStatsForTasksInList( const signed char *pcWriteBuffer, xList *pxList, unsigned long ulTotalRunTimeDiv100 ) + static UBaseType_t prvListTaskWithinSingleList( TaskStatus_t *pxTaskStatusArray, List_t *pxList, eTaskState eState ) { - volatile tskTCB *pxNextTCB, *pxFirstTCB; - unsigned long ulStatsAsPercentage; + volatile TCB_t *pxNextTCB, *pxFirstTCB; + UBaseType_t uxTask = 0; - /* Write the run time stats of all the TCB's in pxList into the buffer. */ - listGET_OWNER_OF_NEXT_ENTRY( pxFirstTCB, pxList ); - do + if( listCURRENT_LIST_LENGTH( pxList ) > ( UBaseType_t ) 0 ) { - /* Get next TCB in from the list. */ - listGET_OWNER_OF_NEXT_ENTRY( pxNextTCB, pxList ); + listGET_OWNER_OF_NEXT_ENTRY( pxFirstTCB, pxList ); - /* Divide by zero check. */ - if( ulTotalRunTimeDiv100 > 0UL ) + /* Populate an TaskStatus_t structure within the + pxTaskStatusArray array for each task that is referenced from + pxList. See the definition of TaskStatus_t in task.h for the + meaning of each TaskStatus_t structure member. */ + do { - /* Has the task run at all? */ - if( pxNextTCB->ulRunTimeCounter == 0UL ) - { - /* 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. - ulTotalRunTimeDiv100 has already been divided by 100. */ - ulStatsAsPercentage = pxNextTCB->ulRunTimeCounter / ulTotalRunTimeDiv100; + listGET_OWNER_OF_NEXT_ENTRY( pxNextTCB, pxList ); - 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 + pxTaskStatusArray[ uxTask ].xHandle = ( TaskHandle_t ) pxNextTCB; + pxTaskStatusArray[ uxTask ].pcTaskName = ( const char * ) &( pxNextTCB->pcTaskName [ 0 ] ); + pxTaskStatusArray[ uxTask ].xTaskNumber = pxNextTCB->uxTCBNumber; + pxTaskStatusArray[ uxTask ].eCurrentState = eState; + pxTaskStatusArray[ uxTask ].uxCurrentPriority = pxNextTCB->uxPriority; + + #if ( INCLUDE_vTaskSuspend == 1 ) + { + /* If the task is in the suspended list then there is a chance + it is actually just blocked indefinitely - so really it should + be reported as being in the Blocked state. */ + if( eState == eSuspended ) { - /* If the percentage is zero here then the task has - consumed less than 1% of the total run time. */ - #ifdef portLU_PRINTF_SPECIFIER_REQUIRED + if( listLIST_ITEM_CONTAINER( &( pxNextTCB->xEventListItem ) ) != NULL ) { - 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 ); + pxTaskStatusArray[ uxTask ].eCurrentState = eBlocked; } - #endif } } + #endif /* INCLUDE_vTaskSuspend */ - strcat( ( char * ) pcWriteBuffer, ( char * ) pcStatsString ); - } + #if ( configUSE_MUTEXES == 1 ) + { + pxTaskStatusArray[ uxTask ].uxBasePriority = pxNextTCB->uxBasePriority; + } + #else + { + pxTaskStatusArray[ uxTask ].uxBasePriority = 0; + } + #endif + + #if ( configGENERATE_RUN_TIME_STATS == 1 ) + { + pxTaskStatusArray[ uxTask ].ulRunTimeCounter = pxNextTCB->ulRunTimeCounter; + } + #else + { + pxTaskStatusArray[ uxTask ].ulRunTimeCounter = 0; + } + #endif + + #if ( portSTACK_GROWTH > 0 ) + { + pxTaskStatusArray[ uxTask ].usStackHighWaterMark = prvTaskCheckFreeStackSpace( ( uint8_t * ) pxNextTCB->pxEndOfStack ); + } + #else + { + pxTaskStatusArray[ uxTask ].usStackHighWaterMark = prvTaskCheckFreeStackSpace( ( uint8_t * ) pxNextTCB->pxStack ); + } + #endif - } while( pxNextTCB != pxFirstTCB ); + uxTask++; + + } while( pxNextTCB != pxFirstTCB ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + return uxTask; } -#endif /* configGENERATE_RUN_TIME_STATS */ +#endif /* configUSE_TRACE_FACILITY */ /*-----------------------------------------------------------*/ #if ( ( configUSE_TRACE_FACILITY == 1 ) || ( INCLUDE_uxTaskGetStackHighWaterMark == 1 ) ) - static unsigned short usTaskCheckFreeStackSpace( const unsigned char * pucStackByte ) + static uint16_t prvTaskCheckFreeStackSpace( const uint8_t * pucStackByte ) { - register unsigned short usCount = 0U; + uint32_t ulCount = 0U; - while( *pucStackByte == tskSTACK_FILL_BYTE ) + while( *pucStackByte == ( uint8_t ) tskSTACK_FILL_BYTE ) { pucStackByte -= portSTACK_GROWTH; - usCount++; + ulCount++; } - usCount /= sizeof( portSTACK_TYPE ); + ulCount /= ( uint32_t ) sizeof( StackType_t ); /*lint !e961 Casting is not redundant on smaller architectures. */ - return usCount; + return ( uint16_t ) ulCount; } #endif /* ( ( configUSE_TRACE_FACILITY == 1 ) || ( INCLUDE_uxTaskGetStackHighWaterMark == 1 ) ) */ @@ -2616,25 +3280,25 @@ tskTCB *pxNewTCB; #if ( INCLUDE_uxTaskGetStackHighWaterMark == 1 ) - unsigned portBASE_TYPE uxTaskGetStackHighWaterMark( xTaskHandle xTask ) + UBaseType_t uxTaskGetStackHighWaterMark( TaskHandle_t xTask ) { - tskTCB *pxTCB; - unsigned char *pcEndOfStack; - unsigned portBASE_TYPE uxReturn; + TCB_t *pxTCB; + uint8_t *pucEndOfStack; + UBaseType_t uxReturn; pxTCB = prvGetTCBFromHandle( xTask ); #if portSTACK_GROWTH < 0 { - pcEndOfStack = ( unsigned char * ) pxTCB->pxStack; + pucEndOfStack = ( uint8_t * ) pxTCB->pxStack; } #else { - pcEndOfStack = ( unsigned char * ) pxTCB->pxEndOfStack; + pucEndOfStack = ( uint8_t * ) pxTCB->pxEndOfStack; } #endif - uxReturn = ( unsigned portBASE_TYPE ) usTaskCheckFreeStackSpace( pcEndOfStack ); + uxReturn = ( UBaseType_t ) prvTaskCheckFreeStackSpace( pucEndOfStack ); return uxReturn; } @@ -2644,27 +3308,71 @@ tskTCB *pxNewTCB; #if ( INCLUDE_vTaskDelete == 1 ) - static void prvDeleteTCB( tskTCB *pxTCB ) + static void prvDeleteTCB( TCB_t *pxTCB ) { /* This call is required specifically for the TriCore port. It must be above the vPortFree() calls. The call is also used by ports/demos that want to allocate and clean RAM statically. */ portCLEAN_UP_TCB( 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 ); + /* 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. */ + #if ( configUSE_NEWLIB_REENTRANT == 1 ) + { + _reclaim_reent( &( pxTCB->xNewLib_reent ) ); + } + #endif /* configUSE_NEWLIB_REENTRANT */ + + #if( portUSING_MPU_WRAPPERS == 1 ) + { + /* Only free the stack if it was allocated dynamically in the first + place. */ + if( pxTCB->xUsingStaticallyAllocatedStack == pdFALSE ) + { + vPortFreeAligned( pxTCB->pxStack ); + } + } + #else + { + vPortFreeAligned( pxTCB->pxStack ); + } + #endif + vPortFree( pxTCB ); } #endif /* INCLUDE_vTaskDelete */ /*-----------------------------------------------------------*/ +static void prvResetNextTaskUnblockTime( void ) +{ +TCB_t *pxTCB; + + 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 ) = ( TCB_t * ) listGET_OWNER_OF_HEAD_ENTRY( pxDelayedTaskList ); + xNextTaskUnblockTime = listGET_LIST_ITEM_VALUE( &( ( pxTCB )->xGenericListItem ) ); + } +} +/*-----------------------------------------------------------*/ + #if ( ( INCLUDE_xTaskGetCurrentTaskHandle == 1 ) || ( configUSE_MUTEXES == 1 ) ) - xTaskHandle xTaskGetCurrentTaskHandle( void ) + TaskHandle_t xTaskGetCurrentTaskHandle( void ) { - xTaskHandle xReturn; + TaskHandle_t 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 @@ -2679,9 +3387,9 @@ tskTCB *pxNewTCB; #if ( ( INCLUDE_xTaskGetSchedulerState == 1 ) || ( configUSE_TIMERS == 1 ) ) - portBASE_TYPE xTaskGetSchedulerState( void ) + BaseType_t xTaskGetSchedulerState( void ) { - portBASE_TYPE xReturn; + BaseType_t xReturn; if( xSchedulerRunning == pdFALSE ) { @@ -2689,7 +3397,7 @@ tskTCB *pxNewTCB; } else { - if( uxSchedulerSuspended == ( unsigned portBASE_TYPE ) pdFALSE ) + if( uxSchedulerSuspended == ( UBaseType_t ) pdFALSE ) { xReturn = taskSCHEDULER_RUNNING; } @@ -2707,31 +3415,47 @@ tskTCB *pxNewTCB; #if ( configUSE_MUTEXES == 1 ) - void vTaskPriorityInherit( xTaskHandle * const pxMutexHolder ) + void vTaskPriorityInherit( TaskHandle_t const pxMutexHolder ) { - tskTCB * const pxTCB = ( tskTCB * ) pxMutexHolder; + TCB_t * const pxTCB = ( TCB_t * ) pxMutexHolder; /* If the mutex was given back by an interrupt while the queue was locked then the mutex holder might now be NULL. */ if( pxMutexHolder != NULL ) { + /* If the holder of the mutex has a priority below the priority of + the task attempting to obtain the mutex then it will temporarily + inherit the priority of the task attempting to obtain the mutex. */ 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 ); + /* Adjust the mutex holder state to account for its new + priority. Only reset the event list item value if the value is + not being used for anything else. */ + if( ( listGET_LIST_ITEM_VALUE( &( pxTCB->xEventListItem ) ) & taskEVENT_LIST_ITEM_VALUE_IN_USE ) == 0UL ) + { + listSET_LIST_ITEM_VALUE( &( pxTCB->xEventListItem ), ( TickType_t ) configMAX_PRIORITIES - ( TickType_t ) pxCurrentTCB->uxPriority ); /*lint !e961 MISRA exception as the casts are only redundant for some ports. */ + } + else + { + mtCOVERAGE_TEST_MARKER(); + } - /* If the task being modified is in the ready state it will need to - be moved into a new list. */ + /* If the task being modified is in the ready state it will need + to be moved into a new list. */ if( listIS_CONTAINED_WITHIN( &( pxReadyTasksLists[ pxTCB->uxPriority ] ), &( pxTCB->xGenericListItem ) ) != pdFALSE ) { - if( uxListRemove( ( xListItem * ) &( pxTCB->xGenericListItem ) ) == 0 ) + if( uxListRemove( &( pxTCB->xGenericListItem ) ) == ( UBaseType_t ) 0 ) { taskRESET_READY_PRIORITY( pxTCB->uxPriority ); } + else + { + mtCOVERAGE_TEST_MARKER(); + } /* Inherit the priority before being moved into the new list. */ pxTCB->uxPriority = pxCurrentTCB->uxPriority; - prvAddTaskToReadyQueue( pxTCB ); + prvAddTaskToReadyList( pxTCB ); } else { @@ -2741,6 +3465,14 @@ tskTCB *pxNewTCB; traceTASK_PRIORITY_INHERIT( pxTCB, pxCurrentTCB->uxPriority ); } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); } } @@ -2749,29 +3481,80 @@ tskTCB *pxNewTCB; #if ( configUSE_MUTEXES == 1 ) - void vTaskPriorityDisinherit( xTaskHandle * const pxMutexHolder ) + BaseType_t xTaskPriorityDisinherit( TaskHandle_t const pxMutexHolder ) { - tskTCB * const pxTCB = ( tskTCB * ) pxMutexHolder; + TCB_t * const pxTCB = ( TCB_t * ) pxMutexHolder; + BaseType_t xReturn = pdFALSE; if( pxMutexHolder != NULL ) { + /* A task can only have an inherited priority if it holds the mutex. + If the mutex is held by a task then it cannot be given from an + interrupt, and if a mutex is given by the holding task then it must + be the running state task. */ + configASSERT( pxTCB == pxCurrentTCB ); + + configASSERT( pxTCB->uxMutexesHeld ); + ( pxTCB->uxMutexesHeld )--; + + /* Has the holder of the mutex inherited the priority of another + task? */ 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. */ - if( uxListRemove( ( xListItem * ) &( pxTCB->xGenericListItem ) ) == 0 ) + /* Only disinherit if no other mutexes are held. */ + if( pxTCB->uxMutexesHeld == ( UBaseType_t ) 0 ) { - taskRESET_READY_PRIORITY( pxTCB->uxPriority ); - } + /* A task can only have an inherited priority if it holds + the mutex. If the mutex is held by a task then it cannot be + given from an interrupt, and if a mutex is given by the + holding task then it must be the running state task. Remove + the holding task from the ready list. */ + if( uxListRemove( &( pxTCB->xGenericListItem ) ) == ( UBaseType_t ) 0 ) + { + taskRESET_READY_PRIORITY( pxTCB->uxPriority ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } - /* Disinherit the priority before adding the task into the new - ready list. */ - traceTASK_PRIORITY_DISINHERIT( pxTCB, pxTCB->uxBasePriority ); - pxTCB->uxPriority = pxTCB->uxBasePriority; - listSET_LIST_ITEM_VALUE( &( pxTCB->xEventListItem ), configMAX_PRIORITIES - ( portTickType ) pxTCB->uxPriority ); - prvAddTaskToReadyQueue( pxTCB ); + /* Disinherit the priority before adding the task into the + new ready list. */ + traceTASK_PRIORITY_DISINHERIT( pxTCB, pxTCB->uxBasePriority ); + pxTCB->uxPriority = pxTCB->uxBasePriority; + + /* Reset the event list item value. It cannot be in use for + any other purpose if this task is running, and it must be + running to give back the mutex. */ + listSET_LIST_ITEM_VALUE( &( pxTCB->xEventListItem ), ( TickType_t ) configMAX_PRIORITIES - ( TickType_t ) pxTCB->uxPriority ); /*lint !e961 MISRA exception as the casts are only redundant for some ports. */ + prvAddTaskToReadyList( pxTCB ); + + /* Return true to indicate that a context switch is required. + This is only actually required in the corner case whereby + multiple mutexes were held and the mutexes were given back + in an order different to that in which they were taken. + If a context switch did not occur when the first mutex was + returned, even if a task was waiting on it, then a context + switch should occur when the last mutex is returned whether + a task is waiting on it or not. */ + xReturn = pdTRUE; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); } } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + return xReturn; } #endif /* configUSE_MUTEXES */ @@ -2786,6 +3569,21 @@ tskTCB *pxNewTCB; if( xSchedulerRunning != pdFALSE ) { ( pxCurrentTCB->uxCriticalNesting )++; + + /* This is not the interrupt safe version of the enter critical + function so assert() if it is being called from an interrupt + context. Only API functions that end in "FromISR" can be used in an + interrupt. Only assert if the critical nesting count is 1 to + protect against recursive calls if the assert function also uses a + critical section. */ + if( pxCurrentTCB->uxCriticalNesting == 1 ) + { + portASSERT_IF_IN_ISR(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); } } @@ -2806,13 +3604,874 @@ tskTCB *pxNewTCB; { portENABLE_INTERRUPTS(); } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); } } + else + { + mtCOVERAGE_TEST_MARKER(); + } } #endif /* portCRITICAL_NESTING_IN_TCB */ /*-----------------------------------------------------------*/ +#if ( ( configUSE_TRACE_FACILITY == 1 ) && ( configUSE_STATS_FORMATTING_FUNCTIONS > 0 ) ) + + static char *prvWriteNameToBuffer( char *pcBuffer, const char *pcTaskName ) + { + size_t x; + + /* Start by copying the entire string. */ + strcpy( pcBuffer, pcTaskName ); + + /* Pad the end of the string with spaces to ensure columns line up when + printed out. */ + for( x = strlen( pcBuffer ); x < ( size_t ) ( configMAX_TASK_NAME_LEN - 1 ); x++ ) + { + pcBuffer[ x ] = ' '; + } + + /* Terminate. */ + pcBuffer[ x ] = 0x00; + + /* Return the new end of string. */ + return &( pcBuffer[ x ] ); + } + +#endif /* ( configUSE_TRACE_FACILITY == 1 ) && ( configUSE_STATS_FORMATTING_FUNCTIONS > 0 ) */ +/*-----------------------------------------------------------*/ + +#if ( ( configUSE_TRACE_FACILITY == 1 ) && ( configUSE_STATS_FORMATTING_FUNCTIONS > 0 ) ) + void vTaskList( char * pcWriteBuffer ) + { + TaskStatus_t *pxTaskStatusArray; + volatile UBaseType_t uxArraySize, x; + char cStatus; + + /* + * PLEASE NOTE: + * + * This function is provided for convenience only, and is used by many + * of the demo applications. Do not consider it to be part of the + * scheduler. + * + * vTaskList() calls uxTaskGetSystemState(), then formats part of the + * uxTaskGetSystemState() output into a human readable table that + * displays task names, states and stack usage. + * + * vTaskList() has a dependency on the sprintf() C library function that + * might bloat the code size, use a lot of stack, and provide different + * results on different platforms. An alternative, tiny, third party, + * and limited functionality implementation of sprintf() is provided in + * many of the FreeRTOS/Demo sub-directories in a file called + * printf-stdarg.c (note printf-stdarg.c does not provide a full + * snprintf() implementation!). + * + * It is recommended that production systems call uxTaskGetSystemState() + * directly to get access to raw stats data, rather than indirectly + * through a call to vTaskList(). + */ + + + /* Make sure the write buffer does not contain a string. */ + *pcWriteBuffer = 0x00; + + /* Take a snapshot of the number of tasks in case it changes while this + function is executing. */ + uxArraySize = uxCurrentNumberOfTasks; + + /* Allocate an array index for each task. */ + pxTaskStatusArray = pvPortMalloc( uxCurrentNumberOfTasks * sizeof( TaskStatus_t ) ); + + if( pxTaskStatusArray != NULL ) + { + /* Generate the (binary) data. */ + uxArraySize = uxTaskGetSystemState( pxTaskStatusArray, uxArraySize, NULL ); + /* Create a human readable table from the binary data. */ + for( x = 0; x < uxArraySize; x++ ) + { + switch( pxTaskStatusArray[ x ].eCurrentState ) + { + case eReady: cStatus = tskREADY_CHAR; + break; + + case eBlocked: cStatus = tskBLOCKED_CHAR; + break; + + case eSuspended: cStatus = tskSUSPENDED_CHAR; + break; + + case eDeleted: cStatus = tskDELETED_CHAR; + break; + + default: /* Should not get here, but it is included + to prevent static checking errors. */ + cStatus = 0x00; + break; + } + + /* Write the task name to the string, padding with spaces so it + can be printed in tabular form more easily. */ + pcWriteBuffer = prvWriteNameToBuffer( pcWriteBuffer, pxTaskStatusArray[ x ].pcTaskName ); + + /* Write the rest of the string. */ + sprintf( pcWriteBuffer, "\t%c\t%u\t%u\t%u\r\n", cStatus, ( unsigned int ) pxTaskStatusArray[ x ].uxCurrentPriority, ( unsigned int ) pxTaskStatusArray[ x ].usStackHighWaterMark, ( unsigned int ) pxTaskStatusArray[ x ].xTaskNumber ); + pcWriteBuffer += strlen( pcWriteBuffer ); + } + + /* Free the array again. */ + vPortFree( pxTaskStatusArray ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + +#endif /* ( ( configUSE_TRACE_FACILITY == 1 ) && ( configUSE_STATS_FORMATTING_FUNCTIONS > 0 ) ) */ +/*----------------------------------------------------------*/ + +#if ( ( configGENERATE_RUN_TIME_STATS == 1 ) && ( configUSE_STATS_FORMATTING_FUNCTIONS > 0 ) ) + + void vTaskGetRunTimeStats( char *pcWriteBuffer ) + { + TaskStatus_t *pxTaskStatusArray; + volatile UBaseType_t uxArraySize, x; + uint32_t ulTotalTime, ulStatsAsPercentage; + + #if( configUSE_TRACE_FACILITY != 1 ) + { + #error configUSE_TRACE_FACILITY must also be set to 1 in FreeRTOSConfig.h to use vTaskGetRunTimeStats(). + } + #endif + + /* + * PLEASE NOTE: + * + * This function is provided for convenience only, and is used by many + * of the demo applications. Do not consider it to be part of the + * scheduler. + * + * vTaskGetRunTimeStats() calls uxTaskGetSystemState(), then formats part + * of the uxTaskGetSystemState() output into a human readable table that + * displays the amount of time each task has spent in the Running state + * in both absolute and percentage terms. + * + * vTaskGetRunTimeStats() has a dependency on the sprintf() C library + * function that might bloat the code size, use a lot of stack, and + * provide different results on different platforms. An alternative, + * tiny, third party, and limited functionality implementation of + * sprintf() is provided in many of the FreeRTOS/Demo sub-directories in + * a file called printf-stdarg.c (note printf-stdarg.c does not provide + * a full snprintf() implementation!). + * + * It is recommended that production systems call uxTaskGetSystemState() + * directly to get access to raw stats data, rather than indirectly + * through a call to vTaskGetRunTimeStats(). + */ + + /* Make sure the write buffer does not contain a string. */ + *pcWriteBuffer = 0x00; + + /* Take a snapshot of the number of tasks in case it changes while this + function is executing. */ + uxArraySize = uxCurrentNumberOfTasks; + + /* Allocate an array index for each task. */ + pxTaskStatusArray = pvPortMalloc( uxCurrentNumberOfTasks * sizeof( TaskStatus_t ) ); + + if( pxTaskStatusArray != NULL ) + { + /* Generate the (binary) data. */ + uxArraySize = uxTaskGetSystemState( pxTaskStatusArray, uxArraySize, &ulTotalTime ); + + /* For percentage calculations. */ + ulTotalTime /= 100UL; + + /* Avoid divide by zero errors. */ + if( ulTotalTime > 0 ) + { + /* Create a human readable table from the binary data. */ + for( x = 0; x < uxArraySize; x++ ) + { + /* What percentage of the total run time has the task used? + This will always be rounded down to the nearest integer. + ulTotalRunTimeDiv100 has already been divided by 100. */ + ulStatsAsPercentage = pxTaskStatusArray[ x ].ulRunTimeCounter / ulTotalTime; + + /* Write the task name to the string, padding with + spaces so it can be printed in tabular form more + easily. */ + pcWriteBuffer = prvWriteNameToBuffer( pcWriteBuffer, pxTaskStatusArray[ x ].pcTaskName ); + + if( ulStatsAsPercentage > 0UL ) + { + #ifdef portLU_PRINTF_SPECIFIER_REQUIRED + { + sprintf( pcWriteBuffer, "\t%lu\t\t%lu%%\r\n", pxTaskStatusArray[ x ].ulRunTimeCounter, ulStatsAsPercentage ); + } + #else + { + /* sizeof( int ) == sizeof( long ) so a smaller + printf() library can be used. */ + sprintf( pcWriteBuffer, "\t%u\t\t%u%%\r\n", ( unsigned int ) pxTaskStatusArray[ x ].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( pcWriteBuffer, "\t%lu\t\t<1%%\r\n", pxTaskStatusArray[ x ].ulRunTimeCounter ); + } + #else + { + /* sizeof( int ) == sizeof( long ) so a smaller + printf() library can be used. */ + sprintf( pcWriteBuffer, "\t%u\t\t<1%%\r\n", ( unsigned int ) pxTaskStatusArray[ x ].ulRunTimeCounter ); + } + #endif + } + + pcWriteBuffer += strlen( pcWriteBuffer ); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + /* Free the array again. */ + vPortFree( pxTaskStatusArray ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + +#endif /* ( ( configGENERATE_RUN_TIME_STATS == 1 ) && ( configUSE_STATS_FORMATTING_FUNCTIONS > 0 ) ) */ +/*-----------------------------------------------------------*/ + +TickType_t uxTaskResetEventItemValue( void ) +{ +TickType_t uxReturn; + + uxReturn = listGET_LIST_ITEM_VALUE( &( pxCurrentTCB->xEventListItem ) ); + + /* Reset the event list item to its normal value - so it can be used with + queues and semaphores. */ + listSET_LIST_ITEM_VALUE( &( pxCurrentTCB->xEventListItem ), ( ( TickType_t ) configMAX_PRIORITIES - ( TickType_t ) pxCurrentTCB->uxPriority ) ); /*lint !e961 MISRA exception as the casts are only redundant for some ports. */ + + return uxReturn; +} +/*-----------------------------------------------------------*/ + +#if ( configUSE_MUTEXES == 1 ) + + void *pvTaskIncrementMutexHeldCount( void ) + { + /* If xSemaphoreCreateMutex() is called before any tasks have been created + then pxCurrentTCB will be NULL. */ + if( pxCurrentTCB != NULL ) + { + ( pxCurrentTCB->uxMutexesHeld )++; + } + + return pxCurrentTCB; + } + +#endif /* configUSE_MUTEXES */ +/*-----------------------------------------------------------*/ + +#if( configUSE_TASK_NOTIFICATIONS == 1 ) + + uint32_t ulTaskNotifyTake( BaseType_t xClearCountOnExit, TickType_t xTicksToWait ) + { + TickType_t xTimeToWake; + uint32_t ulReturn; + + taskENTER_CRITICAL(); + { + /* Only block if the notification count is not already non-zero. */ + if( pxCurrentTCB->ulNotifiedValue == 0UL ) + { + /* Mark this task as waiting for a notification. */ + pxCurrentTCB->eNotifyState = eWaitingNotification; + + if( xTicksToWait > ( TickType_t ) 0 ) + { + /* The task is going to block. First it must be removed + from the ready list. */ + if( uxListRemove( &( pxCurrentTCB->xGenericListItem ) ) == ( UBaseType_t ) 0 ) + { + /* The current task must be in a ready list, so there is + no need to check, and the port reset macro can be called + directly. */ + portRESET_READY_PRIORITY( pxCurrentTCB->uxPriority, uxTopReadyPriority ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + #if ( INCLUDE_vTaskSuspend == 1 ) + { + if( xTicksToWait == portMAX_DELAY ) + { + /* Add the task to the suspended task list instead + of a delayed task list to ensure the task is not + woken by a timing event. It will block + indefinitely. */ + vListInsertEnd( &xSuspendedTaskList, &( pxCurrentTCB->xGenericListItem ) ); + } + else + { + /* Calculate the time at which the task should be + woken if no notification events occur. This may + overflow but this doesn't matter, the scheduler will + handle it. */ + xTimeToWake = xTickCount + xTicksToWait; + prvAddCurrentTaskToDelayedList( xTimeToWake ); + } + } + #else /* INCLUDE_vTaskSuspend */ + { + /* Calculate the time at which the task should be + woken if the event does not occur. This may + overflow but this doesn't matter, the scheduler will + handle it. */ + xTimeToWake = xTickCount + xTicksToWait; + prvAddCurrentTaskToDelayedList( xTimeToWake ); + } + #endif /* INCLUDE_vTaskSuspend */ + + traceTASK_NOTIFY_TAKE_BLOCK(); + + /* All ports are written to allow a yield in a critical + section (some will yield immediately, others wait until the + critical section exits) - but it is not something that + application code should ever do. */ + portYIELD_WITHIN_API(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + taskEXIT_CRITICAL(); + + taskENTER_CRITICAL(); + { + traceTASK_NOTIFY_TAKE(); + ulReturn = pxCurrentTCB->ulNotifiedValue; + + if( ulReturn != 0UL ) + { + if( xClearCountOnExit != pdFALSE ) + { + pxCurrentTCB->ulNotifiedValue = 0UL; + } + else + { + ( pxCurrentTCB->ulNotifiedValue )--; + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + pxCurrentTCB->eNotifyState = eNotWaitingNotification; + } + taskEXIT_CRITICAL(); + + return ulReturn; + } + +#endif /* configUSE_TASK_NOTIFICATIONS */ +/*-----------------------------------------------------------*/ + +#if( configUSE_TASK_NOTIFICATIONS == 1 ) + + BaseType_t xTaskNotifyWait( uint32_t ulBitsToClearOnEntry, uint32_t ulBitsToClearOnExit, uint32_t *pulNotificationValue, TickType_t xTicksToWait ) + { + TickType_t xTimeToWake; + BaseType_t xReturn; + + taskENTER_CRITICAL(); + { + /* Only block if a notification is not already pending. */ + if( pxCurrentTCB->eNotifyState != eNotified ) + { + /* Clear bits in the task's notification value as bits may get + set by the notifying task or interrupt. This can be used to + clear the value to zero. */ + pxCurrentTCB->ulNotifiedValue &= ~ulBitsToClearOnEntry; + + /* Mark this task as waiting for a notification. */ + pxCurrentTCB->eNotifyState = eWaitingNotification; + + if( xTicksToWait > ( TickType_t ) 0 ) + { + /* The task is going to block. First it must be removed + from the ready list. */ + if( uxListRemove( &( pxCurrentTCB->xGenericListItem ) ) == ( UBaseType_t ) 0 ) + { + /* The current task must be in a ready list, so there is + no need to check, and the port reset macro can be called + directly. */ + portRESET_READY_PRIORITY( pxCurrentTCB->uxPriority, uxTopReadyPriority ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + #if ( INCLUDE_vTaskSuspend == 1 ) + { + if( xTicksToWait == portMAX_DELAY ) + { + /* Add the task to the suspended task list instead + of a delayed task list to ensure the task is not + woken by a timing event. It will block + indefinitely. */ + vListInsertEnd( &xSuspendedTaskList, &( pxCurrentTCB->xGenericListItem ) ); + } + else + { + /* Calculate the time at which the task should be + woken if no notification events occur. This may + overflow but this doesn't matter, the scheduler will + handle it. */ + xTimeToWake = xTickCount + xTicksToWait; + prvAddCurrentTaskToDelayedList( xTimeToWake ); + } + } + #else /* INCLUDE_vTaskSuspend */ + { + /* Calculate the time at which the task should be + woken if the event does not occur. This may + overflow but this doesn't matter, the scheduler will + handle it. */ + xTimeToWake = xTickCount + xTicksToWait; + prvAddCurrentTaskToDelayedList( xTimeToWake ); + } + #endif /* INCLUDE_vTaskSuspend */ + + traceTASK_NOTIFY_WAIT_BLOCK(); + + /* All ports are written to allow a yield in a critical + section (some will yield immediately, others wait until the + critical section exits) - but it is not something that + application code should ever do. */ + portYIELD_WITHIN_API(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + taskEXIT_CRITICAL(); + + taskENTER_CRITICAL(); + { + traceTASK_NOTIFY_WAIT(); + + if( pulNotificationValue != NULL ) + { + /* Output the current notification value, which may or may not + have changed. */ + *pulNotificationValue = pxCurrentTCB->ulNotifiedValue; + } + + /* If eNotifyValue is set then either the task never entered the + blocked state (because a notification was already pending) or the + task unblocked because of a notification. Otherwise the task + unblocked because of a timeout. */ + if( pxCurrentTCB->eNotifyState == eWaitingNotification ) + { + /* A notification was not received. */ + xReturn = pdFALSE; + } + else + { + /* A notification was already pending or a notification was + received while the task was waiting. */ + pxCurrentTCB->ulNotifiedValue &= ~ulBitsToClearOnExit; + xReturn = pdTRUE; + } + + pxCurrentTCB->eNotifyState = eNotWaitingNotification; + } + taskEXIT_CRITICAL(); + + return xReturn; + } + +#endif /* configUSE_TASK_NOTIFICATIONS */ +/*-----------------------------------------------------------*/ + +#if( configUSE_TASK_NOTIFICATIONS == 1 ) + + BaseType_t xTaskGenericNotify( TaskHandle_t xTaskToNotify, uint32_t ulValue, eNotifyAction eAction, uint32_t *pulPreviousNotificationValue ) + { + TCB_t * pxTCB; + eNotifyValue eOriginalNotifyState; + BaseType_t xReturn = pdPASS; + + configASSERT( xTaskToNotify ); + pxTCB = ( TCB_t * ) xTaskToNotify; + + taskENTER_CRITICAL(); + { + if( pulPreviousNotificationValue != NULL ) + { + *pulPreviousNotificationValue = pxTCB->ulNotifiedValue; + } + + eOriginalNotifyState = pxTCB->eNotifyState; + + pxTCB->eNotifyState = eNotified; + + switch( eAction ) + { + case eSetBits : + pxTCB->ulNotifiedValue |= ulValue; + break; + + case eIncrement : + ( pxTCB->ulNotifiedValue )++; + break; + + case eSetValueWithOverwrite : + pxTCB->ulNotifiedValue = ulValue; + break; + + case eSetValueWithoutOverwrite : + if( eOriginalNotifyState != eNotified ) + { + pxTCB->ulNotifiedValue = ulValue; + } + else + { + /* The value could not be written to the task. */ + xReturn = pdFAIL; + } + break; + + case eNoAction: + /* The task is being notified without its notify value being + updated. */ + break; + } + + traceTASK_NOTIFY(); + + /* If the task is in the blocked state specifically to wait for a + notification then unblock it now. */ + if( eOriginalNotifyState == eWaitingNotification ) + { + ( void ) uxListRemove( &( pxTCB->xGenericListItem ) ); + prvAddTaskToReadyList( pxTCB ); + + /* The task should not have been on an event list. */ + configASSERT( listLIST_ITEM_CONTAINER( &( pxTCB->xEventListItem ) ) == NULL ); + + #if( configUSE_TICKLESS_IDLE != 0 ) + { + /* If a task is blocked waiting for a notification then + xNextTaskUnblockTime might be set to the blocked task's time + out time. If the task is unblocked for a reason other than + a timeout xNextTaskUnblockTime is normally left unchanged, + because it will automatically get reset to a new value when + the tick count equals xNextTaskUnblockTime. However if + tickless idling is used it might be more important to enter + sleep mode at the earliest possible time - so reset + xNextTaskUnblockTime here to ensure it is updated at the + earliest possible time. */ + prvResetNextTaskUnblockTime(); + } + #endif + + if( pxTCB->uxPriority > pxCurrentTCB->uxPriority ) + { + /* The notified task has a priority above the currently + executing task so a yield is required. */ + taskYIELD_IF_USING_PREEMPTION(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + taskEXIT_CRITICAL(); + + return xReturn; + } + +#endif /* configUSE_TASK_NOTIFICATIONS */ +/*-----------------------------------------------------------*/ + +#if( configUSE_TASK_NOTIFICATIONS == 1 ) + + BaseType_t xTaskGenericNotifyFromISR( TaskHandle_t xTaskToNotify, uint32_t ulValue, eNotifyAction eAction, uint32_t *pulPreviousNotificationValue, BaseType_t *pxHigherPriorityTaskWoken ) + { + TCB_t * pxTCB; + eNotifyValue eOriginalNotifyState; + BaseType_t xReturn = pdPASS; + UBaseType_t uxSavedInterruptStatus; + + configASSERT( xTaskToNotify ); + + /* RTOS ports that support interrupt nesting have the concept of a + maximum system call (or maximum API call) interrupt priority. + Interrupts that are above the maximum system call priority are keep + permanently enabled, even when the RTOS kernel is in a critical section, + but cannot make any calls to FreeRTOS API functions. If configASSERT() + is defined in FreeRTOSConfig.h then + portASSERT_IF_INTERRUPT_PRIORITY_INVALID() will result in an assertion + failure if a FreeRTOS API function is called from an interrupt that has + been assigned a priority above the configured maximum system call + priority. Only FreeRTOS functions that end in FromISR can be called + from interrupts that have been assigned a priority at or (logically) + below the maximum system call interrupt priority. FreeRTOS maintains a + separate interrupt safe API to ensure interrupt entry is as fast and as + simple as possible. More information (albeit Cortex-M specific) is + provided on the following link: + http://www.freertos.org/RTOS-Cortex-M3-M4.html */ + portASSERT_IF_INTERRUPT_PRIORITY_INVALID(); + + pxTCB = ( TCB_t * ) xTaskToNotify; + + uxSavedInterruptStatus = portSET_INTERRUPT_MASK_FROM_ISR(); + { + if( pulPreviousNotificationValue != NULL ) + { + *pulPreviousNotificationValue = pxTCB->ulNotifiedValue; + } + + eOriginalNotifyState = pxTCB->eNotifyState; + pxTCB->eNotifyState = eNotified; + + switch( eAction ) + { + case eSetBits : + pxTCB->ulNotifiedValue |= ulValue; + break; + + case eIncrement : + ( pxTCB->ulNotifiedValue )++; + break; + + case eSetValueWithOverwrite : + pxTCB->ulNotifiedValue = ulValue; + break; + + case eSetValueWithoutOverwrite : + if( eOriginalNotifyState != eNotified ) + { + pxTCB->ulNotifiedValue = ulValue; + } + else + { + /* The value could not be written to the task. */ + xReturn = pdFAIL; + } + break; + + case eNoAction : + /* The task is being notified without its notify value being + updated. */ + break; + } + + traceTASK_NOTIFY_FROM_ISR(); + + /* If the task is in the blocked state specifically to wait for a + notification then unblock it now. */ + if( eOriginalNotifyState == eWaitingNotification ) + { + /* The task should not have been on an event list. */ + configASSERT( listLIST_ITEM_CONTAINER( &( pxTCB->xEventListItem ) ) == NULL ); + + if( uxSchedulerSuspended == ( UBaseType_t ) pdFALSE ) + { + ( void ) uxListRemove( &( pxTCB->xGenericListItem ) ); + prvAddTaskToReadyList( pxTCB ); + } + else + { + /* The delayed and ready lists cannot be accessed, so hold + this task pending until the scheduler is resumed. */ + vListInsertEnd( &( xPendingReadyList ), &( pxTCB->xEventListItem ) ); + } + + if( pxTCB->uxPriority > pxCurrentTCB->uxPriority ) + { + /* The notified task has a priority above the currently + executing task so a yield is required. */ + if( pxHigherPriorityTaskWoken != NULL ) + { + *pxHigherPriorityTaskWoken = pdTRUE; + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + } + portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedInterruptStatus ); + + return xReturn; + } + +#endif /* configUSE_TASK_NOTIFICATIONS */ +/*-----------------------------------------------------------*/ + +#if( configUSE_TASK_NOTIFICATIONS == 1 ) + + void vTaskNotifyGiveFromISR( TaskHandle_t xTaskToNotify, BaseType_t *pxHigherPriorityTaskWoken ) + { + TCB_t * pxTCB; + eNotifyValue eOriginalNotifyState; + UBaseType_t uxSavedInterruptStatus; + + configASSERT( xTaskToNotify ); + + /* RTOS ports that support interrupt nesting have the concept of a + maximum system call (or maximum API call) interrupt priority. + Interrupts that are above the maximum system call priority are keep + permanently enabled, even when the RTOS kernel is in a critical section, + but cannot make any calls to FreeRTOS API functions. If configASSERT() + is defined in FreeRTOSConfig.h then + portASSERT_IF_INTERRUPT_PRIORITY_INVALID() will result in an assertion + failure if a FreeRTOS API function is called from an interrupt that has + been assigned a priority above the configured maximum system call + priority. Only FreeRTOS functions that end in FromISR can be called + from interrupts that have been assigned a priority at or (logically) + below the maximum system call interrupt priority. FreeRTOS maintains a + separate interrupt safe API to ensure interrupt entry is as fast and as + simple as possible. More information (albeit Cortex-M specific) is + provided on the following link: + http://www.freertos.org/RTOS-Cortex-M3-M4.html */ + portASSERT_IF_INTERRUPT_PRIORITY_INVALID(); + + pxTCB = ( TCB_t * ) xTaskToNotify; + + uxSavedInterruptStatus = portSET_INTERRUPT_MASK_FROM_ISR(); + { + eOriginalNotifyState = pxTCB->eNotifyState; + pxTCB->eNotifyState = eNotified; + + /* 'Giving' is equivalent to incrementing a count in a counting + semaphore. */ + ( pxTCB->ulNotifiedValue )++; + + traceTASK_NOTIFY_GIVE_FROM_ISR(); + + /* If the task is in the blocked state specifically to wait for a + notification then unblock it now. */ + if( eOriginalNotifyState == eWaitingNotification ) + { + /* The task should not have been on an event list. */ + configASSERT( listLIST_ITEM_CONTAINER( &( pxTCB->xEventListItem ) ) == NULL ); + + if( uxSchedulerSuspended == ( UBaseType_t ) pdFALSE ) + { + ( void ) uxListRemove( &( pxTCB->xGenericListItem ) ); + prvAddTaskToReadyList( pxTCB ); + } + else + { + /* The delayed and ready lists cannot be accessed, so hold + this task pending until the scheduler is resumed. */ + vListInsertEnd( &( xPendingReadyList ), &( pxTCB->xEventListItem ) ); + } + + if( pxTCB->uxPriority > pxCurrentTCB->uxPriority ) + { + /* The notified task has a priority above the currently + executing task so a yield is required. */ + if( pxHigherPriorityTaskWoken != NULL ) + { + *pxHigherPriorityTaskWoken = pdTRUE; + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + } + portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedInterruptStatus ); + } + +#endif /* configUSE_TASK_NOTIFICATIONS */ + +/*-----------------------------------------------------------*/ + +#if( configUSE_TASK_NOTIFICATIONS == 1 ) + + BaseType_t xTaskNotifyStateClear( TaskHandle_t xTask ) + { + TCB_t *pxTCB; + BaseType_t xReturn; + + pxTCB = ( TCB_t * ) xTask; + + /* If null is passed in here then it is the calling task that is having + its notification state cleared. */ + pxTCB = prvGetTCBFromHandle( pxTCB ); + + taskENTER_CRITICAL(); + { + if( pxTCB->eNotifyState == eNotified ) + { + pxTCB->eNotifyState = eNotWaitingNotification; + xReturn = pdPASS; + } + else + { + xReturn = pdFAIL; + } + } + taskEXIT_CRITICAL(); + + return xReturn; + } + +#endif /* configUSE_TASK_NOTIFICATIONS */ + +#ifdef FREERTOS_MODULE_TEST + #include "tasks_test_access_functions.h" +#endif diff --git a/lib/FreeRTOS/timers.c b/lib/FreeRTOS/timers.c index ddfdb70470..c7ab9023f0 100644 --- a/lib/FreeRTOS/timers.c +++ b/lib/FreeRTOS/timers.c @@ -1,77 +1,75 @@ /* - FreeRTOS V7.4.0 - Copyright (C) 2013 Real Time Engineers Ltd. - - FEATURES AND PORTS ARE ADDED TO FREERTOS ALL THE TIME. PLEASE VISIT - http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. - - *************************************************************************** - * * - * 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! * - * * - *************************************************************************** + FreeRTOS V8.2.3 - Copyright (C) 2015 Real Time Engineers Ltd. + All rights reserved + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. This file is part of the FreeRTOS distribution. FreeRTOS is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License (version 2) as published by the - Free Software Foundation AND MODIFIED BY the FreeRTOS exception. + 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. + *************************************************************************** + >>! 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 itcan be - viewed here: http://www.freertos.org/a00114.html and also obtained by - writing to Real Time Engineers Ltd., contact details for whom are available - on the FreeRTOS WEB site. - - 1 tab == 4 spaces! + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html *************************************************************************** * * - * Having a problem? Start by reading the FAQ "My application does * - * not run, what could be wrong?" * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * * * - * http://www.FreeRTOS.org/FAQHelp.html * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * * * *************************************************************************** + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? - http://www.FreeRTOS.org - Documentation, books, training, latest versions, - license and Real Time Engineers Ltd. contact details. + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, - including FreeRTOS+Trace - an indispensable productivity tool, and our new - fully thread aware and reentrant UDP/IP stack. - - http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High - Integrity Systems, who sell the code with commercial support, - indemnification and middleware, under the OpenRTOS brand. - - http://www.SafeRTOS.com - High Integrity Systems also provide a safety - engineered and independently SIL3 certified version for use in safety and + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and mission critical applications that require provable dependability. + + 1 tab == 4 spaces! */ +/* Standard includes. */ +#include + /* 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. */ @@ -82,7 +80,16 @@ task.h is included from an application file. */ #include "queue.h" #include "timers.h" -#undef MPU_WRAPPERS_INCLUDED_FROM_API_FILE +#if ( INCLUDE_xTimerPendFunctionCall == 1 ) && ( configUSE_TIMERS == 0 ) + #error configUSE_TIMERS must be set to 1 to make the xTimerPendFunctionCall() function available. +#endif + +/* Lint e961 and e750 are suppressed as a MISRA exception justified because the +MPU ports require MPU_WRAPPERS_INCLUDED_FROM_API_FILE to be defined for the +header files above, but not in this file, in order to generate the correct +privileged Vs unprivileged linkage and placement. */ +#undef MPU_WRAPPERS_INCLUDED_FROM_API_FILE /*lint !e961 !e750. */ + /* 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 @@ -91,46 +98,84 @@ configUSE_TIMERS is set to 1 in FreeRTOSConfig.h. */ #if ( configUSE_TIMERS == 1 ) /* Misc definitions. */ -#define tmrNO_DELAY ( portTickType ) 0U +#define tmrNO_DELAY ( TickType_t ) 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. */ + const char *pcTimerName; /*<< Text name. This is not used by the kernel, it is included simply to make debugging easier. */ /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ + ListItem_t xTimerListItem; /*<< Standard linked list item as used by all kernel features for event management. */ + TickType_t xTimerPeriodInTicks;/*<< How quickly and often the timer expires. */ + UBaseType_t 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. */ + TimerCallbackFunction_t pxCallbackFunction; /*<< The function that will be called when the timer expires. */ + #if( configUSE_TRACE_FACILITY == 1 ) + UBaseType_t uxTimerNumber; /*<< An ID assigned by trace tools such as FreeRTOS+Trace */ + #endif } xTIMER; -/* The definition of messages that can be sent and received on the timer -queue. */ +/* The old xTIMER name is maintained above then typedefed to the new Timer_t +name below to enable the use of older kernel aware debuggers. */ +typedef xTIMER Timer_t; + +/* The definition of messages that can be sent and received on the timer queue. +Two types of message can be queued - messages that manipulate a software timer, +and messages that request the execution of a non-timer related callback. The +two message types are defined in two separate structures, xTimerParametersType +and xCallbackParametersType respectively. */ +typedef struct tmrTimerParameters +{ + TickType_t xMessageValue; /*<< An optional value used by a subset of commands, for example, when changing the period of a timer. */ + Timer_t * pxTimer; /*<< The timer to which the command will be applied. */ +} TimerParameter_t; + + +typedef struct tmrCallbackParameters +{ + PendedFunction_t pxCallbackFunction; /* << The callback function to execute. */ + void *pvParameter1; /* << The value that will be used as the callback functions first parameter. */ + uint32_t ulParameter2; /* << The value that will be used as the callback functions second parameter. */ +} CallbackParameters_t; + +/* The structure that contains the two message types, along with an identifier +that is used to determine which message type is valid. */ 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; + BaseType_t xMessageID; /*<< The command being sent to the timer service task. */ + union + { + TimerParameter_t xTimerParameters; + + /* Don't include xCallbackParameters if it is not going to be used as + it makes the structure (and therefore the timer queue) larger. */ + #if ( INCLUDE_xTimerPendFunctionCall == 1 ) + CallbackParameters_t xCallbackParameters; + #endif /* INCLUDE_xTimerPendFunctionCall */ + } u; +} DaemonTaskMessage_t; +/*lint -e956 A manual analysis and inspection has been used to determine which +static variables must be declared volatile. */ /* 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; +timer service task is allowed to access these lists. */ +PRIVILEGED_DATA static List_t xActiveTimerList1; +PRIVILEGED_DATA static List_t xActiveTimerList2; +PRIVILEGED_DATA static List_t *pxCurrentTimerList; +PRIVILEGED_DATA static List_t *pxOverflowTimerList; /* A queue that is used to send commands to the timer service task. */ -PRIVILEGED_DATA static xQueueHandle xTimerQueue = NULL; +PRIVILEGED_DATA static QueueHandle_t xTimerQueue = NULL; #if ( INCLUDE_xTimerGetTimerDaemonTaskHandle == 1 ) - PRIVILEGED_DATA static xTaskHandle xTimerTaskHandle = NULL; + PRIVILEGED_DATA static TaskHandle_t xTimerTaskHandle = NULL; #endif +/*lint +e956 */ + /*-----------------------------------------------------------*/ /* @@ -150,31 +195,31 @@ 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; +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; +static BaseType_t prvInsertTimerInActiveList( Timer_t * const pxTimer, const TickType_t xNextExpiryTime, const TickType_t xTimeNow, const TickType_t 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; +static void prvProcessExpiredTimer( const TickType_t xNextExpireTime, const TickType_t 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; +static void prvSwitchTimerLists( void ) 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; +static TickType_t prvSampleTimeNow( BaseType_t * const pxTimerListsWereSwitched ) PRIVILEGED_FUNCTION; /* * If the timer list contains any active timers then return the expire time of @@ -182,19 +227,19 @@ static portTickType prvSampleTimeNow( portBASE_TYPE *pxTimerListsWereSwitched ) * timer list does not contain any timers then return 0 and set *pxListWasEmpty * to pdTRUE. */ -static portTickType prvGetNextExpireTime( portBASE_TYPE *pxListWasEmpty ) PRIVILEGED_FUNCTION; +static TickType_t prvGetNextExpireTime( BaseType_t * const 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; +static void prvProcessTimerOrBlockTask( const TickType_t xNextExpireTime, BaseType_t xListWasEmpty ) PRIVILEGED_FUNCTION; /*-----------------------------------------------------------*/ -portBASE_TYPE xTimerCreateTimerTask( void ) +BaseType_t xTimerCreateTimerTask( void ) { -portBASE_TYPE xReturn = pdFAIL; +BaseType_t 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 @@ -208,34 +253,37 @@ portBASE_TYPE xReturn = pdFAIL; { /* Create the timer task, storing its handle in xTimerTaskHandle so it can be returned by the xTimerGetTimerDaemonTaskHandle() function. */ - xReturn = xTaskCreate( prvTimerTask, ( const signed char * ) "Tmr Svc", ( unsigned short ) configTIMER_TASK_STACK_DEPTH, NULL, ( ( unsigned portBASE_TYPE ) configTIMER_TASK_PRIORITY ) | portPRIVILEGE_BIT, &xTimerTaskHandle ); + xReturn = xTaskCreate( prvTimerTask, "Tmr Svc", ( uint16_t ) configTIMER_TASK_STACK_DEPTH, NULL, ( ( UBaseType_t ) configTIMER_TASK_PRIORITY ) | portPRIVILEGE_BIT, &xTimerTaskHandle ); } #else { /* Create the timer task without storing its handle. */ - xReturn = xTaskCreate( prvTimerTask, ( const signed char * ) "Tmr Svc", ( unsigned short ) configTIMER_TASK_STACK_DEPTH, NULL, ( ( unsigned portBASE_TYPE ) configTIMER_TASK_PRIORITY ) | portPRIVILEGE_BIT, NULL); + xReturn = xTaskCreate( prvTimerTask, "Tmr Svc", ( uint16_t ) configTIMER_TASK_STACK_DEPTH, NULL, ( ( UBaseType_t ) configTIMER_TASK_PRIORITY ) | portPRIVILEGE_BIT, NULL); } #endif } + else + { + mtCOVERAGE_TEST_MARKER(); + } configASSERT( xReturn ); return xReturn; } /*-----------------------------------------------------------*/ -xTimerHandle xTimerCreate( const signed char * const pcTimerName, portTickType xTimerPeriodInTicks, unsigned portBASE_TYPE uxAutoReload, void *pvTimerID, tmrTIMER_CALLBACK pxCallbackFunction ) +TimerHandle_t xTimerCreate( const char * const pcTimerName, const TickType_t xTimerPeriodInTicks, const UBaseType_t uxAutoReload, void * const pvTimerID, TimerCallbackFunction_t pxCallbackFunction ) /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ { -xTIMER *pxNewTimer; +Timer_t *pxNewTimer; /* Allocate the timer structure. */ - if( xTimerPeriodInTicks == ( portTickType ) 0U ) + if( xTimerPeriodInTicks == ( TickType_t ) 0U ) { pxNewTimer = NULL; - configASSERT( ( xTimerPeriodInTicks > 0 ) ); } else { - pxNewTimer = ( xTIMER * ) pvPortMalloc( sizeof( xTIMER ) ); + pxNewTimer = ( Timer_t * ) pvPortMalloc( sizeof( Timer_t ) ); if( pxNewTimer != NULL ) { /* Ensure the infrastructure used by the timer service task has been @@ -258,14 +306,19 @@ xTIMER *pxNewTimer; } } - return ( xTimerHandle ) pxNewTimer; + /* 0 is not a valid value for xTimerPeriodInTicks. */ + configASSERT( ( xTimerPeriodInTicks > 0 ) ); + + return ( TimerHandle_t ) pxNewTimer; } /*-----------------------------------------------------------*/ -portBASE_TYPE xTimerGenericCommand( xTimerHandle xTimer, portBASE_TYPE xCommandID, portTickType xOptionalValue, signed portBASE_TYPE *pxHigherPriorityTaskWoken, portTickType xBlockTime ) +BaseType_t xTimerGenericCommand( TimerHandle_t xTimer, const BaseType_t xCommandID, const TickType_t xOptionalValue, BaseType_t * const pxHigherPriorityTaskWoken, const TickType_t xTicksToWait ) { -portBASE_TYPE xReturn = pdFAIL; -xTIMER_MESSAGE xMessage; +BaseType_t xReturn = pdFAIL; +DaemonTaskMessage_t xMessage; + + configASSERT( xTimer ); /* Send a message to the timer service task to perform a particular action on a particular timer definition. */ @@ -273,14 +326,14 @@ xTIMER_MESSAGE xMessage; { /* Send a command to the timer service task to start the xTimer timer. */ xMessage.xMessageID = xCommandID; - xMessage.xMessageValue = xOptionalValue; - xMessage.pxTimer = ( xTIMER * ) xTimer; + xMessage.u.xTimerParameters.xMessageValue = xOptionalValue; + xMessage.u.xTimerParameters.pxTimer = ( Timer_t * ) xTimer; - if( pxHigherPriorityTaskWoken == NULL ) + if( xCommandID < tmrFIRST_FROM_ISR_COMMAND ) { if( xTaskGetSchedulerState() == taskSCHEDULER_RUNNING ) { - xReturn = xQueueSendToBack( xTimerQueue, &xMessage, xBlockTime ); + xReturn = xQueueSendToBack( xTimerQueue, &xMessage, xTicksToWait ); } else { @@ -294,6 +347,10 @@ xTIMER_MESSAGE xMessage; traceTIMER_COMMAND_SEND( xTimer, xCommandID, xOptionalValue, xReturn ); } + else + { + mtCOVERAGE_TEST_MARKER(); + } return xReturn; } @@ -301,7 +358,7 @@ xTIMER_MESSAGE xMessage; #if ( INCLUDE_xTimerGetTimerDaemonTaskHandle == 1 ) - xTaskHandle xTimerGetTimerDaemonTaskHandle( void ) + TaskHandle_t xTimerGetTimerDaemonTaskHandle( void ) { /* If xTimerGetTimerDaemonTaskHandle() is called before the scheduler has been started, then xTimerTaskHandle will be NULL. */ @@ -312,46 +369,59 @@ xTIMER_MESSAGE xMessage; #endif /*-----------------------------------------------------------*/ -static void prvProcessExpiredTimer( portTickType xNextExpireTime, portTickType xTimeNow ) +const char * pcTimerGetTimerName( TimerHandle_t xTimer ) +{ +Timer_t *pxTimer = ( Timer_t * ) xTimer; + + configASSERT( xTimer ); + return pxTimer->pcTimerName; +} +/*-----------------------------------------------------------*/ + +static void prvProcessExpiredTimer( const TickType_t xNextExpireTime, const TickType_t xTimeNow ) { -xTIMER *pxTimer; -portBASE_TYPE xResult; +BaseType_t xResult; +Timer_t * const pxTimer = ( Timer_t * ) listGET_OWNER_OF_HEAD_ENTRY( pxCurrentTimerList ); /* 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 ); - uxListRemove( &( pxTimer->xTimerListItem ) ); + ( void ) uxListRemove( &( 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 ) + if( pxTimer->uxAutoReload == ( UBaseType_t ) 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. */ + /* The 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. */ 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 ); + xResult = xTimerGenericCommand( pxTimer, tmrCOMMAND_START_DONT_TRACE, xNextExpireTime, NULL, tmrNO_DELAY ); configASSERT( xResult ); ( void ) xResult; } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); } /* Call the timer callback. */ - pxTimer->pxCallbackFunction( ( xTimerHandle ) pxTimer ); + pxTimer->pxCallbackFunction( ( TimerHandle_t ) pxTimer ); } /*-----------------------------------------------------------*/ static void prvTimerTask( void *pvParameters ) { -portTickType xNextExpireTime; -portBASE_TYPE xListWasEmpty; +TickType_t xNextExpireTime; +BaseType_t xListWasEmpty; /* Just to avoid compiler warnings. */ ( void ) pvParameters; @@ -372,10 +442,10 @@ portBASE_TYPE xListWasEmpty; } /*-----------------------------------------------------------*/ -static void prvProcessTimerOrBlockTask( portTickType xNextExpireTime, portBASE_TYPE xListWasEmpty ) +static void prvProcessTimerOrBlockTask( const TickType_t xNextExpireTime, BaseType_t xListWasEmpty ) { -portTickType xTimeNow; -portBASE_TYPE xTimerListsWereSwitched; +TickType_t xTimeNow; +BaseType_t xTimerListsWereSwitched; vTaskSuspendAll(); { @@ -383,14 +453,14 @@ portBASE_TYPE xTimerListsWereSwitched; 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. */ + prvSampleTimeNow() function. */ xTimeNow = prvSampleTimeNow( &xTimerListsWereSwitched ); if( xTimerListsWereSwitched == pdFALSE ) { /* The tick count has not overflowed, has the timer expired? */ if( ( xListWasEmpty == pdFALSE ) && ( xNextExpireTime <= xTimeNow ) ) { - xTaskResumeAll(); + ( void ) xTaskResumeAll(); prvProcessExpiredTimer( xNextExpireTime, xTimeNow ); } else @@ -401,29 +471,40 @@ portBASE_TYPE xTimerListsWereSwitched; 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( xListWasEmpty != pdFALSE ) + { + /* The current timer list is empty - is the overflow list + also empty? */ + xListWasEmpty = listLIST_IS_EMPTY( pxOverflowTimerList ); + } + + vQueueWaitForMessageRestricted( xTimerQueue, ( xNextExpireTime - xTimeNow ), xListWasEmpty ); 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. */ + /* 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 + { + mtCOVERAGE_TEST_MARKER(); + } } } else { - xTaskResumeAll(); + ( void ) xTaskResumeAll(); } } } /*-----------------------------------------------------------*/ -static portTickType prvGetNextExpireTime( portBASE_TYPE *pxListWasEmpty ) +static TickType_t prvGetNextExpireTime( BaseType_t * const pxListWasEmpty ) { -portTickType xNextExpireTime; +TickType_t 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 @@ -440,23 +521,23 @@ portTickType xNextExpireTime; else { /* Ensure the task unblocks when the tick count rolls over. */ - xNextExpireTime = ( portTickType ) 0U; + xNextExpireTime = ( TickType_t ) 0U; } return xNextExpireTime; } /*-----------------------------------------------------------*/ -static portTickType prvSampleTimeNow( portBASE_TYPE *pxTimerListsWereSwitched ) +static TickType_t prvSampleTimeNow( BaseType_t * const pxTimerListsWereSwitched ) { -portTickType xTimeNow; -PRIVILEGED_DATA static portTickType xLastTime = ( portTickType ) 0U; +TickType_t xTimeNow; +PRIVILEGED_DATA static TickType_t xLastTime = ( TickType_t ) 0U; /*lint !e956 Variable is only accessible to one task. */ xTimeNow = xTaskGetTickCount(); if( xTimeNow < xLastTime ) { - prvSwitchTimerLists( xLastTime ); + prvSwitchTimerLists(); *pxTimerListsWereSwitched = pdTRUE; } else @@ -470,9 +551,9 @@ PRIVILEGED_DATA static portTickType xLastTime = ( portTickType ) 0U; } /*-----------------------------------------------------------*/ -static portBASE_TYPE prvInsertTimerInActiveList( xTIMER *pxTimer, portTickType xNextExpiryTime, portTickType xTimeNow, portTickType xCommandTime ) +static BaseType_t prvInsertTimerInActiveList( Timer_t * const pxTimer, const TickType_t xNextExpiryTime, const TickType_t xTimeNow, const TickType_t xCommandTime ) { -portBASE_TYPE xProcessTimerNow = pdFALSE; +BaseType_t xProcessTimerNow = pdFALSE; listSET_LIST_ITEM_VALUE( &( pxTimer->xTimerListItem ), xNextExpiryTime ); listSET_LIST_ITEM_OWNER( &( pxTimer->xTimerListItem ), pxTimer ); @@ -481,7 +562,7 @@ portBASE_TYPE xProcessTimerNow = pdFALSE; { /* 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 ) + if( ( xTimeNow - xCommandTime ) >= pxTimer->xTimerPeriodInTicks ) { /* The time between a command being issued and the command being processed actually exceeds the timers period. */ @@ -513,84 +594,136 @@ portBASE_TYPE xProcessTimerNow = pdFALSE; static void prvProcessReceivedCommands( void ) { -xTIMER_MESSAGE xMessage; -xTIMER *pxTimer; -portBASE_TYPE xTimerListsWereSwitched, xResult; -portTickType xTimeNow; +DaemonTaskMessage_t xMessage; +Timer_t *pxTimer; +BaseType_t xTimerListsWereSwitched, xResult; +TickType_t xTimeNow; - while( xQueueReceive( xTimerQueue, &xMessage, tmrNO_DELAY ) != pdFAIL ) + while( xQueueReceive( xTimerQueue, &xMessage, tmrNO_DELAY ) != pdFAIL ) /*lint !e603 xMessage does not have to be initialised as it is passed out, not in, and it is not used unless xQueueReceive() returns pdTRUE. */ { - pxTimer = xMessage.pxTimer; - - if( listIS_CONTAINED_WITHIN( NULL, &( pxTimer->xTimerListItem ) ) == pdFALSE ) + #if ( INCLUDE_xTimerPendFunctionCall == 1 ) { - /* The timer is in a list, remove it. */ - uxListRemove( &( pxTimer->xTimerListItem ) ); - } + /* Negative commands are pended function calls rather than timer + commands. */ + if( xMessage.xMessageID < ( BaseType_t ) 0 ) + { + const CallbackParameters_t * const pxCallback = &( xMessage.u.xCallbackParameters ); - traceTIMER_COMMAND_RECEIVED( pxTimer, xMessage.xMessageID, xMessage.xMessageValue ); + /* The timer uses the xCallbackParameters member to request a + callback be executed. Check the callback is not NULL. */ + configASSERT( pxCallback ); - /* In this case the xTimerListsWereSwitched parameter is not used, but - it must be present in the function call. prvSampleTimeNow() must be - called after the message is received from xTimerQueue so there is no - possibility of a higher priority task adding a message to the message - queue with a time that is ahead of the timer daemon task (because it - pre-empted the timer daemon task after the xTimeNow value was set). */ - xTimeNow = prvSampleTimeNow( &xTimerListsWereSwitched ); + /* Call the function. */ + pxCallback->pxCallbackFunction( pxCallback->pvParameter1, pxCallback->ulParameter2 ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + #endif /* INCLUDE_xTimerPendFunctionCall */ - switch( xMessage.xMessageID ) + /* Commands that are positive are timer commands rather than pended + function calls. */ + if( xMessage.xMessageID >= ( BaseType_t ) 0 ) { - 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 ); + /* The messages uses the xTimerParameters member to work on a + software timer. */ + pxTimer = xMessage.u.xTimerParameters.pxTimer; + + if( listIS_CONTAINED_WITHIN( NULL, &( pxTimer->xTimerListItem ) ) == pdFALSE ) + { + /* The timer is in a list, remove it. */ + ( void ) uxListRemove( &( pxTimer->xTimerListItem ) ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + traceTIMER_COMMAND_RECEIVED( pxTimer, xMessage.xMessageID, xMessage.u.xTimerParameters.xMessageValue ); + + /* In this case the xTimerListsWereSwitched parameter is not used, but + it must be present in the function call. prvSampleTimeNow() must be + called after the message is received from xTimerQueue so there is no + possibility of a higher priority task adding a message to the message + queue with a time that is ahead of the timer daemon task (because it + pre-empted the timer daemon task after the xTimeNow value was set). */ + xTimeNow = prvSampleTimeNow( &xTimerListsWereSwitched ); - if( pxTimer->uxAutoReload == ( unsigned portBASE_TYPE ) pdTRUE ) + switch( xMessage.xMessageID ) + { + case tmrCOMMAND_START : + case tmrCOMMAND_START_FROM_ISR : + case tmrCOMMAND_RESET : + case tmrCOMMAND_RESET_FROM_ISR : + case tmrCOMMAND_START_DONT_TRACE : + /* Start or restart a timer. */ + if( prvInsertTimerInActiveList( pxTimer, xMessage.u.xTimerParameters.xMessageValue + pxTimer->xTimerPeriodInTicks, xTimeNow, xMessage.u.xTimerParameters.xMessageValue ) == pdTRUE ) { - xResult = xTimerGenericCommand( pxTimer, tmrCOMMAND_START, xMessage.xMessageValue + pxTimer->xTimerPeriodInTicks, NULL, tmrNO_DELAY ); - configASSERT( xResult ); - ( void ) xResult; + /* The timer expired before it was added to the active + timer list. Process it now. */ + pxTimer->pxCallbackFunction( ( TimerHandle_t ) pxTimer ); + traceTIMER_EXPIRED( pxTimer ); + + if( pxTimer->uxAutoReload == ( UBaseType_t ) pdTRUE ) + { + xResult = xTimerGenericCommand( pxTimer, tmrCOMMAND_START_DONT_TRACE, xMessage.u.xTimerParameters.xMessageValue + pxTimer->xTimerPeriodInTicks, NULL, tmrNO_DELAY ); + configASSERT( xResult ); + ( void ) xResult; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } } - } - 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; + else + { + mtCOVERAGE_TEST_MARKER(); + } + break; + + case tmrCOMMAND_STOP : + case tmrCOMMAND_STOP_FROM_ISR : + /* The timer has already been removed from the active list. + There is nothing to do here. */ + break; + + case tmrCOMMAND_CHANGE_PERIOD : + case tmrCOMMAND_CHANGE_PERIOD_FROM_ISR : + pxTimer->xTimerPeriodInTicks = xMessage.u.xTimerParameters.xMessageValue; + configASSERT( ( pxTimer->xTimerPeriodInTicks > 0 ) ); + + /* The new period does not really have a reference, and can be + longer or shorter than the old one. The command time is + therefore set to the current time, and as the period cannot be + zero the next expiry time can only be in the future, meaning + (unlike for the xTimerStart() case above) there is no fail case + that needs to be handled here. */ + ( void ) 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 ) +static void prvSwitchTimerLists( void ) { -portTickType xNextExpireTime, xReloadTime; -xList *pxTemp; -xTIMER *pxTimer; -portBASE_TYPE xResult; - - /* Remove compiler warnings if configASSERT() is not defined. */ - ( void ) xLastTime; +TickType_t xNextExpireTime, xReloadTime; +List_t *pxTemp; +Timer_t *pxTimer; +BaseType_t xResult; /* The tick count has overflowed. The timer lists must be switched. If there are any timers still referenced from the current timer list @@ -601,15 +734,16 @@ portBASE_TYPE xResult; xNextExpireTime = listGET_ITEM_VALUE_OF_HEAD_ENTRY( pxCurrentTimerList ); /* Remove the timer from the list. */ - pxTimer = ( xTIMER * ) listGET_OWNER_OF_HEAD_ENTRY( pxCurrentTimerList ); - uxListRemove( &( pxTimer->xTimerListItem ) ); + pxTimer = ( Timer_t * ) listGET_OWNER_OF_HEAD_ENTRY( pxCurrentTimerList ); + ( void ) uxListRemove( &( pxTimer->xTimerListItem ) ); + traceTIMER_EXPIRED( pxTimer ); /* 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 ); + pxTimer->pxCallbackFunction( ( TimerHandle_t ) pxTimer ); - if( pxTimer->uxAutoReload == ( unsigned portBASE_TYPE ) pdTRUE ) + if( pxTimer->uxAutoReload == ( UBaseType_t ) 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 @@ -626,11 +760,15 @@ portBASE_TYPE xResult; } else { - xResult = xTimerGenericCommand( pxTimer, tmrCOMMAND_START, xNextExpireTime, NULL, tmrNO_DELAY ); + xResult = xTimerGenericCommand( pxTimer, tmrCOMMAND_START_DONT_TRACE, xNextExpireTime, NULL, tmrNO_DELAY ); configASSERT( xResult ); ( void ) xResult; } } + else + { + mtCOVERAGE_TEST_MARKER(); + } } pxTemp = pxCurrentTimerList; @@ -652,17 +790,37 @@ static void prvCheckForValidListAndQueue( void ) vListInitialise( &xActiveTimerList2 ); pxCurrentTimerList = &xActiveTimerList1; pxOverflowTimerList = &xActiveTimerList2; - xTimerQueue = xQueueCreate( ( unsigned portBASE_TYPE ) configTIMER_QUEUE_LENGTH, sizeof( xTIMER_MESSAGE ) ); + xTimerQueue = xQueueCreate( ( UBaseType_t ) configTIMER_QUEUE_LENGTH, sizeof( DaemonTaskMessage_t ) ); + configASSERT( xTimerQueue ); + + #if ( configQUEUE_REGISTRY_SIZE > 0 ) + { + if( xTimerQueue != NULL ) + { + vQueueAddToRegistry( xTimerQueue, "TmrQ" ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + #endif /* configQUEUE_REGISTRY_SIZE */ + } + else + { + mtCOVERAGE_TEST_MARKER(); } } taskEXIT_CRITICAL(); } /*-----------------------------------------------------------*/ -portBASE_TYPE xTimerIsTimerActive( xTimerHandle xTimer ) +BaseType_t xTimerIsTimerActive( TimerHandle_t xTimer ) { -portBASE_TYPE xTimerIsInActiveList; -xTIMER *pxTimer = ( xTIMER * ) xTimer; +BaseType_t xTimerIsInActiveList; +Timer_t *pxTimer = ( Timer_t * ) xTimer; + + configASSERT( xTimer ); /* Is the timer in the list of active timers? */ taskENTER_CRITICAL(); @@ -670,22 +828,98 @@ xTIMER *pxTimer = ( xTIMER * ) xTimer; /* 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 ) ) ); + xTimerIsInActiveList = ( BaseType_t ) !( listIS_CONTAINED_WITHIN( NULL, &( pxTimer->xTimerListItem ) ) ); } taskEXIT_CRITICAL(); return xTimerIsInActiveList; +} /*lint !e818 Can't be pointer to const due to the typedef. */ +/*-----------------------------------------------------------*/ + +void *pvTimerGetTimerID( const TimerHandle_t xTimer ) +{ +Timer_t * const pxTimer = ( Timer_t * ) xTimer; +void *pvReturn; + + configASSERT( xTimer ); + + taskENTER_CRITICAL(); + { + pvReturn = pxTimer->pvTimerID; + } + taskEXIT_CRITICAL(); + + return pvReturn; } /*-----------------------------------------------------------*/ -void *pvTimerGetTimerID( xTimerHandle xTimer ) +void vTimerSetTimerID( TimerHandle_t xTimer, void *pvNewID ) { -xTIMER *pxTimer = ( xTIMER * ) xTimer; +Timer_t * const pxTimer = ( Timer_t * ) xTimer; - return pxTimer->pvTimerID; + configASSERT( xTimer ); + + taskENTER_CRITICAL(); + { + pxTimer->pvTimerID = pvNewID; + } + taskEXIT_CRITICAL(); } /*-----------------------------------------------------------*/ +#if( INCLUDE_xTimerPendFunctionCall == 1 ) + + BaseType_t xTimerPendFunctionCallFromISR( PendedFunction_t xFunctionToPend, void *pvParameter1, uint32_t ulParameter2, BaseType_t *pxHigherPriorityTaskWoken ) + { + DaemonTaskMessage_t xMessage; + BaseType_t xReturn; + + /* Complete the message with the function parameters and post it to the + daemon task. */ + xMessage.xMessageID = tmrCOMMAND_EXECUTE_CALLBACK_FROM_ISR; + xMessage.u.xCallbackParameters.pxCallbackFunction = xFunctionToPend; + xMessage.u.xCallbackParameters.pvParameter1 = pvParameter1; + xMessage.u.xCallbackParameters.ulParameter2 = ulParameter2; + + xReturn = xQueueSendFromISR( xTimerQueue, &xMessage, pxHigherPriorityTaskWoken ); + + tracePEND_FUNC_CALL_FROM_ISR( xFunctionToPend, pvParameter1, ulParameter2, xReturn ); + + return xReturn; + } + +#endif /* INCLUDE_xTimerPendFunctionCall */ +/*-----------------------------------------------------------*/ + +#if( INCLUDE_xTimerPendFunctionCall == 1 ) + + BaseType_t xTimerPendFunctionCall( PendedFunction_t xFunctionToPend, void *pvParameter1, uint32_t ulParameter2, TickType_t xTicksToWait ) + { + DaemonTaskMessage_t xMessage; + BaseType_t xReturn; + + /* This function can only be called after a timer has been created or + after the scheduler has been started because, until then, the timer + queue does not exist. */ + configASSERT( xTimerQueue ); + + /* Complete the message with the function parameters and post it to the + daemon task. */ + xMessage.xMessageID = tmrCOMMAND_EXECUTE_CALLBACK; + xMessage.u.xCallbackParameters.pxCallbackFunction = xFunctionToPend; + xMessage.u.xCallbackParameters.pvParameter1 = pvParameter1; + xMessage.u.xCallbackParameters.ulParameter2 = ulParameter2; + + xReturn = xQueueSendToBack( xTimerQueue, &xMessage, xTicksToWait ); + + tracePEND_FUNC_CALL( xFunctionToPend, pvParameter1, ulParameter2, xReturn ); + + return xReturn; + } + +#endif /* INCLUDE_xTimerPendFunctionCall */ +/*-----------------------------------------------------------*/ + /* 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. */ diff --git a/lib/STM32_CPAL_Driver/src/cpal_usercallback_template.c b/lib/STM32_CPAL_Driver/src/cpal_usercallback_template.c index 36ce78d757..63a012e429 100644 --- a/lib/STM32_CPAL_Driver/src/cpal_usercallback_template.c +++ b/lib/STM32_CPAL_Driver/src/cpal_usercallback_template.c @@ -50,11 +50,11 @@ * @param pDevInitStruct . * @retval None. */ -uint32_t CPAL_TIMEOUT_UserCallback(CPAL_InitTypeDef* pDevInitStruct) +/*uint32_t CPAL_TIMEOUT_UserCallback(CPAL_InitTypeDef* pDevInitStruct) { return CPAL_PASS; -} +}*/ /*=========== Transfer UserCallback ===========*/ diff --git a/module.json b/module.json new file mode 100644 index 0000000000..07cb754067 --- /dev/null +++ b/module.json @@ -0,0 +1,28 @@ +{ + "version": "1.0", + "environmentReq": [ + "arm-none-eabi" + ], + "artifacts": { + "file": [ + { + "source": "*.bin", + "insertTag": true, + "destination": "currDir" + }, + { + "source": "*.dfu", + "insertTag": true, + "destination": "currDir" + } + ] + }, + "targets": { + "cf1": [ + "PLATFORM=CF1" + ], + "cf2": [ + "PLATFORM=CF2" + ] + } +} diff --git a/modules/interface/crtp.h b/modules/interface/crtp.h index 663996b31d..4cf42daee4 100644 --- a/modules/interface/crtp.h +++ b/modules/interface/crtp.h @@ -153,8 +153,6 @@ int crtpGetFreeTxQueuePackets(void); */ int crtpReceivePacketBlock(CRTPPort taskId, CRTPPacket *p); -void crtpPacketReveived(CRTPPacket *p); - /** * Function pointer structure to be filled by the CRTP link to permits CRTP to * use manu link diff --git a/modules/interface/neopixelring.h b/modules/interface/neopixelring.h deleted file mode 100644 index d83a5608f8..0000000000 --- a/modules/interface/neopixelring.h +++ /dev/null @@ -1,11 +0,0 @@ -#ifndef __NEOPIXELRING_H__ -#define __NEOPIXELRING_H__ - -#include -#include - -typedef void (*NeopixelRingEffect)(uint8_t buffer[][3], bool reset); - -void neopixelringInit(void); - -#endif //__NEOPIXELRING_H__ diff --git a/modules/interface/pid.h b/modules/interface/pid.h index 9e82fc5461..aebdd20d7f 100644 --- a/modules/interface/pid.h +++ b/modules/interface/pid.h @@ -1,6 +1,6 @@ /** - * || ____ _ __ - * +------+ / __ )(_) /_______________ _____ ___ + * || ____ _ __ + * +------+ / __ )(_) /_______________ _____ ___ * | 0xBC | / __ / / __/ ___/ ___/ __ `/_ / / _ \ * +------+ / /_/ / / /_/ /__/ / / /_/ / / /_/ __/ * || || /_____/_/\__/\___/_/ \__,_/ /___/\___/ @@ -54,9 +54,9 @@ #define PID_PITCH_KD 0.0 #define PID_PITCH_INTEGRATION_LIMIT 20.0 -#define PID_YAW_KP 0.0 -#define PID_YAW_KI 0.0 -#define PID_YAW_KD 0.0 +#define PID_YAW_KP 10.0 +#define PID_YAW_KI 1.0 +#define PID_YAW_KD 0.35 #define PID_YAW_INTEGRATION_LIMIT 360.0 diff --git a/modules/interface/queuemonitor.h b/modules/interface/queuemonitor.h new file mode 100644 index 0000000000..5018e53d8c --- /dev/null +++ b/modules/interface/queuemonitor.h @@ -0,0 +1,46 @@ +/** + * || ____ _ __ + * +------+ / __ )(_) /_______________ _____ ___ + * | 0xBC | / __ / / __/ ___/ ___/ __ `/_ / / _ \ + * +------+ / /_/ / / /_/ /__/ / / /_/ / / /_/ __/ + * || || /_____/_/\__/\___/_/ \__,_/ /___/\___/ + * + * Crazyflie control firmware + * + * Copyright (C) 2012 BitCraze AB + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, in version 3. + * + * This program 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 + * along with this program. If not, see . + * + * log.h - Dynamic log system + */ + +#ifndef __QUEUE_MONITOR_H__ +#define __QUEUE_MONITOR_H__ + + +#include "FreeRTOS.h" + +#ifdef DEBUG_QUEUE_MONITOR + #include "queue.h" + + void queueMonitorInit(); + #define DEBUG_QUEUE_MONITOR_REGISTER(queue) qmRegisterQueue(queue, __FILE__, #queue) + + void qm_traceQUEUE_SEND(void* xQueue); + void qm_traceQUEUE_SEND_FAILED(void* xQueue); + void qmRegisterQueue(xQueueHandle* xQueue, char* fileName, char* queueName); +#else + #define DEBUG_QUEUE_MONITOR_REGISTER(queue) +#endif // DEBUG_QUEUE_MONITOR + +#endif // __QUEUE_MONITOR_H__ \ No newline at end of file diff --git a/modules/interface/sound.h b/modules/interface/sound.h new file mode 100644 index 0000000000..ba8c4cd364 --- /dev/null +++ b/modules/interface/sound.h @@ -0,0 +1,62 @@ +/** + * || ____ _ __ + * +------+ / __ )(_) /_______________ _____ ___ + * | 0xBC | / __ / / __/ ___/ ___/ __ `/_ / / _ \ + * +------+ / /_/ / / /_/ /__/ / / /_/ / / /_/ __/ + * || || /_____/_/\__/\___/_/ \__,_/ /___/\___/ + * + * Crazyflie control firmware + * + * Copyright (C) 2015 Bitcraze AB + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, in version 3. + * + * This program 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 + * along with this program. If not, see . + * + * sound.h - Module used to play melodies and system sounds though a buzzer + */ + +#ifndef __SOUND_H__ +#define __SOUND_H__ + +#include +#include + +#define SND_OFF 0 +#define SND_USB_DISC 1 +#define SND_USB_CONN 2 +#define SND_BAT_FULL 3 +#define SND_BAT_LOW 4 +#define SND_STARTUP 5 +#define SND_CALIB 6 + +/** + * Initialize sound sub-system. + */ +void soundInit(void); + +/** + * Test the sound sub-system. + */ +bool soundTest(void); + +/** + * Set the effect that should be played by the sound sub-system. + */ +void soundSetEffect(uint32_t effect); + +/** + * Manufally set a frequency that should be played by the sound syb-system. + */ +void soundSetFreq(uint32_t freq); + +#endif /* __SOUND_H__ */ + diff --git a/modules/src/console.c b/modules/src/console.c index 97d99ce515..dd097ee6e7 100644 --- a/modules/src/console.c +++ b/modules/src/console.c @@ -28,7 +28,6 @@ /*FreeRtos includes*/ #include "FreeRTOS.h" -#include "task.h" #include "semphr.h" #include "crtp.h" diff --git a/modules/src/controller.c b/modules/src/controller.c index b01bea56a4..91d236e4d4 100644 --- a/modules/src/controller.c +++ b/modules/src/controller.c @@ -26,7 +26,6 @@ #include #include "FreeRTOS.h" -#include "task.h" #include "controller.h" #include "pid.h" diff --git a/modules/src/crtp.c b/modules/src/crtp.c index 4565a1c31b..1743b1bbf2 100644 --- a/modules/src/crtp.c +++ b/modules/src/crtp.c @@ -38,6 +38,7 @@ #include "crtp.h" #include "info.h" #include "cfassert.h" +#include "queuemonitor.h" static bool isInit; @@ -51,7 +52,6 @@ static struct crtpLinkOperations nopLink = { static struct crtpLinkOperations *link = &nopLink; static xQueueHandle txQueue; -static xQueueHandle rxQueue; #define CRTP_NBR_OF_PORTS 16 #define CRTP_TX_QUEUE_SIZE 60 @@ -69,11 +69,11 @@ void crtpInit(void) return; txQueue = xQueueCreate(CRTP_TX_QUEUE_SIZE, sizeof(CRTPPacket)); - rxQueue = xQueueCreate(CRTP_RX_QUEUE_SIZE, sizeof(CRTPPacket)); + DEBUG_QUEUE_MONITOR_REGISTER(txQueue); - xTaskCreate(crtpTxTask, (const signed char * const)CRTP_TX_TASK_NAME, + xTaskCreate(crtpTxTask, CRTP_TX_TASK_NAME, CRTP_TX_TASK_STACKSIZE, NULL, CRTP_TX_TASK_PRI, NULL); - xTaskCreate(crtpRxTask, (const signed char * const)CRTP_RX_TASK_NAME, + xTaskCreate(crtpRxTask, CRTP_RX_TASK_NAME, CRTP_RX_TASK_STACKSIZE, NULL, CRTP_RX_TASK_PRI, NULL); /* Start Rx/Tx tasks */ @@ -92,6 +92,7 @@ void crtpInitTaskQueue(CRTPPort portId) ASSERT(queues[portId] == NULL); queues[portId] = xQueueCreate(1, sizeof(CRTPPacket)); + DEBUG_QUEUE_MONITOR_REGISTER(queues[portId]); } int crtpReceivePacket(CRTPPort portId, CRTPPacket *p) @@ -180,7 +181,7 @@ void crtpRegisterPortCB(int port, CrtpCallback cb) int crtpSendPacket(CRTPPacket *p) { ASSERT(p); - ASSERT(p->size <= CRTP_MAX_DATA_SIZE); + ASSERT(p->size <= CRTP_MAX_DATA_SIZE); return xQueueSend(txQueue, p, 0); } @@ -188,13 +189,13 @@ int crtpSendPacket(CRTPPacket *p) int crtpSendPacketBlock(CRTPPacket *p) { ASSERT(p); - ASSERT(p->size <= CRTP_MAX_DATA_SIZE); + ASSERT(p->size <= CRTP_MAX_DATA_SIZE); return xQueueSend(txQueue, p, portMAX_DELAY); } int crtpReset(void) -{ +{ xQueueReset(txQueue); if (link->reset) { link->reset(); @@ -210,14 +211,6 @@ bool crtpIsConnected(void) return true; } -void crtpPacketReveived(CRTPPacket *p) -{ - portBASE_TYPE xHigherPriorityTaskWoken; - - xHigherPriorityTaskWoken = pdFALSE; - xQueueSendFromISR(rxQueue, p, &xHigherPriorityTaskWoken); -} - void crtpSetLink(struct crtpLinkOperations * lk) { if(link) diff --git a/modules/src/crtpservice.c b/modules/src/crtpservice.c index 8ba6b0ef96..881d242f3d 100644 --- a/modules/src/crtpservice.c +++ b/modules/src/crtpservice.c @@ -29,7 +29,6 @@ /* FreeRtos includes */ #include "FreeRTOS.h" -#include "task.h" #include "crtp.h" #include "crtpservice.h" diff --git a/modules/src/info.c b/modules/src/info.c index a87524179e..e52b36a538 100644 --- a/modules/src/info.c +++ b/modules/src/info.c @@ -23,6 +23,7 @@ * * info.c - Receive information requests and send them back to the client */ + #include #include @@ -65,8 +66,8 @@ void infoTask(void *param); void infoInit() { - xTaskCreate(infoTask, (const signed char * const)"Info", - configMINIMAL_STACK_SIZE, NULL, /*priority*/2, NULL); + xTaskCreate(infoTask, INFO_TASK_NAME, + INFO_TASK_STACKSIZE, NULL, INFO_TASK_PRI, NULL); crtpInitTaskQueue(crtpInfo); } diff --git a/modules/src/log.c b/modules/src/log.c index 2a1676dbd0..22f8bb9a5f 100644 --- a/modules/src/log.c +++ b/modules/src/log.c @@ -1,6 +1,6 @@ /** - * || ____ _ __ - * +------+ / __ )(_) /_______________ _____ ___ + * || ____ _ __ + * +------+ / __ )(_) /_______________ _____ ___ * | 0xBC | / __ / / __/ ___/ ___/ __ `/_ / / _ \ * +------+ / /_/ / / /_/ /__/ / / /_/ / / /_/ __/ * || || /_____/_/\__/\___/_/ \__,_/ /___/\___/ @@ -144,32 +144,32 @@ static void logReset(); void logInit(void) { int i; - + if(isInit) return; logs = &_log_start; logsLen = &_log_stop - &_log_start; - logsCrc = crcSlow(logs, logsLen); - + logsCrc = crcSlow(logs, logsLen*sizeof(logs[0])); + // Big lock that protects the log datastructures logLock = xSemaphoreCreateMutex(); for (i=0; i= LOG_MAX_BLOCKS) { LOG_ERROR("Trying to append block id %d that doesn't exist.", id); return ENOENT; } - + block = &logBlocks[i]; - + for (i=0; iLOG_MAX_LEN) { LOG_ERROR("Trying to append a full block. Block id %d.\n", id); return E2BIG; } - + ops = opsMalloc(); - + if(!ops) { LOG_ERROR("No more ops memory free!\n"); return ENOMEM; } - + if (settings[i].id != 255) //TOC variable { varId = variableGetIndex(settings[i].id); - + if (varId<0) { LOG_ERROR("Trying to add variable Id %d that does not exists.", settings[i].id); return ENOENT; } - + ops->variable = logs[varId].address; ops->storageType = logs[varId].type; ops->logType = settings[i].logType&0x0F; - + LOG_DEBUG("Appended variable %d to block %d\n", settings[i].id, id); } else { //Memory variable //TODO: Check that the address is in ram @@ -387,14 +387,14 @@ static int logAppendBlock(int id, struct ops_setting * settings, int len) ops->storageType = (settings[i].logType>>4)&0x0F; ops->logType = settings[i].logType&0x0F; i += 2; - + LOG_DEBUG("Appended var addr 0x%x to block %d\n", (int)ops->variable, id); } blockAppendOps(block, ops); - + LOG_DEBUG(" Now lenght %d\n", blockCalcLength(block)); } - + return 0; } @@ -403,15 +403,15 @@ static int logDeleteBlock(int id) int i; struct log_ops * ops; struct log_ops * opsNext; - + for (i=0; i= LOG_MAX_BLOCKS) { LOG_ERROR("trying to delete block id %d that doesn't exist.", id); return ENOENT; } - + ops = logBlocks[i].ops; while (ops) { @@ -419,13 +419,13 @@ static int logDeleteBlock(int id) opsFree(ops); ops = opsNext; } - + if (logBlocks[i].timer != 0) { xTimerStop(logBlocks[i].timer, portMAX_DELAY); xTimerDelete(logBlocks[i].timer, portMAX_DELAY); logBlocks[i].timer = 0; } - + logBlocks[i].id = BLOCK_ID_FREE; return 0; } @@ -433,17 +433,17 @@ static int logDeleteBlock(int id) static int logStartBlock(int id, unsigned int period) { int i; - + for (i=0; i= LOG_MAX_BLOCKS) { LOG_ERROR("Trying to start block id %d that doesn't exist.", id); return ENOENT; } - + LOG_DEBUG("Starting block %d with period %dms\n", id, period); - + if (period>0) { xTimerChangePeriod(logBlocks[i].timer, M2T(period), 100); @@ -452,24 +452,24 @@ static int logStartBlock(int id, unsigned int period) // single-shoot run workerSchedule(logRunBlock, &logBlocks[i]); } - + return 0; } static int logStopBlock(int id) { int i; - + for (i=0; i= LOG_MAX_BLOCKS) { LOG_ERROR("Trying to stop block id %d that doesn't exist.\n", id); return ENOENT; } - + xTimerStop(logBlocks[i].timer, portMAX_DELAY); - + return 0; } @@ -497,11 +497,11 @@ void logRunBlock(void * arg) struct log_ops *ops = blk->ops; static CRTPPacket pk; unsigned int timestamp; - + xSemaphoreTake(logLock, portMAX_DELAY); timestamp = ((long long)xTaskGetTickCount())/portTICK_RATE_MS; - + pk.header = CRTP_HEADER(CRTP_PORT_LOG, LOG_CH); pk.size = 4; pk.data[0] = blk->id; @@ -542,14 +542,14 @@ void logRunBlock(void * arg) valuei = *(float *)&variable; break; } - + if (ops->logType == LOG_FLOAT || ops->logType == LOG_FP16) { if (ops->storageType == LOG_FLOAT) valuef = *(float *)&variable; else valuef = valuei; - + // Try to append the next item to the packet. If we run out of space, // drop this and subsequent items. if (ops->logType == LOG_FLOAT) @@ -566,10 +566,10 @@ void logRunBlock(void * arg) { if (!appendToPacket(&pk, &valuei, typeLength[ops->logType])) break; } - + ops = ops->next; } - + xSemaphoreGive(logLock); // Check if the connection is still up, oherwise disable @@ -577,7 +577,7 @@ void logRunBlock(void * arg) if (!crtpIsConnected()) { logReset(); - crtpReset(); + crtpReset(); } else { @@ -589,20 +589,20 @@ static int variableGetIndex(int id) { int i; int n=0; - + for (i=0; i=logsLen) return -1; - + return i; } @@ -628,7 +628,7 @@ static int blockCalcLength(struct log_block * block) { struct log_ops * ops; int len = 0; - + for (ops = block->ops; ops; ops = ops->next) len += typeLength[ops->logType]; @@ -638,15 +638,15 @@ static int blockCalcLength(struct log_block * block) void blockAppendOps(struct log_block * block, struct log_ops * ops) { struct log_ops * o; - + ops->next = NULL; - + if (block->ops == NULL) block->ops = ops; else { for (o = block->ops; o->next; o = o->next); - + o->next = ops; } } @@ -654,7 +654,7 @@ void blockAppendOps(struct log_block * block, struct log_ops * ops) static void logReset(void) { int i; - + if (isInit) { //Stop and delete all started log blocks @@ -665,11 +665,11 @@ static void logReset(void) logDeleteBlock(logBlocks[i].id); } } - + //Force free all the log block objects for(i=0; i -#include "FreeRTOS.h" -#include "task.h" #include "pid.h" -#include "led.h" -#include "motors.h" void pidInit(PidObject* pid, const float desired, const float kp, const float ki, const float kd, const float dt) diff --git a/modules/src/pidctrl.c b/modules/src/pidctrl.c index 8e2b27f9f3..65536dd795 100644 --- a/modules/src/pidctrl.c +++ b/modules/src/pidctrl.c @@ -40,8 +40,8 @@ void pidCrtlTask(void *param); void pidCtrlInit() { - xTaskCreate(pidCrtlTask, (const signed char * const)"PIDCrtl", - configMINIMAL_STACK_SIZE, NULL, /*priority*/2, NULL); + xTaskCreate(pidCrtlTask, PID_CTRL_TASK_NAME, + PID_CTRL_TASK_STACKSIZE, NULL, PID_CTRL_TASK_PRI, NULL); crtpInitTaskQueue(6); } diff --git a/modules/src/platformservice.c b/modules/src/platformservice.c index 7e24557903..43bf9d4294 100644 --- a/modules/src/platformservice.c +++ b/modules/src/platformservice.c @@ -28,7 +28,6 @@ /* FreeRtos includes */ #include "FreeRTOS.h" -#include "task.h" #include #include diff --git a/modules/src/queuemonitor.c b/modules/src/queuemonitor.c new file mode 100644 index 0000000000..961851cec4 --- /dev/null +++ b/modules/src/queuemonitor.c @@ -0,0 +1,173 @@ +/** + * || ____ _ __ + * +------+ / __ )(_) /_______________ _____ ___ + * | 0xBC | / __ / / __/ ___/ ___/ __ `/_ / / _ \ + * +------+ / /_/ / / /_/ /__/ / / /_/ / / /_/ __/ + * || || /_____/_/\__/\___/_/ \__,_/ /___/\___/ + * + * Crazyflie control firmware + * + * Copyright (C) 2011-2012 Bitcraze AB + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, in version 3. + * + * This program 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 + * along with this program. If not, see . + * + * + * queuemonitor.c - Monitoring functionality for queues + */ +#define DEBUG_MODULE "QM" + +#include "queuemonitor.h" + +#ifdef DEBUG_QUEUE_MONITOR + +#include +#include "timers.h" +#include "debug.h" +#include "cfassert.h" + +#define MAX_NR_OF_QUEUES 20 +#define TIMER_PERIOD M2T(10000) + +#define RESET_COUNTERS_AFTER_DISPLAY true +#define DISPLAY_ONLY_OVERFLOW_QUEUES true + +typedef struct +{ + char* fileName; + char* queueName; + int sendCount; + int maxWaiting; + int fullCount; +} Data; + +static Data data[MAX_NR_OF_QUEUES]; + +static xTimerHandle timer; +static unsigned char nrOfQueues = 1; // Unregistered queues will end up at 0 +static bool initialized = false; + +static void timerHandler(xTimerHandle timer); +static void debugPrint(); +static bool filter(Data* queueData); +static void debugPrintQueue(Data* queueData); +static Data* getQueueData(xQueueHandle* xQueue); +static int getMaxWaiting(xQueueHandle* xQueue, int prevPeak); +static void resetCounters(); + +unsigned char ucQueueGetQueueNumber( xQueueHandle xQueue ); + + +void queueMonitorInit() { + ASSERT(!initialized); + timer = xTimerCreate( "queueMonitorTimer", TIMER_PERIOD, + pdTRUE, NULL, timerHandler ); + xTimerStart(timer, 100); + + data[0].fileName = "Na"; + data[0].queueName = "Na"; + + initialized = true; +} + +void qm_traceQUEUE_SEND(void* xQueue) { + if(initialized) { + Data* queueData = getQueueData(xQueue); + + queueData->sendCount++; + queueData->maxWaiting = getMaxWaiting(xQueue, queueData->maxWaiting); + } +} + +void qm_traceQUEUE_SEND_FAILED(void* xQueue) { + if(initialized) { + Data* queueData = getQueueData(xQueue); + + queueData->fullCount++; + } +} + +void qmRegisterQueue(xQueueHandle* xQueue, char* fileName, char* queueName) { + ASSERT(initialized); + ASSERT(nrOfQueues < MAX_NR_OF_QUEUES); + Data* queueData = &data[nrOfQueues]; + + queueData->fileName = fileName; + queueData->queueName = queueName; + vQueueSetQueueNumber(xQueue, nrOfQueues); + + nrOfQueues++; +} + +static Data* getQueueData(xQueueHandle* xQueue) { + unsigned char number = uxQueueGetQueueNumber(xQueue); + ASSERT(number < MAX_NR_OF_QUEUES); + return &data[number]; +} + +static int getMaxWaiting(xQueueHandle* xQueue, int prevPeak) { + // We get here before the current item is added to the queue. + // Must add 1 to get the peak value. + unsigned portBASE_TYPE waiting = uxQueueMessagesWaitingFromISR(xQueue) + 1; + + if (waiting > prevPeak) { + return waiting; + } + return prevPeak; +} + +static void debugPrint() { + int i = 0; + for (i = 0; i < nrOfQueues; i++) { + Data* queueData = &data[i]; + if (filter(queueData)) { + debugPrintQueue(queueData); + } + } + + if (RESET_COUNTERS_AFTER_DISPLAY) { + resetCounters(); + } +} + +static bool filter(Data* queueData) { + bool doDisplay = false; + if (DISPLAY_ONLY_OVERFLOW_QUEUES) { + doDisplay = (queueData->fullCount != 0); + } else { + doDisplay = true; + } + return doDisplay; +} + +static void debugPrintQueue(Data* queueData) { + DEBUG_PRINT("%s:%s, sent: %i, peak: %i, full: %i\n", + queueData->fileName, queueData->queueName, queueData->sendCount, + queueData->maxWaiting, queueData->fullCount); +} + +static void resetCounters() { + int i = 0; + for (i = 0; i < nrOfQueues; i++) { + Data* queueData = &data[i]; + + queueData->sendCount = 0; + queueData->maxWaiting = 0; + queueData->fullCount = 0; + } +} + +static void timerHandler(xTimerHandle timer) { + debugPrint(); +} + +#endif // DEBUG_QUEUE_MONITOR diff --git a/modules/src/sensfusion6.c b/modules/src/sensfusion6.c index e0c0ac00aa..f1ae83eb7e 100644 --- a/modules/src/sensfusion6.c +++ b/modules/src/sensfusion6.c @@ -26,7 +26,6 @@ #include #include "sensfusion6.h" -#include "imu.h" #include "param.h" #define M_PI_F ((float) M_PI) diff --git a/modules/interface/exptest.h b/modules/src/sound_cf1.c similarity index 61% rename from modules/interface/exptest.h rename to modules/src/sound_cf1.c index bc2ffa16db..7dc93d23d1 100644 --- a/modules/interface/exptest.h +++ b/modules/src/sound_cf1.c @@ -1,34 +1,52 @@ -/* - * || ____ _ __ - * +------+ / __ )(_) /_______________ _____ ___ - * | 0xBC | / __ / / __/ ___/ ___/ __ `/_ / / _ \ - * +------+ / /_/ / / /_/ /__/ / / /_/ / / /_/ __/ - * || || /_____/_/\__/\___/_/ \__,_/ /___/\___/ - * - * Crazyflie control firmware - * - * Copyright (C) 2011-2012 Bitcraze AB - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, in version 3. - * - * This program 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 - * along with this program. If not, see . - * - * exptest.c - Testing of expansion port. - */ - -#ifndef EXPTEST_H_ -#define EXPTEST_H_ - -#include - -bool exptestRun(void); - -#endif +/** + * || ____ _ __ + * +------+ / __ )(_) /_______________ _____ ___ + * | 0xBC | / __ / / __/ ___/ ___/ __ `/_ / / _ \ + * +------+ / /_/ / / /_/ /__/ / / /_/ / / /_/ __/ + * || || /_____/_/\__/\___/_/ \__,_/ /___/\___/ + * + * Crazyflie control firmware + * + * Copyright (C) 2015 Bitcraze AB + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, in version 3. + * + * This program 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 + * along with this program. If not, see . + * + * sound_cf1.c - Empty module used on Crazyflie 2.0 to play melodies and + * system sounds + */ + +#include +#include + +static bool isInit=false; + +void soundInit(void) +{ + if (isInit) + return; + + isInit = true; +} + +bool soundTest(void) +{ + return isInit; +} + +void soundSetEffect(uint32_t effect) +{ +} + +void soundSetFreq(uint32_t freq) +{ +} diff --git a/modules/src/sound_cf2.c b/modules/src/sound_cf2.c new file mode 100644 index 0000000000..bff189bf72 --- /dev/null +++ b/modules/src/sound_cf2.c @@ -0,0 +1,353 @@ +/** + * || ____ _ __ + * +------+ / __ )(_) /_______________ _____ ___ + * | 0xBC | / __ / / __/ ___/ ___/ __ `/_ / / _ \ + * +------+ / /_/ / / /_/ /__/ / / /_/ / / /_/ __/ + * || || /_____/_/\__/\___/_/ \__,_/ /___/\___/ + * + * Crazyflie control firmware + * + * Copyright (C) 2015 Bitcraze AB + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, in version 3. + * + * This program 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 + * along with this program. If not, see . + * + * sound_cf2.c - Module used to play melodies and system sounds though a buzzer + */ + +#include + +/* FreeRtos includes */ +#include +#include +#include + +#include "FreeRTOS.h" +#include "timers.h" + +#include "config.h" +#include "param.h" +#include "log.h" +#include "sound.h" +#include "buzzer.h" + +/** + * Credit to http://tny.cz/e525c1b2 for supplying the tones + */ +#define C0 16 +#define Db0 17 +#define D0 18 +#define Eb0 19 +#define E0 20 +#define F0 21 +#define Gb0 23 +#define G0 24 +#define Ab0 25 +#define A0 27 +#define Bb0 29 +#define B0 30 +#define C1 32 +#define Db1 34 +#define D1 36 +#define Eb1 38 +#define E1 41 +#define F1 43 +#define Gb1 46 +#define G1 49 +#define Ab1 51 +#define A1 55 +#define Bb1 58 +#define B1 61 +#define C2 65 +#define Db2 69 +#define D2 73 +#define Eb2 77 +#define E2 82 +#define F2 87 +#define Gb2 92 +#define G2 98 +#define Ab2 103 +#define A2 110 +#define Bb2 116 +#define B2 123 +#define C3 130 +#define Db3 138 +#define D3 146 +#define Eb3 155 +#define E3 164 +#define F3 174 +#define Gb3 185 +#define G3 196 +#define Ab3 207 +#define A3 220 +#define Bb3 233 +#define B3 246 +#define C4 261 +#define Db4 277 +#define D4 293 +#define Eb4 311 +#define E4 329 +#define F4 349 +#define Gb4 369 +#define G4 392 +#define Ab4 415 +#define A4 440 +#define Bb4 466 +#define B4 493 +#define C5 523 +#define Db5 554 +#define D5 587 +#define Eb5 622 +#define E5 659 +#define F5 698 +#define Gb5 739 +#define G5 783 +#define Ab5 830 +#define A5 880 +#define Bb5 932 +#define B5 987 +#define C6 1046 +#define Db6 1108 +#define D6 1174 +#define Eb6 1244 +#define E6 1318 +#define F6 1396 +#define Gb6 1479 +#define G6 1567 +#define Ab6 1661 +#define A6 1760 +#define Bb6 1864 +#define B6 1975 +#define C7 2093 +#define Db7 2217 +#define D7 2349 +#define Eb7 2489 +#define E7 2637 +#define F7 2793 +#define Gb7 2959 +#define G7 3135 +#define Ab7 3322 +#define A7 3520 +#define Bb7 3729 +#define B7 3951 +#define C8 4186 +#define Db8 4434 +#define D8 4698 +#define Eb8 4978 +/* Duration of notes */ +#define W (60) +#define H (W * 2) +#define Q (W * 4) +#define E (W * 8) +#define S (W * 16) +#define ES (W*6) + +#define MAX_NOTE_LENGTH 80 + +static bool isInit=false; + +typedef const struct { + uint16_t tone; + uint16_t duration; +} Note; + +typedef const struct { + uint32_t bpm; + uint32_t delay; + Note notes[MAX_NOTE_LENGTH]; +} Melody; + +static uint32_t neffect = 0; +static uint32_t sys_effect = 0; +static uint32_t user_effect = 0; + +static Melody range_slow = {.bpm = 120, .delay = 1, .notes = {{C4, H}, {D4, H}, {E4, H}, {F4, H}, {G4, H}, {A4, H}, {B4, H}, {0xFF, 0}}}; +static Melody range_fast = {.bpm = 120, .delay = 1, .notes = {{C4, S}, {D4, S}, {E4, S}, {F4, S}, {G4, S}, {A4, S}, {B4, S}, {0xFF, 0}}}; +static Melody startup = {.bpm = 120, .delay = 1, .notes = {{C4, S}, {D4, S}, {E4, S}, {F4, S}, {0xFE, 0}}}; +static Melody calibrated = {.bpm = 120, .delay = 1, .notes = {{C4, S}, {D4, S}, {E4, S}, {F4, S}, {0xFE, 0}}}; +static Melody chg_done = {.bpm = 120, .delay = 1, .notes = {{D4, Q}, {A4, Q}, {0xFE, 0}}}; +static Melody lowbatt = {.bpm = 120, .delay = 1, .notes = {{D4, E}, {A4, E}, {D4, E}, {0xFF, 0}}}; +static Melody usb_disconnect = {.bpm = 120, .delay = 1, .notes = {{C4, E}, {0xFE, 0}}}; +static Melody usb_connect = {.bpm = 120, .delay = 1, .notes = {{A4, E}, {0xFE, 0}}}; +/* Imperial march from http://tny.cz/e525c1b2A */ +static Melody starwars = {.bpm = 120, .delay = 1, .notes = {{A3, Q}, {A3, Q}, {A3, Q},{F3, ES}, {C4, S}, + {A3, Q}, {F3, ES}, {C4, S}, {A3, H}, + {E4, Q}, {E4, Q}, {E4, Q}, {F4, ES}, {C4, S}, + {Ab3, Q}, {F3, ES}, {C4, S}, {A3, H}, + {A4, Q}, {A3, ES}, {A3, S}, {A4, Q}, {Ab4, ES}, {G4, S}, + {Gb4, S}, {E4, S}, {F4, E}, {0, E}, {Bb3, E}, {Eb4, Q}, {D4, ES}, {Db4, S}, + {C4, S}, {B3, S}, {C4, E}, {0, E}, {F3, E}, {Ab3, Q}, {F3, ES}, {A3, S}, + {C4, Q}, {A3, ES}, {C4, S}, {E4, H}, + {A4, Q}, {A3, ES}, {A3, S}, {A4, Q}, {Ab4, ES}, {G4, S}, + {Gb4, S}, {E4, S}, {F4, E}, {0, E}, {Bb3, E}, {Eb4, Q}, {D4, ES}, {Db4, S}, + {Gb4, S}, {E4, S}, {F4, E}, {0, E}, {Bb3, E}, {Eb4, Q}, {D4, ES}, {Db4, S}, + {C4,S}, {B3, S}, {C4, E}, {0, E}, {F3, E}, {Ab3, Q}, {F3, ES}, {C4, S}, + {A3, Q}, {F3, ES}, {C4, S}, {A3, H}, {0, H}, + {0xFF, 0}}}; + +typedef void (*BuzzerEffect)(uint32_t timer, uint32_t * mi, Melody * melody); + +static void off(uint32_t counter, uint32_t * mi, Melody * m) { + buzzerOff(); +} + +static uint32_t mcounter = 0; +static void melodyplayer(uint32_t counter, uint32_t * mi, Melody * m) { + if (m->notes[(*mi)].tone == 0xFE) { + // Turn off buzzer since we're at the end + (*mi) = 0; + if (sys_effect != 0) + sys_effect = 0; + else + user_effect = 0; + } else if (mcounter == 0) { + if (m->notes[(*mi)].tone == 0xFF) + { + // Loop the melody + (*mi) = 0; + } + // Play current note + buzzerOn(m->notes[(*mi)].tone); + mcounter = (m->bpm * 100) / m->notes[(*mi)].duration; + (*mi)++; + } + else if (mcounter == 1) + { + buzzerOff(); + } + mcounter--; +} + +static uint8_t static_ratio = 0; +static uint16_t static_freq = 4000; +static void bypass(uint32_t counter, uint32_t * mi, Melody * melody) +{ + buzzerOn(static_freq); +} + +static uint16_t siren_start = 2000; +static uint16_t siren_freq = 2000; +static uint16_t siren_stop = 4000; +static int16_t siren_step = 40; +static void siren(uint32_t counter, uint32_t * mi, Melody * melody) +{ + siren_freq += siren_step; + if (siren_freq > siren_stop) + { + siren_step *= -1; + siren_freq = siren_stop; + } + if (siren_freq < siren_start) + { + siren_step *= -1; + siren_freq = siren_start; + } + buzzerOn(siren_freq); +} + +static int pitchid; +static int rollid; +static int pitch; +static int roll; +static int tilt_freq; +static int tilt_ratio; +static void tilt(uint32_t counter, uint32_t * mi, Melody * melody) +{ + pitchid = logGetVarId("stabilizer", "pitch"); + rollid = logGetVarId("stabilizer", "roll"); + + pitch = logGetInt(pitchid); + roll = logGetInt(rollid); + tilt_freq = 0; + tilt_ratio = 127; + + if (abs(pitch) > 5) { + tilt_freq = 3000 - 50 * pitch; + } + + buzzerOn(tilt_freq); +} + +typedef struct { + BuzzerEffect call; + uint32_t mi; + Melody * melody; +} EffectCall; + +static EffectCall effects[] = { + [SND_OFF] = {.call = &off}, + [SND_USB_CONN] = {.call = &melodyplayer, .melody = &usb_connect}, + [SND_USB_DISC] = {.call = &melodyplayer, .melody = &usb_disconnect}, + [SND_BAT_FULL] = {.call = &melodyplayer, .melody = &chg_done}, + [SND_BAT_LOW] = {.call = &melodyplayer, .melody = &lowbatt}, + [SND_STARTUP] = {.call = &melodyplayer, .melody = &startup}, + [SND_CALIB] = {.call = &melodyplayer, .melody = &calibrated}, + {.call = &melodyplayer, .melody = &range_slow}, + {.call = &melodyplayer, .melody = &range_fast}, + {.call = &melodyplayer, .melody = &starwars}, + {.call = &bypass}, + {.call = &siren}, + {.call = &tilt} +}; + +static xTimerHandle timer; +static uint32_t counter = 0; + +static void soundTimer(xTimerHandle timer) +{ + int effect; + counter++; + + if (sys_effect != 0) { + effect = sys_effect; + } else { + effect = user_effect; + } + if (effects[effect].call != 0) + effects[effect].call(counter*10, &effects[effect].mi, + effects[effect].melody); +} + +void soundInit(void) +{ + if (isInit) + return; + + neffect = sizeof(effects)/sizeof(effects[0])-1; + + timer = xTimerCreate("SoundTimer", M2T(10), + pdTRUE, NULL, soundTimer); + xTimerStart(timer, 100); + + isInit = true; +} + +bool soundTest(void) +{ + return isInit; +} + +void soundSetEffect(uint32_t effect) +{ + sys_effect = effect; +} + +void soundSetFreq(uint32_t freq) { + +} + +PARAM_GROUP_START(sound) +PARAM_ADD(PARAM_UINT8, effect, &user_effect) +PARAM_ADD(PARAM_UINT32 | PARAM_RONLY, neffect, &neffect) +PARAM_ADD(PARAM_UINT16, freq, &static_freq) +PARAM_ADD(PARAM_UINT8, ratio, &static_ratio) +PARAM_GROUP_STOP(sound) diff --git a/modules/src/stabilizer.c b/modules/src/stabilizer.c index 1b166767b4..98744cf45a 100644 --- a/modules/src/stabilizer.c +++ b/modules/src/stabilizer.c @@ -39,9 +39,7 @@ #include "motors.h" #include "log.h" #include "pid.h" -#include "ledseq.h" #include "param.h" -#include "debug.h" #include "sitaw.h" #ifdef PLATFORM_CF1 #include "ms5611.h" @@ -49,6 +47,8 @@ #include "lps25h.h" #endif +#include "led.h" +#include "ledseq.h" #undef max #define max(a,b) ((a) > (b) ? (a) : (b)) @@ -86,6 +86,7 @@ static float pressure; // pressure from barometer in bar static float asl; // smoothed asl static float aslRaw; // raw asl static float aslLong; // long term asl +static float aslRef; // asl reference (ie. offset) // Altitude hold variables static PidObject altHoldPID; // Used for altitute hold mode. I gets reset when the bat status changes @@ -176,7 +177,7 @@ void stabilizerInit(void) pitchRateDesired = 0; yawRateDesired = 0; - xTaskCreate(stabilizerTask, (const signed char * const)STABILIZER_TASK_NAME, + xTaskCreate(stabilizerTask, STABILIZER_TASK_NAME, STABILIZER_TASK_STACKSIZE, NULL, STABILIZER_TASK_PRI, NULL); isInit = true; @@ -240,6 +241,7 @@ static void stabilizerTask(void* param) uint32_t attitudeCounter = 0; uint32_t altHoldCounter = 0; uint32_t lastWakeTime; + float yawRateAngle = 0; vTaskSetApplicationTaskTag(0, (void*)TASK_STABILIZER_ID_NBR); @@ -263,6 +265,17 @@ static void stabilizerTask(void* param) commanderGetRPY(&eulerRollDesired, &eulerPitchDesired, &eulerYawDesired); commanderGetRPYType(&rollType, &pitchType, &yawType); + // Rate-controled YAW is moving YAW angle setpoint + if (yawType == RATE) { + yawRateAngle -= eulerYawDesired/500.0; + while (yawRateAngle > 180.0) + yawRateAngle -= 360.0; + while (yawRateAngle < -180.0) + yawRateAngle += 360.0; + + eulerYawDesired = -yawRateAngle; + } + // 250HZ if (++attitudeCounter >= ATTITUDE_UPDATE_RATE_DIVIDER) { @@ -301,10 +314,6 @@ static void stabilizerTask(void* param) { pitchRateDesired = eulerPitchDesired; } - if (yawType == RATE) - { - yawRateDesired = -eulerYawDesired; - } // TODO: Investigate possibility to subtract gyro drift. controllerCorrectRatePID(gyro.x, -gyro.y, gyro.z, @@ -342,6 +351,9 @@ static void stabilizerTask(void* param) { distributePower(0, 0, 0, 0); controllerResetAllPID(); + + // Reset the calculated YAW angle for rate control + yawRateAngle = eulerYawActual; } } } @@ -409,6 +421,8 @@ static void stabilizerAltHoldUpdate(void) lps25hGetData(&pressure, &temperature, &aslRaw); #endif + aslRaw -= aslRef; + asl = asl * aslAlpha + aslRaw * (1 - aslAlpha); aslLong = aslLong * aslAlphaLong + aslRaw * (1 - aslAlphaLong); @@ -698,6 +712,7 @@ LOG_GROUP_STOP(autoTO) PARAM_GROUP_START(altHold) PARAM_ADD(PARAM_FLOAT, aslAlpha, &aslAlpha) PARAM_ADD(PARAM_FLOAT, aslAlphaLong, &aslAlphaLong) +PARAM_ADD(PARAM_FLOAT, aslRef, &aslRef) PARAM_ADD(PARAM_FLOAT, errDeadband, &errDeadband) PARAM_ADD(PARAM_FLOAT, altHoldChangeSens, &altHoldChange_SENS) PARAM_ADD(PARAM_FLOAT, altHoldErrMax, &altHoldErrMax) diff --git a/modules/src/system.c b/modules/src/system.c index 74428a8ae0..c75d8c83d5 100644 --- a/modules/src/system.c +++ b/modules/src/system.c @@ -1,6 +1,6 @@ /* - * || ____ _ __ - * +------+ / __ )(_) /_______________ _____ ___ + * || ____ _ __ + * +------+ / __ )(_) /_______________ _____ ___ * | 0xBC | / __ / / __/ ___/ ___/ __ `/_ / / _ \ * +------+ / /_/ / / /_/ /__/ / / /_/ / / /_/ __/ * || || /_____/_/\__/\___/_/ \__,_/ /___/\___/ @@ -51,13 +51,19 @@ #include "comm.h" #include "stabilizer.h" #include "commander.h" -#include "neopixelring.h" #include "console.h" #include "usb.h" -#include "expbrd.h" #include "mem.h" #include "proximity.h" #include "sonar.h" +#include "watchdog.h" +#include "queuemonitor.h" +#include "buzzer.h" +#include "sound.h" + +#ifdef PLATFORM_CF2 +#include "deck.h" +#endif /* Private variable */ static bool selftestPassed; @@ -73,7 +79,7 @@ static void systemTask(void *arg); /* Public functions */ void systemLaunch(void) { - xTaskCreate(systemTask, (const signed char * const)SYSTEM_TASK_NAME, + xTaskCreate(systemTask, SYSTEM_TASK_NAME, SYSTEM_TASK_STACKSIZE, NULL, SYSTEM_TASK_PRI, NULL); @@ -105,6 +111,7 @@ void systemInit(void) adcInit(); ledseqInit(); pmInit(); + buzzerInit(); #ifdef PROXIMITY_ENABLED proximityInit(); @@ -116,14 +123,14 @@ void systemInit(void) bool systemTest() { bool pass=isInit; - + #ifdef PLATFORM_CF1 pass &= adcTest(); #endif pass &= ledseqTest(); pass &= pmTest(); pass &= workerTest(); - + pass &= buzzerTest(); return pass; } @@ -132,10 +139,14 @@ bool systemTest() void systemTask(void *arg) { bool pass = true; - + ledInit(); ledSet(CHG_LED, 1); +#ifdef DEBUG_QUEUE_MONITOR + queueMonitorInit(); +#endif + uartInit(); #ifdef ENABLE_UART1 uart1Init(); @@ -163,14 +174,19 @@ void systemTask(void *arg) commanderInit(); stabilizerInit(); #ifdef PLATFORM_CF2 - expbrdInit(); + deckInit(); #endif + soundInit(); memInit(); #ifdef ACTIVATE_SONAR_SENSOR sonarInit(); #endif +#ifdef PROXIMITY_ENABLED + proximityInit(); +#endif + //Test the modules pass &= systemTest(); pass &= configblockTest(); @@ -178,15 +194,18 @@ void systemTask(void *arg) pass &= commanderTest(); pass &= stabilizerTest(); #ifdef PLATFORM_CF2 - pass &= expbrdTest(); -#endif + pass &= deckTest(); + #endif + pass &= soundTest(); pass &= memTest(); - + pass &= watchdogNormalStartTest(); + //Start the firmware if(pass) { selftestPassed = 1; systemStart(); + soundSetEffect(SND_STARTUP); ledseqRun(SYS_LED, seq_alive); ledseqRun(LINK_LED, seq_testPassed); } @@ -215,9 +234,9 @@ void systemTask(void *arg) } } DEBUG_PRINT("Free heap: %d bytes\n", xPortGetFreeHeapSize()); - + workerLoop(); - + //Should never reach this point! while(1) vTaskDelay(portMAX_DELAY); @@ -228,6 +247,9 @@ void systemTask(void *arg) void systemStart() { xSemaphoreGive(canStartMutex); +#ifndef DEBUG + watchdogInit(); +#endif } void systemWaitStart(void) @@ -253,14 +275,16 @@ bool systemCanFly(void) void vApplicationIdleHook( void ) { - extern size_t debugPrintTCBInfo(void); - static uint32_t timeToPrint = M2T(5000); + static uint32_t tickOfLatestWatchdogReset = M2T(0); + + portTickType tickCount = xTaskGetTickCount(); - if (xTaskGetTickCount() - timeToPrint > M2T(10000)) + if (tickCount - tickOfLatestWatchdogReset > M2T(WATCHDOG_RESET_PERIOD_MS)) { - timeToPrint = xTaskGetTickCount(); - debugPrintTCBInfo(); + tickOfLatestWatchdogReset = tickCount; + watchdogReset(); } + // Enter sleep mode. Does not work when debugging chip with SWD. // Currently saves about 20mA STM32F405 current consumption (~30%). #ifndef DEBUG diff --git a/modules/src/worker.c b/modules/src/worker.c index d1ab65c5f9..e707ec7da3 100644 --- a/modules/src/worker.c +++ b/modules/src/worker.c @@ -30,6 +30,7 @@ #include "FreeRTOS.h" #include "task.h" #include "queue.h" +#include "queuemonitor.h" #include "console.h" @@ -48,6 +49,7 @@ void workerInit() return; workerQueue = xQueueCreate(WORKER_QUEUE_LENGTH, sizeof(struct worker_work)); + DEBUG_QUEUE_MONITOR_REGISTER(workerQueue); } bool workerTest() diff --git a/platform/cf1/platform_cf1.c b/platform/cf1/platform_cf1.c index ab91070aeb..ab57570252 100644 --- a/platform/cf1/platform_cf1.c +++ b/platform/cf1/platform_cf1.c @@ -24,20 +24,9 @@ * TODO: Add description */ -/* Personal configs */ -#include "FreeRTOSConfig.h" - -/* FreeRtos includes */ -#include "FreeRTOS.h" -#include "task.h" - /* Project includes */ -#include "config.h" #include "nvic.h" -/* ST includes */ -#include "stm32fxxx.h" - // TODO: Implement! int platformInit(void) { diff --git a/platform/cf2/platform_cf2.c b/platform/cf2/platform_cf2.c index ab91070aeb..eeb037e4d4 100644 --- a/platform/cf2/platform_cf2.c +++ b/platform/cf2/platform_cf2.c @@ -25,19 +25,9 @@ */ /* Personal configs */ -#include "FreeRTOSConfig.h" - -/* FreeRtos includes */ -#include "FreeRTOS.h" -#include "task.h" - /* Project includes */ -#include "config.h" #include "nvic.h" -/* ST includes */ -#include "stm32fxxx.h" - // TODO: Implement! int platformInit(void) { diff --git a/scripts/clean_version.sh b/scripts/clean_version.sh deleted file mode 100644 index 294fbbe432..0000000000 --- a/scripts/clean_version.sh +++ /dev/null @@ -1,11 +0,0 @@ -#!/usr/bin/env bash - -FILE=utils/src/version.c - -#Patch version.c to delete the versions informations -sed -i "s/SLOCAL_REVISION=\".*\";\$/SLOCAL_REVISION=\"\";/" $FILE -sed -i "s/STAG=\".*\";\$/STAG=\"\";/" $FILE -sed -i "s/SREVISION=\".*\";\$/SREVISION=\"\";/" $FILE -sed -i "s/MODIFIED=.*;\$/MODIFIED=1;/" $FILE - -true diff --git a/scripts/print_revision.sh b/scripts/print_revision.sh deleted file mode 100755 index 800d8b1969..0000000000 --- a/scripts/print_revision.sh +++ /dev/null @@ -1,44 +0,0 @@ -#!/usr/bin/env bash - -MODIFIED=0 - -if test -d .git ; then - # git - ID=$(git describe --tags --abbrev=12 HEAD) - REV=${ID##*-} - REV=${REV:1} - LOCAL=${ID#*-*-} - TAG=${ID%-$LOCAL} - LOCAL=${LOCAL%-*} - git update-index -q --refresh - if ! test -z "$(git diff-index --name-only HEAD --)" ; then - MODIFIED=1 - fi -elif test -d .hg ; then - # mercury - ID=$(hg identify -nit) - - REV=$(echo -n $ID | cut -d' ' -f1) - LOCAL=$(echo -n $ID | cut -d' ' -f2) - TAG=$(echo -n $ID | cut -d' ' -f3) - - #LOCAL=$(hg identify -n) - #REV=$(hg identify -i) - #TAG=$(hg identify -t) - if echo -n $REV | grep +\$>/dev/null; then - MODIFIED=1 - fi -else - LOCAL="Tarball build" - REV=" Build from GIT tree for accurate versioning" - TAG=`pwd | grep -o "20[0-9][0-9]\\.[0-9][0-9]\?\(\\.[0-9][0-9]\?\)\?$"` - MODIFIED=1 -fi - -echo -n Build $LOCAL:$REV \($TAG\) - -if test $MODIFIED -eq 1 ; then - echo -e " \033[1;31mMODIFIED\033[m" -else - echo -e " \033[1;32mCLEAN\033[m" -fi diff --git a/scripts/update_version.sh b/scripts/update_version.sh deleted file mode 100644 index bc4627a320..0000000000 --- a/scripts/update_version.sh +++ /dev/null @@ -1,44 +0,0 @@ -#!/usr/bin/env bash - -FILE=utils/src/version.c - -MODIFIED=0 - -#Get the relevant informations -if test -d .git ; then - # git - ID=$(git describe --tags --abbrev=12 HEAD) - REV=${ID##*-} - REV=${REV:1} - LOCAL=${ID#*-*-} - TAG=${ID%-$LOCAL} - LOCAL=${LOCAL%-*} - git update-index -q --refresh - if ! test -z "$(git diff-index --name-only HEAD --)" ; then - MODIFIED=1 - fi -else - # mercury - ID=$(hg identify -nit) - - REV=$(echo -n $ID | cut -d' ' -f1) - LOCAL=$(echo -n $ID | cut -d' ' -f2) - TAG=$(echo -n $ID | cut -d' ' -f3) - - #LOCAL=$(hg identify -n) - #REV=$(hg identify -i) - #TAG=$(hg identify -t) - #BRANCH=$(hg identify -b) - - if echo -n $REV | grep +\$>/dev/null; then - MODIFIED=1 - fi -fi - -#Patch version.c -sed -i "s/SLOCAL_REVISION=\".*\";\$/SLOCAL_REVISION=\"$LOCAL\";/" $FILE -sed -i "s/STAG=\".*\";\$/STAG=\"$TAG\";/" $FILE -sed -i "s/SREVISION=\".*\";\$/SREVISION=\"$REV\";/" $FILE -sed -i "s/MODIFIED=.*;\$/MODIFIED=$MODIFIED;/" $FILE - -true diff --git a/scripts/versionTemplate.py b/scripts/versionTemplate.py deleted file mode 100644 index 60b2e71cbb..0000000000 --- a/scripts/versionTemplate.py +++ /dev/null @@ -1,100 +0,0 @@ -#!/usr/bin/env python - -import sys -import subprocess -import os -from os import path -import re - -version = { } - -header = """/* This file is automatically generated by {0}! - * Do not edit manually, any manual change will be overwritten. - */ -""" - -if len(sys.argv)<3: - print("Usage:") - print(" {0} ".format(sys.argv[0])) - sys.exit(1) - -#Get the build repos information -if os.path.isdir(".git"): - # git - revision = subprocess.check_output(["git", "rev-parse", "HEAD"]).strip() - - version['revision'] = revision[0:12] - version['irevision0'] = "0x" + revision[0:8] - version['irevision1'] = "0x" + revision[8:12] - - identify = subprocess.check_output(["git", "describe", "--abbrev=12", "--tags", "HEAD"]) - identify = identify.split('-') - - if len(identify) > 2: - version['local_revision'] = identify[len(identify)-2] - else: - version['local_revision'] = '0' - - version['tag'] = identify[0] - for x in range(1, len(identify)-2): - version['tag'] += '-' - version['tag'] += identify[x] - - version['tag'] = version['tag'].strip() - - if version['local_revision'] != '0': - version['tag'] = version['tag'] + '-' + version['local_revision'] - - branch = subprocess.check_output(["git", "rev-parse", "--abbrev-ref", "HEAD"]).strip() - version['branch'] = branch - - subprocess.call(["git", "update-index", "-q", "--refresh"]) - changes = subprocess.check_output(["git", "diff-index", "--name-only", "HEAD", "--"]).strip() - if len(changes): - version['modified'] = 'true' - else: - version['modified'] = 'false' -elif os.path.isdir(".hg"): - # Mercurial - identify = subprocess.check_output(["hg", "identify", "-nitb"]) - identify = identify.split() - version['revision'] = identify[0] - version['irevision0'] = "0x" + identify[0][0:8] - version['irevision1'] = "0x" + identify[0][8:12] - version['local_revision'] = identify[1] - version['branch'] = identify[2] - if len(identify)>3: - version['tag'] = identify[3] - else: - version['tag'] = "" - - try: - version['local_revision'].index('+') - version['modified'] = 'true' - except Exception: - version['modified'] = 'false' -else: - sourcefolder = path.basename(path.abspath(path.dirname(__file__) + '/..')) - match = re.match(".*(20[0-9][0-9]\\.[0-9][0-9]?(\\.[0-9][0-9]?)?)$", sourcefolder) - - version['revision'] = 'NA' - version['irevision0'] = "0x" + '0' - version['irevision1'] = "0x" + '0' - version['local_revision'] = 'NA' - version['branch'] = 'NA' - version['modified'] = 'true' - - if match is not None: - version['tag'] = match.group(1) - else: - version['tag'] = 'NA' - -#Apply information to the file template -infile = open(sys.argv[1], 'r') -outfile = open(sys.argv[2], 'w') - -outfile.write(header.format(sys.argv[0], sys.argv[1])) -outfile.write(infile.read().format(**version)) - -infile.close() -outfile.close() diff --git a/tools/build/build b/tools/build/build new file mode 100755 index 0000000000..83fb74cbfa --- /dev/null +++ b/tools/build/build @@ -0,0 +1,6 @@ +#!/usr/bin/env bash +set -e + +scriptDir=$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd ) + +make --directory=${scriptDir}/../.. "${@}" diff --git a/tools/build/clean b/tools/build/clean new file mode 100755 index 0000000000..5ea42efe06 --- /dev/null +++ b/tools/build/clean @@ -0,0 +1,6 @@ +#!/usr/bin/env bash +set -e + +scriptDir=$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd ) + +make --directory=${scriptDir}/../.. clean "${@}" diff --git a/scripts/InterruptsInEclipse b/tools/eclipse/InterruptsInEclipse similarity index 100% rename from scripts/InterruptsInEclipse rename to tools/eclipse/InterruptsInEclipse diff --git a/scripts/F103/jtagkey.cfg b/tools/make/F103/jtagkey.cfg similarity index 100% rename from scripts/F103/jtagkey.cfg rename to tools/make/F103/jtagkey.cfg diff --git a/scripts/F103/linker/COMMON.ld b/tools/make/F103/linker/COMMON.ld similarity index 100% rename from scripts/F103/linker/COMMON.ld rename to tools/make/F103/linker/COMMON.ld diff --git a/scripts/F103/linker/DEF.ld b/tools/make/F103/linker/DEF.ld similarity index 100% rename from scripts/F103/linker/DEF.ld rename to tools/make/F103/linker/DEF.ld diff --git a/scripts/F103/linker/DEF_CLOAD.ld b/tools/make/F103/linker/DEF_CLOAD.ld similarity index 100% rename from scripts/F103/linker/DEF_CLOAD.ld rename to tools/make/F103/linker/DEF_CLOAD.ld diff --git a/scripts/F405/linker/FLASH.ld b/tools/make/F103/linker/FLASH.ld similarity index 95% rename from scripts/F405/linker/FLASH.ld rename to tools/make/F103/linker/FLASH.ld index 37b7fcb46f..132e3f2ee1 100644 --- a/scripts/F405/linker/FLASH.ld +++ b/tools/make/F103/linker/FLASH.ld @@ -9,7 +9,7 @@ If you need to use your own script please configure your Ride7 project linker op You can take this one as example for wrting your custom linker script You can use, copy and distribute this file freely, but without any waranty.*/ -SEARCH_DIR("./scripts/F405/linker") +SEARCH_DIR("./tools/make/F103/linker") /* include the common STMxxx sub-script */ INCLUDE "COMMON.ld" diff --git a/scripts/F103/linker/FLASH_CLOAD.ld b/tools/make/F103/linker/FLASH_CLOAD.ld similarity index 95% rename from scripts/F103/linker/FLASH_CLOAD.ld rename to tools/make/F103/linker/FLASH_CLOAD.ld index 5a3272d1d3..4858440589 100644 --- a/scripts/F103/linker/FLASH_CLOAD.ld +++ b/tools/make/F103/linker/FLASH_CLOAD.ld @@ -9,7 +9,7 @@ If you need to use your own script please configure your Ride7 project linker op You can take this one as example for wrting your custom linker script You can use, copy and distribute this file freely, but without any waranty.*/ -SEARCH_DIR("./scripts/F103/linker") +SEARCH_DIR("./tools/make/F103/linker") /* include the common STMxxx sub-script */ INCLUDE "COMMON.ld" diff --git a/scripts/F103/linker/sections_FLASH.ld b/tools/make/F103/linker/sections_FLASH.ld similarity index 91% rename from scripts/F103/linker/sections_FLASH.ld rename to tools/make/F103/linker/sections_FLASH.ld index 60304236bc..577bb89d3d 100644 --- a/scripts/F103/linker/sections_FLASH.ld +++ b/tools/make/F103/linker/sections_FLASH.ld @@ -112,7 +112,7 @@ SECTIONS - /* This is the uninitialized data section */ + /* This is the uninitialized data section. This memory is zeroed at start up */ .bss : { . = ALIGN(4); @@ -127,9 +127,26 @@ SECTIONS /* This is used by the startup in order to initialize the .bss secion */ _ebss = . ; } >RAM - - PROVIDE ( end = _ebss ); - PROVIDE ( _end = _ebss ); + + + + /* This is uninitialized data that is NOT zeroed at start up. */ + .nzds : + { + . = ALIGN(4); + _snzds = .; + + *(.nzds) + *(.nzds.*) + *(COMMON) + + . = ALIGN(4); + _enzds = . ; + } >RAM + + + PROVIDE ( end = _enzds ); + PROVIDE ( _end = _enzds ); /* This is the user stack section This is just to check that there is enough RAM left for the User mode stack diff --git a/scripts/F103/st_obj.mk b/tools/make/F103/st_obj.mk similarity index 100% rename from scripts/F103/st_obj.mk rename to tools/make/F103/st_obj.mk diff --git a/scripts/F103/stm32f1x-rtos.cfg b/tools/make/F103/stm32f1x-rtos.cfg similarity index 100% rename from scripts/F103/stm32f1x-rtos.cfg rename to tools/make/F103/stm32f1x-rtos.cfg diff --git a/scripts/F103/stm32f1x.cfg b/tools/make/F103/stm32f1x.cfg similarity index 100% rename from scripts/F103/stm32f1x.cfg rename to tools/make/F103/stm32f1x.cfg diff --git a/scripts/F405/linker/COMMON.ld b/tools/make/F405/linker/COMMON.ld similarity index 100% rename from scripts/F405/linker/COMMON.ld rename to tools/make/F405/linker/COMMON.ld diff --git a/scripts/F405/linker/DEF.ld b/tools/make/F405/linker/DEF.ld similarity index 100% rename from scripts/F405/linker/DEF.ld rename to tools/make/F405/linker/DEF.ld diff --git a/scripts/F405/linker/DEF_CLOAD.ld b/tools/make/F405/linker/DEF_CLOAD.ld similarity index 100% rename from scripts/F405/linker/DEF_CLOAD.ld rename to tools/make/F405/linker/DEF_CLOAD.ld diff --git a/scripts/F103/linker/FLASH.ld b/tools/make/F405/linker/FLASH.ld similarity index 95% rename from scripts/F103/linker/FLASH.ld rename to tools/make/F405/linker/FLASH.ld index db78308bae..7dc8434be5 100644 --- a/scripts/F103/linker/FLASH.ld +++ b/tools/make/F405/linker/FLASH.ld @@ -9,7 +9,7 @@ If you need to use your own script please configure your Ride7 project linker op You can take this one as example for wrting your custom linker script You can use, copy and distribute this file freely, but without any waranty.*/ -SEARCH_DIR("./scripts/F103/linker") +SEARCH_DIR("./tools/make/F405/linker") /* include the common STMxxx sub-script */ INCLUDE "COMMON.ld" diff --git a/scripts/F405/linker/FLASH_CLOAD.ld b/tools/make/F405/linker/FLASH_CLOAD.ld similarity index 95% rename from scripts/F405/linker/FLASH_CLOAD.ld rename to tools/make/F405/linker/FLASH_CLOAD.ld index 2a52d4d7d2..2ecaaadd02 100644 --- a/scripts/F405/linker/FLASH_CLOAD.ld +++ b/tools/make/F405/linker/FLASH_CLOAD.ld @@ -9,7 +9,7 @@ If you need to use your own script please configure your Ride7 project linker op You can take this one as example for wrting your custom linker script You can use, copy and distribute this file freely, but without any waranty.*/ -SEARCH_DIR("./scripts/F405/linker") +SEARCH_DIR("./tools/make/F405/linker") /* include the common STMxxx sub-script */ INCLUDE "COMMON.ld" diff --git a/scripts/F405/linker/sections_FLASH.ld b/tools/make/F405/linker/sections_FLASH.ld similarity index 88% rename from scripts/F405/linker/sections_FLASH.ld rename to tools/make/F405/linker/sections_FLASH.ld index 60304236bc..f4a5ea4281 100644 --- a/scripts/F405/linker/sections_FLASH.ld +++ b/tools/make/F405/linker/sections_FLASH.ld @@ -18,7 +18,7 @@ SECTIONS KEEP(*(.isr_vector)) /* Startup code */ . = ALIGN(4); } >FLASH - + /* for some STRx devices, the beginning of the startup code is stored in the .flashtext section, which goes to FLASH */ .flashtext : { @@ -26,20 +26,20 @@ SECTIONS *(.flashtext) /* Startup code */ . = ALIGN(4); } >FLASH - - + + /* the program code is stored in the .text section, which goes to Flash */ .text : { . = ALIGN(4); - + *(.text) /* remaining code */ *(.text.*) /* remaining code */ *(.rodata) /* read-only data (constants) */ *(.rodata*) *(.glue_7) *(.glue_7t) - + /* Some stuff of CodeSourcery? */ *(.init) *(.fini) @@ -56,8 +56,12 @@ SECTIONS KEEP(*(.log)) KEEP(*(.log.*)) _log_stop = .; - - + _deckDriver_start = .; + KEEP(*(.deckDriver)); + KEEP(*(.deckDriver.*)); + _deckDriver_stop = .; + + . = ALIGN(4); _etext = .; /* This is used by the startup in order to initialize the .data secion */ @@ -69,11 +73,11 @@ SECTIONS . = ALIGN(4); *(.ARM.exidx*) . = ALIGN(4); - + _elibc = .; _sidata = _elibc; } >FLASH - + /* for some LPC devices, there is a FLASH patch to place at a specified address */ .flashpatch : { @@ -81,7 +85,7 @@ SECTIONS KEEP(*(.flashpatch)) /* flashpatch data */ . = ALIGN(4); } >FLASHPATCH - + /* for some LPC devices, there is a FLASH patch to place at a specified address and then there is the rest of the flash */ .endflash : @@ -100,7 +104,7 @@ SECTIONS . = ALIGN(4); /* This is used by the startup in order to initialize the .data secion */ _sdata = . ; - + *(.data) *(.data.*) *(.RAMtext) @@ -109,29 +113,47 @@ SECTIONS /* This is used by the startup in order to initialize the .data secion */ _edata = . ; } >RAM - - - /* This is the uninitialized data section */ + + + /* This is the uninitialized data section. This memory is zeroed at start up */ .bss : { . = ALIGN(4); /* This is used by the startup in order to initialize the .bss secion */ _sbss = .; - + *(.bss) *(.bss.*) *(COMMON) - + . = ALIGN(4); /* This is used by the startup in order to initialize the .bss secion */ _ebss = . ; } >RAM - - PROVIDE ( end = _ebss ); - PROVIDE ( _end = _ebss ); - - /* This is the user stack section + + + + /* This is uninitialized data that is NOT zeroed at start up. */ + .nzds : + { + . = ALIGN(4); + _snzds = .; + + *(.nzds) + *(.nzds.*) + *(COMMON) + + . = ALIGN(4); + _enzds = . ; + } >RAM + + + PROVIDE ( end = _enzds ); + PROVIDE ( _end = _enzds ); + + + /* This is the user stack section This is just to check that there is enough RAM left for the User mode stack It should generate an error if it's full. */ @@ -139,15 +161,15 @@ SECTIONS { . = ALIGN(4); _susrstack = . ; - + . = . + _Minimum_Stack_Size ; - + . = ALIGN(4); _eusrstack = . ; } >RAM - - + + /* this is the FLASH Bank1 */ /* the C or assembly source must explicitly place the code or data there using the "section" attribute */ @@ -157,11 +179,11 @@ SECTIONS *(.b1rodata) /* read-only data (constants) */ *(.b1rodata*) } >FLASHB1 - + /* this is the EXTMEM */ /* the C or assembly source must explicitly place the code or data there using the "section" attribute */ - + /* EXTMEM Bank0 */ .eb0text : { @@ -169,7 +191,7 @@ SECTIONS *(.eb0rodata) /* read-only data (constants) */ *(.eb0rodata*) } >EXTMEMB0 - + /* EXTMEM Bank1 */ .eb1text : { @@ -177,7 +199,7 @@ SECTIONS *(.eb1rodata) /* read-only data (constants) */ *(.eb1rodata*) } >EXTMEMB1 - + /* EXTMEM Bank2 */ .eb2text : { @@ -185,7 +207,7 @@ SECTIONS *(.eb2rodata) /* read-only data (constants) */ *(.eb2rodata*) } >EXTMEMB2 - + /* EXTMEM Bank0 */ .eb3text : { @@ -193,12 +215,12 @@ SECTIONS *(.eb3rodata) /* read-only data (constants) */ *(.eb3rodata*) } >EXTMEMB3 - + __exidx_start = .; __exidx_end = .; - + /* after that it's only debugging information. */ - + /* remove the debugging information from the standard libraries */ /DISCARD/ : { @@ -241,6 +263,3 @@ SECTIONS .debug_typenames 0 : { *(.debug_typenames) } .debug_varnames 0 : { *(.debug_varnames) } } - - - diff --git a/scripts/F405/st_obj.mk b/tools/make/F405/st_obj.mk similarity index 100% rename from scripts/F405/st_obj.mk rename to tools/make/F405/st_obj.mk diff --git a/scripts/F405/stm32f4discovery.cfg b/tools/make/F405/stm32f4discovery.cfg similarity index 100% rename from scripts/F405/stm32f4discovery.cfg rename to tools/make/F405/stm32f4discovery.cfg diff --git a/scripts/F405/stm32f4x_stlink.cfg b/tools/make/F405/stm32f4x_stlink.cfg similarity index 100% rename from scripts/F405/stm32f4x_stlink.cfg rename to tools/make/F405/stm32f4x_stlink.cfg diff --git a/tools/make/config.mk.example b/tools/make/config.mk.example new file mode 100644 index 0000000000..b75bf14a83 --- /dev/null +++ b/tools/make/config.mk.example @@ -0,0 +1,16 @@ +## Copy this file to config.mk and modify to get you personal build configuration + +## Set CRTP link to E-SKY receiver +# CFLAGS += -DUSE_ESKYLINK + +## Redirect the console output to the UART +# CFLAGS += -DDEBUG_PRINT_ON_UART + +## Load a deck driver that has no OW memory +# CFLAGS += -DDECK_FORCE=bcBuzzer + +## Use morse when flashing the LED to indicate that the Crazyflie is calibrated +# CFLAGS += -DCALIBRATED_LED_MORSE + +## Turn on monitoring of queue usages +# CFLAGS += -DDEBUG_QUEUE_MONITOR \ No newline at end of file diff --git a/scripts/dfu-convert.py b/tools/make/dfu-convert.py similarity index 100% rename from scripts/dfu-convert.py rename to tools/make/dfu-convert.py diff --git a/scripts/targets.mk b/tools/make/targets.mk similarity index 90% rename from scripts/targets.mk rename to tools/make/targets.mk index 382e8d1d80..4fb89b9764 100644 --- a/scripts/targets.mk +++ b/tools/make/targets.mk @@ -13,7 +13,7 @@ endif target = @$(if $(QUIET), ,echo $($1_COMMAND$(VERBOSE)) ); @$($1_COMMAND) -VTMPL_COMMAND=$(PYTHON2) scripts/versionTemplate.py $< $@ +VTMPL_COMMAND=$(PYTHON2) tools/make/versionTemplate.py $< $@ #$(BIN)/$(lastword $(subst /, ,$@)) VTMPL_COMMAND_SILENT=" VTMPL $@" %.c: %.vtpl @@ -44,7 +44,7 @@ $(PROG).bin: $(PROG).elf @$(if $(QUIET), ,echo $(BIN_COMMAND$(VERBOSE)) ) @$(BIN_COMMAND) -DFU_COMMAND=$(PYTHON2) scripts/dfu-convert.py -b $(LOAD_ADDRESS):$< $@ +DFU_COMMAND=$(PYTHON2) tools/make/dfu-convert.py -b $(LOAD_ADDRESS):$< $@ DFU_COMMAND_SILENT=" DFUse $@" $(PROG).dfu: $(PROG).bin @$(if $(QUIET), ,echo $(DFU_COMMAND$(VERBOSE)) ) @@ -68,7 +68,7 @@ clean: @$(if $(QUIET), ,echo $(CLEAN_COMMAND$(VERBOSE)) ) @$(CLEAN_COMMAND) -MRPROPER_COMMAND=rm -f *~ hal/src/*~ hal/interface/*~ tasks/src/*~ tasks/inc/*~ utils/src/*~ utils/inc/*~ scripts/*~; rm -rf bin/dep +MRPROPER_COMMAND=rm -f *~ hal/src/*~ hal/interface/*~ tasks/src/*~ tasks/inc/*~ utils/src/*~ utils/inc/*~ tools/make/*~; rm -rf bin/dep MRPROPER_COMMAND_SILENT=" MRPROPER" mrproper: clean @$(if $(QUIET), ,echo $(MRPROPER_COMMAND$(VERBOSE)) ) diff --git a/tools/make/versionTemplate.py b/tools/make/versionTemplate.py new file mode 100644 index 0000000000..64d8c171e0 --- /dev/null +++ b/tools/make/versionTemplate.py @@ -0,0 +1,151 @@ +#!/usr/bin/env python + +import sys +import subprocess +import os +from os import path +import re +import json + +version = {} + +header = """/* This file is automatically generated by {0}! + * Do not edit manually, any manual change will be overwritten. + */ +""" + +BUILD_TOOL_INFO_FILE_NAME = "build_info.json" + +def extract_information_from_build_tool(): + with open(BUILD_TOOL_INFO_FILE_NAME, 'r') as file: + build_info = json.load(file) + + version['tag'] = build_info['tag'] + version['revision'] = 'NA' + version['irevision0'] = "0x" + '0' + version['irevision1'] = "0x" + '0' + version['local_revision'] = 'NA' + version['branch'] = 'NA' + version['modified'] = 'false' + + +def extract_information_from_git(): + revision = subprocess.check_output(["git", "rev-parse", "HEAD"]).strip() + + version['revision'] = revision[0:12] + version['irevision0'] = "0x" + revision[0:8] + version['irevision1'] = "0x" + revision[8:12] + + identify = subprocess.check_output( + ["git", "describe", "--abbrev=12", "--tags", "HEAD"]) + identify = identify.split('-') + + if len(identify) > 2: + version['local_revision'] = identify[len(identify) - 2] + else: + version['local_revision'] = '0' + + version['tag'] = identify[0] + for x in range(1, len(identify) - 2): + version['tag'] += '-' + version['tag'] += identify[x] + + version['tag'] = version['tag'].strip() + + if version['local_revision'] != '0': + version['tag'] = version['tag'] + '-' + version['local_revision'] + + branch = subprocess.check_output( + ["git", "rev-parse", "--abbrev-ref", "HEAD"]).strip() + version['branch'] = branch + + subprocess.call(["git", "update-index", "-q", "--refresh"]) + changes = subprocess.check_output( + ["git", "diff-index", "--name-only", "HEAD", "--"]).strip() + if len(changes): + version['modified'] = 'true' + else: + version['modified'] = 'false' + + +def extract_information_from_mercurial(): + identify = subprocess.check_output(["hg", "identify", "-nitb"]) + identify = identify.split() + version['revision'] = identify[0] + version['irevision0'] = "0x" + identify[0][0:8] + version['irevision1'] = "0x" + identify[0][8:12] + version['local_revision'] = identify[1] + version['branch'] = identify[2] + if len(identify) > 3: + version['tag'] = identify[3] + else: + version['tag'] = "" + + try: + version['local_revision'].index('+') + version['modified'] = 'true' + except Exception: + version['modified'] = 'false' + + +def extract_information_from_folder_name(): + sourcefolder = path.basename(path.abspath(path.dirname(__file__) + '/..')) + match = re.match(".*(20[0-9][0-9]\\.[0-9][0-9]?(\\.[0-9][0-9]?)?)$", + sourcefolder) + + version['revision'] = 'NA' + version['irevision0'] = "0x" + '0' + version['irevision1'] = "0x" + '0' + version['local_revision'] = 'NA' + version['branch'] = 'NA' + version['modified'] = 'true' + + if match is not None: + version['tag'] = match.group(1) + else: + version['tag'] = 'NA' + + +def print_version(): + status = "\033[1;32mCLEAN\033[m" + if (version['modified'] == 'true'): + status = "\033[1;31mMODIFIED\033[m" + + print("Build {local_revision}:{revision} ({tag}) {}".format(status, + **version)) + print("Version extracted from {source}".format(**version)) + +if __name__ == "__main__": + version_source = "" + if os.path.isfile(BUILD_TOOL_INFO_FILE_NAME): + version['source'] = "build tool info file" + extract_information_from_build_tool() + elif os.path.isdir(".git"): + version['source'] = "git" + extract_information_from_git() + elif os.path.isdir(".hg"): + version['source'] = "mercurial" + extract_information_from_mercurial() + else: + version['source'] = "folder name" + extract_information_from_folder_name() + + if len(sys.argv) == 2 and sys.argv[1] == "--print-version": + print_version() + sys.exit(0) + + if len(sys.argv) < 3: + print("Usage:") + print(" {0} ".format(sys.argv[0])) + sys.exit(1) + + + # Apply information to the file template + infile = open(sys.argv[1], 'r') + outfile = open(sys.argv[2], 'w') + + outfile.write(header.format(sys.argv[0], sys.argv[1])) + outfile.write(infile.read().format(**version)) + + infile.close() + outfile.close() diff --git a/tools/trace/decodeItm.py b/tools/trace/decodeItm.py new file mode 100755 index 0000000000..05d59c1786 --- /dev/null +++ b/tools/trace/decodeItm.py @@ -0,0 +1,113 @@ +#!/usr/bin/env python3 +# Decodes ITM bit flow and print it on the console +import sys +import struct + +class EOFException(Exception): + pass + +def read_u8(file): + data = file.read(1) + if len(data) < 1: + raise EOFException() + return struct.unpack("".format(sys.argv[0])) + sys.exit(1) + +trace = open(sys.argv[1], "rb") + +# OS messages +OS_MASK = 0xFF00 +OS_MESSAGES = { + 0x0100: "ITM_QUEUE_SEND", + 0x0200: "QUEUE_FAILED", + 0x0300: "BLOCKING_ON_QUEUE_RECEIVE", + 0x0400: "BLOCKING_ON_QUEUE_SEND" +} + +# Decoding... +ctn = 0 +try: + while True: + b = read_u8(trace) + # sys.stdout.write("0x{:04x} ".format(ctn)) + ctn += 1 + + if b == 0 or b == 0x80: + pass + elif b == 0b01110000: + print("OVF") + elif (b & 0x0f) == 0: + print ("LTS") + while (b & 0x7F) != 0: + b = read_u8(trace) + ctn += 1 + elif (b & 0b00001011) == 0b00001000: + print("EXT") + while (b & 0x7F) != 0: + b = read_u8(trace) + ctn += 1 + elif (b & 0b11011111) == 0b10010100: + print("GTS") + while (b & 0x7F) != 0: + b = read_u8(trace) + ctn += 1 + elif (b & 0x03) != 0: # Source packet + s = b & 0x03 + a = b >> 3 + data = 0 + data_str = "" + info = "" + if s == 1: + data = read_u8(trace) + data_str = "0x{:02x}".format(data) + ctn += 1 + elif s == 2: + data = read_u16(trace) + data_str = "0x{:02x}".format(data) + ctn += 2 + elif s == 3: + data = read_u32(trace) + data_str = "0x{:02x}".format(data) + ctn += 4 + if (b & 0x04) == 0: # ITM/SW + info = "" + if a == 1: + info = "\t# Task: " + struct.pack(" #include "cfassert.h" #include "led.h" +#include "debug.h" + +#define MAGIC_ASSERT_INDICATOR 0x2f8a001f + +typedef struct SNAPSHOT_DATA { + uint32_t magicNumber; + char* fileName; + int line; +} SNAPSHOT_DATA; + +// The .nzds section is not cleared at startup, data here will survive a +// reset (by the watch dog for instance) +SNAPSHOT_DATA snapshot __attribute__((section(".nzds"))) = { + .magicNumber = 0, + .fileName = "", + .line = 0 +}; + +void storeAssertSnapshotData(char *file, int line); + void assertFail(char *exp, char *file, int line) { + storeAssertSnapshotData(file, line); + DEBUG_PRINT("Assert failed %s:%d\n", file, line); + ledClearAll(); ledSet(ERR_LED1, 1); ledSet(ERR_LED2, 1); while (1); } + +void storeAssertSnapshotData(char *file, int line) +{ + snapshot.magicNumber = MAGIC_ASSERT_INDICATOR; + snapshot.fileName = file; + snapshot.line = line; +} + +void printAssertSnapshotData() +{ + if (MAGIC_ASSERT_INDICATOR == snapshot.magicNumber) { + DEBUG_PRINT("Assert failed at %s:%d\n", snapshot.fileName, snapshot.line); + } else { + DEBUG_PRINT("No assert information found\n"); + } +} + + + diff --git a/utils/src/version.c b/utils/src/version.c index a295aceec6..1cec614502 100644 --- a/utils/src/version.c +++ b/utils/src/version.c @@ -29,7 +29,7 @@ #include "config.h" #include "param.h" -const char * V_SLOCAL_REVISION="V150821R1"; +const char * V_SLOCAL_REVISION="V151201R1"; const char * V_SREVISION="{revision}"; const char * V_STAG="SkyRoverNano2"; const char * V_BRANCH="{branch}";